Browse Source

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

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

+ 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 = 5000;
+
     /**
      * 文件名
      */

+ 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"));
 

+ 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)

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

@@ -1,22 +1,30 @@
 package com.uas.platform.b2c.prod.commodity.controller;
 
 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.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 +35,26 @@ 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.HttpServletResponse;
 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 +80,6 @@ public class GoodsController {
 	@Autowired
 	private GoodsDao goodsDao;
 
-	@Autowired
-	private SearchService searchService;
-
     /**
      * 发布(上架)产品
      *
@@ -828,6 +841,37 @@ 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, PageParams params, HttpServletResponse response,
+                                           @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为空");
+        }
+        FastDateFormat dateFormat = FastDateFormat.getInstance("yyyy年MM月dd日 HH:mm");
+        modelAndView.addObject("dateFormat", dateFormat);
+        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 goodsId
@@ -838,4 +882,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;
+    }
 }

+ 27 - 14
src/main/java/com/uas/platform/b2c/prod/commodity/controller/ProductController.java

@@ -102,11 +102,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 +119,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 +187,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 +215,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 +250,7 @@ public class ProductController {
 	/**
 	 * 一键匹配物料信息
 	 * @param type  匹配类型
-	 * @return
+	 * @return ResultMap 返回结果集
 	 */
 	@RequestMapping(value = "/matchbytype/{type}", method = RequestMethod.GET)
 	@ResponseBody
@@ -256,10 +262,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 +274,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);
 	}
 

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

@@ -562,6 +562,9 @@ public interface GoodsDao extends JpaSpecificationExecutor<Goods>, JpaRepository
     @Query(value = "select g from Goods g where g.productid =:productId order by g.id desc")
     List<Goods> findByProductIdOrderByGoodsId(@Param("productId") Long id);
 
+    @Query(value = "select g.productid from Goods g where g.productid in :ids")
+    Set<Long> findProdIds(@Param("ids") Set<Long> ids);
+
     /**
      * 获取库存数量前几的代理经销商品,Top k 查询
      *

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

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

+ 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;
+    }
 }

+ 1 - 1
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 = "";
 
 	/**

+ 32 - 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,33 @@ 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);
 }

+ 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);
+}

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

@@ -104,6 +104,13 @@ public interface ProductService {
      */
     ResultMap deleteBatch(String type, Integer isPerson);
 
+    /**
+     * 批量删除个人物料
+     * @param type
+     * @return
+     */
+    ResultMap deletePersonalProductByBatch(String type);
+
     /**
      * 单个匹配
      *

+ 376 - 182
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;
@@ -132,6 +135,7 @@ import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.RowCallbackHandler;
 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;
@@ -143,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;
@@ -160,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;
 
@@ -271,8 +279,8 @@ public class GoodsServiceImpl implements GoodsService {
     @Autowired
     private FloorsService floorsService;
 
-	@Autowired
-	private ProductDetailDao productDetailDao;
+    @Autowired
+    private ProductDetailDao productDetailDao;
 
     @Autowired
     private OrderDetailService orderDetailService;
@@ -296,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
@@ -324,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("必须选择一种币别");
@@ -543,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);
+    }
 
     /**
      * 释放库存
@@ -745,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;
+    }
 
     /**
      * 批量更新库存信息 辅助方法
@@ -926,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();
@@ -1567,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;
+    }
 
     /**
      * 用户更新在售产品的信息, 设置店铺名称
@@ -2361,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) {
@@ -2483,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) {
@@ -3005,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);
@@ -3051,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);
     }
 
@@ -3261,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() {
@@ -3271,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);
                     }
@@ -3498,22 +3512,16 @@ 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())) {
@@ -3522,9 +3530,28 @@ public class GoodsServiceImpl implements GoodsService {
                 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.setPriceGradeStr(gradeBuffer.toString());
+                goods.setPriceStr(priceBuffer.toString());
+            }
         }
-		return page;
-	}
+        return page;
+    }
 
     /**
      * 根据店铺id查找店铺所属企业enUU
@@ -3619,17 +3646,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);
@@ -3638,8 +3680,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);
@@ -3648,21 +3690,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 {
@@ -3671,9 +3713,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) {
@@ -3691,7 +3735,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)) {
@@ -3703,10 +3747,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() {
@@ -3749,7 +3793,7 @@ public class GoodsServiceImpl implements GoodsService {
      * @param product 产品信息
      * @return
      */
