Browse Source

Merge branch 'dev' into feature-fileupload-20181023-wangyc

wangyc 7 years ago
parent
commit
c72ce855eb
100 changed files with 5520 additions and 1102 deletions
  1. 1 1
      pom.xml
  2. 9 3
      src/main/java/com/uas/platform/b2c/common/account/controller/AuthenticationController.java
  3. 8 4
      src/main/java/com/uas/platform/b2c/common/account/service/impl/EnterpriseServiceImpl.java
  4. 1 0
      src/main/java/com/uas/platform/b2c/common/account/v2/service/impl/EnterpriseServiceImpl.java
  5. 15 0
      src/main/java/com/uas/platform/b2c/core/constant/Status.java
  6. 5 0
      src/main/java/com/uas/platform/b2c/core/support/view/JxlsExcelView.java
  7. 45 0
      src/main/java/com/uas/platform/b2c/core/utils/CollectionUtils.java
  8. 4 4
      src/main/java/com/uas/platform/b2c/core/utils/StringUtilB2C.java
  9. 1 1
      src/main/java/com/uas/platform/b2c/fa/payment/service/impl/InstallmentServiceImpl.java
  10. 1 1
      src/main/java/com/uas/platform/b2c/fa/settlement/service/impl/BillServiceImpl.java
  11. 1 1
      src/main/java/com/uas/platform/b2c/logistics/service/impl/InvoiceServiceImpl.java
  12. 25 17
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/ErrorInfoConstant.java
  13. 11 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/IntegerConstant.java
  14. 5 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/StringConstant.java
  15. 1 1
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/UploadConstant.java
  16. 178 8
      src/main/java/com/uas/platform/b2c/prod/commodity/controller/GoodsController.java
  17. 127 17
      src/main/java/com/uas/platform/b2c/prod/commodity/controller/ProductController.java
  18. 18 0
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/ProductMatchResultDao.java
  19. 20 0
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/ProductPersonDao.java
  20. 11 0
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/V_ProductPrivateDao.java
  21. 21 0
      src/main/java/com/uas/platform/b2c/prod/commodity/model/AbstractKeyEntity.java
  22. 60 6
      src/main/java/com/uas/platform/b2c/prod/commodity/model/Goods.java
  23. 36 0
      src/main/java/com/uas/platform/b2c/prod/commodity/model/GoodsFilter.java
  24. 3 1
      src/main/java/com/uas/platform/b2c/prod/commodity/model/Product.java
  25. 14 11
      src/main/java/com/uas/platform/b2c/prod/commodity/model/ReleaseProductByBatch.java
  26. 16 0
      src/main/java/com/uas/platform/b2c/prod/commodity/model/V_ProductPrivate.java
  27. 62 0
      src/main/java/com/uas/platform/b2c/prod/commodity/service/GoodsService.java
  28. 22 0
      src/main/java/com/uas/platform/b2c/prod/commodity/service/ProductPersonService.java
  29. 33 0
      src/main/java/com/uas/platform/b2c/prod/commodity/service/ProductService.java
  30. 431 193
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsServiceImpl.java
  31. 81 0
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ProductPersonServiceImpl.java
  32. 233 48
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ProductServiceImpl.java
  33. 42 66
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ReleaseProductByBatchServiceImpl.java
  34. 22 1
      src/main/java/com/uas/platform/b2c/prod/commodity/type/ReleaseConstant.java
  35. 15 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/dao/BrandDao.java
  36. 8 0
      src/main/java/com/uas/platform/b2c/prod/product/common/model/CreateNumber.java
  37. 60 28
      src/main/java/com/uas/platform/b2c/prod/product/common/service/impl/CreateNumberServiceImpl.java
  38. 14 2
      src/main/java/com/uas/platform/b2c/prod/store/controller/StoreApplyController.java
  39. 8 0
      src/main/java/com/uas/platform/b2c/prod/store/facade/StoreApplyFacade.java
  40. 63 3
      src/main/java/com/uas/platform/b2c/prod/store/facade/impl/StoreApplyFacadeImpl.java
  41. 36 0
      src/main/java/com/uas/platform/b2c/prod/store/model/BrandCount.java
  42. 88 0
      src/main/java/com/uas/platform/b2c/prod/store/model/KindHierarchicalCount.java
  43. 19 2
      src/main/java/com/uas/platform/b2c/prod/store/model/StoreApply.java
  44. 79 52
      src/main/java/com/uas/platform/b2c/prod/store/service/impl/StoreApplyServiceImpl.java
  45. 1 1
      src/main/java/com/uas/platform/b2c/trade/deprecated/service/impl/SuDemandServiceImpl.java
  46. 14 0
      src/main/java/com/uas/platform/b2c/trade/order/dao/TableTestDao.java
  47. 36 0
      src/main/java/com/uas/platform/b2c/trade/order/model/TableTest.java
  48. 3 3
      src/main/java/com/uas/platform/b2c/trade/order/service/impl/OrderServiceImpl.java
  49. 35 2
      src/main/java/com/uas/platform/b2c/trade/order/service/impl/PurchaseProductServiceImpl.java
  50. 2 1
      src/main/java/com/uas/platform/b2c/trade/order/task/OrderTask.java
  51. 4 5
      src/main/java/com/uas/platform/b2c/trade/rate/task/RateTask.java
  52. 1 1
      src/main/java/com/uas/platform/b2c/trade/seek/service/impl/SeekPurchaseOfferServiceImpl.java
  53. 2 3
      src/main/java/com/uas/platform/b2c/trade/seek/utils/DateUtils.java
  54. 147 23
      src/main/java/com/uas/platform/b2c/trade/vendor/service/impl/VendorIntroductionServiceImpl.java
  55. BIN
      src/main/resources/jxls-tpl/trade/background.xls
  56. BIN
      src/main/resources/jxls-tpl/trade/brandCount.xls
  57. BIN
      src/main/resources/jxls-tpl/trade/kindHierarchical.xls
  58. BIN
      src/main/resources/jxls-tpl/trade/product_background.xls
  59. BIN
      src/main/resources/jxls-tpl/trade/releaseByBatch-rmb.xls
  60. BIN
      src/main/resources/jxls-tpl/trade/releasebyBatch-usd.xls
  61. 1 1
      src/main/resources/logback.xml
  62. 3 3
      src/main/resources/pre/sys.properties
  63. 4 5
      src/main/webapp/WEB-INF/views/normal/adminWithNav.html
  64. 1 0
      src/main/webapp/resources/css/b2bCommon.css
  65. 24 7
      src/main/webapp/resources/js/admin/app.js
  66. 8 1
      src/main/webapp/resources/js/admin/controllers/StoreApplicationCtrl.js
  67. 35 13
      src/main/webapp/resources/js/admin/controllers/StoreQualificationCtrl.js
  68. 0 37
      src/main/webapp/resources/js/admin/controllers/b2b/b2bManageCtrl.js
  69. 40 0
      src/main/webapp/resources/js/admin/controllers/product/brandProductsCountCtrl.js
  70. 40 0
      src/main/webapp/resources/js/admin/controllers/product/categoryNumberCtrl.js
  71. 30 0
      src/main/webapp/resources/js/admin/controllers/product/merchantProductsCtrl.js
  72. 194 3
      src/main/webapp/resources/js/admin/controllers/product/productManageCtrl.js
  73. 6 3
      src/main/webapp/resources/js/admin/controllers/product/productManageDetailCtrl.js
  74. 877 0
      src/main/webapp/resources/js/admin/controllers/product/saleProductManageCtrl.js
  75. 24 2
      src/main/webapp/resources/js/common/query/goods.js
  76. 5 1
      src/main/webapp/resources/js/common/query/storeInfo.js
  77. 1 1
      src/main/webapp/resources/js/sso/controllers/rolePermissionCtrl.js
  78. 6 0
      src/main/webapp/resources/js/usercenter/app.js
  79. 1 1
      src/main/webapp/resources/js/usercenter/controllers/forstore/seek_purchase_ctrl.js
  80. 718 0
      src/main/webapp/resources/js/usercenter/controllers/forstore/single_entry_ctrl.js
  81. 29 2
      src/main/webapp/resources/js/vendor/controllers/forstore/single_entry.js
  82. 1 1
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_store_maintain_ctrl.js
  83. 0 53
      src/main/webapp/resources/view/admin/b2b/manage.html
  84. 0 5
      src/main/webapp/resources/view/admin/index.html
  85. 47 0
      src/main/webapp/resources/view/admin/product/brandProductsCount.html
  86. 51 0
      src/main/webapp/resources/view/admin/product/categoryNumber.html
  87. 55 0
      src/main/webapp/resources/view/admin/product/merchantProducts.html
  88. 454 431
      src/main/webapp/resources/view/admin/product/productManage.html
  89. 54 14
      src/main/webapp/resources/view/admin/product/productManageDetail.html
  90. 583 0
      src/main/webapp/resources/view/admin/product/saleProductManage.html
  91. 7 2
      src/main/webapp/resources/view/admin/store_application_maintenance.html
  92. 12 4
      src/main/webapp/resources/view/admin/store_qualification_maintenance.html
  93. 1 1
      src/main/webapp/resources/view/sso/left_nav.html
  94. 1 1
      src/main/webapp/resources/view/sso/rolePermission.html
  95. 4 0
      src/main/webapp/resources/view/sso/ssoAddress.html
  96. 1 0
      src/main/webapp/resources/view/usercenter/b2b/Purc/cart.html
  97. 1 0
      src/main/webapp/resources/view/usercenter/b2b/Purc/inquiry_unapply.html
  98. 1 0
      src/main/webapp/resources/view/usercenter/b2b/Purc/purchaseInquiryCtrl.html
  99. 1 0
      src/main/webapp/resources/view/usercenter/b2b/Purc/tender_answer_list.html
  100. 1 0
      src/main/webapp/resources/view/usercenter/b2b/Purc/tenderlist.html

+ 1 - 1
pom.xml

@@ -690,7 +690,7 @@
 				<artifactId>tomcat7-maven-plugin</artifactId>
 				<version>2.2</version>
 				<configuration>
-					<port>8080</port>
+					<port>8090</port>
 					<path>/</path>
 					<uriEncoding>utf-8</uriEncoding>
 				</configuration>

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

@@ -1,5 +1,7 @@
 package com.uas.platform.b2c.common.account.controller;
 
+import com.uas.platform.b2c.common.account.dao.EnterpriseDao;
+import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.common.account.model.UserInfo;
 import com.uas.platform.b2c.common.account.service.RoleService;
@@ -41,6 +43,8 @@ public class AuthenticationController {
 	@Autowired
 	private RoleService roleService;
 
+	@Autowired
+	private EnterpriseDao enterpriseDao;
 
 	@RequestMapping(method = RequestMethod.GET, headers = "Accept=application/json")
 	@ResponseBody
@@ -101,17 +105,19 @@ public class AuthenticationController {
 	@ResponseBody
 	public void switchEnterprise(@PathVariable("enUU") long enUU, HttpServletRequest request, HttpServletResponse response) {
 		userService.saveLoginTime(enUU);
-		User user = userService.switchEnterprise(enUU);
-		request.getSession().setAttribute("user", user);
-
 		SSOToken token = (SSOToken)SSOHelper.getToken(request);
 		UserAccount tokenUser = FastjsonUtils.fromJson(token.getData(), UserAccount.class);
+		User user = userService.switchEnterprise(enUU);
+		request.getSession().setAttribute("user", user);
 		if (enUU == 0L) {
 			tokenUser.setSpaceUU(null);
 			tokenUser.setBusinessCode(null);
 			tokenUser.setSpaceName(null);
 		} else {
+			Enterprise enterprise = enterpriseDao.findByUu(enUU);
 			tokenUser.setSpaceUU(enUU);
+			tokenUser.setBusinessCode(enterprise.getEnBussinessCode());
+			tokenUser.setSpaceName(enterprise.getEnName());
 		}
 		token.setData(FastjsonUtils.toJson(tokenUser));
 		// 设置cookie

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

@@ -306,16 +306,20 @@ public class EnterpriseServiceImpl implements EnterpriseService{
 	}
 
 	@Override
-	public Enterprise openVendor(Long enUU , boolean isRead , boolean isOpen) {
+	public Enterprise openVendor(Long enUU, boolean isRead, boolean isOpen) {
 		Enterprise existEnterprise = enterpriseDao.findOne(enUU);
-		if (isOpen){
+		if (isOpen) {
 			existEnterprise.setEnMallVendorStatus((short) Status.ENABLED.value());
 			Enterprise enterprise = enterpriseDao.save(existEnterprise);
 			return null;
 		}
 		if (isRead) {
+			if (!StringUtils.isEmpty(existEnterprise.getEnMallVendorStatus())
+					&& existEnterprise.getEnMallVendorStatus().equals((short) Status.ENABLED.value())) {
+				return null;
+			}
 			existEnterprise.setEnMallVendorStatus((short) Status.ISREAD.value());
-		}else{
+		} else {
 			existEnterprise.setEnMallVendorStatus(null);
 		}
 		Enterprise enterprise = enterpriseDao.save(existEnterprise);
@@ -335,7 +339,7 @@ public class EnterpriseServiceImpl implements EnterpriseService{
 		}
 		if (enterprise != null && !StringUtils.isEmpty(enterprise.getEnTel())) {
 			tels.put("entel", enterprise.getEnTel());
-			tels.put("enuu", enterprise.getUu()+"");
+			tels.put("enuu", enterprise.getUu() + "");
 		}
 		resultMap.setData(tels);
 		return resultMap;

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

@@ -65,6 +65,7 @@ public class EnterpriseServiceImpl implements EnterpriseService {
         if (!StringUtils.isEmpty(userSpaceView.getAccessSecret())) {
             enterprise.setAccessSecret(userSpaceView.getAccessSecret());
         }
+        enterprise.setEnDate(new Date(userSpaceView.getRegisterDate()));
         enterprise.setEnAddress(userSpaceView.getRegAddress());
         enterprise.setEnCorporation(userSpaceView.getCorporation());
         enterprise.setEnBussinessCode(userSpaceView.getBusinessCode());

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

@@ -285,6 +285,21 @@ public enum Status {
      */
     UNAVAILABLE_NOPAID(603, "无效的(因未按时付款)"),
 
+    /**
+     * {@code 601 有货}
+     */
+    HAS_INVENTORY(601, "有货"),
+
+    /**
+     * {@code 602 不足起订量}
+     */
+    LESS_THAN_MINORDER(602, "不足起订量"),
+
+    /**
+     * {@code 601 无货}
+     */
+    HAS_NO_INVENTORY(603, "无货"),
+
     /**
      * {@code 604  无效的(因供应商拒绝)}
      */

+ 5 - 0
src/main/java/com/uas/platform/b2c/core/support/view/JxlsExcelView.java

@@ -33,6 +33,11 @@ public class JxlsExcelView extends AbstractExcelView {
 	 */
 	public final static int MAX_SIZE = 50000;
 
+    /**
+     * 管理后台goods最大导出行
+     */
+	public final static int GOODS_MAX_SIZE = 1000;
+
     /**
      * 文件名
      */

+ 45 - 0
src/main/java/com/uas/platform/b2c/core/utils/CollectionUtils.java

@@ -0,0 +1,45 @@
+package com.uas.platform.b2c.core.utils;
+
+import com.uas.platform.b2c.prod.commodity.model.AbstractKeyEntity;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * 集合处理工具类
+ *
+ * @author hejq
+ * @date 2018-07-19 11:03
+ */
+public class CollectionUtils {
+
+    /**
+     * 用继承自KeyEntity的类,重写的getKey方法来取值,封装成List一次性查询数据
+     *
+     * @param paramArray
+     * @return
+     */
+    public static Set<Long> getKeyCollection(Collection<? extends AbstractKeyEntity> paramArray) {
+        Set<Long> idList = new HashSet<>();
+        if (!org.springframework.util.CollectionUtils.isEmpty(paramArray)) {
+            for (AbstractKeyEntity param : paramArray) {
+                Object val = param.getKey();
+                if (val != null) {
+                    idList.add(Long.valueOf(val.toString()));
+                }
+            }
+        }
+        return idList;
+    }
+
+    /**
+     * 集合是否为空
+     *
+     * @param coll 集合
+     * @return true or false
+     */
+    public static boolean isEmpty(Collection<?> coll) {
+        return (coll == null || coll.isEmpty());
+    }
+}

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

@@ -217,14 +217,14 @@ public class StringUtilB2C {
 	 * @return 连接的字符串
 	 */
 	public static <T> String joinListUseContact(List<T> tList, String contactStr) {
-		String str = "";
+		StringBuffer str = new StringBuffer();
 		for (T t : tList) {
-			str = str +  t.toString() + contactStr;
+			str.append(t.toString()).append(contactStr);
 		}
 		if(!StringUtils.isEmpty(str)) {
-			str = str.substring(0, str.length() - 1);
+			return str.substring(0, str.length() - 1);
 		}
-		return str;
+		return str.toString();
 	}
 
 	/**

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

@@ -307,7 +307,7 @@ public class InstallmentServiceImpl implements InstallmentService{
             }
             installmentDao.save(installment);
             installmentDetailDao.deleteGtDetno(installment.getId(), Short.valueOf(installment.getCount().toString()));
-            return installmentDao.getOne(installment.getId());
+            return installmentDao.findOne(installment.getId());
         } else {
             return installment;
         }

+ 1 - 1
src/main/java/com/uas/platform/b2c/fa/settlement/service/impl/BillServiceImpl.java

@@ -107,7 +107,7 @@ public class BillServiceImpl implements BillService {
 		if(id == null) {
 			return null;
 		}
-		Bill bill = billDao.getOne(id);
+		Bill bill = billDao.findOne(id);
 		return bill;
 	}
 

+ 1 - 1
src/main/java/com/uas/platform/b2c/logistics/service/impl/InvoiceServiceImpl.java

@@ -1152,7 +1152,7 @@ public class InvoiceServiceImpl implements InvoiceService {
     @Override
     public ResultMap saveInvoiceFPurchaseList(JSONObject sendInfo, Long id) throws OperationsException {
         Long userUU = SystemSession.getUser().getUserUU();
-        Invoice invoice = invoiceDao.getOne(id);
+        Invoice invoice = invoiceDao.findOne(id);
         Purchase purchase = purchaseDao.findOne(invoice.getPurchaseid());
         Integer sendType = Integer.parseInt(sendInfo.getString("sendType"));
 

+ 25 - 17
src/main/java/com/uas/platform/b2c/prod/commodity/constant/ErrorInfoConstant.java

@@ -6,29 +6,36 @@ package com.uas.platform.b2c.prod.commodity.constant;
  * @author hulh
  */
 public enum  ErrorInfoConstant {
+
+    /**
+     * 产品库已存在相同的产品
+     */
     REPEAT_INFO("产品库已存在相同的产品"),
+
+    /**
+     * SKU编码不能为空
+     */
     BATCH_EMPTY("SKU编码不能为空"),
+
+    /**
+     * SKU编码信息有误
+     */
     BATCH_ERROR("SKU编码信息有误"),
+
+    /**
+     * 店铺信息错误
+     */
     STORE_ERROR("店铺信息错误"),
+
+    /**
+     * 在售状态不能为空
+     */
     SALE_EMPTY("在售状态不能为空"),
+
+    /**
+     * 在售状态信息错误
+     */
     SALE_ERROR("在售状态信息错误"),
-//    CODE_PATTERN_INFO("A列:请勿输入中文或中文特殊字符"),
-//    CODE_LENGTH_INFO("A列:产品型号不能超过100字符"),
-//    CODE_EMPTY_INFO("A列:产品型号不能为空"),
-//
-//    BRAND_LENGTH_INFO("B列:品牌名称不能超过50个字符或25个汉字"),
-//    BRAND_EMPTY_INFO("B列:英文品牌不能为空"),
-//    BREAK_UP_INFO("C列:请选择可拆卖情况是或否"),
-//    RESERVE_NUMBER_INFO("D列:库存须填写小于10亿的正整数"),
-//    PRODUCE_DATE_INFO("E列:生产日期不能为空"),
-//    PACKAGE_NOT_EXIST_INFO("F列:包装方式不存在"),
-//    PACKAGE_METHOD_INFO("F列:包装方式只能填写中英文"),
-//    PACKAGE_EMPTY_INFO("F列:包装方式不能为空"),
-//    PERSON_PACKAGE_EMPTY_INFO("C列:规格信息不能为空"),
-//    DELIVERY_EMPTY_INFO("G-H列:存在交期的信息为空"),
-//    DELIVERY_VALUE_INFO("G-H列:交期只能填写1-999之间的整数值"),
-//    PRICE_INFO("K列:单价必须是小于1万的正数"),
-//    MIN_PACKAGE_INFO("I列:最小包数量包含非数字字符"),
     CODE_PATTERN_INFO("请勿输入中文或中文特殊字符"),
     CODE_LENGTH_INFO("产品型号不能超过100字符"),
     CODE_EMPTY_INFO("产品型号不能为空"),
@@ -37,6 +44,7 @@ public enum  ErrorInfoConstant {
     BRAND_EMPTY_INFO("英文/中文品牌名称不能为空"),
     KIND_EMPTY_INFO("物料名称(类目)不能为空"),
     KIND_LENGTH_INFO("物料名称(类目)不能超过20个字符"),
+
     // PCB模块使用
     KIND_UNSTANDARD("物料名称(类目)不是商城标准类目"),
     BRAND_UNSTANDARD("品牌不是商城标准品牌"),

+ 11 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/constant/IntegerConstant.java

@@ -7,8 +7,14 @@ package com.uas.platform.b2c.prod.commodity.constant;
  */
 public class IntegerConstant {
 
+    /**
+     * 寄售
+     */
     public static final Integer B2C_SALE = 2;
 
+    /**
+     * 自营
+     */
     public static final Integer SELF_SALE = 1;
 
     /**
@@ -25,4 +31,9 @@ public class IntegerConstant {
      * 20条数据大小
      */
     public static final Integer PAGE_SIZE_TWENTY = 20;
+
+    /**
+     * 一天的毫秒数
+     */
+    public static final Integer ONE_DAY_MILLISECONDS = 60 * 60 * 24 * 1000;
 }

+ 5 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/constant/StringConstant.java

@@ -56,4 +56,9 @@ public class StringConstant {
      * 应用来源
      */
     public static final String SOURCE = "MALL";
+
+    /**
+     * 空字符串
+     */
+    public static final String BLANK = " ";
 }

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

@@ -134,7 +134,7 @@ public final class UploadConstant {
     /**
      * 铜厚(pcb)
      */
-    public static final int THICK_COPPER = 29;
+    public static final int THICK_COPPER = 19;
 
     /**
      * 厚度(pcb)

+ 178 - 8
src/main/java/com/uas/platform/b2c/prod/commodity/controller/GoodsController.java

@@ -1,22 +1,32 @@
 package com.uas.platform.b2c.prod.commodity.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.uas.platform.b2c.common.base.model.FileUpload;
-import com.uas.platform.b2c.common.search.rpc.service.SearchService;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.support.view.JxlsExcelView;
+import com.uas.platform.b2c.core.utils.DateFormatUtils;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import com.uas.platform.b2c.core.utils.StringUtilB2C;
 import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
-import com.uas.platform.b2c.prod.commodity.model.*;
+import com.uas.platform.b2c.prod.commodity.model.Goods;
+import com.uas.platform.b2c.prod.commodity.model.GoodsFilter;
+import com.uas.platform.b2c.prod.commodity.model.GoodsHistory;
+import com.uas.platform.b2c.prod.commodity.model.GoodsQtyPrice;
+import com.uas.platform.b2c.prod.commodity.model.GoodsSimple;
 import com.uas.platform.b2c.prod.commodity.service.GoodsHistoryService;
 import com.uas.platform.b2c.prod.commodity.service.GoodsService;
 import com.uas.platform.b2c.prod.product.component.modal.ComponentInfo;
 import com.uas.platform.b2c.prod.product.component.service.ComponentService;
+import com.uas.platform.b2c.prod.store.model.BrandCount;
+import com.uas.platform.b2c.prod.store.model.KindHierarchicalCount;
+import com.uas.platform.b2c.trade.order.support.AjaxUtil;
 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.model.Status;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.time.FastDateFormat;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
@@ -27,18 +37,25 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.web.PageableDefault;
+import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.ui.ModelMap;
 import org.springframework.util.StringUtils;
-import org.springframework.web.bind.annotation.*;
+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.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
-import java.io.IOException;
-import java.io.InputStream;
+import java.io.*;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -64,9 +81,6 @@ public class GoodsController {
 	@Autowired
 	private GoodsDao goodsDao;
 
-	@Autowired
-	private SearchService searchService;
-
     /**
      * 发布(上架)产品
      *
@@ -828,6 +842,64 @@ public class GoodsController {
 		return goodsService.getPageDataOfBackground(info, goodsFilter);
 	}
 
+    /**
+     * 根据分页参数和过滤对象导出数据
+     *
+     * @param goodsFilter 过滤对象
+     * @return ModelAndView
+     */
+	@RequestMapping(value = "/background/download", method = RequestMethod.GET)
+    public ModelAndView exportProductsStandard(GoodsFilter goodsFilter, HttpServletRequest request, @RequestParam(required = false, value = "isAjax", defaultValue = "false") Boolean isAjax) {
+        HttpSession session = request.getSession();
+        ModelAndView modelAndView = AjaxUtil.checkIsAjax(session, isAjax);
+        if (!modelAndView.isEmpty()) {
+            return modelAndView;
+        }
+        PageInfo info = new PageInfo(1, JxlsExcelView.GOODS_MAX_SIZE);
+        List<Goods> goodsList = goodsService.multiSearch(info, goodsFilter);
+        if (CollectionUtils.isNotEmpty(goodsList)) {
+            logger.info("产品导出结果 products: " + goodsList.size());
+        } else {
+            logger.info("产品导出结果 products为空");
+        }
+        modelAndView.addObject("dateFormat", DateFormatUtils.DATETIME_FORMAT);
+        modelAndView.addObject("data", goodsList);
+        modelAndView.addObject("goodsService", goodsService);
+        modelAndView.addObject("title", "优软商城--产品库列表");
+        modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/trade/background", "优软商城--产品库列表"));
+        session.setAttribute("loading", false);
+        return modelAndView;
+    }
+
+    /**
+     * 根据ID查询导出goods信息
+     *
+     * @param idStr 拼接的id
+     * @return ModelAndView
+     */
+    @RequestMapping(value = "/background/downloadByIds", method = RequestMethod.GET)
+    public ModelAndView exportProductsStandard(HttpServletRequest request, String idStr, @RequestParam(required = false, value = "isAjax", defaultValue = "false") Boolean isAjax) {
+        HttpSession session = request.getSession();
+        ModelAndView modelAndView = AjaxUtil.checkIsAjax(session, isAjax);
+        if (!modelAndView.isEmpty()) {
+            return modelAndView;
+        }
+        List<Long> idList = JSON.parseArray(idStr, Long.class);
+        List<Goods> privates = goodsService.findByIds(idList);
+        if (CollectionUtils.isNotEmpty(privates)) {
+            logger.info("产品导出结果 products: " + privates.size());
+        } else {
+            logger.info("产品导出结果 products为空");
+        }
+        FastDateFormat dateFormat = FastDateFormat.getInstance("yyyy年MM月dd日 HH:mm");
+        modelAndView.addObject("dateFormat", dateFormat);
+        modelAndView.addObject("data", privates);
+        modelAndView.addObject("title", "优软商城--产品库列表");
+        modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/trade/background", "优软商城--产品库列表"));
+        session.setAttribute("loading", false);
+        return modelAndView;
+    }
+
 	/**
 	 * 根据id返回一个Goods数据
 	 * @param goodsId
@@ -838,4 +910,102 @@ public class GoodsController {
 		logger.info("后台产品管理", "根据id: " + goodsId + "返回goods数据");
 		return goodsService.getGoodsById(goodsId);
 	}
+
+    /**
+     * 通过分页参数获取品牌数量
+     *
+     * @param params 分页信息
+     * @param endTime 截止时间
+     * @param startTime 开始时间
+     * @return Page<BrandCount>
+     */
+	@RequestMapping(value = "/brandProductsCount/page", method = RequestMethod.GET)
+    public com.uas.sso.support.Page<BrandCount> getBrandProductsCount(PageParams params, @DateTimeFormat(pattern = "yyyy-MM-dd") Date startTime, @DateTimeFormat(pattern = "yyyy-MM-dd") Date endTime) {
+        logger.info("后台产品管理", "分页获取品牌数量信息");
+        PageInfo info = new PageInfo(params);
+        return goodsService.getBrandProductsCount(info, startTime, endTime);
+    }
+
+    /**
+     * 通过传入参数导出品牌数量
+     *
+     * @param startTime 开始时间
+     * @param endTime 截止时间
+     * @param request 请求
+     * @param isAjax 是否ajax
+     * @return ModelAndView
+     */
+    @RequestMapping(value = "/brandProductsCount/export", method = RequestMethod.GET)
+    public ModelAndView exportBrandProductsCount(@DateTimeFormat(pattern = "yyyy-MM-dd") Date startTime, @DateTimeFormat(pattern = "yyyy-MM-dd") Date endTime, HttpServletRequest request,
+                                                @RequestParam(required = false, value = "isAjax", defaultValue = "false") Boolean isAjax) {
+        HttpSession session = request.getSession();
+        ModelAndView modelAndView = AjaxUtil.checkIsAjax(session, isAjax);
+        if (!modelAndView.isEmpty()) {
+            return modelAndView;
+        }
+        PageInfo info = new PageInfo(1, JxlsExcelView.MAX_SIZE);
+        com.uas.sso.support.Page<BrandCount> brandCountPage = goodsService.getBrandProductsCount(info, startTime, endTime);
+        if (CollectionUtils.isNotEmpty(brandCountPage.getContent())) {
+            logger.info("品牌数量导出结果 size: " + brandCountPage.getContent().size());
+        } else {
+            logger.info("品牌数量导出结果 size: 0");
+        }
+        FastDateFormat dateFormat = FastDateFormat.getInstance("yyyy年MM月dd日 HH:mm");
+        modelAndView.addObject("dateFormat", dateFormat);
+        modelAndView.addObject("data", brandCountPage.getContent());
+        modelAndView.addObject("goodsService", goodsService);
+        modelAndView.addObject("title", "品牌数量列表");
+        modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/trade/brandCount", "优软商城--品牌数量列表"));
+        session.setAttribute("loading", false);
+        return modelAndView;
+    }
+
+    /**
+     * 通过分页参数获取类目数量
+     *
+     * @param params 分页参数
+     * @param endTime 截止时间
+     * @param startTime 开始时间
+     * @return Page<KindHierarchicalCount>
+     */
+    @RequestMapping(value = "/kindProductsCount/page", method = RequestMethod.GET)
+    public com.uas.sso.support.Page<KindHierarchicalCount> getKindProductsCount(PageParams params, @DateTimeFormat(pattern = "yyyy-MM-dd") Date startTime, @DateTimeFormat(pattern = "yyyy-MM-dd") Date endTime) {
+        logger.info("后台产品管理", "分页获取类目数量信息");
+        PageInfo info = new PageInfo(params);
+        return goodsService.getKindProductsCount(info, startTime, endTime);
+    }
+
+    /**
+     * 通过传入参数导出品类产品数
+     *
+     * @param startTime 开始时间
+     * @param endTime 截止时间
+     * @param request 请求
+     * @param isAjax 是否ajax
+     * @return ModelAndView
+     */
+    @RequestMapping(value = "/kindProductsCount/export", method = RequestMethod.GET)
+    public ModelAndView exportKindProductsCount(@DateTimeFormat(pattern = "yyyy-MM-dd") Date startTime, @DateTimeFormat(pattern = "yyyy-MM-dd") Date endTime, HttpServletRequest request,
+                                               @RequestParam(required = false, value = "isAjax", defaultValue = "false") Boolean isAjax) {
+        HttpSession session = request.getSession();
+        ModelAndView modelAndView = AjaxUtil.checkIsAjax(session, isAjax);
+        if (!modelAndView.isEmpty()) {
+            return modelAndView;
+        }
+        PageInfo info = new PageInfo(1, JxlsExcelView.MAX_SIZE);
+        com.uas.sso.support.Page<KindHierarchicalCount> kindProductsCount = goodsService.getKindProductsCount(info, startTime, endTime);
+        if (CollectionUtils.isNotEmpty(kindProductsCount.getContent())) {
+            logger.info("品类产品数导出结果 size: " + kindProductsCount.getContent().size());
+        } else {
+            logger.info("品类产品数导出结果 size: 0");
+        }
+        FastDateFormat dateFormat = FastDateFormat.getInstance("yyyy年MM月dd日 HH:mm");
+        modelAndView.addObject("dateFormat", dateFormat);
+        modelAndView.addObject("data", kindProductsCount.getContent());
+        modelAndView.addObject("goodsService", goodsService);
+        modelAndView.addObject("title", "品类产品数列表");
+        modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/trade/kindHierarchical", "优软商城--品类产品数列表"));
+        session.setAttribute("loading", false);
+        return modelAndView;
+    }
 }

+ 127 - 17
src/main/java/com/uas/platform/b2c/prod/commodity/controller/ProductController.java

@@ -6,29 +6,44 @@ import com.uas.platform.b2c.core.constant.SplitChar;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.support.log.UsageBufferedLogger;
 import com.uas.platform.b2c.core.support.view.JxlsExcelView;
+import com.uas.platform.b2c.core.utils.DateFormatUtils;
 import com.uas.platform.b2c.prod.commodity.facade.ProductFacade;
-import com.uas.platform.b2c.prod.commodity.model.*;
+import com.uas.platform.b2c.prod.commodity.model.Goods;
+import com.uas.platform.b2c.prod.commodity.model.GoodsFilter;
+import com.uas.platform.b2c.prod.commodity.model.Product;
+import com.uas.platform.b2c.prod.commodity.model.ProductDetail;
+import com.uas.platform.b2c.prod.commodity.model.ProductReplace;
+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.GoodsService;
 import com.uas.platform.b2c.prod.commodity.service.ProductService;
 import com.uas.platform.b2c.prod.commodity.type.ProductConstant;
+import com.uas.platform.b2c.trade.order.support.AjaxUtil;
 import com.uas.platform.b2c.trade.support.CodeType;
 import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.logging.BufferedLoggerManager;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.PageParams;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.time.FastDateFormat;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.ui.ModelMap;
-import org.springframework.web.bind.annotation.*;
+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.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
-import java.io.UnsupportedEncodingException;
+import java.io.*;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -102,11 +117,13 @@ public class ProductController {
 
 	/**
 	 * 根据ids绑定至个人产品库
-	 * @param ids
+	 * @param ids 物料id
 	 * @param isAll 是否将该企业下的所有添加至个人下
+     * @param isStardand 是否是标准产品
+     * @return ResultMap 返回值
 	 */
 	@RequestMapping(value = "/person", method = RequestMethod.POST)
-	ResultMap setAllProductsByPerson(@RequestBody String ids, Integer isAll, Integer isStardand) {
+	public ResultMap setAllProductsByPerson(@RequestBody String ids, Integer isAll, Integer isStardand) {
 		Integer count = productService.setAllProductsByProductIds(ids, isAll, isStardand);
 		if (count == 0) {
 			return new ResultMap(CodeType.SAVED, "个人产品库已存在产品");
@@ -117,9 +134,11 @@ public class ProductController {
 	/**
 	 * 批量保存个人替代物料信息
 	 * @param productReplaceList 替代物料数组
+     * @param productId 物料id
+     * @return ResultMap 返回值
 	 */
 	@RequestMapping(value = "/productReplace", method = RequestMethod.POST)
-	ResultMap setProductReplacesByPerson(@RequestParam("productId") Long productId, @RequestBody String productReplaceList) {
+	public ResultMap setProductReplacesByPerson(@RequestParam("productId") Long productId, @RequestBody String productReplaceList) {
 		List<ProductReplace> productReplaces = JSON.parseArray(productReplaceList,ProductReplace.class);
 		productService.setProductReplacesByPerson(productId, productReplaces);
 		return ResultMap.success("success");
@@ -183,9 +202,11 @@ public class ProductController {
      * 批量删除产品
      *
      * @param ids the ids
+     * @param isPerson 是否是个人
+     * @return ResultMap
      */
     @RequestMapping(value = "/{ids}", method = RequestMethod.DELETE)
-	public ResultMap deleteBatch(@PathVariable("ids") String ids , Integer isPerson) {
+	public ResultMap deleteBatch(@PathVariable("ids") String ids, Integer isPerson) {
 		String[] idstrs = ids.split(SplitChar.COMMA);
 		List<Long> idsLong = new ArrayList<Long>();
 		for (String id : idstrs) {
@@ -209,12 +230,12 @@ public class ProductController {
 
 	/**
 	 * 根据物料Id获取替代物料列表
-	 * @param id
-	 * @return
+	 * @param id 物料id
+	 * @return  List<ProductReplace> 替换物料
 	 */
 	@RequestMapping(value = "/{id}/replaces", method = RequestMethod.GET)
 	public List<ProductReplace> getReplacesByProductId(@PathVariable("id") Long id) {
-    	return productService.getReplacesByProductId(id);
+		return productService.getReplacesByProductId(id);
 	}
 
     /**
@@ -244,7 +265,7 @@ public class ProductController {
 	/**
 	 * 一键匹配物料信息
 	 * @param type  匹配类型
-	 * @return
+	 * @return ResultMap 返回结果集
 	 */
 	@RequestMapping(value = "/matchbytype/{type}", method = RequestMethod.GET)
 	@ResponseBody
@@ -256,10 +277,10 @@ public class ProductController {
 	 * 一键匹配物料信息
 	 *
 	 * @param json 填充的字段
-	 * @return
+	 * @return ResultMap
 	 */
-	@RequestMapping(value = "/update", method = RequestMethod.PUT)
 	@ResponseBody
+	@RequestMapping(value = "/update", method = RequestMethod.PUT)
 	private ResultMap updateMatch(@RequestBody String json) {
 		return productService.updateMatch(json);
 	}
@@ -268,27 +289,34 @@ public class ProductController {
 	 * 统计数量
 	 *
 	 * @param isPerson 是否个人
-	 * @return
+	 * @return ap<String, Integer>
 	 */
 	@RequestMapping(value = "/count", method = RequestMethod.GET)
-	public Map<String, Integer> getProductCount(Integer isPerson){
+	public Map<String, Integer> getProductCount(Integer isPerson) {
 		logger.info("统计个人或企业非标与标准数量");
 		return productService.getProductCount(isPerson);
 	}
 
 	/**
 	 * 批量删除所有的非标的产品
+	 * @param isPerson 是否是个人
+	 * @return ResultMap
 	 */
 	@RequestMapping(value = "/unstandard", method = RequestMethod.DELETE)
-	private ResultMap deleteUnstandardByBatch(Integer isPerson) {
+	public ResultMap deleteUnstandardByBatch(Integer isPerson) {
+		logger.info("删除非标物料信息:操作人:" + SystemSession.getUser().getUserName());
 		 return productService.deleteBatch(ProductConstant.NSTANDARD, isPerson);
 	}
 
+
 	/**
 	 * 批量删除所有的标准的产品
+	 * @param isPerson 是否是个人
+	 * @return ResultMap 结果
 	 */
 	@RequestMapping(value = "/standard", method = RequestMethod.DELETE)
-	private ResultMap deleteStandardByBatch(Integer isPerson) {
+	public ResultMap deleteStandardByBatch(Integer isPerson) {
+		logger.info("删除标准物料信息:操作人:" + SystemSession.getUser().getUserName());
 		return productService.deleteBatch(ProductConstant.STANDARD, isPerson);
 	}
 
@@ -470,4 +498,86 @@ public class ProductController {
         USELOG.log("卖家中心物料", "单个物料录入操作");
 	    return productService.editOne(jsonObject);
     }
+
+	/**
+	 * 根据分页参数和过滤对象分页获取数据
+	 *
+	 * @param params 分页参数
+	 * @param goodsFilter 过滤对象
+	 * @return Page<Product>
+	 */
+	@RequestMapping(value = "/background/page", method = RequestMethod.POST)
+	public Page<V_ProductPrivate> getPageDataOfBackground(PageParams params, @RequestBody GoodsFilter goodsFilter) {
+		PageInfo info = new PageInfo(params);
+		logger.info("后台产品管理", "分页获取Product信息");
+		return productService.getPageDataOfBackground(info, goodsFilter);
+	}
+
+    /**
+     * 根据分页参数和过滤对象导出数据
+     *
+     * @param goodsFilter 过滤对象
+     * @return ModelAndView
+     */
+    @RequestMapping(value = "/background/download", method = RequestMethod.GET)
+    public ModelAndView exportProductsStandard(GoodsFilter goodsFilter, HttpServletRequest request, @RequestParam(required = false, value = "isAjax", defaultValue = "false") Boolean isAjax) {
+        HttpSession session = request.getSession();
+        ModelAndView modelAndView = AjaxUtil.checkIsAjax(session, isAjax);
+        if (!modelAndView.isEmpty()) {
+            return modelAndView;
+        }
+        PageInfo info = new PageInfo(1, JxlsExcelView.GOODS_MAX_SIZE);
+        Page<V_ProductPrivate> page = productService.getPageDataOfBackground(info, goodsFilter);
+        if (CollectionUtils.isNotEmpty(page.getContent())) {
+            logger.info("产品导出结果 products: " + page.getContent().size());
+        } else {
+            logger.info("产品导出结果 products为空");
+        }
+        FastDateFormat dateFormat = FastDateFormat.getInstance("yyyy年MM月dd日 HH:mm");
+        modelAndView.addObject("dateFormat", dateFormat);
+        modelAndView.addObject("data", page.getContent());
+        modelAndView.addObject("title", "优软商城--产品库列表");
+        modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/trade/product_background", "优软商城--产品库列表"));
+        session.setAttribute("loading", false);
+        return modelAndView;
+    }
+
+    /**
+     * 根据id返回一个Goods数据
+     * @param productId productId
+     * @return V_ProductPrivate
+     */
+    @RequestMapping(value = "/one", method = RequestMethod.GET)
+    public V_ProductPrivate getGoodsById(Long productId) {
+        logger.info("后台产品管理", "根据id: " + productId + "返回product和goods数据");
+        return productService.getProductAndGoodsById(productId);
+    }
+
+    /**
+     * 根据ID查询导出products和goods信息
+     *
+     * @param idStr 拼接的id
+     * @return ModelAndView
+     */
+    @RequestMapping(value = "/background/downloadByIds", method = RequestMethod.GET)
+    public ModelAndView exportProductsStandard(HttpServletRequest request, String idStr, @RequestParam(required = false, value = "isAjax", defaultValue = "false") Boolean isAjax) {
+        HttpSession session = request.getSession();
+        ModelAndView modelAndView = AjaxUtil.checkIsAjax(session, isAjax);
+        if (!modelAndView.isEmpty()) {
+            return modelAndView;
+        }
+        List<Long> idList = JSON.parseArray(idStr, Long.class);
+        List<V_ProductPrivate> privates = productService.findProductAndGoodsByIds(idList);
+        if (CollectionUtils.isNotEmpty(privates)) {
+            logger.info("产品导出结果 products: " + privates.size());
+        } else {
+            logger.info("产品导出结果 products为空");
+        }
+        modelAndView.addObject("dateFormat", DateFormatUtils.DATETIME_FORMAT);
+        modelAndView.addObject("data", privates);
+        modelAndView.addObject("title", "优软商城--产品库列表");
+        modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/trade/product_background", "优软商城--产品库列表"));
+        session.setAttribute("loading", false);
+        return modelAndView;
+    }
 }

+ 18 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/dao/ProductMatchResultDao.java

@@ -7,6 +7,7 @@ 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 org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -17,7 +18,24 @@ import java.util.List;
 @Repository
 public interface ProductMatchResultDao extends JpaRepository<ProductMatchResult, Long>, JpaSpecificationExecutor<ProductMatchResult> {
 
+
+    /**
+     * 批量删除根据物料找到的匹配结果
+     *
+     * @param productIds 物料的主键
+     */
+    @Transactional
     @Modifying
     @Query(value = "delete from ProductMatchResult p where p.prid in (:productIds)")
     void deleteByProductids(@Param("productIds") List<Long> productIds);
+
+    /**
+     * 根据物料删除
+     *
+     * @param prid 物料的id
+     */
+    @Transactional
+    @Modifying
+    @Query(value = "delete from ProductMatchResult p where p.prid = :prid")
+    void deleteByProductid(@Param("prid") Long prid);
 }

+ 20 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/dao/ProductPersonDao.java

@@ -25,6 +25,26 @@ public interface ProductPersonDao extends JpaRepository<ProductPerson, Long>, Jp
      */
     List<ProductPerson> findByProductIdAndUserUU(Long productId, Long userUU);
 
+    /**
+     * 获取已存在个人物料的物料id
+     *
+     * @param prids 物料的id
+     * @param useruu 个人用户
+     * @return
+     */
+    @Query(value = "select p.productId from ProductPerson p where p.userUU = :useruu and p.productId in (:prids)")
+    List<Long> findProductIdInProductPerson(@Param("prids") List<Long> prids, @Param("useruu") Long useruu);
+
+    /**
+     * 获取已存在个人物料库的主键
+     *
+     * @param prids 物料的id
+     * @param useruu 个人用户
+     * @return
+     */
+    @Query(value = "select p.id from ProductPerson p where p.userUU = :useruu and p.productId in (:prids)")
+    List<Long> findIdsInProductPerson(@Param("prids") List<Long> prids, @Param("useruu") Long useruu);
+
     /**
      * 根据productId查找物料信息
      * @param productId

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

@@ -72,4 +72,15 @@ public interface V_ProductPrivateDao extends JpaRepository<V_ProductPrivate, Lon
      */
     @Query(value = "select p from V_ProductPrivate p where p.pcmpcode=:pcmpcode and p.pbranden=:pbranden and p.enUU=:enUU order by p.b2cEnabled desc")
     List<V_ProductPrivate> findProductByPcmpcodeAndPbrandenAndEnUU(@Param("pcmpcode") String pcmpcode, @Param("pbranden") String pbranden, @Param("enUU") Long enUU);
+
+
+    /**
+     * 根据enuu查询所有的prids
+     *
+     * @param standard 是否是标准
+     * @param enUU     企业的enuu
+     * @return list
+     */
+    @Query(value = "select p.id from V_ProductPrivate p where p.standard = :standard and p.enUU = :enUU and coalesce(p.b2cEnabled, 1) = 1 and coalesce(p.pcmpcode, '') <> '' and coalesce(p.pbranden, '') <> '' ")
+    List<Long> findPridsByEnUUAndStandard(@Param("standard") Integer standard, @Param("enUU") Long enUU);
 }

+ 21 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/model/AbstractKeyEntity.java

@@ -0,0 +1,21 @@
+package com.uas.platform.b2c.prod.commodity.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+/**
+ * 外键值
+ *
+ * @author hejq
+ * @date 2018-11-06 9:10
+ */
+public abstract class AbstractKeyEntity {
+
+
+    /**
+     * 主键值
+     *
+     * @return
+     */
+    @JsonIgnore
+    public abstract Object getKey();
+}

+ 60 - 6
src/main/java/com/uas/platform/b2c/prod/commodity/model/Goods.java

@@ -42,7 +42,18 @@ import java.util.List;
  *
  */
 @Entity
-@Table(name = "trade$goods", indexes = { @Index(name = "trade_goods_cmpuuid_index", columnList = "cmp_uuid"), @Index(name = "goods_reserve_index", columnList = "go_reserve"), @Index(name = "goods_status_index", columnList = "go_status"), @Index(name = "goods_code_index", columnList = "cmp_code")})
+@Table(name = "trade$goods", indexes = {
+		@Index(name = "goods_cmpuuid_index", columnList = "cmp_uuid"),
+        @Index(name = "goods_reserve_index", columnList = "go_reserve"),
+        @Index(name = "goods_status_index", columnList = "go_status"),
+        @Index(name = "goods_code_index", columnList = "cmp_code"),
+        @Index(name = "goods_createddate_index", columnList = "go_createddate"),
+        @Index(name = "goods_storename_index", columnList = "go_storename"),
+        @Index(name = "goods_enuu_index", columnList = "go_enuu"),
+        @Index(name = "goods_kinduuid_index", columnList = "go_kind_uuid"),
+        @Index(name = "goods_storeid_index", columnList = "go_storeid"),
+		@Index(name = "goods_productid_index", columnList = "go_productid")
+})
 @Cacheable
 @Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "com.uas.platform.b2c.prod.commodity.model.Goods")
 public class Goods implements Serializable {
@@ -64,7 +75,7 @@ public class Goods implements Serializable {
 	 * 对应的器件uuid
 	 */
 	@Column(name = "cmp_uuid")
-	private String uuid;
+	private String uuid = "";
 
 	/**
 	 * 是否已在售
@@ -350,7 +361,13 @@ public class Goods implements Serializable {
 	 * 分段报价(List)
 	 */
 	@Transient
-	private List<GoodsQtyPrice> prices;
+	private List<GoodsQtyPrice> prices = new ArrayList<>();
+
+    /**
+     * 分段价格最大序号值
+     */
+	@Transient
+	private Integer maxPriceIndex;
 
 	//*************************************************************************
 	//* 价格区间信息
@@ -561,6 +578,18 @@ public class Goods implements Serializable {
 	@Transient
 	private Double saleQty;
 
+	/**
+	 * 价格分段
+	 */
+	@Transient
+	private String priceGradeStr = "";
+
+    /**
+     * 价格
+     */
+	@Transient
+    private String priceStr = "";
+
 	public Double getSaleQty() {
 		return saleQty;
 	}
@@ -1006,7 +1035,7 @@ public class Goods implements Serializable {
 		}
 	}
 
-	public static long getSerialVersionUID() {
+    public static long getSerialVersionUID() {
 		return serialVersionUID;
 	}
 
@@ -1221,6 +1250,14 @@ public class Goods implements Serializable {
 		}
 	}
 
+	public Integer getMaxPriceIndex() {
+		return maxPriceIndex;
+	}
+
+	public void setMaxPriceIndex(Integer maxPriceIndex) {
+		this.maxPriceIndex = maxPriceIndex;
+	}
+
 	/**
 	 * 用人民币含税单价修改未含税人民币单价
 	 */
@@ -1558,7 +1595,23 @@ public class Goods implements Serializable {
 		return this;
 	}
 
-	/**
+    public String getPriceGradeStr() {
+        return priceGradeStr;
+    }
+
+    public void setPriceGradeStr(String priceGradeStr) {
+        this.priceGradeStr = priceGradeStr;
+    }
+
+    public String getPriceStr() {
+        return priceStr;
+    }
+
+    public void setPriceStr(String priceStr) {
+        this.priceStr = priceStr;
+    }
+
+    /**
 	 * 获取最大交期
 	 * @return
 	 */
@@ -1686,8 +1739,9 @@ public class Goods implements Serializable {
 		goods.setProduceDate(product.getProduceDate());
 		goods.setUuid(product.getCmpUuId());
 		goods.setMinPackQty(product.getMinPackQty());
-		goods.setPublisherName(SystemSession.getUser().getUserName());
 		goods.setEnUU(SystemSession.getUser().getEnterprise().getUu());
+		goods.setPublisherName(SystemSession.getUser().getUserName());
+		goods.setPublisherUU(SystemSession.getUser().getUserUU());
 		goods.setPublishPhone(SystemSession.getUser().getUserTel());
 		return goods;
 	}

+ 36 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/model/GoodsFilter.java

@@ -1,5 +1,7 @@
 package com.uas.platform.b2c.prod.commodity.model;
 
+import com.alibaba.fastjson.annotation.JSONField;
+
 /**
  * 超级后台产品管理过滤类,由于过滤属性太多
  *
@@ -34,6 +36,12 @@ public class GoodsFilter {
 
     /**
      * 在售数量
+     * <note>
+     *     前端传入三种状态:
+     *     有货: 601
+     *     不足起订量: 602
+     *     无货: 603
+     * </note>
      */
     private Integer saleNum;
 
@@ -67,6 +75,18 @@ public class GoodsFilter {
      */
     private Boolean haveImg;
 
+    /**
+     * 开始时间
+     */
+    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
+    private Long startTime;
+
+    /**
+     * 截止时间
+     */
+    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
+    private Long endTime;
+
     public String getCode() {
         return code;
     }
@@ -162,4 +182,20 @@ public class GoodsFilter {
     public void setSaleNum(Integer saleNum) {
         this.saleNum = saleNum;
     }
+
+    public Long getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Long startTime) {
+        this.startTime = startTime;
+    }
+
+    public Long getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Long endTime) {
+        this.endTime = endTime;
+    }
 }

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

@@ -32,7 +32,9 @@ import java.util.Set;
 	@Index(name = "products_enuu_code_index", columnList = "pr_enuu,pr_code", unique = true),
 	@Index(name = "products_enuu_standard_index", columnList = "pr_enuu,pr_standard"),
 	@Index(name = "products_erpdown_index", columnList = "pr_erpdown"),
-	@Index(name = "pr_createtime_index", columnList = "pr_create_time")})
+	@Index(name = "pr_createtime_index", columnList = "pr_create_time"),
+		@Index(name = "products_kind_index", columnList ="pr_kind,pr_kindid" )
+})
 @Logger
 public class Product {
 

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

@@ -479,7 +479,7 @@ public class ReleaseProductByBatch implements Serializable {
 	/**
 	 * 错误的信息
 	 */
-	@Column(name = "rel_errmsg", length = 4000)
+	@Column(name = "rel_errmsg", columnDefinition = "TEXT")
 	private String errmsg = "";
 
 	/**
@@ -628,7 +628,7 @@ public class ReleaseProductByBatch implements Serializable {
 
 	public void setBreakUpByExcel(Object value) {
 		setBreakUpStr(StringUtilB2C.getStr(value));
-		if (!StringUtils.isEmpty(value) && ReleaseConstant.NO.equals(value.toString())) {
+		if (ReleaseConstant.NO.equals(value)) {
 			setBreakUp(Boolean.FALSE);
 		} else {
 			setBreakUp(Boolean.TRUE);
@@ -657,15 +657,17 @@ public class ReleaseProductByBatch implements Serializable {
 			int compareTo = reserve.compareTo(DoubleConstant.maxReserve);
 			if (compareTo > 0) {
 				reserve = DoubleConstant.maxReserve;
-			} else if (NumberUtil.compare(reserve, DoubleConstant.zero) < 1) {
-				reserve = DoubleConstant.minReserve;
+			} else if (reserve.compareTo(DoubleConstant.zero) == -1) {
+				reserve = DoubleConstant.zero;
 			}
 			setReserve(reserve);
 		}
 	}
 
 	public void setPackagingByExcel(Object value, boolean isAPerson) {
-		if (!StringUtils.isEmpty(value)) {
+		if (StringUtils.isEmpty(value)) {
+			setPackaging(PACKAGING_LIST.get(PACKAGING_LIST.size() - 1));
+		} else {
 			String packagingData = StringUtilB2C.replaceLineBreak(StringUtilB2C.getStr(value));
 			if (!isAPerson) {
 				if (PACKAGING_LIST.contains(packagingData)) {
@@ -673,7 +675,8 @@ public class ReleaseProductByBatch implements Serializable {
 				}
 			} else {
 				try {
-					packagingData = com.uas.platform.b2c.fa.payment.utils.StringUtils.cutOutString(packagingData, 150);
+					packagingData = com.uas.platform.b2c.fa.payment.utils.StringUtils.cutOutString(packagingData,
+							ReleaseConstant.PACKAKING_MAX_LENGTH);
 				} catch (UnsupportedEncodingException e) {
 					throw new RuntimeException(e + "指定字符集不支持");
 				}
@@ -684,19 +687,19 @@ public class ReleaseProductByBatch implements Serializable {
 
 	/**
 	 * 规格信息
-	 * @param value
+	 * @param value 规格字段
 	 */
 	public void setSpecByExcel(Object value) {
 		if (!StringUtils.isEmpty(value)) {
-				String str = com.uas.platform.b2c.fa.payment.utils.StringUtils.cutOutStringIgnoreEncode(value.toString(), UploadConstant.SPEC_MAX_BYTE);
-				setSpec(str);
+			String str = com.uas.platform.b2c.fa.payment.utils.StringUtils.cutOutStringIgnoreEncode(value.toString(), UploadConstant.SPEC_MAX_BYTE);
+			setSpec(str);
 		}
 	}
 
 	/**
 	 * 交期赋值逻辑较为复杂,在调用类进行赋值
-	 * @param minValue
-	 * @param maxValue
+	 * @param minValue 最小交期
+	 * @param maxValue 最大交期
 	 */
 	public void setDeliveryByExcel(Object minValue, Object maxValue) {
 		setSelfMinDeliveryStr(StringUtilB2C.getStr(minValue));

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

@@ -15,6 +15,11 @@ import java.io.*;
 import java.util.Date;
 import java.util.Set;
 
+/**
+ * 商城物料私有字段
+ *
+ * @author US50
+ */
 @Entity
 @Table(name = "v$product$private")
 public class V_ProductPrivate implements Serializable {
@@ -309,6 +314,9 @@ public class V_ProductPrivate implements Serializable {
     @Transient
     private Goods goods;
 
+    @Transient
+    private String enterpriseName;
+
     public Long getId() {
         return id;
     }
@@ -672,4 +680,12 @@ public class V_ProductPrivate implements Serializable {
         this.goods = goods;
         return this;
     }
+
+    public String getEnterpriseName() {
+        return enterpriseName;
+    }
+
+    public void setEnterpriseName(String enterpriseName) {
+        this.enterpriseName = enterpriseName;
+    }
 }

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

@@ -9,6 +9,8 @@ import com.uas.platform.b2c.prod.commodity.model.GoodsInfo;
 import com.uas.platform.b2c.prod.commodity.model.GoodsSimple;
 import com.uas.platform.b2c.prod.commodity.model.Product;
 import com.uas.platform.b2c.prod.product.component.modal.Component;
+import com.uas.platform.b2c.prod.store.model.BrandCount;
+import com.uas.platform.b2c.prod.store.model.KindHierarchicalCount;
 import com.uas.platform.b2c.trade.order.model.Order;
 import com.uas.platform.b2c.trade.order.model.PurchaseDetail;
 import com.uas.platform.b2c.trade.presale.model.Cart;
@@ -22,6 +24,7 @@ import org.springframework.data.domain.Pageable;
 import org.springframework.ui.ModelMap;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -811,4 +814,63 @@ public interface GoodsService {
      * @return ResultMap
      */
     ResultMap checkGoods(Goods goods);
+
+    /**
+     * 通过分成参数获取品牌数量
+     *
+     * @param pageable 分页信息
+     * @param endTime 截止时间
+     * @param startTime 开始时间
+     * @return Page<BrandCount>
+     */
+    com.uas.sso.support.Page<BrandCount> getBrandProductsCount(Pageable pageable, Date startTime, Date endTime);
+
+    /**
+     * 通过分页参数获取类目数量
+     *
+     * @param pageable 分页参数
+     * @param endTime 截止时间
+     * @param startTime 开始时间
+     * @return Page<KindHierarchicalCount>
+     */
+    com.uas.sso.support.Page<KindHierarchicalCount> getKindProductsCount(Pageable pageable, Date startTime, Date endTime);
+
+    /**
+     * 批量导出数据
+     * TODO 后续提成公共方法,暂时没写好
+     * @param info 分页信息
+     * @param goodsFilter 过滤条件
+     * @return List<Goods>
+     */
+    List<Goods> multiSearch(PageInfo info, GoodsFilter goodsFilter);
+
+    /**
+     * 通过batchCode查询冻结数量
+     *
+     * @param batchCode 批号
+     * @return 冻结数量
+     */
+    int getFrozenCount(String batchCode);
+
+    /**
+     * 给goods信息赋值
+     *
+     * @param goods Goods
+     */
+    void defineGoodsInfo(Goods goods);
+
+    /**
+     * 封装goods信息
+     *
+     * @param goods goods
+     * @return Goods
+     */
+    Goods covertGoodsInfo(Goods goods);
+
+    /**
+     * 通过goods id查询goods信息
+     * @param idList goods idList
+     * @return List<Goods>
+     */
+    List<Goods> findByIds(List<Long> idList);
 }

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

@@ -0,0 +1,22 @@
+package com.uas.platform.b2c.prod.commodity.service;
+
+import com.uas.platform.b2c.prod.commodity.model.ProductPerson;
+
+import java.util.List;
+
+/**
+ *
+ * 个人物料的service层
+ *
+ * @author yuj
+ *
+ * @date 2018/10/24 19:17
+ */
+public interface ProductPersonService {
+
+    /**
+     * 批量插入个人物料信息
+     * @param list 需要插入的数据
+     */
+    void batchInsert(List<ProductPerson> list);
+}

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

@@ -2,6 +2,7 @@ package com.uas.platform.b2c.prod.commodity.service;
 
 import com.alibaba.fastjson.JSONObject;
 import com.uas.platform.b2c.prod.commodity.model.Goods;
+import com.uas.platform.b2c.prod.commodity.model.GoodsFilter;
 import com.uas.platform.b2c.prod.commodity.model.InOutboundDetail;
 import com.uas.platform.b2c.prod.commodity.model.Product;
 import com.uas.platform.b2c.prod.commodity.model.ProductDetail;
@@ -104,6 +105,13 @@ public interface ProductService {
      */
     ResultMap deleteBatch(String type, Integer isPerson);
 
+    /**
+     * 批量删除个人物料
+     * @param type
+     * @return
+     */
+    ResultMap deletePersonalProductByBatch(String type);
+
     /**
      * 单个匹配
      *
@@ -396,4 +404,29 @@ public interface ProductService {
      * @return ResultMap
      */
     ResultMap checkCriterion(Product product);
+
+    /**
+     * 根据分页参数和过滤对象分页获取数据
+     *
+     * @param info 分页参数
+     * @param goodsFilter 过滤对象
+     * @return Page<Product>
+     */
+    Page<V_ProductPrivate> getPageDataOfBackground(PageInfo info, GoodsFilter goodsFilter);
+
+    /**
+     * 通过物料id查询 V_ProductPrivate
+     * @param id 物料id
+     *
+     * @return V_ProductPrivate
+     */
+    V_ProductPrivate getProductAndGoodsById(Long id);
+
+    /**
+     * 通过传入ID查询数据
+     *
+     * @param idList V_ProductPrivate的idList
+     * @return V_ProductPrivate
+     */
+    List<V_ProductPrivate> findProductAndGoodsByIds(List<Long> idList);
 }

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

@@ -12,6 +12,7 @@ import com.uas.platform.b2c.common.account.dao.EnterpriseDao;
 import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.common.account.service.EnterpriseService;
+import com.uas.platform.b2c.common.base.dao.CommonDao;
 import com.uas.platform.b2c.common.search.service.SearcherService;
 import com.uas.platform.b2c.core.config.SysConf;
 import com.uas.platform.b2c.core.constant.ShortConstant;
@@ -75,6 +76,8 @@ import com.uas.platform.b2c.prod.product.kind.model.Kind;
 import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
 import com.uas.platform.b2c.prod.product.kind.service.KindService;
 import com.uas.platform.b2c.prod.store.dao.StoreInDao;
+import com.uas.platform.b2c.prod.store.model.BrandCount;
+import com.uas.platform.b2c.prod.store.model.KindHierarchicalCount;
 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;
@@ -144,6 +147,7 @@ import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -161,8 +165,11 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -272,8 +279,8 @@ public class GoodsServiceImpl implements GoodsService {
     @Autowired
     private FloorsService floorsService;
 
-	@Autowired
-	private ProductDetailDao productDetailDao;
+    @Autowired
+    private ProductDetailDao productDetailDao;
 
     @Autowired
     private OrderDetailService orderDetailService;
@@ -297,6 +304,9 @@ public class GoodsServiceImpl implements GoodsService {
     @Autowired
     private EnterpriseService enterpriseService;
 
+    @Autowired
+    private CommonDao commonDao;
+
     private final Logger logger = LoggerFactory.getLogger(GoodsServiceImpl.class);
 
     @Autowired
@@ -325,8 +335,8 @@ public class GoodsServiceImpl implements GoodsService {
             throw new IllegalOperatorException("商品信息Goods不能为空");
         }
         if (!StringUtils.isEmpty(goods.getSpec())) {
-                String spec = com.uas.platform.b2c.fa.payment.utils.StringUtils.cutOutStringIgnoreEncode(goods.getSpec().toString(), UploadConstant.SPEC_MAX_BYTE);
-                goods.setSpec(spec);
+            String spec = com.uas.platform.b2c.fa.payment.utils.StringUtils.cutOutStringIgnoreEncode(goods.getSpec().toString(), UploadConstant.SPEC_MAX_BYTE);
+            goods.setSpec(spec);
         }
         if (goods.getCurrencyName() == null) {
             throw new IllegalOperatorException("必须选择一种币别");
@@ -544,24 +554,24 @@ public class GoodsServiceImpl implements GoodsService {
         }
         Double reserve = goods.getReserve() - number;
 
-		goods.setReserve(reserve);
-		// 检查是否小于最小发货量
-		if (reserve.doubleValue() < goods.getMinBuyQty().doubleValue()) {
-			goods.setStatus(Status.UNAVAILABLE.value());
-		}
-		goodsDao.modifyReserve(goods.getBatchCode(), goods.getUuid(), goods.getReserve(), goods.getStatus().intValue());
-		// 每次批次保存同时保存一遍历史信息
-		GoodsHistory goodsHistory = goodsHistoryService.converTGoodsHist(goods, GoodsHistory.OperateType.DeductReserve.getPhrase(), false);
-		goodsHistoryService.save(goodsHistory);
-		// 更新器件属性的库存
-		updateComponentTradeInfos(goods.getUuid());
-
-		// 扣除库存时,同步产品推荐的信息
-		if (Status.UNAVAILABLE.value() == goods.getStatus()) {
+        goods.setReserve(reserve);
+        // 检查是否小于最小发货量
+        if (reserve.doubleValue() < goods.getMinBuyQty().doubleValue()) {
+            goods.setStatus(Status.UNAVAILABLE.value());
+        }
+        goodsDao.modifyReserve(goods.getBatchCode(), goods.getUuid(), goods.getReserve(), goods.getStatus().intValue());
+        // 每次批次保存同时保存一遍历史信息
+        GoodsHistory goodsHistory = goodsHistoryService.converTGoodsHist(goods, GoodsHistory.OperateType.DeductReserve.getPhrase(), false);
+        goodsHistoryService.save(goodsHistory);
+        // 更新器件属性的库存
+        updateComponentTradeInfos(goods.getUuid());
+
+        // 扣除库存时,同步产品推荐的信息
+        if (Status.UNAVAILABLE.value() == goods.getStatus()) {
             recommendProductService.updateRecommendProductInfo(goods);
-		}
-		return ResultMap.success(null);
-	}
+        }
+        return ResultMap.success(null);
+    }
 
     /**
      * 释放库存
@@ -746,37 +756,37 @@ public class GoodsServiceImpl implements GoodsService {
         return backGoods;
     }
 
-	@Override
-	@Transactional
-	public Goods publish(Goods goods, String deviceInfo, Product product) {
-		ProductDetail productDetail = productDetailDao.findByProductId(product.getId());
-		if (productDetail == null) {
-			productDetail = new ProductDetail();
-		} else if (product.getErpReserve() != null) {
-			ProductDetail newProductDetail = productService.findByProductId(product.getId());
-			if (product.getErpReserve() < goods.getReserve() + newProductDetail.getB2cReserve()) {
-				throw new IllegalOperatorException("本次上架数量和已上架数量之和不可超过ERP空闲库存数量");
-			}
-		}
-		productDetail.convertFromGoods(goods, product);
-		productDetailDao.save(productDetail);
-		Goods saveGoods = publish(goods, deviceInfo);
-		return saveGoods;
-	}
-
-	@Override
-	@Transactional
-	public List<Goods> publish(List<Goods> goodses, String deviceInfo) {
-		Set<String> uuids = new HashSet<String>();
-		List<Goods> list = new ArrayList<Goods>();
-		System.out.println("执行了publishByBatch-------start");
-		publishByBatch(goodses, uuids, list);
-		System.out.println("执行了publishByBatch-----end");
-		for (String uuid : uuids) {
-			updateComponentTradeInfos(uuid);
-		}
-		return list;
-	}
+    @Override
+    @Transactional
+    public Goods publish(Goods goods, String deviceInfo, Product product) {
+        ProductDetail productDetail = productDetailDao.findByProductId(product.getId());
+        if (productDetail == null) {
+            productDetail = new ProductDetail();
+        } else if (product.getErpReserve() != null) {
+            ProductDetail newProductDetail = productService.findByProductId(product.getId());
+            if (product.getErpReserve() < goods.getReserve() + newProductDetail.getB2cReserve()) {
+                throw new IllegalOperatorException("本次上架数量和已上架数量之和不可超过ERP空闲库存数量");
+            }
+        }
+        productDetail.convertFromGoods(goods, product);
+        productDetailDao.save(productDetail);
+        Goods saveGoods = publish(goods, deviceInfo);
+        return saveGoods;
+    }
+
+    @Override
+    @Transactional
+    public List<Goods> publish(List<Goods> goodses, String deviceInfo) {
+        Set<String> uuids = new HashSet<String>();
+        List<Goods> list = new ArrayList<Goods>();
+        System.out.println("执行了publishByBatch-------start");
+        publishByBatch(goodses, uuids, list);
+        System.out.println("执行了publishByBatch-----end");
+        for (String uuid : uuids) {
+            updateComponentTradeInfos(uuid);
+        }
+        return list;
+    }
 
     /**
      * 批量更新库存信息 辅助方法
@@ -927,37 +937,37 @@ public class GoodsServiceImpl implements GoodsService {
     public void updateComponentTradeInfos(final String uuid) {
     }
 
-	/**
-	 * 导入Excel发布产品
-	 *
-	 * @author hejq
-	 */
-	@Override
-	public ModelMap publishByWorkbook(Workbook workbook) {
-		ModelMap modelMap = new ModelMap();
-		List<String> alters = new ArrayList<String>();
-		List<Goods> goodses = new ArrayList<Goods>();
-		Sheet sheet = workbook.getSheetAt(0);
-		int rowNum = sheet.getLastRowNum();
-		if(rowNum > 2000) {
-			throw new IllegalOperatorException
-					("信息超过2000条,请拆分成2000条以内");
-		}
-		Row headerRow = sheet.getRow(0);
-		try {
-			if (headerRow != null) {
-				for (int r = 1; r <= rowNum; r++) {
-					Row row = sheet.getRow(r);
-					if (row != null && row.getCell(3) != null) {
-						Goods goods = new Goods();
-						if (row.getCell(3) == null) {
-							throw new IllegalOperatorException("请上传从第一步操作中下载的发布模板");
-						}
-						String uuid = row.getCell(3).getStringCellValue();
-						if (StringUtils.isEmpty(uuid)) {
-							throw new IllegalOperatorException("请上传从商城下载的批量发布模板");
-						}
-						goods.setUuid(uuid);
+    /**
+     * 导入Excel发布产品
+     *
+     * @author hejq
+     */
+    @Override
+    public ModelMap publishByWorkbook(Workbook workbook) {
+        ModelMap modelMap = new ModelMap();
+        List<String> alters = new ArrayList<String>();
+        List<Goods> goodses = new ArrayList<Goods>();
+        Sheet sheet = workbook.getSheetAt(0);
+        int rowNum = sheet.getLastRowNum();
+        if(rowNum > 2000) {
+            throw new IllegalOperatorException
+                    ("信息超过2000条,请拆分成2000条以内");
+        }
+        Row headerRow = sheet.getRow(0);
+        try {
+            if (headerRow != null) {
+                for (int r = 1; r <= rowNum; r++) {
+                    Row row = sheet.getRow(r);
+                    if (row != null && row.getCell(3) != null) {
+                        Goods goods = new Goods();
+                        if (row.getCell(3) == null) {
+                            throw new IllegalOperatorException("请上传从第一步操作中下载的发布模板");
+                        }
+                        String uuid = row.getCell(3).getStringCellValue();
+                        if (StringUtils.isEmpty(uuid)) {
+                            throw new IllegalOperatorException("请上传从商城下载的批量发布模板");
+                        }
+                        goods.setUuid(uuid);
 
                         // 产品uuid
                         String cmpCode = row.getCell(2).getStringCellValue();
@@ -1568,16 +1578,16 @@ public class GoodsServiceImpl implements GoodsService {
         List<GoodsBrowsingHistory> browsingHistories = browsingHistoryService.updateGoodsBrowsingHistoryByGoods(nowGoods);
         updateGoodsRelateInfo(orders, cartList, browsingHistories, null, history, nowGoods);
 
-		//更新店铺推荐的信息
-		if(isChangeSaleType) { // 如果切换了销售方式
-			Set<String> uuids = new HashSet<>();
-			uuids.add(nowGoods.getBatchCode());
-			recommendProductService.deleteProductsWhenSellerUpdateReserve(storeuuid, uuids);
-		} else {
+        //更新店铺推荐的信息
+        if(isChangeSaleType) { // 如果切换了销售方式
+            Set<String> uuids = new HashSet<>();
+            uuids.add(nowGoods.getBatchCode());
+            recommendProductService.deleteProductsWhenSellerUpdateReserve(storeuuid, uuids);
+        } else {
             recommendProductService.updateRecommendProductInfo(nowGoods);
         }
-		return nowGoods;
-	}
+        return nowGoods;
+    }
 
     /**
      * 用户更新在售产品的信息, 设置店铺名称
@@ -2362,17 +2372,17 @@ public class GoodsServiceImpl implements GoodsService {
         return ResultMap.success(commodity);
     }
 
-	@Override
-	public ResultMap offShelfGoodsByProvider(String batchCodes, String downMsg, Boolean isERP) {
-		if (StringUtils.isEmpty(batchCodes)) {
-			return new ResultMap(CodeType.NO_INFO.code(), "待下架批次号字符串不能为空");
-		}
-		String[] batchCodeArr = batchCodes.split(",");
-		if (batchCodeArr.length == 0) {
-			return new ResultMap(CodeType.NO_INFO.code(), "待下架批次号不能为空");
-		}
-		Set<String> uuids = new HashSet<>();
-		List<String> batchCodeList = new ArrayList<>();
+    @Override
+    public ResultMap offShelfGoodsByProvider(String batchCodes, String downMsg, Boolean isERP) {
+        if (StringUtils.isEmpty(batchCodes)) {
+            return new ResultMap(CodeType.NO_INFO.code(), "待下架批次号字符串不能为空");
+        }
+        String[] batchCodeArr = batchCodes.split(",");
+        if (batchCodeArr.length == 0) {
+            return new ResultMap(CodeType.NO_INFO.code(), "待下架批次号不能为空");
+        }
+        Set<String> uuids = new HashSet<>();
+        List<String> batchCodeList = new ArrayList<>();
 
         List<Goods> list = new ArrayList<>();
         for (String batchCode : batchCodeArr) {
@@ -2484,11 +2494,11 @@ public class GoodsServiceImpl implements GoodsService {
         goodsHistoryService.save(goodsHist);
 
         Goods updateGoods = goodsDao.save(goods);
-		//下架对应的批次 目前确定下架之后不做删除动作。
-		// goodsDao.deleteByBatchCode(goods.getBatchCode());
-		// 需要替换首页的信息。
-		return ResultMap.success(updateGoods);
-	}
+        //下架对应的批次 目前确定下架之后不做删除动作。
+        // goodsDao.deleteByBatchCode(goods.getBatchCode());
+        // 需要替换首页的信息。
+        return ResultMap.success(updateGoods);
+    }
 
     @Override
     public Page<Goods> findGoodsPage(final PageInfo info) {
@@ -3006,7 +3016,7 @@ public class GoodsServiceImpl implements GoodsService {
             uuids.add(goods.getUuid());
         }
 
-		goodsDao.save(goodsUpdate);
+        goodsDao.save(goodsUpdate);
         goodsHistoryDao.save(histories);
         for (String uuid : uuids) {
             updateComponentTradeInfos(uuid);
@@ -3052,29 +3062,29 @@ public class GoodsServiceImpl implements GoodsService {
         return ResultMap.success(goods);
     }
 
-	/**
-	 * 更新库存的相关信息
-	 *
-	 * @param orders 订单
-	 * @param carts 购物车信息
-	 * @param browsingHistoryList 浏览历史
-	 * @param product 产品
-	 * @return
-	 */
-	@Transactional
-	@Override
-	public ResultMap updateGoodsRelateInfo(List<Order> orders, List<Cart> carts, List<GoodsBrowsingHistory> browsingHistoryList, Product product, GoodsHistory goodsHistory, Goods goods) {
-		goodsDao.save(goods);
-		orderDao.save(orders);
-		orderService.save(orders);
-		cartService.saveCart(carts);
-		browsingHistoryService.saveGoodsBrowsingHistoryList(browsingHistoryList);
-		goodsHistoryService.save(goodsHistory);
-		return ResultMap.success(null);
-	}
-
-	@Override
-	public void addVisitCount(String batchCode) {
+    /**
+     * 更新库存的相关信息
+     *
+     * @param orders 订单
+     * @param carts 购物车信息
+     * @param browsingHistoryList 浏览历史
+     * @param product 产品
+     * @return
+     */
+    @Transactional
+    @Override
+    public ResultMap updateGoodsRelateInfo(List<Order> orders, List<Cart> carts, List<GoodsBrowsingHistory> browsingHistoryList, Product product, GoodsHistory goodsHistory, Goods goods) {
+        goodsDao.save(goods);
+        orderDao.save(orders);
+        orderService.save(orders);
+        cartService.saveCart(carts);
+        browsingHistoryService.saveGoodsBrowsingHistoryList(browsingHistoryList);
+        goodsHistoryService.save(goodsHistory);
+        return ResultMap.success(null);
+    }
+
+    @Override
+    public void addVisitCount(String batchCode) {
         goodsDao.addVisitCount(batchCode);
     }
 
@@ -3262,6 +3272,7 @@ public class GoodsServiceImpl implements GoodsService {
     @Override
     public void deleteGoods(List<Goods> goodses) {
         try {
+            final Long userUU = SystemSession.getUser().getUserUU();
             executor.submitTask(new Runnable() {
                 @Override
                 public void run() {
@@ -3272,11 +3283,13 @@ public class GoodsServiceImpl implements GoodsService {
                         if (goodse.getStatus().equals(Status.AVAILABLE.value()) || goodse.getStatus().equals(Status.UNAVAILABLE.value())) {
                             goodse.setStatus(Status.REMOVED.value());
                             GoodsHistory goodsHistoryRemoved = goodsHistoryService.converTGoodsHist(goodse, OperateType.Down.getPhrase(), false);
+                            goodsHistoryRemoved.setOperateUU(userUU);
                             histories.add(goodsHistoryRemoved);
                         }
                         //删除库存信息
                         goodse.setStatus(Status.DELETED.value());
                         GoodsHistory goodsHistoryDelete = goodsHistoryService.converTGoodsHist(goodse, OperateType.DELETE.getPhrase(),false);
+                        goodsHistoryDelete.setOperateUU(userUU);
                         histories.add(goodsHistoryDelete);
                         goodses1.add(goodse);
                     }
@@ -3437,13 +3450,25 @@ public class GoodsServiceImpl implements GoodsService {
     public Goods getGoodsById(Long id) {
         Goods goods = goodsDao.findOne(id);
         if (goods != null) {
-            if (sysConf.getStoreid().equals(goods.getStoreid())) {
-                goods.setSelfSale("寄售");
-            } else {
-                goods.setSelfSale("自营");
-            }
-            goods.setFrozen(getFrozenCount(goods.getBatchCode()));
+            goods = covertGoodsInfo(goods);
         }
+        return goods;
+    }
+
+    /**
+     * 封装goods信息
+     *
+     * @param goods goods
+     * @return Goods
+     */
+    @Override
+    public Goods covertGoodsInfo(Goods goods) {
+        if (sysConf.getStoreid().equals(goods.getStoreid())) {
+            goods.setSelfSale("寄售");
+        } else {
+            goods.setSelfSale("自营");
+        }
+        goods.setFrozen(getFrozenCount(goods.getBatchCode()));
         if (StringUtils.isEmpty(goods.getAttach()) && goods.getUuid() != null) {
             Component component = componentDao.findByUuid(goods.getUuid());
             if (component != null) {
@@ -3499,33 +3524,56 @@ public class GoodsServiceImpl implements GoodsService {
         return String.valueOf(goodses.size());
     }
 
-	@Override
-	public Page<Goods> getPageDataOfBackground(final PageInfo info, GoodsFilter goodsFilter) {
-		if (info == null) {
-			throw new IllegalOperatorException("分页参数丢失");
-		}
-		if (goodsFilter != null) {
-			convertPageInfo(info, goodsFilter);
-		}
-        Page<Goods> page = goodsDao.findAll(new Specification<Goods>() {
-            @Override
-            public Predicate toPredicate(Root<Goods> root, CriteriaQuery<?> query,
-                                         CriteriaBuilder builder) {
-                query.where(info.getPredicates(root, query, builder));
-                return null;
-            }
-        }, info);
+    @Override
+    public Page<Goods> getPageDataOfBackground(final PageInfo info, GoodsFilter goodsFilter) {
+        if (info == null) {
+            throw new IllegalOperatorException("分页参数丢失");
+        }
+        if (goodsFilter != null) {
+            convertPageInfo(info, goodsFilter);
+        }
+        Page<Goods> page = goodsDao.findAll((Root<Goods> root, CriteriaQuery<?> query, CriteriaBuilder builder)
+                -> query.where(info.getPredicates(root, query, builder)).getRestriction(), info);
         List<Goods> goodsList = page.getContent();
         for (Goods goods : goodsList) {
-            if (sysConf.getStoreid().equals(goods.getStoreid())) {
-                goods.setSelfSale(StringConstant.CONSIGNMENT);
-            } else {
-                goods.setSelfSale(StringConstant.SALE_SELF);
+           defineGoodsInfo(goods);
+        }
+        return page;
+    }
+
+    /**
+     * 给goods赋值
+     *
+     * @param goods goods
+     */
+    @Override
+    public void defineGoodsInfo(Goods goods) {
+        if (sysConf.getStoreid().equals(goods.getStoreid())) {
+            goods.setSelfSale(StringConstant.CONSIGNMENT);
+        } else {
+            goods.setSelfSale(StringConstant.SALE_SELF);
+        }
+        goods.setFrozen(getFrozenCount(goods.getBatchCode()));
+        List<GoodsQtyPrice> prices = goods.getPrices();
+        if (CollectionUtils.isNotEmpty(prices)) {
+            int size = prices.size();
+            StringBuffer gradeBuffer = new StringBuffer();
+            StringBuffer priceBuffer = new StringBuffer();
+            for (int i = 0; i < size; i++) {
+                if (gradeBuffer.length() > 0) {
+                    gradeBuffer.append("\n");
+                    priceBuffer.append("\n");
+                }
+                String priceEnd = i + 1 == size ? "以上" : prices.get(i).getEnd().toString();
+                gradeBuffer.append(prices.get(i).getStart()).append("-").append(priceEnd);
+                String currencyName = StringConstant.RMB.equals(goods.getCurrencyName()) ? "¥" : "$";
+                Double price = StringConstant.RMB.equals(goods.getCurrencyName()) ? prices.get(i).getRMBPrice() : prices.get(i).getUSDPrice();
+                priceBuffer.append(currencyName).append(price);
             }
-            goods.setFrozen(getFrozenCount(goods.getBatchCode()));
+            goods.setPriceGradeStr(gradeBuffer.toString());
+            goods.setPriceStr(priceBuffer.toString());
         }
-		return page;
-	}
+    }
 
     /**
      * 根据店铺id查找店铺所属企业enUU
@@ -3606,7 +3654,9 @@ public class GoodsServiceImpl implements GoodsService {
 
         return goodsPage;
     }
-    private int getFrozenCount(String batchCode) {
+
+    @Override
+    public int getFrozenCount(String batchCode) {
         String statusStr = OrderStatus.TOBEPAID.getCodes() + SplitChar.HYPHEN + OrderStatus.TOBEDELIVER.getCodes();
         List<Integer> statusList = new ArrayList<>();
         for (String str : statusStr.split(SplitChar.HYPHEN)) {
@@ -3620,17 +3670,32 @@ public class GoodsServiceImpl implements GoodsService {
         return stock;
     }
 
-	private void convertPageInfo(PageInfo info, GoodsFilter goodsFilter) {
-		if (!StringUtils.isEmpty(goodsFilter.getCode())) {
-			info.filter("code", goodsFilter.getCode());
-		}
-		if (!StringUtils.isEmpty(goodsFilter.getBrand())) {
-			SimpleExpression[] brandExpression = new SimpleExpression[2];
-			brandExpression[0] = PredicateUtils.like("brandNameCn", goodsFilter.getBrand(), false, true);
-			brandExpression[1] = PredicateUtils.like("brandNameEn", goodsFilter.getBrand(), false, true);
-			info.expression(PredicateUtils.or((CriterionExpression[]) brandExpression));
-		}
-		if (!StringUtils.isEmpty(goodsFilter.getStore())) {
+    /**
+     * 封装分页过滤条件
+     *
+     * @param info 分页信息
+     * @param goodsFilter 筛选条件
+     */
+    private void convertPageInfo(PageInfo info, GoodsFilter goodsFilter) {
+        if (!StringUtils.isEmpty(goodsFilter.getStartTime())) {
+            java.sql.Date startDate = new java.sql.Date(goodsFilter.getStartTime());
+            info.expression(PredicateUtils.gte("createdDate", startDate, true));
+        }
+        if (!StringUtils.isEmpty(goodsFilter.getEndTime())) {
+            // 截止日期是到当天23:59:59,java.sql.Date精确到天,这里采用加一天小于的方法设置截止日期判断
+            java.sql.Date endDate = new java.sql.Date(goodsFilter.getEndTime() + IntegerConstant.ONE_DAY_MILLISECONDS);
+            info.expression(PredicateUtils.lt("createdDate", endDate, true));
+        }
+        if (!StringUtils.isEmpty(goodsFilter.getCode())) {
+            info.filter("code", goodsFilter.getCode());
+        }
+        if (!StringUtils.isEmpty(goodsFilter.getBrand())) {
+            SimpleExpression[] brandExpression = new SimpleExpression[2];
+            brandExpression[0] = PredicateUtils.like("brandNameCn", goodsFilter.getBrand(), false, true);
+            brandExpression[1] = PredicateUtils.like("brandNameEn", goodsFilter.getBrand(), false, true);
+            info.expression(PredicateUtils.or((CriterionExpression[]) brandExpression));
+        }
+        if (!StringUtils.isEmpty(goodsFilter.getStore())) {
             if (RegexConstant.onlyHaveNumber(goodsFilter.getStore())) {
                 SimpleExpression[] storeExpression = new SimpleExpression[2];
                 storeExpression[0] = PredicateUtils.eq("enUU", goodsFilter.getStore(), true);
@@ -3639,8 +3704,8 @@ public class GoodsServiceImpl implements GoodsService {
             } else {
                 info.filter("storeName", goodsFilter.getStore());
             }
-		}
-		if (!StringUtils.isEmpty(goodsFilter.getKindUuid())) {
+        }
+        if (!StringUtils.isEmpty(goodsFilter.getKindUuid())) {
             // 如果包含多个叶子类目ID,则获取所有的叶子类目对应的商品信息
             if (goodsFilter.getKindUuid().contains(SplitChar.COMMA)) {
                 String[] kindIds = goodsFilter.getKindUuid().split(SplitChar.COMMA);
@@ -3649,21 +3714,21 @@ public class GoodsServiceImpl implements GoodsService {
                 info.expression(PredicateUtils.eq("kindUuid", goodsFilter.getKindUuid(), false));
             }
         }
-		if (!StringUtils.isEmpty(goodsFilter.getCurrency())) {
-			info.expression(PredicateUtils.eq("currencyName", goodsFilter.getCurrency(), false));
-		}
-		if (goodsFilter.getSaleSelf() != null) {
-			if (goodsFilter.getSaleSelf()) {
-				info.expression(PredicateUtils.ne("storeid", sysConf.getStoreid(), false));
-			} else {
-				info.expression(PredicateUtils.eq("storeid", sysConf.getStoreid(), false));
-			}
-		}
-		if (goodsFilter.getBreakUp() != null) {
+        if (!StringUtils.isEmpty(goodsFilter.getCurrency())) {
+            info.expression(PredicateUtils.eq("currencyName", goodsFilter.getCurrency(), false));
+        }
+        if (goodsFilter.getSaleSelf() != null) {
+            if (goodsFilter.getSaleSelf()) {
+                info.expression(PredicateUtils.ne("storeid", sysConf.getStoreid(), false));
+            } else {
+                info.expression(PredicateUtils.eq("storeid", sysConf.getStoreid(), false));
+            }
+        }
+        if (goodsFilter.getBreakUp() != null) {
             int breakUp = goodsFilter.getBreakUp() ? 1 : 0;
-			info.filter("breakUp", breakUp, false);
-		}
-		if (goodsFilter.getHaveImg() != null) {
+            info.filter("breakUp", breakUp, false);
+        }
+        if (goodsFilter.getHaveImg() != null) {
             if (goodsFilter.getHaveImg()) {
                 info.expression(PredicateUtils.isNotNull("img"));
             } else {
@@ -3672,9 +3737,11 @@ public class GoodsServiceImpl implements GoodsService {
         }
         if (goodsFilter.getStandard() != null) {
             if (goodsFilter.getStandard()) {
-                info.expression(PredicateUtils.isNotNull("uuid"));
+                info.expression(PredicateUtils.and(PredicateUtils.isNotNull("uuid"),
+                        PredicateUtils.ne("uuid", StringConstant.BLANK, true)));
             } else {
-                info.expression(PredicateUtils.isNull("uuid"));
+                info.expression(PredicateUtils.or(PredicateUtils.isNull("uuid"),
+                        PredicateUtils.eq("uuid", StringConstant.BLANK, true)));
             }
         }
         if (goodsFilter.getAudited() != null) {
@@ -3692,7 +3759,7 @@ public class GoodsServiceImpl implements GoodsService {
                     statusSet.add(goodsFilter.getSaleStatus());
                 }
             }
-            if (goodsFilter.getSaleNum() != null && 603 != goodsFilter.getSaleNum()) {
+            if (goodsFilter.getSaleNum() != null && Status.HAS_NO_INVENTORY.value() != goodsFilter.getSaleNum()) {
                 statusSet.add(goodsFilter.getSaleNum());
             }
             if (CollectionUtils.isNotEmpty(statusSet)) {
@@ -3704,10 +3771,10 @@ public class GoodsServiceImpl implements GoodsService {
                 info.expression(PredicateUtils.or((CriterionExpression[]) statusExpression));
             }
         }
-        if (goodsFilter.getSaleNum() != null && 603 == goodsFilter.getSaleNum()) {
+        if (goodsFilter.getSaleNum() != null && Status.HAS_NO_INVENTORY.value() == goodsFilter.getSaleNum()) {
             info.expression(PredicateUtils.eq("reserve", 0, true));
         }
-	}
+    }
 
     @Override
     public Map<String, List<Goods>> getCmsPcb() {
@@ -4033,4 +4100,175 @@ public class GoodsServiceImpl implements GoodsService {
         }
         return product;
     }
+
+    /**
+     * 通过分成参数获取品牌数量
+     *
+     * @param pageable  分页信息
+     * @param endTime 截止时间
+     * @param startTime 开始时间
+     * @return Page<BrandCount>
+     */
+    @Override
+    public com.uas.sso.support.Page<BrandCount> getBrandProductsCount(Pageable pageable, Date startTime, Date endTime) {
+        StringBuffer sql = new StringBuffer("select pr_brand as brand, count(1) as count from products where pr_brand is not null ");
+        if (null != startTime) {
+            sql.append(" and pr_create_time >= '").append(new java.sql.Date(startTime.getTime())).append("' ");
+        }
+        if (null != endTime) {
+            sql.append(" and pr_create_time < '").append(new java.sql.Date(endTime.getTime() + IntegerConstant.ONE_DAY_MILLISECONDS) ).append("' ");
+        }
+        sql.append("group by pr_brand");
+        StringBuffer countSql = new StringBuffer("select count(1) from (").append(sql).append(") as a");
+        Integer count = commonDao.queryForObject(countSql.toString(), Integer.class);
+        // 分页参数
+        Integer offset = (pageable.getPageNumber() - 1) * pageable.getPageSize();
+        sql.append(" limit ? offset ?");
+        List<BrandCount> brandCountList = commonDao.query(sql.toString(), BrandCount.class, pageable.getPageSize(), offset);
+        return new com.uas.sso.support.Page<>(pageable.getPageNumber(), pageable.getPageSize(), brandCountList, count);
+    }
+
+    /**
+     * 通过分页参数获取类目数量
+     *
+     * @param pageable 分页参数
+     * @param endTime 截止时间
+     * @param startTime 开始时间
+     * @return Page<KindHierarchicalCount>
+     */
+    @Override
+    public com.uas.sso.support.Page<KindHierarchicalCount> getKindProductsCount(Pageable pageable, Date startTime, Date endTime) {
+        // 查询一段时间内类目数量,按类目分组查询统计数量
+        StringBuffer sql = new StringBuffer("select pr_kind as thirdKind, pr_kindid as kindId, count(1) as count from products where pr_kind is not null ");
+
+        // 根据物料创建时间筛选
+        if (null != startTime) {
+            sql.append(" and pr_create_time >= '").append(new java.sql.Date(startTime.getTime())).append("' ");
+        }
+        if (null != endTime) {
+            sql.append(" and pr_create_time < '").append(new java.sql.Date(endTime.getTime() + IntegerConstant.ONE_DAY_MILLISECONDS)).append("' ");
+        }
+        sql.append("group by pr_kind, pr_kindid");
+
+        // 统计数量
+        StringBuffer countSql = new StringBuffer("select count(1) from (").append(sql).append(") as a");
+        Integer count = commonDao.queryForObject(countSql.toString(), Integer.class);
+
+        // 分页参数
+        Integer offset = (pageable.getPageNumber() - 1) * pageable.getPageSize();
+        sql.append(" limit ? offset ?");
+        List<KindHierarchicalCount> kindList = commonDao.query(sql.toString(), KindHierarchicalCount.class, pageable.getPageSize(), offset);
+
+        // 根据父级类目id一层层判断是否存在
+        if (CollectionUtils.isNotEmpty(kindList)) {
+            kindList.stream().filter(kind -> null != kind.getKindId())
+                    .forEach(kind -> {
+                        KindInfo kindInfo = kindInfoDao.findOne(kind.getKindId());
+                        if (null != kindInfo && null != kindInfo.getParentid() && 0 != kindInfo.getParentid()) {
+                            KindInfo parentKind = kindInfoDao.findOne(kindInfo.getParentid());
+                            if (null != parentKind) {
+                                kind.setSecondKind(parentKind.getNameCn());
+                                if (null != parentKind.getParentid() && 0 != parentKind.getParentid()) {
+                                    KindInfo firstKind = kindInfoDao.findOne(parentKind.getParentid());
+                                    if (null != firstKind) {
+                                        kind.setFirstKind(firstKind.getNameCn());
+                                    }
+                                }
+                            }
+                        }
+                    });
+        }
+        return new com.uas.sso.support.Page<>(pageable.getPageNumber(), pageable.getPageSize(), kindList, count);
+    }
+
+    /**
+     * 批量导出数据
+     * TODO 后续提成公共方法,暂时没写好
+     *
+     * @param info        分页信息
+     * @param goodsFilter 过滤条件
+     * @return List<Goods>
+     */
+    @Override
+    public List<Goods> multiSearch(PageInfo info, GoodsFilter goodsFilter) {
+        List<Goods> goodsList = new ArrayList<>();
+        List<Future<List<Goods>>> futureList = new ArrayList<>();
+        BigDecimal pageSize = new BigDecimal(info.getPageSize());
+        BigDecimal pageCount = new BigDecimal(com.uas.platform.b2c.core.constant.IntegerConstant.PAGE_COUNT);
+        int maxPoolSize = (int) Math.ceil(pageSize.divide(pageCount).doubleValue());
+        ExecutorService exs = Executors.newFixedThreadPool(maxPoolSize);
+        for (int i = 0; i < maxPoolSize; i++) {
+            futureList.add(exs.submit(new CallableTask(i + 1, goodsFilter, info.getPageSize())));
+        }
+        for (Future<List<Goods>> future : futureList) {
+            while (true) {
+                if (future.isDone() && !future.isCancelled()) {
+                    List<Goods> goods = null;
+                    try {
+                        goods = future.get();
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    } catch (ExecutionException e) {
+                        e.printStackTrace();
+                    }
+                    goodsList.addAll(goods);
+                    break;
+                }
+            }
+        }
+        return goodsList;
+    }
+
+    private class CallableTask implements Callable<List<Goods>> {
+
+        /**
+         * 线程序号
+         */
+        Integer i;
+
+        /**
+         * 过滤条件
+         */
+        GoodsFilter goodsFilter;
+
+        /**
+         * 分页大小
+         */
+        Integer pageSize;
+
+        public CallableTask(int i, GoodsFilter goodsFilter, int pageSize) {
+            super();
+            this.i = i;
+            this.goodsFilter = goodsFilter;
+            this.pageSize = pageSize;
+        }
+
+        /**
+         * Computes a result, or throws an exception if unable to do so.
+         *
+         * @return computed result
+         * @throws Exception if unable to compute a result
+         */
+        @Override
+        public List<Goods> call() throws Exception {
+            int count = pageSize > com.uas.platform.b2c.core.constant.IntegerConstant.PAGE_COUNT ?
+                    com.uas.platform.b2c.core.constant.IntegerConstant.PAGE_COUNT : pageSize;
+            PageInfo info = new PageInfo(i, count);
+            List<Goods> goods = getPageDataOfBackground(info, goodsFilter).getContent();
+            return goods;
+        }
+    }
+
+    /**
+     * 通过goods id查询goods信息
+     *
+     * @param idList goods idList
+     * @return List<Goods>
+     */
+    @Override
+    public List<Goods> findByIds(List<Long> idList) {
+        List<Goods> goodsList = goodsDao.findAll(idList);
+        goodsList.forEach(goods ->  defineGoodsInfo(goods));
+        return goodsList;
+    }
 }

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

@@ -0,0 +1,81 @@
+package com.uas.platform.b2c.prod.commodity.service.impl;
+
+import com.uas.platform.b2c.fa.payment.utils.StringUtils;
+import com.uas.platform.b2c.prod.commodity.model.ProductPerson;
+import com.uas.platform.b2c.prod.commodity.service.ProductPersonService;
+import com.uas.platform.core.exception.IllegalOperatorException;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.BatchPreparedStatementSetter;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.sql.Date;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.util.List;
+
+/**
+ * @author yuj
+ * @date 2018/10/24 19:18
+ */
+@Service
+public class ProductPersonServiceImpl implements ProductPersonService {
+
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    /**
+     * 批量插入个人物料
+     * @param list 需要插入的数据
+     */
+    @Transactional(propagation = Propagation.REQUIRED)
+    @Override
+    public void batchInsert(List<ProductPerson> list) {
+        if (CollectionUtils.isEmpty(list)) {
+            return ;
+        }
+
+        String sql  = "insert into product$users(pu_date, pu_enuu, pu_prid, pu_useruu) values (?, ?, ?, ?)";
+        try {
+            jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
+                @Override
+                public void setValues(PreparedStatement ps, int i) throws SQLException {
+                    ps.setDate(1, new Date(System.currentTimeMillis()));
+                    ps.setLong(2, list.get(i).getEnuu());
+                    ps.setLong(3, list.get(i).getProductId());
+                    ps.setLong(4, list.get(i).getUserUU());
+                }
+
+                @Override
+                public int getBatchSize() {
+                    return list.size();
+                }
+            });
+        } catch (Exception e) {
+            // 如果报了已经存在了这颗料,则做移除动作
+            String message = e.getMessage();
+            if (!StringUtils.isEmpty(message) && message.contains("UNIQUE_ENUU_USERUU_PRID")) {
+                //截取物料id
+                int lastH = message.lastIndexOf("-");
+                message = message.substring(0, lastH);
+                lastH = message.lastIndexOf("-");
+                String prid = message.substring(lastH + 1);
+
+                //移除对应物料
+                for (ProductPerson productPerson : list) {
+                    if (productPerson.getProductId().longValue() == Long.valueOf(prid).longValue()) {
+                        list.remove(productPerson);
+                        break;
+                    }
+                }
+                batchInsert(list);
+            } else {
+                throw new IllegalOperatorException(e.getMessage());
+            }
+        }
+
+    }
+}

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

@@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.TypeReference;
 import com.alibaba.fastjson.parser.Feature;
 import com.uas.platform.b2c.common.account.model.Enterprise;
+import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.common.account.service.EnterpriseService;
 import com.uas.platform.b2c.common.base.dao.CommonDao;
 import com.uas.platform.b2c.common.search.rpc.service.SearchService;
@@ -42,6 +43,7 @@ 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.CommodityInOutbound;
 import com.uas.platform.b2c.prod.commodity.model.Goods;
+import com.uas.platform.b2c.prod.commodity.model.GoodsFilter;
 import com.uas.platform.b2c.prod.commodity.model.GoodsHistory;
 import com.uas.platform.b2c.prod.commodity.model.GoodsQtyPrice;
 import com.uas.platform.b2c.prod.commodity.model.InOutboundDetail;
@@ -61,6 +63,7 @@ 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.ProductAttachService;
+import com.uas.platform.b2c.prod.commodity.service.ProductPersonService;
 import com.uas.platform.b2c.prod.commodity.service.ProductPrivateService;
 import com.uas.platform.b2c.prod.commodity.service.ProductService;
 import com.uas.platform.b2c.prod.commodity.service.UASBatchPutOnPropertyService;
@@ -97,6 +100,7 @@ import com.uas.platform.core.logging.BufferedLoggerManager;
 import com.uas.platform.core.model.Constant;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.PageParams;
+import com.uas.platform.core.persistence.criteria.CriterionExpression;
 import com.uas.platform.core.persistence.criteria.LogicalExpression;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
 import com.uas.platform.core.persistence.criteria.SimpleExpression;
@@ -118,6 +122,7 @@ import org.springframework.jdbc.core.ParameterizedPreparedStatementSetter;
 import org.springframework.jdbc.core.StatementCallback;
 import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 import org.springframework.web.client.RestTemplate;
@@ -278,6 +283,9 @@ public class ProductServiceImpl implements ProductService {
 
     private final CommonDao commonDao;
 
+    @Autowired
+    private ProductPersonService productPersonService;
+
     @Autowired
     public ProductServiceImpl(CommonDao commonDao) {
         this.commonDao = commonDao;
@@ -449,28 +457,40 @@ public class ProductServiceImpl implements ProductService {
         }
     }
 
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     @Override
     public Integer setAllProductsByProductIds(String ids, Integer isAll, Integer isStardand) {
         List<Long> prIds;
-        int count = 0;
         try {
-            prIds = JSON.parseArray(ids,Long.class);
-        } catch (RuntimeException e){prIds = new ArrayList<>();}
-        Long useruu = SystemSession.getUser().getUserUU();
-        if (isAll != null && isAll.equals(IntegerConstant.YES_SHORT)) {
-            prIds = productDao.findPridsByEnuuAndStardand(SystemSession.getUser().getEnterprise().getUu(), isStardand);
+            prIds = JSON.parseArray(ids, Long.class);
+        } catch (RuntimeException e) {
+            prIds = new ArrayList<>();
+        }
+
+        //查找物料信息
+        User user = SystemSession.getUser();
+        if (IntegerConstant.YES_SHORT.equals(isAll)) {
+            prIds = productDao.findPridsByEnuuAndStardand(user.getEnterprise().getUu(), isStardand);
         }
+
+        //筛选已经存在个人物料库的信息
         if (!CollectionUtils.isEmpty(prIds)) {
-            for (Long prId : prIds) {
-                List<ProductPerson> p = productPersonDao.findByProductIdAndUserUU(prId,useruu);
-                if (CollectionUtils.isEmpty(p)) {
-                    ProductPerson productPerson = new ProductPerson(useruu, SystemSession.getUser().getEnterprise().getUu(), prId);
-                    productPersonDao.save(productPerson);
-                    count++;
-                }
+            List<Long> productIdInProductPerson = productPersonDao.findProductIdInProductPerson(prIds, user.getUserUU());
+            for (Long productid : productIdInProductPerson) {
+                prIds.remove(productid);
             }
         }
-        return count;
+
+        //转成需要保存的信息
+        List<ProductPerson> list = new ArrayList<>();
+        for (Long prId : prIds) {
+            ProductPerson productPerson = new ProductPerson(user.getEnterprise().getUu(), user.getUserUU(), prId);
+            list.add(productPerson);
+        }
+        if (CollectionUtils.isNotEmpty(list)) {
+            productPersonService.batchInsert(list);
+        }
+        return prIds.size();
     }
 
     @Override
@@ -589,7 +609,7 @@ public class ProductServiceImpl implements ProductService {
         if (CollectionUtils.isEmpty(ids)) {
             return new ResultMap(CodeType.NO_INFO, "没有传入有效信息");
         }
-        if (null != isPerson && isPerson.intValue() == IntegerConstant.YES_SHORT.intValue()) {
+        if (IntegerConstant.YES_SHORT.equals(isPerson)) {
             String sql = "delete from product$users where pu_prid in (:ids) and pu_useruu = " + SystemSession.getUser().getUserUU();
             Map<String, List<Long>> map = new HashedMap();
             map.put("ids", ids);
@@ -667,35 +687,27 @@ public class ProductServiceImpl implements ProductService {
      */
     @Override
     public ResultMap deleteBatch(String type, Integer isPerson) {
-        Integer standard;
+        //如果是删除个人物料
+        if (IntegerConstant.YES_SHORT.equals(isPerson)) {
+            ResultMap resultMap = deletePersonalProductByBatch(type);
+            return resultMap;
+        }
+        Integer standard = ProductConstant.STANDARD.equals(type) ? IntegerConstant.YES_SHORT : IntegerConstant.NO_SHORT;
         List<ProductPerson> personList;
         Integer fail = 0;
         Integer success = 0;
         Integer isHave = 0;
         Long uu = SystemSession.getUser().getEnterprise().getUu();
-        if (ProductConstant.STANDARD.equals(type)) {
-            standard = IntegerConstant.YES_SHORT;
-        } else {
-            standard = IntegerConstant.NO_SHORT;
-        }
-        List<Product> products = productDao.findProductByEnuuAndStandardAndEnabled(uu, standard, IntegerConstant.YES_SHORT);
-        for (Product product : products) {
-            if (null != isPerson && isPerson.intValue() == IntegerConstant.YES_SHORT.intValue()) {
-                List<ProductPerson> productPersonList = productPersonDao.findByProductIdAndUserUU(product.getId(),SystemSession.getUser().getUserUU());
-                if (!CollectionUtils.isEmpty(productPersonList)) {
-                    Long ppid = productPersonList.get(0).getId();
-                    productPersonDao.delete(ppid);
-                }
-                continue;
-            }
+        List<Long> products = v_productPrivateDao.findPridsByEnUUAndStandard(standard, uu);
+        for (Long prid : products) {
             try {
-                personList = productPersonDao.findByProductId(product.getId());
+                personList = productPersonDao.findByProductId(prid);
                 if (CollectionUtils.isNotEmpty(personList)) {
                     fail++;
                     continue;
                 }
                 //查看是否存在正常未取消的订单
-                List<Goods> goodses = goodsDao.findByProductId(product.getId());
+                List<Goods> goodses = goodsDao.findByProductId(prid);
                 Boolean isExistOrder = false;
                 String codes = OrderStatus.UNAVAILABLE.getCodes() + "-" + Status.TOBECONFIRMED.value();
                 for (Goods goods : goodses) {
@@ -718,13 +730,11 @@ public class ProductServiceImpl implements ProductService {
                 }
                 if (!isExistOrder) {
                     // 删除外键关联的匹配结果列表,不然删除product失败
-                    Set<ProductMatchResult> productMatchResultSet =  product.getMatchresults();
-                    productMatchResultDao.delete(productMatchResultSet);
+                    productMatchResultDao.deleteByProductid(prid);
                     goodsService.deleteGoods(goodses);
-                    ProductPrivate productPrivate = productPrivateService.findByPrId(product.getId());
+                    ProductPrivate productPrivate = productPrivateService.findByPrId(prid);
                     if (null == productPrivate) {
-                        productPrivate = new ProductPrivate();
-                        productPrivate.setPrId(product.getId());
+                        productPrivate = new ProductPrivate(prid);
                     } else {
                         if (productPrivate.getB2cEnabled().equals(IntegerConstant.NO_SHORT)) {
                             fail++;
@@ -761,6 +771,42 @@ public class ProductServiceImpl implements ProductService {
         return new ResultMap(status, message);
     }
 
+    /**
+     * 批量删除个人物料
+     *
+     * @param type
+     * @return
+     */
+    @Override
+    public ResultMap deletePersonalProductByBatch(String type) {
+        Integer standard;
+        Integer success = 0;
+        Long uu = SystemSession.getUser().getEnterprise().getUu();
+        if (ProductConstant.STANDARD.equals(type)) {
+            standard = IntegerConstant.YES_SHORT;
+        } else {
+            standard = IntegerConstant.NO_SHORT;
+        }
+        List<Long> prids = productDao.findPridsByEnuuAndStardand(uu, standard);
+        List<Long> personPrIds = null;
+        if (CollectionUtils.isNotEmpty(prids)) {
+            personPrIds = productPersonDao.findIdsInProductPerson(prids, SystemSession.getUser().getUserUU());
+            if (CollectionUtils.isNotEmpty(personPrIds)) {
+                success = personPrIds.size();
+                String ids = StringUtilB2C.joinListUseContact(personPrIds, SplitChar.COMMA);
+                jdbcTemplate.update("delete from product$users where pu_id in (" + ids +")");
+            }
+        }
+        String message = "";
+        if (IntegerConstant.NO_SHORT.equals(success)) {
+            message = "没有需要删除的信息";
+        } else {
+            message = "成功删除" + success + "条";
+        }
+        return new ResultMap(CodeType.OK, message);
+    }
+
+
     @Override
     public Product match(Long id) {
         Product product = productDao.findOne(id);
@@ -1488,11 +1534,11 @@ public class ProductServiceImpl implements ProductService {
         Map<String, Integer> resultMap = new HashMap<>();
         Long enUU = SystemSession.getUser().getEnterprise().getUu();
         Long userUU = SystemSession.getUser().getUserUU();
-        if (enUU == null){
+        if (enUU == null) {
             throw new IllegalOperatorException("店铺信息丢失,请刷新后重试");
         }
         int standard,nStandard;
-        if (null != isPerson && isPerson.intValue() == IntegerConstant.YES_SHORT.intValue()){
+        if (IntegerConstant.YES_SHORT.equals(isPerson)){
             standard = v_productPersonDao.getCountByEnuuAndUserUUAndStatusAndEnabled(enUU, userUU, ShortConstant.YES_SHORT, IntegerConstant.YES_SHORT);
             nStandard = v_productPersonDao.getCountByEnuuAndUserUUAndStatusAndEnabled(enUU, userUU, ShortConstant.NO_SHORT, IntegerConstant.YES_SHORT);
         } else {
@@ -2444,14 +2490,7 @@ public class ProductServiceImpl implements ProductService {
         }
         Long enUU = SystemSession.getUser().getEnterprise().getUu();
         Long userUU = SystemSession.getUser().getUserUU();
-        product.setPbrand(product.getBrand());
-        product.setPbranden(product.getBrand());
-        product.setPcmpcode(product.getCmpCode());
-        product.setKind(product.getProdName());
-        product.setSourceApp("B2C");
-        product.setEnUU(enUU);
-        product.setUserUU(userUU);
-        product.setCreateTime(new Date(System.currentTimeMillis()));
+        setDefaultInfo(enUU, userUU, product);
         // PCB产品做标准判断处理
         if (null != isPcb && Objects.equals(IntegerConstant.YES_SHORT, isPcb)) {
             // 判断传入的数据是否是标准的
@@ -2520,6 +2559,33 @@ public class ProductServiceImpl implements ProductService {
         return ResultMap.success();
     }
 
+    /**
+     * 物料信息赋值
+     *
+     * @param enUU 企业UU
+     * @param userUU 用户UU
+     * @param product 物料信息
+     */
+    private void setDefaultInfo(Long enUU, Long userUU, Product product) {
+        product.setPbrand(product.getBrand());
+        product.setPbranden(product.getBrand());
+        product.setPcmpcode(product.getCmpCode());
+        product.setKind(product.getProdName());
+        product.setSourceApp("B2C");
+        product.setEnUU(enUU);
+        product.setUserUU(userUU);
+        product.setCreateTime(new Date(System.currentTimeMillis()));
+        if (null == product.getPackaging()) {
+            product.setPackaging("其他");
+        }
+        if (null == product.getErpReserve()) {
+            product.setErpReserve(DoubleConstant.zero);
+        }
+        if (null == product.getMinPackQty()) {
+            product.setMinPackQty(DoubleConstant.minReserve);
+        }
+    }
+
     /**
      * 判断是否是标准物料
      *
@@ -2838,4 +2904,123 @@ public class ProductServiceImpl implements ProductService {
         goods = goodsDao.save(goods);
         LOGGER.log("上架商品", "新增上架商品", "通过卖家中心单个物料上传新增上架商品", goods.getCode(), goods.getId());
     }
+
+    /**
+     * 根据分页参数和过滤对象分页获取数据
+     *
+     * @param info        分页参数
+     * @param goodsFilter 过滤对象
+     * @return Page<Product>
+     */
+    @Override
+    public Page<V_ProductPrivate> getPageDataOfBackground(PageInfo info, GoodsFilter goodsFilter) {
+        if (info == null) {
+            throw new IllegalOperatorException("分页参数丢失");
+        }
+        if (goodsFilter != null) {
+            convertPageInfo(info, goodsFilter);
+        }
+        Page<V_ProductPrivate> page = v_productPrivateDao.findAll((Root<V_ProductPrivate> root, CriteriaQuery<?> query, CriteriaBuilder builder)
+                -> query.where(info.getPredicates(root, query, builder)).getRestriction(), info);
+        page.getContent().forEach(product -> {
+            List<Goods> goodsList = goodsDao.findByProductId(product.getId());
+            Enterprise enterprise = enterpriseService.getEnterpriseInfo(product.getEnUU());
+            product.setEnterpriseName(enterprise.getEnName());
+            if (CollectionUtils.isNotEmpty(goodsList)) {
+                Goods goods = goodsList.get(0);
+                goodsService.defineGoodsInfo(goods);
+                product.setGoods(goods);
+            }
+        });
+        return page;
+    }
+
+    /**
+     * 封装分页条件
+     *
+     * @param info 分页信息
+     * @param goodsFilter 过滤条件
+     */
+    private void convertPageInfo(PageInfo info, GoodsFilter goodsFilter) {
+        info.filter("b2cEnabled", Constant.YES);
+        if (!StringUtils.isEmpty(goodsFilter.getStartTime())) {
+            java.sql.Date startDate = new java.sql.Date(goodsFilter.getStartTime());
+            info.expression(PredicateUtils.gte("createTime", startDate, true));
+        }
+        if (!StringUtils.isEmpty(goodsFilter.getEndTime())) {
+            // 截止日期是到当天23:59:59,java.sql.Date精确到天,这里采用加一天小于的方法设置截止日期判断
+            java.sql.Date endDate = new java.sql.Date(goodsFilter.getEndTime() + com.uas.platform.b2c.prod.commodity.constant.IntegerConstant.ONE_DAY_MILLISECONDS);
+            info.expression(PredicateUtils.lt("createTime", endDate, true));
+        }
+        if (!StringUtils.isEmpty(goodsFilter.getCode())) {
+            info.filter("cmpCode", goodsFilter.getCode());
+        }
+        if (!StringUtils.isEmpty(goodsFilter.getBrand())) {
+            SimpleExpression[] brandExpression = new SimpleExpression[2];
+            brandExpression[0] = PredicateUtils.like("pbrand", goodsFilter.getBrand(), false, true);
+            brandExpression[1] = PredicateUtils.like("pbranden", goodsFilter.getBrand(), false, true);
+            info.expression(PredicateUtils.or((CriterionExpression[]) brandExpression));
+        }
+        if (!StringUtils.isEmpty(goodsFilter.getKindUuid())) {
+            // 如果包含多个叶子类目ID,则获取所有的叶子类目对应的商品信息
+            if (goodsFilter.getKindUuid().contains(SplitChar.COMMA)) {
+                String[] kindIds = goodsFilter.getKindUuid().split(SplitChar.COMMA);
+                info.expression(PredicateUtils.in("kindid", kindIds, false));
+            } else {
+                info.expression(PredicateUtils.eq("kindid", goodsFilter.getKindUuid(), false));
+            }
+        }
+        if (goodsFilter.getHaveImg() != null) {
+            if (goodsFilter.getHaveImg()) {
+                info.expression(PredicateUtils.isNotNull("cmpImg"));
+            } else {
+                info.expression(PredicateUtils.isNull("cmpImg"));
+            }
+        }
+        if (goodsFilter.getStandard() != null) {
+            info.filter("standard", goodsFilter.getStandard() ? Constant.YES : Constant.NO);
+        }
+    }
+
+    /**
+     * 通过物料id查询 V_ProductPrivate
+     *
+     * @param id 物料id
+     * @return V_ProductPrivate
+     */
+    @Override
+    public V_ProductPrivate getProductAndGoodsById(Long id) {
+        V_ProductPrivate productPrivate = v_productPrivateDao.findOne(id);
+        List<Goods> goodsList = goodsDao.findByProductId(productPrivate.getId());
+        if (CollectionUtils.isNotEmpty(goodsList)) {
+            Goods goods = goodsList.get(0);
+            if (goods != null) {
+                goods = goodsService.covertGoodsInfo(goods);
+                productPrivate.setGoods(goods);
+            }
+        }
+        return productPrivate;
+    }
+
+    /**
+     * 通过传入ID查询数据
+     *
+     * @param idList V_ProductPrivate的idList
+     * @return V_ProductPrivate
+     */
+    @Override
+    public List<V_ProductPrivate> findProductAndGoodsByIds(List<Long> idList) {
+        List<V_ProductPrivate> privates = v_productPrivateDao.findProductInId(idList);
+        privates.forEach(product -> {
+            List<Goods> goodsList = getGoodsByProductId(product.getId());
+            Enterprise enterprise = enterpriseService.getEnterpriseInfo(product.getEnUU());
+            product.setEnterpriseName(enterprise.getEnName());
+            if (CollectionUtils.isNotEmpty(goodsList)) {
+                Goods goods = goodsList.get(0);
+                goodsService.defineGoodsInfo(goods);
+                product.setGoods(goods);
+            }
+        });
+        return privates;
+    }
 }

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

@@ -16,6 +16,7 @@ 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.StringConstant;
 import com.uas.platform.b2c.prod.commodity.constant.UploadConstant;
+import com.uas.platform.b2c.prod.commodity.controller.ReleaseProductByBatchController;
 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;
@@ -40,6 +41,7 @@ import com.uas.platform.b2c.prod.commodity.service.InOutboundDetailService;
 import com.uas.platform.b2c.prod.commodity.service.ProductPrivateService;
 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.type.ReleaseConstant;
 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;
@@ -71,6 +73,8 @@ 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.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.dao.DataAccessException;
@@ -81,6 +85,7 @@ import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.StatementCallback;
 import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.ui.ModelMap;
 import org.springframework.util.StringUtils;
@@ -180,6 +185,9 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 
 	private final ProductPrivateService productPrivateService;
 
+
+	private final Logger logger = LoggerFactory.getLogger(ReleaseProductByBatchServiceImpl.class);
+
 	private static final String SIZE = "尺寸";
 	private static final String COLOR = "颜色";
 	private static final String THICKCOPPER = "铜厚";
@@ -231,15 +239,16 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 			if (colNum != UploadConstant.TOTAL_COLUMN_PERSON && colNum != UploadConstant.MAX_TOTAL_COLUMN_PERSON) {
 				throw new IllegalOperatorException("表格模板不正确!请重新下载最新模板");
 			}
-		} else if ((isPcb && colNum != UploadConstant.TOTAL_COLUMN_PCB && colNum != UploadConstant.MAX_TOTAL_COLUMN_PCB) || (!isPcb && colNum != UploadConstant.TOTAL_COLUMN && colNum != UploadConstant.MAX_TOTAL_COLUMN)) {
+		} else if ((isPcb && colNum != UploadConstant.TOTAL_COLUMN_PCB && colNum != UploadConstant.MAX_TOTAL_COLUMN_PCB) ||
+				(!isPcb && colNum != UploadConstant.TOTAL_COLUMN && colNum != UploadConstant.MAX_TOTAL_COLUMN)) {
 				throw new IllegalOperatorException("表格模板不正确!请重新下载最新模板");
-			}
+		}
 		int rowNum = SheetUtil.getSheetLastNum(sheet, isPcb ? UploadConstant.MAX_TOTAL_COLUMN_PCB : UploadConstant.MAX_TOTAL_COLUMN);
 		if (rowNum > 2002) {
-			throw new IllegalOperatorException ("您上传的信息超过2000条,请拆分成2000以下再上传");
+			throw new IllegalOperatorException("您上传的信息超过2000条,请拆分成2000以下再上传");
 		}
 		if (rowNum < 2) {
-			throw new IllegalOperatorException ("请填写上传信息");
+			throw new IllegalOperatorException("请填写上传信息");
 		}
 		List<ReleaseProductByBatch> releaseProductByBatchs = new ArrayList<>(rowNum);
 		String batch = createNumberService.getTimeNumber("product$goods", 8, rowNum);
@@ -362,9 +371,11 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 				if (releaseProductByBatch.compareSameProductTagInfo(byBatch)) {
 					releaseProductByBatch.setTag("");
 					releaseProductByBatch.setTagstr("");
-					releaseProductByBatch.addErrmsg(ErrorInfoConstant.REPEAT_IN_EXCEL.getInfo());
-					releaseProductByBatch.setReleaseStatus(ReleaseStatus.had_exists.getPhrase());
-					releaseProductByBatch.setReleaseCode(ReleaseStatus.had_exists.value());
+					if (!releaseProductByBatch.getErrmsg().contains(ErrorInfoConstant.REPEAT_IN_EXCEL.getInfo())) {
+						releaseProductByBatch.addErrmsg(ErrorInfoConstant.REPEAT_IN_EXCEL.getInfo());
+						releaseProductByBatch.setReleaseStatus(ReleaseStatus.had_exists.getPhrase());
+						releaseProductByBatch.setReleaseCode(ReleaseStatus.had_exists.value());
+					}
 					if (releaseProductByBatch.getErrmsg().substring(0, 1).equals(",")) {
 						releaseProductByBatch.setErrmsg(releaseProductByBatch.getErrmsg().substring(1));
 					}
@@ -862,21 +873,15 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 
 		Object breakValue = readWorkBookCell(row.getCell(ModifyConstant.BREAK_UP), Cell.CELL_TYPE_STRING,
 				rowNum, ModifyConstant.BREAK_UP);
-		if (!StringUtils.isEmpty(breakValue)) {
-            aProduct.setBreakUpByExcel(breakValue);
-        }
+		aProduct.setBreakUpByExcel(breakValue);
 
 		Object packageNumValue = readWorkBookCell(row.getCell(ModifyConstant.PACKAGE_NUMBER), Cell.CELL_TYPE_STRING,
 				rowNum, ModifyConstant.PACKAGE_NUMBER);
-		if (!StringUtils.isEmpty(packageNumValue)) {
-            aProduct.setMinPackageByExcel(packageNumValue);
-        }
+		aProduct.setMinPackageByExcel(packageNumValue);
 
 		Object buyQtyValue = readWorkBookCell(row.getCell(ModifyConstant.BUY_MIN_QTY), Cell.CELL_TYPE_STRING,
 				rowNum, ModifyConstant.BUY_MIN_QTY);
-		if (!StringUtils.isEmpty(buyQtyValue)) {
-            aProduct.setMinBuyQtyByExcel(buyQtyValue);
-        }
+		aProduct.setMinBuyQtyByExcel(buyQtyValue);
 
 		Object reserveValue = readWorkBookCell(row.getCell(ModifyConstant.RESERVE_NUMBER), Cell.CELL_TYPE_STRING,
 				rowNum, ModifyConstant.RESERVE_NUMBER);
@@ -1184,10 +1189,11 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 
 	/**
 	 * 设置交期的信息
+	 * @param releaseProductByBatch 批量导入临时表对象
+	 * @param minDelivery 最短交期
+	 * @param maxDelivery 最长交期
 	 */
 	private void setDeliveryTime(ReleaseProductByBatch releaseProductByBatch, Object minDelivery, Object maxDelivery) {
-		minDelivery = minDelivery == null ? maxDelivery : minDelivery;
-		maxDelivery = maxDelivery == null ? minDelivery : maxDelivery;
 		Short min = getDeliveryTime(minDelivery);
 		Short max = getDeliveryTime(maxDelivery);
 		if ((min != null) || (max != null)) {
@@ -1212,6 +1218,10 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 			}
 			releaseProductByBatch.setSelfMinDelivery(min);
 			releaseProductByBatch.setSelfMaxDelivery(max);
+		} else {
+			// 设置默认值
+			releaseProductByBatch.setSelfMinDelivery(ReleaseConstant.DEFAULT_MIN_DELIVERY);
+			releaseProductByBatch.setSelfMaxDelivery(ReleaseConstant.DEFAULT_MAX_DELIVERY);
 		}
 	}
 
@@ -1309,16 +1319,14 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 
 			Object packageMethodValue = readWorkBookCell(row.getCell(UploadConstant.PACKAGE_METHOD), Cell.CELL_TYPE_STRING,
 					rowNum, UploadConstant.PACKAGE_METHOD);
-			aProduct.setPackagingByExcel(packageMethodValue , isAPerson);
+			aProduct.setPackagingByExcel(packageMethodValue, isAPerson);
 
 			Object minValue = readWorkBookCell(row.getCell(UploadConstant.MIN_DELIVERY), Cell.CELL_TYPE_STRING,
-					rowNum, UploadConstant.MIN_DELIVERY);
+					 rowNum, UploadConstant.MIN_DELIVERY);
 			Object maxValue = readWorkBookCell(row.getCell(UploadConstant.MAX_DELIVERY), Cell.CELL_TYPE_STRING,
 					rowNum, UploadConstant.MAX_DELIVERY);
 			aProduct.setDeliveryByExcel(minValue, maxValue);
-			if (!StringUtils.isEmpty(minValue) || !StringUtils.isEmpty(maxValue)) {
-				setDeliveryTime(aProduct, minValue, maxValue);
-			}
+			setDeliveryTime(aProduct, minValue, maxValue);
 
 			Object packageNumValue = readWorkBookCell(row.getCell(UploadConstant.PACKAGE_NUMBER), Cell.CELL_TYPE_STRING,
 					rowNum, UploadConstant.PACKAGE_NUMBER);
@@ -1352,7 +1360,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 		} else {
 			Object packageMethodValue = readWorkBookCell(row.getCell(UploadConstant.SPECIFICATION), Cell.CELL_TYPE_STRING,
 					rowNum, UploadConstant.SPECIFICATION);
-			aProduct.setPackagingByExcel(packageMethodValue , isAPerson);
+			aProduct.setPackagingByExcel(packageMethodValue, isAPerson);
 		}
 		return result;
 	}
@@ -1840,7 +1848,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 		return releaseProductByBatchDao.findByPublisherUuAndRelbatchidAndFailCode(SystemSession.getUser().getUserUU(), batch, failCode);
 	}
 
-	@Transactional
+	@Transactional(propagation = Propagation.REQUIRED)
 	@Override
 	public String publishByBatch(String batch, boolean isPcb, Integer ignoreImport) {
         if (StringUtils.isEmpty(batch)) {
@@ -1858,9 +1866,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 		if (isPcb) {
 			savePcbInfo(idSet, map);
 		}
-		//添加个人关系
-		String res  = restTemplate.postForEntity(productServiceIp + "/product/assign/batch?userUU=" + SystemSession.getUser().getUserUU(), idSet, String.class).getBody();
-		Integer num = releaseToGoods(releaseProductByBatchList, ignoreImport, idSet);
+        Integer num = releaseToGoods(releaseProductByBatchList, ignoreImport, idSet);
 		String updateReleaseSql = "/*#mycat:db_type=master*/ update trade$releasebybatch set rel_releasecode = 101,rel_releasestatus = '已发布' where (rel_releasecode = 112 OR rel_releasecode = 113) and rel_batchid = '%s';";
 		final String updateRelease = String.format(updateReleaseSql, new Object[]{batch});
 		jdbcTemplate.execute(updateRelease);
@@ -1880,7 +1886,6 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 	 */
 	public Integer releaseToGoods(List<ReleaseProductByBatch> list, Integer ignoreImport, Set<Long> idSet) {
 		if (CollectionUtils.isNotEmpty(list)) {
-			List<Goods> goodses = new ArrayList<>();
 			Goods goods = null;
 			TradeDeliveryDelayTime delayTime = getDelayTime(list.get(0));
 			List<Goods> goodlist = null;
@@ -1920,19 +1925,16 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 					goods = new Goods();
 					goods.setGoodsByReleaseProductByBatch(releaseProductByBatch, delayTime);
 					goodsHistoryList.add(goodsHistoryService.converTGoodsHist(goods, GoodsHistory.OperateType.Publish.getPhrase(), false));
-					goodses.add(goods);
+					updateGoods.add(goods);
 				}
 			}
-			if (CollectionUtils.isNotEmpty(goodses)) {
-				commonDao.save(goodses, Goods.class);
-			}
 			if (CollectionUtils.isNotEmpty(updateGoods)) {
                 goodsDao.save(updateGoods);
             }
             if (CollectionUtils.isNotEmpty(goodsHistoryList)) {
 				goodsHistoryService.save(goodsHistoryList);
 			}
-			return (goodses.size() + updateGoods.size());
+			return updateGoods.size();
 		} else {
 			return 0;
 		}
@@ -2162,47 +2164,21 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 
 	/**
 	 * 批量发布之后,需要做的事情,内部使用线程,不需要让用户等结果
+	 * @param batchid 批次信息
+	 * @param productIds 物料ids
 	 */
 	public void afterPublishToGoodsDo(final List<Long> productIds, String batchid) {
         if (CollectionUtils.isEmpty(productIds) || StringUtils.isEmpty(batchid)) {
 			return ;
 		}
-		final Runnable afterPublishToGoodsRunnable = new Runnable() {
+        final Long userUU = SystemSession.getUser().getUserUU();
+        final Runnable afterPublishToGoodsRunnable = new Runnable() {
 			@Override
 			public void run() {
-
-				//创建历史库存
-//				List<Goods> goodses1 = goodsService.findByBatchId(batchid);
-//				List<GoodsHistory> list = new ArrayList<>();
-//				for (Goods goods : goodses1) {
-//					GoodsHistory goodsHistory = goodsHistoryService.converTGoodsHist(goods, GoodsHistory.OperateType.Publish.getPhrase(), false);
-//					list.add(goodsHistory);
-//				}
-//				if (CollectionUtils.isNotEmpty(list)) {
-//					goodsHistoryService.save(list);
-//				}
 				//创建物料的私有信息
 				productPrivateService.newProductPrivateIfNotExist(productIds);
-
-//				if ((reIds != null) && (reIds.size() != 0)) {
-//					List<ReleaseProductByBatch> productByBatches = releaseProductByBatchDao.findAll(reIds);
-//					List<Long> prIds = new ArrayList<>();
-//					for (ReleaseProductByBatch productByBatch : productByBatches) {
-//						if (productByBatch.getProductid() != null) {
-//							prIds.add(productByBatch.getProductid());
-//						}
-//					}
-//					List<Product> products = productService.findByProductId(prIds);
-//					for (Product product : products) {
-//						for (ReleaseProductByBatch productByBatch : productByBatches) {
-//							if ((productByBatch.getProductid() != null) && (product.getId().longValue() == productByBatch.getProductid().longValue())) {
-//								product.setSpec(productByBatch.getSpec());
-//							}
-//						}
-//					}
-//					List<Goods> goodses = goodsDao.findByProductIds(prIds);
-//					goodsService.updateSpecByProducts(products, goodses);
-//				}
+				//添加个人关系
+                restTemplate.postForEntity(productServiceIp + "/product/assign/batch?userUU=" + userUU, productIds, String.class).getBody();
             }
 		};
 		try {

+ 22 - 1
src/main/java/com/uas/platform/b2c/prod/commodity/type/ReleaseConstant.java

@@ -7,7 +7,28 @@ package com.uas.platform.b2c.prod.commodity.type;
  */
 public class ReleaseConstant {
 
-    public static final String YES= "是";
+    /**
+     * 是
+     */
+    public static final String YES = "是";
 
+    /**
+     * 否
+     */
     public static final String NO = "否";
+
+    /**
+     * 默认最长交期
+     */
+    public static final Short DEFAULT_MAX_DELIVERY = 10;
+
+    /**
+     * 默认最短交期
+     */
+    public static final Short DEFAULT_MIN_DELIVERY = 1;
+
+    /**
+     * 包装方式最长长度
+     */
+    public static final Integer PACKAKING_MAX_LENGTH = 150;
 }

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

@@ -1,6 +1,7 @@
 package com.uas.platform.b2c.prod.product.brand.dao;
 
 import com.uas.platform.b2c.prod.product.brand.modal.Brand;
+import com.uas.platform.b2c.prod.store.model.BrandCount;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
@@ -11,6 +12,7 @@ import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -114,4 +116,17 @@ public interface BrandDao extends JpaSpecificationExecutor<Brand>, JpaRepository
 	 */
 	@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);
+
+    /**
+     * 分页查找物料信息
+     *
+     * @param pageable 分页信息
+     * @param startDate 开始日期
+     * @param endDate 截止日期
+     * @return
+     */
+    @Query(value = "select br_name_en as brand, count(1) as count from product$brand where br_createtime >= :startDate and br_createtime <= :endDate group by br_name_en ORDER BY ?#{#pageable}",
+    countQuery = "select count(1) from (select count(1) from product$brand where br_createtime >= :startDate and br_createtime <= :endDate group by br_name_en) as a",
+    nativeQuery = true)
+    Page<BrandCount> getBrandProductsCount(Pageable pageable, @Param("startDate") Date startDate, @Param("endDate") Date endDate);
 }

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

@@ -70,4 +70,12 @@ public class CreateNumber {
 		this.number = number;
 	}
 
+	public CreateNumber() {
+	}
+
+	public CreateNumber(String tbname, String time, Integer number) {
+		this.tbname = tbname;
+		this.time = time;
+		this.number = number;
+	}
 }

+ 60 - 28
src/main/java/com/uas/platform/b2c/prod/product/common/service/impl/CreateNumberServiceImpl.java

@@ -1,15 +1,21 @@
 package com.uas.platform.b2c.prod.product.common.service.impl;
 
+import com.uas.platform.b2c.prod.commodity.controller.GoodsController;
 import com.uas.platform.b2c.prod.product.common.dao.CreateNumberDao;
 import com.uas.platform.b2c.prod.product.common.model.CreateNumber;
 import com.uas.platform.b2c.prod.product.common.service.CreateNumberService;
 import com.uas.platform.b2c.core.utils.DateFormatUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.DataAccessException;
 import org.springframework.data.redis.connection.RedisConnection;
 import org.springframework.data.redis.core.RedisCallback;
 import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -26,17 +32,21 @@ public class CreateNumberServiceImpl implements CreateNumberService {
 
 	private final RedisTemplate<Serializable,Serializable> redisTemplate;
 
+	private final JdbcTemplate jdbcTemplate;
+
 	@Autowired
-	public CreateNumberServiceImpl(CreateNumberDao createNumberDao, RedisTemplate redisTemplate) {
+	public CreateNumberServiceImpl(CreateNumberDao createNumberDao, RedisTemplate redisTemplate, JdbcTemplate jdbcTemplate) {
 		this.createNumberDao = createNumberDao;
 		this.redisTemplate = redisTemplate;
-	}
+        this.jdbcTemplate = jdbcTemplate;
+    }
 
 	@Override
 	public CreateNumber save(CreateNumber createNumber) {
 		return createNumberDao.save(createNumber);
 	}
 
+	@Transactional(propagation = Propagation.NOT_SUPPORTED)
 	@Override
 	public String getTimeNumber(String tbname, int digit, Integer... addNums) {
 		synchronized (tbname) {
@@ -45,39 +55,61 @@ public class CreateNumberServiceImpl implements CreateNumberService {
 			while (true) {
 				if (getDataFromRedis(tbname) == null) {
 					setDataToRedis(tbname);
-					String time = getTime();
-					int num;
-					CreateNumber createNumber = createNumberDao.findByTbname(tbname);
-					if (createNumber == null) {
-						createNumber = new CreateNumber();
-						createNumber.setTbname(tbname);
-						createNumber.setTime(time);
-						num = 1;
-					} else {
-						// 2、检查时间是不是今天
-						if (time.equals(createNumber.getTime())) {
-							num = createNumber.getNumber() + 1;
-						} else {
-							num = 1;
-							createNumber.setTime(time);
-						}
-					}
-					if (addNums.length > 0) {
-						createNumber.setNumber(num + addNums[0] - 1);
-					} else {
-						createNumber.setNumber(num);
-					}
-					createNumberDao.save(createNumber);
-					redisTemplate.delete(tbname);
-					timeNumber = createNumber.getTime() + formatIntToStr(num, digit);
+                    timeNumber = getOrderNumber(tbname, digit, addNums);
+                    redisTemplate.delete(tbname);
 					break;
 				}
 			}
-
 			return timeNumber;
 		}
 	}
 
+	/**
+	 * 循环取订单号,如果连续取十次,还取不到,就报错误。
+	 * @param tnName 表名称
+	 * @param digit 数字
+	 * @param addNums 预留长度
+	 * @return
+	 */
+	public String getOrderNumber(String tnName, int digit, Integer... addNums) {
+	    int times = 0;
+	    boolean success = false;
+	    String timeNumber = "";
+	    while((times < 10) && !success) {
+            String time = getTime();
+            int num = 0;
+            CreateNumber createNumber = createNumberDao.findByTbname(tnName);
+            if (createNumber == null) {
+                num = (addNums.length > 0) ? (num + addNums[0]) : (num + 1);
+                createNumber = new CreateNumber(tnName, time, num + 1);
+                try {
+                    createNumberDao.save(createNumber);
+                    success = true;
+                    timeNumber = time + formatIntToStr(num, digit);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            } else {
+                //如果已经存在createNumber信息
+                Integer originNum = createNumber.getNumber();
+                String originTime = createNumber.getTime();
+                // 2、检查时间是今天,就设置成对应的值
+				num = time.equals(originTime) ? originNum : num;
+				Integer resultNum = (addNums.length > 0) ? num + addNums[0] : num + 1;
+				num++;
+                int update = jdbcTemplate.update("update product$creat_number set cn_time = '" + time + "', cn_number = " + resultNum
+                        + " where cn_tbname = '" + tnName + "' and cn_time = '" + originTime + "' and cn_number = " + originNum);
+                if (update == 1) {
+                    success = true;
+					timeNumber = time + formatIntToStr(num, digit);
+                }
+            }
+            times++;
+        }
+        return timeNumber;
+
+    }
+
 	/**
 	 * 获得8位时间
 	 */

+ 14 - 2
src/main/java/com/uas/platform/b2c/prod/store/controller/StoreApplyController.java

@@ -3,6 +3,7 @@ package com.uas.platform.b2c.prod.store.controller;
 import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.support.view.JxlsExcelView;
+import com.uas.platform.b2c.core.utils.DateFormatUtils;
 import com.uas.platform.b2c.prod.store.facade.StoreApplyFacade;
 import com.uas.platform.b2c.prod.store.model.StoreApply;
 import com.uas.platform.b2c.prod.store.model.StoreInfoAndProdExport;
@@ -107,6 +108,18 @@ public class StoreApplyController {
 		return storeApplyFacade.handlerApply(uuid, status, apply);
 	}
 
+	/**
+	 * 初审
+	 * @param uuid
+	 * @param apply
+	 * @return
+	 */
+	@RequestMapping(value = "/check", method = RequestMethod.PUT)
+	public ResultMap checkApply(@RequestParam String uuid, @RequestBody(required = false) StoreApply apply) {
+		logger.info(String.format("初审:Handle apply uuid %s", uuid));
+		return storeApplyFacade.checkApply(uuid, apply);
+	}
+
 	/**
 	 * 保存店铺申请信息
 	 *
@@ -212,8 +225,7 @@ public class StoreApplyController {
 	public ModelAndView storeInfoAndProdCountExport(@DateTimeFormat(pattern = "yyyy-MM-dd") Date startTime, @DateTimeFormat(pattern = "yyyy-MM-dd") Date endTime) {
 		ModelAndView modelAndView = new ModelAndView();
 		SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
-		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-		modelAndView.addObject("dateFormat", dateFormat);
+		modelAndView.addObject("dateFormat", DateFormatUtils.DATETIME_FORMAT);
 		modelAndView.addObject("startTime", format.format(startTime));
 		modelAndView.addObject("endTime", format.format(endTime));
 		List<StoreInfoAndProdExport> exports = storeApplyService.storeInfoAndProdCountExport(startTime, endTime);

+ 8 - 0
src/main/java/com/uas/platform/b2c/prod/store/facade/StoreApplyFacade.java

@@ -21,6 +21,14 @@ public interface StoreApplyFacade {
 	 */
 	ResultMap handlerApply(String uuid, StoreApply.ApplyStatus status, StoreApply apply);
 
+	/**
+	 * 初审
+	 * @param uuid
+	 * @param apply
+	 * @return
+	 */
+	ResultMap checkApply(String uuid, StoreApply apply);
+
 	/**
 	 * 确认开铺
 	 *

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

@@ -19,7 +19,9 @@ import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 店铺申请外观实现类
@@ -101,10 +103,8 @@ public class StoreApplyFacadeImpl implements StoreApplyFacade {
 			}
 			storeApply.setReason(apply.getReason());
 		}
-		Date date = new Date();
 		// 保存审核时的审核人信息和是否通过状态
-		storeApply.setAuthPerson(user.getUserName());
-		storeApply.setAuthTime(date);
+		storeApply.setFinalPerson(user.getUserName());
 		storeApply.setStatus(status);
 		// 保存审核时的企业信息
 		storeApply.setEnType(apply.getEnType());
@@ -123,6 +123,66 @@ public class StoreApplyFacadeImpl implements StoreApplyFacade {
 		return ResultMap.success(null);
 	}
 
+	@Override
+	public ResultMap checkApply(String uuid, StoreApply apply) {
+		// 通过uuid找到店铺申请信息
+		User user = SystemSession.getUser();
+		if (user == null || user.getEnterprise() == null) {
+			return new ResultMap(CodeType.NOT_PERMIT, "请进行用户登录操作");
+		}
+		// 验证参数合法性
+		if (StringUtils.isEmpty(uuid) || StringUtils.isEmpty(apply)) {
+			return new ResultMap(CodeType.NO_INFO, "店铺申请UUID或申请信息不存在");
+		}
+		StoreApply storeApply = storeApplyService.findByUuid(uuid);
+		if (StringUtils.isEmpty(apply.getEnType())) {
+			return new ResultMap(CodeType.NO_INFO, "公司资质类型不能为空");
+		}
+		if (StringUtils.isEmpty(apply.getEnQualification())) {
+			return new ResultMap(CodeType.NO_INFO, "公司资质信息不能为空");
+		}
+		if (StoreType.AGENCY == apply.getType() || StoreType.ORIGINAL_FACTORY == apply.getType()) {
+			if (CollectionUtils.isEmpty(apply.getBrands())) {
+				return new ResultMap(CodeType.NO_INFO, "品牌审核信息不能为空");
+			}
+			for (StoreBrandInfo brandInfo : apply.getBrands()) {
+				Map map = new HashMap();
+				map.put("registrant", brandInfo.getRegistrant());
+				map.put("number", brandInfo.getNumber());
+				map.put("registrationDate", brandInfo.getRegistrationDate());
+				map.put("address", brandInfo.getAddress());
+				map.put("effectiveDate", brandInfo.getEffectiveDate());
+				map.put("approvalUnit", brandInfo.getApprovalUnit());
+				if (checkIsNull(map)) {
+					return new ResultMap(CodeType.NO_INFO, "品牌信息不能为空");
+				}
+			}
+		}
+		Date date = new Date();
+		storeApply.setReason(null);
+		storeApply.setAuthPerson(user.getUserName());
+		storeApply.setAuthTime(date);
+		storeApply.setStatus(StoreApply.ApplyStatus.CHECK);
+		// 保存审核时的企业信息
+		storeApply.setEnType(apply.getEnType());
+		storeApply.setEnQualification(apply.getEnQualification());
+		storeApply.setBrands(apply.getBrands());
+		storeApply.setBannerUrl("http://dfs.ubtob.com/group1/M00/19/BF/CgpkyFlSBRmAcascAANK5vkByag940.jpg");
+		storeApply.setLogoUrl("https://mall.usoftchina.com/static/img/store/common/default.png");
+		StoreApply savedApply = storeApplyService.handlerApply(storeApply);
+		return ResultMap.success(savedApply.getUuid());
+	}
+
+	private Boolean checkIsNull(Map<String, Object> map) {
+		for (Map.Entry<String, Object> entry : map.entrySet()) {
+			if (entry.getValue() == null || "".equals(entry.getValue())) {
+				return true;
+			}
+
+		}
+		return false;
+	}
+
 	@Override
 	public ResultMap confirmOpenStore(String uuid, StoreApply storeApply) {
 		Date date = new Date();

+ 36 - 0
src/main/java/com/uas/platform/b2c/prod/store/model/BrandCount.java

@@ -0,0 +1,36 @@
+package com.uas.platform.b2c.prod.store.model;
+
+/**
+ * 品牌数量统计
+ *
+ * @author hejq
+ * @date 2018-10-23 11:40
+ */
+public class BrandCount {
+
+    /**
+     * 品牌名称
+     */
+    private String brand;
+
+    /**
+     * 数量
+     */
+    private Integer count;
+
+    public String getBrand() {
+        return brand;
+    }
+
+    public void setBrand(String brand) {
+        this.brand = brand;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+}

+ 88 - 0
src/main/java/com/uas/platform/b2c/prod/store/model/KindHierarchicalCount.java

@@ -0,0 +1,88 @@
+package com.uas.platform.b2c.prod.store.model;
+
+/**
+ * 类目数量
+ *
+ * @author hejq
+ * @date 2018-10-23 11:41
+ */
+public class KindHierarchicalCount {
+
+    /**
+     * 一级类目
+     */
+    private String firstKind;
+
+    /**
+     * 二级类目
+     */
+    private String secondKind;
+
+    /**
+     * 三级类目
+     */
+    private String thirdKind;
+
+    /**
+     * 数量
+     */
+    private Integer count;
+
+    /**
+     * 父类目id
+     */
+    private Long parentId;
+
+    /**
+     * 类目Id
+     */
+    private Long kindId;
+
+    public String getFirstKind() {
+        return firstKind;
+    }
+
+    public void setFirstKind(String firstKind) {
+        this.firstKind = firstKind;
+    }
+
+    public String getSecondKind() {
+        return secondKind;
+    }
+
+    public void setSecondKind(String secondKind) {
+        this.secondKind = secondKind;
+    }
+
+    public String getThirdKind() {
+        return thirdKind;
+    }
+
+    public void setThirdKind(String thirdKind) {
+        this.thirdKind = thirdKind;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+
+    public Long getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Long parentId) {
+        this.parentId = parentId;
+    }
+
+    public Long getKindId() {
+        return kindId;
+    }
+
+    public void setKindId(Long kindId) {
+        this.kindId = kindId;
+    }
+}

+ 19 - 2
src/main/java/com/uas/platform/b2c/prod/store/model/StoreApply.java

@@ -12,6 +12,7 @@ import javax.persistence.EnumType;
 import javax.persistence.Enumerated;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
+import javax.persistence.Index;
 import javax.persistence.Table;
 import javax.persistence.Transient;
 import java.util.Collections;
@@ -25,7 +26,9 @@ import java.util.List;
  * @version 2017-08-02 14:37:25 创建文件
  */
 @Entity
-@Table(name = "store$apply")
+@Table(name = "store$apply", indexes = {
+		@Index(name = "store$apply_status_index", columnList = "apply_status")
+})
 @JsonInclude(JsonInclude.Include.NON_EMPTY)
 public class StoreApply {
 
@@ -72,6 +75,12 @@ public class StoreApply {
 	@Column(name = "apply_auth_person_name")
 	private String authPerson;
 
+	/**
+	 * 终审审核人姓名
+	 */
+	@Column(name = "apply_final_name")
+	private String finalPerson;
+
 	/**
 	 * 管理员审核时间
 	 */
@@ -188,12 +197,20 @@ public class StoreApply {
 	 * 店铺申请状态枚举类
 	 */
 	public enum ApplyStatus {
-		PREPARE, PASS, UNPASS
+		PREPARE, PASS, UNPASS,CHECK
 	}
 
 	public StoreApply() {
 	}
 
+	public String getFinalPerson() {
+		return finalPerson;
+	}
+
+	public void setFinalPerson(String finalPerson) {
+		this.finalPerson = finalPerson;
+	}
+
 	public String getApplyDescription() {
 		return applyDescription;
 	}

+ 79 - 52
src/main/java/com/uas/platform/b2c/prod/store/service/impl/StoreApplyServiceImpl.java

@@ -6,9 +6,17 @@ import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.common.base.dao.CommonDao;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.utils.UuidUtils;
+import com.uas.platform.b2c.prod.commodity.constant.IntegerConstant;
 import com.uas.platform.b2c.prod.store.dao.StoreApplyDao;
 import com.uas.platform.b2c.prod.store.dao.StoreBrandInfoDao;
-import com.uas.platform.b2c.prod.store.model.*;
+import com.uas.platform.b2c.prod.store.model.EnterpriseSimple;
+import com.uas.platform.b2c.prod.store.model.Qualification;
+import com.uas.platform.b2c.prod.store.model.QualificationType;
+import com.uas.platform.b2c.prod.store.model.StoreApply;
+import com.uas.platform.b2c.prod.store.model.StoreBrandInfo;
+import com.uas.platform.b2c.prod.store.model.StoreIn;
+import com.uas.platform.b2c.prod.store.model.StoreInfoAndProdExport;
+import com.uas.platform.b2c.prod.store.model.StoreType;
 import com.uas.platform.b2c.prod.store.service.StoreApplyService;
 import com.uas.platform.b2c.prod.store.service.StoreInService;
 import com.uas.platform.b2c.trade.support.CodeType;
@@ -16,12 +24,11 @@ import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.exception.IllegalStatusException;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.persistence.criteria.CriterionExpression;
+import com.uas.platform.core.persistence.criteria.LogicalExpression;
 import com.uas.platform.core.persistence.criteria.SimpleExpression;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.core.convert.converter.Converter;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
-import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -227,8 +234,16 @@ public class StoreApplyServiceImpl implements StoreApplyService {
 	@Override
 	public Page<StoreApply> pageStoreApplications(final PageInfo pageInfo, StoreApply.ApplyStatus status, StoreType type, String keyword) {
 		if (status != null) {
-			SimpleExpression expression = new SimpleExpression("status", status, CriterionExpression.Operator.EQ);
-			pageInfo.expression(expression);
+			if (StoreApply.ApplyStatus.PREPARE.equals(status)) {
+				SimpleExpression exCheck = new SimpleExpression("status", StoreApply.ApplyStatus.CHECK, CriterionExpression.Operator.EQ);
+				SimpleExpression exPrepare = new SimpleExpression("status", status, CriterionExpression.Operator.EQ);
+				SimpleExpression[] expressions = {exCheck, exPrepare};
+				LogicalExpression logical = new LogicalExpression(expressions, CriterionExpression.Operator.OR);
+				pageInfo.expression(logical);
+			} else {
+				SimpleExpression expression = new SimpleExpression("status", status, CriterionExpression.Operator.EQ);
+				pageInfo.expression(expression);
+			}
 		}
 		if (type != null) {
 			SimpleExpression expression = new SimpleExpression("type", type, CriterionExpression.Operator.EQ);
@@ -247,10 +262,19 @@ public class StoreApplyServiceImpl implements StoreApplyService {
 		}, pageInfo);
 	}
 
-	public Page<StoreApply> pageStoreApplicationsByAuthor(final PageInfo pageInfo, StoreApply.ApplyStatus status, StoreType type, String keyword) {
+	@Override
+    public Page<StoreApply> pageStoreApplicationsByAuthor(final PageInfo pageInfo, StoreApply.ApplyStatus status, StoreType type, String keyword) {
 		if (status != null) {
-			SimpleExpression expression = new SimpleExpression("status", status, CriterionExpression.Operator.EQ);
-			pageInfo.expression(expression);
+			if (StoreApply.ApplyStatus.PREPARE.equals(status)) {
+				SimpleExpression exCheck = new SimpleExpression("status", StoreApply.ApplyStatus.CHECK, CriterionExpression.Operator.EQ);
+				SimpleExpression exPrepare = new SimpleExpression("status", status, CriterionExpression.Operator.EQ);
+				SimpleExpression[] expressions = {exCheck, exPrepare};
+				LogicalExpression logical = new LogicalExpression(expressions, CriterionExpression.Operator.OR);
+				pageInfo.expression(logical);
+			} else {
+				SimpleExpression expression = new SimpleExpression("status", status, CriterionExpression.Operator.EQ);
+				pageInfo.expression(expression);
+			}
 		}
 		if (type != null) {
 			SimpleExpression expression = new SimpleExpression("type", type, CriterionExpression.Operator.EQ);
@@ -282,23 +306,9 @@ public class StoreApplyServiceImpl implements StoreApplyService {
 			if (prepareApply != null && passApply != null) {
 				return new ResultMap(CodeType.NOT_PERMIT, "已审核和待审核的开铺申请同时存在");
 			} else if (prepareApply != null) {
-                Enterprise enterprise = enterpriseDao.findByUu(prepareApply.getEnterprise().getUu());
-                EnterpriseSimple enterpriseSimple = prepareApply.getEnterprise();
-                enterpriseSimple.setEnName(enterprise.getEnName());
-                enterpriseSimple.setEnShortname(enterprise.getEnShortname());
-                enterpriseSimple.setAddress(enterprise.getEnAddress());
-                enterpriseSimple.setEnUrl(enterprise.getEnUrl());
-                prepareApply.setEnterprise(enterpriseSimple);
-				return ResultMap.success(prepareApply);
-			} else if (passApply != null){
-                Enterprise enterprise = enterpriseDao.findByUu(passApply.getEnterprise().getUu());
-                EnterpriseSimple enterpriseSimple = passApply.getEnterprise();
-                enterpriseSimple.setEnName(enterprise.getEnName());
-                enterpriseSimple.setEnShortname(enterprise.getEnShortname());
-                enterpriseSimple.setAddress(enterprise.getEnAddress());
-                enterpriseSimple.setEnUrl(enterprise.getEnUrl());
-                passApply.setEnterprise(enterpriseSimple);
-				return ResultMap.success(passApply);
+				return ResultMap.success(covert(prepareApply));
+			} else if (passApply != null) {
+				return ResultMap.success(covert(passApply));
 			} else {
 				return ResultMap.success(null);
 			}
@@ -308,48 +318,65 @@ public class StoreApplyServiceImpl implements StoreApplyService {
 		}
 	}
 
-	@Override
+    /**
+     * 店铺赋值方法提取出来
+     *
+     * @param storeApply 店铺信息
+     * @return StoreApply
+     */
+    private StoreApply covert(StoreApply storeApply) {
+        Enterprise enterprise = enterpriseDao.findByUu(storeApply.getEnterprise().getUu());
+        EnterpriseSimple enterpriseSimple = storeApply.getEnterprise();
+        enterpriseSimple.setEnName(enterprise.getEnName());
+        enterpriseSimple.setEnShortname(enterprise.getEnShortname());
+        enterpriseSimple.setAddress(enterprise.getEnAddress());
+        enterpriseSimple.setEnUrl(enterprise.getEnUrl());
+        storeApply.setEnterprise(enterpriseSimple);
+        return storeApply;
+    }
+
+    @Override
 	public com.uas.sso.support.Page<StoreInfoAndProdExport> getStoreInfoAndProdCount(Pageable pageable, Date startTime, Date endTime) {
 		if (pageable == null) {
-			return null;
-		}
-		StringBuilder sql = new StringBuilder("select a.apply_create_time applyTime, a.apply_store_name storeName, "
-				+ "a.apply_store_enuu enuu,a.apply_auth_time agreeTime, a.apply_auth_person_name agreeName, " +
-				"ifnull(p.count, 0) count from `store$apply` a left join (select pr_enuu, count(1) count from products" +
-				" group by pr_enuu) p on p.pr_enuu = a.apply_store_enuu where a.apply_status='PASS' ");
-		if (!StringUtils.isEmpty(startTime)) {
-			sql.append(" and date(a.apply_create_time) >= '" + new java.sql.Date(startTime.getTime()) + "'");
-		}
-		if (!StringUtils.isEmpty(endTime)) {
-			sql.append(" and date(a.apply_create_time) <= '" + new java.sql.Date(endTime.getTime()) + "' ");
-		}
-		sql.append(" order by a.apply_create_time limit " + (pageable.getPageNumber() - 1) * pageable.getPageSize() + ","
-				+ pageable.getPageSize());
-		StringBuilder totalSql = new StringBuilder("select count(1) from `store$apply` a where a.apply_status='PASS' ");
+			return new com.uas.sso.support.Page<>();
+		}
+		// 统计数据
+		StringBuilder dataSql = new StringBuilder("select a.apply_create_time applyTime, a.apply_store_name storeName, "
+                + "a.apply_store_enuu enuu,a.apply_auth_time agreeTime, a.apply_auth_person_name agreeName, "
+                + "ifnull(p.count, 0) count ");
+		// 统计总数
+		StringBuilder countSql = new StringBuilder("select count(1) ");
+		StringBuilder sql = new StringBuilder("from `store$apply` a left join (select pr_enuu, count(1) count from products where 1=1 ");
+		// 时间过滤
 		if (!StringUtils.isEmpty(startTime)) {
-			totalSql.append(" and date(a.apply_create_time) >= '" + new java.sql.Date(startTime.getTime()) + "'");
+			sql.append(" and pr_create_time >= '" + new java.sql.Date(startTime.getTime()) + "'");
 		}
 		if (!StringUtils.isEmpty(endTime)) {
-			totalSql.append(" and date(a.apply_create_time) <= '" + new java.sql.Date(endTime.getTime()) + "' ");
-		}
-		Integer total = commonDao.queryForObject(totalSql.toString(), Integer.class);
-		List<StoreInfoAndProdExport> exports = commonDao.query(sql.toString(), StoreInfoAndProdExport.class);
+			sql.append(" and pr_create_time < '" + new java.sql.Date(endTime.getTime() + IntegerConstant.ONE_DAY_MILLISECONDS) + "' ");
+		}
+		sql.append(" group by pr_enuu) p on p.pr_enuu = a.apply_store_enuu where a.apply_status='PASS' and count > 0 ");
+		// 数据查询增加分页筛选
+		dataSql.append(sql).append("order by a.apply_create_time limit " + (pageable.getPageNumber() - 1) * pageable.getPageSize() + ","
+                + pageable.getPageSize());
+		countSql.append(sql);
+		Integer total = commonDao.queryForObject(countSql.toString(), Integer.class);
+		List<StoreInfoAndProdExport> exports = commonDao.query(dataSql.toString(), StoreInfoAndProdExport.class);
 		return new com.uas.sso.support.Page<>(pageable.getPageNumber(), pageable.getPageSize(), exports, total);
 	}
 
 	@Override
 	public List<StoreInfoAndProdExport> storeInfoAndProdCountExport(Date startTime, Date endTime) {
 		StringBuilder sql = new StringBuilder("select a.apply_create_time applyTime, a.apply_store_name storeName, "
-				+ "a.apply_store_enuu enuu,a.apply_auth_time agreeTime, a.apply_auth_person_name agreeName, " +
-				"ifnull(p.count, 0) count from `store$apply` a left join (select pr_enuu, count(1) count from products" +
-				" group by pr_enuu) p on p.pr_enuu = a.apply_store_enuu where a.apply_status='PASS' ");
+				+ "a.apply_store_enuu enuu,a.apply_auth_time agreeTime, a.apply_auth_person_name agreeName, "
+				+ "ifnull(p.count, 0) count from `store$apply` a left join (select pr_enuu, count(1) count from products where 1=1 ");
 		if (!StringUtils.isEmpty(startTime)) {
-			sql.append(" and date(a.apply_create_time) >= '" + new java.sql.Date(startTime.getTime()) + "'");
+			sql.append(" and pr_create_time >= '" + new java.sql.Date(startTime.getTime()) + "'");
 		}
 		if (!StringUtils.isEmpty(endTime)) {
-			sql.append(" and date(a.apply_create_time) <= '" + new java.sql.Date(endTime.getTime()) + "' ");
+			sql.append(" and pr_create_time < '" + new java.sql.Date(endTime.getTime() + IntegerConstant.ONE_DAY_MILLISECONDS) + "' ");
 		}
-		sql.append(" order by a.apply_create_time");
+		sql.append(" group by pr_enuu) p on p.pr_enuu = a.apply_store_enuu where a.apply_status='PASS' and count > 0 "
+				+ "order by a.apply_create_time  ");
 		return commonDao.query(sql.toString(), StoreInfoAndProdExport.class);
 	}
 }

+ 1 - 1
src/main/java/com/uas/platform/b2c/trade/deprecated/service/impl/SuDemandServiceImpl.java

@@ -35,6 +35,6 @@ public class SuDemandServiceImpl implements SuDemandService {
 	 */
 	@Override
 	public SuDemand getSuDemand(Long id) {
-		return suDemandDao.getOne(id);
+		return suDemandDao.findOne(id);
 	}
 }

+ 14 - 0
src/main/java/com/uas/platform/b2c/trade/order/dao/TableTestDao.java

@@ -0,0 +1,14 @@
+package com.uas.platform.b2c.trade.order.dao;
+
+import com.uas.platform.b2c.trade.order.model.TableTest;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @author yuj
+ * @date 2018/10/25 11:37
+ */
+@Repository
+public interface TableTestDao extends JpaRepository<TableTest, Long>, JpaSpecificationExecutor<TableTest> {
+}

+ 36 - 0
src/main/java/com/uas/platform/b2c/trade/order/model/TableTest.java

@@ -0,0 +1,36 @@
+package com.uas.platform.b2c.trade.order.model;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * @author yuj
+ * @date 2018/10/25 11:38
+ */
+@Entity
+@Table(name = "table_test")
+public class TableTest implements Serializable {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    @Column(name = "code")
+    private String code;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+}

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

@@ -466,7 +466,7 @@ public class OrderServiceImpl implements OrderService {
             throw new IllegalOperatorException("传输数据失败,请重新操作!");
         }
         if (billId != null && (billId.longValue() != billNoNeed)) {
-            billInfo = billInfoDao.getOne(billId);
+            billInfo = billInfoDao.findOne(billId);
         }
         if ((billInfo != null) && (billInfo.getKind().intValue() != order.getInvoicetype().intValue())) {
             throw new IllegalOperatorException("选中的发票类型不存在");
@@ -1354,7 +1354,7 @@ public class OrderServiceImpl implements OrderService {
 	@Override
     @Transactional
     public Order setShipped(Long puid) {
-        Purchase pur = purchaseDao.getOne(puid);
+        Purchase pur = purchaseDao.findOne(puid);
         if (pur == null) {
             throw new IllegalOperatorException("数据传输错误");
         }
@@ -1735,7 +1735,7 @@ public class OrderServiceImpl implements OrderService {
 
     @Override
     public BankTransfer getBankInfo(Long id) {
-        BankTransfer bankTransfer = bankTransferDao.getOne(id);
+        BankTransfer bankTransfer = bankTransferDao.findOne(id);
         return bankTransfer;
     }
 

+ 35 - 2
src/main/java/com/uas/platform/b2c/trade/order/service/impl/PurchaseProductServiceImpl.java

@@ -1,8 +1,10 @@
 package com.uas.platform.b2c.trade.order.service.impl;
 
+import com.uas.platform.b2c.core.constant.IntegerConstant;
 import com.uas.platform.b2c.core.constant.ReleaseStatus;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.utils.StringUtilB2C;
+import com.uas.platform.b2c.prod.commodity.constant.DoubleConstant;
 import com.uas.platform.b2c.prod.commodity.constant.ErrorInfoConstant;
 import com.uas.platform.b2c.prod.commodity.constant.UploadConstant;
 import com.uas.platform.b2c.prod.commodity.dao.ProductPrivateDao;
@@ -196,6 +198,12 @@ public class PurchaseProductServiceImpl implements PurchaseProductService {
         aProduct.setPublisherName(SystemSession.getUser().getUserName());
         aProduct.setPublisherTel(SystemSession.getUser().getUserTel());
         aProduct.setPublisherUu(SystemSession.getUser().getUserUU());
+        if (null == aProduct.getReserve()) {
+            aProduct.setReserve(DoubleConstant.zero);
+        }
+        if (null == aProduct.getPackaging()) {
+            aProduct.setPackaging("其他");
+        }
     }
 
     /**
@@ -209,11 +217,13 @@ public class PurchaseProductServiceImpl implements PurchaseProductService {
         // 统计为空的个数
         int result = 0;
         aProduct.setNum(rowNum - 2);
+        StringBuilder errMsg = new StringBuilder();
         // 品牌
         Object brandValue = releaseProductByBatchService.readWorkBookCell(row.getCell(UploadConstant.BRAND_ENGLISH), Cell.CELL_TYPE_STRING,
                 rowNum, UploadConstant.BRAND_ENGLISH);
         if (StringUtils.isEmpty(brandValue)) {
             result += 1;
+            errMsg.append(ErrorInfoConstant.BRAND_EMPTY_INFO.getInfo());
         }
         aProduct.setBrandEnByExcel(brandValue);
 
@@ -222,6 +232,10 @@ public class PurchaseProductServiceImpl implements PurchaseProductService {
                 rowNum, UploadConstant.KIND);
         if (StringUtils.isEmpty(kindValue)) {
             result += 1;
+            if (errMsg.length() > 0) {
+                errMsg.append(",");
+            }
+            errMsg.append(ErrorInfoConstant.KIND_EMPTY_INFO.getInfo());
         }
         aProduct.setKindByExcel(kindValue);
 
@@ -230,6 +244,10 @@ public class PurchaseProductServiceImpl implements PurchaseProductService {
                 rowNum, UploadConstant.PRODUCT_CODE);
         if (StringUtils.isEmpty(codeValue)) {
             result += 1;
+            if (errMsg.length() > 0) {
+                errMsg.append(",");
+            }
+            errMsg.append(ErrorInfoConstant.CODE_EMPTY_INFO.getInfo());
         }
         aProduct.setCodeByExcel(codeValue);
 
@@ -237,6 +255,12 @@ public class PurchaseProductServiceImpl implements PurchaseProductService {
         Object specValue = releaseProductByBatchService.readWorkBookCell(row.getCell(UploadConstant.SPEC), Cell.CELL_TYPE_STRING,
                 rowNum, UploadConstant.SPEC);
         aProduct.setSpecByExcel(specValue);
+
+        if (errMsg.length() > 0) {
+            aProduct.setErrmsg(errMsg.toString());
+            aProduct.setReleaseCode(ReleaseStatus.lack_info.value());
+            aProduct.setReleaseStatus(ReleaseStatus.lack_info.getPhrase());
+        }
         return result;
     }
 
@@ -336,8 +360,17 @@ public class PurchaseProductServiceImpl implements PurchaseProductService {
         List<com.uas.platform.b2c.prod.commodity.model.Product> productList = productService.findProductIdAndProdnumsByProdNums(productCodeList);
         List<ProductPrivate> privateList = new ArrayList<>();
         productList.forEach(product -> {
-            ProductPrivate productPrivate = new ProductPrivate(product.getId());
-            productPrivate.setAttach(product.getAttachment());
+            ProductPrivate productPrivate;
+            List<ProductPrivate> privates = productPrivateDao.findByPrId(product.getId());
+            if (CollectionUtils.isNotEmpty(privates)) {
+                productPrivate = privates.get(0);
+                productPrivate.setB2cEnabled(IntegerConstant.YES_SHORT);
+                productPrivate.setPrId(product.getId());
+                productPrivate.setBatchCount(IntegerConstant.NO_SHORT);
+            } else {
+                productPrivate = new ProductPrivate(product.getId());
+                productPrivate.setAttach(product.getAttachment());
+            }
             privateList.add(productPrivate);
             idSet.add(product.getId());
         });

+ 2 - 1
src/main/java/com/uas/platform/b2c/trade/order/task/OrderTask.java

@@ -182,7 +182,7 @@ public class OrderTask {
      * 已收货的订单超过一定时间,自动转成完成状态。
      */
     public void orderAutoComplete() {
-        logger.info("已收货的订单超过一定时间,自动转成完成状态时间 :" + new Date());
+        logger.info("已收货的订单超过一定时间,自动转成完成状态时间 " + new Date());
         try {
             List<Order> orderList = orderService.getToBeAutoCompleteOrder();
             if (CollectionUtils.isEmpty(orderList)) {
@@ -212,6 +212,7 @@ public class OrderTask {
                 }
             }
             orderService.save(orderList);
+            logger.info("已收货的订单超过一定时间,自动转成完成状态时间 操作个数:" + orderList.size() + "时间" + new Date());
         } catch (Exception e) {
             Map<String, Object> map  = new HashedMap();
             map.put("title", "已收货的订单超过一定时间,自动转成完成状态时间");

+ 4 - 5
src/main/java/com/uas/platform/b2c/trade/rate/task/RateTask.java

@@ -79,10 +79,9 @@ public class RateTask {
      */
     @Transactional
     public void autoRate() {
-
             User user = null;
             List<User> userUUs = userDao.findUserByUserUU(sysConf.getAdminUU());
-            if(CollectionUtils.isEmpty(userUUs)) {
+            if (CollectionUtils.isEmpty(userUUs)) {
                 throw new IllegalOperatorException("根据配置文件的adminUU 找不到对应的个人信息");
             }
             user = userUUs.get(0);
@@ -90,7 +89,7 @@ public class RateTask {
             user.setEnterprise(enterprise);
             SystemSession.setUser(user);
             String infoByType = tradeBasicPropertiesDao.findInfoByType(Type.B2C_AUTO_RECEVIED_TIME.value());
-            if(StringUtils.isEmpty(infoByType)) {
+            if (StringUtils.isEmpty(infoByType)) {
                 throw new IllegalOperatorException("买家自动初评时间为空,不能继续操作");
             }
             Integer automaticReceipt = null;
@@ -142,7 +141,7 @@ public class RateTask {
         try {
             User user = null;
             List<User> userUUs = userDao.findUserByUserUU(sysConf.getAdminUU());
-            if(CollectionUtils.isEmpty(userUUs)) {
+            if (CollectionUtils.isEmpty(userUUs)) {
                 throw new IllegalOperatorException("根据配置文件的adminUU 找不到对应的个人信息");
             }
             user = userUUs.get(0);
@@ -150,7 +149,7 @@ public class RateTask {
             user.setEnterprise(enterprise);
             SystemSession.setUser(user);
             String infoByType = tradeBasicPropertiesDao.findInfoByType(Type.B2C_AUTO_RECEVIED_TIME.value());
-            if(StringUtils.isEmpty(infoByType)) {
+            if (StringUtils.isEmpty(infoByType)) {
                 throw new IllegalOperatorException("买家自动追评时间为空,不能继续操作");
             }
             Integer automaticReceipt = null;

+ 1 - 1
src/main/java/com/uas/platform/b2c/trade/seek/service/impl/SeekPurchaseOfferServiceImpl.java

@@ -70,7 +70,7 @@ public class SeekPurchaseOfferServiceImpl implements SeekPurchaseOfferService {
         }
 
         // 不允许报价自己的求购
-        SeekPurchase seekPurchase = seekPurchaseDao.getOne(seekPurchaseOffer.getSpId());
+        SeekPurchase seekPurchase = seekPurchaseDao.findOne(seekPurchaseOffer.getSpId());
         if (seekPurchase.getEnUu().equals(user.getEnterprise().getUu())) {
             return new ResultMap(CodeType.NOT_PERMIT, "请不要报价自己的求购...");
         }

+ 2 - 3
src/main/java/com/uas/platform/b2c/trade/seek/utils/DateUtils.java

@@ -1,6 +1,5 @@
 package com.uas.platform.b2c.trade.seek.utils;
 
-import java.text.SimpleDateFormat;
 import java.util.Date;
 
 /**
@@ -25,8 +24,8 @@ public class DateUtils {
      * @param day
      * @return
      */
-    public static Date addTime(Date date, Integer day, Integer hour, Integer minute,Integer second){
-        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+    public static Date addTime(Date date, Integer day, Integer hour, Integer minute, Integer second) {
         return new Date(date.getTime() + day * 24 * 60 * 60 * 1000 + hour * 60 * 60 * 1000 + minute * 60 * 1000 + second * 1000);
     }
+
 }

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

@@ -131,6 +131,11 @@ public class VendorIntroductionServiceImpl implements VendorIntroductionService
      */
     private static final Integer THIRD_PRODUCT_AMOUNT_SCORE = 5;
 
+	/**
+	 * sql执行条数
+	 */
+	private static final Integer SQL_COMMIT_AMOUNT = 500;
+
     /* =========================================企业分数计算end==================================================== */
 
 	/**
@@ -263,9 +268,13 @@ public class VendorIntroductionServiceImpl implements VendorIntroductionService
 	public void calculateEnterpriseScore() {
 		long start = System.currentTimeMillis();
 		List<Enterprise> enterprises = enterpriseDao.findAll();
+		logger.info("查找全部企业信息,条数:{},耗时:{}", enterprises.size(), (System.currentTimeMillis() - start));
+		start = System.currentTimeMillis();
 		if (!CollectionUtils.isEmpty(enterprises)) {
 			// 商家信息 企业介绍 联系方式
 			StringBuilder infoSqls = new StringBuilder();
+
+			int enSum = 0;
 			for (Enterprise enterprise : enterprises) {
 			    // 初始化分数 所有企业
 				int info = 0;
@@ -277,32 +286,69 @@ public class VendorIntroductionServiceImpl implements VendorIntroductionService
 				}
                 infoSqls.append("update sec$enterprises set en_score = ").append(info).append(" where en_uu = ")
                         .append(enterprise.getUu()).append(";");
+				enSum++;
+
+				// 到达执行条数时就执行一次,避免sql语句太长,执行超时
+				if (enSum == SQL_COMMIT_AMOUNT) {
+					commonDao.getJdbcTemplate().execute(infoSqls.toString());
+					logger.info("商家信息分数更新,条数:{},耗时:{}", enSum, (System.currentTimeMillis() - start));
+					start = System.currentTimeMillis();
+
+					// 重置语句和计数
+					infoSqls = new StringBuilder();
+					enSum = 0;
+				}
+			}
+
+			// 更新余下的企业分数
+			if (!StringUtils.isEmpty(infoSqls)) {
+				commonDao.getJdbcTemplate().execute(infoSqls.toString());
+				logger.info("商家信息分数更新,条数:{},耗时:{}", enSum, (System.currentTimeMillis() - start));
+				start = System.currentTimeMillis();
 			}
-			commonDao.getJdbcTemplate().execute(infoSqls.toString());
-			logger.info("商家信息分数更新,条数:{},耗时:{}", enterprises.size(), (System.currentTimeMillis() - start));
-			start = System.currentTimeMillis();
 		}
 
 		// 主营产品
 		List<Long> storeUUs = commonDao.queryForList("select st_enuu from store$info where st_description is not null", Long.class);
 		if (!CollectionUtils.isEmpty(storeUUs)) {
+			// 店铺更新计数
+			int storeSum = 0;
+
 			// 主营产品更新执行语句
 			StringBuilder storeUpdateSqls = new StringBuilder();
 			for (Long storeUU : storeUUs) {
 			    // 添加主营产品分数增加语句
 				storeUpdateSqls.append("update sec$enterprises set en_score = convert((en_score + ").append(MAIN_PRODUCT_SCORE)
                         .append("),DECIMAL(20,6)) where en_uu = ").append(storeUU).append(";");
+				storeSum++;
+				// 每满一次,提交一次,避免语句过长
+				if (storeSum == SQL_COMMIT_AMOUNT) {
+					commonDao.getJdbcTemplate().execute(storeUpdateSqls.toString());
+					logger.info("主营产品分数更新,条数:{},耗时:{}", storeSum, (System.currentTimeMillis() - start));
+					start = System.currentTimeMillis();
+
+					// 重置
+					storeSum = 0;
+					storeUpdateSqls = new StringBuilder();
+				}
+			}
+
+			// 更新余下的
+			if (!StringUtils.isEmpty(storeUpdateSqls)) {
+				commonDao.getJdbcTemplate().execute(storeUpdateSqls.toString());
+				logger.info("主营产品分数更新,条数:{},耗时:{}", storeSum, (System.currentTimeMillis() - start));
+				start = System.currentTimeMillis();
 			}
-			commonDao.getJdbcTemplate().execute(storeUpdateSqls.toString());
-			logger.info("主营产品分数更新,条数:{},耗时:{}", storeUUs.size(), (System.currentTimeMillis() - start));
-			start = System.currentTimeMillis();
 		}
 
 		// 产品数量
         List<ProductAmount> productAmounts = commonDao.query("select * from (select pr_enuu as enUU,count(1) as amount from products group by pr_enuu) a where a.amount > 10", ProductAmount.class);
         if (!CollectionUtils.isEmpty(productAmounts)) {
-            StringBuilder productAmountUpdateSqls = new StringBuilder();
-            for (ProductAmount productAmount : productAmounts) {
+			// 产品数量企业 计数
+			int productSum = 0;
+			StringBuilder productAmountUpdateSqls = new StringBuilder();
+			for (ProductAmount productAmount : productAmounts) {
+
                 if (productAmount.getAmount() > FIRST_PRODUCT_AMOUNT_BASE) {
                     // 产品数量分数更新执行语句
                     productAmountUpdateSqls.append("update sec$enterprises set en_score = convert((en_score + ").append(FIRST_PRODUCT_AMOUNT_SCORE)
@@ -314,11 +360,27 @@ public class VendorIntroductionServiceImpl implements VendorIntroductionService
                     productAmountUpdateSqls.append("update sec$enterprises set en_score = convert((en_score + ").append(THIRD_PRODUCT_AMOUNT_SCORE)
                             .append("),DECIMAL(20,6)) where en_uu = ").append(productAmount.getEnUU()).append(";");
                 }
+                productSum++;
+
+                // 到达限制就提交
+                if (productSum == SQL_COMMIT_AMOUNT) {
+					commonDao.getJdbcTemplate().execute(productAmountUpdateSqls.toString());
+					logger.info("产品数量分数更新,条数:{},耗时:{}", productSum, (System.currentTimeMillis() - start));
+					start = System.currentTimeMillis();
+
+					// 重置
+					productSum = 0;
+					productAmountUpdateSqls = new StringBuilder();
+				}
 
             }
-            commonDao.getJdbcTemplate().execute(productAmountUpdateSqls.toString());
-            logger.info("产品数量分数更新,条数:{},耗时:{}", productAmounts.size(), (System.currentTimeMillis() - start));
-            start = System.currentTimeMillis();
+
+            // 剩余更新
+			if (!StringUtils.isEmpty(productAmountUpdateSqls)) {
+				commonDao.getJdbcTemplate().execute(productAmountUpdateSqls.toString());
+				logger.info("产品数量分数更新,条数:{},耗时:{}", productSum, (System.currentTimeMillis() - start));
+				start = System.currentTimeMillis();
+			}
         }
 
 		// 有价数量
@@ -326,6 +388,8 @@ public class VendorIntroductionServiceImpl implements VendorIntroductionService
 		List<BigInteger> priceUUs = enterpriseDao.findEnRankByPriceProductAmount();
 		Double i = 1d;
 		if (!CollectionUtils.isEmpty(priceUUs)) {
+			// 有价数量企业 计数
+			int priceSum = 0;
 			// 价格排行更新执行语句
 			StringBuilder priceUpdateSqls = new StringBuilder();
 			for (BigInteger priceUU : priceUUs) {
@@ -337,16 +401,31 @@ public class VendorIntroductionServiceImpl implements VendorIntroductionService
 					break;
 				}
 				i++;
+
+				priceSum++;
+				if (priceSum == SQL_COMMIT_AMOUNT) {
+					commonDao.getJdbcTemplate().execute(priceUpdateSqls.toString());
+					logger.info("有价数量分数更新,条数:{},耗时:{}", priceSum, (System.currentTimeMillis() - start));
+					start = System.currentTimeMillis();
+
+					// 重置
+					priceSum = 0;
+					priceUpdateSqls = new StringBuilder();
+				}
+			}
+			if (!StringUtils.isEmpty(priceUpdateSqls)) {
+				commonDao.getJdbcTemplate().execute(priceUpdateSqls.toString());
+				logger.info("有价数量分数更新,条数:{},耗时:{}", priceSum, (System.currentTimeMillis() - start));
+				start = System.currentTimeMillis();
 			}
-			commonDao.getJdbcTemplate().execute(priceUpdateSqls.toString());
-			logger.info("有价数量分数更新,条数:{},耗时:{}", priceUUs.size(), (System.currentTimeMillis() - start));
-			start = System.currentTimeMillis();
 		}
 
 		// 有库存数量
 		// 有库存数量排序
 		List<BigInteger> reserveUUs = enterpriseDao.findEnRankByReserveProductAmount();
 		if (!CollectionUtils.isEmpty(reserveUUs)) {
+			// 有库存计数
+			int reserveSum = 0;
 			// 价格排行更新执行语句
 			StringBuilder reserveUpdateSqls = new StringBuilder();
 			i = 1d;
@@ -359,10 +438,23 @@ public class VendorIntroductionServiceImpl implements VendorIntroductionService
 					break;
 				}
 				i++;
+
+				reserveSum++;
+				if (reserveSum == SQL_COMMIT_AMOUNT) {
+					commonDao.getJdbcTemplate().execute(reserveUpdateSqls.toString());
+					logger.info("有库存数量分数更新,条数:{},耗时:{}", reserveSum, (System.currentTimeMillis() - start));
+					start = System.currentTimeMillis();
+
+					// 重置
+					reserveSum = 0;
+					reserveUpdateSqls = new StringBuilder();
+				}
+			}
+			if (!StringUtils.isEmpty(reserveUpdateSqls)) {
+				commonDao.getJdbcTemplate().execute(reserveUpdateSqls.toString());
+				logger.info("有库存数量分数更新,条数:{},耗时:{}", reserveSum, (System.currentTimeMillis() - start));
+				start = System.currentTimeMillis();
 			}
-			commonDao.getJdbcTemplate().execute(reserveUpdateSqls.toString());
-			logger.info("有库存数量分数更新,条数:{},耗时:{}", reserveUUs.size(), (System.currentTimeMillis() - start));
-			start = System.currentTimeMillis();
 		}
 
 		// 回价数量
@@ -371,6 +463,8 @@ public class VendorIntroductionServiceImpl implements VendorIntroductionService
 		// 价格排行更新执行语句
 		StringBuilder replyUpdateSqls = new StringBuilder();
 		if (!CollectionUtils.isEmpty(replyUUs)) {
+			int replySum = 0;
+
 			i = 1d;
 			for (Long replyUU : replyUUs) {
 				Double score = new BigDecimal(INQUIRY_REPLU_BASE_SCORE / i).setScale(6, BigDecimal.ROUND_HALF_UP).doubleValue();
@@ -381,10 +475,23 @@ public class VendorIntroductionServiceImpl implements VendorIntroductionService
 					break;
 				}
 				i++;
+
+				replySum++;
+				if (replySum == SQL_COMMIT_AMOUNT) {
+					commonDao.getJdbcTemplate().execute(replyUpdateSqls.toString());
+					logger.info("回价数量分数更新,条数:{},耗时:{}", replySum, (System.currentTimeMillis() - start));
+					start = System.currentTimeMillis();
+
+					// 重置
+					replySum = 0;
+					replyUpdateSqls = new StringBuilder();
+				}
+			}
+			if (!StringUtils.isEmpty(replyUpdateSqls)) {
+				commonDao.getJdbcTemplate().execute(replyUpdateSqls.toString());
+				logger.info("回价数量分数更新,条数:{},耗时:{}", replySum, (System.currentTimeMillis() - start));
+				start = System.currentTimeMillis();
 			}
-			commonDao.getJdbcTemplate().execute(replyUpdateSqls.toString());
-			logger.info("回价数量分数更新,条数:{},耗时:{}", replyUUs.size(), (System.currentTimeMillis() - start));
-			start = System.currentTimeMillis();
 		}
 
 		// 交易额
@@ -393,6 +500,9 @@ public class VendorIntroductionServiceImpl implements VendorIntroductionService
 		// 价格排行更新执行语句
 		StringBuilder purchaseUpdateSqls = new StringBuilder();
 		if (!CollectionUtils.isEmpty(purchaseUUs)) {
+			// 交易额 企业 计数
+			int purchaseSum = 0;
+
 			i = 1d;
 			for (BigInteger purchaseUU : purchaseUUs) {
 				Double score = new BigDecimal(PURCHASE_AMOUNT_BASE_SCORE / i).setScale(6, BigDecimal.ROUND_HALF_UP).doubleValue();
@@ -403,10 +513,23 @@ public class VendorIntroductionServiceImpl implements VendorIntroductionService
 					break;
 				}
 				i++;
+
+				purchaseSum++;
+				if (purchaseSum == SQL_COMMIT_AMOUNT) {
+					commonDao.getJdbcTemplate().execute(purchaseUpdateSqls.toString());
+					logger.info("交易额数量分数更新,条数:{},耗时:{}", purchaseSum, (System.currentTimeMillis() - start));
+					start = System.currentTimeMillis();
+
+					// 重置
+					purchaseSum = 0;
+					purchaseUpdateSqls = new StringBuilder();
+				}
+			}
+			if (!StringUtils.isEmpty(purchaseUpdateSqls)) {
+				commonDao.getJdbcTemplate().execute(purchaseUpdateSqls.toString());
+				logger.info("交易额数量分数更新,条数:{},耗时:{}", purchaseSum, (System.currentTimeMillis() - start));
+				start = System.currentTimeMillis();
 			}
-			commonDao.getJdbcTemplate().execute(purchaseUpdateSqls.toString());
-			logger.info("交易额数量分数更新,条数:{},耗时:{}", purchaseUUs.size(), (System.currentTimeMillis() - start));
-			start = System.currentTimeMillis();
 		}
 
 		// 更新店铺中的分数(原厂、经销排行)
@@ -440,6 +563,7 @@ public class VendorIntroductionServiceImpl implements VendorIntroductionService
 		String rownumSql = ") s order by isStore desc,score desc limit " + (page - 1) * size + "," + size ;
 		vendorIntroductionUusSql.append("select s.*, if( st_uuid is not null and st_status = 'OPENED', 1, null) isStore from (")
                 .append(enterpriseSql).append(rownumSql);
+		System.out.println(vendorIntroductionUusSql.toString());
 		return commonDao.query(vendorIntroductionUusSql.toString(), VendorIntroduction.class);
 	}
 

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


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


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


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


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


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


+ 1 - 1
src/main/resources/logback.xml

@@ -5,7 +5,7 @@
     <!-- 文件输出指定项目日志 -->
     <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${CATALINA_HOME}/logs/b2c%d{yyyy-MM-dd}.log</fileNamePattern>
+            <fileNamePattern>${CATALINA_HOME}/logs/b2c_%d{yyyy-MM-dd}.log</fileNamePattern>
             <maxHistory>30</maxHistory>
         </rollingPolicy>
 

+ 3 - 3
src/main/resources/pre/sys.properties

@@ -37,19 +37,19 @@ recommendPort=20100
 # upload file
 uploadFileUrl=http://dfs-api.ubtob.com
 # search file
-searchUrl=http://172.21.0.49:8081
+searchUrl=http://192.168.78.12:8081
 
 # message ip
 messageServiceIp=http://message.ubtob.com/
 # product public ip
-productServiceIp=http://172.21.0.47:8080
+productServiceIp=http://192.168.78.11:8080
 
 # Kafka
 kafka-bootstrap-servers=10.10.100.11:9292,10.10.100.12:9292,10.10.100.13:9292,10.10.100.14:9292,10.10.100.15:9292,10.10.100.16:9292
 
 #inquiry service url
 inquiryServiceUrl=https://api-inquiry.usoftchina.com
-inquiryServiceInnerUrl=http://172.21.0.48:8080
+inquiryServiceInnerUrl=http://192.168.78.9:8080
 
 #public message  service url
 messageServiceUrl=http://api-message.ubtob.com/

+ 4 - 5
src/main/webapp/WEB-INF/views/normal/adminWithNav.html

@@ -29,9 +29,6 @@
 	<!-- main menu start -->
 	<div class="sidebar-nav main-menu">
 		<ul class="nav nav-tabs nav-stacked">
-			<li class="nav-header">B2B</li>
-			<li class="nav-node"><a href="#/b2b/manage"><i
-					class="fa fa-home"></i><span> b2b后台管理</span></a></li>
 
 			<li class="nav-header">数据管理</li>
 			<li class="nav-node"><a href="#/statsData"><i
@@ -103,6 +100,10 @@
 					<!--class="fa fa-home"></i><span> 平台换货出货单管理</span></a></li>-->
 
 			<li class="nav-header">产品管理</li>
+			<li class="nav-node"><a href="#/saleManage"><i
+					class="fa fa-flag"></i><span> 产品管理</span></a></li>
+			<li class="nav-node"><a href="#/manage"><i
+					class="fa fa-flag"></i><span> 在售产品管理</span></a></li>
 			<li class="nav-node"><a href="#trade/goodsStatistics"><i
 					class="fa fa-filter"></i><span> 在售产品信息统计</span></a></li>
 			<li class="nav-node"><a href="#product/overtimeBatch"><i
@@ -169,8 +170,6 @@
 					class="fa fa-flag"></i><span> 品牌映射维护</span></a></li>
 			<li class="nav-node"><a href="#/store/company"><i
 					class="fa fa-flag"></i><span> 寄售管理</span></a></li>
-			<li class="nav-node"><a href="#/manage"><i
-					class="fa fa-flag"></i><span> 产品管理</span></a></li>
 			<li class="nav-node"><a href="#brandmaintenance"><i
 					class="fa fa-bullhorn"></i><span> 品牌维护</span></a></li>
 			<li class="nav-node"><a href="#/store/list"><i

+ 1 - 0
src/main/webapp/resources/css/b2bCommon.css

@@ -527,6 +527,7 @@ table.b2b-modal-table > tbody > tr > td {
     color: #666;
 }
 #empty_info {
+    padding-top:20px;
     padding-left: 60px;
     padding-bottom: 40px;
 }

+ 24 - 7
src/main/webapp/resources/js/admin/app.js

@@ -274,12 +274,36 @@
 			templateUrl : 'static/view/admin/product/productManage.html',
 			controller : 'productManageCtrl',
 			controllerUrl : 'app/controllers/product/productManageCtrl'
+        })).state('saleManage', angularAMD.route({
+            // 在售产品管理
+            url: '/saleManage',
+            templateUrl : 'static/view/admin/product/saleProductManage.html',
+            controller : 'saleProductManageCtrl',
+            controllerUrl : 'app/controllers/product/saleProductManageCtrl'
 		})).state('manage_detail', angularAMD.route({
             // 产品详情列表
             url: '/manage/:id',
             templateUrl : 'static/view/admin/product/productManageDetail.html',
             controller : 'productManageDetailCtrl',
             controllerUrl : 'app/controllers/product/productManageDetailCtrl'
+        })).state('merchant_products', angularAMD.route({
+            // 商家产品数汇总
+            url: '/merchantProducts?startDate&endDate',
+            templateUrl : 'static/view/admin/product/merchantProducts.html',
+            controller : 'merchantProductsCtrl',
+            controllerUrl : 'app/controllers/product/merchantProductsCtrl'
+        })).state('brand_products', angularAMD.route({
+            // 品牌产品数汇总
+            url: '/brandProductsCount?startDate&endDate',
+            templateUrl : 'static/view/admin/product/brandProductsCount.html',
+            controller : 'brandProductsCountCtrl',
+            controllerUrl : 'app/controllers/product/brandProductsCountCtrl'
+        })).state('category_number', angularAMD.route({
+            // 品类产品数汇总
+            url: '/categoryNumber?startDate&endDate',
+            templateUrl : 'static/view/admin/product/categoryNumber.html',
+            controller : 'categoryNumberCtrl',
+            controllerUrl : 'app/controllers/product/categoryNumberCtrl'
         })).state('store_company_list', angularAMD.route({
 			// 寄售管理
 			url: '/store/company',
@@ -826,13 +850,6 @@
             controller: 'LoanApplyListCtrl',
             controllerUrl: 'app/controllers/fa/LoanApplyListCtrl',
             title: '消息列表'
-        })).state('b2bManage', angularAMD.route({
-			// b2b后台管理贷款申请列表
-			url: '/b2b/manage',
-            templateUrl: 'static/view/admin/b2b/manage.html',
-            controller: 'b2bManageCtrl',
-            controllerUrl: 'app/controllers/b2b/b2bManageCtrl',
-            title: '贷款申请列表'
         })).state('statsData', angularAMD.route({
             // 后台管理数据统计数据
             url: '/statsData',

+ 8 - 1
src/main/webapp/resources/js/admin/controllers/StoreApplicationCtrl.js

@@ -23,6 +23,10 @@ define([ 'app/app' ], function(app) {
 				name: 'PREPARE',
 				message: '待审核'
 			},
+            CHECK: {
+                name: 'CHECK',
+                message: '待审核'
+            },
 			PASS: {
 				name: 'PASS',
 				message: '已通过'
@@ -116,8 +120,11 @@ define([ 'app/app' ], function(app) {
 						var date = new Date();
 						console.log('TIMESTAMP', date.getTime());
 						angular.forEach(data.content, function (application) {
-							if (application.status === $scope.authType.PREPARE.name) {
+							if (application.status === $scope.authType.PREPARE.name || application.status === $scope.authType.CHECK.name) {
 								var time = date - application.createTime;
+								if (application.status === $scope.authType.CHECK.name) {
+                                    time = date - application.authTime;
+								}
 								// 计算相差天数
 								var days = Math.floor(time / (24 * 3600 * 1000));
 								// 计算相差小时数

+ 35 - 13
src/main/webapp/resources/js/admin/controllers/StoreQualificationCtrl.js

@@ -196,9 +196,9 @@ define([ 'app/app' ], function(app) {
 
 					// 设置公司资质信息
 					$scope.tab = $scope.application.enType;
-					$scope.enQualification = JSON.parse($scope.application.enQualification);
 					$scope.enQualificationBackup = angular.copy($scope.enQualification);
 				}
+                $scope.enQualification = $scope.application.enQualification  && JSON.parse($scope.application.enQualification) || {}
 			}, function () {
 				toaster.pop('error', '获取店铺申请信息失败');
 			});
@@ -358,18 +358,40 @@ define([ 'app/app' ], function(app) {
 			apply.brands = $scope.brands || null;
 			apply.reason = $scope.reason;
 
-			handlerApply(isPass, apply).then(function (data) {
-				if (data.success) {
-					toaster.pop('success', "审核完成");
-					$scope.updateState = false;
-					activate();
-				} else {
-					toaster.pop('error', data.message);
-				}
-			})['catch'](function (error) {
-				console.log(error);
-				toaster.pop('error', '审核操作失败');
-			});
+			/*
+			* 初审
+			* */
+			if ($scope.application.status === 'PREPARE') {
+                StoreInfo.storeCheck({uuid: $scope.application.uuid}, apply || null, function (data) {
+                    if (data.success) {
+                        toaster.pop('success', "审核完成");
+                        $scope.updateState = false;
+                        activate();
+                    } else {
+                        toaster.pop('error', data.message);
+                    }
+                }, function (error) {
+                    console.log(error);
+                    toaster.pop('error', '审核操作失败');
+                });
+            }
+            else {
+                /*
+                * 终审
+                * */
+                handlerApply(isPass, apply).then(function (data) {
+                    if (data.success) {
+                        toaster.pop('success', "审核完成");
+                        $scope.updateState = false;
+                        activate();
+                    } else {
+                        toaster.pop('error', data.message);
+                    }
+                })['catch'](function (error) {
+                    console.log(error);
+                    toaster.pop('error', '审核操作失败');
+                });
+            }
 		}
 
 		/**

+ 0 - 37
src/main/webapp/resources/js/admin/controllers/b2b/b2bManageCtrl.js

@@ -1,37 +0,0 @@
-define(['app/app'], function (app) {
-    'use strict';
-    app.register.controller('b2bManageCtrl', ['$scope', 'ngTableParams', 'manage', 'toaster', 'BaseService', function ($scope, ngTableParams, manage, toaster, BaseService) {
-        //table设置
-        $scope.tableParams = new ngTableParams({
-            page : 1,
-            count : 20
-        }, {
-            total : 0,
-            getData : function ($defer, params) {
-                // $scope.loading = true;
-                var param = BaseService.parseParams(params.url());
-                param.keyword = $scope.keyword;
-                manage.getEnterpriseList(param, function (data) {
-                    params.total(data.totalElements);
-                    $defer.resolve(data.content);
-                }, function (response) {
-                    toaster.pop('error', '获取企业列表失败');
-                });
-            }
-        });
-
-        // 根据关键词搜索
-        $scope.onSearch = function() {
-            $scope.tableParams.reload();
-        }
-
-        /**
-         * 点击跳转商务平台
-         *
-         * @param uu uu号
-         */
-        $scope.redirect = function(uu, url) {
-            window.open('b2b/manage/authed/redirect/' + uu + (url ? ('?url=' + encodeURI(url)) : ''));
-        }
-    }]);
-});

+ 40 - 0
src/main/webapp/resources/js/admin/controllers/product/brandProductsCountCtrl.js

@@ -0,0 +1,40 @@
+define(['app/app'], function(app) {
+    app.register.controller('brandProductsCountCtrl', ['$scope', 'ngTableParams', 'BaseService','Goods', 'toaster', '$stateParams',
+        function($scope, ngTableParams, BaseService, Goods, toaster, $stateParams) {
+            $scope.startFormatDate = $stateParams.startDate;
+            $scope.endFormatDate = $stateParams.endDate;
+
+            $scope.tableParams = new ngTableParams({
+                page: 1,
+                count: 10
+            }, {
+                total: 0,
+                getData: function ($defer, params) {
+                    var param = BaseService.parseParams(params.url());
+                    param.startTime = $stateParams.startDate;
+                    param.endTime = $stateParams.endDate;
+                    Goods.loadBrandProductsCount(param, function(data) {
+                        params.total(data.totalElements);
+                        $defer.resolve(data.content);
+                    }, function (res) {
+                        toaster.pop('error', '获取上传产品详情列表失败!')
+                    })
+                }
+            });
+
+            // 导出
+            $scope.exportXls = function () {
+                var url = "/trade/goods/brandProductsCount/export";
+                if (angular.isDefined($scope.startFormatDate)) {
+                    url = url + '?startTime=' + $scope.startFormatDate;
+                }
+                if (angular.isDefined($scope.startFormatDate) && angular.isDefined($scope.endFormatDate)) {
+                    url = url + "&endTime=" + $scope.endFormatDate;
+                }
+                if (!angular.isDefined($scope.startFormatDate) && angular.isDefined($scope.endFormatDate)) {
+                    url = url + "?endTime=" + $scope.endFormatDate;
+                }
+                window.open(url);
+            }
+        }])
+})

+ 40 - 0
src/main/webapp/resources/js/admin/controllers/product/categoryNumberCtrl.js

@@ -0,0 +1,40 @@
+define(['app/app'], function(app) {
+    app.register.controller('categoryNumberCtrl', ['$scope', 'ngTableParams', 'BaseService','Goods', 'toaster', '$stateParams',
+        function($scope, ngTableParams, BaseService, Goods, toaster, $stateParams) {
+            $scope.startFormatDate = $stateParams.startDate;
+            $scope.endFormatDate = $stateParams.endDate;
+
+            $scope.tableParams = new ngTableParams({
+                page: 1,
+                count: 10
+            }, {
+                total: 0,
+                getData: function ($defer, params) {
+                    var param = BaseService.parseParams(params.url());
+                    param.startTime = $stateParams.startDate;
+                    param.endTime = $stateParams.endDate;
+                    Goods.loadKindProductsCount(param, function(data) {
+                        params.total(data.totalElements);
+                        $defer.resolve(data.content);
+                    }, function (res) {
+                        toaster.pop('error', '获取上传产品详情列表失败!')
+                    })
+                }
+            });
+
+            // 导出
+            $scope.exportXls = function () {
+                var url = "/trade/goods/kindProductsCount/export";
+                if (angular.isDefined($scope.startFormatDate)) {
+                    url = url + '?startTime=' + $scope.startFormatDate;
+                }
+                if (angular.isDefined($scope.startFormatDate) && angular.isDefined($scope.endFormatDate)) {
+                    url = url + "&endTime=" + $scope.endFormatDate;
+                }
+                if (!angular.isDefined($scope.startFormatDate) && angular.isDefined($scope.endFormatDate)) {
+                    url = url + "?endTime=" + $scope.endFormatDate;
+                }
+                window.open(url);
+            }
+        }])
+})

+ 30 - 0
src/main/webapp/resources/js/admin/controllers/product/merchantProductsCtrl.js

@@ -0,0 +1,30 @@
+define(['app/app'], function(app) {
+    app.register.controller('merchantProductsCtrl', ['$scope', 'ngTableParams', 'BaseService','Goods', 'toaster', '$stateParams',
+        function($scope, ngTableParams, BaseService, Goods, toaster, $stateParams) {
+            $scope.startFormatDate = $stateParams.startDate;
+            $scope.endFormatDate = $stateParams.endDate;
+
+            $scope.tableParams = new ngTableParams({
+                page: 1,
+                size: 10
+            }, {
+                total: 0,
+                getData: function ($defer, params) {
+                    var param = BaseService.parseParams(params.url());
+                    param.startTime = $stateParams.startDate;
+                    param.endTime = $stateParams.endDate;
+                    Goods.loadUploadProductDetail(param, function(data) {
+                        params.total(data.totalElements);
+                        $defer.resolve(data.content);
+                    }, function (res) {
+                        toaster.pop('error', '获取上传产品详情列表失败!')
+                     })
+                }
+            });
+
+            // 导出
+            $scope.exportXls = function () {
+                window.location.href = 'store-service/export?startTime='+ $scope.startFormatDate + '&endTime=' + $scope.endFormatDate
+            }
+        }])
+})

+ 194 - 3
src/main/webapp/resources/js/admin/controllers/product/productManageCtrl.js

@@ -1,7 +1,118 @@
 define(['app/app'], function(app) {
     'use strict';
     app.register.controller('productManageCtrl', ['$scope', '$modal', 'toaster', 'ngTableParams', 'BaseService', '$http', 'Goods', 'BackgroundRecord', 'Commodity', 'GoodsModifyInfo', function($scope, $modal, toaster, ngTableParams, BaseService, $http, Goods, BackgroundRecord, Commodity, GoodsModifyInfo) {
+        $scope.dateArea = 'oneMonth';
+        var _formatDate = function (date, fmt) {
+            if (!date) {
+                return null;
+            }
+            if (typeof date === 'string') {
+                date = new Date(Date.parse(date.replace(/-/g, '/')));
+            }
+            var o = {
+                'M+': date.getMonth() + 1, // 月份
+                'd+': date.getDate(), // 日
+                'h+': date.getHours(), // 小时
+                'm+': date.getMinutes(), // 分
+                's+': date.getSeconds(), // 秒
+                'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
+                'S': date.getMilliseconds() // 毫秒
+            }
+            if (/(y+)/.test(fmt)) {
+                fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
+            }
+            for (var k in o) {
+                if (new RegExp('(' + k + ')').test(fmt)) {
+                    fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)));
+                }
+            }
+            return fmt;
+        };
+        var _getClearDay = function (date) {
+            return new Date(_formatDate(date, 'yyyy-MM-dd')).getTime() - 8 * 60 * 60 * 1000
+        };
+
+        var currentTime = _getClearDay(new Date());
+        $scope.startDate = new Date(currentTime - 30 * 24 * 60 * 60 * 1000);
+        $scope.endDate = new Date(currentTime + 23 * 60 * 60 * 1000 + 59 * 60 * 1000 + 59 * 1000);
+        $scope.startFormatDate = _formatDate($scope.startDate, 'yyyy-MM-dd');
+        $scope.endFormatDate = _formatDate($scope.endDate, 'yyyy-MM-dd');
+        var addStartDate = new Date($scope.startDate.getTime() + 24 * 60 * 60 * 1000)
+        var addEndDate = new Date($scope.endDate.getTime() + 24 * 60 * 60 * 1000)
+        $scope.addStartFormatDate = _formatDate(addStartDate, 'yyyy-MM-dd');
+        $scope.addEndFormatDate = _formatDate(addEndDate, 'yyyy-MM-dd');
+
+        $scope.setFilters = function (type, val) {
+            $scope[type] = val;
+            if (type == 'dateArea') {
+                // 时间筛选
+                var currentTime = _getClearDay(new Date());
+                var endDate = new Date(currentTime + 23 * 60 * 60 * 1000 + 59 * 60 * 1000 + 59 * 1000);
+                if (val == 'oneMonth') {
+                    $scope.startDate = new Date(currentTime - 30 * 24 * 60 * 60 * 1000 - 24 * 60 * 60 * 1000);
+                    $scope.endDate = endDate;
+                } else if (val == 'threeMonth') {
+                    $scope.startDate = new Date(currentTime - 3 * 30 * 24 * 60 * 60 * 1000 - 24 * 60 * 60 * 1000);
+                    $scope.endDate = endDate;
+                } else if (val == 'sixMonth') {
+                    $scope.startDate = new Date(currentTime - 6 * 30 * 24 * 60 * 60 * 1000 - 24 * 60 * 60 * 1000);
+                    $scope.endDate = endDate;
+                } else if (val == 'allMonth') {
+                    $scope.startDate = null;
+                    $scope.endDate = null;
+                }
+            }
+            $scope.startFormatDate = $scope.startDate ? _formatDate($scope.startDate, 'yyyy-MM-dd') : '';
+            $scope.endFormatDate = $scope.endDate ? _formatDate($scope.endDate, 'yyyy-MM-dd') : '';
+            if (val != 'autoMonth') {
+                $scope.manageTableParams.page(1);
+                $scope.manageTableParams.reload();
+            }
+        };
 
+        $scope.condition = [];
+        var start = {
+            open : false
+        };
+        var end = {
+            open : false
+        };
+        $scope.condition.push(start);
+        $scope.condition.push(end);
+        // 打开日期选择框
+        $scope.openDatePicker = function($event, item, openParam) {
+            $event.preventDefault();
+            $event.stopPropagation();
+            openParam == 0 ? $scope.condition[1].open = false : $scope.condition[0].open = false;
+            item[openParam].open = !item[openParam].open;
+        };
+
+        $scope.onDateCondition = function (bool, date) {
+            if (bool == 1) {
+                $scope.startDate = date;
+            } else {
+                $scope.endDate = date;
+            }
+            var startTime = $scope.startDate ? $scope.startDate.getTime() : null;
+            var endTime = $scope.endDate ? $scope.endDate.getTime() : null;
+            if (startTime && endTime && startTime > endTime) {
+                if (bool == 1) {
+                    toaster.pop('info', '起始时间不能大于结束时间');
+                    $scope.startDate = null;
+                } else {
+                    toaster.pop('info', '结束时间不能小于起始时间');
+                    $scope.endDate = null;
+                }
+            }
+            if ($scope.endDate && bool == 2) {
+                $scope.endDate = new Date($scope.endDate.getFullYear(), $scope.endDate.getMonth(), $scope.endDate.getDate())
+                $scope.endDate = new Date($scope.endDate.getTime() + 23 * 60 * 60 * 1000 + 59 * 60 * 1000 + 59 * 1000);
+            }
+            $scope.startFormatDate = $scope.startDate ? _formatDate($scope.startDate, 'yyyy-MM-dd') : '';
+            $scope.endFormatDate = $scope.endDate ? _formatDate($scope.endDate, 'yyyy-MM-dd') : '';
+            $scope.manageTableParams.page(1);
+            $scope.manageTableParams.reload();
+        };
         $scope.goodsFilter = {};
         $scope.kindPojo = {};
         var initTitleInfo = function () {
@@ -34,6 +145,17 @@ define(['app/app'], function(app) {
             counts: [],
             getData: function ($defer, params) {
                 var param = BaseService.parseParams(params.url());
+                if($scope.startFormatDate) {
+                    $scope.goodsFilter.startTime = $scope.startFormatDate
+                } else {
+                    delete $scope.goodsFilter.startTime
+                }
+                if($scope.endFormatDate) {
+                    $scope.goodsFilter.endTime = $scope.endFormatDate
+                } else {
+                    delete $scope.goodsFilter.endTime
+                }
+                $scope.pageParams = param;
                 Goods.loadGoodsList(param, $scope.goodsFilter, function (data) {
                     $scope.totalCount = data.totalElements;
                     $scope.goodsList = data.content;
@@ -75,9 +197,11 @@ define(['app/app'], function(app) {
         //获取选中之后的信息
         var getChooseBatch = function () {
             $scope.choosedBatch = [];
+            $scope.ids = [];
             angular.forEach($scope.goodsList, function (goods) {
                 if (goods.isChoosed) {
                     $scope.choosedBatch.push(goods.batchCode);
+                    $scope.ids.push(goods);
                 }
             });
         };
@@ -161,6 +285,19 @@ define(['app/app'], function(app) {
             }
         }
 
+        // 清空数据
+        $scope.clearClick = function () {
+            for( var tmp in $scope.goodsFilter) {
+                $scope.goodsFilter[tmp] = '';
+            }
+            for( var tmp in $scope.kindPojo) {
+                $scope.kindPojo[tmp] = '';
+            }
+            $scope.goodsFilter.kindUuid = '';
+            $scope.manageTableParams.page(1);
+            $scope.manageTableParams.reload();
+        };
+
         // 搜索事件
         $scope.searchClick = function () {
             if ($scope.kindPojo && $scope.kindPojo.first) {
@@ -181,8 +318,62 @@ define(['app/app'], function(app) {
         };
 
         // 产品导出事件
-        $scope.exportClick = function (data) {
-            var modalInstance = $modal.open({
+        $scope.exportClick = function () {
+            var url = '';
+            if($scope.ids.length > 0) {
+                var idList = [];
+                angular.forEach($scope.ids, function(val) {
+                    idList.push(val.id)
+                })
+                url = '/trade/goods/background/downloadByIds?idStr=' + angular.toJson(idList)
+            } else {
+                // 拼装链接
+                url = "/trade/goods/background/download?page=" + $scope.pageParams.page + "&count=" + $scope.pageParams.count + "&sorting=" + encodeURIComponent(angular.toJson($scope.pageParams.sorting));
+                if (angular.isDefined($scope.startDate) && null != $scope.startDate) {
+                    url = url + "&startTime=" + $scope.startDate.getTime();
+                }
+                if (angular.isDefined($scope.endDate) && null != $scope.endDate) {
+                    url = url + "&endTime=" + $scope.endDate.getTime();
+                }
+                if (angular.isDefined($scope.goodsFilter.kindUuid)) {
+                    url = url + "&kindUuid=" + $scope.goodsFilter.kindUuid;
+                }
+                if (angular.isDefined($scope.goodsFilter.code)) {
+                    url = url + "&code=" + $scope.goodsFilter.code
+                }
+                if (angular.isDefined($scope.goodsFilter.brand)) {
+                    url = url + "&brand=" + $scope.goodsFilter.brand
+                }
+                if (angular.isDefined($scope.goodsFilter.store)) {
+                    url = url + "&store=" + $scope.goodsFilter.store
+                }
+                if (angular.isDefined($scope.goodsFilter.saleStatus)) {
+                    url = url + "&saleStatus=" + $scope.goodsFilter.saleStatus
+                }
+                if (angular.isDefined($scope.goodsFilter.saleNum)) {
+                    url = url + "&saleNum=" + $scope.goodsFilter.saleNum
+                }
+                if (angular.isDefined($scope.goodsFilter.currency)) {
+                    url = url + "&currency=" + $scope.goodsFilter.currency
+                }
+                if (angular.isDefined($scope.goodsFilter.saleSelf)) {
+                    url = url + "&saleSelf=" + $scope.goodsFilter.saleSelf
+                }
+                if (angular.isDefined($scope.goodsFilter.bredakUp)) {
+                    url = url + "&breakUp=" + $scope.goodsFilter.bredakUp
+                }
+                if (angular.isDefined($scope.goodsFilter.standard)) {
+                    url = url + "&standard=" + $scope.goodsFilter.standard
+                }
+                if (angular.isDefined($scope.goodsFilter.audited)) {
+                    url = url + "&audited=" + $scope.goodsFilter.audited
+                }
+                if (angular.isDefined($scope.goodsFilter.haveImg)) {
+                    url = url + "&haveImg=" + $scope.goodsFilter.haveImg;
+                }
+            }
+            window.open(url);
+            /*var modalInstance = $modal.open({
                 templateUrl: 'static/view/admin/modal/manage/exportProduct_modal.html',
                 controller: 'exportProductCtrl',
                 resolve: {
@@ -195,7 +386,7 @@ define(['app/app'], function(app) {
 
             }, function () {
 
-            })
+            })*/
         };
 
         // 更多信息事件

+ 6 - 3
src/main/webapp/resources/js/admin/controllers/product/productManageDetailCtrl.js

@@ -1,9 +1,12 @@
 define(['app/app'], function(app) {
     'use strict';
-    app.register.controller('productManageDetailCtrl', ['$scope', '$stateParams', 'Goods', '$modal', function ($scope, $stateParams, Goods, $modal) {
-        $scope.goodId = $stateParams.id;
+    app.register.controller('productManageDetailCtrl', ['$scope', '$stateParams', 'Goods', '$modal', '$location', function ($scope, $stateParams, Goods, $modal, $location) {
+        $scope.id = $stateParams.id;
         var initGoods = function () {
-            Goods.findOneById({goodsId:$scope.goodId}, function (data) {
+            var url = $location.$$search.type
+            var urlData = (url=== 'goods'? 'findOneById' : 'findProductsOneById')
+            var params = (url=== 'goods'? {goodsId:$scope.id} : {productId:$scope.id})
+            Goods[urlData](params , function (data) {
                 $scope.goods = data;
             })
         };

+ 877 - 0
src/main/webapp/resources/js/admin/controllers/product/saleProductManageCtrl.js

@@ -0,0 +1,877 @@
+define(['app/app'], function(app) {
+    'use strict';
+    app.register.controller('saleProductManageCtrl', ['$scope', '$modal', 'toaster', 'ngTableParams', 'BaseService', '$http', 'Goods', 'BackgroundRecord', 'Commodity', 'GoodsModifyInfo', function($scope, $modal, toaster, ngTableParams, BaseService, $http, Goods, BackgroundRecord, Commodity, GoodsModifyInfo) {
+        $scope.dateArea = 'oneMonth';
+        var _formatDate = function (date, fmt) {
+            if (!date) {
+                return null;
+            }
+            if (typeof date === 'string') {
+                date = new Date(Date.parse(date.replace(/-/g, '/')));
+            }
+            var o = {
+                'M+': date.getMonth() + 1, // 月份
+                'd+': date.getDate(), // 日
+                'h+': date.getHours(), // 小时
+                'm+': date.getMinutes(), // 分
+                's+': date.getSeconds(), // 秒
+                'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
+                'S': date.getMilliseconds() // 毫秒
+            }
+            if (/(y+)/.test(fmt)) {
+                fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
+            }
+            for (var k in o) {
+                if (new RegExp('(' + k + ')').test(fmt)) {
+                    fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)));
+                }
+            }
+            return fmt;
+        };
+        var _getClearDay = function (date) {
+            return new Date(_formatDate(date, 'yyyy-MM-dd')).getTime() - 8 * 60 * 60 * 1000
+        };
+
+        var currentTime = _getClearDay(new Date());
+        $scope.startDate = new Date(currentTime - 30 * 24 * 60 * 60 * 1000);
+        $scope.endDate = new Date(currentTime + 23 * 60 * 60 * 1000 + 59 * 60 * 1000 + 59 * 1000);
+        $scope.startFormatDate = _formatDate($scope.startDate, 'yyyy-MM-dd');
+        $scope.endFormatDate = _formatDate($scope.endDate, 'yyyy-MM-dd');
+        var addStartDate = new Date($scope.startDate.getTime() + 24 * 60 * 60 * 1000)
+        var addEndDate = new Date($scope.endDate.getTime() + 24 * 60 * 60 * 1000)
+        $scope.addStartFormatDate = _formatDate(addStartDate, 'yyyy-MM-dd');
+        $scope.addEndFormatDate = _formatDate(addEndDate, 'yyyy-MM-dd');
+
+        $scope.setFilters = function (type, val) {
+            $scope[type] = val;
+            if (type == 'dateArea') {
+                // 时间筛选
+                var currentTime = _getClearDay(new Date());
+                var endDate = new Date(currentTime + 23 * 60 * 60 * 1000 + 59 * 60 * 1000 + 59 * 1000);
+                if (val == 'oneMonth') {
+                    $scope.startDate = new Date(currentTime - 30 * 24 * 60 * 60 * 1000 - 24 * 60 * 60 * 1000);
+                    $scope.endDate = endDate;
+                } else if (val == 'threeMonth') {
+                    $scope.startDate = new Date(currentTime - 3 * 30 * 24 * 60 * 60 * 1000 - 24 * 60 * 60 * 1000);
+                    $scope.endDate = endDate;
+                } else if (val == 'sixMonth') {
+                    $scope.startDate = new Date(currentTime - 6 * 30 * 24 * 60 * 60 * 1000 - 24 * 60 * 60 * 1000);
+                    $scope.endDate = endDate;
+                } else if (val == 'allMonth') {
+                    $scope.startDate = null;
+                    $scope.endDate = null;
+                }
+            }
+            $scope.startFormatDate = $scope.startDate ? _formatDate($scope.startDate, 'yyyy-MM-dd') : '';
+            $scope.endFormatDate = $scope.endDate ? _formatDate($scope.endDate, 'yyyy-MM-dd') : '';
+            if (val != 'autoMonth') {
+                $scope.manageTableParams.page(1);
+                $scope.manageTableParams.reload();
+            }
+        };
+
+        $scope.condition = [];
+        var start = {
+            open : false
+        };
+        var end = {
+            open : false
+        };
+        $scope.condition.push(start);
+        $scope.condition.push(end);
+        // 打开日期选择框
+        $scope.openDatePicker = function($event, item, openParam) {
+            $event.preventDefault();
+            $event.stopPropagation();
+            openParam == 0 ? $scope.condition[1].open = false : $scope.condition[0].open = false;
+            item[openParam].open = !item[openParam].open;
+        };
+
+        $scope.onDateCondition = function (bool, date) {
+            if (bool == 1) {
+                $scope.startDate = date;
+            } else {
+                $scope.endDate = date;
+            }
+            var startTime = $scope.startDate ? $scope.startDate.getTime() : null;
+            var endTime = $scope.endDate ? $scope.endDate.getTime() : null;
+            if (startTime && endTime && startTime > endTime) {
+                if (bool == 1) {
+                    toaster.pop('info', '起始时间不能大于结束时间');
+                    $scope.startDate = null;
+                } else {
+                    toaster.pop('info', '结束时间不能小于起始时间');
+                    $scope.endDate = null;
+                }
+            }
+            if ($scope.endDate && bool == 2) {
+                $scope.endDate = new Date($scope.endDate.getFullYear(), $scope.endDate.getMonth(), $scope.endDate.getDate())
+                $scope.endDate = new Date($scope.endDate.getTime() + 23 * 60 * 60 * 1000 + 59 * 60 * 1000 + 59 * 1000);
+            }
+            $scope.startFormatDate = $scope.startDate ? _formatDate($scope.startDate, 'yyyy-MM-dd') : '';
+            $scope.endFormatDate = $scope.endDate ? _formatDate($scope.endDate, 'yyyy-MM-dd') : '';
+            $scope.manageTableParams.page(1);
+            $scope.manageTableParams.reload();
+        };
+        $scope.goodsFilter = {};
+        $scope.kindPojo = {};
+        var initTitleInfo = function () {
+            BackgroundRecord.getUserTitle({}, function (data) {
+                $scope.tableTabs = data;
+                $scope.titleInShow = {};
+                angular.forEach($scope.tableTabs, function (item) {
+                    $scope.titleInShow[item.titleName] = true;
+                });
+            });
+        };
+        initTitleInfo();
+
+        $scope.saleStatus = {
+            601 : '已上架',
+            602 : '已上架',
+            612 : '已下架',
+            613 : '新品未上架'
+        };
+
+        // 获取分页Goods数据
+        $scope.manageTableParams = new ngTableParams({
+            page: 1,
+            count: 10,
+            sorting: {
+                createTime : 'DESC'
+            }
+        }, {
+            total: 0,
+            counts: [],
+            getData: function ($defer, params) {
+                var param = BaseService.parseParams(params.url());
+                if($scope.startFormatDate) {
+                    $scope.goodsFilter.startTime = $scope.startFormatDate
+                } else {
+                    delete $scope.goodsFilter.startTime
+                }
+                if($scope.endFormatDate) {
+                    $scope.goodsFilter.endTime = $scope.endFormatDate
+                } else {
+                    delete $scope.goodsFilter.endTime
+                }
+                $scope.pageParams = param;
+                Goods.loadBrandProductsList(param, $scope.goodsFilter, function (data) {
+                    $scope.totalCount = data.totalElements;
+                    $scope.goodsList = data.content;
+                    angular.forEach($scope.goodsList, function (list) {
+                        list.isChoosed = false
+                    });
+                    params.total(data.totalElements);
+                    $defer.resolve(data.content);
+                }, function () {
+                    toaster.pop('error', '获取数据失败')
+                })
+            }
+        });
+
+        // 全选
+        $scope.chooseAll = function () {
+            $scope.isChooseAll = !$scope.isChooseAll;
+            angular.forEach($scope.goodsList, function (list) {
+                list.isChoosed = $scope.isChooseAll;
+            })
+        };
+
+        // 检查是否全选
+        var checkChoosedAll = function () {
+            $scope.isChooseAll = true;
+            angular.forEach($scope.goodsList, function (list) {
+                if(!list.isChoosed) {
+                    $scope.isChooseAll = false;
+                }
+            })
+        };
+
+        // 单选
+        $scope.chooseOne = function (list) {
+            (typeof list.isChoosed === 'undefined' || !list.isChoosed) ? list.isChoosed = true : list.isChoosed = false;
+            checkChoosedAll();
+        };
+
+        //获取选中之后的信息
+        var getChooseBatch = function () {
+            $scope.choosedBatch = [];
+            $scope.ids = [];
+            angular.forEach($scope.goodsList, function (goods) {
+                if (goods.isChoosed) {
+                    $scope.choosedBatch.push(goods.batchCode);
+                    $scope.ids.push(goods);
+                }
+            });
+        };
+
+        $scope.batchDown = function () {
+            getChooseBatch();
+            if (!$scope.choosedBatch || $scope.choosedBatch.length == 0) {
+                toaster.pop("info", "您尚未选中任何产品");
+                return ;
+            }
+            $scope.soldOutProduct($scope.choosedBatch);
+        };
+
+        var initKindDataInfo = function () {
+            Commodity.getAllKindInfo({}, function (data) {
+                $scope.kindInfo = data[0].children;
+            })
+        };
+        initKindDataInfo();
+
+        // 是否打开树型选择
+        $scope.showSecondList = function () {
+            $scope.selectDown = true;
+        };
+        $scope.selectDown = false;
+        $scope.treeOptions = {
+            nodeChildren: "children",
+            dirSelectable: false,
+            injectClasses: {
+                ul: "a1",
+                li: "a2",
+                liSelected: "a7",
+                iExpanded: "a3",
+                iCollapsed: "a4",
+                iLeaf: "a5",
+                label: "a6",
+                labelSelected: "a8"
+            }
+        };
+        $scope.showSelected = function(node) {
+            $scope.leaf = node.nameCn;
+            $scope.selectDown = false;
+        };
+
+        /**
+         * 获取根据当前类目的信息获取所有叶子节点的类目信息
+         *
+         * @param kind
+         */
+        function getAllLeafKindId(kind) {
+            if (!kind) {
+                return null;
+            }
+            if (kind.isLeaf == 1) {
+                return kind.id;
+            }
+            if (kind.isLeaf == 0) {
+                // 获取第一级类目的所有叶子类目ID
+                if (kind.level == 1) {
+                    var leafKindIds = [];
+                    angular.forEach(kind.children, function (kind) {
+                        // 获取第一级类目的直接子类目的所有叶子类目ID
+                        var childrenIds = getAllLeafKindId(kind);
+                        if (Array.isArray(childrenIds)) {
+                            angular.forEach(childrenIds, function (child) {
+                                leafKindIds.push(child);
+                            })
+                        } else {
+                            leafKindIds.push(childrenIds);
+                        }
+                    });
+                    return leafKindIds;
+                } else if (kind.level == 2) {
+                    // 获取第二级类目的所有叶子类目ID
+                    var kindIds = [];
+                    angular.forEach(kind.children, function (kind) {
+                        kindIds.push(kind.id);
+                    });
+                    return kindIds;
+                }
+            }
+        }
+
+        // 清空数据
+        $scope.clearClick = function () {
+            for( var tmp in $scope.goodsFilter) {
+                $scope.goodsFilter[tmp] = '';
+            }
+            for( var tmp in $scope.kindPojo) {
+                $scope.kindPojo[tmp] = '';
+            }
+            $scope.goodsFilter.kindUuid = '';
+            $scope.manageTableParams.page(1);
+            $scope.manageTableParams.reload();
+        };
+
+        // 搜索事件
+        $scope.searchClick = function () {
+            if ($scope.kindPojo && $scope.kindPojo.first) {
+                if (!$scope.kindPojo.second) {
+                    var kind = $scope.kindInfo[$scope.kindPojo.first];
+                    var kindUuid = getAllLeafKindId(kind);
+                    $scope.goodsFilter.kindUuid = kindUuid.join(',')
+                } else if ($scope.kindPojo.second && $scope.kindPojo.third) {
+                    $scope.goodsFilter.kindUuid = getAllLeafKindId($scope.kindPojo.third);
+                } else {
+                    var kind = $scope.kindInfo[$scope.kindPojo.first].children[$scope.kindPojo.second];
+                    var kindUuid = getAllLeafKindId(kind);
+                    $scope.goodsFilter.kindUuid = kindUuid.join(',')
+                }
+            }
+            $scope.manageTableParams.page(1);
+            $scope.manageTableParams.reload();
+        };
+
+        // 产品导出事件
+        $scope.exportClick = function () {
+            var url = '';
+            getChooseBatch();
+            if($scope.ids.length > 0) {
+                var idList = [];
+                angular.forEach($scope.ids, function(val) {
+                    idList.push(val.id)
+                })
+                url = '/trade/products/background/downloadByIds?idStr=' + angular.toJson(idList);
+            } else {
+                // 拼装链接
+                url = "/trade/products/background/download?page=" + $scope.pageParams.page + "&count=" + $scope.pageParams.count + "&sorting=" + encodeURIComponent(angular.toJson($scope.pageParams.sorting));
+                if (angular.isDefined($scope.startDate) && null != $scope.startDate) {
+                    url = url + "&startTime=" + $scope.startDate.getTime();
+                }
+                if (angular.isDefined($scope.endDate) && null != $scope.endDate) {
+                    url = url + "&endTime=" + $scope.endDate.getTime();
+                }
+                if (angular.isDefined($scope.goodsFilter.kindUuid)) {
+                    url = url + "&kindUuid=" + $scope.goodsFilter.kindUuid;
+                }
+                if (angular.isDefined($scope.goodsFilter.code)) {
+                    url = url + "&code=" + $scope.goodsFilter.code
+                }
+                if (angular.isDefined($scope.goodsFilter.brand)) {
+                    url = url + "&brand=" + $scope.goodsFilter.brand
+                }
+                if (angular.isDefined($scope.goodsFilter.store)) {
+                    url = url + "&store=" + $scope.goodsFilter.store
+                }
+                if (angular.isDefined($scope.goodsFilter.saleStatus)) {
+                    url = url + "&saleStatus=" + $scope.goodsFilter.saleStatus
+                }
+                if (angular.isDefined($scope.goodsFilter.saleNum)) {
+                    url = url + "&saleNum=" + $scope.goodsFilter.saleNum
+                }
+                if (angular.isDefined($scope.goodsFilter.currency)) {
+                    url = url + "&currency=" + $scope.goodsFilter.currency
+                }
+                if (angular.isDefined($scope.goodsFilter.saleSelf)) {
+                    url = url + "&saleSelf=" + $scope.goodsFilter.saleSelf
+                }
+                if (angular.isDefined($scope.goodsFilter.bredakUp)) {
+                    url = url + "&breakUp=" + $scope.goodsFilter.bredakUp
+                }
+                if (angular.isDefined($scope.goodsFilter.standard)) {
+                    url = url + "&standard=" + $scope.goodsFilter.standard
+                }
+                if (angular.isDefined($scope.goodsFilter.audited)) {
+                    url = url + "&audited=" + $scope.goodsFilter.audited
+                }
+                if (angular.isDefined($scope.goodsFilter.haveImg)) {
+                    url = url + "&haveImg=" + $scope.goodsFilter.haveImg;
+                }
+            }
+            window.open(url);
+            /*var modalInstance = $modal.open({
+                templateUrl: 'static/view/admin/modal/manage/exportProduct_modal.html',
+                controller: 'exportProductCtrl',
+                resolve: {
+                    account: function () {
+                        return angular.copy(data);
+                    }
+                }
+            });
+            modalInstance.result.then(function (account) {
+
+            }, function () {
+
+            })*/
+        };
+
+        // 更多信息事件
+        $scope.moreInfo = function () {
+            var modalInstance = $modal.open({
+                templateUrl: 'static/view/admin/modal/manage/moreInfo_modal.html',
+                controller: 'moreInfoCtrl',
+                resolve: {
+                    titleInShow: function () {
+                        return angular.copy($scope.titleInShow);
+                    }
+                }
+            });
+            modalInstance.result.then(function (data) {
+                if (data) {
+                    BackgroundRecord.updateUserTitle({}, data, function (data) {
+                        if (data.success) {
+                            if (data.data) {
+                                initTitleInfo();
+                            }
+                        } else {
+                            toaster.pop("info", data.message);
+                        }
+                    })
+                }
+            })
+        };
+
+        // 审核事件
+        $scope.auditProduct = function (goods) {
+            // 分页获取修改历史记录
+            // $scope.modifyTableParams = new ngTableParams({
+            //     page: 1,
+            //     count: 3
+            // }, {
+            //     total: 0,
+            //     getData: function ($defer, params) {
+            //         var param = BaseService.parseParams(params.url());
+            //         param.batchCode = goods.batchCode;
+            //         GoodsModifyInfo.getPageModifyInfo(param, function (data) {
+            //             var modalInstance = $modal.open({
+            //                 templateUrl: 'static/view/admin/modal/manage/manageAudit.html',
+            //                 controller: 'AuditCtrl',
+            //                 resolve: {
+            //                     goods: function () {
+            //                         return angular.copy(goods);
+            //                     },
+            //                     info: function () {
+            //                         return angular.copy(data.content);
+            //                     }
+            //                 }
+            //             });
+            //             modalInstance.result.then(function (result) {
+            //
+            //             }, function () {
+            //
+            //             })
+            //             params.total(data.totalElements);
+            //             $defer.resolve(data.content);
+            //         }, function () {
+            //             toaster.pop('error', '获取数据失败')
+            //         })
+            //     }
+            // });
+            GoodsModifyInfo.getModifyInfoByBatchCode({batchCode:goods.batchCode}, function (data) {
+                if (data) {
+                    var modalInstance = $modal.open({
+                        templateUrl: 'static/view/admin/modal/manage/manageAudit.html',
+                        controller: 'AuditCtrl',
+                        resolve: {
+                            goods: function () {
+                                return angular.copy(goods);
+                            },
+                            info: function () {
+                                return angular.copy(data);
+                            }
+                        }
+                    });
+                    modalInstance.result.then(function () {
+                        $scope.manageTableParams.reload();
+                    }, function () {
+
+                    })
+                }
+            }, function (error) {
+                toaster.pop("error", error.data);
+            });
+
+        };
+        // 日志点击事件
+        $scope.journalProduct = function (goods) {
+            var modalInstance = $modal.open({
+                templateUrl: 'static/view/admin/modal/manage/journal_modal.html',
+                controller: 'journalCtrl',
+                resolve: {
+                    goods: function () {
+                        return angular.copy(goods);
+                    }
+                }
+            });
+            modalInstance.result.then(function (account) {
+
+            }, function () {
+
+            })
+        };
+
+        // 下架事件
+        $scope.soldOutProduct = function (batchArray) {
+            var modalInstance = $modal.open({
+                templateUrl: 'static/view/admin/modal/manage/ManageSoldOut.html',
+                controller: 'soleOutCtrl',
+                resolve: {
+                    batchArray: function () {
+                        return angular.copy(batchArray);
+                    }
+                }
+            });
+            modalInstance.result.then(function () {
+                $scope.manageTableParams.reload();
+            }, function () {
+
+            })
+        };
+        // 显示对比图片信息
+        $scope.showImg = function (data) {
+            var modalInstance = $modal.open({
+                templateUrl: 'static/view/admin/modal/manage/showContrastImg_modal.html',
+                controller: 'showContrastImgCtrl',
+                resolve: {
+                    img: function () {
+                        return angular.copy(data);
+                    }
+                }
+            })
+            modalInstance.result.then(function (account) {
+
+            }, function () {
+
+            })
+        }
+
+    }]);
+
+    app.register.controller('exportProductCtrl', ['$scope', '$modalInstance', 'account', function($scope, $modalInstance, account) {
+        $scope.cancel = function () {
+            $modalInstance.dismiss();
+        }
+    }]);
+
+    app.register.controller('moreInfoCtrl', ['$scope', '$modalInstance', 'titleInShow', function ($scope, $modalInstance, titleInShow) {
+
+        $scope.allTitle = [{titleName : '商家ID'}, {titleName : '商家名称'}, {titleName : '产品信息'}, {titleName : 'SKU编码'},
+            {titleName : '产品编号'}, {titleName : '封装'}, {titleName : '梯度'}, {titleName : '单价'}, {titleName : '交期(天)'},
+            {titleName : '包装'}, {titleName : '包装数量'}, {titleName : '起订量'}, {titleName : '拆包售卖'}, {titleName : '在售数量'},
+            {titleName : '锁库数'}, {titleName : '冻结数量'}, {titleName : '库存总数'}, {titleName : '在售状态'}, {titleName : '销售方式'},
+            {titleName : '创建人'}, {titleName : '创建时间'}, {titleName : '产品类型'}, {titleName : '图片类型'}, {titleName : '产品图片'}];
+
+        var initTitleInfo = function () {
+            angular.forEach($scope.allTitle, function (item) {
+                if (titleInShow[item.titleName]) {
+                    item.choosed = true;
+                }
+            })
+        };
+        initTitleInfo();
+
+        var getChooseInfo = function () {
+            $scope.titleSet = [];
+            angular.forEach($scope.allTitle, function (item) {
+                if (item.choosed) {
+                    $scope.titleSet.push(item);
+                }
+            })
+        };
+
+        $scope.ensureAddAccount = function () {
+            getChooseInfo();
+            $modalInstance.close($scope.titleSet);
+        };
+
+        $scope.cancel = function () {
+            $modalInstance.dismiss();
+        }
+    }]);
+
+    app.register.controller('AuditCtrl', ['$scope', 'goods', 'info', 'toaster', '$modalInstance', 'GoodsModifyInfo', function($scope, goods, info, toaster, $modalInstance, GoodsModifyInfo) {
+        $scope.auditGoods = goods;
+        $scope.modifyList = info;
+        $scope.hasAuditTwo = false;
+        $scope.errorMsg = '';
+        $scope.otherMessage = '';
+        $scope.errorArray = ['价格异常', '图片违规', '基本信息有误', '断缺货'];
+
+        $scope.cancel = function () {
+            $modalInstance.dismiss();
+        };
+
+        $scope.toggleAudit = function (type) {
+            $scope.hasAuditTwo = type
+        };
+        
+        $scope.changeType = function (type) {
+            $scope.errorType = type;
+        };
+
+        var countLength = function (string) {
+            return string.replace(/[^\x00-\xff]/g, '**').length;
+        };
+
+        var cutOutString = function (str, length) {
+            for (var i = 1; i <= str.length; i++) {
+                if (countLength(str.substr(0, i)) > length){
+                    str = str.substr(0, i-1);
+                    break;
+                }
+            }
+            return str;
+        };
+
+        $scope.inputMessage = function () {
+            if ($scope.otherMessage) {
+                $scope.otherMessage = cutOutString($scope.otherMessage, 30);
+            }
+        };
+
+        $scope.ensureAudit = function (pass) {
+            if (!pass) {
+                if (!$scope.errorType) {
+                    toaster.pop("info", "您尚未选择下架原因");
+                    return;
+                }
+                if ($scope.errorType == 5) {
+                    if (!$scope.otherMessage || countLength($scope.otherMessage) < 2) {
+                        toaster.pop("info", "原因至少要填写2个字");
+                        return;
+                    }
+                }
+                if ($scope.errorType == 5) {
+                    $scope.errorMsg = $scope.otherMessage;
+                } else {
+                    $scope.errorMsg = $scope.errorArray[$scope.errorType - 1];
+                }
+            }
+            GoodsModifyInfo.auditedGoods({batchCode:goods.batchCode,pass:pass,message:$scope.errorMsg}, {}, function () {
+                toaster.pop("info", "审核完毕");
+                $modalInstance.close();
+            })
+        };
+
+    }]);
+
+    app.register.controller('journalCtrl', ['$scope', 'goods', 'toaster', 'ngTableParams', 'BaseService', 'GoodsHistory', 'GoodsModifyInfo', '$modalInstance', function($scope, goods, toaster, ngTableParams, BaseService, GoodsHistory, GoodsModifyInfo, $modalInstance) {
+        $scope.tabs = 'basic';
+
+        // 日期选择框部分
+        $scope.condition = [{open: false},{open: false} ];
+        $scope.openDatePicker = function ($event, item, openParam) {
+            $event.preventDefault();
+            $event.stopPropagation();
+            openParam === 0 ? $scope.condition[1].open = false : $scope.condition[0].open = false;
+            item[openParam].open = !item[openParam].open;
+        };
+        $scope.onDateCondition = function (bool) {
+            if (bool === 1) {
+               if ($scope.startDate && !$scope.endDate) {
+                   var nowTime = new Date();
+                   $scope.endDate = new Date(nowTime.getFullYear(), nowTime.getMonth(), nowTime.getDate());
+                   if ($scope.endDate.getTime() == $scope.startDate.getTime()) {
+                       $scope.endDate = new Date($scope.endDate.getTime() + 86400000);
+                   }
+               }
+               if ($scope.startDate && $scope.endDate) {
+                   if($scope.startDate.getTime() > $scope.endDate) {
+                       $scope.endDate = new Date($scope.startDate.getTime() + 86400000)
+                   }
+               }
+            } else if (bool === 2) {
+                if ($scope.startDate && $scope.endDate) {
+                   $scope.startDate = new Date($scope.endDate.getTime() - 86400000);
+                }
+            }
+        };
+
+        $scope.convertTab = function (tab) {
+            $scope.tabs = tab;
+            $scope.startDate = null;
+            $scope.endDate = null;
+            $scope.keyword = null;
+        };
+
+        $scope.search = function (tab) {
+            switch (tab) {
+                case 'basic':
+                    $scope.ModifyDetailTableParams.page(1);
+                    $scope.ModifyDetailTableParams.reload();
+                    break;
+                case 'sell':
+                    $scope.ModifyDetailTableParams.page(1);
+                    $scope.ModifyDetailTableParams.reload();
+                    break;
+                case 'smt':
+                    $scope.historyTableParams.page(1);
+                    $scope.historyTableParams.reload();
+                    break;
+                case 'audit':
+                    $scope.auditedTableParams.page(1);
+                    $scope.auditedTableParams.reload();
+                    break;
+            }
+        };
+
+        $scope.historyStatus = {
+            '上架' : '上架',
+            '发布商品' : '上架',
+            '下架商品' : '下架',
+            '批量下架公司产品' : '下架'
+        };
+
+        var initQueryParams = function (param) {
+            if ($scope.startDate) {
+                param.startDate = $scope.startDate.getTime();
+            }
+            if ($scope.endDate) {
+                param.endDate = $scope.endDate.getTime();
+            }
+            if ($scope.keyword) {
+                param.keyword = $scope.keyword;
+            }
+        };
+
+        // 获取分页GoodsHistory数据
+        $scope.historyTableParams = new ngTableParams({
+            page: 1,
+            count: 3,
+            sorting: {
+                operateDate : 'DESC'
+            }
+        }, {
+            total: 0,
+            getData: function ($defer, params) {
+                var param = BaseService.parseParams(params.url());
+                param.batchCode = goods.batchCode;
+                initQueryParams(param);
+                GoodsHistory.findDataOfUpAndDown(param, function (data) {
+                    $scope.historyList = data.content;
+                    params.total(data.totalElements);
+                    $defer.resolve(data.content);
+                }, function () {
+                    toaster.pop('error', '获取数据失败')
+                })
+            }
+        });
+
+        $scope.auditedTableParams = new ngTableParams({
+            page: 1,
+            count: 3,
+            sorting: {
+                updateTime : 'DESC'
+            }
+        }, {
+            total: 0,
+            getData: function ($defer, params) {
+                var param = BaseService.parseParams(params.url());
+                param.batchCode = goods.batchCode;
+                initQueryParams(param);
+                GoodsModifyInfo.getPageModifyInfo(param, function (data) {
+                    $scope.auditedList = data.content;
+                    params.total(data.totalElements);
+                    $defer.resolve(data.content);
+                }, function () {
+                    toaster.pop('error', '获取数据失败')
+                })
+            }
+        });
+
+        $scope.ModifyDetailTableParams = new ngTableParams({
+            page: 1,
+            count: 3,
+            sorting: {
+                updateTime : 'DESC'
+            }
+        }, {
+            total: 0,
+            getData: function ($defer, params) {
+                var param = BaseService.parseParams(params.url());
+                param.batchCode = goods.batchCode;
+                initQueryParams(param);
+
+                GoodsModifyInfo.getPageModifyDetail(param, function (data) {
+                    $scope.detailList = data.content;
+                    params.total(data.totalElements);
+                    $defer.resolve(data.content);
+                }, function () {
+                    toaster.pop('error', '获取数据失败')
+                })
+            }
+        });
+
+        $scope.cancel = function () {
+            $modalInstance.dismiss();
+        }
+    }]);
+
+    app.register.controller('soleOutCtrl', ['$scope', 'batchArray', 'Goods', 'toaster', '$modalInstance', function($scope, batchArray, Goods, toaster, $modalInstance) {
+        $scope.errorMsg = '';
+        $scope.otherMessage = '';
+        $scope.errorArray = ['价格异常', '图片违规', '基本信息有误', '短缺货'];
+
+        var countLength = function (string) {
+            return string.replace(/[^\x00-\xff]/g, '**').length;
+        };
+
+        var cutOutString = function (str, length) {
+            for (var i = 1; i <= str.length; i++) {
+                if (countLength(str.substr(0, i)) > length){
+                    str = str.substr(0, i-1);
+                    break;
+                }
+            }
+            return str;
+        };
+
+        $scope.inputMessage = function () {
+            if ($scope.otherMessage) {
+                $scope.otherMessage = cutOutString($scope.otherMessage, 30);
+            }
+        };
+
+        $scope.cancel = function () {
+            $modalInstance.dismiss();
+        };
+
+        $scope.changeType = function (type) {
+            $scope.errorType = type;
+        };
+
+        $scope.ensureDown = function () {
+            if (!$scope.errorType) {
+                toaster.pop("info", "您尚未选择下架原因");
+                return;
+            }
+            if ($scope.errorType == 5) {
+                if (!$scope.otherMessage || countLength($scope.otherMessage) < 2) {
+                    toaster.pop("info", "原因至少要填写2个字");
+                    return;
+                }
+            }
+            if ($scope.errorType == 5) {
+                $scope.errorMsg = $scope.otherMessage;
+            } else {
+                $scope.errorMsg = $scope.errorArray[$scope.errorType - 1];
+            }
+
+            if (!$scope.errorMsg || $scope.errorMsg.length == 0) {
+                toaster.pop("info", "您尚未选择下架原因");
+                return;
+            }
+            var batchs = batchArray.join(",");
+            Goods.offShelfGoodsByProvider({batchCodes:batchs, downMsg:$scope.errorMsg}, {}, function(map){
+                if (map.success) {
+                    toaster.pop('success', '下架成功');
+                    $modalInstance.close();
+                } else {
+                    toaster.pop('error', map.message);
+                }
+            }, function() {
+                toaster.pop('error', '下架失败');
+            });
+        };
+
+    }]);
+    app.register.controller('showContrastImgCtrl', ['$scope', 'img', '$modalInstance', function ($scope, img, $modalInstance) {
+        $scope.showImgs = img;
+        $scope.cancel = function () {
+            $modalInstance.dismiss();
+        }
+    }]);
+
+    //器件选择功能方法
+    app.register.factory('TreeData', function() {
+        return function (tree) {
+            var me = this;
+            me.$data = tree;
+        }
+    })
+})

+ 24 - 2
src/main/webapp/resources/js/common/query/goods.js

@@ -7,15 +7,31 @@ define([ 'ngResource' ], function() {
 			* 获取分页面的GOODS数据(后台数据 产品管理部分)
 			 * start wangcz
 			* */
+            // 获取超级后台在售产品管理数据
 			loadGoodsList: {
-				url: 'trade/goods/background/page',
+				url: '/trade/goods/background/page',
 				method: 'POST'
 			},
-			// 获取上传产品详情列表数据
+			// 获取超级后台产品管理数据
+            loadBrandProductsList: {
+                url: '/trade/products/background/page',
+                method: 'POST'
+            },
+			// 获取商家产品详情列表数据
 			loadUploadProductDetail: {
 				url: '/store-service/storeinfo',
 				method: 'GET'
 			},
+			// 获取品牌产品数
+            loadBrandProductsCount: {
+                url: '/trade/goods/brandProductsCount/page',
+                method: 'GET'
+            },
+			// 获取品类产品数
+            loadKindProductsCount: {
+                url: '/trade/goods/kindProductsCount/page',
+                method: 'GET'
+            },
 			/**
 			 * end  wangcz
 			 * */
@@ -38,10 +54,16 @@ define([ 'ngResource' ], function() {
 				method : 'GET',
 				isArray : true
 			},
+			// 查询在售产品详情接口
 			findOneById : {
 				url : 'trade/goods/one',
 				method : 'GET'
 			},
+			// 查询产品详情接口
+            findProductsOneById : {
+                url : 'trade/products/one',
+                method : 'GET'
+            },
 			//取得有效的简化的消息
 			findSimpleAvailableByUuid : {
 				url : 'trade/goods/simple/byUuidAndCurrency',

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

@@ -203,7 +203,11 @@ define([ 'ngResource' ], function() {
 			isPcb: {
 				url: 'api/store-service/ispcb',
 				method: 'GET'
-			}
+			},
+            storeCheck: {
+                url: '/store-service/check',
+                method: 'put'
+            },
         });
     }]).factory('ConsignmentAgreementRecord', ['$resource', 'BaseService', function ($resource, BaseService) {
     	// 自营转寄售协议,同意操作记录

+ 1 - 1
src/main/webapp/resources/js/sso/controllers/rolePermissionCtrl.js

@@ -7,7 +7,7 @@ define(['app/app'], function (app) {
     app.register.controller('rolePermissionCtrl', ['$scope', '$rootScope', 'Enterprise', 'User', 'toaster', '$modal', 'BaseService', 'ngTableParams', '$http', 'AuthenticationService', '$stateParams','AccountResource','AccountRole', 'Authority', 'B2bAccountRole', 'B2bAccountUser', function ($scope, $rootScope, Enterprise, User, toaster, $modal, BaseService, ngTableParams, $http, AuthenticationService, $stateParams, AccountResource, AccountRole, Authority, B2bAccountRole, B2bAccountUser) {
         $rootScope.active = 'sso_permission';
         document.title = '角色权限';
-        $scope.tab = 'b2c';
+        $scope.tab = 'b2b';
         $scope.addingUser = false;
         $scope.setAddingUser = function (status) {
             $scope.addingUser = status;

+ 6 - 0
src/main/webapp/resources/js/usercenter/app.js

@@ -459,6 +459,12 @@ define([ 'angularAMD', 'ui.router', 'ui-bootstrap', 'ngLocal', 'ngTable', 'commo
             templateUrl : 'static/view/usercenter/forstore/product_upload.html',
             controllerUrl : "app/controllers/forstore/product_upload_ctrl",
             controller : 'productUploadCtrl'
+        })).state('single_entry', angularAMD.route({
+            url: "/single_entry",
+			title: '产品录入',
+            templateUrl: "static/view/usercenter/forstore/single_entry.html",
+            controller: 'singleEntryCtrl',
+            controllerUrl: 'app/controllers/forstore/single_entry_ctrl'
         })).state('buyer_material', angularAMD.route({
             title : '物料资料产品管理部分',
             url : '/buyer_material',

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

@@ -240,7 +240,7 @@ define(['app/app', 'clipboard', 'QRCode'], function (app, clipboard, QRCode) {
                         ? $scope.startDate.getTime() : null;
                     param.endDate = $scope.endDate ? $scope.endDate.getTime()
                         : null;
-                    param.overdue =$scope.vendorType === 'self' ? '0' : '1'
+                    // param.overdue =$scope.vendorType === 'self' ? '0' : '1'
                     $http({
                       method: 'get',
                       dataType: 'json',

+ 718 - 0
src/main/webapp/resources/js/usercenter/controllers/forstore/single_entry_ctrl.js

@@ -0,0 +1,718 @@
+define(['app/app', 'jquery-uploadify'], function(app) {
+  'use strict';
+  app.register.controller('singleEntryCtrl', ['$scope', 'Loading', '$rootScope', 'Material', 'toaster', 'ComponentActive', 'Enterprise', '$q', 'NumberService', '$location', '$stateParams', 'Search', '$modal', 'ComponentActiveAPI', 'BrandSubmit', 'BrandActiveAPI', 'DistributionRule', 'prodRepositoryService', 'AuthenticationService', 'StoreInfo', 'ProductServiceQuery', 'StoreCms', 'ByteCountService', 'Goods', 'UASBatchPutOnPropertyServices', '$filter', '$upload', '$http', function($scope, Loading, $rootScope, Material, toaster, ComponentActive, Enterprise, $q, NumberService, $location, $stateParams, Search, $modal, ComponentActiveAPI, BrandSubmit, BrandActiveAPI, DistributionRule, prodRepositoryService, AuthenticationService, StoreInfo, ProductServiceQuery, StoreCms, ByteCountService, Goods, UASBatchPutOnPropertyServices, $filter, $upload, $http) {
+    $rootScope.active = 'product_upload';
+    document.title = '买家产品库-单个录入';
+    $scope.tab = 'single_entry';
+    $scope.packageArray = ["Bulk-散装", "Reel-卷装", "Tape/Reel-编带", "Tray-盘装", "Tube-管装", "盒装", "袋装", "罐装", "瓶装", "桶装", "箱装", "其他"];
+    $scope.batch = {};
+
+    function initInfo() {
+      $scope.Regul = {
+        packaging: '其他',
+        Regulpic: 'static/img/vendor/images/upload.png',
+        Ischange: false,
+        iniUrlImg: 'static/img/vendor/images/upload.png',
+        RegulImg: 'static/img/vendor/images/upload.png',
+        prices: [{'start': 1, rMBPrice: ''}],
+        // minPackQty: 1,
+        minDelivery: 1,
+        maxDelivery: 10,
+        dateArea: 'formMe',
+        minBuyQty: 1,
+        breakUp: false
+      }
+    }
+    function initError() {
+      $scope.objError = {
+        pbranden: false,
+        kind: false,
+        pcmpcode: false,
+        spec: false,
+        minDelivery: false,
+        maxDelivery: false
+        // OnePrice: false
+        // minPackQty: false
+      }
+      for (var i = 0; i < $scope.Regul.prices.length; i++) {
+        $scope.Regul.prices[i].priceInvalid = false
+      }
+    }
+
+    initInfo()
+    initError()
+
+    //获取登录的信息
+    var getAuthentication = function () {
+      return AuthenticationService.getAuthentication().success(function(data) {
+        if(data && data.enterprises) {
+          data.enterprise = data.enterprises[data.enterprises.length - 1];
+          if(data.enterprises.length > 1) {
+            var enSelect = [];
+            angular.forEach(data.enterprises, function(e){
+              if(e.current)
+                data.enterprise = e;
+              else
+                enSelect.push(e);
+            });
+            data.enSelect = enSelect;
+          }
+        }
+        $rootScope.userInfo = data;
+      }).error(function(response) {
+        toaster.pop('info', '获取定单的信息' + response);
+      });
+    };
+    //判断是否是商城管理公司,是否可以选择自营。
+    $q.all([getAuthentication()]).then(function() {
+      //获取店铺的信息
+      StoreInfo.getStoreInfoByEnuu({enUU : $rootScope.userInfo.enterprise.uu}, function(data) {
+        $scope.storeInfo = data;
+        if(!data.uuid || data.storeName.indexOf('优软测试二') > -1 || data.storeName.indexOf('优软商城') > -1) {
+          $scope.batch.sellType = 'UAS';
+          $scope.batch.selfSellEabled = false;
+        }else {
+          $scope.batch.sellType = 'self';
+          $scope.batch.selfSellEabled = true;
+        }
+        var selfSale = ($scope.storeInfo.uuid != 'undefind' && $scope.storeInfo.uuid !== '33069557578d44e69bd91ad12d28a8d4' && ($scope.storeInfo.storeName && $scope.storeInfo.storeName.indexOf('优软测试二') < 0 && $scope.storeInfo.storeName.indexOf('优软商城') < 0)) ? 1: 0
+        $scope.Regul.dateArea = selfSale === 1 ? 'formMe' : 'autoMonth' // 自营还是销售
+        // 销售方式
+
+        $scope.Regul.selfSale = selfSale
+      }, function(response) {
+        toaster.pop('error', '获取店铺的信息失败, ' + response.data);
+      });
+    });
+
+    // 品牌change事件
+    $scope.onBrandChange = function(brand, index) {
+      $rootScope.singleEntryInfo = true
+      $scope.objError.pbranden = false
+      if (index === undefined) {
+        if (brand === '') {
+          $scope.Regul.BrandList = []
+          return false
+        }
+        $scope.Regul.BrandList = $scope.getSimilarBrands(brand).$$state
+      } else {
+        if (brand && getRealLen(brand) > 50) {
+          $scope.replaceMaterialList[index].ptrBranden = cutOutString(brand,
+              50);
+        } else if ((/[^\x00-\xff]/g).test(brand)) {
+          var chineseIndex = -1;
+          for (var i = 0; i < brand.length; i++) {
+            if ((/[^\x00-\xff]/g).test(brand.charAt(i))
+                && !(/[\u4e00-\u9fa5]/).test(brand.charAt(i))) {
+              chineseIndex = i;
+              break;
+            }
+          }
+          if (chineseIndex > -1) {
+            $scope.replaceMaterialList[index].ptrBranden = brand.substring(0,
+                chineseIndex);
+          }
+        } else {
+          if (!brand) {
+            $scope.setShowSimilarBrandList(false, index);
+          } else {
+            $scope.getSimilarBrand(brand, index);
+          }
+        }
+      }
+    }
+
+    $scope.RegulKindBlur  = function() {
+      $rootScope.singleEntryInfo = true
+      $scope.objError.kind = false
+    }
+
+    /**
+     * 物料编辑品牌输入框失去焦点
+     *
+     * @param name    品牌名称
+     */
+    $scope.RegulonBrandBlur = function(name) {
+      $rootScope.singleEntryInfo = true
+      // setTimeout(function() {
+        if (name === '') {
+          $scope.Regul.BrandList = []
+        } else {
+          $scope.Regul.pbranden = $scope.Regul.BrandList && $scope.Regul.BrandList.value && $scope.Regul.BrandList.value[0].nameEn || name
+          $scope.Regul.BrandList = []
+        }
+      // }, 300)
+    }
+
+    $scope.stopMounseDown = function(e) {
+      var _e = e || window.event
+      _e.preventDefault()
+    }
+
+    $scope.setBrand = function(brand, index) {
+      $rootScope.singleEntryInfo = true
+      if (index === undefined) {
+        $scope.Regul.pbranden = brand
+        $scope.Regul.BrandList = []
+      } else {
+        $scope.replaceMaterialList[index].ptrBranden = brand;
+        $scope.setShowSimilarBrandList(false, index);
+      }
+    }
+
+    // 获取品牌联想词
+    $scope.getSimilarBrands = function(keyword) {
+      if (keyword) {
+        return Search.getSimilarBrands({
+          keyword: keyword
+        }).$promise.then(function(data) {
+          return data.map(function(item) {
+            return item;
+          });
+        });
+      }
+    }
+    ;
+
+    $scope.onCodeChange = function(code, index) {
+      $rootScope.singleEntryInfo = true
+      $scope.objError.pcmpcode = false
+      if (index === undefined) {
+        if (code === '') {
+          $scope.Regul.CodeList = []
+          return false
+        }
+        if ((/[^\x00-\xff]/g).test(code)) {
+          $scope.Regul.pcmpcode = ''
+          $scope.Regul.CodeList = []
+          return false
+        }
+        $scope.Regul.CodeList = getSimilarCode(code).$$state
+      }
+    }
+    /**
+     * 编辑物料型号输入框失去焦点
+     *
+     * @param name    型号名称
+     */
+    $scope.RegulonCodeBlur = function(name) {
+      $rootScope.singleEntryInfo = true
+      if (name === '') {
+        $scope.Regul.CodeList = []
+      } else {
+        $scope.Regul.pcmpcode = $scope.Regul.CodeList.value && $scope.Regul.CodeList.value[0].pcmpcode || name
+        $scope.Regul.pbranden = $scope.Regul.CodeList.value && $scope.Regul.CodeList.value[0].pbranden || $scope.Regul.pbranden
+        $scope.Regul.spec = $scope.Regul.CodeList.value && $scope.Regul.CodeList.value[0].pbranden || $scope.Regul.spec
+        $scope.Regul.kind = $scope.Regul.CodeList.value && $scope.Regul.CodeList.value[0].pbranden || $scope.Regul.kind
+        $scope.Regul.CodeList = []
+      }
+    }
+    $scope.setCode = function(code, index) {
+      $rootScope.singleEntryInfo = true
+        $scope.Regul.pcmpcode = code.pcmpcode
+
+      $scope.Regul.pbranden = code.pbranden
+      $scope.Regul.spec = code.spec
+      $scope.Regul.kind = code.kind
+      $scope.Regul.CodeList = []
+    }
+
+    var countLength = function(string) {
+      return string.replace(/[^\x00-\xff]/g, '**').length;
+    };
+    /**
+     * 获取型号联想词
+     *
+     * @param name    品牌名称
+     */
+    function getSimilarCode(name) {
+      if (name) {
+        return Material.getSimilarComponents({keyword: name}).$promise.then(
+            function (data) {
+              console.log(data)
+              return data.map(function (item) {
+                return item;
+              });
+            });
+      }
+    }
+    var cutOutString = function(str, length) {
+      for (var i = 1; i <= str.length; i++) {
+        if (countLength(str.substr(0, i)) > length) {
+          str = str.substr(0, i - 1);
+          break;
+        }
+      }
+      return str;
+    };
+
+    $scope.showClickText = function(goods, item) {
+      goods.packaging = item;
+    }
+
+    // $scope.setPriceMinPackAmount = function(num) {
+    //   $rootScope.singleEntryInfo = true
+    //   if (num && num.indexOf('.') > -1) {
+    //     toaster.pop('warning', '提示', '最小包装数不能存在小数点')
+    //     $scope.Regul.minPackQty = 1
+    //   } else {
+    //     $scope.Regul.minPackQty = num
+    //   }
+    //   $scope.objError.minPackQty = false
+    // }
+
+
+
+    // $scope.setReserve = function(num) {
+    //   $rootScope.singleEntryInfo = true
+    //   if (num && num.indexOf('.') > -1) {
+    //     toaster.pop('warning', '提示', '库存数量不能存在小数点')
+    //     $scope.Regul.reserve = 1
+    //   } else {
+    //     $scope.Regul.reserve = num
+    //   }
+    //   $scope.objError.reserve = false
+    // }
+
+    // $scope.setOnePrice = function(num) {
+    //   $rootScope.singleEntryInfo = true
+    //   $scope.Regul.OnePrice = num
+    //   $scope.objError.OnePrice = false
+    // }
+    // 修改规格书
+    $scope.onUploadSuccess = function(data) {
+      $rootScope.singleEntryInfo = true
+      $scope.Regul.Regulpic = data.path;
+      $scope.Regul.Ischange = true
+    };
+
+    // 删除规格书
+    $scope.deleteRegulImg = function(pom) {
+      $scope.Regul[pom] = 'static/img/vendor/images/upload.png'
+      $scope.Regul.Ischange = false
+    }
+
+    // 修改物料图片
+    $scope.onUploadSuccessProduct = function(data) {
+      $scope.Regul.RegulImg = data.path;
+    }
+
+    /*查看大图*/
+    $scope.showImg = function(imgUrl, event) {
+      console.log(1)
+      var src = imgUrl, box = $('#image-box'), modal = $('.modal-content');
+      box.show();
+      box.find('img').attr('src', src);
+      box.find('a').click(function(){
+        box.hide();
+      });
+      box.dblclick(function(){
+        box.hide();
+      });
+    }
+
+    // 最小起订量修改 梯度1的值等于最小起订量
+    $scope.ProductupdateStartNumber = function(productUpOff) {
+      // if (parseInt(productUpOff) >= parseInt($scope.Regul.prices[0].start)) {
+      //   $scope.Regul.prices[0].start = $scope.Regul.minPackQty
+      //   return false
+      // }
+      $scope.Regul.prices[0].start = parseInt(productUpOff)
+    }
+    // 最小起订量失去焦点
+    $scope.ProductblurMinBuyQty = function(MinBuyQty) {
+      if (!MinBuyQty) return
+      if (!$scope.Regul.minBuyQty || $scope.Regul.minBuyQty === '') {
+        toaster.pop('warning', '提示', '最小包装数未编辑导致无法上架');
+        return
+      }
+      $rootScope.singleEntryInfo = true
+      // if (!$scope.Regul.breakUp && $scope.Regul.minBuyQty !== $scope.Regul.minPackQty) {
+      //   if ($scope.Regul.minBuyQty % $scope.Regul.minPackQty !== 0) {
+      //     $scope.Regul.minBuyQty = $scope.Regul.minPackQty
+      //     toaster.pop('warning', '提示', '不可拆卖时,起订量必须是包装数量的倍数');
+      //     $scope.ProductupdateStartNumber($scope.Regul.minBuyQty)
+      //   }
+      // }
+    }
+
+    /**
+     * @param min 最小值
+     * @param max 最大值
+     * @param isMin 传入的是否是最小值
+     * @param commodity 批次信息
+     */
+    $scope.isInt = /^[0-9]*[1-9][0-9]*$/;
+    $scope.changeDelivery = function(min, max, isMin) {
+      var day = -1;
+      if (isMin) {
+        if (min && $scope.isInt.test(min)) {
+          day = min;
+        } else {
+          if (typeof min == 'undefined') {
+            return;
+          }
+          if (!$scope.isInt.test(min)) {
+            toaster.pop('warning', '提示', '交期请输入1-999的整数');
+            $scope.objError.minDelivery = true;
+          }
+          return;
+        }
+
+      } else {
+        if (max && $scope.isInt.test(max)) {
+          day = max;
+        } else {
+          if (typeof max == 'undefined') {
+            return;
+          }
+          if (!$scope.isInt.test(max)) {
+            toaster.pop('warning', '提示', '交期只能填写1-999之间的整数值');
+            $scope.objError.maxDelivery = true;
+          }
+          return;
+        }
+      }
+      if (day > 999 || day < 1) {
+        if (isMin) {
+          $scope.objError.minDelivery = true;
+        } else {
+          $scope.objError.maxDelivery = true;
+        }
+        toaster.pop('warning', '提示', '交期的值必须在1-999天');
+        return
+      }
+      if (Number(min) > Number(max)) {
+        $scope.objError.minDelivery = true;
+        $scope.objError.maxDelivery = true;
+        toaster.pop('warning', '提示', '最短交期应小于等于最长交期');
+        return;
+      }
+      $scope.objError.minDelivery = false;
+      $scope.objError.maxDelivery = false;
+    }
+    ;
+
+    // 可拆卖 上下架开关
+    $scope.productToggleIsBreadUp = function(pom) {
+      $scope.Regul[pom] = !$scope.Regul[pom]
+      if (pom === 'breakUp') {
+        // 重置最小起订量
+        $scope.ProductblurMinBuyQty($scope.Regul.minBuyQty)
+      }
+    }
+
+    // 选择寄售还是自营
+    $scope.productChangeSelfType = function(num, _type) {
+      if ((!$scope.storeInfo.uuid || $scope.storeInfo.uuid === '33069557578d44e69bd91ad12d28a8d4') && _type === 'formMe'){
+        toaster.pop('warning','提示','您还未开店铺,不能选择自营')
+        $scope.Regul.dateArea = 'autoMonth'
+        return
+      }
+      $scope.Regul.dateArea = _type
+
+    }
+
+    /**
+     * 判断价格是否合理,只设置验证的结果
+     * @param prices 分段价格
+     * @param price 对应的价格
+     * @param index 索引
+     */
+    $scope.changePrices = function(prices, price, index) {
+      prices[index].priceInvalid = false;
+      if (!prices || !prices[index] || !price) {
+        return;
+      }
+      if (isNaN(price)) {
+        prices[index].priceInvalid = true;
+        toaster.pop('warning', '提示', '单价必须是大于0的数字');
+        return;
+      }
+      if (new Number(price) <= 0) {
+        prices[index].priceInvalid = true;
+        toaster.pop('warning', '提示', '单价必须是大于0的数字');
+        return;
+      }
+      if (price.toString().indexOf('.') > -1) {
+        var arr = price.toString().split(".");
+        if (arr[0].length > 4 || arr[1].length > 6) {
+          prices[index].priceInvalid = true;
+          return;
+        }
+      } else {
+        if (price.toString().toString().length > 4) {
+          prices[index].priceInvalid = true;
+          return;
+        }
+      }
+    }
+    ;
+    /**
+     * 删除对应的分段.
+     * @param commodity
+     */
+    $scope.productDeleteFragment = function(goods, index) {
+      if (index > -1 && index < goods.length) {
+        if (goods.length < 2) {
+          toaster.pop('warning', "提示", "商品至少需要一个分段");
+          return;
+        }
+        var price = goods.splice(index, 1)
+      }
+    }
+    ;
+
+    /**
+     * 增加对应的分段。
+     * @param commodity
+     */
+    $scope.productAddFragment = function(goods) {
+      if (goods.length > 2) {
+        toaster.pop('warning', "提示", "商品最多只能有三个分段");
+        return;
+      }
+      goods.push({rMBPrice: '', start: ''})
+
+    }
+    /**
+     * 分段失去焦点。
+     * @param commodity
+     */
+    $scope.productPriceInfoBlur = function(index, val) {
+      if (index > 0) {
+        if ($scope.Regul.prices[index].start <= $scope.Regul.prices[index - 1].start) {
+          toaster.pop('warning', '提示', '输入值会导致梯度重叠,请重新修改')
+          $scope.Regul.prices[index].start = ''
+          return
+        }
+        $scope.Regul.prices[index].start = val
+      } else {
+        $scope.Regul.prices[index].start = val
+      }
+    }
+
+
+    // $scope.objError = {
+    //   pbranden: false,
+    //   kind: false,
+    //   pcmpcode: false,
+    //   spec: false,
+    //   minDelivery: false,
+    //   maxDelivery: false
+    //   minBuyQty: false
+    // }
+    // 编辑上下架保存按钮
+    $scope.productSave = function() {
+      initError()
+
+      if ($scope.Regul.pbranden === '' || !$scope.Regul.pbranden) {
+        toaster.pop('warning','提示', '品牌为必填项')
+        $scope.objError.pbranden = true
+        return;
+      }
+      if ($scope.Regul.kind === '' || !$scope.Regul.kind) {
+        toaster.pop('warning','提示', '物料名称为必填项')
+        $scope.objError.kind = true
+        return;
+      }
+      if ($scope.Regul.pcmpcode === '' || !$scope.Regul.pcmpcode) {
+        toaster.pop('warning','提示', '型号为必填项')
+        $scope.objError.pcmpcode = true
+        return;
+      }
+      // if ($scope.Regul.reserve === '' || !$scope.Regul.reserve) {
+      //   toaster.pop('warning','提示', '库存数量不能为空')
+      //   $scope.objError.reserve = true
+      //   return;
+      // }
+
+      // if ($scope.Regul.reserve <= 0) {
+      //   toaster.pop('warning','提示', '库存数量必须大于等于1')
+      //   $scope.objError.reserve = true
+      //   return;
+      // }
+
+      // if (/\D/.test($scope.Regul.reserve)) {
+      //   toaster.pop('warning','提示', '库存数量只能为正整数')
+      //   $scope.objError.reserve = true
+      //   return;
+      // }
+
+      // if ($scope.Regul.minPackQty && /\D/.test($scope.Regul.minPackQty)) {
+      //   toaster.pop('warning','提示', '最小包装数输入不正确')
+      //   $scope.objError.minPackQty = true
+      //   return;
+      // }
+
+      // if ($scope.Regul.OnePrice && !/^\d+(\.\d+)?$/.test($scope.Regul.OnePrice.trim())) {
+      //   toaster.pop('warning','提示', '成本单价输入不正确')
+      //   $scope.objError.OnePrice = true
+      //   return;
+      // }
+
+      if (!$scope.Regul.minBuyQty || $scope.Regul.minBuyQty === 0) {
+        toaster.pop('warning','提示', '最小起订量必须是大于0的数字')
+        $scope.objError.minBuyQty = true
+        return;
+      }
+      if (!$scope.Regul.minDelivery || !$scope.Regul.maxDelivery) {
+        toaster.pop('warning','提示', '交期不能为空')
+        if (!$scope.Regul.minDelivery) {
+          $scope.objError.minDelivery = true
+        }
+        if (!$scope.Regul.maxDelivery) {
+          $scope.objError.maxDelivery = true
+        }
+        return;
+      }
+      if ($scope.Regul.minDelivery > $scope.Regul.maxDelivery) {
+        toaster.pop('warning','提示','最小交期不能大于最大交期')
+        $scope.objError.minDelivery = true
+        return;
+      }
+      var flag = true
+      for (var i = 0; i < $scope.Regul.prices.length; i++) {
+        // if (!$scope.Regul.prices[i].start
+        //     || !$scope.Regul.prices[i].rMBPrice && $scope.storeInfo.enType !== 'HK' ) {
+        //   toaster.pop('warning', '提示', '价格梯度不能为空')
+        //   flag = false
+        //   $scope.Regul.prices[i].priceInvalid = true
+        //   break;
+        // }
+        // else if (!$scope.Regul.prices[i].start
+        //     || !$scope.Regul.prices[i].uSDPrice && $scope.storeInfo.enType === 'HK') {
+        //   toaster.pop('warning', '提示', '价格梯度不能为空')
+        //   flag = false
+        //   $scope.Regul.prices[i].priceInvalid = true
+        //   break;
+        // }
+        if ($scope.Regul.prices[i + 1] && Number($scope.Regul.prices[i].start) > Number($scope.Regul.prices[i + 1].start)) {
+          toaster.pop('warning','提示','输入值会导致梯度重叠,请重新修改')
+          flag = false
+          break;
+        }
+      }
+      if (!flag) {
+        return
+      }
+      if ($scope.Regul.prices.length === 1) {
+        if ($scope.storeInfo.enType === 'HK') {
+          $scope.Regul.prices[0].uSDNTPrice = ''
+          $scope.Regul.prices[0].end = '999999999'
+        }else {
+          $scope.Regul.prices[0].rMBNTPrice = ''
+          $scope.Regul.prices[0].end = '999999999'
+        }
+      } else {
+        for (var i = 0; i < $scope.Regul.prices.length; i++) {
+          if ($scope.storeInfo.enType === 'HK') {
+            $scope.Regul.prices[i].uSDNTPrice = ''
+            $scope.Regul.prices[i].end = '999999999'
+          }else {
+            $scope.Regul.prices[i].rMBNTPrice = ''
+            $scope.Regul.prices[i].end = '999999999'
+          }
+          if ($scope.Regul.prices[i + 1]) {
+            $scope.Regul.prices[i].end = parseInt(
+                $scope.Regul.prices[i + 1].start) - 1
+          }
+        }
+      }
+
+      // 先判断是自营店铺 还是 寄售店铺
+      // var _selfSale = $scope.productUpOff.goods.selfSale
+      if ($scope.storeInfo.uuid !== '33069557578d44e69bd91ad12d28a8d4') { // 如果是自营店铺
+        if ($scope.Regul.dateArea === 'formMe') { // 用户选择了自营
+          $scope.Regul.selfSale = 1
+        } else if ($scope.Regul.dateArea === 'autoMonth') { // 用户选择了寄售
+          $scope.Regul.selfSale = 0
+        }
+      }
+      var jsonObject = {
+        isPcb: $rootScope.isPcbStore ? 1 : 0,
+        goods: {},
+        product: {}
+      }
+      jsonObject.product = {
+        spec: $scope.Regul.spec, // 规格
+        // minPackQty: $scope.Regul.minPackQty, // 最小包装量
+        erpReserve:  0, //库存
+        cmpCode: $scope.Regul.pcmpcode, //型号
+        brand: $scope.Regul.pbranden,//品牌
+        prodName: $scope.Regul.kind, // 名称
+        // price: $scope.Regul.OnePrice, // 成本单价
+        attachment: $scope.Regul.Ischange ? $scope.Regul.Regulpic : '', // 规格书
+        cmpImg: $scope.Regul.RegulImg !== $scope.Regul.iniUrlImg ? $scope.Regul.RegulImg : '',// 图片
+        packaging: $scope.Regul.packaging // 包装方式
+      }
+      jsonObject.goods =  {
+        minBuyQty: $scope.Regul.minBuyQty, // 最小起订量
+        //分段报价信息
+        prices: $scope.Regul.prices,
+        breakUp: $scope.Regul.breakUp, // 是否拆卖
+        minDelivery: $scope.Regul.minDelivery, // 最短交期
+        maxDelivery: $scope.Regul.maxDelivery,//  最长交期
+        selfSale: $scope.Regul.selfSale, // 销售方式
+      }
+      $rootScope.singleEntryInfo = false
+      Material.importOneMaterail({}, jsonObject, function(data) {
+        if (data.code == 1) {
+          toaster.pop('success', '保存成功');
+          $scope.showProductInfo = true
+        } else {
+          toaster.pop('error', '失败', data.message);
+        }
+      }, function(response) {
+        toaster.pop('error', '失败', response.data);
+      });
+      // Goods.updateGoods(null, $scope.productUpOff.goods, function(data) {
+      //   if (data.code == 1) {
+      //     toaster.pop('success', '保存成功');
+      //     loadData()
+      //   } else {
+      //     toaster.pop('error', '失败', data.message);
+      //   }
+      // }, function(response) {
+      //   toaster.pop('error', '失败', response.data);
+      // });
+    }
+
+    // 新增物料
+    $scope.initProduct = function() {
+        resetPageInfo()
+        $scope.showProductInfo = false
+    }
+
+    // 取消编辑
+    $scope.clearCheckBox = function() {
+      if ($rootScope.singleEntryInfo === true ) {
+        if (confirm('是否放弃本次编辑')) {
+            $rootScope.singleEntryInfo = false
+            resetPageInfo()
+        }
+      } else {
+          resetPageInfo()
+      }
+    }
+
+    // 重置页面数据
+    function resetPageInfo() {
+        initInfo()
+        initError()
+        var selfSale = ($scope.storeInfo.uuid != 'undefind' && $scope.storeInfo.uuid !== '33069557578d44e69bd91ad12d28a8d4' && ($scope.storeInfo.storeName && $scope.storeInfo.storeName.indexOf('优软测试二') < 0 && $scope.storeInfo.storeName.indexOf('优软商城') < 0)) ? 1: 0
+        $scope.Regul.dateArea = selfSale === 1 ? 'formMe' : 'autoMonth' // 自营还是销售
+        // 销售方式
+        $scope.Regul.selfSale = selfSale
+    }
+
+    // document.addEventListener('click', function() {
+    //   $scope.Regul.pcmpcode = $scope.Regul.CodeList&& $scope.Regul.CodeList.value && $scope.Regul.CodeList.value[0].code || name
+    //   $scope.Regul.CodeList = []
+    //   $scope.Regul.pbranden = $scope.Regul.BrandList && $scope.Regul.BrandList.value[0].nameEn
+    //   $scope.Regul.BrandList = []
+    // }, false)
+
+
+  }])
+});

+ 29 - 2
src/main/webapp/resources/js/vendor/controllers/forstore/single_entry.js

@@ -659,8 +659,7 @@ define(['app/app', 'jquery-uploadify'], function(app) {
       Material.importOneMaterail({}, jsonObject, function(data) {
         if (data.code == 1) {
           toaster.pop('success', '保存成功');
-          initInfo()
-          initError()
+          $scope.showProductInfo = true
         } else {
           toaster.pop('error', '失败', data.message);
         }
@@ -679,6 +678,34 @@ define(['app/app', 'jquery-uploadify'], function(app) {
       // });
     }
 
+    // 新增物料
+    $scope.initProduct = function() {
+        resetPageInfo()
+        $scope.showProductInfo = false
+    }
+
+    // 取消编辑
+    $scope.clearCheckBox = function() {
+      if ($rootScope.singleEntryInfo === true ) {
+        if (confirm('是否放弃本次编辑')) {
+            $rootScope.singleEntryInfo = false
+            resetPageInfo()
+        }
+      } else {
+          resetPageInfo()
+      }
+    }
+
+    // 重置页面数据
+    function resetPageInfo() {
+        initInfo()
+        initError()
+        var selfSale = ($scope.storeInfo.uuid != 'undefind' && $scope.storeInfo.uuid !== '33069557578d44e69bd91ad12d28a8d4' && ($scope.storeInfo.storeName && $scope.storeInfo.storeName.indexOf('优软测试二') < 0 && $scope.storeInfo.storeName.indexOf('优软商城') < 0)) ? 1: 0
+        $scope.Regul.dateArea = selfSale === 1 ? 'formMe' : 'autoMonth' // 自营还是销售
+        // 销售方式
+        $scope.Regul.selfSale = selfSale
+    }
+
     // document.addEventListener('click', function() {
     //   $scope.Regul.pcmpcode = $scope.Regul.CodeList&& $scope.Regul.CodeList.value && $scope.Regul.CodeList.value[0].code || name
     //   $scope.Regul.CodeList = []

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

@@ -240,7 +240,7 @@ define(['app/app'], function (app) {
          */
         $scope.checkWeixin = function () {
             var enWeixin = angular.element('.enWeixin').val();
-            if (!/^[0-9a-zA-Z]{6,20}$/.test(enWeixin) && enWeixin) {
+            if (!/^[_\-0-9a-zA-Z]{6,20}$/.test(enWeixin) && enWeixin) {
                 toaster.pop('error', '请输入正确的微信号');
                 return false;
             }

+ 0 - 53
src/main/webapp/resources/view/admin/b2b/manage.html

@@ -1,53 +0,0 @@
-<div class="row-fluid sortable">
-    <div class="box">
-        <div class="box-header well" data-original-title>
-            <i class="icon-user"></i> B2B商务企业列表
-        </div>
-        <div class="box-content">
-            <!-- ng-tableStart -->
-            <div class="fullscreen" style="padding: 10px;">
-                <div class="row">
-                    <div class="col-xs-2">
-                        共<span class="badge" ng-bind="tableParams.total()"></span>条
-                    </div>
-                    <div class="col-sm-4">
-                        <div class="input-group">
-                            <input placeholder="企业名称或UU号进行搜索" class="form-control"
-                                   ng-model="keyword"  ng-search="onSearch()" size="16" type="text">
-                            <span class="input-group-btn">
-								<button class="btn btn-primary" type="button" ng-click="onSearch()">搜索</button>
-							</span>
-                        </div>
-                    </div>
-                </div>
-                <table ng-table="tableParams" class="table table-bordered table-striped" style="margin-top: 10px;">
-                    <thead>
-                    <tr>
-                        <th class="text-center" width="60">序号</th>
-                        <th class="text-center" width="100">UU</th>
-                        <th class="text-center" width="200">企业名称</th>
-                        <th class="text-center" width="300">企业地址</th>
-                        <th class="text-center" width="150">营业执照</th>
-                        <th class="text-center" width="120">注册时间</th>
-                    </tr>
-                    </thead>
-                    <tbody>
-                    <tr ng-repeat="en in $data" ng-click="redirect(en.uu)">
-                        <td class="text-center" ng-bind="$index + 1"></td>
-                        <td class="text-center" ng-bind="en.uu"></td>
-                        <td class="text-center" ng-bind="en.enName"></td>
-                        <td class="text-center" ng-bind="en.enAddress"></td>
-                        <td class="text-center" ng-bind="en.enBussinessCode"></td>
-                        <td class="text-center" ng-bind="en.enDate | date: 'yyyy-MM-dd HH:mm'"></td>
-                    </tr>
-                    <tr ng-if="$data.length == 0">
-                        <td colspan="10" class="text-center" style="line-height: 40px; font-size: 20px;"><i class="fa fa-smile-o fa-lg"></i> 暂未查询到企业信息</td>
-                    </tr>
-                    </tbody>
-                </table>
-            </div>
-            <a id="bottom"></a>
-            <!-- ng-tableEnd -->
-        </div>
-    </div><!--/span-->
-</div><!--/row-->

+ 0 - 5
src/main/webapp/resources/view/admin/index.html

@@ -31,11 +31,6 @@
 					<li><a href="#/product/sailingGoods"> <span
 							class="yellow">8</span> 在售中的产品
 					</a></li>
-					<li>
-						<a href="#/b2b/manage">
-							<span class="green">9</span> b2b管理页面
-						</a>
-					</li>
 					<li>
 						<a href="#/statsData">
 							<span class="red">10</span>数据统计

+ 47 - 0
src/main/webapp/resources/view/admin/product/brandProductsCount.html

@@ -0,0 +1,47 @@
+<div class="row-fluid sortable">
+    <div class="box">
+        <div class="box-header well" data-original-title>
+            <i class="icon-user"></i> 品牌产品数 &nbsp;&nbsp;
+            {{startFormatDate ? '(' + startFormatDate + '---' + endFormatDate + ')' : ''}}
+        </div>
+        <div class="box-content">
+            <!-- ng-tableStart -->
+            <div class="fullscreen" style="padding: 10px;">
+                <div class="row">
+                    <div class="col-xs-2">
+                        共<span class="badge" ng-bind="tableParams.total()"></span>条
+                    </div>
+                    <div class="col-sm-9 text-right">
+                        <div class="btn" role="button">
+                            <a ng-click="exportXls()">导出Excel</a>
+                        </div>
+                        <div class="btn" role="button">
+                            <a href="javascript:history.go(-1)">返回上页</a>
+                        </div>
+                    </div>
+                </div>
+                <table ng-table="tableParams" class="table table-bordered table-striped" style="margin-top: 10px;">
+                    <thead>
+                    <tr>
+                        <th class="text-center" width="80">序号</th>
+                        <th class="text-center">品牌名称</th>
+                        <th class="text-center" width="200">产品数(条)</th>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    <tr ng-repeat="item in $data">
+                        <td class="text-center" ng-bind="$index + 1"></td>
+                        <td class="text-center" ng-bind="item.brand"></td>
+                        <td class="text-center" ng-bind="item.count"></td>
+                    </tr>
+                    <tr ng-if="$data.length == 0">
+                        <td colspan="10" class="text-center" style="line-height: 40px; font-size: 20px;"><i class="fa fa-smile-o fa-lg"></i> 暂未查询到品牌产品相关信息</td>
+                    </tr>
+                    </tbody>
+                </table>
+            </div>
+            <a id="bottom"></a>
+            <!-- ng-tableEnd -->
+        </div>
+    </div>
+</div>

+ 51 - 0
src/main/webapp/resources/view/admin/product/categoryNumber.html

@@ -0,0 +1,51 @@
+<div class="row-fluid sortable">
+    <div class="box">
+        <div class="box-header well" data-original-title>
+            <i class="icon-user"></i> 品类产品数 &nbsp;&nbsp;
+            {{startFormatDate ? '(' + startFormatDate + '---' + endFormatDate + ')' : ''}}
+        </div>
+        <div class="box-content">
+            <!-- ng-tableStart -->
+            <div class="fullscreen" style="padding: 10px;">
+                <div class="row">
+                    <div class="col-xs-2">
+                        共<span class="badge" ng-bind="tableParams.total()"></span>条
+                    </div>
+                    <div class="col-sm-9 text-right">
+                        <div class="btn" role="button">
+                            <a ng-click="exportXls()">导出Excel</a>
+                        </div>
+                        <div class="btn" role="button">
+                            <a href="javascript:history.go(-1)">返回上页</a>
+                        </div>
+                    </div>
+                </div>
+                <table ng-table="tableParams" class="table table-bordered table-striped" style="margin-top: 10px;">
+                    <thead>
+                    <tr>
+                        <th class="text-center" width="80">序号</th>
+                        <th class="text-center" width="250">一级类目</th>
+                        <th class="text-center" width="250">二级类目</th>
+                        <th class="text-center" width="250">三级类目</th>
+                        <th class="text-center" width="250">产品数(条)</th>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    <tr ng-repeat="item in $data">
+                        <td class="text-center" ng-bind="$index + 1"></td>
+                        <td class="text-center" ng-bind="item.firstKind"></td>
+                        <td class="text-center" ng-bind="item.secondKind"></td>
+                        <td class="text-center" ng-bind="item.thirdKind"></td>
+                        <td class="text-center" ng-bind="item.count"></td>
+                    </tr>
+                    <tr ng-if="$data.length == 0">
+                        <td colspan="10" class="text-center" style="line-height: 40px; font-size: 20px;"><i class="fa fa-smile-o fa-lg"></i> 暂未查询到品类产品相关信息</td>
+                    </tr>
+                    </tbody>
+                </table>
+            </div>
+            <a id="bottom"></a>
+            <!-- ng-tableEnd -->
+        </div>
+    </div><!--/span-->
+</div>

+ 55 - 0
src/main/webapp/resources/view/admin/product/merchantProducts.html

@@ -0,0 +1,55 @@
+<div class="row-fluid sortable">
+    <div class="box">
+        <div class="box-header well" data-original-title>
+            <i class="icon-user"></i> 商家产品数 &nbsp;&nbsp;
+            {{startFormatDate ? '(' + startFormatDate + '---' + endFormatDate + ')' : ''}}
+        </div>
+        <div class="box-content">
+            <!-- ng-tableStart -->
+            <div class="fullscreen" style="padding: 10px;">
+                <div class="row">
+                    <div class="col-xs-2">
+                        共<span class="badge" ng-bind="tableParams.total()"></span>条
+                    </div>
+                    <div class="col-sm-9 text-right">
+                        <div class="btn" role="button">
+                            <a ng-click="exportXls()">导出Excel</a>
+                        </div>
+                        <div class="btn" role="button">
+                            <a href="javascript:history.go(-1)">返回上页</a>
+                        </div>
+                    </div>
+                </div>
+                <table ng-table="tableParams" class="table table-bordered table-striped" style="margin-top: 10px;">
+                    <thead>
+                    <tr>
+                        <th class="text-center" width="80">序号</th>
+                        <th class="text-center" width="200">企业名称</th>
+                        <th class="text-center" width="150">企业UU号</th>
+                        <th class="text-center" width="150">开店申请日期</th>
+                        <th class="text-center" width="150">开店审核日期</th>
+                        <th class="text-center" width="150">开店审核人</th>
+                        <th class="text-center" width="200">产品数(条)</th>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    <tr ng-repeat="en in $data">
+                        <td class="text-center" ng-bind="$index + 1"></td>
+                        <td class="text-center" ng-bind="en.storeName"></td>
+                        <td class="text-center" ng-bind="en.enuu"></td>
+                        <td class="text-center" ng-bind="en.applyTime | date: 'yyyy-MM-dd HH:mm'"></td>
+                        <td class="text-center" ng-bind="en.agreeTime | date: 'yyyy-MM-dd HH:mm'"></td>
+                        <td class="text-center" ng-bind="en.agreeName"></td>
+                        <td class="text-center" ng-bind="en.count"></td>
+                    </tr>
+                    <tr ng-if="$data.length == 0">
+                        <td colspan="10" class="text-center" style="line-height: 40px; font-size: 20px;"><i class="fa fa-smile-o fa-lg"></i> 暂未查询到企业信息</td>
+                    </tr>
+                    </tbody>
+                </table>
+            </div>
+            <a id="bottom"></a>
+            <!-- ng-tableEnd -->
+        </div>
+    </div><!--/span-->
+</div>

+ 454 - 431
src/main/webapp/resources/view/admin/product/productManage.html

@@ -1,428 +1,439 @@
 <div id="manage">
-    <div class="container-fluid">
-        <div class="manage-form">
-            <div class="form-top">
-                <div class="form-inline">
-                    <div class="form-group form-group-sm">
-                        <label class="control-label">
-                            型号:
-                            <input class="form-control width140" type="text" ng-model="goodsFilter.code" placeholder="型号">
-                        </label>
-                    </div>
-                    <div class="form-group form-group-sm">
-                        <label class="control-label">
-                            商家:
-                            <input class="form-control width140" type="text" ng-model="goodsFilter.store" placeholder="商家ID/商家名称">
-                        </label>
-                    </div>
-                    <div class="form-group form-group-sm">
-                        <label class="control-label">
-                            在售状态:
-                            <select name="" id="1" class="form-control width88" ng-model="goodsFilter.saleStatus">
-                                <option value="">全部</option>
-                                <option value="601">已上架</option>
-                                <option value="613">新品未上架</option>
-                                <option value="612">已下架</option>
-                            </select>
-                        </label>
-                    </div>
-                    <div class="form-group form-group-sm">
-                        <label class="control-label">
-                            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;币种:
-                            <select id="2" class="form-control width60" ng-model="goodsFilter.currency">
-                                <option value="">全部</option>
-                                <option value="RMB">RMB</option>
-                                <option value="USD">USD</option>
-                            </select>
-                        </label>
-                    </div>
-                    <div class="form-group form-group-sm">
-                        <label class="control-label">
-                            拆包售卖:
-                            <select name="" id="3" ng-model="goodsFilter.breakUp" class="form-control width88">
-                                <option value="">全部</option>
-                                <option value="true">可拆卖</option>
-                                <option value="false">不可拆卖</option>
-                            </select>
-                        </label>
-                    </div>
-                    <div class="form-group form-group-sm">
-                        <label class="control-label">
-                            审核状态:
-                            <select name="" id="4" ng-model="goodsFilter.audited" class="form-control width60">
-                                <option value="">全部</option>
-                                <option value="1">已审核</option>
-                                <option value="0">未审核</option>
-                            </select>
-                        </label>
-                    </div>
+    <div class="manage-form">
+        <div class="form-item">
+            <span class="item-title">上传时间:</span>
+            <div class="screen">
+                <div class="radio-block fl">
+                    <label class="com-check-radio">
+                        <input type="radio" id="oneMonth" name="date" ng-click="setFilters('dateArea', 'oneMonth')" ng-checked="dateArea == 'oneMonth'">
+                        <label for="oneMonth"></label>
+                        30天
+                    </label>
+                    <label class="com-check-radio">
+                        <input type="radio" id="threeMonth" name="date" ng-click="setFilters('dateArea', 'threeMonth')" ng-checked="dateArea == 'threeMonth'">
+                        <label for="threeMonth"></label>
+                        90天
+                    </label>
+                    <label class="com-check-radio">
+                        <input type="radio" id="sixMonth" name="date" ng-click="setFilters('dateArea', 'sixMonth')" ng-checked="dateArea == 'sixMonth'">
+                        <label for="sixMonth"></label>
+                        180天
+                    </label>
+                    <label class="com-check-radio">
+                        <input type="radio" id="allMonth" name="date" ng-click="setFilters('dateArea', 'allMonth')" ng-checked="dateArea == 'allMonth'">
+                        <label for="allMonth"></label>
+                        不限
+                    </label>
+                    <label class="com-check-radio">
+                        <input type="radio" id="autoMonth" name="date" ng-click="setFilters('dateArea', 'autoMonth')" ng-checked="dateArea == 'autoMonth'">
+                        <label for="autoMonth"></label>
+                        自定义
+                    </label>
                 </div>
-                <div class="form-inline">
-                    <div class="form-group form-group-sm">
-                        <label class="control-label">
-                            物料名称:
-                        </label>
-                        <div class="mar-rt0 row checkbox">
-                            <div class="col-md-3">
-                                <select class="form-control"
-                                        ng-model="kindPojo.first"
-                                        ng-options="key as value.nameCn for (key,value) in kindInfo"
-                                        ng-change="kindPojo.second='';kindPojo.third='';"
-                                        style="opacity: 1;">
-                                    <option value="">一级类目</option>
-                                </select>
-                            </div>
-                            <div class="col-md-3" style="margin-left: 10px;">
-                                <select class="form-control" ng-model="kindPojo.second"
-                                        ng-options="key as value.nameCn for (key,value) in kindInfo[kindPojo.first].children"
-                                        ng-change="kindPojo.third='';"
-                                        style="opacity: 1;">
-                                    <option value="">二级类目</option>
-                                </select>
-                            </div>
-                            <div class="col-md-3">
-                                <select class="form-control" ng-model="kindPojo.third" style="opacity: 1;"
-                                        ng-options="value as value.nameCn for value in kindInfo[kindPojo.first].children[kindPojo.second].children">
-                                    <option value="">三级类目</option>
-                                </select>
-                            </div>
+                <div class="sreach fr">
+                    <div  ng-show="dateArea == 'autoMonth'" class="date fl">
+                        <div class="data-input">
+                            <input id="start" type="text" ng-model="startDate" readonly="readonly"
+                                   class="form-control select-adder" placeholder="起始时间"
+                                   datepicker-popup="yyyy-MM-dd"
+                                   is-open="condition[0].open"
+                                   current-text="今天" clear-text="清除" close-text="关闭"
+                                   datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+                                   ng-click="openDatePicker($event, condition, 0,1)"
+                                   ng-change="onDateCondition(1, startDate)"/>
+                            <button class="open" ng-click="openDatePicker($event, condition, 0)"></button>
+                        </div>
+                        <strong>–</strong>
+                        <div class="data-input">
+                            <input id="end" type="text" ng-model="endDate" readonly="readonly"
+                                   class="form-control select-adder" placeholder="结束时间"
+                                   datepicker-popup="yyyy-MM-dd"
+                                   is-open="condition[1].open"
+                                   current-text="今天" clear-text="清除" close-text="关闭"
+                                   datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+                                   ng-click="openDatePicker($event, condition, 1, 2)"
+                                   ng-change="onDateCondition(2, endDate)"/>
+                            <button class="open" ng-click="openDatePicker($event, condition, 1)"></button>
                         </div>
                     </div>
-                    <div class="form-group form-group-sm">
-                        <label class="control-label">
-                            品牌:
-                            <input type="text" placeholder="品牌中英文名称" class="form-control width140" ng-model="goodsFilter.brand">
-                        </label>
-                    </div>
-                    <div class="form-group form-group-sm">
-                        <label class="control-label">
-                            在售数量:
-                            <select name="" id="6" class="form-control width88" ng-model="goodsFilter.saleNum">
-                                <option value="">全部</option>
-                                <option value="601">有货</option>
-                                <option value="602">不足起订量</option>
-                                <option value="603">无货</option>
-                            </select>
-                        </label>
-                    </div>
-                    <div class="form-group form-group-sm">
-                        <label class="control-label">
-                            销售方式:
-                            <select name="" id="7" ng-model="goodsFilter.saleSelf" class="form-control width60">
-                                <option value="">全部</option>
-                                <option value="true">自营</option>
-                                <option value="false">寄售</option>
-                            </select>
-                        </label>
-                    </div>
-                    <div class="form-group form-group-sm">
-                        <label class="control-label">
-                            产品类型:
-                            <select name="" id="8" ng-model="goodsFilter.standard" class="form-control width88">
-                                <option value="">全部</option>
-                                <option value="true">标准产品</option>
-                                <option value="false">非标准产品</option>
-                            </select>
-                        </label>
-                    </div>
-                    <div class="form-group form-group-sm">
-                        <label class="control-label">
-                            图片类型:
-                            <select name="" id="9" ng-model="goodsFilter.haveImg" class="form-control width88">
-                                <option value="">全部</option>
-                                <option value="true">自有图片</option>
-                                <option value="false">默认图片</option>
-                            </select>
-                        </label>
-                    </div>
-                    <div class="form-group form-group-sm">
-                        <button ng-click="searchClick()">搜索</button>
-                    </div>
-                    <div class="form-group form-group-sm">
-                        <button title="此功能没有开放">产品导出</button>
-                        <!--<button ng-click="exportClick()" >产品导出</button>-->
+                </div>
+            </div>
+        </div>
+        <div class="form-item" style="background:#f5f5f5;">
+            <span class="item-title">条件筛选:</span>
+            <span>
+                <a ng-click="clearClick()">清空条件</a>
+                <a ng-click="searchClick()">确认筛选</a>
+            </span>
+            <span style="float:right">
+                <a ng-click="moreInfo()">更多信息</a>
+            </span>
+        </div>
+        <div class="form-top">
+            <div class="form-inline">
+                <div class="form-group form-group-sm">
+                    <label class="control-label">
+                        <span>物料名称:</span>
+                    </label>
+                    <div class="select-three">
+                        <select class="form-control"
+                                ng-model="kindPojo.first"
+                                ng-options="key as value.nameCn for (key,value) in kindInfo"
+                                ng-change="kindPojo.second='';kindPojo.third='';"
+                                style="opacity: 1;">
+                            <option value="">一级类目</option>
+                        </select>
+                        <select class="form-control" ng-model="kindPojo.second"
+                                ng-options="key as value.nameCn for (key,value) in kindInfo[kindPojo.first].children"
+                                ng-change="kindPojo.third='';"
+                                style="opacity: 1;">
+                            <option value="">二级类目</option>
+                        </select>
+                        <select class="form-control" ng-model="kindPojo.third" style="opacity: 1;"
+                                ng-options="value as value.nameCn for value in kindInfo[kindPojo.first].children[kindPojo.second].children">
+                            <option value="">三级类目</option>
+                        </select>
                     </div>
                 </div>
             </div>
-            <div class="form-bottom">
-                <button ng-click="batchDown()">批量下架</button>
-                <button ng-click="moreInfo()">更多信息</button>
-                <!--<label>-->
-                    <!--<input type="checkbox">合并相同产品-->
-                <!--</label>-->
-                <span style="float: right;font-size: 14px">共<span style="color: red;" ng-bind="totalCount">3424</span>个产品</span>
+            <div class="form-inline">
+                <div class="form-group form-group-sm">
+                    <label class="control-label">
+                        <span>型号:</span>
+                        <input class="form-control" type="text" ng-model="goodsFilter.code" placeholder="型号">
+                    </label>
+                </div>
+                <div class="form-group form-group-sm">
+                    <label class="control-label">
+                        <span>商家:</span>
+                        <input class="form-control" type="text" ng-model="goodsFilter.store" placeholder="商家ID/商家名称">
+                    </label>
+                </div>
+                <div class="form-group form-group-sm">
+                    <label class="control-label">
+                        <span>在售状态:</span>
+                        <select name="" id="1" class="form-control" ng-model="goodsFilter.saleStatus">
+                            <option value="">全部</option>
+                            <option value="601">已上架</option>
+                            <!--<option value="613">新品未上架</option>-->
+                            <option value="612">未上架</option>
+                        </select>
+                    </label>
+                </div>
+                <div class="form-group form-group-sm">
+                    <label class="control-label">
+                        <span>币种:</span>
+                        <select id="2" class="form-control" ng-model="goodsFilter.currency">
+                            <option value="">全部</option>
+                            <option value="RMB">RMB</option>
+                            <option value="USD">USD</option>
+                        </select>
+                    </label>
+                </div>
+                <div class="form-group form-group-sm">
+                    <label class="control-label">
+                        <span>拆包售卖:</span>
+                        <select name="" id="3" ng-model="goodsFilter.breakUp" class="form-control">
+                            <option value="">全部</option>
+                            <option value="true">可拆卖</option>
+                            <option value="false">不可拆卖</option>
+                        </select>
+                    </label>
+                </div>
+                <div class="form-group form-group-sm">
+                    <label class="control-label">
+                        <span>审核状态:</span>
+                        <select name="" id="4" ng-model="goodsFilter.audited" class="form-control">
+                            <option value="">全部</option>
+                            <option value="1">已审核</option>
+                            <option value="0">未审核</option>
+                        </select>
+                    </label>
+                </div>
+            </div>
+            <div class="form-inline">
+                <div class="form-group form-group-sm">
+                    <label class="control-label">
+                        <span>品牌:</span>
+                        <input type="text" placeholder="品牌中英文名称" class="form-control" ng-model="goodsFilter.brand">
+                    </label>
+                </div>
+                <div class="form-group form-group-sm">
+                    <label class="control-label">
+                        <span>在售数量:</span>
+                        <select name="" id="6" class="form-control" ng-model="goodsFilter.saleNum">
+                            <option value="">全部</option>
+                            <option value="601">有货</option>
+                            <option value="602">不足起订量</option>
+                            <option value="603">无货</option>
+                        </select>
+                    </label>
+                </div>
+                <div class="form-group form-group-sm">
+                    <label class="control-label">
+                        <span>销售方式:</span>
+                        <select name="" id="7" ng-model="goodsFilter.saleSelf" class="form-control">
+                            <option value="">全部</option>
+                            <option value="true">自营</option>
+                            <option value="false">寄售</option>
+                        </select>
+                    </label>
+                </div>
+                <div class="form-group form-group-sm">
+                    <label class="control-label">
+                        <span>产品类型:</span>
+                        <select name="" id="8" ng-model="goodsFilter.standard" class="form-control">
+                            <option value="">全部</option>
+                            <option value="true">标准产品</option>
+                            <option value="false">非标准产品</option>
+                        </select>
+                    </label>
+                </div>
+                <div class="form-group form-group-sm">
+                    <label class="control-label">
+                        <span>图片类型:</span>
+                        <select name="" id="9" ng-model="goodsFilter.haveImg" class="form-control">
+                            <option value="">全部</option>
+                            <option value="true">自有图片</option>
+                            <option value="false">默认图片</option>
+                        </select>
+                    </label>
+                </div>
             </div>
         </div>
-        <div class="manage-table">
-           <table class="table" ng-table="manageTableParams">
-               <thead>
-               <tr>
-                   <th width="80">
-                       <label>
-                           <input id="AllChoose" type="checkbox" ng-checked="isChooseAll" ng-click="chooseAll()">全选
-                       </label>
-                   </th>
-                   <th width="120">操作</th>
-                   <th width="160" ng-if="titleInShow['商家ID']">商家ID</th>
-                   <th width="160" ng-if="titleInShow['商家名称']">商家名称</th>
-                   <th width="160">产品信息</th>
-                   <th width="160" ng-if="titleInShow['SKU编码']">SKU编码</th>
-                   <th width="160" ng-if="titleInShow['产品编号']">产品编号</th>
-                   <th width="160" ng-if="titleInShow['封装']">封装</th>
-                   <th width="160" ng-if="titleInShow['梯度']">梯度</th>
-                   <th width="160" ng-if="titleInShow['单价']">单价</th>
-                   <th width="160" ng-if="titleInShow['交期(天)']">交期(天)</th>
-                   <th width="160" ng-if="titleInShow['包装']">包装</th>
-                   <th width="160" ng-if="titleInShow['包装数量']">包装数量</th>
-                   <th width="160" ng-if="titleInShow['起订量']">起订量</th>
-                   <th width="160" ng-if="titleInShow['拆包售卖']">拆包售卖</th>
-                   <th width="160" ng-if="titleInShow['在售数量']">在售数量</th>
-                   <th width="160" ng-if="titleInShow['锁库数']">锁库数</th>
-                   <th width="160" ng-if="titleInShow['冻结数量']">冻结数量</th>
-                   <th width="160" ng-if="titleInShow['库存总数']">库存总数</th>
-                   <th width="160" ng-if="titleInShow['在售状态']">在售状态</th>
-                   <th width="160" ng-if="titleInShow['销售方式']">销售方式</th>
-                   <th width="160" ng-if="titleInShow['创建人']">创建人</th>
-                   <th width="160" ng-if="titleInShow['创建时间']">创建时间</th>
-                   <th width="160" ng-if="titleInShow['产品类型']">产品类型</th>
-                   <th width="160" ng-if="titleInShow['图片类型']">图片类型</th>
-                   <th width="160" ng-if="titleInShow['产品图片']">产品图片</th>
-               </tr>
-               </thead>
-               <tbody>
-               <tr ng-repeat="list in goodsList">
-                   <td>
-                       <input id="{{$index+1}}" type="checkbox" ng-checked="list.isChoosed" ng-click="chooseOne(list)">
-                   </td>
-                   <td>
-                       <a target="_blank" href="admin#/manage/{{list.id}}">详情</a>
-                       <a ng-if="list.audited == 0" ng-click="auditProduct(list)">审核</a>
-                       <br/>
-                       <a ng-click="journalProduct(list)" style="margin-left:-1px;">日志</a>
-                       <a ng-if="list.status == 601 || list.status == 602" ng-click="soldOutProduct([list.batchCode])">下架</a>
-                   </td>
-                   <td ng-if="titleInShow['商家ID']">
-                       <span ng-bind="list.enUU || '-'">商家ID</span>
-                   </td>
-                   <td ng-if="titleInShow['商家名称']">
-                       <span ng-bind="list.storeName || '-'">商家名称</span>
-                   </td>
-                   <td>
-                       <p>物料名称:<span ng-bind="list.kindNameCn || '-'">****</span></p>
-                       <p>型号:<span ng-bind="list.code || '-'">****</span></p>
-                       <p>品牌:<span ng-bind="list.brandNameEn || '-'">****</span></p>
-                   </td>
-                   <td ng-if="titleInShow['SKU编码']">
-                       <span ng-bind="list.batchCode || '-'">SKU编码</span>
-                   </td>
-                   <td ng-if="titleInShow['产品编号']">
-                       <span ng-bind="list.prodNum || '-'">产品编号</span>
-                   </td>
-                   <td ng-if="titleInShow['封装']">
-                       <span ng-bind="list.encapsulation || '-'">封装</span>
-                   </td>
-                   <td ng-if="titleInShow['梯度']">
-                      <div ng-repeat="qty in list.prices">
+        <div class="form-item">
+            <span class="item-title">查看报表:</span>
+            <span ng-if="startFormatDate">
+                <a ng-href="#/merchantProducts?startDate={{startFormatDate}}&endDate={{endFormatDate}}">商家产品数</a>
+                <a ng-href="#/brandProductsCount?startDate={{startFormatDate}}&endDate={{endFormatDate}}">品牌产品数</a>
+                <a ng-href="#/categoryNumber?startDate={{startFormatDate}}&endDate={{endFormatDate}}">品类产品数</a>
+            </span>
+            <span ng-if="!startFormatDate">
+                <a ng-href="#/merchantProducts">商家产品数</a>
+                <a ng-href="#/brandProductsCount">品牌产品数</a>
+                <a ng-href="#/categoryNumber">品类产品数</a>
+            </span>
+        </div>
+        <div class="form-item">
+            <span class="item-title">更多操作:</span>
+            <span>
+                <a ng-click="batchDown()">批量下架</a>
+                <!--<a title="此功能没有开放">产品导出</a>-->
+                <a ng-click="exportClick()">产品导出</a>
+                <strong>请注意:当无选择项时,默认导出所有前1000条数据!</strong>
+            </span>
+            <span style="float: right;font-size: 14px">共<span style="color: red;" ng-bind="totalCount">3424</span>个产品</span>
+        </div>
+    </div>
+    <div class="manage-table">
+        <table class="table" ng-table="manageTableParams">
+            <thead>
+            <tr>
+                <th width="120">
+                    <label>
+                        <input id="AllChoose" type="checkbox" ng-checked="isChooseAll" ng-click="chooseAll()">全选当前页
+                    </label>
+                </th>
+                <th width="120">操作</th>
+                <th width="160" ng-if="titleInShow['商家ID']">商家ID</th>
+                <th width="160" ng-if="titleInShow['商家名称']">商家名称</th>
+                <th width="160">产品信息</th>
+                <th width="160" ng-if="titleInShow['SKU编码']">SKU编码</th>
+                <th width="160" ng-if="titleInShow['产品编号']">产品编号</th>
+                <th width="160" ng-if="titleInShow['封装']">封装</th>
+                <th width="160" ng-if="titleInShow['梯度']">梯度</th>
+                <th width="160" ng-if="titleInShow['单价']">单价</th>
+                <th width="160" ng-if="titleInShow['交期(天)']">交期(天)</th>
+                <th width="160" ng-if="titleInShow['包装']">包装</th>
+                <th width="160" ng-if="titleInShow['包装数量']">包装数量</th>
+                <th width="160" ng-if="titleInShow['起订量']">起订量</th>
+                <th width="160" ng-if="titleInShow['拆包售卖']">拆包售卖</th>
+                <th width="160" ng-if="titleInShow['在售数量']">在售数量</th>
+                <th width="160" ng-if="titleInShow['锁库数']">锁库数</th>
+                <th width="160" ng-if="titleInShow['冻结数量']">冻结数量</th>
+                <th width="160" ng-if="titleInShow['库存总数']">库存总数</th>
+                <th width="160" ng-if="titleInShow['在售状态']">在售状态</th>
+                <th width="160" ng-if="titleInShow['销售方式']">销售方式</th>
+                <th width="160" ng-if="titleInShow['创建人']">创建人</th>
+                <th width="160" ng-if="titleInShow['创建时间']">创建时间</th>
+                <th width="160" ng-if="titleInShow['产品类型']">产品类型</th>
+                <th width="160" ng-if="titleInShow['图片类型']">图片类型</th>
+                <th width="160" ng-if="titleInShow['产品图片']">产品图片</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-repeat="list in goodsList">
+                <td>
+                    <input id="{{$index+1}}" type="checkbox" ng-checked="list.isChoosed" ng-click="chooseOne(list)">
+                </td>
+                <td>
+                    <a target="_blank" href="admin#/manage/{{list.id}}?type=goods">详情</a>
+                    <a ng-if="list.audited == 0" ng-click="auditProduct(list)">审核</a>
+                    <br/>
+                    <a ng-click="journalProduct(list)" style="margin-left:-1px;">日志</a>
+                    <a ng-if="list.status == 601 || list.status == 602" ng-click="soldOutProduct([list.batchCode])">下架</a>
+                </td>
+                <td ng-if="titleInShow['商家ID']">
+                    <span ng-bind="list.enUU || '-'">商家ID</span>
+                </td>
+                <td ng-if="titleInShow['商家名称']">
+                    <span ng-bind="list.storeName || '-'">商家名称</span>
+                </td>
+                <td>
+                    <p>物料名称:<span ng-bind="list.kindNameCn || '-'">****</span></p>
+                    <p>型号:<span ng-bind="list.code || '-'">****</span></p>
+                    <p>品牌:<span ng-bind="list.brandNameEn || '-'">****</span></p>
+                </td>
+                <td ng-if="titleInShow['SKU编码']">
+                    <span ng-bind="list.batchCode || '-'">SKU编码</span>
+                </td>
+                <td ng-if="titleInShow['产品编号']">
+                    <span ng-bind="list.prodNum || '-'">产品编号</span>
+                </td>
+                <td ng-if="titleInShow['封装']">
+                    <span ng-bind="list.encapsulation || '-'">封装</span>
+                </td>
+                <td ng-if="titleInShow['梯度']">
+                    <div ng-repeat="qty in list.prices">
                           <span ng-if="!$last">
                               <span ng-bind="qty.start"></span>-<span ng-bind="qty.end"></span>
                           </span>
-                          <span ng-if="$last">
+                        <span ng-if="$last">
                               <span ng-bind="qty.start"></span>以上
                           </span>
-                      </div>
-                   </td>
-                   <td ng-if="titleInShow['单价']">
-                      <div ng-repeat="price in list.prices">
-                          <span ng-bind="list.currencyName == 'RMB' ? '¥' : '$'"></span>
-                          <span ng-bind="list.currencyName == 'RMB' ? price.rMBPrice : price.uSDPrice"></span>
-                      </div>
-                   </td>
-                   <td ng-if="titleInShow['交期(天)']">
-                       <div ng-if="list.b2cMinDelivery != list.b2cMaxDelivery">
-                           <span ng-bind="list.b2cMinDelivery || '-'">交期(天)</span>-
-                           <span ng-bind="list.b2cMaxDelivery || '-'">交期(天)</span>
-                       </div>
-                       <span ng-if="list.b2cMinDelivery == list.b2cMaxDelivery" ng-bind="list.b2cMinDelivery || '-'">交期(天)</span>
-                   </td>
-                   <td ng-if="titleInShow['包装']">
-                       <span ng-bind="list.packaging || '-'">包装</span>
-                   </td>
-                   <td ng-if="titleInShow['包装数量']">
-                       <span ng-bind="list.minPackQty || '-'">包装</span>
-                   </td>
-                   <td ng-if="titleInShow['起订量']">
-                       <span ng-bind="list.minBuyQty || '-'">起订量</span>
-                   </td>
-                   <td ng-if="titleInShow['拆包售卖']">
-                       <span ng-if="list.breakUp">可拆卖</span>
-                       <span ng-if="!list.breakUp">不可拆卖</span>
-                   </td>
-                   <td ng-if="titleInShow['在售数量']">
-                       <span ng-bind="list.reserve">在售数量</span>
-                   </td>
-                   <td ng-if="titleInShow['锁库数']">
-                       <span ng-bind="'-'">锁库数</span>
-                   </td>
-                   <td ng-if="titleInShow['冻结数量']">
-                       <span ng-bind="list.frozen">冻结数量</span>
-                   </td>
-                   <td ng-if="titleInShow['库存总数']">
-                       <span ng-bind="list.reserve + list.frozen">库存总数</span>
-                   </td>
-                   <td ng-if="titleInShow['在售状态']">
-                       <span ng-bind="saleStatus[list.status] || '-'">在售状态</span>
-                   </td>
-                   <td ng-if="titleInShow['销售方式']">
-                       <span ng-bind="list.selfSale || '-'">销售方式</span>
-                   </td>
-                   <td ng-if="titleInShow['创建人']">
-                       <span ng-bind="list.publisherName || '-'">创建人</span>
-                   </td>
-                   <td ng-if="titleInShow['创建时间']">
-                       <span ng-bind="list.createdDate | date: 'yyyy-MM-dd HH:mm:ss' || '-'">创建时间</span>
-                   </td>
-                   <td ng-if="titleInShow['产品类型']">
-                       <span ng-if="list.uuid">标准</span>
-                       <span ng-if="!list.uuid">非标</span>
-                   </td>
-                   <td ng-if="titleInShow['图片类型']">
-                       <span ng-if="list.img">自有图片</span>
-                       <span ng-if="!list.img">默认图片</span>
-                   </td>
-                   <td ng-if="titleInShow['产品图片']">
-                       <img ng-src="{{list.img || 'static/img/store/common/default.png'}}" ng-click="showImg(list.img)" alt="产品图片">
-                   </td>
-               </tr>
-               </tbody>
-           </table>
-       </div>
+                    </div>
+                </td>
+                <td ng-if="titleInShow['单价']">
+                    <div ng-repeat="price in list.prices">
+                        <span ng-bind="list.currencyName == 'RMB' ? '¥' : '$'"></span>
+                        <span ng-bind="list.currencyName == 'RMB' ? price.rMBPrice : price.uSDPrice"></span>
+                    </div>
+                </td>
+                <td ng-if="titleInShow['交期(天)']">
+                    <div ng-if="list.b2cMinDelivery != list.b2cMaxDelivery">
+                        <span ng-bind="list.b2cMinDelivery || '-'">交期(天)</span>-
+                        <span ng-bind="list.b2cMaxDelivery || '-'">交期(天)</span>
+                    </div>
+                    <span ng-if="list.b2cMinDelivery == list.b2cMaxDelivery" ng-bind="list.b2cMinDelivery || '-'">交期(天)</span>
+                </td>
+                <td ng-if="titleInShow['包装']">
+                    <span ng-bind="list.packaging || '-'">包装</span>
+                </td>
+                <td ng-if="titleInShow['包装数量']">
+                    <span ng-bind="list.minPackQty || '-'">包装</span>
+                </td>
+                <td ng-if="titleInShow['起订量']">
+                    <span ng-bind="list.minBuyQty || '-'">起订量</span>
+                </td>
+                <td ng-if="titleInShow['拆包售卖']">
+                    <span ng-if="list.breakUp">可拆卖</span>
+                    <span ng-if="!list.breakUp">不可拆卖</span>
+                </td>
+                <td ng-if="titleInShow['在售数量']">
+                    <span ng-bind="list.reserve">在售数量</span>
+                </td>
+                <td ng-if="titleInShow['锁库数']">
+                    <span ng-bind="'-'">锁库数</span>
+                </td>
+                <td ng-if="titleInShow['冻结数量']">
+                    <span ng-bind="list.frozen">冻结数量</span>
+                </td>
+                <td ng-if="titleInShow['库存总数']">
+                    <span ng-bind="list.reserve + list.frozen">库存总数</span>
+                </td>
+                <td ng-if="titleInShow['在售状态']">
+                    <span ng-bind="saleStatus[list.status] || '-'">在售状态</span>
+                </td>
+                <td ng-if="titleInShow['销售方式']">
+                    <span ng-bind="list.selfSale || '-'">销售方式</span>
+                </td>
+                <td ng-if="titleInShow['创建人']">
+                    <span ng-bind="list.publisherName || '-'">创建人</span>
+                </td>
+                <td ng-if="titleInShow['创建时间']">
+                    <span ng-bind="list.createdDate | date: 'yyyy-MM-dd HH:mm:ss' || '-'">创建时间</span>
+                </td>
+                <td ng-if="titleInShow['产品类型']">
+                    <span ng-if="list.uuid">标准</span>
+                    <span ng-if="!list.uuid">非标</span>
+                </td>
+                <td ng-if="titleInShow['图片类型']">
+                    <span ng-if="list.img">自有图片</span>
+                    <span ng-if="!list.img">默认图片</span>
+                </td>
+                <td ng-if="titleInShow['产品图片']">
+                    <img ng-src="{{list.img || 'static/img/store/common/default.png'}}" ng-click="showImg(list.img)" alt="产品图片">
+                </td>
+            </tr>
+            </tbody>
+        </table>
     </div>
 </div>
 <style>
+    .ng-table-pager {
+        position: absolute;
+        right: 0;
+        margin-top: 20px;
+    }
     #manage input[type=checkbox]{
         position:relative;
         top:3px;
         left:-3px;
     }
 
-    .manage-form{
-        height:158px;
-        background: #fff;
-        border-radius:5px;
-    }
     .manage-form .form-top{
         padding-top:15px;
+        border:1px solid #f5f5f5;
     }
     .manage-form .form-top .form-inline{
         display: inline-block;
-        width:1470px;
         margin-bottom:10px;
     }
     .manage-form .form-top .form-group{
         display: inline-block;
-        margin:0 18px;
+        margin:0 5px;
         vertical-align: middle;
+        line-height: 30px;
     }
+
     .manage-form .form-top label{
         text-align: right;
         font-size: 14px;
         color:#666;
     }
 
-    .manage-form .form-top ul.tree{
-        position:absolute;
-        top:-4px;
-        left:46px;
-        z-index:100;
-        display:inline-block;
-        min-width:140px;
-        max-height: 473px;
-        overflow-y: auto;
-        line-height: 23px;
-        padding:0 5px;
-        margin:0;
-        color: #555555;
-        vertical-align: middle;
-        background-color: #ffffff;
-        border: 1px solid #cccccc;
-        border-radius: 4px;
-        -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);
-        box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);
-        -webkit-transition: border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;
-        -o-transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;
-        transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;
-    }
-
-    .manage-form .form-top ul.tree li{
-        text-align: left;
-    }
-    .manage-form .form-top ul.tree li .icon-left {
-        position:absolute;
-        top:3px;
-        right:0px;
-        display:inline-block;
-        width:20px;
-        height:20px;
-        background: url("static/img/icon/opa-icons-color16.png") no-repeat -63px 1px;
-    }
-
-    .manage-form .form-top ul.tree li .icon-down {
-        position:absolute;
-        top:3px;
-        right:0px;
+    .manage-form .form-top label span{
         display:inline-block;
-        width:20px;
-        height:20px;
-        background: url("static/img/icon/opa-icons-color16.png") no-repeat -30px 1px;
-    }
-    .manage-form .form-top ul.tree li span{
-        color:#555;
-        font-size: 12px;
-        font-weight: normal;
+        width:80px;
+        font-weight:bold;
+        color:#2fa4e7;
     }
 
-    .manage-form .form-top label input{
+    .manage-form .form-top label input, .manage-form .form-top label select{
         display: inline-block;
+        width:110px;
         height:25px;
+        line-height: 25px;
         padding:0 2px;
         margin:0;
     }
-    .manage-form .form-top label select{
+    .manage-form .form-top .select-three {
+        display: inline-block;
+        margin:0;
+    }
+    .manage-form .form-top .select-three select{
         display: inline-block;
+        min-width:140px;
         height:25px;
         line-height: 25px;
         padding:0 2px;
         margin:0;
     }
-    .manage-form .form-top label .width180{
-        padding:0 2px;
-        width:180px;
-    }
-    .manage-form .form-top label .width140{
-        padding:0 2px;
-        width:140px;
-    }
-    .manage-form .form-top label .width88{
-        width:88px;
-    }
-    .manage-form .form-top label .width60{
-        width:60px;
-    }
-    .manage-form .form-bottom{
-        margin-top:32px;
-    }
-    .manage-form  button{
-        border-radius:3px;
-        border:none;
-        line-height: 25px;
-        padding:0 15px;
-        font-size: 14px;
-        color:#fff;
-        background: #49afea;
-    }
-    .manage-form .form-bottom button{
-        margin:0 18px;
+
+    .manage-table{
+        overflow-y: auto;
     }
+
     .manage-table table{
         table-layout: fixed;
         font-size: 14px;
@@ -517,78 +528,90 @@
         cursor:pointer;
         color:#fff;
     }
-
-    /* 树结构样式  */
-
-    [treecontrol] ul {
-        list-style: none;
-    }
-
-    [treecontrol] li {
-        position: relative;
-        padding: 0 0 0 20px;
-        line-height: 20px;
-    }
-
-    [treecontrol] li.tree-expanded i.tree-leaf-head, [treecontrol] li.tree-collapsed i.tree-leaf-head {display:none;}
-    [treecontrol] li.tree-expanded i.tree-branch-head, [treecontrol] li.tree-collapsed i.tree-branch-head {display:inline;}
-    [treecontrol] li.tree-leaf i.tree-branch-head {display:none;}
-    [treecontrol] li.tree-leaf i.tree-leaf-head {display:inline;}
-
-    [treecontrol] li i {
-        cursor: pointer;
+</style>
+<style>
+    .fr{
+        float:right;
     }
-
-    [treecontrol] li .tree-label {
-        cursor: pointer;
-        display: inline;
+    .fl{
+        float:left;
     }
-
-    [treecontrol].tree-boot > ul > li {
+    /*搜索时间筛选 start*/
+    .manage-form .form-item .screen {
+        display: inline-block;
         padding: 0;
+        vertical-align: middle;
     }
-
-    [treecontrol].tree-boot li > .tree-label {
-        display: block;
-        padding: 3px 0;
-        border-radius: 4px;
-    }
-
-    [treecontrol].tree-boot i.tree-branch-head,
-    [treecontrol].tree-boot i.tree-leaf-head {
-        float: left;
-        height: 16px;
-        margin: 5px;
+    .manage-form .com-check-radio{
+        font-size: 14px;
+        font-weight: normal;
+        line-height: 32px;
+        margin-right: 10px;
+        cursor:pointer;
     }
-
-    [treecontrol].tree-boot li.tree-expanded i.tree-branch-head {
-        padding: 1px 10px;
-        background: url("static/img/icon/opa-icons-color16.png") no-repeat -63px 1px;
+    .manage-form .screen .sreach .date{
+        margin:0 20px;
     }
-
-    [treecontrol].tree-boot li.tree-collapsed i.tree-branch-head {
-        padding: 1px 10px;
-        background: url("static/img/icon/opa-icons-color16.png") no-repeat -30px 1px;
+    .manage-form .screen .sreach .date input{
+        width: 117px;
+        text-align: left;
+        border: 1px solid #5078cb;
     }
-
-    [treecontrol].tree-boot li.tree-leaf i.tree-leaf-head {
-        padding: 1px 5px;
+    .manage-form .screen .sreach .date input:hover{
+        cursor: pointer;
     }
-
-    [treecontrol].tree-boot .tree-label.tree-selected,
-    [treecontrol].tree-boot .tree-label.tree-selected:hover{
-        background-color: #38a8e8;
+    .manage-form .screen .sreach .date strong{
+        float: left;
+        line-height: 32px;
+        color: #999;
+        margin: 0 5px;
     }
-
-    [treecontrol].tree-boot .tree-label:hover{
-        background-color: #38a8e8;
+    .manage-form .data-input{
+        float: left;
+        position: relative;
     }
-    [treecontrol].tree-boot .tree-label:hover span{
+    .manage-form .data-input button.open{
+        position: absolute;
+        right: 1px;
+        top: 1px;
+        width: 20px;
+        height: 30px;
+        background: url('static/img/user/images/xiala.png') right no-repeat #fff !important;
+        background-position-x: 100% !important;
+        border: none;
+    }
+    .manage-form .screen .sreach .date input.form-control{
+        padding: 6px 6px;
+        border-radius: 2px;
+        height:32px;
+    }
+    .manage-form .screen .radio-block {
+        width: auto;
+    }
+    .manage-form .form-item{
+        font-size:14px;
+        vertical-align: top;
+        line-height:40px;
+    }
+    .manage-form .form-item span{}
+    .manage-form .form-item span a{
+        display:inline-block;
+        text-decoration:none;
+        height:26px;
+        line-height:26px;
+        color:#2fa4e7;
+        border:1px solid #2fa4e7;
+        border-radius:4px;
+        padding:0 10px;
+        margin:0 10px;
+    }
+    .manage-form .form-item span a:hover{
+        cursor:pointer;
+        background: #2fa4e7;
         color:#fff;
     }
-
-    #toast-container {
-        top: auto;
-        bottom: 40px;
+    .manage-form .form-item .item-title{
+        margin-left:5px;
+        font-weight:bold;
     }
 </style>

+ 54 - 14
src/main/webapp/resources/view/admin/product/productManageDetail.html

@@ -18,14 +18,25 @@
             <div class="panel-body" style="padding:65px 50px 35px 50px;">
                 <div class="row">
                     <div class="col-xs-4">
-                        <div class="img-info">
+                        <div class="img-info" ng-if="goods.goods">
+                            <img ng-src="{{goods.goods.img || 'static/img/store/common/default.png'}}">
+                            <i class="icon-fei" ng-if="!goods.goods.uuid"></i>
+                            <i class="icon-biao" ng-if="goods.goods.uuid"></i>
+                        </div>
+                        <div class="img-info" ng-if="!goods.goods">
                             <img ng-src="{{goods.img || 'static/img/store/common/default.png'}}">
                             <i class="icon-fei" ng-if="!goods.uuid"></i>
                             <i class="icon-biao" ng-if="goods.uuid"></i>
                         </div>
                     </div>
                     <div class="col-xs-4">
-                        <div class="info-text">
+                        <div class="info-text" ng-if="goods.goods">
+                            <p>型号:<span ng-bind="goods.goods.code"></span></p>
+                            <p>物料名称:<span ng-bind="goods.goods.kindNameCn"></span></p>
+                            <p>品牌:<span ng-bind="goods.goods.brandNameEn"></span></p>
+                            <p>封装:<span ng-bind="goods.goods.encapsulation || '-'"></span></p>
+                        </div>
+                        <div class="info-text" ng-if="!goods.goods">
                             <p>型号:<span ng-bind="goods.code"></span></p>
                             <p>物料名称:<span ng-bind="goods.kindNameCn"></span></p>
                             <p>品牌:<span ng-bind="goods.brandNameEn"></span></p>
@@ -33,7 +44,18 @@
                         </div>
                     </div>
                     <div class="col-xs-4">
-                        <div class="info-text">
+                        <div class="info-text" ng-if="goods.goods">
+                            <p>包装:<span ng-bind="goods.goods.packing || '-'"></span></p>
+                            <p>包装数量:<span ng-bind="goods.goods.minPackQty || '-'"></span></p>
+                            <p>单位:<span ng-bind="goods.goods.unit || '-'"></span></p>
+                            <p>生产日期:<span ng-bind="goods.goods.produceDate || '-'"></span></p>
+                            <p>规格书:
+                                <a ng-if="goods.goods.attach" target="_blank" href="{{goods.goods.attach}}">点击查看</a>
+                                <span ng-if="!goods.goods.attach">无</span>
+                            </p>
+                            <p>平台SKU编码:<span ng-bind="goods.batchCode || '-'"></span></p>
+                        </div>
+                        <div class="info-text" ng-if="!goods.goods">
                             <p>包装:<span ng-bind="goods.packaging || '-'"></span></p>
                             <p>包装数量:<span ng-bind="goods.minPackQty || '-'"></span></p>
                             <p>单位:<span ng-bind="goods.unit || '-'"></span></p>
@@ -42,7 +64,7 @@
                                 <a ng-if="goods.attach" target="_blank" href="{{goods.attach}}">点击查看</a>
                                 <span ng-if="!goods.attach">无</span>
                             </p>
-                            <p>平台SKU编码:<span ng-bind="goods.batchCode"></span></p>
+                            <p>平台SKU编码:<span ng-bind="goods.batchCode || '-'"></span></p>
                         </div>
                     </div>
                 </div>
@@ -67,13 +89,21 @@
                         <th>在售数量</th>
                         <th>库存总数</th>
                     </tr>
-                    <tr>
+                    <tr ng-if="goods.goods">
                         <td ng-bind="goods.prodNum || '-'">111</td>
-                        <td ng-bind="goods.frozen">-</td>
+                        <td ng-bind="goods.frozen || '-'">-</td>
                         <!--<td>-</td>-->
                         <td>-</td>
-                        <td ng-bind="goods.reserve">11</td>
-                        <td ng-bind="goods.reserve + goods.frozen">11</td>
+                        <td ng-bind="goods.reserve || '-'">11</td>
+                        <td ng-bind="(goods.reserve + goods.frozen) || '-'">11</td>
+                    </tr>
+                    <tr ng-if="!goods.goods">
+                        <td ng-bind="goods.prodNum || '-'">111</td>
+                        <td ng-bind="goods.frozen || '-'">-</td>
+                        <!--<td>-</td>-->
+                        <td>-</td>
+                        <td ng-bind="goods.reserve || '-'">11</td>
+                        <td ng-bind="(goods.reserve + goods.frozen) || '-'">11</td>
                     </tr>
                 </table>
             </div>
@@ -96,15 +126,25 @@
                         <th>销售方式</th>
                         <th>是否可拆卖</th>
                     </tr>
-                    <tr ng-repeat="price in goods.prices">
+                    <tr ng-repeat="price in goods.goods.prices" ng-if="goods.goods">
+                        <td ng-bind="price.start + '+'">111</td>
+                        <td ng-bind="getPrice(goods.goods.currencyName, price) || '-'">11</td>
+                        <td ng-if="$first" rowspan="{{goods.goods.prices.length}}">
+                            <span ng-bind="goods.goods.minDelivery || '-'"></span>-<span ng-bind="goods.goods.maxDelivery || '-'"></span>
+                        </td>
+                        <td ng-if="$first" rowspan="{{goods.goods.prices.length}}" ng-bind="goods.goods.minBuyQty || '-'">11</td>
+                        <td ng-if="$first" rowspan="{{goods.goods.prices.length}}" ng-bind="goods.goods.selfSale || '-'">11</td>
+                        <td ng-if="$first" rowspan="{{goods.goods.prices.length}}" ng-bind="breakUpStr(goods.goods.breakUp) || '-'">11</td>
+                    </tr>
+                    <tr ng-repeat="price in goods.prices" ng-if="!goods.goods">
                         <td ng-bind="price.start + '+'">111</td>
-                        <td ng-bind="getPrice(goods.currencyName, price)">11</td>
+                        <td ng-bind="getPrice(goods.currencyName, price) || '-'">11</td>
                         <td ng-if="$first" rowspan="{{goods.prices.length}}">
-                            <span ng-bind="goods.minDelivery"></span>-<span ng-bind="goods.maxDelivery"></span>
+                            <span ng-bind="goods.minDelivery || '-'"></span>-<span ng-bind="goods.maxDelivery || '-'"></span>
                         </td>
-                        <td ng-if="$first" rowspan="{{goods.prices.length}}" ng-bind="goods.minBuyQty">11</td>
-                        <td ng-if="$first" rowspan="{{goods.prices.length}}" ng-bind="goods.selfSale">11</td>
-                        <td ng-if="$first" rowspan="{{goods.prices.length}}" ng-bind="breakUpStr(goods.breakUp)">11</td>
+                        <td ng-if="$first" rowspan="{{goods.prices.length}}" ng-bind="goods.minBuyQty || '-'">11</td>
+                        <td ng-if="$first" rowspan="{{goods.prices.length}}" ng-bind="goods.selfSale || '-'">11</td>
+                        <td ng-if="$first" rowspan="{{goods.prices.length}}" ng-bind="breakUpStr(goods.breakUp) || '-'">11</td>
                     </tr>
                 </table>
             </div>

+ 583 - 0
src/main/webapp/resources/view/admin/product/saleProductManage.html

@@ -0,0 +1,583 @@
+<div id="manage">
+    <div class="manage-form">
+        <div class="form-item">
+            <span class="item-title">物料录入时间:</span>
+            <div class="screen">
+                <div class="radio-block fl">
+                    <label class="com-check-radio">
+                        <input type="radio" id="oneMonth" name="date" ng-click="setFilters('dateArea', 'oneMonth')" ng-checked="dateArea == 'oneMonth'">
+                        <label for="oneMonth"></label>
+                        30天
+                    </label>
+                    <label class="com-check-radio">
+                        <input type="radio" id="threeMonth" name="date" ng-click="setFilters('dateArea', 'threeMonth')" ng-checked="dateArea == 'threeMonth'">
+                        <label for="threeMonth"></label>
+                        90天
+                    </label>
+                    <label class="com-check-radio">
+                        <input type="radio" id="sixMonth" name="date" ng-click="setFilters('dateArea', 'sixMonth')" ng-checked="dateArea == 'sixMonth'">
+                        <label for="sixMonth"></label>
+                        180天
+                    </label>
+                    <label class="com-check-radio">
+                        <input type="radio" id="allMonth" name="date" ng-click="setFilters('dateArea', 'allMonth')" ng-checked="dateArea == 'allMonth'">
+                        <label for="allMonth"></label>
+                        不限
+                    </label>
+                    <label class="com-check-radio">
+                        <input type="radio" id="autoMonth" name="date" ng-click="setFilters('dateArea', 'autoMonth')" ng-checked="dateArea == 'autoMonth'">
+                        <label for="autoMonth"></label>
+                        自定义
+                    </label>
+                </div>
+                <div class="sreach fr">
+                    <div  ng-show="dateArea == 'autoMonth'" class="date fl">
+                        <div class="data-input">
+                            <input id="start" type="text" ng-model="startDate" readonly="readonly"
+                                   class="form-control select-adder" placeholder="起始时间"
+                                   datepicker-popup="yyyy-MM-dd"
+                                   is-open="condition[0].open"
+                                   current-text="今天" clear-text="清除" close-text="关闭"
+                                   datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+                                   ng-click="openDatePicker($event, condition, 0,1)"
+                                   ng-change="onDateCondition(1, startDate)"/>
+                            <button class="open" ng-click="openDatePicker($event, condition, 0)"></button>
+                        </div>
+                        <strong>–</strong>
+                        <div class="data-input">
+                            <input id="end" type="text" ng-model="endDate" readonly="readonly"
+                                   class="form-control select-adder" placeholder="结束时间"
+                                   datepicker-popup="yyyy-MM-dd"
+                                   is-open="condition[1].open"
+                                   current-text="今天" clear-text="清除" close-text="关闭"
+                                   datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+                                   ng-click="openDatePicker($event, condition, 1, 2)"
+                                   ng-change="onDateCondition(2, endDate)"/>
+                            <button class="open" ng-click="openDatePicker($event, condition, 1)"></button>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="form-item" style="background:#f5f5f5;">
+            <span class="item-title">条件筛选:</span>
+            <span>
+                <a ng-click="clearClick()">清空条件</a>
+                <a ng-click="searchClick()">确认筛选</a>
+            </span>
+            <span style="float:right">
+                <a ng-click="moreInfo()">更多信息</a>
+            </span>
+        </div>
+        <div class="form-top">
+            <div class="form-inline">
+                <div class="form-group form-group-sm">
+                    <label class="control-label">
+                        <span>物料名称:</span>
+                    </label>
+                    <div class="select-three">
+                        <select class="form-control"
+                                ng-model="kindPojo.first"
+                                ng-options="key as value.nameCn for (key,value) in kindInfo"
+                                ng-change="kindPojo.second='';kindPojo.third='';"
+                                style="opacity: 1;">
+                            <option value="">一级类目</option>
+                        </select>
+                        <select class="form-control" ng-model="kindPojo.second"
+                                ng-options="key as value.nameCn for (key,value) in kindInfo[kindPojo.first].children"
+                                ng-change="kindPojo.third='';"
+                                style="opacity: 1;">
+                            <option value="">二级类目</option>
+                        </select>
+                        <select class="form-control" ng-model="kindPojo.third" style="opacity: 1;"
+                                ng-options="value as value.nameCn for value in kindInfo[kindPojo.first].children[kindPojo.second].children">
+                            <option value="">三级类目</option>
+                        </select>
+                    </div>
+                </div>
+            </div>
+            <div class="form-inline">
+                <div class="form-group form-group-sm">
+                    <label class="control-label">
+                        <span>型号:</span>
+                        <input class="form-control" type="text" ng-model="goodsFilter.code" placeholder="型号">
+                    </label>
+                </div>
+                <div class="form-group form-group-sm">
+                    <label class="control-label">
+                        <span>品牌:</span>
+                        <input type="text" placeholder="品牌中英文名称" class="form-control" ng-model="goodsFilter.brand">
+                    </label>
+                </div>
+                <div class="form-group form-group-sm">
+                    <label class="control-label">
+                        <span>产品类型:</span>
+                        <select name="" id="8" ng-model="goodsFilter.standard" class="form-control">
+                            <option value="">全部</option>
+                            <option value="true">标准产品</option>
+                            <option value="false">非标准产品</option>
+                        </select>
+                    </label>
+                </div>
+                <div class="form-group form-group-sm">
+                    <label class="control-label">
+                        <span>图片类型:</span>
+                        <select name="" id="9" ng-model="goodsFilter.haveImg" class="form-control">
+                            <option value="">全部</option>
+                            <option value="true">自有图片</option>
+                            <option value="false">默认图片</option>
+                        </select>
+                    </label>
+                </div>
+            </div>
+        </div>
+        <div class="form-item">
+            <span class="item-title">查看报表:</span>
+            <span ng-if="startFormatDate">
+                <a ng-href="#/merchantProducts?startDate={{startFormatDate}}&endDate={{endFormatDate}}">商家产品数</a>
+                <a ng-href="#/brandProductsCount?startDate={{startFormatDate}}&endDate={{endFormatDate}}">品牌产品数</a>
+                <a ng-href="#/categoryNumber?startDate={{startFormatDate}}&endDate={{endFormatDate}}">品类产品数</a>
+            </span>
+            <span ng-if="!startFormatDate">
+                <a ng-href="#/merchantProducts">商家产品数</a>
+                <a ng-href="#/brandProductsCount">品牌产品数</a>
+                <a ng-href="#/categoryNumber">品类产品数</a>
+            </span>
+        </div>
+        <div class="form-item">
+            <span class="item-title">更多操作:</span>
+            <span>
+                <a ng-click="batchDown()">批量下架</a>
+                <!--<a title="此功能没有开放">产品导出</a>-->
+                <a ng-click="exportClick()">产品导出</a>
+                <strong>请注意:当无选择项时,默认导出所有前1000条数据!</strong>
+            </span>
+            <span style="float: right;font-size: 14px">共<span style="color: red;" ng-bind="totalCount">3424</span>个产品</span>
+        </div>
+    </div>
+    <div class="manage-table">
+        <table class="table" ng-table="manageTableParams">
+            <thead>
+            <tr>
+                <th width="120">
+                    <label>
+                        <input id="AllChoose" type="checkbox" ng-checked="isChooseAll" ng-click="chooseAll()">全选当前页
+                    </label>
+                </th>
+                <th width="120">操作</th>
+                <th width="160" ng-if="titleInShow['商家ID']">商家ID</th>
+                <th width="160" ng-if="titleInShow['商家名称']">商家名称</th>
+                <th width="160">产品信息</th>
+                <th width="160" ng-if="titleInShow['SKU编码']">SKU编码</th>
+                <th width="160" ng-if="titleInShow['产品编号']">产品编号</th>
+                <th width="160" ng-if="titleInShow['封装']">封装</th>
+                <th width="160" ng-if="titleInShow['梯度']">梯度</th>
+                <th width="160" ng-if="titleInShow['单价']">单价</th>
+                <th width="160" ng-if="titleInShow['交期(天)']">交期(天)</th>
+                <th width="160" ng-if="titleInShow['包装']">包装</th>
+                <th width="160" ng-if="titleInShow['包装数量']">包装数量</th>
+                <th width="160" ng-if="titleInShow['起订量']">起订量</th>
+                <th width="160" ng-if="titleInShow['拆包售卖']">拆包售卖</th>
+                <th width="160" ng-if="titleInShow['在售数量']">在售数量</th>
+                <th width="160" ng-if="titleInShow['锁库数']">锁库数</th>
+                <th width="160" ng-if="titleInShow['冻结数量']">冻结数量</th>
+                <th width="160" ng-if="titleInShow['库存总数']">库存总数</th>
+                <th width="160" ng-if="titleInShow['在售状态']">在售状态</th>
+                <th width="160" ng-if="titleInShow['销售方式']">销售方式</th>
+                <th width="160" ng-if="titleInShow['创建人']">创建人</th>
+                <th width="160" ng-if="titleInShow['创建时间']">创建时间</th>
+                <th width="160" ng-if="titleInShow['产品类型']">产品类型</th>
+                <th width="160" ng-if="titleInShow['图片类型']">图片类型</th>
+                <th width="160" ng-if="titleInShow['产品图片']">产品图片</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-repeat="list in goodsList">
+                <td>
+                    <input id="{{$index+1}}" type="checkbox" ng-checked="list.isChoosed" ng-click="chooseOne(list)">
+                </td>
+                <td>
+                    <a target="_blank" href="admin#/manage/{{list.id}}?type=product">详情</a>
+                    <a ng-if="list.audited == 0" ng-click="auditProduct(list)">审核</a>
+                    <br/>
+                    <a ng-if="list.goods" ng-click="journalProduct(list)" style="margin-left:-1px;">日志</a>
+                    <a ng-if="list.status == 601 || list.status == 602" ng-click="soldOutProduct([list.batchCode])">下架</a>
+                </td>
+                <td ng-if="titleInShow['商家ID']">
+                    <span ng-if="list.goods" ng-bind="list.goods.enUU || '-'">商家ID</span>
+                    <span ng-if="!list.goods" ng-bind="list.enUU || '-'">商家ID</span>
+                </td>
+                <td ng-if="titleInShow['商家名称']">
+                    <span ng-if="list.goods" ng-bind="list.goods.storeName || '-'">商家名称</span>
+                    <span ng-if="!list.goods" ng-bind="list.enterpriseName || '-'">商家名称</span>
+                </td>
+                <td>
+                    <p ng-if="list.goods">物料名称:<span ng-bind="list.goods.kindNameCn || '-'">****</span></p>
+                    <p ng-if="!list.goods">物料名称:<span ng-bind="list.kind || list.kinden|| '-'">****</span></p>
+                    <p ng-if="list.goods">型号:<span ng-bind="list.goods.code || '-'">****</span></p>
+                    <p ng-if="!list.goods">型号:<span ng-bind="list.cmpCode || '-'">****</span></p>
+                    <p ng-if="list.goods">品牌:<span ng-bind="list.goods.brandNameEn || '-'">****</span></p>
+                    <p ng-if="!list.goods">品牌:<span ng-bind="list.pbrand || list.pbranden || '-'">****</span></p>
+                </td>
+                <td ng-if="titleInShow['SKU编码']">
+                    <span ng-if="list.goods" ng-bind="list.goods.batchCode || '-'">SKU编码</span>
+                    <span ng-if="!list.goods" ng-bind="list.batchCode || '-'">SKU编码</span>
+                </td>
+                <td ng-if="titleInShow['产品编号']">
+                    <span ng-if="list.goods" ng-bind="list.goods.prodNum || '-'">产品编号</span>
+                    <span ng-if="!list.goods" ng-bind="list.prodNum || '-'">产品编号</span>
+                </td>
+                <td ng-if="titleInShow['封装']">
+                    <span ng-if="list.goods" ng-bind="list.goods.encapsulation || '-'">封装</span>
+                    <span ng-if="!list.goods" ng-bind="list.encapsulation || '-'">封装</span>
+                </td>
+                <td ng-if="titleInShow['梯度']">
+                    <div ng-repeat="qty in list.goods.prices" ng-if="list.goods">
+                          <span ng-if="!$last">
+                              <span ng-bind="qty.start"></span>-<span ng-bind="qty.end"></span>
+                          </span>
+                        <span ng-if="$last">
+                              <span ng-bind="qty.start"></span>以上
+                          </span>
+                    </div>
+                    <div ng-repeat="qty in list.prices" ng-if="!list.goods">
+                          <span ng-if="!$last">
+                              <span ng-bind="qty.start"></span>-<span ng-bind="qty.end"></span>
+                          </span>
+                        <span ng-if="$last">
+                              <span ng-bind="qty.start"></span>以上
+                          </span>
+                    </div>
+                </td>
+                <td ng-if="titleInShow['单价']">
+                    <div ng-repeat="price in list.goods.prices" ng-if="list.goods">
+                        <span ng-bind="list.currencyName == 'RMB' ? '¥' : '$'"></span>
+                        <span ng-bind="list.currencyName == 'RMB' ? price.rMBPrice : price.uSDPrice"></span>
+                    </div>
+                    <div ng-repeat="price in list.prices" ng-if="!list.goods">
+                        <span ng-bind="list.currencyName == 'RMB' ? '¥' : '$'"></span>
+                        <span ng-bind="list.currencyName == 'RMB' ? price.rMBPrice : price.uSDPrice"></span>
+                    </div>
+                </td>
+                <td ng-if="titleInShow['交期(天)']">
+                    <div ng-if="list.goods && list.goods.b2cMinDelivery != list.goods.b2cMaxDelivery">
+                        <span ng-bind="list.goods.b2cMinDelivery || '-'">交期(天)</span>-
+                        <span ng-bind="list.goods.b2cMaxDelivery || '-'">交期(天)</span>
+                    </div>
+                    <div ng-if="!list.goods && list.b2cMinDelivery != list.b2cMaxDelivery">
+                        <span ng-bind="list.b2cMinDelivery || '-'">交期(天)</span>-
+                        <span ng-bind="list.b2cMaxDelivery || '-'">交期(天)</span>
+                    </div>
+                    <span ng-if="list.goods && list.goods.b2cMinDelivery == list.goods.b2cMaxDelivery" ng-bind="list.goods.b2cMinDelivery || '-'">交期(天)</span>
+                    <span ng-if="!list.goods && list.b2cMinDelivery == list.b2cMaxDelivery" ng-bind="list.b2cMinDelivery || '-'">交期(天)</span>
+                </td>
+                <td ng-if="titleInShow['包装']">
+                    <span ng-if="list.goods" ng-bind="list.goods.packaging || '-'">包装</span>
+                    <span ng-if="!list.goods" ng-bind="list.packaging || '-'">包装</span>
+                </td>
+                <td ng-if="titleInShow['包装数量']">
+                    <span ng-if="list.goods" ng-bind="list.goods.minPackQty || '-'">包装</span>
+                    <span ng-if="!list.goods" ng-bind="list.minPackQty || '-'">包装</span>
+                </td>
+                <td ng-if="titleInShow['起订量']">
+                    <span ng-if="list.goods" ng-bind="list.goods.minBuyQty || '-'">起订量</span>
+                    <span ng-if="!list.goods" ng-bind="list.minBuyQty || '-'">起订量</span>
+                </td>
+                <td ng-if="titleInShow['拆包售卖']">
+                    <span ng-if="list.breakUp">可拆卖</span>
+                    <span ng-if="!list.breakUp">不可拆卖</span>
+                </td>
+                <td ng-if="titleInShow['在售数量']">
+                    <span ng-if="list.goods" ng-bind="list.goods.reserve">在售数量</span>
+                    <span ng-if="!list.goods" ng-bind="list.reserve">在售数量</span>
+                </td>
+                <td ng-if="titleInShow['锁库数']">
+                    <span ng-bind="'-'">锁库数</span>
+                </td>
+                <td ng-if="titleInShow['冻结数量']">
+                    <span ng-if="list.goods" ng-bind="list.goods.frozen">冻结数量</span>
+                    <span ng-if="!list.goods" ng-bind="list.frozen">冻结数量</span>
+                </td>
+                <td ng-if="titleInShow['库存总数']">
+                    <span ng-if="list.goods" ng-bind="list.goods.reserve + list.goods.frozen">库存总数</span>
+                    <span ng-if="!list.goods" ng-bind="list.reserve + list.frozen">库存总数</span>
+                </td>
+                <td ng-if="titleInShow['在售状态']">
+                    <span ng-if="list.goods" ng-bind="saleStatus[list.goods.status] || '-'">在售状态</span>
+                    <span ng-if="!list.goods" ng-bind="saleStatus[list.status] || '-'">在售状态</span>
+                </td>
+                <td ng-if="titleInShow['销售方式']">
+                    <span ng-if="list.goods" ng-bind="list.goods.selfSale || '-'">销售方式</span>
+                    <span ng-if="!list.goods" ng-bind="list.selfSale || '-'">销售方式</span>
+                </td>
+                <td ng-if="titleInShow['创建人']">
+                    <span ng-if="list.goods" ng-bind="list.goods.publisherName || '-'">创建人</span>
+                    <span ng-if="!list.goods" ng-bind="list.publisherName || '-'">创建人</span>
+                </td>
+                <td ng-if="titleInShow['创建时间']">
+                    <span ng-if="list.goods" ng-bind="list.goods.createdDate | date: 'yyyy-MM-dd HH:mm:ss' || '-'">创建时间</span>
+                    <span ng-if="!list.goods" ng-bind="list.createTime | date: 'yyyy-MM-dd HH:mm:ss' || '-'">创建时间</span>
+                </td>
+                <td ng-if="titleInShow['产品类型']">
+                    <span ng-if="list.goods" ng-bind="list.goods.uuid ? '标准' : '非标'"></span>
+                    <span ng-if="!list.goods" ng-bind="list.uuid ? '标准' : '非标'"></span>
+                </td>
+                <td ng-if="titleInShow['图片类型']">
+                    <span ng-if="list.goods" ng-bind="list.goods.img ? '自有图片' : '默认图片'"></span>
+                    <span ng-if="!list.goods" ng-bind="list.cmpImg ? '自有图片' : '默认图片'"></span>
+                </td>
+                <td ng-if="titleInShow['产品图片']">
+                    <img ng-if="list.goods" ng-src="{{list.goods.img || 'static/img/store/common/default.png'}}" ng-click="showImg(list.img)" alt="产品图片">
+                    <img ng-if="!list.goods" ng-src="{{list.cmpImg || 'static/img/store/common/default.png'}}" ng-click="showImg(list.img)" alt="产品图片">
+                </td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+<style>
+    .ng-table-pager {
+        position: absolute;
+        right: 0;
+        margin-top: 20px;
+    }
+    #manage input[type=checkbox]{
+        position:relative;
+        top:3px;
+        left:-3px;
+    }
+
+    .manage-form .form-top{
+        padding-top:15px;
+        border:1px solid #f5f5f5;
+    }
+    .manage-form .form-top .form-inline{
+        display: inline-block;
+        margin-bottom:10px;
+    }
+    .manage-form .form-top .form-group{
+        display: inline-block;
+        margin:0 5px;
+        vertical-align: middle;
+        line-height: 30px;
+    }
+
+    .manage-form .form-top label{
+        text-align: right;
+        font-size: 14px;
+        color:#666;
+    }
+
+    .manage-form .form-top label span{
+        display:inline-block;
+        width:80px;
+        font-weight:bold;
+        color:#2fa4e7;
+    }
+
+    .manage-form .form-top label input, .manage-form .form-top label select{
+        display: inline-block;
+        width:110px;
+        height:25px;
+        line-height: 25px;
+        padding:0 2px;
+        margin:0;
+    }
+    .manage-form .form-top .select-three {
+        display: inline-block;
+        margin:0;
+    }
+    .manage-form .form-top .select-three select{
+        display: inline-block;
+        min-width:140px;
+        height:25px;
+        line-height: 25px;
+        padding:0 2px;
+        margin:0;
+    }
+
+    .manage-table{
+        overflow-y: auto;
+    }
+
+    .manage-table table{
+        table-layout: fixed;
+        font-size: 14px;
+        color:#666;
+        border-collapse:separate;
+        border-spacing:0 5px;
+    }
+    .manage-table table thead tr{
+        height:50px;
+        line-height: 50px;
+        background: #f5f5f5;
+    }
+    .manage-table table thead tr label{
+        margin:0;
+    }
+    .form-control{
+        border-radius: 3px;
+    }
+    .manage-table table thead th{
+        text-align: center;
+        border:none;
+    }
+    .manage-table table thead th:first-child{
+        text-align: left;
+        padding-left:20px;
+    }
+    .manage-table table tbody{}
+    .manage-table table tbody tr{
+        height:72px;
+        margin-bottom:10px;
+        background: #fff;
+    }
+    .manage-table table tbody tr:hover{
+        position:relative;
+        top:2px;
+        left:2px;
+        cursor:pointer;
+        box-shadow:0 0 10px #e0e0e0;
+        background: #fff;
+    }
+    .manage-table table tbody td{
+        height:74px;
+        border:none;
+        vertical-align: middle;
+        text-align: center;
+    }
+    .manage-table table tbody td:first-child{
+        text-align: left;
+        padding-left:20px;
+    }
+    .manage-table table tbody td:nth-child(2){
+        padding:0;
+    }
+    .manage-table table tbody td p{
+        margin:0;
+        text-align: left;
+        font-size: 14px;
+        line-height: 18px;
+        width:100%;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space:nowrap;
+    }
+    .select-adder{
+        background:url("static/img/user/images/xiala.png") right no-repeat ;
+        background-position-x: 180px;
+    }
+    .manage-table table tbody td img{
+        margin:0;
+        width:50%;
+    }
+    .manage-table table tbody td p span{
+        margin:0;
+        font-size: 14px;
+        line-height: 18px;
+    }
+    .manage-table table tbody td a{
+        display:inline-block;
+        padding:0 8px;
+        margin:2px;
+        line-height: 18px;
+        height:20px;
+        border:1px solid #35a6e8;
+        border-radius:3px;
+        font-size: 12px;
+        color:#666;
+        background: #fff;
+        text-decoration: none;
+    }
+    .manage-table table tbody td a:hover{
+        background: #35a6e8;
+        cursor:pointer;
+        color:#fff;
+    }
+</style>
+<style>
+    .fr{
+        float:right;
+    }
+    .fl{
+        float:left;
+    }
+    /*搜索时间筛选 start*/
+    .manage-form .form-item .screen {
+        display: inline-block;
+        padding: 0;
+        vertical-align: middle;
+    }
+    .manage-form .com-check-radio{
+        font-size: 14px;
+        font-weight: normal;
+        line-height: 32px;
+        margin-right: 10px;
+        cursor:pointer;
+    }
+    .manage-form .screen .sreach .date{
+        margin:0 20px;
+    }
+    .manage-form .screen .sreach .date input{
+        width: 117px;
+        text-align: left;
+        border: 1px solid #5078cb;
+    }
+    .manage-form .screen .sreach .date input:hover{
+        cursor: pointer;
+    }
+    .manage-form .screen .sreach .date strong{
+        float: left;
+        line-height: 32px;
+        color: #999;
+        margin: 0 5px;
+    }
+    .manage-form .data-input{
+        float: left;
+        position: relative;
+    }
+    .manage-form .data-input button.open{
+        position: absolute;
+        right: 1px;
+        top: 1px;
+        width: 20px;
+        height: 30px;
+        background: url('static/img/user/images/xiala.png') right no-repeat #fff !important;
+        background-position-x: 100% !important;
+        border: none;
+    }
+    .manage-form .screen .sreach .date input.form-control{
+        padding: 6px 6px;
+        border-radius: 2px;
+        height:32px;
+    }
+    .manage-form .screen .radio-block {
+        width: auto;
+    }
+    .manage-form .form-item{
+        font-size:14px;
+        vertical-align: top;
+        line-height:40px;
+    }
+    .manage-form .form-item span{}
+    .manage-form .form-item span a{
+        display:inline-block;
+        text-decoration:none;
+        height:26px;
+        line-height:26px;
+        color:#2fa4e7;
+        border:1px solid #2fa4e7;
+        border-radius:4px;
+        padding:0 10px;
+        margin:0 10px;
+    }
+    .manage-form .form-item span a:hover{
+        cursor:pointer;
+        background: #2fa4e7;
+        color:#fff;
+    }
+    .manage-form .form-item .item-title{
+        margin-left:5px;
+        font-weight:bold;
+    }
+</style>

+ 7 - 2
src/main/webapp/resources/view/admin/store_application_maintenance.html

@@ -277,14 +277,19 @@
 				<td>
 					<p ng-if="application.status == authType.PASS.name">已通过</p>
 					<p class="wait" ng-if="application.status == authType.PREPARE.name">待审核</p>
+					<p class="wait" ng-if="application.status == authType.CHECK.name">已通过初审</p>
 					<p class="no-pass" ng-if="application.status == authType.UNPASS.name">未通过</p>
 				</td>
 				<td>
 					<div ng-if="application.status === 'PREPARE'">
-						<a class="apply-bg btn" href="javascript:void(0)" ng-click="auditQualification(application)">资质审核</a><br/>
+						<a class="apply-bg btn" href="javascript:void(0)" ng-click="auditQualification(application)">初审</a><br/>
 						<span style="color: #9d9d9d">已申请 {{application.time.day}}天{{application.time.hour}}时</span>
 					</div>
-					<div ng-if="application.status !== 'PREPARE'">
+					<div ng-if="application.status === 'CHECK'">
+						<a class="apply-bg btn" href="javascript:void(0)" ng-click="auditQualification(application)">终审</a><br/>
+						<span style="color: #9d9d9d">已初审 {{application.time.day}}天{{application.time.hour}}时</span>
+					</div>
+					<div ng-if="application.status === 'PASS' || application.status === 'UNPASS'">
 						<a class="detail-bg btn" href="javascript:void(0)" ng-click="auditQualification(application)">查看详情</a>
 					</div>
 				</td>

+ 12 - 4
src/main/webapp/resources/view/admin/store_qualification_maintenance.html

@@ -753,13 +753,21 @@
         </div>
 	</div>
 
-	<div class="deal-btn">
-		<button type="button" class="pass btn btn-primary" ng-if="application.status === 'PREPARE' "  ng-click="audit(true)">通过</button>
-		<button type="button" class="no-pass btn btn-primary" ng-if="application.status === 'PREPARE' " ng-click="auditUnpass()">不通过</button>
+	<!-- 初审 -->
+	<div class="deal-btn" ng-if="application.status === 'PREPARE' ">
+		<button type="button" class="pass btn btn-primary" ng-click="audit(true)">提交</button>
+	</div>
+	<!-- /end 初审 -->
+
+	<!-- 终审 -->
+	<div class="deal-btn" ng-if="application.status !== 'PREPARE' ">
+		<button type="button" class="pass btn btn-primary" ng-if="application.status === 'CHECK' "  ng-click="audit(true)">通过</button>
+		<button type="button" class="no-pass btn btn-primary" ng-if="application.status === 'CHECK' " ng-click="auditUnpass()">不通过</button>
 		<button type="button" class="edit btn btn-primary" ng-if="application.status !== 'PREPARE' && canUpdate && !updateState"  ng-click="changeToUpdate(true)">修改</button>
 		<button type="button" class="edit btn btn-primary" ng-if="application.status !== 'PREPARE' && updateState"  ng-click="saveUpdate()">保存</button>
 		<button type="button" class="off btn btn-primary" ng-if="application.status !== 'PREPARE' && updateState" ng-click="changeToUpdate(false)">取消</button>
 	</div>
+	<!-- /end 终审 -->
 </div>
 
 <script type="text/javascript">
@@ -772,4 +780,4 @@
 	document.onmouseup=function(){
 		window.clearTimeout(oTime);
 	}
-</script>
+</script>

+ 1 - 1
src/main/webapp/resources/view/sso/left_nav.html

@@ -51,7 +51,7 @@
 		<li ng-class="{'active' : active == 'sso_invoice'}"><span ui-sref="ssoInvoice">开票信息</span></li>
 		<li ng-class="{'active' : active == 'vendor_pay_center'}" ng-if="userInfo.enterprise.uu && userInfo.enterprise.isVendor == 313"><span ui-sref="gatheringAccount({'tab': 'accountTab'})">收款账户</span></li>
 		<li ng-class="{'active' : active == 'buyer_pay_center'}"><span ui-sref="payAccount({'status': 'pay-info'})">付款账户</span></li>
-		<li ng-class="{'active' : active == 'baseInfo_myRequest'}"><span ui-sref="baseInfo_myRequest">企业圈</span></li>
+		<li ng-if="personage" ng-class="{'active' : active == 'baseInfo_myRequest'}"><span ui-sref="baseInfo_myRequest">企业圈</span></li>
 		<li ng-class="{'active' : active == 'approvalflow_log'}"><span ui-sref="approvalflow_log">操作日志</span></li>
 		<!--<li ng-class="{'active' : active == 'approvalflow_flow'}"><span ui-sref="approvalflow_flow">审批流</span></li>-->
 		<!--<li ng-class="{'active' : active == 'vendor_logistics'}">-->

+ 1 - 1
src/main/webapp/resources/view/sso/rolePermission.html

@@ -906,8 +906,8 @@
 <div class="count user_right fr" ng-click="hideList()">
     <div class="com_tab">
         <ul>
-            <li ng-class="{active: tab == 'b2c'}" ng-click="setTab('b2c')"><a href="javascript:void(0)">商城角色</a></li>
             <li ng-class="{active: tab == 'b2b'}" ng-click="setTab('b2b')"><a href="javascript:void(0)">B2B角色</a></li>
+            <li ng-class="{active: tab == 'b2c'}" ng-click="setTab('b2c')"><a href="javascript:void(0)">商城角色</a></li>
         </ul>
     </div>
     <!--安全设置-->

+ 4 - 0
src/main/webapp/resources/view/sso/ssoAddress.html

@@ -235,6 +235,10 @@
         font-size: 14px;
         margin-left:30px;
     }
+    .logistic-content .log-tab .table tbody tr td{
+        white-space: normal;
+        overflow:unset;
+    }
 </style>
 <!--右侧主体部分-->
 <div class="user_right fr" id="account_manager">

+ 1 - 0
src/main/webapp/resources/view/usercenter/b2b/Purc/cart.html

@@ -473,6 +473,7 @@
 		font-size: 14px !important;
 	}
 	#empty_info {
+		padding-top:20px;
 		padding-left: 60px;
 		padding-bottom: 40px;
 	}

+ 1 - 0
src/main/webapp/resources/view/usercenter/b2b/Purc/inquiry_unapply.html

@@ -535,6 +535,7 @@
     font-size: 14px !important;
   }
   #empty_info {
+    padding-top:20px;
     padding-left: 60px;
     padding-bottom: 40px;
   }

+ 1 - 0
src/main/webapp/resources/view/usercenter/b2b/Purc/purchaseInquiryCtrl.html

@@ -553,6 +553,7 @@
     font-size: 14px !important;
   }
   #empty_info {
+    padding-top:20px;
     padding-left: 60px;
     padding-bottom: 40px;
   }

+ 1 - 0
src/main/webapp/resources/view/usercenter/b2b/Purc/tender_answer_list.html

@@ -547,6 +547,7 @@
     font-size: 14px !important;
   }
   #empty_info {
+    padding-top:20px;
     padding-left: 60px;
     padding-bottom: 40px;
   }

+ 1 - 0
src/main/webapp/resources/view/usercenter/b2b/Purc/tenderlist.html

@@ -475,6 +475,7 @@
     font-size: 14px !important;
   }
   #empty_info {
+    padding-top:20px;
     padding-left: 60px;
     padding-bottom: 40px;
   }

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