Ver código fonte

Merge branch 'dev'

# Conflicts:
#	src/main/webapp/resources/js/vendor/controllers/forstore/seek_purchase_ctrl.js
liusw 7 anos atrás
pai
commit
5251d51f91
100 arquivos alterados com 3582 adições e 439 exclusões
  1. 8 8
      src/main/java/com/uas/platform/b2c/common/account/controller/AuthenticationController.java
  2. 137 137
      src/main/java/com/uas/platform/b2c/common/account/controller/SecurityController.java
  3. 3 0
      src/main/java/com/uas/platform/b2c/common/account/model/User.java
  4. 17 0
      src/main/java/com/uas/platform/b2c/common/account/service/UserService.java
  5. 20 0
      src/main/java/com/uas/platform/b2c/common/account/service/impl/UserServiceImpl.java
  6. 2 1
      src/main/java/com/uas/platform/b2c/common/account/v2/service/EnterpriseService.java
  7. 1 1
      src/main/java/com/uas/platform/b2c/common/account/v2/service/UserService.java
  8. 3 7
      src/main/java/com/uas/platform/b2c/common/account/v2/service/impl/EnterpriseServiceImpl.java
  9. 5 5
      src/main/java/com/uas/platform/b2c/common/account/v2/service/impl/UserServiceImpl.java
  10. 2 2
      src/main/java/com/uas/platform/b2c/common/message/service/impl/InternalMessageServiceImpl.java
  11. 7 0
      src/main/java/com/uas/platform/b2c/common/search/constant/SearchUrl.java
  12. 26 0
      src/main/java/com/uas/platform/b2c/common/search/controller/SearcherController.java
  13. 38 0
      src/main/java/com/uas/platform/b2c/common/search/rpc/service/Impl/SearchServiceImpl.java
  14. 4 0
      src/main/java/com/uas/platform/b2c/common/search/rpc/service/SearchService.java
  15. 17 0
      src/main/java/com/uas/platform/b2c/common/search/service/SearcherService.java
  16. 116 12
      src/main/java/com/uas/platform/b2c/common/search/service/impl/SearcherServiceImpl.java
  17. 7 1
      src/main/java/com/uas/platform/b2c/common/weixin/contoller/WeChatController.java
  18. 13 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/MessageModel.java
  19. 0 1
      src/main/java/com/uas/platform/b2c/common/weixin/model/TemplateMessage.java
  20. 21 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/base/AbstractParams.java
  21. 25 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/base/WeChatConstant.java
  22. 128 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/req/AuthCodeParams.java
  23. 91 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/req/AuthTokenParams.java
  24. 79 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/req/AuthUserParams.java
  25. 72 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/req/RefreshAuthTokenParams.java
  26. 77 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/req/WechatTemplateMsg.java
  27. 36 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/resp/AccessToken.java
  28. 52 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/resp/AuthAccessToken.java
  29. 122 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/resp/AuthUserInfo.java
  30. 47 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/resp/TemplateMsgResult.java
  31. 92 85
      src/main/java/com/uas/platform/b2c/common/weixin/service/impl/WeChatServiceImpl.java
  32. 145 0
      src/main/java/com/uas/platform/b2c/common/weixin/util/HttpReqUtil.java
  33. 16 1
      src/main/java/com/uas/platform/b2c/common/weixin/util/WeChatUtil.java
  34. 1 0
      src/main/java/com/uas/platform/b2c/external/erp/product/service/impl/KindServiceImpl.java
  35. 42 0
      src/main/java/com/uas/platform/b2c/prod/commodity/api/GoodsController.java
  36. 2 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/ErrorInfoConstant.java
  37. 40 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/UploadConstant.java
  38. 106 2
      src/main/java/com/uas/platform/b2c/prod/commodity/controller/ReleaseProductByBatchController.java
  39. 17 0
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/GoodsDao.java
  40. 106 0
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/PCBDao.java
  41. 16 0
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/PcbPropertyvalueDao.java
  42. 8 0
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/ReleaseProductByBatchDao.java
  43. 8 0
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/V_ProductPrivateDao.java
  44. 10 0
      src/main/java/com/uas/platform/b2c/prod/commodity/model/Goods.java
  45. 142 0
      src/main/java/com/uas/platform/b2c/prod/commodity/model/PCB.java
  46. 99 0
      src/main/java/com/uas/platform/b2c/prod/commodity/model/PCBPropertyValue.java
  47. 103 0
      src/main/java/com/uas/platform/b2c/prod/commodity/model/ReleaseProductByBatch.java
  48. 38 0
      src/main/java/com/uas/platform/b2c/prod/commodity/service/GoodsService.java
  49. 2 0
      src/main/java/com/uas/platform/b2c/prod/commodity/service/ProductService.java
  50. 4 2
      src/main/java/com/uas/platform/b2c/prod/commodity/service/ReleaseProductByBatchService.java
  51. 3 3
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsHistoryServiceImpl.java
  52. 191 6
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsServiceImpl.java
  53. 65 0
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ProductServiceImpl.java
  54. 209 68
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ReleaseProductByBatchServiceImpl.java
  55. 1 0
      src/main/java/com/uas/platform/b2c/prod/product/component/modal/ComponentGoods.java
  56. 37 0
      src/main/java/com/uas/platform/b2c/prod/product/kind/api/KindController.java
  57. 85 0
      src/main/java/com/uas/platform/b2c/prod/product/kind/controller/KindConcernController.java
  58. 26 0
      src/main/java/com/uas/platform/b2c/prod/product/kind/dao/KindConcernDao.java
  59. 28 1
      src/main/java/com/uas/platform/b2c/prod/product/kind/dao/KindInfoDao.java
  60. 1 1
      src/main/java/com/uas/platform/b2c/prod/product/kind/model/Kind.java
  61. 128 0
      src/main/java/com/uas/platform/b2c/prod/product/kind/model/KindConcern.java
  62. 46 0
      src/main/java/com/uas/platform/b2c/prod/product/kind/service/KindConcernService.java
  63. 33 0
      src/main/java/com/uas/platform/b2c/prod/product/kind/service/KindService.java
  64. 193 0
      src/main/java/com/uas/platform/b2c/prod/product/kind/service/impl/KindConcernServiceImpl.java
  65. 117 0
      src/main/java/com/uas/platform/b2c/prod/product/kind/service/impl/KindServiceImpl.java
  66. 7 0
      src/main/java/com/uas/platform/b2c/prod/product/property/dao/PropertyDao.java
  67. 10 0
      src/main/java/com/uas/platform/b2c/prod/store/api/StoreInController.java
  68. 15 1
      src/main/java/com/uas/platform/b2c/prod/store/facade/impl/CommodityFacadeImpl.java
  69. 7 0
      src/main/java/com/uas/platform/b2c/prod/store/service/StoreInService.java
  70. 11 3
      src/main/java/com/uas/platform/b2c/prod/store/service/impl/StoreInServiceImpl.java
  71. 10 0
      src/main/java/com/uas/platform/b2c/trade/order/dao/OrderDetailDao.java
  72. 0 4
      src/main/java/com/uas/platform/b2c/trade/vendor/service/impl/VendorIntroductionServiceImpl.java
  73. BIN
      src/main/resources/jxls-tpl/trade/goods.xls
  74. BIN
      src/main/resources/jxls-tpl/trade/products-error.xls
  75. BIN
      src/main/resources/jxls-tpl/trade/products.xls
  76. BIN
      src/main/resources/jxls-tpl/trade/releaseByBatch-person.xls
  77. BIN
      src/main/resources/jxls-tpl/trade/releaseByBatch-rmb.xls
  78. BIN
      src/main/resources/jxls-tpl/trade/releasePCBByBatch-rmb.xls
  79. BIN
      src/main/resources/jxls-tpl/trade/releasePCBByBatchError-rmb.xls
  80. BIN
      src/main/resources/jxls-tpl/trade/releasePCBByBatchError-usd.xls
  81. BIN
      src/main/resources/jxls-tpl/trade/releasePCBbyBatch-usd.xls
  82. BIN
      src/main/resources/jxls-tpl/trade/releasebyBatch-usd.xls
  83. BIN
      src/main/webapp/WEB-INF/cert/client.keystore
  84. BIN
      src/main/webapp/resources/img/seekPurchase/refu.png
  85. 5 1
      src/main/webapp/resources/js/common/controllers/commonCtrls.js
  86. 5 1
      src/main/webapp/resources/js/common/query/storeInfo.js
  87. 3 3
      src/main/webapp/resources/js/usercenter/controllers/forstore/messagePersonalCtrl.js
  88. 16 5
      src/main/webapp/resources/js/usercenter/controllers/forstore/seek_purchase_ctrl.js
  89. 20 13
      src/main/webapp/resources/js/vendor/app.js
  90. 3 3
      src/main/webapp/resources/js/vendor/controllers/forstore/messagePersonalCtrl.js
  91. 3 3
      src/main/webapp/resources/js/vendor/controllers/forstore/seek_purchase_ctrl.js
  92. 21 13
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_upload_ctrl.js
  93. 42 5
      src/main/webapp/resources/view/usercenter/forstore/seekPurchase.html
  94. 3 3
      src/main/webapp/resources/view/usercenter/left_nav.html
  95. 17 6
      src/main/webapp/resources/view/vendor/forstore/purchaseOffer.html
  96. 30 24
      src/main/webapp/resources/view/vendor/forstore/vendor_material.html
  97. 1 0
      src/main/webapp/resources/view/vendor/forstore/vendor_material_person.html
  98. 7 5
      src/main/webapp/resources/view/vendor/forstore/vendor_onSale.html
  99. 1 0
      src/main/webapp/resources/view/vendor/forstore/vendor_undercarriage.html
  100. 9 2
      src/main/webapp/resources/view/vendor/forstore/vendor_upload.html

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

@@ -1,14 +1,12 @@
 package com.uas.platform.b2c.common.account.controller;
 
 import com.uas.platform.b2c.common.account.dao.UserLoginTimeDao;
-import com.uas.platform.b2c.common.account.model.*;
+import com.uas.platform.b2c.common.account.model.User;
+import com.uas.platform.b2c.common.account.model.UserInfo;
+import com.uas.platform.b2c.common.account.model.UserLoginTime;
 import com.uas.platform.b2c.common.account.service.RoleService;
 import com.uas.platform.b2c.common.account.service.UserService;
 import com.uas.platform.b2c.core.support.SystemSession;
-
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-
 import com.uas.platform.core.model.Constant;
 import net.sf.ehcache.CacheManager;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -16,9 +14,12 @@ import org.springframework.data.repository.query.Param;
 import org.springframework.http.HttpStatus;
 import org.springframework.ui.ModelMap;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
 import java.util.List;
 
 /**
@@ -49,10 +50,9 @@ public class AuthenticationController {
 		User user = userService.findUserByUserUU(sysUser.getUserUU());
 		user.setEnterprise(sysUser.getEnterprise());
 		if (user.getEnterprise() != null ) {
-			if (user.getEnterprise().getEnAdminuu().equals(user.getUserUU())) {
+			if (!StringUtils.isEmpty(user.getEnterprise().getEnAdminuu()) && user.getEnterprise().getEnAdminuu().equals(user.getUserUU())) {
 				user.setIssys(Constant.YES);
-			}
-			else {
+			} else {
 				user.setIssys(Constant.NO);
 			}
 		}

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

@@ -1,9 +1,6 @@
 package com.uas.platform.b2c.common.account.controller;
 
 import com.alibaba.fastjson.JSON;
-import com.uas.account.entity.UserSpace;
-import com.uas.account.entity.UserSpaceDetail;
-import com.uas.account.entity.UserView;
 import com.uas.platform.b2c.common.account.dao.EnterpriseDao;
 import com.uas.platform.b2c.common.account.dao.UserDao;
 import com.uas.platform.b2c.common.account.dao.UserLoginTimeDao;
@@ -24,6 +21,7 @@ import com.uas.sso.SSOHelper;
 import com.uas.sso.SSOToken;
 import com.uas.sso.entity.UserAccount;
 import com.uas.sso.entity.UserSpaceView;
+import com.uas.sso.entity.UserView;
 import com.uas.sso.util.AccountUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.log4j.Logger;
@@ -66,6 +64,8 @@ public class SecurityController {
 	@Autowired
 	private EnterpriseService enterpriseService;
 
+	@Autowired
+	private com.uas.platform.b2c.common.account.v2.service.UserService userAccountService;
 
 
 	@Autowired
@@ -351,9 +351,10 @@ public class SecurityController {
 	 */
 	@RequestMapping(value = "/newLogin/other", produces = {"application/javascript"})
 	@ResponseBody