-    @Transactional
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = RuntimeException.class)
     @Override
     public void updateGoodsByProduct(Product product) {
         if (product == null) {
@@ -4032,4 +4076,154 @@ 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);
+        if (CollectionUtils.isNotEmpty(kindList)) {
+            kindList.forEach(kind -> {
+                if (null != kind.getKindId()) {
+                    KindInfo kindInfo = kindInfoDao.findOne(kind.getKindId());
+                    if (null != kindInfo && null != kindInfo.getParentid() && kindInfo.getParentid() != 0) {
+                        KindInfo parentKind = kindInfoDao.findOne(kindInfo.getParentid());
+                        if (null != parentKind) {
+                            kind.setSecondKind(parentKind.getNameCn());
+                            if (null != parentKind.getParentid() && parentKind.getParentid() != 0) {
+                                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;
+        }
+    }
+
 }

+ 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());
+            }
+        }
+
+    }
+}

+ 109 - 53
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;
@@ -58,12 +59,7 @@ import com.uas.platform.b2c.prod.commodity.model.ReleaseProductByBatch;
 import com.uas.platform.b2c.prod.commodity.model.UASBatchPutOnProperty;
 import com.uas.platform.b2c.prod.commodity.model.V_ProductPerson;
 import com.uas.platform.b2c.prod.commodity.model.V_ProductPrivate;
-import com.uas.platform.b2c.prod.commodity.service.GoodsHistoryService;
-import com.uas.platform.b2c.prod.commodity.service.GoodsService;
-import com.uas.platform.b2c.prod.commodity.service.ProductAttachService;
-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;
+import com.uas.platform.b2c.prod.commodity.service.*;
 import com.uas.platform.b2c.prod.commodity.type.InOutBoundType;
 import com.uas.platform.b2c.prod.commodity.type.ProductConstant;
 import com.uas.platform.b2c.prod.commodity.util.GoodsUtil;
