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

Merge remote-tracking branch 'origin/dev' into vendor_logistics_v2

# Conflicts:
#	src/main/webapp/resources/view/usercenter/forstore/order_pay.html
#	src/main/webapp/resources/view/vendor/forstore/product_file.html
#	src/main/webapp/resources/view/vendor/forstore/purchase_detail.html
#	src/main/webapp/resources/view/vendor/forstore/vendor_delivery.html
hulh 8 лет назад
Родитель
Сommit
82bf395eba
69 измененных файлов с 1796 добавлено и 525 удалено
  1. 1 0
      .gitignore
  2. 2 1
      Readme.md
  3. 26 0
      src/main/java/com/uas/platform/b2c/common/account/controller/AuthenticationController.java
  4. 1 1
      src/main/java/com/uas/platform/b2c/common/account/controller/EnterpriseController.java
  5. 11 4
      src/main/java/com/uas/platform/b2c/common/account/service/impl/EnterpriseServiceImpl.java
  6. 3 3
      src/main/java/com/uas/platform/b2c/common/help/service/impl/HelpNavServiceImpl.java
  7. 55 0
      src/main/java/com/uas/platform/b2c/common/search/controller/SearcherController.java
  8. 24 24
      src/main/java/com/uas/platform/b2c/prod/commodity/model/GoodsQtyPrice.java
  9. 4 1
      src/main/java/com/uas/platform/b2c/prod/product/brand/service/impl/BrandSubmitServiceImpl.java
  10. 2 1
      src/main/java/com/uas/platform/b2c/prod/store/api/StoreInController.java
  11. 66 0
      src/main/java/com/uas/platform/b2c/prod/store/controller/ConsignmentAgreeRecordController.java
  12. 9 3
      src/main/java/com/uas/platform/b2c/prod/store/controller/StoreInformationController.java
  13. 26 0
      src/main/java/com/uas/platform/b2c/prod/store/dao/ConsignmentAgreeRecordDao.java
  14. 135 0
      src/main/java/com/uas/platform/b2c/prod/store/model/ConsignmentAgreeRecord.java
  15. 14 0
      src/main/java/com/uas/platform/b2c/prod/store/model/StoreViolations.java
  16. 35 0
      src/main/java/com/uas/platform/b2c/prod/store/service/ConsignmentAgreeRecordService.java
  17. 128 0
      src/main/java/com/uas/platform/b2c/prod/store/service/impl/ConsignmentAgreeRecordServiceImpl.java
  18. 6 0
      src/main/java/com/uas/platform/b2c/prod/store/service/impl/StoreViolationsServiceImpl.java
  19. 4 2
      src/main/java/com/uas/platform/b2c/trade/presale/controller/CollectionController.java
  20. 1 0
      src/main/java/com/uas/platform/b2c/trade/presale/service/impl/CartServiceImpl.java
  21. 4 0
      src/main/java/com/uas/platform/b2c/trade/presale/service/impl/CollectionServiceImpl.java
  22. 3 0
      src/main/java/com/uas/platform/b2c/trade/presale/service/impl/StoreFocusServiceImpl.java
  23. 47 0
      src/main/webapp/WEB-INF/views/normal/store_close.html
  24. 47 0
      src/main/webapp/WEB-INF/views/normal/store_none.html
  25. 2 1
      src/main/webapp/resources/js/admin/app.js
  26. 78 1
      src/main/webapp/resources/js/admin/controllers/StoreInfoListCtrl.js
  27. 9 5
      src/main/webapp/resources/js/admin/controllers/help/HelpDetailCtrl.js
  28. 1 0
      src/main/webapp/resources/js/admin/controllers/store/StoreInfoDetailCtrl.js
  29. 48 4
      src/main/webapp/resources/js/common/module/store_admin_violations_module.js
  30. 39 1
      src/main/webapp/resources/js/common/query/storeInfo.js
  31. 1 0
      src/main/webapp/resources/js/prod/controllers/ComponentCtrl.js
  32. 12 2
      src/main/webapp/resources/js/usercenter/app.js
  33. 63 101
      src/main/webapp/resources/js/usercenter/controllers/forstore/account_manager_ctrl.js
  34. 69 64
      src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_cart_ctrl.js
  35. 10 0
      src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_order_ctrl.js
  36. 78 37
      src/main/webapp/resources/js/usercenter/controllers/forstore/order_pay_ctrl.js
  37. 15 2
      src/main/webapp/resources/js/vendor/controllers/forstore/purchase_detail.js
  38. 74 37
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_delivery_ctrl.js
  39. 0 1
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_logistics_ctrl.js
  40. 10 0
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_order_ctrl.js
  41. 74 4
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_standard_putOn_ctrl.js
  42. 47 2
      src/main/webapp/resources/view/admin/store/fragments/enterprise_info.html
  43. 6 2
      src/main/webapp/resources/view/admin/store/fragments/violations_detail.html
  44. 8 2
      src/main/webapp/resources/view/admin/store/fragments/violations_handler.html
  45. 1 6
      src/main/webapp/resources/view/admin/store/fragments/violations_list.html
  46. 1 1
      src/main/webapp/resources/view/admin/store/store_info_detail.html
  47. 3 3
      src/main/webapp/resources/view/admin/store_info_list.html
  48. 12 2
      src/main/webapp/resources/view/common/site-nav.html
  49. 2 2
      src/main/webapp/resources/view/prod/modal/edit-invoice-modal.html
  50. 23 0
      src/main/webapp/resources/view/store/default/store-close.html
  51. 23 0
      src/main/webapp/resources/view/store/default/store-none.html
  52. 1 1
      src/main/webapp/resources/view/usercenter/forstore/account_manager.html
  53. 2 1
      src/main/webapp/resources/view/usercenter/forstore/browsing_history.html
  54. 1 1
      src/main/webapp/resources/view/usercenter/forstore/buyer_cart.html
  55. 2 2
      src/main/webapp/resources/view/usercenter/forstore/buyer_invoice.html
  56. 1 1
      src/main/webapp/resources/view/usercenter/forstore/buyer_order.html
  57. 3 3
      src/main/webapp/resources/view/usercenter/forstore/order_detail.html
  58. 25 132
      src/main/webapp/resources/view/usercenter/forstore/order_pay.html
  59. 2 1
      src/main/webapp/resources/view/usercenter/modal/collectModel.html
  60. 2 2
      src/main/webapp/resources/view/vendor/forstore/pay_center.html
  61. 8 15
      src/main/webapp/resources/view/vendor/forstore/product_file.html
  62. 13 30
      src/main/webapp/resources/view/vendor/forstore/purchase_detail.html
  63. 1 1
      src/main/webapp/resources/view/vendor/forstore/vendor_brand_apply_list.html
  64. 1 1
      src/main/webapp/resources/view/vendor/forstore/vendor_order.html
  65. 6 3
      src/main/webapp/resources/view/vendor/forstore/vendor_standard_putOn.html
  66. 9 3
      src/main/webapp/resources/view/vendor/forstore/vendor_store_close.html
  67. 38 8
      src/main/webapp/resources/view/vendor/forstore/vendor_store_info.html
  68. 284 0
      src/main/webapp/resources/view/vendor/modal/confirm_consignment_agreement.html
  69. 34 0
      src/test/java/com/uas/platform/b2c/RegistForMall.java

+ 1 - 0
.gitignore

@@ -33,6 +33,7 @@ tmp/
 # Java
 ## Compiled class file
 *.class
+test/
 
 ## Log file
 *.log

+ 2 - 1
Readme.md

@@ -1,2 +1,3 @@
 # Platform B2C
-This is the Platform B2C project, alias UsotfMall.
+This is the Platform B2C project, alias UsotfMall.
+

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

@@ -2,10 +2,15 @@ package com.uas.platform.b2c.common.account.controller;
 
 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.service.UserService;
 import com.uas.platform.b2c.core.support.SystemSession;
+import net.sf.ehcache.CacheManager;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
+
 /**
  *
  */
