Browse Source

Merge branch 'dev' into hotfix-0606-yuj

# Conflicts:
#	src/main/java/com/uas/platform/b2c/prod/commodity/model/ReleaseProductByBatch.java
yujia 7 years ago
parent
commit
c076d9013c
100 changed files with 2658 additions and 912 deletions
  1. BIN
      jpg
  2. BIN
      pdf
  3. 0 103
      src/main/java/com/uas/platform/b2c/b2b/controller/ManageController.java
  4. 0 15
      src/main/java/com/uas/platform/b2c/b2b/dao/EnterpriseBaseInfoDao.java
  5. 0 105
      src/main/java/com/uas/platform/b2c/b2b/model/EnterpriseBaseInfo.java
  6. 0 22
      src/main/java/com/uas/platform/b2c/b2b/service/EnterpriseBaseInfoService.java
  7. 0 63
      src/main/java/com/uas/platform/b2c/b2b/service/impl/EnterpriseBaseInfoServiceImpl.java
  8. 10 30
      src/main/java/com/uas/platform/b2c/common/account/controller/AuthenticationController.java
  9. 13 5
      src/main/java/com/uas/platform/b2c/common/account/model/User.java
  10. 13 0
      src/main/java/com/uas/platform/b2c/common/account/service/UserService.java
  11. 11 4
      src/main/java/com/uas/platform/b2c/common/account/service/impl/EnterpriseServiceImpl.java
  12. 1 1
      src/main/java/com/uas/platform/b2c/common/account/service/impl/RoleServiceImpl.java
  13. 52 5
      src/main/java/com/uas/platform/b2c/common/account/service/impl/UserServiceImpl.java
  14. 1 0
      src/main/java/com/uas/platform/b2c/common/account/v2/service/impl/EnterpriseServiceImpl.java
  15. 9 6
      src/main/java/com/uas/platform/b2c/common/base/service/impl/RestSmsServiceImpl.java
  16. 1 1
      src/main/java/com/uas/platform/b2c/common/base/service/impl/SendMessageServiceImpl.java
  17. 1 1
      src/main/java/com/uas/platform/b2c/common/message/controller/InternalMessageController.java
  18. 21 0
      src/main/java/com/uas/platform/b2c/common/weixin/exception/WeChatException.java
  19. 24 12
      src/main/java/com/uas/platform/b2c/common/weixin/model/MessageModel.java
  20. 36 12
      src/main/java/com/uas/platform/b2c/common/weixin/service/impl/WeChatServiceImpl.java
  21. 35 0
      src/main/java/com/uas/platform/b2c/core/filter/SSOInterceptor.java
  22. 90 0
      src/main/java/com/uas/platform/b2c/core/utils/StringUtilB2C.java
  23. 1 0
      src/main/java/com/uas/platform/b2c/external/erp/prod/service/impl/ProdServiceImpl.java
  24. 3 3
      src/main/java/com/uas/platform/b2c/external/erp/product/service/impl/ComponentSubmitUasServiceImpl.java
  25. 1 1
      src/main/java/com/uas/platform/b2c/external/erp/product/service/impl/KindServiceImpl.java
  26. 4 3
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/ErrorInfoConstant.java
  27. 96 0
      src/main/java/com/uas/platform/b2c/prod/commodity/controller/ProductAttachSubmitController.java
  28. 12 1
      src/main/java/com/uas/platform/b2c/prod/commodity/controller/ProductController.java
  29. 51 1
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/GoodsDao.java
  30. 34 0
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/ProductAttachSubmitDao.java
  31. 8 1
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/ProductDao.java
  32. 14 2
      src/main/java/com/uas/platform/b2c/prod/commodity/model/Goods.java
  33. 16 1
      src/main/java/com/uas/platform/b2c/prod/commodity/model/GoodsHistory.java
  34. 1 1
      src/main/java/com/uas/platform/b2c/prod/commodity/model/GoodsSimple.java
  35. 377 0
      src/main/java/com/uas/platform/b2c/prod/commodity/model/ProductAttachSubmit.java
  36. 16 1
      src/main/java/com/uas/platform/b2c/prod/commodity/model/ProductPrivate.java
  37. 16 1
      src/main/java/com/uas/platform/b2c/prod/commodity/model/ReleaseProductByBatch.java
  38. 27 0
      src/main/java/com/uas/platform/b2c/prod/commodity/model/V_ProductPerson.java
  39. 27 0
      src/main/java/com/uas/platform/b2c/prod/commodity/model/V_ProductPrivate.java
  40. 22 0
      src/main/java/com/uas/platform/b2c/prod/commodity/service/GoodsService.java
  41. 73 0
      src/main/java/com/uas/platform/b2c/prod/commodity/service/ProductAttachService.java
  42. 43 1
      src/main/java/com/uas/platform/b2c/prod/commodity/service/ProductService.java
  43. 200 105
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsServiceImpl.java
  44. 447 0
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ProductAttachServiceImpl.java
  45. 350 106
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ProductServiceImpl.java
  46. 72 22
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ReleaseProductByBatchServiceImpl.java
  47. 12 5
      src/main/java/com/uas/platform/b2c/prod/product/brand/dao/BrandDao.java
  48. 1 1
      src/main/java/com/uas/platform/b2c/prod/product/common/api/CompareController.java
  49. 1 1
      src/main/java/com/uas/platform/b2c/prod/product/component/controller/ComponentController.java
  50. 14 7
      src/main/java/com/uas/platform/b2c/prod/product/component/dao/ComponentDao.java
  51. 26 0
      src/main/java/com/uas/platform/b2c/prod/product/component/modal/Component.java
  52. 3 4
      src/main/java/com/uas/platform/b2c/prod/product/component/modal/ComponentGoods.java
  53. 6 0
      src/main/java/com/uas/platform/b2c/prod/product/component/service/ComponentService.java
  54. 32 11
      src/main/java/com/uas/platform/b2c/prod/product/component/service/impl/ComponentServiceImpl.java
  55. 13 13
      src/main/java/com/uas/platform/b2c/prod/product/component/service/impl/ComponentSubmitServiceImpl.java
  56. 3 3
      src/main/java/com/uas/platform/b2c/prod/product/kind/api/KindController.java
  57. 2 2
      src/main/java/com/uas/platform/b2c/prod/product/kind/controller/KindAdviceController.java
  58. 14 14
      src/main/java/com/uas/platform/b2c/prod/product/kind/controller/KindController.java
  59. 3 0
      src/main/java/com/uas/platform/b2c/prod/product/kind/dao/KindInfoDao.java
  60. 15 1
      src/main/java/com/uas/platform/b2c/prod/product/kind/model/KindInfo.java
  61. 4 4
      src/main/java/com/uas/platform/b2c/prod/product/kind/service/impl/KindConcernServiceImpl.java
  62. 49 31
      src/main/java/com/uas/platform/b2c/prod/product/kind/service/impl/KindServiceImpl.java
  63. 5 3
      src/main/java/com/uas/platform/b2c/prod/product/property/dao/PropertyDao.java
  64. 10 0
      src/main/java/com/uas/platform/b2c/prod/store/api/CommodityController.java
  65. 30 4
      src/main/java/com/uas/platform/b2c/prod/store/facade/impl/CommodityFacadeImpl.java
  66. 3 0
      src/main/java/com/uas/platform/b2c/prod/store/facade/impl/StoreInFacadeImpl.java
  67. 9 0
      src/main/java/com/uas/platform/b2c/prod/store/service/CommodityService.java
  68. 33 3
      src/main/java/com/uas/platform/b2c/prod/store/service/impl/CommodityServiceImpl.java
  69. 1 1
      src/main/java/com/uas/platform/b2c/trade/order/model/OrderDetail.java
  70. 1 1
      src/main/java/com/uas/platform/b2c/trade/order/model/PurchaseDetail.java
  71. 11 1
      src/main/java/com/uas/platform/b2c/trade/support/CodeType.java
  72. 1 1
      src/main/resources/dev/account.properties
  73. BIN
      src/main/resources/jxls-tpl/product/componentBatchMaintenance.xls
  74. BIN
      src/main/resources/jxls-tpl/product/product-import.xls
  75. BIN
      src/main/resources/jxls-tpl/product/productStandarPutOn-error.xls
  76. BIN
      src/main/resources/jxls-tpl/trade/goods.xls
  77. BIN
      src/main/resources/jxls-tpl/trade/goodsImportHist-error.xls
  78. BIN
      src/main/resources/jxls-tpl/trade/products-error.xls
  79. BIN
      src/main/resources/jxls-tpl/trade/products.xls
  80. BIN
      src/main/resources/jxls-tpl/trade/releaseByBatch-person.xls
  81. BIN
      src/main/resources/jxls-tpl/trade/releaseByBatch-rmb.xls
  82. BIN
      src/main/resources/jxls-tpl/trade/releaseByBatchError-person.xls
  83. BIN
      src/main/resources/jxls-tpl/trade/releaseByBatchError-rmb.xls
  84. BIN
      src/main/resources/jxls-tpl/trade/releaseByBatchError-usd.xls
  85. BIN
      src/main/resources/jxls-tpl/trade/releasePCBByBatch-rmb.xls
  86. BIN
      src/main/resources/jxls-tpl/trade/releasePCBByBatchError-rmb.xls
  87. BIN
      src/main/resources/jxls-tpl/trade/releasePCBByBatchError-usd.xls
  88. BIN
      src/main/resources/jxls-tpl/trade/releasePCBbyBatch-usd.xls
  89. BIN
      src/main/resources/jxls-tpl/trade/releasebyBatch-usd.xls
  90. BIN
      src/main/resources/jxls-tpl/trade/seekPurchaseByBatch.xls
  91. BIN
      src/main/resources/jxls-tpl/trade/upAndDown.xls
  92. 1 1
      src/main/resources/prod/account.properties
  93. 1 1
      src/main/resources/test/account.properties
  94. 1 0
      src/main/webapp/WEB-INF/spring/webmvc.xml
  95. 2 0
      src/main/webapp/WEB-INF/views/normal/adminWithNav.html
  96. 1 0
      src/main/webapp/WEB-INF/views/normal/default/404.html
  97. 120 0
      src/main/webapp/WEB-INF/views/normal/sso.html
  98. 0 95
      src/main/webapp/WEB-INF/views/normal/user_center-0321.html
  99. 0 68
      src/main/webapp/WEB-INF/views/normal/vendor_center-0323.html
  100. 1 1
      src/main/webapp/resources/css/common.css

BIN
jpg


BIN
pdf


+ 0 - 103
src/main/java/com/uas/platform/b2c/b2b/controller/ManageController.java

@@ -1,103 +0,0 @@
-package com.uas.platform.b2c.b2b.controller;
-
-import com.uas.platform.b2c.b2b.model.EnterpriseBaseInfo;
-import com.uas.platform.b2c.b2b.service.EnterpriseBaseInfoService;
-import com.uas.platform.b2c.common.base.model.AccessToken;
-import com.uas.platform.b2c.common.base.service.AccessTokenService;
-import com.uas.platform.b2c.core.config.SysConf;
-import com.uas.platform.b2c.core.support.SystemSession;
-import com.uas.platform.b2c.core.support.log.UsageBufferedLogger;
-import com.uas.platform.core.logging.BufferedLoggerManager;
-import com.uas.platform.core.model.PageInfo;
-import com.uas.platform.core.model.PageParams;
-import com.wordnik.swagger.annotations.ApiOperation;
-import com.wordnik.swagger.annotations.ApiParam;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.util.StringUtils;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import java.io.IOException;
-import java.rmi.AccessException;
-import java.util.Arrays;
-
-/**
- * b2b操作
- *
- * Created by hejq on 2018-04-20.
- */
-@RequestMapping("/b2b/manage")
-@RestController
-public class ManageController {
-
-    @Autowired
-    private AccessTokenService accessTokenService;
-
-    @Autowired
-    private SysConf sysConf;
-
-    @Autowired
-    private EnterpriseBaseInfoService baseInfoService;
-
-    /**
-     * 操作日志
-     */
-    private UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
-
-    /**
-     * 定义可以访问的公司
-     */
-    private static final Long[] ACCESS_ENUU = {1000001L, 10044948L, 10042291L, 10042875L, 10043923L, 10041166L};
-
-    /**
-     * 通过UU号进行跳转到平台
-     *
-     * @param response HttpServletResponse
-     * @param enUU uu号
-     * @throws IOException
-     */
-    @RequestMapping("/authed/redirect/{enUU}")
-    public void redirect(HttpServletResponse response, HttpServletRequest request, @PathVariable("enUU") long enUU)
-            throws IOException {
-        Object bindObj = enUU;
-        if (null == SystemSession.getUser() || null == SystemSession.getUser().getEnterprise()) {
-            throw new AccessException("请先登录");
-        }
-        if (!Arrays.asList(ACCESS_ENUU).contains(SystemSession.getUser().getEnterprise().getUu())) {
-            throw new AccessException("没有访问权限");
-        }
-        AccessToken token = accessTokenService.createNew(bindObj);
-        request.getSession().setAttribute("user", SystemSession.getUser());
-        StringBuffer redirectUrl = new StringBuffer();
-        String domain = sysConf.getB2bDomain();
-        if (StringUtils.hasText(domain)) {
-            // 防止使用同一个www.ubtob.com造成session冲突
-            redirectUrl.append("http://").append(enUU).append(".").append(domain);
-        } else {
-            redirectUrl.append(sysConf.getB2bUrl());
-        }
-        redirectUrl.append("?client_type=manage&access_token=").append(token.getId());
-        logger.log("管理员访问B2B", "通过商务平台后台访问B2B");
-        response.sendRedirect(redirectUrl.toString());
-    }
-
-    /**
-     * 分页查询B2B注册信息
-     *
-     * @param params 分页参数
-     * @param keyword 关键词
-     * @return
-     */
-    @RequestMapping(value = "/enterpriseList", method = RequestMethod.GET)
-    @ApiOperation(value = "分页获取平台所有注册企业信息", httpMethod = "GET")
-    public Page<EnterpriseBaseInfo> findEnterPageByStatus(@ApiParam(required = true, value = "分页参数") PageParams params, @ApiParam(required = true, value = "搜索字符串") String keyword) {
-        PageInfo info = new PageInfo(params);
-        logger.log("管理平台获取企业列表", "通过[" + keyword + "]获取企业信息");
-        return baseInfoService.findEnterPageByKeyword(info, keyword);
-    }
-}

+ 0 - 15
src/main/java/com/uas/platform/b2c/b2b/dao/EnterpriseBaseInfoDao.java

@@ -1,15 +0,0 @@
-package com.uas.platform.b2c.b2b.dao;
-
-import com.uas.platform.b2c.b2b.model.EnterpriseBaseInfo;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
-import org.springframework.stereotype.Repository;
-
-/**
- * 企业基本信息
- *
- * Created by hejq on 2018-04-20.
- */
-@Repository
-public interface EnterpriseBaseInfoDao extends JpaRepository<EnterpriseBaseInfo, Long>, JpaSpecificationExecutor<EnterpriseBaseInfo> {
-}

+ 0 - 105
src/main/java/com/uas/platform/b2c/b2b/model/EnterpriseBaseInfo.java

@@ -1,105 +0,0 @@
-package com.uas.platform.b2c.b2b.model;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * 企业信息基本信息
- *
- * Created by hejq on 2018-04-20.
- */
-@Entity
-@Table(name = "sec$enterprises")
-public class EnterpriseBaseInfo implements Serializable {
-
-    /**
-     * 序列号
-     */
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 企业UU号
-     */
-    @Id
-    @Column(name = "en_uu")
-    private Long uu;
-
-    /**
-     * 公司名称
-     */
-    @Column(name = "en_name")
-    private String enName;
-
-    /**
-     * 注册地址
-     */
-    @Column(name = "en_address")
-    private String enAddress;
-
-    /**
-     * 商业登记证号
-     */
-    @Column(name = "en_businesscode")
-    private String enBussinessCode;
-
-    /**
-     * 注册时间
-     */
-    @Column(name = "en_time")
-    private Date enDate;
-
-    public Long getUu() {
-        return uu;
-    }
-
-    public void setUu(Long uu) {
-        this.uu = uu;
-    }
-
-    public String getEnName() {
-        return enName;
-    }
-
-    public void setEnName(String enName) {
-        this.enName = enName;
-    }
-
-    public String getEnAddress() {
-        return enAddress;
-    }
-
-    public void setEnAddress(String enAddress) {
-        this.enAddress = enAddress;
-    }
-
-    public String getEnBussinessCode() {
-        return enBussinessCode;
-    }
-
-    public void setEnBussinessCode(String enBussinessCode) {
-        this.enBussinessCode = enBussinessCode;
-    }
-
-    public Date getEnDate() {
-        return enDate;
-    }
-
-    public void setEnDate(Date enDate) {
-        this.enDate = enDate;
-    }
-
-    @Override
-    public String toString() {
-        return "EnterpriseBaseInfo{" +
-                "uu=" + uu +
-                ", enName='" + enName + '\'' +
-                ", enAddress='" + enAddress + '\'' +
-                ", enBussinessCode='" + enBussinessCode + '\'' +
-                ", enDate=" + enDate +
-                '}';
-    }
-}

+ 0 - 22
src/main/java/com/uas/platform/b2c/b2b/service/EnterpriseBaseInfoService.java

@@ -1,22 +0,0 @@
-package com.uas.platform.b2c.b2b.service;
-
-import com.uas.platform.b2c.b2b.model.EnterpriseBaseInfo;
-import com.uas.platform.core.model.PageInfo;
-import org.springframework.data.domain.Page;
-
-/**
- * 企业基本信息操作接口
- *
- * Created by hejq on 2018-04-20.
- */
-public interface EnterpriseBaseInfoService {
-
-    /**
-     * 分页查询企业信息
-     *
-     * @param info 分页参数
-     * @param keyword 关键字
-     * @return
-     */
-    Page<EnterpriseBaseInfo> findEnterPageByKeyword(PageInfo info, String keyword);
-}

+ 0 - 63
src/main/java/com/uas/platform/b2c/b2b/service/impl/EnterpriseBaseInfoServiceImpl.java

@@ -1,63 +0,0 @@
-package com.uas.platform.b2c.b2b.service.impl;
-
-import com.uas.platform.b2c.b2b.dao.EnterpriseBaseInfoDao;
-import com.uas.platform.b2c.b2b.model.EnterpriseBaseInfo;
-import com.uas.platform.b2c.b2b.service.EnterpriseBaseInfoService;
-import com.uas.platform.b2c.fa.payment.utils.StringUtils;
-import com.uas.platform.core.model.PageInfo;
-import com.uas.platform.core.persistence.criteria.PredicateUtils;
-import com.uas.platform.core.persistence.criteria.SimpleExpression;
-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 javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
-/**
- * 企业基本信息操作实现
- *
- * Created by hejq on 2018-04-20.
- */
-@Service
-public class EnterpriseBaseInfoServiceImpl implements EnterpriseBaseInfoService {
-
-    @Autowired
-    private EnterpriseBaseInfoDao baseInfoDao;
-
-    /**
-     * UU号正则表达式
-     */
-    static final String UU_REGEXP = "^\\d{4,}$";
-
-    /**
-     * 分页查询企业信息
-     *
-     * @param info    分页参数
-     * @param keyword 关键字
-     * @return
-     */
-    @Override
-    public Page<EnterpriseBaseInfo> findEnterPageByKeyword(final PageInfo info, String keyword) {
-        if (!StringUtils.isEmpty(keyword)) {
-            SimpleExpression name = PredicateUtils.like("enName", keyword, false);
-            if (keyword.matches(UU_REGEXP)) {
-                SimpleExpression enUU = PredicateUtils.eq("uu", keyword, false);
-                SimpleExpression[] expressions = new SimpleExpression[]{name, enUU};
-                info.expression(PredicateUtils.or(expressions));
-            } else {
-                SimpleExpression[] expressions = new SimpleExpression[]{name};
-                info.expression(PredicateUtils.or(expressions));
-            }
-        }
-        return baseInfoDao.findAll(new Specification<EnterpriseBaseInfo>() {
-            public Predicate toPredicate(Root<EnterpriseBaseInfo> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
-                query.where(info.getPredicates(root, query, builder));
-                return null;
-            }
-        }, info);
-    }
-}

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

@@ -35,8 +35,6 @@ public class AuthenticationController {
 	@Autowired
 	private RoleService roleService;
 
-	@Autowired
-	private UserLoginTimeDao userLoginTimeDao;
 
 	@RequestMapping(method = RequestMethod.GET, headers = "Accept=application/json")
 	@ResponseBody
@@ -56,7 +54,7 @@ public class AuthenticationController {
 				user.setIssys(Constant.NO);
 			}
 		}
-		request.getSession().setAttribute("user",user);
+		request.getSession().setAttribute("user", user);
 		UserInfo userInfo = new UserInfo(user);
 		Integer hasQuestion = user.getHasQuestion();
 		if (hasQuestion != null && hasQuestion ==1) {
@@ -84,7 +82,7 @@ public class AuthenticationController {
 			return null;
 		}
 		User user = userService.findUserByUserUU(SystemSession.getUser().getUserUU());
-		request.getSession().setAttribute("user",user);
+		request.getSession().setAttribute("user", user);
 		return new UserInfo(user);
 	}
 