@@ -118,6 +114,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 +275,9 @@ public class ProductServiceImpl implements ProductService {
 
     private final CommonDao commonDao;
 
+    @Autowired
+    private ProductPersonService productPersonService;
+
     @Autowired
     public ProductServiceImpl(CommonDao commonDao) {
         this.commonDao = commonDao;
@@ -449,28 +449,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
@@ -539,21 +551,39 @@ public class ProductServiceImpl implements ProductService {
      */
     private List<Goods> exportGoodsByProduct(List<V_ProductPrivate> productList) {
         List<Goods> resultList = new ArrayList<>();
+
+        Set<Long> exitGoodsOfProdIds = goodsDao.findProdIds(getProdIds(productList));
         for (V_ProductPrivate product : productList) {
-            List<Goods> goodsList = goodsDao.findByProductIdOrderByGoodsId(product.getId());
-            if (!CollectionUtils.isEmpty(goodsList)) {
-                //目前现在一颗物料只能存在一个在售产品,目前取id最大的在售产品信息
-                Goods needGoods = goodsList.get(0);
-                needGoods.setCostPrice(product.getPrice());
-                resultList.add(needGoods);
-            } else {
+            if (!exitGoodsOfProdIds.contains(product.getId())) {
                 Goods g = Goods.productConvertGoods(product);
                 resultList.add(g);
             }
         }
+        if (!CollectionUtils.isEmpty(exitGoodsOfProdIds)) {
+            String prodIdsStr = org.apache.commons.lang3.StringUtils.join(exitGoodsOfProdIds, ",");
+            String sql = new String("SELECT go_batchcode batchCode,br_name_en brandNameEn,ki_name kindNameCn," +
+                    "cmp_code code,go_spec spec,go_packaging packaging,go_mindelivery minDelivery,go_maxdelivery maxDelivery," +
+                    "go_isbreakup breakUp,go_minpackqty minPackQty,go_minbuyqty minBuyQty,go_storeid storeid,go_reserve reserve," +
+                    "go_status status,cmp_uuid uuid,go_qtyprice qtyPrice,go_minpricermb minPriceRMB,go_maxpricermb maxPriceRMB," +
+                    "go_minpriceusd minPriceUSD,go_maxpriceusd maxPriceUSD,cr_name currencyName,pr_price costPrice " +
+                    "FROM trade$goods g LEFT JOIN v$product$private on pr_id=go_productid WHERE go_id IN (SELECT max(go_id) " +
+                    "from trade$goods WHERE go_productid in (" + prodIdsStr + ") GROUP BY go_productid)");
+            List<Goods> goodsList = commonDao.query(sql, Goods.class);
+            resultList.addAll(goodsList);
+        }
         return resultList;
     }
 
+    private Set<Long> getProdIds(List<V_ProductPrivate> productList) {
+        Set<Long> prodIds = new HashSet<>();
+        if (!CollectionUtils.isEmpty(productList)) {
+            for (V_ProductPrivate productPrivate : productList) {
+                prodIds.add(productPrivate.getId());
+            }
+        }
+        return prodIds;
+    }
+
     @Override
     public List<Goods> getSelectedProducts(String idList) {
         String[] idArray = idList.split(SplitChar.COMMA);
@@ -571,7 +601,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);
@@ -649,35 +679,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) {
@@ -700,13 +722,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++;
@@ -743,6 +763,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);
@@ -1470,11 +1526,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 {

+ 26 - 48
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;
@@ -71,6 +72,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 +84,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 +184,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 +238,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 +370,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));
 					}
@@ -1840,7 +1850,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 +1868,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 +1888,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 +1927,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 +2166,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 {

+ 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位时间
 	 */

+ 12 - 0
src/main/java/com/uas/platform/b2c/prod/store/controller/StoreApplyController.java

@@ -107,6 +107,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);
+	}
+
 	/**
 	 * 保存店铺申请信息
 	 *

+ 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;
 	}

+ 81 - 44
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,30 +318,54 @@ 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' ");
+				+ "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");
 		if (!StringUtils.isEmpty(startTime)) {
-			sql.append(" and date(a.apply_create_time) >= '" + new java.sql.Date(startTime.getTime()) + "'");
+			sql.append(" where 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()) + "' ");
+		if (!StringUtils.isEmpty(endTime) && StringUtils.isEmpty(startTime)) {
+			sql.append(" where pr_create_time < '" + new java.sql.Date(endTime.getTime() + IntegerConstant.ONE_DAY_MILLISECONDS) + "' ");
 		}
-		sql.append(" order by a.apply_create_time limit " + (pageable.getPageNumber() - 1) * pageable.getPageSize() + ","
+        if (!StringUtils.isEmpty(endTime) && !StringUtils.isEmpty(startTime)) {
+            sql.append(" and pr_create_time <= '" + new java.sql.Date(endTime.getTime()) + "' ");
+        }
+		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 limit " + (pageable.getPageNumber() - 1) * pageable.getPageSize() + ","
 				+ pageable.getPageSize());
-		StringBuilder totalSql = new StringBuilder("select count(1) from `store$apply` a where a.apply_status='PASS' ");
+        StringBuilder totalSql = new StringBuilder("select count(1) from `store$apply` a left join (select pr_enuu, count(1) count from products ");
 		if (!StringUtils.isEmpty(startTime)) {
-			totalSql.append(" and date(a.apply_create_time) >= '" + new java.sql.Date(startTime.getTime()) + "'");
+			totalSql.append(" where 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()) + "' ");
+		if (!StringUtils.isEmpty(endTime) && !StringUtils.isEmpty(startTime)) {
+            totalSql.append(" and pr_create_time < '" + new java.sql.Date(endTime.getTime() + IntegerConstant.ONE_DAY_MILLISECONDS) + "' ");
 		}
+        if (!StringUtils.isEmpty(endTime) && StringUtils.isEmpty(startTime)) {
+            sql.append(" where pr_create_time < '" + new java.sql.Date(endTime.getTime() + IntegerConstant.ONE_DAY_MILLISECONDS) + "' ");
+        }
+		totalSql.append(" group by pr_enuu) p on p.pr_enuu = a.apply_store_enuu where a.apply_status='PASS' and count > 0 ");
 		Integer total = commonDao.queryForObject(totalSql.toString(), Integer.class);
 		List<StoreInfoAndProdExport> exports = commonDao.query(sql.toString(), StoreInfoAndProdExport.class);
 		return new com.uas.sso.support.Page<>(pageable.getPageNumber(), pageable.getPageSize(), exports, total);
@@ -340,16 +374,19 @@ public class StoreApplyServiceImpl implements StoreApplyService {
 	@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");
 		if (!StringUtils.isEmpty(startTime)) {
-			sql.append(" and date(a.apply_create_time) >= '" + new java.sql.Date(startTime.getTime()) + "'");
+			sql.append(" where pr_create_time >= '" + new java.sql.Date(startTime.getTime()) + "'");
+		}
+		if (!StringUtils.isEmpty(endTime) && !StringUtils.isEmpty(startTime)) {
+			sql.append(" and pr_create_time <= '" + new java.sql.Date(endTime.getTime()) + "' ");
 		}
-		if (!StringUtils.isEmpty(endTime)) {
-			sql.append(" and date(a.apply_create_time) <= '" + new java.sql.Date(endTime.getTime()) + "' ");
+		if (!StringUtils.isEmpty(endTime) && StringUtils.isEmpty(startTime)) {
+			sql.append(" where pr_create_time <= '" + new java.sql.Date(endTime.getTime()) + "' ");
 		}
-		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;
     }
 

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

@@ -1,5 +1,6 @@
 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;
@@ -336,8 +337,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


+ 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>
 

+ 2 - 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,8 @@
 					<!--class="fa fa-home"></i><span> 平台换货出货单管理</span></a></li>-->
 
 			<li class="nav-header">产品管理</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 +168,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;
 }

+ 2 - 2
src/main/webapp/resources/css/user/user.css

@@ -775,7 +775,7 @@ body {
 
 .height16 {
     width: 100%;
-    height: 16px;
+    height: 10px;
     background: #ecf2fd;
     display: inline-block;
 }
@@ -848,7 +848,7 @@ body {
 
 .height16 {
     width: 100%;
-    height: 16px;
+    height: 10px;
     background: #ecf2fd;
     display: inline-block;
 }

+ 2 - 2
src/main/webapp/resources/css/vendor/sell.css

@@ -837,7 +837,7 @@ body {
 
 .height16 {
     width:100%;
-    height:16px;
+    height:10px;
     background: #ecf2fd;
     display: inline-block;
 }
@@ -897,7 +897,7 @@ body {
 }
 .height16 {
     width:100%;
-    height:16px;
+    height:10px;
     background: #ecf2fd;
     display: inline-block;
 }

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

@@ -280,6 +280,24 @@
             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 +844,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
+            }
+        }])
+})

+ 183 - 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;
@@ -161,6 +283,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 +316,53 @@ define(['app/app'], function(app) {
         };
 
         // 产品导出事件
-        $scope.exportClick = function (data) {
-            var modalInstance = $modal.open({
+        $scope.exportClick = function () {
+            // 拼装链接
+            var 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 +375,7 @@ define(['app/app'], function(app) {
 
             }, function () {
 
-            })
+            })*/
         };
 
         // 更多信息事件

+ 11 - 1
src/main/webapp/resources/js/common/query/goods.js

@@ -11,11 +11,21 @@ define([ 'ngResource' ], function() {
 				url: 'trade/goods/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
 			 * */

+ 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

@@ -608,7 +608,7 @@ define(['app/app', 'clipboard', 'QRCode'], function (app, clipboard, QRCode) {
                 // 控制订单确认页,直接购买不显示进度条
                 SessionService.set("buyNow", true);
                 // 2、跳转到订单确认页面,进行付款操作
-                window.open(rootPath + '/user#/order/pay/'+ enIdFilter(data.data.orderid));
+                window.location.href = rootPath + '/user#/order/pay/'+ enIdFilter(data.data.orderid);
               }, function(res){
                 toaster.pop('error', '警告', res.data);
               });

+ 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:  $scope.Regul.reserve, //库存
+        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>

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

@@ -1,428 +1,438 @@
 <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>
+            </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="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">
                           <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 +527,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>

+ 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>

+ 14 - 0
src/main/webapp/resources/view/sso/b2b/enMenu.html

@@ -24,6 +24,20 @@
 		background: #5078cb;
 		color: #fff !important;
 	}
+	.tab-menu a.active:after {
+		display: block;
+	}
+	.tab-menu a::after {
+		background: url(static/img/vendor/images/downicon.png);
+		width: 11px;
+		height: 6px;
+		position: absolute;
+		bottom: 0px;
+		left: 50%;
+		content: ' ';
+		margin-left: -5px;
+		display: none;
+	}
 </style>
 <div class="tab-first" ng-controller="RequestAmountCtrl">
 	<div class="row">

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

@@ -89,7 +89,7 @@
 	}
 
 	.order-table>tbody:hover {
-		border: #fff 1px solid;
+		/*border: #fff 1px solid;*/
 		border-bottom: 20px solid #f5f5f5;
 	}
 	.order-table .operates {

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

@@ -89,7 +89,7 @@
 	}
 
 	.order-table>tbody:hover {
-		border: #fff 1px solid;
+		/*border: #fff 1px solid;*/
 		border-bottom: 20px solid #f5f5f5;
 	}
 	.order-table .operates {

+ 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">

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

@@ -244,6 +244,7 @@
     }
 
     table.role-info{
+        width:100%;
         box-sizing: border-box;
         border-bottom: none;
     }
@@ -298,7 +299,7 @@
         border: none;
     }
     .auth-info-area {
-        padding: 15px;
+        padding: 10px;
     }
     .auth-info-area .role-info .role-tag-area {
         padding: 5px 0 0 13px;

+ 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;
   }

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

@@ -44,6 +44,7 @@
 	}
 	.body-wrap {
 		background: #fff;
+		padding-top:10px;
 	}
 	.body-wrap .wrap-content {
 		padding: 10px 14px;

+ 1 - 0
src/main/webapp/resources/view/usercenter/b2b/fa/arCheck.html

@@ -438,6 +438,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/modal/enableOrderList.html

@@ -432,6 +432,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/order/changeList.html

@@ -424,6 +424,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/order/deputyOrder.html

@@ -516,6 +516,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/order/outorder.html

@@ -417,6 +417,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/order/usercenter_order.html

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

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

@@ -13,7 +13,7 @@
         margin: 0 auto;
         background: #f5f8fe;
         padding: 8px 30px;
-        margin-top: 20px;
+        margin-top: 12px;
     }
     .no-invoice-tip p{
         font-size: 12px;
@@ -130,10 +130,9 @@
 }
 .invoice-search{
     width: 1000px;
-    margin: 0 auto;
+    margin: 10px auto;
     background: #f5f8fe;
     height: 40px;
-    margin-top: 16px;
 }
 .invoice-search div.fr{
     width: 388px;

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

@@ -237,7 +237,7 @@
 	.pay_price div{
 		max-width: 490px;
 		width: auto;
-		min-height: 133px;
+		height:auto;
 		padding: 29px 10px;
 	}
 	.pay_price h4,.pay_price p{

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

@@ -238,6 +238,7 @@
 	#pay_center .tab {
 		background: #fff;
 		padding-bottom: 48px;
+		padding-top:10px;
 	}
 	#pay_center .tab .user-account-table {
 		width:98%;
@@ -324,7 +325,7 @@
 	.screen {
 		background: #f5f8fe;
 		height: 40px;
-		margin-bottom: 15px;
+		margin-bottom: 10px;
 		margin-top: 5px;
 		padding-top: 4px;
 		padding-right: 11px;

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