Просмотр исходного кода

Merge remote-tracking branch 'origin/dev' into feature-authority-180524

# Conflicts:
#	src/main/java/com/uas/platform/b2c/common/account/controller/AuthenticationController.java
#	src/main/java/com/uas/platform/b2c/core/filter/SSOInterceptor.java
#	src/main/java/com/uas/platform/b2c/trade/vendor/service/impl/InviteVendorHistoryServiceImpl.java
#	src/main/webapp/resources/js/vendor/controllers/forstore/vendor_store_maintain_ctrl.js
Hu Jie 7 лет назад
Родитель
Сommit
8596f0d107
100 измененных файлов с 2709 добавлено и 783 удалено
  1. BIN
      jpg
  2. 2 0
      src/main/java/com/uas/platform/b2c/common/account/controller/AuthenticationController.java
  3. 7 0
      src/main/java/com/uas/platform/b2c/common/account/dao/UserDao.java
  4. 14 0
      src/main/java/com/uas/platform/b2c/common/account/model/Enterprise.java
  5. 14 0
      src/main/java/com/uas/platform/b2c/common/account/model/User.java
  6. 23 13
      src/main/java/com/uas/platform/b2c/common/message/controller/InternalMessageController.java
  7. 16 1
      src/main/java/com/uas/platform/b2c/common/search/constant/SearchUrl.java
  8. 12 0
      src/main/java/com/uas/platform/b2c/common/search/controller/SearcherController.java
  9. 55 4
      src/main/java/com/uas/platform/b2c/common/search/rpc/service/Impl/SearchServiceImpl.java
  10. 4 0
      src/main/java/com/uas/platform/b2c/common/search/rpc/service/SearchService.java
  11. 8 0
      src/main/java/com/uas/platform/b2c/common/search/service/SearcherService.java
  12. 28 11
      src/main/java/com/uas/platform/b2c/common/search/service/impl/SearcherServiceImpl.java
  13. 19 0
      src/main/java/com/uas/platform/b2c/common/weixin/Readme.md
  14. 105 0
      src/main/java/com/uas/platform/b2c/common/weixin/contoller/WeChatController.java
  15. 197 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/MessageModel.java
  16. 48 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/TemplateData.java
  17. 33 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/TemplateDataDetail.java
  18. 62 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/TemplateMessage.java
  19. 36 0
      src/main/java/com/uas/platform/b2c/common/weixin/service/WeChatService.java
  20. 209 0
      src/main/java/com/uas/platform/b2c/common/weixin/service/impl/WeChatServiceImpl.java
  21. 90 0
      src/main/java/com/uas/platform/b2c/common/weixin/util/CheckoutUtil.java
  22. 33 0
      src/main/java/com/uas/platform/b2c/common/weixin/util/WeChatUtil.java
  23. 0 4
      src/main/java/com/uas/platform/b2c/core/filter/SSOInterceptor.java
  24. 2 2
      src/main/java/com/uas/platform/b2c/fa/payment/service/impl/InstallmentServiceImpl.java
  25. 22 0
      src/main/java/com/uas/platform/b2c/fa/payment/utils/StringUtils.java
  26. 4 2
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/ErrorInfoConstant.java
  27. 24 19
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/ModifyConstant.java
  28. 35 34
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/UploadConstant.java
  29. 22 11
      src/main/java/com/uas/platform/b2c/prod/commodity/model/ReleaseProductByBatch.java
  30. 1 4
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsServiceImpl.java
  31. 152 100
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ProductServiceImpl.java
  32. 50 44
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ReleaseProductByBatchServiceImpl.java
  33. 44 0
      src/main/java/com/uas/platform/b2c/prod/commodity/util/SheetUtil.java
  34. 15 1
      src/main/java/com/uas/platform/b2c/prod/product/common/CommonTask.java
  35. 1 2
      src/main/java/com/uas/platform/b2c/prod/product/common/api/CommonCountController.java
  36. 31 0
      src/main/java/com/uas/platform/b2c/prod/product/common/model/CommonCount.java
  37. 0 3
      src/main/java/com/uas/platform/b2c/prod/product/common/service/impl/CommonCountServiceImpl.java
  38. 11 0
      src/main/java/com/uas/platform/b2c/prod/store/api/StoreInController.java
  39. 14 0
      src/main/java/com/uas/platform/b2c/prod/store/model/EnterpriseSimple.java
  40. 19 1
      src/main/java/com/uas/platform/b2c/prod/store/model/StoreIn.java
  41. 10 2
      src/main/java/com/uas/platform/b2c/prod/store/service/StoreInService.java
  42. 72 1
      src/main/java/com/uas/platform/b2c/prod/store/service/impl/StoreInServiceImpl.java
  43. 20 37
      src/main/java/com/uas/platform/b2c/trade/order/service/impl/OrderServiceImpl.java
  44. 12 0
      src/main/java/com/uas/platform/b2c/trade/presale/controller/CollectionController.java
  45. 12 0
      src/main/java/com/uas/platform/b2c/trade/presale/controller/StoreFocusController.java
  46. 21 0
      src/main/java/com/uas/platform/b2c/trade/presale/dao/CollectionDao.java
  47. 41 1
      src/main/java/com/uas/platform/b2c/trade/presale/dao/StoreFocusDao.java
  48. 36 0
      src/main/java/com/uas/platform/b2c/trade/presale/model/Collection.java
  49. 12 4
      src/main/java/com/uas/platform/b2c/trade/presale/service/CollectionService.java
  50. 11 4
      src/main/java/com/uas/platform/b2c/trade/presale/service/StoreFocusService.java
  51. 18 0
      src/main/java/com/uas/platform/b2c/trade/presale/service/impl/CollectionServiceImpl.java
  52. 27 3
      src/main/java/com/uas/platform/b2c/trade/presale/service/impl/StoreFocusServiceImpl.java
  53. 4 3
      src/main/java/com/uas/platform/b2c/trade/vendor/controller/VendorIntroductionController.java
  54. 8 6
      src/main/java/com/uas/platform/b2c/trade/vendor/service/VendorIntroductionService.java
  55. 1 0
      src/main/java/com/uas/platform/b2c/trade/vendor/service/impl/InviteVendorHistoryServiceImpl.java
  56. 122 79
      src/main/java/com/uas/platform/b2c/trade/vendor/service/impl/VendorIntroductionServiceImpl.java
  57. 1 1
      src/main/resources/dev/account.properties
  58. 1 1
      src/main/resources/dev/redis.properties
  59. BIN
      src/main/resources/jxls-tpl/trade/goods.xls
  60. BIN
      src/main/resources/jxls-tpl/trade/products-error.xls
  61. BIN
      src/main/resources/jxls-tpl/trade/products.xls
  62. BIN
      src/main/resources/jxls-tpl/trade/releaseByBatch-person.xls
  63. BIN
      src/main/resources/jxls-tpl/trade/releaseByBatch-rmb.xls
  64. BIN
      src/main/resources/jxls-tpl/trade/releaseByBatchError-person.xls
  65. BIN
      src/main/resources/jxls-tpl/trade/releaseByBatchError-rmb.xls
  66. BIN
      src/main/resources/jxls-tpl/trade/releaseByBatchError-usd.xls
  67. BIN
      src/main/resources/jxls-tpl/trade/releasebyBatch-usd.xls
  68. BIN
      src/main/resources/jxls-tpl/trade/upAndDown.xls
  69. 1 1
      src/main/resources/prod/account.properties
  70. 2 2
      src/main/resources/prod/message.properties
  71. 1 0
      src/main/resources/spring/redis.xml
  72. 1 1
      src/main/resources/test/account.properties
  73. 2 2
      src/main/resources/test/redis.properties
  74. 1 0
      src/main/webapp/WEB-INF/spring/webmvc.xml
  75. 1 1
      src/main/webapp/resources/css/commonComponent.css
  76. 153 70
      src/main/webapp/resources/data/profession.json
  77. 31 31
      src/main/webapp/resources/js/common/controllers/commonCtrls.js
  78. 4 0
      src/main/webapp/resources/js/common/query/internalMessage.js
  79. 34 5
      src/main/webapp/resources/js/usercenter/app.js
  80. 13 13
      src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_home_ctrl.js
  81. 18 3
      src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_transfer_ctrl.js
  82. 96 25
      src/main/webapp/resources/js/usercenter/controllers/forstore/messagePersonalCtrl.js
  83. 120 89
      src/main/webapp/resources/js/usercenter/controllers/forstore/order_pay_ctrl.js
  84. 38 12
      src/main/webapp/resources/js/vendor/app.js
  85. 122 9
      src/main/webapp/resources/js/vendor/controllers/forstore/messagePersonalCtrl.js
  86. 25 4
      src/main/webapp/resources/js/vendor/controllers/forstore/purchase_detail.js
  87. 1 1
      src/main/webapp/resources/js/vendor/controllers/forstore/seek_purchase_ctrl.js
  88. 36 38
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_index_ctrl.js
  89. 4 0
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_onSaleCtrl.js
  90. 48 18
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_order_ctrl.js
  91. 15 11
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_store_maintain_ctrl.js
  92. 5 1
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_upload_ctrl.js
  93. 1 1
      src/main/webapp/resources/view/admin/trade/trade_order.html
  94. 3 3
      src/main/webapp/resources/view/usercenter/componentStore.html
  95. 6 6
      src/main/webapp/resources/view/usercenter/forstore/bomDetail.html
  96. 3 3
      src/main/webapp/resources/view/usercenter/forstore/buyer_cart.html
  97. 4 4
      src/main/webapp/resources/view/usercenter/forstore/buyer_order.html
  98. 20 22
      src/main/webapp/resources/view/usercenter/forstore/buyer_transfer.html
  99. 1 1
      src/main/webapp/resources/view/usercenter/forstore/messagePersonal.html
  100. 8 8
      src/main/webapp/resources/view/usercenter/forstore/order_detail.html

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

@@ -5,6 +5,7 @@ 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.UserQuestionService;
 import com.uas.platform.b2c.common.account.service.UserService;
 import com.uas.platform.b2c.core.support.SystemSession;
 
@@ -18,6 +19,7 @@ import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 
 /**
  *

+ 7 - 0
src/main/java/com/uas/platform/b2c/common/account/dao/UserDao.java

@@ -131,4 +131,11 @@ public interface UserDao extends JpaSpecificationExecutor<User>, JpaRepository<U
 	@QueryHints({ @QueryHint(name = "org.hibernate.cacheable", value = "true") })
 	@Query("select u.userUU from User u inner join u.enterprises as e where e.uu = :enUU and u.userName like %:userName%")
 	public List<Long> findUserByUserNameLikeAndEnUU(@Param("userName") String userName, @Param("enUU") Long enUU);
+
+	/**
+	 * 根据openid获取用户信息
+	 * @param openId
+	 * @return
+	 */
+	public User findUsersByOpenId(String openId);
 }

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