@@ -95,30 +93,10 @@ public class AuthenticationController {
 	 */
 	@RequestMapping(value = "/{enUU}")
 	@ResponseBody
-	public void switchEnterprise(@PathVariable("enUU") long enUU) {
-		User user = SystemSession.getUser();
-		//保存登录时间
-		List<UserLoginTime> userLoginTimeList = userLoginTimeDao.findByUserUUAndEnUU(user.getUserUU(), user.getEnterprise() == null ? 0L : user.getEnterprise().getUu());
-		UserLoginTime userLoginTime;
-		if (!CollectionUtils.isEmpty(userLoginTimeList)) {
-			userLoginTime = userLoginTimeList.get(0);
-		} else {
-			userLoginTime = new UserLoginTime();
-			userLoginTime.setUserUU(user.getUserUU());
-			userLoginTime.setEnUU(user.getEnterprise() == null ? 0L : user.getEnterprise().getUu());
-		}
-		userLoginTime.setLoginTime(System.currentTimeMillis());
-		try {
-			userLoginTimeDao.save(userLoginTime);
-		} catch (Exception e) {
-
-		}
-
-		if ( enUU == 0L) {
-			user.setEnterprise(null);
-		} else {
-			user.setCurrentEnterprise(enUU);
-		}
+	public void switchEnterprise(@PathVariable("enUU") long enUU, HttpServletRequest request) {
+		userService.saveLoginTime(enUU);
+		User user = userService.switchEnterprise(enUU);
+		request.getSession().setAttribute("user", user);
 	}
 
 	/**
@@ -132,11 +110,13 @@ public class AuthenticationController {
 		String currUrl;
 		try {
 			currUrl = URLDecoder.decode(resUrl, "UTF-8");
-			currUrl = "/" + currUrl;
+			if (!currUrl.substring(0,1).equals("/")) {
+				currUrl = "/" + currUrl;
+			}
 		} catch (UnsupportedEncodingException e) {
 			throw new IllegalArgumentException("URL编码错误!");
 		}
-		if (user.getUserUU().equals(user.getEnterprise().getEnAdminuu())) {
+		if (user.getUserUU().equals(user.getEnterprise().getEnAdminuu()) || user.isSys()) {
 			ModelMap map = new ModelMap();
 			map.put("status","sucess");
 			map.put("msg","该用户为管理员");

+ 13 - 5
src/main/java/com/uas/platform/b2c/common/account/model/User.java

@@ -501,12 +501,20 @@ public class User implements Serializable {
 	 */
 	public void setCurrentEnterpriseRoles() {
 		if(!CollectionUtils.isEmpty(this.roles) && this.enterprise != null) {
-			Iterator<Role> iterator = this.roles.iterator();
+//			Iterator<Role> iterator = this.roles.iterator();
+//			Long enuu = this.enterprise.getUu();
+//			while (iterator.hasNext()) {
+//				Role role = iterator.next();
+//				if(!role.getEnUU().equals(enuu)) {
+//					iterator.remove();
+//				}
+//			}
+			Set<Role> roles = this.roles;
+			this.roles = new HashSet<>();
 			Long enuu = this.enterprise.getUu();
-			while (iterator.hasNext()) {
-				Role role = iterator.next();
-				if(!role.getEnUU().equals(enuu)) {
-					iterator.remove();
+			for (Role role : roles) {
+				if (role.getEnUU().equals(enuu)) {
+					this.roles.add(role);
 				}
 			}
 		}

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

@@ -207,4 +207,17 @@ public interface UserService {
 	 * @return
 	 */
 	ModelMap anthority(User user,String url);
+
+	/**
+	 * 切换企业
+	 * @param enUU
+	 * @return
+	 */
+	User switchEnterprise(Long enUU);
+
+	/**
+	 * 记录企业的登录时间
+	 * @param enuu
+	 */
+	void saveLoginTime(Long enuu);
 }

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

@@ -25,9 +25,11 @@ import com.uas.sso.util.AccountUtils;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
+import javax.annotation.Resource;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
@@ -47,6 +49,8 @@ public class EnterpriseServiceImpl implements EnterpriseService{
 	@Autowired
 	private StoreInDao storeInDao;
 
+	@Resource(name = "v2.EnterpriseService")
+	private com.uas.platform.b2c.common.account.v2.service.EnterpriseService v2EnterpriserService;
 
 	@Override
 	public Enterprise getEnterpriseInfo(Long uu) {
@@ -213,7 +217,7 @@ public class EnterpriseServiceImpl implements EnterpriseService{
 
 	@Override
 	public ResultMap registerEnterprise(FormEnterprise enterprise, String filePath, User user) {
-		//封装注册时的个人账户信息;
+		// 封装注册时的个人账户信息;
 		if (user == null) {
 			throw new RuntimeException("登录异常:用户不存在!");
 		}
@@ -230,7 +234,7 @@ public class EnterpriseServiceImpl implements EnterpriseService{
 		if (imid != null) {
 			userView.setImId(imid.toString());
 		}
-		//封装注册企业信息;
+		// 封装注册企业信息;
 		detail.setSpaceName(enterprise.getName());
 		detail.setCorporation(enterprise.getLawPerson());
 		detail.setAdmin(userView);
@@ -255,12 +259,15 @@ public class EnterpriseServiceImpl implements EnterpriseService{
 		try {
 			JSONObject data = JSON.parseObject(JSON.toJSONString(detail));
 			String userSpa = data.toJSONString();
-			// 调用账户中心的接口注册企业
-			detail = AccountUtils.register(detail, userView);
+			// 调用账户中心的接口注册企业,账户中心不会回调保存,需要我们自己保存,以实现同步
+			detail = AccountUtils.register(detail, userView, false);
+			// 自己保存企业到商城数据库
+			v2EnterpriserService.update(detail);
 		} catch (Exception e) {
 			return new ResultMap(CodeType.SYSTEM_ERROR, e.getMessage());
 		}
 
+
 		// 将新注册的企业UU号返回
 		Map<String, Object> result = new HashMap<String, Object>();
 		result.put("enuu", detail.getSpaceUU());

+ 1 - 1
src/main/java/com/uas/platform/b2c/common/account/service/impl/RoleServiceImpl.java

@@ -26,7 +26,7 @@ public class RoleServiceImpl implements RoleService {
 
     private static final int DEFAULT_ROLE = 1;
 
-    private static final int ALL_DEFAULT_ROLE = 4;
+    private static final int ALL_DEFAULT_ROLE = 5;
 
     @Autowired
     private RoleDao roleDao;

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

@@ -1,10 +1,7 @@
 package com.uas.platform.b2c.common.account.service.impl;
 
 import com.uas.message.mail.service.MailService;
-import com.uas.platform.b2c.common.account.dao.EnterpriseDao;
-import com.uas.platform.b2c.common.account.dao.RoleDao;
-import com.uas.platform.b2c.common.account.dao.UserCacheEnterpriseDao;
-import com.uas.platform.b2c.common.account.dao.UserDao;
+import com.uas.platform.b2c.common.account.dao.*;
 import com.uas.platform.b2c.common.account.model.*;
 import com.uas.platform.b2c.common.account.service.UserService;
 import com.uas.platform.b2c.common.base.dao.CommonDao;
@@ -75,6 +72,12 @@ public class UserServiceImpl implements UserService {
 	@Autowired
 	private MessageConf messageConf;
 
+	@Autowired
+	private ResourceItemDao resourceItemDao;
+
+	@Autowired
+	private UserLoginTimeDao userLoginTimeDao;
+
 	@Override
 	public User findUserByUserUU(Long uu) {
 		List<User> users = userDao.findUserByUserUU(uu);
@@ -523,6 +526,7 @@ public class UserServiceImpl implements UserService {
 	@Override
 	public ModelMap anthority(User user,String resUrl) {
 		Set<ResourceItem> resourceItems = new HashSet<>();
+		List<ResourceItem> resourceItemList = resourceItemDao.findAll();
 		user.setCurrentEnterpriseRoles();
 		Set<Role> roles = user.getRoles();
 		if (!org.apache.commons.collections.CollectionUtils.isEmpty(roles)) {
@@ -545,9 +549,52 @@ public class UserServiceImpl implements UserService {
 				}
 			}
 		}
+		if (!org.apache.commons.collections.CollectionUtils.isEmpty(resourceItemList)) {
+			for (ResourceItem re : resourceItemList) {
+				if (resUrl.equals(re.getUrl())) {
+					ModelMap map = new ModelMap();
+					map.put("status","fail");
+					map.put("msg","您没有 "+re.getDesc()+" 权限,请联系管理员");
+					return map;
+				}
+			}
+		}
 		ModelMap map = new ModelMap();
 		map.put("status","fail");
-		map.put("msg","没有该导出权限,请联系管理员");
+		map.put("msg","没有该权限,请联系管理员");
 		return map;
 	}
+
+	@Override
+	public User switchEnterprise(Long enUU) {
+		User user = userDao.findOne(SystemSession.getUser().getUserUU());
+		if ( enUU == 0L) {
+			user.setEnterprise(null);
+		} else {
+			user.setCurrentEnterprise(enUU);
+		}
+		SystemSession.setUser(user);
+		return user;
+	}
+
+	@Override
+	public void saveLoginTime(Long enuu) {
+		User user = SystemSession.getUser();
+		//保存登录时间
+		List<UserLoginTime> userLoginTimeList = userLoginTimeDao.findByUserUUAndEnUU(user.getUserUU(), user.getEnterprise() == null ? 0L : user.getEnterprise().getUu());
+		UserLoginTime userLoginTime;
+		if (!CollectionUtils.isEmpty(userLoginTimeList)) {
+			userLoginTime = userLoginTimeList.get(0);
+		} else {
+			userLoginTime = new UserLoginTime();
+			userLoginTime.setUserUU(user.getUserUU());
+			userLoginTime.setEnUU(user.getEnterprise() == null ? 0L : user.getEnterprise().getUu());
+		}
+		userLoginTime.setLoginTime(System.currentTimeMillis());
+		try {
+			userLoginTimeDao.save(userLoginTime);
+		} catch (Exception e) {
+
+		}
+	}
 }

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

@@ -43,6 +43,7 @@ public class EnterpriseServiceImpl implements EnterpriseService {
 
     private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
 
+
     @Override
     public Enterprise update(UserSpaceView userSpaceView) {
       /*  List<User> admins = userDao.findUserByUserUU(userSpaceView.getAdminUU());

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

@@ -3,7 +3,6 @@ package com.uas.platform.b2c.common.base.service.impl;
 import com.alibaba.fastjson.JSONObject;
 import com.uas.message.common.domain.Page;
 import com.uas.message.common.domain.SimpleMessage;
-import com.uas.message.mail.domain.MailLog;
 import com.uas.message.sms.domain.SmsLog;
 import com.uas.message.sms.service.SmsService;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
@@ -17,6 +16,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.client.RestTemplate;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -105,14 +105,17 @@ public class RestSmsServiceImpl implements SmsService {
         headers.setContentType(type);
         headers.add("Accept", MediaType.APPLICATION_JSON.toString());
 
+        List<SmsLog> mailLogs = new ArrayList<>();
         JSONObject object = new JSONObject();
         object.put("templateId", templateId);
-        object.put("receivers", receivers);
         object.put("params", params);
-
-        HttpEntity<String> formEntity = new HttpEntity<String>(object.toJSONString(), headers);
-        ResponseEntity<String> responseEntity = restTemplate.postForEntity(SMS_CONSOLE_HOST + SMS_SEND_MANY_URL, formEntity, String.class);
-        List<SmsLog> mailLogs = FastjsonUtils.fromJsonArray(responseEntity.getBody(), SmsLog.class);
+        for (String receiver : receivers) {
+            object.put("receiver", receiver);
+            HttpEntity<String> formEntity = new HttpEntity<String>(object.toJSONString(), headers);
+            ResponseEntity<String> responseEntity = restTemplate.postForEntity(SMS_CONSOLE_HOST + SMS_SEND_URL, formEntity, String.class);
+            SmsLog smsLog = FastjsonUtils.fromJson(responseEntity.getBody(), SmsLog.class);
+            mailLogs.add(smsLog);
+        }
         return mailLogs;
     }
 

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

@@ -45,7 +45,7 @@ public class SendMessageServiceImpl implements SendMessageService {
 			Set<String> userPhones = new HashSet<>();
 			userPhones.add(userPhone);
 			Object[] obj = {sellername,num};
-			smsService.sendAll("a3c13206-1c0b-4bbb-a7d2-864043792092",userPhones,obj);
+			smsService.sendAll("398ad011-59e4-44d1-88cb-8cdfca3d725c",userPhones,obj);
 			//core中的接口
 			/*SendMessageUtil.sendMessage(context, userPhones, name, type, new Callback<MessageLog>() {
 				@Override

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

@@ -62,7 +62,7 @@ public class InternalMessageController {
         User user = SystemSession.getUser();
         map.put("url", messageServiceUrl);
         map.put("userUU", user.getUserUU());
-        map.put("enUU", user.getEnterprise().getUu());
+        map.put("enUU", user.getEnterprise() == null ? 0L : user.getEnterprise().getUu());
         map.put("page", pageParams.getPage());
         map.put("timeSorting", pageParams.getSorting() == null ? "{\"createTime\":\"DESC\"}" : pageParams.getSorting());
         map.put("count", pageParams.getCount());

+ 21 - 0
src/main/java/com/uas/platform/b2c/common/weixin/exception/WeChatException.java

@@ -0,0 +1,21 @@
+package com.uas.platform.b2c.common.weixin.exception;
+
+/**
+ * @author liuam
+ * @since 2018/6/26 0026 下午 16:28
+ */
+public class WeChatException extends Exception {
+
+    public WeChatException() {
+
+    }
+
+    public WeChatException(String message) {
+        super(message);
+    }
+
+    public WeChatException(Throwable cause) {
+        super(cause);
+    }
+
+}

+ 24 - 12
src/main/java/com/uas/platform/b2c/common/weixin/model/MessageModel.java

@@ -1,8 +1,7 @@
 package com.uas.platform.b2c.common.weixin.model;
 
 /**
- * @author liusw
- * @date 2018-05-29 20:14
+ * 消息
  */
 public class MessageModel {
     /**
@@ -71,29 +70,42 @@ public class MessageModel {
     private String consumerApp;
 
     /**
-     * 询价名称
+     * 询价方信息
      */
-    private String name;
+    private String buyerName;
+
+    /**
+     * 供应商信息
+     */
+    private String vendName;
 
     /**
      * 型号
      */
     private String cmpCode;
 
-    public String getCmpCode() {
-        return cmpCode;
+    public String getBuyerName() {
+        return buyerName;
     }
 
-    public void setCmpCode(String cmpCode) {
-        this.cmpCode = cmpCode;
+    public void setBuyerName(String buyerName) {
+        this.buyerName = buyerName;
     }
 
-    public String getName() {
-        return name;
+    public String getVendName() {
+        return vendName;
     }
 
-    public void setName(String name) {
-        this.name = name;
+    public void setVendName(String vendName) {
+        this.vendName = vendName;
+    }
+
+    public String getCmpCode() {
+        return cmpCode;
+    }
+
+    public void setCmpCode(String cmpCode) {
+        this.cmpCode = cmpCode;
     }
 
     public String getType() {

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

@@ -3,6 +3,7 @@ package com.uas.platform.b2c.common.weixin.service.impl;
 import com.uas.platform.b2c.common.account.dao.UserDao;
 import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.platform.b2c.common.account.model.User;
+import com.uas.platform.b2c.common.weixin.exception.WeChatException;
 import com.uas.platform.b2c.common.weixin.model.MessageModel;
 import com.uas.platform.b2c.common.weixin.model.req.AuthTokenParams;
 import com.uas.platform.b2c.common.weixin.model.req.AuthUserParams;
@@ -54,7 +55,14 @@ public class WeChatServiceImpl implements WeChatService{
     public ModelMap getWxUserInfo(String code, String state) {
         ModelMap result = new ModelMap();
         if (!StringUtils.isEmpty(code)) {
-            AuthUserInfo userInfo = getAccessTokenByCode(code);
+            AuthUserInfo userInfo = null;
+            try {
+                userInfo = getAccessTokenByCode(code);
+            } catch (Exception e) {
+                // 接收到错误信息,直接返回
+                result.put("exception", e.getMessage());
+                return result;
+            }
             result.put("nickname", userInfo.getNickname());
             result.put("headimgurl", userInfo.getHeadimgurl());
             String openid = userInfo.getOpenid();
@@ -93,8 +101,8 @@ public class WeChatServiceImpl implements WeChatService{
 
         TreeMap<String, TreeMap<String, String>> params = new TreeMap<>();
 
-        // 获取操作 api 需要的 access_token
-        String access_token = getAccessToken();
+        // 获取操作 api 需要的 access_token, false 从缓存中查
+        String access_token = getAccessToken(false);
         String sendTemplateUrl = WeChatUtil.SEND_TEMPLATE_URL.replace("ACCESS_TOKEN", access_token);
         // 模板内容设置
         for (MessageModel messageModel : messages) {
@@ -103,8 +111,8 @@ public class WeChatServiceImpl implements WeChatService{
                 WechatTemplateMsg wechatTemplateMsg = new WechatTemplateMsg();
                 wechatTemplateMsg.setTemplate_id(WeChatUtil.INQUIRY_TEMPLATE_ID);
 
-                params.put("first", WechatTemplateMsg.item("尊敬的用户,您所在的企业(" + messageModel.getName() + ")有一条新的询价单", null));
-                params.put("keyword1", WechatTemplateMsg.item(messageModel.getName(), "#173177"));
+                params.put("first", WechatTemplateMsg.item("尊敬的用户,您所在的企业(" + messageModel.getVendName() + ")有一条新的询价单", null));
+                params.put("keyword1", WechatTemplateMsg.item(messageModel.getBuyerName(), "#173177"));
                 params.put("keyword2", WechatTemplateMsg.item("点击查看详情", "#173177"));
                 params.put("keyword3", WechatTemplateMsg.item("点击查看详情", "#173177"));
                 params.put("remark", WechatTemplateMsg.item(WeChatUtil.TEMPLATE_REMARK.replace("cmpCode", messageModel.getCmpCode()), null));
@@ -113,8 +121,17 @@ public class WeChatServiceImpl implements WeChatService{
                 wechatTemplateMsg.setTouser(user.getOpenId());
                 wechatTemplateMsg.setData(params);
                 String json = HttpReqUtil.doPost(sendTemplateUrl, FlexJsonUtils.toJsonDeep(wechatTemplateMsg));
-
-                TemplateMsgResult templateMsgResult = FlexJsonUtils.fromJson(json, TemplateMsgResult.class);
+                TemplateMsgResult templateMsgResult = null;
+                try {
+                    templateMsgResult = FlexJsonUtils.fromJson(json, TemplateMsgResult.class);
+                } catch (Exception e) {
+                    // 如果转换失败,说明token失效, 强制获取新的 token ,再进行转换
+                    String access_token_force = getAccessToken(true);
+                    String sendTemplateUrl_force = WeChatUtil.SEND_TEMPLATE_URL.replace("ACCESS_TOKEN", access_token_force);
+                    String json_force = HttpReqUtil.doPost(sendTemplateUrl_force, FlexJsonUtils.toJsonDeep(wechatTemplateMsg));
+                    // 如果转换失败,抛异常
+                    templateMsgResult = FlexJsonUtils.fromJson(json_force, TemplateMsgResult.class);
+                }
                 templateMsgResults.add(templateMsgResult);
             }
         }
@@ -173,12 +190,16 @@ public class WeChatServiceImpl implements WeChatService{
      * 通过code获取用户openId
      * @param code
      */
-    private AuthUserInfo getAccessTokenByCode(String code) {
+    private AuthUserInfo getAccessTokenByCode(String code) throws Exception {
         AuthTokenParams authTokenParams = new AuthTokenParams(WeChatUtil.APPID, WeChatUtil.APPSECRET, code, "authorization_code");
         String json = HttpReqUtil.doGet(WeChatUtil.GET_OAUTH_TOKEN_URL, authTokenParams.getParams());
         AuthAccessToken authAccessToken = FlexJsonUtils.fromJson(json, AuthAccessToken.class);
+        if (authAccessToken.getOpenid() == null) {
+            throw new WeChatException(json);
+        }
         String accessToken = authAccessToken.getAccess_token();
         String openId = authAccessToken.getOpenid();
+        // 可能抛出异常,向上抛
         AuthUserInfo userInfo = getUserInfo(accessToken, openId);
         return userInfo;
     }
@@ -189,21 +210,24 @@ public class WeChatServiceImpl implements WeChatService{
      * @param openId
      * @return
      */
-    private AuthUserInfo getUserInfo(String accessToken, String openId) {
+    private AuthUserInfo getUserInfo(String accessToken, String openId) throws Exception {
         // 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语
         AuthUserParams authUserParams = new AuthUserParams(accessToken, openId, "zh_CN");
         String json = HttpReqUtil.doGet(WeChatUtil.SNS_USERINFO_URL, authUserParams.getParams());
         AuthUserInfo authUserInfo = FlexJsonUtils.fromJson(json, AuthUserInfo.class);
+        if (authUserInfo.getOpenid() == null) {
+            throw new WeChatException(json);
+        }
         return authUserInfo;
     }
 
     /**
      * 获取调用api所需的access_token
-     *
+     * force true:不从缓存中查,获取新的token
      */
-    private String getAccessToken () {
+    private String getAccessToken (boolean force) {
         String access_token = (String) redisTemplate.opsForValue().get("WX_ACCESS_TOKEN");
-        if (!StringUtils.isEmpty(access_token)) {
+        if (!StringUtils.isEmpty(access_token) && !force) {
             return access_token;
         }
         AuthTokenParams authTokenParams = new AuthTokenParams(WeChatUtil.APPID, WeChatUtil.APPSECRET,"client_credential");

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

@@ -35,6 +35,8 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
 import org.springframework.ui.ModelMap;
 import org.springframework.util.StringUtils;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -166,9 +168,42 @@ public class SSOInterceptor extends AbstractSSOInterceptor {
         if (user != null) {
             SystemSession.setUser(user);
             accessDecision(request, user);
+            accessAdmin(request,user);
         }
     }
 
+    /**
+     * admin权限验证
+     */
+    private void accessAdmin(HttpServletRequest request,User user) {
+        if (!StringUtils.isEmpty(user.getEnterprise())) {
+            if (!user.getEnterprise().getUu().toString().equals(enUU) && request.getServletPath().equals("/admin")) {
+                //throw new AccessDeniedException("无法访问,您没有权限!");
+                HttpServletResponse response = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();
+                try {
+                    response.setHeader("Content-type", "text/html;charset=UTF-8");
+                    response.getWriter().write("您没有管理权限,请联系优软商城");
+                } catch (IOException e) {
+
+                }
+                throw new AccessDeniedException("无法访问,您没有权限!");
+
+            }
+        } else {
+            if (request.getServletPath().equals("/admin")) {
+                HttpServletResponse response = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();
+                try {
+                    response.setHeader("Content-type", "text/html;charset=UTF-8");
+                    response.getWriter().write("您没有管理权限,请联系优软商城");
+                } catch (IOException e) {
+
+                }
+                throw new AccessDeniedException("无法访问,您没有权限!");
+            }
+        }
+
+    }
+
     /**
      * 权限验证
      */

+ 90 - 0
src/main/java/com/uas/platform/b2c/core/utils/StringUtilB2C.java

@@ -2,12 +2,16 @@ package com.uas.platform.b2c.core.utils;
 
 import com.alibaba.fastjson.JSON;
 import com.uas.platform.b2c.logistics.model.Receipt;
+import com.uas.platform.b2c.prod.commodity.constant.UploadConstant;
 import com.uas.platform.b2c.trade.order.model.StatusHistory;
 import com.uas.platform.b2c.trade.order.model.StatusHistorySimpleInfo;
+import com.uas.platform.b2c.trade.support.CodeType;
+import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.model.Type;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.util.StringUtils;
 
+import java.io.UnsupportedEncodingException;
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -20,6 +24,11 @@ import java.util.regex.Pattern;
  */
 public class StringUtilB2C {
 
+	/**
+	 * 验证产品型号
+	 */
+	private static final Pattern codePattern = Pattern.compile(RegexConstant.LetterAndDigitAndEnglishSpecialCharacter);
+
 	/**
 	 * 重新组装好的String
 	 * 
@@ -316,4 +325,85 @@ public class StringUtilB2C {
             return input;
 		}
 	}
+
+	/**
+	 * 验证产品规范的品牌
+	 * @param brand
+	 * @return
+	 */
+	public static ResultMap validateBrand(String brand) {
+		if (StringUtils.isEmpty(brand)) {
+			return new ResultMap(CodeType.NOT_PERMIT, "品牌不能为空");
+		} else {
+			if (brand.length() > 50) {
+				return new ResultMap(CodeType.NOT_PERMIT, "品牌不能超过50个字符");
+			} else {
+				brand = StringUtilB2C.toEnglish(StringUtilB2C.getStr(brand));
+				return ResultMap.success(brand);
+			}
+		}
+	}
+
+	/**
+	 * 验证产品规范的型号
+	 * @param cmpCode
+	 * @return
+	 */
+	public static ResultMap validateCmpCode(String cmpCode) {
+		if (!StringUtils.isEmpty(cmpCode)) {
+			String code = cmpCode.toString().trim();
+			Matcher matcher = codePattern.matcher(code);
+			if (!matcher.find()) {
+				return new ResultMap(CodeType.PARAMETER_ERROR, "不能输入中文或中文特殊字符");
+			}
+			try {
+				if (code.getBytes("GBK").length > 100) {
+					return new ResultMap(CodeType.PARAMETER_ERROR, "产品型号不能超过100字符");
+				}
+			} catch (UnsupportedEncodingException e) {
+				throw new RuntimeException(e + "指定字符集不支持");
+			}
+		} else {
+			return new ResultMap(CodeType.PARAMETER_ERROR, "产品型号不能为空");
+		}
+		cmpCode = StringUtilB2C.getStr(cmpCode);
+		return ResultMap.success(cmpCode);
+	}
+
+	/**
+	 * 验证产品规范的物料名称(类目)
+	 * @param kind
+	 * @return
+	 */
+	public static ResultMap validateKind(String kind) {
+		if (StringUtils.isEmpty(kind)) {
+			return new ResultMap(CodeType.PARAMETER_ERROR.code(), "物料名称(类目)不能为空");
+		} else {
+			try {
+				if (kind.toString().getBytes("GBK").length > 20) {
+					return new ResultMap(CodeType.PARAMETER_ERROR.code(), "物料名称(类目)不能超过20个字符");
+				}
+			} catch (UnsupportedEncodingException e) {
+				throw new RuntimeException(e + "指定字符集不支持");
+			}
+		}
+		kind = StringUtilB2C.getStr(kind);
+		return ResultMap.success(kind);
+	}
+
+	/**
+	 * 验证产品规范的物料名称(类目)
+	 * @param spec
+	 * @return
+	 */
+	public static ResultMap validateSpec(String spec) {
+		if (!StringUtils.isEmpty(spec)) {
+			String str = com.uas.platform.b2c.fa.payment.utils.StringUtils.cutOutStringIgnoreEncode(spec.toString(), UploadConstant.SPEC_MAX_BYTE);
+			return ResultMap.success(str);
+		} else {
+			return ResultMap.success("");
+		}
+	}
+
+
 }

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

@@ -117,6 +117,7 @@ public class ProdServiceImpl implements ProdService {
             if (null == productPrivate) {
                 productPrivate = new ProductPrivate();
                 productPrivate.setPrId(prod.getPr_id());
+                productPrivate.setBatchCount(IntegerConstant.NO_SHORT);
             }
             productPrivate.setB2cEnabled(IntegerConstant.YES_SHORT);
             // 统计现在有多少在售信息

+ 3 - 3
src/main/java/com/uas/platform/b2c/external/erp/product/service/impl/ComponentSubmitUasServiceImpl.java

@@ -77,18 +77,18 @@ public class ComponentSubmitUasServiceImpl implements ComponentSubmitUasService
             // 验证类目是否正确
             if (componentSubmit.getKindid() == null) {
                 if (componentSubmit.getKindName() == null) {
-                    throw new B2CException("类目名不可为空");
+                    throw new B2CException("物料名称(类目)不可为空");
                 }
                 List<Kind> existKind = kindDao.findByNameCn(componentSubmit.getKindName());
                 if (!CollectionUtils.isEmpty(existKind)) {
                     componentSubmit.setKindid(existKind.get(0).getId());
                 } else {
-                    throw new B2CException("器件申请中所选类目不存在");
+                    throw new B2CException("器件申请中所选物料名称(类目)不存在");
                 }
             }
             Kind kind = kindDao.findOne(componentSubmit.getKindid());
             if (kind == null) {
-                throw new B2CException("器件申请中所选类目不存在");
+                throw new B2CException("器件申请中所选物料名称(类目)不存在");
             }
             componentSubmit.setKind(kind);
 

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

@@ -76,7 +76,7 @@ public class KindServiceImpl implements KindService {
     private List<Kind> getParentsByChildId(Long childId, List<Kind> container) {
         Kind child = kindDao.findOne(childId);
         if (child == null) {
-            throw new IllegalOperatorException("要获取的父类目不存在");
+            throw new IllegalOperatorException("要获取的父物料名称(类目)不存在");
         }
         if (child.getParentid() != 0) {
             getParentsByChildId(child.getParentid(), container);

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

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

+ 96 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/controller/ProductAttachSubmitController.java

@@ -0,0 +1,96 @@
+package com.uas.platform.b2c.prod.commodity.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.uas.platform.b2c.core.utils.FastjsonUtils;
+import com.uas.platform.b2c.prod.commodity.model.ProductAttachSubmit;
+import com.uas.platform.b2c.prod.commodity.service.ProductAttachService;
+import com.uas.platform.b2c.trade.support.CodeType;
+import com.uas.platform.b2c.trade.support.ResultMap;
+import com.uas.platform.core.model.PageParams;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * Created by wangyc on 2018/6/27.
+ *
+ * @version 2018/6/27 10:43 wangyc
+ */
+@RestController
+@RequestMapping("trade/product/attach")
+public class ProductAttachSubmitController {
+
+    private final ProductAttachService productAttachService;
+
+    @Autowired
+    public ProductAttachSubmitController(ProductAttachService productAttachService) {
+        this.productAttachService = productAttachService;
+    }
+
+    /**
+     * 分页获取申请列表
+     * @param params 分页参数
+     * @param keywords 关键词
+     * @param status 状态
+     * @return
+     */
+    @RequestMapping(method = RequestMethod.GET, produces = "application/json")
+    public Page<ProductAttachSubmit> getPageInfo(PageParams params, @RequestParam(value = "keywords", required = false) String keywords, @RequestParam(value = "status", defaultValue = "all") String status) {
+        return productAttachService.getPageInfo(params, keywords, status);
+    }
+
+    /**
+     * 获取单条申请信息
+     * @param submitId 申请id
+     * @return
+     */
+    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
+    public ProductAttachSubmit getOne(@RequestParam Long submitId) {
+        return productAttachService.getOne(submitId);
+    }
+
+    /**
+     * 审核通过
+     * @param submit 申请
+     * @return
+     */
+    @RequestMapping(value = "/auditSuccess", method = RequestMethod.POST, produces = "application/json")
+    public ResultMap auditSuccess(@RequestBody ProductAttachSubmit submit) {
+        return productAttachService.auditSuccess(submit);
+    }
+
+    /**
+     * 审核不通过
+     * @param submitId 申请id
+     * @param reason 原因
+     * @return
+     */
+    @RequestMapping(value = "/auditFailed/{id}", method = RequestMethod.POST, produces = "application/json")
+    public ResultMap auditFailed(@PathVariable("id") Long submitId, @RequestBody String reason) {
+        JSONObject reasonObject = FastjsonUtils.fromJson(reason, JSONObject.class);
+        return productAttachService.auditFailed(submitId, reasonObject.getString("reason"));
+    }
+
+    /**
+     * 选择确认最终规格书并审核通过
+     * @param json json
+     * @return
+     */
+    @RequestMapping(value = "/chooseAttach", method = RequestMethod.POST, produces = "application/json")
+    public ResultMap chooseAttach(@RequestBody String json) {
+        JSONObject jsonObject = FastjsonUtils.fromJson(json, JSONObject.class);
+        try {
+            String chooseAttach = jsonObject.getString("chooseAttach");
+            ProductAttachSubmit submit = FastjsonUtils.fromJson(jsonObject.getString("submit"), ProductAttachSubmit.class);
+            return productAttachService.chooseAttach(chooseAttach,submit);
+        } catch (ClassCastException e) {
+            return new ResultMap(CodeType.PARAMETER_ERROR, "参数内容错误,请重新确认申请信息");
+        }
+
+    }
+}

+ 12 - 1
src/main/java/com/uas/platform/b2c/prod/commodity/controller/ProductController.java

@@ -245,7 +245,7 @@ public class ProductController {
 	}
 
     /**
-     * 保存对产品包装,包装数量,生产日期的修改
+     * 更新物料信息(品牌、物料名称(类目),型号、规格、规格书)
      *
      * @param product the product 修改的产品
      * @return the string
@@ -409,4 +409,15 @@ public class ProductController {
 	public ResultMap batchPutOn(Integer standard, String ids) {
 		return productService.batchPutOn(standard, ids);
 	}
+
+	/**
+	 * 更新物料信息(品牌、物料名称(类目),型号、规格、规格书)
+	 *
+	 * @param json 修改的产品
+	 * @Param attachUrl 规格书的url
+	 */
+	@RequestMapping(value = "/update/product", method = RequestMethod.POST)
+	public ResultMap updateProduct(@RequestBody String json, String attachUrl){
+		return productService.updateProduct(json, attachUrl);
+	}
 }

+ 51 - 1
src/main/java/com/uas/platform/b2c/prod/commodity/dao/GoodsDao.java

@@ -422,6 +422,15 @@ public interface GoodsDao extends JpaSpecificationExecutor<Goods>, JpaRepository
     @Query(value = "select g from Goods g where g.batchid = :batchid")
 	public List<Goods> findByBatchid(@Param("batchid") String batchid);
 
+    /**
+     * Count by StoreUuid and Kindid
+      * @param uuid 店铺uuid
+     * @param kindid 类目id
+     * @return
+     */
+    @Query(value = "select count(1) from trade$goods where go_storeid = :uuid and go_kind_uuid in (:kindids) and go_status=601", nativeQuery = true)
+    Integer CountByStoreUuidAndKindid(@Param("uuid") String uuid, @Param("kindids") List<Long> kindids);
+
     /**
      * 获取店铺的所有类目信息
      *
@@ -642,7 +651,7 @@ public interface GoodsDao extends JpaSpecificationExecutor<Goods>, JpaRepository
 	 * @param storeUuid
 	 * @return
 	 */
-	@Query(value = "select count(g) from Goods g where g.storeid = :storeUuid and g.status = 601 and g.kindNameCn is null")
+	@Query(value = "select count(1) from Goods g where g.storeid = :storeUuid and g.status = 601 and g.uuid is null")
 	int findNonstandardGoodsCount(@Param("storeUuid") String storeUuid);
 
 
@@ -777,4 +786,45 @@ public interface GoodsDao extends JpaSpecificationExecutor<Goods>, JpaRepository
      */
     @Query(value = "select distinct g.enUU from Goods g where g.storeid = :storeid")
     Long findenUUByStoreid(@Param("storeid") String storeid);
+
+    /**
+     * 根据店铺id查找店铺所有有效在售批次数量
+     * @param storeid
+     * @return
+     */
+    @Query(value = "select count(1) from Goods g where g.storeid = :storeid and g.status = 601")
+    Integer countByStoreid(@Param("storeid") String storeid);
+
+    /**
+     * 通过类目名称获取品牌uuid不为空的前5个批次
+     * @param kind
+     * @return
+     */
+    @Query(nativeQuery = true, value = "select * from trade$goods where br_name_uuid is not null and ki_name=:kind and go_status = 601 limit 0,8")
+    List<Goods> findByKindNameCnAndBrandIsNotNull(@Param("kind")String kind);
+
+    /**
+     * 通过类目名称获取品牌uuid不为空的前5个批次
+     * @param kinds 类目名称
+     * @return
+     */
+    @Query(nativeQuery = true, value = "select * from trade$goods where br_name_uuid is not null and ki_name in (:kind) and go_status = 601 limit 0,8")
+    List<Goods> findInKindNamesAndBrandIsNotNull(@Param("kind")List<String> kinds);
+
+    /**
+     * 根据物料信息更更新在售产品
+     * @param brandCn 中文品牌
+     * @param brandEn 英文品牌
+     * @param brandid 品牌id
+     * @param branduuid 品牌uuid
+     * @param kiName 类目
+     * @param kindId 类目id
+     * @param img 图片
+     * @param cmpUuid uuid
+     * @param spec 规格
+     * @param productid 物料的id
+     */
+    @Modifying
+    @Query(nativeQuery = true, value = "update trade$goods g set g.br_name_cn = :brandCn, g.br_name_en = :brandEn, g.br_name_id = :brandid, g.br_name_uuid = :branduuid, g.ki_name = :kiName, g.go_kind_uuid = :kindId, g.cmp_img = :img, g.cmp_uuid = :cmpUuid, g.go_spec = :spec where g.go_productid = :productid")
+    void updateGoodsByProduct(@Param("brandCn") String brandCn, @Param("brandEn") String brandEn, @Param("brandid") Long brandid, @Param("branduuid") String branduuid, @Param("kiName") String kiName, @Param("kindId") Long kindId, @Param("img") String img, @Param("cmpUuid") String cmpUuid, @Param("spec") String spec, @Param("productid") Long productid);
 }

+ 34 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/dao/ProductAttachSubmitDao.java

@@ -0,0 +1,34 @@
+package com.uas.platform.b2c.prod.commodity.dao;
+
+import com.uas.platform.b2c.prod.commodity.model.ProductAttachSubmit;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 物料规格书申请
+ * Created by wangyc on 2018/6/26.
+ *
+ * @version 2018/6/26 18:27 wangyc
+ */
+@Repository
+public interface ProductAttachSubmitDao extends JpaRepository<ProductAttachSubmit, Long>, JpaSpecificationExecutor<ProductAttachSubmit> {
+
+    /**
+     * 通过物料id和状态获取物料规格书申请
+     * @return
+     */
+    ProductAttachSubmit findByProductIdAndStatus(Long productId, Integer status);
+
+
+    /**
+     * 通过物料id和状态获取物料规格书申请
+     * @return
+     */
+    @Query(value = "select p from ProductAttachSubmit p where p.productId in (:productIds) and p.status = :status")
+    List<ProductAttachSubmit> findByProductIdsAndStatus(@Param("productIds") List<Long> productIds, @Param("status") Integer status);
+}

+ 8 - 1
src/main/java/com/uas/platform/b2c/prod/commodity/dao/ProductDao.java

@@ -78,7 +78,7 @@ public interface ProductDao extends JpaSpecificationExecutor<Product>, JpaReposi
      * @return
      */
     @Query(nativeQuery = true, value = "select p.* from products p left join product$private pp on pp.pr_id = p.pr_id where " +
-            "p.pr_enuu=:enUU and p.pr_pcmpcode = :pcmpcode and p.pr_pbranden = :pbranden and pp.pr_b2cenabled = :b2cEnabled")
+            "p.pr_enuu=:enUU and p.pr_pcmpcode = :pcmpcode and (p.pr_pbranden = :pbranden or p.pr_pbrand = :pbranden) and pp.pr_b2cenabled = :b2cEnabled")
     List<Product> findByEnUUAndPcmpcodeAndPbrandenAndB2cEnabled(@Param("enUU")Long enUU, @Param("pcmpcode")String pcmpcode, @Param("pbranden")String pbranden, @Param("b2cEnabled")Integer b2cEnabled);
 
     /**
@@ -123,6 +123,13 @@ public interface ProductDao extends JpaSpecificationExecutor<Product>, JpaReposi
      */
     List<Product> findByEnUUAndCmpUuId(Long enuu, String uuid);
 
+    /**
+     * 通过企业uu、标准器件uuid获取标准物料信息
+     * @param uuid 器件的uuid
+     * @return  List<Product>
+     */
+    List<Product> findByCmpUuId(String uuid);
+
     /**
      * 通过企业uu,标准器件uuid,来源获取物料信息
      * @param enuu 企业uu

+ 14 - 2
src/main/java/com/uas/platform/b2c/prod/commodity/model/Goods.java

@@ -77,7 +77,7 @@ public class Goods implements Serializable {
 	/**
 	 * 器件的附件URL
 	 */
-	@Transient
+	@Column(name = "cmp_attach")
 	private String attach;
 
 	/**
@@ -530,9 +530,12 @@ public class Goods implements Serializable {
 	/**
 	 * 规格信息
 	 */
-	@Column(name = "go_spec")
+	@Column(name = "go_spec", length = 4000)
 	private String spec;
 
+	@Transient
+	private ProductAttachSubmit productAttachSubmit;
+
 	@Transient
 	private String selfSale;
 
@@ -1686,4 +1689,13 @@ public class Goods implements Serializable {
 		this.spec = spec;
 		return this;
 	}
+
+	public ProductAttachSubmit getProductAttachSubmit() {
+		return productAttachSubmit;
+	}
+
+	public Goods setProductAttachSubmit(ProductAttachSubmit productAttachSubmit) {
+		this.productAttachSubmit = productAttachSubmit;
+		return this;
+	}
 }

+ 16 - 1
src/main/java/com/uas/platform/b2c/prod/commodity/model/GoodsHistory.java

@@ -412,9 +412,15 @@ public class GoodsHistory {
 	/**
 	 * 规格信息
 	 */
-	@Column(name = "go_spec")
+	@Column(name = "go_spec", length = 4000)
 	private String spec;
 
+	/**
+	 * 器件的附件URL
+	 */
+	@Column(name = "cmp_attach")
+	private String attach;
+
 	/**
 	 * 分段价格
 	 */
@@ -1186,4 +1192,13 @@ public class GoodsHistory {
 		this.spec = spec;
 		return this;
 	}
+
+	public String getAttach() {
+		return attach;
+	}
+
+	public GoodsHistory setAttach(String attach) {
+		this.attach = attach;
+		return this;
+	}
 }

+ 1 - 1
src/main/java/com/uas/platform/b2c/prod/commodity/model/GoodsSimple.java

@@ -224,7 +224,7 @@ public class GoodsSimple {
 	/**
 	 * 规格信息
 	 */
-	@Column(name ="go_spec")
+	@Column(name ="go_spec", length = 4000)
 	private String spec;
 
 	/**

+ 377 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/model/ProductAttachSubmit.java

@@ -0,0 +1,377 @@
+package com.uas.platform.b2c.prod.commodity.model;
+
+import com.uas.platform.b2c.common.account.model.Enterprise;
+import com.uas.platform.b2c.common.account.model.UserBaseInfo;
+import com.uas.platform.b2c.core.constant.Status;
+import com.uas.platform.b2c.prod.product.brand.modal.BrandInfo;
+import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 物料规格书申请
+ * Created by wangyc on 2018/6/26.
+ *
+ * @version 2018/6/26 17:19 wangyc
+ */
+@Entity
+@Table(name = "product$attach_submit")
+public class ProductAttachSubmit implements Serializable{
+
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    @Column(name = "as_id")
+    private Long id;
+
+    /**
+     * 物料id
+     */
+    @Column(name = "as_productid")
+    private Long productId;
+
+    /**
+     * 上传的规格书
+     */
+    @Column(name = "as_uploadattach", nullable = false)
+    private String uploadAttach = "";
+
+    /**
+     * 物料
+     */
+    @Transient
+    private Product product;
+
+    /**
+     * 型号
+     */
+    @Column(name = "code")
+    private String code;
+
+    /**
+     * 创建时间
+     */
+    @Column(name = "as_createtime")
+    private Date createTime;
+
+    /**
+     * 提交人uu
+     */
+    @Column(name = "as_submituu")
+    private Long submitUu;
+
+    /**
+     * 提交人企业
+     */
+    @Column(name = "as_submitenuu")
+    private Long submitEnuu;
+
+    /**
+     * 提交人信息
+     */
+    @OneToOne(cascade = { CascadeType.REFRESH })
+    @JoinColumn(name = "as_submituu", insertable = false, updatable = false)
+    private UserBaseInfo submiter;
+
+    /**
+     * 提交企业
+     */
+    @OneToOne(cascade = { CascadeType.REFRESH })
+    @JoinColumn(name = "as_submitenuu", insertable = false, updatable = false)
+    private Enterprise submitEn;
+
+    /**
+     * 匹配标准器件的uuid
+     */
+    @Column(name = "as_uuid", nullable = false)
+    private String uuid = "";
+
+    /**
+     * 审核状态
+     * 待审核 UNAUDIT 311
+     * 审核通过 AUDITED 102
+     * 未通过 NOTALLOW 103
+     */
+    @Column(name = "as_status", nullable = false)
+    private Integer status = Status.UNAUDIT.value();
+
+    /**
+     * 审核时间
+     */
+    @Column(name = "as_audittime")
+    private Date auditTime;
+
+    /**
+     * 审核人uu
+     */
+    @Column(name = "as_audituu")
+    private Long auditUu;
+
+    /**
+     * 审核人企业uu
+     */
+    @Column(name = "as_auditenuu")
+    private Long auditEnuu;
+
+    /**
+     * 审核人信息
+     */
+    @Transient
+    private UserBaseInfo auditer;
+
+    /**
+     * 审核企业信息
+     */
+    @Transient
+    private Enterprise auditEn;
+
+    /**
+     * 商城类目id
+     */
+    @Column(name = "as_kindId")
+    private Long kindId;
+
+    /**
+     * 商城品牌id
+     */
+    @Column(name = "as_brandId")
+    private Long brandId;
+
+    /**
+     * 商城品牌信息
+     */
+    @Transient
+    private BrandInfo brand;
+
+    /**
+     * 商城类目信息
+     */
+    @Transient
+    private KindInfo kind;
+
+    /**
+     * 商城规格
+     */
+    @Column(name = "as_spec", length = 4000)
+    private String spec;
+
+    /**
+     * 已匹配标准型号的规格书
+     */
+    @Column(name = "as_mallattach")
+    private String mallAttach;
+
+    /**
+     * 原因
+     */
+    @Column(name = "as_reason")
+    private String reason;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getProductId() {
+        return productId;
+    }
+
+    public void setProductId(Long productId) {
+        this.productId = productId;
+    }
+
+    public String getUploadAttach() {
+        return uploadAttach;
+    }
+
+    public void setUploadAttach(String uploadAttach) {
+        this.uploadAttach = uploadAttach;
+    }
+
+    public Product getProduct() {
+        return product;
+    }
+
+    public void setProduct(Product product) {
+        this.product = product;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Long getSubmitUu() {
+        return submitUu;
+    }
+
+    public void setSubmitUu(Long submitUu) {
+        this.submitUu = submitUu;
+    }
+
+    public Long getSubmitEnuu() {
+        return submitEnuu;
+    }
+
+    public void setSubmitEnuu(Long submitEnuu) {
+        this.submitEnuu = submitEnuu;
+    }
+
+    public UserBaseInfo getSubmiter() {
+        return submiter;
+    }
+
+    public void setSubmiter(UserBaseInfo submiter) {
+        this.submiter = submiter;
+    }
+
+    public String getUuid() {
+        return uuid;
+    }
+
+    public void setUuid(String uuid) {
+        this.uuid = uuid;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Date getAuditTime() {
+        return auditTime;
+    }
+
+    public void setAuditTime(Date auditTime) {
+        this.auditTime = auditTime;
+    }
+
+    public Long getAuditUu() {
+        return auditUu;
+    }
+
+    public void setAuditUu(Long auditUu) {
+        this.auditUu = auditUu;
+    }
+
+    public Long getAuditEnuu() {
+        return auditEnuu;
+    }
+
+    public void setAuditEnuu(Long auditEnuu) {
+        this.auditEnuu = auditEnuu;
+    }
+
+    public UserBaseInfo getAuditer() {
+        return auditer;
+    }
+
+    public void setAuditer(UserBaseInfo auditer) {
+        this.auditer = auditer;
+    }
+
+    public Long getKindId() {
+        return kindId;
+    }
+
+    public void setKindId(Long kindId) {
+        this.kindId = kindId;
+    }
+
+    public Long getBrandId() {
+        return brandId;
+    }
+
+    public void setBrandId(Long brandId) {
+        this.brandId = brandId;
+    }
+
+    public BrandInfo getBrand() {
+        return brand;
+    }
+
+    public void setBrand(BrandInfo brand) {
+        this.brand = brand;
+    }
+
+    public KindInfo getKind() {
+        return kind;
+    }
+
+    public void setKind(KindInfo kind) {
+        this.kind = kind;
+    }
+
+    public String getSpec() {
+        return spec;
+    }
+
+    public void setSpec(String spec) {
+        this.spec = spec;
+    }
+
+    public String getMallAttach() {
+        return mallAttach;
+    }
+
+    public void setMallAttach(String mallAttach) {
+        this.mallAttach = mallAttach;
+    }
+
+    public String getReason() {
+        return reason;
+    }
+
+    public void setReason(String reason) {
+        this.reason = reason;
+    }
+
+    public Enterprise getAuditEn() {
+        return auditEn;
+    }
+
+    public ProductAttachSubmit setAuditEn(Enterprise auditEn) {
+        this.auditEn = auditEn;
+        return this;
+    }
+
+    public Enterprise getSubmitEn() {
+        return submitEn;
+    }
+
+    public ProductAttachSubmit setSubmitEn(Enterprise submitEn) {
+        this.submitEn = submitEn;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "ProductAttachSubmit{" + "id=" + id + ", productId=" + productId
+            + ", uploadAttach='" + uploadAttach + '\'' + ", product=" + product + ",code=" + code
+            + ", createTime=" + createTime + ", submitUu=" + submitUu + ", submitEnuu=" + submitEnuu
+            + ", submiter=" + submiter + ", submitEn=" + submitEn + ", uuid='" + uuid + '\'' + ", status=" + status
+            + ", auditTime=" + auditTime + ", auditUu=" + auditUu + ", auditEnuu=" + auditEnuu
+            + ", auditer=" + auditer + ", auditEn=" + auditEn + ", kindId=" + kindId + ", brandId=" + brandId
+            + ", spec='" + spec + '\'' + ", mallAttach='" + mallAttach + '\'' + ", reason='" + reason + '\'' + '}';
+    }
+}

+ 16 - 1
src/main/java/com/uas/platform/b2c/prod/commodity/model/ProductPrivate.java

@@ -32,7 +32,13 @@ public class ProductPrivate {
      * goods表信息中存在多少条数据
      */
     @Column(name = "pr_batchcount")
-    private Integer batchCount;
+    private Integer batchCount = 0;
+
+    /**
+     * 附件字段
+     */
+    @Column(name = "pr_attach")
+    private String attach = "";
 
     public Long getId() {
         return id;
@@ -65,4 +71,13 @@ public class ProductPrivate {
     public void setBatchCount(Integer batchCount) {
         this.batchCount = batchCount;
     }
+
+    public String getAttach() {
+        return attach;
+    }
+
+    public ProductPrivate setAttach(String attach) {
+        this.attach = attach;
+        return this;
+    }
 }

+ 16 - 1
src/main/java/com/uas/platform/b2c/prod/commodity/model/ReleaseProductByBatch.java

@@ -548,6 +548,12 @@ public class ReleaseProductByBatch implements Serializable {
 	@Column(name = "rel_productid")
 	private Long productid;
 
+	/**
+	 * 规格书信息
+	 */
+	@Column(name = "rel_attach")
+	private String attach;
+
 //	private Short repeat;
 
 	@Override
@@ -723,7 +729,7 @@ public class ReleaseProductByBatch implements Serializable {
 	}
 
 	/**
-	 * 交期赋值逻辑较为复杂,在调用类进行赋值
+	 * 规格信息
 	 * @param value
 	 */
 	public void setSpecByExcel(Object value) {
@@ -1800,6 +1806,15 @@ public class ReleaseProductByBatch implements Serializable {
 		this.thick = thick;
 	}
 
+	public String getAttach() {
+		return attach;
+	}
+
+	public ReleaseProductByBatch setAttach(String attach) {
+		this.attach = attach;
+		return this;
+	}
+
 	public Long getProductid() {
 		return productid;
 	}

+ 27 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/model/V_ProductPerson.java

@@ -274,6 +274,15 @@ public class V_ProductPerson implements Serializable{
     @Column(name = "user_uu")
     private Long ppUserUU;
 
+    /**
+     * 规格书
+     */
+    @Column(name = "pr_attach")
+    private String attach;
+
+    @Transient
+    private ProductAttachSubmit productAttachSubmit;
+
     /**
      * 该物料的所有替代物料
      */
@@ -607,4 +616,22 @@ public class V_ProductPerson implements Serializable{
     public void setProductReplaceList(List<ProductReplace> productReplaceList) {
         this.productReplaceList = productReplaceList;
     }
+
+    public ProductAttachSubmit getProductAttachSubmit() {
+        return productAttachSubmit;
+    }
+
+    public V_ProductPerson setProductAttachSubmit(ProductAttachSubmit productAttachSubmit) {
+        this.productAttachSubmit = productAttachSubmit;
+        return this;
+    }
+
+    public String getAttach() {
+        return attach;
+    }
+
+    public V_ProductPerson setAttach(String attach) {
+        this.attach = attach;
+        return this;
+    }
 }

+ 27 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/model/V_ProductPrivate.java

@@ -290,6 +290,15 @@ public class V_ProductPrivate implements Serializable {
     @Column(name = "pr_erpdown")
     private String erpDown;
 
+    /**
+     * 规格书
+     */
+    @Column(name = "pr_attach")
+    private String attach;
+
+    @Transient
+    private ProductAttachSubmit productAttachSubmit;
+
     public Long getId() {
         return id;
     }
@@ -626,4 +635,22 @@ public class V_ProductPrivate implements Serializable {
         this.erpDown = erpDown;
         return this;
     }
+
+    public ProductAttachSubmit getProductAttachSubmit() {
+        return productAttachSubmit;
+    }
+
+    public V_ProductPrivate setProductAttachSubmit(ProductAttachSubmit productAttachSubmit) {
+        this.productAttachSubmit = productAttachSubmit;
+        return this;
+    }
+
+    public String getAttach() {
+        return attach;
+    }
+
+    public V_ProductPrivate setAttach(String attach) {
+        this.attach = attach;
+        return this;
+    }
 }

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

@@ -3,6 +3,7 @@ package com.uas.platform.b2c.prod.commodity.service;
 import com.uas.api.b2c_erp.seller.model.GoodsFUas;
 import com.uas.api.b2c_erp.seller.model.GoodsSimpleUas;
 import com.uas.platform.b2c.prod.commodity.model.*;
+import com.uas.platform.b2c.prod.product.component.modal.Component;
 import com.uas.platform.b2c.trade.order.model.Order;
 import com.uas.platform.b2c.trade.presale.model.Cart;
 import com.uas.platform.b2c.trade.presale.model.GoodsBrowsingHistory;
@@ -747,4 +748,25 @@ public interface GoodsService {
      * @param goodses       the param
      */
     void updateSpecByProducts(List<V_ProductPrivate> privateList, List<Goods> goodses);
+
+    /**
+     * 获取pcb推荐物料
+     * @return
+     */
+    Map<String, List<Goods>> getCmsPcb();
+
+    /**
+     * 根据产品更新在售产品
+     * @param product 产品信息
+     * @return
+     */
+    void updateGoodsByProduct(Product product);
+
+
+    /**
+     * 根据产品更新在售产品
+     * @param component 产品信息
+     * @return Component 根据标准器件更新物料
+     */
+    void updateGoodsByComponent(Component component);
 }

+ 73 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/service/ProductAttachService.java

@@ -0,0 +1,73 @@
+package com.uas.platform.b2c.prod.commodity.service;
+
+import com.uas.platform.b2c.prod.commodity.model.ProductAttachSubmit;
+import com.uas.platform.b2c.trade.support.ResultMap;
+import com.uas.platform.core.model.PageParams;
+import org.springframework.data.domain.Page;
+
+import java.util.List;
+
+/**
+ * 物料规格书接口
+ * Created by wangyc on 2018/6/26.
+ *
+ * @version 2018/6/26 18:10 wangyc
+ */
+public interface ProductAttachService {
+
+    /**
+     * 分页获取申请列表
+     * @param params 分页参数
+     * @param keywords 关键词
+     * @param status 状态
+     * @return
+     */
+    Page<ProductAttachSubmit> getPageInfo(PageParams params, String keywords, String status);
+
+    /**
+     * 获取单条申请信息
+     * @param id 申请id
+     * @return
+     */
+    ProductAttachSubmit getOne(Long id);
+
+    /**
+     * 物料上传规格书申请
+     * @param productId 物料id
+     * @param attach 规格书
+     * @return
+     */
+    ProductAttachSubmit submit(Long productId, String attach);
+
+
+    /**
+     * 物料上传规格书申请
+     * @param productids 物料id
+     * @param status 规格书
+     * @return
+     */
+    List<ProductAttachSubmit> findByProductidsAndStatus(List<Long> productids, Integer status);
+
+    /**
+     * 物料审核通过
+     * @param submit 申请内容
+     * @return
+     */
+    ResultMap auditSuccess(ProductAttachSubmit submit);
+
+    /**
+     * 物料审核不通过
+     * @param submitId 申请id
+     * @param reason 原因
+     * @return
+     */
+    ResultMap auditFailed(Long submitId, String reason);
+
+    /**
+     * 选择确认最终规格书
+     * @param attach
+     * @param productAttachSubmit
+     * @return
+     */
+    ResultMap chooseAttach(String attach, ProductAttachSubmit productAttachSubmit);
+}

+ 43 - 1
src/main/java/com/uas/platform/b2c/prod/commodity/service/ProductService.java

@@ -2,10 +2,10 @@ package com.uas.platform.b2c.prod.commodity.service;
 
 import com.alibaba.fastjson.JSONObject;
 import com.uas.platform.b2c.prod.commodity.model.*;
+import com.uas.platform.b2c.prod.product.component.modal.Component;
 import com.uas.platform.b2c.trade.order.model.Purchase;
 import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.model.PageInfo;
-import com.uas.platform.core.model.PageParams;
 import org.springframework.data.domain.Page;
 
 import java.util.List;
@@ -134,6 +134,16 @@ public interface ProductService {
      */
     public String updateProduct(Product product);
 
+
+    /**
+     * 修改物料的品牌、物料名称、型号、规格、规格书等信息
+     *
+     * @param json 修改的物料信息
+     * @param attachUrl 规格书的地址
+     * @return the string
+     */
+    ResultMap updateProduct(String json, String attachUrl);
+
     /**
      * 根据库存信息 保存对产品包装,包装数量,生产日期的修改
      *
@@ -264,4 +274,36 @@ public interface ProductService {
      */
     Double getQtyInOrderToBeUpload(List<String> batches);
 
+
+    /**
+     * 根据品牌和型号标准器件
+     * @param brName
+     * @param cmpCode
+     * @return
+     */
+    Component findBybrNameAndcmpCode(String brName, String cmpCode);
+
+
+    /**
+     * 更新物料信息根据标准器件
+     * @param productid 物料id
+     * @param componentUuid 器件uuid
+     * @return
+     */
+    ResultMap updateProductByComponent(Long productid, String componentUuid);
+
+    /**
+     * 更新物料信息
+     * @param product 物料信息
+     * @param component 器件信息
+     * @return ResultMap
+     */
+    ResultMap updateProductByComponent(Product product, Component component);
+
+    /**
+     * 更新物料信息
+     * @param component 器件信息
+     * @return ResultMap
+     */
+    ResultMap updateProductByComponent(Component component);
 }

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

@@ -1,7 +1,5 @@
 package com.uas.platform.b2c.prod.commodity.service.impl;
 
-import static com.uas.platform.core.persistence.criteria.PredicateUtils.like;
-
 import com.alibaba.fastjson.JSONObject;
 import com.uas.api.b2c_erp.core.model.OperateErrorStatus;
 import com.uas.api.b2c_erp.seller.model.GoodsFUas;
@@ -19,55 +17,16 @@ import com.uas.platform.b2c.core.constant.ShortConstant;
 import com.uas.platform.b2c.core.constant.SplitChar;
 import com.uas.platform.b2c.core.constant.Status;
 import com.uas.platform.b2c.core.support.SystemSession;
-import com.uas.platform.b2c.core.utils.DoubleArith;
-import com.uas.platform.b2c.core.utils.FastjsonUtils;
-import com.uas.platform.b2c.core.utils.NumberUtil;
-import com.uas.platform.b2c.core.utils.RegexConstant;
+import com.uas.platform.b2c.core.utils.*;
 import com.uas.platform.b2c.external.erp.commodity.util.ModelConverter;
 import com.uas.platform.b2c.prod.commodity.constant.DoubleConstant;
 import com.uas.platform.b2c.prod.commodity.constant.IntegerConstant;
 import com.uas.platform.b2c.prod.commodity.constant.StringConstant;
-import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
-import com.uas.platform.b2c.prod.commodity.dao.GoodsHistoryDao;
-import com.uas.platform.b2c.prod.commodity.dao.GoodsSimpleDao;
-import com.uas.platform.b2c.prod.commodity.dao.PCBDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductDetailDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductPrivateDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductStandardPutOnInfoDao;
-import com.uas.platform.b2c.prod.commodity.model.*;
 import com.uas.platform.b2c.prod.commodity.constant.UploadConstant;
-import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
-import com.uas.platform.b2c.prod.commodity.dao.GoodsHistoryDao;
-import com.uas.platform.b2c.prod.commodity.dao.GoodsModifyInfoDao;
-import com.uas.platform.b2c.prod.commodity.dao.GoodsSimpleDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductDetailDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductPrivateDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductStandardPutOnInfoDao;
-import com.uas.platform.b2c.prod.commodity.model.Goods;
-import com.uas.platform.b2c.prod.commodity.model.GoodsHistory;
+import com.uas.platform.b2c.prod.commodity.dao.*;
+import com.uas.platform.b2c.prod.commodity.model.*;
 import com.uas.platform.b2c.prod.commodity.model.GoodsHistory.OperateType;
-import com.uas.platform.b2c.prod.commodity.service.GoodsHistoryService;
-import com.uas.platform.b2c.prod.commodity.service.GoodsPriceInfoService;
-import com.uas.platform.b2c.prod.commodity.service.GoodsService;
-import com.uas.platform.b2c.prod.commodity.service.ProductService;
-import com.uas.platform.b2c.prod.commodity.service.ProductStandardPutOnInfoService;
-import com.uas.platform.b2c.prod.commodity.service.ReleaseProductByBatchService;
-import com.uas.platform.b2c.prod.commodity.model.GoodsInfo;
-import com.uas.platform.b2c.prod.commodity.model.GoodsPriceInfo;
-import com.uas.platform.b2c.prod.commodity.model.GoodsQtyPrice;
-import com.uas.platform.b2c.prod.commodity.model.GoodsSimple;
-import com.uas.platform.b2c.prod.commodity.model.Product;
-import com.uas.platform.b2c.prod.commodity.model.ProductDetail;
-import com.uas.platform.b2c.prod.commodity.model.ProductPrivate;
-import com.uas.platform.b2c.prod.commodity.model.ProductStandardPutOnInfo;
-import com.uas.platform.b2c.prod.commodity.service.GoodsHistoryService;
-import com.uas.platform.b2c.prod.commodity.service.GoodsPriceInfoService;
-import com.uas.platform.b2c.prod.commodity.service.GoodsService;
-import com.uas.platform.b2c.prod.commodity.service.ProductService;
-import com.uas.platform.b2c.prod.commodity.service.ProductStandardPutOnInfoService;
-import com.uas.platform.b2c.prod.commodity.service.ReleaseProductByBatchService;
+import com.uas.platform.b2c.prod.commodity.service.*;
 import com.uas.platform.b2c.prod.commodity.status.ModifyInfoStatus;
 import com.uas.platform.b2c.prod.commodity.type.ModifyConstant;
 import com.uas.platform.b2c.prod.commodity.util.GoodsUtil;
@@ -105,44 +64,18 @@ import com.uas.platform.b2c.trade.support.CodeType;
 import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.b2c.trade.util.BoundedExecutor;
 import com.uas.platform.core.exception.IllegalOperatorException;
-import com.uas.platform.core.model.Constant;
-import com.uas.platform.core.model.EncodingRulesConstant;
-import com.uas.platform.core.model.PageInfo;
-import com.uas.platform.core.model.PageParams;
-import com.uas.platform.core.model.Type;
+import com.uas.platform.core.model.*;
 import com.uas.platform.core.persistence.criteria.CriterionExpression;
 import com.uas.platform.core.persistence.criteria.CriterionExpression.Operator;
 import com.uas.platform.core.persistence.criteria.LogicalExpression;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
 import com.uas.platform.core.persistence.criteria.SimpleExpression;
 import com.uas.platform.core.util.StringUtil;
-import java.math.BigInteger;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collections;
-import java.util.Date;
-import java.util.GregorianCalendar;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
+import com.uas.platform.core.util.serializer.FlexJsonUtils;
 import org.apache.commons.beanutils.ConvertUtils;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
+import org.apache.commons.collections.map.HashedMap;
 import org.apache.log4j.Logger;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.Row;
@@ -172,24 +105,13 @@ import javax.servlet.http.HttpServletRequest;
 import java.math.BigInteger;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collections;
-import java.util.Date;
-import java.util.GregorianCalendar;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import static com.uas.platform.core.persistence.criteria.PredicateUtils.like;
-import static org.apache.commons.jexl2.parser.ParserConstants.and;
 
 
 /**
@@ -310,6 +232,9 @@ public class GoodsServiceImpl implements GoodsService {
     @Autowired
     private GoodsModifyInfoDao goodsModifyInfoDao;
 
+    @Autowired
+    private ProductAttachService productAttachService;
+
     private final Logger logger = Logger.getLogger(getClass());
 
     @Autowired
@@ -1428,6 +1353,7 @@ public class GoodsServiceImpl implements GoodsService {
      * @TODO 各种检查
      * @MustBeDoneBefore 2016年4月25日11:54:00
      */
+    @Transactional
     @Override
     public ResultMap updateGoods(Goods goods) {
         Goods resultGoods = null;
@@ -1446,6 +1372,15 @@ public class GoodsServiceImpl implements GoodsService {
         if (StringUtils.isEmpty(goods.getTag())) {
             return new ResultMap(CodeType.NOT_PERMIT.code(), "产品自定义标签必须填写");
         }
+        if ((!StringUtils.isEmpty(goods.getAttach())) && StringUtils.isEmpty(nowGoods.getAttach())) {
+            productAttachService.submit(goods.getProductid(), goods.getAttach());
+        }
+        ResultMap resultMap = compareGoodsIfModifyProductInfo(goods, nowGoods);
+        if (resultMap.getCode() == CodeType.OK.code()) {
+            nowGoods = goodsDao.findByBatchCode(nowGoods.getBatchCode());
+        } else if (resultMap.getCode() != CodeType.OK.code()) {
+            return resultMap;
+        }
         List<Goods> tagInTheProdNums = goodsDao.findSameTagInTheProdNum(goods.getProdNum(), goods.getTag());
         for (Goods tagInTheProdNum : tagInTheProdNums) {
             if (goods.getTag().equals(tagInTheProdNum.getTag()) && (goods.getId().longValue() != tagInTheProdNum.getId().longValue())) {
@@ -1466,6 +1401,32 @@ public class GoodsServiceImpl implements GoodsService {
         return ResultMap.success(resultGoods);
     }
 
+
+    /**
+     * 比较是否修改了物料信息,如果修改了物料信息
+     * @param goodsFromFore 前端修改
+     * @param goodsFromSql 数据库获取的
+     * @return
+     */
+    public ResultMap compareGoodsIfModifyProductInfo(Goods goodsFromFore, Goods goodsFromSql) {
+        if (goodsFromFore == null || goodsFromSql == null) {
+            return new ResultMap(CodeType.OK, "信息未修改");
+        } else {
+            if ((!StringUtilB2C.equals(goodsFromFore.getSpec(), goodsFromSql.getSpec())) || (!StringUtilB2C.equals(goodsFromFore.getBrandNameEn(), goodsFromSql.getBrandNameEn())) || (!StringUtilB2C.equals(goodsFromFore.getCode(), goodsFromSql.getCode())) || (!StringUtilB2C.equals(goodsFromFore.getKindNameCn(), goodsFromSql.getKindNameCn()))) {
+                Product product = new Product();
+                product.setPbranden(goodsFromFore.getBrandNameEn());
+                product.setPcmpcode(goodsFromFore.getCode());
+                product.setId(goodsFromFore.getProductid());
+                product.setKind(goodsFromFore.getKindNameCn());
+                product.setSpec(goodsFromFore.getSpec());
+                ResultMap resultMap = productService.updateProduct(FlexJsonUtils.toJson(product), null);
+                return resultMap;
+            } else {
+                return new ResultMap(CodeType.OK, "物料未更新");
+            }
+        }
+    }
+
     /**
      * 比较两个Goods,得出修改后的信息
      * @param beforeGoods 原有的Goods
@@ -1903,7 +1864,7 @@ public class GoodsServiceImpl implements GoodsService {
 			uuids.add(nowGoods.getBatchCode());
 			recommendProductService.deleteProductsWhenSellerUpdateReserve(storeuuid, uuids);
 		} else {
-            recommendProductService.updateRecommendProductInfo(nowGoods);
+            // recommendProductService.updateRecommendProductInfo(nowGoods);
         }
 		return nowGoods;
 	}
@@ -2570,7 +2531,10 @@ public class GoodsServiceImpl implements GoodsService {
                     }
                     componentMap.put(goods.getUuid(), component);
                 }
-                goods.setAttach(component.getAttach());
+                if (StringUtils.isEmpty(goods.getAttach())) {
+                    goods.setAttach(component.getAttach());
+                }
+
                 goods.setBrand(component.getBrand());
             }
         }
@@ -2589,32 +2553,33 @@ public class GoodsServiceImpl implements GoodsService {
         if (StringUtils.isEmpty(storeid)) {
             return null;
         }
-        pageInfo.expression(PredicateUtils.or(new SimpleExpression[]{PredicateUtils.eq("status", 601, true), PredicateUtils.eq("status", 602, true)}));
+        // pageInfo.expression(PredicateUtils.or(new SimpleExpression[]{PredicateUtils.eq("status", 601, true), PredicateUtils.eq("status", 602, true)}));
+        pageInfo.expression(PredicateUtils.eq("status", 601, true));
         pageInfo.sorting(Sort.Direction.DESC, "updateDate");
         pageInfo.expression(PredicateUtils.eq("storeid", storeid, false));
         if (StringUtils.hasText(kindUuid)) {
             // 如果包含多个叶子类目ID,则获取所有的叶子类目对应的商品信息
-            if (kindUuid.equals("其他")) {
+            if ("其他".equals(kindUuid) || "-10".equals(kindUuid)) {
                 pageInfo.expression(PredicateUtils.isNull("uuid"));
             } else {
                 if (kindUuid.contains(",")) {
                     String[] kindIds = kindUuid.split(",");
                     Long[] listkids = (Long[]) ConvertUtils.convert(kindIds,Long.class);
                     if (listkids != null && listkids.length > 0) {
-//                        List<Long> productIds = pcbDao.findByKindIds(listkids);
-//                        if (!CollectionUtils.isEmpty(productIds)) {
-//                            pageInfo.expression(PredicateUtils.in("productid",productIds,false));
-//                        } else {
+                        List<Long> productIds = pcbDao.findByKindIds(listkids);
+                        if (!CollectionUtils.isEmpty(productIds)) {
+                            pageInfo.expression(PredicateUtils.in("productid",productIds,false));
+                        } else {
                             pageInfo.expression(PredicateUtils.in("kindUuid", kindIds, false));
-//                        }
+                        }
                     }
                 } else {
-//                    List<Long> productId = pcbDao.findProductIdByKindid(Long.parseLong(kindUuid));
-//                    if (!CollectionUtils.isEmpty(productId)) {
-//                        pageInfo.expression(PredicateUtils.eq("productid",productId.get(0),false));
-//                    } else {
+                    List<Long> productId = pcbDao.findProductIdByKindid(Long.parseLong(kindUuid));
+                    if (!CollectionUtils.isEmpty(productId)) {
+                        pageInfo.expression(PredicateUtils.eq("productid",productId.get(0),false));
+                    } else {
                         pageInfo.expression(PredicateUtils.eq("kindUuid", kindUuid, false));
-//                    }
+                    }
                 }
             }
         }
@@ -2636,7 +2601,7 @@ public class GoodsServiceImpl implements GoodsService {
             }
         }, pageInfo);
         for (Goods goods : goodsPage.getContent()) {
-            if (goods.getUuid() != null) {
+            if (StringUtils.isEmpty(goods.getAttach()) && (goods.getUuid() != null)) {
                 Component component = componentDao.findByUuid(goods.getUuid());
                 if (component != null) {
                     goods.setAttach(component.getAttach());
@@ -2707,13 +2672,29 @@ public class GoodsServiceImpl implements GoodsService {
             expressions.add(logicalExpression2);
         }
         pageInfo.setExpressions(expressions);
-        return goodsDao.findAll(new Specification<Goods>() {
+        Page<Goods> goodses = goodsDao.findAll(new Specification<Goods>() {
             @Override
             public Predicate toPredicate(Root<Goods> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
                 query.where(pageInfo.getPredicates(root, query, builder));
                 return null;
             }
         }, pageInfo);
+        List<Goods> goodses1 = goodses.getContent();
+        List<Long> list = new ArrayList<>();
+        for (Goods goods : goodses1) {
+            if (goods.getProductid() != null) {
+                list.add(goods.getProductid());
+            }
+        }
+        List<ProductAttachSubmit> attachSubmits = productAttachService.findByProductidsAndStatus(list, Status.UNAUDIT.value());
+        for (ProductAttachSubmit attachSubmit : attachSubmits) {
+            for (Goods goods : goodses1) {
+                if ((goods.getProductid() != null) && (attachSubmit.getProductId() != null) && (attachSubmit.getProductId().longValue() == goods.getProductid().longValue())) {
+                    goods.setProductAttachSubmit(attachSubmit);
+                }
+            }
+        }
+        return new PageImpl<Goods>(goodses1, pageInfo, goodses.getTotalElements());
     }
 
     @Override
@@ -3864,7 +3845,7 @@ public class GoodsServiceImpl implements GoodsService {
             }
             goods.setFrozen(getFrozenCount(goods.getBatchCode()));
         }
-        if (goods.getUuid() != null) {
+        if (StringUtils.isEmpty(goods.getAttach()) && goods.getUuid() != null) {
             Component component = componentDao.findByUuid(goods.getUuid());
             if (component != null) {
                 goods.setAttach(component.getAttach());
@@ -3949,7 +3930,7 @@ public class GoodsServiceImpl implements GoodsService {
 
     /**
      * 获取未发货前订单的库存数
-     * @param batchCode
+     * @param detail
      * @return
      */
     private Goods fillDataInGoods(ProductDetail detail) {
@@ -4008,7 +3989,7 @@ public class GoodsServiceImpl implements GoodsService {
             if (!StringUtils.isEmpty(kindid)) {
                 KindInfo kind = kindInfoDao.findOne(Long.valueOf(kindid));
                 if (kind == null) {
-                    throw new IllegalOperatorException("此类目信息不存在,请重新确认类目信息");
+                    throw new IllegalOperatorException("此物料名称(类目)信息不存在,请重新确认物料名称(类目)信息");
                 }
                 // 通过品牌类目信息获取物料id
                 productIds = pcbDao.findProductIdByKindidAndBrandid(kind.getId(), brand.getId());
@@ -4168,4 +4149,118 @@ public class GoodsServiceImpl implements GoodsService {
             goodsHistoryService.save(goodsHistories);
         }
     }
+
+    @Override
+    public Map<String, List<Goods>> getCmsPcb() {
+        Map<String, List<Goods>> map = new HashedMap();
+        List<KindInfo> kindInfos = kindInfoDao.findByParentid(3825L);
+        if (CollectionUtils.isNotEmpty(kindInfos)) {
+            for (KindInfo kindInfo : kindInfos) {
+                // 目前仅展示PCB材料、PCB耗材、PCB设备
+                String secondName = kindInfo.getNameCn();
+                if ("PCB材料".equals(secondName) || "PCB耗材".equals(secondName) || "PCB设备".equals(secondName)) {
+                    if (kindInfo.getIsLeaf().equals(Constant.YES)) {
+                        List<Goods> goods = goodsDao.findByKindNameCnAndBrandIsNotNull(kindInfo.getNameCn());
+                        if (CollectionUtils.isNotEmpty(goods)) {
+                            map.put(kindInfo.getNameCn(), goods);
+                        }
+                    } else {
+                        List<KindInfo> kindInfoChildren = kindInfoDao.findByParentid(kindInfo.getId());
+                        if (!CollectionUtils.isEmpty(kindInfoChildren)) {
+                            List<String> names = new ArrayList<>();
+                            for (KindInfo child : kindInfoChildren) {
+                                names.add(child.getNameCn());
+                            }
+                            if (CollectionUtils.isNotEmpty(names)) {
+                                List<Goods> goods = goodsDao.findInKindNamesAndBrandIsNotNull(names);
+                                if (CollectionUtils.isNotEmpty(goods)) {
+                                    map.put(kindInfo.getNameCn(), goods);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return map;
+    }
+
+
+    /**
+     * 根据产品更新在售产品
+     *
+     * @param product 产品信息
+     * @return
+     */
+    @Transactional
+    @Override
+    public void updateGoodsByProduct(Product product) {
+        if (product == null) {
+            return ;
+        } else {
+            List<GoodsHistory> list = new ArrayList<>();
+            List<ProductPrivate> productPrivates = productPrivateDao.findByPrId(product.getId());
+            ProductPrivate productPrivate = null;
+            if (CollectionUtils.isNotEmpty(productPrivates)) {
+                productPrivate = productPrivates.get(0);
+            }
+            List<Goods> goodses = goodsDao.findByProductId(product.getId());
+            for (Goods goods : goodses) {
+                goods.setSpec(product.getSpec());
+                goods.setAttach(productPrivate.getAttach());
+                goods.setBrandid(product.getPbrandid());
+                goods.setBrandNameCn(product.getPbrand());
+                goods.setBrandNameEn(product.getPbranden());
+                goods.setBranduuid(product.getPbranduuid());
+                goods.setKindUuid(product.getKindid());
+                goods.setKindNameCn(product.getKind());
+                goods.setImg(product.getCmpImg());
+                goods.setCode(product.getPcmpcode());
+                GoodsHistory history = goodsHistoryService.converTGoodsHist(goods, GoodsHistory.OperateType.Update.getPhrase(), false);
+                list.add(history);
+            }
+            if (CollectionUtils.isNotEmpty(goodses)) {
+                goodsDao.save(goodses);
+            }
+            if (CollectionUtils.isNotEmpty(list)) {
+                goodsHistoryService.save(list);
+            }
+        }
+    }
+
+    /**
+     * 根据产品更新在售产品
+     *
+     * @param component 产品信息
+     * @return Component 根据标准器件更新物料
+     */
+    @Override
+    public void updateGoodsByComponent(Component component) {
+        if (component == null) {
+            return ;
+        } else {
+            if ((!StringUtils.isEmpty(component.getAttach())) || (!StringUtils.isEmpty(component.getSpec()))) {
+                List<Goods> goodsList = goodsDao.findByUuid(component.getUuid());
+                List<Goods> goodsList1 = new ArrayList<>();
+                List<GoodsHistory> list = new ArrayList<>();
+                for (Goods goods : goodsList) {
+                    if (StringUtils.isEmpty(goods.getSpec()) || !StringUtilB2C.equals(component.getAttach(), goods.getAttach())) {
+                        if (StringUtils.isEmpty(goods.getSpec())) {
+                            goods.setSpec(component.getSpec());
+                        }
+                        goods.setAttach(component.getAttach());
+                        GoodsHistory history = goodsHistoryService.converTGoodsHist(goods, OperateType.Update.getPhrase(), false);
+                        list.add(history);
+                        goodsList1.add(goods);
+                    }
+                }
+                if (CollectionUtils.isNotEmpty(list)) {
+                    goodsHistoryService.save(list);
+                }
+                if (CollectionUtils.isNotEmpty(goodsList1)) {
+                    goodsDao.save(goodsList1);
+                }
+            }
+        }
+    }
 }

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

@@ -0,0 +1,447 @@
+package com.uas.platform.b2c.prod.commodity.service.impl;
+
+import com.uas.platform.b2c.common.account.dao.EnterpriseDao;
+import com.uas.platform.b2c.common.account.dao.UserBaseInfoDao;
+import com.uas.platform.b2c.common.account.model.Enterprise;
+import com.uas.platform.b2c.common.account.model.UserBaseInfo;
+import com.uas.platform.b2c.core.constant.Status;
+import com.uas.platform.b2c.core.support.SystemSession;
+import com.uas.platform.b2c.prod.commodity.dao.ProductAttachSubmitDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductDao;
+import com.uas.platform.b2c.prod.commodity.model.Product;
+import com.uas.platform.b2c.prod.commodity.model.ProductAttachSubmit;
+import com.uas.platform.b2c.prod.commodity.service.ProductAttachService;
+import com.uas.platform.b2c.prod.commodity.service.ProductService;
+import com.uas.platform.b2c.prod.product.brand.dao.BrandInfoDao;
+import com.uas.platform.b2c.prod.product.brand.modal.BrandInfo;
+import com.uas.platform.b2c.prod.product.component.dao.ComponentDao;
+import com.uas.platform.b2c.prod.product.component.modal.Component;
+import com.uas.platform.b2c.prod.product.component.service.ComponentService;
+import com.uas.platform.b2c.prod.product.kind.dao.KindDao;
+import com.uas.platform.b2c.prod.product.kind.dao.KindInfoDao;
+import com.uas.platform.b2c.prod.product.kind.model.Kind;
+import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
+import com.uas.platform.b2c.trade.support.CodeType;
+import com.uas.platform.b2c.trade.support.ResultMap;
+import com.uas.platform.core.exception.IllegalOperatorException;
+import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
+import com.uas.platform.core.persistence.criteria.CriterionExpression;
+import com.uas.platform.core.persistence.criteria.CriterionExpression.Operator;
+import com.uas.platform.core.persistence.criteria.LogicalExpression;
+import com.uas.platform.core.persistence.criteria.PredicateUtils;
+import com.uas.platform.core.persistence.criteria.SimpleExpression;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.*;
+
+/**
+ * Created by wangyc on 2018/6/26.
+ *
+ * @version 2018/6/26 18:12 wangyc
+ */
+@Service
+public class ProductAttachServiceImpl implements ProductAttachService {
+
+    private final ProductDao productDao;
+
+    private final ProductAttachSubmitDao productAttachSubmitDao;
+
+    private final ComponentDao componentDao;
+
+    private final BrandInfoDao brandInfoDao;
+
+    private final KindInfoDao kindInfoDao;
+
+    private final ComponentService componentService;
+
+    private final KindDao kindDao;
+
+    private final EnterpriseDao enterpriseDao;
+
+    private final UserBaseInfoDao userBaseInfoDao;
+
+    @Autowired
+    private ProductService productService;
+
+    @Autowired
+    public ProductAttachServiceImpl(ProductDao productDao, ProductAttachSubmitDao productAttachSubmitDao,
+                                    ComponentDao componentDao, BrandInfoDao brandInfoDao, KindInfoDao kindInfoDao, ComponentService componentService, KindDao kindDao, EnterpriseDao enterpriseDao, UserBaseInfoDao userBaseInfoDao) {
+        this.productDao = productDao;
+        this.productAttachSubmitDao = productAttachSubmitDao;
+        this.componentDao = componentDao;
+        this.brandInfoDao = brandInfoDao;
+        this.kindInfoDao = kindInfoDao;
+        this.componentService = componentService;
+        this.kindDao = kindDao;
+        this.enterpriseDao = enterpriseDao;
+        this.userBaseInfoDao = userBaseInfoDao;
+    }
+
+    @Override
+    public Page<ProductAttachSubmit> getPageInfo(PageParams params, String keywords, String status) {
+        final PageInfo pageInfo = new PageInfo(params);
+
+        // 过滤状态
+        Integer statusCode = 0;
+        switch (status) {
+            case "all" : break;
+            case "unaudit" : statusCode = Status.UNAUDIT.value(); break;
+            case "audited" : statusCode = Status.AUDITED.value(); break;
+            case "notallow" : statusCode = Status.NOTALLOW.value(); break;
+        }
+
+        if (pageInfo.getSort() == null) {
+            pageInfo.sorting(Direction.DESC, "createTime");
+        }
+
+        if (statusCode != 0) {
+            pageInfo.expression(new SimpleExpression("status", statusCode, Operator.EQ));
+        }
+
+        // 过滤提交人姓名、企业
+        if (!StringUtils.isEmpty(keywords)) {
+            SimpleExpression submiterName = new SimpleExpression("submiter.userName", keywords, CriterionExpression.Operator.LIKE);
+            SimpleExpression submiterEnName = new SimpleExpression("submitEn.enName", keywords, CriterionExpression.Operator.LIKE);
+            SimpleExpression[] simpleExpressions = new SimpleExpression[]{submiterName, submiterEnName};
+            LogicalExpression logicalExpression = PredicateUtils.or(simpleExpressions);
+            pageInfo.expression(logicalExpression);
+        }
+
+        Page<ProductAttachSubmit> page = productAttachSubmitDao.findAll(new Specification<ProductAttachSubmit>() {
+            @Override
+            public Predicate toPredicate(Root<ProductAttachSubmit> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
+                query.where(pageInfo.getPredicates(root, query, cb));
+                return null;
+            }
+        }, pageInfo);
+
+        List<ProductAttachSubmit> submits = page.getContent();
+        if (!CollectionUtils.isEmpty(submits)) {
+            for (ProductAttachSubmit submit : submits) {
+                submit = completeReturnSubmit(submit);
+            }
+        }
+        return new PageImpl<>(submits, pageInfo, page.getTotalElements());
+    }
+
+    @Override
+    public ProductAttachSubmit getOne(Long id) {
+        ProductAttachSubmit productAttachSubmit = productAttachSubmitDao.findOne(id);
+        if (productAttachSubmit == null) {
+            throw new IllegalOperatorException("申请不存在,请重新确认申请信息");
+        } else {
+            return completeReturnSubmit(productAttachSubmit);
+        }
+    }
+
+    /**
+     * 补全返回的申请信息
+     * @param submit 申请信息
+     * @return
+     */
+    private ProductAttachSubmit completeReturnSubmit(ProductAttachSubmit submit) {
+        if (submit.getAuditEnuu() != null) {
+            Enterprise enterprise = enterpriseDao.findOne(submit.getAuditEnuu());
+            if (enterprise != null) {
+                submit.setAuditEn(enterprise);
+            }
+        }
+
+        if (submit.getAuditUu() != null) {
+            UserBaseInfo userBaseInfo = userBaseInfoDao.findUserByUserUU(submit.getAuditUu());
+            if (userBaseInfo != null) {
+                submit.setAuditer(userBaseInfo);
+            }
+        }
+
+        if (submit.getProductId() != null) {
+            Product product = productDao.findOne(submit.getProductId());
+            if (product != null) {
+                submit.setProduct(product);
+            }
+        }
+
+        if (submit.getKindId() != null) {
+            KindInfo kindInfo = kindInfoDao.findOne(submit.getKindId());
+            if (kindInfo != null) {
+                submit.setKind(kindInfo);
+            }
+        }
+
+        if (submit.getBrandId() != null) {
+            BrandInfo brandInfo = brandInfoDao.findOne(submit.getBrandId());
+            if (brandInfo != null) {
+                submit.setBrand(brandInfo);
+            }
+        }
+        return submit;
+    }
+
+    @Override
+    public ProductAttachSubmit submit(Long productId, String attach) {
+        if (StringUtils.isEmpty(attach)) {
+            throw new IllegalOperatorException("规格书为空,请上传规格书");
+        } else {
+            Product product = productDao.findOne(productId);
+            if (product == null) {
+                throw new IllegalOperatorException("此物料不存在,请重新确认物料信息");
+            } else {
+                ProductAttachSubmit productAttachSubmit = productAttachSubmitDao.findByProductIdAndStatus(productId,
+                    Status.UNAUDIT.value());
+                // 更新物料规格书申请
+                if (productAttachSubmit != null) {
+                    productAttachSubmit = completeSubmit(productAttachSubmit, product, attach);
+                // 新增物料规格书申请
+                } else {
+                    productAttachSubmit = new ProductAttachSubmit();
+                    productAttachSubmit = completeSubmit(productAttachSubmit, product, attach);
+                }
+                return productAttachSubmitDao.save(productAttachSubmit);
+            }
+        }
+    }
+
+    /**
+     * 补充申请
+     * @param submit 申请
+     * @param product 物料信息
+     * @param attach 规格书
+     * @return
+     */
+    private ProductAttachSubmit completeSubmit(ProductAttachSubmit submit, Product product, String attach) {
+        submit.setUploadAttach(attach);
+        submit.setProductId(product.getId());
+        submit.setProduct(product);
+        submit.setCreateTime(new Date());
+        submit.setCode(product.getPcmpcode());
+        if (SystemSession.getUser().getUserUU() != null && SystemSession.getUser().getEnterprise() != null) {
+            submit.setSubmitUu(SystemSession.getUser().getUserUU());
+            submit.setSubmitEnuu(SystemSession.getUser().getEnterprise().getUu());
+        } else {
+            throw new IllegalOperatorException("此功能仅供企业下属用户使用,请以企业下属用户身份登录");
+        }
+
+        submit.setUuid("");
+        if (product.getCmpUuId() != null) {
+            Component component = componentDao.findByUuid(product.getCmpUuId());
+            if (component != null) {
+                submit.setUuid(product.getCmpUuId());
+                submit.setKindId(component.getKindid());
+                submit.setBrandId(component.getBrandid());
+            }
+        }
+        return submit;
+    }
+
+    /**
+     * 物料上传规格书申请
+     *
+     * @param productids 物料id
+     * @param status    规格书
+     * @return
+     */
+    @Override
+    public List<ProductAttachSubmit> findByProductidsAndStatus(List<Long> productids, Integer status) {
+        if (CollectionUtils.isNotEmpty(productids) || status == null) {
+            return productAttachSubmitDao.findByProductIdsAndStatus(productids, status);
+        } else {
+            return Collections.emptyList();
+        }
+    }
+
+    @Override
+    public ResultMap auditSuccess(ProductAttachSubmit submit) {
+        ResultMap map = validateSubmit(submit);
+
+        if (CodeType.OK.code() != map.getCode()) {
+            return map;
+        } else {
+            ProductAttachSubmit exsitedSubmit = (ProductAttachSubmit) map.getData();
+
+            // 标准型号
+            if (!StringUtils.isEmpty(exsitedSubmit.getUuid())) {
+                Component component = componentDao.findByUuid(exsitedSubmit.getUuid());
+                // 实际为非标物料
+                if (component == null) {
+                    return new ResultMap(CodeType.ERROR_STATE, "该物料匹配的标准器件不存在,请重新确认该物料信息");
+                    // 标准物料无规格书,更新规格书
+                } else if (component.getAttach() == null){
+                    component = addComponent(exsitedSubmit, component.getId());
+                    return ResultMap.success(auditSubmit(exsitedSubmit));
+                    // 标准物料有规格书,返回两规格书
+                } else {
+                    return new ResultMap(CodeType.SAVED.code(), "匹配的标准物料已存在规格书", componentAttachNotNull(exsitedSubmit, component.getAttach()));
+                }
+                // 非标型号
+            } else {
+                List<Component> components = componentDao.findByBrandidAndCode(exsitedSubmit.getBrandId(), exsitedSubmit.getCode());
+                if (!CollectionUtils.isEmpty(components)) {
+                    Component component = components.get(0);
+                    // 保存uuid
+                    exsitedSubmit.setUuid(component.getUuid());
+                    productAttachSubmitDao.save(exsitedSubmit);
+
+                    if (component.getAttach() != null) {
+                        return new ResultMap(CodeType.SAVED.code(), "匹配的标准物料已存在规格书", componentAttachNotNull(exsitedSubmit, component.getAttach()));
+                    } else {
+                        component = addComponent(exsitedSubmit, component.getId());
+                        return ResultMap.success(auditSubmit(exsitedSubmit));
+                    }
+                } else {
+                    Component component = addComponent(exsitedSubmit, null);
+                    // 保存uuid
+                    exsitedSubmit.setUuid(component.getUuid());
+                    productAttachSubmitDao.save(exsitedSubmit);
+                    return ResultMap.success(auditSubmit(exsitedSubmit));
+                }
+            }
+        }
+    }
+
+    private ResultMap validateSubmit(ProductAttachSubmit submit) {
+        if (submit.getId() == null) {
+            return new ResultMap(CodeType.NOT_EXiST, "此申请不存在,请重新确认申请信息");
+        }
+
+        ProductAttachSubmit exsitedSubmit = productAttachSubmitDao.findOne(submit.getId());
+        if (exsitedSubmit == null) {
+            return new ResultMap(CodeType.NOT_EXiST, "此申请不存在,请重新确认申请信息");
+        } else {
+            exsitedSubmit.setBrandId(submit.getBrandId());
+            exsitedSubmit.setKindId(submit.getKindId());
+            exsitedSubmit.setSpec(submit.getSpec());
+            if (StringUtils.isEmpty(exsitedSubmit.getUploadAttach())) {
+                return new ResultMap(CodeType.NO_INFO, "此申请规格书为空,请重新确认申请信息");
+            }
+            if (exsitedSubmit.getBrandId() == null || exsitedSubmit.getKindId() == null) {
+                return new ResultMap(CodeType.NO_INFO, "商城类目、品牌不完善,请重新确认申请信息");
+            }
+            BrandInfo brandInfo = brandInfoDao.findOne(exsitedSubmit.getBrandId());
+            if (brandInfo == null) {
+                return new ResultMap(CodeType.PARAMETER_ERROR, "商城品牌不存在,请重新填写商城品牌");
+            }
+            KindInfo kindInfo = kindInfoDao.findOne(exsitedSubmit.getKindId());
+            if (kindInfo == null) {
+                return new ResultMap(CodeType.PARAMETER_ERROR, "商城物料名称(类目)不存在,请重新填写商城物料名称(类目)");
+            }
+            return ResultMap.success(exsitedSubmit);
+        }
+    }
+
+    /**
+     * 完善审核信息
+     * @param submit
+     * @return
+     */
+    private ProductAttachSubmit auditSubmit(ProductAttachSubmit submit) {
+        submit.setStatus(Status.AUDITED.value());
+        submit.setAuditTime(new Date());
+        submit.setAuditUu(SystemSession.getUser().getUserUU());
+        submit.setAuditEnuu(SystemSession.getUser().getEnterprise().getUu());
+        submit = productAttachSubmitDao.save(submit);
+        // 更新物料信息
+        productService.updateProductByComponent(submit.getProductId(), submit.getUuid());
+        return submit;
+    }
+
+    /**
+     * 器件规格书不为空时,返回两个规格书
+     * @param submit
+     * @param attach
+     * @return
+     */
+    private Object componentAttachNotNull(ProductAttachSubmit submit, String attach) {
+        submit.setMallAttach(attach);
+        productAttachSubmitDao.save(submit);
+
+        // 返回标准器件规格书、用户上传规格书
+        Map<String, String> map = new HashMap<>();
+        map.put("uploadAttach", submit.getUploadAttach());
+        map.put("mallAttach", attach);
+
+        return map;
+    }
+
+    @Override
+    public ResultMap auditFailed(Long submitId, String reason) {
+        ProductAttachSubmit submit = productAttachSubmitDao.findOne(submitId);
+        if (submit == null) {
+            return new ResultMap(CodeType.NOT_EXiST, "此申请不存在,请重新确认申请信息");
+        } else if (submit.getStatus() == null || Status.UNAUDIT.value() != submit.getStatus()){
+            return new ResultMap(CodeType.NOT_PERMIT, "此申请不为待审核状态,请重新确认申请信息");
+        } else {
+            submit.setStatus(Status.NOTALLOW.value());
+            submit.setAuditTime(new Date());
+            if (SystemSession.getUser() == null || SystemSession.getUser().getEnterprise() == null) {
+                return new ResultMap(CodeType.NO_AUTHORITY, "操作人员信息不可为空");
+            }
+            submit.setAuditUu(SystemSession.getUser().getUserUU());
+            submit.setAuditEnuu(SystemSession.getUser().getEnterprise().getUu());
+            submit.setReason(reason);
+            submit = productAttachSubmitDao.save(submit);
+
+            return ResultMap.success(submit);
+        }
+
+    }
+
+    @Override
+    public ResultMap chooseAttach(String attach, ProductAttachSubmit submit) {
+        ResultMap map = validateSubmit(submit);
+        if (CodeType.OK.code() != map.getCode()) {
+            return map;
+        } else {
+            ProductAttachSubmit exsitedSubmit = (ProductAttachSubmit) map.getData();
+            if (!StringUtils.isEmpty(attach)) {
+                Component component = componentDao.findByUuid(exsitedSubmit.getUuid());
+                if (component != null) {
+                    component = addComponent(exsitedSubmit, component.getId());
+                    return ResultMap.success(auditSubmit(exsitedSubmit));
+                } else {
+                    return new ResultMap(CodeType.ERROR_STATE, "该物料匹配的标准器件不存在,请重新确认该物料信息");
+                }
+            } else {
+                return new ResultMap(CodeType.PARAMETER_ERROR, "请选择一份规格书");
+            }
+        }
+    }
+
+    private Component addComponent(ProductAttachSubmit submit, Long componentId) {
+        // 更新器件
+        if (componentId != null) {
+            Component component = componentDao.findOne(componentId);
+            if (component != null) {
+                component.setAttach(submit.getUploadAttach());
+                component.setVersion((short) ((component.getVersion() == null ? 0 : component.getVersion()) + 1));
+                component.setModifyTime(new Date());
+                component.setDescription(submit.getSpec());
+                return componentDao.save(component);
+            }
+            return null;
+        // 新增器件
+        } else {
+            Component component = new Component(submit);
+            component.setUuid(componentService.createUuid(component));
+            component = componentDao.save(component);
+
+            // 更新类目uuid后缀游标,以便之后生成uuid
+            Kind kind = kindDao.findOne(component.getKindid());
+            kind.setComponentsuffix(kind.getComponentsuffix() + 1);
+            kindDao.save(kind);
+
+            return component;
+        }
+    }
+}

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

@@ -17,83 +17,12 @@ import com.uas.platform.b2c.core.constant.Status;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import com.uas.platform.b2c.core.utils.NumberUtil;
+import com.uas.platform.b2c.core.utils.StringUtilB2C;
 import com.uas.platform.b2c.prod.commodity.constant.DoubleConstant;
 import com.uas.platform.b2c.prod.commodity.constant.StringConstant;
-import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
-import com.uas.platform.b2c.prod.commodity.dao.GoodsHistoryDao;
-import com.uas.platform.b2c.prod.commodity.dao.MatchModelDao;
-import com.uas.platform.b2c.prod.commodity.dao.PCBDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductDetailDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductMatchResultDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductModifyHistoryDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductPersonDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductPrivateDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductReplaceDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductStandardPutOnInfoDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductStoreStatusDao;
-import com.uas.platform.b2c.prod.commodity.dao.StockInOutHistDao;
-import com.uas.platform.b2c.prod.commodity.dao.V_ProductPersonDao;
-import com.uas.platform.b2c.prod.commodity.dao.V_ProductPrivateDao;
-import com.uas.platform.b2c.prod.commodity.model.Goods;
-import com.uas.platform.b2c.prod.commodity.model.GoodsHistory;
-import com.uas.platform.b2c.prod.commodity.model.GoodsQtyPrice;
-import com.uas.platform.b2c.prod.commodity.model.MatchModel;
-import com.uas.platform.b2c.prod.commodity.model.Product;
-import com.uas.platform.b2c.prod.commodity.model.ProductDetail;
-import com.uas.platform.b2c.prod.commodity.model.ProductMatchResult;
-import com.uas.platform.b2c.prod.commodity.model.ProductModifyHistory;
-import com.uas.platform.b2c.prod.commodity.model.ProductPerson;
-import com.uas.platform.b2c.prod.commodity.model.ProductPrivate;
-import com.uas.platform.b2c.prod.commodity.model.ProductReplace;
-import com.uas.platform.b2c.prod.commodity.model.ProductStandardPutOnInfo;
-import com.uas.platform.b2c.prod.commodity.model.ProductStoreStatus;
-import com.uas.platform.b2c.prod.commodity.model.StockInOutHist;
-import com.uas.platform.b2c.prod.commodity.model.UASBatchPutOnProperty;
-import com.uas.platform.b2c.prod.commodity.model.V_ProductPerson;
-import com.uas.platform.b2c.prod.commodity.model.V_ProductPrivate;
-import com.uas.platform.b2c.prod.commodity.service.GoodsHistoryService;
-import com.uas.platform.b2c.prod.commodity.service.GoodsService;
-import com.uas.platform.b2c.prod.commodity.service.ProductService;
-import com.uas.platform.b2c.prod.commodity.service.ReleaseProductByBatchService;
-import com.uas.platform.b2c.prod.commodity.service.UASBatchPutOnPropertyService;
-import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
-import com.uas.platform.b2c.prod.commodity.dao.GoodsHistoryDao;
-import com.uas.platform.b2c.prod.commodity.dao.MatchModelDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductDetailDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductMatchResultDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductModifyHistoryDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductPersonDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductPrivateDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductReplaceDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductStandardPutOnInfoDao;
-import com.uas.platform.b2c.prod.commodity.dao.ProductStoreStatusDao;
-import com.uas.platform.b2c.prod.commodity.dao.StockInOutHistDao;
-import com.uas.platform.b2c.prod.commodity.dao.V_ProductPersonDao;
-import com.uas.platform.b2c.prod.commodity.dao.V_ProductPrivateDao;
-import com.uas.platform.b2c.prod.commodity.model.Goods;
-import com.uas.platform.b2c.prod.commodity.model.GoodsHistory;
-import com.uas.platform.b2c.prod.commodity.model.GoodsQtyPrice;
-import com.uas.platform.b2c.prod.commodity.model.MatchModel;
-import com.uas.platform.b2c.prod.commodity.model.Product;
-import com.uas.platform.b2c.prod.commodity.model.ProductDetail;
-import com.uas.platform.b2c.prod.commodity.model.ProductMatchResult;
-import com.uas.platform.b2c.prod.commodity.model.ProductModifyHistory;
-import com.uas.platform.b2c.prod.commodity.model.ProductPerson;
-import com.uas.platform.b2c.prod.commodity.model.ProductPrivate;
-import com.uas.platform.b2c.prod.commodity.model.ProductReplace;
-import com.uas.platform.b2c.prod.commodity.model.ProductStandardPutOnInfo;
-import com.uas.platform.b2c.prod.commodity.model.ProductStoreStatus;
-import com.uas.platform.b2c.prod.commodity.model.StockInOutHist;
-import com.uas.platform.b2c.prod.commodity.model.UASBatchPutOnProperty;
-import com.uas.platform.b2c.prod.commodity.model.V_ProductPerson;
-import com.uas.platform.b2c.prod.commodity.model.V_ProductPrivate;
-import com.uas.platform.b2c.prod.commodity.service.GoodsHistoryService;
-import com.uas.platform.b2c.prod.commodity.service.GoodsService;
-import com.uas.platform.b2c.prod.commodity.service.ProductService;
-import com.uas.platform.b2c.prod.commodity.service.ReleaseProductByBatchService;
-import com.uas.platform.b2c.prod.commodity.service.UASBatchPutOnPropertyService;
+import com.uas.platform.b2c.prod.commodity.dao.*;
+import com.uas.platform.b2c.prod.commodity.model.*;
+import com.uas.platform.b2c.prod.commodity.service.*;
 import com.uas.platform.b2c.prod.commodity.type.ProductConstant;
 import com.uas.platform.b2c.prod.commodity.util.GoodsUtil;
 import com.uas.platform.b2c.prod.product.brand.dao.BrandDao;
@@ -105,7 +34,6 @@ import com.uas.platform.b2c.prod.product.component.modal.Component;
 import com.uas.platform.b2c.prod.product.component.modal.ComponentSubmit;
 import com.uas.platform.b2c.prod.product.kind.dao.KindInfoDao;
 import com.uas.platform.b2c.prod.product.kind.model.Kind;
-import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
 import com.uas.platform.b2c.prod.store.model.StoreIn;
 import com.uas.platform.b2c.prod.store.model.StoreStatus;
 import com.uas.platform.b2c.prod.store.service.StoreInService;
@@ -127,29 +55,11 @@ import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.model.Constant;
 import com.uas.platform.core.model.PageInfo;
-import com.uas.platform.core.model.PageParams;
 import com.uas.platform.core.model.Type;
 import com.uas.platform.core.persistence.criteria.LogicalExpression;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
 import com.uas.platform.core.persistence.criteria.SimpleExpression;
-import java.lang.reflect.Field;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
+import com.uas.platform.core.util.serializer.FlexJsonUtils;
 import org.apache.commons.beanutils.ConvertUtils;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.log4j.Logger;
@@ -176,15 +86,7 @@ import java.lang.reflect.Field;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
@@ -315,6 +217,9 @@ public class ProductServiceImpl implements ProductService {
     @Autowired
     private SearchService searchService;
 
+    @Autowired
+    private ProductAttachService productAttachService;
+
     @Value("#{sys.productServiceIp}")
     private String productServiceIp;
 
@@ -396,6 +301,7 @@ public class ProductServiceImpl implements ProductService {
             }
         }
         userUU = SystemSession.getUser().getUserUU();
+        List<ProductAttachSubmit> productAttachSubmits = productAttachService.findByProductidsAndStatus(idList, Status.UNAUDIT.value());
         List<Long> productIds = productPersonDao.findIdByEnuuAndUserUU(enUU, userUU);
         for (V_ProductPrivate v_productPrivate : productList) {
             for (Long productId : productIds) {
@@ -403,6 +309,13 @@ public class ProductServiceImpl implements ProductService {
                     v_productPrivate.setAddProductPerson(true);
                 }
             }
+
+            for (ProductAttachSubmit attachSubmit : productAttachSubmits) {
+                if ((attachSubmit.getProductId() != null) && attachSubmit.getProductId().longValue() == v_productPrivate.getId().longValue()) {
+                    v_productPrivate.setProductAttachSubmit(attachSubmit);
+                    break;
+                }
+            }
         }
         return new PageImpl<V_ProductPrivate>(productList, page, ids.getTotalElement());
     }
@@ -459,7 +372,7 @@ public class ProductServiceImpl implements ProductService {
                 return null;
             }
         }, page);*/
-
+        List<Long> list = new ArrayList<>();
         List<V_ProductPerson> productList = productPage.getContent();
         for (V_ProductPerson product : productList) {
             if ("ERP".equals(product.getSourceApp())) {
@@ -470,6 +383,19 @@ public class ProductServiceImpl implements ProductService {
             }
             List<ProductReplace> productReplaceList = productReplaceDao.findByProductIdOrderByDetno(product.getId());
             product.setProductReplaceList(productReplaceList);
+            list.add(product.getId());
+        }
+        if (CollectionUtils.isNotEmpty(list)) {
+            List<ProductAttachSubmit> submits = productAttachService.findByProductidsAndStatus(list, Status.UNAUDIT.value());
+            for (ProductAttachSubmit productAttachSubmit : submits) {
+                for (V_ProductPerson product : productList) {
+                    if (product.getId().longValue() == productAttachSubmit.getProductId().longValue()) {
+                        product.setProductAttachSubmit(productAttachSubmit);
+                        break;
+                    }
+
+                }
+            }
         }
         return new PageImpl<V_ProductPerson>(productList, page, productPage.getTotalElements());
     }
@@ -1588,7 +1514,7 @@ public class ProductServiceImpl implements ProductService {
         if (CollectionUtils.isEmpty(componentMatched)) {// 提交申请为非标准器件则转成器件申请
             Kind kind = (Kind)jsonObject.get("kind");
             if (kind == null || kind.getId() == null)
-                throw new IllegalOperatorException("请选择商城类目");
+                throw new IllegalOperatorException("请选择商城物料名称(类目)");
             String attach = jsonObject.getString("attach");
             if (attach == null)
                 throw new IllegalOperatorException("请上传规格书");
@@ -1933,5 +1859,323 @@ public class ProductServiceImpl implements ProductService {
         }
 
     }
+
+
+    /**
+     * 修改非标物料的品牌、物料名称、型号、规格、规格书等信息
+     *
+     * @param json      修改的物料信息
+     * @param attachUrl 规格书的地址
+     * @return the string
+     */
+    @Transactional
+    @Override
+    public ResultMap updateProduct(String json, String attachUrl) {
+        if (StringUtils.isEmpty(json)) {
+            return new ResultMap(CodeType.NOT_COMPLETE_INFO, "信息不完善");
+        } else {
+            Product product = FlexJsonUtils.fromJson(json, Product.class);
+            //第一步 判断此产品是为非标
+            if (product != null) {
+                Long id = product.getId();
+                if (id == null) {
+                    return new ResultMap(CodeType.NOT_COMPLETE_INFO, "物料主键信息丢失");
+                }
+                Product persistProduct = productDao.findOne(id);
+                if (persistProduct == null) {
+                    return new ResultMap(CodeType.NOT_EXiST, "数据库找不到对应的信息,请重新操作");
+                }
+                List<ProductPrivate> productPrivates = productPrivateDao.findByPrId(id);
+                if ((CollectionUtils.isNotEmpty(productPrivates)) && productPrivates.get(0).getB2cEnabled() != IntegerConstant.YES_SHORT) {
+                    return new ResultMap(CodeType.NOT_PERMIT, "该物料商城未启用,不能操作");
+                }
+                if (!StringUtilB2C.equals(persistProduct.getSpec() , product.getSpec())) {
+                    String spec = product.getSpec();
+                    ResultMap resultMap = StringUtilB2C.validateSpec(spec);
+                    if (resultMap.getCode() != CodeType.OK.code()) {
+                        return resultMap;
+                    } else {
+                        spec = (String) resultMap.getData();
+                        persistProduct.setSpec(spec);
+                    }
+                }
+                if (persistProduct.getStandard() == IntegerConstant.NO_SHORT) {
+                    Component component = findBybrNameAndcmpCode(persistProduct.getPbranden(), persistProduct.getPcmpcode());
+                    if (component != null) {
+                        //更新物料信息
+                        updateProductByComponent(persistProduct, component);
+                        if ((!StringUtils.isEmpty(component.getAttach())) && (!StringUtils.isEmpty(attachUrl))) {
+                            return  new ResultMap(CodeType.NOT_PERMIT, "该物料已匹配为标准,规格书已存在,规格书不能修改");
+                        } else {
+                            if (!StringUtils.isEmpty(attachUrl)) {
+                                productAttachService.submit(persistProduct.getId(), attachUrl);
+                            }
+                            return new ResultMap(CodeType.OK.code(), "成功");
+                        }
+
+                    } else {
+                        //非标且找不到标准信息
+                        String brand = "", code = "", kind = "";
+                        if (!StringUtils.isEmpty(attachUrl)) {
+                            productAttachService.submit(persistProduct.getId(), attachUrl);
+                        }
+                        if (!StringUtilB2C.equals(persistProduct.getPbranden() , product.getPbranden())) {
+                            brand = product.getPbranden();
+                            ResultMap resultMap = StringUtilB2C.validateBrand(brand);
+                            if (resultMap.getCode() != CodeType.OK.code()) {
+                                return resultMap;
+                            } else {
+                                brand = (String) resultMap.getData();
+                            }
+                        }
+                        if (!StringUtilB2C.equals(persistProduct.getPcmpcode() , product.getPcmpcode())) {
+                            code = product.getPcmpcode();
+                            ResultMap resultMap = StringUtilB2C.validateCmpCode(code);
+                            if (resultMap.getCode() != CodeType.OK.code()) {
+                                return resultMap;
+                            } else {
+                                code = (String) resultMap.getData();
+                            }
+                        }
+                        if (!StringUtilB2C.equals(persistProduct.getKind() , product.getKind())) {
+                            kind = product.getKind();
+                            ResultMap resultMap = StringUtilB2C.validateKind(kind);
+                            if (resultMap.getCode() != CodeType.OK.code()) {
+                                return resultMap;
+                            } else {
+                                kind = (String) resultMap.getData();
+                                persistProduct.setKind(kind);
+                            }
+                        }
+                        //如果修改了品牌、或者型号,需要匹配看,是否为标准
+                        if (!StringUtils.isEmpty(brand) || !StringUtils.isEmpty(code)) {
+                            if (StringUtils.isEmpty(code)) {
+                                code = persistProduct.getPcmpcode();
+                            }
+                            if (StringUtils.isEmpty(brand)) {
+                                brand = persistProduct.getPbranden();
+                            }
+                            List<Product> products = productDao.findByEnUUAndPcmpcodeAndPbrandenAndB2cEnabled(SystemSession.getUser().getEnterprise().getUu(), code, brand, IntegerConstant.YES_SHORT);
+                            if (CollectionUtils.isNotEmpty(products)) {
+                                return new ResultMap(CodeType.NOT_PERMIT, "该企业下已存在同品牌、同型号的物料。");
+                            } else {
+                                Component component1 = findBybrNameAndcmpCode(brand, code);
+                                if (component1 != null) {
+                                    //根据器件更新物料信息
+                                    ResultMap resultMap = updateProductByComponent(persistProduct, component1);
+                                    return resultMap;
+                                } else {
+                                    persistProduct.setPbranden(brand);
+                                    persistProduct.setBrand(brand);
+                                    persistProduct.setPbrand(brand);
+                                    persistProduct.setPcmpcode(code);
+                                    persistProduct.setCmpCode(code);
+                                    Product product1 = productDao.save(persistProduct);
+                                    goodsService.updateGoodsByProduct(product1);
+                                    return ResultMap.success(product1);
+                                }
+                            }
+                        } else {
+                            //直接保存
+                            Product product1 = productDao.save(persistProduct);
+                            goodsService.updateGoodsByProduct(product1);
+                            return ResultMap.success(product1);
+                        }
+                    }
+                } else {
+                    //标准的信息,只能修改规格书、规格信息
+                    Component component = null;
+                    if (!StringUtilB2C.equals(product.getPbranden(), persistProduct.getPbranden())) {
+                        return new ResultMap(CodeType.NOT_PERMIT, "标准物料,品牌不能修改");
+                    }
+                    if (!StringUtilB2C.equals(product.getPcmpcode(), persistProduct.getPcmpcode())) {
+                        return new ResultMap(CodeType.NOT_PERMIT, "标准物料,型号不能修改");
+                    }
+                    if (!StringUtilB2C.equals(product.getKind(), persistProduct.getKind())) {
+                        return new ResultMap(CodeType.NOT_PERMIT, "标准物料,类目不能修改");
+                    }
+                    if (!StringUtilB2C.equals(product.getSpec(), persistProduct.getSpec())) {
+                        persistProduct.setSpec(product.getSpec());
+                    }
+                    if (persistProduct.getCmpUuId() != null) {
+                        component = componentDao.findByUuid(persistProduct.getCmpUuId());
+                    }
+                    updateProductByComponent(persistProduct, component);
+                    if (!StringUtils.isEmpty(component.getAttach()) && !StringUtils.isEmpty(attachUrl)) {
+                        return new ResultMap(CodeType.NOT_PERMIT, "规格书已经存在,不能重复上传。");
+                    } else {
+                        if (!StringUtils.isEmpty(attachUrl)) {
+                            productAttachService.submit(persistProduct.getId(), attachUrl);
+                        }
+                        return new ResultMap(CodeType.OK.code(), "成功");
+                    }
+                }
+            } else {
+                return new ResultMap(CodeType.NOT_COMPLETE_INFO, "物料信息丢失,请重新操作");
+            }
+        }
+    }
+
+
+    /**
+     * 根据品牌和型号找标准器件
+     *
+     * @param brName
+     * @param cmpCode
+     * @return
+     */
+    @Override
+    public Component findBybrNameAndcmpCode(String brName, String cmpCode) {
+        if (StringUtils.isEmpty(brName) || StringUtils.isEmpty(cmpCode)) {
+            return null;
+        } else {
+            List<Brand> brands = brandDao.findByName(brName);
+            if (CollectionUtils.isEmpty(brands)) {
+                return null;
+            } else {
+                Brand brand = brands.get(0);
+                List<Component> componentList = componentDao.findByCodeAndBrandid(cmpCode, brand.getId());
+                if (CollectionUtils.isEmpty(componentList)) {
+                    return null;
+                } else {
+                    return componentList.get(0);
+                }
+            }
+        }
+    }
+
+    /**
+     * 更新物料信息根据标准器件
+     *
+     * @param productid   物料id
+     * @param componentUuid 器件id
+     * @return
+     */
+    @Override
+    public ResultMap updateProductByComponent(Long productid, String componentUuid) {
+        if (productid == null) {
+            return new ResultMap(CodeType.NO_INFO, "物料主键缺失");
+        } else if(StringUtils.isEmpty(componentUuid)) {
+            return new ResultMap(CodeType.NO_INFO, "标准器件uuid缺失");
+        } else {
+            Component component = componentDao.findByUuid(componentUuid);
+            if (component == null) {
+                return new ResultMap(CodeType.NOT_EXiST, "找不到对应器件");
+            }
+            Product product = productDao.findOne(productid);
+            if (product == null) {
+                return new ResultMap(CodeType.NOT_EXiST, "找不到对应物料");
+            }
+            ResultMap resultMap = updateProductByComponent(product, component);
+
+            updateProductByComponent(component);
+            return resultMap;
+        }
+    }
+
+    /**
+     * 更新物料信息
+     *
+     * @param product   物料信息
+     * @param component 器件信息
+     * @return ResultMap
+     */
+    @Override
+    public ResultMap updateProductByComponent(Product product, Component component) {
+        if (product == null) {
+            return new ResultMap(CodeType.NOT_EXiST, "物料缺失");
+        }
+        if (component == null) {
+            return new ResultMap(CodeType.NOT_EXiST, "标准器件缺失");
+        } else {
+            //更新之前的标准器件
+            updateProductByComponent(component);
+        }
+        if (StringUtils.isEmpty(product.getSpec())) {
+            product.setSpec(component.getDescription());
+        }
+        product.setKind(component.getKind().getNameCn());
+        product.setKinden(component.getKind().getNameEn());
+        product.setKindid(component.getKindid());
+        product.setPbrand(component.getBrand().getNameCn());
+        product.setPbranden(component.getBrand().getNameEn());
+        product.setPbrandid(component.getBrandid());
+        product.setPbranduuid(component.getBrand().getUuid());
+        product.setCmpCode(component.getCode());
+        product.setCmpImg(component.getImg());
+        product.setCmpUuId(component.getUuid());
+        product.setStandard(IntegerConstant.YES_SHORT);
+        if (!StringUtils.isEmpty(component.getAttach())) {
+            List<ProductPrivate> privates = productPrivateDao.findByPrId(product.getId());
+            if (CollectionUtils.isNotEmpty(privates)) {
+                ProductPrivate productPrivate = privates.get(0);
+                productPrivate.setAttach(component.getAttach());
+                productPrivateDao.save(productPrivate);
+            } else {
+                ProductPrivate productPrivate = new ProductPrivate();
+                productPrivate.setAttach(component.getAttach());
+                productPrivate.setPrId(product.getId());
+                productPrivate.setB2cEnabled(IntegerConstant.YES_SHORT);
+                productPrivate.setBatchCount(IntegerConstant.NO_SHORT);
+                productPrivateDao.save(productPrivate);
+            }
+        }
+        Product product1 = productDao.save(product);
+        goodsService.updateGoodsByProduct(product1);
+        return ResultMap.success(product1);
+    }
+
+
+    /**
+     * 更新物料信息
+     *
+     * @param component 器件信息
+     * @return ResultMap
+     */
+    @Override
+    public ResultMap updateProductByComponent(Component component) {
+        if (component == null) {
+            return new ResultMap(CodeType.OK, "");
+        } else {
+            if ((!StringUtils.isEmpty(component.getSpec())) || (!StringUtils.isEmpty(component.getAttach()))) {
+                List<Product> productList = productDao.findByCmpUuId(component.getUuid());
+                List<ProductPrivate> productPrivatelist = new ArrayList<>();
+                List<Product> list = new ArrayList<>();
+                for (Product product : productList) {
+                    if (!StringUtils.isEmpty(component.getAttach())) {
+                        List<ProductPrivate> productPrivates = productPrivateDao.findByPrId(product.getId());
+                        if (CollectionUtils.isNotEmpty(productPrivates)) {
+                            ProductPrivate productPrivate = productPrivates.get(0);
+                            productPrivate.setAttach(component.getAttach());
+                            productPrivatelist.add(productPrivate);
+                        } else {
+                            ProductPrivate productPrivate = new ProductPrivate();
+                            productPrivate.setAttach(component.getAttach());
+                            productPrivate.setPrId(product.getId());
+                            productPrivate.setB2cEnabled(IntegerConstant.YES_SHORT);
+                            productPrivate.setBatchCount(IntegerConstant.NO_SHORT);
+                            productPrivatelist.add(productPrivate);
+                        }
+                    }
+
+                    if (StringUtils.isEmpty(product.getSpec()) && !StringUtils.isEmpty(component.getSpec())) {
+                        product.setSpec(component.getSpec());
+                        list.add(product);
+                    }
+                }
+                if (CollectionUtils.isNotEmpty(productPrivatelist)) {
+                    productPrivateDao.save(productPrivatelist);
+                }
+                if (CollectionUtils.isNotEmpty(list)) {
+                    productDao.save(list);
+                }
+
+                goodsService.updateGoodsByComponent(component);
+                return ResultMap.success("");
+            } else {
+                return ResultMap.success("");
+            }
+        }
+    }
 }
 

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

@@ -1,5 +1,7 @@
 package com.uas.platform.b2c.prod.commodity.service.impl;
 
+import static com.uas.platform.b2c.core.utils.NumberUtil.fractionNumCeil;
+
 import com.alibaba.fastjson.JSON;
 import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.platform.b2c.common.account.service.EnterpriseService;
@@ -12,13 +14,34 @@ import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.utils.NumberUtil;
 import com.uas.platform.b2c.core.utils.RegexConstant;
 import com.uas.platform.b2c.core.utils.StringUtilB2C;
-import com.uas.platform.b2c.prod.commodity.constant.*;
-import com.uas.platform.b2c.prod.commodity.dao.*;
-import com.uas.platform.b2c.prod.commodity.model.*;
+import com.uas.platform.b2c.prod.commodity.constant.DoubleConstant;
+import com.uas.platform.b2c.prod.commodity.constant.ErrorInfoConstant;
+import com.uas.platform.b2c.prod.commodity.constant.ModifyConstant;
+import com.uas.platform.b2c.prod.commodity.constant.ShortConstant;
+import com.uas.platform.b2c.prod.commodity.constant.UploadConstant;
+import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
+import com.uas.platform.b2c.prod.commodity.dao.PCBDao;
+import com.uas.platform.b2c.prod.commodity.dao.PcbPropertyvalueDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductPersonDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductPrivateDao;
+import com.uas.platform.b2c.prod.commodity.dao.ReleaseProductByBatchDao;
+import com.uas.platform.b2c.prod.commodity.dao.V_ProductPrivateDao;
+import com.uas.platform.b2c.prod.commodity.model.Goods;
+import com.uas.platform.b2c.prod.commodity.model.GoodsQtyPrice;
+import com.uas.platform.b2c.prod.commodity.model.PCB;
+import com.uas.platform.b2c.prod.commodity.model.PCBPropertyValue;
+import com.uas.platform.b2c.prod.commodity.model.Product;
+import com.uas.platform.b2c.prod.commodity.model.ProductPerson;
+import com.uas.platform.b2c.prod.commodity.model.ProductPrivate;
+import com.uas.platform.b2c.prod.commodity.model.ReleaseProductByBatch;
+import com.uas.platform.b2c.prod.commodity.model.V_ProductPrivate;
 import com.uas.platform.b2c.prod.commodity.service.GoodsService;
 import com.uas.platform.b2c.prod.commodity.service.ReleaseProductByBatchService;
 import com.uas.platform.b2c.prod.commodity.util.GoodsUtil;
 import com.uas.platform.b2c.prod.commodity.util.SheetUtil;
+import com.uas.platform.b2c.prod.product.brand.dao.BrandInfoDao;
+import com.uas.platform.b2c.prod.product.brand.modal.BrandInfo;
 import com.uas.platform.b2c.prod.product.common.service.CreateNumberService;
 import com.uas.platform.b2c.prod.product.kind.dao.KindInfoDao;
 import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
@@ -33,11 +56,37 @@ import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.persistence.criteria.CriterionExpression;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
 import com.uas.platform.core.persistence.criteria.SimpleExpression;
+import java.math.BigDecimal;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.map.HashedMap;
 import org.apache.poi.hssf.usermodel.HSSFCell;
 import org.apache.poi.hssf.usermodel.HSSFDateUtil;
-import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.DateUtil;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.dao.DataAccessException;
@@ -50,22 +99,6 @@ import org.springframework.ui.ModelMap;
 import org.springframework.util.StringUtils;
 import org.springframework.web.client.RestTemplate;
 
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-import java.math.BigDecimal;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.*;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import static com.uas.platform.b2c.core.utils.NumberUtil.fractionNumCeil;
-
 @Service
 public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchService {
 
@@ -123,6 +156,9 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 	@Autowired
 	private V_ProductPrivateDao v_productPrivateDao;
 
+	@Autowired
+	private BrandInfoDao brandInfoDao;
+
 	private static final String SIZE = "尺寸";
 	private static final String COLOR = "颜色";
 	private static final String THICKCOPPER = "铜厚";
@@ -703,7 +739,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 			}
 			Object codeCellObj = readWorkBookCell(headerRow.getCell(UploadConstant.PRODUCT_CODE), Cell.CELL_TYPE_STRING,
 					0, UploadConstant.PRODUCT_CODE);
-			if (!"产品型号".equals(StringUtilB2C.getStr(codeCellObj))) {
+			if (!"型号".equals(StringUtilB2C.getStr(codeCellObj))) {
 				throw new IllegalOperatorException("您上传的信息列信息不正确,请与模板的列做比较");
 			}
 
@@ -723,7 +759,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 			}
 			Object codeCellObj = readWorkBookCell(headerRow.getCell(UploadConstant.PRODUCT_CODE), Cell.CELL_TYPE_STRING,
 					0, UploadConstant.PRODUCT_CODE);
-			if (!"产品型号".equals(StringUtilB2C.getStr(codeCellObj))) {
+			if (!"型号".equals(StringUtilB2C.getStr(codeCellObj))) {
 				throw new IllegalOperatorException("您上传的信息列信息不正确,请与模板的列做比较");
 			}
 			Object priceCellObj = readWorkBookCell(headerRow.getCell(UploadConstant.PRICE_START), Cell.CELL_TYPE_STRING,
@@ -967,6 +1003,19 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 			result += 1;
 		}
 		aProduct.setBrandEnByExcel(brandValue);
+		// pcb模块判断类目是否为商城标准品牌
+		if (isPcb && !StringUtils.isEmpty(aProduct.getBrandNameEn())) {
+			List<BrandInfo> brandInfos = brandInfoDao.findByNameEn(aProduct.getBrandNameEn());
+			if (CollectionUtils.isNotEmpty(brandInfos)) {
+				BrandInfo brandInfo = brandInfos.get(0);
+				if (brandInfo != null && brandInfo.getId() != null) {
+					aProduct.setBranduuid(brandInfo.getUuid());
+					aProduct.setBrandId(brandInfo.getId());
+				}
+			} else {
+				aProduct.addErrmsg(ErrorInfoConstant.BRAND_UNSTANDARD.getInfo());
+			}
+		}
 
 		Object kindValue = readWorkBookCell(row.getCell(UploadConstant.KIND), Cell.CELL_TYPE_STRING,
 				rowNum, UploadConstant.KIND);
@@ -1640,6 +1689,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 							pcb.setProductid(prId);
 							pcb.setBrandid(product.getPbrandid());
 							pcb.setKindid(product.getKindid());
+							pcb.setCreatetime(new Date());
 							pcbList.add(pcb);
 						}
 					}

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

@@ -1,8 +1,6 @@
 package com.uas.platform.b2c.prod.product.brand.dao;
 
-import java.util.List;
-
-import com.uas.platform.b2c.prod.product.brand.modal.BrandMostSimpleInfo;
+import com.uas.platform.b2c.prod.product.brand.modal.Brand;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
@@ -11,10 +9,10 @@ import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
-
-import com.uas.platform.b2c.prod.product.brand.modal.Brand;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.List;
+
 /**
  * 品牌
  * 
@@ -107,4 +105,13 @@ public interface BrandDao extends JpaSpecificationExecutor<Brand>, JpaRepository
 	 */
 	@Query(nativeQuery = true , value = "select * from product$brand order by br_search_count desc LIMIT 2")
 	public List<Brand> findMostSearchBrands();
+
+
+	/**
+	 * 根据品牌名称获取品牌信息
+	 * @param brandName
+	 * @return
+	 */
+	@Query(value = "select * from product$brand b where upper(b.br_name_cn) = upper(:brandName) or upper(b.br_name_en) = upper(:brandName)", nativeQuery = true)
+	List<Brand> findByName(@Param("brandName") String brandName);
 }

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

@@ -57,7 +57,7 @@ public class CompareController {
 		// 同一子类目判定
 		if (!CollectionUtils.isEmpty(componentInfos)) {
 			if (!componentInfos.get(0).getKindid().equals(component.getKindid())) {
-				throw new IllegalOperatorException("不是相同子类目下的产品不可以一起对比");
+				throw new IllegalOperatorException("不是相同子物料名称(类目)下的产品不可以一起对比");
 			}
 		}
 		// 重复判定

+ 1 - 1
src/main/java/com/uas/platform/b2c/prod/product/component/controller/ComponentController.java

@@ -100,7 +100,7 @@ public class ComponentController {
 	 */
 	@RequestMapping(value = "/codeAndKindId/{code}", method = RequestMethod.GET)
 	public List<Component> getComponentByCodeAndKindId(@PathVariable("code") String code, Long kindId) {
-		logger.log("器件信息", "获取器件信息", "通过原厂型号:" + code + " 和类目id: " + kindId + " 获取器件简要信息");
+		logger.log("器件信息", "获取器件信息", "通过原厂型号:" + code + " 和物料名称(类目)id: " + kindId + " 获取器件简要信息");
 		return componentService.findByCodeAndKindId(code, kindId);
 	}
 

+ 14 - 7
src/main/java/com/uas/platform/b2c/prod/product/component/dao/ComponentDao.java

@@ -1,16 +1,14 @@
 package com.uas.platform.b2c.prod.product.component.dao;
 
-import java.util.List;
-
-import javax.persistence.QueryHint;
-
+import com.uas.platform.b2c.prod.product.component.modal.Component;
 import org.springframework.data.jpa.repository.*;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
-
-import com.uas.platform.b2c.prod.product.component.modal.Component;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.persistence.QueryHint;
+import java.util.List;
+
 @Repository
 public interface ComponentDao extends JpaSpecificationExecutor<Component>, JpaRepository<Component, Long> {
 
@@ -57,10 +55,19 @@ public interface ComponentDao extends JpaSpecificationExecutor<Component>, JpaRe
 	 * @param brandid 品牌id
 	 * @return  器件信息
 	 */
-	@Query("select c from Component c where c.code = :code and c.brandid = :brandid")
+	@Query("select c from Component c where c.brandid = :brandid and upper(c.code) = upper(:code)")
 	@QueryHints({ @QueryHint(name = "org.hibernate.cacheable", value = "true") })
 	public List<Component> findByCodeAndBrandid(@Param("code") String code, @Param("brandid") Long brandid);
 
+	/**
+	 * 根据品牌id、原厂型号获取器件信息(因联合索引缘故,brandid作为前置索引)
+	 * @param brandid 品牌id
+	 * @param code 原厂型号
+	 * @return
+	 */
+	@Query("select c from Component c where c.brandid = :brandid and c.code = :code")
+	public List<Component> findByBrandidAndCode(@Param("brandid") Long brandid, @Param("code") String code);
+
 	/**
 	 * 根据原厂型号code和类目id(kindId)查找器件
 	 * 

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

@@ -1,5 +1,6 @@
 package com.uas.platform.b2c.prod.product.component.modal;
 
+import com.uas.platform.b2c.prod.commodity.model.ProductAttachSubmit;
 import com.uas.platform.b2c.prod.product.brand.modal.BrandInfo;
 import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
 import com.uas.platform.b2c.prod.product.property.model.PropertyValue;
@@ -783,4 +784,29 @@ public class Component implements Serializable {
 		}
 		this.properties = propertyValues;
 	}
+
+	/**
+	 * 利用物料规格书申请生成器件
+	 * @param submit 申请信息
+	 */
+	public Component(ProductAttachSubmit submit) {
+		Component component = new Component();
+		Date now = new Date();
+		this.brandid = submit.getBrandId();
+		this.attach = submit.getUploadAttach();
+		this.code = submit.getCode();
+		this.createTime = now;
+		this.description = submit.getSpec();
+		this.kindid = submit.getKindId();
+		this.modifyTime = now;
+		this.version = (short) 1;
+//		component.setBrandid(submit.getBrandId());
+//		component.setAttach(submit.getUploadAttach());
+//		component.setCode(submit.getCode());
+//		component.setCreateTime(now);
+//		component.setDescription(submit.getSpec());
+//		component.setKindid(submit.getKindId());
+//		component.setModifyTime(now);
+//		component.setVersion((short) 1);
+	}
 }

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

@@ -1,13 +1,12 @@
 package com.uas.platform.b2c.prod.product.component.modal;
 
 import com.alibaba.fastjson.annotation.JSONField;
+import com.uas.platform.b2c.core.support.SystemSession;
+import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import com.uas.platform.b2c.prod.commodity.model.Goods;
 import com.uas.platform.b2c.prod.commodity.model.GoodsQtyPrice;
-import com.uas.platform.b2c.prod.commodity.model.Product;
 import com.uas.platform.b2c.prod.product.brand.modal.BrandInfo;
 import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
-import com.uas.platform.b2c.core.support.SystemSession;
-import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import org.apache.commons.collections.CollectionUtils;
 import org.codehaus.jackson.annotate.JsonIgnore;
 import org.springframework.util.StringUtils;
@@ -264,7 +263,7 @@ public class ComponentGoods implements Serializable {
 	/**
 	 * 视图
 	 */
-	@Column(name = "go_spec")
+	@Column(name = "go_spec", length = 4000)
 	private String spec;
 
 	public Long getCmpId() {

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

@@ -261,4 +261,10 @@ public interface ComponentService {
 	 */
 	Component getComponentBySome(Long brandId, String cmpCode);
 
+	/**
+	 * 创建uuid
+	 * @param component 器件信息
+	 * @return
+	 */
+	String createUuid(Component component);
 }

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

@@ -2,6 +2,7 @@ package com.uas.platform.b2c.prod.product.component.service.impl;
 
 import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.common.search.rpc.service.SearchService;
+import com.uas.platform.b2c.common.search.util.PageParams;
 import com.uas.platform.b2c.core.config.SysConf;
 import com.uas.platform.b2c.core.constant.SplitChar;
 import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
@@ -30,8 +31,17 @@ import com.uas.platform.core.model.Type;
 import com.uas.platform.core.persistence.criteria.CriterionExpression.Operator;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
 import com.uas.platform.core.persistence.criteria.SimpleExpression;
-import com.uas.platform.b2c.common.search.util.PageParams;
-import com.uas.platform.b2c.common.search.util.PageParams.FilterField;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import javax.servlet.http.HttpServletRequest;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -44,13 +54,6 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.ui.ModelMap;
 import org.springframework.util.StringUtils;
 
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-import javax.servlet.http.HttpServletRequest;
-import java.util.*;
-
 @Service
 @Transactional
 public class ComponentServiceImpl implements ComponentService {
@@ -515,7 +518,7 @@ public class ComponentServiceImpl implements ComponentService {
 		List<Component> components = new ArrayList<Component>();
 		Kind targetKind = kindDao.findOne(kindId);
 		if (targetKind == null) {
-			throw new IllegalOperatorException("目标类目不存在");
+			throw new IllegalOperatorException("目标物料名称(类目)不存在");
 		}
 		Long oldKindId = null;
 		for (String uuid : uuids) {
@@ -531,7 +534,7 @@ public class ComponentServiceImpl implements ComponentService {
 		}
 		Kind resourceKind = kindDao.findOne(oldKindId);
 		if (resourceKind == null) {
-			throw new IllegalOperatorException("原类目不存在");
+			throw new IllegalOperatorException("原物料名称(类目)不存在");
 		}
 		resourceKind.setCount(resourceKind.getCount() - components.size());
 		targetKind.setCount(targetKind.getCount() + components.size());
@@ -584,4 +587,22 @@ public class ComponentServiceImpl implements ComponentService {
 		}
 		return null;
 	}
+
+	@Override
+	public String createUuid(Component component) {
+		if (component.getKindid() != null) {
+			Kind kind = kindDao.findOne(component.getKindid());
+			if (kind == null) {
+				throw new IllegalOperatorException("类目不存在");
+			} else {
+				String suffixStr = "";
+				for (int i = 0; i < 8 - String.valueOf(kind.getComponentsuffix()).length(); i++) {
+					suffixStr = suffixStr + "0";
+				}
+				return kind.getComponentPrefix() + suffixStr + kind.getComponentsuffix();
+			}
+		} else {
+			throw new IllegalOperatorException("器件类目为空");
+		}
+	}
 }

+ 13 - 13
src/main/java/com/uas/platform/b2c/prod/product/component/service/impl/ComponentSubmitServiceImpl.java

@@ -131,10 +131,10 @@ public class ComponentSubmitServiceImpl implements ComponentSubmitService {
 		if (componentSubmit.getKindid() != null) {
 			Kind kind = kindDao.findOne(componentSubmit.getKindid());
 			if (kind == null) {
-				throw new IllegalOperatorException("器件申请中所选类目不存在");
+				throw new IllegalOperatorException("器件申请中所选物料名称(类目)不存在");
 			}
 		} else {
-			throw new IllegalOperatorException("器件申请中所选类目不存在");
+			throw new IllegalOperatorException("器件申请中所选物料名称(类目)不存在");
 		}
 		if (componentSubmit.getBrandid() != null) {
 			Brand brand = brandDao.findOne(componentSubmit.getBrandid());
@@ -158,7 +158,7 @@ public class ComponentSubmitServiceImpl implements ComponentSubmitService {
 			// 验证同类目下器件code不允许重名
 			List<Component> componentsKind = componentDao.findByCodeAndKindid(componentSubmit.getCode(), componentSubmit.getKindid());
 			if (!CollectionUtils.isEmpty(componentsKind)) {
-				throw new IllegalOperatorException("此类目下的该原厂型号器件已存在");
+				throw new IllegalOperatorException("此物料名称(类目)下的该原厂型号器件已存在");
 			}
 			componentSubmit.setVersion((short) 1);
 			String suffixStr = "";
@@ -172,7 +172,7 @@ public class ComponentSubmitServiceImpl implements ComponentSubmitService {
 			Component existComponent = componentDao.findByUuid(componentSubmit.getUuid());
 			if (existComponent != null) {
 				if (!existComponent.getKindid().equals(componentSubmit.getKindid())) {
-					throw new IllegalOperatorException("此器件申请与原版本器件类目不符,不可审核通过");
+					throw new IllegalOperatorException("此器件申请与原版本器件物料名称(类目)不符,不可审核通过");
 				}
 				if (componentSubmit.getVersion() == null || componentSubmit.getVersion() != existComponent.getVersion()) {
 					throw new IllegalOperatorException("此器件申请版本号不正确");
@@ -373,8 +373,8 @@ public class ComponentSubmitServiceImpl implements ComponentSubmitService {
 		Row headerRow = sheet.getRow(0);
 		if (headerRow.getCell(0) != null && headerRow.getCell(1) != null && headerRow.getCell(2) != null && headerRow.getCell(3) != null && headerRow.getCell(4) != null
 				&& headerRow.getCell(5) != null) {
-			if (headerRow.getCell(0).getStringCellValue().trim().equals("一级类目") && headerRow.getCell(1).getStringCellValue().trim().equals("二级类目")
-					&& headerRow.getCell(2).getStringCellValue().trim().equals("三级类目") && headerRow.getCell(3).getStringCellValue().trim().equals("品牌")
+			if (headerRow.getCell(0).getStringCellValue().trim().equals("一级物料名称(类目)") && headerRow.getCell(1).getStringCellValue().trim().equals("二级物料名称(类目)")
+					&& headerRow.getCell(2).getStringCellValue().trim().equals("三级物料名称(类目)") && headerRow.getCell(3).getStringCellValue().trim().equals("品牌")
 					&& headerRow.getCell(4).getStringCellValue().trim().equals("原厂型号") && headerRow.getCell(5).getStringCellValue().trim().equals("参考网址")) {
 				if (headerRow != null) {
 					for (int r = 1; r <= rowNum; r++) {
@@ -713,8 +713,8 @@ public class ComponentSubmitServiceImpl implements ComponentSubmitService {
 				List<Object> header = headers.get(0).subList(0, 9);
 				List<Object> exceptHeader = new ArrayList<Object>();
 				exceptHeader.add("型号");
-				exceptHeader.add("商城类目");
-				exceptHeader.add("目标类目");
+				exceptHeader.add("商城物料名称(类目)");
+				exceptHeader.add("目标物料名称(类目)");
 				exceptHeader.add("商城品牌");
 				exceptHeader.add("来源网址");
 				exceptHeader.add("规格书");
@@ -746,7 +746,7 @@ public class ComponentSubmitServiceImpl implements ComponentSubmitService {
 						throw new IllegalOperatorException("上传文件必须大于0行小于10000行");
 					}
 				} else {
-					throw new IllegalOperatorException("表头格式错误,前8列应为 \'型号\',\'商城类目\',\'目标类目\',\'商城品牌\',\'来源网址\',\'规格书\',\'图片\',\'描述\'");
+					throw new IllegalOperatorException("表头格式错误,前8列应为 \'型号\',\'商城物料名称(类目)\',\'目标物料名称(类目)\',\'商城品牌\',\'来源网址\',\'规格书\',\'图片\',\'描述\'");
 				}
 			} else {
 				throw new IllegalOperatorException("表头信息错误,请核对后再上传");
@@ -822,11 +822,11 @@ public class ComponentSubmitServiceImpl implements ComponentSubmitService {
 			if (b2cKindName != null && StringUtils.hasText(b2cKindName.toString())) {
 				List<Kind> kinds = kindDao.findByNameCn(b2cKindName.toString().trim());
 				if (CollectionUtils.isEmpty(kinds)) {
-					throw new IllegalOperatorException("商城类目不存在");
+					throw new IllegalOperatorException("商城物料名称(类目)不存在");
 				}
 				commonData.put("b2cKind", kinds.get(0));
 			} else {
-				throw new IllegalOperatorException("商城类目为空");
+				throw new IllegalOperatorException("商城物料名称(类目)为空");
 			}
 
 			// 目标类目
@@ -834,7 +834,7 @@ public class ComponentSubmitServiceImpl implements ComponentSubmitService {
 			if (kindName != null &&  StringUtils.hasText(kindName.toString())) {
 				commonData.put("kindName", kindName.toString().trim());
 			} else {
-				throw new IllegalOperatorException("目标类目为空");
+				throw new IllegalOperatorException("目标物料名称(类目)为空");
 			}
 
 			// 商城品牌
@@ -908,7 +908,7 @@ public class ComponentSubmitServiceImpl implements ComponentSubmitService {
 		// 对应商城类目
 		Kind kind = kindDao.findOne(kindCrawl.getB2cKiId());
 		if (kind == null) {
-			throw new IllegalOperatorException("对应参数关系商城类目不存在");
+			throw new IllegalOperatorException("对应参数关系商城物料名称(类目)不存在");
 		}
 
 		// 写入器件数据

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

@@ -40,8 +40,8 @@ public class KindController {
 	 */
 	@RequestMapping("/{kindIds}")
 	@ResponseBody
-	@ApiOperation(value = "根据多个ID获取多个类目信息", httpMethod = "GET", notes = "允许获取多个分类,用逗号,分开")
-	@ControllerUsageLog(module = "根据多个ID获取多个类目信息", detail = "")
+	@ApiOperation(value = "根据多个ID获取多个物料名称(类目)信息", httpMethod = "GET", notes = "允许获取多个分类,用逗号,分开")
+	@ControllerUsageLog(module = "根据多个ID获取多个物料名称(类目)信息", detail = "")
 	public Iterable<Kind> getProductKind(@ApiParam(required = true, value = "id数组") @PathVariable("kindIds") String kindIds) {
 		return kindService.getProductKinds(kindIds);
 	}
@@ -54,7 +54,7 @@ public class KindController {
 	 */
 	@RequestMapping(value = "/{parentId}/children", method = RequestMethod.GET)
 	@ResponseBody
-	@ControllerUsageLog(module = "产品模块", detail = "获取类目的子类目")
+	@ControllerUsageLog(module = "产品模块", detail = "获取物料名称(类目)的子物料名称(类目)")
 	public List<Kind> getProductKinds(@PathVariable("parentId") Long parentId) {
 		return kindService.getChildProductKinds(parentId);
 	}

+ 2 - 2
src/main/java/com/uas/platform/b2c/prod/product/kind/controller/KindAdviceController.java

@@ -39,7 +39,7 @@ public class KindAdviceController {
 	@ResponseBody
 	public void submit(@RequestBody String json) {
 		KindAdvice advice = FastjsonUtils.fromJson(json, KindAdvice.class);
-		logger.log("类目建议", "保存类目建议", "保存类目建议,原因" + advice.getReason());
+		logger.log("物料名称(类目)建议", "保存物料名称(类目)建议", "保存物料名称(类目)建议,原因" + advice.getReason());
 		kindAdviceService.save(advice);
 	}
 
@@ -52,7 +52,7 @@ public class KindAdviceController {
 	@ResponseBody
 	public Page<KindAdvice> getAllAdvice(PageParams params) {
 		PageInfo info = new PageInfo(params);
-		logger.log("类目建议", "获取类目建议", "分页获取类目建议信息");
+		logger.log("物料名称(类目)建议", "获取物料名称(类目)建议", "分页获取物料名称(类目)建议信息");
 		return kindAdviceService.findAll(info);
 	}
 }

+ 14 - 14
src/main/java/com/uas/platform/b2c/prod/product/kind/controller/KindController.java

@@ -44,7 +44,7 @@ public class KindController {
 	public Kind save(Long parentId, @RequestBody String json) {
 		Kind kind = FastjsonUtils.fromJson(json, Kind.class);
 		kind = kindService.save(parentId, kind);
-		logger.log("类目管理", "新增类目", "新增类目,类目名:" + kind.getNameCn(), kind.getNameCn(), kind.getId());
+		logger.log("物料名称(类目)管理", "新增物料名称(类目)", "新增物料名称(类目)物料名称(类目)名:" + kind.getNameCn(), kind.getNameCn(), kind.getId());
 		return kind;
 	}
 
@@ -59,11 +59,11 @@ public class KindController {
 	 */
 	@RequestMapping(value = "/{kindId}", method = RequestMethod.POST)
 	@ResponseBody
-	@ApiOperation(value = "修改类目信息", httpMethod = "POST")
-	public Kind update(@ApiParam(required = true, value = "类目ID") @PathVariable("kindId") Long kindId, @ApiParam(required = true, value = "提交的数据") @RequestBody String json) {
+	@ApiOperation(value = "修改物料名称(类目)信息", httpMethod = "POST")
+	public Kind update(@ApiParam(required = true, value = "物料名称(类目)ID") @PathVariable("kindId") Long kindId, @ApiParam(required = true, value = "提交的数据") @RequestBody String json) {
 		Kind kind = FastjsonUtils.fromJson(json, Kind.class);
 		kind = kindService.updateKind(kindId, kind);
-		logger.log("类目管理", "修改类目", "修改类目名:" + kind.getNameCn(), kind.getNameCn(), kindId);
+		logger.log("物料名称(类目)管理", "修改物料名称(类目)", "修改物料名称(类目)名:" + kind.getNameCn(), kind.getNameCn(), kindId);
 		return kind;
 	}
 
@@ -75,7 +75,7 @@ public class KindController {
 	@RequestMapping(value = "/{kindId}", method = RequestMethod.DELETE)
 	@ResponseBody
 	public void delete(@PathVariable("kindId") Long kindId) {
-		logger.log("类目管理", "删除类目", "删除类目id:" + kindId);
+		logger.log("物料名称(类目)管理", "删除物料名称(类目)", "删除物料名称(类目)id:" + kindId);
 		kindService.delete(kindId);
 	}
 
@@ -90,7 +90,7 @@ public class KindController {
 	@RequestMapping(value = "/number", method = RequestMethod.POST, params = "operate=exchange")
 	@ResponseBody
 	public void exchangeNumber(Long preId, Long postId) {
-		logger.log("类目管理", "修改类目排序", "类目id顺序交换:" + preId + " 和 " + postId);
+		logger.log("物料名称(类目)管理", "修改物料名称(类目)排序", "物料名称(类目)id顺序交换:" + preId + " 和 " + postId);
 		kindService.exchangeNumber(preId, postId);
 	}
 
@@ -104,7 +104,7 @@ public class KindController {
 	@ResponseBody
 	public List<KindProperty> updateProperties(@PathVariable("kindId") Long kindId, @RequestBody String json) {
 		List<KindProperty> properties = FastjsonUtils.fromJsonArray(json, KindProperty.class);
-		logger.log("类目管理", "修改类目属性", "修改类目属性,类目id:" + kindId);
+		logger.log("物料名称(类目)管理", "修改物料名称(类目)属性", "修改物料名称(类目)属性,物料名称(类目)id:" + kindId);
 		return kindService.updateProperties(kindId, properties);
 	}
 
@@ -118,7 +118,7 @@ public class KindController {
 	@RequestMapping(value = "/kindCount/reset", method = RequestMethod.GET)
 	@ResponseBody
 	public void resetComponentCountGroupByKind() {
-		logger.log("类目管理", "统计类目下器件数量");
+		logger.log("物料名称(类目)管理", "统计物料名称(类目)下器件数量");
 		kindService.setKindCountByComponentActive();
 	}
 
@@ -132,7 +132,7 @@ public class KindController {
 	@RequestMapping(value = "/kindPropertyValues/reset", method = RequestMethod.GET)
 	@ResponseBody
 	public void resetKindPropertyValues() {
-		logger.log("类目管理", "类目标准属性可能值计算");
+		logger.log("物料名称(类目)管理", "物料名称(类目)标准属性可能值计算");
 		kindService.resetKindPropertyValues();
 	}
 
@@ -154,7 +154,7 @@ public class KindController {
 	 */
 	@RequestMapping(value = "/kindProperty/{kindPropertyId}", method = RequestMethod.DELETE)
 	public KindProperty deleteKindProperty(@PathVariable("kindPropertyId") Long kindPropertyId) {
-		logger.log("类目属性管理", "删除类目属性", "类目属性id:" + kindPropertyId);
+		logger.log("物料名称(类目)属性管理", "删除物料名称(类目)属性", "物料名称(类目)属性id:" + kindPropertyId);
 		return kindService.deleteKindProperty(kindPropertyId);
 	}
 
@@ -167,7 +167,7 @@ public class KindController {
 	@RequestMapping(value = "/kindProperty/add", method = RequestMethod.PUT)
 	public KindProperty addKindProperty(@RequestBody String json) {
 		KindProperty kindProperty = FastjsonUtils.fromJson(json, KindProperty.class);
-		logger.log("类目属性管理", "增加类目属性", "增加类目属性,属性id:" + kindProperty.getPropertyId() + ",属性名:" + kindProperty.getProperty().getLabelCn());
+		logger.log("物料名称(类目)属性管理", "增加物料名称(类目)属性", "增加物料名称(类目)属性,属性id:" + kindProperty.getPropertyId() + ",属性名:" + kindProperty.getProperty().getLabelCn());
 		return kindService.addKindProperty(kindProperty);
 	}
 
@@ -180,7 +180,7 @@ public class KindController {
 	@RequestMapping(value = "/kindProperty/update", method = RequestMethod.PUT)
 	public KindProperty updateKindProperty(@RequestBody String json) {
 		KindProperty kindProperty = FastjsonUtils.fromJson(json, KindProperty.class);
-		logger.log("类目属性管理", "更新类目属性", "更新类目属性,属性id: " + kindProperty.getPropertyId());
+		logger.log("物料名称(类目)属性管理", "更新物料名称(类目)属性", "更新物料名称(类目)属性,属性id: " + kindProperty.getPropertyId());
 		return kindService.updateKindProperty(kindProperty);
 	}
 
@@ -195,7 +195,7 @@ public class KindController {
 	 */
 	@RequestMapping(value = "/kindProperty/changeDetno", method = RequestMethod.PUT)
 	public List<KindProperty> changeDetno(Long activeId, Long passiveId) {
-		logger.log("类目属性管理", "调整类目属性顺序", "属性id : " + activeId + ",属性id: " + passiveId);
+		logger.log("物料名称(类目)属性管理", "调整物料名称(类目)属性顺序", "属性id : " + activeId + ",属性id: " + passiveId);
 		return kindService.changeDetno(activeId, passiveId);
 	}
 
@@ -208,7 +208,7 @@ public class KindController {
 	 */
 	@RequestMapping(value = "/kindProperty/changeKindProperty")
 	public KindProperty changeKindProperty(String labelCn, Long kindPropertyId) {
-		logger.log("类目属性管理", "更换类目属性", "类目属性id:" + kindPropertyId + ",替换成属性: " + labelCn);
+		logger.log("物料名称(类目)属性管理", "更换物料名称(类目)属性", "物料名称(类目)属性id:" + kindPropertyId + ",替换成属性: " + labelCn);
 		return kindService.changeKindProperty(labelCn, kindPropertyId);
 	}
 

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

@@ -64,4 +64,7 @@ public interface KindInfoDao extends JpaSpecificationExecutor<KindInfo>, JpaRepo
 	 * @return
 	 */
 	public KindInfo findByNameCn(String name);
+
+	@Query(value = "select findLeafKind(:parentid)", nativeQuery = true)
+	public String findLeafKind(@Param("parentid") Long parentid);
 }

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

@@ -62,6 +62,12 @@ public class KindInfo {
 	@Column(name = "ki_level")
 	private Short level;
 
+	/**
+	 * 类目下器件数量
+	 */
+	@Transient
+	private Integer count;
+
 	public Long getId() {
 		return id;
 	}
@@ -110,6 +116,14 @@ public class KindInfo {
 		this.level = level;
 	}
 
+	public Integer getCount() {
+		return count;
+	}
+
+	public void setCount(Integer count) {
+		this.count = count;
+	}
+
 	public Set<KindInfo> getChildren() {
 		return children;
 	}
@@ -174,7 +188,7 @@ public class KindInfo {
 	public static KindInfo getAllKind(){
 		KindInfo allKind = new KindInfo();
 		allKind.setIsLeaf((short) 1);
-		allKind.setNameCn("所有类目");
+		allKind.setNameCn("所有物料名称(类目)");
 		allKind.setLevel((short) 0);
 		allKind.setParentid(0L);
 		return allKind;

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

@@ -65,7 +65,7 @@ public class KindConcernServiceImpl implements KindConcernService {
             }
             if (StringUtils.isEmpty(kindConcern.getNameCn())) {
                 map.put("success", false);
-                map.put("message", "传入类目名称为空");
+                map.put("message", "传入物料名称(类目)为空");
                 return map;
             }
             kindConcern.setDate(new Date());
@@ -108,7 +108,7 @@ public class KindConcernServiceImpl implements KindConcernService {
             }
             if (StringUtils.isEmpty(kindConcern.getNameCn())) {
                 map.put("success", false);
-                map.put("message", "传入类目名称为空");
+                map.put("message", "传入物料名称(类目)为空");
                 return map;
             }
             KindConcern concern = kindConcernDao.findOne(kindConcern.getId());
@@ -267,13 +267,13 @@ public class KindConcernServiceImpl implements KindConcernService {
             List<KindConcern> kindConcerns = kindConcernDao.findAll(ids);
             if (CollectionUtils.isEmpty(kindConcerns)) {
                 map.put("success", false);
-                map.put("message", "未找到符合对应的类目关注记录");
+                map.put("message", "未找到符合对应的物料名称(类目)关注记录");
                 return map;
             }
             for (KindConcern kindConcern : kindConcerns) {
                 if (!enUU.equals(kindConcern.getEnUU())) {
                     map.put("success", false);
-                    map.put("message", "存在不属于当前企业的类目关注记录,无法删除");
+                    map.put("message", "存在不属于当前企业的物料名称(类目)关注记录,无法删除");
                     return map;
                 }
             }

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

@@ -1,13 +1,26 @@
 package com.uas.platform.b2c.prod.product.kind.service.impl;
 
+import com.uas.platform.b2c.core.support.view.JxlsExcelView;
+import com.uas.platform.b2c.core.utils.FastjsonUtils;
+import com.uas.platform.b2c.core.utils.PathUtils;
 import com.uas.platform.b2c.prod.commodity.dao.PCBDao;
 import com.uas.platform.b2c.prod.commodity.model.PCBPropertyValue;
 import com.uas.platform.b2c.prod.product.brand.dao.BrandInfoDao;
 import com.uas.platform.b2c.prod.product.brand.modal.BrandInfo;
 import com.uas.platform.b2c.prod.product.component.dao.ComponentDao;
 import com.uas.platform.b2c.prod.product.component.modal.Component;
-import com.uas.platform.b2c.prod.product.kind.dao.*;
-import com.uas.platform.b2c.prod.product.kind.model.*;
+import com.uas.platform.b2c.prod.product.kind.dao.KindContrastDao;
+import com.uas.platform.b2c.prod.product.kind.dao.KindDao;
+import com.uas.platform.b2c.prod.product.kind.dao.KindInfoDao;
+import com.uas.platform.b2c.prod.product.kind.dao.KindPropertyDao;
+import com.uas.platform.b2c.prod.product.kind.dao.KindPropertyValueDao;
+import com.uas.platform.b2c.prod.product.kind.model.Kind;
+import com.uas.platform.b2c.prod.product.kind.model.KindCrawl;
+import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
+import com.uas.platform.b2c.prod.product.kind.model.KindProperty;
+import com.uas.platform.b2c.prod.product.kind.model.KindPropertyOption;
+import com.uas.platform.b2c.prod.product.kind.model.KindPropertyUnit;
+import com.uas.platform.b2c.prod.product.kind.model.KindPropertyValues;
 import com.uas.platform.b2c.prod.product.kind.service.KindService;
 import com.uas.platform.b2c.prod.product.property.dao.PropertyCrawlDao;
 import com.uas.platform.b2c.prod.product.property.dao.PropertyDao;
@@ -15,16 +28,28 @@ import com.uas.platform.b2c.prod.product.property.dao.PropertyValueDao;
 import com.uas.platform.b2c.prod.product.property.model.Property;
 import com.uas.platform.b2c.prod.product.property.model.PropertyCrawl;
 import com.uas.platform.b2c.prod.product.property.model.PropertyValue;
-import com.uas.platform.b2c.core.utils.FastjsonUtils;
-import com.uas.platform.b2c.core.utils.PathUtils;
-import com.uas.platform.b2c.core.support.view.JxlsExcelView;
 import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.model.Constant;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.PageParams;
 import com.uas.platform.core.util.ArrayUtils;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
 import org.apache.commons.collections.CollectionUtils;
-import org.apache.velocity.runtime.directive.Foreach;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.InvalidDataAccessApiUsageException;
@@ -35,13 +60,6 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 import org.springframework.web.servlet.ModelAndView;
 
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-import java.io.*;
-import java.util.*;
-
 @Service
 public class KindServiceImpl implements KindService {
 
@@ -128,10 +146,10 @@ public class KindServiceImpl implements KindService {
 		} else {
 			parent = kindDao.findOne(parentid);
 			if (parent == null) {
-				throw new IllegalOperatorException("不可在不存在类目下添加子类目");
+				throw new IllegalOperatorException("不可在不存在物料名称(类目)下添加子物料名称(类目)");
 			} 
 			if (parent.getLevel() == 3) {
-				throw new IllegalOperatorException("不允许在三级类目下添加子类目");
+				throw new IllegalOperatorException("不允许在三级物料名称(类目)下添加子物料名称(类目)");
 			}
 			if (parent.getIsLeaf() == 1) {
 				// 如果parent是叶子节点,且带有标准器件,则禁止新增
@@ -147,7 +165,7 @@ public class KindServiceImpl implements KindService {
 		// 验证父类目下是否已存在相同的类目,存在则无法保存
 		List<Kind> exists = kindDao.findByParentidAndNameCn(parentid, kind.getNameCn());
 		if (CollectionUtils.isNotEmpty(exists)) {
-			throw new IllegalOperatorException("父类目下存在相同类目,无法保存");
+			throw new IllegalOperatorException("父物料名称(类目)下存在相同物料名称(类目),无法保存");
 		}
 
 		kind.setIsLeaf(Constant.YES);
@@ -305,7 +323,7 @@ public class KindServiceImpl implements KindService {
 			throw new IllegalArgumentException();
 		}
 		if (!preKind.getParentid().equals(postKind.getParentid())) {
-			throw new IllegalOperatorException("交换顺序的类目不属于同一父类目");
+			throw new IllegalOperatorException("交换顺序的物料名称(类目)不属于同一父物料名称(类目)");
 		}
 		// 交换序号,同时对序号为空的类目作默认赋值
 		short lastNumber = kindDao.findLastNumberByParentid(preKind.getParentid());
@@ -334,18 +352,18 @@ public class KindServiceImpl implements KindService {
 	public void delete(Long kindId) {
 		Kind kind = kindDao.findOne(kindId);
 		if (kind == null) {
-			throw new IllegalArgumentException("要删除的类目不存在");
+			throw new IllegalArgumentException("要删除的物料名称(类目)不存在");
 		}
 
 		// 不是叶子类目,不允许删除
 		if (!kind.isLeaf()) {
-			throw new IllegalOperatorException("您要删除的类目含有子类目,不可以删除");
+			throw new IllegalOperatorException("您要删除的物料名称(类目)含有子物料名称(类目),不可以删除");
 		}
 		// 检测有没有有效器件带有这个属性
 		try {
 			kindDao.delete(kind);
 		} catch (Exception e) {
-			throw new IllegalOperatorException("此类目下有有效的标准器件,禁止删除类目属性");
+			throw new IllegalOperatorException("此物料名称(类目)下有有效的标准器件,禁止删除物料名称(类目)属性");
 		}
 		// 如果父节点没有了子节点了,修改父节点为叶子节点
 		List<Kind> bothers = getChildProductKinds(kind.getParentid());
@@ -368,7 +386,7 @@ public class KindServiceImpl implements KindService {
 	private List<Kind> getParentsByChildId(Long childId, List<Kind> container) {
 		Kind child = kindDao.findOne(childId);
 		if (child == null) {
-			throw new IllegalOperatorException("要获取的父类目不存在");
+			throw new IllegalOperatorException("要获取的父物料名称(类目)不存在");
 		}
 		if (child.getParentid() != 0) {
 			getParentsByChildId(child.getParentid(), container);
@@ -409,7 +427,7 @@ public class KindServiceImpl implements KindService {
 			addCount(kindid, count);
 		}
 		long endTimeDate = new Date().getTime();
-		System.out.println("类目所属器件数量统计共耗时: " + (endTimeDate - starTimeDate) + "毫秒");
+		System.out.println("物料名称(类目)所属器件数量统计共耗时: " + (endTimeDate - starTimeDate) + "毫秒");
 	}
 
 	@Override
@@ -596,7 +614,7 @@ public class KindServiceImpl implements KindService {
 			kindPropertyDao.save(kindProperty_T);
 		}
 		long endTimeDate = new Date().getTime();
-		System.out.println("类目标准属性的可能值全部洗一遍共耗时: " + (endTimeDate - startTimeDate) + "毫秒");
+		System.out.println("物料名称(类目)标准属性的可能值全部洗一遍共耗时: " + (endTimeDate - startTimeDate) + "毫秒");
 	}
 
 	/**
@@ -688,7 +706,7 @@ public class KindServiceImpl implements KindService {
 
 				}
 				long endTimeDate = new Date().getTime();
-				System.out.println("对于新增的类目属性的值,计算时间是:" + (startTimeDate - endTimeDate) + "毫秒");
+				System.out.println("对于新增的物料名称(类目)属性的值,计算时间是:" + (startTimeDate - endTimeDate) + "毫秒");
 			}
 		});
 		t.start();
@@ -775,7 +793,7 @@ public class KindServiceImpl implements KindService {
 	public List<KindInfo> getStructruingKinds(Long id) {
 		KindInfo kindInfo = kindInfoDao.findOne(id);
 		if (kindInfo == null) {
-			throw new IllegalOperatorException("类目不存在");
+			throw new IllegalOperatorException("物料名称(类目)不存在");
 		}
 		return findStructingKinds(id);
 	}
@@ -923,7 +941,7 @@ public class KindServiceImpl implements KindService {
 		Kind kind = kindDao.findOne(kindProperty.getKindId());
 		for (KindProperty kp : kind.getProperties()) {
 			if (kp.getPropertyId().equals(kindProperty.getPropertyId())) {
-				throw new IllegalOperatorException("此类目中已有属性" + kindProperty.getProperty().getLabelCn() + ",请不要重复添加");
+				throw new IllegalOperatorException("此物料名称(类目)中已有属性" + kindProperty.getProperty().getLabelCn() + ",请不要重复添加");
 			}
 			if (kp.getDetno() >= kindProperty.getDetno()) {
 				kp.setDetno((short) (kp.getDetno() + 1));
@@ -963,10 +981,10 @@ public class KindServiceImpl implements KindService {
 		KindProperty active = kindPropertyDao.findOne(activeId);
 		KindProperty passive = kindPropertyDao.findOne(passiveId);
 		if (active == null || passive == null) {
-			throw new IllegalOperatorException("当前操作的类目属性不存在");
+			throw new IllegalOperatorException("当前操作的物料名称(类目)属性不存在");
 		}
 		if (!(active.getKindId().equals(passive.getKindId()))) {
-			throw new IllegalOperatorException("当前操作的类目属性不属于同一类目");
+			throw new IllegalOperatorException("当前操作的物料名称(类目)属性不属于同一物料名称(类目)");
 		}
 		short actNo = active.getDetno();
 		short passNo = passive.getDetno();
@@ -995,7 +1013,7 @@ public class KindServiceImpl implements KindService {
 	public KindProperty changeKindProperty(String labelCn, Long kindPropertyId) {
 		KindProperty kindProperty = kindPropertyDao.findOne(kindPropertyId);
 		if (kindProperty == null) {
-			throw new IllegalOperatorException("该类目属性不存在");
+			throw new IllegalOperatorException("该物料名称(类目)属性不存在");
 		}
 		final Long oldPropertyId = kindProperty.getPropertyId();
 		final Long kindId = kindProperty.getKindId();
@@ -1055,7 +1073,7 @@ public class KindServiceImpl implements KindService {
 					}
 				}
 				long endTime = new Date().getTime();
-				System.out.println("对于更改的类目属性的值,计算时间是:" + (startTime - endTime) + "毫秒");
+				System.out.println("对于更改的物料名称(类目)属性的值,计算时间是:" + (startTime - endTime) + "毫秒");
 			}
 		});
 		t.start();
@@ -1255,7 +1273,7 @@ public class KindServiceImpl implements KindService {
 	private List<KindInfo> getPCBParentsByChildId(Long childId, List<KindInfo> container) {
 		KindInfo child = kindInfoDao.findOne(childId);
 		if (child == null) {
-			throw new IllegalOperatorException("要获取的父类目不存在");
+			throw new IllegalOperatorException("要获取的父物料名称(类目)不存在");
 		}
 		if (child.getParentid() != 0) {
 			getPCBParentsByChildId(child.getParentid(), container);

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

@@ -1,10 +1,11 @@
 package com.uas.platform.b2c.prod.product.property.dao;
 
 import com.uas.platform.b2c.prod.product.property.model.Property;
+import java.util.List;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
-
-import java.util.List;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 
 public interface PropertyDao extends JpaSpecificationExecutor<Property>, JpaRepository<Property, Long> {
 
@@ -29,5 +30,6 @@ public interface PropertyDao extends JpaSpecificationExecutor<Property>, JpaRepo
 	 * @param labelCn
 	 * @return
 	 */
-	public Long findIdByLabelCn(String labelCn);
+	@Query(value = "select p.id from Property p where p.labelCn = :labelCn")
+	public Long findIdByLabelCn(@Param("labelCn") String labelCn);
 }

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

@@ -7,6 +7,7 @@ import com.uas.platform.b2c.prod.product.component.modal.Component;
 import com.uas.platform.b2c.prod.product.component.service.ComponentService;
 import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
 import com.uas.platform.b2c.prod.store.facade.CommodityFacade;
+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.commons.collections.CollectionUtils;
@@ -157,4 +158,13 @@ public class CommodityController {
 	public List<Goods> getLatestGoods(Long length) {
 		return goodsService.getLatestGoods(length);
 	}
+
+	@RequestMapping(value = "/cms/pcb", method = RequestMethod.GET)
+	public ResultMap getPcbCms() {
+		ResultMap resultMap = new ResultMap();
+		resultMap.setSuccess(true);
+		resultMap.setCode(200);
+		resultMap.setData(goodsService.getCmsPcb());
+		return resultMap;
+	}
 }

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

@@ -1,18 +1,22 @@
 package com.uas.platform.b2c.prod.store.facade.impl;
 
 import com.uas.platform.b2c.core.config.SysConf;
+import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
 import com.uas.platform.b2c.prod.commodity.service.GoodsService;
 import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
 import com.uas.platform.b2c.prod.product.kind.service.KindService;
 import com.uas.platform.b2c.prod.store.facade.CommodityFacade;
 import com.uas.platform.b2c.prod.store.service.CommodityService;
+import com.uas.platform.core.model.Constant;
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
-import java.util.*;
-
 /**
  * 商品外观实现类
  *
@@ -30,17 +34,21 @@ public class CommodityFacadeImpl implements CommodityFacade {
 
 	private final SysConf sysConf;
 
+	private final GoodsDao goodsDao;
+
 	@Autowired
-	public CommodityFacadeImpl(CommodityService commodityService, KindService kindService, GoodsService goodsService,SysConf sysConf) {
+	public CommodityFacadeImpl(CommodityService commodityService, KindService kindService, GoodsService goodsService,SysConf sysConf, GoodsDao goodsDao) {
 		this.commodityService = commodityService;
 		this.kindService = kindService;
 		this.goodsService = goodsService;
 		this.sysConf = sysConf;
+		this.goodsDao = goodsDao;
 	}
 
 	@Override
 	public List<KindInfo> getAllKindsInfoByStoreUuid(String storeUuid) {
 		final KindInfo allKind = KindInfo.getAllKind(); //外层所有类目包裹
+		allKind.setCount(goodsDao.countByStoreid(storeUuid));
 		Set<KindInfo> children = new LinkedHashSet<>();
 		if (StringUtils.hasText(storeUuid)) {
 			Set<Long> kindUuidSet = commodityService.findAllKindsByStoreUuid(storeUuid);
@@ -60,8 +68,26 @@ public class CommodityFacadeImpl implements CommodityFacade {
 				}
 			}
 		}
+
+		// 补充该店铺各类目下商品数量
+		for (KindInfo kindInfo : children) {
+			kindInfo.setCount(commodityService.countCommodityByKindAndStore(kindInfo, storeUuid));
+			if (kindInfo.getIsLeaf().equals(Constant.NO) && !CollectionUtils.isEmpty(kindInfo.getChildren())) {
+				for (KindInfo child : kindInfo.getChildren()) {
+					child.setCount(commodityService.countCommodityByKindAndStore(child, storeUuid));
+					if (child.getIsLeaf().equals(Constant.NO) && !CollectionUtils.isEmpty(kindInfo.getChildren())) {
+						for (KindInfo childKind : child.getChildren()) {
+							childKind.setCount(commodityService.countCommodityByKindAndStore(childKind, storeUuid));
+						}
+					}
+				}
+			}
+		}
+
 		if (count != 0){ //存在非标则添加其他类目
-			children.add(KindInfo.getOtherKind());
+			KindInfo kindInfo = KindInfo.getOtherKind();
+			kindInfo.setCount(count);
+			children.add(kindInfo);
 		}
 		allKind.setChildren(children);
 		return Collections.singletonList(allKind);

+ 3 - 0
src/main/java/com/uas/platform/b2c/prod/store/facade/impl/StoreInFacadeImpl.java

@@ -115,6 +115,9 @@ public class StoreInFacadeImpl implements StoreInFacade {
 			store.setStoreName(StringUtils.hasText(newStoreInfo.getStoreName()) ? newStoreInfo.getStoreName() : null);
 			store.setStoreApplication(StringUtils.hasText(newStoreInfo.getStoreApplication()) ? newStoreInfo.getStoreApplication() : null);
 			store.setDescription(newStoreInfo.getDescription());
+			if(!StringUtils.isEmpty(newStoreInfo.getLogoUrl())) {
+				store.setLogoUrl(newStoreInfo.getLogoUrl());
+			}
 			EnterpriseSimple enterprise = store.getEnterprise();
             EnterpriseSimple newEnterprise = newStoreInfo.getEnterprise();
 			enterprise.setEnUrl(newEnterprise.getEnUrl());

+ 9 - 0
src/main/java/com/uas/platform/b2c/prod/store/service/CommodityService.java

@@ -1,5 +1,6 @@
 package com.uas.platform.b2c.prod.store.service;
 
+import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
 import java.util.Set;
 
 /**
@@ -21,4 +22,12 @@ public interface CommodityService {
 	 * 获取所有类目信息
 	 */
 	Set<Long> findAllKinds();
+
+	/**
+	 * 通过店铺uuid和类目id获取上架商品数量
+	 * @param kindid 类目id
+	 * @param storeUuid 店铺uuid
+	 * @return
+	 */
+	Integer countCommodityByKindAndStore(KindInfo kindid, String storeUuid);
 }

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

@@ -1,12 +1,19 @@
 package com.uas.platform.b2c.prod.store.service.impl;
 
+import com.uas.platform.b2c.core.constant.SplitChar;
 import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
+import com.uas.platform.b2c.prod.product.kind.dao.KindInfoDao;
+import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
 import com.uas.platform.b2c.prod.store.service.CommodityService;
+import com.uas.platform.core.model.Constant;
+import com.uas.ps.core.util.StringUtils;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.Set;
-
 /**
  * 商品业务实现类
  *
@@ -18,9 +25,12 @@ public class CommodityServiceImpl implements CommodityService {
 
 	private final GoodsDao goodsDao;
 
+	private final KindInfoDao kindInfoDao;
+
 	@Autowired
-	public CommodityServiceImpl(GoodsDao goodsDao) {
+	public CommodityServiceImpl(GoodsDao goodsDao, KindInfoDao kindInfoDao) {
 		this.goodsDao = goodsDao;
+		this.kindInfoDao = kindInfoDao;
 	}
 
 	@Override
@@ -32,4 +42,24 @@ public class CommodityServiceImpl implements CommodityService {
 	public Set<Long> findAllKinds() {
 		return goodsDao.findAllKinds();
 	}
+
+	@Override
+	public Integer countCommodityByKindAndStore(KindInfo kind, String storeUuid) {
+		List<Long> kinds = new ArrayList<>();
+		if (kind.getIsLeaf().equals(Constant.YES)) {
+			kinds.add(kind.getId());
+		} else {
+			String ids = kindInfoDao.findLeafKind(kind.getId());
+			if (!StringUtils.isEmpty(ids)) {
+				String[] idstr = ids.split(SplitChar.COMMA);
+				for (int i = 0; i < idstr.length; i++) {
+					kinds.add(Long.valueOf(idstr[i]));
+				}
+			}
+		}
+		if (CollectionUtils.isNotEmpty(kinds)) {
+			return goodsDao.CountByStoreUuidAndKindid(storeUuid, kinds);
+		}
+		return 0;
+	}
 }

+ 1 - 1
src/main/java/com/uas/platform/b2c/trade/order/model/OrderDetail.java

@@ -358,7 +358,7 @@ public class OrderDetail extends Document implements Serializable{
 	/**
 	 * 规格信息
 	 */
-	@Column(name = "go_spec")
+	@Column(name = "go_spec", length = 4000)
 	private String spec;
 	
 	/**

+ 1 - 1
src/main/java/com/uas/platform/b2c/trade/order/model/PurchaseDetail.java

@@ -333,7 +333,7 @@ public class PurchaseDetail extends Document {
 	/**
 	 * 规格字段
 	 */
-	@Column(name = "go_spec")
+	@Column(name = "go_spec", length = 4000)
 	private String spec;
 
 

+ 11 - 1
src/main/java/com/uas/platform/b2c/trade/support/CodeType.java

@@ -63,7 +63,17 @@ public enum CodeType {
 	/**
 	 * 无操作权限
 	 */
-	NO_AUTHORITY(13, "NO_AUTHORITY");
+	NO_AUTHORITY(13, "NO_AUTHORITY"),
+
+	/**
+	 * 信息已修改
+	 */
+	INFO_MODIFY(14, "INFO_MODIFY"),
+
+	/**
+	 * 信息未修改
+	 */
+	INFO_NO_MODIFY(15, "INFO_NO_MODIFY");
 
 	private int code;
 

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

@@ -12,7 +12,7 @@ sso.cookie.browser=false
 sso.login.url=http://192.168.253.6:32323
 sso.logout.url=http://192.168.253.6:32323/logquit
 sso.register.url=http://192.168.253.6:32323/register/enterpriseRegistration
-sso.updatePassword.url=http://192.168.253.6:32323/reset/changePasswordChooseStyle
+sso.updatePassword.url=http://192.168.253.6:32323/reset/forgetPasswordValidationAccount
 sso.updateMobile.url=http://192.168.253.6:32323/validation/phoneValidation
 sso.updateEmail.url=http://192.168.253.6:32323/validation/emailValidation
 sso.updateQuestion.url=http://192.168.253.6:32323/encrypted-setting/EncryptedSetting

BIN
src/main/resources/jxls-tpl/product/componentBatchMaintenance.xls


BIN
src/main/resources/jxls-tpl/product/product-import.xls


BIN
src/main/resources/jxls-tpl/product/productStandarPutOn-error.xls


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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

@@ -11,7 +11,7 @@ sso.cookie.browser=false
 sso.login.url=https://sso.ubtob.com
 sso.logout.url=https://sso.ubtob.com/logquit
 sso.register.url=https://sso.ubtob.com/register/enterpriseRegistration
-sso.updatePassword.url=https://sso.ubtob.com/reset/changePasswordChooseStyle
+sso.updatePassword.url=https://sso.ubtob.com/reset/forgetPasswordValidationAccount
 sso.updateMobile.url=https://sso.ubtob.com/validation/phoneValidation
 sso.updateEmail.url=https://sso.ubtob.com/validation/emailValidation
 sso.updateQuestion.url=https://sso.ubtob.com/encrypted-setting/EncryptedSetting

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

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

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

@@ -86,6 +86,7 @@
 	<!-- erp对接页面 -->
 	<mvc:view-controller path="/user_erp" view-name="erp/user_center" />
 	<mvc:view-controller path="/vendor_erp" view-name="erp/vendor_center" />
+	<mvc:view-controller path="/sso" view-name="sso" />
 
 	<mvc:interceptors>
 		<!-- SSO过滤 -->

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

@@ -145,6 +145,8 @@
 					class="fa fa-shopping-cart"></i><span> 标准器件批量建档维护</span></a></li>
 			<li class="nav-node"><a href="#audit/componentMaintenance"><i
 					class="fa fa-shopping-cart"></i><span> 标准器件维护</span></a></li>
+			<li class="nav-node"><a href="#audit/RegulpicList"><i
+					class="fa fa-shopping-cart"></i><span> 规格书审核</span></a></li>
 			<li class="nav-node"><a href="#audit/kindContrast"><i
 					class="fa fa-shopping-cart"></i><span> 属性对应关系维护</span></a></li>
 			<li class="nav-node"><a href="#audit/crawlTask"><i

+ 1 - 0
src/main/webapp/WEB-INF/views/normal/default/404.html

@@ -52,6 +52,7 @@
 				<div class="head-top-right fr">
 					<a href="/platform-b2c/vendor#/index">卖家中心</a>
 					<a href="/platform-b2c/user#/home">买家中心</a>
+					<a href="/platform-b2c/sso#/index">帐户中心</a>
 					<a href="#">加入收藏</a>
 					<a href="/platform-b2c/help#/home" target="_blank">帮助中心</a>
 					<a href="http://wpa.qq.com/msgrd?v=3&uin=3432892085&site=www.ubtoc.com&menu=yes">在线客服</a>

+ 120 - 0
src/main/webapp/WEB-INF/views/normal/sso.html

@@ -0,0 +1,120 @@
+<!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>帐户中心-优软商城</title>
+<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/fontawesome/css/font-awesome.min.css" />
+<link rel="stylesheet" href="static/lib/jquery/themes/summernote/css/summernote.css" />
+<link rel="stylesheet" href="static/lib/iconfont/css/iconfont.css" />
+<link rel="stylesheet" href="static/lib/jquery/themes/uploadify/uploadify.css" />
+<link rel="stylesheet" href="static/lib/angular/toaster.css" />
+<link rel="stylesheet" href="static/css/common.css" />
+<!--<link rel="stylesheet" href="static/css/usercenter.css" />-->
+<link rel="stylesheet" href="static/css/user/base.css" />
+<link rel="stylesheet" href="static/css/user/user.css" />
+<link rel="stylesheet" href="static/lib/calendar/calendar.css">
+<link rel="stylesheet" type="text/css" href="static/lib/keyboard/css/softkeys-0.0.1.css">
+<link rel="stylesheet" href="static/lib/angular/ng-table.css">
+    <link rel="stylesheet" href="static/css/commonComponent.css" />
+	<link rel="stylesheet" href="static/css/common/linkSaler.css" />
+	<link rel="stylesheet" href="static/css/vendor/sell.css" />
+</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 -->
+	<header>
+		<div ng-include src="'static/view/common/site-nav.html'"></div>
+		<div ng-include src="'static/view/sso/header.html'"></div>
+	</header>
+
+	<section class="clearfix">
+		<div class="wrap">
+			<div class="user_content">
+				<div ng-include src="'static/view/sso/left_nav.html'" ></div>
+				<div ui-view=""></div>
+			</div>
+		</div>
+	</section>
+	<footer class="clearfix">
+		<div ng-include src="'static/view/common/footer.html'" style="margin-top: 40px;"></div>
+	</footer>
+	<div ng-include src="'static/view/common/sidebar.html'"></div>
+
+	<!--&lt;!&ndash; header 标题Logo和搜索框 Start &ndash;&gt;-->
+	<!--<div ng-include src="'static/view/common/header.html'"></div>-->
+	<!--&lt;!&ndash; header 标题Logo和搜索框 End &ndash;&gt;-->
+	<!--&lt;!&ndash; navigation 导航栏 Start &ndash;&gt;-->
+	<!--<div ng-include src="'static/view/common/nav.html'"></div>-->
+	<!--&lt;!&ndash; navigation 导航栏  End &ndash;&gt;-->
+
+	<!--&lt;!&ndash; Start &ndash;&gt;-->
+	<!--<div class="main-panel" id="main">-->
+		<!--<div class="container">-->
+			<!--&lt;!&ndash; 左侧导航栏 Start &ndash;&gt;-->
+			<!--<div class="left">-->
+				<!--<div ng-include src="'static/view/usercenter/left_nav.html'"></div>-->
+			<!--</div>-->
+			<!--&lt;!&ndash; 左侧导航栏 End &ndash;&gt;-->
+			<!--&lt;!&ndash; 核心内容 Start &ndash;&gt;-->
+			<!--<div class="right">-->
+				<!--<div ui-view></div>-->
+			<!--</div>-->
+			<!--&lt;!&ndash; 核心内容 End &ndash;&gt;-->
+		<!--</div>-->
+	<!--</div>-->
+	<!--&lt;!&ndash; End &ndash;&gt;-->
+	<!--&lt;!&ndash; 页脚 Start &ndash;&gt;-->
+	<!--<div ng-include src="'static/view/common/footer.html'"></div>-->
+	<!--&lt;!&ndash; 页脚 End &ndash;&gt;-->
+
+	<!--&lt;!&ndash; 侧边栏Start &ndash;&gt;-->
+	<!--<div ng-include src="'static/view/common/sidebar.html'"></div>-->
+	<!--&lt;!&ndash; 侧边栏End &ndash;&gt;-->
+
+	<script type="text/javascript" src="static/lib/require.js"
+		data-main="static/js/sso/main.js"></script>
+	<script type="text/ng-template" id="offer/image/insert.html">
+		<div class="modal-header">
+			<button type="button" class="close" ng-click="close()">×</button>
+			<h4 class="modal-title">插入图片</h4>
+		</div>
+		<div class="modal-body">
+			<div class="row">
+				<div class="col-xs-7" style="padding: 20px;">
+					<p class="help-block">提示:选择的图片单张大小不超过3MB,支持jpg,jpeg,gif,bmp,png</p>
+					<div class="upload-container" ng-disabled="getImages().length == images.length">
+						<div id="uploadify" on-success="onUploadSuccess($data)" uploadify="{buttonText:'选择图片'}"></div>
+					</div>
+				</div>
+				<div class="col-xs-5">
+					<h3>预览</h3>
+					<div class="image-content">
+						<img ng-src="{{image.src}}" class="img-thumbnail" style="width: 100px; height: 100px;">
+					</div>
+				</div>
+			</div>
+		</div>
+		<div class="modal-footer">
+			<div class="pull-right"><a ng-click="confirm()" class="btn btn-primary" ng-disabled="!image.src">确定</a></div>
+		</div>
+	</script>
+	<script src="static/lib/jquery/jquery.min.js"></script>
+	<script src="static/lib/keyboard/js/softkeys-0.0.1.js"></script>
+</body>
+</html>

+ 0 - 95
src/main/webapp/WEB-INF/views/normal/user_center-0321.html

@@ -1,95 +0,0 @@
-<!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>买家中心-优软商城</title>
-<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/fontawesome/css/font-awesome.min.css" />
-<link rel="stylesheet"
-	href="static/lib/jquery/themes/summernote/css/summernote.css" />
-<link rel="stylesheet" href="static/lib/iconfont/css/iconfont.css" />
-<link rel="stylesheet"
-	href="static/lib/jquery/themes/uploadify/uploadify.css" />
-<link rel="stylesheet" href="static/lib/angular/toaster.css" />
-<link rel="stylesheet" href="static/css/common.css" />
-<link rel="stylesheet" href="static/css/usercenter.css" />
-
-</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 -->
-
-	<!-- header 标题Logo和搜索框 Start -->
-	<div ng-include src="'static/view/common/header.html'"></div>
-	<!-- header 标题Logo和搜索框 End -->
-	<!-- navigation 导航栏 Start -->
-	<div ng-include src="'static/view/common/nav.html'"></div>
-	<!-- navigation 导航栏  End -->
-
-	<!-- Start -->
-	<div class="main-panel" id="main">
-		<div class="container">
-			<!-- 左侧导航栏 Start -->
-			<div class="left">
-				<div ng-include src="'static/view/usercenter/left.html'"></div>
-			</div>
-			<!-- 左侧导航栏 End -->
-			<!-- 核心内容 Start -->
-			<div class="right">
-				<div ui-view></div>
-			</div>
-			<!-- 核心内容 End -->
-		</div>
-	</div>
-	<!-- End -->
-	<!-- 页脚 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/usercenter/main.js"></script>
-	<script type="text/ng-template" id="offer/image/insert.html">
-		<div class="modal-header">
-			<button type="button" class="close" ng-click="close()">×</button>
-			<h4 class="modal-title">插入图片</h4>
-		</div>
-		<div class="modal-body">
-			<div class="row">
-				<div class="col-xs-7" style="padding: 20px;">
-					<p class="help-block">提示:选择的图片单张大小不超过3MB,支持jpg,jpeg,gif,bmp,png</p>
-					<div class="upload-container" ng-disabled="getImages().length == images.length">
-						<div id="uploadify" on-success="onUploadSuccess($data)" uploadify="{buttonText:'选择图片'}"></div>
-					</div>
-				</div>
-				<div class="col-xs-5">
-					<h3>预览</h3>
-					<div class="image-content">
-						<img ng-src="{{image.src}}" class="img-thumbnail" style="width: 100px; height: 100px;">
-					</div>
-				</div>
-			</div>
-		</div>
-		<div class="modal-footer">
-			<div class="pull-right"><a ng-click="confirm()" class="btn btn-primary" ng-disabled="!image.src">确定</a></div>
-		</div>
-	</script>
-</body>
-</html>

+ 0 - 68
src/main/webapp/WEB-INF/views/normal/vendor_center-0323.html

@@ -1,68 +0,0 @@
-<!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>卖家中心-优软商城</title>
-<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/ng-table.css" />
-<link rel="stylesheet"
-	href="static/lib/fontawesome/css/font-awesome.min.css" />
-<link rel="stylesheet" href="static/lib/iconfont/css/iconfont.css" />
-<link rel="stylesheet" href="static/lib/angular/toaster.css" />
-<link rel="stylesheet" href="static/css/common.css" />
-<link rel="stylesheet" href="static/css/vendor.css" />
-</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 -->
-
-	<!-- header 标题Logo和搜索框 Start -->
-	<div ng-include src="'static/view/common/header.html'"></div>
-	<!-- header 标题Logo和搜索框 End -->
-
-	<!-- navigation 导航栏 Start -->
-	<div ng-include src="'static/view/common/nav.html'"></div>
-	<!-- navigation 导航栏  End -->
-
-	<!-- 主体内容 Start -->
-	<div class="main-panel" id="main">
-		<div class="container">
-			<!-- 左侧导航栏 Start -->
-			<div class="left">
-				<div ng-include src="'static/view/vendor/left.html'"></div>
-			</div>
-			<!-- 左侧导航栏 End -->
-			<!-- 核心内容 Start -->
-			<div class="right">
-				<div ui-view></div>
-			</div>
-			<!-- 核心内容 End -->
-		</div>
-	</div>
-	<!-- 主体内容 End -->
-
-	<!-- 页脚 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/vendor/main.js"></script>
-</body>
-</html>

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

@@ -403,7 +403,7 @@ input.ng-invalid.ng-dirty,textarea.ng-invalid.ng-dirty {
 .modal-open .modal {
     overflow-x: hidden;
     overflow-y: hidden;
-		z-index: 1000000 !important;
+		z-index: 999995 !important;
 }
 
 

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