@@ -13,6 +18,9 @@ import org.springframework.web.bind.annotation.*;
 @RequestMapping("/user/authentication")
 public class AuthenticationController {
 
+	@Autowired
+	private UserService userService;
+
 	@RequestMapping(method = RequestMethod.GET, headers = "Accept=application/json")
 	@ResponseBody
 	@ResponseStatus(value = HttpStatus.OK)
@@ -23,6 +31,24 @@ public class AuthenticationController {
 		return new UserInfo(SystemSession.getUser());
 	}
 
+	/**
+	 * 个人注册企业成功后刷新企业列表信息
+	 * @return userInfo
+	 */
+	@RequestMapping(value = "/reflash", method = RequestMethod.GET, headers = "Accept=application/json")
+	@ResponseBody
+	@ResponseStatus(value = HttpStatus.OK)
+	public UserInfo getAuthenticationAfterRegister(HttpServletRequest request) {
+		CacheManager singletonManager = CacheManager.create();
+		singletonManager.clearAll();
+		if (SystemSession.getUser() == null) {
+			return null;
+		}
+		User user = userService.findUserByUserUU(SystemSession.getUser().getUserUU());
+		request.getSession().setAttribute("user",user);
+		return new UserInfo(user);
+	}
+
 	/**
 	 * 切换企业
 	 * 

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

@@ -68,7 +68,7 @@ public class EnterpriseController {
 	 * @return
 	 */
 	@RequestMapping(value = "/register", method = RequestMethod.POST)
-	public ResultMap registerEnterprise(Enterprise enterprise, String filePath) {
+	public ResultMap registerEnterprise(@RequestBody Enterprise enterprise, String filePath) {
 		return enterpriseService.registerEnterprise(enterprise,filePath,SystemSession.getUser());
 	}
 

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

@@ -124,19 +124,26 @@ public class EnterpriseServiceImpl implements EnterpriseService{
 		detail.setShortName(enterprise.getEnShortname());
 		detail.setBusinessCode(enterprise.getEnBussinessCode());
 		detail.setBusinessCodeImage(filePath);
+		if (null == detail.getName()|| null == detail.getShortName() || null==detail.getBusinessCode() || null==detail.getBusinessCodeImage()){
+			return new ResultMap(CodeType.SYSTEM_NOT_EXIST, "参数不能为空");
+		}
 		detail.setArea("中国大陆");
 		detail.setAddress(enterprise.getEnAddress());
 		detail.setUrl(enterprise.getEnUrl());
 		detail.setAdminName(user.getUserName());
 		detail.setAdminEmail(user.getUserEmail());
 		detail.setAdminTel(user.getUserTel());
+		String result = null;
 		try {
-			AccountUtils.applyApp(detail,null);
+			result = AccountUtils.applyAppForMall(detail);
 		}catch (Exception e){
 			return new ResultMap(CodeType.SYSTEM_ERROR, "注册失败");
 		}
+		if (result.contains("errMsg") || !result.contains("enuu")){
+			return new ResultMap(CodeType.SYSTEM_ERROR, "注册失败");
+		}
 
-		return ResultMap.success("注册成功");
+		return ResultMap.success(JSONObject.parseObject(result));
 	}
 
 	@Override
@@ -144,7 +151,7 @@ public class EnterpriseServiceImpl implements EnterpriseService{
 		try {
 			String result = AccountUtils.validName(name);
 			JSONObject resultJSON = JSONObject.parseObject(result);
-			if (null !=resultJSON.get("businessCode")){
+			if (true == (boolean)resultJSON.get("inCloud") || true == (boolean)resultJSON.get("hasCreate")){
 				return new ResultMap(CodeType.SYSTEM_ERROR, "校验失败");
 			}else{
 				return ResultMap.success("校验成功");
@@ -159,7 +166,7 @@ public class EnterpriseServiceImpl implements EnterpriseService{
 		try {
 			String result = AccountUtils.validBusinessCode(businessCode);
 			JSONObject resultJSON = JSONObject.parseObject(result);
-			if (null !=resultJSON.get("name")){
+			if (true == (boolean)resultJSON.get("inCloud") || true == (boolean)resultJSON.get("hasCreate")){
 				return new ResultMap(CodeType.SYSTEM_ERROR, "校验失败");
 			}else{
 				return ResultMap.success("校验成功");

+ 3 - 3
src/main/java/com/uas/platform/b2c/common/help/service/impl/HelpNavServiceImpl.java

@@ -78,8 +78,8 @@ public class HelpNavServiceImpl implements HelpNavService{
             HelpNav parentHelpNav = helpNavDao.findOne(helpNav.getParentId());
             if (parentHelpNav == null)
                 throw new IllegalOperatorException("父导航不存在");
-            if (parentHelpNav.getLevel() == 1 && parentHelpNav.getCount() > 9)
-                throw new IllegalOperatorException("数量超出,一级导航下最多可创建10个二级导航");
+//            if (parentHelpNav.getLevel() == 1 && parentHelpNav.getCount() > 9)
+//                throw new IllegalOperatorException("数量超出,一级导航下最多可创建10个二级导航");
 
             helpNav.setIsLeaf((short) 1);
             helpNav.setLevel((short) (parentHelpNav.getLevel() + 1));
@@ -115,7 +115,7 @@ public class HelpNavServiceImpl implements HelpNavService{
 
             for (Iterator it = helpNavChildren.iterator(); it.hasNext();) {
                 HelpNav helpNavChild = (HelpNav)it.next();
-                if (helpNavChild.getId() == id) {
+                if (helpNavChild.getId().equals(id)) {
                     it.remove();
                 }
             }

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

@@ -1,13 +1,24 @@
 package com.uas.platform.b2c.common.search.controller;
 
+import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.common.search.service.SearcherService;
+import com.uas.platform.b2c.core.support.SystemSession;
+import com.uas.platform.b2c.prod.commodity.service.GoodsService;
+import com.uas.platform.b2c.prod.store.model.StoreIn;
+import com.uas.platform.b2c.prod.store.service.StoreInService;
+import com.uas.platform.b2c.trade.presale.service.StoreFocusService;
+import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.PageParams;
+import com.uas.platform.core.persistence.criteria.PredicateUtils;
+import org.apache.commons.collections.map.HashedMap;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import javax.servlet.http.HttpServletRequest;
@@ -15,6 +26,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.net.URLDecoder;
 import java.net.URLEncoder;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -36,6 +48,15 @@ public class SearcherController {
 	@Autowired
 	private SearcherService searcherService;
 
+	@Autowired
+	private StoreInService storeService;
+
+	@Autowired
+	private StoreFocusService storeFocusService;
+
+	@Autowired
+	private GoodsService goodsService;
+
 	/**
 	 * 作搜索展示跳转
 	 * 
@@ -278,4 +299,38 @@ public class SearcherController {
 		return searcherService.getSimilarBrands(keyword);
 	}
 
+	/**
+	 * 根据店铺类型和关键字信息分页获取店铺信息
+	 *
+	 * @param params		分页参数信息
+	 * @param types			店铺类型
+	 * @param keyword		查询关键字
+	 */
+	@RequestMapping(value = "/stores", method = RequestMethod.GET, params = "op=pageByType")
+	@ResponseBody
+	public List<Map<String, Object>> pageStoresByTypesAndKeyword(PageParams params, String types,HttpServletRequest request, @RequestParam(required = false) String keyword) {
+		User user = (User)request.getSession().getAttribute("user");
+		SystemSession.setUser(user);
+		PageInfo pageInfo = new PageInfo(params);
+		Page<StoreIn> stores = storeService.pageStoresByTypesAndKeyword(pageInfo, types, keyword);
+		List<Map<String, Object>> result = new ArrayList<>();
+		Map<String, Object> a = new HashedMap();
+		a.put("stores",stores);
+		result.add(a);
+		Map<String, Object> b = new HashedMap();
+		ArrayList<String> flag = new ArrayList<>();
+		ArrayList<Object> flag2 = new ArrayList<>();
+		b.put("isFocus",flag);
+		b.put("image",flag2);
+		result.add(b);
+		for (StoreIn storeIn : stores){
+			flag.add(storeFocusService.storeIfFocus(storeIn.getId()));
+			PageInfo pageInfoCache = new PageInfo(1,4);
+			//暂时只显示有图片的产品信息
+			pageInfoCache.expression(PredicateUtils.isNotNull("img"));
+			flag2.add(goodsService.pageCommoditiesByEnInfos(storeIn.getUuid(),null,null,pageInfoCache));
+		}
+		return result;
+	}
+
 }

+ 24 - 24
src/main/java/com/uas/platform/b2c/prod/commodity/model/GoodsQtyPrice.java

@@ -23,22 +23,22 @@ public class GoodsQtyPrice {
 	/**
 	 * 人民币含税价格(默认含税17%),单位元
 	 */
-	private Double RMBPrice;
+	private Double rMBPrice;
 
 	/**
 	 * 人民币未税价格,单位元
 	 */
-	private Double RMBNTPrice;
+	private Double rMBNTPrice;
 
 	/**
 	 * 美元价含税格(默认含税0%),单位美元
 	 */
-	private Double USDPrice;
+	private Double uSDPrice;
 
 	/**
 	 * 美元未税价格,单位美元
 	 */
-	private Double USDNTPrice;
+	private Double uSDNTPrice;
 
 	// price和taxprice作兼容使用
 	/**
@@ -73,9 +73,9 @@ public class GoodsQtyPrice {
 	
 	public Double getPrice(String currencyName) {
 		if("USD".equals(currencyName)) {
-			return USDNTPrice;
+			return uSDNTPrice;
 		}else {
-			return RMBNTPrice;
+			return rMBNTPrice;
 		}
 	}
 
@@ -89,9 +89,9 @@ public class GoodsQtyPrice {
 	
 	public Double getTaxPrice(String currencyName) {
 		if("USD".equalsIgnoreCase(currencyName)) {//返回
-			return USDPrice;
+			return uSDPrice;
 		}else {
-			return RMBPrice;
+			return rMBPrice;
 		}
 	}
 
@@ -100,45 +100,45 @@ public class GoodsQtyPrice {
 	}
 
 	public Double getRMBPrice() {
-		return RMBPrice;
+		return rMBPrice;
 	}
 
 	public void setRMBPrice(Double RMBPrice) {
-		this.RMBPrice = RMBPrice;
+		this.rMBPrice = RMBPrice;
 	}
 
 	public Double getRMBNTPrice() {
-		return RMBNTPrice;
+		return rMBNTPrice;
 	}
 
 	public void setRMBNTPrice(Double RMBNTPrice) {
-		this.RMBNTPrice = RMBNTPrice;
+		this.rMBNTPrice = RMBNTPrice;
 	}
 
 	public Double getUSDPrice() {
-		return USDPrice;
+		return uSDPrice;
 	}
 
 	public void setUSDPrice(Double USDPrice) {
-		this.USDPrice = USDPrice;
+		this.uSDPrice = USDPrice;
 	}
 
 	public Double getUSDNTPrice() {
-		return USDNTPrice;
+		return uSDNTPrice;
 	}
 
 	public void setUSDNTPrice(Double USDNTPrice) {
-		this.USDNTPrice = USDNTPrice;
+		this.uSDNTPrice = USDNTPrice;
 	}
 
 	// TODO huxz 根据币别进行转换
 	public GoodsQtyPriceUas converDetailUas() {
 		GoodsQtyPriceUas uasdt = new GoodsQtyPriceUas();
 		uasdt.setStart(this.start);
-		uasdt.setRMBNTPrice(this.RMBNTPrice);
-		uasdt.setRMBPrice(this.RMBPrice);
-		uasdt.setUSDNTPrice(this.USDNTPrice);
-		uasdt.setUSDPrice(this.USDPrice);
+		uasdt.setRMBNTPrice(this.rMBNTPrice);
+		uasdt.setRMBPrice(this.rMBPrice);
+		uasdt.setUSDNTPrice(this.uSDNTPrice);
+		uasdt.setUSDPrice(this.uSDPrice);
 		uasdt.setEnd(this.end);
 		return uasdt;
 	}
@@ -148,10 +148,10 @@ public class GoodsQtyPrice {
 		return "GoodsQtyPrice{" +
 				"start=" + start +
 				", end=" + end +
-				", RMBPrice=" + RMBPrice +
-				", RMBNTPrice=" + RMBNTPrice +
-				", USDPrice=" + USDPrice +
-				", USDNTPrice=" + USDNTPrice +
+				", RMBPrice=" + rMBPrice +
+				", RMBNTPrice=" + rMBNTPrice +
+				", USDPrice=" + uSDPrice +
+				", USDNTPrice=" + uSDNTPrice +
 				", price=" + price +
 				", taxPrice=" + taxPrice +
 				'}';

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

@@ -25,6 +25,7 @@ import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.regex.Matcher;
@@ -74,7 +75,9 @@ public class BrandSubmitServiceImpl implements BrandSubmitService {
 		// 检查新增还是更新
 		if (brandSubmit.getUuid() == null) {
 			// 如果是新增检查品牌是否重名,重名设置version为-1,返回前台判断是否更新已存在品牌
-			List<Brand> existBrandCn = brandDao.findByNameCn(brandSubmit.getNameCn());
+			List<Brand> existBrandCn = new ArrayList<Brand>();
+			if (brandSubmit.getNameCn() != null)
+				existBrandCn = brandDao.findByNameCn(brandSubmit.getNameCn());
 			List<Brand> existBrandEn = brandDao.findByNameEn(brandSubmit.getNameEn());
 			if (CollectionUtils.isNotEmpty(existBrandCn)) {
 				brand.setVersion((short) -1);

+ 2 - 1
src/main/java/com/uas/platform/b2c/prod/store/api/StoreInController.java

@@ -93,6 +93,7 @@ public class StoreInController {
 	 * @param keyword	查询关键字
 	 * @return
 	 */
+	@Deprecated
 	@RequestMapping(value = "/stores", method = RequestMethod.GET, params = "op=page")
 	public Page<StoreIn> findStoresByPage(PageParams params, String keyword) {
 		PageInfo pageInfo = new PageInfo(params);
@@ -125,7 +126,7 @@ public class StoreInController {
 	 * @param keyword		查询关键字
 	 */
 	@RequestMapping(value = "/stores", method = RequestMethod.GET, params = "op=pageByType")
-	public Page<StoreIn> pageStoresByTypesAndKeyword(PageParams params, String types, @RequestParam(required = false) String keyword) {
+	public Page<StoreIn> pageStoresByTypesAndKeywordWhenUserVisitList(PageParams params, String types, @RequestParam(required = false) String keyword) {
 		PageInfo pageInfo = new PageInfo(params);
 		return storeService.pageStoresByTypesAndKeyword(pageInfo, types, keyword);
 	}

+ 66 - 0
src/main/java/com/uas/platform/b2c/prod/store/controller/ConsignmentAgreeRecordController.java

@@ -0,0 +1,66 @@
+package com.uas.platform.b2c.prod.store.controller;
+
+import com.uas.platform.b2c.prod.store.model.ConsignmentAgreeRecord;
+import com.uas.platform.b2c.prod.store.service.ConsignmentAgreeRecordService;
+import com.uas.platform.b2c.trade.support.ResultMap;
+import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
+import org.apache.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 自营转寄售协议,同意操作记录控制器
+ *
+ * @author huxz
+ * @version 2017-08-24 09:11:46 创建文件
+ */
+@RestController
+@RequestMapping(value = "/auth/store/consignment/record")
+public class ConsignmentAgreeRecordController {
+
+	private final Logger logger = Logger.getLogger(getClass());
+
+	private final ConsignmentAgreeRecordService recordService;
+
+	@Autowired
+	public ConsignmentAgreeRecordController(ConsignmentAgreeRecordService recordService) {
+		this.recordService = recordService;
+	}
+
+	/**
+	 * 用户自营转寄售时,查询用户同意寄售协议的记录
+	 */
+	@RequestMapping(method = RequestMethod.GET, value = "/findByUser")
+	public ConsignmentAgreeRecord findRecordOfUser() {
+		logger.info("Find one consignment record when user switch self-support to consignment");
+		return recordService.findRecordOfUser();
+	}
+
+	/**
+	 * 用户第一次同意自营转寄售时,保存用户的操作记录信息
+	 *
+	 * @param record 操作记录信息
+	 */
+	@RequestMapping(method = RequestMethod.POST)
+	public ResultMap saveRecordWhenUserAgree(ConsignmentAgreeRecord record) {
+		logger.info("Save consignment record when user agrees the consignment agreement");
+		return recordService.saveRecordWhenUserAgree(record);
+	}
+
+	/**
+	 * 管理员在管理后台查看店铺信息时,按操作时间降序获取操作记录信息
+	 *
+	 * @param pageParams	分页参数
+	 * @param enUU			企业UU
+	 */
+	@RequestMapping(method = RequestMethod.GET, value = "/pageByAdmin")
+	public Page<ConsignmentAgreeRecord> pageRecordWhenAdminQueryInfo(PageParams pageParams, Long enUU) {
+		logger.info("Page consignment operation record when admin query info");
+		PageInfo pageInfo = new PageInfo(pageParams);
+		return recordService.pageRecordWhenAdminQueryInfo(pageInfo, enUU);
+	}
+}

+ 9 - 3
src/main/java/com/uas/platform/b2c/prod/store/controller/StoreInformationController.java

@@ -1,6 +1,7 @@
 package com.uas.platform.b2c.prod.store.controller;
 
 import com.uas.platform.b2c.prod.store.model.StoreIn;
+import com.uas.platform.b2c.prod.store.model.StoreStatus;
 import com.uas.platform.b2c.prod.store.service.StoreInService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -39,10 +40,15 @@ public class StoreInformationController {
 		System.out.println("根据店铺UUID获取模板信息");
 		StoreIn store = storeService.findByUuid(uuid);
 		if (store == null) {
-			return "redirect:/index";
+			return "store_none";
+		}
+
+		// 判断店铺是否开店状态
+		if (StoreStatus.OPENED == store.getStatus()) {
+			return "store_default";
+		} else {
+			return "store_close";
 		}
-		// TODO huxz 添加分类信息
-		return "store_default";
 	}
 
 }

+ 26 - 0
src/main/java/com/uas/platform/b2c/prod/store/dao/ConsignmentAgreeRecordDao.java

@@ -0,0 +1,26 @@
+package com.uas.platform.b2c.prod.store.dao;
+
+import com.uas.platform.b2c.prod.store.model.ConsignmentAgreeRecord;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 自营转寄售协议,同意操作记录DAO
+ *
+ * @author huxz
+ * @version 2017-08-24 09:11:46 创建文件
+ */
+@Repository
+public interface ConsignmentAgreeRecordDao extends JpaSpecificationExecutor<ConsignmentAgreeRecord>, JpaRepository<ConsignmentAgreeRecord, Long> {
+
+	/**
+	 * 根据企业UU和用户UU获取操作记录
+	 *
+	 * @param enUU		企业UU
+	 * @param userUU	用户UU
+	 */
+	List<ConsignmentAgreeRecord> findByEnUUAndUserUU(Long enUU, Long userUU);
+}

+ 135 - 0
src/main/java/com/uas/platform/b2c/prod/store/model/ConsignmentAgreeRecord.java

@@ -0,0 +1,135 @@
+package com.uas.platform.b2c.prod.store.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.uas.platform.b2c.core.utils.JacksonUtils;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+import java.util.Date;
+
+/**
+ * 自营转寄售协议,同意操作记录
+ * 每个企业每个人仅记录一次
+ *
+ * @author huxz
+ * @version 2017-08-24 08:57:56 创建文件
+ */
+@Entity
+@Table(name = "store$consignment_agree")
+@JsonInclude(JsonInclude.Include.NON_EMPTY)
+public class ConsignmentAgreeRecord {
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "store$consignment_agree_gen")
+	@SequenceGenerator(name = "store$consignment_agree_gen", sequenceName = "store$consignment_agree_seq", allocationSize = 1)
+	private Long id;
+
+	/**
+	 * 企业UU
+	 */
+	@Column(name = "con_en_uu")
+	private Long enUU;
+
+	/**
+	 * 企业名称
+	 *
+	 * 如若修改,需要同步到最新
+	 */
+	@Column(name = "con_en_name")
+	private String enterpriseName;
+
+	/**
+	 * 用户UU
+	 */
+	@Column(name = "con_user_uu")
+	private Long userUU;
+
+	/**
+	 * 用户姓名
+	 *
+	 * 如若修改,需要同步到最新
+	 */
+	@Column(name = "con_user_name")
+	private String userName;
+
+	/**
+	 * 是否同意寄售协议
+	 */
+	@Column(name = "con_agreement")
+	private Boolean agreement;
+
+	/**
+	 * 操作时间
+	 */
+	@Column(name = "con_op_time")
+	private Date operateTime;
+
+	public ConsignmentAgreeRecord() {
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Long getEnUU() {
+		return enUU;
+	}
+
+	public void setEnUU(Long enUU) {
+		this.enUU = enUU;
+	}
+
+	public String getEnterpriseName() {
+		return enterpriseName;
+	}
+
+	public void setEnterpriseName(String enterpriseName) {
+		this.enterpriseName = enterpriseName;
+	}
+
+	public Long getUserUU() {
+		return userUU;
+	}
+
+	public void setUserUU(Long userUU) {
+		this.userUU = userUU;
+	}
+
+	public String getUserName() {
+		return userName;
+	}
+
+	public void setUserName(String userName) {
+		this.userName = userName;
+	}
+
+	public Boolean getAgreement() {
+		return agreement;
+	}
+
+	public void setAgreement(Boolean agreement) {
+		this.agreement = agreement;
+	}
+
+	public Date getOperateTime() {
+		return operateTime;
+	}
+
+	public void setOperateTime(Date operateTime) {
+		this.operateTime = operateTime;
+	}
+
+	@Override
+	public String toString() {
+		return JacksonUtils.toJson(this);
+	}
+}

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

@@ -63,6 +63,12 @@ public class StoreViolations {
 	@Column(name = "vi_create_time")
 	private Date createTime;
 
+	/**
+	 * 违规处理修改时间
+	 */
+	@Column(name = "vi_update_time")
+	private Date updateTime;
+
 	/**
 	 * 违规处理记录是否处于当前违规申述处理流程
 	 */
@@ -365,4 +371,12 @@ public class StoreViolations {
 	public void setCurrent(Boolean current) {
 		this.current = current;
 	}
+
+	public Date getUpdateTime() {
+		return updateTime;
+	}
+
+	public void setUpdateTime(Date updateTime) {
+		this.updateTime = updateTime;
+	}
 }

+ 35 - 0
src/main/java/com/uas/platform/b2c/prod/store/service/ConsignmentAgreeRecordService.java

@@ -0,0 +1,35 @@
+package com.uas.platform.b2c.prod.store.service;
+
+import com.uas.platform.b2c.prod.store.model.ConsignmentAgreeRecord;
+import com.uas.platform.b2c.trade.support.ResultMap;
+import com.uas.platform.core.model.PageInfo;
+import org.springframework.data.domain.Page;
+
+/**
+ * 自营转寄售协议,同意操作记录业务类
+ *
+ * @author huxz
+ * @version 2017-08-24 09:11:46 创建文件
+ */
+public interface ConsignmentAgreeRecordService {
+
+	/**
+	 * 用户自营转寄售时,查询用户同意寄售协议的记录
+	 */
+	ConsignmentAgreeRecord findRecordOfUser();
+
+	/**
+	 * 用户第一次同意自营转寄售时,保存用户的操作记录信息
+	 *
+	 * @param record 操作记录信息
+	 */
+	ResultMap saveRecordWhenUserAgree(ConsignmentAgreeRecord record);
+
+	/**
+	 * 管理员在管理后台查看店铺信息时,按操作时间降序获取操作记录信息
+	 *
+	 * @param pageInfo	分页参数
+	 * @param enUU		企业UU
+	 */
+	Page<ConsignmentAgreeRecord> pageRecordWhenAdminQueryInfo(PageInfo pageInfo, Long enUU);
+}

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

@@ -0,0 +1,128 @@
+package com.uas.platform.b2c.prod.store.service.impl;
+
+import com.uas.platform.b2c.common.account.dao.EnterpriseDao;
+import com.uas.platform.b2c.common.account.dao.UserDao;
+import com.uas.platform.b2c.common.account.model.Enterprise;
+import com.uas.platform.b2c.common.account.model.User;
+import com.uas.platform.b2c.core.support.SystemSession;
+import com.uas.platform.b2c.prod.store.dao.ConsignmentAgreeRecordDao;
+import com.uas.platform.b2c.prod.store.model.ConsignmentAgreeRecord;
+import com.uas.platform.b2c.prod.store.service.ConsignmentAgreeRecordService;
+import com.uas.platform.b2c.trade.support.CodeType;
+import com.uas.platform.b2c.trade.support.ResultMap;
+import com.uas.platform.core.exception.IllegalStatusException;
+import com.uas.platform.core.model.PageInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 自营转寄售协议,同意操作记录业务实现类
+ *
+ * @author huxz
+ * @version 2017-08-24 09:11:46 创建文件
+ */
+@Service
+public class ConsignmentAgreeRecordServiceImpl implements ConsignmentAgreeRecordService {
+
+	private final UserDao userDao;
+
+	private final EnterpriseDao enterpriseDao;
+
+	private final ConsignmentAgreeRecordDao recordDao;
+
+	@Autowired
+	public ConsignmentAgreeRecordServiceImpl(UserDao userDao, EnterpriseDao enterpriseDao, ConsignmentAgreeRecordDao recordDao) {
+		this.userDao = userDao;
+		this.enterpriseDao = enterpriseDao;
+		this.recordDao = recordDao;
+	}
+
+	@Override
+	public ConsignmentAgreeRecord findRecordOfUser() {
+		User user = SystemSession.getUser();
+		if (user == null || user.getUserUU() == null || user.getUserUU() == 0L) {
+			throw new IllegalStatusException("用户信息不能存在");
+		}
+		Enterprise enterprise = user.getEnterprise();
+		if (enterprise == null || enterprise.getUu() == null || enterprise.getUu() == 0L) {
+			throw new IllegalStatusException("用户企业信息不存在");
+		}
+
+		List<ConsignmentAgreeRecord> records = recordDao.findByEnUUAndUserUU(enterprise.getUu(), user.getUserUU());
+		if (CollectionUtils.isEmpty(records)) {
+			return null;
+		} else {
+			return records.get(0);
+		}
+	}
+
+	@Override
+	public ResultMap saveRecordWhenUserAgree(ConsignmentAgreeRecord record) {
+		User user = SystemSession.getUser();
+		if (user == null || user.getUserUU() == null || user.getUserUU() == 0L) {
+			return new ResultMap(CodeType.ERROR_STATE, "用户信息不存在");
+		}
+		Enterprise enterprise = user.getEnterprise();
+		if (enterprise == null || enterprise.getUu() == null || enterprise.getUu() == 0L) {
+			return new ResultMap(CodeType.ERROR_STATE, "用户企业信息不存在");
+		}
+
+		Date operateTime = new Date();
+
+		record.setEnUU(enterprise.getUu());
+		record.setEnterpriseName(enterprise.getEnName());
+		record.setUserUU(user.getUserUU());
+		record.setUserName(user.getUserName());
+		// TODO huxz 暂时设置为true
+		record.setAgreement(true);
+
+		record.setOperateTime(operateTime);
+
+		record = recordDao.save(record);
+		return ResultMap.success(record);
+	}
+
+	@Override
+	public Page<ConsignmentAgreeRecord> pageRecordWhenAdminQueryInfo(final PageInfo pageInfo, Long enUU) {
+		if (enUU == null || enUU == 0L) {
+			throw new IllegalStatusException("企业UU不存在");
+		}
+
+		pageInfo.filter("enUU", enUU);
+
+		Page<ConsignmentAgreeRecord> page = recordDao.findAll(new Specification<ConsignmentAgreeRecord>() {
+			@Override
+			public Predicate toPredicate(Root<ConsignmentAgreeRecord> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
+				query.where(pageInfo.getPredicates(root, query, builder));
+				return null;
+			}
+		}, pageInfo);
+
+		if (!CollectionUtils.isEmpty(page.getContent())) {
+			for (ConsignmentAgreeRecord record : page.getContent()) {
+				User user = userDao.findOne(record.getUserUU());
+				if (user != null) {
+					record.setUserName(user.getUserName());
+				}
+
+				Enterprise enterprise = enterpriseDao.findByUu(record.getEnUU());
+				if (enterprise != null) {
+					record.setEnterpriseName(enterprise.getEnName());
+				}
+
+			}
+		}
+
+		return page;
+	}
+}

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

@@ -78,6 +78,7 @@ public class StoreViolationsServiceImpl implements StoreViolationsService {
 		violations.setDisposeProofJson(StoreBusinessUtils.fromResourcesAboutViolations(violations.getDisposeProof()));
 		violations.setDisposeOperator(operator);
 		violations.setCreateTime(operator.getOperateTime());
+		violations.setUpdateTime(operator.getOperateTime());
 
 		// 计算处置结束时间
 		int index = violations.getDisposition().indexOf('_');
@@ -150,6 +151,7 @@ public class StoreViolationsServiceImpl implements StoreViolationsService {
 		violations.setStatus(ViolationsStatus.COMPLAINT);
 		violations.setComplaintProofJson(StoreBusinessUtils.fromResourcesAboutViolations(violations.getComplaintProof()));
 		violations.setComplaintOperator(operator);
+		violations.setUpdateTime(operator.getOperateTime());
 
 		violationsDao.save(violations);
 
@@ -197,6 +199,8 @@ public class StoreViolationsServiceImpl implements StoreViolationsService {
 			storeIn.setStatus(StoreStatus.CLOSED);	// 申述失败设置店铺状态为违规关店状态
 		}
 
+		violations.setUpdateTime(operator.getOperateTime());
+
 		violationsDao.save(violations);
 
 		storeIn.setUpdateTime(new Date());
@@ -273,6 +277,7 @@ public class StoreViolationsServiceImpl implements StoreViolationsService {
 		violations.setRestoreOperator(operator);
 		violations.setRestore(true);
 		violations.setStatus(ViolationsStatus.DONE);
+		violations.setUpdateTime(operator.getOperateTime());
 		violationsDao.save(violations);
 
 		storeIn.setUpdateTime(new Date());
@@ -299,6 +304,7 @@ public class StoreViolationsServiceImpl implements StoreViolationsService {
 
 				violations.setStatus(ViolationsStatus.DONE);
 				violations.setCurrent(false);
+				violations.setUpdateTime(new Date());
 
 				violationsDao.save(violations);
 

+ 4 - 2
src/main/java/com/uas/platform/b2c/trade/presale/controller/CollectionController.java

@@ -157,6 +157,7 @@ public class CollectionController {
 	@RequestMapping(value = "/save", method = RequestMethod.POST)
 	@ApiOperation(value = "保存收藏信息", httpMethod = "POST")
 	public String saveEntity(@ApiParam(required = true, value = "保存的json对象") @RequestBody String str) {
+		String result = "success";
 		if (StringUtils.hasText(str)) {
 			Collection store = FastjsonUtils.fromJson(str, Collection.class);
 			store.setUseruu(SystemSession.getUser().getUserUU());
@@ -167,9 +168,10 @@ public class CollectionController {
 				store.setDissociative(Type.PERSONAL.value());
 			}
 			store.setCreatetime(new Date());
-			collectionService.save(store);
+			result = collectionService.save(store);
 		}
-		return "success";
+		System.out.println("result = " + result);
+		return result;
 	}
 
 }

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

@@ -397,6 +397,7 @@ public class CartServiceImpl implements CartService {
 		Map<String, Object> map = new HashMap<String, Object>();
 		Map<String, List<Cart>> contentMap = new HashMap<>();
 		info.sorting("storeUuid", Sort.Direction.DESC);
+		info.sorting("id", Sort.Direction.DESC);
 		// 获取当前页的购物车记录信息
 		Page<Cart> carts = cartDao.findAll(new Specification<Cart>() {
 			@Override

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

@@ -75,12 +75,16 @@ public class CollectionServiceImpl implements CollectionService {
 
 			if (storeList.size() == 0) {
 				collectionDao.save(store);
+			}else {
+				return "repeat";
 			}
 		} else if (store.getKind() == 2) {
 			List<Collection> storelist = collectionDao.findStoreByUseruuAndEnuuAndKindAndComponentid(
 					SystemSession.getUser().getUserUU(), SystemSession.getUser().getEnterprise().getUu(), 2, store.getComponentid());
 			if (storelist.size() == 0) {
 				collectionDao.save(store);
+			}else {
+				return "repeat";
 			}
 		}
 		return "success";

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

@@ -86,6 +86,9 @@ public class StoreFocusServiceImpl implements StoreFocusService {
 	public String storeIfFocus(Long storeid) {
 		// 获取所有店铺关注记录
 		List<StoreFocus> list = new ArrayList<StoreFocus>();
+		if (SystemSession.getUser() == null){
+			return "false";
+		}
 		if (SystemSession.getUser().getEnterprise() != null) {
 			list = storeFocusDao.findStoreFocusByUseruuAndEnuuAndStoreid(
 					SystemSession.getUser().getUserUU(), SystemSession.getUser().getEnterprise().getUu(), storeid);

+ 47 - 0
src/main/webapp/WEB-INF/views/normal/store_close.html

@@ -0,0 +1,47 @@
+<!DOCTYPE HTML>
+<html lang="zh-CN">
+<head>
+<meta charset="utf-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
+<meta name="renderer" content="webkit">
+<title i18n="home.title"></title>
+<base href="../"/>
+<meta name="description" content="优软商城,电子元器件搜索引擎" />
+<meta name="keywords"
+	content="优软商城,B2B,B2C,行业门户,网上贸易,电子商务,网上贸易,网上交易,交易市场,在线交易,供求信息,采购,求购信息,供应信息" />
+<link href="static/img/all/u.png" rel="icon" type="image/x-icon" />
+<link rel="stylesheet" href="static/lib/bootstrap/css/bootstrap.min.css" />
+<link rel="stylesheet" href="static/lib/angular/toaster.css" />
+<link rel="stylesheet" href="static/lib/fontawesome/css/font-awesome.min.css" />
+<link rel="stylesheet" href="static/css/common/common.css" />
+<link rel="stylesheet" href="static/lib/angular/ng-table.css">
+<script type="text/javascript" src="static/js/common/bd_pv.js"></script>
+</head>
+<body>
+	<!-- 消息提示框  Start-->
+	<toaster-container
+		toaster-options="{'position-class': 'toast-bottom-center'}"></toaster-container>
+	<!-- 消息提示框 End -->
+	<!-- Loading Start -->
+	<div id="loading" class="loading">
+		<i></i>
+	</div>
+	<!-- Loading End -->
+
+	<!-- top 置顶栏 Start -->
+	<div ng-include src="'static/view/common/site-nav.html'"></div>
+	<!-- top 置顶栏 End -->
+
+	<div ng-include src="'static/view/store/default/store-close.html'"></div>
+
+	<!-- 页脚 Start -->
+	<div ng-include src="'static/view/common/footer.html'"></div>
+	<!-- 页脚 End -->
+
+	<!-- 侧边栏Start -->
+	<div ng-include src="'static/view/common/sidebar.html'"></div>
+	<!-- 侧边栏End -->
+	<script type="text/javascript" src="static/lib/require.js"
+		data-main="static/js/store/main.js"></script>
+</body>
+</html>

+ 47 - 0
src/main/webapp/WEB-INF/views/normal/store_none.html

@@ -0,0 +1,47 @@
+<!DOCTYPE HTML>
+<html lang="zh-CN">
+<head>
+<meta charset="utf-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
+<meta name="renderer" content="webkit">
+<title i18n="home.title"></title>
+<base href="../"/>
+<meta name="description" content="优软商城,电子元器件搜索引擎" />
+<meta name="keywords"
+	content="优软商城,B2B,B2C,行业门户,网上贸易,电子商务,网上贸易,网上交易,交易市场,在线交易,供求信息,采购,求购信息,供应信息" />
+<link href="static/img/all/u.png" rel="icon" type="image/x-icon" />
+<link rel="stylesheet" href="static/lib/bootstrap/css/bootstrap.min.css" />
+<link rel="stylesheet" href="static/lib/angular/toaster.css" />
+<link rel="stylesheet" href="static/lib/fontawesome/css/font-awesome.min.css" />
+<link rel="stylesheet" href="static/css/common/common.css" />
+<link rel="stylesheet" href="static/lib/angular/ng-table.css">
+<script type="text/javascript" src="static/js/common/bd_pv.js"></script>
+</head>
+<body>
+	<!-- 消息提示框  Start-->
+	<toaster-container
+		toaster-options="{'position-class': 'toast-bottom-center'}"></toaster-container>
+	<!-- 消息提示框 End -->
+	<!-- Loading Start -->
+	<div id="loading" class="loading">
+		<i></i>
+	</div>
+	<!-- Loading End -->
+
+	<!-- top 置顶栏 Start -->
+	<div ng-include src="'static/view/common/site-nav.html'"></div>
+	<!-- top 置顶栏 End -->
+
+	<div ng-include src="'static/view/store/default/store-none.html'"></div>
+
+	<!-- 页脚 Start -->
+	<div ng-include src="'static/view/common/footer.html'"></div>
+	<!-- 页脚 End -->
+
+	<!-- 侧边栏Start -->
+	<div ng-include src="'static/view/common/sidebar.html'"></div>
+	<!-- 侧边栏End -->
+	<script type="text/javascript" src="static/lib/require.js"
+		data-main="static/js/store/main.js"></script>
+</body>
+</html>

+ 2 - 1
src/main/webapp/resources/js/admin/app.js

@@ -282,7 +282,7 @@
 			controllerUrl : 'app/controllers/StoreInfoListCtrl'
 		})).state('store_info_detail', angularAMD.route({
 			// 店铺详情,违规处理页面
-			url: '/store/:uuid/detail',
+			url: '/store/:uuid/detail/:type',
 			templateUrl : 'static/view/admin/store/store_info_detail.html',
 			controller : 'StoreInfoDetailCtrl',
 			controllerUrl : 'app/controllers/store/StoreInfoDetailCtrl'
@@ -749,6 +749,7 @@
 			if (data == 'AGENCY') return '代理商';
 			if (data == 'DISTRIBUTION') return '经销商';
 			if (data == 'ORIGINAL_FACTORY') return '原厂';
+			if (data == 'CONSIGNMENT') return '寄售';
 			return '暂无类型信息'
 		};
 	});

+ 78 - 1
src/main/webapp/resources/js/admin/controllers/StoreInfoListCtrl.js

@@ -44,6 +44,83 @@ define([ 'app/app' ], function(app) {
 			}
 		});
 
+		$scope.newStoreMap = {};
+
+		/**
+		 * 获取新开原厂店铺
+		 */
+		StoreInfo.findNewStore({ types : 'ORIGINAL_FACTORY' }, {}, function (page) {
+			if (page && page.content && page.content.length > 0) {
+				angular.forEach(page.content, function (store) {
+					$scope.newStoreMap[store.uuid] = true;
+				});
+			}
+		}, function (resp) {
+		});
+
+		/**
+		 * 获取新入驻经销代理店铺信息
+		 */
+		StoreInfo.findNewStore({ types : 'AGENCY-DISTRIBUTION' }, {}, function (page) {
+			if (page && page.content && page.content.length > 0) {
+				angular.forEach(page.content, function (store) {
+					$scope.newStoreMap[store.uuid] = true;
+				});
+			}
+		}, function (resp) {
+		});
+
+		$scope.hotSalesMap = {};
+
+		/**
+		 * 获取原厂销售排行信息
+		 */
+		StoreInfo.findTopStoreBySales({ isOriginal: true }, {}, function (stores) {
+			if (stores && stores.length > 0) {
+				angular.forEach(stores, function (store) {
+					$scope.hotSalesMap[store.uuid] = true;
+				});
+			}
+		}, function (resp) {
+		});
+
+		/**
+		 * 获取经销代理销售排行信息
+		 */
+		StoreInfo.findTopStoreBySales({ isOriginal: false }, {}, function (stores) {
+			if (stores && stores.length > 0) {
+				angular.forEach(stores, function (store) {
+					$scope.hotSalesMap[store.uuid] = true;
+				});
+			}
+		}, function (resp) {
+		});
+
+		$scope.excellentSupplierMap = {};
+
+		/**
+		 * 获取原厂推荐信息
+		 */
+		StoreInfo.fiveStoresByTypes({	num : 5, types : 'ORIGINAL_FACTORY' }, {}, function (data) {
+			if (data && data.length > 0) {
+				angular.forEach(data, function (store) {
+					$scope.excellentSupplierMap[store.uuid] = true;
+				});
+			}
+		}, function () {
+		});
+
+		/**
+		 * 获取经销代理优秀供应商信息
+		 */
+		StoreCms.getStoreCmsByUseForAndCmsType({ num:5, types:'AGENCY-DISTRIBUTION' }, function (exStoreCms) {
+			if (exStoreCms && exStoreCms.length > 0) {
+				angular.forEach(exStoreCms, function (store) {
+					$scope.excellentSupplierMap[store.uuid] = true;
+				});
+			}
+		});
+
 		/**
 		 * 添加到店铺相关内容管理系统
 		 *
@@ -72,7 +149,7 @@ define([ 'app/app' ], function(app) {
 		 */
 		$scope.goStoreDetail = function (store) {
 			if (store && store.uuid) {
-				$state.go('store_info_detail', { uuid : store.uuid });
+				$state.go('store_info_detail', { uuid : store.uuid, type: store.type });
 			} else {
 				toaster.pop('error', '店铺信息不能为空');
 			}

+ 9 - 5
src/main/webapp/resources/js/admin/controllers/help/HelpDetailCtrl.js

@@ -8,11 +8,15 @@ define(['app/app'], function(app) {
         HelpIssue.get({id : $stateParams.id}, function (data) {
             $scope.issue = data;
             quill.setContents(angular.fromJson($scope.issue.content));
-            HelpAPI.get({id : $scope.issue.navId},function (data) {
-                $scope.issue.nav = data;
-            }, function (response) {
-                toaster.pop('error', response.data);
-            });
+            if ($scope.issue.navId) {
+                HelpAPI.get({id : $scope.issue.navId},function (data) {
+                    $scope.issue.nav = data;
+                }, function (response) {
+                    toaster.pop('error', response.data);
+                });
+            } else {
+                toaster.pop('warning', '暂无导航信息,请补充');
+            }
         }, function (response) {
             toaster.pop('error', response.data);
         });

+ 1 - 0
src/main/webapp/resources/js/admin/controllers/store/StoreInfoDetailCtrl.js

@@ -5,6 +5,7 @@ define([ 'app/app' ], function(app) {
 
 		// 店铺UUID
 		$scope.storeUuid = $stateParams.uuid;
+		$scope.storeType = $stateParams.type;
 
 		// Tab 选项,ENTERPRISE,VIOLATIONS
 		$scope.tabSelected = 'ENTERPRISE';

+ 48 - 4
src/main/webapp/resources/js/common/module/store_admin_violations_module.js

@@ -23,9 +23,11 @@ define([ 'ngResource', 'common/query/storeViolations', 'ngTable', 'ngSanitize',
 	/**
 	 * 企业信息记录
 	 */
-	module.controller('EnterpriseInfoCtrl', ['$scope', 'StoreInfo', 'toaster', function ($scope, StoreInfo, toaster) {
+	module.controller('EnterpriseInfoCtrl', ['$scope', 'StoreInfo', 'toaster', 'ConsignmentAgreementRecord', 'ngTableParams', 'BaseService', function ($scope, StoreInfo, toaster, ConsignmentAgreementRecord, ngTableParams, BaseService) {
 		console.log('EnterpriseInfoCtrl');
 
+		$scope.showRecords = true;
+
 		active();
 
 		/**
@@ -35,13 +37,14 @@ define([ 'ngResource', 'common/query/storeViolations', 'ngTable', 'ngSanitize',
 			StoreInfo.findByUuid({ uuid: $scope.storeUuid }, {}, function (store) {
 				if (store && store.uuid) {
 					$scope.store = store;
-					$scope.store.auditInfo = JSON.parse(store.enQualification);
+					$scope.store.auditInfo = JSON.parse(store.enQualification || "{}");
 					if (store.qualifications && store.qualifications.length > 0) {
 						$scope.qualifications = store.qualifications.filter(function (qualification) {
 							return qualification.type === 'APTITUDE' && qualification.resourceUrl && qualification.resourceUrl !== '';
 						});
 					}
 					console.log($scope.store);
+					loadRecords($scope.store.enUU);
 				} else {
 					toaster.pop('error', '获取店铺信息失败,请刷新页面');
 				}
@@ -51,6 +54,44 @@ define([ 'ngResource', 'common/query/storeViolations', 'ngTable', 'ngSanitize',
 			})
 		}
 
+		/**
+		 * 加载寄售协议操作记录
+		 *
+		 * @param enUU	企业UU
+		 */
+		function loadRecords(enUU) {
+			$scope.recordsTableParams = new ngTableParams({
+				page : 1,
+				count : 10,
+				sorting : {
+					operateTime : 'desc'
+				}
+			}, {
+				total : 0,
+				getData : function($defer, params) {
+					// 处理分页参数到URL中
+					var param = BaseService.parseParams(params.url());
+					param.enUU = enUU || 0;
+
+					ConsignmentAgreementRecord.pageRecordWhenAdminQueryInfo(param, {}, function (data) {
+						if (data.content && data.content.length > 0) {
+							$defer.resolve(data.content);
+							$scope.showRecords = true;
+						} else {
+							$defer.resolve([]);
+							$scope.showRecords = false;
+						}
+						console.log(data);
+					}, function (error) {
+						console.log(error);
+						$defer.resolve([]);
+						$scope.showRecords = false;
+						toaster.pop('error', '数据获取失败,请重新刷新页面');
+					});
+				}
+			});
+		}
+
 	}]);
 
 	/**
@@ -182,7 +223,10 @@ define([ 'ngResource', 'common/query/storeViolations', 'ngTable', 'ngSanitize',
 		function active() {
 			$scope.violationsTableParams = new ngTableParams({
 				page : 1,
-				count : 10
+				count : 10,
+				sorting: {
+					updateTime: 'DESC'
+				}
 			}, {
 				total : 0,
 				getData : function($defer, params) {
@@ -246,7 +290,7 @@ define([ 'ngResource', 'common/query/storeViolations', 'ngTable', 'ngSanitize',
 			} else if ($scope.isShow === 'UP') {
 				$scope.isShow = 'ALL';
 
-				$scope.violationsTableParams.sorting({});
+				$scope.violationsTableParams.sorting({updateTime: 'DESC'});
 			}
 			$scope.violationsTableParams.page(1);
 			$scope.violationsTableParams.reload();

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

@@ -188,5 +188,43 @@ define([ 'ngResource' ], function() {
 				}
 			}
         });
-    }]);
+    }]).factory('ConsignmentAgreementRecord', ['$resource', 'BaseService', function ($resource, BaseService) {
+    	// 自营转寄售协议,同意操作记录
+		return $resource('auth/store/consignment/record', {}, {
+			/**
+			 * 用户自营转寄售时,获取寄售协议
+			 */
+			obtainAConsignmentAgreement: {
+				url: 'http://www.usoftmall.com/api/help-service/issues/16',
+				method: 'GET'
+			},
+			/**
+			 * 用户自营转寄售时,查询用户同意寄售协议的记录
+			 */
+			findRecordOfUser: {
+				url: 'auth/store/consignment/record/findByUser',
+				method: 'GET'
+			},
+			/**
+			 * 用户第一次同意自营转寄售时,保存用户的操作记录信息
+			 *
+			 * @param record 操作记录信息
+			 */
+			saveRecordWhenUserAgree: {
+				url: 'auth/store/consignment/record',
+				method: 'POST'
+			},
+			/**
+			 * 管理员在管理后台查看店铺信息时,按操作时间降序获取操作记录信息
+			 *
+			 * @param pageParams	分页参数
+			 * @param enUU			企业UU
+			 */
+			pageRecordWhenAdminQueryInfo: {
+				url: 'auth/store/consignment/record/pageByAdmin',
+				method: 'GET'
+			}
+		});
+
+	}]);
 });

+ 1 - 0
src/main/webapp/resources/js/prod/controllers/ComponentCtrl.js

@@ -364,6 +364,7 @@ define([ 'app/app', 'jquery-summernote' ], function(app) {
 	}]);
 	
 	app.register.controller('CollectModelCtrl', ['$scope', '$modalInstance', function($scope, $modalInstance){
+		$scope.haveAdd = true;
 		$scope.cancel = function() {
 			$modalInstance.dismiss();
 		};

+ 12 - 2
src/main/webapp/resources/js/usercenter/app.js

@@ -557,7 +557,16 @@ define([ 'angularAMD', 'ui.router', 'ui-bootstrap', 'ngLocal', 'ngTable', 'commo
 				$modal.open({
 					 templateUrl : $rootScope.rootPath + '/static/view/usercenter/modal/collectModel.html',
 					 controller : 'CollectModelCtrl',
-					 size : 'sm'
+					 size : 'sm',
+					 resolve : {
+						haveAdd : function(){
+							if (data == "success"){
+								return true;
+							} else{
+								return false;
+							}
+						}
+					 }
 				});
 				$rootScope.componentCount++;
 			}, function(error) {
@@ -567,7 +576,8 @@ define([ 'angularAMD', 'ui.router', 'ui-bootstrap', 'ngLocal', 'ngTable', 'commo
 			
 	}]);
 	
-	app.controller('CollectModelCtrl', ['$scope', '$modalInstance', function($scope, $modalInstance){
+	app.controller('CollectModelCtrl', ['$scope', '$modalInstance', 'haveAdd', function($scope, $modalInstance, haveAdd){
+		$scope.haveAdd = haveAdd;
 		$scope.cancel = function() {
 			$modalInstance.dismiss();
 		};

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

@@ -278,7 +278,11 @@ define(['app/app'], function(app) {
 						return false;
 					},
 					isModify : function () {
-						return true;
+						if (address){
+							return true;
+						}else {
+							return false;
+						}
 					}
 				}
 			}).result.then(function(address){
@@ -286,133 +290,76 @@ define(['app/app'], function(app) {
 					$scope.loadAddresses();
 				}
 			}, function(){
-				toaster.pop('info', '提示 ' + '您已取消发货地址的编辑');
+				// toaster.pop('info', '提示 ' + '您已取消发货地址的编辑');
 			});
 		};
 
-		$scope.addAddress = function () {
-			$modal.open({
-				templateUrl : $rootScope.rootPath + '/static/view/common/modal/edit_address_modal.html',
-				controller : 'addAddrCtrl',
-				size : 'lg',
-				resolve : {
-					isSendType : function () {
-						return false;
-					},
-					isModify : function () {
-						return false;
-					}
-				}
-			}).result.then(function(address){
-				if (address) {
-					$scope.loadAddresses();
-				}
-			}, function(){
-				toaster.pop('info', '提示 ' + '您已取消发货地址的编辑');
-			});
-		};
-
-		//地址新增模态框
-		app.register.controller('addAddrCtrl', ['$scope', '$modalInstance', 'toaster', '$http', 'ShippingAddress', 'isSendType', 'isModify', function($scope, $modalInstance, toaster, $http, ShippingAddress, isSendType, isModify){
-			$scope.isSendType = isSendType;
-			$scope.isSetTop = false;
-			$scope.isModify = isModify;
-			$http.get('static/js/prod/data/city.json').success(function(data) {
-				$scope.division = data;
-			}).error(function() {
-				toaster.pop('error', '系统错误 ' + '加载城市信息失败');
-			});
-
-			$scope.checkForm = function(name, num) {
-				var size;
-				if(num == 1) {
-					size = document.getElementById("userName").value.length;
-					if (size > 10) {
-						$scope.userError = true;
-						return;
-					}
-					$scope.userError = false;
-				} else if(num == 2) {
-					size = document.getElementById("tel").value.length;
-					if (size > 11) {
-						$scope.telError = true;
-						return;
-					}
-					$scope.telError = false;
-				} else if(num == 3) {
-					size = document.getElementById("addr").value.length;
-					if (size > 30) {
-						$scope.addrError = true;
-						return;
-					}
-					$scope.addrError = false;
-				}
-			};
-
-			$scope.save = function () {
-				var address = $scope.address;
-
-				//拼装地区
-				address.area = address.province + ',' + address.city + ',' + address.district;
-
-
-				// send属性 控制本地址是否是发货地址
-				ShippingAddress.save({isSetTop: $scope.isSetTop, send: $scope.isSendType, isPersonal: !$scope.isSendType}, address, function(data){
-					toaster.pop('success', '成功 ', '保存收货地址成功');
-					$modalInstance.close(data);
-				}, function(){
-					toaster.pop('error', '系统错误 ', '保存收货地址失败');
-				});
-			};
-
-			$scope.cancel = function() {
-				$modalInstance.dismiss();
-			};
-		}]);
-
 		//地址编辑模态框
 		app.register.controller('editAddrCtrl', ['$scope', 'addr', '$modalInstance', 'toaster', '$http', 'ShippingAddress', 'isSendType', 'isModify', function($scope, addr, $modalInstance, toaster, $http, ShippingAddress, isSendType, isModify){
-			$scope.isSetTop = addr.num == 1;
+			if (addr){
+				$scope.isSetTop = addr.num == 1;
+			}else {
+				$scope.isSetTop = false;
+			}
 			$scope.isSendType = isSendType;
 			$scope.isModify = isModify;
 
-			$scope.checkForm = function(name, num) {
+			$scope.checkForm = function(num) {
 				var size;
 				if(num == 1) {
-					size = document.getElementById("userName").value.length;
-					if (size > 10) {
-						$scope.userError = true;
-						return;
+					if ($scope.address.name){
+						size = $scope.address.name.replace(/[^x00-xFF]/g,'**').length;
+						if (size > 20) {
+							console.log(size);
+							$scope.userError = true;
+							return;
+						}
+						$scope.userError = false;
 					}
-					$scope.userError = false;
 				} else if(num == 2) {
-					size = document.getElementById("tel").value.length;
-					if (size > 11) {
-						$scope.telError = true;
-						return;
+					if ($scope.address.tel){
+						size = $scope.address.tel.replace(/[^x00-xFF]/g,'**').length;
+						if (size < 8 || size > 11) {
+							$scope.telError = true;
+							return;
+						}
+						$scope.telError = false;
+						var telPatt = new RegExp("^[0-9]+$");
+						if (telPatt.test($scope.address.tel)){
+							$scope.telPatternError = false;
+						}else {
+							$scope.telPatternError = true;
+						}
 					}
-					$scope.telError = false;
 				} else if(num == 3) {
-					size = document.getElementById("addr").value.length;
-					if (size > 30) {
-						$scope.addrError = true;
-						return;
+					if ($scope.address.detailAddress){
+						size = $scope.address.detailAddress.replace(/[^x00-xFF]/g,'**').length;
+						if (size > 60) {
+							$scope.addrError = true;
+							return;
+						}
+						$scope.addrError = false;
+					}
+				} else if(num == 4) {
+					var emailPatt = new RegExp("^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$");
+					if ($scope.address.email.length > 0 && !emailPatt.test($scope.address.email)){
+						$scope.emailPatternError = true;
+					}else {
+						$scope.emailPatternError = false;
 					}
-					$scope.addrError = false;
 				}
 			};
 
 			$http.get('static/js/prod/data/city.json').success(function(data) {
 				$scope.division = data;
 				if(addr && addr.area){
-					$scope.address = addr;
+					// $scope.address = addr;
 					//拼装下拉选择框
 					var arr = addr.area.split(',');
 					addr.province = arr[0];
 					addr.city = arr[1];
 					addr.district = arr[2];
 					$scope.address = addr;
-					$scope.addr = true;
 				}
 			}).error(function() {
 				toaster.pop('error', '系统错误 ' + '加载城市信息失败');
@@ -421,6 +368,21 @@ define(['app/app'], function(app) {
 			$scope.save = function () {
 				var address = $scope.address;
 
+				if (!address){
+					toaster.pop('error', '请补充未填写的信息');
+					return ;
+				}
+				if (!address.name || !address.province || !address.city || !address.district ||
+					!address.detailAddress || !address.tel){
+					toaster.pop('error', '请补充未填写的信息');
+					return ;
+				}
+				if ($scope.userError || $scope.telError || $scope.addrError || $scope.telPatternError ||
+					$scope.emailPatternError){
+					toaster.pop('error', '请修改红色框内的信息');
+					return ;
+				}
+
 				//拼装地区
 				address.area = address.province + ',' + address.city + ',' + address.district;
 

+ 69 - 64
src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_cart_ctrl.js

@@ -11,7 +11,7 @@ define(["app/app", 'jquery-summernote'], function(app) {
 		 * */
 		var enIdFilter = $filter('EncryptionFilter');
 		$scope.cartExist = true;
-		$scope.isLoading = false;
+		$scope.isDataLoading = false;
 		$scope.errors = null;
 		$scope.goodsInfo = [];
 		$scope.carts = [];
@@ -37,60 +37,53 @@ define(["app/app", 'jquery-summernote'], function(app) {
 		$scope.cartIsEmpty = true;
 		$scope.countByPage = 0;
 		$scope.cartMap = [];
+		/**
+		 * 全选状态信息
+		 */
+		$scope.isChooseAll = false;
 
 		$scope.loadData = function (){
-			if(!$scope.isLoading) {
-				$scope.isLoading = true;
-				Cart.getPageInfo($scope.pageInfo, function(data) {
-					$scope.isLoading = false;
-					$scope.total = data.totalElements;
-					$scope.pageNum = data.totalPages;
-
-					angular.forEach(data.content, function (cart) {
-						if(cart.currencyName.indexOf("RMB") > -1) {
-							cart.buyCurrency = "RMB";
-						}else {
-							cart.buyCurrency = "USD";
-						}
-						cart.isSelect = false;
-						//计算分段和统计一下价格
-						$scope.getPrice(cart);
-
-						//便于后期循环
-						$scope.carts.push(cart);
-						$scope.disabledAddAndSub(cart);
-						$scope.countByPage += 1;
-						var isContain = false;
-						for (var i = 0; i < $scope.cartMap.length; i++) {
-							if(angular.equals($scope.cartMap[i].name, cart.storeName)) {
-								$scope.cartMap[i].arr.push(cart);
-								isContain = true;
-							}
-						}
-						if(!isContain) {
-							var obj = {};
-							obj.name = cart.storeName;
-							obj.arr = [];
-							obj.arr.push(cart);
-							$scope.cartMap.push(obj);
+			Cart.getPageInfo($scope.pageInfo, function(data) {
+				$scope.isDataLoading = false;
+				$scope.total = data.totalElements;
+				$scope.pageNum = data.totalPages;
+
+				angular.forEach(data.content, function (cart) {
+					cart.buyCurrency = cart.currencyName.indexOf("RMB") > -1 ? "RMB" : "USD";
+					cart.isSelect = false;
+					//计算分段和统计一下价格
+					$scope.getPrice(cart);
+
+					//便于后期循环
+					$scope.carts.push(cart);
+					$scope.disabledAddAndSub(cart);
+					$scope.countByPage += 1;
+					var isContain = false;
+					for (var i = 0; i < $scope.cartMap.length; i++) {
+						if(angular.equals($scope.cartMap[i].name, cart.storeName)) {
+							$scope.cartMap[i].arr.push(cart);
+							isContain = true;
 						}
-					});
-					if(!$scope.carts.length) {
-						$scope.cartIsEmpty = true;
-					}else {
-						$scope.cartIsEmpty = false;
 					}
-					//设置全选的复选框
-					$scope.isChooseAll = $scope.isAllSelect($scope.carts);
+					if(!isContain) {
+						var obj = {};
+						obj.name = cart.storeName;
+						obj.arr = [];
+						obj.arr.push(cart);
+						$scope.cartMap.push(obj);
+					}
+				});
+				$scope.cartIsEmpty = !$scope.carts.length ? true : false;
+				//设置全选的复选框
+				$scope.isChooseAll = $scope.isAllSelect($scope.carts);
 
-					//设置店铺复选框的状态
-					angular.forEach($scope.cartMap, function (store) {
-						$scope.selectedStore[store.name] = $scope.isAllSelect(store.arr);
-					});
-				},function() {
-					toaster.pop('error', "提示", "获取购物车信息失败,请刷新页面");
+				//设置店铺复选框的状态
+				angular.forEach($scope.cartMap, function (store) {
+					$scope.selectedStore[store.name] = $scope.isAllSelect(store.arr);
 				});
-			}
+			},function() {
+				toaster.pop('error', "提示", "获取购物车信息失败,请刷新页面");
+			});
 		};
 
 		$scope.loadData();
@@ -100,8 +93,11 @@ define(["app/app", 'jquery-summernote'], function(app) {
 		 */
 		$scope.scrollLoadData = function () {
 			if($scope.pageInfo.page < $scope.pageNum) {
-				$scope.pageInfo.page++;
-				$scope.loadData();
+				if(!$scope.isDataLoading) {
+					$scope.isDataLoading = true;
+					$scope.pageInfo.page++;
+					$scope.loadData();
+				}
 			}
 		};
 
@@ -232,12 +228,15 @@ define(["app/app", 'jquery-summernote'], function(app) {
 			if (c.number < c.goods.minBuyQty || !c.number) {
 				toaster.pop("info", "提示", "该商品最少购买" + c.goods.minBuyQty + "件");
 				c.number = c.goods.minBuyQty;
-			}else if(c.number > c.goods.reserve){
+			}else if(c.number <= c.goods.reserve){
+				c.number = Number(NumberService.sub(Number(c.number), c.number % c.goods.minPackQty));
+			}else{
 				toaster.pop("info", "提示", "库存不足");
 				if(c.number > c.goods.reserve) {
 					c.number = Number(NumberService.sub(c.goods.reserve, c.goods.reserve % c.goods.minPackQty));
 				}
 			}
+
 			$scope.disabledAddAndSub(c);
 			$scope.getPrice(c);
 			//计算总金额,统计购买器件数
@@ -572,11 +571,6 @@ define(["app/app", 'jquery-summernote'], function(app) {
 		 * 选中操作
 		 **********************************************************************/
 
-		/**
-		 * 全选状态信息
-		 */
-		$scope.isChooseAll = false;
-
 		/**
 		 * 全选操作
 		 */
@@ -613,13 +607,18 @@ define(["app/app", 'jquery-summernote'], function(app) {
 
 		//检查是否所有的状态都已经选中或者取消了。
 		$scope.isAllSelect = function (carts) {
-			var isAllChecked = true;//假定都选中,
-			angular.forEach(carts, function(cart) {
-				if(cart.status != 1 && !cart.isSelect) {
-					isAllChecked = false;
+			var isAllChecked = true;//假定都选中
+			var isAlldisabled = true;
+			for(var i = 0; i < carts.length; i++) {
+				var cart = carts[i];
+				if(cart.status != 1) {
+					isAlldisabled = false;
+					if(!cart.isSelect) {
+						isAllChecked = false;
+					}
 				}
-			});
-			return isAllChecked;
+			}
+			return !isAlldisabled&&isAllChecked;
         };
         /**
 		 * 店铺选中状态信息
@@ -897,6 +896,10 @@ define(["app/app", 'jquery-summernote'], function(app) {
 						}
 					});
 				});
+				if (uuids.length == 0){
+					toaster.pop('info', '你还未选择任何产品');
+					return;
+				}
                 collectionService.saveStores({ }, uuids, function(response){
 					if(response.data == "success"){
                         $scope.collectDelete();
@@ -926,7 +929,9 @@ define(["app/app", 'jquery-summernote'], function(app) {
 				uuid: commodity.uuid,
 				batchCode: commodity.batchCode,
 				number: number ? number : commodity.minBuyQty,
-				currencyName: currency ? currency == 'RMB-USD' ? 'RMB' : currency : ''
+				currencyName: currency ? currency == 'RMB-USD' ? 'RMB' : currency : '',
+				minPackQty : commodity.minPackQty,
+				storeUuid : commodity.storeid
 			};
 			var goodsList = [];
 			goodsList.push(cart);

+ 10 - 0
src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_order_ctrl.js

@@ -239,6 +239,16 @@ define(['app/app'], function (app) {
 			});
 		};
 
+		//取消订单状态码
+		$scope.cancelOrderArray = {
+			602: true,
+			603: true,
+			315: true,
+			604: true,
+			605: true,
+			606: true
+		};
+
 		var getRecommendComps = function (userUU, usedFor, pageable) {
 			Recommendation.getRecommendComps({page: pageable.page, size: pageable.size}, function (data) {
 				$scope.recommendComps = data.content;

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

@@ -445,11 +445,18 @@ define(['app/app'], function(app) {
 			$scope.isnotCheck = true;
 			$modal.open({
 				templateUrl : $rootScope.rootPath + '/static/view/common/modal/edit_address_modal.html',
-				controller : 'editAddrCtrl',
+				controller : 'editAddrPayCtrl',
 				size : 'lg',
 				resolve : {
 					addr : function(){
 						return angular.copy(addr);
+					},
+					isModify : function () {
+						if (addr){
+							return true;
+						}else {
+							return false;
+						}
 					}
 				}
 			}).result.then(function(address){
@@ -563,66 +570,100 @@ define(['app/app'], function(app) {
 	}]);
 
 	//地址编辑模态框
-	app.register.controller('editAddrCtrl', ['$scope', 'addr', '$modalInstance', 'toaster', '$http', 'ShippingAddress', function($scope, addr, $modalInstance, toaster, $http, ShippingAddress){
+	app.register.controller('editAddrPayCtrl', ['$scope', 'addr', '$modalInstance', 'toaster', '$http', 'ShippingAddress', 'isModify', function($scope, addr, $modalInstance, toaster, $http, ShippingAddress, isModify){
 		if (addr){
 			$scope.isSetTop = addr.num == 1;
 		}else {
 			$scope.isSetTop = false;
 		}
+		$scope.isModify = isModify;
 		$scope.validEmail = function (email) {
 			return /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/.test(email)
         };
-        //验证数据
-        $scope.checkForm = function(name, num) {
-            var size;
-            if(num == 1) {
-                size = document.getElementById("userName").value.length;
-                console.log(size);
-                if (size > 10) {
-                    $scope.userError = true;
-                    return;
-                }
-                $scope.userError = false;
-            } else if(num == 2) {
-                size = document.getElementById("tel").value.length;
-                console.log(size);
-                if (size > 11) {
-                    $scope.telError = true;
-                    return;
-                }
-                $scope.telError = false;
-            } else if(num == 3) {
-                size = document.getElementById("addr").value.length;
-                console.log(size);
-                if (size > 30) {
-                    $scope.addrError = true;
-                    return;
-                }
-                $scope.addrError = false;
-            }
-        };
+
 		$http.get('static/js/prod/data/city.json').success(function(data) {
 			$scope.division = data;
 			if(addr && addr.area){
-				$scope.address = addr;
+				// $scope.address = addr;
 				//拼装下拉选择框
 				var arr = addr.area.split(',');
 				addr.province = arr[0];
 				addr.city = arr[1];
 				addr.district = arr[2];
 				$scope.address = addr;
-				$scope.addr = true;
+				// $scope.addr = true;
 			}
-		}).error(function(e) {
+		}).error(function() {
 			toaster.pop('error', '系统错误 ' + '加载城市信息失败');
 		});
 
+        //验证数据
+		$scope.checkForm = function(num) {
+			var size;
+			if(num == 1) {
+				if ($scope.address.name){
+					size = $scope.address.name.replace(/[^x00-xFF]/g,'**').length;
+					if (size > 20) {
+						$scope.userError = true;
+						return;
+					}
+					$scope.userError = false;
+				}
+			} else if(num == 2) {
+				if ($scope.address.tel){
+					size = $scope.address.tel.replace(/[^x00-xFF]/g,'**').length;
+					if (size < 8 || size > 11) {
+						$scope.telError = true;
+						return;
+					}
+					$scope.telError = false;
+					var telPatt = new RegExp("^[0-9]+$");
+					if (telPatt.test($scope.address.tel)){
+						$scope.telPatternError = false;
+					}else {
+						$scope.telPatternError = true;
+					}
+				}
+			} else if(num == 3) {
+				if ($scope.address.detailAddress){
+					size = $scope.address.detailAddress.replace(/[^x00-xFF]/g,'**').length;
+					if (size > 60) {
+						$scope.addrError = true;
+						return;
+					}
+					$scope.addrError = false;
+				}
+			} else if(num == 4) {
+				var emailPatt = new RegExp("^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$");
+				if ($scope.address.email.length > 0 && !emailPatt.test($scope.address.email)){
+					$scope.emailPatternError = true;
+				}else {
+					$scope.emailPatternError = false;
+				}
+			}
+		};
+
+
+
 		$scope.save = function () {
 			var address = $scope.address;
+
+			if (!address){
+				toaster.pop('error', '请补充未填写的信息');
+				return ;
+			}
+			if (!address.name || !address.province || !address.city || !address.district ||
+				!address.detailAddress || !address.tel){
+				toaster.pop('error', '请补充未填写的信息');
+				return ;
+			}
+			if ($scope.userError || $scope.telError || $scope.addrError || $scope.telPatternError ||
+				$scope.emailPatternError){
+				toaster.pop('error', '请修改红色框内的信息');
+				return ;
+			}
+
 			//拼装地区
-			/**
-			 * TODO 这里没做校验
-			 */
 			var strAres = address.province + ',' + address.city + ',' + address.district;
 			address.area = strAres;
 

+ 15 - 2
src/main/webapp/resources/js/vendor/controllers/forstore/purchase_detail.js

@@ -5,6 +5,7 @@ define(['app/app'], function(app) {
 
 		// 保存采购单编号信息
 		$scope.purchaseId = $stateParams.purchaseId;
+		$scope.open = false;
 
 		// 记录状态激活信息
 		$scope.steps = {
@@ -186,7 +187,19 @@ define(['app/app'], function(app) {
 			});
 		}
 
-		$scope.updateTotal = function () {
+		$scope.updateTotal = function (data) {
+			if (isNaN(data.currentTaxUnitPrice)){
+				data.currentTaxUnitPrice = 0.000001;
+				toaster.pop('warning', '提示', '输入的价格必须是数字');
+				return ;
+			}
+			if (Number(data.currentTaxUnitPrice) <= 0){
+				data.currentTaxUnitPrice = 0.000001;
+			}
+			if (Number(data.currentTaxUnitPrice) > 100000){
+				data.currentTaxUnitPrice = 100000;
+			}
+			data.currentTaxUnitPrice = Number(NumberService.toCeil(data.currentTaxUnitPrice, 6));
 			$scope.purchase.currentTotal = 0;
 			angular.forEach($scope.purchase.purchaseDetails, function (detail) {
 				$scope.purchase.currentTotal += detail.currentTaxUnitPrice * detail.number;
@@ -218,7 +231,7 @@ define(['app/app'], function(app) {
                 var param = { };
                 param.detailid  = $scope.purchase.purchaseDetails[i].detailid;
                 param.modifyingUnitPrice = $scope.purchase.purchaseDetails[i].currentTaxUnitPrice;
-                if($scope.purchase.purchaseDetails[i].currentTaxUnitPrice <= 0.000001){
+                if($scope.purchase.purchaseDetails[i].currentTaxUnitPrice < 0.000001){
                     toaster.pop('info', '金额必须要大于0.000001');
                     return;
                 }

+ 74 - 37
src/main/webapp/resources/js/vendor/controllers/forstore/vendor_delivery_ctrl.js

@@ -191,7 +191,7 @@ define(['app/app'], function(app) {
             $scope.isnotCheck = true;
             $modal.open({
                 templateUrl : 'static/view/common/modal/edit_address_modal.html',
-                controller : 'editAddrCtrl',
+                controller : 'editAddrDeCtrl',
                 size : 'lg',
                 resolve : {
                     addr : function(){
@@ -217,6 +217,7 @@ define(['app/app'], function(app) {
         var loadAddrs = function() {
             ShippingAddress.getListEnterprise({ship : false}, function(data) {
                 $scope.addresss = data;
+                $scope.total = $scope.addresss.length;
                 $scope.jsonSdAddress = {};
                 if($scope.addresss.length > 0) {
                     $scope.jsonSdAddress = $scope.addresss[0];
@@ -612,42 +613,19 @@ define(['app/app'], function(app) {
     }]);
 
     //地址编辑模态框
-    app.register.controller('editAddrCtrl', ['$scope', 'addr', '$modalInstance', 'toaster', '$http', 'ShippingAddress', function($scope, addr, $modalInstance, toaster, $http, ShippingAddress){
-        $scope.isSetTop = false;
+    app.register.controller('editAddrDeCtrl', ['$scope', 'addr', '$modalInstance', 'toaster', '$http', 'ShippingAddress', function($scope, addr, $modalInstance, toaster, $http, ShippingAddress){
+        if (addr){
+            $scope.isSetTop = addr.num == 1;
+            $scope.isModify = true;
+        }else {
+            $scope.isSetTop = false;
+            $scope.isModify = false;
+        }
 
         $scope.isSendType = true;
         //验证数据
         $scope.checkeds = {};
-        //验证数据
-        $scope.checkForm = function(name, num) {
-            var size;
-            if(num == 1) {
-                size = document.getElementById("userName").value.length;
-                console.log(size);
-                if (size > 10) {
-                    $scope.userError = true;
-                    return;
-                }
-                $scope.userError = false;
-            } else if(num == 2) {
-                size = document.getElementById("tel").value.length;
-                console.log(size);
-                if (size > 11) {
-                    $scope.telError = true;
-                    return;
-                }
-                $scope.telError = false;
-            } else if(num == 3) {
-                // size = document.getElementById("addr").value.length;
-                size = $scope.address.detailAddress.length;
-                console.log(size);
-                if (size > 30){
-                    $scope.addrError = true;
-                    return;
-                }
-                $scope.addrError = false;
-            }
-        };
+
         $http.get('static/js/prod/data/city.json').success(function(data) {
             $scope.division = data;
             if(addr){
@@ -660,16 +638,75 @@ define(['app/app'], function(app) {
                 $scope.address = addr;
                 $scope.addr = true;
             }
-        }).error(function(e) {
+        }).error(function() {
             toaster.pop('error', '系统错误 ' + '加载城市信息失败');
         });
 
+        $scope.checkForm = function(num) {
+            var size;
+            if(num == 1) {
+                if ($scope.address.name){
+                    size = $scope.address.name.replace(/[^x00-xFF]/g,'**').length;
+                    if (size > 20) {
+                        $scope.userError = true;
+                        return;
+                    }
+                    $scope.userError = false;
+                }
+            } else if(num == 2) {
+                if ($scope.address.tel){
+                    size = $scope.address.tel.replace(/[^x00-xFF]/g,'**').length;
+                    if (size < 8 || size > 11) {
+                        $scope.telError = true;
+                        return;
+                    }
+                    $scope.telError = false;
+                    var telPatt = new RegExp("^[0-9]+$");
+                    if (telPatt.test($scope.address.tel)){
+                        $scope.telPatternError = false;
+                    }else {
+                        $scope.telPatternError = true;
+                    }
+                }
+            } else if(num == 3) {
+                if ($scope.address.detailAddress){
+                    size = $scope.address.detailAddress.replace(/[^x00-xFF]/g,'**').length;
+                    if (size > 60) {
+                        $scope.addrError = true;
+                        return;
+                    }
+                    $scope.addrError = false;
+                }
+            } else if(num == 4) {
+                var emailPatt = new RegExp("^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$");
+                if ($scope.address.email.length > 0 && !emailPatt.test($scope.address.email)){
+                    $scope.emailPatternError = true;
+                }else {
+                    $scope.emailPatternError = false;
+                }
+            }
+        };
+
+
         $scope.save = function () {
             var address = $scope.address;
+
+            if (!address){
+                toaster.pop('error', '请补充未填写的信息');
+                return ;
+            }
+            if (!address.name || !address.province || !address.city || !address.district ||
+                !address.detailAddress || !address.tel){
+                toaster.pop('error', '请补充未填写的信息');
+                return ;
+            }
+            if ($scope.userError || $scope.telError || $scope.addrError || $scope.telPatternError ||
+                $scope.emailPatternError){
+                toaster.pop('error', '请修改红色框内的信息');
+                return ;
+            }
+
             //拼装地区
-            /**
-             * TODO 这里没做校验
-             */
             var strAres = address.province + ',' + address.city + ',' + address.district;
             address.area = strAres;
 

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

@@ -364,7 +364,6 @@ define(['app/app', 'calendar'], function (app) {
 				if ($scope.address.name){
 					size = $scope.address.name.replace(/[^x00-xFF]/g,'**').length;
 					if (size > 20) {
-						console.log(size);
 						$scope.userError = true;
 						return;
 					}

+ 10 - 0
src/main/webapp/resources/js/vendor/controllers/forstore/vendor_order_ctrl.js

@@ -921,6 +921,16 @@ define(['app/app'], function (app) {
             $scope.orderTableParams.reload();
         };
 
+        //取消订单状态码
+        $scope.cancelOrderArray = {
+            602: true,
+            603: true,
+            315: true,
+            604: true,
+            605: true,
+            606: true
+        };
+
         //当前页在前段的计算方式
         $scope.frontSegment = function (currentPage, totalElementPages) {
             angular.forEach($scope.pages, function (page) {

+ 74 - 4
src/main/webapp/resources/js/vendor/controllers/forstore/vendor_standard_putOn_ctrl.js

@@ -4,7 +4,7 @@
  */
 define(['app/app'], function (app) {
     'use strict';
-    app.register.controller('vendor_standardPutOnCtrl', ['$scope', '$rootScope', 'StandardPutOnAdminService', 'ngTableParams', 'BaseService', 'toaster', 'Enterprise', '$q', 'Loading', '$modal', function ($scope, $rootScope, StandardPutOnAdminService, ngTableParams, BaseService, toaster, Enterprise, $q, Loading, $modal) {
+    app.register.controller('vendor_standardPutOnCtrl', ['$scope', '$rootScope', 'StandardPutOnAdminService', 'ngTableParams', 'BaseService', 'toaster', 'Enterprise', '$q', 'Loading', '$modal', 'ConsignmentAgreementRecord', function ($scope, $rootScope, StandardPutOnAdminService, ngTableParams, BaseService, toaster, Enterprise, $q, Loading, $modal, ConsignmentAgreementRecord) {
         $rootScope.active = 'vendor_goods';
         $scope.keyword = '';
         $scope.tab = 'vendor_standardPutOn';
@@ -53,6 +53,8 @@ define(['app/app'], function (app) {
                     $scope.$$putOn.end = Number(page.size) * (Number(page.number) - 1) + Number(page.numberOfElements);
                     params.total(page.totalElements);
                     angular.forEach(page.content, function (info) {
+                        // TODO 设置默认商品销售方式
+                        info.selfSale = $scope.$$putOn.isSelfStore;
                         if(!info.minPackQty) {
                             info.minPackQty = 1;
                         }
@@ -110,7 +112,7 @@ define(['app/app'], function (app) {
             standard.editMinBuyQty = standard.minBuyQty;
             standard.editQtyPrices = angular.copy(standard.qtyPrices);
             standard.editIsSelfSale = !standard.selfSale ? false : true;
-            standard.editSelfSaleNum = standard.editIsSelfSale ? 1 : 0;
+            standard.editSelfSaleNum = standard.editIsSelfSale ? 0 : 1;
             standard.editLockQty = standard.lockQty;
             standard.editAvailableOnSale = standard.availableOnSale;
             standard.editOnSaleQty = standard.onSaleQty;
@@ -349,7 +351,27 @@ define(['app/app'], function (app) {
          * 改变销售方式
          */
         $scope.changeSale = function (standard) {
-            standard.editIsSelfSale = standard.editSelfSaleNum == 1;
+            standard.editIsSelfSale = standard.editSelfSaleNum == 0;
+
+            if (!standard.editIsSelfSale) {
+				ConsignmentAgreementRecord.findRecordOfUser({}, {}, function (record) {
+				    if (!record.id) {
+				        // 弹出寄售协议弹窗
+						$modal.open({
+							templateUrl : 'static/view/vendor/modal/confirm_consignment_agreement.html',
+							controller : 'ConfirmConsignmentAgreement'
+						}).result.then(function(){
+							toaster.pop('success', '操作成功');
+						}, function(){
+							standard.editSelfSaleNum = 0;
+							standard.editIsSelfSale = standard.editSelfSaleNum === 0;
+						});
+                    }
+				}, function (error) {
+                    console.log(error);
+                    toaster.pop('error', '系统异常,请联系管理员寻求帮助');
+				});
+            }
         };
 
         /**
@@ -625,6 +647,12 @@ define(['app/app'], function (app) {
             }
         };
 
+        $scope.updatePrice = function () {
+            StandardPutOnAdminService.updateQtyPrice({},{},function (data) {
+
+            })
+        };
+
         /**
          * 一键更新
          */
@@ -713,4 +741,46 @@ define(['app/app'], function (app) {
             $modalInstance.close();
         }
     }]);
-});
+
+	/**
+     * 店铺寄售协议确认弹框
+	 */
+	app.register.controller('ConfirmConsignmentAgreement', ['$scope', '$modalInstance', 'ConsignmentAgreementRecord', 'toaster', function ($scope, $modalInstance, ConsignmentAgreementRecord, toaster) {
+
+	    $scope.agreement = false;
+	    $scope.article = '';
+
+	    ConsignmentAgreementRecord.obtainAConsignmentAgreement({}, {}, function (data) {
+	        if (data && data.article) {
+	            $scope.article = data.article;
+            }
+            console.log(data);
+		}, function (error) {
+            console.log(error);
+		});
+
+		/**
+         * 确认操作
+		 */
+		$scope.confirm = function () {
+			ConsignmentAgreementRecord.saveRecordWhenUserAgree({}, {agreement: $scope.agreement}, function (result) {
+                if (result.success) {
+					$modalInstance.close();
+                } else {
+					console.log(result.message);
+					toaster.pop('error', '用户信息异常,请联系管理员寻求帮助');
+                }
+			}, function (error) {
+                console.log(error);
+				toaster.pop('error', '系统异常,请联系管理员寻求帮助');
+			});
+		};
+
+		/**
+         * 取消操作
+		 */
+		$scope.cancel = function () {
+            $modalInstance.dismiss();
+		};
+	}]);
+});

+ 47 - 2
src/main/webapp/resources/view/admin/store/fragments/enterprise_info.html

@@ -174,6 +174,25 @@
 		border: none;
 		background: #3ba9e9;
 	}
+	/*表格样式*/
+	.application-tab table tbody tr{
+		height: 50px;
+	}
+	.application-tab table tr th,.application-tab table tr td{
+		border: #cfedfe 1px solid;
+		text-align: center;
+		vertical-align: middle;
+	}
+	.application-tab .table-bordered{
+		border-top: #cfedfe 1px solid;
+	}
+	.application-tab table tr th{
+		background: #cfedfe;
+		height: 35px;
+	}
+	.application-tab table tbody tr:hover{
+		background: #e4f3fc;
+	}
 </style>
 <div class="enterprise-info" ng-controller="EnterpriseInfoCtrl">
 	<h2 ng-bind="store.enterprise.enName">深圳市优软商城科技有限公司</h2>
@@ -255,10 +274,36 @@
 				</ul>
 			</div>
 		</div>
+		<!-- 企业寄售协议操作记录 -->
+		<div ng-if="showRecords" class="application-tab" style="width: 98%;margin: 0 auto;">
+			<div class="row" style="width: 100%">
+				<div class="col-md-12">
+					<div style="width: 100%;line-height: 50px;font-size: 16px;">
+						企业寄售协议操作记录
+					</div>
+					<table class="table" ng-table="recordsTableParams">
+						<thead>
+						<tr>
+							<th>序号</th>
+							<th>操作人</th>
+							<th>操作时间</th>
+						</tr>
+						</thead>
+						<tbody>
+						<tr ng-repeat="record in $data">
+							<td style="text-align: center;" ng-bind="(recordsTableParams.page() - 1) * recordsTableParams.count() + $index + 1"></td>
+							<td style="text-align: center;" ng-bind="record.userName"></td>
+							<td style="text-align: center;" ng-bind="record.operateTime | date: 'yyyy-MM-dd HH:mm:ss'"></td>
+						</tr>
+						</tbody>
+					</table>
+				</div>
+			</div>
+		</div>
 	</div>
 </div>
-<!--推荐相关内容-->
-<div class="recommend">
+<!--推荐相关内容 TODO huxz 暂时隐藏 -->
+<div class="recommend" style="display: none;">
 	<div class="recommend-list hot-icon">推荐成为:
 		<label>
 			<i class="hot"></i>热销

+ 6 - 2
src/main/webapp/resources/view/admin/store/fragments/violations_detail.html

@@ -279,6 +279,9 @@
 		background: #3f7ae3;
 		color: #fff;
 	}
+	.violation-content .violation-text .text-input textarea:focus{
+		border: #66afe9 1px solid;
+	}
 </style>
 <div>
 	<div class="violation-handler" ng-if="violations.disposeOperator">
@@ -298,7 +301,8 @@
 					<i ng-if="violations.disposition === 'CLOSE_PERMANENT'">永久暂停店铺营业</i>
 				</p>
 				<p>处罚日期:<i>{{violations.disposeOperator.operateTime | date: 'yyyy-MM-dd HH:mm:ss'}} 至 {{(violations.disposeEndTime | date: 'yyyy-MM-dd HH:mm:ss') || '永久'}}</i></p>
-				<p>具体原因:<i ng-bind="violations.reason">近3个月内有5个订单被买家投诉为虚假发货,严重违反了优软商城诚信交易原则,现予以关闭店铺的处罚!</i></p>
+				<p style="display: inline-block;
+    width: 800px;">具体原因:<i ng-bind="violations.reason">近3个月内有5个订单被买家投诉为虚假发货,严重违反了优软商城诚信交易原则,现予以关闭店铺的处罚!</i></p>
 			</div>
 			<div class="qualification-list" ng-if="violations.disposeProof && violations.disposeProof.length > 0">
 				<ul class="qualification">
@@ -381,7 +385,7 @@
 	<!-- 恢复经营 -->
 	<div class="com-del-box" ng-if="showRestoreConfirmDialog">
 		<div class="title">
-			<a ng-click="wantRestoreStore(false)"><i class="fa fa-close fa-lg"></i></a>
+			<a ng-click="wantRestoreStore(false)"><i class="fa fa-close fa-lg" style="font-size: 16px;"></i></a>
 		</div>
 		<div class="content">
 			<p style="line-height: 20px; padding-top: 20px;"><i class="fa fa-exclamation-circle"></i>是否要恢复店铺经营<br/><span style="color: #f00">处置执行中</span></p>

+ 8 - 2
src/main/webapp/resources/view/admin/store/fragments/violations_handler.html

@@ -42,8 +42,8 @@
 		width: 100%;
 		height: 100%;
 		background: #fff;
-		border: none;
 		padding: 10px;
+		border-radius: 0;
 	}
 	.violation-content .violation-text .count_tip{
 		position: absolute;
@@ -158,6 +158,12 @@
 		padding-left: 10px;
 		border: none;
 	}
+	.violation-text .content .form-control:focus,.violation-content .violation-text .text-input textarea:focus{
+		border: #66afe9 1px solid;
+	}
+	.violation-content .violation-text .text-input textarea{
+		border: none;
+	}
 	.violation-text .content select.form-control option:first-child{
 		color: #999;
 	}
@@ -228,7 +234,7 @@
 		<div class="violation-text">
 			<span class="title"><em>*</em>处置原因:</span>
 			<div class="text-input">
-				<textarea placeholder="请填写违规处置的原因" maxlength="200" ng-model="violations.reason"></textarea>
+				<textarea placeholder="请填写违规处置的原因" maxlength="200" ng-model="violations.reason" class="form-control"></textarea>
 				<p class="count_tip"><span><em ng-bind="(violations.reason || '').length">0</em>/200</span></p>
 			</div>
 		</div>

+ 1 - 6
src/main/webapp/resources/view/admin/store/fragments/violations_list.html

@@ -137,12 +137,7 @@
 						<p ng-if="!violations.disposition" class="blue">违规店铺</p>
 					</td>
 					<td ng-bind="violations.createTime | date: 'yyyy-MM-dd HH:mm:ss'">2017-05-09 10:28:30</td>
-					<td>
-						<span ng-if="violations.restoreOperator" ng-bind="violations.restoreOperator.operateTime | date: 'yyyy-MM-dd HH:mm:ss'"></span>
-						<span ng-if="violations.authOperator && !violations.restoreOperator" ng-bind="violations.authOperator.operateTime | date: 'yyyy-MM-dd HH:mm:ss'"></span>
-						<span ng-if="violations.complaintOperator && !violations.authOperator && !violations.restoreOperator" ng-bind="violations.complaintOperator.operateTime | date: 'yyyy-MM-dd HH:mm:ss'"></span>
-						<span ng-if="violations.createTime && !violations.complaintOperator && !violations.authOperator && !violations.restoreOperator" ng-bind="violations.createTime | date: 'yyyy-MM-dd HH:mm:ss'"></span>
-					</td>
+					<td ng-bind="violations.updateTime | date: 'yyyy-MM-dd HH:mm:ss'">2017-05-09 10:28:30</td>
 					<td>
 						<span ng-if="violations.restoreOperator" ng-bind="violations.restoreOperator.name"></span>
 						<span ng-if="violations.authOperator && !violations.restoreOperator" ng-bind="violations.authOperator.name"></span>

+ 1 - 1
src/main/webapp/resources/view/admin/store/store_info_detail.html

@@ -104,7 +104,7 @@
 		<div class="col-sm-8">
 			<div class="btn-group" role="group">
 				<a role="presentation" class="btn btn-default" ng-class="{ 'btn-primary': tabSelected === 'ENTERPRISE' }" ng-click="switchTab('ENTERPRISE')">企业信息</a>
-				<a role="presentation" class="btn btn-default" ng-class="{ 'btn-primary': tabSelected === 'VIOLATIONS' }" ng-click="switchTab('VIOLATIONS')">违规</a>
+				<a role="presentation" class="btn btn-default" ng-class="{ 'btn-primary': tabSelected === 'VIOLATIONS' }" ng-click="switchTab('VIOLATIONS')" ng-if="storeType !== 'CONSIGNMENT'">违规</a>
 			</div>
 		</div>
 	</div>

+ 3 - 3
src/main/webapp/resources/view/admin/store_info_list.html

@@ -244,13 +244,13 @@
 				<td><span ng-bind="store.createTime | date : 'yyyy-MM-dd HH:mm:ss'"></span></td>
 				<td><span ng-bind="store.updateTime | date : 'yyyy-MM-dd HH:mm:ss'"></span></td>
 				<td class="hot-icon">
-					<div>
+					<div ng-if="newStoreMap[store.uuid]">
 						<i class="hot"></i><span>热销</span>
 					</div>
-					<div>
+					<div ng-if="hotSalesMap[store.uuid]">
 						<i class="new"></i><span>新入驻</span>
 					</div>
-					<div>
+					<div ng-if="excellentSupplierMap[store.uuid]">
 						<i class="new-apply"></i><span>优秀供应商</span>
 					</div>
 				</td>

+ 12 - 2
src/main/webapp/resources/view/common/site-nav.html

@@ -111,6 +111,7 @@
     #site-nav * {
         box-sizing: border-box;
         list-style: none;
+        white-space: nowrap;
     }
     .unstyled a:hover,.dropdown-menu a:hover{
         color: #d32526;
@@ -119,6 +120,13 @@
     .logout:hover{
         color: #f00;
     }
+    .member-text{
+        width: 80%;
+        white-space: nowrap;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        display: inline-block;
+    }
 </style>
 <nav id="site-nav">
     <ul class="ghost-center" ng-controller="AuthenticationCtrl">
@@ -136,13 +144,15 @@
                 <span ng-bind="userInfo.userName"></span>
                 <span href="javascript:void(0)" ng-click="logout()" class="logout">[退出]</span>
             </a>
-            <div class="dropdown-menu" style="top: 36px; left: 0; width: 220px;">
+            <div class="dropdown-menu" style="top: 36px; left: 0; min-width: 220px;">
                <!-- <p>欢迎您,<span ng-bind="userInfo.userName"></span>
                     <a href="javascript:void(0)" class="pull-right" ng-click="logout()">退出</a>
                 </p>-->
                 <p>
                     <!--<i class="fa fa-map-marker"></i> <span ng-if="userInfo.enterprises" ng-bind="userInfo.enterprise.enName"></span><span ng-if="!userInfo.enterprises" ng-bind="userInfo.userName"></span><span ng-if="!userInfo.enterprises">(个人账户)</span>-->
-                    <i class="fa fa-map-marker"></i> <span ng-if="userInfo.enterprise" ng-bind="userInfo.enterprise.enName"></span><span ng-if="!userInfo.enterprise" ng-bind="userInfo.userName"></span><span ng-if="!userInfo.enterprise">(个人账户)</span>
+                    <i class="fa fa-map-marker"></i>
+                    <span ng-if="userInfo.enterprise" ng-bind="userInfo.enterprise.enName" class="member-text"></span>
+                    <span ng-if="!userInfo.enterprise" ng-bind="userInfo.userName + '(个人账户)'" class="member-text"></span>
                     <a href="javascript:void(0)" class="pull-right" ng-if="userInfo.enterprises" ng-click="toggleSwitch()" ng-bind="switching?'取消':'切换'">切换</a>
                 </p>
                 <ul class="unstyled" ng-show="switching" style="-webkit-padding-start: 0;">

+ 2 - 2
src/main/webapp/resources/view/prod/modal/edit-invoice-modal.html

@@ -201,7 +201,7 @@
                             <label for="check-mpy"></label>
                              <span>我已阅读并同意</span>
                      </label>
-                     <a href="help#/nav/19" class="base-line" target="_blank" style=" position: relative;top: -3px;">《发票须知》</a>
+                     <a href="help/helpList/19" class="base-line" target="_blank" style=" position: relative;top: -3px;">《发票须知》</a>
                     </div>
               </div>
               <div class="col-md-offset-3">
@@ -341,7 +341,7 @@
                           <label for="check-mzy"></label>
                           <span>我已阅读并同意</span>
                       </label>
-                      <a href="help#/nav/19">《发票须知》</a>
+                      <a href="help/helpList/19">《发票须知》</a>
                   </div>
               </div>
               <div class="col-md-offset-3">

+ 23 - 0
src/main/webapp/resources/view/store/default/store-close.html

@@ -0,0 +1,23 @@
+<style>
+	.store_error_show {
+		display: table;
+		min-height: 340px;
+		width: 100%;
+	}
+	.store_error_tip {
+		display: table-cell;
+		vertical-align: middle;
+		text-align: center;
+	}
+	.store_error_tip > span {
+		font-size: 16px;
+	}
+</style>
+<div class="container">
+	<div class="store_error_show">
+		<div class="store_error_tip">
+			<img src="static/img/store/common/default.png" alt="店铺图片"/>
+			<span>该店铺处于关闭状态,请<a href="index">返回首页</a></span>
+		</div>
+	</div>
+</div>

+ 23 - 0
src/main/webapp/resources/view/store/default/store-none.html

@@ -0,0 +1,23 @@
+<style>
+	.store_error_show {
+		display: table;
+		min-height: 340px;
+		width: 100%;
+	}
+	.store_error_tip {
+		display: table-cell;
+		vertical-align: middle;
+		text-align: center;
+	}
+	.store_error_tip > span {
+		font-size: 16px;
+	}
+</style>
+<div class="container">
+	<div class="store_error_show">
+		<div class="store_error_tip">
+			<img src="static/img/store/common/default.png" alt="店铺图片"/>
+			<span>该店铺还未开通,请<a href="index">返回首页</a></span>
+		</div>
+	</div>
+</div>

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

@@ -161,7 +161,7 @@
 	<!--收货地址-->
 	<div class="logistic-content" ng-if="tab=='logistics'">
 		<div class="menu-title row">现有收货地址<span>&nbsp;已保存<em>{{total}}</em>条,还能新增<em>{{canAddTotal-total}}</em>条地址</span></div>
-		<div class="add-log row" ng-if="total < canAddTotal"><button ng-click="addAddress()"><i class="fa fa-plus-square"></i>新增收货地址</button></div>
+		<div class="add-log row" ng-if="total < canAddTotal"><button ng-click="modifyAddress()"><i class="fa fa-plus-square"></i>新增收货地址</button></div>
 		<div class="log-tab">
 			<table class="table">
 				<thead>

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

@@ -411,7 +411,8 @@
                         <img src="{{item.img || 'static/img/store/common/default.png'}}"/></a>
                 </div>
                 <div class="content">
-                    <p class="red">¥<span ng-bind="item.minPriceRMB"></span></p>
+                    <p class="red" ng-if="item.minPriceRMB">¥<span ng-bind="item.minPriceRMB"></span></p>
+                    <p class="red" ng-if="item.minPriceUSD">$&nbsp;<span ng-bind="item.minPriceUSD"></span></p>
                     <p ng-bind="item.kindNameCn"></p>
                     <p ng-bind="item.code"></p>
                     <p ng-bind="item.brandNameEn"></p>

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

@@ -583,7 +583,7 @@
 								<div class="btn-wrap">
 									<span class="number">
 										<a class="reduce" ng-disabled="cart.minusDisabled" ng-click="reduce(cart)">-</a>
-										<input type="text" ng-model="cart.number" ng-blur="blurNum(cart)">
+										<input type="text" ng-disabled="cart.status == 1" ng-model="cart.number" ng-blur="blurNum(cart)">
 										<a class="add" ng-disabled="cart.addDisabled" ng-click="add(cart)">+</a>
 									</span>
 									<i ng-if="cart.status == 2" style="color: #f00; margin-left: 32px;">库存紧张</i>

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

@@ -188,7 +188,7 @@
                                 <label for="check-py"></label>
                                 <span>我已阅读并同意</span>
                             </label>
-                            <a href="help/nav/19" class="base-line" target="_blank">《发票须知》</a>
+                            <a href="help/helpList/19" class="base-line" target="_blank">《发票须知》</a>
                         </div>
                     </div>
                     <div class="col-md-offset-3">
@@ -322,7 +322,7 @@
                                 <label for="check-zy"></label>
                                 <span>我已阅读并同意</span>
                             </label>
-                            <a href="help/nav/19">《发票须知》</a>
+                            <a href="help/helpList/19" target="_blank">《发票须知》</a>
                         </div>
                     </div>
                     <div class="col-md-offset-3">

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

@@ -702,7 +702,7 @@
                                  <div style="display: none;" class="send-button"><a class="send">发送</a></div>
                             </div>
                         </span>
-						<span class="trash" ng-if="order.status == '603'" ng-click="showDeleteOrder(order)"><i class="fa fa-trash"></i></span>
+						<span class="trash" ng-if="cancelOrderArray[order.status]" ng-click="showDeleteOrder(order)"><i class="fa fa-trash"></i></span>
 						<div class="com-del-box" ng-if="order.showDelete">
 							<div class="title">
 								<a ng-click="order.showDelete=false"><i class="fa fa-close fa-lg"></i></a>

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

@@ -364,13 +364,13 @@
 								<img ng-src="{{detail.img ? detail.img : 'static/img/store/common/default.png'}}"/>
 							</a>
                             <p class="style01" style="margin-top: 10px;">类目:
-								<a ng-bind="detail.kiName" href="store/{{detail.storeid}}/{{::detail.batchCode}}" title="{{detail.kiName}}" target="_blank"></a>
+								<a ng-bind="detail.kiName" href="product/kind/{{::detail.kindUuid}}" title="{{detail.kiName}}" target="_blank"></a>
 							</p>
 							<p class="style01">型号:
-								<a ng-bind="detail.cmpCode" href="store/{{detail.storeid}}/{{::detail.batchCode}}" title="{{detail.cmpCode}}" target="_blank"></a>
+								<a ng-bind="detail.cmpCode" href="store/{{::detail.storeid}}/{{::detail.batchCode}}" title="{{detail.cmpCode}}" target="_blank"></a>
 							</p>
 							<p class="style01">品牌:
-								<a ng-bind="detail.brName" href="store/{{detail.storeid}}/{{::detail.batchCode}}" title="{{detail.brName}}" target="_blank"></a>
+								<a ng-bind="detail.brName" href="product/brand/{{::detail.branduuid}}/" title="{{detail.brName}}" target="_blank"></a>
 							</p>
                         </span>
 							<span class="wd01">交期:

+ 25 - 132
src/main/webapp/resources/view/usercenter/forstore/order_pay.html

@@ -22,7 +22,7 @@
 		width: 160px;
 	}
 	#pay-cart .oder_xq_list dl span.wd01{
-		width: 14%;
+		width: 15%;
 	}
 	#pay-cart .oder_xq_list dl span.wd02{
 		width: 22%;
@@ -30,12 +30,7 @@
 	.sure_oder .oder_xq_list dl span{
 		width: 13%;
 	}
-	.sure_oder .btn-wrap{
-		margin-left: 7px;
-	}
-	.sure_oder .oder_xq_list dl span textarea{
-		border: #fff 1px solid;
-	}
+
 	.payment .bill-radio {
 		font-size: 14px;
 		padding-top: 25px;
@@ -306,7 +301,7 @@
 	.oder_xq_list dl .price-step .dropdown-menu{
 		min-width: 330px;
 		top: 0;
-		left: -310px;
+		left: -280px;
 		padding-top: 0;
 		padding-bottom: 0;
 		border-bottom: none;
@@ -367,56 +362,6 @@
 	.oder_xq_list dl .price-step p a,.oder_xq_list dl .price-step p a:hover{
 		color: #5078cb;
 	}
-
-	/*自提点样式*/
-	.self-list{
-		width: 100%;
-		margin: 0 auto;
-		padding: 0 0 8px 0;
-		border-bottom: #5078CB 1px solid;
-		background: #f1f6ff;
-		position: relative;
-		top: -1px;
-	}
-	.check-act input{
-		display: none;
-	}
-	.check-act label{
-		width: 12px;
-		height: 12px;
-		margin-right: 5px;
-		display: inline-block;
-		background: url(static/img/icon/check-rule.png) no-repeat;
-		position: relative;
-		top: 7px;
-	}
-	.check-act label{
-		background-position: 0 0;
-	}
-	.check-act input:checked + label{
-		background-position: -15px 0;
-	}
-	.oder_xq_list dl .self-advice{
-		width: 100%;
-		margin: 0 auto;
-		display: inline-block;
-	}
-	.oder_xq_list dl .self-advice li{
-		text-align: left;
-		float: left;
-		padding-left: 40px;
-		font-size: 14px;
-		line-height: 20px;
-	}
-	.oder_xq_list dl .self-advice li strong{
-		font-weight: normal;
-		font-size: 14px;
-		margin-left: 40px;
-	}
-	.oder_xq_list dl .self-advice li strong i{
-		font-size: 14px;
-		margin-left: 0;
-	}
 </style>
 <!--右侧主体部分-->
 <div class="user_right fr" id="pay-cart">
@@ -442,7 +387,7 @@
 			</ul>
 			<div class="f14 notice margin-top-20 margin-bottom-10 text-center" ng-if="sendAddress.length == 0">您还没有添加收货地址信息,请先新增收货地址信息</div>
 			<div class="pay_add">
-				<a class="add_adr fl" ng-click="addShippingAddress()" ng-if="order.status == 501"><i class="fa fa-plus-square" aria-hidden="true"></i>&nbsp;新增地址</a>
+				<a class="add_adr fl" ng-click="addShippingAddress()" ng-if="order.status == 501 && sendAddress.length < 20"><i class="fa fa-plus-square" aria-hidden="true"></i>&nbsp;新增地址</a>
 				<a class="add_adr fr" ng-click="toggleAddress()" ng-if="sendAddress.length/3 > 1"><b ng-if="expand">隐藏地址</b><b ng-if="!expand">显示地址</b></a>
 			</div>
 		</div>
@@ -496,8 +441,7 @@
 						<span class="wd01">交期(天)</span>
 						<span class="wd01">单价</span>
 						<span class="wd01">数量</span>
-						<span style="width: 10%">小计</span>
-						<span>物料编码</span>
+						<span style="width: 18%">小计</span>
 						<span>备注</span>
 					</dt>
 					<div ng-repeat="(key, details) in $$orderDetailsMap">
@@ -512,35 +456,29 @@
 						</dd>
 						<dd class="oder_l" ng-repeat="detail in details">
                         <span class="wd02">
-                            <a  href="store/{{detail.storeid}}/{{::detail.batchCode}}" target="_blank"><img ng-src="{{detail.img || 'static/img/store/common/default.png'}}"/></a>
+                            <a  href="store/{{detail.storeid}}/{{::detail.batchCode}}" target="_blank" href="javascript:void(0)"> <img ng-src="{{detail.img || 'static/img/store/common/default.png'}}"/></a>
 							<div class="style-type">
-								<p>
-									<a href="product/kind/{{detail.goodsHistory.kindUuid}}" target="_blank" style="color: #323232">类目:<b ng-bind="detail.kiName" title="{{detail.kiName}}"></b></a>
-								</p>
-								<p>
-									<a href="store/{{detail.storeid}}/{{::detail.batchCode}}" target="_blank" style="color: #323232">型号:<b ng-bind="detail.cmpCode" title="{{detail.cmpCode}}"></b></a>
-								</p>
-								<p>
-									<a href="product/brand/{{detail.branduuid}}/" target="_blank" style="color: #323232">品牌:<b ng-bind="detail.brName" style="color: #323232" title="{{detail.brName}}"></b></a>
-								</p>
+								<p title="{{detail.kiName}}"><a href="product/kind/{{detail.goodsHistory.kindUuid}}" target="_blank" style="color: #323232">类目:<b ng-bind="detail.kiName"></b></a></p>
+								<p><a href="store/{{detail.storeid}}/{{::detail.batchCode}}" target="_blank" style="color: #323232">型号:<b ng-bind="detail.cmpCode" title="{{detail.cmpCode}}"></b></a></p>
+								<p><a href="product/brand/{{detail.branduuid}}/" target="_blank" style="color: #323232">品牌:<b ng-bind="detail.brName" style="color: #323232" title="{{detail.brName}}"></b></a></p>
 							</div>
                         </span>
-							<span class="wd01" ng-if="order.status == 501">
+						<span class="wd01" ng-if="order.status == 501">
 							交期 :
 							<i ng-if="detail.goodsHistory.b2cMinDelivery == detail.goodsHistory.b2cMaxDelivery" ng-bind="detail.goodsHistory.b2cMinDelivery"></i>
 							<i ng-if="detail.goodsHistory.b2cMinDelivery != detail.goodsHistory.b2cMaxDelivery" ng-bind="detail.goodsHistory.b2cMinDelivery + '-' + detail.goodsHistory.b2cMaxDelivery"></i>
-								<!--{{detail.goodsHistory.b2cMinDelivery}}-{{detail.goodsHistory.b2cMaxDelivery}}-->
+							<!--{{detail.goodsHistory.b2cMinDelivery}}-{{detail.goodsHistory.b2cMaxDelivery}}-->
 						</span>
-							<span class="wd01" ng-if="order.status != 501">
+						<span class="wd01" ng-if="order.status != 501">
 							交期 :
 						<i ng-if="detail.b2cMinDelivery == detail.b2cMaxDelivery" ng-bind="detail.b2cMinDelivery"></i>
 						<i ng-if="detail.b2cMinDelivery != detail.b2cMaxDelivery" ng-bind="detail.b2cMinDelivery + '-' + detail.b2cMaxDelivery"></i>
 						</span>
-							<span class="wd01" ng-bind="detail.rmbUnitPrice | formateNumber : 6 | currencySysmbol : 'RMB'" ng-if="detail.goodsHistory.currencyName.indexOf('RMB') > -1 && order.status == 501"></span>
-							<span class="wd01" ng-bind="detail.usdUnitPrice | formateNumber : 6 | currencySysmbol : 'USD'" ng-if="detail.goodsHistory.currencyName.indexOf('USD') > -1 && order.status == 501"></span>
-							<span class="wd01" ng-bind="detail.taxUnitprice | formateNumber : 6 | currencySysmbol : 'RMB'" ng-if="detail.currencyName.indexOf('RMB') > -1 && order.status != 501"></span>
-							<span class="wd01" ng-bind="detail.taxUnitprice | formateNumber : 6 | currencySysmbol : 'USD'" ng-if="detail.currencyName.indexOf('USD') > -1 && order.status != 501"></span>
-							<span class="wd01">
+						<span class="wd01" ng-bind="detail.rmbUnitPrice | formateNumber : 6 | currencySysmbol : 'RMB'" ng-if="detail.goodsHistory.currencyName.indexOf('RMB') > -1 && order.status == 501"></span>
+						<span class="wd01" ng-bind="detail.usdUnitPrice | formateNumber : 6 | currencySysmbol : 'USD'" ng-if="detail.goodsHistory.currencyName.indexOf('USD') > -1 && order.status == 501"></span>
+						<span class="wd01" ng-bind="detail.taxUnitprice | formateNumber : 6 | currencySysmbol : 'RMB'" ng-if="detail.currencyName.indexOf('RMB') > -1 && order.status != 501"></span>
+						<span class="wd01" ng-bind="detail.taxUnitprice | formateNumber : 6 | currencySysmbol : 'USD'" ng-if="detail.currencyName.indexOf('USD') > -1 && order.status != 501"></span>
+						<span class="wd01">
                             <div class="btn-wrap">
                             <span class="number add-minus" ng-if="order.status == 501">
                                 <a href="javascript:void(0)" class="reduce" ng-click="reduce(detail)" ng-disabled="detail.minusDisabled">-</a>
@@ -550,7 +488,7 @@
 							<span ng-if="order.status != 501" ng-bind="detail.number" class="number" style="border: none;"></span>
                             </div>
                         </span>
-							<span class="price-step"  style="width: 10%">
+							<span class="price-step"  style="width: 18%">
 								<em ng-bind="detail.ensurePrice | formateNumber : 6 | currencySysmbol : detail.currencyName" class="red"></em>
 								<p>
 									<a name="{{detail.id}}" ng-click="togglePrice(detail)" ng-if="detail.goodsHistory.prices.length > 1" ng-blur="togglePriceBlur(detail)" style="font-size: 12px">价格梯度</a>
@@ -569,22 +507,18 @@
 								</p>
 							</span>
 							<span>
-                            	<textarea ng-if="order.status==501" placeholder="可填写物料编码" ng-model="detail.remark"></textarea>
-                        		<em ng-if="order.status!=501" ng-bind="detail.remark" style="color: #333; line-height: 20px; display: inline-block; padding-top: 10px;"></em>
-							</span>
-							<span>
-                            	<textarea ng-if="order.status==501" placeholder="可填写产品备注" ng-model="detail.remark"></textarea>
+                            	<textarea ng-if="order.status==501" placeholder="可填写产品备注!例如物料编号" ng-model="detail.remark" maxlength="200"></textarea>
                         		<em ng-if="order.status!=501" ng-bind="detail.remark" style="color: #333; line-height: 20px; display: inline-block; padding-top: 10px;"></em>
 							</span>
 						</dd>
 						<dd class="oder-remark">
-							<span style="width: 100%;">
-								<em style="margin-left: 40px;">订单备注:</em>
-								<input type="text"  class="form-control" placeholder="请填写订单备注" ng-model="remarkList[details[0].storeid]"/>
+							<span style="width: 100%">
+								<em>订单备注:</em>
+								<input type="text"  class="form-control" placeholder="请填写订单备注" ng-model="remarkList[details[0].storeid]" maxlength="200"/>
 							</span>
 						</dd>
 						<dd class="line60">
-							<span class="style01" style="width: 60%; padding-left: 40px;">配送方式:
+							<span class="style01" style="width: 60%;">配送方式:
 								<select ng-if="order.status == 501" class="select" ng-switch="order.deliverytype" style="opacity: 1;" >
 									<option ng-switch-when="1301">第三方配送</option>
 									<!--<option ng-switch-when="1301">卖家配送</option>-->
@@ -594,55 +528,14 @@
 								<em ng-if="order.status != 501">物流配送</em>
 								<!--<i>满1000元包邮,未满足的订单收取运费20元</i>-->
 							</span>
-							<span class="total-price">
+								<span class="total-price">
 								<p><strong>运费:</strong><em ng-bind="0 | formateNumber : 2 | currencySysmbol : order.currency.substring(0,3)" style="font-weight: bold"></em></p>
 								<p><strong>店铺合计:</strong>
 									<em ng-if="order.status==501" ng-bind="storePrice[key] | formateNumber :2 | currencySysmbol : order.currency.substring(0,3)" style="font-weight: bold"></em>
 									<em ng-if="order.status!=501" ng-bind="order.ensurePrice | formateNumber :2 | currencySysmbol : order.currency.substring(0,3)" style="font-weight: bold"></em>
 								</p>
 							</span>
-						</dd>
-						<div class="self-list">
-							<!--自提点列表-->
-								<ul class="self-advice">
-									<li>
-										<label class="check-act">
-											<input type="radio" id="1" name="1"/>
-											<label for="1"></label>
-										</label>
-										<strong style="margin-left: 0">自提点A</strong>
-										<strong>地址:<i>广东省  深圳市  南山区  科技园英唐大厦6楼 优软商城科技园英唐大厦6楼 优软商城</i></strong>
-										<strong>营业时间:<i>周一至周五 8:30-18:00</i></strong>
-									</li>
-									<li>
-										<label class="check-act">
-											<input type="radio" id="2" name="2"/>
-											<label for="2"></label>
-										</label>
-										<strong style="margin-left: 0">自提点A</strong>
-										<strong>地址:<i>广东省  深圳市  南山区  科技园英唐大厦6楼 优软商城科技园英唐大厦6楼 优软商城</i></strong>
-										<strong>营业时间:<i>周一至周五 8:30-18:00</i></strong>
-									</li>
-									<li>
-										<label class="check-act">
-											<input type="radio" id="3" name="3"/>
-											<label for="3"></label>
-										</label>
-										<strong style="margin-left: 0">自提点A</strong>
-										<strong>地址:<i>广东省  深圳市  南山区  科技园英唐大厦6楼 优软商城科技园英唐大厦6楼 优软商城</i></strong>
-										<strong>营业时间:<i>周一至周五 8:30-18:00</i></strong>
-									</li>
-									<li>
-										<label class="check-act">
-											<input type="radio" id="4" name="4"/>
-											<label for="4"></label>
-										</label>
-										<strong style="margin-left: 0">自提点A</strong>
-										<strong>地址:<i>广东省  深圳市  南山区  科技园英唐大厦6楼 优软商城科技园英唐大厦6楼 优软商城</i></strong>
-										<strong>营业时间:<i>周一至周五 8:30-18:00</i></strong>
-									</li>
-								</ul>
-						</div>
+							</dd>
 					</div>
 					<dd class="pay_price">
 						<div>

+ 2 - 1
src/main/webapp/resources/view/usercenter/modal/collectModel.html

@@ -20,7 +20,8 @@
 </style>
 <div>
 	<div class="modal-header">
-		<h3 class="header-text">收藏成功!</h3>
+		<h3 class="header-text" ng-if="haveAdd">收藏成功!</h3>
+		<h3 class="header-text" ng-if="!haveAdd">请勿重复收藏!</h3>
 	</div>
 	<div class="modal-body">
 		<button type="button" ng-click="cancel()" class="btn" style="margin-left:25px;">关&nbsp;&nbsp;闭</button>

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

@@ -434,7 +434,7 @@
                     <div class="col-md-11">
                         1. 此账户为卖家收款账户,请仔细核对信息内容,若由信息错误造成的损失,优软商城不承担赔偿责任。<br/>
                         2. 如您的企业名称、开户银行及账号变更,您须在优软商城开展资金结算前进行更正,否则发生转账错误优软商城不承担赔偿责任。<br/>
-                        3. 更多的条款请阅读<a href="help/issue/51" target="_blank">《优软商城代收代付协议》</a> 。
+                        3. 更多的条款请阅读<a href="help/helpDetail/51" target="_blank">《优软商城代收代付协议》</a> 。
                     </div>
                 </div>
             </div>
@@ -619,7 +619,7 @@
                 <div class="col-md-8">
                     1. 此账户为卖家收款账户,请仔细核对信息内容,若由信息错误造成的损失,优软商城不承担赔偿责任。<br/>
                     2. 如您的企业名称、开户银行及账号变更,您须在优软商城开展资金结算前进行更正,否则发生转账错误优软商城不承担赔偿责任。<br/>
-                    3. 更多的条款请阅读<a href="help/issue/51" style="color: #5078cb;" target="_blank">《优软商城代收代付协议》</a> 。
+                    3. 更多的条款请阅读<a href="help/helpDetail/51" style="color: #5078cb;" target="_blank">《优软商城代收代付协议》</a> 。
                 </div>
             </div>
         </div>

+ 8 - 15
src/main/webapp/resources/view/vendor/forstore/product_file.html

@@ -103,9 +103,6 @@
         border-radius: 2px;
         font-size: 12px;
     }
-    .import-input span input:hover {
-        cursor:pointer;
-    }
     .product-file .content .batch .row a.load-btn{
         color: #5078cb;
         font-size: 12px;
@@ -125,10 +122,6 @@
     .import-area .check-act{
         font-weight: normal;
     }
-
-    .import-area .check-act:hover {
-        cursor: pointer;
-    }
     .import-area .check-act:last-child{
         margin-left: 45px;
     }
@@ -156,7 +149,7 @@
         padding-bottom: 10px;
     }
     .import-input span{
-        width: 460px;
+        width: 350px;
         margin: 0 auto;
         float: left;
         position: relative;
@@ -340,7 +333,7 @@
             <div class="batch" ng-if="style == 'batch'">
                 <div class="row">
                     <span class="dot"><em>1</em></span>
-                    下载Excel导入模板,在模板上编辑产品信息
+                    下载Excle导入模板,在模板上编辑产品信息
                     <a class="btn01" style="margin-left: 35px;" ng-click="download()" title="下载模板">下载模板</a>
                     <a class="load-btn" ng-click="showImg()" title="查看表格示例">查看表格示例</a>
                 </div>
@@ -353,12 +346,12 @@
                         <label class="check-act">
                             <input type="radio" id="1" name="radio2" checked/>
                             <label for="1"></label>
-                            不导入
+                            统一规定运费
                         </label>
                         <label class="check-act">
                             <input type="radio" id="2" name="radio2"/>
                             <label for="2"></label>
-                            更新产品信息
+                            按总金额计算
                         </label>
                     </p>
                     <div class="import-input">
@@ -366,8 +359,8 @@
                             <input type="text" name="txt" id="upload_text" />
                             <a class="btn01" ng-click="">选择文件</a>
                             <input type="file" onchange="upload_text.value=this.value" class="upload01" />
-                            <a class="btn01 blue-bg" ng-click="">导入</a>
                         </span>
+                        <a class="btn01 blue-bg" ng-click="">导入</a>
                     </div>
                 </div>
             </div>
@@ -376,15 +369,15 @@
                 <div class="row">
                     <div class="row-line">
                         <span class="title">产品名称(类目)</span>
-                        <input type="text" class="form-control" />
+                        <input type="text" class="form-control" ng-change="inputCategory()"/>
                     </div>
                     <div class="row-line">
                         <span class="title"><em>*</em>型号</span>
-                        <input type="text" class="form-control" />
+                        <input type="text" class="form-control" ng-change="inputBatch()"/>
                     </div>
                     <div class="row-line">
                         <span class="title"><em>*</em>品牌</span>
-                        <input type="text" class="form-control" />
+                        <input type="text" class="form-control" ng-change="inputBrand()"/>
                     </div>
                     <div class="row-line">
                         <span class="title">封装</span>

+ 13 - 30
src/main/webapp/resources/view/vendor/forstore/purchase_detail.html

@@ -17,7 +17,7 @@
 		width: 14%;
 	}
 	#oder-detail .oder_xq_list dl span.wd01{
-		width: 13%;
+		width: 16%;
 	}
 	#oder-detail .oder_xq_list dl span.wd02{
 		width: 25%;
@@ -135,7 +135,7 @@
 		background: #f1f6ff;
 	}
 	.oder_xq_list dl .line60{
-		height: 60px;
+		height: 50px;
 		border-bottom: #5078cb 1px solid;
 	}
 	.oder-remark .form-control {
@@ -149,7 +149,7 @@
 	.oder-remark span em {
 		float: left;
 		color: #333 !important;
-		margin-left: 40px;
+		margin-left: 20px;
 	}
 	.oder_xq_list dl span.total-price{
 		float: right;
@@ -186,6 +186,12 @@
 		top: -23px;
 		background: #f1f6ff;
 	}
+	.oder_xq_list dl span.user-address i:nth-of-type(1){
+		margin-left: 20px;
+	}
+	.oder_xq_list dl span.user-address i:nth-of-type(2){
+		margin-left: 70px;
+	}
 	.open-more{
 		text-align: center;
 		background: #f6f9ff;
@@ -284,29 +290,6 @@
 		width: 60px;
 		height: 60px;
 	}
-	.color999{
-		color: #999 !important;
-	}
-	.log_menu span{
-		margin-left: 11px;
-	}
-	.text-area{
-		width: 120px;
-		height: 60px;
-		background: #fff;
-		margin-top: 15px;
-		overflow-y: auto;
-		text-align: left;
-		padding: 0 3px;
-		margin-left: 5px;
-	}
-	.text-area i{
-		text-align: left;
-		position: relative;
-		top: 4px;
-		font-size: 12px;
-		color: #666;
-	}
 </style>
 <div class="user_right fr">
 	<!--叮当详情-->
@@ -334,7 +317,7 @@
 					<p ng-bind="steps.time4 | date : 'yyyy-MM-dd HH:mm:ss'">2017-03-12 15:12:30</p>
 				</li>
 				<li>
-					<p>评价</p>No
+					<p>评价</p>
 					<em><i ng-class="{ 'active' : steps.step5 }"><b>5</b></i></em>
 					<p ng-bind="steps.time5 | date : 'yyyy-MM-dd HH:mm:ss'"></p>
 				</li>
@@ -406,7 +389,7 @@
 								<a ng-bind="detail.cmpCode" href="store/{{detail.storeid}}/{{::detail.batchCode}}" title="{{detail.cmpCode}}" target="_blank"></a>
 							</p>
 							<p class="style01">品牌:
-								<a ng-bind="detail.brName" href="store/{{detail.storeid}}/{{::detail.branduuid}}" title="{{detail.brName}}" target="_blank"></a>
+								<a ng-bind="detail.brName" href="store/{{detail.storeid}}/{{::detail.batchCode}}" title="{{detail.brName}}" target="_blank"></a>
 							</p>
 						</span>
 							<span class="wd01">交期:
@@ -417,7 +400,7 @@
 							<em  ng-show="!isChange" ng-bind="detail.taxUnitPrice | formateNumber : 6 | currencySysmbol : detail.currencyName" style="color: #333;"></em>
 							<em ng-show="isChange" class="price-style">
 								<em  ng-bind="'' | currencySysmbol : detail.currencyName"></em>
-								<input ng-model="detail.currentTaxUnitPrice" type="number" ng-change="updateTotal()"/>
+								<input ng-model="detail.currentTaxUnitPrice" type="number" ng-change="updateTotal(detail)"/>
 							</em>
 						</span>
 							<span style="width: 10%;" ng-bind="detail.number">100</span>
@@ -453,7 +436,7 @@
 						</span>
 					</dd>
 					<dd class="line60">
-						<span class="wd02" style="width: 60%; text-align: left; margin-left: 40px; line-height: 30px;">配送方式:第三方配送
+						<span class="wd02" style="width: 60%; text-align: left; margin-left: 20px; line-height: 30px;">配送方式:第三方配送
 							<!--<i style="color: #666;">(满1000元包邮,未满足的订单收取运费20元)</i>-->
 						</span>
 						<span class="total-price">

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

@@ -80,7 +80,7 @@
                     <tr ng-repeat="brand in $data">
                         <td class="wd01">{{($index + 1)}}</td>
                         <td>{{brand.nameEn}}</td>
-                        <td>{{brand.application}}</td>
+                        <td title="{{brand.application}}">{{brand.application}}</td>
                         <td>{{brand.userModify.userName}}</td>
                         <td>{{brand.lastModifyDate | date: "yyyy-MM-dd HH:mm"}}</td>
                         <td>{{brand.status | status}}</td>

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

@@ -859,7 +859,7 @@
 								<a ng-click="print(purchase, 'SALESEND_ADMIN')" title="打印出货单"><i class="fa fa-print fa-lg"></i>打印出货单</a>
 							</div>
 						</span>
-						<span class="trash" ng-if="purchase.status=='603' || purchase.status=='606'" ng-click="showDeletePurchase(purchase)"><i class="fa fa-trash"></i></span>
+						<span class="trash" ng-if="cancelOrderArray[purchase.status]" ng-click="showDeletePurchase(purchase)"><i class="fa fa-trash"></i></span>
 						<div class="com-del-box" ng-if="purchase.showDelete">
 							<div class="title">
 								<a ng-click="purchase.showDelete=false"><i class="fa fa-close fa-lg"></i></a>

+ 6 - 3
src/main/webapp/resources/view/vendor/forstore/vendor_standard_putOn.html

@@ -352,6 +352,7 @@
                 </form>
             </div>
             <div class="check fr">
+                <!--<button ng-click="updatePrice()">更新分段价格</button>-->
                 <a  ng-click="batchUpdate()" class="blue">一键更新</a>
             </div>
         </div>
@@ -498,8 +499,8 @@
                             <div>
                                 <span>
                                     <select ng-disabled="!$$putOn.isSelfStore" ng-change="changeSale(standard)" ng-model="standard.editSelfSaleNum" class="select-adder form-control" style="width: 88px;">
-										<option value="1">自营</option>
-										<option value="0">寄售</option>
+										<option value="0">自营</option>
+										<option value="1">寄售</option>
 									</select>
                                 </span>
                             </div>
@@ -529,7 +530,9 @@
                                 <i class="fa fa-chevron-up"></i>
                             </div>
                             <div style="margin-top: 0;">
-                                <span style="margin-left: 7px;" ng-if="standard.editQtyPrices.length != 3"><input ng-model="standard.insertQty" type="text" placeholder="分段数量" class="form-control" style="width: 104px;"/></span>
+                                <span style="margin-left: 7px;" ng-if="standard.editQtyPrices.length != 3">
+                                    <input ng-model="standard.insertQty" type="text" placeholder="分段数量" class="form-control" style="width: 104px;"/>
+                                </span>
                             </div>
                         </td>
                         <td>

+ 9 - 3
src/main/webapp/resources/view/vendor/forstore/vendor_store_close.html

@@ -176,12 +176,18 @@
         padding: 10px;
         font-size: 14px;
         line-height: 25px;
+        border-radius: 0;
+    }
+    .appeal-content .appeal-text .text-input textarea:focus{
+        border: #5078cb 1px solid;
     }
     .appeal-content .appeal-text .count_tip{
         position: absolute;
         bottom: 0;
-        width: 100%;
+        width: 99%;
         margin: 0 auto;
+        margin-bottom: 2px;
+        margin-left: 2px;
         height: 20px;
         line-height: 20px;
         display: inline-block;
@@ -268,7 +274,7 @@
 </style>
 <div class="store-close fr">
     <h3><i class="fa fa-exclamation-circle"></i>抱歉,店铺关闭通知!</h3>
-    <div class="close-title">
+    <div class="close-title" style="margin-bottom: 20px;">
         <p>
             违规类型:<i ng-if="violations.type === 'FICTITIOUS_TRADE'">虚假交易</i>
 			<i ng-if="violations.type === 'FICTITIOUS_ADVERTISE'">虚假宣传</i>
@@ -307,7 +313,7 @@
         <div class="appeal-text">
             <span class="title"><em>*</em>申述说明:</span>
             <div class="text-input">
-                <textarea placeholder="请填写您的申述说明" maxlength="1000" ng-model="complaint.complaintInfo"></textarea>
+                <textarea placeholder="请填写您的申述说明" maxlength="1000" ng-model="complaint.complaintInfo" class="form-control"></textarea>
                 <p class="count_tip"><span><em ng-bind="(complaint.complaintInfo || '').length">0</em>/1000</span></p>
             </div>
         </div>

+ 38 - 8
src/main/webapp/resources/view/vendor/forstore/vendor_store_info.html

@@ -1,4 +1,8 @@
 <style>
+	div.vendor_store_apply_info input.ng-invalid.ng-dirty, textarea.ng-invalid.ng-dirty {
+		border-color: #CC0033 !important;
+	}
+
 	div.vendor_store_apply_info {
 		margin: 0;
 		float: right;
@@ -623,8 +627,8 @@
 					<span>简&nbsp;&nbsp;&nbsp;&nbsp;介<strong class="text-inverse">*</strong></span>
 				</div>
 				<div class="col-md-10 custom_col">
-				<textarea class="form-control" style="border-radius: inherit;resize: none;height: 200px;" title="description"
-						  ng-model="description" ng-change="changeInfo('DESCRIPTION', description)" required placeholder="请输入不超过500字的介绍" maxlength="500"></textarea>
+				<textarea class="form-control" style="border-radius: inherit;resize: none;height: 200px;" title="description" name="description"
+						  ng-model="description" ng-change="changeInfo('DESCRIPTION', description)" required placeholder="请输入不超过500字的介绍" ng-maxlength="500" maxlength="500"></textarea>
 					<span class="count_tip">
 					<div class="count-content">
 						<span ng-bind="description.length || 0" class="ng-binding">0</span>
@@ -633,16 +637,30 @@
 				</span>
 				</div>
 			</div>
+			<!-- 简介不正确提示信息 -->
+			<div class="row com_row" ng-show="storeInfoForm.description.$dirty && storeInfoForm.description.$invalid && !storeInfoForm.description.$error.required">
+				<div class="col-md-2 custom_col"></div>
+				<div class="col-md-10 custom_col">
+					<span style="color: #ff0000;" ng-show="storeInfoForm.description.$error.maxlength">请勿超过500个字</span>
+				</div>
+			</div>
 			<div class="row com_row" style="margin-top: 10px;">
 				<div class="col-md-2 custom_col">
 					<span>官网地址<strong class="text-inverse">*</strong></span>
 				</div>
 				<div class="col-md-10 custom_col">
-					<input type="text" class="form-control" style="border-radius: inherit;padding-left: 60px;" title="enUrl" ng-model="enUrl"
-						   ng-change="changeInfo('EN_URL', enUrl)"  placeholder="www.ubtob.com" required maxlength="50"/>
+					<input type="text" class="form-control" style="border-radius: inherit;padding-left: 60px;" title="enUrl" ng-model="enUrl" name="enUrl"
+						   ng-change="changeInfo('EN_URL', enUrl)" required placeholder="www.ubtob.com" maxlength="50" ng-maxlength="30" ng-trim/>
 					<span style="position: absolute;display: block;top: 0;z-index: 2;padding-left: 12px;">http://</span>
 				</div>
 			</div>
+			<!-- 官网地址不正确提示信息 -->
+			<div class="row com_row" ng-show="storeInfoForm.enUrl.$dirty && storeInfoForm.enUrl.$invalid && !storeInfoForm.enUrl.$error.required">
+				<div class="col-md-2 custom_col"></div>
+				<div class="col-md-10 custom_col">
+					<span style="color: #ff0000;" ng-show="storeInfoForm.enUrl.$error.maxlength">请勿超过30个字</span>
+				</div>
+			</div>
 			<div class="row com_row" style="margin-top: 10px;">
 				<div class="col-md-2 custom_col">
 					<span>店铺地址</span>
@@ -658,8 +676,15 @@
 					<span>地&nbsp;&nbsp;&nbsp;&nbsp;址<strong class="text-inverse">*</strong></span>
 				</div>
 				<div class="col-md-10 custom_col">
-					<input type="text" class="form-control" style="border-radius: inherit;" title="address" ng-model="address"
-						   ng-change="changeInfo('EN_ADDRESS', address)" placeholder="例如,深圳市 南山区" required maxlength="70"/>
+					<input type="text" class="form-control" style="border-radius: inherit;" title="address" ng-model="address" name="address"
+						   ng-change="changeInfo('EN_ADDRESS', address)" placeholder="例如,深圳市 南山区" required maxlength="70" ng-maxlength="30"/>
+				</div>
+			</div>
+			<!-- 地址不正确提示信息 -->
+			<div class="row com_row" ng-show="storeInfoForm.address.$dirty && storeInfoForm.address.$invalid && !storeInfoForm.address.$error.required">
+				<div class="col-md-2 custom_col"></div>
+				<div class="col-md-10 custom_col">
+					<span style="color: #ff0000;" ng-show="storeInfoForm.address.$error.maxlength">请勿超过30个字</span>
 				</div>
 			</div>
 			<div class="row com_row" style="margin-top: 10px;">
@@ -677,6 +702,7 @@
 						   ng-pattern="/(^(\d{3,4}-)\d{7,8})$|^((1[0-9][0-9]\d{8}$))/"
 						   placeholder="例如,0755-26994749"
 						   maxlength="30"
+						   ng-maxlength="20"
 						   required/>
 				</div>
 			</div>
@@ -685,6 +711,7 @@
 				<div class="col-md-2 custom_col"></div>
 				<div class="col-md-10 custom_col">
 					<span style="color: #ff0000;" ng-show="storeInfoForm.enTel.$error.required">电话信息必填</span>
+					<span style="color: #ff0000;" ng-show="storeInfoForm.enTel.$error.maxlength">请勿超过20个数字</span>
 					<span style="color: #ff0000;" ng-show="storeInfoForm.enTel.$error.tel || storeInfoForm.enTel.$error.pattern">电话格式必须为0755-26994749 或者 18806659999</span>
 				</div>
 			</div>
@@ -703,6 +730,7 @@
 						   ng-pattern="/(^(\d{3,4}-)\d{7,8})$/"
 						   placeholder="例如,0755-26996928"
 						   maxlength="30"
+						   ng-maxlength="20"
 						   required/>
 				</div>
 			</div>
@@ -711,6 +739,7 @@
 				<div class="col-md-2 custom_col"></div>
 				<div class="col-md-10 custom_col">
 					<span style="color: #ff0000;" ng-show="storeInfoForm.enFax.$error.required">传真信息必填</span>
+					<span style="color: #ff0000;" ng-show="storeInfoForm.enFax.$error.maxlength">请勿超过20个数字</span>
 					<span style="color: #ff0000;" ng-show="storeInfoForm.enFax.$error.tel || storeInfoForm.enFax.$error.pattern">传真格式必须为0755-26994749</span>
 				</div>
 			</div>
@@ -821,7 +850,8 @@
 		<div class="row" style="width:100%;display: inline-block;">
 			<!-- Submit button -->
 			<div style="padding: 28px 40px;">
-				<button type="button" class="btn btn-primary" style="float: right" ng-click="confirmApplication()">确认</button>
+				<!--<input type="button" class="btn btn-primary" style="float: right" ng-click="confirmApplication()" ng-disabled="true" value="确认"/>-->
+				<button type="button" class="btn btn-primary" style="float: right" ng-click="confirmApplication()" ng-disabled="(storeInfoForm.description.$dirty && storeInfoForm.description.$invalid) || (storeInfoForm.enUrl.$dirty && storeInfoForm.enUrl.$invalid) || (storeInfoForm.address.$dirty && storeInfoForm.address.$invalid) || (storeInfoForm.enTel.$dirty && storeInfoForm.enTel.$invalid) || (storeInfoForm.enFax.$dirty && storeInfoForm.enFax.$invalid)">确认</button>
 				<div class="clear-fix"></div>
 			</div>
 		</div>
@@ -887,7 +917,7 @@
 		<div class="row">
 			<!-- Submit button -->
 			<div style="padding: 28px 40px;">
-				<button type="button" class="btn btn-primary" style="float: right" ng-click="confirmApplication()">确认</button>
+				<button type="button" class="btn btn-primary" style="float: right" ng-click="confirmApplication()" ng-disabled="true">确认</button>
 				<div class="clear-fix"></div>
 			</div>
 		</div>

+ 284 - 0
src/main/webapp/resources/view/vendor/modal/confirm_consignment_agreement.html

@@ -0,0 +1,284 @@
+<style>
+	.modal {
+		position: fixed;
+		top: 50%;
+		left: 50%;
+		margin-left: -425px;
+		margin-top: -300px;
+		width: 850px;
+	}
+	.modal-dialog{
+		width: 850px;
+		height: 580px;
+		background: #f2f2f2;
+		border-radius: 8px;
+		overflow: hidden;
+		margin: 0;
+	}
+	.modal-dialog .modal-content{
+		border: none;
+		box-shadow: none;
+		background: #f2f2f2;
+	}
+	.agreement-list{
+		width: 100%;
+		margin: 0 auto;
+		padding-top: 25px;
+	}
+	.agreement-list .content{
+		width: 800px;
+		height: 430px;
+		overflow-y: auto;
+		margin: 0 20px 0 26px;
+		background: #fff;
+		font-size: 14px;
+		line-height: 30px;
+		padding: 0 15px;
+	}
+	.agreement-list .content h3{
+	line-height: 40px;
+	font-size: 16px;
+	text-align: center;
+	}
+	.agreement-list .content p{
+		font-size: 14px;
+	}
+	.agreement-list .agreement-agreen{
+		width: 100%;
+		height: 45px;
+		line-height: 45px;
+		font-size: 12px;
+		color: #666;
+		margin: 0 auto;
+		text-align: center;
+	}
+	.agreement-list .agreement-agreen a{
+		color: #5078cb;
+	}
+	.agreement-list .bottom{
+		width: 100%;
+		height: 80px;
+		background: #fff;
+		margin: 0 auto;
+	}
+	.agreement-list .bottom p{
+		line-height: 40px;
+		font-size: 12px;
+		padding-left: 20px;
+		color: #666;
+	}
+	.agreement-list .bottom p strong{
+		color: #f00;
+	}
+	.agreement-list .bottom .bottom-bot div{
+		float: right;
+		margin-right: 25px;
+	}
+	.agreement-list .bottom .bottom-bot .check-active span{
+		color: #999;
+		font-size: 12px;
+		margin-right: 16px;
+	}
+	.agreement-list .bottom .bottom-bot button{
+		width: 70px;
+		height: 30px;
+		display: inline-block;
+		text-align: center;
+		line-height: 30px;
+		border: none;
+		font-size: 14px;
+	}
+	.agreement-list .bottom .bottom-bot button.off{
+		background: #cdcccc;
+		color: #666;
+		margin-right: 8px;
+	}
+	.agreement-list .bottom .bottom-bot button.ok{
+		background: #5078cb;
+		color: #fff;
+	}
+	.agreement-list .bottom .bottom-bot button:hover{
+		background: #337ab7;
+		color: #fff;
+	}
+	.agreement-list .bottom .bottom-bot button[disabled]{
+		cursor: not-allowed;
+	}
+	.agreement-list .check-active label{
+		margin-right: 0 !important;
+	}
+	.ql-container.ql-snow{
+		border: none !important;
+	}
+</style>
+<link rel="stylesheet" href="static/lib/quill/quill.snow.css" />
+<div class="agreement-list">
+	<div class="content">
+		<h3 style="font-weight: bold">《优软商城买卖条例》</h3>
+		<p style="font-weight: bold">第一章 店铺自营</p>
+		<p style="font-weight: bold">第一节 买家条例</p>
+		<p style="font-weight: bold">1.  交易</p>
+		<p>1.1. 买家在优软商城看到的产品价格均是卖家自己设定的销售价格,优软商城不加价、不改价、不提供议价服务。<br/>
+		1.2. 自买家提交订单后48小时内不付款的,订单将自动失效,即“待付款”状态的订单需要在48小时内完成付款,
+		否则订单将 自动失效。<br/>
+		1.3. 一张订单只能用同一币种进行结算,以人民币结算的,交货地点为中华人民共和国(港澳台地区除外)境内,以
+		美金结算的,则交货地点为中华人民共和国香港特别行政区。<br/>
+		1.4. 优软商城支持以下付款方式:支付宝、微信、网银支付和线下支付(线下支付要求对公账号付款到对公账号,私
+		人账号付款到对公账号,且在汇款单的附言处注明订单号和用户名)。<br/>
+		1.5. 您在优软商城进行网银支付的最高金额为单笔10万人民币;单笔10万人民币以上的,请转用“线下支付”的方
+		式,或者分单多次支付。<br/>
+		1.6. 为确保买家资金安全,购买金在您确认收货前由优软商城在第三方支付机构设立的托管账户暂管,在您确认收货
+		后,优软商城将与卖家结清。<br/>
+		1.7. 发票抬头与注册用户的信息不一致的,则需要提供相关证明,否则不予与更改。<br/>
+		1.8. 您同意,购买拆包的产品时,优软商城有权不受理:买卖双方就包装问题引起退换货或退款的纠纷。
+		1.9. 您在收到产品后,如清点完毕且无异议,应履行签收义务。<br/>
+		1.10. 买家不得恶意退换货,针对恶意退换货,优软商城会对相关买家进行扣分处罚,情节严重者,优软商城有权将
+		相关买家列入商城黑名单,相关管理员关联的其他公司在优软商城的服务也会即时终止。<br/>
+		1.11. 买家承诺不以任何理由向卖家要求除退换货或退款外的额外索赔。</p>
+		<p style="font-weight: bold">2.  售后</p>
+		<p>
+			2.1. 买家在收到产品后,应尽快完成产品的检验,如对产品存有异议(包括但不限于产品质量问题、包装破损、包装
+			不符、产品标示不符、生产日期不符、数量不符、型号不符等),须保留证据,并在15个自然日内申请售后,否
+			则,在您收到产品的第15个自然日后“申请售后”的功能按钮将自动关闭。<br/>
+			2.2. 买家申请退款,经协商同意后,优软商城将在收到买家退货产品后5个自然日内退款给买家。(注:付款产生的
+			第三方支付手续费,将不予退还。)<br/>
+			2.3. 退换货产品时,请务必保留完整的原包装(包括外包装、内填充物)及确保产品标签完好,产品标签是协调退换货的唯一凭据,因凭证遗失可能导致的损失,由买家自己承担。<br/>
+
+			2.4. 买家在优软商城进行交易时,应当遵循商城的规章制度,比如申请售后、取消订单,拒绝恶性退换货,否则将列入商城黑名单,商城有权利撤销或者关闭黑名单用户在商城的全部服务。<br/>
+			2.5. 如买家对产品提出异议,且与卖家无法就问题达成共识,优软商城有权委托第三方机构进行鉴定,若鉴定结
+			果确认系 动的权买家储存或使用不当所造成的,则相关损失及责任由买家自行承担。
+		</p>
+		<p style="font-weight: bold">3.  在线支付的手续费:</p>
+		<p>该费用按支付渠道标准收取,不同的支付方式,买家付款收取的手续费比例为:<br/>
+			3.1. 网银:0.23%。<br/>
+			3.2. 微信:0.5%。<br/>
+			3.3. 支付宝:0.55%。</p>
+		<br/>
+		<p style="font-weight: bold">第二节 卖家条例</p>
+		<p style="font-weight: bold">1.  上架</p>
+		<p>1.1. 卖家应保证其出售的产品在合理期限内可以正常使用,提供的服务符合承诺标准,包括但不限于:①产品不存在
+			危及人身财产安全的不合理危险;②具备产品应当具备的使用性能;③符合产品或其包装上注明采用的标准;④
+			符合提供服务时承诺的标准;⑤且承诺标准不低于国家/行业标准等。<br/>
+			1.2.“产品如实描述”及对其所售产品/服务质量承担保证责任是卖家的基本义务,“产品如实描述”是指卖家在产
+			品描述页面、店铺页面等所有优软商城提供的渠道中,应当对产品的基本属性、良率、应用环境、加工环境、
+			瑕疵等必须说明的信息进行真实、完整的描述。<br/>
+			1.3. 卖家建档上架全新的型号或品牌,需先在系统向优软商城提交申请,优软商城将在72小时内批复。<br/>
+			1.4. 优软商城提供人民币和美金两种货币结算方式,其中人民币售价默认为含税单价;卖家可根据自身情况选择提供
+			一种货币卖价或两种货币卖价。<br/>
+			1.5. 上架产品超过15个自然日而不更新维护产品信息的,则自动下架,即用户无法在网站搜索到已下架的产品信息。<br/>
+			1.6. 卖家收款并不意味着品质保证责任的结束,售后责任的起始日为卖家开具发票日至计算卖家承诺的售后服务期限
+			的日期为止。<br/>
+			1.7. 卖家在商城卖家中心页面进行申请,并提供产品相关影像资料,优软商城进行线上及线下审核后,相关产品信息
+			将发布在优软商城卖家页面。<br/>
+			1.8. 优软商场有权对虚假信息的产品进行强制下架,并对相关卖家进行扣分处罚。<br/>
+			1.9. 优软商城有权对产品进行实地认证,取得产品包含但不限于认证信息、包装、实物、储存环境的音像资料并展示
+			于优软商城相关页面。</p>
+		<p style="font-weight: bold">2.  交易</p>
+		<p>2.1. 所有产品的销售价格由卖家自己设定,优软商城不加价、不改价、不提供议价服务。<br/>
+			2.2. 卖家须在买家付款后的48小时内进行发货,如有不可抗力因素导致延迟发货或不能发货的,卖家须主动与买家协
+			商解决(协商未果的,买家有权单方面取消订单);否则,因此产生的任何直接或间接损失及不利后果将由卖家
+			承担,优软商城对此不承担任何责任。<br/>
+			2.3. 卖家提供的电子元器件均须为原装正品,产品包装、标识、质量等均须符合原厂家出厂标准,且必须为全新原装
+			未使用过为前提。<br/>
+			2.4. 卖家超过48小时内未发货状态下,买家可申请退款,卖家需在48小时内对买家退款申请作出响应:提供发货证
+			明至优软商城客服及买家,经优软商城及买家确认无误后,买家退款申请终止;如卖家在规定的48小时内未能提
+			供发货证明,优软商城将退款至买家,此时订单将做取消处理。<br/>
+			2.5. 优软商城所有的人民币交易均为含税交易。<br/>
+			2.6. 卖家开具发票的内容,包括产品名称、销售金额、规格型号等必须和交易事实一致。<br/>
+			2.7. 卖家收款并不意味着品质保证责任的结束,售后责任的起始日为卖家开具发票日至计算卖家承诺的售后服务期限
+			的日期为止。<br/>
+			2.8. 买家确认收货后15个自然日对所购产品无异议,无提出售后申请的优软商城确认交易过程无误,将对卖家进行付
+			款,付款需扣除卖家应承担的包含但不限于手续费、运费等费用。</p>
+		<p style="font-weight: bold">3.  服务费用</p>
+		<p>在交易过程中优软商城将向您收取一定比例的服务费用,具体费用比例如下:<br/>
+			3.1.  现货交易:<br/>
+			3.1.1. 累计成交额小于50万的, 按每笔成交额的8%收取。<br/>
+			3.1.2. 累计成交额在50万到500万的,按每笔成交额的 5%收取。<br/>
+			3.1.3. 累计成交额超过500万的,按每笔成交额的 3%收取。</p>
+		<p style="font-weight: bold">4.  售后</p>
+		<p>4.1. 因电子元器件产品的特殊性,部分性能指标只能在产品进入加工程序甚至加工程序完成后才能进行检测,因此,
+			优软商城要求卖家提供的质保期不能低于原厂的出厂标准。<br/>
+			4.2. 卖家在收到买家的退款、退货、换货申请时,须在72小时内进行批复,否则,优软商城将把卖家的行为视为同意
+			买家的申请,因此产生的任何直接或间接损失及不利后果将由卖家承担,优软商城对此不承担任何责任。<br/>
+			4.3. 如买家对产品提出异议,且卖家和买家无法就问题达成共识,优软商城有权委托第三方机构进行鉴定,若确认是
+			卖家供货存在问题的,则买家有权向卖家要求退换货或退款,期间造成的所有运输费用,由卖家自行承担。</p>
+		<br/>
+		<p style="font-weight: bold">第二章 库存寄售</p>
+		<p style="font-weight: bold">用户在优软商城进行库存寄售的交易行为时须遵守上述第一章的所有条例,且须遵守以下条例。</p>
+		<p style="font-weight: bold">第一节 买家条例</p>
+		<p style="font-weight: bold">1.  交易</p>
+		<p>1.1. 您同意,库存寄售的产品非质量问题或发错货均不予退换货或退款。<br/>
+			1.2. 您购买库存寄售的产品时,一张订单的不同批次货可以分开进行退换货处理,但只能整批次处理,每一批次货的
+			数量不能更改;若所下订单物料为多个供应商提供,不能因其中某一个或者多个供应商取消订单而取消余下订
+			单。<br/>
+			1.3. 您同意,您购买库存寄售的产品时,发票将由优软商城统一开具并邮寄,且不随您的订单产品同时寄出。<br/>
+			1.4. 优软商城将在您收到产产品当日起的第11/12个自然日开具发票,且优软商城只提供针对一般纳税人的含17个点
+			的增值税专用发票。<br/>
+			1.5. 为确保"增值税专用发票"的顺利开具,请您填写并确认开票资料信息,如因您提交的信息有误而造成发票开错而
+			影响认证抵扣,优软商城恕不负责;在发票信息与您输入的信息一致的情况下,发票一经开出,恕不退换。<br/>
+			16. 为确保能有效地使用“增值税专用发票”,请您详细填写开票资料,公司名称、地址电话、税号、开户银行和帐
+			号、发票邮寄地址等,且所填的内容须与纳税信息一致。<br/>
+			17. 自您在收到产产品的30个自然日内还未收到发票,请您及时与我们的客服人员联系;超过90个自然日未与我们联
+			系的,优软商城将不再为已开发票的订单进行补开发票。</p>
+		<p style="font-weight: bold">2.  转账</p>
+		<p>您购买库存寄售的产产品时,优软商城为您提供的汇款账户如下:<br/>
+			2.1. 人民币汇款:<br/>
+			2.1.1.1. 公司名称:深圳市优软商城科技有限公司<br/>
+			2.1.1.2. 开户银行:中国工商银行深圳侨香支行<br/>
+			2.1.1.3. 账   号:4000051309100150003<br/>
+			2.1.2.1. 公司名称:深圳市优软商城科技有限公司<br/>
+			2.1.2.2. 开户银行:平安银行深圳高新区支行<br/>
+			2.1.2.3. 账   号:11017374946005<br/>
+			2.2. 美金汇款:<br/>
+			2.2.1. 公司名称:(中文) 优软商城(香港)有限公司<br/>
+			2.2.2. (英文)USOFT MALL HONGKONG COMPANY LIMITED<br/>
+			2.2.3. 开户银行:(中文)恒生银行<br/>
+			2.2.4. (英文) HANG SENG BANK<br/>
+			2.2.5. 账   号:239576069001</p>
+		<br/>
+		<p style="font-weight: bold">第二节 卖家条例</p>
+		<p style="font-weight: bold">1.  交易</p>
+		<p>1.1. 您在优软商城进行库存寄售的交易时,优软商城将保密您的用户信息。<br/>
+			1.2. 您在优软商城进行库存寄售的产品,须发货到优软商城指定的交货地点,再由优软商城安排发货给买家。<br/>
+			1.3. 优软商城所有的人民币交易均为含税交易,且进行库存寄售的卖家必须向优软商城开具含17个点的增值税专用发
+			票。<br/>
+			1.4. 在优软商城进行库存寄售的用户,须在优软商城与您结清货款前72小时内寄出发票,在没有收到发票的情况下,
+			优软商城有权延迟对您结清货款。</p>
+		<p style="font-weight: bold">2.  服务费用</p>
+		<p>在交易过程中优软商城将向您收取一定比例的服务费用,具体费用比例如下:<br/>
+			2.1. 呆滞尾货交易:<br/>
+			2.1.1. 累计成交额小于50万的,按每笔成交额的13%收取。<br/>
+			2.1.2. 累计成交额在50万到500万的,按每笔成交额的12%收取。<br/>
+			2.1.3. 累计成交额超过500万的,按每笔成交额的11%收取。<br/>
+			2.2. 第三方物流费均由卖家承担,包括:<br/>
+			2.2.1. 卖家发货给优软商城的物流费 (卖家自己送货除外)。<br/>
+			2.2.2. 优软发货给买家的物流费。<br/>
+			2.2.3. 优软委托第三方上门取货和送货的物流费用。</p>
+		<p style="font-weight: bold">3.  售后</p>
+		<p>3.1. 优软商城在收到库存寄售的卖家的产品的15个自然日内,如发现产品有误、有质量问题、包装破损等问题,或买
+			家投诉该产品有质量问题,经协商确认后,卖家须免费更换产品,或者应买家要求无理由退货;期间产生的物流
+			均由卖家承担。<br/>
+			3.2. 库存寄售的产品退货时,卖家须先把物流费用支付给优软商城(包括:优软商城发货给买家产生的运费、买家退
+			货给优软商城的运费和优软商城退货给卖家的运费)。<br/>
+			3.3. 您向优软商城承诺:库存寄售的产品均提供一年的质量保证,即自优软商城验收产品起算一年内,产品如有任何
+			质量问题,用户须接受优软商城无条件换货要求,以优软商城的具体要求为准(因优软商城保管不当导致的质量
+			问题除外)。</p>
+		<!--<di ng-bind-html="article" class="ql-container ql-snow"></di>-->
+	</div>
+	<div class="agreement-agreen">
+		<label class="check-active">
+			<input type="checkbox" ng-model="agreement" id="1" class="ng-pristine ng-untouched ng-valid">
+			<label for="1"></label>
+		</label>
+		<span>我已阅读并同意<a href="http://www.usoftmall.com/help#/issue/16" TARGET="_blank">《优软商城买卖条例》</a> 关于库存寄售的全部条款.</span>
+	</div>
+	<div class="bottom">
+		<p><strong>* </strong>您在使用库存寄售的服务前,请认真阅读 《优软商城买卖条例》:若您是误操作,请点击“取消”按钮进行返回操作.</p>
+		<div class="bottom-bot">
+			<div>
+				<button ng-click="cancel()" class="off">取消</button>
+				<button ng-click="confirm()" class="ok" ng-disabled="!agreement">确认</button>
+			</div>
+		</div>
+	</div>
+</div>

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

@@ -0,0 +1,34 @@
+package com.uas.platform.b2c;
+
+import com.alibaba.fastjson.JSON;
+import com.uas.account.entity.UserSpaceDetail;
+import com.uas.sso.common.util.HttpUtil;
+import com.uas.sso.common.util.HttpUtil.ResponseWrap;
+import org.springframework.ui.ModelMap;
+import org.springframework.util.StringUtils;
+
+import java.util.Date;
+
+public class RegistForMall {
+
+	public static void main(String args[]) throws Exception {
+		UserSpaceDetail detail = new UserSpaceDetail();
+		detail.setName("B2B公司研发测试数据-不要购买-wangyuchao");
+		detail.setShortName("B2B公司");
+		detail.setAdminName("余佳");
+		detail.setAdminTel("15989329613");
+		detail.setAdminEmail("yuj@usoftchina.com");
+		detail.setBusinessCode("11122233344456789");
+		detail.setRegisterDate(new Date().getTime());
+		detail.setTel("15989329613");
+		detail.setFax("11-2222222");
+		String url = "http://113.105.74.135:8001/api/userspace";
+		if (!StringUtils.isEmpty(url)) {
+			ResponseWrap res = HttpUtil.doPost(url,
+					new ModelMap("_operate", "registForMall").addAttribute("detail", JSON.toJSON(detail)));
+			System.out.println(res.getContent());
+			if (!res.isSuccess())
+				throw new Exception(res.getContent());
+		}
+	}
+}