@@ -189,6 +189,20 @@ public class Enterprise implements Serializable {
 	@Transient
 	private Integer receiptStatus;
 
+	/**
+	 * 企业简介
+	 */
+	@Column(name = "en_description", length = 1000)
+	private String description;
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
 	public String getAccessSecret() {
 		return accessSecret;
 	}

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

@@ -226,6 +226,12 @@ public class User implements Serializable {
 	@Column(name = "user_emlstatus")
 	private Integer emailValidCode;
 
+	/**
+	 * 微信openId
+	 */
+	@Column(name = "user_openid")
+	private String openId;
+
 	public Long getLastLoginTime() {
 		return lastLoginTime;
 	}
@@ -534,4 +540,12 @@ public class User implements Serializable {
 	public void setIdRemarks(String idRemarks) {
 		this.idRemarks = idRemarks;
 	}
+
+	public String getOpenId() {
+		return openId;
+	}
+
+	public void setOpenId(String openId) {
+		this.openId = openId;
+	}
 }

+ 23 - 13
src/main/java/com/uas/platform/b2c/common/message/controller/InternalMessageController.java

@@ -3,6 +3,7 @@ package com.uas.platform.b2c.common.message.controller;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.TypeReference;
 import com.alibaba.fastjson.parser.Feature;
+import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.common.message.service.InternalMessageService;
 import com.uas.platform.b2c.core.config.MessageConf;
 import com.uas.platform.b2c.core.support.SystemSession;
@@ -10,6 +11,7 @@ import com.uas.platform.core.model.PageParams;
 import com.uas.platform.core.model.Status;
 import com.uas.platform.core.util.HttpUtil;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.domain.Page;
 import org.springframework.http.HttpStatus;
 import org.springframework.ui.ModelMap;
@@ -30,6 +32,9 @@ public class InternalMessageController {
 
     private final InternalMessageService internalMessageService;
 
+    @Value("#{message.messagePublicServiceDevUrl}")
+    private String messageServiceUrl;
+
     @Autowired
     public  InternalMessageController(InternalMessageService internalMessageService) {
         this.internalMessageService = internalMessageService;
@@ -47,21 +52,25 @@ public class InternalMessageController {
         return map;
     }
 
-
-/*    *//**
-     * 分页获取消息 (用户)
-     * @param recRole 接收角色
-     * @param timeSorting 时间排序
-     * @param classes 消息分类
-     * @param page 分页参数
-     * @return
-     *//*
-    @RequestMapping(value = "/private", method = RequestMethod.GET)
-    public ModelMap getMessagePagePrivate(@RequestParam(value = "recRole", defaultValue = "BUYER") String recRole, @RequestParam("timeSorting") String timeSorting, @RequestParam("classes") String classes, PageParams page) {
+    /**
+     * 获取url
+     */
+    @RequestMapping(value = "/getUrl",method = RequestMethod.GET)
+    public ModelMap getUrl(PageParams pageParams, Short isRead, String keyword) {
         ModelMap map = new ModelMap();
-        map.put("messages", internalMessageService.getMessagePage(SystemSession.getUser().getUserUU(), (SystemSession.getUser().getEnterprise() != null ? SystemSession.getUser().getEnterprise().getUu(): null), recRole, timeSorting, classes, page));
+        User user = SystemSession.getUser();
+        map.put("url", messageServiceUrl);
+        map.put("userUU", user.getUserUU());
+        map.put("enUU", user.getEnterprise().getUu());
+        map.put("page", pageParams.getPage());
+        map.put("timeSorting", pageParams.getSorting() == null ? "{\"createTime\":\"DESC\"}" : pageParams.getSorting());
+        map.put("count", pageParams.getCount());
+        map.put("isRead", isRead == null ? "" : isRead);
+        if (null != keyword && !"".equals(keyword)) {
+            map.put("keyword", keyword);
+        }
         return map;
-    }*/
+    }
 
     /**
      * 获取消息的方法
@@ -103,6 +112,7 @@ public class InternalMessageController {
 //		return new ModelMap("toRead", pagingReleaseService.getToReadCount());
     }
 
+
     /**
      * 阅读消息
      * @param id

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

@@ -10,7 +10,22 @@ public class SearchUrl {
     /**
      * 获取类目id
      */
-    public static final String KIND_ID_URL = "/search/kindIds?keyword={keyword}";
+    public static final String KIND_ID_URL = "/search/standardProductIds?enUU={enUU}&keyword={keyword}&page={page}&size={size}";
+
+    /**
+     * 获取企业物料
+     */
+    public static final String PRODUCT_ID_URL = "/search/productIds?enUU={enUU}&keyword={keyword}&page={page}&size={size}&type={type}";
+
+    /**
+     * 标准型号联想(物料)
+     */
+    public static final String PRODUCT_SIMILAR_PCMPCODE_URL = "/search/product/similarPCmpCodes?keyword={keyword}";
+
+    /**
+     * 类目联想(物料)
+     */
+    public static final String PRODUCT_SIMILAR_KIND_URL = "/search/product/similarKind?keyword={keyword}";
 
     /**
      * 获取类目的数据

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

@@ -281,6 +281,18 @@ public class SearcherController {
 		return  searcherService.getSimilarKeywords(keyword);
 	}
 
+	/**
+	 * 根据输入获取联想词(包括型号、类目、品牌,按顺序获取)
+	 *
+	 * @param keyword 关键词
+	 * @return 获取联想词(包括型号、类目、品牌)
+	 */
+	@RequestMapping(value = "/product/similarKeywords", method = RequestMethod.GET)
+	@ResponseBody
+	public Map<String,Object> getProductSimilarKeywords(String keyword) {
+		return  searcherService.getProductSimilarKeywords(keyword);
+	}
+
 	/**
 	 * 根据输入获取联想词(器件)
 	 * 

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

@@ -1,16 +1,17 @@
 package com.uas.platform.b2c.common.search.rpc.service.Impl;
 
 
-import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.uas.platform.b2c.common.search.constant.SearchUrl;
 import com.uas.platform.b2c.common.search.rpc.service.SearchService;
+import com.uas.platform.b2c.common.search.util.CollectField;
+import com.uas.platform.b2c.common.search.util.PageParams;
+import com.uas.platform.b2c.common.search.util.SPage;
 import com.uas.platform.b2c.core.config.SysConf;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import com.uas.platform.core.util.serializer.FlexJsonUtils;
 import com.uas.search.exception.SearchException;
-import com.uas.platform.b2c.common.search.util.CollectField;
-import com.uas.platform.b2c.common.search.util.PageParams;
-import com.uas.platform.b2c.common.search.util.SPage;
 import org.apache.commons.collections.map.HashedMap;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -73,6 +74,30 @@ public class SearchServiceImpl implements SearchService{
         }
     }
 
+    @Override
+    public SPage<Long> getProducts(Long enUU, String keyword, Integer page, Integer size, String type) throws SearchException {
+        Map<String, Object> map = initSearchMap(keyword, page, size);
+        map.put("enUU", enUU);
+        // standard 标准  nStandard 非标 其他为所有
+        map.put("type", type);
+        String str = restTemplate.getForObject(sysConf.getSearchUrl() + SearchUrl.PRODUCT_ID_URL, String.class, map);
+        if(StringUtils.isEmpty(str)) {
+            return null;
+        } else {
+            try {
+                // 2018年5月23日 20:57:36 dongbw 因为直接转Long会转为Integer,报类型转换错误,所以需要多处理一步
+                JSONObject json  = JSON.parseObject(str);
+                List<Long> ids = JSON.parseArray(json.get("content").toString(), Long.class);
+                SPage<Long> sPage = FastjsonUtils.fromJson(str, SPage.class);
+                sPage.setContent(ids);
+                return sPage;
+            }catch (Exception e) {
+                e.printStackTrace();
+                return null;
+            }
+        }
+    }
+
     @Override
     public SPage<Long> getBrandIds(String keyword, Integer page, Integer size) throws SearchException {
         Map<String, Object> map = initSearchMap(keyword, page, size);
@@ -232,6 +257,32 @@ public class SearchServiceImpl implements SearchService{
         }
     }
 
+    @Override
+    public Map<String,Object> getProductSimilarKeywords(String keyword) throws SearchException {
+        Map<String, Object> map = new HashedMap();
+        map.put("keyword", keyword);
+        String pCmpCode = restTemplate.getForObject(sysConf.getSearchUrl() + SearchUrl.PRODUCT_SIMILAR_PCMPCODE_URL, String.class, map);
+        String pBrandEn = restTemplate.getForObject(sysConf.getSearchUrl() + SearchUrl.SIMILAR_BRAND_URL, String.class, map);
+        String kind = restTemplate.getForObject(sysConf.getSearchUrl() + SearchUrl.PRODUCT_SIMILAR_KIND_URL, String.class, map);
+        if(StringUtils.isEmpty(pCmpCode) && StringUtils.isEmpty(pBrandEn) && StringUtils.isEmpty(kind)) {
+            return null;
+        }else {
+            try {
+                List<Object> reMapPCmpCode = FastjsonUtils.fromJsonArray(pCmpCode);
+                List<Object> reMapPBrandEn = FastjsonUtils.fromJsonArray(pBrandEn);
+                List<Object> reMapKind = FastjsonUtils.fromJsonArray(kind);
+                map.clear();
+                map.put("pCmpCode",reMapPCmpCode);
+                map.put("pBrandEn",reMapPBrandEn);
+                map.put("kind",reMapKind);
+                return map;
+            }catch (Exception e) {
+                e.printStackTrace();
+                return null;
+            }
+        }
+    }
+
     @Override
     public List<Map<String, Object>> getSimilarComponents(String keyword) throws SearchException {
         Map<String, Object> map = new HashedMap();

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

@@ -19,6 +19,8 @@ public interface SearchService {
 
     SPage<Map<String, Object>> getKinds(String keyword, Integer page, Integer size) throws SearchException;
 
+    SPage<Long> getProducts(Long enUU, String keyword, Integer page, Integer size, String type) throws SearchException;
+
     SPage<Long> getBrandIds(String keyword, Integer page, Integer size) throws SearchException;
 
     SPage<Map<String, Object>> getBrands(String keyword, Integer page, Integer size) throws SearchException;
@@ -35,6 +37,8 @@ public interface SearchService {
 
     Map<String,Object> getSimilarKeywords(String keyword) throws SearchException;
 
+    Map<String,Object> getProductSimilarKeywords(String keyword) throws SearchException;
+
     List<Map<String, Object>> getSimilarComponents(String keyword) throws SearchException;
 
     List<Map<String, Object>> getSimilarBrands(String keyword) throws SearchException;

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

@@ -119,6 +119,14 @@ public interface SearcherService {
 	 */
 	public Map<String,Object> getSimilarKeywords(String keyword);
 
+	/**
+	 * 根据输入获取联想词(包括器件、类目、品牌,按顺序获取)
+	 *
+	 * @param keyword 关键词
+	 * @return 联想词
+	 */
+	Map<String,Object> getProductSimilarKeywords(String keyword);
+
 	/**
 	 * 根据输入的原厂型号获取联想词
 	 * 

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

@@ -26,17 +26,6 @@ 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;
@@ -49,6 +38,18 @@ 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;
+
 /**
  * 搜索索引
  *
@@ -379,6 +380,22 @@ public class SearcherServiceImpl implements SearcherService {
         return result;
     }
 
+    @Override
+    public Map<String, Object> getProductSimilarKeywords(String keyword) {
+        Map<String, Object> result = null;
+        try {
+            result = searchService.getProductSimilarKeywords(keyword);
+        } catch (SearchException e) {
+            throwSystemException(e);
+        }
+        for (Entry<String, Object> entry : result.entrySet()) {
+            if (((List) entry.getValue()).size() > 8) {
+                entry.setValue(((List) entry.getValue()).subList(0, 8));
+            }
+        }
+        return result;
+    }
+
     @Override
     public List<Map<String, Object>> getSimilarComponents(String componentCode) {
         List<Map<String, Object>> components = new ArrayList<>();

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

@@ -0,0 +1,19 @@
+## name
+
+weixin
+
+## 名称
+
+微信
+
+## 创建人
+
+liusw
+
+## 创建时间
+
+2018年5月29日14:22:32
+
+## 说明
+
+用户绑定微信

+ 105 - 0
src/main/java/com/uas/platform/b2c/common/weixin/contoller/WeChatController.java

@@ -0,0 +1,105 @@
+package com.uas.platform.b2c.common.weixin.contoller;
+
+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.service.WeChatService;
+import com.uas.platform.b2c.common.weixin.util.CheckoutUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.ui.Model;
+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;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.List;
+
+/**
+ * @author liusw
+ * @create 2018-05-29 10:21
+ * @desc 微信登录controller
+ **/
+@RestController
+@RequestMapping("/wx")
+public class WeChatController {
+
+
+    @Autowired
+    private WeChatService weChatService;
+
+    @RequestMapping(value = "/check", method = RequestMethod.GET)
+    public void wenxinCheck(Model model, HttpServletRequest request, HttpServletResponse response) {
+        // 微信加密签名
+        String signature = request.getParameter("signature");
+        // 时间戳
+        String timestamp = request.getParameter("timestamp");
+        // 随机数
+        String nonce = request.getParameter("nonce");
+        // 随机字符串
+        String echostr = request.getParameter("echostr");
+        PrintWriter print;
+        // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
+        if (signature != null && CheckoutUtil.checkSignature(signature, timestamp, nonce)) {
+            try {
+                print = response.getWriter();
+                print.write(echostr);
+                print.flush();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+//    /**
+//     * 微信授权,获取code
+//     * @return
+//     */
+//    @RequestMapping("/wxLoginPage")
+//    public ModelMap loginPage(HttpServletRequest request) {
+//        ModelMap data = new ModelMap();
+//        String redirect_url = "http://a2v86u.natappfree.cc";
+//        String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";
+//        url = url.replace("APPID", appID);
+//        url = url.replace("REDIRECT_URI", redirect_url + "/weChat/pcAuth");
+//        url = url.replace("SCOPE", "snsapi_userinfo");
+//        url = url.replace("STATE", request.getSession().getId());
+//        data.put("sessionId", request.getSession().getId());
+//        data.put("url", url);
+//        System.out.println(url);
+//        return data;
+//    }
+
+    /**
+     * 用户微信授权成功返回接口
+     * @param code 用于获取AccessToken
+     * @param state 获取code的state参数
+     * @return
+     */
+    @RequestMapping(value = "/getWxUserInfo", method = RequestMethod.GET)
+    public ModelMap getWxUserInfo(String code,String state) {
+        return weChatService.getWxUserInfo(code, state);
+    }
+
+    /**
+     * 发送模板消息
+     * @return
+     */
+    @RequestMapping(value = "/sendTemplateMessage", method = RequestMethod.POST)
+    public ModelMap sendTemplateMessage(@RequestBody List<MessageModel> messages){
+        return weChatService.sendTemplateMessage(messages);
+    }
+
+    /**
+     * 绑定用户
+     * @param user
+     * @return
+     */
+    @RequestMapping(value = "/bindUser", method = RequestMethod.POST)
+    public ModelMap bindUser(@RequestBody User user){
+        return weChatService.bindUser(user);
+    }
+}

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

@@ -0,0 +1,197 @@
+package com.uas.platform.b2c.common.weixin.model;
+
+/**
+ * @author liusw
+ * @date 2018-05-29 20:14
+ */
+public class MessageModel {
+    /**
+     * 消息类型
+     */
+    private String type;
+    /**
+     * 消息内容
+     */
+    private String content;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 来源id
+     */
+    private Long sourceId;
+    /**
+     * 消息接收者uu
+     */
+    private Long receiverUu;
+    /**
+     * 消息接收者企业uu
+     */
+    private Long receiverEnuu;
+    /**
+     * 消息发送者
+     */
+    private Long senderUu;
+    /**
+     * 消息发送者企业uu
+     */
+    private Long senderEnuu;
+    /**
+     * 来源应用
+     */
+    private String producerApp;
+    /**
+     * 消费类型(所有应用共享:"PUBLIC",单个应用独享:"SINGLE",多个应用共享:"MULTI")
+     */
+    private String consumerType;
+    /**
+     * 推送方式类型
+     * 邮件、短信、IM:"MAIL_AND_SM_AND_IM"
+     * 邮件、短信:"MAIL_AND_SM"
+     * 邮件、IM:"MAIL_AND_IM"
+     * 短信、IM:"SM_AND_IM"
+     * 邮件:"MAIL"
+     * 短信:"SM"
+     * IM:"IM"
+     * 不发送:"DONT_SEND"
+     */
+    private String smsType;
+    /**
+     * 邮件模板id
+     */
+    private String mailTemplate;
+    /**
+     * 短息模板id
+     */
+    private String smTemplate;
+    /**
+     * 接收应用(以","拼接应用名称)
+     */
+    private String consumerApp;
+
+    /**
+     * 询价名称
+     */
+    private String name;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Long getReceiverUu() {
+        return receiverUu;
+    }
+
+    public void setReceiverUu(Long receiverUu) {
+        this.receiverUu = receiverUu;
+    }
+
+    public Long getReceiverEnuu() {
+        return receiverEnuu;
+    }
+
+    public void setReceiverEnuu(Long receiverEnuu) {
+        this.receiverEnuu = receiverEnuu;
+    }
+
+    public Long getSenderUu() {
+        return senderUu;
+    }
+
+    public void setSenderUu(Long senderUu) {
+        this.senderUu = senderUu;
+    }
+
+    public Long getSenderEnuu() {
+        return senderEnuu;
+    }
+
+    public void setSenderEnuu(Long senderEnuu) {
+        this.senderEnuu = senderEnuu;
+    }
+
+    public String getProducerApp() {
+        return producerApp;
+    }
+
+    public void setProducerApp(String producerApp) {
+        this.producerApp = producerApp;
+    }
+
+    public String getConsumerType() {
+        return consumerType;
+    }
+
+    public void setConsumerType(String consumerType) {
+        this.consumerType = consumerType;
+    }
+
+    public String getSmsType() {
+        return smsType;
+    }
+
+    public void setSmsType(String smsType) {
+        this.smsType = smsType;
+    }
+
+    public String getMailTemplate() {
+        return mailTemplate;
+    }
+
+    public void setMailTemplate(String mailTemplate) {
+        this.mailTemplate = mailTemplate;
+    }
+
+    public String getSmTemplate() {
+        return smTemplate;
+    }
+
+    public void setSmTemplate(String smTemplate) {
+        this.smTemplate = smTemplate;
+    }
+
+    public String getConsumerApp() {
+        return consumerApp;
+    }
+
+    public void setConsumerApp(String consumerApp) {
+        this.consumerApp = consumerApp;
+    }
+
+    public Long getSourceId() {
+        return sourceId;
+    }
+
+    public void setSourceId(Long sourceId) {
+        this.sourceId = sourceId;
+    }
+}

+ 48 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/TemplateData.java

@@ -0,0 +1,48 @@
+package com.uas.platform.b2c.common.weixin.model;
+
+import java.util.List;
+
+/**
+ * @author liusw
+ * @date 2018-05-29 19:25
+ */
+public class TemplateData {
+    /**
+     * 头部信息
+     */
+    private TemplateDataDetail first;
+
+    /**
+     * 关键字信息
+     */
+    private List<TemplateDataDetail> keywords;
+
+    /**
+     * 备注
+     */
+    private TemplateDataDetail remark;
+
+    public TemplateDataDetail getFirst() {
+        return first;
+    }
+
+    public void setFirst(TemplateDataDetail first) {
+        this.first = first;
+    }
+
+    public List<TemplateDataDetail> getKeywords() {
+        return keywords;
+    }
+
+    public void setKeywords(List<TemplateDataDetail> keywords) {
+        this.keywords = keywords;
+    }
+
+    public TemplateDataDetail getRemark() {
+        return remark;
+    }
+
+    public void setRemark(TemplateDataDetail remark) {
+        this.remark = remark;
+    }
+}

+ 33 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/TemplateDataDetail.java

@@ -0,0 +1,33 @@
+package com.uas.platform.b2c.common.weixin.model;
+
+/**
+ * @author liusw
+ * @date 2018-05-29 19:26
+ */
+public class TemplateDataDetail {
+    /**
+     * 值
+     */
+    private String value;
+
+    /**
+     * 颜色
+     */
+    private String color;
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getColor() {
+        return color;
+    }
+
+    public void setColor(String color) {
+        this.color = color;
+    }
+}

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

@@ -0,0 +1,62 @@
+package com.uas.platform.b2c.common.weixin.model;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author liusw
+ * @date 2018-05-29 19:17
+ */
+public class TemplateMessage {
+    /**
+     * 接受openid
+     */
+    private String touser;
+
+    /**
+     * 模板Id
+     */
+    private String templateId;
+
+    /**
+     * 模板跳转地址
+     */
+    private String url;
+
+    /**
+     * 模板消息
+     */
+    private Map<String, TemplateDataDetail> data;
+
+    public String getTouser() {
+        return touser;
+    }
+
+    public void setTouser(String touser) {
+        this.touser = touser;
+    }
+
+    public String getTemplateId() {
+        return templateId;
+    }
+
+    public void setTemplateId(String templateId) {
+        this.templateId = templateId;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public Map<String, TemplateDataDetail> getData() {
+        return data;
+    }
+
+    public void setData(Map<String, TemplateDataDetail> data) {
+        this.data = data;
+    }
+}

+ 36 - 0
src/main/java/com/uas/platform/b2c/common/weixin/service/WeChatService.java

@@ -0,0 +1,36 @@
+package com.uas.platform.b2c.common.weixin.service;
+
+import com.uas.platform.b2c.common.account.model.User;
+import com.uas.platform.b2c.common.weixin.model.MessageModel;
+import org.springframework.ui.ModelMap;
+
+import java.util.List;
+
+/**
+ * @author liusw
+ * @date 2018-05-30 9:24
+ */
+public interface WeChatService {
+
+    /**
+     * 获取微信用户信息
+     * @param code
+     * @param state
+     * @return
+     */
+    ModelMap getWxUserInfo(String code, String state);
+
+    /**
+     * 发送模板消息
+     * @param messages
+     * @return
+     */
+    ModelMap sendTemplateMessage(List<MessageModel> messages);
+
+    /**
+     * 绑定用户
+     * @param user
+     * @return
+     */
+    ModelMap bindUser(User user);
+}

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

@@ -0,0 +1,209 @@
+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.service.WeChatService;
+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.stereotype.Service;
+import org.springframework.ui.ModelMap;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.*;
+
+/**
+ * @author liusw
+ * @date 2018-05-30 9:24
+ */
+@Service
+public class WeChatServiceImpl implements WeChatService{
+
+    @Autowired
+    private UserDao userDao;
+
+    @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");
+            result.put("openid", openid);
+            User user = userDao.findUsersByOpenId(openid);
+            if (StringUtils.isEmpty(user)) {
+                result.put("status", 0);
+            } else {
+                result.put("status", 1);
+                // 转成userAccount
+                UserAccount userAccount = convertUserAccount(user);
+                // 企业信息单独提出
+                Set<Enterprise> enterprises = user.getEnterprises();
+                result.put("userAccount", userAccount);
+                result.put("enterprises", enterprises);
+            }
+        }
+        return result;
+    }
+
+    private UserAccount convertUserAccount(User user) {
+        UserAccount userAccount = new UserAccount();
+        userAccount.setAppId("mall");
+        userAccount.setVipName(user.getUserName());
+        userAccount.setEmail(user.getUserEmail());
+        userAccount.setMobile(user.getUserTel());
+        userAccount.setUserUU(user.getUserUU());
+        return userAccount;
+    }
+
+    @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.GET_ACCESS_TOKEN.replace("ACCESS_TOKEN", access_token);
+            // 模板内容设置
+            TemplateMessage templateMessage = new TemplateMessage();
+            templateMessage.setTemplateId(WeChatUtil.INQUIRY_TEMPLATE_ID);
+            templateMessage.setUrl("https://www.usoftmall.com/mobile/center/vendor/seek?seekType=wait");
+            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())) {
+                    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("keyword2", keyword2);
+                    first.setValue("尊敬的用户,您有一条新的询价单");
+                    remark.setValue(messageModel.getContent());
+                    data.put("first", first);
+                    data.put("remark", remark);
+                    templateMessage.setData(data);
+                    HttpUtil.doPost(sendTemplateUrl, FlexJsonUtils.toJsonDeep(templateMessage));
+                }
+            }
+            result.put("success", true);
+            return result;
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.put("success", false);
+            result.put("message", e.getMessage());
+            return result;
+        }
+    }
+
+    @Override
+    public ModelMap bindUser(User user) {
+        ModelMap result = new ModelMap();
+        // 账户中心校验手机号和密码是否正确
+        if (StringUtils.isEmpty(user) || StringUtils.isEmpty(user.getUserTel()) || StringUtils.isEmpty(user.getUserPwd()) || StringUtils.isEmpty(user.getOpenId())) {
+            throw new IllegalOperatorException("信息不完整!");
+        }
+        // 是否存在用户信息
+        List<User> oldUsers = userDao.findUserByUserTel(user.getUserTel());
+        if (CollectionUtils.isEmpty(oldUsers)) {
+            throw new IllegalOperatorException("未找到用户信息");
+        }
+        User judgeUser = userDao.findUsersByOpenId(user.getOpenId());
+        if (!StringUtils.isEmpty(judgeUser)) {
+            throw new IllegalOperatorException("该微信号已被绑定");
+        }
+        UserView userView = new UserView();
+        userView.setMobile(user.getUserTel());
+        userView.setPassword(user.getUserPwd());
+        boolean pass = false;
+        try {
+            User oldUser = oldUsers.get(0);
+            if (!StringUtils.isEmpty(oldUser.getOpenId())) {
+                throw new IllegalOperatorException("该用户已经绑定微信号");
+            }
+            pass = AccountUtils.fuzzyCheckPassword(userView);
+            if (!pass) {
+                throw new IllegalOperatorException("手机号或密码不正确");
+            }
+            oldUser.setOpenId(user.getOpenId());
+            user = userDao.save(oldUser);
+            // 转成UserAccount便于登录
+            UserAccount userAccount = convertUserAccount(user);
+            // 企业信息单独提出
+            Set<Enterprise> enterprises = user.getEnterprises();
+            result.put("userAccount", userAccount);
+            result.put("enterprises", enterprises);
+            result.put("success", true);
+            return result;
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.put("success", false);
+            result.put("message", e.getMessage());
+            return result;
+        }
+    }
+
+    /**
+     * 通过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 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();
+        }
+        return null;
+    }
+}

+ 90 - 0
src/main/java/com/uas/platform/b2c/common/weixin/util/CheckoutUtil.java

@@ -0,0 +1,90 @@
+package com.uas.platform.b2c.common.weixin.util;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * @author wangmh
+ * @create 2018-05-24 14:28
+ * @desc 第三方校验
+ **/
+public class CheckoutUtil {
+    /**
+     *  与接口配置信息中的Token要一致
+     */
+    private static String token = "usoftmall";
+
+    /**
+     * 验证签名
+     *
+     * @param signature
+     * @param timestamp
+     * @param nonce
+     * @return
+     */
+    public static boolean checkSignature(String signature, String timestamp, String nonce) {
+        String[] arr = new String[] { token, timestamp, nonce };
+        // 将token、timestamp、nonce三个参数进行字典序排序
+        // Arrays.sort(arr);
+        sort(arr);
+        StringBuilder content = new StringBuilder();
+        for (int i = 0; i < arr.length; i++) {
+            content.append(arr[i]);
+        }
+        MessageDigest md = null;
+        String tmpStr = null;
+
+        try {
+            md = MessageDigest.getInstance("SHA-1");
+            // 将三个参数字符串拼接成一个字符串进行sha1加密
+            byte[] digest = md.digest(content.toString().getBytes());
+            tmpStr = byteToStr(digest);
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+        content = null;
+        // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
+        System.out.println("签名" + signature);
+        return tmpStr != null ? tmpStr.equalsIgnoreCase(signature) : false;
+    }
+
+    /**
+     * 将字节数组转换为十六进制字符串
+     *
+     * @param byteArray
+     * @return
+     */
+    private static String byteToStr(byte[] byteArray) {
+        String strDigest = "";
+        for (int i = 0; i < byteArray.length; i++) {
+            strDigest += byteToHexStr(byteArray[i]);
+        }
+        return strDigest;
+    }
+
+    /**
+     * 将字节转换为十六进制字符串
+     *
+     * @param mByte
+     * @return
+     */
+    private static String byteToHexStr(byte mByte) {
+        char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+        char[] tempArr = new char[2];
+        tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
+        tempArr[1] = Digit[mByte & 0X0F];
+        String s = new String(tempArr);
+        return s;
+    }
+    public static void sort(String a[]) {
+        for (int i = 0; i < a.length - 1; i++) {
+            for (int j = i + 1; j < a.length; j++) {
+                if (a[j].compareTo(a[i]) < 0) {
+                    String temp = a[i];
+                    a[i] = a[j];
+                    a[j] = temp;
+                }
+            }
+        }
+    }
+}

+ 33 - 0
src/main/java/com/uas/platform/b2c/common/weixin/util/WeChatUtil.java

@@ -0,0 +1,33 @@
+package com.uas.platform.b2c.common.weixin.util;
+
+/**
+ * @author liusw
+ * @date 2018-05-29 19:33
+ */
+public class WeChatUtil {
+
+    /**
+     * appid
+     */
+    public static final String APPID = "wxb3274b676737a319";
+
+    /**
+     * appsecret
+     */
+    public static final String APPSECRET = "2d453655ce03869d9b14ff2f9f62a634";
+
+    /**
+     * 模板ID
+     */
+    public static final String INQUIRY_TEMPLATE_ID = "-G-4m7K9Lsz7CsBmcBpIWi8eCw6ph_P1716fYSIfnhQ";
+
+    /**
+     * 发送模板消息url
+     */
+    public static final String SEND_TEMPLATE_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";
+
+    /**
+     * 获取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";
+}

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

@@ -99,7 +99,6 @@ public class SSOInterceptor extends AbstractSSOInterceptor {
 
     @Override
     protected boolean onAuthenticateFailed(HttpServletRequest request, HttpServletResponse response) {
-        logger.info("当前访问进入------------>>>>onAuthenticateFailed()方法!");
         SystemSession.clear();
         if (request.getRequestURI().endsWith(PathConstant.AUTHENTICATION_URL)) {
             return true;
@@ -180,11 +179,9 @@ public class SSOInterceptor extends AbstractSSOInterceptor {
         if (request.getPathInfo() != null) {
             resourceUrl = resourceUrl + request.getPathInfo();
         }
-        logger.info("【"+user.getUserUU()+"当前访问路径】:*******"+"resourceUrl:"+resourceUrl);
         if (null == configAttributes || configAttributes.size() == 0 || user.isSys() || user.getEnterprise() == null) {
             return;
         }
-        logger.info("【"+user.getUserUU()+"当前资源的权限】:*******"+"configAttributes:"+FastjsonUtils.toJson(configAttributes));
         Iterator<ConfigAttribute> iterator = configAttributes.iterator();
         String needPermission = null;
         if (null == authorities || !authorities.containsKey(user.getUserUU())) {
@@ -192,7 +189,6 @@ public class SSOInterceptor extends AbstractSSOInterceptor {
         }
         //获取当前登录用户的所有权限;
         Collection<GrantedAuthority> userAuthorities = authorities.get(user.getUserUU());
-        logger.info("【"+user.getUserUU()+"用户所有权限】:*******"+"userAuthorities:"+FastjsonUtils.toJson(userAuthorities));
         //匹配当前访问权限;
         while (iterator.hasNext()) {
             ConfigAttribute configAttribute = iterator.next();

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

@@ -341,9 +341,9 @@ public class InstallmentServiceImpl implements InstallmentService{
     ResultMap validateInstallmentStore() {
         InstallmentStore installmentStore = installmentStoreDao.findByEnuuAndEnable(SystemSession.getUser().getEnterprise().getUu(), (short) 1);
         if (installmentStore == null) {
-            return new ResultMap(CodeType.NO_AUTHORITY.code(), "当前企业没有设置分期功能权限,如有需要请联系客服");
+            return ResultMap.success(null);
         }
-        return ResultMap.success(null);
+        return new ResultMap(CodeType.NO_AUTHORITY.code(), "当前企业没有设置分期功能权限,如有需要请联系客服");
     }
 
     /**

+ 22 - 0
src/main/java/com/uas/platform/b2c/fa/payment/utils/StringUtils.java

@@ -99,4 +99,26 @@ public class StringUtils {
 		builder.deleteCharAt(builder.length() - 1);
 		return builder.toString();
 	}
+
+
+
+	/**
+	 *	截取指定字节长度的字符串忽略编码格式
+	 *
+	 * @param original 截取的字符串
+	 * @param length 截取的字节长度
+	 * @return
+	 */
+	public static String cutOutStringIgnoreEncode(String original, int length) {
+		if (org.springframework.util.StringUtils.isEmpty(original)) {
+			return original;
+		} else {
+			if (original.length() > length) {
+				String substring = original.substring(0, length);
+				return  substring;
+			} else {
+				return original;
+			}
+		}
+	}
 }

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

@@ -33,8 +33,10 @@ public enum  ErrorInfoConstant {
     CODE_LENGTH_INFO("产品型号不能超过100字符"),
     CODE_EMPTY_INFO("产品型号不能为空"),
 
-    BRAND_LENGTH_INFO("品牌名称不能超过50个字符或25个汉字"),
-    BRAND_EMPTY_INFO("英文品牌不能为空"),
+    BRAND_LENGTH_INFO("英文/中文品牌名称不能超过50个字符或25个汉字"),
+    BRAND_EMPTY_INFO("英文/中文品牌名称不能为空"),
+    KIND_EMPTY_INFO("类目(产品名称)不能为空"),
+    KIND_LENGTH_INFO("类目(产品名称)不能超过20个字符"),
     BREAK_UP_INFO("请选择可拆卖情况是或否"),
     RESERVE_NUMBER_INFO("库存须填写小于10亿的正整数"),
     PRODUCE_DATE_INFO("生产日期不能为空"),

+ 24 - 19
src/main/java/com/uas/platform/b2c/prod/commodity/constant/ModifyConstant.java

@@ -23,12 +23,12 @@ public class ModifyConstant {
     /**
      * The constant TOTAL_ROW.
      */
-    public static final int TOTAL_COLUMN = 21;
+    public static final int TOTAL_COLUMN = 22;
 
     /**
      * The constant MAX_TOTAL_COLUMN.
      */
-    public static final int MAX_TOTAL_COLUMN = 22;
+    public static final int MAX_TOTAL_COLUMN = 23;
 
     /**
      * 产品编码
@@ -50,88 +50,93 @@ public class ModifyConstant {
      */
     public static final int PRODUCT_BRAND = 3;
 
+    /**
+     * The constant PRODUCT_BRAND.
+     */
+    public static final int PRODUCT_SPEC = 4;
+
     /**
      * The constant PRODUCE_DATE.
      */
-    public static final int PRODUCE_DATE = 4;
+    public static final int PRODUCE_DATE = 5;
 
     /**
      * The constant PACKAGE_METHOD.
      */
-    public static final int PACKAGE_METHOD = 5;
+    public static final int PACKAGE_METHOD = 6;
 
     /**
      * The constant MIN_DELIVERY.
      */
-    public static final int MIN_DELIVERY = 6;
+    public static final int MIN_DELIVERY = 7;
 
     /**
      * The constant MAX_DELIVERY.
      */
-    public static final int MAX_DELIVERY = 7;
+    public static final int MAX_DELIVERY = 8;
 
     /**
      * The constant BREAK_UP.
      */
-    public static final int BREAK_UP = 8;
+    public static final int BREAK_UP = 9;
 
     /**
      * The constant PACKAGE_NUMBER.
      */
-    public static final int PACKAGE_NUMBER = 9;
+    public static final int PACKAGE_NUMBER = 10;
 
     /**
      * 最小起订量
      */
-    public static final int BUY_MIN_QTY = 10;
+    public static final int BUY_MIN_QTY = 11;
 
     /**
      * 分段价格开始
      */
-    public static final int PRICE_FIRST = 11;
+    public static final int PRICE_FIRST = 12;
 
     /**
      * 第二个分段
      */
-    public static final int QTY_SECOND_START = 12;
+    public static final int QTY_SECOND_START = 13;
 
     /**
      * 第二个分段
      */
-    public static final int PRICE_SECOND = 13;
+    public static final int PRICE_SECOND = 14;
 
     /**
      * 第三个分段
      */
-    public static final int QTY_THIRD_START = 14;
+    public static final int QTY_THIRD_START = 15;
 
     /**
      * 第三个分段
      */
-    public static final int PRICE_THIRD = 15;
+    public static final int PRICE_THIRD = 16;
 
     /**
      * The constant SALE_METHOD.
      */
-    public static final int SALE_METHOD = 16;
+    public static final int SALE_METHOD = 17;
 
     /**
      * The constant RESERVE_NUMBER.
      */
-    public static final int RESERVE_NUMBER = 17;
+    public static final int RESERVE_NUMBER = 18;
 
     /**
      * The constant CUSTOM_LABEL.
      */
-    public static final int CUSTOM_LABEL = 18;
+    public static final int CUSTOM_LABEL = 19;
 
     /**
      * The constant SALE_STATUS.
      */
-    public static final int SALE_STATUS = 19;
+    public static final int SALE_STATUS = 20;
 
     /**
      * The constant MATCH_STATUS.
      */
-    public static final int MATCH_STATUS = 20;
+    public static final int MATCH_STATUS = 21;
 }

+ 35 - 34
src/main/java/com/uas/platform/b2c/prod/commodity/constant/UploadConstant.java

@@ -20,123 +20,124 @@ public final class UploadConstant {
      */
     public static final int EXCEL_MAX_ROW = 2000;
 
+    /**
+     * 英文品牌名
+     */
+    public static final int BRAND_ENGLISH = 0;
+
+    /**
+     * 类目
+     */
+    public static final int KIND = 1;
+
     /**
      * 产品型号
      */
-    public static final int PRODUCT_CODE = 0;
+    public static final int PRODUCT_CODE = 2;
+
 
     /**
-     * 英文品牌名
+     * 规格
      */
-    public static final int BRAND_ENGLISH = 1;
+    public static final int SPEC = 3;
+
 
     /**
      * 是否拆卖
      */
-    public static final int BREAK_UP = 2;
+    public static final int BREAK_UP = 4;
 
     /**
      * 规则数据(个人)
      */
-    public static final int SPECIFICATION = 2;
+    public static final int SPECIFICATION = 3;
 
     /**
      * 库存数量
      */
-    public static final int RESERVE_NUMBER = 3;
+    public static final int RESERVE_NUMBER = 5;
 
     /**
      * 生产日期
      */
-    public static final int PRODUCE_DATE = 4;
+    public static final int PRODUCE_DATE = 6;
 
     /**
      * 包装方式
      */
-    public static final int PACKAGE_METHOD = 5;
+    public static final int PACKAGE_METHOD = 7;
 
     /**
      * 最小交期
      */
-    public static final int MIN_DELIVERY = 6;
+    public static final int MIN_DELIVERY = 8;
 
     /**
      * 最大交期
      */
-    public static final int MAX_DELIVERY = 7;
-
-    /**
-     * 规格
-     */
-    public static final int SPEC = 8;
-
+    public static final int MAX_DELIVERY = 9;
     /**
      * 最小包装数量
      */
-    public static final int PACKAGE_NUMBER = 9;
+    public static final int PACKAGE_NUMBER = 10;
 
     /**
      * 最小起订量
      */
-    public static final int BUY_MIN_QTY = 10;
+    public static final int BUY_MIN_QTY = 11;
 
     /**
      * 分段价格开始
      */
-    public static final int PRICE_START = 11;
+    public static final int PRICE_START = 12;
 
     /**
      * 第二个分段
      */
-    public static final int QTY_SECOND_START = 12;
+    public static final int QTY_SECOND_START = 13;
 
     /**
      * 第二个分段
      */
-    public static final int PRICE_SECOND = 13;
+    public static final int PRICE_SECOND = 14;
 
     /**
      * 第三个分段
      */
-    public static final int QTY_THIRD_START = 14;
+    public static final int QTY_THIRD_START = 15;
 
     /**
      * 第三个分段
      */
-    public static final int PRICE_THIRD = 15;
-
-    /**
-     * 分段价格结束
-     */
-    public static final int PRICE_END = 14;
+    public static final int PRICE_THIRD = 16;
 
     /**
      * 自定义标签
      */
-    public static final int CUSTOM_LABEL = 16;
+    public static final int CUSTOM_LABEL = 17;
 
     /**
      * 导入表的最大列数
      */
-    public static final int TOTAL_COLUMN = 17;
+    public static final int TOTAL_COLUMN = 18;
 
     /**
      * 用户可能直接用导入失败的表格进行导入
      */
-    public static final int MAX_TOTAL_COLUMN = 18;
+    public static final int MAX_TOTAL_COLUMN = 19;
 
     /**
      * 个人导入表的最大列数
      */
-    public static final int TOTAL_COLUMN_PERSON = 3;
+    public static final int TOTAL_COLUMN_PERSON = 4;
 
     /**
      * 个人用户可能直接用导入失败的表格进行导入
      */
-    public static final int MAX_TOTAL_COLUMN_PERSON = 4;
+    public static final int MAX_TOTAL_COLUMN_PERSON = 5;
 
     /**
      * 规格的最大长度
      */
-    public static final int SPEC_MAX_BYTE = 80;
+    public static final int SPEC_MAX_BYTE = 50;
 }

+ 22 - 11
src/main/java/com/uas/platform/b2c/prod/commodity/model/ReleaseProductByBatch.java

@@ -578,6 +578,21 @@ public class ReleaseProductByBatch implements Serializable {
 		setB2cBranden(StringUtilB2C.toEnglish(StringUtilB2C.getStr(value)));
 	}
 
+	public void setKindByExcel(Object value) {
+		if (StringUtils.isEmpty(value)) {
+			addErrmsg(ErrorInfoConstant.KIND_EMPTY_INFO.getInfo());
+		} else {
+			try {
+				if (value.toString().getBytes("GBK").length > 20) {
+					addErrmsg(ErrorInfoConstant.KIND_LENGTH_INFO.getInfo());
+				}
+			} catch (UnsupportedEncodingException e) {
+				throw new RuntimeException(e + "指定字符集不支持");
+			}
+		}
+		setKindName(StringUtilB2C.getStr(value));
+	}
+
 	public void setCodeByExcel(Object value) {
 		if (!StringUtils.isEmpty(value)) {
 			String code = value.toString().trim();
@@ -680,12 +695,8 @@ public class ReleaseProductByBatch implements Serializable {
 	 */
 	public void setSpecByExcel(Object value) {
 		if (!StringUtils.isEmpty(value)) {
-			try {
-				String str = com.uas.platform.b2c.fa.payment.utils.StringUtils.cutOutString(value.toString(), UploadConstant.SPEC_MAX_BYTE);
+				String str = com.uas.platform.b2c.fa.payment.utils.StringUtils.cutOutStringIgnoreEncode(value.toString(), UploadConstant.SPEC_MAX_BYTE);
 				setSpec(str);
-			} catch (UnsupportedEncodingException e) {
-				throw new RuntimeException(e + "指定字符集不支持");
-			}
 		}
 	}
 
@@ -704,7 +715,9 @@ public class ReleaseProductByBatch implements Serializable {
 
 	public void setMinPackageByExcel(Object value) {
 		setMinPackageStr(StringUtilB2C.getStr(value));
-		if ((value != null) && (RegexConstant.isNumber(value.toString()))) {
+		if (StringUtils.isEmpty(value)) {
+			setMinPackage(DoubleConstant.minReserve);
+		} else if ((RegexConstant.isNumber(value.toString()))) {
 			Double minPackQty = Double.valueOf(value.toString());
 			if (minPackQty <= 0) {
 				// 输入负数,默认为1
@@ -714,8 +727,6 @@ public class ReleaseProductByBatch implements Serializable {
 			} else {
 				setMinPackage(minPackQty);
 			}
-		} else if (StringUtils.isEmpty(value)) {
-			setMinPackage(DoubleConstant.minReserve);
 		} else {
 			addErrmsg(ErrorInfoConstant.MIN_PACKAGE_INFO.getInfo());
 		}
@@ -723,7 +734,9 @@ public class ReleaseProductByBatch implements Serializable {
 
 	public void setMinBuyQtyByExcel(Object value) {
 		setMinBuyQtyStr(StringUtilB2C.getStr(value));
-		if ((value != null) && (RegexConstant.isNumber(value.toString()))) {
+		if (StringUtils.isEmpty(value)) {
+			setMinBuyQty(getMinPackage());
+		} else if (RegexConstant.isNumber(value.toString())) {
 			Double minBuy = Double.valueOf(value.toString());
 			if (minBuy <= 0) {
 				setMinBuyQty(getMinPackage());
@@ -743,8 +756,6 @@ public class ReleaseProductByBatch implements Serializable {
 					}
 				}
 			}
-		} else if (StringUtils.isEmpty(value)) {
-			setMinBuyQty(getMinPackage());
 		} else {
 			setMinBuyQty(getMinPackage());
 		}

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

@@ -298,11 +298,8 @@ public class GoodsServiceImpl implements GoodsService {
 //            throw new IllegalOperatorException("包装信息只能包含中文和英文");
 //        }
         if (!StringUtils.isEmpty(goods.getSpec())) {
-            try {
-                String spec = com.uas.platform.b2c.fa.payment.utils.StringUtils.cutOutString(goods.getSpec().toString(), UploadConstant.SPEC_MAX_BYTE);
+                String spec = com.uas.platform.b2c.fa.payment.utils.StringUtils.cutOutStringIgnoreEncode(goods.getSpec().toString(), UploadConstant.SPEC_MAX_BYTE);
                 goods.setSpec(spec);
-            } catch (Exception e) {
-            }
         }
         if (StringUtils.isEmpty(goods.getProduceDate())) {
             throw new IllegalOperatorException("型号" + goods.getCode()+"品牌" + goods.getBrandNameEn() +"的产品生产日期为空");

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

@@ -7,6 +7,8 @@ import com.uas.platform.b2c.advertise.ad.service.RecommendProductService;
 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.service.EnterpriseService;
+import com.uas.platform.b2c.common.search.rpc.service.SearchService;
+import com.uas.platform.b2c.common.search.util.SPage;
 import com.uas.platform.b2c.core.config.SysConf;
 import com.uas.platform.b2c.core.constant.IntegerConstant;
 import com.uas.platform.b2c.core.constant.ShortConstant;
@@ -17,9 +19,43 @@ import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import com.uas.platform.b2c.core.utils.NumberUtil;
 import com.uas.platform.b2c.prod.commodity.constant.DoubleConstant;
 import com.uas.platform.b2c.prod.commodity.constant.StringConstant;
-import com.uas.platform.b2c.prod.commodity.dao.*;
-import com.uas.platform.b2c.prod.commodity.model.*;
-import com.uas.platform.b2c.prod.commodity.service.*;
+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;
+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.type.ProductConstant;
 import com.uas.platform.b2c.prod.commodity.util.GoodsUtil;
 import com.uas.platform.b2c.prod.product.brand.dao.BrandDao;
@@ -81,7 +117,15 @@ import java.lang.reflect.Field;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
-import java.util.*;
+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;
 
 /**
@@ -203,6 +247,9 @@ public class ProductServiceImpl implements ProductService {
     @Autowired
     private UserDao userDao;
 
+    @Autowired
+    private SearchService searchService;
+
     @Value("#{sys.productServiceIp}")
     private String productServiceIp;
 
@@ -210,59 +257,64 @@ public class ProductServiceImpl implements ProductService {
 
     @Override
     public Page<V_ProductPrivate> getAllProducts(final PageInfo page, String keyword, String type, Long userUU) {
-        Long enuu = SystemSession.getUser().getEnterprise().getUu();
-        page.expression(PredicateUtils.eq("enUU", enuu, true));
-        page.expression(PredicateUtils.isNotNull("pcmpcode"));
-        page.expression(PredicateUtils.isNotNull("pbranden"));
+        Long enUU = SystemSession.getUser().getEnterprise().getUu();
         if (StringUtils.isEmpty(type)) {
             type = "nStandard";
         }
-        if (type.contains("standard")) {
-            page.filter("standard", (short)1);
-            page.filter("b2cEnabled", (short) 1);
-        } else if (type.contains("nStandard")) {
-            page.filter("standard", (short)0);
-            page.filter("b2cEnabled", (short) 1);
-        } else if (type.contains("all")) {
-            SimpleExpression[] arr = new SimpleExpression[2];
-            arr[0] = PredicateUtils.eq("b2cEnabled", (short) 1, false);
-            arr[1] = PredicateUtils.eq("standard", (short) 1, false);
-            LogicalExpression logicalExpression = PredicateUtils.and(arr);
-            SimpleExpression standard = PredicateUtils.eq("standard", (short) 0, false);
-            page.orExpression(standard);
-            page.orExpression(logicalExpression);
-            page.sorting("standard", Sort.Direction.DESC);
-        }
-
-        if (StringUtils.hasText(keyword)) {
-            SimpleExpression code = PredicateUtils.like("prodNum", keyword, true);
-            SimpleExpression kind = PredicateUtils.like("kind", keyword, true);
-            SimpleExpression brandEn = PredicateUtils.like("pbranden", keyword, true);
-            SimpleExpression cmpCode = PredicateUtils.like("pcmpcode", keyword, true);
-            SimpleExpression[] expressions4 = new SimpleExpression[]{code, kind, brandEn, cmpCode};
-            LogicalExpression logicalExpression4 = PredicateUtils.or(expressions4);
-            page.expression(logicalExpression4);
-        }
-
-        if (!StringUtils.isEmpty(userUU)) {
-            // 先查询userUU在当前企业 有哪些物料
-            List<Long> ids = productPersonDao.findIdByEnuuAndUserUU(enuu, userUU);
-
-            if (CollectionUtils.isEmpty(ids)) {
-                return null;
-            } else {
-                page.expression(PredicateUtils.in("id", ids, true));
-            }
+//        page.expression(PredicateUtils.eq("enUU", enuu, true));
+//        page.expression(PredicateUtils.isNotNull("pcmpcode"));
+//        page.expression(PredicateUtils.isNotNull("pbranden"));
+//        if (type.contains("standard")) {
+//           SPage<Long> ids = searchService.get
+//        } else if (type.contains("nonStandard")) {
+//            page.filter("standard", (short)0);
+//            page.filter("b2cEnabled", (short) 1);
+//        } else if (type.contains("all")) {
+//            SimpleExpression[] arr = new SimpleExpression[2];
+//            arr[0] = PredicateUtils.eq("b2cEnabled", (short) 1, false);
+//            arr[1] = PredicateUtils.eq("standard", (short) 1, false);
+//            LogicalExpression logicalExpression = PredicateUtils.and(arr);
+//            SimpleExpression standard = PredicateUtils.eq("standard", (short) 0, false);
+//            page.orExpression(standard);
+//            page.orExpression(logicalExpression);
+//            page.sorting("standard", Sort.Direction.DESC);
+//        }
+//
+//        if (StringUtils.hasText(keyword)) {
+//            SimpleExpression code = PredicateUtils.like("prodNum", keyword, true);
+//            SimpleExpression kind = PredicateUtils.like("kind", keyword, true);
+//            SimpleExpression brandEn = PredicateUtils.like("pbranden", keyword, true);
+//            SimpleExpression cmpCode = PredicateUtils.like("pcmpcode", keyword, true);
+//            SimpleExpression[] expressions4 = new SimpleExpression[]{code, kind, brandEn, cmpCode};
+//            LogicalExpression logicalExpression4 = PredicateUtils.or(expressions4);
+//            page.expression(logicalExpression4);
+//        }
+
+        // TODO 搜索用户个人物料搜索暂时未实现,之后完善
+//        if (!StringUtils.isEmpty(userUU)) {
+//            // 先查询userUU在当前企业 有哪些物料
+//            List<Long> ids = productPersonDao.findIdByEnuuAndUserUU(enuu, userUU);
+//
+//            if (CollectionUtils.isEmpty(ids)) {
+//                return null;
+//            } else {
+//                page.expression(PredicateUtils.in("id", ids, true));
+//            }
+//        }
+
+        SPage<Long> ids = searchService.getProducts(enUU, keyword, page.getPageNumber(), page.getPageSize(), type);
+        if (null == ids) {
+            return null;
         }
-
-        Page<V_ProductPrivate> productPage = v_productPrivateDao.findAll(new Specification<V_ProductPrivate>() {
-            @Override
-            public Predicate toPredicate(Root<V_ProductPrivate> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
-                query.where(page.getPredicates(root, query, cb));
-                return null;
-            }
-        }, page);
-        List<V_ProductPrivate> productList = productPage.getContent();
+//        Page<V_ProductPrivate> productPage = v_productPrivateDao.findAll(new Specification<V_ProductPrivate>() {
+//            @Override
+//            public Predicate toPredicate(Root<V_ProductPrivate> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
+//                query.where(page.getPredicates(root, query, cb));
+//                return null;
+//            }
+//        }, page);
+        List<Long> idList = ids.getContent();
+        List<V_ProductPrivate> productList = v_productPrivateDao.findAll(idList);
         for (V_ProductPrivate product : productList) {
             product.setAddProductPerson(false);
             if ("ERP".equals(product.getSourceApp())) {
@@ -279,7 +331,7 @@ public class ProductServiceImpl implements ProductService {
             }
         }
         userUU = SystemSession.getUser().getUserUU();
-        List<Long> productIds = productPersonDao.findIdByEnuuAndUserUU(enuu, userUU);
+        List<Long> productIds = productPersonDao.findIdByEnuuAndUserUU(enUU, userUU);
         for (V_ProductPrivate v_productPrivate : productList) {
             for (Long productId : productIds) {
                 if (v_productPrivate.getId().equals(productId)) {
@@ -287,7 +339,7 @@ public class ProductServiceImpl implements ProductService {
                 }
             }
         }
-        return new PageImpl<V_ProductPrivate>(productList, page, productPage.getTotalElements());
+        return new PageImpl<V_ProductPrivate>(productList, page, ids.getTotalElement());
     }
 
     @Override
@@ -492,53 +544,52 @@ public class ProductServiceImpl implements ProductService {
             Product product = productDao.findOne(id);
             if (product == null)
                 throw new IllegalOperatorException("选择的产品不存在,请重新选择");
-                //查看是否存在正常未取消的订单
-                List<Goods> goodses = goodsDao.findByProductId(product.getId());
-                Boolean isExistOrder = false;
-                String codes = OrderStatus.UNAVAILABLE.getCodes() + "-" + Status.TOBECONFIRMED.value();
-                for (Goods goods : goodses) {
-                    List<OrderDetail> orderList = orderDetailService.findOrderDetailByBatchCode(goods.getBatchCode());
-                    for (OrderDetail detail : orderList) {
-                        Order order = detail.getOrder();
-                        int status = order.getStatus() == null ? detail.getStatus() : order.getStatus();
-                        if (codes.indexOf(String.valueOf(status)) < 0) {
-                            // 区分是否是假单,or_orderids 不为空
-                           if (StringUtils.isEmpty(order.getOrderids())) {
-                               isExistOrder = true;
-                               break;
-                           }
+            //查看是否存在正常未取消的订单
+            List<Goods> goodses = goodsDao.findByProductId(product.getId());
+            Boolean isExistOrder = false;
+            String codes = OrderStatus.UNAVAILABLE.getCodes() + "-" + Status.TOBECONFIRMED.value();
+            for (Goods goods : goodses) {
+                List<OrderDetail> orderList = orderDetailService.findOrderDetailByBatchCode(goods.getBatchCode());
+                for (OrderDetail detail : orderList) {
+                    Order order = detail.getOrder();
+                    int status = order.getStatus() == null ? detail.getStatus() : order.getStatus();
+                    if (codes.indexOf(String.valueOf(status)) < 0) {
+                        // 区分是否是假单,or_orderids 不为空
+                       if (StringUtils.isEmpty(order.getOrderids())) {
+                           isExistOrder = true;
+                           break;
+                       }
 
-                        }
-                    }
-                    if (isExistOrder) {
-                       break;
                     }
                 }
-                if (!isExistOrder) {
-                    //是否被个人物料库收录
-                    int count = productPersonDao.countByProductId(id);
-                    if ( count > 0 ){
-                        throw new IllegalOperatorException("该产品已被个人物料库收录,不能删除");
-                    }
-                    //删除外键关联的匹配结果列表,不然删除product失败
-                    Set<ProductMatchResult> productMatchResultSet =  product.getMatchresults();
-                    productMatchResultDao.delete(productMatchResultSet);
-                    if (CollectionUtils.isNotEmpty(goodses)) {
-                        goodsService.deleteGoods(goodses);
-                    }
-                    ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(product.getId());
-                    if (productPrivate == null) {
-                        productPrivate = new ProductPrivate();
-                        productPrivate.setPrId(product.getId());
-                    }
-                    productPrivate.setB2cEnabled(IntegerConstant.NO_SHORT);
-                    productPrivateDao.save(productPrivate);
-                    product.setB2cEnabled(IntegerConstant.NO_SHORT);
-                    //productDao.delete(id);  不允许删除
-                } else {
-                    throw new
-                            IllegalOperatorException("该产品中存在已下单的在售产品信息,不能删除");
+                if (isExistOrder) {
+                   break;
                 }
+            }
+            if (!isExistOrder) {
+                //是否被个人物料库收录
+                int count = productPersonDao.countByProductId(id);
+                if ( count > 0 ){
+                    throw new IllegalOperatorException("该产品已被个人物料库收录,不能删除");
+                }
+                //删除外键关联的匹配结果列表,不然删除product失败
+                Set<ProductMatchResult> productMatchResultSet =  product.getMatchresults();
+                productMatchResultDao.delete(productMatchResultSet);
+                if (CollectionUtils.isNotEmpty(goodses)) {
+                    goodsService.deleteGoods(goodses);
+                }
+                ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(product.getId());
+                if (productPrivate == null) {
+                    productPrivate = new ProductPrivate();
+                    productPrivate.setPrId(product.getId());
+                }
+                productPrivate.setB2cEnabled(IntegerConstant.NO_SHORT);
+                productPrivateDao.save(productPrivate);
+                //productDao.delete(id);  不允许删除
+            } else {
+                throw new
+                        IllegalOperatorException("该产品中存在已下单的在售产品信息,不能删除");
+            }
         }
     }
 
@@ -1543,8 +1594,9 @@ public class ProductServiceImpl implements ProductService {
             standard = v_productPersonDao.getCountByEnuuAndUserUUAndStatusAndEnabled(enUU, userUU, ShortConstant.YES_SHORT, IntegerConstant.YES_SHORT);
             nStandard = v_productPersonDao.getCountByEnuuAndUserUUAndStatusAndEnabled(enUU, userUU, ShortConstant.NO_SHORT, IntegerConstant.YES_SHORT);
         } else {
-            standard = productDao.getCountByEnuuAndStatusAndEnabled(enUU, ShortConstant.YES_SHORT, IntegerConstant.YES_SHORT);
-            nStandard = productDao.getCountByEnuuAndStatusAndEnabled(enUU, ShortConstant.NO_SHORT, IntegerConstant.YES_SHORT);
+            // 数据量大时,从数据库查询数量也变得很慢,所以改用查索引获取 dongbw 2018年5月28日 11:24:17
+            standard = (int) searchService.getProducts(enUU, null, 1, 10, "standard").getTotalElement();
+            nStandard = (int) searchService.getProducts(enUU, null, 1, 10, "nStandard").getTotalElement();
         }
         resultMap.put("standard", standard);
         resultMap.put("nStandard", nStandard);

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

@@ -12,25 +12,13 @@ import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.utils.NumberUtil;
 import com.uas.platform.b2c.core.utils.RegexConstant;
 import com.uas.platform.b2c.core.utils.StringUtilB2C;
-import com.uas.platform.b2c.prod.commodity.constant.DoubleConstant;
-import com.uas.platform.b2c.prod.commodity.constant.ErrorInfoConstant;
-import com.uas.platform.b2c.prod.commodity.constant.ModifyConstant;
-import com.uas.platform.b2c.prod.commodity.constant.ShortConstant;
-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.ProductDao;
-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.ReleaseProductByBatchDao;
-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.commodity.model.ProductPerson;
-import com.uas.platform.b2c.prod.commodity.model.ProductPrivate;
-import com.uas.platform.b2c.prod.commodity.model.ReleaseProductByBatch;
+import com.uas.platform.b2c.prod.commodity.constant.*;
+import com.uas.platform.b2c.prod.commodity.dao.*;
+import com.uas.platform.b2c.prod.commodity.model.*;
 import com.uas.platform.b2c.prod.commodity.service.GoodsService;
 import com.uas.platform.b2c.prod.commodity.service.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.store.model.StoreIn;
 import com.uas.platform.b2c.prod.store.model.StoreStatus;
@@ -45,11 +33,7 @@ import com.uas.platform.core.persistence.criteria.SimpleExpression;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.poi.hssf.usermodel.HSSFCell;
 import org.apache.poi.hssf.usermodel.HSSFDateUtil;
-import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.DateUtil;
-import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.usermodel.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.dao.DataAccessException;
@@ -72,16 +56,7 @@ import java.sql.SQLException;
 import java.sql.Statement;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-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.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -170,7 +145,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 				throw new IllegalOperatorException("表格模板不正确!请重新下载最新模板");
 			}
 		}
-		int rowNum = sheet.getLastRowNum();
+		int rowNum = SheetUtil.getSheetLastNum(sheet, UploadConstant.MAX_TOTAL_COLUMN);
 		if (rowNum > 2000) {
 			throw new IllegalOperatorException
 					("您上传的信息超过2000条,请拆分成2000以下再上传");
@@ -181,6 +156,8 @@ 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);
@@ -228,11 +205,15 @@ 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(),
@@ -248,12 +229,23 @@ 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");
 		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);
@@ -455,6 +447,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 		} else {
 			goods.setSelfSale("1");
 		}
+		goods.setSpec(aBatch.getSpec());
 		goods.setStatus(aBatch.getStatus());
 	}
 
@@ -480,6 +473,10 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 				rowNum, ModifyConstant.PRODUCT_CODE);
 		aProduct.setCode(StringUtilB2C.getStr(codeValue));
 
+		Object specValue = readWorkBookCell(row.getCell(ModifyConstant.PRODUCT_SPEC), Cell.CELL_TYPE_STRING,
+				rowNum, ModifyConstant.PRODUCT_SPEC);
+		aProduct.setSpec(StringUtilB2C.getStr(specValue));
+
 		Cell productCell = row.getCell(ModifyConstant.PRODUCE_DATE);
 		if (productCell != null && productCell.getCellType() == 0) {
 			if (HSSFDateUtil.isCellDateFormatted(productCell)) {
@@ -710,7 +707,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 
 			Object specCellObj = readWorkBookCell(headerRow.getCell(UploadConstant.SPECIFICATION), Cell.CELL_TYPE_STRING,
 					0, UploadConstant.SPECIFICATION);
-			if (!"规格".equals(StringUtilB2C.getStr(specCellObj))) {
+			if (!"规格(含参数、封装)".equals(StringUtilB2C.getStr(specCellObj))) {
 				throw new IllegalOperatorException("您上传的信息列信息不正确,请与模板的列做比较");
 			}
 		} else {
@@ -961,12 +958,6 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 	private int convertValueToProduct(Row row, ReleaseProductByBatch aProduct, int rowNum, boolean isAPerson) {
 		// 统计为空的个数
 		int result = 0;
-		Object codeValue = readWorkBookCell(row.getCell(UploadConstant.PRODUCT_CODE), Cell.CELL_TYPE_STRING,
-				rowNum, UploadConstant.PRODUCT_CODE);
-		if (StringUtils.isEmpty(codeValue)) {
-			result += 1;
-		}
-		aProduct.setCodeByExcel(codeValue);
 
 		Object brandValue = readWorkBookCell(row.getCell(UploadConstant.BRAND_ENGLISH), Cell.CELL_TYPE_STRING,
 				rowNum, UploadConstant.BRAND_ENGLISH);
@@ -975,6 +966,25 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 		}
 		aProduct.setBrandEnByExcel(brandValue);
 
+		Object kindValue = readWorkBookCell(row.getCell(UploadConstant.KIND), Cell.CELL_TYPE_STRING,
+				rowNum, UploadConstant.KIND);
+		if (StringUtils.isEmpty(kindValue)) {
+			result += 1;
+		}
+		aProduct.setKindByExcel(kindValue);
+
+		Object codeValue = readWorkBookCell(row.getCell(UploadConstant.PRODUCT_CODE), Cell.CELL_TYPE_STRING,
+				rowNum, UploadConstant.PRODUCT_CODE);
+		if (StringUtils.isEmpty(codeValue)) {
+			result += 1;
+		}
+		aProduct.setCodeByExcel(codeValue);
+
+
+		Object specValue = readWorkBookCell(row.getCell(UploadConstant.SPEC), Cell.CELL_TYPE_STRING,
+				rowNum, UploadConstant.SPEC);
+		aProduct.setSpecByExcel(specValue);
+
 		if (!isAPerson) {
 			Object breakValue = readWorkBookCell(row.getCell(UploadConstant.BREAK_UP), Cell.CELL_TYPE_STRING,
 					rowNum, UploadConstant.BREAK_UP);
@@ -1016,10 +1026,6 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 				setDeliveryTime(aProduct, minValue, maxValue);
 			}
 
-			Object specValue = readWorkBookCell(row.getCell(UploadConstant.SPEC), Cell.CELL_TYPE_STRING,
-					rowNum, UploadConstant.SPEC);
-			aProduct.setSpecByExcel(specValue);
-
 			Object packageNumValue = readWorkBookCell(row.getCell(UploadConstant.PACKAGE_NUMBER), Cell.CELL_TYPE_STRING,
 					rowNum, UploadConstant.PACKAGE_NUMBER);
 			aProduct.setMinPackageByExcel(packageNumValue);

+ 44 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/util/SheetUtil.java

@@ -0,0 +1,44 @@
+package com.uas.platform.b2c.prod.commodity.util;
+
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+
+/**
+ * 表格的工具类
+ *
+ * @author yuj 2018-05-30 20:36
+ */
+public class SheetUtil {
+
+    /**
+     *
+     * @param sheet 表格信息
+     * @param i 前多少列不能为空
+     * @return 存在多少有效的行数
+     */
+    public static int getSheetLastNum(Sheet sheet, int i) {
+        if (sheet == null) {
+            return 0;
+        } else {
+            int lastRowNum = sheet.getLastRowNum();
+            Boolean flag = true;
+            while (flag) {
+                Row row = sheet.getRow(lastRowNum);
+                if (row != null) {
+                    for (int j = 0; j <= i; j++) {
+                        Cell cell = row.getCell(j);
+                        if ((cell != null) && (cell.getCellType() != Cell.CELL_TYPE_BLANK)) {
+                            flag = false;
+                            break;
+                        }
+                    }
+                }
+                if (flag) {
+                    --lastRowNum;
+                }
+            }
+            return lastRowNum;
+        }
+    }
+}

+ 15 - 1
src/main/java/com/uas/platform/b2c/prod/product/common/CommonTask.java

@@ -2,9 +2,11 @@ package com.uas.platform.b2c.prod.product.common;
 
 import com.uas.platform.b2c.prod.product.common.dao.CommonCountDao;
 import com.uas.platform.b2c.prod.product.common.model.CommonCount;
+import com.uas.platform.core.util.HttpUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
 
 import java.util.List;
 
@@ -29,7 +31,19 @@ public class CommonTask {
     public void updateCount() {
         List<CommonCount> commonCounts = commonCountDao.findByStatus((short) 1);
         for (CommonCount commonCount : commonCounts) {
-            commonCount.setCount(jdbcTemplate.queryForObject(commonCount.getSql(), Double.class));
+            // 通过HTTP接口获取数据
+            if (CommonCount.SourceType.HTTP.equals(commonCount.getSourceType())) {
+                try {
+                    String responseText = HttpUtil.sendGetRequest(commonCount.getSql(), null).getResponseText();
+                    if (!StringUtils.isEmpty(responseText)) {
+                        commonCount.setCount(Double.parseDouble(responseText));
+                    }
+                } catch (Exception e) {
+                }
+            } else {
+                // 默认,通过执行SQL语句获取数据结果
+                commonCount.setCount(jdbcTemplate.queryForObject(commonCount.getSql(), Double.class));
+            }
         }
         commonCountDao.save(commonCounts);
     }

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

@@ -3,7 +3,6 @@ package com.uas.platform.b2c.prod.product.common.api;
 import com.uas.platform.b2c.prod.product.common.model.CommonCount;
 import com.uas.platform.b2c.prod.product.common.service.CommonCountService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.repository.query.Param;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -30,7 +29,7 @@ public class CommonCountController {
      * @return
      */
     @RequestMapping(method = RequestMethod.GET, params = "_status=actived")
-    public List<CommonCount> findActived(@Param("userFor") String usedFor) {
+    public List<CommonCount> findActived(String usedFor) {
         usedFor = StringUtils.isEmpty(usedFor) ? "b2c_index" : usedFor;
         return commonCountService.findByStatus((short) 1, usedFor);
     }

+ 31 - 0
src/main/java/com/uas/platform/b2c/prod/product/common/model/CommonCount.java

@@ -1,5 +1,7 @@
 package com.uas.platform.b2c.prod.product.common.model;
 
+import com.alibaba.fastjson.annotation.JSONField;
+
 import javax.persistence.*;
 import java.io.Serializable;
 
@@ -39,6 +41,7 @@ public class CommonCount implements Serializable{
     /**
      * 执行sql语句
      */
+    @JSONField(serialize = false)
     @Column(name = "cc_sql", length = 4000)
     private String sql;
 
@@ -54,9 +57,17 @@ public class CommonCount implements Serializable{
     @Column(name = "cc_usedfor")
     private String usedFor;
 
+    /**
+     * 数据来源
+     */
+    @JSONField(serialize = false)
+    @Column(name = "cc_sourcetype")
+    private String sourceType;
+
     /**
      * 状态,是否激活(1:是;0:否)
      */
+    @JSONField(serialize = false)
     @Column(name = "cc_status")
     private Short status = 0;
 
@@ -115,4 +126,24 @@ public class CommonCount implements Serializable{
     public void setStatus(Short status) {
         this.status = status;
     }
+
+    public String getSourceType() {
+        return sourceType;
+    }
+
+    public void setSourceType(String sourceType) {
+        this.sourceType = sourceType;
+    }
+
+    public class SourceType {
+        /**
+         * SQL 通过SQL语句来执行获取结果
+         */
+        public static final String SQL = "SQL";
+        /**
+         * HTTP 通过HTTP接口来获取数据结果
+         */
+        public static final String HTTP = "HTTP";
+
+    }
 }

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

@@ -20,9 +20,6 @@ public class CommonCountServiceImpl implements CommonCountService{
     @Override
     public List<CommonCount> findByStatus(Short status, String usedFor) {
         List<CommonCount> commonCounts = commonCountDao.findByStatusAndUsedForOrderByDetno(status, usedFor);
-        for (CommonCount commonCount : commonCounts) {
-            commonCount.setSql(null);
-        }
         return commonCounts;
     }
 

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

@@ -163,4 +163,15 @@ public class StoreInController {
 	public List<StoreIn> findFiveStoreByType(@RequestParam("types") String types, @RequestParam("num") Integer num){
 		return storeService.findFiveStores(types, num);
 	}
+
+	/**
+	 * 通过型号、品牌、类目、店铺名称模糊搜索店铺信息(分页)
+	 * @param keyword 关键词
+	 * @param params 分页参数
+	 * @return
+	 */
+	@RequestMapping(value = "/stores", method = RequestMethod.GET, params = "op=similar")
+	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);
+	}
 }

+ 14 - 0
src/main/java/com/uas/platform/b2c/prod/store/model/EnterpriseSimple.java

@@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonInclude;
 import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.platform.b2c.fa.payment.utils.StringUtils;
 
+import javax.persistence.Column;
 import java.util.Date;
 
 /**
@@ -93,6 +94,19 @@ public class EnterpriseSimple {
 	 */
 	private Date enDate;
 
+	/**
+	 * 企业简介
+	 */
+	private String description;
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
 	public EnterpriseSimple() {
 	}
 

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

@@ -2,6 +2,8 @@ package com.uas.platform.b2c.prod.store.model;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonInclude;
+import com.uas.platform.b2c.common.account.model.Enterprise;
+import com.uas.platform.b2c.common.account.model.UserBaseInfo;
 import com.uas.platform.b2c.core.utils.JacksonUtils;
 import com.uas.platform.b2c.prod.commodity.model.Goods;
 import org.springframework.util.StringUtils;
@@ -119,6 +121,10 @@ public class StoreIn implements Serializable {
 	@Column(name = "st_enuu")
 	private Long enUU;
 
+	@OneToOne(cascade = { CascadeType.REFRESH })
+	@JoinColumn(name = "st_enuu", insertable = false, updatable = false)
+	private Enterprise enterpriseInfo;
+
 	/**
 	 * 企业信息JSON
 	 */
@@ -174,6 +180,14 @@ public class StoreIn implements Serializable {
 	@Transient
 	private List<Goods> goodses;
 
+	public Enterprise getEnterpriseInfo() {
+		return enterpriseInfo;
+	}
+
+	public void setEnterpriseInfo(Enterprise enterpriseInfo) {
+		this.enterpriseInfo = enterpriseInfo;
+	}
+
 	public StoreIn() {
 	}
 
@@ -291,7 +305,11 @@ public class StoreIn implements Serializable {
 
 	public EnterpriseSimple getEnterprise() {
 		try {
-			return StringUtils.hasText(this.enterpriseJson) ? JacksonUtils.fromJson(this.enterpriseJson, EnterpriseSimple.class) : null;
+			this.enterprise = StringUtils.hasText(this.enterpriseJson) ? JacksonUtils.fromJson(this.enterpriseJson, EnterpriseSimple.class) : null;
+			if (!StringUtils.isEmpty(this.enterpriseInfo)) {
+				this.enterprise.setDescription(this.enterpriseInfo.getDescription());
+			}
+			return this.enterprise;
 		} catch (Exception e) {
 			e.printStackTrace();
 			return new EnterpriseSimple();

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

@@ -9,6 +9,7 @@ import com.uas.platform.b2c.prod.store.model.StoreStatus;
 import com.uas.platform.b2c.prod.store.model.StoreType;
 import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -139,7 +140,6 @@ public interface StoreInService {
 	 */
 	List<StoreIn> findFiveStores(String types, Integer num);
 
-
 	/**
 	 * 获取企业的店铺信息
 	 * @return
@@ -200,5 +200,13 @@ public interface StoreInService {
 	 */
 	Set<Qualification> getQualificationsSort();
 
-
+	/**
+	 * 通过型号、品牌、类目、店铺名称模糊搜索店铺信息(分页)
+	 * @param params 分页参数
+	 * @param keyword 关键字
+	 * @param request requset
+	 * @param feild 类型
+	 * @return
+	 */
+	Page<StoreIn> findBySimilarName(PageParams params, String keyword, String type, String feild, HttpServletRequest request);
 }

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

@@ -10,6 +10,7 @@ import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.common.account.service.EnterpriseService;
 import com.uas.platform.b2c.common.search.dao.SearchHistoryDao;
 import com.uas.platform.b2c.common.search.model.SearchHistory;
+import com.uas.platform.b2c.common.search.service.SearcherService;
 import com.uas.platform.b2c.core.config.SysConf;
 import com.uas.platform.b2c.core.constant.Type;
 import com.uas.platform.b2c.core.support.SystemSession;
@@ -18,6 +19,7 @@ import com.uas.platform.b2c.core.utils.UuidUtils;
 import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
 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;
 import com.uas.platform.b2c.prod.store.dao.QualificationDao;
 import com.uas.platform.b2c.prod.store.dao.StoreApplyDao;
 import com.uas.platform.b2c.prod.store.dao.StoreBrandInfoDao;
@@ -36,6 +38,8 @@ import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.exception.IllegalStatusException;
 import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
+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.util.ArrayList;
@@ -66,6 +70,7 @@ import org.springframework.mobile.device.DeviceResolver;
 import org.springframework.mobile.device.LiteDeviceResolver;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.ui.ModelMap;
 import org.springframework.util.StringUtils;
 
 /**
@@ -102,8 +107,10 @@ public class StoreInServiceImpl implements StoreInService {
 
 	private final DeviceResolver deviceResolver = new LiteDeviceResolver();
 
+	private final SearcherService searcherService;
+
 	@Autowired
-	public StoreInServiceImpl(StoreInDao storeDao, QualificationDao qualificationDao, GoodsDao goodsDao, ComponentDao componentDao, PurchaseDao purchaseDao, StoreBrandInfoDao brandInfoDao, StoreAdsService adsService, SysConf sysConf, EnterpriseService enterpriseService, SearchHistoryDao searchHistoryDao) {
+	public StoreInServiceImpl(StoreInDao storeDao, QualificationDao qualificationDao, GoodsDao goodsDao, ComponentDao componentDao, PurchaseDao purchaseDao, StoreBrandInfoDao brandInfoDao, StoreAdsService adsService, SysConf sysConf, EnterpriseService enterpriseService, SearchHistoryDao searchHistoryDao, SearcherService searcherService) {
 		this.storeDao = storeDao;
 		this.qualificationDao = qualificationDao;
 		this.goodsDao = goodsDao;
@@ -114,6 +121,7 @@ public class StoreInServiceImpl implements StoreInService {
 		this.sysConf = sysConf;
 		this.enterpriseService = enterpriseService;
 		this.searchHistoryDao = searchHistoryDao;
+		this.searcherService = searcherService;
 	}
 
 	@Override
@@ -695,4 +703,67 @@ public class StoreInServiceImpl implements StoreInService {
 		}
 		return map;
 	}
+
+	@Override
+	public Page<StoreIn> findBySimilarName(PageParams params, String keyword, String type, String field, HttpServletRequest request) {
+		LogicalExpression typeLogicalEx = null;
+		LogicalExpression keywordLogicalEx = null;
+		SimpleExpression nameSimpleEx = null;
+		final PageInfo pageInfo = new PageInfo(params);
+
+		// 搜索店铺类型
+		if (!StringUtils.isEmpty(type)) {
+			Set<StoreType> typeSet = getTypesFromString(type);
+			typeLogicalEx = PredicateUtils.in("type", typeSet.toArray(new StoreType[]{}), true);
+		}
+		// 搜索店铺名称
+		if (!StringUtils.isEmpty(keyword)) {
+            if ("similar".equals(field)) {
+                // 搜索器件、品牌、类目
+                PageParams pageParams = new PageParams();
+                pageParams.setCount(20);
+                pageParams.setPage(1);
+
+                ModelMap map = searcherService.searchComponentGoods(keyword, pageParams, request);
+                List<ComponentGoods> components = (List<ComponentGoods>) map.get("components");
+                Set<String> storeIds = new HashSet<>();
+                for (ComponentGoods componentGood : components) {
+                    if (componentGood.getStoreId() != null) {
+                        storeIds.add(componentGood.getStoreId());
+                    }
+                }
+
+                if (CollectionUtils.isEmpty(storeIds)) {
+                    storeIds.add("");
+                }
+				keywordLogicalEx = PredicateUtils.in("uuid", storeIds, true);
+            } else {
+                nameSimpleEx = PredicateUtils.like("storeName", keyword, true);
+            }
+
+			if (nameSimpleEx != null) {
+				if (typeLogicalEx != null) {
+					pageInfo.expression(PredicateUtils.and(nameSimpleEx, typeLogicalEx));
+				} else {
+					pageInfo.expression(nameSimpleEx);
+				}
+			} else if (typeLogicalEx != null) {
+				pageInfo.expression(PredicateUtils.and(keywordLogicalEx, typeLogicalEx));
+			} else {
+				pageInfo.expression(keywordLogicalEx);
+			}
+		} else if (typeLogicalEx != null) {
+			pageInfo.expression(typeLogicalEx);
+		}
+
+
+
+		return storeDao.findAll(new Specification<StoreIn>() {
+			@Override
+			public Predicate toPredicate(Root<StoreIn> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
+				criteriaQuery.where(pageInfo.getPredicates(root, criteriaQuery, criteriaBuilder));
+				return null;
+			}
+		}, pageInfo);
+	}
 }

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

@@ -1,10 +1,5 @@
 package com.uas.platform.b2c.trade.order.service.impl;
 
-import static com.uas.platform.b2c.trade.aftersale.model.AfterSaleStatus.BUYER_TO_MALL;
-import static com.uas.platform.b2c.trade.aftersale.model.AfterSaleStatus.MALL_TO_SUP;
-import static com.uas.platform.b2c.trade.aftersale.model.AfterSaleStatus.SUP_TO_MALL;
-import static com.uas.platform.b2c.trade.util.Preconditions.checkNotNull;
-
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.uas.api.b2c_erp.buyer.model.B2cOrder;
@@ -39,12 +34,7 @@ import com.uas.platform.b2c.logistics.dao.AddressDao;
 import com.uas.platform.b2c.logistics.dao.InvoiceFOrderDao;
 import com.uas.platform.b2c.logistics.dao.InvoiceFPurchaseDao;
 import com.uas.platform.b2c.logistics.dao.PickUpAddressDao;
-import com.uas.platform.b2c.logistics.model.Address;
-import com.uas.platform.b2c.logistics.model.InvoiceFOrder;
-import com.uas.platform.b2c.logistics.model.InvoiceFOrderDetail;
-import com.uas.platform.b2c.logistics.model.InvoiceFPurchase;
-import com.uas.platform.b2c.logistics.model.InvoiceFPurchaseDetail;
-import com.uas.platform.b2c.logistics.model.PickUpAddress;
+import com.uas.platform.b2c.logistics.model.*;
 import com.uas.platform.b2c.logistics.service.InvoiceFPurchaseService;
 import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
 import com.uas.platform.b2c.prod.commodity.dao.GoodsHistoryDao;
@@ -69,14 +59,7 @@ import com.uas.platform.b2c.trade.order.dao.OrderDao;
 import com.uas.platform.b2c.trade.order.dao.OrderDetailDao;
 import com.uas.platform.b2c.trade.order.dao.OrderIndexDetailDao;
 import com.uas.platform.b2c.trade.order.dao.PurchaseDao;
-import com.uas.platform.b2c.trade.order.model.Order;
-import com.uas.platform.b2c.trade.order.model.OrderDetail;
-import com.uas.platform.b2c.trade.order.model.OrderIndex;
-import com.uas.platform.b2c.trade.order.model.OrderIndexDetail;
-import com.uas.platform.b2c.trade.order.model.OrderSimpleInfo;
-import com.uas.platform.b2c.trade.order.model.Purchase;
-import com.uas.platform.b2c.trade.order.model.PurchaseDetail;
-import com.uas.platform.b2c.trade.order.model.TradeProofing;
+import com.uas.platform.b2c.trade.order.model.*;
 import com.uas.platform.b2c.trade.order.service.OrderDetailService;
 import com.uas.platform.b2c.trade.order.service.OrderService;
 import com.uas.platform.b2c.trade.order.service.PurchaseService;
@@ -106,22 +89,6 @@ import com.uas.platform.core.util.serializer.FlexJsonUtils;
 import com.uas.search.model.BaseOrder;
 import com.uas.search.model.PageParams;
 import com.uas.search.model.SPage;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
 import org.apache.commons.collections.map.HashedMap;
 import org.apache.commons.lang.time.DateUtils;
 import org.springframework.beans.BeanUtils;
@@ -135,6 +102,15 @@ 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.*;
+
+import static com.uas.platform.b2c.trade.aftersale.model.AfterSaleStatus.*;
+import static com.uas.platform.b2c.trade.util.Preconditions.checkNotNull;
+
 /**
  * 订单业务实现类
  *
@@ -1406,8 +1382,15 @@ public class OrderServiceImpl implements OrderService {
             throw new IllegalOperatorException("此订单不存在,请重新确认订单信息");
 
         // 分期付款目前只支持直接付款给卖家
-        if (order.getInstallmentId() != null)
-            throw new IllegalOperatorException("此订单为直接付款给卖家,平台不可确认收款,请重新确认订单信息");
+        if (order.getInstallmentId() != null) {
+            Installment installment = installmentDao.findOne(order.getInstallmentId());
+            if (installment != null) {
+                if(installment.getStatus() != Status.TOBEPAID.value()) {
+                    throw new IllegalOperatorException("此订单为直接付款给卖家,平台不可确认收款,请重新确认订单信息");
+                }
+            }
+        }
+
 
         if (order.getStatus().intValue() != Status.PAID.value()
                 && order.getStatus().intValue() != Status.TOBEPAID.value()) {

+ 12 - 0
src/main/java/com/uas/platform/b2c/trade/presale/controller/CollectionController.java

@@ -7,6 +7,7 @@ import com.uas.platform.b2c.prod.product.component.modal.ComponentInfo;
 import com.uas.platform.b2c.trade.presale.model.Collection;
 import com.uas.platform.b2c.trade.presale.model.CollectionInfo;
 import com.uas.platform.b2c.trade.presale.service.CollectionService;
+import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.PageParams;
 import com.uas.platform.core.model.Type;
@@ -84,6 +85,17 @@ public class CollectionController {
 		return collectionService.getPageStore(info);
 	}
 
+	/**
+	 * 2016年3月24日 上午11:22:22 获取个人收藏器件个数
+	 *
+	 * @return  ResultMap 返回收藏数量
+	 */
+	@RequestMapping(value = "/count", method = RequestMethod.GET, params = "type=component")
+	@ApiOperation(value = "器件收藏数量", httpMethod = "GET")
+	public ResultMap getStoreCountByuseruuAndComponent() {
+		return collectionService.getStoreCountByuseruuAndComponent(Collection.kindType.COMPONENT.getCode());
+	}
+
 	/**
 	 * 删除指定的搜藏信息
 	 *

+ 12 - 0
src/main/java/com/uas/platform/b2c/trade/presale/controller/StoreFocusController.java

@@ -3,6 +3,7 @@ package com.uas.platform.b2c.trade.presale.controller;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.trade.presale.model.StoreFocus;
 import com.uas.platform.b2c.trade.presale.service.StoreFocusService;
+import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.PageParams;
 import com.wordnik.swagger.annotations.ApiOperation;
@@ -50,6 +51,17 @@ public class StoreFocusController {
 		return storeFocusService.getByUseruuAndEnuu();
 	}
 
+	/**
+	 * 查询指定uu号下的店铺关注统计信息
+	 *
+	 * @return ResultMap
+	 */
+	@RequestMapping(value = "/count", method = RequestMethod.GET)
+	@ApiOperation(value = "查询指定uu号下的所有店铺关注记录", httpMethod = "GET")
+	public ResultMap getStoreFocusCountByUseruuAndEnuu() {
+		return storeFocusService.getStoreFocusCountByUseruuAndEnuu();
+	}
+
 	/**
 	 * 单个/批量删除店铺关注记录
 	 * 

+ 21 - 0
src/main/java/com/uas/platform/b2c/trade/presale/dao/CollectionDao.java

@@ -96,4 +96,25 @@ public interface CollectionDao extends JpaRepository<Collection, Long>, JpaSpeci
 	 * @return
 	 */
 	List<Collection> findStoreByUseruuAndDissociativeAndKindAndComponentid(Long useruu, Integer dissociative, int kind, Long componentid);
+
+	/**
+	 * 根据useruu,enuu, 获取指定类型的总计数量
+	 * @param useruu 个人uu
+	 * @param enuu 企业uu
+	 * @param kind 类型
+	 * @return
+	 */
+	@Query(value = "select count(*) from Collection c where c.useruu =:useruu and c.enuu =:enuu and c.kind =:kind")
+	Integer findStoreCountByUseruuAndEnuuAndKind(@Param("useruu") Long useruu, @Param("enuu") Long enuu, @Param("kind") int kind);
+
+
+	/**
+	 * 根据useruu,enuu, 获取指定类型的总计数量
+	 * @param useruu 个人uu
+	 * @param dissociative 企业uu
+	 * @param kind 类型
+	 * @return
+	 */
+	@Query(value = "select count(*) from Collection c where c.useruu =:useruu and c.dissociative =:dissociative and c.kind =:kind")
+	Integer findStoreCountByUseruuAndDissociativeAndKind(@Param("useruu") Long useruu, @Param("dissociative") Integer dissociative, @Param("kind") int kind);
 }

+ 41 - 1
src/main/java/com/uas/platform/b2c/trade/presale/dao/StoreFocusDao.java

@@ -3,7 +3,7 @@ package com.uas.platform.b2c.trade.presale.dao;
 import com.uas.platform.b2c.trade.presale.model.StoreFocus;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
-import org.springframework.data.mongodb.repository.Query;
+import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
@@ -25,6 +25,46 @@ public interface StoreFocusDao extends JpaSpecificationExecutor<StoreFocus>, Jpa
 	 */
 	List<StoreFocus> findStoreFocusByUseruuAndEnuu(Long useruu, Long enuu);
 
+	/**
+	 * 根据个人的uu号和enuu号查找所有记录
+	 *
+	 * @param useruu 个人uu
+	 * @param enuu 企业enuu
+	 * @return List<StoreFocus> 返回店铺关注列表
+	 */
+	@Query(value = "select s from StoreFocus s where s.useruu =:useruu and s.enuu =:enuu and s.dissociative =:dissociative")
+	List<StoreFocus> findStoreFocusByUseruuAndEnuuAndDissociative(@Param("useruu") Long useruu, @Param("enuu")Long enuu, @Param("dissociative")Integer dissociative);
+
+	/**
+	 * 根据个人的uu号和是否是游离类型查找所有记录
+	 *
+	 * @param useruu 个人uu
+	 *
+	 * @return List<StoreFocus> 返回店铺关注列表
+	 */
+	@Query(value = "select s from StoreFocus s where s.useruu =:useruu and s.dissociative =:dissociative")
+	List<StoreFocus> findStoreFocusByUseruuAndDissociative(@Param("useruu")Long useruu, @Param("dissociative")Integer dissociative);
+
+	/**
+	 * 根据个人的uu号和enuu号查找所有记录
+	 *
+	 * @param useruu 个人uu
+	 * @param dissociative dissociative 游离的信息
+	 * @return List<StoreFocus> 返回店铺关注列表
+	 */
+	@Query(value = "select count(s) from StoreFocus s where s.useruu =:useruu and s.dissociative =:dissociative")
+	Integer findStoreFocusCountByUseruuAndDissociative(@Param("useruu")Long useruu, @Param("dissociative")Integer dissociative);
+
+	/**
+	 * 根据个人的uu号和enuu号查找所有记录
+	 *
+	 * @param useruu 个人uu
+	 * @param enuu 企业enuu
+	 * @return List<StoreFocus> 返回店铺关注列表
+	 */
+	@Query(value = "select count(s) from StoreFocus s where s.useruu =:useruu and s.dissociative =:dissociative and s.enuu =:enuu")
+	Integer findStoreFocusCountByUseruuAndEnuuAndDissociative(@Param("useruu") Long useruu, @Param("enuu") Long enuu, @Param("dissociative") Integer dissociative);
+
 	/**
 	 * 根据个人的uu号、enuu号、storeid查找记录
 	 *

+ 36 - 0
src/main/java/com/uas/platform/b2c/trade/presale/model/Collection.java

@@ -81,6 +81,42 @@ public class Collection implements Serializable {
 	@Column(name = "store_dissociative")
 	private Integer dissociative;
 
+	/**
+	 * 收藏类型
+	 */
+	public enum  kindType {
+
+		BRAND(1, "品牌"),
+
+		COMPONENT(2, "器件");
+
+		private int code;
+		private String phrase;
+
+		kindType(int code, String phrase) {
+			this.code = code;
+			this.phrase = phrase;
+		}
+
+		public int getCode() {
+			return code;
+		}
+
+		public kindType setCode(int code) {
+			this.code = code;
+			return this;
+		}
+
+		public String getPhrase() {
+			return phrase;
+		}
+
+		public kindType setPhrase(String phrase) {
+			this.phrase = phrase;
+			return this;
+		}
+	}
+
 	public Long getId() {
 		return id;
 	}

+ 12 - 4
src/main/java/com/uas/platform/b2c/trade/presale/service/CollectionService.java

@@ -1,12 +1,12 @@
 package com.uas.platform.b2c.trade.presale.service;
 
-import java.util.List;
-
-import org.springframework.data.domain.Page;
-
 import com.uas.platform.b2c.trade.presale.model.Collection;
 import com.uas.platform.b2c.trade.presale.model.CollectionInfo;
+import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.model.PageInfo;
+import org.springframework.data.domain.Page;
+
+import java.util.List;
 
 /**
  * @author yujia
@@ -89,4 +89,12 @@ public interface CollectionService {
 	 * @return Page<Collection> 返回collection的分页对象
 	 */
 	Page<Collection> getPageStore(PageInfo info);
+
+	/**
+	 * 2016年3月24日 上午11:22:22 获取个人收藏器件个数
+	 *
+	 * @param kind  收藏的类型  1 代表品牌  2 代表器件
+	 * @return  ResultMap 返回收藏数量
+	 */
+	ResultMap getStoreCountByuseruuAndComponent(int kind);
 }

+ 11 - 4
src/main/java/com/uas/platform/b2c/trade/presale/service/StoreFocusService.java

@@ -1,11 +1,11 @@
 package com.uas.platform.b2c.trade.presale.service;
 
-import java.util.List;
-
-import org.springframework.data.domain.Page;
-
 import com.uas.platform.b2c.trade.presale.model.StoreFocus;
+import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.model.PageInfo;
+import org.springframework.data.domain.Page;
+
+import java.util.List;
 
 /**
  * @version 2017年8月3日09:08:12 hulh 添加注释
@@ -27,6 +27,13 @@ public interface StoreFocusService {
 	 */
 	List<StoreFocus> getByUseruuAndEnuu();
 
+	/**
+	 * 查询指定uu号下的店铺关注统计信息
+	 *
+	 * @return ResultMap
+	 */
+	ResultMap getStoreFocusCountByUseruuAndEnuu();
+
 	/**
 	 * 单个/批量删除店铺关注记录
 	 * 

+ 18 - 0
src/main/java/com/uas/platform/b2c/trade/presale/service/impl/CollectionServiceImpl.java

@@ -1,11 +1,13 @@
 package com.uas.platform.b2c.trade.presale.service.impl;
 
+import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.trade.presale.dao.CollectionDao;
 import com.uas.platform.b2c.trade.presale.dao.CollectionInfoDao;
 import com.uas.platform.b2c.trade.presale.model.Collection;
 import com.uas.platform.b2c.trade.presale.model.CollectionInfo;
 import com.uas.platform.b2c.trade.presale.service.CollectionService;
+import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.Type;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -170,4 +172,20 @@ public class CollectionServiceImpl implements CollectionService {
 		return collectionDao.findStoreByUseruuAndKind(useruu, kind);
 	}
 
+	/**
+	 * 2016年3月24日 上午11:22:22 获取个人收藏器件个数
+	 * @param kind 收藏的类型  1 代表品牌  2 代表器件
+	 * @return ResultMap 返回收藏数量
+	 */
+	@Override
+	public ResultMap getStoreCountByuseruuAndComponent(int kind) {
+		Integer count = 0;
+		User user = SystemSession.getUser();
+		if (user.getEnterprise() != null) {
+			count = collectionDao.findStoreCountByUseruuAndEnuuAndKind(user.getUserUU(), user.getEnterprise().getUu(), kind);
+		} else {
+			count = collectionDao.findStoreCountByUseruuAndDissociativeAndKind(user.getUserUU(), Type.PERSONAL.value(), kind);
+		}
+		return ResultMap.success(count);
+	}
 }

+ 27 - 3
src/main/java/com/uas/platform/b2c/trade/presale/service/impl/StoreFocusServiceImpl.java

@@ -1,9 +1,11 @@
 package com.uas.platform.b2c.trade.presale.service.impl;
 
+import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.trade.presale.dao.StoreFocusDao;
 import com.uas.platform.b2c.trade.presale.model.StoreFocus;
 import com.uas.platform.b2c.trade.presale.service.StoreFocusService;
+import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.Type;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -47,9 +49,31 @@ public class StoreFocusServiceImpl implements StoreFocusService {
 
 	@Override
 	public List<StoreFocus> getByUseruuAndEnuu() {
-		List<StoreFocus> list = storeFocusDao.findStoreFocusByUseruuAndEnuu(SystemSession.getUser().getUserUU(),
-				SystemSession.getUser().getEnterprise().getUu());
-		return list;
+		List<StoreFocus> storeFocuses = null;
+		User user = SystemSession.getUser();
+		if (user.getEnterprise().getUu() != null) {
+			storeFocuses = storeFocusDao.findStoreFocusByUseruuAndEnuuAndDissociative(user.getUserUU(), user.getEnterprise().getUu(), Type.ENTERPRISING.value());
+		} else {
+			storeFocuses = storeFocusDao.findStoreFocusByUseruuAndDissociative(user.getUserUU(), Type.PERSONAL.value());
+		}
+		return storeFocuses;
+	}
+
+	/**
+	 * 查询指定uu号下的店铺关注统计信息
+	 *
+	 * @return ResultMap
+	 */
+	@Override
+	public ResultMap getStoreFocusCountByUseruuAndEnuu() {
+		Integer count = null;
+		User user = SystemSession.getUser();
+		if (user.getEnterprise() != null) {
+			count = storeFocusDao.findStoreFocusCountByUseruuAndEnuuAndDissociative(user.getUserUU(), user.getEnterprise().getUu(), Type.ENTERPRISING.value());
+		} else {
+			count = storeFocusDao.findStoreFocusCountByUseruuAndDissociative(user.getUserUU(), Type.PERSONAL.value());
+		}
+		return ResultMap.success(count);
 	}
 
 	@Override

+ 4 - 3
src/main/java/com/uas/platform/b2c/trade/vendor/controller/VendorIntroductionController.java

@@ -34,16 +34,17 @@ public class VendorIntroductionController {
 
 
     /**
-     * 根据关键词(非必填)获取供应商资源列表
+     * 根据关键词(非必填)精确匹配来获取供应商资源列表
      *
      * @param size  the params 一页的大小
 	 * @param page 第几页
      * @param keyword the keyword  搜索关键字
+	 * @param field 字段   kind  类目 cmpCode 型号  brand 品牌
      * @return the Page<VendorIntroduction> 返回一页的数据
      */
     @RequestMapping(value = "/vendor/list", method = RequestMethod.GET)
-	public Page<VendorIntroduction> getVendorIntroductionList(int page, int size, String keyword) {
-		return vendorIntroductionService.getVendorIntroduction(page, size, keyword);
+	public Page<VendorIntroduction> getVendorIntroductionList(int page, int size, String keyword, String field) {
+		return vendorIntroductionService.getVendorIntroduction(page, size, keyword, field);
 	}
 
 	/**

+ 8 - 6
src/main/java/com/uas/platform/b2c/trade/vendor/service/VendorIntroductionService.java

@@ -12,13 +12,15 @@ public interface VendorIntroductionService {
 
 
     /**
-     * 获取供应商资源列表
-     * @param page 页码
-     * @param size 每页大小
-     * @param keyword  关键词
-     * @return 供应商资源page
+     * 根据关键词(非必填)精确匹配来获取供应商资源列表
+     *
+     * @param size  the params 一页的大小
+     * @param page 第几页
+     * @param keyword the keyword  搜索关键字
+     * @param field 字段   kind  类目 cmpCode 型号  brand 品牌
+     * @return the Page<VendorIntroduction> 返回一页的数据
      */
-    Page<VendorIntroduction> getVendorIntroduction(int page, int size, String keyword);
+    Page<VendorIntroduction> getVendorIntroduction(int page, int size, String keyword, String field);
 
     /**
      * 根据vendUU获取企业物料列表

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

@@ -154,6 +154,7 @@ public class InviteVendorHistoryServiceImpl implements InviteVendorHistoryServic
                 model.setType(INVITATION_TYPE);
                 model.setProducerApp(PRODUCERAPP);
                 model.setConsumerType(CUST_TYPE);;
+                model.setConsumerType(CUST_TYPE);
                 model.setConsumerApp(CONSUMERAPP);
                 model.setContent(content);
                 model.setReceiverEnuu(enterprise.getUu());

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

@@ -1,12 +1,15 @@
 package com.uas.platform.b2c.trade.vendor.service.impl;
 
 import com.uas.platform.b2c.common.base.dao.CommonDao;
+import com.uas.platform.b2c.common.search.rpc.service.SearchService;
+import com.uas.platform.b2c.common.search.util.SPage;
 import com.uas.platform.b2c.core.constant.IntegerConstant;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.prod.commodity.dao.V_ProductPrivateDao;
 import com.uas.platform.b2c.prod.commodity.model.V_ProductPrivate;
 import com.uas.platform.b2c.trade.vendor.model.VendorIntroduction;
 import com.uas.platform.b2c.trade.vendor.service.VendorIntroductionService;
+import com.uas.ps.core.util.CollectionUtils;
 import com.uas.sso.support.Page;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -27,29 +30,76 @@ public class VendorIntroductionServiceImpl implements VendorIntroductionService
 	@Autowired
 	private V_ProductPrivateDao v_productPrivateDao;
 
+	@Autowired
+	private SearchService searchService;
+
 	/**
-	 * 获取供应商资源列表
-	 * @param page    页码
-	 * @param size    每页大小
-	 * @param keyword 关键词
-	 * @return 供应商资源page
-     * @version 2018年5月15日 11:53:06 增加限制,要求营业执照号长度大于12才显示
+	 * 类目
+	 */
+	private static final String KIND_EQUAL = "kind";
+
+	/**
+	 * 型号
+	 */
+	private static final String PCMPCODE_EQUAL = "pCmpCode";
+
+	/**
+	 * 品牌
+	 */
+	private static final String PBRANDEN_EQUAL = "pBrandEn";
+
+	/**
+	 * 根据关键词(非必填)精确匹配来获取供应商资源列表
+	 *
+	 * @param size  the params 一页的大小
+	 * @param page 第几页
+	 * @param keyword the keyword  搜索关键字
+	 * @param field 字段   kind  类目 cmpCode 型号  brand 品牌
+	 * @return the Page<VendorIntroduction> 返回一页的数据
 	 */
 	@Override
-	public Page<VendorIntroduction> getVendorIntroduction(int page, int size, String keyword) {
+	public Page<VendorIntroduction> getVendorIntroduction(int page, int size, String keyword, String field) {
 		long start = System.currentTimeMillis();
+		String enterpriseCondition = " 1=1 ";
+		String productCondition = "";
+		// 拼接查询条件
 		if (!StringUtils.isEmpty(keyword)) {
             keyword = keyword.trim();
+            if (!StringUtils.isEmpty(field)) {
+            	switch (field) {
+					case KIND_EQUAL :
+						productCondition = "pr_kind = '" + keyword + "'";
+						break;
+					case PCMPCODE_EQUAL :
+						productCondition = "pr_pcmpcode = '" + keyword + "'";
+						break;
+					case PBRANDEN_EQUAL :
+						productCondition = "pr_pbranden = '" + keyword + "'";
+						break;
+                    default :
+                        enterpriseCondition = "(en_name like '%" + keyword + "%' or en_address like '%" + keyword + "%' or en_industry like '% "
+                                + keyword + "%')";
+                        break;
+				}
+			} else {
+                enterpriseCondition = "(en_name like '%" + keyword + "%' or en_address like '%" + keyword + "%' or en_industry like '% "
+                        + keyword + "%')";
+            }
         }
         Long enUU = 0L;
         if (null != SystemSession.getUser() && null != SystemSession.getUser().getEnterprise()) {
             enUU = SystemSession.getUser().getEnterprise().getUu();
         }
 		// 查询所有企业个数
-		Integer total = getTotalCount(enUU, keyword);
+		Integer total = getTotalCount(enUU, enterpriseCondition, productCondition);
 		// 查询企业
-		List<VendorIntroduction> vendorIntroductions = getEnterpriseWithCondition(enUU, keyword, page, size);
-//		System.out.println("查找完企业UU" + (System.currentTimeMillis() - start));
+		List<VendorIntroduction> vendorIntroductions;
+		if (!StringUtils.isEmpty(productCondition)) {
+			vendorIntroductions = getEnterpriseWithProductCondition(enUU, enterpriseCondition, productCondition,  page, size);
+		} else {
+			vendorIntroductions = getEnterpriseWithoutProductCondition(enUU, enterpriseCondition,  page, size);
+		}
+		System.out.println("查找完企业UU" + (System.currentTimeMillis() - start));
 		return new Page<VendorIntroduction>(page, size, vendorIntroductions, total);
 	}
 
@@ -64,28 +114,12 @@ public class VendorIntroductionServiceImpl implements VendorIntroductionService
 	 */
 	@Override
 	public Page<V_ProductPrivate> getVendorProductList(int page, int size, Long vendUU, String keyword) {
-		String whereCondition = " 1 = 1 ";
-		if (!StringUtils.isEmpty(keyword)) {
-		    keyword = keyword.trim();
-			// 物料名称、规格、品牌、原厂型号、单位
-			whereCondition = " (pr_title like '%" + keyword + "%' or pr_spec like '%" + keyword + "%' or pr_brand like '%"
-					+ keyword + "%' or pr_cmpcode like '%" + keyword + "%' or pr_unit like '%" + keyword + "%' or pr_kind like '%"
-					+ keyword + "%') ";
+		SPage<Long> ids = searchService.getProducts(vendUU, keyword, page, size, "all");
+		if (CollectionUtils.isEmpty(ids.getContent())) {
+			return null;
 		}
-		long start = System.currentTimeMillis();
-		// and Pr_Title not like '%测试%' and lower(Pr_Title) not like '%test%' and Pr_code not like '%测试%' and lower(Pr_code) not like '%test%'
-		String prodSql = "select a.* from (select pr_id id, pr_code prodNum, pr_title prodName, pr_spec spec, pr_cmpcode cmpCode, pr_unit unit, pr_kind kind, "
-				+ " pr_brand brand, pr_pbranden pbranden, pr_standard standard from v$product$private where pr_enuu = "
-				+ vendUU + " and " + whereCondition + " and pr_pbranden is not null and pr_pcmpcode is not null and ifnull(pr_b2cenabled, 1) <> 0 order by pr_standard desc, pr_id desc) a limit " + (page - 1) * size + "," + size;
-//		System.out.println("prod:" + prodSql);
-		// and Pr_Title not like '%测试%' and lower(Pr_Title) not like '%test%' and Pr_code not like '%测试%' and lower(Pr_code) not like '%test%'
-		String countSql = "select count(1) from v$product$private where pr_enuu = " + vendUU + " and " + whereCondition
-				+ " and pr_pbranden is not null and pr_pcmpcode is not null and ifnull(pr_b2cenabled, 1) <> 0";
-		Integer count = commonDao.queryForObject(countSql, Integer.class);
-//		System.out.println("count:" + countSql);
-		List<V_ProductPrivate> products = commonDao.query(prodSql, V_ProductPrivate.class);
-//		System.out.println("耗时" + (System.currentTimeMillis() - start));
-		return new Page<>(page, size, products, count);
+		List<V_ProductPrivate> productPrivateList = v_productPrivateDao.findAll(ids.getContent());
+		return new Page<>(page, size, productPrivateList, (int) ids.getTotalElement());
 	}
 
 	/**
@@ -113,88 +147,97 @@ public class VendorIntroductionServiceImpl implements VendorIntroductionService
 	/**
 	 * 获取供应商资源信息
 	 * @param enUU 本企业UU
-	 * @param keyword 关键词
+	 * @param enterpriseCondition 企业搜索条件
+	 * @param productCondition 物料搜索条件
 	 * @param page 页码
 	 * @param size 尺寸
 	 * @return
 	 */
-	private List<VendorIntroduction> getEnterpriseWithCondition(Long enUU, String keyword, int page, int size) {
+	private List<VendorIntroduction> getEnterpriseWithProductCondition(Long enUU, String enterpriseCondition, String productCondition, int page, int size) {
+		StringBuilder enterpriseSql = new StringBuilder();
+		// 查询所有符合条件的enUU的语句,按待售物料数量排序
+		String enUUSql = getEnUUGroupByEnUUOrderByCount(enUU, enterpriseCondition, productCondition);
+		// 获取企业sql
+		enterpriseSql.append("select en.en_uu enUU, en.en_name enName, en.en_shortname enShortname, en.en_address enAddress, en.en_tel enTel, " +
+				" en.en_email enEmail, en.en_corporation enCorporation, en.en_businesscode enBusinesscode, en.en_industry enIndustry, en.en_Businessscope enBusinessScope " +
+				",st.st_uuid,st.st_status from sec$enterprises en left join store$info st on st.st_enuu = en.en_uu right join (").append(enUUSql)
+				.append(" ) a on en.en_uu = a.en_uu order by en.en_weight desc, counts desc");
+		// 查找非供应商的卖当前商品的企业UU
+		StringBuilder vendorIntroductionUusSql = new StringBuilder();
+		// 行数 控制
+		String rownumSql = ") s order by isStore desc,prodCounts desc,enUU asc limit " + (page - 1) * size + "," + size ;
+		vendorIntroductionUusSql.append("select s.*, if( st_uuid is not null and st_status = 'OPENED', 1, null) isStore");
+		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);
+	}
+
+	/**
+	 * 获取供应商资源信息
+	 * @param enUU 本企业UU
+	 * @param enterpriseCondition 企业搜索条件
+	 * @param page 页码
+	 * @param size 尺寸
+	 * @return
+	 */
+	private List<VendorIntroduction> getEnterpriseWithoutProductCondition(Long enUU, String enterpriseCondition, int page, int size) {
 		StringBuilder enterpriseSql = new StringBuilder();
-//		// 查询所有符合条件的enUU的语句,按待售物料数量排序
-//		String enUUSql = getEnUUGroupByEnUUOrderByCount(enUU, keyword);
 		// 获取企业sql
 		enterpriseSql.append("select en.en_uu enUU, en.en_name enName, en.en_shortname enShortname, en.en_address enAddress, en.en_tel enTel, " +
 				"en.en_email enEmail, en.en_corporation enCorporation, en.en_businesscode enBusinesscode, en.en_industry enIndustry, en.en_Businessscope enBusinessScope " +
-				",st.st_enuu,st.st_status from sec$enterprises en left join store$info st on st.st_enuu = en.en_uu where en_name not like '%测试%' and en_name not like '%test%' and (length(en_businesscode) > 12 or en_name like '%香港%' or en_name like '%HONG KONG%' or en_area like '%香港%') and en_uu <> ")
-			.append(enUU);
-		if (!StringUtils.isEmpty(keyword)) {
-			enterpriseSql.append(" and (en_name like '%").append(keyword).append("%' or en_address like '%").append(keyword).append("%' or en_industry like '%").append(keyword)
-			.append("%')");
-		}
+				",st.st_enuu,st.st_status from sec$enterprises en left join store$info st on st.st_enuu = en.en_uu where en_name not like '%测试%' and en_name not like '%test%' " +
+				"and (length(en_businesscode) > 12 or en_name like '%香港%' or en_name like '%HONG KONG%' or en_area like '%香港%') and " +
+				" (en_name not REGEXP '^[0-9]*$' and (en_name like '%ltd%' or en_name like '%limited%' or en_name like '%tcl%' or en_name not regexp '[\\u4e00-\\u9fa5_a-zA-Z0-9]')) and en_uu <> ")
+				.append(enUU).append(" and ").append(enterpriseCondition);
 		// rownum 控制
 		String rownumSql = ") s order by isStore desc,enUU asc limit " + (page - 1) * size + "," + size ;
-//		// 查询企业简要物料信息语句
-//		String prodInfoSql = "select wm_concat(pr_title || (case when pr_brand is not null then '(' || pr_brand || ')' else ' ' end)) from v$product$private where pr_enuu=en_uu and "
-//				+ " and pr_issale = 1 and pr_b2cenabled = 1 and rownum<5 ";
 		// 查询企业是否开店语句
-		// 查找非供应商的卖当前商品的企业UU
-		// (select 1 from v$product$private where ifnull(pr_b2cenabled, 1) = 1 and pr_issale = 1 and pr_pbranden is not null and pr_pcmpcode is not null and pr_enuu = enUU limit 0,1) hasProduct
 		String vendorIntroductionUusSql = "select s.*, if( st_enuu is not null and st_status = 'OPENED', 1, 0) isStore from ("
 				+ enterpriseSql + rownumSql;
-//		String vendorIntroductionUusSql = "select s.*,( " + prodInfoSql + ") productInfo, (" + storeSql +
-//				") isStore from (select t.*,rownum as r1 from (" + enterpriseSql + rownumSql;
-//        System.out.println("ens:" + vendorIntroductionUusSql);
 		return commonDao.query(vendorIntroductionUusSql, VendorIntroduction.class);
 	}
 
 	/**
 	 * 获取所有符合条件企业数量
 	 * @param enUU  本企业UU
-	 * @param keyword 关键词
+	 * @param enterpriseCondition 企业过滤条件
+	 * @param productCondition 物料过滤条件
 	 * @return
 	 */
-	private Integer getTotalCount(Long enUU, String keyword) {
+	private Integer getTotalCount(Long enUU, String enterpriseCondition, String productCondition) {
 		StringBuilder enCountSql = new StringBuilder();
-		// 含名称、地址、、行业、经营范围搜索 物料型号、名称
-		if (!StringUtils.isEmpty(keyword)) {
-			String keywordSql = getKeywordSql(enUU, keyword);
-			enCountSql.append("select count(1) from (").append(keywordSql);
-		} else {
-			enCountSql.append("select count(1) from (select en_uu,count(1) from sec$enterprises where en_name not like '%测试%' " +
-					" and en_name not like '%test%' and (length(en_businesscode) > 12 or en_name like '%香港%' or en_name like '%HONG KONG%' or en_area like '%香港%') and en_uu <> ").append(enUU);
+		enCountSql.append("select count(1) from (select en_uu,count(1) from (select en_uu from sec$enterprises where en_name not like '%测试%' " +
+				" and en_name not like '%test%' and (length(en_businesscode) > 12 or en_name like '%香港%' or en_name like '%HONG KONG%' " +
+				" or en_area like '%香港%')and (en_name not REGEXP '^[0-9]*$' and (en_name like '%ltd%' or en_name like '%limited%' or " +
+				" en_name like '%tcl%' or en_name not regexp '[\\u4e00-\\u9fa5_a-zA-Z0-9]') and ").append(enterpriseCondition).append(") and en_uu <> ")
+				.append(enUU).append(") e ");
+		if (!StringUtils.isEmpty(productCondition)) {
+			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());
+        System.out.println("en_count:" + enCountSql.toString());
 		return commonDao.queryForObject(enCountSql.toString(), Integer.class);
 	}
 
-	/**
-	 * 拼接关键词Sql
-	 * @param enUU
-	 * @param keyword
-	 * @return
-	 */
-	private String getKeywordSql(Long enUU, String keyword) {
-		return "select en_uu,count(1) as counts from sec$enterprises where en_name not like '%测试%' " +
-				"and lower(en_name) not like '%test%' and (length(en_businesscode) > 12 or en_name like '%香港%' or en_name like '%HONG KONG%' or en_area like '%香港%') and (en_name like '%"
-				+ keyword + "%' or en_address like '%" + keyword + "%' or en_industry like '%" + keyword
-				+ "%') and en_uu <> " + enUU;
-	}
-
 	/**
 	 * 拼接所有待售物料所属企业UU,按enUU分组,按物料数量倒序
 	 * @param enUU 当前企业UU
-	 * @param keyword 搜索关键词
+	 * @param enterpriseCondition 企业过滤条件
+	 * @param productCondition 物料匹配条件
 	 * @return
 	 */
-	private String getEnUUGroupByEnUUOrderByCount(Long enUU, String keyword) {
+	private String getEnUUGroupByEnUUOrderByCount(Long enUU, String enterpriseCondition, String productCondition) {
 		StringBuilder enUUSql = new StringBuilder();
 		// 含名称、企业执照号、地址、邮箱、电话、行业、经营范围搜索
-		if (!StringUtils.isEmpty(keyword)) {
-			enUUSql.append(getKeywordSql(enUU, keyword));
-		} else {
-			enUUSql.append("select en_uu, count(1) as counts from (select * from sec$enterprises where en_name not like '%测试%' " +
-					" and lower(en_name) not like '%test%') en where en.en_uu <> ").append(enUU);
+		enUUSql.append("select en_uu, count(1) as counts from (select en_uu from sec$enterprises where en_name not like '%测试%' " +
+				" and en_name not like '%test%' and (length(en_businesscode) > 12 or en_name like '%香港%' or en_name like '%HONG KONG%' " +
+				" or en_area like '%香港%')and (en_name not REGEXP '^[0-9]*$' and (en_name like '%ltd%' or en_name like '%limited%' or " +
+				" en_name like '%tcl%' or en_name not regexp '[\\u4e00-\\u9fa5_a-zA-Z0-9]')) and ").append(enterpriseCondition).append(" and en_uu <> ").append(enUU)
+				.append(") e");
+		if (!StringUtils.isEmpty(productCondition)) {
+			enUUSql.append(" right join ( select pr_enuu from v$product$private where ").append(productCondition).append(") p on pr_enuu = en_uu where en_uu is not null ");
 		}
 		enUUSql.append(" group by en_uu order by count(1) desc ");
 		return enUUSql.toString();

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

@@ -11,7 +11,7 @@ sso.cookie.secure=false
 sso.cookie.browser=false
 sso.login.url=http://192.168.253.6:32323
 sso.logout.url=http://192.168.253.6:32323/logquit
-sso.register.url=http://192.168.253.6:32323/register/personalRegistration
+sso.register.url=http://192.168.253.6:32323/register/enterpriseRegistration
 sso.updatePassword.url=http://192.168.253.6:32323/reset/changePasswordChooseStyle
 sso.updateMobile.url=http://192.168.253.6:32323/validation/phoneValidation
 sso.updateEmail.url=http://192.168.253.6:32323/validation/emailValidation

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

@@ -1,2 +1,2 @@
-redis.host=10.10.100.200
+redis.host=192.168.253.6
 redis.port=6379

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/releaseByBatchError-person.xls


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


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


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


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


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

@@ -10,7 +10,7 @@ sso.cookie.secure=false
 sso.cookie.browser=false
 sso.login.url=https://sso.ubtob.com
 sso.logout.url=https://sso.ubtob.com/logquit
-sso.register.url=https://sso.ubtob.com/register/personalRegistration
+sso.register.url=https://sso.ubtob.com/register/enterpriseRegistration
 sso.updatePassword.url=https://sso.ubtob.com/reset/changePasswordChooseStyle
 sso.updateMobile.url=https://sso.ubtob.com/validation/phoneValidation
 sso.updateEmail.url=https://sso.ubtob.com/validation/emailValidation

+ 2 - 2
src/main/resources/prod/message.properties

@@ -2,10 +2,10 @@ tplNotifySupplierAfterCommit=3c70dd8f-0e1e-4aec-bd7f-c360a506f35e
 plaformB2cAuditRemindTemplateId=774296f3-a260-4bb5-b4eb-6f01090dadf3
 plaformB2cBrandApprovedTemplateId=5b5effdf-5562-45f7-9021-18f21e29bec6
 plaformB2cBrandUnproveTemplateId=03b3d658-cd92-43a0-a53f-103492cfc595
-tplAfterBeAddedtoB2C=b9dee589-9fd8-45d3-9b2a-64b56d65e7e2
 plaformB2cComponentApprovedTemplateId=36812a85-d0f9-4d2a-a7aa-62319f092b6f
 plaformB2cComponentUnproveTemplateId=6228240a-93ba-405f-851c-f874a6c99864
 plaformB2cSupplyChainTemplateId=b28337ba-f115-4f11-b457-15d558443160
 inviteVendorMailTemplateId=9028790a-9fc0-4759-a2df-8c26a7f3aa9a
+tplAfterBeAddedtoB2C=b9dee589-9fd8-45d3-9b2a-64b56d65e7e2
 
-messagePublicServiceDevUrl=http://api-message.ubtob.com/message
+messagePublicServiceDevUrl=https://api-message.ubtob.com/

+ 1 - 0
src/main/resources/spring/redis.xml

@@ -9,6 +9,7 @@
 	<!-- redis 相关配置 -->
 	<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
 		<property name="maxIdle" value="300" />
+		<property name="maxTotal" value="1000" />
 		<property name="maxWaitMillis" value="3000" />
 		<property name="testOnBorrow" value="true" />
 	</bean>

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

@@ -10,7 +10,7 @@ sso.cookie.secure=false
 sso.cookie.browser=false
 sso.login.url=http://192.168.253.6:32323
 sso.logout.url=http://192.168.253.6:32323/logquit
-sso.register.url=http://192.168.253.6:32323/register/personalRegistration
+sso.register.url=http://192.168.253.6:32323/register/enterpriseRegistration
 sso.updatePassword.url=http://192.168.253.6:32323/reset/changePasswordChooseStyle
 sso.updateMobile.url=http://192.168.253.6:32323/validation/phoneValidation
 sso.updateEmail.url=http://192.168.253.6:32323/validation/emailValidation

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

@@ -1,3 +1,3 @@
-#redis.host=192.168.253.6
-redis.host=10.10.100.200
+redis.host=192.168.253.6
+#redis.host=10.10.100.200
 redis.port=6379

+ 1 - 0
src/main/webapp/WEB-INF/spring/webmvc.xml

@@ -121,6 +121,7 @@
 			<mvc:exclude-mapping path="/basic/enterprise/**/info"/>
 			<mvc:exclude-mapping path="/vendor/introduction/vendor/**" />
 			<mvc:exclude-mapping path="/vendor/introduction/product/**" />
+			<mvc:exclude-mapping path="/wx/**"/>
 			<bean class="com.uas.platform.b2c.core.filter.SSOInterceptor"></bean>
 		</mvc:interceptor>
 		<!-- 对所有的请求拦截,将Session中的User信息设置进SystemSession -->

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

@@ -634,6 +634,6 @@ div.com-tip{
     left: 0;
     right: 0;
     background: rgba(0, 0, 0, .3);
-    z-index: 1;
+    z-index: 2;
 }
 /*----------遮罩层 end-------------*/

+ 153 - 70
src/main/webapp/resources/data/profession.json

@@ -1,70 +1,153 @@
-{"IT|通信|电子|互联网":[
-  "互联网/电子商务",
-  "计算机软件",
-  "IT服务(系统/数据/维护)",
-  "电子技术/半导体/集成电路",
-  "计算机硬件",
-  "通信/电信/网络设备",
-  "通信/电信运营、增值服务",
-  "网络游戏"],
-  "金融业":[
-    "基金/证券/期货/投资",
-    "保险",
-    "银行",
-    "信托/担保/拍卖/典当"],
-  "房地产|建筑业":{
-      "房地产/建筑/建材/工程": [
-        "房地产金融服务类",
-        "房地产工程施工类",
-        "房地产工程货物类"
-      ],
-      "家居/室内设计/装饰装潢": "家居/室内设计/装饰装潢",
-      "物业管理/商业中心": "物业管理/商业中心"
-  },
-  "商业服务":[
-    "专业服务/咨询(财会/法律/人力资源等)",
-    "广告/会展/公关",
-    "中介服务",
-    "检验/认证",
-    "外包服务"],
-  "贸易|批发|零售|租赁业":[
-    "快速消费品(食品/饮料/烟酒/日化)",
-    "耐用消费品(服饰/纺织/皮革/家具/家电)",
-    "贸易/进出口",
-    "零售/批发",
-    "租赁服务"],
-  "文体教育|工艺美术":[
-    "教育/培训/院校",
-    "礼品/玩具/工艺美术/收藏品/奢侈品"],
-  "生产|加工|制造":[
-    "汽车/摩托车",
-    "大型设备/机电设备/重工业",
-    "加工制造(原料加工/模具)",
-    "仪器仪表及工业自动化",
-    "印刷/包装/造纸",
-    "办公用品及设备",
-    "医药/生物工程",
-    "医疗设备/器械",
-    "航空/航天研究与制造"],
-  "交通|运输|物流|仓储":[
-    "交通/运输",
-    "物流/仓储"],
-  "服务业":[
-    "医疗/护理/美容/保健/卫生服务",
-    "酒店/餐饮",
-    "旅游/度假"],
-  "文化|传媒|娱乐|体育":[
-    "媒体/出版/影视/文化传播",
-    "娱乐/体育/休闲"],
-  "能源|矿产|环保":[
-    "能源/矿产/采掘/冶炼",
-    "石油/石化/化工",
-    "电气/电力/水利",
-    "环保"],
-  "政府|非盈利机构":[
-    "政府/公共事业/非盈利机构",
-    "学术/科研"],
-  "农|林|牧|渔|其他":[
-    "农/林/牧/渔",
-    "跨领域经营",
-    "其他"]}
+{
+  "农、林、牧、渔业":
+  {
+    "农业": ["谷物种植", "豆类、油料和薯类种植", "棉、麻、糖、烟草种植", "蔬菜、食用菌及园艺作物种植", "水果种植", "坚果、含油果、香料和饮料作物种植", "中药材种植", "草种植及割草", "其他农业"],
+    "林业": ["林木育种和育苗", "造林和更新", "森林经营、管护和改培", "木材和竹材采运", "林产品采集"],
+    "畜牧业 ": ["牲畜饲养", "家禽饲养", "狩猎和捕捉动物", "其他畜牧业"],
+    "渔业": ["水产养殖", "水产捕捞"],
+    "农、林、牧、渔专业及辅助性活动": ["农业专业及辅助性活动", "林业专业及辅助性活动", "畜牧专业及辅助性活动", "渔业专业及辅助性活动"]
+  },
+  "采矿业":
+  {
+    "煤炭开采和洗选业": ["烟煤和无烟煤开采洗选", "褐煤开采洗选", "其他煤炭采选"],
+    "石油和天然气开采业": ["石油开采", "天然气开采"],
+    "黑色金属矿采选业": ["铁矿采选", "锰矿、铬矿采选", "其他黑色金属矿采选"],
+    "有色金属矿采选业": ["常用有色金属矿采选", "贵金属矿采选", "稀有稀土金属矿采选"],
+    "非金属矿采选业 ": ["土砂石开采", "化学矿开采", "采盐", "石棉及其他非金属矿采选"],
+    "开采专业及辅助性活动": ["煤炭开采和洗选专业及辅助性活动", "石油和天然气开采专业及辅助性活动", "其他开采专业及辅助性活动"],
+    "其他采矿业": ["其他采矿业"]
+  },
+  "制造业":
+  {
+    "农副食品加工业": ["谷物磨制", "饲料加工", "植物油加工", "制糖业", "屠宰及肉类加工", "水产品加工", "蔬菜、菌类、水果和坚果加工", "其他农副食品加工"],
+    "食品制造业 ": ["焙烤食品制造", " 糖果、巧克力及蜜饯制造", "方便食品制造", "乳制品制造", "罐头食品制造", "调味品、发酵制品制造", "其他食品制造"],
+    "酒、饮料和精制茶制造业 ": ["酒的制造", "饮料制造", "精制茶加工"],
+    "烟草制品业": ["烟叶复烤", "卷烟制造", "其他烟草制品制造"],
+    "纺织业": ["棉纺织及印染精加工", "毛纺织及染整精加工", "麻纺织及染整精加工", "丝绢纺织及印染精加工", "化纤织造及印染精加工", "针织或钩针编织物及其制品制造", "家用纺织制成品制造", "产业用纺织制成品制造"],
+    "纺织服装、服饰业": ["机织服装制造", "针织或钩针编织服装制造", "服饰制造"],
+    "皮革、毛皮、羽毛及其制品和制鞋业": ["皮革鞣制加工", "皮革制品制造", "毛皮鞣制及制品加工", "羽毛(绒)加工及制品制造", "制鞋业"],
+    "木材加工和木、竹、藤、棕、草制品业": ["木材加工", "人造板制造", "木质制品制造", "竹、藤、棕、草等制品制造"],
+    "家具制造业": ["木质家具制造", "竹、藤家具制造", "金属家具制造", "塑料家具制造", "其他家具制造"],
+    "造纸和纸制品业": ["纸浆制造", "造纸", "纸制品制造"],
+    "印刷和记录媒介复制业": ["印刷", "装订及印刷相关服务", "记录媒介复制"],
+    "文教、工美、体育和娱乐用品制造业": ["文教办公用品制造", "乐器制造", "工艺美术及礼仪用品制造", "体育用品制造", "玩具制造", "游艺器材及娱乐用品制造"],
+    "石油、煤炭及其他燃料加工业": ["精炼石油产品制造", "煤炭加工", "核燃料加工", "生物质燃料加工"],
+    "化学原料和化学制品制造业": ["基础化学原料制造", "肥料制造", "农药制造", "涂料、油墨、颜料及类似产品制造", "合成材料制造", "专用化学产品制造", "炸药、火工及焰火产品制造", "日用化学产品制造"],
+    "医药制造业": ["化学药品原料药制造", "化学药品制剂制造", "中药饮片加工", "中成药生产", "兽用药品制造", "生物药品制品制造", "卫生材料及医药用品制造", "药用辅料及包装材料"],
+    "化学纤维制造业": ["纤维素纤维原料及纤维制造", "合成纤维制造", "生物基材料制造"],
+    "橡胶和塑料制品业": ["橡胶制品业", "塑料制品业"],
+    "非金属矿物制品业": ["水泥、石灰和石膏制造", "石膏、水泥制品及类似制品制造", "砖瓦、石材等建筑材料制造", "玻璃制造", "玻璃制品制造", "玻璃纤维和玻璃纤维增强塑料制品制造", "陶瓷制品制造", "耐火材料制品制造", "石墨及其他非金属矿物制品制造"],
+    "黑色金属冶炼和压延加工业": ["炼铁", "炼钢", "钢压延加工", "铁合金冶炼"],
+    "有色金属冶炼和压延加工业 ": ["常用有色金属冶炼", "贵金属冶炼", "稀有稀土金属冶炼", "有色金属合金制造", "有色金属压延加工"],
+    "金属制品业": ["结构性金属制品制造", "金属工具制造", "集装箱及金属包装容器制造", "金属丝绳及其制品制造", "建筑、安全用金属制品制造", "金属表面处理及热处理加工", "搪瓷制品制造", "金属制日用品制造", "铸造及其他金属制品制造"],
+    "通用设备制造业": ["锅炉及原动设备制造", "金属加工机械制造", "物料搬运设备制造", "泵、阀门、压缩机及类似机械制造", "轴承、齿轮和传动部件制造", "烘炉、风机、包装等设备制造", "文化、办公用机械制造", "通用零部件制造", "其他通用设备制造业"],
+    "专用设备制造业": ["采矿、冶金、建筑专用设备制造", "化工、木材、非金属加工专用设备制造", "食品、饮料、烟草及饲料生产专用设备制造", "印刷、制药、日化及日用品生产专用设备制造", "纺织、服装和皮革加工专用设备制造", "电子和电工机械专用设备制造", "农、林、牧、渔专用机械制造", "医疗仪器设备及器械制造", "环保、邮政、社会公共服务及其他专用设备制造"],
+    "汽车制造业": ["汽车整车制造", "汽车用发动机制造", "改装汽车制造", "低速汽车制造", "电车制造", "汽车车身、挂车制造", "汽车零部件及配件制造"],
+    "铁路、船舶、航空航天和其他运输设备制造业": ["铁路运输设备制造", "城市轨道交通设备制造", "船舶及相关装置制造", "航空、航天器及设备制造", "摩托车制造", "自行车和残疾人座车制造", "助动车制造", "非公路休闲车及零配件制造", "潜水救捞及其他未列明运输设备制造"],
+    "电气机械和器材制造业": ["电机制造", "输配电及控制设备制造", "电线、电缆、光缆及电工器材制造", "电池制造", "家用电力器具制造", "非电力家用器具制造", "照明器具制造", "其他电气机械及器材制造"],
+    "计算机、通信和其他电子设备制造业": ["计算机制造", "通信设备制造", "广播电视设备制造", "雷达及配套设备制造", "非专业视听设备制造", "智能消费设备制造", "电子器件制造", "电子元件及电子专用材料制造", "其他电子设备制造"],
+    "仪器仪表制造业": ["通用仪器仪表制造", "专用仪器仪表制造", "钟表与计时仪器制造", "光学仪器制造", "衡器制造", "其他仪器仪表制造业"],
+    "其他制造业": ["日用杂品制造", "核辐射加工", "其他未列明制造业"],
+    "废弃资源综合利用业": ["金属废料和碎屑加工处理", "非金属废料和碎屑加工处理"],
+    "金属制品、机械和设备修理业": ["金属制品修理", "通用设备修理", "专用设备修理", "铁路、船舶、航空航天等运输设备修理"]
+  },
+  "电力、热力、燃气及水生产和供应业":
+  {
+    "电力、热力生产和供应业": ["电力生产", "电力供应", "热力生产和供应"],
+    "燃气生产和供应业": ["燃气生产和供应业", "生物质燃气生产和供应业"],
+    "水的生产和供应业": ["自来水生产和供应", "污水处理及其再生利用", "海水淡化处理", "其他水的处理、利用与分配"]
+  },
+  "建筑业":
+  {
+    "房屋建筑业": ["住宅房屋建筑", "体育场馆建筑", "其他房屋建筑业"],
+    "土木工程建筑业": ["铁路、道路、隧道和桥梁工程建筑", "水利和水运工程建筑", "海洋工程建筑", "工矿工程建筑", "架线和管道工程建筑", "节能环保工程施工", "电力工程施工", "其他土木工程建筑"],
+    "建筑安装业": ["电气安装", "管道和设备安装", "其他建筑安装业"],
+    "建筑装饰、装修和其他建筑业": ["建筑装饰和装修业", "建筑物拆除和场地准备活动", "提供施工设备服务", "其他未列明建筑业"]
+  },
+  "批发和零售业":
+  {
+    "批发业": ["农、林、牧、渔产品批发", "食品、饮料及烟草制品批发", "纺织、服装及家庭用品批发", "文化、体育用品及器材批发", "医药及医疗器材批发", "矿产品、建材及化工产品批发", "机械设备、五金产品及电子产品批发", "贸易经纪与代理", "其他批发业"],
+    "零售业": ["综合零售", "食品、饮料及烟草制品专门零售", "纺织、服装及日用品专门零售", "文化、体育用品及器材专门零售", "医药及医疗器材专门零售", "汽车、摩托车、零配件和燃料及其他动力销售", "家用电器及电子产品专门零售", "五金、家具及室内装饰材料专门零售", "货摊、无店铺及其他零售业"]
+  },
+  "交通运输、仓储和邮政业":
+  {
+    "铁路运输业": ["铁路旅客运输", "铁路货物运输", "铁路运输辅助活动"],
+    "道路运输业": ["城市公共交通运输", "公路旅客运输", "道路货物运输", "道路运输辅助活动"],
+    "水上运输业": ["水上旅客运输", "水上货物运输", "水上运输辅助活动"],
+    "航空运输业": ["航空客货运输", "通用航空服务", "航空运输辅助活动"],
+    "管道运输业": ["海底管道运输", "陆地管道运输"],
+    "多式联运和运输代理业": ["多式联运", "运输代理业"],
+    "装卸搬运和仓储业": ["装卸搬运", "通用仓储", "低温仓储", "危险品仓储", "谷物、棉花等农产品仓储", "中药材仓储", "其他仓储业"],
+    "邮政业": ["邮政基本服务", "快递服务", "其他寄递服务"]
+  },
+  "住宿和餐饮业":
+  {
+    "住宿业": ["旅游饭店", "一般旅馆", "民宿服务", "露营地服务", "其他住宿业"],
+    "餐饮业": ["正餐服务", "快餐服务", "饮料及冷饮服务", "餐饮配送及外卖送餐服务", "其他餐饮业"]
+  },
+  "信息传输、软件和信息技术服务业":
+  {
+    "电信、广播电视和卫星传输服务": ["电信", "广播电视传输服务", "卫星传输服务"],
+    "互联网和相关服务": ["互联网接入及相关服务", "互联网信息服务", "互联网平台", "互联网安全服务", "互联网数据服务", "其他互联网服务"],
+    "软件和信息技术服务业": ["软件开发", "集成电路设计", "信息系统集成和物联网技术服务", "运行维护服务", "信息处理和存储支持服务", "信息技术咨询服务", "数字内容服务", "其他信息技术服务业"]
+  },
+  "金融业":
+  {
+    "货币金融服务": ["中央银行服务", "货币银行服务", "非货币银行服务", "银行理财服务", "银行监管服务"],
+    "资本市场服务": ["证券市场服务 ", "公开募集证券投资基金", "非公开募集证券投资基金", "期货市场服务", "证券期货监管服务", "资本投资服务", "其他资本市场服务"],
+    "保险业": ["人身保险", "财产保险", "再保险", "商业养老金", "保险中介服务", "保险资产管理", "保险监管服务", "其他保险活动"],
+    "其他金融业": ["金融信托与管理服务", "控股公司服务", "非金融机构支付服务", "金融信息服务", "金融资产管理公司", "其他未列明金融业"]
+  },
+  "房地产业":
+  {
+    "房地产业": ["房地产开发经营", "物业管理", "房地产中介服务", "房地产租赁经营", "其他房地产业"]
+  },
+  "租赁和商务服务业":
+  {
+    "租赁业": ["机械设备经营租赁", "文体设备和用品出租", "日用品出租"],
+    "商务服务业": ["组织管理服务", "综合管理服务", "法律服务", "咨询与调查", "广告业", "人力资源服务", "安全保护服务", "会议、展览及相关服务 其他商务服务业"]
+  },
+  "科学研究和技术服务业":
+  {
+    "研究和试验发展": ["自然科学研究和试验发展", "工程和技术研究和试验发展", "农业科学研究和试验发展", "医学研究和试验发展", "社会人文科学研究"],
+    "专业技术服务业": ["气象服务", "地震服务", "海洋服务", "测绘地理信息服务", "质检技术服务", "环境与生态监测检测服务", "地质勘查","工程技术与设计服务", "工业与专业设计及其他专业技术服务"],
+    "科技推广和应用服务业": ["技术推广服务", "知识产权服务", "科技中介服务", "创业空间服务", "其他科技推广服务业"]
+  },
+  "水利、环境和公共设施管理业":
+  {
+    "水利管理业": ["防洪除涝设施管理", "水资源管理", "天然水收集与分配", "水文服务", "其他水利管理业"],
+    "生态保护和环境治理业": ["生态保护", "环境治理业"],
+    "公共设施管理业": ["市政设施管理", "环境卫生管理", "城乡市容管理", "绿化管理", "城市公园管理", "游览景区管理"],
+    "土地管理业": ["土地整治服务 ", "土地调查评估服务", "土地登记服务", "土地登记代理服务", "其他土地管理服务"]
+  },
+  "居民服务、修理和其他服务业":
+  {
+    "居民服务业": ["家庭服务", "托儿所服务", "洗染服务", "理发及美容服务", "摄影扩印服务", "婚姻服务", "殡葬服务", "其他居民服务业"],
+    "机动车、电子产品和日用产品修理业": ["汽车、摩托车等修理与维护", "计算机和办公设备维修", "家用电器修理", "其他日用产品修理业"],
+    "其他服务业": ["清洁服务", "宠物服务", "其他未列明服务业"]
+  },
+  "教育":["学前教育", "初等教育", "中等教育", "高等教育", "特殊教育"],
+  "卫生和社会工作":
+  {
+    "卫生": ["医院", "基层医疗卫生服务", "专业公共卫生服务", "其他卫生活动"],
+    "社会工作": ["提供住宿社会工作", "不提供住宿社会工作"]
+  },
+  "文化、体育和娱乐业":
+  {
+    "新闻和出版业": ["新闻业", "出版业"],
+    "广播、电视、电影和录音制作业": ["广播", "电视", "影视节目制作", "广播电视集成播控", "电影和广播电视节目发行", "电影放映", "录音制作"],
+    "文化艺术业": ["文艺创作与表演", "艺术表演场馆", "图书馆与档案馆", "文物及非物质文化遗产保护", "博物馆", "烈士陵园、纪念馆", "群众文体活动", "其他文化艺术业"],
+    "体育": ["体育组织 ", "体育场地设施管理", "健身休闲活动", "其他体育"],
+    "娱乐业": ["室内娱乐活动", "游乐园", "休闲观光活动", "彩票活动", "文化体育娱乐活动与经纪代理服务", "其他娱乐业"]
+  },
+  "公共管理、社会保障和社会组织":
+  {
+    "中国共产党机关": ["中国共产党机关"],
+    "国家机构": ["国家权力机构", "国家行政机构", "人民法院和人民检察院", "其他国家机构"],
+    "人民政协、民主党派": ["人民政协", "民主党派"],
+    "社会保障": ["基本保险", "补充保险", "其他社会保障"],
+    "群众团体、社会团体和其他成员组织": ["群众团体", "社会团体", "基金会", "宗教组织"],
+    "基层群众自治组织及其他组织": ["社区居民自治组织", "村民自治组织"]
+  },
+  "国际组织": ["国际组织"]
+}

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

@@ -1774,21 +1774,21 @@ define([ 'app/app' ], function(app) {
 	app.controller('leftNavCtrl', ["$scope", "toaster", '$modal', '$rootScope', function($scope, toaster, $modal, $rootScope){
 		//安全设置提醒框
 
-		$scope.openHomeCenterModel = function() {
-			var modalInstance = $modal.open({
-				animation: true,
-				templateUrl: $rootScope.rootPath + '/static/view/usercenter/modal/homeCenter_modal.html',
-				controller:'homeModalCtrl'
-			});
-			modalInstance.result.then(function(){
-			}, function(){
-			});
-		};
-		$scope.promptUpdate = function() {
-			if (!$scope.userInfo.pwdEnable || !$scope.userInfo.userEmail || !$scope.userInfo.haveUserQuestion) {
-				$scope.openHomeCenterModel();
-			}
-		};
+		// $scope.openHomeCenterModel = function() {
+		// 	var modalInstance = $modal.open({
+		// 		animation: true,
+		// 		templateUrl: $rootScope.rootPath + '/static/view/usercenter/modal/homeCenter_modal.html',
+		// 		controller:'homeModalCtrl'
+		// 	});
+		// 	modalInstance.result.then(function(){
+		// 	}, function(){
+		// 	});
+		// };
+		// $scope.promptUpdate = function() {
+		// 	if (!$scope.userInfo.pwdEnable || !$scope.userInfo.userEmail || !$scope.userInfo.haveUserQuestion) {
+		// 		$scope.openHomeCenterModel();
+		// 	}
+		// };
   }]);
 
 	app.controller('homeModalCtrl', ['$rootScope', '$scope',  '$modalInstance', 'toaster', '$http', 'ShippingAddress','$state', function($rootScope, $scope, $modalInstance, toaster, $http, ShippingAddress,$state) {
@@ -1827,25 +1827,25 @@ define([ 'app/app' ], function(app) {
    */
 	app.controller('leftNavCtrl', ["$scope", "toaster", "$modal", "$rootScope", function($scope, toaster, $modal, $rootScope){
         //安全设置提醒框
-        $scope.openHomeCenterModel = function() {
-            var modalInstance = $modal.open({
-                animation: true,
-                templateUrl: $rootScope.rootPath + '/static/view/usercenter/modal/homeCenter_modal.html',
-                controller:'homeModalCtrl'
-            });
-            modalInstance.result.then(function(){
-            }, function(){
-            });
-        };
-
-	    $scope.promptUpdate = function() {
-            if (!$scope.userInfo.pwdEnable || !$scope.userInfo.haveUserQuestion||!$scope.userInfo.emailValidCode || $scope.userInfo.emailValidCode != 2) {
-                $scope.openHomeCenterModel();
-            }
+        // $scope.openHomeCenterModel = function() {
+        //     var modalInstance = $modal.open({
+        //         animation: true,
+        //         templateUrl: $rootScope.rootPath + '/static/view/usercenter/modal/homeCenter_modal.html',
+        //         controller:'homeModalCtrl'
+        //     });
+        //     modalInstance.result.then(function(){
+        //     }, function(){
+        //     });
+        // };
+
+	    // $scope.promptUpdate = function() {
+         //    if (!$scope.userInfo.pwdEnable || !$scope.userInfo.haveUserQuestion||!$scope.userInfo.emailValidCode || $scope.userInfo.emailValidCode != 2) {
+         //        $scope.openHomeCenterModel();
+         //    }
 			/*if (!$scope.userInfo.pwdEnable || !$scope.userInfo.userEmail || !$scope.userInfo.haveUserQuestion) {
 				$scope.openHomeCenterModel();
 			}*/
-		};
+		// };
 	}]);
 
     function checkNullStr (str) {

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

@@ -51,6 +51,10 @@ define([ 'ngResource' ], function() {
             getUnread: {
                 url: 'internalmessage-service/count',
                 method: 'GET'
+            },
+            getUrl: {
+                url: 'internalmessage-service/getUrl',
+                method: 'GET'
             }
         });
     }])

+ 34 - 5
src/main/webapp/resources/js/usercenter/app.js

@@ -711,16 +711,45 @@ define([ 'angularAMD', 'ui.router', 'ui-bootstrap', 'ngLocal', 'ngTable', 'commo
 
 
     /**
-     * 家中心头部
+     * 家中心头部
      */
-    app.controller('UserCenterHeaderCtrl', ['$scope', '$rootScope', 'BaseService', 'InternalMessage', function ($scope, $rootScope, BaseService, InternalMessage) {
-        $scope.homeUrl = BaseService.getRootPath();
-        InternalMessage.getUnread({isRead: 0}, function (data) {
+    app.controller('UserCenterHeaderCtrl', ['$scope', '$rootScope', 'BaseService', 'InternalMessage', '$http', 'toaster', function ($scope, $rootScope, BaseService, InternalMessage, $http, toaster) {
+		$scope.homeUrl = BaseService.getRootPath();
+        console.info($rootScope.userInfo);
+        InternalMessage.getUrl({}, function(data) {
+            var url = data.url;
+            if (url == "http://218.17.158.219:24000/message") {
+                url = 'http://192.168.253.6:24000/message';
+            }
+            var param = {
+                'receiverUu': data.userUU,
+                'receiverEnuu': data.enUU,
+                'consumerApp': 'MALL',
+                'isRead': 0
+            };
+            $http({
+                method: 'get',
+                dataType: 'json',
+                url: url + '/messages/count',
+                params: param
+            }).success(function (data) {
+                $rootScope.unReadMessCount = data.count;
+            }).error(function (err) {
+                toaster.pop('error', err || '获取未读消息数量失败');
+            });
+        });
+        // InternalMessage.getUnread({isRead: 0}, function (data) {
+        //     $rootScope.unReadMessCount = data.toRead;
+        // }, function (err) {
+        //     toaster.pop('error', err || '获取未读消息数量失败');
+        // })
+    }]);
+        /*InternalMessage.getUnread({isRead: 0}, function (data) {
             $rootScope.unReadMessCount = data.toRead;
         }, function (err) {
             toaster.pop('error', err || '获取未读消息数量失败');
         })
-    }]);
+    }]);*/
 	/**
 	 * 采购单状态
 	 */

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

@@ -17,21 +17,21 @@ define(['app/app', 'calendar'], function(app) {
         getRecommendComps(null, null, {page: 0, size: 12});
 
         //安全设置提醒框
-      $scope.openHomeCenterModel = function() {
-        var modalInstance = $modal.open({
-          animation: true,
-          templateUrl: $rootScope.rootPath + '/static/view/usercenter/modal/homeCenter_modal.html',
-          controller:'homeModalCtrl'
-        });
-        modalInstance.result.then(function(){
-        }, function(){
-        });
-      }
+      // $scope.openHomeCenterModel = function() {
+      //   var modalInstance = $modal.open({
+      //     animation: true,
+      //     templateUrl: $rootScope.rootPath + '/static/view/usercenter/modal/homeCenter_modal.html',
+      //     controller:'homeModalCtrl'
+      //   });
+      //   modalInstance.result.then(function(){
+      //   }, function(){
+      //   });
+      // }
 
         //安全级别
-        if (!$scope.userInfo.pwdEnable || !$scope.userInfo.haveUserQuestion||!$scope.userInfo.emailValidCode || $scope.userInfo.emailValidCode != 2) {
-            $scope.openHomeCenterModel();
-        }
+        // if (!$scope.userInfo.pwdEnable || !$scope.userInfo.haveUserQuestion||!$scope.userInfo.emailValidCode || $scope.userInfo.emailValidCode != 2) {
+        //     $scope.openHomeCenterModel();
+        // }
 
       /*  if(!($scope.userInfo.pwdEnable && $scope.userInfo.haveUserQuestion && $scope.userInfo.userEmail)){
           $scope.openHomeCenterModel();

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

@@ -412,6 +412,7 @@ define([ 'app/app' ], function(app) {
 
 			modalInstance.result.then(function(account) {
 				$scope.buyAccount = account;
+				$scope.buyAccount.filterAccount = $filter('hideBankFilter')(account.number);
 			}, function() {
 
 			});
@@ -613,12 +614,23 @@ define([ 'app/app' ], function(app) {
 		}
 
 		$scope.onDiliverPriceChange = function (index) {
+			if ($scope.yesPayinstallmentEnter) {
+				return ;
+			}
 			if (!($scope.diliverPrice[index] > 0)) {
 				$scope.diliverPrice[index] = '';
-				toaster.pop('info', '提示', '分期金额必须大于0');
+				toaster.pop('info', '提示', '请输入付款金额对应的付款截图');
 			}
 		}
 
+		$scope.yesPayinstallmentEnter = function () {
+			$scope.yesPayinstallmentEnter = true;
+		}
+
+		$scope.yesPayinstallmentLeave = function() {
+			$scope.yesPayinstallmentEnter = false;
+		}
+
 
 		$scope.confirm = function() {
 			var imageArray = [];
@@ -634,8 +646,11 @@ define([ 'app/app' ], function(app) {
 						}
 						imageArray.push($scope.imagesList[i].imageUrl);
 					} else if ($scope.type == "PAIDTOVENDOR" && $scope.imagesList[i].imageUrl == '') {
-						toaster.pop('info','提示','请输入付款金额对应的付款截图');
-						return;
+						if ($scope.diliverPrice[i] != '') {
+							toaster.pop('info','提示','请输入付款金额对应的付款截图');
+							return;
+						}
+
 					}
 				}
 			}

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

@@ -2,15 +2,15 @@
  * Created by yangck on 2017/3/30.
  */
 define(['app/app'], function(app) {
-    app.register.controller('MessagePersonalCtrl', ['$scope', '$rootScope', 'InternalMessage', 'toaster', '$sce', function($scope, $rootScope, InternalMessage, toaster, $sce) {
+    app.register.controller('MessagePersonalCtrl', ['$scope', '$rootScope', 'InternalMessage', 'toaster', '$sce', '$http', function($scope, $rootScope, InternalMessage, toaster, $sce, $http) {
         $rootScope.active = 'message';
         $scope.message = {};
         $scope.params = {
             page: 1,
             count: 10,
-            timeSorting: 'DESC',
+            timeSorting: '{\"createTime\":\"DESC\"}',
             classes: '',
-            recRole: 'BUYER'
+            recRole: 'BUYER',
         };
         $scope.deleteIds = [];
         $scope.isChoosedAll = false;
@@ -203,8 +203,7 @@ define(['app/app'], function(app) {
         };*/
         // 时间排序
         $scope.orderTime = function () {
-            $scope.params.timeSorting = $scope.params.timeSorting == 'DESC' ? 'ASC' : 'DESC'
-            $scope.params.sorting = {createTime: $scope.params.timeSorting};
+            $scope.params.timeSorting = $scope.params.timeSorting == '{\"createTime\":\"DESC\"}' ? '{\"createTime\":\"ASC\"}' : '{\"createTime\":\"DESC\"}';
             getData();
         };
 
@@ -320,39 +319,111 @@ define(['app/app'], function(app) {
         $scope.unReadMessCount = $rootScope.unReadMessCount;
         $scope.allReadMessCount = 0;
         var getData = function () {
-            InternalMessage.getUnread({}, function (data) {
-                $scope.allReadMessCount = data.toRead;
+            InternalMessage.getUrl({}, function(data) {
+
+                var url = data.url;
+                if (url == "http://218.17.158.219:24000/message") {
+                    url = 'http://192.168.253.6:24000/message';
+                }
+                var param = {
+                    'receiverUu': data.userUU,
+                    'receiverEnuu': data.enUU,
+                    'consumerApp': 'MALL',
+                    isRead: null
+                };
+                $http({
+                    method: 'get',
+                    dataType: 'json',
+                    url: url + '/messages/count',
+                    params: param
+                }).success(function (data) {
+                    $scope.allReadMessCount = data.count;
+                }).error(function (err) {
+                    toaster.pop('error', err || '获取未读消息数量失败');
+                });
+            })
+              /*  $scope.allReadMessCount = data.toRead;
             }, function (err) {
                 toaster.pop('error', err || '获取未读消息数量失败');
-            })
-            InternalMessage.getMessagesPagePrivate($scope.params, function(data) {
-                if (data) {
-                    console.log(data);
-                    $scope.messageAllData = data;
-                    $scope.messageCurrent = data.content;
-                    angular.forEach($scope.messageCurrent, function(message) {
-                        message.content = $sce.trustAsHtml(message.content);
-                    });
-                    $scope.params.currentPage = data.number;
-                    $scope.acculatePages(data.number, data.totalPages);
+            })*/
+            InternalMessage.getUrl({}, function(info) {
+                if (info) {
+                    var url = info.url;
+                    if (url == "http://218.17.158.219:24000/message") {
+                        url = 'http://192.168.253.6:24000/message';
+                    }
+                    var param = {
+                        'receiverUu': info.userUU,
+                        'receiverEnuu': info.enUU,
+                        'consumerApp': 'MALL',
+                        isRead : $scope.params.isRead,
+                        page: $scope.params.page,
+                        count: 10,
+                        sorting: $scope.params.timeSorting ,
+                        classes: '',
+                        recRole: 'SELLER',
+                    }
+                    $http({
+                        method: 'get',
+                        dataType: 'json',
+                        url: url + '/messages',
+                        params: param
+                    }).success(function (data) {
+                        $scope.messageAllData = data;
+                        $scope.messageCurrent = data.content;
 
+                        var mess = new Array();
+                        var b = '';
+                        angular.forEach($scope.messageCurrent, function (message) {
+                            message.content = $sce.trustAsHtml(message.content);
+                            if(message.type =="MALL跳转卖家待报价页面"){
+                                message.url='/vendor#/seekPurchase';
+                            }else if (message.type =="MALL公共询价"){
+                                message.url='/user#/seekPurchase';
+                            }else if (message.type =="商城公共询价采纳结果"){
+                                message.url='/vendor#/vendorPurchaseOffer';
+                            }
+                            if(message.isRead !=1 ){
+                                b += message.id +",";
+                            }
+                        })
+                        mess = b.substring(0, b.length - 1);
+                        var param = {
+                            'receiverUu': info.userUU,
+                            'receiverEnuu': info.enUU,
+                            'messageId': mess,
+                            'consumerApp': 'MALL'
+
+                        };
+                        $http({
+                            method: 'post',
+                            dataType: 'json',
+                            url: url + '/messages/read',
+                            data:param
+                        });
+                        $scope.params.currentPage = data.number;
+                        $scope.acculatePages(data.number, data.totalPages);
+                    }).error(function (err) {
+                        toaster.pop('error', err || '获取未读消息数量失败');
+                    })
                     if ($scope.tab == 'no') {
                         // $rootScope.unReadMessCount = data.totalElements;
                     } else {
-                        var params = {
+                        var param = {
                             page: 1,
                             count: 10,
                             timeSorting: 'DESC',
                             classes: '',
                             recRole: 'SELLER',
-                            isRead: 0
+                            'isRead': 0
                         };
-                        InternalMessage.getMessagesPagePrivate(params, function(data) {
-                            InternalMessage.getUnread({isRead: 0}, function (data) {
-                                $rootScope.unReadMessCount = data.toRead;
-                                $scope.unReadMessCount = data.toRead
+
+                            /*InternalMessage.getUnread({isRead: 0}, function (data) {*/
+                                InternalMessage.getUrl({isRead: 0}, function (data) {
+                                $rootScope.unReadMessCount = data.count;
+                                $scope.unReadMessCount = data.count;
                             })
-                        })
+
                     }
                 }
             }, function(response) {

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

@@ -4,7 +4,7 @@
  */
 define(['app/app'], function(app) {
 	app.register.controller('orderPayCtrl', ['$scope', '$rootScope', '$stateParams', '$modal', '$state', 'Bill', 'toaster', 'Order', '$filter', 'ShippingAddress', 'Ysepay', '$q', 'NumberService', 'Cart', '$timeout', 'DistributionRule', 'TakeSelf', 'StoreInfo', function($scope, $rootScope, $stateParams, $modal, $state, Bill, toaster, Order, $filter, ShippingAddress, Ysepay, $q, NumberService, Cart, $timeout, DistributionRule, TakeSelf, StoreInfo) {
-
+        $scope.userInfo = $rootScope.userInfo;
 		document.title = '结算页-优软商城';
 		$rootScope.active = 'buyer_cart';
 
@@ -571,97 +571,128 @@ define(['app/app'], function(app) {
 			window.open("user#/invoice", '_self');
 		};
 
+        // 安全设置提醒框
+        $scope.openHomeCenterModel = function() {
+          var modalInstance = $modal.open({
+            animation: true,
+            templateUrl: $rootScope.rootPath + '/static/view/usercenter/modal/homeCenter_modal.html',
+            controller:'homeModalCtrl'
+          });
+          modalInstance.result.then(function(){
+          }, function(){
+          });
+        };
+        // 安全级别模态框
+        app.register.controller('homeModalCtrl', ['$rootScope', '$scope',  '$modalInstance', 'toaster', '$http', 'ShippingAddress','$state', function($rootScope, $scope, $modalInstance, toaster, $http, ShippingAddress,$state){
+            $rootScope.$on('$stateChangeStart',
+                function(event, toState, toParams, fromState, fromParams){
+                    $modalInstance.dismiss();
+                })
+            $scope.goLink = function(op){
+                $state.go('account_manager',{op:op});
+                $modalInstance.dismiss('cancel');
+            }
+            $scope.cancel = function () {
+                $modalInstance.dismiss('cancel');
+            }
+        }]);
+
 		//确认付款
 		$scope.imperfect = false;//暂不完善
 		$scope.confirmPay = function() {
-			if($scope.order.status == 502 || $scope.order.status == 503) {
-				var arr = [];
-				if($scope.order.orderids) {
-					arr = $scope.order.orderids.split(",");
-				}else {
-					arr.push($scope.order.orderid);
-				}
-				if ($scope.order.currency == 'RMB' && $scope.order.paytype == '1102') {
-					paymentEnsure(arr);
-				} else if($scope.order.paytype == '1103') {
-					$state.go('order_transfer', {orderid : enIdFilter(arr.join("-"))});
-				}else {
-					toaster.pop('info', '美元请线下付款');
-				}
-				return ;
-			}
-			var validRule = checkRule();
-			if (!validRule){
-				toaster.pop("info", "当前地址部分卖家无法配送,请重新选择地址或与卖家协商处理");
-				return ;
-			}
-			var validTakeSelf = checkTakeSelf();
-			if (!validTakeSelf){
-				toaster.pop("info", "请选择一个自提点");
-				return ;
-			}
-			var orderInfos = [], orderInfo;
-			orderInfo = generateOrderInfo();
-			if(orderInfo == null) {
-				return ;
-			}
-			orderInfos.push(orderInfo);
-			if(!$scope.imperfect){
-				var validBill = checkBill();
-				if (!validBill){
-					// toaster.pop('info', '请完善专票信息');
-					$scope.showBillFrame = true;
-					return ;
-				}
-			}
-
-			Order.ensure({orderid: enIdFilter($scope.order.orderid)}, orderInfos, function(data){
-				if(data.code == 1) {
-					if (data.data && data.data[0]) {
-						var arr = [];
-						var batchCodes = [];
-						for(var i = 0; i < data.data.length; i++) {
-							arr.push(data.data[i].orderid);
-							for(var j = 0; j < data.data[i].orderDetails.length; j++) {
-								batchCodes.push(data.data[i].orderDetails[j].batchCode);
-							}
-						}
-						if(!$scope.order.buyNow) {
-							Cart.deleteByBatchCode({}, batchCodes, function(data) {
-							}, function(response) {
-							});
-						}
-						if ($scope.order.currency == 'RMB' && $scope.order.paytype == '1102') {
-							paymentEnsure(arr);
-						} else if($scope.order.paytype == '1103') {
-							console.log(arr.length)
-							if(arr.length != 1){
-								$state.go('downPayment', {orderid : enIdFilter(arr.join('-'))});
-							}else {
-								$state.go('order_transfer', {orderid : enIdFilter(arr.join('-'))});
-							}
-						}else {
-							toaster.pop('info', '美元请线下付款');
-							$state.go('buyer_order');
-						}
-
-					}
-				}else {
-					if(data.code == 6) { //产品信息有更新
-						toaster.pop('warning', data.message + ",请刷新界面之后重新操作");
-					}else if(data.code == 7){
-						toaster.pop('warning', data.message + ",将为您跳转到购物车界面");
-						$timeout(function () {
-							$state.go('buyer_cart');
-						}, 1000);
-					}else {
-						toaster.pop('warning', data.message);
-					}
-				}
-
-			}, function(response) {
-				toaster.pop('error', '确认订单失败,' + response.data);
-			});
+            // 安全级别
+            if (!$scope.userInfo.pwdEnable || !$scope.userInfo.haveUserQuestion||!$scope.userInfo.emailValidCode || $scope.userInfo.emailValidCode != 2) {
+                $scope.openHomeCenterModel();
+            } else {
+                if($scope.order.status == 502 || $scope.order.status == 503) {
+                    var arr = [];
+                    if($scope.order.orderids) {
+                        arr = $scope.order.orderids.split(",");
+                    }else {
+                        arr.push($scope.order.orderid);
+                    }
+                    if ($scope.order.currency == 'RMB' && $scope.order.paytype == '1102') {
+                        paymentEnsure(arr);
+                    } else if($scope.order.paytype == '1103') {
+                        $state.go('order_transfer', {orderid : enIdFilter(arr.join("-"))});
+                    }else {
+                        toaster.pop('info', '美元请线下付款');
+                    }
+                    return ;
+                }
+                var validRule = checkRule();
+                if (!validRule){
+                    toaster.pop("info", "当前地址部分卖家无法配送,请重新选择地址或与卖家协商处理");
+                    return ;
+                }
+                var validTakeSelf = checkTakeSelf();
+                if (!validTakeSelf){
+                    toaster.pop("info", "请选择一个自提点");
+                    return ;
+                }
+                var orderInfos = [], orderInfo;
+                orderInfo = generateOrderInfo();
+                if(orderInfo == null) {
+                    return ;
+                }
+                orderInfos.push(orderInfo);
+                if(!$scope.imperfect){
+                    var validBill = checkBill();
+                    if (!validBill){
+                        // toaster.pop('info', '请完善专票信息');
+                        $scope.showBillFrame = true;
+                        return ;
+                    }
+                }
+
+                Order.ensure({orderid: enIdFilter($scope.order.orderid)}, orderInfos, function(data){
+                    if(data.code == 1) {
+                        if (data.data && data.data[0]) {
+                            var arr = [];
+                            var batchCodes = [];
+                            for(var i = 0; i < data.data.length; i++) {
+                                arr.push(data.data[i].orderid);
+                                for(var j = 0; j < data.data[i].orderDetails.length; j++) {
+                                    batchCodes.push(data.data[i].orderDetails[j].batchCode);
+                                }
+                            }
+                            if(!$scope.order.buyNow) {
+                                Cart.deleteByBatchCode({}, batchCodes, function(data) {
+                                }, function(response) {
+                                });
+                            }
+                            if ($scope.order.currency == 'RMB' && $scope.order.paytype == '1102') {
+                                paymentEnsure(arr);
+                            } else if($scope.order.paytype == '1103') {
+                                console.log(arr.length)
+                                if(arr.length != 1){
+                                    $state.go('downPayment', {orderid : enIdFilter(arr.join('-'))});
+                                }else {
+                                    $state.go('order_transfer', {orderid : enIdFilter(arr.join('-'))});
+                                }
+                            }else {
+                                toaster.pop('info', '美元请线下付款');
+                                $state.go('buyer_order');
+                            }
+
+                        }
+                    }else {
+                        if(data.code == 6) { //产品信息有更新
+                            toaster.pop('warning', data.message + ",请刷新界面之后重新操作");
+                        }else if(data.code == 7){
+                            toaster.pop('warning', data.message + ",将为您跳转到购物车界面");
+                            $timeout(function () {
+                                $state.go('buyer_cart');
+                            }, 1000);
+                        }else {
+                            toaster.pop('warning', data.message);
+                        }
+                    }
+
+                }, function(response) {
+                    toaster.pop('error', '确认订单失败,' + response.data);
+                });
+            }
 		};
 
 		// 跳银盛支付页面

+ 38 - 12
src/main/webapp/resources/js/vendor/app.js

@@ -688,7 +688,7 @@ define([ 'angularAMD', 'ngLocal', 'common/services', 'common/directives', 'commo
 				$rootScope.applyStatus = 'NONE';
 			}
 
-			if ($rootScope.applyStatus === 'NONE' && $location.$$path === '/index') {
+			if ($location.$$path === '/index') {
                 AuthenticationService.getAuthentication().success(function (data) {
                     angular.forEach(data.enterprises, function (item) {
                         if (item.current) {
@@ -696,9 +696,11 @@ define([ 'angularAMD', 'ngLocal', 'common/services', 'common/directives', 'commo
                         }
                     });
                     $rootScope.userInfo = data;
-                    if (!(!data.pwdEnable || !data.haveUserQuestion||!data.emailValidCode || data.emailValidCode != 2)) {
-                        $state.go('vendor_store_apply');
-                    }
+					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', '获取登录信息失败');
                 })
@@ -954,14 +956,38 @@ define([ 'angularAMD', 'ngLocal', 'common/services', 'common/directives', 'commo
 	/**
 	 * 卖家中心头部
 	 */
-	app.controller('VendorCenterHeaderCtrl', ['$scope', '$rootScope', 'BaseService', 'InternalMessage', function ($scope, $rootScope, BaseService, InternalMessage) {
-		$scope.homeUrl = BaseService.getRootPath();
-        InternalMessage.getUnread({isRead: 0}, function (data) {
-            $rootScope.unReadMessCount = data.toRead;
-        }, function (err) {
-            toaster.pop('error', err || '获取未读消息数量失败');
-        })
-	}]);
+    app.controller('VendorCenterHeaderCtrl', ['$scope', '$rootScope', 'BaseService', 'InternalMessage', '$http', 'toaster', function ($scope, $rootScope, BaseService, InternalMessage, $http, toaster) {
+        $scope.homeUrl = BaseService.getRootPath();
+        /*console.info($rootScope.userInfo);*/
+        InternalMessage.getUrl({}, function(data) {
+            var url = data.url;
+            if (url == "http://218.17.158.219:24000/message") {
+                url = 'http://192.168.253.6:24000/message';
+            }
+            var param = {
+                'receiverUu': data.userUU,
+                'receiverEnuu': data.enUU,
+                'consumerApp': 'MALL',
+                'isRead': 0
+            };
+            $http({
+                method: 'get',
+                dataType: 'json',
+                url: url + '/messages/count',
+                params: param
+            }).success(function (data) {
+                $rootScope.unReadMessCount = data.count;
+
+            }).error(function (err) {
+                toaster.pop('error', err || '获取未读消息数量失败');
+            });
+        });
+        // InternalMessage.getUnread({isRead: 0}, function (data) {
+        //     $rootScope.unReadMessCount = data.toRead;
+        // }, function (err) {
+        //     toaster.pop('error', err || '获取未读消息数量失败');
+        // })
+    }]);
 
 	/**
 	 * 卖家中心菜单控制器

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

@@ -2,13 +2,13 @@
  * Created by yangck on 2017/3/30.
  */
 define(['app/app'], function(app) {
-    app.register.controller('MessagePersonalCtrl', ['$scope', '$rootScope', 'InternalMessage', 'toaster', '$sce', function($scope, $rootScope, InternalMessage, toaster, $sce) {
+    app.register.controller('MessagePersonalCtrl', ['$scope', '$rootScope', 'InternalMessage', 'toaster', '$sce', '$http', function($scope, $rootScope, InternalMessage, toaster, $sce, $http) {
         $rootScope.active = 'message';
         $scope.message = {};
         $scope.params = {
             page: 1,
             count: 10,
-            timeSorting: 'DESC',
+            timeSorting: '{\"createTime\":\"DESC\"}',
             classes: '',
             recRole: 'SELLER'
         };
@@ -197,8 +197,9 @@ define(['app/app'], function(app) {
 
         // 时间排序
         $scope.orderTime = function () {
-            $scope.params.timeSorting = $scope.params.timeSorting == 'DESC' ? 'ASC' : 'DESC'
-            $scope.params.sorting = {createTime: $scope.params.timeSorting};
+            /*$scope.params.timeSorting = $scope.params.timeSorting == 'DESC' ? 'ASC' : 'DESC'
+            $scope.params.sorting = {createTime: $scope.params.timeSorting};*/
+            $scope.params.timeSorting = $scope.params.timeSorting == '{\"createTime\":\"DESC\"}' ? '{\"createTime\":\"ASC\"}' : '{\"createTime\":\"DESC\"}';
             getData();
         };
 
@@ -220,11 +221,11 @@ define(['app/app'], function(app) {
             });
         };
 
-        $scope.unReadMessCount = $rootScope.unReadMessCount;
+        /*$scope.unReadMessCount = $rootScope.unReadMessCount;
         $scope.isReadMessCount = 0;
         var getData = function () {
-            /*InternalMessage.getUnread({isRead: 0}, function (data) {
-                $scope.unReadMessCount = data.toRead;*/
+            /!*InternalMessage.getUnread({isRead: 0}, function (data) {
+                $scope.unReadMessCount = data.toRead;*!/
             InternalMessage.getUnread({}, function (data) {
                 $scope.allReadMessCount = data.toRead;
             }, function (err) {
@@ -240,9 +241,9 @@ define(['app/app'], function(app) {
                     });
                     $scope.params.currentPage = data.number;
                     $scope.acculatePages(data.number, data.totalPages);
-                   /* if ($scope.tab == 'all') {
+                   /!* if ($scope.tab == 'all') {
                         $scope.isReadMessCount = data.totalElements;
-                    }*/
+                    }*!/
                     var params = {
                         page: 1,
                         count: 10,
@@ -278,7 +279,119 @@ define(['app/app'], function(app) {
             }, function(response) {
                 toaster.pop('error', '获取消息失败,请重新刷新界面,');
             });
+        };*/
+        $scope.unReadMessCount = $rootScope.unReadMessCount;
+        $scope.allReadMessCount = 0;
+        var getData = function () {
+            InternalMessage.getUrl({}, function(data) {
+
+                var url = data.url;
+                if (url == "http://218.17.158.219:24000/message") {
+                    url = 'http://192.168.253.6:24000/message';
+                }
+                var param = {
+                    'receiverUu': data.userUU,
+                    'receiverEnuu': data.enUU,
+                    'consumerApp': 'MALL',
+                    isRead: null
+                };
+                $http({
+                    method: 'get',
+                    dataType: 'json',
+                    url: url + '/messages/count',
+                    params: param
+                }).success(function (data) {
+                    $scope.allReadMessCount = data.count;
+                }).error(function (err) {
+                    toaster.pop('error', err || '获取未读消息数量失败');
+                });
+            })
+            InternalMessage.getUrl({}, function(info) {
+                if (info) {
+                    var url = info.url;
+                    if (url == "http://218.17.158.219:24000/message") {
+                        url = 'http://192.168.253.6:24000/message';
+                    }
+                    var param = {
+                        'receiverUu': info.userUU,
+                        'receiverEnuu': info.enUU,
+                        'consumerApp': 'MALL',
+                        isRead : $scope.params.isRead,
+                        page: $scope.params.page,
+                        count: 10,
+                        sorting: $scope.params.timeSorting ,
+                        classes: '',
+                        recRole: 'SELLER',
+                    }
+                    $http({
+                        method: 'get',
+                        dataType: 'json',
+                        url: url + '/messages',
+                        params: param
+                    }).success(function (data) {
+                        $scope.messageAllData = data;
+                        $scope.messageCurrent = data.content;
+
+                        var mess = new Array();
+                        var b = '';
+                        angular.forEach($scope.messageCurrent, function (message) {
+                            message.content = $sce.trustAsHtml(message.content);
+                            if(message.type =="MALL跳转卖家待报价页面"){
+                                message.url='/vendor#/seekPurchase';
+                            }else if (message.type =="MALL公共询价"){
+                                message.url='/user#/seekPurchase';
+                            }else if (message.type =="商城公共询价采纳结果"){
+                                message.url='/vendor#/vendorPurchaseOffer';
+                            }
+
+                            if(message.isRead != 1){
+                                b += message.id +",";
+                            }
+                        })
+                        mess = b.substring(0, b.length - 1);
+                        var param = {
+                            'receiverUu': info.userUU,
+                            'receiverEnuu': info.enUU,
+                            'messageId': mess,
+                            'consumerApp': 'MALL'
+
+                        };
+                        $http({
+                            method: 'post',
+                            dataType: 'json',
+                            url: url + '/messages/read',
+                            data:param
+                        });
+                        $scope.params.currentPage = data.number;
+                        $scope.acculatePages(data.number, data.totalPages);
+                    }).error(function (err) {
+                        toaster.pop('error', err || '获取未读消息数量失败');
+                    })
+                    if ($scope.tab == 'no') {
+                        // $rootScope.unReadMessCount = data.totalElements;
+                    } else {
+                        var param = {
+                            page: 1,
+                            count: 10,
+                            timeSorting: 'DESC',
+                            classes: '',
+                            recRole: 'SELLER',
+                            'isRead': 0
+                        };
+                        InternalMessage.getUrl({}, function(data) {
+                            /*InternalMessage.getUnread({isRead: 0}, function (data) {*/
+                            InternalMessage.getUrl({isRead: 0}, function (data) {
+                                $rootScope.unReadMessCount = data.count;
+                                $scope.unReadMessCount = data.count;
+                            })
+                        })
+                    }
+                }
+            }, function(response) {
+                toaster.pop('error', '获取消息失败,请重新刷新界面,');
+            });
         };
+
         // 批量删除
         $scope.deleteBatch = function () {
             var hasDelete = false;

+ 25 - 4
src/main/webapp/resources/js/vendor/controllers/forstore/purchase_detail.js

@@ -144,6 +144,9 @@ define(['app/app'], function(app) {
 		}
 		// 监控价格
 		$scope.changeInstallmentPrice = function (item, price, index) {
+            if ($scope.saveInstallmentEnter) {
+                return ;
+            }
 			if (price == '') {
 				toaster.pop('warning', '提示', '支付金额不能为空');
 			} else if (isNaN(price)) {
@@ -220,6 +223,14 @@ define(['app/app'], function(app) {
 				$scope.totalPrice += Number(item.price);
 			})
 		};
+
+		$scope.saveInstallmentLeave = function() {
+            $scope.saveInstallmentEnter = false;
+        }
+
+        $scope.saveInstallmentEnter = function() {
+            $scope.saveInstallmentEnter = true;
+        }
 		// 保存分期付款
 		$scope.saveInstallment = function (installmentDetails) {
 			// if(!$scope.changeBlurDeadline(installmentDetails)){
@@ -229,6 +240,7 @@ define(['app/app'], function(app) {
 			for (var i = 0; i < installmentDetails.length; i++) {
 				if (!installmentDetails[i].price) {
 					toaster.pop('warning', '提示', '支付金额不能为空');
+                    return ;
 				}
 				if (!installmentDetails[i].deadline) {
 					toaster.pop('warning', '提示', '付款时间不能为空');
@@ -474,6 +486,10 @@ define(['app/app'], function(app) {
 
 				$scope.purchase.invoiceInfo = angular.fromJson($scope.purchase.invoiceAddress)
 
+        for (var i = 0; i < $scope.purchase.purchaseDetails.length; i++) {
+          $scope.purchase.purchaseDetails[i].currentTaxUnitPrice = $scope.purchase.purchaseDetails[i].taxUnitPrice;
+          $scope.purchase.purchaseDetails[i].detailTotal = $scope.purchase.purchaseDetails[i].taxUnitPrice * $scope.purchase.purchaseDetails[i].number;
+        }
 			}, function () {
 				$scope.error('获取订单信息请求失败');
 			});
@@ -549,10 +565,15 @@ define(['app/app'], function(app) {
 			} else {
 				$scope.cancelSwitch();
 			}
-			angular.forEach($scope.purchase.purchaseDetails, function (detail) {
-				detail.currentTaxUnitPrice = detail.taxUnitPrice;
-				detail.detailTotal = detail.taxUnitPrice * detail.number;
-			});
+      for (var i = 0; i < $scope.purchase.purchaseDetails.length; i++) {
+        $scope.purchase.purchaseDetails[i].currentTaxUnitPrice = $scope.purchase.purchaseDetails[i].taxUnitPrice;
+        $scope.purchase.purchaseDetails[i].detailTotal = $scope.purchase.purchaseDetails[i].taxUnitPrice * $scope.purchase.purchaseDetails[i].number;
+      }
+      // console.log($scope.purchase.purchaseDetails)
+      // angular.forEach($scope.purchase.purchaseDetails, function (detail) {
+				// detail.currentTaxUnitPrice = detail.taxUnitPrice;
+				// detail.detailTotal = detail.taxUnitPrice * detail.number;
+      // });
 			$scope.purchase.currentTotal = $scope.purchase.ensurePrice;
         };
 

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

@@ -213,7 +213,7 @@ define(['app/app'], function (app) {
                   $scope.isShowSayPriceBox = false;
                   $scope.seekPurchaseTableParams.reload();
                 }, function (response) {
-                  toaster.pop('error', '请勿重复报价或报价自己的求购2');
+                  toaster.pop('error', '请勿重复报价或报价自己的求购');
                 });
               }
             } else {

+ 36 - 38
src/main/webapp/resources/js/vendor/controllers/forstore/vendor_index_ctrl.js

@@ -8,7 +8,6 @@ define(['app/app', 'calendar'], function(app) {
         $rootScope.active = 'index';
         $scope.count = 0;
         $scope.userInfo = $rootScope.userInfo;
-        console.log($scope.userInfo);
 
         // 申请
         $scope.auditApply = function (status, id, UU) {
@@ -167,47 +166,46 @@ define(['app/app', 'calendar'], function(app) {
         };
 
         //安全设置提醒框
-        $scope.openHomeCenterModel = function() {
-            var modalInstance = $modal.open({
-              animation: true,
-              templateUrl: $rootScope.rootPath + '/static/view/usercenter/modal/homeCenter_modal.html',
-              controller:'homeModalCtrl'
-            });
-            modalInstance.result.then(function(){
-            }, function(){
-            });
-        }
+        // $scope.openHomeCenterModel = function() {
+        //     var modalInstance = $modal.open({
+        //       animation: true,
+        //       templateUrl: $rootScope.rootPath + '/static/view/usercenter/modal/homeCenter_modal.html',
+        //       controller:'homeModalCtrl'
+        //     });
+        //     modalInstance.result.then(function(){
+        //     }, function(){
+        //     });
+        // }
 
         //安全级别
-        if(!($scope.userInfo.pwdEnable && $scope.userInfo.haveUserQuestion && ($scope.userInfo.userEmail==null?false:true))){
-            $scope.openHomeCenterModel();
-        } else {
-            $q.all([initRuleCount().$promise]).then(function (data) {
-                if (data){
-                    if ($scope.needShowTip){
-                        $modal.open({
-                            animation: true,
-                            templateUrl: 'static/view/common/modal/delivery_rule_modal.html',
-                            controller: 'rule_tip_ctrl',
-                            resolve : {
-                                type : function() {
-                                    return 'center';
-                                },
-                                tipModal : function() {
-                                    return true;
-                                },
-                                success : function () {
-                                    return false;
-                                },
-                                uuid: function () {
-                                    return null;
-                                }
+        $q.all([initRuleCount().$promise]).then(function (data) {
+            if (data){
+                if ($scope.needShowTip){
+                    $modal.open({
+                        animation: true,
+                        templateUrl: 'static/view/common/modal/delivery_rule_modal.html',
+                        controller: 'rule_tip_ctrl',
+                        resolve : {
+                            type : function() {
+                                return 'center';
+                            },
+                            tipModal : function() {
+                                return true;
+                            },
+                            success : function () {
+                                return false;
+                            },
+                            uuid: function () {
+                                return null;
                             }
-                        });
-                    }
+                        }
+                    });
                 }
-            });
-        }
+            }
+        });
+        // if(!($scope.userInfo.pwdEnable && $scope.userInfo.haveUserQuestion && ($scope.userInfo.userEmail==null?false:true))){
+        //     // $scope.openHomeCenterModel();
+        // } else {}
 
     }]);
 

+ 4 - 0
src/main/webapp/resources/js/vendor/controllers/forstore/vendor_onSaleCtrl.js

@@ -743,6 +743,7 @@ define([ 'app/app' ], function(app) {
             commodity.editMinPackQtyPre = commodity.minPackQty;
             commodity.editMinPackQtyDirty = false;
             commodity.editMinPackQtyInValid = false;
+            commodity.editspec = commodity.spec;
 
             commodity.editBreakUp = commodity.breakUp;
             commodity.editBreakUpPre = commodity.breakUp;
@@ -1806,6 +1807,9 @@ define([ 'app/app' ], function(app) {
                 $scope.modifyData = data;
                 $scope.batchModify = false;
                 $scope.modifyResult = true;
+                if ($scope.modifyData.success > 0) {
+                    loadData();
+                }
             }).error(function(response) {
                 $scope.selectFile(' ');
                 $scope.myFile = [];

+ 48 - 18
src/main/webapp/resources/js/vendor/controllers/forstore/vendor_order_ctrl.js

@@ -571,28 +571,44 @@ define(['app/app'], function (app) {
         };
         getCounts();
 
+        //安全设置提醒框
+        $scope.openHomeCenterModel = function() {
+            var modalInstance = $modal.open({
+              animation: true,
+              templateUrl: $rootScope.rootPath + '/static/view/usercenter/modal/homeCenter_modal.html',
+              controller:'homeModalCtrl'
+            });
+            modalInstance.result.then(function(){
+            }, function(){
+            });
+        }
+
         // 填写物流信息
         $scope.toBeShiped = function (purchase) {
-            bankInfoService.getVenderBankDefault(null, function (data) {
-                if (data && data.length > 0) {
-                    // 如果处于406,则直接跳转到物流页面
-                    if (purchase.inid) {
-                        // 填写物流信息
-                        $state.go("vendor_delivery", {ids: enIdFilter(purchase.inid)});
-                    } else {
-                        Purchase.tobeshiped({id: purchase.id}, function (data) {
-                            toaster.pop('success', '转出货单成功');
+            if(!($scope.userInfo.pwdEnable && $scope.userInfo.haveUserQuestion && $scope.userInfo.emailValidCode == 2)){
+                $scope.openHomeCenterModel();
+            } else {
+                bankInfoService.getVenderBankDefault(null, function (data) {
+                    if (data && data.length > 0) {
+                        // 如果处于406,则直接跳转到物流页面
+                        if (purchase.inid) {
                             // 填写物流信息
-                            $state.go("vendor_delivery", {ids: enIdFilter(data.inId)});
-                        }, function (response) {
-                            toaster.pop('error', '失败', '转出货单失败' + response.data);
-                        });
+                            $state.go("vendor_delivery", {ids: enIdFilter(purchase.inid)});
+                        } else {
+                            Purchase.tobeshiped({id: purchase.id}, function (data) {
+                                toaster.pop('success', '转出货单成功');
+                                // 填写物流信息
+                                $state.go("vendor_delivery", {ids: enIdFilter(data.inId)});
+                            }, function (response) {
+                                toaster.pop('error', '失败', '转出货单失败' + response.data);
+                            });
+                        }
+                    } else {
+                        purchase.showGotoSettle = true;
                     }
-                } else {
-                    purchase.showGotoSettle = true;
-                }
-            }, function (response) {
-            });
+                }, function (response) {
+                });
+            }
         };
 
         $scope.showDeletePurchase = function (purchase) {
@@ -1710,4 +1726,18 @@ define(['app/app'], function (app) {
         }
 
     }]);
+    app.register.controller('homeModalCtrl', ['$rootScope', '$scope',  '$modalInstance', 'toaster', '$http', 'ShippingAddress','$state', function($rootScope, $scope, $modalInstance, toaster, $http, ShippingAddress,$state){
+        $rootScope.$on('$stateChangeStart',
+            function(event, toState, toParams, fromState, fromParams){
+                $modalInstance.dismiss();
+            })
+        $scope.goLink = function(op) {
+            $state.go('vendor_account_management',{op:op});
+            $modalInstance.dismiss('cancel');
+        }
+
+        $scope.cancel = function () {
+            $modalInstance.dismiss('cancel');
+        }
+    }]);
 });

+ 15 - 11
src/main/webapp/resources/js/vendor/controllers/forstore/vendor_store_maintain_ctrl.js

@@ -140,10 +140,10 @@ define(['app/app'], function (app) {
 		 * @param module	模块名称
 		 */
 		$scope.showEdit = function (module) {
-            if ($rootScope.userInfo.userUU != $rootScope.userInfo.enterprise.enAdminuu) {
-                toaster.pop('error', '您无该模块的编辑权限,请联系企业管理员进行编辑维护!');
-                return;
-            }
+			if ($rootScope.userInfo.userUU != $rootScope.userInfo.enterprise.enAdminuu) {
+				toaster.pop('error', '您无该模块的编辑权限,请联系企业管理员进行编辑维护!');
+				return;
+			}
 			changeEditStatus(module, true);
 		};
 
@@ -231,7 +231,7 @@ define(['app/app'], function (app) {
          */
         $scope.checkWeixin = function () {
             var enWeixin = angular.element('.enWeixin').val();
-            if (!/^[a-zA-Z]{1}[-_a-zA-Z0-9]{5,19}$/.test(enWeixin) && enWeixin) {
+            if (!/^[0-9a-zA-Z]{6,20}$/.test(enWeixin) && enWeixin) {
                 toaster.pop('error', '请输入正确的微信号');
                 return false;
             }
@@ -261,10 +261,10 @@ define(['app/app'], function (app) {
 				toaster.pop('error', '店铺信息不能为空');
 				return false;
 			}
-			if (!$scope.sampleStore.description || $scope.sampleStore.description == '') {
-				toaster.pop('error', '店铺简介信息不能为空');
-				return false;
-			}
+			// if (!$scope.sampleStore.description || $scope.sampleStore.description == '') {
+			// 	toaster.pop('error', '店铺简介信息不能为空');
+			// 	return false;
+			// }
 			if (!$scope.sampleStore.enterprise) {
 				toaster.pop('error', '企业信息不能为空');
 				return false;
@@ -274,7 +274,7 @@ define(['app/app'], function (app) {
 				return false;
 			}*/
 			if (!$scope.sampleStore.enterprise.address || $scope.sampleStore.enterprise.address == '') {
-				toaster.pop('error', '企业地址不能为空');
+				toaster.pop('error', '店铺地址不能为空');
 				return false;
 			}
 			if (!$scope.sampleStore.enterprise.enTel || $scope.sampleStore.enterprise.enTel == '') {
@@ -288,7 +288,7 @@ define(['app/app'], function (app) {
                 return false;
             }
 
-            if (!/^[a-zA-Z]{1}[-_a-zA-Z0-9]{5,19}$/.test(enWeixin) && enWeixin) {
+            if (!/^[0-9a-zA-Z]{6,20}$/.test(enWeixin) && enWeixin) {
                 toaster.pop('error', '请输入正确的微信号');
                 return false;
             }
@@ -542,6 +542,10 @@ define(['app/app'], function (app) {
 		$scope.cancleProductEdit = cancleProductEdit;
 
 		function editRecommendProduct(module, status) {
+			if ($rootScope.userInfo.userUU != $rootScope.userInfo.enterprise.enAdminuu) {
+				toaster.pop('error', '您无该模块的编辑权限,请联系企业管理员进行编辑维护!');
+				return;
+			}
 			if (module == 'BATCH_OPERATION') {
 				$scope.canBatchOperation = status;
 				return ;

+ 5 - 1
src/main/webapp/resources/js/vendor/controllers/forstore/vendor_upload_ctrl.js

@@ -274,7 +274,11 @@ define([ 'app/app' ], function(app) {
 				// if(!message) {
 				// 	message = '没有提交任何信息'
 				// }
-				toaster.pop('info', '提示', '上传完成');
+                if ($scope.result.filter && $scope.result.filter > 0) {
+                    toaster.pop('warning', '警告', '存在导入失败产品,可下载导入失败表格查看详情');
+                } else {
+                    toaster.pop('success', '提示', '上传完成');
+                }
 				$scope.relTableParams.page(1);
 				$scope.relTableParams.reload();
                 if ($rootScope.$$productOn.tab === 'bathOnPerson') {

+ 1 - 1
src/main/webapp/resources/view/admin/trade/trade_order.html

@@ -209,7 +209,7 @@
 							<td class="text-center">{{order.status | statusAndTypeFilter}}</td>
 							<td class="text-center">
 								<a ng-if="order.status==504 || order.status==503" ng-show="active=='tobereceived'" style="position: relative;">
-									<button type="button" ng-if="order.status==504 && !order.installmentId" class="btn btn-default btn-sm" ng-click="ensurePay(order)">确认收款</button>
+									<button type="button" ng-if="(order.status==504 && !order.installmentId) || (order.status==504 && order.installmentId && order.installment.status==503)" class="btn btn-default btn-sm" ng-click="ensurePay(order)">确认收款</button>
 									<button ng-if="order.status==504" type="button" class="btn btn-default btn-sm" ng-click="showAuditFailureModal(order)">审核不通过</button>
 									<div class="audit-failure-modal" ng-if="order.dislayModal">
 										<div class="title">审核不通过的原因</div>

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

@@ -273,9 +273,9 @@ td {
 				<a name="detail" href="product/component/{{item.componentinfo.uuid}}/">
                     <img ng-src="{{item.componentinfo.img || 'static/img/user/images/default.png'}}" class="collect-img" />
                     <div class="collect-content">
-                        <p ng-bind="item.componentinfo.code"></p>
-                        <p ng-bind="item.componentinfo.brand.nameEn">
-                        <p ng-bind="item.componentinfo.kind.nameCn">           
+												<p ng-bind="item.componentinfo.brand.nameEn">
+												<p ng-bind="item.componentinfo.kind.nameCn">
+												<p ng-bind="item.componentinfo.code"></p>
                     </div> 
                 </a>
                 <span class="collect-delete" ng-click="cancleStore(item.id)" ng-show="show && !isBatch"><i class="fa fa-trash fa-2x"></i></span>      

+ 6 - 6
src/main/webapp/resources/view/usercenter/forstore/bomDetail.html

@@ -631,7 +631,7 @@
             <thead>
             <tr>
                 <th width="110">发布时间</th>
-                <th width="260">类目/品牌</th>
+                <th width="260">品牌/类目</th>
                 <th width="260">型号/规格</th>
                 <th width="110">采购数量(PCS)</th>
                 <th width="120">截止时间</th>
@@ -662,21 +662,21 @@
                 <td>
                     <div class="row-wrap il-content">
                         <div class="il-box-large il-box">
-                            <div title="{{seek.prodTitle | nullStrFilter}}" class="fl item size-middle"><span>类目(产品名称):</span><div class="content">{{(seek.prodTitle || '-') | nullStrFilter}}</div></div>
-                            <div title="{{seek.inbrand}}" class="fl item bottom size-middle"><span>品牌:</span><div class="content">{{seek.inbrand || '-'}}</div></div>
+                            <div title="{{seek.inbrand}}"  style="width: 100%"  class="fl item size-middle"><span>品牌:</span><div class="content" style="width:135px">{{seek.inbrand || '-'}}</div></div>
+                            <div title="{{seek.prodTitle | nullStrFilter}}" style="width: 100%"  class="fl bottom item size-middle"><span>类目(产品名称):</span><div class="content" style="width:135px">{{(seek.prodTitle || '-') | nullStrFilter}}</div></div>
                         </div>
                     </div>
                 </td>
                 <td>
                     <div class="row-wrap il-content">
                         <div class="il-box-large il-box">
-                            <div title="{{seek.cmpCode}}" class="fl item"><span>型号:</span><div class="content">{{seek.cmpCode || '-'}}</div></div>
-                            <div title="{{seek.spec}}" class="fl item bottom"><span>规格:</span><div class="content">{{seek.spec || '-'}}</div></div>
+                            <div title="{{seek.cmpCode}}" style="width: 100%"  class="fl item"><span>型号:</span><div class="content" style="width:135px">{{seek.cmpCode || '-'}}</div></div>
+                            <div title="{{seek.spec}}" style="width: 100%"  class="fl item bottom"><span>规格:</span><div class="content" style="width:135px">{{seek.spec || '-'}}</div></div>
                         </div>
                     </div>
                 </td>
                 <td>
-                    <div class="row-wrap il-content">
+                    <div class="row-wrap il-content" style="padding-top: 0px">
                         <div class="il-box-small il-box">
                             <!--<div title="{{seek.encapsulation}}" class="item"><span>封装:</span>{{seek.encapsulation || '-'}}</div>
                             <div title="{{seek.produceDate}}" class="item"><span>生产日期:</span>{{seek.produceDate || '-'}}</div>-->

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

@@ -665,12 +665,12 @@
 									<a href="store/productDetail/{{::cart.batchCode}}" target="_blank">
                                         <img ng-src="{{cart.img || 'static/img/store/common/default.png'}}" width="60" height="60"/></a>
 									<div class="car_pro_xq">
+											<i class="text-hidden" ng-if="!cart.uuid">品牌:<a ng-bind="::cart.goods.brandNameEn || '-'" title="{{::cart.goods.brandNameEn}}" class="unstand"></a></i>
+									   <i class="text-hidden" ng-if="cart.uuid">品牌:<a href="product/brand/{{::cart.goods.branduuid}}/" target="_blank" ng-bind="::cart.goods.brandNameEn" title="{{::cart.goods.brandNameEn}}"></a></i>
 									    <i class="text-hidden" ng-if="!cart.uuid">类目:<a ng-bind="::cart.kiName || '-'" title="{{::cart.kiName}}" class="unstand"></a></i>
 									    <i class="text-hidden" ng-if="cart.uuid">类目:<a href="product/kind/{{cart.goods.kindUuid}}" target="_blank" ng-bind="::cart.kiName" title="{{::cart.kiName}}"></a></i>
 									    <i class="text-hidden">型号:<a href="store/productDetail/{{::cart.batchCode}}" target="_blank" ng-bind="::cart.code || '-'" title="{{::cart.code}}"></a></i>
-									   <i class="text-hidden" ng-if="!cart.uuid">品牌:<a ng-bind="::cart.goods.brandNameEn || '-'" title="{{::cart.goods.brandNameEn}}" class="unstand"></a></i>
-									   <i class="text-hidden" ng-if="cart.uuid">品牌:<a href="product/brand/{{::cart.goods.branduuid}}/" target="_blank" ng-bind="::cart.goods.brandNameEn" title="{{::cart.goods.brandNameEn}}"></a></i>
-									</div>
+									   </div>
 								</div>
                         	</span>
 							<span class="wd02">

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

@@ -903,10 +903,10 @@
 							<div class="pro_xq">
 								<a href="store/productDetail/{{::detail.batchCode}}" target="_blank"><img ng-src="{{detail.img || 'static/img/store/common/default.png'}}" width="55" height="55"/></a>
 								<p>
+									品牌:<a href="product/brand/{{::detail.branduuid}}/" target="_blank" ng-if="detail.uuid"><em ng-bind="::detail.brName || '-'" title="{{::detail.brName}}"></em></a><br/>
 									类目:<a href="product/kind/{{::detail.kindUuid}}" target="_blank" ng-if="detail.uuid"><em ng-bind="::detail.kiName || '-'" title="{{::detail.kiName}}"></em></a><br ng-if="detail.uuid"/>
 									<a class="unstand" ng-if="!detail.uuid"><em ng-bind="detail.kiName || '-'" title="{{::detail.kiName}}"></em></a><br ng-if="!detail.uuid"/>
-									型号:<a href="store/productDetail/{{::detail.batchCode}}" target="_blank"><em ng-bind="::detail.cmpCode || '-'" title="{{::detail.cmpCode}}"></em></a><br/>
-									品牌:<a href="product/brand/{{::detail.branduuid}}/" target="_blank" ng-if="detail.uuid"><em ng-bind="::detail.brName || '-'" title="{{::detail.brName}}"></em></a>
+									型号:<a href="store/productDetail/{{::detail.batchCode}}" target="_blank"><em ng-bind="::detail.cmpCode || '-'" title="{{::detail.cmpCode}}"></em></a>
 									<a  class="unstand" ng-if="!detail.uuid"><em ng-bind="detail.brName || '-'" title="{{::detail.brName}}"></em></a>
 								</p>
 							</div>
@@ -933,14 +933,14 @@
 						</span>
 						<span class="oder_deal" ng-class="{'order-border-bottom-solid' : $index == order.orderDetails.length -1 || $index==2}">
                             <div ng-if="$index == 0">
-								<a class="operate-height" href="user#/order/pay/{{order.orderid | EncryptionFilter}}" ng-if="(order.status == 503 || order.status == 501) && order.auditPayFailReason == null && !order.installmentId" style="display: block;">
+								<a class="operate-height" href="user#/order/pay/{{order.orderid | EncryptionFilter}}" ng-if="(order.status == 503 || order.status == 501) && !order.installmentId" style="display: block;">
                                 <a ng-if="(order.status == 405 || order.status == 520) && !order.rateStatus" class="operate-height" target="_blank" href="user#/rate/firstRate/{{order.orderid | EncryptionFilter}}" style="display: block;">
                                   <em class="order-operation">评价</em>
                               	</a>
 								<a ng-if="order.rateStatus == 523" class="operate-height" target="_blank" href="user#/rate/addRate/{{order.orderid | EncryptionFilter}}" style="display: block;">
                                   <em class="order-operation">追加评价</em>
                               	</a>
-                              <a class="operate-height" href="user#/order/pay/{{order.orderid | EncryptionFilter}}" ng-if="!order.installmentId&&(order.status == 503 || order.status == 501) && order.auditPayFailReason == null" style="display: block;">
+                              <a class="operate-height" href="user#/order/pay/{{order.orderid | EncryptionFilter}}" ng-if="!order.installmentId&&(order.status == 503 || order.status == 501)" style="display: block;">
                                   <em class="order-operation">立即付款</em>
 								</a>
 								<a ng-click="requestCancel(order, order.orderid)" ng-if="order.status == 525" class="operate-height">

+ 20 - 22
src/main/webapp/resources/view/usercenter/forstore/buyer_transfer.html

@@ -3,25 +3,24 @@
 <div class="user_right fr">
 	<div class="down-payment">
 		<div class="content">
-			<!--<div class="common-title margin-top-none">付款账户</div>-->
-			<!--<div class="payment-style">-->
-				<!--<ul>-->
-					<!--<li ng-if="buyAccount">-->
-						<!--<label class="check-act" style="margin-right: 64px;">-->
-							<!--<input type="radio" id="1" name="1" checked/>-->
-							<!--<label for="1"></label>-->
-							<!--<em class="word-in-10" ng-bind="buyAccount.bankname" title="{{buyAccount.bankname}}"></em>-->
-						<!--</label>-->
-						<!--<div ng-bind="buyAccount.filterAccount"></div>-->
-						<!--<div ng-bind="buyAccount.accountname"></div>-->
-						<!--<div ng-if="buyAccountInfos.length > 1"><button class="change-count" ng-click="changebuyAccount(buyAccount.id)">更换账户</button></div>-->
-					<!--</li>-->
-					<!--<li class="no-count" ng-if="!buyAccount">-->
-						<!--<span><i class="fa fa-exclamation-circle"></i>暂未设置付款账户,前往  <a href="javascript:void(0)" ng-click="editAccount()">设置付款账户</a></span>-->
-					<!--</li>-->
-				<!--</ul>-->
-			<!--</div>-->
-			<!--
+			<div class="common-title margin-top-none">付款账户</div>
+			<div class="payment-style">
+				<ul>
+					<li ng-if="buyAccount">
+						<label class="check-act" style="margin-right: 64px;">
+							<input type="radio" id="1" name="1" checked/>
+							<label for="1"></label>
+							<em class="word-in-10" ng-bind="buyAccount.bankname" title="{{buyAccount.bankname}}"></em>
+						</label>
+						<div ng-bind="buyAccount.filterAccount"></div>
+						<div ng-bind="buyAccount.accountname"></div>
+						<div ng-if="buyAccountInfos.length > 1"><button class="change-count" ng-click="changebuyAccount(buyAccount.id)">更换账户</button></div>
+					</li>
+					<li class="no-count" ng-if="!buyAccount">
+						<span><i class="fa fa-exclamation-circle"></i>暂未设置付款账户,前往  <a href="javascript:void(0)" ng-click="editAccount()">设置付款账户</a></span>
+					</li>
+				</ul>
+			</div>
 			<div class="common-title margin-top-8">收款账户</div>
 			<div class="payment-style">
 				<ul class="payment-80">
@@ -61,11 +60,10 @@
 						<div ng-if="type == 'PAIDTOVENDOR'" ng-bind="salePerAccount.bankname" title="{{salePerAccount.bankname}}" class="word-in-10"></div>
 						<div ng-if="type == 'PAIDTOVENDOR'" ng-bind="salePerAccount.number"></div>
 						<div ng-if="type == 'PAIDTOVENDOR'" ng-bind="salePerAccount.accountname"></div>
-						<div ng-if="!salePerAccount || salePerAccount == null"><i class="fa fa-exclamation-circle" style="color: #5078cb;margin-right: 5px;"></i>尚未选择收款账户,请联系卖家处理</div>
+						<div ng-if="!salePerAccount || salePerAccount == null"><i class="fa fa-exclamation-circle" style="color: #5078cb;margin-right: 5px;"></i>卖家尚未设置收款账户,请联系卖家处理</div>
 					</li>
 				</ul>
 			</div>
-			-->
 			<div class="common-title margin-top-8" ng-if="type == 'PAIDTOVENDOR'">分期付款明细</div>
 			<div class="payment-detail" ng-if="type == 'PAIDTOVENDOR'">
 				<ul>
@@ -172,7 +170,7 @@
 			</div>
 			<div class="row" style="margin-top: 0;">
 				<div class="deal-btn">
-					<a ng-click="confirm()" class="ok">确认</a>
+					<a ng-click="confirm()" class="ok" ng-mouseenter="yesPayinstallmentEnter()" ng-mouseleave="yesPayinstallmentLeave()">确认</a>
 					<a ng-click="loadPage()" class="off">取消</a>
 				</div>
 			</div>

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

@@ -153,7 +153,7 @@
                 </select>
             </div>-->
             <div class="filter-list">
-                <a ng-click="orderTime()">时间<i class="fa fa-long-arrow-up" aria-hidden="true" ng-show="params.timeSorting == 'ASC'"></i><i class="fa fa-long-arrow-down" aria-hidden="true" ng-show="params.timeSorting == 'DESC'"></i></a>
+                <a ng-click="orderTime()">时间<i class="fa fa-long-arrow-up" aria-hidden="true" ng-show="params.timeSorting == '{&quot;createTime&quot;:&quot;DESC&quot;}'"></i><i class="fa fa-long-arrow-down" aria-hidden="true" ng-show="params.timeSorting == '{&quot;createTime&quot;:&quot;ASC&quot;}'"></i></a>
             <!--  <a ng-click="deleteBatch()">删除</a>-->
                <!-- <label class="check-active">
                     <input type="checkbox" id="isChooseAll" ng-click="chooseAll()" ng-model="isChoosedAll">

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

@@ -428,7 +428,13 @@
                             <a href="store/productDetail/{{::detail.batchCode}}" target="_blank">
 								<img ng-src="{{detail.img ? detail.img : 'static/img/store/common/default.png'}}"/>
 							</a>
-                            <p class="style01" style="margin-top: 10px;" ng-if="detail.uuid">类目:
+													<p class="style01" ng-if="detail.uuid" style="margin-top: 10px;">品牌:
+								<a ng-bind="detail.brName" href="product/brand/{{::detail.branduuid}}/" title="{{detail.brName}}" target="_blank"></a>
+							</p>
+							<p class="style01" ng-if="!detail.uuid" style="margin-top: 10px;">品牌:
+								<a ng-bind="detail.brName || '-'" title="{{detail.brName}}" class="unstand"></a>
+							</p>
+                            <p class="style01" ng-if="detail.uuid">类目:
 								<a ng-bind="detail.kiName || '-'" href="product/kind/{{::detail.kindUuid}}" title="{{detail.kiName}}" target="_blank"></a>
 							</p>
 							 <p class="style01" style="margin-top: 10px;" ng-if="!detail.uuid">类目:
@@ -437,13 +443,7 @@
 							<p class="style01">型号:
 								<a ng-bind="detail.cmpCode || '-'" href="store/productDetail/{{::detail.batchCode}}" title="{{detail.cmpCode}}" target="_blank"></a>
 							</p>
-							<p class="style01" ng-if="detail.uuid">品牌:
-								<a ng-bind="detail.brName" href="product/brand/{{::detail.branduuid}}/" title="{{detail.brName}}" target="_blank"></a>
-							</p>
-							<p class="style01" ng-if="!detail.uuid">品牌:
-								<a ng-bind="detail.brName || '-'" title="{{detail.brName}}" class="unstand"></a>
-							</p>
-                        </span>
+												</span>
 							<span class="wd01">交期:
 							<i ng-if="detail.b2cMinDelivery != detail.b2cMaxDelivery" ng-bind="detail.b2cMinDelivery + '-' + detail.b2cMaxDelivery"></i>
 							<i ng-if="detail.b2cMinDelivery == detail.b2cMaxDelivery" ng-bind="detail.b2cMinDelivery"></i>

Некоторые файлы не были показаны из-за большого количества измененных файлов