-	public String afterCrossLogin(HttpServletRequest request, HttpServletResponse response, UserAccount userAccount, Integer maxage) {
+	public String afterCrossLogin(HttpServletRequest request, HttpServletResponse response, UserAccount userAccount, Integer maxage) throws Exception {
 		if (userAccount != null && userAccount.getMobile() != null) {
 			SSOToken tk = new SSOToken();
+			// 设置cookie
 			tk.setUid(userAccount.getMobile());
 			tk.setTime(System.currentTimeMillis());
 			tk.setData(JSON.toJSONString(userAccount));
@@ -362,75 +363,78 @@ public class SecurityController {
 			}
 			SSOHelper.setSSOCookie(request, response, tk, true);
 			response.setHeader("P3P","CP='IDCDSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT'");
-
 			response.setHeader("P3P","CP=\"CURaADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSPCOR\"");
-			User user = getUserByToken(tk);
-			User currentUser = null;
+
+//			User user = getUserByToken(tk);
+			User mallUser = new User();
 			if (userAccount.getMobile() != null) {
 				// UID表示所有系统公认的唯一标识,这里统一使用手机号
-				currentUser = userService.findUserByUserTel(userAccount.getMobile());
+				mallUser = userService.findUserByUserTelNoException(userAccount.getMobile());
 			} else if (userAccount.getUserUU() != null) {
 				// dialectUID表示client系统自己的唯一标识,比如user_uu,手机号没设置的情况下使用
-				currentUser = userService.findUserByUserUU(userAccount.getUserUU());
+				mallUser = userService.findUserByUserUUNoException(userAccount.getUserUU());
 			} else {
 				logger.error(String.format("invalid user %s, please set uid or dialectUID", userAccount.getVipName()));
 			}
-			if (userAccount.getLastLoginTime() != null) {
-				currentUser.setLastLoginTime(userAccount.getLastLoginTime().getTime());
+
+			// 企业判断
+			Enterprise enterprise = new Enterprise();
+			if (userAccount.getSpaceUU() != null) {
+				Enterprise oldEnterprise = enterpriseDao.findByUu(userAccount.getSpaceUU());
+				// 判断商城是否存在当前企业,若存在则设置当前企业即可,若不存在则需新建一个企业后进行设置
+				if (oldEnterprise == null) {
+					// 从账户中心获取当前企业信息尽心保存
+					UserSpaceView userSpaceView = AccountUtils.findBySpaceUU(userAccount.getSpaceUU());
+					if (userSpaceView != null) {
+						if (!StringUtils.isEmpty(userSpaceView.getAccessSecret())) {
+							enterprise.setAccessSecret(userSpaceView.getAccessSecret());
+						}
+						enterprise.setEnAddress(userSpaceView.getRegAddress());
+						enterprise.setEnCorporation(userSpaceView.getCorporation());
+						enterprise.setEnBussinessCode(userSpaceView.getBusinessCode());
+						String enTel = enterprise.getEnTel();
+						if (enTel == null) {
+							enterprise.setEnTel(userSpaceView.getTelephone());
+							if (userSpaceView.getTelephone() == null) {
+								enterprise.setEnTel(userSpaceView.getAdmin().getMobile());
+							}
+						}
+						enterprise.setEnName(userSpaceView.getSpaceName());
+						enterprise.setEnLogoUrl(userSpaceView.getBusinessCodeImage());
+						enterprise.setUu(Long.valueOf(userSpaceView.getSpaceUU()));
+						if (userSpaceView.getAdminUU() != null) {
+							enterprise.setEnAdminuu(userSpaceView.getAdminUU());
+						}
+						enterprise.setEnValidCode(userSpaceView.getValidCode());
+						enterprise = enterpriseDao.save(enterprise);
+					}
+				} else {
+					enterprise = oldEnterprise;
+				}
 			}
-			if (currentUser != null) {
-				userDao.save(currentUser);
+			// 没用用户
+			if (mallUser == null) {
+				UserView userView = AccountUtils.findByUserUU(userAccount.getUserUU());
+				mallUser = userAccountService.save(userView);
 			}
-			if (user != null) {
-				/*if (!user.getUserPwd().equals(FlexJsonUtils.fromJson(tk.getData(), com.uas.account.entity.User.class).getPassword())){
-					return "successCallback({success:'0'})";
-				}*/
-				user.setIp(AgentUtils.getIp(request));
-				request.getSession().setAttribute("user", user);
-                SystemSession.setUser(user);
-				log(request, user);
+			if (enterprise != null && !mallUser.getEnterprises().contains(enterprise)) {
+//				if (!mallUser.getUserUU().equals(enterprise.getEnAdminuu())) {
+					mallUser.getEnterprises().add(enterprise);
+//				}
 			}
-
-			return "successCallback({success:'1'})";
-		}
-		return "successCallback({success:'0'})";
-	}
-
-
-
-	/**
-	 * 其他地点登录后 同步登录状态
-	 * @param request
-	 * @param response
-	 */
-	@RequestMapping(value = "/login/other")
-	@ResponseBody
-	public String afterCrossOldLogin(HttpServletRequest request, HttpServletResponse response, UserView userView, Integer maxage) {
-		String callback =request.getParameter("jsoncallback");
-		response.setContentType("text/html;charset=UTF-8");
-		if (userView != null && userView.getUid() != null) {
-			SSOToken tk = new SSOToken();
-			tk.setUid(userView.getUid());
-			tk.setTime(System.currentTimeMillis());
-			tk.setData(JSON.toJSONString(userView));
-			if (null != maxage) {
-				request.setAttribute("sso_cookie_maxage", maxage);
+			// 最后一次登录时间
+			Date lastLoginTime = userAccount.getLastLoginTime();
+			if (lastLoginTime != null) {
+				mallUser.setLastLoginTime(userAccount.getLastLoginTime().getTime());
 			}
-			SSOHelper.setSSOCookie(request, response, tk, true);
-			response.setHeader("P3P","CP='IDCDSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT'");
-
-			response.setHeader("P3P","CP=\"CURaADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSPCOR\"");
-			User user = getOldUserByToken(tk);
-			if (user != null) {
-				if (!user.getUserPwd().equals(FlexJsonUtils.fromJson(tk.getData(), com.uas.account.entity.User.class).getPassword())){
-					return "successCallback({success:'0'})";
-				}
-				user.setIp(AgentUtils.getIp(request));
-				request.getSession().setAttribute("user", user);
-				SystemSession.setUser(user);
-				log(request, user);
+			mallUser = userDao.save(mallUser);
+			mallUser.setEnterprise(enterprise);
+			if (mallUser != null) {
+				mallUser.setIp(AgentUtils.getIp(request));
+				request.getSession().setAttribute("user", mallUser);
+                SystemSession.setUser(mallUser);
+				log(request, mallUser);
 			}
-
 			return "successCallback({success:'1'})";
 		}
 		return "successCallback({success:'0'})";
@@ -485,7 +489,6 @@ public class SecurityController {
 				logger.error(String.format("invalid user %s, please set uid or dialectUID", tokenUser.getVipName()));
 			}
 			if (authedUser != null && authedUser.getEnterprises() != null) {
-
 				// 企业资料在client系统自己的唯一标识,比如en_uu
 				if (tokenUser.getSpaceUU() != null) {
 					// 如果企业不存在则更新该企业
@@ -544,82 +547,79 @@ public class SecurityController {
 		return authedUser;
 	}
 
-
-
-
-	private User getOldUserByToken(SSOToken token) {
-		User authedUser = null;
-		if (token.getData() != null) {
-			com.uas.account.entity.User tokenUser = FlexJsonUtils.fromJson(token.getData(), com.uas.account.entity.User.class);
-			if (tokenUser.getUid() != null) {
-				// UID表示所有系统公认的唯一标识,这里统一使用手机号
-				authedUser = userService.findUserByUserTel(tokenUser.getUid());
-			} else if (tokenUser.getDialectUID() != null) {
-				// dialectUID表示client系统自己的唯一标识,比如user_uu,手机号没设置的情况下使用
-				authedUser = userService.findUserByUserUU(Long.parseLong(tokenUser.getDialectUID()));
-			} else {
-				logger.error(String.format("invalid user %s, please set uid or dialectUID", tokenUser.getName()));
-			}
-			if (authedUser != null && authedUser.getEnterprises() != null) {
-				// 企业资料在client系统自己的唯一标识,比如en_uu
-				if (tokenUser.getSpaceDialectUID() != null) {
-					// 如果企业不存在则更新该企业
-					for (Enterprise enterprise : authedUser.getEnterprises()) {
-						if (enterprise.getUu().equals(Long.parseLong(tokenUser.getSpaceDialectUID()))){
-							authedUser.setEnterprise(enterprise);
-						}
-					}
-					if (null == authedUser.getEnterprise()) {
-						Enterprise newEnterprise = enterpriseDao.findByUu(Long.parseLong(tokenUser.getSpaceDialectUID()));
-						if (null == newEnterprise) {
-							UserSpaceDetail userSpaceDetail = null;
-							try {
-								userSpaceDetail = com.uas.account.util.AccountUtils.findByBusinessCode(tokenUser.getSpaceUID());
-							} catch (Exception e) {
-								e.printStackTrace();
-							}
-							UserSpace userSpace = new UserSpace();
-							userSpace.setDialectUID(tokenUser.getSpaceDialectUID());
-							if (null != userSpaceDetail) {
-								enterpriseService.update(userSpace,userSpaceDetail);
-							}
-							newEnterprise = enterpriseDao.findByUu(Long.parseLong(tokenUser.getSpaceDialectUID()));
-							authedUser.setEnterprise(newEnterprise);
-						} else {
-							authedUser.getEnterprises().add(newEnterprise);
-							userDao.save(authedUser);
-							authedUser.setEnterprise(newEnterprise);
-						}
-					}
-				} else if (tokenUser.getSpaceUID() != null) {
-					for (Enterprise enterprise : authedUser.getEnterprises()) {
-						// 企业资料在所有系统公认的唯一标识,这里使用商业登记证号
-						if (tokenUser.getSpaceUID().equals(enterprise.getEnBussinessCode())) {
-							authedUser.setEnterprise(enterprise);
-							//保存登录时间
-							List<UserLoginTime> userLoginTimeList = userLoginTimeDao.findByUserUUAndEnUU(authedUser.getUserUU(),enterprise.getUu());
-							UserLoginTime userLoginTime;
-							if (!CollectionUtils.isEmpty(userLoginTimeList)){
-								userLoginTime = userLoginTimeList.get(0);
-							}else {
-								userLoginTime = new UserLoginTime();
-								userLoginTime.setUserUU(authedUser.getUserUU());
-								userLoginTime.setEnUU(enterprise.getUu());
-							}
-							userLoginTime.setLoginTime(System.currentTimeMillis());
-							try {
-								userLoginTimeDao.save(userLoginTime);
-							}catch (Exception e){
-								e.printStackTrace();
-							}
-							break;
-						}
-					}
-				}
-			}
-		}
-		return authedUser;
-	}
+//	private User getOldUserByToken(SSOToken token) {
+//		User authedUser = null;
+//		if (token.getData() != null) {
+//			com.uas.account.entity.User tokenUser = FlexJsonUtils.fromJson(token.getData(), com.uas.account.entity.User.class);
+//			if (tokenUser.getUid() != null) {
+//				// UID表示所有系统公认的唯一标识,这里统一使用手机号
+//				authedUser = userService.findUserByUserTel(tokenUser.getUid());
+//			} else if (tokenUser.getDialectUID() != null) {
+//				// dialectUID表示client系统自己的唯一标识,比如user_uu,手机号没设置的情况下使用
+//				authedUser = userService.findUserByUserUU(Long.parseLong(tokenUser.getDialectUID()));
+//			} else {
+//				logger.error(String.format("invalid user %s, please set uid or dialectUID", tokenUser.getName()));
+//			}
+//			if (authedUser != null && authedUser.getEnterprises() != null) {
+//				// 企业资料在client系统自己的唯一标识,比如en_uu
+//				if (tokenUser.getSpaceDialectUID() != null) {
+//					// 如果企业不存在则更新该企业
+//					for (Enterprise enterprise : authedUser.getEnterprises()) {
+//						if (enterprise.getUu().equals(Long.parseLong(tokenUser.getSpaceDialectUID()))){
+//							authedUser.setEnterprise(enterprise);
+//						}
+//					}
+//					if (null == authedUser.getEnterprise()) {
+//						Enterprise newEnterprise = enterpriseDao.findByUu(Long.parseLong(tokenUser.getSpaceDialectUID()));
+//						if (null == newEnterprise) {
+//							UserSpaceDetail userSpaceDetail = null;
+//							try {
+//								userSpaceDetail = com.uas.account.util.AccountUtils.findByBusinessCode(tokenUser.getSpaceUID());
+//							} catch (Exception e) {
+//								e.printStackTrace();
+//							}
+//							UserSpace userSpace = new UserSpace();
+//							userSpace.setDialectUID(tokenUser.getSpaceDialectUID());
+//							if (null != userSpaceDetail) {
+//								enterpriseService.update(userSpace,userSpaceDetail);
+//							}
+//							newEnterprise = enterpriseDao.findByUu(Long.parseLong(tokenUser.getSpaceDialectUID()));
+//							authedUser.setEnterprise(newEnterprise);
+//						} else {
+//							authedUser.getEnterprises().add(newEnterprise);
+//							userDao.save(authedUser);
+//							authedUser.setEnterprise(newEnterprise);
+//						}
+//					}
+//				} else if (tokenUser.getSpaceUID() != null) {
+//					for (Enterprise enterprise : authedUser.getEnterprises()) {
+//						// 企业资料在所有系统公认的唯一标识,这里使用商业登记证号
+//						if (tokenUser.getSpaceUID().equals(enterprise.getEnBussinessCode())) {
+//							authedUser.setEnterprise(enterprise);
+//							//保存登录时间
+//							List<UserLoginTime> userLoginTimeList = userLoginTimeDao.findByUserUUAndEnUU(authedUser.getUserUU(),enterprise.getUu());
+//							UserLoginTime userLoginTime;
+//							if (!CollectionUtils.isEmpty(userLoginTimeList)){
+//								userLoginTime = userLoginTimeList.get(0);
+//							}else {
+//								userLoginTime = new UserLoginTime();
+//								userLoginTime.setUserUU(authedUser.getUserUU());
+//								userLoginTime.setEnUU(enterprise.getUu());
+//							}
+//							userLoginTime.setLoginTime(System.currentTimeMillis());
+//							try {
+//								userLoginTimeDao.save(userLoginTime);
+//							}catch (Exception e){
+//								e.printStackTrace();
+//							}
+//							break;
+//						}
+//					}
+//				}
+//			}
+//		}
+//		return authedUser;
+//	}
 	/**
 	 * 记录登录日志
 	 * @param request

+ 3 - 0
src/main/java/com/uas/platform/b2c/common/account/model/User.java

@@ -395,6 +395,9 @@ public class User implements Serializable {
 	@JsonIgnore
 	@JSONField(serialize = false)
 	public Set<Enterprise> getEnterprises() {
+		if (enterprises == null) {
+			enterprises = new HashSet<>();
+		}
 		return enterprises;
 	}
 

+ 17 - 0
src/main/java/com/uas/platform/b2c/common/account/service/UserService.java

@@ -26,6 +26,14 @@ public interface UserService {
 	 */
 	User findUserByUserUU(Long userUU);
 
+	/**
+	 * 按uu取用户信息, 不抛出没有找到用户异常
+	 *
+	 * @param userUU
+	 * @return
+	 */
+	User findUserByUserUUNoException(Long userUU);
+
 	/**
 	 * 按uu取用户信息(不读取缓存)
 	 *
@@ -65,6 +73,15 @@ public interface UserService {
 	 */
 	User findUserByUserTel(String userTel);
 
+	/**
+	 * 按tel取用户信息, 不抛出没有找到用户异常
+	 *
+	 * @param userTel
+	 * @return
+	 */
+	User findUserByUserTelNoException(String userTel);
+
+
 	/**
 	 * 查找所有用户资料
 	 * 

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

@@ -83,6 +83,15 @@ public class UserServiceImpl implements UserService {
 		return users.get(0);
 	}
 
+	@Override
+	public User findUserByUserUUNoException(Long userUU) {
+		List<User> users = userDao.findUserByUserUU(userUU);
+		if (users.size() == 0) {
+			return null;
+		}
+		return users.get(0);
+	}
+
 	@Override
 	public User findUserPwdByUserUU(Long uu) {
 		List<User> users = userDao.findUserPwdByUserUU(uu);
@@ -106,6 +115,17 @@ public class UserServiceImpl implements UserService {
 			throw new UsernameNotFoundException("没有找到您的账号 " + tel);
 		return users.get(0);
 	}
+
+	@Override
+	public User findUserByUserTelNoException(String userTel) {
+		List<User> users = userDao.findUserByUserTel(userTel);
+		if (users.size() == 0) {
+			return null;
+		}
+		return users.get(0);
+	}
+
+
 	@Override
 	public boolean isTelUseable(String tel) {
 		return userDao.findUserByUserTel(tel).size() == 0;

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

@@ -3,6 +3,7 @@ package com.uas.platform.b2c.common.account.v2.service;
 import com.uas.account.entity.UserSpace;
 import com.uas.account.entity.UserSpaceDetail;
 import com.uas.platform.b2c.common.account.model.ChangeAdminDetail;
+import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.sso.entity.UserSpaceView;
 
 public interface EnterpriseService {
@@ -12,7 +13,7 @@ public interface EnterpriseService {
      *
      * @param userSpaceView
      */
-    void update(UserSpaceView userSpaceView);
+    Enterprise update(UserSpaceView userSpaceView);
 
 
     /**

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

@@ -11,7 +11,7 @@ public interface UserService {
      *
      * @param user
      */
-    void save(UserView user);
+    User save(UserView user);
 
     /**
      * 删除用户

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

@@ -44,7 +44,7 @@ public class EnterpriseServiceImpl implements EnterpriseService {
     private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
 
     @Override
-    public void update(UserSpaceView userSpaceView) {
+    public Enterprise update(UserSpaceView userSpaceView) {
       /*  List<User> admins = userDao.findUserByUserUU(userSpaceView.getAdminUU());
         if (admins.size() != 1) {
             logger.log("更新企业信息出错,管理员有且仅有一个", "当前管理员数量:" + admins.size());
@@ -52,7 +52,7 @@ public class EnterpriseServiceImpl implements EnterpriseService {
         }*/
         if (null == userSpaceView.getSpaceUU() && "".equals(userSpaceView.getSpaceUU())){
             logger.log("更新企业信息出错,uu为空", "值为null", null,0L);
-            return;
+            return null;
         }
         Enterprise enterprise;
         Enterprise oldenterprise;
@@ -65,10 +65,8 @@ public class EnterpriseServiceImpl implements EnterpriseService {
             enterprise.setAccessSecret(userSpaceView.getAccessSecret());
         }
         enterprise.setEnAddress(userSpaceView.getRegAddress());
-        //enterprise.setEnArea(userSpaceView.get());
         enterprise.setEnCorporation(userSpaceView.getCorporation());
         enterprise.setEnBussinessCode(userSpaceView.getBusinessCode());
-       // enterprise.setEnFax(userSpaceView.);
         String enTel = enterprise.getEnTel();
         if (enTel == null) {
             enterprise.setEnTel(userSpaceView.getTelephone());
@@ -76,12 +74,9 @@ public class EnterpriseServiceImpl implements EnterpriseService {
                 enterprise.setEnTel(userSpaceView.getAdmin().getMobile());
             }
         }
-        //enterprise.setEnEmail(userSpaceView.get());
-        //enterprise.setEnIndustry(userSpaceView.());
         enterprise.setEnName(userSpaceView.getSpaceName());
         enterprise.setEnLogoUrl(userSpaceView.getBusinessCodeImage());
         enterprise.setUu(Long.valueOf(userSpaceView.getSpaceUU()));
-        //Long userUU = admins.get(0).getUserUU();
         if (userSpaceView.getAdminUU() != null) {
             enterprise.setEnAdminuu(userSpaceView.getAdminUU());
         }
@@ -110,6 +105,7 @@ public class EnterpriseServiceImpl implements EnterpriseService {
         } else {
             logger.log("新增企业信息", enterprise.getUu()+"time: " + sdf.format(new Date()), enterprise.getEnAdminuu(), 0L);
         }
+        return newEn;
     }
 
 

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

@@ -39,12 +39,12 @@ public class UserServiceImpl implements UserService {
     private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
 
     @Override
-    public void save(UserView user) {
+    public User save(UserView user) {
         User oldUser = userDao.findOne(user.getUserUU());
         if (null == oldUser) {
             oldUser = new User();
         }
-        oneSave(user, oldUser);
+        return oneSave(user, oldUser);
        /* com.uas.platform.b2c.common.account.model.User u = null;
         if (!StringUtils.isEmpty(user.getDialectUID())) {
             u = userDao.findOne(Long.parseLong(user.getDialectUID()));
@@ -65,7 +65,7 @@ public class UserServiceImpl implements UserService {
         oneSave(user,u);*/
     }
 
-    private void oneSave(UserView user, com.uas.platform.b2c.common.account.model.User u) {
+    private User oneSave(UserView user, com.uas.platform.b2c.common.account.model.User u) {
         Long userUU = user.getUserUU();
         if (userUU != null) {
             u.setUserUU(userUU);
@@ -111,7 +111,6 @@ public class UserServiceImpl implements UserService {
         Short emailValidCode = user.getEmailValidCode();
         if (emailValidCode != null) {
             u.setEmailValidCode((int) emailValidCode);
-
         }
         String idCard = user.getIdCard();
         if (!StringUtils.isEmpty(idCard)) {
@@ -134,12 +133,13 @@ public class UserServiceImpl implements UserService {
             u.setEnable((short) 1);
         }
         List<com.uas.platform.b2c.common.account.model.User> oldUsers = userDao.findUserByUserUU(u.getUserUU());
-        userDao.save(u);
+        u = userDao.save(u);
         if (oldUsers.size() > 0) {
             logger.log("更新用户信息", user.getMobile());
         } else {
             logger.log("新增用户信息", user.getMobile());
         }
+        return u;
     }
 
 

+ 2 - 2
src/main/java/com/uas/platform/b2c/common/message/service/impl/InternalMessageServiceImpl.java

@@ -75,12 +75,12 @@ public class InternalMessageServiceImpl implements InternalMessageService {
     /**
      * 消息类型 (在MALL消息中拼接求购询价待报价)
      */
-    private final String INQUIRY_TYPE_SELLER_MALL = "MALL跳转卖家待报价页面";
+    private final String INQUIRY_TYPE_SELLER_MALL = "MALL公共询价";
 
     /**
      * 消息类型 (在B2B消息中拼接跳转单据详情url请求时需要)
      */
-    private final String INQUIRY_TYPE_MALL = "MALL公共询价";
+    private final String INQUIRY_TYPE_MALL = "MALL跳转买家已报价页面";
 
 
     @Autowired

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

@@ -119,6 +119,13 @@ public class SearchUrl {
      */
     public static final String GOODIS_URL= "/search/goodsIds?keyword={keyword}&params={params}";
 
+    /**
+     * 搜索pcb库存信息
+     */
+    public static final String PCBGOODIS_URL= "/search/pcbGoodsIds?keyword={keyword}&params={params}";
+
+    public static final String PCB_COLLECT_URL= "/search/collectBySearchPCBGoods?keyword={keyword}&collectedField={collectedField}&filters={filters}";
+
     /**
      * 搜索库存信息(类目)
      */

+ 26 - 0
src/main/java/com/uas/platform/b2c/common/search/controller/SearcherController.java

@@ -3,6 +3,7 @@ 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.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.prod.commodity.service.GoodsService;
@@ -73,6 +74,7 @@ public class SearcherController {
 	@Autowired
 	private SearchHistoryDao searchHistoryDao;
 
+
 	/**
 	 * 作搜索展示跳转
 	 * 
@@ -268,6 +270,30 @@ public class SearcherController {
         return searcherService.getCollectlistBySearchComponentGoods(keyword,collectList,paramJSON,request);
     }
 
+	/**
+	 * 批次搜索PCB结构的类目,品牌统计
+	 *
+	 * @param keyword 关键词
+	 * @return 类目,品牌统计
+	 */
+	@RequestMapping(value = "/PCBGoods/collect", method = RequestMethod.GET)
+	@ResponseBody
+	public List<Map<String, Object>> searchCollectListBySearchPCBGoods(String keyword, String collectedField, String filters , HttpServletRequest request) {
+		return searcherService.getCollectlistBySearchPCBGoods(keyword,collectedField,filters,request);
+	}
+
+	/**
+	 * 分页获取pcb信息
+	 * @param keyword
+	 * @param params
+	 * @return
+	 */
+	@RequestMapping(value = "/pcbgoods/page",method = RequestMethod.GET)
+	@ResponseBody
+	public Map getPcbGoods(String keyword, PageParams params,HttpServletRequest request) {
+		return goodsService.getPCBGoodsBySearch(keyword, params, request);
+	}
+
 
 	/**
 	 * 根据输入获取联想词(包括器件、类目、品牌,按顺序获取,数量不足,才会获取下一个)

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

@@ -459,4 +459,42 @@ public class SearchServiceImpl implements SearchService{
         map.put("size", size);
         return map;
     }
+
+    @Override
+    public List<Map<String, Object>> collectBySearchPCBGoods(String keyword, CollectField collectField, Map<PageParams.FilterField, Object> filters) {
+        Map<String, Object> map = new HashedMap();
+        map.put("keyword", keyword);
+        map.put("collectedField", collectField);
+        map.put("filters", FastjsonUtils.toJson(filters));
+        String str = restTemplate.getForObject(sysConf.getSearchUrl() + SearchUrl.PCB_COLLECT_URL, String.class, map);
+        if(StringUtils.isEmpty(str)) {
+            return null;
+        }else {
+            try {
+                List<Map<String, Object>> reMap = FastjsonUtils.fromJson(str, List.class);
+                return reMap;
+            }catch (Exception e) {
+                e.printStackTrace();
+                return null;
+            }
+        }
+    }
+
+    public Map<String,Object> getPcbGoodsIds(String keyword, PageParams var2) throws  SearchException {
+        Map<String, Object> map = new HashedMap();
+        map.put("keyword", keyword);
+        map.put("params", FlexJsonUtils.toJsonDeep(var2));
+        String str = restTemplate.getForObject(sysConf.getSearchUrl() + SearchUrl.PCBGOODIS_URL, String.class, map);
+        if(StringUtils.isEmpty(str)) {
+            return null;
+        }else {
+            try {
+                Map<String, Object> reMap = FastjsonUtils.fromJson(str, Map.class);
+                return reMap;
+            }catch (Exception e) {
+                e.printStackTrace();
+                return null;
+            }
+        }
+    }
 }

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

@@ -56,4 +56,8 @@ public interface SearchService {
     Map<String, Object> getGoodsIdsForKinds(PageParams var2) throws SearchException;
 
     List<Map<String, Object>> collectBySearchGoods(String keyword, CollectField collectField, Map<PageParams.FilterField, Object> filters);
+
+    Map<String,Object> getPcbGoodsIds(String keyword,PageParams var2) throws  SearchException;
+
+    List<Map<String,Object>> collectBySearchPCBGoods(String keyword,CollectField collectField,Map<PageParams.FilterField, Object> filters);
 }

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

@@ -19,6 +19,15 @@ import java.util.Map;
  */
 public interface SearcherService {
 
+
+	/**
+	 * 分页获取pcb商品信息
+	 * @param keyword
+	 * @param page
+	 * @return
+	 */
+	ModelMap getPcbGoods(String keyword, PageParams page,HttpServletRequest request);
+
 	/**
 	 * 智能搜索器件
 	 * 
@@ -110,6 +119,14 @@ public interface SearcherService {
 	 */
 	public List<Map<String, Object>> getCollectlistBySearchComponentGoods(String keyword, String collectList, String paramJSON, HttpServletRequest request);
 
+	/**
+	 * 批次搜索PCB结构的类目,品牌统计
+	 * @param keyword 关键词
+	 * @param collectList
+	 * @param paramJSON 参数json
+	 * @return 类目,品牌统计
+	 */
+	public List<Map<String, Object>> getCollectlistBySearchPCBGoods(String keyword, String collectList, String paramJSON, HttpServletRequest request);
 
 	/**
 	 * 根据输入获取联想词(包括器件、类目、品牌,按顺序获取,数量不足,才会获取下一个)

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

@@ -15,6 +15,8 @@ import com.uas.platform.b2c.core.constant.Type;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
+import com.uas.platform.b2c.prod.commodity.dao.PCBDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductDao;
 import com.uas.platform.b2c.prod.commodity.model.Goods;
 import com.uas.platform.b2c.prod.product.brand.dao.BrandDao;
 import com.uas.platform.b2c.prod.product.component.dao.ComponentDao;
@@ -22,10 +24,22 @@ import com.uas.platform.b2c.prod.product.component.dao.ComponentGoodsDao;
 import com.uas.platform.b2c.prod.product.component.dao.ComponentInfoDao;
 import com.uas.platform.b2c.prod.product.component.modal.ComponentGoods;
 import com.uas.platform.b2c.prod.product.component.modal.ComponentInfo;
+import com.uas.platform.b2c.trade.order.dao.OrderDetailDao;
 import com.uas.platform.core.exception.SystemException;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.PageParams;
 import com.uas.search.exception.SearchException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import javax.servlet.http.HttpServletRequest;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -38,18 +52,6 @@ import org.springframework.ui.ModelMap;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
-import javax.servlet.http.HttpServletRequest;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
 /**
  * 搜索索引
  *
@@ -80,6 +82,15 @@ public class SearcherServiceImpl implements SearcherService {
 	@Autowired
 	private SearchHistoryDao searchHistoryDao;
 
+	@Autowired
+    private PCBDao pcbDao;
+
+	@Autowired
+    private ProductDao productDao;
+
+	@Autowired
+    private OrderDetailDao orderDetailDao;
+
 	private Logger logger = LoggerFactory.getLogger(getClass());
 	private final DeviceResolver deviceResolver = new LiteDeviceResolver();
 
@@ -364,6 +375,36 @@ public class SearcherServiceImpl implements SearcherService {
         return collectResult;
     }
 
+    /**
+     * 批次搜索的类目,品牌统计
+     *
+     * @param keyword
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> getCollectlistBySearchPCBGoods(String keyword, String collectList, String paramJSON, HttpServletRequest request) {
+        List<Map<String, Object>> collectResult = new ArrayList<>();
+        JSONObject jsonObject = FastjsonUtils.parseObject(paramJSON);
+        Set<Entry<String, Object>> paramEntry = jsonObject.entrySet();
+        Map<com.uas.platform.b2c.common.search.util.PageParams.FilterField, Object> param = new LinkedHashMap<>();
+        for (Entry<String, Object> entry : paramEntry) {
+            param.put(FilterField.valueOf(entry.getKey().toUpperCase()), entry.getValue());
+        }
+        try {
+            collectResult = searchService.collectBySearchPCBGoods(keyword, CollectField.valueOf(collectList.toUpperCase()), param);
+        } catch (SearchException e) {
+            throwSystemException(e);
+        }
+        if ("goods_brand".equals(collectList)) {
+            if (this.deviceResolver.resolveDevice(request).isMobile()) {
+                for (Map<String, Object> m : collectResult) {
+                    m.put("logoUrl", brandDao.findOne(Long.parseLong(m.get("br_id").toString())).getLogoUrl());
+                }
+            }
+        }
+        return collectResult;
+    }
+
     @Override
     public Map<String, Object> getSimilarKeywords(String keyword) {
         Map<String, Object> result = null;
@@ -491,4 +532,67 @@ public class SearcherServiceImpl implements SearcherService {
 		logger.error(e.getMessage(), e);
 		throw new SystemException(e.getMessage());
 	}
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public ModelMap getPcbGoods(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;
+        try {
+            results = searchService.getPcbGoodsIds(keyword,convertPageParams(page));
+        } catch (SearchException e) {
+            throwSystemException(e);
+        }
+        if ((int)results.get("total") == 0){
+            map.put("total", results.get("total"));// 搜索结果总数
+            map.put("page", results.get("page"));// 当前页面
+            map.put("size", results.get("size"));// 每页个数
+            map.put("pcbgoods", new ArrayList<>());// 当前页器件内容
+            return map;
+        }
+        List<Integer> goodsIds = (List<Integer>)results.get("goodsIds");
+	    List<Goods> pcbGoods = new ArrayList<>();
+	    if (!CollectionUtils.isEmpty(goodsIds)) {
+	        for (int i = 0;i < goodsIds.size();i++) {
+	            Long goodid = null;
+	            if (!StringUtils.isEmpty(goodsIds.get(i))) {
+	                goodid = Long.valueOf(goodsIds.get(i).toString());
+                }
+                if (goodid != null) {
+                    Goods good = goodsDao.findOne(goodid);
+                    if (good != null) {
+                        Double number = orderDetailDao.getPCBSaleQtyByBatchcodesAndStatus(good.getBatchCode());
+                        good.setSaleQty(number == null ? 0 : number);
+                        pcbGoods.add(good);
+                    }
+                }
+            }
+            map.put("pcbgoods",pcbGoods);
+        }
+        map.put("total", results.get("total"));// 搜索结果总数
+        map.put("page", results.get("page"));// 当前页面
+        map.put("size", results.get("size"));// 每页个数
+	    return map;
+    }
 }

+ 7 - 1
src/main/java/com/uas/platform/b2c/common/weixin/contoller/WeChatController.java

@@ -31,6 +31,12 @@ public class WeChatController {
     @Autowired
     private WeChatService weChatService;
 
+    /**
+     * 与微信服务器接口配置
+     * @param model
+     * @param request
+     * @param response
+     */
     @RequestMapping(value = "/check", method = RequestMethod.GET)
     public void wenxinCheck(Model model, HttpServletRequest request, HttpServletResponse response) {
         // 微信加密签名
@@ -77,7 +83,7 @@ public class WeChatController {
      * 用户微信授权成功返回接口
      * @param code 用于获取AccessToken
      * @param state 获取code的state参数
-     * @return
+     * @return 微信用户信息
      */
     @RequestMapping(value = "/getWxUserInfo", method = RequestMethod.GET)
     public ModelMap getWxUserInfo(String code,String state) {

+ 13 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/MessageModel.java

@@ -75,6 +75,19 @@ public class MessageModel {
      */
     private String name;
 
+    /**
+     * 型号
+     */
+    private String cmpCode;
+
+    public String getCmpCode() {
+        return cmpCode;
+    }
+
+    public void setCmpCode(String cmpCode) {
+        this.cmpCode = cmpCode;
+    }
+
     public String getName() {
         return name;
     }

+ 0 - 1
src/main/java/com/uas/platform/b2c/common/weixin/model/TemplateMessage.java

@@ -1,6 +1,5 @@
 package com.uas.platform.b2c.common.weixin.model;
 
-import java.util.List;
 import java.util.Map;
 
 /**

+ 21 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/base/AbstractParams.java

@@ -0,0 +1,21 @@
+package com.uas.platform.b2c.common.weixin.model.base;
+
+import java.io.Serializable;
+import java.util.Map;
+
+/**
+ * 基本请求抽象类
+ * @author liuam
+ * @date  2018年6月12日
+ *
+ */
+public abstract class AbstractParams implements Serializable{
+
+    private static final long serialVersionUID = 3375127810872852675L;
+
+    /**
+     * 返回请求参数
+     * @return
+     */
+    public abstract Map<String,String> getParams() throws Exception;
+}

+ 25 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/base/WeChatConstant.java

@@ -0,0 +1,25 @@
+package com.uas.platform.b2c.common.weixin.model.base;
+
+/**
+ * 获取授权code请求参数
+ *
+ * @author liuam
+ * @date 2018年6月12日
+ *
+ */
+public class WeChatConstant {
+
+    /**
+     * 编码类型
+     */
+    public static final String DEFAULT_CHARACTER_ENCODING = "UTF-8";
+    /**
+     * get 请求
+     */
+    public static final String GET_METHOD = "GET";
+    /**
+     * post 请求
+     */
+	public static final String POST_METHOD = "POST";
+
+}

+ 128 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/req/AuthCodeParams.java

@@ -0,0 +1,128 @@
+package com.uas.platform.b2c.common.weixin.model.req;
+
+
+import com.uas.platform.b2c.common.weixin.model.base.AbstractParams;
+import com.uas.platform.b2c.common.weixin.model.base.WeChatConstant;
+import com.uas.platform.b2c.common.weixin.util.HttpReqUtil;
+
+import java.io.UnsupportedEncodingException;
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * 获取授权code请求参数
+ * 
+ * @author liuam
+ * @date 2018年6月12日
+ *
+ */
+public class AuthCodeParams extends AbstractParams {
+	
+	private static final long serialVersionUID = 6313379843885615765L;
+	/**
+	 * snsapi_base(不需要弹出授权页面,只能获取openid)
+	 */
+	public static final String SCOPE_SNSAPIBASE = "snsapi_base";
+
+	/**
+	 * 弹出授权页面(获取用户基本信息)
+	 */
+	public static final String SCOPE_SNSPAIUSERINFO = "snsapi_userinfo";
+
+	/**
+	 * 网站应用仅填写 snsapi_login
+	 */
+	public static final String SCOPE_SNSPAILOGIN = "snsapi_login";
+	/**
+	 * 应用 appid
+	 */
+	private String appid;
+
+	/**
+	 * 重定向连接,使用urlencode对链接进行处理
+	 */
+	private String redirect_uri;
+
+	/**
+	 * 响应类型,固定为 code
+	 */
+	private String response_type = "code";
+
+	/**
+	 * 应用授权作用域
+	 */
+	private String scope;
+
+	/**
+	 * 用于保持请求和回调的状态,授权请求后原样带回给第三方。
+	 * 该参数可用于防止csrf攻击(跨站请求伪造攻击),
+	 * 建议第三方带上该参数,
+	 * 可设置为简单的随机数加session进行校验
+	 */
+	private String state;
+
+	public AuthCodeParams() {
+		super();
+	}
+
+	public AuthCodeParams(String appid, String redirect_uri, String response_type, String scope, String state) {
+		super();
+		this.appid = appid;
+		this.redirect_uri = redirect_uri;
+		this.response_type = response_type;
+		this.scope = scope;
+		this.state = state;
+	}
+
+	/**
+	 * 参数组装
+	 * 
+	 * @return
+	 */
+	@Override
+	public Map<String, String> getParams() throws UnsupportedEncodingException {
+		Map<String, String> params = new TreeMap<String, String>();
+		params.put("appid", this.appid);
+		params.put("redirect_uri", HttpReqUtil.urlEncode(this.redirect_uri, WeChatConstant.DEFAULT_CHARACTER_ENCODING));
+		params.put("response_type", this.response_type);
+		params.put("scope", this.scope);
+		params.put("state", this.state);
+		return params;
+	}
+
+	public String getAppid() {
+		return appid;
+	}
+
+	public void setAppid(String appid) {
+		this.appid = appid;
+	}
+
+	public String getRedirect_uri() {
+		return redirect_uri;
+	}
+
+	public void setRedirect_uri(String redirect_uri) {
+		this.redirect_uri = redirect_uri;
+	}
+
+	public String getResponse_type() {
+		return response_type;
+	}
+
+	public String getScope() {
+		return scope;
+	}
+
+	public void setScope(String scope) {
+		this.scope = scope;
+	}
+
+	public String getState() {
+		return state;
+	}
+
+	public void setState(String state) {
+		this.state = state;
+	}
+}

+ 91 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/req/AuthTokenParams.java

@@ -0,0 +1,91 @@
+package com.uas.platform.b2c.common.weixin.model.req;
+
+
+import com.uas.platform.b2c.common.weixin.model.base.AbstractParams;
+
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * 获取授权请求token的请求参数
+ * @author liuam
+ * @date 2018年6月12日
+ *
+ */
+public class AuthTokenParams extends AbstractParams {
+	
+	private static final long serialVersionUID = 4652953400751046159L;
+	/**
+	 * 公众号的唯一标识
+	 */
+	private String appid;
+	/**
+	 * 公众号的appsecret
+	 */
+	private String secret;
+	/**
+	 * 填写第一步获取的code参数
+	 */
+	private String code;
+	private String grant_type = "authorization_code";
+
+	public AuthTokenParams() {
+		super();
+	}
+
+	public AuthTokenParams(String appid, String secret, String code, String grant_type) {
+		super();
+		this.appid = appid;
+		this.secret = secret;
+		this.code = code;
+		this.grant_type = grant_type;
+	}
+
+	public AuthTokenParams(String appid, String secret, String grant_type) {
+		this.appid = appid;
+		this.secret = secret;
+		this.grant_type = grant_type;
+	}
+
+	/**
+	 * 参数组装
+	 * @return
+	 */
+	@Override
+	public Map<String, String> getParams() {
+		Map<String, String> params = new TreeMap<String, String>();
+		params.put("appid", this.appid);
+		params.put("secret", this.secret);
+		params.put("code", this.code);
+		params.put("grant_type", this.grant_type);
+		return params;
+	}
+
+	public String getAppid() {
+		return appid;
+	}
+
+	public void setAppid(String appid) {
+		this.appid = appid;
+	}
+
+	public String getSecret() {
+		return secret;
+	}
+
+	public void setSecret(String secret) {
+		this.secret = secret;
+	}
+
+	public String getCode() {
+		return code;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public String getGrant_type() {
+		return grant_type;
+	}
+}

+ 79 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/req/AuthUserParams.java

@@ -0,0 +1,79 @@
+package com.uas.platform.b2c.common.weixin.model.req;
+
+
+import com.uas.platform.b2c.common.weixin.model.base.AbstractParams;
+
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * 获取用户信息请求
+ * @author liuam
+ * @date 2018年6月12日
+ *
+ */
+public class AuthUserParams extends AbstractParams {
+
+	private static final long serialVersionUID = 66535717787322321L;
+	/**
+	 * 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
+	 */
+	private String accessToken;
+
+	/**
+	 * 用户的唯一标识
+	 */
+	private String openid;
+	/**
+	 * 国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语
+	 */
+	private String lang;
+
+	public AuthUserParams() {
+		super();
+	}
+
+	public AuthUserParams(String accessToken, String openid, String lang) {
+		super();
+		this.accessToken = accessToken;
+		this.openid = openid;
+		this.lang = lang;
+	}
+
+	public String getAccessToken() {
+		return accessToken;
+	}
+
+	public void setAccessToken(String accessToken) {
+		this.accessToken = accessToken;
+	}
+
+	public String getOpenid() {
+		return openid;
+	}
+
+	public void setOpenid(String openid) {
+		this.openid = openid;
+	}
+
+	public String getLang() {
+		return lang;
+	}
+
+	public void setLang(String lang) {
+		this.lang = lang;
+	}
+
+	/**
+	 * 参数组装
+	 * @return
+	 */
+	@Override
+	public Map<String, String> getParams() {
+		Map<String, String> params = new TreeMap<String, String>();
+		params.put("access_token", this.accessToken);
+		params.put("openid", this.openid);
+		params.put("lang", this.lang);
+		return params;
+	}
+}

+ 72 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/req/RefreshAuthTokenParams.java

@@ -0,0 +1,72 @@
+package com.uas.platform.b2c.common.weixin.model.req;
+
+
+import com.uas.platform.b2c.common.weixin.model.base.AbstractParams;
+
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * 刷新token请求
+ *
+ * @author liuam
+ * @date 2018年6月12日
+ *
+ */
+public class RefreshAuthTokenParams extends AbstractParams {
+
+	private static final long serialVersionUID = -1748872326563685295L;
+	/**
+	 * 公众号的唯一标识
+	 */
+	private String appid;
+	/**
+	 * 填写为refresh_token
+	 */
+	private String grant_type = "refresh_token";
+	/**
+	 * 填写通过access_token获取到的refresh_token参数
+	 */
+	private String refresh_token;
+
+	public RefreshAuthTokenParams(String appid, String grant_type, String refresh_token) {
+		super();
+		this.appid = appid;
+		this.grant_type = grant_type;
+		this.refresh_token = refresh_token;
+	}
+
+	/**
+	 * 参数组装
+	 * 
+	 * @return
+	 */
+	@Override
+	public Map<String, String> getParams() {
+		Map<String, String> params = new TreeMap<String, String>();
+		params.put("appid", this.appid);
+		params.put("grant_type", this.grant_type);
+		params.put("refresh_token", this.refresh_token);
+		return params;
+	}
+
+	public String getAppid() {
+		return appid;
+	}
+
+	public void setAppid(String appid) {
+		this.appid = appid;
+	}
+
+	public String getGrant_type() {
+		return grant_type;
+	}
+
+	public String getRefresh_token() {
+		return refresh_token;
+	}
+
+	public void setRefresh_token(String refresh_token) {
+		this.refresh_token = refresh_token;
+	}
+}

+ 77 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/req/WechatTemplateMsg.java

@@ -0,0 +1,77 @@
+package com.uas.platform.b2c.common.weixin.model.req;
+
+import java.util.TreeMap;
+
+/**
+ * 模板消息
+ * @author liuam
+ * @date 2018年6月12日
+ *
+ */
+public class WechatTemplateMsg {
+
+	/**
+	 * 接收者openid
+	 */
+	private String touser;
+
+	/**
+	 * 模板ID
+	 */
+	private String template_id;
+
+	/**
+	 * 模板跳转链接
+	 */
+	private String url;
+
+	/**
+	 * data数据
+	 */
+	private TreeMap<String, TreeMap<String, String>> data;
+
+	public String getTouser() {
+		return touser;
+	}
+
+	public void setTouser(String touser) {
+		this.touser = touser;
+	}
+
+	public String getTemplate_id() {
+		return template_id;
+	}
+
+	public void setTemplate_id(String template_id) {
+		this.template_id = template_id;
+	}
+
+	public String getUrl() {
+		return url;
+	}
+
+	public void setUrl(String url) {
+		this.url = url;
+	}
+
+	public TreeMap<String, TreeMap<String, String>> getData() {
+		return data;
+	}
+
+	public void setData(TreeMap<String, TreeMap<String, String>> data) {
+		this.data = data;
+	}
+
+	/**
+	 * 参数
+	 * @param value
+	 * @param color 可不填
+	 * @return
+	 */
+	public static TreeMap<String, String> item(String value, String color) {
+		TreeMap<String, String> params = new TreeMap<String, String>();
+		params.put("value", value);
+		params.put("color", color);
+		return params;
+	}
+}

+ 36 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/resp/AccessToken.java

@@ -0,0 +1,36 @@
+package com.uas.platform.b2c.common.weixin.model.resp;
+
+/**
+ * 微信通用接口凭证
+ *
+ * @author liuam
+ * @date 2018年6月12日
+ * 
+ */
+public class AccessToken {
+	/**
+	 * 获取到的凭证
+	 */
+	private String access_token;
+	/**
+	 * 凭证有效时间,单位:秒
+	 */
+	private int expires_in;
+
+	public String getAccess_token() {
+		return access_token;
+	}
+
+	public void setAccess_token(String access_token) {
+		this.access_token = access_token;
+	}
+
+	public int getExpires_in() {
+		return expires_in;
+	}
+
+	public void setExpires_in(int expires_in) {
+		this.expires_in = expires_in;
+	}
+
+}

+ 52 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/resp/AuthAccessToken.java

@@ -0,0 +1,52 @@
+package com.uas.platform.b2c.common.weixin.model.resp;
+
+/**
+ * 网页授权access_token
+ *
+ * @author liuam
+ * @date 2018年6月12日
+ *
+ */
+public class AuthAccessToken extends AccessToken {
+
+	/**
+	 * 用户刷新access_token
+	 */
+	private String refresh_token;
+
+	/**
+	 * 用户唯一标识,请注意,在未关注公众号时,
+	 * 用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
+	 */
+	private String openid;
+
+	/**
+	 * 用户授权的作用域,使用逗号(,)分隔
+	 */
+	private String scope;
+
+	public String getRefresh_token() {
+		return refresh_token;
+	}
+
+	public void setRefresh_token(String refresh_token) {
+		this.refresh_token = refresh_token;
+	}
+
+	public String getOpenid() {
+		return openid;
+	}
+
+	public void setOpenid(String openid) {
+		this.openid = openid;
+	}
+
+	public String getScope() {
+		return scope;
+	}
+
+	public void setScope(String scope) {
+		this.scope = scope;
+	}
+
+}

+ 122 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/resp/AuthUserInfo.java

@@ -0,0 +1,122 @@
+package com.uas.platform.b2c.common.weixin.model.resp;
+
+import java.util.List;
+
+/**
+ * 通过网页授权获取的用户信息
+ * @author liuam
+ * @date 2018年6月12日
+ *
+ */
+public class AuthUserInfo {
+	/**
+	 * 用户标识
+	 */
+	private String openid;
+	/**
+	 * 用户昵称
+	 */
+	private String nickname;
+
+	/**
+	 * 性别(1是男性,2是女性,0是未知)
+	 */
+	private Integer sex;
+
+	/**
+	 * 国家
+	 */
+	private String country;
+	/**
+	 * 省份
+	 */
+	private String province;
+	/**
+	 * 城市
+	 */
+	private String city;
+	/**
+	 * 用户头像链接
+	 */
+	private String headimgurl;
+	/**
+	 * 用户特权信息
+	 */
+	private List<String> privilege;
+	/**
+	 * 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段
+ 	 */
+	private String unionid;
+
+	public String getOpenid() {
+		return openid;
+	}
+
+	public void setOpenid(String openid) {
+		this.openid = openid;
+	}
+
+	public String getNickname() {
+		return nickname;
+	}
+
+	public void setNickname(String nickname) {
+		this.nickname = nickname;
+	}
+
+	public Integer getSex() {
+		return sex;
+	}
+
+	public void setSex(Integer sex) {
+		this.sex = sex;
+	}
+
+	public String getCountry() {
+		return country;
+	}
+
+	public void setCountry(String country) {
+		this.country = country;
+	}
+
+	public String getProvince() {
+		return province;
+	}
+
+	public void setProvince(String province) {
+		this.province = province;
+	}
+
+	public String getCity() {
+		return city;
+	}
+
+	public void setCity(String city) {
+		this.city = city;
+	}
+
+	public String getHeadimgurl() {
+		return headimgurl;
+	}
+
+	public void setHeadimgurl(String headimgurl) {
+		this.headimgurl = headimgurl;
+	}
+
+	public List<String> getPrivilege() {
+		return privilege;
+	}
+
+	public void setPrivilege(List<String> privilege) {
+		this.privilege = privilege;
+	}
+
+	public String getUnionid() {
+		return unionid;
+	}
+
+	public void setUnionid(String unionid) {
+		this.unionid = unionid;
+	}
+}

+ 47 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/resp/TemplateMsgResult.java

@@ -0,0 +1,47 @@
+package com.uas.platform.b2c.common.weixin.model.resp;
+
+/**
+ * 模板消息 返回的结果
+ * @author liuam
+ * @since 2018/6/12 0012 下午 14:20
+ *
+ */
+public class TemplateMsgResult {
+
+	/**
+	 * 消息id(发送模板消息)
+	 */
+	private Long msgid;
+	/**
+	 * 状态
+	 */
+	private Integer errcode;
+	/**
+	 * 信息
+	 */
+	private String errmsg;
+
+	public Long getMsgid() {
+		return msgid;
+	}
+
+	public void setMsgid(Long msgid) {
+		this.msgid = msgid;
+	}
+
+	public Integer getErrcode() {
+		return errcode;
+	}
+
+	public void setErrcode(Integer errcode) {
+		this.errcode = errcode;
+	}
+
+	public String getErrmsg() {
+		return errmsg;
+	}
+
+	public void setErrmsg(String errmsg) {
+		this.errmsg = errmsg;
+	}
+}

+ 92 - 85
src/main/java/com/uas/platform/b2c/common/weixin/service/impl/WeChatServiceImpl.java

@@ -1,30 +1,36 @@
 package com.uas.platform.b2c.common.weixin.service.impl;
 
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 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.common.weixin.model.MessageModel;
-import com.uas.platform.b2c.common.weixin.model.TemplateData;
-import com.uas.platform.b2c.common.weixin.model.TemplateDataDetail;
-import com.uas.platform.b2c.common.weixin.model.TemplateMessage;
+import com.uas.platform.b2c.common.weixin.model.req.AuthTokenParams;
+import com.uas.platform.b2c.common.weixin.model.req.AuthUserParams;
+import com.uas.platform.b2c.common.weixin.model.req.WechatTemplateMsg;
+import com.uas.platform.b2c.common.weixin.model.resp.AccessToken;
+import com.uas.platform.b2c.common.weixin.model.resp.AuthAccessToken;
+import com.uas.platform.b2c.common.weixin.model.resp.AuthUserInfo;
+import com.uas.platform.b2c.common.weixin.model.resp.TemplateMsgResult;
 import com.uas.platform.b2c.common.weixin.service.WeChatService;
+import com.uas.platform.b2c.common.weixin.util.HttpReqUtil;
 import com.uas.platform.b2c.common.weixin.util.WeChatUtil;
 import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.util.serializer.FlexJsonUtils;
-import com.uas.sso.common.util.HttpUtil;
 import com.uas.sso.entity.UserAccount;
 import com.uas.sso.entity.UserView;
 import com.uas.sso.util.AccountUtils;
-import net.sf.json.JSONArray;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.ui.ModelMap;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @author liusw
@@ -36,14 +42,23 @@ public class WeChatServiceImpl implements WeChatService{
     @Autowired
     private UserDao userDao;
 
+    @Autowired
+    private RedisTemplate redisTemplate;
+
+    /**
+     * 保存到 redis 里的过期时间(second)
+     */
+    private static final Integer ACCESS_TOKEN_EXPIRES_IN = 3600;
+
     @Override
     public ModelMap getWxUserInfo(String code, String state) {
         ModelMap result = new ModelMap();
         if (!StringUtils.isEmpty(code)) {
-            JSONObject userInfo = getAccessTokenByCode(code);
-            result.put("nickname", userInfo.getString("nickname"));
-            result.put("headimgurl", userInfo.getString("headimgurl"));
-            String openid = userInfo.getString("openid");
+            AuthUserInfo userInfo = getAccessTokenByCode(code);
+            result.put("nickname", userInfo.getNickname());
+            result.put("headimgurl", userInfo.getHeadimgurl());
+            String openid = userInfo.getOpenid();
+
             result.put("openid", openid);
             User user = userDao.findUsersByOpenId(openid);
             if (StringUtils.isEmpty(user)) {
@@ -74,53 +89,37 @@ public class WeChatServiceImpl implements WeChatService{
     @Override
     public ModelMap sendTemplateMessage(List<MessageModel> messages) {
         ModelMap result = new ModelMap();
-        String url = WeChatUtil.GET_ACCESS_TOKEN;
-        url = url.replace("APPID", WeChatUtil.APPID);
-        url = url.replace("SECRET", WeChatUtil.APPSECRET);
-        try {
-            HttpUtil.ResponseWrap res = HttpUtil.doGet(url);
-            JSONObject jsonObject = JSON.parseObject(res.getContent());
-            String access_token = jsonObject.getString("access_token");
-            String sendTemplateUrl = WeChatUtil.SEND_TEMPLATE_URL.replace("ACCESS_TOKEN", access_token);
-            // 模板内容设置
-            TemplateMessage templateMessage = new TemplateMessage();
-            templateMessage.setTemplate_id(WeChatUtil.INQUIRY_TEMPLATE_ID);
-            TemplateDataDetail first = new TemplateDataDetail();
-            TemplateDataDetail keyword1 = new TemplateDataDetail();
-            TemplateDataDetail keyword2 = new TemplateDataDetail();
-            TemplateDataDetail keyword3 = new TemplateDataDetail();
-            TemplateDataDetail remark = new TemplateDataDetail();
-            for (MessageModel messageModel : messages) {
-                User user = userDao.findOne(messageModel.getReceiverUu());
-                if (!StringUtils.isEmpty(user.getOpenId())) {
-                    templateMessage.setUrl("https://www.usoftmall.com/mobile/applyPurchase/list/businessOpportunity?enuu=" + messageModel.getReceiverEnuu());
-                    Map<String, TemplateDataDetail> data = new HashMap<>();
-                    templateMessage.setTouser(user.getOpenId());
-                    keyword1.setValue(messageModel.getName());
-                    keyword1.setColor("#173177");
-                    data.put("keyword1", keyword1);
-                    keyword2.setValue("点击查看详情");
-                    keyword2.setColor("#173177");
-                    data.put("keyword2", keyword2);
-                    keyword3.setColor("#173177");
-                    keyword3.setValue("点击查看详情");
-                    data.put("keyword3", keyword3);
-                    first.setValue("尊敬的用户,您所在的企业(" + messageModel.getName() + ")有一条新的询价单");
-                    remark.setValue(messageModel.getContent());
-                    data.put("first", first);
-                    data.put("remark", remark);
-                    templateMessage.setData(data);
-                    HttpUtil.doPost(sendTemplateUrl, FlexJsonUtils.toJsonDeep(templateMessage));
-                }
+        List<TemplateMsgResult> templateMsgResults = new ArrayList<>();
+
+        TreeMap<String, TreeMap<String, String>> params = new TreeMap<>();
+
+        // 获取操作 api 需要的 access_token
+        String access_token = getAccessToken();
+        String sendTemplateUrl = WeChatUtil.SEND_TEMPLATE_URL.replace("ACCESS_TOKEN", access_token);
+        // 模板内容设置
+        for (MessageModel messageModel : messages) {
+            User user = userDao.findOne(messageModel.getReceiverUu());
+            if (!StringUtils.isEmpty(user.getOpenId())) {
+                WechatTemplateMsg wechatTemplateMsg = new WechatTemplateMsg();
+                wechatTemplateMsg.setTemplate_id(WeChatUtil.INQUIRY_TEMPLATE_ID);
+
+                params.put("first", WechatTemplateMsg.item("尊敬的用户,您所在的企业(" + messageModel.getName() + ")有一条新的询价单", null));
+                params.put("keyword1", WechatTemplateMsg.item(messageModel.getName(), "#173177"));
+                params.put("keyword2", WechatTemplateMsg.item("点击查看详情", "#173177"));
+                params.put("keyword3", WechatTemplateMsg.item("点击查看详情", "#173177"));
+                params.put("remark", WechatTemplateMsg.item(WeChatUtil.TEMPLATE_REMARK.replace("cmpCode", messageModel.getCmpCode()), null));
+
+                wechatTemplateMsg.setUrl("https://www.usoftmall.com/mobile/applyPurchase/list/businessOpportunity?enuu=" + messageModel.getReceiverEnuu());
+                wechatTemplateMsg.setTouser(user.getOpenId());
+                wechatTemplateMsg.setData(params);
+                String json = HttpReqUtil.doPost(sendTemplateUrl, FlexJsonUtils.toJsonDeep(wechatTemplateMsg));
+
+                TemplateMsgResult templateMsgResult = FlexJsonUtils.fromJson(json, TemplateMsgResult.class);
+                templateMsgResults.add(templateMsgResult);
             }
-            result.put("success", true);
-            return result;
-        } catch (Exception e) {
-            e.printStackTrace();
-            result.put("success", false);
-            result.put("message", e.getMessage());
-            return result;
         }
+        result.put("data", templateMsgResults);
+        return result;
     }
 
     @Override
@@ -174,36 +173,44 @@ public class WeChatServiceImpl implements WeChatService{
      * 通过code获取用户openId
      * @param code
      */
-    private JSONObject getAccessTokenByCode(String code) {
-        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
-        url = url.replace("APPID", WeChatUtil.APPID);
-        url = url.replace("SECRET", WeChatUtil.APPSECRET);
-        url = url.replace("CODE", code);
-        try {
-            HttpUtil.ResponseWrap res = HttpUtil.doGet(url);
-            JSONObject jsonObject = JSON.parseObject(res.getContent());
-            String accessToken = jsonObject.getString("access_token");
-            String openId = jsonObject.getString("openid");
-            String refreshToken = jsonObject.getString("refresh_token");
-            JSONObject userInfo = getUserInfo(accessToken, openId);
-            return userInfo;
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return null;
+    private AuthUserInfo getAccessTokenByCode(String code) {
+        AuthTokenParams authTokenParams = new AuthTokenParams(WeChatUtil.APPID, WeChatUtil.APPSECRET, code, "authorization_code");
+        String json = HttpReqUtil.doGet(WeChatUtil.GET_OAUTH_TOKEN_URL, authTokenParams.getParams());
+        AuthAccessToken authAccessToken = FlexJsonUtils.fromJson(json, AuthAccessToken.class);
+        String accessToken = authAccessToken.getAccess_token();
+        String openId = authAccessToken.getOpenid();
+        AuthUserInfo userInfo = getUserInfo(accessToken, openId);
+        return userInfo;
     }
 
-    private JSONObject getUserInfo(String accessToken, String openId) {
-        String url = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
-        url = url.replace("ACCESS_TOKEN", accessToken);
-        url = url.replace("OPENID", openId);
-        try {
-            HttpUtil.ResponseWrap res = HttpUtil.doGet(url);
-            JSONObject jsonObject = JSON.parseObject(res.getContent());
-            return jsonObject;
-        } catch (Exception e) {
-            e.printStackTrace();
+    /**
+     * 获取用户信息
+     * @param accessToken
+     * @param openId
+     * @return
+     */
+    private AuthUserInfo getUserInfo(String accessToken, String openId) {
+        // 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语
+        AuthUserParams authUserParams = new AuthUserParams(accessToken, openId, "zh_CN");
+        String json = HttpReqUtil.doGet(WeChatUtil.SNS_USERINFO_URL, authUserParams.getParams());
+        AuthUserInfo authUserInfo = FlexJsonUtils.fromJson(json, AuthUserInfo.class);
+        return authUserInfo;
+    }
+
+    /**
+     * 获取调用api所需的access_token
+     *
+     */
+    private String getAccessToken () {
+        String access_token = (String) redisTemplate.opsForValue().get("WX_ACCESS_TOKEN");
+        if (!StringUtils.isEmpty(access_token)) {
+            return access_token;
         }
-        return null;
+        AuthTokenParams authTokenParams = new AuthTokenParams(WeChatUtil.APPID, WeChatUtil.APPSECRET,"client_credential");
+        String json = HttpReqUtil.doGet(WeChatUtil.GET_ACCESS_TOKEN, authTokenParams.getParams());
+        AccessToken accessToken = FlexJsonUtils.fromJson(json, AccessToken.class);
+        access_token = accessToken.getAccess_token();
+        redisTemplate.opsForValue().set("WX_ACCESS_TOKEN", access_token, ACCESS_TOKEN_EXPIRES_IN, TimeUnit.SECONDS);
+        return access_token;
     }
 }

+ 145 - 0
src/main/java/com/uas/platform/b2c/common/weixin/util/HttpReqUtil.java

@@ -0,0 +1,145 @@
+package com.uas.platform.b2c.common.weixin.util;
+
+import com.uas.sso.common.util.HttpUtil;
+import org.apache.commons.collections4.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+/**
+ * @author liuam
+ * @since 2018/6/12 0012 下午 14:20
+ */
+public class HttpReqUtil {
+
+    /**
+     * 默认的http请求执行方法,返回
+     *
+     * @param path   请求path 路径
+     * @param map    请求参数集合
+     * @return
+     */
+    public static String doGet(String path, Map<String, String> map) {
+        String result = "";
+        try {
+            String url = setParmas((TreeMap<String, String>) map, path, "");
+            HttpUtil.ResponseWrap responseWrap = HttpUtil.doGet(url);
+            result = responseWrap.getContent();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+    /**
+     * 默认的http请求执行方法,返回
+     *
+     * @param path   请求path 路径
+     * @param json   请求json数据
+     * @return
+     */
+    public static String doPost(String path, String json) {
+        String result = "";
+        try {
+            HttpUtil.ResponseWrap responseWrap = HttpUtil.doPost(path, json);
+            result = responseWrap.getContent();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+
+    /**
+     * 设置参数
+     *
+     * @param map     参数map
+     * @param path    需要赋值的path
+     * @param charset 编码格式 默认编码为utf-8(取消默认)
+     * @return 已经赋值好的url 只需要访问即可
+     */
+    public static String setParmas(Map<String, String> map, String path, String charset) throws Exception {
+        String result = "";
+        boolean hasParams = false;
+        if (path != null && !"".equals(path)) {
+            if (MapUtils.isNotEmpty(map)) {
+                StringBuilder builder = new StringBuilder();
+                Set<Map.Entry<String, String>> params = map.entrySet();
+                for (Map.Entry<String, String> entry : params) {
+                    if (entry.getValue() == null) {
+                        continue;
+                    }
+                    String key = entry.getKey().trim();
+                    String value = entry.getValue().trim();
+                    if (hasParams) {
+                        builder.append("&");
+                    } else {
+                        hasParams = true;
+                    }
+                    if (charset != null && !"".equals(charset)) {
+                        // builder.append(key).append("=").append(URLDecoder.(value,charset));
+                        builder.append(key).append("=").append(urlEncode(value, charset));
+                    } else {
+                        builder.append(key).append("=").append(value);
+                    }
+                }
+                result = builder.toString();
+            }
+        }
+        return doUrlPath(path, result).toString();
+    }
+
+    /**
+     * 编码
+     *
+     * @param source
+     * @param encode
+     * @return
+     */
+    public static String urlEncode(String source, String encode) {
+        String result = source;
+        try {
+            result = URLEncoder.encode(source, encode);
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+
+    /**
+     * 设置连接参数
+     *
+     * @param path
+     *            路径
+     * @return
+     */
+    private static URL doUrlPath(String path, String query) throws Exception {
+        URL url = new URL(path);
+        if (StringUtils.isEmpty(path)) {
+            return url;
+        }
+        if (StringUtils.isEmpty(url.getQuery())) {
+            if (path.endsWith("?")) {
+                path += query;
+            } else {
+                path = path + "?" + query;
+            }
+        } else {
+            if (path.endsWith("&")) {
+                path += query;
+            } else {
+                path = path + "&" + query;
+            }
+        }
+        return new URL(path);
+    }
+}
+
+
+

+ 16 - 1
src/main/java/com/uas/platform/b2c/common/weixin/util/WeChatUtil.java

@@ -29,5 +29,20 @@ public class WeChatUtil {
     /**
      * 获取access_token
      */
-    public static final String GET_ACCESS_TOKEN = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET";
+    public static final String GET_ACCESS_TOKEN = "https://api.weixin.qq.com/cgi-bin/token";
+
+    /**
+     * 获取token的链接
+     */
+    public static final String GET_OAUTH_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token";
+
+    /**
+     * 获取授权用户信息
+     */
+    public static final String SNS_USERINFO_URL = "https://api.weixin.qq.com/sns/userinfo";
+
+    /**
+     * 模板消息remark规范
+     */
+    public static final String TEMPLATE_REMARK = "关于型号:cmpCode的公共询价信息,邀请您参与报价。";
 }

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

@@ -109,6 +109,7 @@ public class KindServiceImpl implements KindService {
         return kindPropertyUas;
     }
 
+
     @Override
     public Map<String, List<KindUas>> getParentsByKindCode(String kindCode) {
         Map<Long, Kind> maps = new HashMap<>();

+ 42 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/api/GoodsController.java

@@ -0,0 +1,42 @@
+package com.uas.platform.b2c.prod.commodity.api;
+
+import com.uas.platform.b2c.prod.commodity.model.Goods;
+import com.uas.platform.b2c.prod.commodity.service.GoodsService;
+import com.uas.platform.core.model.PageParams;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * Created by wangyc on 2018/4/23.
+ *
+ * @version 2018/4/23 9:35 wangyc
+ */
+@RestController("APIGoodsController")
+@RequestMapping("/api/product/goods")
+public class GoodsController {
+
+    private final GoodsService goodsService;
+
+    @Autowired
+    public GoodsController(GoodsService goodsService) {
+        this.goodsService = goodsService;
+    }
+
+    /**
+     * 通过品牌uuid,类目id,关键词获取物料信息(暂时针对pcb模块)
+     * @param pageParams 分页参数
+     * @param branduuid 品牌uuid
+     * @param kindid 类目id
+     * @param keyword 关键词
+     * @return
+     */
+    @RequestMapping(method = RequestMethod.GET, produces = "application/json")
+    public Page<Goods> findProducts(PageParams pageParams, @RequestParam(value = "branduuid", required = true) String branduuid, @RequestParam(value = "kindid", required = false) String kindid, @RequestParam(value = "keyword", required = false) String keyword) {
+        return goodsService.findGoods(pageParams, branduuid, kindid, keyword);
+    }
+
+}

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

@@ -37,6 +37,8 @@ public enum  ErrorInfoConstant {
     BRAND_EMPTY_INFO("英文/中文品牌名称不能为空"),
     KIND_EMPTY_INFO("类目(产品名称)不能为空"),
     KIND_LENGTH_INFO("类目(产品名称)不能超过20个字符"),
+    // PCB模块使用
+    KIND_UNSTANDARD("类目(产品名称)不是商城标准类目"),
     BREAK_UP_INFO("请选择可拆卖情况是或否"),
     RESERVE_NUMBER_INFO("库存须填写小于10亿的正整数"),
     PRODUCE_DATE_INFO("生产日期不能为空"),

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

@@ -111,21 +111,56 @@ public final class UploadConstant {
      */
     public static final int PRICE_THIRD = 16;
 
+    /**
+     * 分段价格结束
+     */
+    public static final int PRICE_END = 14;
+
     /**
      * 自定义标签
      */
     public static final int CUSTOM_LABEL = 17;
 
+    /**
+     * 尺寸(pcb)
+     */
+    public static final int SIZE = 18;
+
+    /**
+     * 颜色(pcb)
+     */
+    public static final int COLOR = 19;
+
+    /**
+     * 铜厚(pcb)
+     */
+    public static final int THICK_COPPER = 20;
+
+    /**
+     * 厚度(pcb)
+     */
+    public static final int THICK = 21;
+
     /**
      * 导入表的最大列数
      */
     public static final int TOTAL_COLUMN = 18;
 
+    /**
+     * 导入pcb表的最大列数
+     */
+    public static final int TOTAL_COLUMN_PCB = 22;
+
     /**
      * 用户可能直接用导入失败的表格进行导入
      */
     public static final int MAX_TOTAL_COLUMN = 19;
 
+    /**
+     * 用户可能直接用导入失败的pcb表格进行导入
+     */
+    public static final int MAX_TOTAL_COLUMN_PCB = 23;
+
     /**
      * 个人导入表的最大列数
      */
@@ -140,4 +175,9 @@ public final class UploadConstant {
      * 规格的最大长度
      */
     public static final int SPEC_MAX_BYTE = 50;
+
+    /**
+     * PCB一级类目id
+     */
+    public static final long PCB_PARENTID = 3825L;
 }

+ 106 - 2
src/main/java/com/uas/platform/b2c/prod/commodity/controller/ReleaseProductByBatchController.java

@@ -153,7 +153,19 @@ public class ReleaseProductByBatchController {
     @RequestMapping(value = "/batchRelease", method = RequestMethod.POST)
     public String batchRelease(String batch) {
         logger.log("批量上架模块", "批量发布指定批次:" + batch + "的上架内容");
-        return releaseProductByBatchService.publishByBatch(batch);
+        return releaseProductByBatchService.publishByBatch(batch, false);
+    }
+
+    /**
+     * 通过batch批量发布产品(pcb)
+     *
+     * @param batch the batch 发布的批次号
+     * @return string
+     */
+    @RequestMapping(value = "/batchRelease/pcb", method = RequestMethod.POST)
+    public String batchPCBRelease(String batch) {
+        logger.log("批量上架模块", "批量发布指定批次:" + batch + "的上架内容");
+        return releaseProductByBatchService.publishByBatch(batch, true);
     }
 
     /**
@@ -219,7 +231,39 @@ public class ReleaseProductByBatchController {
             } else {
                 throw new IllegalOperatorException("文件格式不正确!请上传.xls或.xlsx格式的文件");
             }
-            map = releaseProductByBatchService.releaseByWorkbook(workbook, selfSale, currency, isPerson, repeatImport);
+            map = releaseProductByBatchService.releaseByWorkbook(workbook, selfSale, currency, isPerson, repeatImport, false);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        logger.log("批量上架模块", "导入Excel批量上传商品");
+        return map;
+    }
+
+    /**
+     * 通过excel批量导入PCB商品发布(大量)
+     * @param uploadItem 上传内容
+     * @param currency 币别
+     * @param repeatImport 重复导入
+     * @return
+     */
+    @RequestMapping(value = "/release/excel/pcb", method = RequestMethod.POST)
+    public ModelMap releasePCBByExcel(FileUpload uploadItem, String currency, Integer repeatImport) {
+        ModelMap map = new ModelMap();
+        String fileName = uploadItem.getFile().getOriginalFilename();
+        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
+        InputStream is = null;
+        Workbook workbook = null;
+        try {
+            is = uploadItem.getFile().getInputStream();
+            if ("xls".equals(suffix)) {
+                workbook = new HSSFWorkbook(is);
+            } else if ("xlsx".equals(suffix)) {
+                workbook = new XSSFWorkbook(is);
+            } else {
+                throw new IllegalOperatorException("文件格式不正确!请上传.xls或.xlsx格式的文件");
+            }
+            // pcb都为店铺自营、非个人上传、属于PCB模块上传
+            map = releaseProductByBatchService.releaseByWorkbook(workbook, true, currency, IntegerConstant.NO_SHORT.intValue(), repeatImport, true);
         } catch (IOException e) {
             e.printStackTrace();
         }
@@ -271,6 +315,49 @@ public class ReleaseProductByBatchController {
         return releaseProductByBatchService.getPageReleaseProductByBatch(info, batch);
     }
 
+    /**
+     * 导出不合格的数据(pcb)
+     *
+     * @param batch   the batch 批次号
+     * @param request the request 请求对象
+     * @param isAjax  the is ajax 是否是ajax 请求
+     * @return model and view
+     */
+    @RequestMapping(value = "/release/failure/pcb/xls", method = RequestMethod.GET)
+    public ModelAndView exportPcbOrderses(String batch, HttpServletRequest request, @RequestParam(defaultValue = "false") Boolean isAjax, String currency, Integer isPerson) {
+        ModelAndView modelAndView = new ModelAndView();
+        HttpSession session = request.getSession();
+        Object loading = session.getAttribute("load-error-ing");
+        if (isAjax) {
+            MappingJackson2JsonView view = new MappingJackson2JsonView();
+            Map attributes = new HashMap();
+            if (loading == null || !Boolean.valueOf(loading.toString())) {
+                attributes.put("load", false);
+            } else if (Boolean.valueOf(loading.toString())) {
+                attributes.put("load", true);
+            }
+            view.setAttributesMap(attributes);
+            modelAndView.setView(view);
+            return modelAndView;
+        }
+        if (loading == null || !Boolean.valueOf(loading.toString())) {
+            session.setAttribute("load-error-ing", true);
+        }
+        modelAndView.addObject("data", releaseProductByBatchService.findFailureReleaseProductByBatch(batch));
+        String url ="";
+
+        if (Currency.USD.equals(currency)) {
+            url = "classpath:jxls-tpl/trade/releasePCBByBatchError-usd";
+        } else {
+            url = "classpath:jxls-tpl/trade/releasePCBByBatchError-rmb";
+        }
+
+        modelAndView.setView(new JxlsExcelView(url, "导入失败产品-优软商城"));
+        logger.log("批量上架模块", "以Excel形式导出批量上架商品匹配不合格的数据");
+        session.setAttribute("load-error-ing", false);
+        return modelAndView;
+    }
+
     /**
      * 导出不合格的数据
      *
@@ -370,4 +457,21 @@ public class ReleaseProductByBatchController {
         session.setAttribute("load-error-ing", false);
         return modelAndView;
     }
+
+    /**
+     * 获取批量发布PCB商品的模板(大量)
+     * @param currency
+     * @return
+     */
+    @RequestMapping(value = "/release/template/pcb", method = RequestMethod.GET)
+    public ModelAndView exportOrdersesPCB(String currency) {
+        ModelAndView modelAndView = new ModelAndView();
+        logger.log("商品批次", "下载批量上架PCB商品的Excel模板");
+        if (Currency.USD.equals(currency)) {
+            modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/trade/releasePCBbyBatch-usd", "PCB产品导入模板-优软商城"));
+        } else {
+            modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/trade/releasePCBByBatch-rmb", "PCB产品导入模板-优软商城"));
+        }
+        return modelAndView;
+    }
 }

+ 17 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/dao/GoodsDao.java

@@ -514,6 +514,15 @@ public interface GoodsDao extends JpaSpecificationExecutor<Goods>, JpaRepository
 	@Query(value = "select g from Goods g where g.productid =:productId order by g.id desc")
 	List<Goods> findByProductId(@Param("productId") Long id);
 
+    /**
+     * 根据productId 获取goods
+     *
+     * @param ids the id 来源id 的信息
+     * @return list
+     */
+    @Query(value = "select g from Goods g where g.productid in (:ids)")
+    List<Goods> findByProductIds(@Param("ids") List<Long> ids);
+
     /**
      * 根据productId 获取goods,按照时间降序排列
      *
@@ -760,4 +769,12 @@ public interface GoodsDao extends JpaSpecificationExecutor<Goods>, JpaRepository
      */
     @Query(value = "select g.tag from Goods g where g.productid = :productId and g.tag like'类型%' order by g.tag")
     List<String> getTagByProductId(@Param("productId") Long productId);
+
+    /**
+     * 根据店铺id查找店铺所属企业enUU
+     * @param storeid
+     * @return
+     */
+    @Query(value = "select distinct g.enUU from Goods g where g.storeid = :storeid")
+    Long findenUUByStoreid(@Param("storeid") String storeid);
 }

+ 106 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/dao/PCBDao.java

@@ -0,0 +1,106 @@
+package com.uas.platform.b2c.prod.commodity.dao;
+
+import com.uas.platform.b2c.prod.commodity.model.PCB;
+import java.util.List;
+import java.util.Set;
+
+import com.uas.platform.b2c.prod.commodity.model.PCBPropertyValue;
+import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.security.access.method.P;
+import org.springframework.stereotype.Repository;
+
+/**
+ * Created by wangyc on 2018/4/23.
+ *
+ * @version 2018/4/23 10:20 wangyc
+ */
+@Repository
+public interface PCBDao extends  JpaSpecificationExecutor<PCB>, JpaRepository<PCB, Long> {
+
+    /**
+     * 通过品牌id获取物料id
+     * @param brandid 品牌id
+     * @return
+     */
+    @Query(nativeQuery = true, value = "select pcb_productid from product$pcb where pcb_brandid =:brandid")
+    List<Long> findProductIdByBrandid(@Param("brandid") Long brandid);
+
+    /**
+     * 通过类目id获取物料id
+     * @param kindid 类目id
+     * @return
+     */
+    @Query(nativeQuery = true, value = "select pcb_productid from product$pcb where pcb_kindid =:kindid")
+    List<Long> findProductIdByKindid(@Param("kindid") Long kindid);
+
+    /**
+     * 通过类目id、品牌id获取物料id
+     * @param kindid
+     * @param brandid
+     * @return
+     */@Query(nativeQuery = true, value = "select pcb_productid from product$pcb where pcb_kindid =:kindid and pcb_brandid =:brandid")
+    List<Long> findProductIdByKindidAndBrandid(@Param("kindid") Long kindid, @Param("brandid") Long brandid);
+
+
+    /**
+     * 根据PCB器件的品牌id获取器件的类目id,按器件数量倒序排序
+     *
+     * @param brandId 品牌id
+     * @return 器件信息
+     */
+    @Query("select p.kindid from PCB p where p.brandid = :brandId group by p.kindid order by count(p.kindid) desc")
+    public List<Long> findKindInfoIdByBandId(@Param("brandId") Long brandId);
+
+    /**
+     * 根据PCB物料id获取物料属性信息
+     *
+     * @param productId
+     * @return 物料属性信息
+     */
+    @Query("SELECT p1,p1.property from PCBPropertyValue p1 ,Property p2 WHERE p1.propertyid = p2.id and p1.productid = :productId")
+    public List<PCBPropertyValue> findByPCBProductId(@Param("productId") Long productId);
+
+    /**
+     * 根据企业enUU获取PCB类目id信息
+     *
+     * @param enUU
+     * @return 物料属性信息
+     */
+    @Query("select distinct pcb.kindid from PCB pcb where pcb.productid in (select p.id from Product p where p.enUU = :enUU)")
+    public Set<Long> findByEnUU(@Param("enUU") Long enUU);
+
+    /**
+     * 通过物料id获取pcb信息
+     * @param productid
+     * @return
+     */
+    public List<PCB> findByProductid(Long productid);
+
+    /**
+     * 根据类目查找物料id
+     * @param kindIds
+     * @return
+     */
+    @Query("select distinct p.productid from PCB p where p.kindid in :kindIds")
+    public List<Long> findByKindIds(@Param("kindIds") Long[] kindIds);
+
+    /**
+     * 通过pcbids查找物料id
+     * @param pcbIds
+     * @return
+     */
+    @Query("select p.productid from PCB p where p.id = :pcbIds")
+    public Long findProductIdByPCBIds(@Param("pcbIds") Long pcbIds);
+
+    /**
+     * 通过enuu获取该企业所含有pcb物料数量
+     * @param enuu 企业uu
+     * @return
+     */
+    @Query(nativeQuery = true, value = "select count(1) from products where pr_id in (select distinct pcb_productid from product$pcb) and pr_enuu=:enuu")
+    public Long CountPCBProuductByEnuu(@Param("enuu") Long enuu);
+}

+ 16 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/dao/PcbPropertyvalueDao.java

@@ -0,0 +1,16 @@
+package com.uas.platform.b2c.prod.commodity.dao;
+
+import com.uas.platform.b2c.prod.commodity.model.PCBPropertyValue;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+/**
+ * Created by wangyc on 2018/6/8.
+ *
+ * @version 2018/6/8 15:40 wangyc
+ */
+@Repository
+public interface PcbPropertyvalueDao extends JpaSpecificationExecutor<PCBPropertyValue>, JpaRepository<PCBPropertyValue, Long> {
+
+}

+ 8 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/dao/ReleaseProductByBatchDao.java

@@ -82,6 +82,14 @@ public interface ReleaseProductByBatchDao
     @Procedure(procedureName = "PRODUCT_RELEASE_VALID_V2")
 	public void callValidProcedure(Long publisherUu, String batchid);
 
+	/**
+	 * 验证器件和品牌的信息pcb
+	 * @param publisherUu
+	 * @param batchid
+	 */
+	@Procedure(procedureName = "PRODUCT_RELEASE_VALID_V2_PCB")
+	public void callValidProcedurePcb(Long publisherUu, String batchid);
+
     /**
      * 创建时间 :2017年1月6日 下午8:25:57
      *

+ 8 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/dao/V_ProductPrivateDao.java

@@ -43,4 +43,12 @@ public interface V_ProductPrivateDao extends JpaRepository<V_ProductPrivate, Lon
             "pp.pr_enuu=:enuu and pp.pr_pcmpcode is not null and pp.pr_pbranden is not null and pp.pr_b2cenabled = :enabled", nativeQuery = true)
     Integer getCountByEnuuAndEnabled(@Param("enuu") Long enuu, @Param("enabled") Integer enabled);
 
+
+    /**
+     * 获取指定id列表并且规格信息不为空的产品
+     * @param idList
+     * @return
+     */
+    @Query(value = "select p from V_ProductPrivate p where id in :idList and p.spec is not null")
+    List<V_ProductPrivate> findProductInIdAndSpecIsNotNull(@Param("idList") List<Long> idList);
 }

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

@@ -536,6 +536,16 @@ public class Goods implements Serializable {
 	@Transient
 	private String selfSale;
 
+	@Transient
+	private Double saleQty;
+
+	public Double getSaleQty() {
+		return saleQty;
+	}
+
+	public void setSaleQty(Double saleQty) {
+		this.saleQty = saleQty;
+	}
 
 	/**************************************************************************
 	 * Getter And Setter

+ 142 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/model/PCB.java

@@ -0,0 +1,142 @@
+package com.uas.platform.b2c.prod.commodity.model;
+
+import com.uas.platform.b2c.prod.product.brand.modal.BrandInfo;
+import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
+import java.io.Serializable;
+import java.util.Date;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+/**
+ * PCB实体(含PCB物料的类目、品牌信息)
+ * Created by wangyc on 2018/4/20.
+ *
+ * @version 2018/4/20 10:36 wangyc
+ */
+@Entity
+@Table(name = "product$pcb")
+public class PCB implements Serializable{
+
+    private static final long serialVersionUID = - 3347614981949922491L;
+
+    @Id
+    @Column(name = "pcb_id")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    /**
+     * 物料id
+     */
+    @Column(name = "pcb_productid")
+    private Long productid;
+
+    /**
+     * 物料信息
+     */
+    @OneToOne(cascade = { CascadeType.REFRESH })
+    @JoinColumn(name = "pcb_productid", insertable = false, updatable = false)
+    private Product product;
+
+    /**
+     * 类目id
+     */
+    @Column(name = "pcb_kindid")
+    private Long kindid;
+
+    /**
+     * 类目信息
+     */
+    @OneToOne(cascade = { CascadeType.REFRESH})
+    @JoinColumn(name = "pcb_kindid", insertable = false, updatable = false)
+    private KindInfo kind;
+
+    /**
+     * 品牌id
+     */
+    @Column(name = "pcb_brandid")
+    private Long brandid;
+
+    /**
+     * 品牌信息
+     */
+    @OneToOne(cascade = { CascadeType.REFRESH})
+    @JoinColumn(name = "pcb_brandid", insertable = false, updatable = false)
+    private BrandInfo brand;
+
+    /**
+     * 创建时间
+     */
+    @Column(name = "pcb_createtime")
+    private Date createtime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getProductid() {
+        return productid;
+    }
+
+    public void setProductid(Long productid) {
+        this.productid = productid;
+    }
+
+    public Product getProduct() {
+        return product;
+    }
+
+    public void setProduct(Product product) {
+        this.product = product;
+    }
+
+    public Long getKindid() {
+        return kindid;
+    }
+
+    public void setKindid(Long kindid) {
+        this.kindid = kindid;
+    }
+
+    public KindInfo getKind() {
+        return kind;
+    }
+
+    public void setKind(KindInfo kind) {
+        this.kind = kind;
+    }
+
+    public Long getBrandid() {
+        return brandid;
+    }
+
+    public void setBrandid(Long brandid) {
+        this.brandid = brandid;
+    }
+
+    public BrandInfo getBrand() {
+        return brand;
+    }
+
+    public void setBrand(BrandInfo brand) {
+        this.brand = brand;
+    }
+
+    public Date getCreatetime() {
+        return createtime;
+    }
+
+    public void setCreatetime(Date createtime) {
+        this.createtime = createtime;
+    }
+}

+ 99 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/model/PCBPropertyValue.java

@@ -0,0 +1,99 @@
+package com.uas.platform.b2c.prod.commodity.model;
+
+import com.uas.platform.b2c.prod.product.property.model.Property;
+import java.io.Serializable;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+
+/**
+ * PCB参数值
+ * Created by wangyc on 2018/4/20.
+ *
+ * @version 2018/4/20 10:53 wangyc
+ */
+@Entity
+@Table(name = "product$pcb_propertyvalue")
+public class PCBPropertyValue implements Serializable{
+
+    private static final long serialVersionUID = 8646182359961620603L;
+
+    @Id
+    @Column(name = "pcbpv_id")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    /**
+     * 物料id
+     */
+    @Column(name = "pcbpv_productid")
+    private Long productid;
+
+    /**
+     * 参数id
+     */
+    @NotNull
+    @Column(name = "pcbpv_propertyid")
+    private Long propertyid;
+
+    /**
+     * 参数信息
+     */
+    @OneToOne(cascade = {CascadeType.REFRESH})
+    @JoinColumn(name = "pcbpv_propertyid", insertable = false, updatable = false)
+    private Property property;
+
+    /**
+     * 参数值
+     */
+    @Column(name = "pcbpv_value")
+    private String value;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getPropertyid() {
+        return propertyid;
+    }
+
+    public void setPropertyid(Long propertyid) {
+        this.propertyid = propertyid;
+    }
+
+    public Long getProductid() {
+        return productid;
+    }
+
+    public void setProductid(Long productid) {
+        this.productid = productid;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public PCBPropertyValue() {
+
+    }
+
+    public PCBPropertyValue(Long propertyid, String value) {
+        this.productid = propertyid;
+        this.value = value;
+    }
+}

+ 103 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/model/ReleaseProductByBatch.java

@@ -286,6 +286,30 @@ public class ReleaseProductByBatch implements Serializable {
 	@Column(name = "rel_selfmindeliverystr")
 	private String selfMinDeliveryStr;
 
+	/**
+	 * 尺寸(pcb)
+	 */
+	@Column(name = "rel_size")
+	private String size;
+
+	/**
+	 * 颜色(pcb)
+	 */
+	@Column(name = "rel_color")
+	private String color;
+
+	/**
+	 * 铜厚(pcb)
+	 */
+	@Column(name = "rel_thickcopper")
+	private String thickCopper;
+
+	/**
+	 * 厚度(pcb)
+	 */
+	@Column(name = "rel_thick")
+	private String thick;
+
 //	/**
 //	 * 商城最长交期
 //	 */
@@ -627,6 +651,9 @@ public class ReleaseProductByBatch implements Serializable {
 
 	public void setReserveByExcel(Object value) {
 		setReserveStr(StringUtilB2C.getStr(value));
+		if (value == null || !RegexConstant.isNumber(value.toString())) {
+			addErrmsg(ErrorInfoConstant.RESERVE_NUMBER_INFO.getInfo());
+		}
 		if (value == null || StringUtils.isEmpty(value) || !RegexConstant.isNumber(value.toString())) {
 			addErrmsg(ErrorInfoConstant.RESERVE_NUMBER_INFO.getInfo());
 		} else {
@@ -775,6 +802,50 @@ public class ReleaseProductByBatch implements Serializable {
 
 	}
 
+	public void setSizeByExcel(Object value) {
+		String str = StringUtilB2C.getStr(value);
+		try {
+			if (!StringUtilB2C.isEmpty(str) && str.getBytes("GBK").length <= 256) {
+				setSize(str);
+			}
+		} catch (UnsupportedEncodingException e) {
+			throw new RuntimeException(e + "指定字符集不支持");
+		}
+	}
+
+	public void setColorByExcel(Object value) {
+		String str = StringUtilB2C.getStr(value);
+		try {
+			if (!StringUtilB2C.isEmpty(str) && str.getBytes("GBK").length <= 256) {
+				setColor(str);
+			}
+		} catch (UnsupportedEncodingException e) {
+			throw new RuntimeException(e + "指定字符集不支持");
+		}
+	}
+
+	public void setThickCopperByExcel(Object value) {
+		String str = StringUtilB2C.getStr(value);
+		try {
+			if (!StringUtilB2C.isEmpty(str) && str.getBytes("GBK").length <= 256) {
+				setThickCopper(str);
+			}
+		} catch (UnsupportedEncodingException e) {
+			throw new RuntimeException(e + "指定字符集不支持");
+		}
+	}
+
+	public void setThickByExcel(Object value) {
+		String str = StringUtilB2C.getStr(value);
+		try {
+			if (!StringUtilB2C.isEmpty(str) && str.getBytes("GBK").length <= 256) {
+				setThick(str);
+			}
+		} catch (UnsupportedEncodingException e) {
+			throw new RuntimeException(e + "指定字符集不支持");
+		}
+	}
+
 	@Override
 	public int hashCode() {
 		int result = (brandNameEn == null ? 0 : brandNameEn.hashCode());
@@ -1690,4 +1761,36 @@ public class ReleaseProductByBatch implements Serializable {
 		this.spec = spec;
 		return this;
 	}
+
+	public String getSize() {
+		return size;
+	}
+
+	public void setSize(String size) {
+		this.size = size;
+	}
+
+	public String getColor() {
+		return color;
+	}
+
+	public void setColor(String color) {
+		this.color = color;
+	}
+
+	public String getThickCopper() {
+		return thickCopper;
+	}
+
+	public void setThickCopper(String thickCopper) {
+		this.thickCopper = thickCopper;
+	}
+
+	public String getThick() {
+		return thick;
+	}
+
+	public void setThick(String thick) {
+		this.thick = thick;
+	}
 }

+ 38 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/service/GoodsService.java

@@ -14,6 +14,7 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.ui.ModelMap;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -44,6 +45,8 @@ public interface GoodsService {
      */
     Goods updateAvailableDays(Goods goods, GoodsHistory.OperateType operateType, Long... param);
 
+
+
     /**
      * 根据uuid查找货物信息
      *
@@ -709,4 +712,39 @@ public interface GoodsService {
      * @return
      */
     Goods getGoodsById(Long id);
+
+    /**
+     * 根据店铺id查找店铺所属企业enUU
+     * @param storeid
+     * @return
+     */
+    public Long findenUUByStoreid(String storeid);
+
+    /**
+     * 返回PCB商品信息
+     * @param keyword
+     * @param var2
+     * @param request
+     * @return
+     */
+    public ModelMap getPCBGoodsBySearch( String keyword, PageParams var2, HttpServletRequest request);
+
+    /**
+     * 通过品牌uuid,类目id,关键词获取批次信息(暂时针对pcb模块)
+     * @param params 分页参数
+     * @param branduuid 品牌uuid
+     * @param kindid 类目id
+     * @param keyword 关键词
+     * @return
+     */
+    Page<Goods> findGoods(PageParams params, String branduuid, String kindid, String keyword);
+
+
+    /**
+     * 更新货物的有效期
+     *
+     * @param privateList the operate type 操作的记录
+     * @param goodses       the param
+     */
+    void updateSpecByProducts(List<V_ProductPrivate> privateList, List<Goods> goodses);
 }

+ 2 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/service/ProductService.java

@@ -5,6 +5,7 @@ import com.uas.platform.b2c.prod.commodity.model.*;
 import com.uas.platform.b2c.trade.order.model.Purchase;
 import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
 import org.springframework.data.domain.Page;
 
 import java.util.List;
@@ -262,4 +263,5 @@ public interface ProductService {
      * @return
      */
     Double getQtyInOrderToBeUpload(List<String> batches);
+
 }

+ 4 - 2
src/main/java/com/uas/platform/b2c/prod/commodity/service/ReleaseProductByBatchService.java

@@ -31,9 +31,10 @@ public interface ReleaseProductByBatchService {
      * @param workbook the workbook 上传的文件
      * @param selfSale 是否自售
      * @param currency
+     * @param isPcb 是否PCB模块上传
      * @return model map
      */
-    public ModelMap releaseByWorkbook(Workbook workbook, Boolean selfSale, String currency, Integer isPerson, Integer repeatImport);
+    public ModelMap releaseByWorkbook(Workbook workbook, Boolean selfSale, String currency, Integer isPerson, Integer repeatImport, boolean isPcb);
 
     /**
      * 通过Excel上传资料修改商品
@@ -71,9 +72,10 @@ public interface ReleaseProductByBatchService {
      * 批量发布验证通过的信息
      *
      * @param batch the batch
+     * @param isPcb 是否PCB模块
      * @return string
      */
-    public String publishByBatch(String batch);
+    public String publishByBatch(String batch, boolean isPcb);
 
     /**
      * 批量批量导入个人产品库

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

@@ -141,9 +141,9 @@ public class GoodsHistoryServiceImpl implements GoodsHistoryService {
 			goodsHistory.setOperateUU(SystemSession.getUser().getUserUU());
 		}
 		goodsHistory.setOperateType(type);
-		if(GoodsHistory.OperateType.Update.getPhrase().equals(type)) {
-			goodsHistory.setMessage(compareGoodsHistory(goodsHistory));
-		}
+//		if(GoodsHistory.OperateType.Update.getPhrase().equals(type)) {
+//			goodsHistory.setMessage(compareGoodsHistory(goodsHistory));
+//		}
 		return goodsHistory;
 	}
 

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

@@ -1,5 +1,7 @@
 package com.uas.platform.b2c.prod.commodity.service.impl;
 
+import static com.uas.platform.core.persistence.criteria.PredicateUtils.like;
+
 import com.alibaba.fastjson.JSONObject;
 import com.uas.api.b2c_erp.core.model.OperateErrorStatus;
 import com.uas.api.b2c_erp.seller.model.GoodsFUas;
@@ -11,6 +13,7 @@ import com.uas.platform.b2c.advertise.ad.service.RecommendProductService;
 import com.uas.platform.b2c.common.account.dao.EnterpriseDao;
 import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.platform.b2c.common.account.model.User;
+import com.uas.platform.b2c.common.search.service.SearcherService;
 import com.uas.platform.b2c.core.config.SysConf;
 import com.uas.platform.b2c.core.constant.ShortConstant;
 import com.uas.platform.b2c.core.constant.SplitChar;
@@ -24,6 +27,15 @@ import com.uas.platform.b2c.external.erp.commodity.util.ModelConverter;
 import com.uas.platform.b2c.prod.commodity.constant.DoubleConstant;
 import com.uas.platform.b2c.prod.commodity.constant.IntegerConstant;
 import com.uas.platform.b2c.prod.commodity.constant.StringConstant;
+import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
+import com.uas.platform.b2c.prod.commodity.dao.GoodsHistoryDao;
+import com.uas.platform.b2c.prod.commodity.dao.GoodsSimpleDao;
+import com.uas.platform.b2c.prod.commodity.dao.PCBDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductDetailDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductPrivateDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductStandardPutOnInfoDao;
+import com.uas.platform.b2c.prod.commodity.model.*;
 import com.uas.platform.b2c.prod.commodity.constant.UploadConstant;
 import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
 import com.uas.platform.b2c.prod.commodity.dao.GoodsHistoryDao;
@@ -34,15 +46,18 @@ import com.uas.platform.b2c.prod.commodity.dao.ProductDetailDao;
 import com.uas.platform.b2c.prod.commodity.dao.ProductPrivateDao;
 import com.uas.platform.b2c.prod.commodity.dao.ProductStandardPutOnInfoDao;
 import com.uas.platform.b2c.prod.commodity.model.Goods;
-import com.uas.platform.b2c.prod.commodity.model.GoodsFilter;
 import com.uas.platform.b2c.prod.commodity.model.GoodsHistory;
 import com.uas.platform.b2c.prod.commodity.model.GoodsHistory.OperateType;
+import com.uas.platform.b2c.prod.commodity.service.GoodsHistoryService;
+import com.uas.platform.b2c.prod.commodity.service.GoodsPriceInfoService;
+import com.uas.platform.b2c.prod.commodity.service.GoodsService;
+import com.uas.platform.b2c.prod.commodity.service.ProductService;
+import com.uas.platform.b2c.prod.commodity.service.ProductStandardPutOnInfoService;
+import com.uas.platform.b2c.prod.commodity.service.ReleaseProductByBatchService;
 import com.uas.platform.b2c.prod.commodity.model.GoodsInfo;
-import com.uas.platform.b2c.prod.commodity.model.GoodsModifyInfo;
 import com.uas.platform.b2c.prod.commodity.model.GoodsPriceInfo;
 import com.uas.platform.b2c.prod.commodity.model.GoodsQtyPrice;
 import com.uas.platform.b2c.prod.commodity.model.GoodsSimple;
-import com.uas.platform.b2c.prod.commodity.model.ModifyInfo;
 import com.uas.platform.b2c.prod.commodity.model.Product;
 import com.uas.platform.b2c.prod.commodity.model.ProductDetail;
 import com.uas.platform.b2c.prod.commodity.model.ProductPrivate;
@@ -56,10 +71,14 @@ import com.uas.platform.b2c.prod.commodity.service.ReleaseProductByBatchService;
 import com.uas.platform.b2c.prod.commodity.status.ModifyInfoStatus;
 import com.uas.platform.b2c.prod.commodity.type.ModifyConstant;
 import com.uas.platform.b2c.prod.commodity.util.GoodsUtil;
+import com.uas.platform.b2c.prod.product.brand.dao.BrandDao;
+import com.uas.platform.b2c.prod.product.brand.modal.Brand;
 import com.uas.platform.b2c.prod.product.common.service.CreateNumberService;
 import com.uas.platform.b2c.prod.product.component.dao.ComponentDao;
 import com.uas.platform.b2c.prod.product.component.modal.Component;
+import com.uas.platform.b2c.prod.product.kind.dao.KindInfoDao;
 import com.uas.platform.b2c.prod.product.kind.model.Kind;
+import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
 import com.uas.platform.b2c.prod.product.kind.service.KindService;
 import com.uas.platform.b2c.prod.store.dao.StoreInDao;
 import com.uas.platform.b2c.prod.store.model.StoreIn;
@@ -97,6 +116,31 @@ import com.uas.platform.core.persistence.criteria.LogicalExpression;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
 import com.uas.platform.core.persistence.criteria.SimpleExpression;
 import com.uas.platform.core.util.StringUtil;
+import java.math.BigInteger;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import org.apache.commons.beanutils.ConvertUtils;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
 import org.apache.log4j.Logger;
@@ -124,6 +168,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.math.BigInteger;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
@@ -144,6 +189,7 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import static com.uas.platform.core.persistence.criteria.PredicateUtils.like;
+import static org.apache.commons.jexl2.parser.ParserConstants.and;
 
 
 /**
@@ -162,6 +208,9 @@ public class GoodsServiceImpl implements GoodsService {
      */
     private final BoundedExecutor executor;
 
+    @Autowired
+    private PCBDao pcbDao;
+
     @Autowired
     private GoodsDao goodsDao;
 
@@ -213,6 +262,9 @@ public class GoodsServiceImpl implements GoodsService {
     @Autowired
     private SysConf sysConf;
 
+    @Autowired
+    private SearcherService searcherService;
+
     @Autowired
     private JdbcTemplate jdbcTemplate;
 
@@ -251,13 +303,17 @@ public class GoodsServiceImpl implements GoodsService {
     @Autowired
     private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
 
+    private final BrandDao brandDao;
+
+    private final KindInfoDao kindInfoDao;
+
     @Autowired
     private GoodsModifyInfoDao goodsModifyInfoDao;
 
     private final Logger logger = Logger.getLogger(getClass());
 
     @Autowired
-    public GoodsServiceImpl(KindService kindService, StoreInDao storeInDao, StoreInService storeInService, ProductStandardPutOnInfoDao productStandardPutOnInfoDao, ProductDao productDao, BrowsingHistoryService browsingHistoryService, RecommendProductService recommendProductService) {
+    public GoodsServiceImpl(KindService kindService, StoreInDao storeInDao, StoreInService storeInService, ProductStandardPutOnInfoDao productStandardPutOnInfoDao, ProductDao productDao, BrowsingHistoryService browsingHistoryService, RecommendProductService recommendProductService, BrandDao brandDao, KindInfoDao kindInfoDao) {
         this.kindService = kindService;
         this.storeInDao = storeInDao;
         this.storeInService = storeInService;
@@ -265,6 +321,8 @@ public class GoodsServiceImpl implements GoodsService {
         this.productDao = productDao;
         this.browsingHistoryService = browsingHistoryService;
         this.recommendProductService = recommendProductService;
+        this.brandDao = brandDao;
+        this.kindInfoDao = kindInfoDao;
         ExecutorService executorService = Executors.newCachedThreadPool();
         executor = new BoundedExecutor(executorService, 1600);
     }
@@ -2541,9 +2599,22 @@ public class GoodsServiceImpl implements GoodsService {
             } else {
                 if (kindUuid.contains(",")) {
                     String[] kindIds = kindUuid.split(",");
-                    pageInfo.expression(PredicateUtils.in("kindUuid", kindIds, false));
+                    Long[] listkids = (Long[]) ConvertUtils.convert(kindIds,Long.class);
+                    if (listkids != null && listkids.length > 0) {
+//                        List<Long> productIds = pcbDao.findByKindIds(listkids);
+//                        if (!CollectionUtils.isEmpty(productIds)) {
+//                            pageInfo.expression(PredicateUtils.in("productid",productIds,false));
+//                        } else {
+                            pageInfo.expression(PredicateUtils.in("kindUuid", kindIds, false));
+//                        }
+                    }
                 } else {
-                    pageInfo.expression(PredicateUtils.eq("kindUuid", kindUuid, false));
+//                    List<Long> productId = pcbDao.findProductIdByKindid(Long.parseLong(kindUuid));
+//                    if (!CollectionUtils.isEmpty(productId)) {
+//                        pageInfo.expression(PredicateUtils.eq("productid",productId.get(0),false));
+//                    } else {
+                        pageInfo.expression(PredicateUtils.eq("kindUuid", kindUuid, false));
+//                    }
                 }
             }
         }
@@ -3881,6 +3952,90 @@ public class GoodsServiceImpl implements GoodsService {
      * @param batchCode
      * @return
      */
+    private Goods fillDataInGoods(ProductDetail detail) {
+        Goods goods = new Goods();
+        return goods;
+    }
+
+    /**
+     * 根据店铺id查找店铺所属企业enUU
+     * @param storeid
+     * @return
+     */
+    @Override
+    public Long findenUUByStoreid(String storeid) {
+        return goodsDao.findenUUByStoreid(storeid);
+    }
+
+    @Override
+    public ModelMap getPCBGoodsBySearch( String keyword, PageParams var2, HttpServletRequest request) {
+        int page = var2.getPage();
+        if (page > 100) {
+            page = 100;
+        }
+        var2.setPage(page);
+        ModelMap map = searcherService.getPcbGoods(keyword,var2,request);
+        int total = ((Integer)map.get("total")).intValue();
+        int expose = total;
+        int maxExpose = 100*var2.getCount();
+        if (total > maxExpose) {
+            expose = maxExpose;
+        }
+        map.put("expose", expose);
+
+        //unchecked
+        List<Goods> goods = (List<Goods>) map.get("pcbgoods");
+        if (CollectionUtils.isEmpty(goods)) {
+            map.put("pcbgoods",goods);
+            return map;
+        }
+        return map;
+    }
+
+    @Override
+    public Page<Goods> findGoods(PageParams params, String branduuid, String kindid, String keyword) {
+        List<Long> productIds = new ArrayList<Long>();
+        final PageInfo page = new PageInfo(params);
+
+        if (!StringUtils.isEmpty(branduuid)) {
+            Brand brand = brandDao.findByUuid(branduuid);
+            if (brand == null) {
+                throw new IllegalOperatorException("此品牌信息不存在,请重新确认品牌信息");
+            }
+            // 通过品牌信息获取物料id
+            productIds = pcbDao.findProductIdByBrandid(brand.getId());
+
+            if (!StringUtils.isEmpty(kindid)) {
+                KindInfo kind = kindInfoDao.findOne(Long.valueOf(kindid));
+                if (kind == null) {
+                    throw new IllegalOperatorException("此类目信息不存在,请重新确认类目信息");
+                }
+                // 通过品牌类目信息获取物料id
+                productIds = pcbDao.findProductIdByKindidAndBrandid(kind.getId(), brand.getId());
+            }
+        } else {
+            throw new IllegalOperatorException("无品牌信息,请重新确认品牌信息");
+        }
+
+        if (StringUtils.hasText(keyword)) {
+            page.filter("prodNum", keyword, true);
+        }
+
+        if (CollectionUtils.isNotEmpty(productIds)) {
+            LogicalExpression ids = PredicateUtils.in("productid", productIds, true);
+            page.expression(ids);
+        }
+
+        Page<Goods> goodsPage = goodsDao.findAll(new Specification<Goods>() {
+            @Override
+            public Predicate toPredicate(Root<Goods> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
+                query.where(page.getPredicates(root, query, cb));
+                return null;
+            }
+        }, page);
+
+        return goodsPage;
+    }
     private int getFrozenCount(String batchCode) {
         String statusStr = OrderStatus.TOBEPAID.getCodes() + SplitChar.HYPHEN + OrderStatus.TOBEDELIVER.getCodes();
         List<Integer> statusList = new ArrayList<>();
@@ -3983,4 +4138,34 @@ public class GoodsServiceImpl implements GoodsService {
             info.expression(PredicateUtils.eq("reserve", 0, true));
         }
 	}
+
+    /**
+     * 更新货物的有效期
+     *
+     * @param privateList the operate type 操作的记录
+     * @param goodses     the param
+     */
+    @Override
+    public void updateSpecByProducts(List<V_ProductPrivate> privateList, List<Goods> goodses) {
+        List<Goods> goods = new ArrayList<>();
+        List<GoodsHistory> goodsHistories = new ArrayList<>();
+        if (CollectionUtils.isNotEmpty(privateList) && CollectionUtils.isNotEmpty(goodses)) {
+            for (V_ProductPrivate v_productPrivate : privateList) {
+                for (Goods goodse : goodses) {
+                    if (goodse.getProductid() != null && (goodse.getProductid().longValue() ==  v_productPrivate.getId().longValue()) && (!StringUtils.isEmpty(v_productPrivate.getSpec())) && (!v_productPrivate.getSpec().equals(goodse.getSpec()))) {
+                        goodse.setSpec(v_productPrivate.getSpec());
+                        goods.add(goodse);
+                        GoodsHistory history = goodsHistoryService.converTGoodsHist(goodse, OperateType.Update.getPhrase(), false);
+                        goodsHistories.add(history);
+                    }
+                }
+            }
+        }
+        if (CollectionUtils.isNotEmpty(goods)) {
+            goodsDao.save(goods);
+        }
+        if (CollectionUtils.isNotEmpty(goodsHistories)) {
+            goodsHistoryService.save(goodsHistories);
+        }
+    }
 }

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

@@ -22,6 +22,44 @@ import com.uas.platform.b2c.prod.commodity.constant.StringConstant;
 import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
 import com.uas.platform.b2c.prod.commodity.dao.GoodsHistoryDao;
 import com.uas.platform.b2c.prod.commodity.dao.MatchModelDao;
+import com.uas.platform.b2c.prod.commodity.dao.PCBDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductDetailDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductMatchResultDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductModifyHistoryDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductPersonDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductPrivateDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductReplaceDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductStandardPutOnInfoDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductStoreStatusDao;
+import com.uas.platform.b2c.prod.commodity.dao.StockInOutHistDao;
+import com.uas.platform.b2c.prod.commodity.dao.V_ProductPersonDao;
+import com.uas.platform.b2c.prod.commodity.dao.V_ProductPrivateDao;
+import com.uas.platform.b2c.prod.commodity.model.Goods;
+import com.uas.platform.b2c.prod.commodity.model.GoodsHistory;
+import com.uas.platform.b2c.prod.commodity.model.GoodsQtyPrice;
+import com.uas.platform.b2c.prod.commodity.model.MatchModel;
+import com.uas.platform.b2c.prod.commodity.model.Product;
+import com.uas.platform.b2c.prod.commodity.model.ProductDetail;
+import com.uas.platform.b2c.prod.commodity.model.ProductMatchResult;
+import com.uas.platform.b2c.prod.commodity.model.ProductModifyHistory;
+import com.uas.platform.b2c.prod.commodity.model.ProductPerson;
+import com.uas.platform.b2c.prod.commodity.model.ProductPrivate;
+import com.uas.platform.b2c.prod.commodity.model.ProductReplace;
+import com.uas.platform.b2c.prod.commodity.model.ProductStandardPutOnInfo;
+import com.uas.platform.b2c.prod.commodity.model.ProductStoreStatus;
+import com.uas.platform.b2c.prod.commodity.model.StockInOutHist;
+import com.uas.platform.b2c.prod.commodity.model.UASBatchPutOnProperty;
+import com.uas.platform.b2c.prod.commodity.model.V_ProductPerson;
+import com.uas.platform.b2c.prod.commodity.model.V_ProductPrivate;
+import com.uas.platform.b2c.prod.commodity.service.GoodsHistoryService;
+import com.uas.platform.b2c.prod.commodity.service.GoodsService;
+import com.uas.platform.b2c.prod.commodity.service.ProductService;
+import com.uas.platform.b2c.prod.commodity.service.ReleaseProductByBatchService;
+import com.uas.platform.b2c.prod.commodity.service.UASBatchPutOnPropertyService;
+import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
+import com.uas.platform.b2c.prod.commodity.dao.GoodsHistoryDao;
+import com.uas.platform.b2c.prod.commodity.dao.MatchModelDao;
 import com.uas.platform.b2c.prod.commodity.dao.ProductDao;
 import com.uas.platform.b2c.prod.commodity.dao.ProductDetailDao;
 import com.uas.platform.b2c.prod.commodity.dao.ProductMatchResultDao;
@@ -65,7 +103,9 @@ import com.uas.platform.b2c.prod.product.component.dao.ComponentDao;
 import com.uas.platform.b2c.prod.product.component.dao.ComponentSubmitDao;
 import com.uas.platform.b2c.prod.product.component.modal.Component;
 import com.uas.platform.b2c.prod.product.component.modal.ComponentSubmit;
+import com.uas.platform.b2c.prod.product.kind.dao.KindInfoDao;
 import com.uas.platform.b2c.prod.product.kind.model.Kind;
+import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
 import com.uas.platform.b2c.prod.store.model.StoreIn;
 import com.uas.platform.b2c.prod.store.model.StoreStatus;
 import com.uas.platform.b2c.prod.store.service.StoreInService;
@@ -87,10 +127,29 @@ import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.model.Constant;
 import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
 import com.uas.platform.core.model.Type;
 import com.uas.platform.core.persistence.criteria.LogicalExpression;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
 import com.uas.platform.core.persistence.criteria.SimpleExpression;
+import java.lang.reflect.Field;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
 import org.apache.commons.beanutils.ConvertUtils;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.log4j.Logger;
@@ -244,6 +303,12 @@ public class ProductServiceImpl implements ProductService {
     @Autowired
     private ProductReplaceDao productReplaceDao;
 
+    @Autowired
+    private KindInfoDao kindInfoDao;
+
+    @Autowired
+    private PCBDao pcbDao;
+
     @Autowired
     private UserDao userDao;
 

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

@@ -20,6 +20,9 @@ import com.uas.platform.b2c.prod.commodity.service.ReleaseProductByBatchService;
 import com.uas.platform.b2c.prod.commodity.util.GoodsUtil;
 import com.uas.platform.b2c.prod.commodity.util.SheetUtil;
 import com.uas.platform.b2c.prod.product.common.service.CreateNumberService;
+import com.uas.platform.b2c.prod.product.kind.dao.KindInfoDao;
+import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
+import com.uas.platform.b2c.prod.product.property.dao.PropertyDao;
 import com.uas.platform.b2c.prod.store.model.StoreIn;
 import com.uas.platform.b2c.prod.store.model.StoreStatus;
 import com.uas.platform.b2c.prod.store.service.StoreInService;
@@ -31,6 +34,7 @@ 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.apache.commons.collections.map.HashedMap;
 import org.apache.poi.hssf.usermodel.HSSFCell;
 import org.apache.poi.hssf.usermodel.HSSFDateUtil;
 import org.apache.poi.ss.usermodel.*;
@@ -104,6 +108,26 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
     @Autowired
     private ProductPersonDao productPersonDao;
 
+	@Autowired
+	private KindInfoDao kindInfoDao;
+
+	@Autowired
+	private PCBDao pcbDao;
+
+	@Autowired
+	private PropertyDao propertyDao;
+
+	@Autowired
+	private PcbPropertyvalueDao pcbPropertyvalueDao;
+
+	@Autowired
+	private V_ProductPrivateDao v_productPrivateDao;
+
+	private static final String SIZE = "尺寸";
+	private static final String COLOR = "颜色";
+	private static final String THICKCOPPER = "铜厚";
+	private static final String THICK = "厚度";
+
 	@Value("#{sys.productServiceIp}")
 	private String productServiceIp;
 
@@ -121,7 +145,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 	 * @author hejq
 	 */
 	@Override
-	public ModelMap releaseByWorkbook(Workbook workbook, Boolean selfSale, String currency, Integer isPerson, Integer repeatImport) {
+	public ModelMap releaseByWorkbook(Workbook workbook, Boolean selfSale, String currency, Integer isPerson, Integer repeatImport, boolean isPcb) {
 		// 是否上传个人物料
 		boolean isAPerson = false;
 		boolean isImport = false;
@@ -140,15 +164,12 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 			if (colNum != UploadConstant.TOTAL_COLUMN_PERSON && colNum != UploadConstant.MAX_TOTAL_COLUMN_PERSON) {
 				throw new IllegalOperatorException("表格模板不正确!请重新下载最新模板");
 			}
-		} else {
-			if (colNum != UploadConstant.TOTAL_COLUMN && colNum != UploadConstant.MAX_TOTAL_COLUMN) {
+		} else if ((isPcb && colNum != UploadConstant.TOTAL_COLUMN_PCB && colNum != UploadConstant.MAX_TOTAL_COLUMN_PCB) || (!isPcb && colNum != UploadConstant.TOTAL_COLUMN && colNum != UploadConstant.MAX_TOTAL_COLUMN)) {
 				throw new IllegalOperatorException("表格模板不正确!请重新下载最新模板");
 			}
-		}
-		int rowNum = SheetUtil.getSheetLastNum(sheet, UploadConstant.MAX_TOTAL_COLUMN);
+		int rowNum = SheetUtil.getSheetLastNum(sheet, isPcb ? UploadConstant.MAX_TOTAL_COLUMN_PCB : UploadConstant.MAX_TOTAL_COLUMN);
 		if (rowNum > 2000) {
-			throw new IllegalOperatorException
-					("您上传的信息超过2000条,请拆分成2000以下再上传");
+			throw new IllegalOperatorException ("您上传的信息超过2000条,请拆分成2000以下再上传");
 		}
 		List<ReleaseProductByBatch> releaseProductByBatchs = new ArrayList<>(rowNum);
 		String batch = createNumberService.getTimeNumber("product$goods", 8, rowNum);
@@ -156,11 +177,9 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 		Row headerRow = sheet.getRow(0);
 		int total = 0;
 		int blankNum = 0;
-		long time1 = new Date().getTime();
-		System.err.println();
 		if (headerRow != null) {
 			// 验证模板是否为商城模板
-			validateTemplate(headerRow, colNum, currency, isAPerson);
+			validateTemplate(headerRow, colNum, currency, isAPerson, isPcb);
 			for (int r = 2; r <= rowNum; r++) {
 				Row row = sheet.getRow(r);
 				// 英文品牌名称
@@ -174,7 +193,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 					setProductDefaultInfo(releaseProductByBatch, batch, currency, storeIn);
 // TODO 个人库验证
 					// 将excel内容对应到ReleaseProductByBatch的字段当中
-					blankNum = convertValueToProduct(row, releaseProductByBatch, r, isAPerson);
+					blankNum = convertValueToProduct(row, releaseProductByBatch, r, isAPerson, isPcb);
 // TODO 个人库验证
 					if (!isAPerson) {
 						// 解析返回分段价格list
@@ -205,15 +224,11 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 				}
 			}
 		}
-		long time2 = new Date().getTime();
-		System.err.println((time2 - time1) + "**********************************1");
 		Long userUU = SystemSession.getUser().getUserUU();
 		Long enUU = SystemSession.getUser().getEnterprise().getUu();
 		List<ReleaseProductByBatch> addList = new ArrayList<>(releaseProductByBatchs.size());
 		addList.addAll(releaseProductByBatchs);
 		resetRepeatData(addList, isImport, isAPerson);
-		long time3 = new Date().getTime();
-		System.err.println((time3 - time2) + "**********************************2");
 		if (isAPerson) {
 			for (ReleaseProductByBatch releaseProductByBatch : addList) {
 				List<Product> productList = productDao.findByEnUUAndPcmpcodeAndPbrandenAndB2cEnabled(enUU,releaseProductByBatch.getB2cCode(),
@@ -229,23 +244,17 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 				}
 			}
 		}
-		long time4 = new Date().getTime();
-		System.err.println((time4 - time3) + "**********************************3");
 		commonDao.save(addList, ReleaseProductByBatch.class);
-		long time5 = new Date().getTime();
-		System.err.println((time5 - time4) + "**********************************4");
-		releaseProductByBatchDao.callValidProcedure(enUU, batch);
-		long time6 = new Date().getTime();
-		System.err.println((time6 - time5) + "**********************************5");
+
+		if (isPcb) {
+			releaseProductByBatchDao.callValidProcedurePcb(enUU, batch);
+		} else {
+			releaseProductByBatchDao.callValidProcedure(enUU, batch);
+		}
+
 		Integer filter = releaseProductByBatchDao.getCountOfImportFail(userUU, batch, failCode);
-		long time7 = new Date().getTime();
-		System.err.println((time7 - time6) + "**********************************6");
 		Integer failure = releaseProductByBatchDao.getCountPublisherUuAndBatchAndReleaseCode(userUU, batch, ReleaseStatus.failure.value());
-		long time8 = new Date().getTime();
-		System.err.println((time8 - time7) + "**********************************7");
 		Integer success = releaseProductByBatchDao.getCountPublisherUuAndBatchAndReleaseCode(userUU, batch, ReleaseStatus.success.value());
-		long time9 = new Date().getTime();
-		System.err.println((time9 - time8) + "**********************************8");
 		modelMap.put("total", total);
 		modelMap.put("success", success);
 		modelMap.put("failure", failure);
@@ -688,8 +697,9 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 	 * @param headerRow 首行
 	 * @param colNum	总列
 	 * @param currency	币别
+	 * @param isPcb 是否pcb模块
 	 */
-	private void validateTemplate(Row headerRow, int colNum, String currency, boolean isAPerson) {
+	private void validateTemplate(Row headerRow, int colNum, String currency, boolean isAPerson, boolean isPcb) {
 		if (isAPerson) {
 			if (colNum == UploadConstant.MAX_TOTAL_COLUMN_PERSON) {
 				Cell errorCell = headerRow.getCell(UploadConstant.MAX_TOTAL_COLUMN_PERSON - 1);
@@ -711,8 +721,8 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 				throw new IllegalOperatorException("您上传的信息列信息不正确,请与模板的列做比较");
 			}
 		} else {
-			if (colNum == UploadConstant.MAX_TOTAL_COLUMN) {
-				Cell errorCell = headerRow.getCell(UploadConstant.MAX_TOTAL_COLUMN - 1);
+			if (colNum == (isPcb ? UploadConstant.MAX_TOTAL_COLUMN_PCB : UploadConstant.MAX_TOTAL_COLUMN)) {
+				Cell errorCell = headerRow.getCell(isPcb ? UploadConstant.MAX_TOTAL_COLUMN_PCB - 1 : UploadConstant.MAX_TOTAL_COLUMN - 1);
 				Object errorCellObj = readWorkBookCell(errorCell, Cell.CELL_TYPE_STRING, 0, 0);
 				String errorHead = StringUtilB2C.replaceLineBreak(String.valueOf(errorCellObj));
 				if (StringUtils.isEmpty(errorHead) || !("错误提示".equals(errorHead))) {
@@ -741,7 +751,6 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 				}
 			}
 		}
-
 	}
 
 	/**
@@ -954,8 +963,9 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 	 * @param row 行对象
 	 * @param aProduct 验证单行数据
 	 * @param rowNum 行数
+	 * @param isPcb 是否pcb模块
 	 */
-	private int convertValueToProduct(Row row, ReleaseProductByBatch aProduct, int rowNum, boolean isAPerson) {
+	private int convertValueToProduct(Row row, ReleaseProductByBatch aProduct, int rowNum, boolean isAPerson, boolean isPcb) {
 		// 统计为空的个数
 		int result = 0;
 
@@ -972,6 +982,15 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 			result += 1;
 		}
 		aProduct.setKindByExcel(kindValue);
+		// pcb模块判断类目是否为商城标准pcb类目
+		if (isPcb && !StringUtils.isEmpty(aProduct.getKindName())) {
+			KindInfo kindInfo = kindInfoDao.findByNameCn(aProduct.getKindName());
+			if (kindInfo != null && kindInfo.getId() != null && (kindInfoDao.existsChildByParentId(UploadConstant.PCB_PARENTID, kindInfo.getId()) > 0)) {
+				aProduct.setKindUuid(kindInfo.getId());
+			} else {
+				aProduct.addErrmsg(ErrorInfoConstant.KIND_UNSTANDARD.getInfo());
+			}
+		}
 
 		Object codeValue = readWorkBookCell(row.getCell(UploadConstant.PRODUCT_CODE), Cell.CELL_TYPE_STRING,
 				rowNum, UploadConstant.PRODUCT_CODE);
@@ -1004,6 +1023,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 					String productStr = sdf.format(productCell.getDateCellValue());
 					aProduct.setProductDateByExcel(productStr);
 				} else {
+					aProduct.setProductDateByExcel("");
 					aProduct.setProductDateByExcel(readWorkBookCell(row.getCell(ModifyConstant.PRODUCE_DATE), Cell.CELL_TYPE_STRING,
 							rowNum, ModifyConstant.PRODUCE_DATE));
 				}
@@ -1041,6 +1061,26 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 			if (aProduct.getCode() != null && aProduct.getBrandNameEn() != null && aProduct.getTag() != null) {
 				resetTag(aProduct);
 			}
+
+			// 如果是pcb模块,解析尺寸、颜色、铜厚、厚度
+			if (isPcb) {
+				Object sizeValue = readWorkBookCell(row.getCell(UploadConstant.SIZE), Cell.CELL_TYPE_STRING,
+					rowNum, UploadConstant.SIZE);
+				aProduct.setSizeByExcel(sizeValue);
+
+				Object colorValue = readWorkBookCell(row.getCell(UploadConstant.COLOR), Cell.CELL_TYPE_STRING,
+					rowNum, UploadConstant.COLOR);
+				aProduct.setColorByExcel(colorValue);
+
+				Object thickCopperValue = readWorkBookCell(row.getCell(UploadConstant.THICK_COPPER), Cell.CELL_TYPE_STRING,
+					rowNum, UploadConstant.THICK_COPPER);
+				aProduct.setThickCopperByExcel(thickCopperValue);
+
+				Object thickValue = readWorkBookCell(row.getCell(UploadConstant.THICK), Cell.CELL_TYPE_STRING,
+					rowNum, UploadConstant.THICK);
+				aProduct.setThickByExcel(thickValue);
+			}
+
 		} else {
 			Object packageMethodValue = readWorkBookCell(row.getCell(UploadConstant.SPECIFICATION), Cell.CELL_TYPE_STRING,
 					rowNum, UploadConstant.SPECIFICATION);
@@ -1089,7 +1129,8 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 	 */
 	private List<GoodsQtyPrice> initQtyPriceByExcel(Row row, boolean isImport, ReleaseProductByBatch aProduct, int rowNum) {
 		List<GoodsQtyPrice> qtyPriceList = new ArrayList<>();
-		Object firstValue = null;
+		Object firstValue = readWorkBookCell(row.getCell(UploadConstant.PRICE_START), Cell.CELL_TYPE_STRING,
+				rowNum, UploadConstant.PRICE_START);
 		if (isImport) {
 			firstValue = readWorkBookCell(row.getCell(UploadConstant.PRICE_START), Cell.CELL_TYPE_STRING,
 					rowNum, UploadConstant.PRICE_START);
@@ -1104,14 +1145,19 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 		if (StringUtils.isEmpty(firstValue)) {
 			aProduct.addErrmsg(ErrorInfoConstant.PRICE_INFO.getInfo());
 		} else {
-			Double cellPrice = Double.valueOf(firstValue.toString());
-			if (validatePrice(cellPrice)) {
-				GoodsQtyPrice qtyPrice = getOneQtyPrice(aProduct.getMinBuyQty(), DoubleConstant.maxMinPackageQty,
-						cellPrice, aProduct.getRmbTaxRate(), aProduct.getCurrency());
-				qtyPriceList.add(qtyPrice);
+			if (RegexConstant.isNumber(firstValue.toString())) {
+				Double cellPrice = Double.valueOf(firstValue.toString());
+				if (validatePrice(cellPrice)) {
+					GoodsQtyPrice qtyPrice = getOneQtyPrice(aProduct.getMinBuyQty(), DoubleConstant.maxMinPackageQty,
+							cellPrice, aProduct.getRmbTaxRate(), aProduct.getCurrency());
+					qtyPriceList.add(qtyPrice);
+				} else {
+					aProduct.addErrmsg(ErrorInfoConstant.PRICE_INFO.getInfo());
+				}
 			} else {
 				aProduct.addErrmsg(ErrorInfoConstant.PRICE_INFO.getInfo());
 			}
+
 		}
 
 		if (!CollectionUtils.isEmpty(qtyPriceList)) {
@@ -1183,16 +1229,18 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 					rowNum, ModifyConstant.PRICE_SECOND);
 		}
 		if (!StringUtils.isEmpty(startValue) && !StringUtils.isEmpty(priceValue)) {
-			Double price = Double.valueOf(priceValue.toString());
-			Double start = Double.valueOf(startValue.toString());
-			if (validatePrice(price) && validateStartNumber(start, aProduct.getMinBuyQty())) {
-				GoodsQtyPrice qtyPrice = getOneQtyPrice(Double.valueOf(startValue.toString()), DoubleConstant.maxMinPackageQty,
-						price, aProduct.getRmbTaxRate(), aProduct.getCurrency());
-				qtyPriceList.add(qtyPrice);
-				qtyPriceList.get(0).setEnd(Double.valueOf(startValue.toString()) - 1);
-				setThirdPrice(row, isImport, rowNum, qtyPriceList, aProduct);
+			if (RegexConstant.isNumber(startValue.toString())  && RegexConstant.isNumber(priceValue.toString())) {
+				Double price = Double.valueOf(priceValue.toString());
+				Double start = Double.valueOf(startValue.toString());
+				if (validatePrice(price) && validateStartNumber(start, aProduct.getMinBuyQty())) {
+					GoodsQtyPrice qtyPrice = getOneQtyPrice(Double.valueOf(startValue.toString()), DoubleConstant.maxMinPackageQty,
+							price, aProduct.getRmbTaxRate(), aProduct.getCurrency());
+					qtyPriceList.add(qtyPrice);
+					qtyPriceList.get(0).setEnd(Double.valueOf(startValue.toString()) - 1);
+					setThirdPrice(row, isImport, rowNum, qtyPriceList, aProduct);
+				}
+				return ;
 			}
-			return ;
 		}
 		if (StringUtils.isEmpty(startValue) && StringUtils.isEmpty(priceValue)) {
 			setThirdPrice(row, isImport, rowNum, qtyPriceList, aProduct);
@@ -1221,14 +1269,16 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 					rowNum, ModifyConstant.PRICE_THIRD);
 		}
 		if (!StringUtils.isEmpty(startValue) && !StringUtils.isEmpty(priceValue)) {
-			Double price = Double.valueOf(priceValue.toString());
-			Double start = Double.valueOf(startValue.toString());
-			Double lastEnd = qtyPriceList.get(qtyPriceList.size() - 1).getStart();
-			if (validatePrice(price) && validateStartNumber(start, lastEnd)) {
-				GoodsQtyPrice qtyPrice = getOneQtyPrice(start, DoubleConstant.maxMinPackageQty,
-						price, aProduct.getRmbTaxRate(), aProduct.getCurrency());
-				qtyPriceList.get(qtyPriceList.size() - 1).setEnd(start - 1);
-				qtyPriceList.add(qtyPrice);
+			if (RegexConstant.isNumber(startValue.toString())  && RegexConstant.isNumber(priceValue.toString())) {
+				Double price = Double.valueOf(priceValue.toString());
+				Double start = Double.valueOf(startValue.toString());
+				Double lastEnd = qtyPriceList.get(qtyPriceList.size() - 1).getStart();
+				if (validatePrice(price) && validateStartNumber(start, lastEnd)) {
+					GoodsQtyPrice qtyPrice = getOneQtyPrice(start, DoubleConstant.maxMinPackageQty,
+							price, aProduct.getRmbTaxRate(), aProduct.getCurrency());
+					qtyPriceList.get(qtyPriceList.size() - 1).setEnd(start - 1);
+					qtyPriceList.add(qtyPrice);
+				}
 			}
 		}
 	}
@@ -1296,7 +1346,11 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 			if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK) {
 				switch (cellType) {
 				case Cell.CELL_TYPE_STRING :
-					cell.setCellType(HSSFCell.CELL_TYPE_STRING);
+					try {
+						cell.setCellType(HSSFCell.CELL_TYPE_STRING);
+					} catch (Exception e) {
+						throw new IllegalOperatorException("读取表格中"+ (r + 1)+"行"+ (n+1)+ "列的内容错误,需要文本格式的信息");
+					}
 					String str = cell.getStringCellValue().trim();
 //					Object data = getCellData(cell);
 //					String str = data == null ? "" : data.toString();
@@ -1307,7 +1361,11 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 					obj = str.trim();
 					break;
 				case Cell.CELL_TYPE_NUMERIC :
-					cell.setCellType(Cell.CELL_TYPE_NUMERIC);
+					try {
+						cell.setCellType(Cell.CELL_TYPE_NUMERIC);
+					} catch (Exception e) {
+						throw new IllegalOperatorException("读取表格中"+ (r + 1)+"行"+ (n+1)+ "列的内容错误,需要数字格式的信息");
+					}
 					obj = cell.getNumericCellValue();
 					if (obj != null) {
 						if(obj.toString().indexOf("E") > 0) {
@@ -1334,7 +1392,12 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 				}
 			}
 		} catch (Exception e) {
-			throw new IllegalOperatorException("读取表格中"+r+"行"+ (n+1)+ "列的内容错误,有可能是该单元格的格式不正确");
+			String message = e.getMessage();
+			if (message.contains("读取表格")) {
+				throw new IllegalOperatorException(message);
+			} else {
+				throw new IllegalOperatorException("读取表格中"+(r + 1)+"行"+ (n+1)+ "列的内容错误,有可能是该单元格的格式不正确");
+			}
 		}
 		return obj;
 	}
@@ -1543,14 +1606,14 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 	}
 
 	@Override
-	public String publishByBatch(String batch) {
-
+	public String publishByBatch(String batch, boolean isPcb) {
 		List<ReleaseProductByBatch> releaseProductByBatchList =
 				releaseProductByBatchDao.findByRelbatchid(batch);
 		List<Long> productIds = null;
 		List<ProductPrivate> productPrivateList = null;
 		if (!CollectionUtils.isEmpty(releaseProductByBatchList)) {
-			List<com.uas.ps.entity.Product> products = convertProduct(releaseProductByBatchList,false);
+			Map<String, Object> map = convertProduct(releaseProductByBatchList, false, isPcb);
+			List<com.uas.ps.entity.Product> products = (List<com.uas.ps.entity.Product>) map.get("products");
 			// TODO 什么接口
 			String result = restTemplate.postForEntity(productServiceIp + "/product/update", products, String.class).getBody();
 			productIds = JSON.parseArray(result, Long.class);
@@ -1566,6 +1629,45 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 				productPrivates.add(productPrivate);
 			}
 			productPrivateList = productPrivateDao.save(productPrivates);
+
+			//根据更新的规格信息,更新在售产品的信息
+			List<V_ProductPrivate> v_productPrivates = v_productPrivateDao.findProductInIdAndSpecIsNotNull(productIds);
+			List<Goods> goodses = goodsDao.findByProductIds(productIds);
+			goodsService.updateSpecByProducts(v_productPrivates, goodses);
+
+			if (isPcb) {
+				List<PCB> pcbList = new ArrayList<>();
+				List<PCBPropertyValue> propertyValueList = new ArrayList<>();
+
+				for (Long prId : idSet) {
+					Product product = productDao.findOne(prId);
+					if (product != null) {
+						List<PCB> pcbs = pcbDao.findByProductid(prId);
+						if (CollectionUtils.isEmpty(pcbs)) {
+							PCB pcb = new PCB();
+							pcb.setProductid(prId);
+							pcb.setBrandid(product.getPbrandid());
+							pcb.setKindid(product.getKindid());
+							pcbList.add(pcb);
+						}
+					}
+
+					List<PCBPropertyValue> propertyValues = (List<PCBPropertyValue>) map.get(product.getEnUU().toString().concat(product.getProdNum()));
+					if (CollectionUtils.isNotEmpty(propertyValues)) {
+						for (PCBPropertyValue propertyValue : propertyValues) {
+							propertyValue.setProductid(prId);
+							propertyValueList.add(propertyValue);
+						}
+					}
+				}
+
+				if (CollectionUtils.isNotEmpty(pcbList)) {
+					pcbDao.save(pcbList);
+				}
+				if (CollectionUtils.isNotEmpty(propertyValueList)) {
+					pcbPropertyvalueDao.save(propertyValueList);
+				}
+			}
 		}
 		Enterprise enterprise = SystemSession.getUser().getEnterprise();
 		final Object[] obj = new Object[]{enterprise.getUu(), enterprise.getEnName(), batch};
@@ -1629,11 +1731,25 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 	}
 
 
-	private  List<com.uas.ps.entity.Product> convertProduct (List<ReleaseProductByBatch> releaseProductByBatchList, boolean isAPerson ) {
+	private  Map<String, Object> convertProduct (List<ReleaseProductByBatch> releaseProductByBatchList, boolean isAPerson , boolean isPcb) {
 		if (CollectionUtils.isEmpty(releaseProductByBatchList)) {
 			return null;
 		}
+		Map<String, Object> map = new HashedMap();
 		List<com.uas.ps.entity.Product> products = new ArrayList<>();
+		Map<String, List<PCBPropertyValue>> propertyMap = new HashedMap();
+
+		Long sizeProId = null;
+		Long colorProId = null;
+		Long thickCopperProId = null;
+		Long thickProId = null;
+		if (isPcb) {
+			sizeProId = propertyDao.findIdByLabelCn(SIZE);
+			colorProId = propertyDao.findIdByLabelCn(COLOR);
+			thickCopperProId = propertyDao.findIdByLabelCn(THICKCOPPER);
+			thickProId = propertyDao.findIdByLabelCn(THICK);
+		}
+
 		for (ReleaseProductByBatch releaseProductByBatch : releaseProductByBatchList) {
 		    if (releaseProductByBatch.getReleaseCode().equals(ReleaseStatus.failure.value()) ||
                     releaseProductByBatch.getReleaseCode().equals(ReleaseStatus.success.value())) {
@@ -1655,17 +1771,41 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
                 product.setStandard(releaseProductByBatch.getComponentUuId() == null ? (short)0 : (short)1);
                 product.setCmpUuid(releaseProductByBatch.getComponentUuId());
                 product.setCreateTime(new Date(System.currentTimeMillis()));
+				product.setSpec(releaseProductByBatch.getSpec());
                 // 产品导入默认可销售
                 product.setIsSale((short) 1);
-                if (isAPerson) {
-                    product.setSpec(releaseProductByBatch.getPackaging());
-                }
                 String batchCode = "PNUM" + createNumberService.getTimeNumber("trade$product_import_num", 8);
                 product.setCode(batchCode);
+
+				if (isPcb) {
+					List<PCBPropertyValue> propertyValues = new ArrayList<>();
+					if (!StringUtils.isEmpty(releaseProductByBatch.getSize())) {
+						PCBPropertyValue propertyValue = new PCBPropertyValue(sizeProId, releaseProductByBatch.getSize());
+						propertyValues.add(propertyValue);
+					}
+					if (!StringUtils.isEmpty(releaseProductByBatch.getColor())) {
+						PCBPropertyValue propertyValue = new PCBPropertyValue(colorProId, releaseProductByBatch.getColor());
+						propertyValues.add(propertyValue);
+					}
+					if (!StringUtils.isEmpty(releaseProductByBatch.getThickCopper())) {
+						PCBPropertyValue propertyValue = new PCBPropertyValue(thickCopperProId, releaseProductByBatch.getThickCopper());
+						propertyValues.add(propertyValue);
+					}
+					if (!StringUtils.isEmpty(releaseProductByBatch.getThick())) {
+						PCBPropertyValue propertyValue = new PCBPropertyValue(thickProId, releaseProductByBatch.getThick());
+						propertyValues.add(propertyValue);
+					}
+					if (CollectionUtils.isNotEmpty(propertyValues)) {
+						propertyMap.put(product.getEnUU().toString().concat(product.getCode()), propertyValues);
+					}
+				}
                 products.add(product);
             }
 		}
-		return products;
+
+		map.put("products", products);
+		map.put("propertyvalues", propertyMap);
+		return map;
 	}
 
 	@Override
@@ -1673,7 +1813,8 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
         List<ReleaseProductByBatch> releaseProductByBatchList =
                 releaseProductByBatchDao.findByRelbatchid(batch);
         if (!CollectionUtils.isEmpty(releaseProductByBatchList)) {
-            List<com.uas.ps.entity.Product> products = convertProduct(releaseProductByBatchList,true);
+			Map<String, Object> map = convertProduct(releaseProductByBatchList,false, false);
+			List<com.uas.ps.entity.Product> products = (List<com.uas.ps.entity.Product>) map.get("products");
             // TODO 什么接口
 			String result = restTemplate.postForEntity(productServiceIp + "/product/update", products, String.class).getBody();
             List<Long> productIds = JSON.parseArray(result, Long.class);

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

@@ -3,6 +3,7 @@ package com.uas.platform.b2c.prod.product.component.modal;
 import com.alibaba.fastjson.annotation.JSONField;
 import com.uas.platform.b2c.prod.commodity.model.Goods;
 import com.uas.platform.b2c.prod.commodity.model.GoodsQtyPrice;
+import com.uas.platform.b2c.prod.commodity.model.Product;
 import com.uas.platform.b2c.prod.product.brand.modal.BrandInfo;
 import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
 import com.uas.platform.b2c.core.support.SystemSession;

+ 37 - 0
src/main/java/com/uas/platform/b2c/prod/product/kind/api/KindController.java

@@ -1,5 +1,6 @@
 package com.uas.platform.b2c.prod.product.kind.api;
 
+import com.uas.platform.b2c.prod.commodity.model.PCBPropertyValue;
 import com.uas.platform.b2c.prod.product.brand.modal.BrandInfo;
 import com.uas.platform.b2c.prod.product.kind.model.Kind;
 import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
@@ -205,4 +206,40 @@ public class KindController {
 	public List<Kind> getBatchBrands(@RequestBody List<Long> batchIds) {
 		return kindService.getBatchKinds(batchIds);
 	}
+
+	/**
+	 * 获取所有商品类目的所有下级类目
+	 *
+	 * @param parentId 父类目id
+	 * @return 类目信息
+	 */
+	@RequestMapping(value = "/{parentId}/pcbchildren_all", method = RequestMethod.GET)
+	@ResponseBody
+	public List<KindInfo> getAllChildKinds(@PathVariable("parentId") Long parentId) {
+		return kindService.getAllChildKinds(parentId);
+	}
+
+	/**
+	 * 根据PCB品牌id获取器件的类目结构
+	 *
+	 * @param brandId
+	 * @return 包含四个List的List,每个List存放一级相关的类目
+	 *         {{相关的第一级类目},{相关的第二级类目},{相关的第三级类目},{相关的第四级类目}}
+	 */
+	@RequestMapping(value = "/{brandId}/pcbkindinfos", method = RequestMethod.GET)
+	public List<List<KindInfo>> getKindInfosByBrandId(@PathVariable("brandId") Long brandId) {
+		return kindService.findByPCBBrandId(brandId);
+	}
+
+	/**
+	 * 根据PCB物料id获取物料属性信息
+	 *
+	 * @param productId
+	 * @return 物料属性信息
+	 */
+	@RequestMapping(value = "/pcbproperty/{productId}",method = RequestMethod.GET)
+	public List<PCBPropertyValue> getPCBProperty(@PathVariable("productId") Long productId) {
+		return kindService.findByPCBProductId(productId);
+	}
+
 }

+ 85 - 0
src/main/java/com/uas/platform/b2c/prod/product/kind/controller/KindConcernController.java

@@ -0,0 +1,85 @@
+package com.uas.platform.b2c.prod.product.kind.controller;
+
+import com.uas.platform.b2c.prod.product.kind.model.KindConcern;
+import com.uas.platform.b2c.prod.product.kind.service.KindConcernService;
+import com.uas.platform.core.model.Constant;
+import com.uas.platform.core.model.PageParams;
+import com.uas.sso.support.Page;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 类目相关接口
+ * @author  dongbw
+ * 18/06/13 16:02.
+ */
+@RequestMapping("/produce/kindConcern")
+@RestController
+public class KindConcernController {
+
+    @Autowired
+    private KindConcernService kindConcernService;
+
+    /**
+     * 已关注
+     */
+    private static final String HAS_CONCERN = "yes";
+
+    /**
+     * 未关注
+     */
+    private static final String NOT_CONCERN = "no";
+
+    /**
+     * 添加关注
+     */
+    private static final String ADD_CONCERN = "add";
+
+    /**
+     * 删除关注
+     */
+    private static final String DEL_CONCERN = "del";
+
+
+    /**
+     * 根据分页参数和关键词查询已关注类目
+     * @param pageParams  分页参数
+     * @param keyword  关键词
+     * @param enUU 企业UU
+     * @return
+     */
+    @RequestMapping(value = "/list", method = RequestMethod.GET)
+    public Page<KindConcern> getConcernKindByPage(PageParams pageParams, String keyword, Long enUU, String type) {
+        if (HAS_CONCERN.equals(type)) {
+            return kindConcernService.getConcernKindByPage(pageParams, keyword, enUU);
+        } else if (NOT_CONCERN.equals(type)) {
+            return kindConcernService.getNotConcernKindByPage(pageParams, keyword, enUU);
+        }
+        return null;
+    }
+
+    /**
+     * 设置关注、取消关注接口
+     * @param kindConcern  类目关注实体
+     * @return
+     */
+    @RequestMapping(value = "/modify", method = RequestMethod.POST)
+    public ModelMap addKindConcern(@RequestBody KindConcern kindConcern) {
+        // status 为0,说明是未关注类目
+        if (Constant.NO == kindConcern.getStatus()) {
+            return kindConcernService.addKindConcern(kindConcern);
+        } else if (Constant.YES == kindConcern.getStatus()) {
+            return kindConcernService.deleteKindConcern(kindConcern);
+        }
+        ModelMap map = new ModelMap();
+        map.put("success", false);
+        map.put("message", "参数错误");
+        return map;
+    }
+
+}
+

+ 26 - 0
src/main/java/com/uas/platform/b2c/prod/product/kind/dao/KindConcernDao.java

@@ -0,0 +1,26 @@
+package com.uas.platform.b2c.prod.product.kind.dao;
+
+import com.uas.platform.b2c.prod.product.kind.model.KindConcern;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 类目关注Dao
+ * @author dongbw
+ */
+@Repository
+public interface KindConcernDao extends JpaRepository<KindConcern, Long>, JpaSpecificationExecutor<KindConcern> {
+
+    /**
+     * 根据企业UU获取本企业所有已收藏类目名称
+     * @param enUU  企业UU
+     * @return 名称List
+     */
+    @Query("select k.nameCn from KindConcern k where k.enUU = :enUU and k.status = 1")
+    List<String> findNameByEnUU(@Param("enUU") Long enUU);
+}

+ 28 - 1
src/main/java/com/uas/platform/b2c/prod/product/kind/dao/KindInfoDao.java

@@ -1,12 +1,15 @@
 package com.uas.platform.b2c.prod.product.kind.dao;
 
+import com.uas.platform.b2c.prod.commodity.model.PCBPropertyValue;
 import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.jpa.repository.QueryHints;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
+import javax.persistence.QueryHint;
 import java.util.List;
 import java.util.Set;
 
@@ -37,4 +40,28 @@ public interface KindInfoDao extends JpaSpecificationExecutor<KindInfo>, JpaRepo
 	 */
 	@Query(nativeQuery = true, value = "select * from product$kind connect by prior ki_parentid =  ki_id start with ki_id=:id order by ki_level")
 	public List<KindInfo> findStructingKinds(@Param("id") Long id);
-}
+
+	/**
+	 * 所有商品类目的所有下级类目
+	 * @param parentid
+	 * @return
+	 */
+	@Query("select k from KindInfo k where k.parentid = :parentid")
+	public List<KindInfo> findByParentid(@Param("parentid")Long parentid);
+
+	/**
+	 * 判断该子类目是否存在于该类目的所有子类目中
+	 * @param parentId 父类目
+	 * @param childId 子类目
+	 * @return
+	 */
+	@Query(nativeQuery = true, value = "select find_in_set(:childid, findLeafKind(:parentid))")
+	public Integer existsChildByParentId(@Param("parentid") Long parentId, @Param("childid") Long childId);
+
+	/**
+	 * 通过类目名获取类目信息
+	 * @param name
+	 * @return
+	 */
+	public KindInfo findByNameCn(String name);
+}

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

@@ -34,7 +34,7 @@ public class Kind implements Serializable {
 	 */
 	@Id
 	@Column(name = "ki_id")
-	@GeneratedValue
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
 	private Long id;
 
 	/**

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

@@ -0,0 +1,128 @@
+package com.uas.platform.b2c.prod.product.kind.model;
+
+
+import com.uas.platform.core.model.Constant;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Index;
+import javax.persistence.Table;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 类目关注
+ *
+ * @author dongbw
+ * @version 2018年6月13日 15:50:23
+ */
+@Entity
+@Table(name = "product$kind_concern", indexes = {
+        @Index(name = "unique_kindconcern_enuu_name", columnList = "kc_enuu, kc_name", unique = true)})
+public class KindConcern {
+
+    /**
+     * default serialVersionUID
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "kc_id")
+    private Long id;
+
+    /**
+     * 中文类目名称
+     */
+    @Column(name = "kc_name")
+    private String nameCn;
+
+    /**
+     * 英文类目名称
+     */
+    @Column(name = "kc_name_en")
+    private String nameEn;
+
+    /**
+     * 所属企业UU
+     */
+    @Column(name = "kc_enuu")
+    private Long enUU;
+
+    /**
+     * 关注状态 (1已关注 0 未关注)
+     */
+    @Column(name = "kc_status")
+    private Short status = 1;
+
+    /**
+     * 最近更新时间
+     */
+    @Column(name = "kc_date")
+    private Date date;
+
+    public KindConcern() {
+
+    }
+
+    public KindConcern(Kind kind) {
+        this.date = new Date();
+        this.nameCn = kind.getNameCn();
+        this.nameEn = kind.getNameEn();
+        this.status = Constant.NO;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getNameCn() {
+        return nameCn;
+    }
+
+    public void setNameCn(String nameCn) {
+        this.nameCn = nameCn;
+    }
+
+    public String getNameEn() {
+        return nameEn;
+    }
+
+    public void setNameEn(String nameEn) {
+        this.nameEn = nameEn;
+    }
+
+    public Long getEnUU() {
+        return enUU;
+    }
+
+    public void setEnUU(Long enUU) {
+        this.enUU = enUU;
+    }
+
+    public Short getStatus() {
+        return status;
+    }
+
+    public void setStatus(Short status) {
+        this.status = status;
+    }
+
+    public Date getDate() {
+        return date;
+    }
+
+    public void setDate(Date date) {
+        this.date = date;
+    }
+}

+ 46 - 0
src/main/java/com/uas/platform/b2c/prod/product/kind/service/KindConcernService.java

@@ -0,0 +1,46 @@
+package com.uas.platform.b2c.prod.product.kind.service;
+
+import com.uas.platform.b2c.prod.product.kind.model.KindConcern;
+import com.uas.platform.core.model.PageParams;
+import com.uas.sso.support.Page;
+import org.springframework.ui.ModelMap;
+
+/**
+ * 类目关注接口
+ * @author dongbw
+ */
+public interface KindConcernService {
+
+
+    /**
+     * 添加关注
+     * @param kindConcern 实体
+     * @return 处理结果
+     */
+    ModelMap addKindConcern(KindConcern kindConcern);
+
+    /**
+     * 取消关注
+     * @param kindConcern 实体
+     * @return 处理结果
+     */
+    ModelMap deleteKindConcern(KindConcern kindConcern);
+
+    /**
+     * 获取未关注类目列表
+     * @param pageParams  分页参数
+     * @param keyword  关键词
+     * @param enUU 企业UU
+     * @return 类目收藏分页
+     */
+    Page<KindConcern> getNotConcernKindByPage(PageParams pageParams, String keyword, Long enUU);
+
+    /**
+     * 获取已关注类目列表
+     * @param pageParams  分页参数
+     * @param keyword  关键词
+     * @param enUU 企业UU
+     * @return 类目收藏分页
+     */
+    Page<KindConcern> getConcernKindByPage(PageParams pageParams, String keyword, Long enUU);
+}

+ 33 - 0
src/main/java/com/uas/platform/b2c/prod/product/kind/service/KindService.java

@@ -1,5 +1,6 @@
 package com.uas.platform.b2c.prod.product.kind.service;
 
+import com.uas.platform.b2c.prod.commodity.model.PCBPropertyValue;
 import com.uas.platform.b2c.prod.product.brand.modal.BrandInfo;
 import com.uas.platform.b2c.prod.product.kind.model.Kind;
 import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
@@ -315,4 +316,36 @@ public interface KindService {
 	 * @return 类目信息
 	 */
 	List<Kind> getBatchKinds(List<Long> batchIds);
+
+	/**
+	 * 所有商品类目的所有下级类目
+	 *
+	 * @param parentid 父类目id
+	 * @return 类目信息
+	 */
+	public List<KindInfo> getAllChildKinds(Long parentid);
+
+	/**
+	 * 根据PCB品牌id获取该品牌下的器件类目树
+	 *
+	 * @param brandId 品牌id
+	 * @return 类目树信息
+	 */
+	public List<List<KindInfo>> findByPCBBrandId(Long brandId);
+
+	/**
+	 * 根据PCB物料id获取物料属性信息
+	 *
+	 * @param productId
+	 * @return 物料属性信息
+	 */
+	public List<PCBPropertyValue> findByPCBProductId(Long productId);
+
+	/**
+	 * 根据店铺enUU获取PCB商品的类目信息
+	 *
+	 * @param enUU
+	 * @return kindids
+	 */
+	public Set<Long> findByEnUU(Long enUU);
 }

+ 193 - 0
src/main/java/com/uas/platform/b2c/prod/product/kind/service/impl/KindConcernServiceImpl.java

@@ -0,0 +1,193 @@
+package com.uas.platform.b2c.prod.product.kind.service.impl;
+
+import com.uas.platform.b2c.prod.product.kind.dao.KindConcernDao;
+import com.uas.platform.b2c.prod.product.kind.dao.KindDao;
+import com.uas.platform.b2c.prod.product.kind.model.Kind;
+import com.uas.platform.b2c.prod.product.kind.model.KindConcern;
+import com.uas.platform.b2c.prod.product.kind.service.KindConcernService;
+import com.uas.platform.core.model.Constant;
+import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
+import com.uas.platform.core.persistence.criteria.PredicateUtils;
+import com.uas.sso.support.Page;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.ui.ModelMap;
+import org.springframework.util.CollectionUtils;
+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.Date;
+import java.util.List;
+
+/**
+ * 类目接口实现
+ *
+ * @author dongbw
+ * @version 2018年6月13日 16:11:21
+ */
+@Service
+public class KindConcernServiceImpl implements KindConcernService {
+
+    @Autowired
+    private KindConcernDao kindConcernDao;
+
+    @Autowired
+    private KindDao kindDao;
+
+
+    /**
+     * 添加关注
+     *
+     * @param kindConcern 实体
+     * @return 处理结果
+     */
+    @Override
+    public ModelMap addKindConcern(KindConcern kindConcern) {
+        ModelMap map = new ModelMap();
+        try {
+            if (null == kindConcern) {
+               map.put("success", false);
+               map.put("message", "传入参数为空");
+               return map;
+            }
+            if (null == kindConcern.getEnUU()) {
+                map.put("success", false);
+                map.put("message", "传入企业为空");
+                return map;
+            }
+            if (StringUtils.isEmpty(kindConcern.getNameCn())) {
+                map.put("success", false);
+                map.put("message", "传入类目名称为空");
+                return map;
+            }
+            kindConcern.setDate(new Date());
+            kindConcern.setStatus(Constant.YES);
+            kindConcernDao.save(kindConcern);
+            map.put("success", true);
+            return map;
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("success", false);
+            map.put("message", e.getMessage());
+            return map;
+        }
+    }
+
+    /**
+     * 取消关注
+     *
+     * @param kindConcern 实体
+     * @return 处理结果
+     */
+    @Override
+    public ModelMap deleteKindConcern(KindConcern kindConcern) {
+        ModelMap map = new ModelMap();
+        try {
+            if (null == kindConcern) {
+                map.put("success", false);
+                map.put("message", "传入参数为空");
+                return map;
+            }
+            if (null == kindConcern.getId()) {
+                map.put("success", false);
+                map.put("message", "传入id为空");
+                return map;
+            }
+            if (null == kindConcern.getEnUU()) {
+                map.put("success", false);
+                map.put("message", "传入企业为空");
+                return map;
+            }
+            if (StringUtils.isEmpty(kindConcern.getNameCn())) {
+                map.put("success", false);
+                map.put("message", "传入类目名称为空");
+                return map;
+            }
+            KindConcern concern = kindConcernDao.findOne(kindConcern.getId());
+            if (null != concern) {
+                kindConcernDao.delete(concern);
+                map.put("success", true);
+                return map;
+            } else {
+                map.put("success", false);
+                map.put("message", "未找到对应id的记录");
+                return map;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("success", false);
+            map.put("message", e.getMessage());
+            return map;
+        }
+    }
+
+    /**
+     * 获取未关注类目列表
+     *
+     * @param pageParams 分页参数
+     * @param keyword    关键词
+     * @param enUU 企业UU
+     * @return 类目收藏分页
+     */
+    @Override
+    public Page<KindConcern> getNotConcernKindByPage(PageParams pageParams, String keyword, Long enUU) {
+        final PageInfo pageInfo = new PageInfo(pageParams);
+        if (!StringUtils.isEmpty(keyword)) {
+            pageInfo.expression(PredicateUtils.like("nameCn", keyword, false));
+        }
+        pageInfo.expression(PredicateUtils.eq("isLeaf", Constant.YES, false));
+        List<String> kindConcernNameList = kindConcernDao.findNameByEnUU(enUU);
+        if (!CollectionUtils.isEmpty(kindConcernNameList)) {
+            pageInfo.expression(PredicateUtils.notIn("nameCn", kindConcernNameList, false));
+        }
+        org.springframework.data.domain.Page<Kind> kindPage = kindDao.findAll(new Specification<Kind>() {
+            @Override
+            public Predicate toPredicate(Root<Kind> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
+                query.where(pageInfo.getPredicates(root, query, cb));
+                return null;
+            }
+        }, pageInfo);
+        List<KindConcern> kindConcerns = new ArrayList<>();
+        for (Kind kind : kindPage.getContent()) {
+            KindConcern kindConcern = new KindConcern(kind);
+            kindConcern.setEnUU(enUU);
+            kindConcerns.add(kindConcern);
+        }
+        return new Page<>(kindPage.getNumber(), kindPage.getSize(), kindConcerns, (int) kindPage.getTotalElements());
+    }
+
+    /**
+     * 获取已关注类目列表
+     *
+     * @param pageParams 分页参数
+     * @param keyword    关键词
+     * @param enUU 企业UU
+     * @return 类目收藏分页
+     */
+    @Override
+    public Page<KindConcern> getConcernKindByPage(PageParams pageParams, String keyword, Long enUU) {
+        final PageInfo pageInfo = new PageInfo(pageParams);
+        Sort sort = new Sort(Sort.Direction.DESC, "id");
+        pageInfo.setSort(sort);
+        if (!StringUtils.isEmpty(keyword)) {
+            pageInfo.expression(PredicateUtils.like("nameCn", keyword, false));
+        }
+        pageInfo.expression(PredicateUtils.eq("enUU", enUU, false));
+        pageInfo.expression(PredicateUtils.eq("status", Constant.YES, false));
+        org.springframework.data.domain.Page<KindConcern> kindConcernPage = kindConcernDao.findAll(new Specification<KindConcern>() {
+            @Override
+            public Predicate toPredicate(Root<KindConcern> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
+                query.where(pageInfo.getPredicates(root, query, cb));
+                return null;
+            }
+        }, pageInfo);
+        return new Page<KindConcern>(kindConcernPage.getNumber(), kindConcernPage.getSize(), kindConcernPage.getContent(), (int) kindConcernPage.getTotalElements());
+    }
+}

+ 117 - 0
src/main/java/com/uas/platform/b2c/prod/product/kind/service/impl/KindServiceImpl.java

@@ -1,5 +1,7 @@
 package com.uas.platform.b2c.prod.product.kind.service.impl;
 
+import com.uas.platform.b2c.prod.commodity.dao.PCBDao;
+import com.uas.platform.b2c.prod.commodity.model.PCBPropertyValue;
 import com.uas.platform.b2c.prod.product.brand.dao.BrandInfoDao;
 import com.uas.platform.b2c.prod.product.brand.modal.BrandInfo;
 import com.uas.platform.b2c.prod.product.component.dao.ComponentDao;
@@ -22,6 +24,7 @@ import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.PageParams;
 import com.uas.platform.core.util.ArrayUtils;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.velocity.runtime.directive.Foreach;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.InvalidDataAccessApiUsageException;
@@ -45,6 +48,9 @@ public class KindServiceImpl implements KindService {
 	@Autowired
 	private KindDao kindDao;
 
+	@Autowired
+	private PCBDao pcbDao;
+
 	@Autowired
 	private BrandInfoDao brandInfoDao;
 
@@ -1219,4 +1225,115 @@ public class KindServiceImpl implements KindService {
 		}
 		return kindDao.findByBatchIds(batchIds);
 	}
+
+	@Override
+	public List<KindInfo> getAllChildKinds(Long parentid) {
+		List<KindInfo> kindInfos = kindInfoDao.findByParentid(parentid);
+		for (KindInfo kindInfo : kindInfos) {
+			if (kindInfo.getIsLeaf().equals(Constant.NO)) {
+				List<KindInfo> list = getAllChildKinds(kindInfo.getId());
+				Set<KindInfo> set = new HashSet<>();
+				set.addAll(list);
+				kindInfo.setChildren(set);
+			}
+		}
+		return kindInfos;
+	}
+
+	@Override
+	public List<List<KindInfo>> findByPCBBrandId(Long brandId) {
+		List<Long> kindInfoIds = pcbDao.findKindInfoIdByBandId(brandId);
+		return getKindInfosByKindInfoIds(kindInfoIds);
+	}
+
+	public List<KindInfo> getPCBParentsByChildId(Long childId) {
+		List<KindInfo> kinds = new ArrayList<KindInfo>();
+		kinds = getPCBParentsByChildId(childId, kinds);
+		return kinds;
+	}
+
+	private List<KindInfo> getPCBParentsByChildId(Long childId, List<KindInfo> container) {
+		KindInfo child = kindInfoDao.findOne(childId);
+		if (child == null) {
+			throw new IllegalOperatorException("要获取的父类目不存在");
+		}
+		if (child.getParentid() != 0) {
+			getPCBParentsByChildId(child.getParentid(), container);
+		}
+		container.add(child);
+		return container;
+	}
+
+	private List<List<KindInfo>> getKindInfosByKindInfoIds(List<Long> kindInfoIds) {
+		List<List<KindInfo>> result = new ArrayList<List<KindInfo>>();
+		if (!CollectionUtils.isEmpty(kindInfoIds)) {
+			List<List<KindInfo>> kindInfoss = new ArrayList<>();
+			for (Long kindInfoId:kindInfoIds) {
+				List<KindInfo> kindInfos = getPCBParentsByChildId(kindInfoId);
+				kindInfoss.add(kindInfos);
+			}
+			//获取第一级相关类目
+			List<KindInfo> result1 = new ArrayList<>();
+			Set<Long> kindInfoIdSet = new HashSet<>();
+			for (List<KindInfo> ki : kindInfoss) {
+				Long firstKindInfoId = ki.get(0).getId();
+				if (!kindInfoIdSet.contains(firstKindInfoId)) {
+					result1.add(ki.get(0));
+					kindInfoIdSet.add(firstKindInfoId);
+				}
+			}
+			result.add(result1);
+			//获取第二级相关类目
+			List<KindInfo> result2 = new ArrayList<>();
+			kindInfoIdSet = new HashSet<>();
+			for (List<KindInfo> ki : kindInfoss) {
+				if (ki.size() > 1) {
+					Long firstKindInfoId = ki.get(1).getId();
+					if (!kindInfoIdSet.contains(firstKindInfoId)) {
+						result2.add(ki.get(1));
+						kindInfoIdSet.add(firstKindInfoId);
+					}
+				}
+			}
+			result.add(result2);
+			//获取第三级相关类目
+			List<KindInfo> result3 = new ArrayList<>();
+			kindInfoIdSet = new HashSet<>();
+			for (List<KindInfo> ki : kindInfoss) {
+				if (ki.size() > 2) {
+					Long firstKindInfoId = ki.get(2).getId();
+					if (!kindInfoIdSet.contains(firstKindInfoId)) {
+						result3.add(ki.get(2));
+						kindInfoIdSet.add(firstKindInfoId);
+					}
+				}
+			}
+			result.add(result3);
+			//获取第四级相关类目
+			List<KindInfo> result4 = new ArrayList<>();
+			kindInfoIdSet = new HashSet<>();
+			for (List<KindInfo> ki : kindInfoss) {
+				if (ki.size() > 3) {
+					Long firstKindInfoId = ki.get(3).getId();
+					if (!kindInfoIdSet.contains(firstKindInfoId)) {
+						result4.add(ki.get(3));
+						kindInfoIdSet.add(firstKindInfoId);
+					}
+				}
+			}
+			result.add(result4);
+		}
+		return result;
+	}
+
+	@Override
+	public List<PCBPropertyValue> findByPCBProductId(Long productId) {
+		List<PCBPropertyValue> list = pcbDao.findByPCBProductId(productId);
+		return list;
+	}
+
+	@Override
+	public Set<Long> findByEnUU(Long enUU) {
+		return pcbDao.findByEnUU(enUU);
+	}
 }

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

@@ -23,4 +23,11 @@ public interface PropertyDao extends JpaSpecificationExecutor<Property>, JpaRepo
 	 * @return 属性信息
 	 */
 	public List<Property> findByLabelEn(String labelEn);
+
+	/**
+	 * 根据属性中文名获取属性id
+	 * @param labelCn
+	 * @return
+	 */
+	public Long findIdByLabelCn(String labelCn);
 }

+ 10 - 0
src/main/java/com/uas/platform/b2c/prod/store/api/StoreInController.java

@@ -174,4 +174,14 @@ public class StoreInController {
 	public Page<StoreIn> findBySimilarName(@RequestParam(value = "keyword", required = false) String keyword, @RequestParam(value = "field", required = false) String field, PageParams params, @RequestParam(value = "type", required = false) String type, HttpServletRequest request) {
 		return storeService.findBySimilarName(params, keyword, type, field, request);
 	}
+
+	/**
+	 * 通过店铺企业uu确认是否为pcb店铺
+	 * @param enuu 企业uu
+	 * @return
+	 */
+	@RequestMapping(value = "/ispcb", method = RequestMethod.GET)
+	public ResultMap findPCBStoreByEnuu(@RequestParam(value = "enuu") Long enuu) {
+		return storeService.findPCBStoreByEnuu(enuu);
+	}
 }

+ 15 - 1
src/main/java/com/uas/platform/b2c/prod/store/facade/impl/CommodityFacadeImpl.java

@@ -1,5 +1,6 @@
 package com.uas.platform.b2c.prod.store.facade.impl;
 
+import com.uas.platform.b2c.core.config.SysConf;
 import com.uas.platform.b2c.prod.commodity.service.GoodsService;
 import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
 import com.uas.platform.b2c.prod.product.kind.service.KindService;
@@ -27,11 +28,14 @@ public class CommodityFacadeImpl implements CommodityFacade {
 
 	private final GoodsService goodsService;
 
+	private final SysConf sysConf;
+
 	@Autowired
-	public CommodityFacadeImpl(CommodityService commodityService, KindService kindService, GoodsService goodsService) {
+	public CommodityFacadeImpl(CommodityService commodityService, KindService kindService, GoodsService goodsService,SysConf sysConf) {
 		this.commodityService = commodityService;
 		this.kindService = kindService;
 		this.goodsService = goodsService;
+		this.sysConf = sysConf;
 	}
 
 	@Override
@@ -46,6 +50,16 @@ public class CommodityFacadeImpl implements CommodityFacade {
 			}
 		}
 		int count = goodsService.getNonstandardGoodsCount(storeUuid); //有效的在售非标数
+		if (!sysConf.getStoreid().equals(storeUuid)) {
+			Long enUU = goodsService.findenUUByStoreid(storeUuid);
+			if (enUU != null) {
+				Set<Long> kindInfoids = kindService.findByEnUU(enUU);
+				if (!CollectionUtils.isEmpty(kindInfoids)) {
+					List<KindInfo> kinds = kindService.getStructruingKindsByLeafKindIds(kindInfoids);
+					children.addAll(kinds);
+				}
+			}
+		}
 		if (count != 0){ //存在非标则添加其他类目
 			children.add(KindInfo.getOtherKind());
 		}

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

@@ -209,4 +209,11 @@ public interface StoreInService {
 	 * @return
 	 */
 	Page<StoreIn> findBySimilarName(PageParams params, String keyword, String type, String feild, HttpServletRequest request);
+
+	/**
+	 * 通过店铺企业uu获取店铺是否为pcb店铺
+	 * @param enuu 企业uu
+	 * @return
+	 */
+	ResultMap findPCBStoreByEnuu(Long enuu);
 }

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

@@ -17,6 +17,7 @@ import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.utils.JacksonUtils;
 import com.uas.platform.b2c.core.utils.UuidUtils;
 import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
+import com.uas.platform.b2c.prod.commodity.dao.PCBDao;
 import com.uas.platform.b2c.prod.product.component.dao.ComponentDao;
 import com.uas.platform.b2c.prod.product.component.modal.Component;
 import com.uas.platform.b2c.prod.product.component.modal.ComponentGoods;
@@ -109,8 +110,10 @@ public class StoreInServiceImpl implements StoreInService {
 
 	private final SearcherService searcherService;
 
+	private final PCBDao pcbDao;
+
 	@Autowired
-	public StoreInServiceImpl(StoreInDao storeDao, QualificationDao qualificationDao, GoodsDao goodsDao, ComponentDao componentDao, PurchaseDao purchaseDao, StoreBrandInfoDao brandInfoDao, StoreAdsService adsService, SysConf sysConf, EnterpriseService enterpriseService, SearchHistoryDao searchHistoryDao, SearcherService searcherService) {
+	public StoreInServiceImpl(StoreInDao storeDao, QualificationDao qualificationDao, GoodsDao goodsDao, ComponentDao componentDao, PurchaseDao purchaseDao, StoreBrandInfoDao brandInfoDao, StoreAdsService adsService, SysConf sysConf, EnterpriseService enterpriseService, SearchHistoryDao searchHistoryDao, SearcherService searcherService, PCBDao pcbDao) {
 		this.storeDao = storeDao;
 		this.qualificationDao = qualificationDao;
 		this.goodsDao = goodsDao;
@@ -122,6 +125,7 @@ public class StoreInServiceImpl implements StoreInService {
 		this.enterpriseService = enterpriseService;
 		this.searchHistoryDao = searchHistoryDao;
 		this.searcherService = searcherService;
+		this.pcbDao = pcbDao;
 	}
 
 	@Override
@@ -756,8 +760,6 @@ public class StoreInServiceImpl implements StoreInService {
 			pageInfo.expression(typeLogicalEx);
 		}
 
-
-
 		return storeDao.findAll(new Specification<StoreIn>() {
 			@Override
 			public Predicate toPredicate(Root<StoreIn> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
@@ -766,4 +768,10 @@ public class StoreInServiceImpl implements StoreInService {
 			}
 		}, pageInfo);
 	}
+
+	@Override
+	public ResultMap findPCBStoreByEnuu(Long enuu) {
+		Integer pcbCount = pcbDao.CountPCBProuductByEnuu(enuu) > 0 ? 1 : 0;
+		return ResultMap.success(pcbCount);
+	}
 }

+ 10 - 0
src/main/java/com/uas/platform/b2c/trade/order/dao/OrderDetailDao.java

@@ -1,6 +1,7 @@
 package com.uas.platform.b2c.trade.order.dao;
 
 import com.uas.platform.b2c.trade.order.model.OrderDetail;
+import net.jpountz.util.Native;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Query;
@@ -65,4 +66,13 @@ public interface OrderDetailDao extends JpaSpecificationExecutor<OrderDetail>, J
 	 */
 	@Query(value = "select sum(detail_number) from trade$order_detail where go_batch in (:batches) and detail_status in (:status)", nativeQuery = true)
 	Double getgetSumQtyByBatchcodesAndStatus(@Param("batches") List<String> batches, @Param("status") List<Integer> status);
+
+	/**
+	 * 查询指定批次和状态的购买的数据,
+	 *
+	 * @param batches 批次队列
+	 * @return 数据
+	 */
+	@Query(nativeQuery = true,value = "select sum(detail_number) from trade$order_detail where go_batch  = :batches and detail_status in (501, 504, 502, 406, 404, 520, 405, 503, 514, 506)")
+	Double getPCBSaleQtyByBatchcodesAndStatus(@Param("batches") String batches);
 }

+ 0 - 4
src/main/java/com/uas/platform/b2c/trade/vendor/service/impl/VendorIntroductionServiceImpl.java

@@ -59,7 +59,6 @@ public class VendorIntroductionServiceImpl implements VendorIntroductionService
 	 */
 	@Override
 	public Page<VendorIntroduction> getVendorIntroduction(int page, int size, String keyword, String field) {
-		long start = System.currentTimeMillis();
 		String enterpriseCondition = " 1=1 ";
 		String productCondition = "";
 		// 拼接查询条件
@@ -99,7 +98,6 @@ public class VendorIntroductionServiceImpl implements VendorIntroductionService
 		} else {
 			vendorIntroductions = getEnterpriseWithoutProductCondition(enUU, enterpriseCondition,  page, size);
 		}
-		System.out.println("查找完企业UU" + (System.currentTimeMillis() - start));
 		return new Page<VendorIntroduction>(page, size, vendorIntroductions, total);
 	}
 
@@ -170,7 +168,6 @@ public class VendorIntroductionServiceImpl implements VendorIntroductionService
 		vendorIntroductionUusSql.append(",(select count(1) from ( select pr_enuu from v$product$private where ").append(productCondition)
 				.append(" and ifnull(pr_b2cenabled, 1) = 1 and pr_pbranden is not null and pr_pcmpcode is not null) p1 where pr_enuu = enUU) prodCounts");
 		vendorIntroductionUusSql.append(" from (").append(enterpriseSql).append(rownumSql);
-		System.out.println("ens:" + vendorIntroductionUusSql);
 		return commonDao.query(vendorIntroductionUusSql.toString(), VendorIntroduction.class);
 	}
 
@@ -217,7 +214,6 @@ public class VendorIntroductionServiceImpl implements VendorIntroductionService
 			enCountSql.append("right join ( select pr_enuu from v$product$private where ").append(productCondition).append(") p on pr_enuu = en_uu");
 		}
 		enCountSql.append(" group by en_uu )a");
-        System.out.println("en_count:" + enCountSql.toString());
 		return commonDao.queryForObject(enCountSql.toString(), Integer.class);
 	}
 

BIN
src/main/resources/jxls-tpl/trade/goods.xls


BIN
src/main/resources/jxls-tpl/trade/products-error.xls


BIN
src/main/resources/jxls-tpl/trade/products.xls


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


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


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


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


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


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


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


BIN
src/main/webapp/WEB-INF/cert/client.keystore


BIN
src/main/webapp/resources/img/seekPurchase/refu.png


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

@@ -1825,7 +1825,7 @@ define([ 'app/app' ], function(app) {
   /**
    * 左侧导航栏控制器
    */
-	app.controller('leftNavCtrl', ["$scope", "toaster", "$modal", "$rootScope", function($scope, toaster, $modal, $rootScope){
+	app.controller('leftNavCtrl', ["$scope", "toaster", "$modal", "$rootScope", '$q', function($scope, toaster, $modal, $rootScope, $q){
         //安全设置提醒框
         // $scope.openHomeCenterModel = function() {
         //     var modalInstance = $modal.open({
@@ -1846,6 +1846,10 @@ define([ 'app/app' ], function(app) {
 				$scope.openHomeCenterModel();
 			}*/
 		// };
+		// $q.all[$rootScope.pcbPromise].then(function (res) {
+		// 	$rootScope.isPcbStore = res == 1;
+		// })
+        // console.log($scope.pcbPromise);
 	}]);
 
     function checkNullStr (str) {

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

@@ -201,7 +201,11 @@ define([ 'ngResource' ], function() {
 			 */
 			getContactInfo: {
 				url: 'store-service/storeids',
-				method: 'GET',
+				method: 'GET'
+			},
+			isPcb: {
+				url: 'api/store-service/ispcb',
+				method: 'GET'
 			}
         });
     }]).factory('ConsignmentAgreementRecord', ['$resource', 'BaseService', function ($resource, BaseService) {

+ 3 - 3
src/main/webapp/resources/js/usercenter/controllers/forstore/messagePersonalCtrl.js

@@ -376,10 +376,10 @@ define(['app/app'], function(app) {
                         var b = '';
                         angular.forEach($scope.messageCurrent, function (message) {
                             message.content = $sce.trustAsHtml(message.content);
-                            if(message.type =="MALL跳转卖家待报价页面"){
-                                message.url='/vendor#/seekPurchase?type=1';
+                            if(message.type =="MALL跳转买家已报价页面"){
+                                message.url='/user#/seekPurchase?seekType=1';
                             }else if (message.type =="MALL公共询价"){
-                                message.url='/user#/seekPurchase';
+                                message.url='/vendor#/seekPurchase?type=1';
                             }else if (message.type =="商城公共询价采纳结果"){
                                 message.url='/vendor#/vendorPurchaseOffer';
                             }

+ 16 - 5
src/main/webapp/resources/js/usercenter/controllers/forstore/seek_purchase_ctrl.js

@@ -5,9 +5,9 @@
 define(['app/app', 'clipboard', 'QRCode'], function (app, clipboard, QRCode) {
   'use strict';
   app.register.controller('seekPurchaseCtrl',
-      ['$scope', '$rootScope', 'seekPurchase', 'toaster', 'BaseService',
+      ['$scope', '$location', '$rootScope', 'seekPurchase', 'toaster', 'BaseService',
         'ngTableParams', 'Order', 'SessionService', '$filter', '$upload', '$stateParams', 'Search', '$http',
-        function ($scope, $rootScope, seekPurchase, toaster, BaseService,
+        function ($scope, $location, $rootScope, seekPurchase, toaster, BaseService,
             ngTableParams, Order, SessionService, $filter, $upload, $stateParams, Search, $http) {
           $rootScope.active = 'seek_purchase';
           document.title = '我的求购-优软商城';
@@ -24,9 +24,14 @@ define(['app/app', 'clipboard', 'QRCode'], function (app, clipboard, QRCode) {
             })
           }
           var enIdFilter = $filter('EncryptionFilter');
+            if ($location.search().seekType === '1') {
+                $scope.tab = 'offered'
+            } else {
+                $scope.tab = 'waitOffer';
+            }
           seekPurchase.getSeekUrl({}, function(data) {
             var seekUrl = data.url;
-            $scope.tab = 'waitOffer';
+            /*$scope.tab = 'waitOffer';*/
             $scope.toogleTab = function (tab) {
                 $scope.tab = tab;
               $scope.seekPurchaseTableParams = new ngTableParams({
@@ -96,8 +101,13 @@ define(['app/app', 'clipboard', 'QRCode'], function (app, clipboard, QRCode) {
                 }
               });
             }
-          $scope.toogleTab('waitOffer');
-          $scope.applyObj = {
+              if ($location.search().seekType === '1') {
+                  $scope.toogleTab('offered');
+              } else {
+                  $scope.toogleTab('waitOffer')
+              }
+
+              $scope.applyObj = {
               code: '',
               brand: '',
               unitPrice: '',
@@ -543,6 +553,7 @@ define(['app/app', 'clipboard', 'QRCode'], function (app, clipboard, QRCode) {
                       toaster.pop('refuse', '已拒绝报价');
                       $scope.setShowCurrentRefuseOffer(false);
                       $scope.currentRefuseOffer.agreed = 0;
+                      $scope.currentRefuseOffer.refusereason =  choice
                       // $scope.seekPurchaseTableParams.reload();
                   }).error(function (response) {
                       toaster.pop('error', response ? response.message : '该单据可能已被操作,请刷新后重试');

+ 20 - 13
src/main/webapp/resources/js/vendor/app.js

@@ -677,6 +677,8 @@ define([ 'angularAMD', 'ngLocal', 'common/services', 'common/directives', 'commo
 		});
 		var applyPromise = deferred1.promise;
 
+        // console.log($rootScope.userInfo);
+
 		// 合并多个Promise对象
 		$q.all([storePromise, applyPromise]).then(function (result) {
 			$rootScope.store = result[0] && result[0].uuid ? result[0] : null;
@@ -687,24 +689,29 @@ define([ 'angularAMD', 'ngLocal', 'common/services', 'common/directives', 'commo
 			} else {
 				$rootScope.applyStatus = 'NONE';
 			}
-
-			if ($location.$$path === '/index') {
-                AuthenticationService.getAuthentication().success(function (data) {
-                    angular.forEach(data.enterprises, function (item) {
-                        if (item.current) {
-                            data.enterprise = item;
-                        }
-                    });
-                    $rootScope.userInfo = data;
+			AuthenticationService.getAuthentication().success(function (data) {
+				angular.forEach(data.enterprises, function (item) {
+					if (item.current) {
+						data.enterprise = item;
+					}
+				});
+				$rootScope.userInfo = data;
+				if ($location.$$path === '/index') {
 					if ($rootScope.applyStatus === 'NONE') {
 						$state.go('vendor_store_apply');
 					} else if ($rootScope.applyStatus === 'PASS') {
 						$state.go('vendor_store_maintain');
 					}
-                }).error(function (error) {
-                    toaster.pop('error', '获取登录信息失败');
-                })
-			}
+				}
+                // 是否pcb
+                // StoreInfo.isPcb({enuu: $rootScope.userInfo.enterprise.uu}, function (res) {
+                //     $rootScope.isPcbStore = res.data == 1;
+                // }, function (error) {
+                // });
+				$rootScope.isPcbStore = false;
+			}).error(function (error) {
+				toaster.pop('error', '获取登录信息失败');
+			})
 
 			$rootScope.$on('$stateChangeStart', function (event, toState) {
 

+ 3 - 3
src/main/webapp/resources/js/vendor/controllers/forstore/messagePersonalCtrl.js

@@ -336,10 +336,10 @@ define(['app/app'], function(app) {
                         var b = '';
                         angular.forEach($scope.messageCurrent, function (message) {
                             message.content = $sce.trustAsHtml(message.content);
-                            if(message.type =="MALL跳转卖家待报价页面"){
-                                message.url='/vendor#/seekPurchase?type=1';
+                            if(message.type =="MALL跳转买家已报价页面"){
+                                message.url='/user#/seekPurchase?seekType=1';
                             }else if (message.type =="MALL公共询价"){
-                                message.url='/user#/seekPurchase';
+                                message.url='/vendor#/seekPurchase?type=1';
                             }else if (message.type =="商城公共询价采纳结果"){
                                 message.url='/vendor#/vendorPurchaseOffer';
                             }

+ 3 - 3
src/main/webapp/resources/js/vendor/controllers/forstore/seek_purchase_ctrl.js

@@ -9,7 +9,6 @@ define(['app/app'], function (app) {
           $scope.seekPurchaseRate = {};
           seekPurchase.getSeekUrl({}, function(data) {
             var seekUrl = data.url;
-            // seekUrl = 'http://218.17.158.219:24000';
           $scope.initInquiryItem = function () {
             $scope.validSayPrice = {
               leadtime: false,
@@ -59,6 +58,7 @@ define(['app/app'], function (app) {
               // }
               param.enuu = $scope.userInfo.enterprise.uu;
               param.useruu = $scope.userInfo.userUU;
+              param.enableOffer = 1;
               var target = isSelf ? '/inquiry/sale/remind' : '/inquiry/sale/enremind';
               $http({
                 method: 'get',
@@ -210,7 +210,7 @@ define(['app/app'], function (app) {
               $scope.inquiryItem.id = $scope.inquiryItem.itemId;
               if (seekUrl == 'https://api-inquiry.usoftmall.com') {
                 seekPurchase.saveOfferProd($scope.inquiryItem, function (data) {
-                  toaster.pop('success', '报价成功');
+                  toaster.pop('success', '感谢您参与报价,敬请期待回复');
                   $scope.isShowSayPriceBox = false;
                   $scope.seekPurchaseTableParams.reload();
                 }, function (response) {
@@ -218,7 +218,7 @@ define(['app/app'], function (app) {
                 });
               } else {
                 seekPurchase.saveOffer($scope.inquiryItem, function (data) {
-                  toaster.pop('success', '报价成功');
+                  toaster.pop('success', '感谢您参与报价,敬请期待回复');
                   $scope.isShowSayPriceBox = false;
                   $scope.seekPurchaseTableParams.reload();
                 }, function (response) {

+ 21 - 13
src/main/webapp/resources/js/vendor/controllers/forstore/vendor_upload_ctrl.js

@@ -71,14 +71,19 @@ define([ 'app/app' ], function(app) {
 
 		//选择相应的销售类型
 		$scope.sellType = function(type) {
-			if($scope.batch.selfSellEabled) {
-				$scope.batch.sellType = type;
-				if (type == 'UAS') {
-					$scope.setShowSelfSellRemindBox(true);
-				}
-			}else {
-				$scope.batch.sellType = 'UAS';
-			}
+            if (type == 'self') {
+                $scope.batch.selfSellEabled && ($scope.batch.sellType = type);
+            } else if (type == 'UAS') {
+                !$rootScope.isPcbStore && ($scope.batch.sellType = type && $scope.setShowSelfSellRemindBox(true));
+            }
+			// if($scope.batch.selfSellEabled) {
+			// 	$scope.batch.sellType = type;
+			// 	if (type == 'UAS') {
+			// 		$scope.setShowSelfSellRemindBox(true);
+			// 	}
+			// }else {
+			// 	$scope.batch.sellType = 'UAS';
+			// }
 
         };
 
@@ -242,8 +247,9 @@ define([ 'app/app' ], function(app) {
 			} else {
                 var param = {selfSale : $scope.batch.sellType == 'self', currency : $scope.batch.currency, repeatImport : $scope.repeatImport};
 			}
+			var uploadUrl = $rootScope.isPcbStore ? '/release/product/release/excel/pcb' : 'release/product/release/excel';
 			$upload.upload({
-				url: 'release/product/release/excel',
+				url: uploadUrl,
 				file: file,
 				method: 'POST',
 				params : param
@@ -298,6 +304,7 @@ define([ 'app/app' ], function(app) {
         // 下载模板
         $scope.download = function() {
             var show = SessionService.get($scope.userInfo.userUU + "-releasetip");
+            var downloadUrl = $rootScope.isPcbStore ? '/release/product/release/template/pcb' : '/release/product/release/template'
             if (!show) {
                 var modalInstance = $modal.open({
                     animation: true,
@@ -306,10 +313,10 @@ define([ 'app/app' ], function(app) {
                 });
                 modalInstance.result.then(function(response) {
                 }, function(res) {
-                    window.location.href = $rootScope.rootPath + '/release/product/release/template?currency' + '=' + $scope.batch.currency + ($rootScope.$$productOn.tab == 'bathOnPerson' ? '&isPerson=1' : '');
+                    window.location.href = $rootScope.rootPath + downloadUrl + '?currency=' + $scope.batch.currency + ($rootScope.$$productOn.tab == 'bathOnPerson' ? '&isPerson=1' : '');
                 });
             } else {
-                window.location.href = $rootScope.rootPath + '/release/product/release/template?currency' + '=' + $scope.batch.currency + ($rootScope.$$productOn.tab == 'bathOnPerson' ? '&isPerson=1' : '');
+                window.location.href = $rootScope.rootPath + downloadUrl + '?currency=' + $scope.batch.currency + ($rootScope.$$productOn.tab == 'bathOnPerson' ? '&isPerson=1' : '');
             }
         };
 
@@ -395,16 +402,17 @@ define([ 'app/app' ], function(app) {
             } else {
                 var datatem = {isAjax : true, batch : $scope.result.batch};
             }
+            var downloadFailureUrl = $rootScope.isPcbStore ? '/release/product/release/failure/pcb/xls' : 'release/product/release/failure/xls';
             if($scope.result && $scope.result.batch && $scope.result.filter) {
                 var form = document.getElementById('load-error');
-                form.action= 'release/product/release/failure/xls';
+                form.action= downloadFailureUrl;
                 form.submit();
                 Loading.show();
                 var intervalId = null;
                 var getDownLoadStatus = function () {
                     $.ajax({
                         type: 'GET',
-                        url: 'release/product/release/failure/xls',
+                        url: downloadFailureUrl,
                         data : datatem,
                         dataType : 'json',
                         success: function (data) {

+ 42 - 5
src/main/webapp/resources/view/usercenter/forstore/seekPurchase.html

@@ -299,8 +299,11 @@
         font-weight: normal;
     }
     .seek-purchase .seek-purchase-content >table >tbody tr.expand-row table tbody tr td {
-        height: 48px;
-        line-height: 48px;
+        height: 68px;
+        line-height: 68px;
+    }
+    .seek-purchase .seek-purchase-content >table >tbody tr.expand-row table tbody tr td.operate {
+        overflow: visible;
     }
     .seek-purchase .seek-purchase-content >table >tbody tr.expand-row table tbody tr {
         border: 1px solid #fce8df;
@@ -364,6 +367,35 @@
         font-size: 12px;
         border-radius: 2px;
     }
+    .seek-purchase .seek-purchase-content >table >tbody tr.expand-row table tbody tr td.operate > b.refused-show{
+        position: relative;
+        margin-left: 30px;
+        font-size: 12px;
+        color: #323232;
+        cursor: pointer;
+    }
+    .seek-purchase .seek-purchase-content >table >tbody tr.expand-row table tbody tr td.operate > b.refused-show img{
+        margin-top: -2px;
+    }
+    .seek-purchase .seek-purchase-content >table >tbody tr.expand-row table tbody tr td.operate > b.refused-show .say-price-history{
+        display: inline-block;
+        position: absolute;
+        top: 17px;
+        right: -15px;
+        width: 110px;
+        height: 24px;
+        line-height: 24px;
+        background: #fff;
+        border: 1px solid #fab89a;
+        text-align: center;
+        font-size: 12px;
+        color: #000;
+        opacity: 0;
+        z-index: 1000;
+     }
+    .seek-purchase .seek-purchase-content >table >tbody tr.expand-row table tbody tr td.operate > b.refused-show:hover .say-price-history{
+        opacity: 1;
+    }
     td.operate .seek-btn {
         margin-left: 13px;
     }
@@ -695,6 +727,9 @@
         border-radius: 2px;
         color: #fff;
     }
+    .seek-purchase .link-saler-box .content div a:first-child {
+        background: #b4b5b9 !important;
+    }
     .seek-purchase .link-saler-box .select-adder {
         display: inline-block;
         width: 127px;
@@ -1206,7 +1241,9 @@
                                                     </div>
                                                 </div>
                                             </div>
-
+                                            <b class="refused-show" ng-if="of.agreed == 0">拒绝原因 <img src="static/img/seekPurchase/refu.png" alt="">
+                                                <a class="say-price-history" ng-bind="of.refusereason"></a>
+                                            </b>
                                             <img ng-if="of.agreed == 1" src="static/img/seekPurchase/recieved.png" alt="" class="ng-scope">
                                             <img ng-if="of.agreed == 0" src="static/img/seekPurchase/refused.png" alt="" class="ng-scope">
                                             <span class="seek-btn" ng-if="of.agreed != 0 && of.agreed != 1" ng-click="adopt(of)">采纳</span>
@@ -1347,14 +1384,14 @@
                 <select class="select-adder" ng-model="choice">
                     <option value="采购需求变更">采购需求变更</option>
                     <option value="价格过高">价格过高</option>
-                    <option value="需进一步了解原因">需进一步了解原因</option>
+                    <option value="需进一步了解信息">需进一步了解信息</option>
                     <option value="已选定合适供应商">已选定合适供应商</option>
                     <option value="交期过长">交期过长</option>
                 </select>
             </p>
             <div>
-                <a ng-click="refuse(choice)">确定</a>
                 <a ng-click="setShowCurrentRefuseOffer(false)">关闭</a>
+                <a ng-click="refuse(choice)">确定</a>
             </div>
         </div>
     </div>

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

@@ -35,10 +35,10 @@
         <div class="user_left fl">
             <a href="user#/home"><p ng-class="{'active' : active == 'home'}"><span>买家中心</span></p></a>
             <ul>
-                <li ng-class="{'active' : active == 'buyer_cart'}"><a  ui-sref="buyer_cart">购物车<em>(<span ng-bind="countCart || 0 | number"></span>)</em></a> </li>
+                <li ng-class="{'active' : active == 'seek_purchase'}"><a  ui-sref="buyerSeekPurchase">我的求购</a></li>
                 <div>
-                    <li ng-class="{'active' : active == 'buyer_order'}"><a  ui-sref="buyer_order">订单中心</a></li>
-                    <li ng-class="{'active' : active == 'seek_purchase'}"><a  ui-sref="buyerSeekPurchase">我的求购</a></li>
+                    <li ng-class="{'active' : active == 'buyer_cart'}"><a  ui-sref="buyer_cart">购物车<em>(<span ng-bind="countCart || 0 | number"></span>)</em></a> </li>
+                    <li ng-class="{'active' : active == 'buyer_order'}"><a  ui-sref="buyer_order">采购订单</a></li>
                     <li ng-class="{'active' : active == 'pay_center'}"><a  ui-sref="pay_center">支付中心</a></li>
                     <li ng-class="{'active' : active == 'buyer_invoice'}"><a  ui-sref="buyer_invoice">发票管理</a></li>
                 </div>

+ 17 - 6
src/main/webapp/resources/view/vendor/forstore/purchaseOffer.html

@@ -291,14 +291,14 @@
         right: 11px;
         line-height: normal;
         width: 198px;
-        height: 0;
+        height: 210px;
         background: #fff;
         border: 1px solid #fab89a;
         overflow: hidden;
-        transition: height 1s;
-        -moz-transition: height 1s; /* Firefox 4 */
-        -webkit-transition: height 1s; /* Safari 和 Chrome */
-        -o-transition: height 1s; /* Opera */
+        /*transition: height 1s;*/
+        /*-moz-transition: height 1s; !* Firefox 4 *!*/
+        /*-webkit-transition: height 1s; !* Safari 和 Chrome *!*/
+        /*-o-transition: height 1s; !* Opera *!*/
         opacity: 0;
         z-index: 10;
     }
@@ -316,6 +316,17 @@
         margin: 6px 0;
         text-align: left;
     }
+    .seek-purchase .seek-purchase-content >table tbody tr.default-row td.operate .is-say-price .say-price-history p.refused-reason{
+        margin-top: 15px;
+        text-align: left;
+        font-size: 12px;
+        font-weight: normal;
+        color: #333;
+    }
+    .seek-purchase .seek-purchase-content >table tbody tr.default-row td.operate .is-say-price .say-price-history p.refused-reason span{
+        font-size: 12px;
+        color: #f62d37;
+    }
     .seek-purchase .seek-purchase-content >table tbody tr.default-row td.operate .is-say-price .say-price-history > div {
         padding: 9px 12px;
     }
@@ -362,7 +373,6 @@
     }
     .seek-purchase .seek-purchase-content >table tbody tr.default-row td.operate .is-say-price:hover .say-price-history {
         opacity: 1;
-        height: 210px;
     }
     .seek-purchase .seek-purchase-content >table tbody tr.default-row td.operate >img {
         position: absolute;
@@ -732,6 +742,7 @@
                                         <span title="{{seek.currency + re.price | currencyStr}}">{{seek.currency + re.price | currencyStr}}</span>
                                     </li>
                                 </ul>
+                                <p class="refused-reason" ng-if="seek.agreed == 0">拒绝原因:<span ng-bind="seek.refusereason"></span></p>
                             </div>
                         </div>
                     </div>

+ 30 - 24
src/main/webapp/resources/view/vendor/forstore/vendor_material.html

@@ -142,6 +142,9 @@
 		border-bottom: #e8e8e8 1px solid;
 		text-align: center;
 	}
+	.public-tab.table>thead>tr>th:first-child{
+		text-align:right;
+	}
 	.public-tab.table>tbody>tr>td{
 		border-top: none;
 		border-bottom: #e8e8e8 1px solid;
@@ -178,7 +181,7 @@
 		color: #5078cb;
 	}
 	.public-tab.table>tbody>tr>td.edit span span{
-		padding: 0 8px;
+		padding: 0 5px;
 		display: inline-block;
 		/*width: 50px;*/
 		height: 24px;
@@ -193,7 +196,7 @@
 	}
 	/*展开收起按钮同一位置显示*/
 	.public-tab.table>tbody>tr>td.edit span.packUp{
-		margin-left: 112px;
+		margin-left: 100px;
 	}
 		/*已上架*/
 	.public-tab.table>tbody>tr>td span.has-on{
@@ -1101,7 +1104,7 @@
 	.edit-contents td .bg{
 		background: #fff;
 		width: 100%;
-		height: 132px;
+		height: 100px;
 	}
 	.edit-contents .content{
 		text-align: left;
@@ -1948,9 +1951,10 @@
 				<li ng-class="{'active': tab == 'material_person'}"><a ui-sref="vendor_material_person">个人产品库</a></li>
 				<li ng-class="{'active': tab == 'onSale'}"><a ui-sref="vendor_onSale">在售产品</a></li>
 				<li ng-class="{'active': tab == 'undercarriage'}"><a ui-sref="vendor_undercarriage">上下架历史</a></li>
+				<li ng-if="isPcbStore"><a ui-sref="vendor_upload">产品导入</a></li>
 			</ul>
 		</div>
-		<div class="com_tab com_tab2" style="margin-bottom: 0px">
+		<div class="com_tab com_tab2" ng-if="!isPcbStore" style="margin-bottom: 0px">
 			<ul class="fl distance" style="width: 100%">
 				<li ng-class="{active : standard_tab == 'unstandard'}"  ng-click="toggleStandard('unstandard')" title="非标产品({{nCount}})"><a href="" class="standard">非标产品(<em class="count">{{nCount}}</em>)</a></li>
 				<li ng-class="{active : standard_tab =='standard'}" ng-click="toggleStandard('standard')" title="标准产品({{sCount}})"><a href="" class="standard">标准产品(<em class="count">{{sCount}}</em>)</a></li>
@@ -2003,37 +2007,37 @@
 				<table class="public-tab standard-tab table">
 					<thead>
 					<tr>
-						<th width="80">
+						<th width="65">
 							<label class="check-active">
 								<input ng-disabled="currenctMaterial.length == 0" type="checkbox"  ng-click="chooseAllItem()" ng-checked="chooseAll || chooseAllPage" id="AllChoose"/>
 								<label for="AllChoose"></label>
 								<span>全选</span>
 							</label>
 						</th>
-						<th width="50">序号</th>
+						<th width="40">序号</th>
 						<th width="120">品牌</th>
 						<th width="140">类目(产品名称)</th>
-						<th width="170">产品型号</th>
-
-						<th width="100">单位</th>
+						<th width="170">型号</th>
+						<th width="100">规格</th>
+						<th width="80">单位</th>
 						<!--<th width="80">封装</th>-->
-						<th width="310">操作</th>
+						<th width="280">操作</th>
 					</tr>
 					</thead>
 					<tbody class="bg-show">
 					<!--<tr style="height: 14px;" ng-show="!isBatch && standard_tab == 'standard'">-->
 					<tr style="height: 14px;">
-						<td colspan="7" class="hei18"></td>
+						<td colspan="8" class="hei18"></td>
 					</tr>
 					</tbody>
 					<tbody>
 						<tr style="height: 14px;" ng-show="currenctMaterial.length > 0 && standard_tab == 'unstandard' && showTip">
-							<td colspan="7" class="hei17">
+							<td colspan="8" class="hei17">
 								<span>*匹配成为标准产品方可通过器件选型、参数搜索展示</span><a ng-click="cancelTip()">&times;</a>
 							</td>
 						</tr>
 						<tr class="no-hover batch-tr" ng-if="(chooseAll || chooseAllPage) && currenctMaterial.length != 0">
-							<td colspan="7">
+							<td colspan="8">
 								<div class="batch-line" ng-if="chooseAll && !chooseAllPage">
 									已选中当前页
 									<em class="red" ng-bind="materialAll.numberOfElements"></em>个产品,
@@ -2070,7 +2074,9 @@
                             <a class="brand-type" ng-if="material.cmpUuId" ng-href="product/component/{{material.cmpUuId}}/" ng-bind="material.pcmpcode" title="{{material.pcmpcode}}" target="_blank"></a>
                             <span class="brand-type" ng-if="!material.cmpUuId" ng-bind="material.pcmpcode" title="{{material.pcmpcode}}"></span>
 						</td>
-
+						<td>
+							<span ng-bind="material.spec || '-'" title="{{material.spec || '-'}}"></span>
+						</td>
 						<td ng-bind="material.unit || 'PCS'" title="{{material.unit  || 'PCS'}}"></td>
 						<!--<td>-->
 							<!--<span ng-bind="material.encapsulation || '-'" title="{{material.encapsulation || '-'}}"></span>-->
@@ -2091,7 +2097,7 @@
 					</tr>
 					<!--展开内容-->
 					<tr ng-show="material.addGoodsOper  || (material.exPandOper && material.goodsArr.length > 0)">
-						<td colspan="7" style="padding: 0;">
+						<td colspan="8" style="padding: 0;">
 							<div class="show-content">
 								<div class="content-body">
 									<table class="public-tab table">
@@ -2155,9 +2161,9 @@
                                                         <div class="input-list">
 										                    <span class="tit" style="width: 84px">最小包装数:</span><input type="number" maxlength="6" oninput="if(value.length>6)value=value.slice(0,6)" class="wid70 form-control" name="minPackQty" title="最小包装数" placeholder="数量" ng-model="goods.editMinPackQty" ng-blur="setPriceMinPackAmount(goods)" ng-class="{'error' : goods.editMinPackQtyInValid}" style="width: 70px;"/>
                                                         </div>
-																											<div class="input-list">
-																												<span class="tit" style="width: 84px">规格:</span><input maxlength="40" class="wid70 form-control" name="minPackQty" title="规格" placeholder="规格" ng-model="goods.spec"  style="width: 70px;"/>
-																											</div>
+														<!--<div class="input-list">-->
+															<!--<span class="tit" style="width: 84px">规格:</span><input maxlength="40" class="wid70 form-control" name="minPackQty" title="规格" placeholder="规格" ng-model="goods.spec"  style="width: 70px;"/>-->
+														<!--</div>-->
                                                     </div>
                                                     <div class="content">
                                                         <p class="title height24">梯度/pcs</p>
@@ -2257,7 +2263,7 @@
 														<p class="title"><span style="width:84px">库存:</span><span ng-bind="goods.reserve">9023492</span></p>
 														<p class="title"><span style="width:84px">最小起订量:</span><span ng-bind="goods.minBuyQty">90492</span></p>
 														<p class="title"><span style="width:84px">最小包装数:</span><span ng-bind="goods.minPackQty">980</span></p>
-														<p class="title"><span style="width:84px">规格:</span><span ng-bind="goods.spec || '-'" title="{{goods.spec}}">980</span></p>
+														<!--<p class="title"><span style="width:84px">规格:</span><span ng-bind="goods.spec || '-'" title="{{goods.spec}}">980</span></p>-->
 													</div>
 													<div class="content width150">
 														<div class="title-price">
@@ -2362,11 +2368,11 @@
 																								 ng-class="{'error' : goods.editMinPackQtyInValid}"
 																								 style="width: 70px;"/>
 														</div>
-														<div class="input-list">
-															<span class="tit"  style="width: 84px">规格:</span><input class="width70 form-control" name="spec" title="规格"  placeholder="规格" ng-model="goods.spec"
-																																		maxlength="50"
-																																		style="width: 70px;"/>
-														</div>
+														<!--<div class="input-list">-->
+															<!--<span class="tit"  style="width: 84px">规格:</span><input class="width70 form-control" name="spec" title="规格"  placeholder="规格" ng-model="goods.spec"-->
+																																		<!--maxlength="50"-->
+																																		<!--style="width: 70px;"/>-->
+														<!--</div>-->
 													</div>
 													<div class="content">
 														<p class="title height24">梯度/pcs</p>

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

@@ -1814,6 +1814,7 @@
 				<li ng-class="{'active': tab == 'material_person'}"><a ui-sref="vendor_material_person">个人产品库</a></li>
 				<li ng-class="{'active': tab == 'onSale'}"><a ui-sref="vendor_onSale">在售产品</a></li>
 				<li ng-class="{'active': tab == 'undercarriage'}"><a ui-sref="vendor_undercarriage">上下架历史</a></li>
+				<li ng-if="isPcbStore"><a ui-sref="vendor_upload">产品导入</a></li>
 			</ul>
 		</div>
 		<!--<div class="com_tab">

+ 7 - 5
src/main/webapp/resources/view/vendor/forstore/vendor_onSale.html

@@ -961,6 +961,7 @@
                 <li ng-class="{'active': tab == 'material_person'}"><a ui-sref="vendor_material_person">个人产品库</a></li>
                 <li ng-class="{'active': tab == 'onSale'}"><a ui-sref="vendor_onSale">在售产品</a></li>
                 <li ng-class="{'active': tab == 'undercarriage'}"><a ui-sref="vendor_undercarriage">上下架历史</a></li>
+                <li ng-if="isPcbStore"><a ui-sref="vendor_upload">产品导入</a></li>
                 <li class="down-goods">
                     <!--<span ng-click="downGoods()">
                         <i class="fa fa-file-excel-o fa-fw"></i>导出Excel
@@ -1200,11 +1201,12 @@
                                         <p>品牌: <em ng-bind="commodity.brandNameEn" title="{{commodity.brandNameEn}}">NXP</em></p>
                                         <p>类目(产品名称): <em ng-bind="commodity.kindNameCn || '-'" title="{{commodity.kindNameCn}}"></em></p>
                                         <p>型号: <em ng-bind="commodity.code" title="{{commodity.code}}">LPC1112</em></p>
-                                        <p>
-                                            <span style="width: 32px;">规格: </span>
-                                            <span><input style="width:90px" type="text"
-                                                         placeholder="请输入规格" maxlength="50" ng-model="commodity.spec" class="wid48 form-control"/></span>
-                                        </p>
+                                        <p>规格: <em ng-bind="commodity.spec || '-'" title="{{commodity.spec}}">LPC1112</em></p>
+                                        <!--<p>-->
+                                            <!--<span style="width: 32px;">规格: </span>-->
+                                            <!--<span><input style="width:90px" type="text"-->
+                                                         <!--placeholder="请输入规格" maxlength="50" ng-model="commodity.spec" class="wid48 form-control"/></span>-->
+                                        <!--</p>-->
                                     </div>
                                 </div>
                                 <div class="content-show width120">

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

@@ -580,6 +580,7 @@
                 <li ng-class="{'active': tab == 'material_person'}"><a ui-sref="vendor_material_person">个人产品库</a></li>
                 <li ng-class="{'active': tab == 'onSale'}"><a ui-sref="vendor_onSale">在售产品</a></li>
                 <li ng-class="{'active': tab == 'undercarriage'}"><a ui-sref="vendor_undercarriage">上下架历史</a></li>
+                <li ng-if="isPcbStore"><a ui-sref="vendor_upload">产品导入</a></li>
             </ul>
         </div>
         <div class="search-check">

+ 9 - 2
src/main/webapp/resources/view/vendor/forstore/vendor_upload.html

@@ -528,10 +528,17 @@
     <!--货品管理-->
     <div class="pro_management device">
         <div class="com_tab">
-            <ul class="fl" style="width: 100%">
+            <ul class="fl" style="width: 100%" ng-if="!isPcbStore">
                 <li ng-class="{'active': $$productOn.tab == 'bathOn'}" ng-click="toggleActive('bathOn')"><a href="">导入企业库</a></li>
                 <li ng-class="{'active': $$productOn.tab == 'bathOnPerson'}" ng-click="toggleActive('bathOnPerson')"><a href="">导入个人库</a></li>
             </ul>
+            <ul class="fl" style="width: 100%" ng-if="isPcbStore">
+                <li><a ui-sref="vendor_material">企业产品库</a></li>
+                <li><a ui-sref="vendor_material_person">个人产品库</a></li>
+                <li><a ui-sref="vendor_onSale">在售产品</a></li>
+                <li><a ui-sref="vendor_undercarriage">上下架历史</a></li>
+                <li class="active"><a ui-sref="vendor_upload">产品导入</a></li>
+            </ul>
         </div>
         <div class="remind-line" ng-show="$$productOn.tab == 'bathOn' && showTip"><span class="fl">导入企业库的产品同时会进行上架销售并展示在店铺</span><a ng-click="closeTip()" class="fr">&times;</a></div>
         <div class="remind-line" ng-show="$$productOn.tab == 'bathOnPerson' && showTip"><span class="fl">创建您的个人产品库,可为您精准推送客户需求</span><a href="help/helpDetail/56" target="_blank" class="operate-introduce">操作说明</a><a ng-click="closeTip()" class="fr">&times;</a></div>
@@ -565,7 +572,7 @@
                                 <label for="sellbyself" ng-disabled="!batch.selfSellEabled"></label>
                                 <span ng-disabled="!batch.selfSellEabled">店铺自营</span>
                             </label>-->
-                            <span>
+                            <span ng-disabled="isPcbStore">
                                 <img ng-show="batch.sellType == 'self'" src="static/img/upload/daishou-default.png" alt="" ng-click="sellType('UAS')">
                                 <img ng-hide="batch.sellType == 'self'" src="static/img/upload/daishou-active.png" alt="">
                             </span>

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff