ソースを参照

Merge remote-tracking branch 'origin/master'

suntg 7 年 前
コミット
0b40bc8ded
33 ファイル変更2359 行追加388 行削除
  1. 3 1
      src/main/java/com/uas/platform/b2c/fa/payment/service/impl/BankTransferServiceImpl.java
  2. 46 0
      src/main/java/com/uas/platform/b2c/fa/settlement/controller/ExchangeRateController.java
  3. 22 0
      src/main/java/com/uas/platform/b2c/fa/settlement/dao/ExchangeRateDao.java
  4. 151 0
      src/main/java/com/uas/platform/b2c/fa/settlement/model/ExchangeRate.java
  5. 36 0
      src/main/java/com/uas/platform/b2c/fa/settlement/service/ExchangeRateService.java
  6. 85 0
      src/main/java/com/uas/platform/b2c/fa/settlement/service/impl/ExchangeRateServiceImpl.java
  7. 5 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/StringConstant.java
  8. 25 0
      src/main/java/com/uas/platform/b2c/trade/order/controller/OrderController.java
  9. 64 0
      src/main/java/com/uas/platform/b2c/trade/order/dao/OrderDao.java
  10. 24 0
      src/main/java/com/uas/platform/b2c/trade/order/service/OrderService.java
  11. 106 6
      src/main/java/com/uas/platform/b2c/trade/order/service/impl/OrderServiceImpl.java
  12. 85 10
      src/main/java/com/uas/platform/b2c/trade/seek/controller/SeekPurchaseBomController.java
  13. 26 0
      src/main/java/com/uas/platform/b2c/trade/seek/model/PurcInquiry.java
  14. 31 6
      src/main/java/com/uas/platform/b2c/trade/seek/model/SeekPurchaseBom.java
  15. 2 2
      src/main/java/com/uas/platform/b2c/trade/seek/model/SeekPurchaseByBatch.java
  16. 60 6
      src/main/java/com/uas/platform/b2c/trade/seek/service/SeekPurchaseBomService.java
  17. 309 125
      src/main/java/com/uas/platform/b2c/trade/seek/service/impl/SeekPurchaseBomServiceImpl.java
  18. BIN
      src/main/resources/jxls-tpl/trade/seekPurchaseByBatch.xls
  19. 2 0
      src/main/webapp/resources/css/commonComponent.css
  20. 7 5
      src/main/webapp/resources/js/admin/controllers/checkMoney/exchangeRate.js
  21. 13 11
      src/main/webapp/resources/js/admin/controllers/statsDataCtrl.js
  22. 111 71
      src/main/webapp/resources/js/common/query/seekPurchase.js
  23. 6 1
      src/main/webapp/resources/js/usercenter/app.js
  24. 477 0
      src/main/webapp/resources/js/usercenter/controllers/forstore/bomListDetailCtrl.js
  25. 1 1
      src/main/webapp/resources/js/usercenter/controllers/forstore/bom_detail_ctrl.js
  26. 8 8
      src/main/webapp/resources/js/usercenter/controllers/forstore/messagePersonalCtrl.js
  27. 91 56
      src/main/webapp/resources/js/usercenter/controllers/forstore/seek_purchase_ctrl.js
  28. 14 4
      src/main/webapp/resources/js/vendor/controllers/forstore/messagePersonalCtrl.js
  29. 1 0
      src/main/webapp/resources/js/vendor/controllers/forstore/seek_purchase_ctrl.js
  30. 137 65
      src/main/webapp/resources/view/usercenter/forstore/bomDetail.html
  31. 388 0
      src/main/webapp/resources/view/usercenter/forstore/bomListDetail.html
  32. 21 8
      src/main/webapp/resources/view/usercenter/forstore/seekPurchase.html
  33. 2 2
      src/main/webapp/resources/view/vendor/left_nav.html

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

@@ -288,7 +288,9 @@ public class BankTransferServiceImpl implements BankTransferService {
         bankTransfer.setTransferTime(new Date());
         bankTransfer.setTranferCreateTime(new Date());
         bankTransfer.setBuyername(user.getUserName());
-        bankTransfer.setBuyerentername(user.getEnterprise().getEnName());
+		if (user.getEnterprise() != null) {
+			bankTransfer.setBuyerentername(user.getEnterprise().getEnName());
+		}
         bankTransfer.setOrderid(order);
 		if (com.uas.platform.b2c.core.constant.Type.PAIDTOVENDOR.name().equals(bankTransfer.getType())) {// 付款类型为分期付款
 			if (orderIds.length > 1)

+ 46 - 0
src/main/java/com/uas/platform/b2c/fa/settlement/controller/ExchangeRateController.java

@@ -0,0 +1,46 @@
+package com.uas.platform.b2c.fa.settlement.controller;
+
+import com.uas.platform.b2c.fa.settlement.model.ExchangeRate;
+import com.uas.platform.b2c.fa.settlement.service.ExchangeRateService;
+import com.uas.platform.b2c.trade.support.ResultMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 汇率的控制器
+ *
+ * @author yuj 2018-09-06 10:59
+ */
+@RestController
+@RequestMapping(value = "/trade/ExchangeRate")
+public class ExchangeRateController {
+
+    private final ExchangeRateService exchangeRateService;
+
+    @Autowired
+    public ExchangeRateController(ExchangeRateService exchangeRateService) {
+        this.exchangeRateService = exchangeRateService;
+    }
+
+    /**
+     * 保存汇率信息
+     * @param exchangeRate
+     * @return
+     */
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    public ResultMap save(@RequestBody ExchangeRate exchangeRate) {
+        return exchangeRateService.save(exchangeRate);
+    }
+
+    /**
+     * 获取指定的汇率信息
+     * @return
+     */
+    @RequestMapping(value = "/get", method = RequestMethod.GET)
+    public ResultMap getExchangeRate(String type) {
+        return exchangeRateService.getExchangeRate(type);
+    }
+}

+ 22 - 0
src/main/java/com/uas/platform/b2c/fa/settlement/dao/ExchangeRateDao.java

@@ -0,0 +1,22 @@
+package com.uas.platform.b2c.fa.settlement.dao;
+
+import com.uas.platform.b2c.fa.settlement.model.ExchangeRate;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * description
+ *
+ * @author yuj 2018-09-06 10:58
+ */
+@Repository
+public interface ExchangeRateDao extends JpaRepository<ExchangeRate, Long>, JpaSpecificationExecutor<ExchangeRate>{
+
+    List<ExchangeRate> findByFromCurrency(String currency);
+
+
+    List<ExchangeRate> findByFromCurrencyAndToCurrency(String fromCurrency, String toCurrency);
+}

+ 151 - 0
src/main/java/com/uas/platform/b2c/fa/settlement/model/ExchangeRate.java

@@ -0,0 +1,151 @@
+package com.uas.platform.b2c.fa.settlement.model;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 汇率信息
+ *
+ * @author yuj 2018-09-06 10:42
+ */
+@Entity
+@Table(name = "trade$exchangerate")
+public class ExchangeRate implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    private Long id;
+
+    /**
+     * 来源币
+     */
+    @Column(name = "er_from_currency")
+    private String fromCurrency;
+
+    /**
+     * 兑换币
+     */
+    @Column(name = "er_to_currency")
+    private String toCurrency;
+
+    /**
+     * 汇率
+     */
+    @Column(name = "er_rate")
+    private Double rate;
+
+    /**
+     * 操作时间
+     */
+    @Column(name = "er_update_time")
+    private Date updateTime;
+
+    /**
+     * 操作人
+     */
+    @Column(name = "er_useruu")
+    private Long useruu;
+
+    /**
+     * 企业uu
+     */
+    @Column(name = "er_enuu")
+    private Long enuu;
+
+    /**
+     * 操作人名称
+     */
+    @Column(name = "er_user_name")
+    private String userName;
+
+
+    /**
+     * 企业名称
+     */
+    @Column(name = "er_enterprise_name")
+    private String enterpriseName;
+
+    public Long getId() {
+        return id;
+    }
+
+    public ExchangeRate setId(Long id) {
+        this.id = id;
+        return this;
+    }
+
+    public String getFromCurrency() {
+        return fromCurrency;
+    }
+
+    public ExchangeRate setFromCurrency(String fromCurrency) {
+        this.fromCurrency = fromCurrency;
+        return this;
+    }
+
+    public String getToCurrency() {
+        return toCurrency;
+    }
+
+    public ExchangeRate setToCurrency(String toCurrency) {
+        this.toCurrency = toCurrency;
+        return this;
+    }
+
+    public Double getRate() {
+        return rate;
+    }
+
+    public ExchangeRate setRate(Double rate) {
+        this.rate = rate;
+        return this;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public ExchangeRate setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+        return this;
+    }
+
+    public Long getUseruu() {
+        return useruu;
+    }
+
+    public ExchangeRate setUseruu(Long useruu) {
+        this.useruu = useruu;
+        return this;
+    }
+
+    public Long getEnuu() {
+        return enuu;
+    }
+
+    public ExchangeRate setEnuu(Long enuu) {
+        this.enuu = enuu;
+        return this;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public ExchangeRate setUserName(String userName) {
+        this.userName = userName;
+        return this;
+    }
+
+    public String getEnterpriseName() {
+        return enterpriseName;
+    }
+
+    public ExchangeRate setEnterpriseName(String enterpriseName) {
+        this.enterpriseName = enterpriseName;
+        return this;
+    }
+}

+ 36 - 0
src/main/java/com/uas/platform/b2c/fa/settlement/service/ExchangeRateService.java

@@ -0,0 +1,36 @@
+package com.uas.platform.b2c.fa.settlement.service;
+
+import com.uas.platform.b2c.fa.settlement.model.ExchangeRate;
+import com.uas.platform.b2c.trade.support.ResultMap;
+
+import java.util.List;
+
+/**
+ * description
+ *
+ * @author yuj 2018-09-06 10:58
+ */
+public interface ExchangeRateService {
+
+    /**
+     * 保存汇率信息
+     * @param exchangeRate
+     * @return
+     */
+    ResultMap save(ExchangeRate exchangeRate);
+
+
+    /**
+     * 获取指定的汇率信息
+     * @return
+     */
+    ResultMap getExchangeRate(String type);
+
+    /**
+     * 获取指定汇率
+     * @param fromCurrency 需要转的币别
+     * @param toCurrency 转化之后的币别
+     * @return List<ExchangeRate>
+     */
+    List<ExchangeRate> findByFromCurrencyAndToCurrency(String fromCurrency, String toCurrency);
+}

+ 85 - 0
src/main/java/com/uas/platform/b2c/fa/settlement/service/impl/ExchangeRateServiceImpl.java

@@ -0,0 +1,85 @@
+package com.uas.platform.b2c.fa.settlement.service.impl;
+
+import com.uas.platform.b2c.common.account.model.User;
+import com.uas.platform.b2c.core.support.SystemSession;
+import com.uas.platform.b2c.core.utils.NumberUtil;
+import com.uas.platform.b2c.fa.settlement.dao.ExchangeRateDao;
+import com.uas.platform.b2c.fa.settlement.model.ExchangeRate;
+import com.uas.platform.b2c.fa.settlement.service.ExchangeRateService;
+import com.uas.platform.b2c.prod.commodity.constant.DoubleConstant;
+import com.uas.platform.b2c.trade.support.CodeType;
+import com.uas.platform.b2c.trade.support.ResultMap;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * description
+ *
+ * @author yuj 2018-09-06 10:59
+ */
+@Service
+public class ExchangeRateServiceImpl implements ExchangeRateService {
+
+    private final ExchangeRateDao exchangeRateDao;
+
+    @Autowired
+    public ExchangeRateServiceImpl(ExchangeRateDao exchangeRateDao) {
+        this.exchangeRateDao = exchangeRateDao;
+    }
+
+    /**
+     * 保存汇率信息
+     *
+     * @param exchangeRate
+     * @return
+     */
+    @Override
+    public ResultMap save(ExchangeRate exchangeRate) {
+        if (exchangeRate == null) {
+            return ResultMap.success(null);
+        } else {
+            if (NumberUtil.compare(exchangeRate.getRate(), DoubleConstant.zero) < 1) {
+                return new ResultMap(CodeType.NO_INFO, "汇率必须是大于0的整数");
+            }
+            User user = SystemSession.getUser();
+            exchangeRate.setEnuu(user.getEnterprise().getUu());
+            exchangeRate.setEnterpriseName(user.getEnterprise().getEnName());
+            exchangeRate.setUseruu(user.getUserUU());
+            exchangeRate.setUserName(user.getUserName());
+            exchangeRate.setUpdateTime(new Date());
+            ExchangeRate perExchangeRate = exchangeRateDao.save(exchangeRate);
+            return ResultMap.success(perExchangeRate);
+        }
+    }
+
+    /**
+     * 获取指定的汇率信息
+     *
+     * @param type
+     * @return
+     */
+    @Override
+    public ResultMap getExchangeRate(String type) {
+        List<ExchangeRate> exchangeRates = exchangeRateDao.findByFromCurrency(type);
+        if (CollectionUtils.isNotEmpty(exchangeRates)) {
+            return ResultMap.success(exchangeRates.get(0));
+        }
+        return ResultMap.success(null);
+    }
+
+    /**
+     * 获取指定汇率
+     *
+     * @param fromCurrency 需要转的币别
+     * @param toCurrency   转化之后的币别
+     * @return List<ExchangeRate>
+     */
+    @Override
+    public List<ExchangeRate> findByFromCurrencyAndToCurrency(String fromCurrency, String toCurrency) {
+        return exchangeRateDao.findByFromCurrencyAndToCurrency(fromCurrency, toCurrency);
+    }
+}

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

@@ -37,6 +37,11 @@ public class StringConstant {
      */
     public static final String RMB = "RMB";
 
+    /**
+     * 美金
+     */
+    public static final String USD = "USD";
+
     /**
      * 无物料
      */

+ 25 - 0
src/main/java/com/uas/platform/b2c/trade/order/controller/OrderController.java

@@ -975,4 +975,29 @@ public class OrderController {
 	public ResultMap checkConsignment(@RequestBody List<String> uuidArray){
 		return orderService.checkConsignment(uuidArray);
 	}
+
+	/**
+	 * 统计个人的订单金额(只包含520-405)
+	 * @param useruu 个人uu
+	 * @param enuu 企业uu
+	 * @param starttime 开始时间
+	 * @param endtime 结束时间
+	 * @return  ResultMap
+	 */
+	@RequestMapping(value = "/trading/volume/personal", method = RequestMethod.GET)
+	public ResultMap statisticsPersonTradingVolume(Long useruu, Long enuu, Long starttime, Long endtime) {
+		return orderService.statisticsPersonTradingVolume(useruu, enuu, starttime, endtime);
+	}
+
+	/**
+	 * 统计企业的订单金额总计 (只包含520-405)
+	 * @param enuu
+	 * @param starttime
+	 * @param endtime
+	 * @return ResultMap
+	 */
+	@RequestMapping(value = "/trading/volume", method = RequestMethod.GET)
+	public ResultMap statisticsEnterpriseTradingVolume(Long enuu, Long starttime, Long endtime) {
+		return orderService.statisticsEnterpriseTradingVolume(enuu, starttime, endtime);
+	}
 }

+ 64 - 0
src/main/java/com/uas/platform/b2c/trade/order/dao/OrderDao.java

@@ -8,6 +8,7 @@ import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -300,4 +301,67 @@ public interface OrderDao extends JpaSpecificationExecutor<Order>, JpaRepository
 	@Modifying
 	@Query(nativeQuery = true, value = "update trade$order SET OR_USED = 0 where or_id = :orderid")
 	int updateUsedStatus(@Param("orderid") String orderid);
+
+	/**
+	 * 获取指定状态下的个人的订单
+	 * @param useruu
+	 * @param dissociative
+	 * @return
+	 */
+	@Query(value = "select o from trade.Order o where o.buyeruu = :useruu and o.dissociative = :dissociative and o.status in (:status)")
+	List<Order> getOrderByUseruuAndDissociativeAndStatus(@Param("useruu") Long useruu, @Param("dissociative") Integer dissociative, @Param("status") List<Integer> status);
+
+
+	/**
+	 * 获取指定状态下的个人的订单
+	 * @param useruu 个人useruu
+	 * @param status 状态
+	 * @return
+	 */
+	@Query(value = "select o from trade.Order o where o.buyeruu = :useruu and o.dissociative = :dissociative and o.status in (:status) and o.creattime > :starttime and o.creattime < :endtime")
+	List<Order> getOrderByUseruuAndDissociativeAndstatusAndStartTimeAndEndTime(@Param("useruu") Long useruu, @Param("dissociative") Integer dissociative, @Param("status") List<Integer> status, @Param("starttime")Date starttime, @Param("endtime") Date endtime);
+
+
+	/**
+	 * 获取指定状态下的个人的订单
+	 * @param useruu 个人useruu
+	 * @param enuu 企业的enuu
+	 * @param status 状态
+	 * @return
+	 */
+	@Query(value = "select o from trade.Order o where o.buyeruu = :useruu and o.buyerenuu = :enuu and o.status in (:status)")
+	List<Order> getOrderByUseruuAndEnuuAndstatus(@Param("useruu") Long useruu, @Param("enuu") Long enuu, @Param("status") List<Integer> status);
+
+
+	/**
+	 * 获取指定状态下的个人的订单
+	 * @param useruu 个人useruu
+	 * @param enuu 企业的enuu
+	 * @param status 状态
+	 * @return
+	 */
+	@Query(value = "select o from trade.Order o where o.buyeruu = :useruu and o.buyerenuu = :enuu and o.status in (:status) and o.creattime > :starttime and o.creattime < :endtime")
+	List<Order> getOrderByUseruuAndEnuuAndstatusAndStartTimeAndEndTime(@Param("useruu") Long useruu, @Param("enuu") Long enuu, @Param("status") List<Integer> status, @Param("starttime")Date starttime, @Param("endtime") Date endtime);
+
+
+
+	/**
+	 * 获取指定状态下的企业的订单
+	 * @param enuu 企业的enuu
+	 * @param status 状态
+	 * @param starttime 开始时间
+	 * @param endtime 结束时间
+	 * @return List<Order>
+	 */
+	@Query(value = "select o from trade.Order o where o.buyerenuu = :enuu and o.status in (:status) and o.creattime > :starttime and o.creattime < :endtime")
+	List<Order> getOrderByEnuuAndstatusAndStartTimeAndEndTime(@Param("enuu") Long enuu, @Param("status") List<Integer> status, @Param("starttime")Date starttime, @Param("endtime") Date endtime);
+
+	/**
+	 * 获取指定状态下的企业的订单
+	 * @param enuu 企业的enuu
+	 * @param status 状态
+	 * @return List<Order>
+	 */
+	@Query(value = "select o from trade.Order o where o.buyerenuu = :enuu and o.status in (:status)")
+	List<Order> getOrderByEnuuAndstatus(@Param("enuu") Long enuu, @Param("status") List<Integer> status);
 }

+ 24 - 0
src/main/java/com/uas/platform/b2c/trade/order/service/OrderService.java

@@ -17,6 +17,8 @@ import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.PageParams;
 import org.springframework.data.domain.Page;
 import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
 
 import java.util.Date;
 import java.util.List;
@@ -664,4 +666,26 @@ public interface OrderService {
 	 * @return
 	 */
 	ResultMap checkConsignment(List<String> uuidArray);
+
+
+	/**
+	 * 统计个人交易额
+	 * @param useruu 个人useruu
+	 * @param enuu 企业的enuu
+	 * @param starttime 开始时间
+	 * @param endtime 结束时间
+	 * @return
+	 */
+	ResultMap statisticsPersonTradingVolume(Long useruu, Long enuu, Long starttime, Long endtime);
+
+
+
+	/**
+	 * 统计个人的订单总计
+	 * @param enuu
+	 * @param starttime
+	 * @param endtime
+	 * @return ResultMap
+	 */
+	ResultMap statisticsEnterpriseTradingVolume(Long enuu, Long starttime, Long endtime);
 }

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

@@ -10,10 +10,6 @@ import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.platform.b2c.common.account.model.TradeLog;
 import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.common.base.service.SendMessageService;
-import com.uas.platform.b2c.common.message.model.MessageModel;
-import com.uas.platform.b2c.common.message.type.ConsumerApp;
-import com.uas.platform.b2c.common.message.type.ConsumerType;
-import com.uas.platform.b2c.common.message.type.SMSType;
 import com.uas.platform.b2c.common.search.rpc.service.OrderSearchService;
 import com.uas.platform.b2c.core.config.SysConf;
 import com.uas.platform.b2c.core.constant.ShortConstant;
@@ -34,13 +30,17 @@ import com.uas.platform.b2c.fa.settlement.dao.BillDao;
 import com.uas.platform.b2c.fa.settlement.dao.BillInfoDao;
 import com.uas.platform.b2c.fa.settlement.model.Bill;
 import com.uas.platform.b2c.fa.settlement.model.BillInfo;
+import com.uas.platform.b2c.fa.settlement.model.ExchangeRate;
 import com.uas.platform.b2c.fa.settlement.service.BillSubmitService;
+import com.uas.platform.b2c.fa.settlement.service.ExchangeRateService;
 import com.uas.platform.b2c.logistics.dao.AddressDao;
 import com.uas.platform.b2c.logistics.dao.InvoiceFOrderDao;
 import com.uas.platform.b2c.logistics.dao.InvoiceFPurchaseDao;
 import com.uas.platform.b2c.logistics.dao.PickUpAddressDao;
 import com.uas.platform.b2c.logistics.model.*;
 import com.uas.platform.b2c.logistics.service.InvoiceFPurchaseService;
+import com.uas.platform.b2c.prod.commodity.constant.DoubleConstant;
+import com.uas.platform.b2c.prod.commodity.constant.StringConstant;
 import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
 import com.uas.platform.b2c.prod.commodity.dao.GoodsHistoryDao;
 import com.uas.platform.b2c.prod.commodity.model.Goods;
@@ -61,7 +61,6 @@ import com.uas.platform.b2c.trade.deprecated.model.UserInfoForOrder;
 import com.uas.platform.b2c.trade.inquiry.dao.TradeChargeDao;
 import com.uas.platform.b2c.trade.inquiry.model.TradeCharge;
 import com.uas.platform.b2c.trade.order.StringConstant.Currency;
-import com.uas.platform.b2c.trade.order.StringConstant.StringFormat;
 import com.uas.platform.b2c.trade.order.dao.OrderDao;
 import com.uas.platform.b2c.trade.order.dao.OrderDetailDao;
 import com.uas.platform.b2c.trade.order.dao.OrderIndexDetailDao;
@@ -214,11 +213,14 @@ public class OrderServiceImpl implements OrderService {
     @Autowired
     private MessageNotifyPersonalManagementService messageNotifyPersonalManagementService;
 
+    private final ExchangeRateService exchangeRateService;
+
     private final BoundedExecutor executor;
 
     @Autowired
-    public OrderServiceImpl(OrderDao orderDao) {
+    public OrderServiceImpl(OrderDao orderDao, ExchangeRateService exchangeRateService) {
         this.orderDao = orderDao;
+        this.exchangeRateService = exchangeRateService;
         ExecutorService executorService = Executors.newCachedThreadPool();
         executor = new BoundedExecutor(executorService, 1600);
     }
@@ -3471,4 +3473,102 @@ public class OrderServiceImpl implements OrderService {
         }
         return ResultMap.success(bool);
     }
+
+    /**
+     * 统计个人交易额
+     *
+     * @param useruu    个人useruu
+     * @param enuu      企业的enuu
+     * @param starttime 开始时间
+     * @param endtime   结束时间
+     * @return
+     */
+    @Override
+    public ResultMap statisticsPersonTradingVolume(Long useruu, Long enuu, Long starttime, Long endtime) {
+        if (useruu == null) {
+            return ResultMap.success(0);
+        }
+        List<Order> orders = new ArrayList<>();
+        List<Integer> status = new ArrayList<>();
+        status.add(Status.COMPLETED.value());
+        status.add(Status.RECEIVED.value());
+        if (starttime == null || endtime == null) {
+            if (enuu == null) {
+                List<Order> orderList = orderDao.getOrderByUseruuAndDissociativeAndStatus(useruu, Type.PERSONAL.value(), status);
+                orders.addAll(orderList);
+            } else {
+                List<Order> orderList = orderDao.getOrderByUseruuAndEnuuAndstatus(useruu, enuu, status);
+                orders.addAll(orderList);
+            }
+        } else {
+            Date start = new Date(starttime);
+            Date end = new Date(endtime);
+            if (enuu == null) {
+                List<Order> orderList = orderDao.getOrderByUseruuAndDissociativeAndstatusAndStartTimeAndEndTime(useruu, Type.PERSONAL.value(), status, start, end);
+                orders.addAll(orderList);
+            } else {
+                List<Order> orderList = orderDao.getOrderByUseruuAndEnuuAndstatusAndStartTimeAndEndTime(useruu, enuu, status, start, end);
+                orders.addAll(orderList);
+            }
+        }
+        Double orderTotal = statisticsOrderTotal(orders);
+        return ResultMap.success(orderTotal);
+    }
+
+    /**
+     * 统计个人的订单总计
+     *
+     * @param enuu 企业enuu
+     * @param starttime 开始时间
+     * @param endtime 结束时间
+     * @return ResultMap 返回值
+     */
+    @Override
+    public ResultMap statisticsEnterpriseTradingVolume(Long enuu, Long starttime, Long endtime) {
+        if (enuu == null) {
+            return ResultMap.success(0);
+        }
+        List<Order> orders = new ArrayList<>();
+        List<Integer> status = new ArrayList<>();
+        status.add(Status.COMPLETED.value());
+        status.add(Status.RECEIVED.value());
+        if (starttime == null || endtime == null) {
+            //统计历史所有的买家金额
+            List<Order> orderList = orderDao.getOrderByEnuuAndstatus(enuu, status);
+            orders.addAll(orderList);
+        } else {
+            Date start = new Date(starttime);
+            Date end = new Date(endtime);
+            List<Order> orderList = orderDao.getOrderByEnuuAndstatusAndStartTimeAndEndTime(enuu, status, start, end);
+            orders.addAll(orderList);
+        }
+        Double orderTotal = statisticsOrderTotal(orders);
+        return ResultMap.success(orderTotal);
+    }
+
+
+    /**
+     * 统计订单的总金额
+     * @param orders 订单
+     * @return 返回总金额,USD 用汇率转
+     */
+    private Double statisticsOrderTotal(List<Order> orders) {
+        Double usdTotal = 0.0d;
+        Double rmbTotal = 0.0d;
+        for (Order order : orders) {
+            if (StringConstant.RMB.equals(order.getCurrency())) {
+                rmbTotal = NumberUtil.add(order.getEnsurePrice(), rmbTotal);
+            } else {
+                usdTotal = NumberUtil.add(order.getEnsurePrice(), usdTotal);
+            }
+        }
+        if (NumberUtil.compare(usdTotal, DoubleConstant.zero) > 0) {
+            List<ExchangeRate> exchangeRates = exchangeRateService.findByFromCurrencyAndToCurrency(StringConstant.USD, StringConstant.RMB);
+            if (org.apache.commons.collections.CollectionUtils.isEmpty(exchangeRates)) {
+                throw new IllegalOperatorException("美金兑人民币的汇率还未设置");
+            }
+            rmbTotal = NumberUtil.add(rmbTotal, NumberUtil.mul(usdTotal, exchangeRates.get(0).getRate()));
+        }
+        return rmbTotal;
+    }
 }

+ 85 - 10
src/main/java/com/uas/platform/b2c/trade/seek/controller/SeekPurchaseBomController.java

@@ -17,9 +17,6 @@ import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.logging.BufferedLoggerManager;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.PageParams;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Map;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
@@ -27,12 +24,13 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.domain.Page;
 import org.springframework.ui.ModelMap;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.servlet.ModelAndView;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+
 /**
  * @author liusw
  * @version 2018/1/19 14:33
@@ -110,10 +108,9 @@ public class SeekPurchaseBomController {
      * @return
      */
     @RequestMapping(value = "/confirmBom", method = RequestMethod.POST)
-    public ResultMap confirmBom(Long bomId) {
+    public ResultMap confirmBom(Long bomId,  Long endTime, Integer count) {
         logger.log("求购", "确认发布bom求购,bomId:" + bomId);
-        User user = SystemSession.getUser();
-        return seekPurchaseBomService.confirmBom(bomId, user, inquiryServiceInnerUrl);
+        return seekPurchaseBomService.confirmBom(bomId, inquiryServiceInnerUrl, endTime, count);
     }
 
     /**
@@ -200,4 +197,82 @@ public class SeekPurchaseBomController {
     private ModelMap getAccessUrl() {
         return new ModelMap("url", inquiryServiceUrl);
     }
+
+    /* ===============================2018年9月4日 14:27:27======================================= */
+    /**
+     * 通过分页信息和过滤条件查询bom列表
+     *
+     * @param pageInfo 分页参数
+     * @param keyword   关键词 -- bom名称搜索
+     * @return bom列表分页
+     */
+    @RequestMapping(value = "/bom/list", method = RequestMethod.GET)
+    public Page<SeekPurchaseBom> getBomListByPageInfo(PageInfo pageInfo, String keyword) {
+        logger.log("bom列表","查询本企业所有bom列表信息");
+        return seekPurchaseBomService.findAllByPageInfo(pageInfo, keyword);
+    }
+
+    /**
+     * 获取单个bom的信息
+     * @param bomId bom id
+     * @return bom的详情信息
+     */
+    @RequestMapping(value = "/bom/detail", method = RequestMethod.GET)
+    public SeekPurchaseBom getBomDetailById(Long bomId) {
+        return seekPurchaseBomService.findOne(bomId);
+    }
+
+    /**
+     * 获取单个bom的信息(仅bom主单信息)
+     * @param bomId bom id
+     * @return bom的详情信息
+     */
+    @RequestMapping(value = "/bom/noDetail", method = RequestMethod.GET)
+    public SeekPurchaseBom getBomById(Long bomId) {
+        return seekPurchaseBomService.findOneWithoutDetail(bomId);
+    }
+
+    /**
+     * 编辑bom信息
+     * @param bom 编辑完的bom信息
+     * @return 处理结果
+     */
+    @RequestMapping(value = "/bom/edit", method = RequestMethod.POST)
+    public ModelMap editBom(@RequestBody SeekPurchaseBom bom) {
+        return seekPurchaseBomService.editBom(bom);
+    }
+
+    /**
+     * 删除bom信息
+     * @param bomId bomId
+     * @return 处理结果
+     */
+    @RequestMapping(value = "/bom/delete", method = RequestMethod.DELETE)
+    public ModelMap deleteBom(Long bomId) {
+        return seekPurchaseBomService.deleteBom(bomId);
+    }
+
+    /**
+     * 删除bom中的物料明细信息
+     * @param detailIds detail id串   1,2,3,4...
+     * @return 处理结果
+     */
+    @RequestMapping(value = "/bom/detail/delete", method = RequestMethod.DELETE)
+    public ModelMap deleteBomProducts(String detailIds) {
+        return seekPurchaseBomService.deleteBomProducts(detailIds);
+    }
+
+
+    /**
+     * 部分发布,bom明细非全选时
+     * @param detailIds detail id串   1,2,3,4...
+     * @param endTime 截止时间  时间戳
+     * @param count 采购套数
+     * @return 处理结果
+     */
+    @RequestMapping(value = "/confirmBom/selected", method = RequestMethod.POST)
+    public ResultMap confirmBomSelectedItems(String detailIds, Long endTime, Integer count) {
+        logger.log("求购", "部分发布bom求购,detailIds: " + detailIds);
+        return seekPurchaseBomService.confirmBomSelectedItems(detailIds, inquiryServiceInnerUrl, endTime, count);
+    }
 }

+ 26 - 0
src/main/java/com/uas/platform/b2c/trade/seek/model/PurcInquiry.java

@@ -56,6 +56,16 @@ public class PurcInquiry implements Serializable {
      */
     private Integer amount;
 
+    /**
+     * 求购套数
+     */
+    private Integer count;
+
+    /**
+     * 规格
+     */
+    private String spec;
+
     public Long getEnUU() {
         return enUU;
     }
@@ -128,4 +138,20 @@ public class PurcInquiry implements Serializable {
     public void setAmount(Integer amount) {
         this.amount = amount;
     }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+
+    public String getSpec() {
+        return spec;
+    }
+
+    public void setSpec(String spec) {
+        this.spec = spec;
+    }
 }

+ 31 - 6
src/main/java/com/uas/platform/b2c/trade/seek/model/SeekPurchaseBom.java

@@ -1,11 +1,8 @@
 package com.uas.platform.b2c.trade.seek.model;
 
+import javax.persistence.*;
 import java.util.Date;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import java.util.List;
 
 /**
  * Bom求购
@@ -57,11 +54,23 @@ public class SeekPurchaseBom {
     private Long enuu;
 
     /**
-     * 状态
+     * 状态 初始为0
      */
     @Column(name = "bom_status")
     private Integer status;
 
+    /**
+     * 规格
+     */
+    @Column(name = "bom_spec", columnDefinition = "TEXT", length = 1000)
+    private String spec;
+
+    /**
+     * bom明细,不做数据库关联,减少查询负担。需要时查询完set进去
+     */
+    @Transient
+    private List<SeekPurchaseByBatch> seekPurchaseByBatchs;
+
     public Long getId() {
         return id;
     }
@@ -117,4 +126,20 @@ public class SeekPurchaseBom {
     public void setStatus(Integer status) {
         this.status = status;
     }
+
+    public String getSpec() {
+        return spec;
+    }
+
+    public void setSpec(String spec) {
+        this.spec = spec;
+    }
+
+    public List<SeekPurchaseByBatch> getSeekPurchaseByBatchs() {
+        return seekPurchaseByBatchs;
+    }
+
+    public void setSeekPurchaseByBatchs(List<SeekPurchaseByBatch> seekPurchaseByBatchs) {
+        this.seekPurchaseByBatchs = seekPurchaseByBatchs;
+    }
 }

+ 2 - 2
src/main/java/com/uas/platform/b2c/trade/seek/model/SeekPurchaseByBatch.java

@@ -62,10 +62,10 @@ public class SeekPurchaseByBatch {
     private String encapsulation;
 
     /**
-     * 求购数量
+     * 求购数量(单位用量)
      */
     @Column(name = "sp_amount")
-    private Double amount;
+    private Double amount = 1d;
 
     /**
      * 求购单价预算

+ 60 - 6
src/main/java/com/uas/platform/b2c/trade/seek/service/SeekPurchaseBomService.java

@@ -9,6 +9,7 @@ import com.uas.platform.core.model.PageInfo;
 import java.util.Map;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.data.domain.Page;
+import org.springframework.ui.ModelMap;
 
 /**
  * @author liusw
@@ -33,13 +34,13 @@ public interface SeekPurchaseBomService {
     Page<SeekPurchaseByBatch> getSeekPurchaseByBatchPageInfo(PageInfo pageInfo, Long bomId);
 
     /**
-     * 确认发布
-     *
-     * @param bomId
-     * @param spIds
-     * @return
+     * bom全部发布求购
+     * @param bomId bom的id
+     * @param endTime 截止时间  时间戳
+     * @param count 采购套数
+     * @return 处理结果
      */
-    ResultMap confirmBom(Long bomId, User user, String url);
+    ResultMap confirmBom(Long bomId, String url, Long endTime, Integer count);
 
     /**
      * 分页获取bom求购列表
@@ -83,4 +84,57 @@ public interface SeekPurchaseBomService {
      * @return
      */
     SeekPurchaseBomList findOneBom(Long bomId);
+
+    /**
+     * 通过分页信息和过滤条件查询bom列表
+     *
+     * @param pageInfo 分页参数
+     * @param keyword   关键词
+     * @return bom列表分页
+     */
+    Page<SeekPurchaseBom> findAllByPageInfo(PageInfo pageInfo, String keyword);
+
+    /**
+     * 获取单个bom的信息
+     * @param bomId bom id
+     * @return bom的详情信息
+     */
+    SeekPurchaseBom findOne(Long bomId);
+
+    /**
+     * 编辑bom信息
+     * @param bom 编辑完的bom信息
+     * @return 处理结果
+     */
+    ModelMap editBom(SeekPurchaseBom bom);
+
+    /**
+     * 删除bom信息
+     * @param bomId bomId
+     * @return 处理结果
+     */
+    ModelMap deleteBom(Long bomId);
+
+    /**
+     * 删除bom中的物料明细信息
+     * @param detailIds detail id串   1,2,3,4...
+     * @return 处理结果
+     */
+    ModelMap deleteBomProducts(String detailIds);
+
+    /**
+     * 部分发布,bom明细非全选时
+     * @param detailIds detail id串   1,2,3,4...
+     * @param endTime 截止时间  时间戳
+     * @param count 采购套数
+     * @return 处理结果
+     */
+    ResultMap confirmBomSelectedItems(String detailIds, String inquiryServiceInnerUrl, Long endTime, Integer count);
+
+    /**
+     * 查询bom信息,(无明细)
+     * @param bomId  bomId
+     * @return
+     */
+    SeekPurchaseBom findOneWithoutDetail(Long bomId);
 }

+ 309 - 125
src/main/java/com/uas/platform/b2c/trade/seek/service/impl/SeekPurchaseBomServiceImpl.java

@@ -2,10 +2,10 @@ package com.uas.platform.b2c.trade.seek.service.impl;
 
 import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.common.search.service.SearcherService;
+import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.support.log.UsageBufferedLogger;
 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.Goods;
 import com.uas.platform.b2c.prod.product.brand.dao.BrandDao;
 import com.uas.platform.b2c.prod.product.brand.modal.Brand;
 import com.uas.platform.b2c.prod.product.component.dao.ComponentDao;
@@ -13,7 +13,6 @@ import com.uas.platform.b2c.prod.product.component.modal.Component;
 import com.uas.platform.b2c.trade.seek.dao.*;
 import com.uas.platform.b2c.trade.seek.model.*;
 import com.uas.platform.b2c.trade.seek.service.SeekPurchaseBomService;
-import com.uas.platform.b2c.trade.seek.utils.DateUtils;
 import com.uas.platform.b2c.trade.support.CodeType;
 import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.exception.IllegalOperatorException;
@@ -32,11 +31,13 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.DataAccessException;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.Sort;
 import org.springframework.data.domain.Sort.Direction;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.ui.ModelMap;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
@@ -102,7 +103,7 @@ public class SeekPurchaseBomServiceImpl implements SeekPurchaseBomService {
     /**
      * 模板列
      */
-    private final int SEEK_TEMPLATE_COLNUM = 6;
+    private final int SEEK_TEMPLATE_COLNUM = 5;
     /**
      * 上限行数
      */
@@ -115,10 +116,10 @@ public class SeekPurchaseBomServiceImpl implements SeekPurchaseBomService {
     public final int CODENUM = 2;
     // 品牌
     public final int BRANDNUM = 0;
-    // 截止日期
-    public final int DEADLINENUM = 4;
+//    // 截止日期
+//    public final int DEADLINENUM = 4;
     // 采购数量
-    public final int AMOUNTNUM = 5;
+    public final int AMOUNTNUM = 4;
 //    public static final int CURRENCYNUM = 6;
 //    public static final int UNITPRICENUM = 7;
 //    public static final int ENCAPSULATIONNUM = 8;
@@ -154,6 +155,10 @@ public class SeekPurchaseBomServiceImpl implements SeekPurchaseBomService {
         seekPurchaseBom.setReleaseDate(new Date(System.currentTimeMillis()));
         seekPurchaseBom.setName(bomName);
         seekPurchaseBom.setStatus(0);
+        seekPurchaseBom.setUu(SystemSession.getUser().getUserUU());
+        if (null != SystemSession.getUser().getEnterprise()) {
+            seekPurchaseBom.setEnuu(SystemSession.getUser().getEnterprise().getUu());
+        }
         seekPurchaseBom = seekPurchaseBomDao.save(seekPurchaseBom);
         // 获取第一行的信息
         Row headerRow = sheet.getRow(0);
@@ -167,6 +172,7 @@ public class SeekPurchaseBomServiceImpl implements SeekPurchaseBomService {
             if (sheet.getRow(startRow) != null && vaidSample(sheet.getRow(startRow))) {
                 startRow = 3;
             }
+            Date releaseDate = new Date(System.currentTimeMillis());
             for (int r = startRow; r <= rowNum; r++) {
                 Row row = sheet.getRow(r);
                 if (row != null) {
@@ -176,7 +182,7 @@ public class SeekPurchaseBomServiceImpl implements SeekPurchaseBomService {
                         continue;
                     }
                     seekPurchaseByBatch.setBomId(seekPurchaseBom.getId());
-                    seekPurchaseByBatch.setReleaseDate(new Date(System.currentTimeMillis()));
+                    seekPurchaseByBatch.setReleaseDate(releaseDate);
                     seekPurchaseByBatchList.add(seekPurchaseByBatch);
                 }
             }
@@ -184,6 +190,8 @@ public class SeekPurchaseBomServiceImpl implements SeekPurchaseBomService {
                 seekPurchaseBomDao.delete(seekPurchaseBom.getId());
                 return new ResultMap(CodeType.PARAMETER_ERROR, "上传的excel内容为空,请填写完整后上传");
             } else {
+                seekPurchaseBom.setAmount(seekPurchaseByBatchList.size());
+                seekPurchaseBomDao.save(seekPurchaseBom);
                 seekPurchaseByBatchDao.save(seekPurchaseByBatchList);
             }
         }
@@ -224,9 +232,9 @@ public class SeekPurchaseBomServiceImpl implements SeekPurchaseBomService {
         if (!"品牌名称".equals(StringUtilB2C.getStr(brandCellObj))) {
             return false;
         }
-        Object deadlineCellObj = readWorkBookCell(headerRow.getCell(DEADLINENUM), Cell.CELL_TYPE_STRING,
-                0, DEADLINENUM);
-        if (!"截止时间".equals(StringUtilB2C.getStr(deadlineCellObj))) {
+        Object prodTitleCellObj = readWorkBookCell(headerRow.getCell(KINDNUM), Cell.CELL_TYPE_STRING,
+                0, KINDNUM);
+        if (!"物料名称".equals(StringUtilB2C.getStr(prodTitleCellObj))) {
             return false;
         }
         return true;
@@ -273,34 +281,34 @@ public class SeekPurchaseBomServiceImpl implements SeekPurchaseBomService {
             seekPurchaseByBatch.setBrand(convert(brandValue, 50));
         }
 
-        // 截止日期
-        Object deadlineValue = readWorkBookCell(row.getCell(DEADLINENUM), Cell.CELL_TYPE_STRING,
-                rowNum, DEADLINENUM);
-        if (StringUtils.isEmpty(deadlineValue)) {
-            result += 1;
-        } else {
-            String deadline = StringUtilB2C.replaceLineBreak(StringUtilB2C.getStr(deadlineValue));
-            if (deadline.contains(".")) {
-                deadline = deadline.replace(".", "-");
-            }
-            if (deadline.contains("/")) {
-                deadline = deadline.replace("/", "-");
-            }
-            try {
-                deadline = com.uas.platform.b2c.fa.payment.utils.StringUtils.cutOutString(deadline, 10);
-                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-                Date deadlineDate = sdf.parse(deadline);
-                Date now = sdf.parse(sdf.format(new Date()));
-                if (deadlineDate.getTime() < now.getTime()) {
-                    seekPurchaseByBatch.setDeadline(null);
-                } else {
-                    seekPurchaseByBatch.setDeadline(DateUtils.addTime(deadlineDate, 0, 23, 59, 59));
-                }
-            } catch (Exception e) {
-                e.printStackTrace();
-                seekPurchaseByBatch.setDeadline(null);
-            }
-        }
+//        // 截止日期
+//        Object deadlineValue = readWorkBookCell(row.getCell(DEADLINENUM), Cell.CELL_TYPE_STRING,
+//                rowNum, DEADLINENUM);
+//        if (StringUtils.isEmpty(deadlineValue)) {
+//            result += 1;
+//        } else {
+//            String deadline = StringUtilB2C.replaceLineBreak(StringUtilB2C.getStr(deadlineValue));
+//            if (deadline.contains(".")) {
+//                deadline = deadline.replace(".", "-");
+//            }
+//            if (deadline.contains("/")) {
+//                deadline = deadline.replace("/", "-");
+//            }
+//            try {
+//                deadline = com.uas.platform.b2c.fa.payment.utils.StringUtils.cutOutString(deadline, 10);
+//                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+//                Date deadlineDate = sdf.parse(deadline);
+//                Date now = sdf.parse(sdf.format(new Date()));
+//                if (deadlineDate.getTime() < now.getTime()) {
+//                    seekPurchaseByBatch.setDeadline(null);
+//                } else {
+//                    seekPurchaseByBatch.setDeadline(DateUtils.addTime(deadlineDate, 0, 23, 59, 59));
+//                }
+//            } catch (Exception e) {
+//                e.printStackTrace();
+//                seekPurchaseByBatch.setDeadline(null);
+//            }
+//        }
 
         // 类目
         Object kindValue = readWorkBookCell(row.getCell(KINDNUM), Cell.CELL_TYPE_STRING,
@@ -318,7 +326,7 @@ public class SeekPurchaseBomServiceImpl implements SeekPurchaseBomService {
             try {
                 Double amount = Double.valueOf(StringUtilB2C.replaceLineBreak(StringUtilB2C.getStr(amountValue)));
                 int amountInt = amount.intValue();
-                if (amount <= 0 || amount >= 1000000000 || amountInt != amount) {
+                if (amount <= 0 || amount >= 10000 || amountInt != amount) {
                     amount = null;
                 }
                 seekPurchaseByBatch.setAmount(amount);
@@ -488,95 +496,15 @@ public class SeekPurchaseBomServiceImpl implements SeekPurchaseBomService {
         return new PageImpl<SeekPurchaseByBatch>(seekPurchaseByBatchList, pageInfo, pageSeeks.getTotalElements());
     }
 
+
     @Override
-    public ResultMap confirmBom(Long bomId, User user, String url) {
-        SeekPurchaseBom seekPurchaseBom = seekPurchaseBomDao.findOne(bomId);
-        if (seekPurchaseBom == null) {
-            return new ResultMap(CodeType.NOT_PERMIT, "请勿重复发布");
+    public ResultMap confirmBom(Long bomId, String url, Long endTime, Integer count) {
+        if (null == endTime || null == count) {
+            return new ResultMap(CodeType.NO_INFO, "存在未传入必需参数");
         }
-        PurcInquiry inquiry = new PurcInquiry();
+        SeekPurchaseBom seekPurchaseBom = seekPurchaseBomDao.findOne(bomId);
         List<SeekPurchaseByBatch> seekPurchaseByBatchList = seekPurchaseByBatchDao.findByBomId(bomId);
-        // 商城现货的数量
-        int haveGoodsCount = 0;
-        Set<PurcInquiryItem> inquiryItems = new HashSet<>();
-        List<SeekPurchaseByBatch> deleteBatchList = new ArrayList<>();
-        Date endDate = null;
-        for (SeekPurchaseByBatch batch : seekPurchaseByBatchList) {
-            SeekPurchase seekPurchase = new SeekPurchase();
-            Calendar now = Calendar.getInstance();
-            now.add(Calendar.DAY_OF_MONTH, 91);
-            if (!StringUtils.isEmpty(batch.getCode()) && !StringUtils.isEmpty(batch.getBrand()) && !StringUtils.isEmpty(batch.getDeadline()) && batch.getDeadline().compareTo(now.getTime()) != 1) {
-                PurcInquiryItem inquiryItem = new PurcInquiryItem();
-                inquiryItem.setProdTitle(batch.getCode());
-                inquiryItem.setUserUU(user.getUserUU());
-                inquiryItem.setSource("MALL");
-                inquiryItem.setUserName(user.getUserName());
-                inquiryItem.setUserTel(user.getUserTel());
-                inquiryItem.setNeedquantity(batch.getAmount());
-                inquiryItem.setInbrand(batch.getBrand());
-                inquiryItem.setCurrency(batch.getCurrency());
-                inquiryItem.setCmpCode(batch.getCode().toUpperCase());
-                inquiryItem.setUnitPrice(batch.getUnitPrice());
-                inquiryItem.setProduceDate(batch.getProduceDate());
-                inquiryItem.setDate(new Date());
-                inquiryItem.setEndDate(batch.getDeadline());
-                if (StringUtils.isEmpty(batch.getKind())) {
-                    batch.setKind(matchKind(batch.getBrand(), batch.getCode()));
-                }
-                inquiryItem.setProdTitle(batch.getKind());
-                inquiryItem.setSpec(batch.getSpec());
-                if (StringUtils.isEmpty(endDate)) {
-                    endDate = batch.getDeadline();
-                } else {
-                    if (endDate.compareTo(batch.getDeadline()) != 1) {
-                        endDate = batch.getDeadline();
-                    }
-                }
-                inquiryItem.setEncapsulation(batch.getEncapsulation());
-                // 商城现货搜索
-                List<Goods> goods = goodsDao.getGoodsByCodeAndName(seekPurchase.getCode(), seekPurchase.getBrand());
-                if (goods != null && goods.size() > 0) {
-                    haveGoodsCount++;
-                }
-                deleteBatchList.add(batch);
-                inquiryItems.add(inquiryItem);
-            }
-        }
-        seekPurchaseByBatchDao.delete(deleteBatchList);
-        // 询价单数据插入
-        inquiry.setAmount(deleteBatchList.size());
-        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddsss");
-        try {
-            inquiry.setCode("MALL" + sdf.parse(sdf.format(new Date())).getTime());
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        inquiry.setDate(new Date(System.currentTimeMillis()));
-        inquiry.setEndDate(endDate);
-        inquiry.setInquiryItems(inquiryItems);
-        if (!StringUtils.isEmpty(user.getEnterprise())) {
-            inquiry.setEnUU(user.getEnterprise().getUu());
-        }
-        inquiry.setRecorderUU(user.getUserUU());
-        inquiry.setSourceapp("MALL");
-        inquiry.setRemark(seekPurchaseBom.getName());
-        inquiry.setInquiryItems(inquiryItems);
-        String res = "";
-        try {
-            res = HttpUtil.doPost(url + "/inquiry/buyer/save",  FlexJsonUtils.toJsonDeep(inquiry));
-            logger.log("bom求购确认发布成功",user.getUserUU() + ",参数:" + FlexJsonUtils.toJsonDeep(inquiry));
-        } catch (Exception e) {
-            logger.log("bom求购确认发布报错",user.getUserUU() + ",错误:" + e.getMessage() + "参数:" + FlexJsonUtils.toJsonDeep(inquiry));
-            e.printStackTrace();
-            throw new IllegalOperatorException("发布失败");
-        }
-        // 删除bom的临时数据
-        seekPurchaseBomDao.delete(seekPurchaseBom.getId());
-        seekPurchaseBomListDao.deleteByBomId(seekPurchaseBom.getId());
-        Map<String, Object> result = new HashMap<>();
-        result.put("successAmount", inquiryItems.size());
-        result.put("goodsAmount", haveGoodsCount);
-        return ResultMap.success(result);
+        return publishBomInquiry(url, seekPurchaseByBatchList, seekPurchaseBom, endTime, count);
     }
 
     /**
@@ -686,4 +614,260 @@ public class SeekPurchaseBomServiceImpl implements SeekPurchaseBomService {
         return seekPurchaseBomListDao.findOne(bomId);
     }
 
+    /**
+     * 通过分页信息和过滤条件查询bom列表
+     *
+     * @param pageInfo 分页参数
+     * @param keyword  关键词
+     * @return bom列表分页
+     */
+    @Override
+    public Page<SeekPurchaseBom> findAllByPageInfo(final PageInfo pageInfo, String keyword) {
+        Sort sort = new Sort(Sort.Direction.DESC, "id");
+        pageInfo.setSort(sort);
+        pageInfo.setOffset((pageInfo.getPageNumber() -1 ) * pageInfo.getPageSize());
+        if (!StringUtils.isEmpty(keyword)) {
+            pageInfo.expression(PredicateUtils.like("name", keyword, false));
+        }
+        pageInfo.expression(PredicateUtils.eq("uu", SystemSession.getUser().getUserUU(), false));
+        if (null != SystemSession.getUser().getEnterprise()) {
+            pageInfo.expression(PredicateUtils.eq("enuu", SystemSession.getUser().getEnterprise().getUu(), false));
+        } else {
+            pageInfo.expression(PredicateUtils.isNull("enuu"));
+        }
+        return seekPurchaseBomDao.findAll(new Specification<SeekPurchaseBom>() {
+            @Override
+            public Predicate toPredicate(Root<SeekPurchaseBom> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
+                query.where(pageInfo.getPredicates(root, query, cb));
+                return null;
+            }
+        }, pageInfo);
+    }
+
+    /**
+     * 获取单个bom的信息
+     *
+     * @param bomId bom id
+     * @return bom的详情信息
+     */
+    @Override
+    public SeekPurchaseBom findOne(Long bomId) {
+        List<SeekPurchaseByBatch> seekPurchaseByBatches = seekPurchaseByBatchDao.findByBomId(bomId);
+        SeekPurchaseBom bom = seekPurchaseBomDao.findOne(bomId);
+        bom.setSeekPurchaseByBatchs(seekPurchaseByBatches);
+        return bom;
+    }
+
+    /**
+     * 编辑bom信息
+     *
+     * @param bom 编辑完的bom信息
+     * @return 处理结果
+     */
+    @Override
+    public ModelMap editBom(SeekPurchaseBom bom) {
+        ModelMap map = new ModelMap();
+        if (null == bom || StringUtils.isEmpty(bom.getName())) {
+            map.put("success", false);
+            map.put("message", "未传入有效Bom信息");
+            return map;
+        }
+        try {
+            List<SeekPurchaseByBatch> seekPurchaseByBatches = bom.getSeekPurchaseByBatchs();
+            if (!CollectionUtils.isEmpty(seekPurchaseByBatches)) {
+                for (SeekPurchaseByBatch batch : seekPurchaseByBatches) {
+                    if (null == batch.getAmount()) {
+                        batch.setAmount(1d);
+                    }
+                }
+                seekPurchaseByBatchDao.save(seekPurchaseByBatches);
+            }
+            seekPurchaseBomDao.save(bom);
+            map.put("success", true);
+        } catch (Exception e) {
+            map.put("success", false);
+            map.put("message", e.getMessage());
+        }
+        return map;
+    }
+
+    /**
+     * 删除bom信息
+     *
+     * @param bomId bomId
+     * @return 处理结果
+     */
+    @Override
+    public ModelMap deleteBom(Long bomId) {
+        ModelMap map = new ModelMap();
+        try {
+            SeekPurchaseBom bom = seekPurchaseBomDao.findOne(bomId);
+            if (null != bom) {
+                List<SeekPurchaseByBatch> seekPurchaseByBatches = seekPurchaseByBatchDao.findByBomId(bomId);
+                if (!CollectionUtils.isEmpty(seekPurchaseByBatches)) {
+                    seekPurchaseByBatchDao.delete(seekPurchaseByBatches);
+                }
+                seekPurchaseBomDao.delete(bom);
+                map.put("success", true);
+            } else {
+                map.put("success", false);
+                map.put("message", "未查找到对应bom记录");
+            }
+        } catch (Exception e) {
+            map.put("success", false);
+            map.put("message", e.getMessage());
+        }
+        return map;
+    }
+
+    /**
+     * 删除bom中的物料明细信息
+     *
+     * @param detailIds detail id串   1,2,3,4...
+     * @return 处理结果
+     */
+    @Override
+    public ModelMap deleteBomProducts(String detailIds) {
+        ModelMap map = new ModelMap();
+        try {
+            List<Long> ids = new ArrayList<>();
+            String[] idArray = detailIds.split(",");
+            for (String idString : idArray) {
+                ids.add(Long.valueOf(idString));
+            }
+            List<SeekPurchaseByBatch> batches = seekPurchaseByBatchDao.findAll(ids);
+            if (!CollectionUtils.isEmpty(batches)) {
+                SeekPurchaseBom bom = seekPurchaseBomDao.findOne(batches.get(0).getBomId());
+                if (null != bom) {
+                    bom.setAmount(bom.getAmount() - batches.size());
+                    seekPurchaseByBatchDao.delete(batches);
+                    seekPurchaseBomDao.save(bom);
+                }
+                map.put("success", true);
+            } else {
+                map.put("success", false);
+                map.put("message", "未找到对应bom明细产品记录");
+            }
+        } catch (Exception e) {
+            map.put("success", false);
+            map.put("message", e.getMessage());
+        }
+        return map;
+    }
+
+    /**
+     * 部分发布,bom明细非全选时
+     *
+     * @param detailIds              detail id串   1,2,3,4...
+     * @param endTime 截止时间  时间戳
+     * @param count 采购套数
+     * @param url 询价服务地址
+     * @return 处理结果
+     */
+    @Override
+    public ResultMap confirmBomSelectedItems(String detailIds, String url, Long endTime, Integer count) {
+        if (null == endTime || null == count) {
+            return new ResultMap(CodeType.NO_INFO, "存在未传入必需参数");
+        }
+        List<Long> detailIdList = new ArrayList<>();
+        String[] detailIdsArray = detailIds.split(",");
+        for (String detailId : detailIdsArray) {
+            detailIdList.add(Long.valueOf(detailId));
+        }
+        List<SeekPurchaseByBatch> seekPurchaseByBatchList = seekPurchaseByBatchDao.findAll(detailIdList);
+        if (!CollectionUtils.isEmpty(seekPurchaseByBatchList)) {
+            SeekPurchaseBom seekPurchaseBom = seekPurchaseBomDao.findOne(seekPurchaseByBatchList.get(0).getBomId());
+            return publishBomInquiry(url, seekPurchaseByBatchList, seekPurchaseBom, endTime, count);
+        }
+        return new ResultMap(CodeType.NOT_EXiST, "未找到对应bom明细记录");
+    }
+
+    /**
+     * 查询bom信息,(无明细)
+     *
+     * @param bomId bomId
+     * @return
+     */
+    @Override
+    public SeekPurchaseBom findOneWithoutDetail(Long bomId) {
+        return seekPurchaseBomDao.findOne(bomId);
+    }
+
+    /**
+     * 发布bom询价
+     * @param url  询价服务url
+     * @param seekPurchaseByBatchList  bom明细List
+     * @param endTime 截止时间  时间戳
+     * @param count 采购套数
+     * @return 处理结果
+     */
+    private ResultMap publishBomInquiry(String url, List<SeekPurchaseByBatch> seekPurchaseByBatchList, SeekPurchaseBom seekPurchaseBom, Long endTime, Integer count) {
+        Calendar now = Calendar.getInstance();
+        now.add(Calendar.DAY_OF_MONTH, 91);
+        if (endTime > now.getTimeInMillis()) {
+            return new ResultMap(CodeType.PARAMETER_ERROR, "截止日期最迟不能超过三个月");
+        }
+        PurcInquiry inquiry = new PurcInquiry();
+        User user = SystemSession.getUser();
+        Set<PurcInquiryItem> inquiryItems = new HashSet<>();
+        Date endDate = new Date(endTime);
+        for (SeekPurchaseByBatch batch : seekPurchaseByBatchList) {
+            if (!StringUtils.isEmpty(batch.getCode()) && !StringUtils.isEmpty(batch.getBrand())) {
+                PurcInquiryItem inquiryItem = new PurcInquiryItem();
+                inquiryItem.setProdTitle(batch.getCode());
+                inquiryItem.setUserUU(user.getUserUU());
+                inquiryItem.setSource("MALL");
+                inquiryItem.setUserName(user.getUserName());
+                inquiryItem.setUserTel(user.getUserTel());
+                inquiryItem.setNeedquantity(null != batch.getAmount() ? batch.getAmount() * count : count);
+                inquiryItem.setInbrand(batch.getBrand());
+                inquiryItem.setCurrency(batch.getCurrency());
+                inquiryItem.setCmpCode(batch.getCode().toUpperCase());
+                inquiryItem.setUnitPrice(batch.getUnitPrice());
+                inquiryItem.setProduceDate(batch.getProduceDate());
+                inquiryItem.setDate(new Date());
+                inquiryItem.setEndDate(endDate);
+                if (StringUtils.isEmpty(batch.getKind())) {
+                    batch.setKind(matchKind(batch.getBrand(), batch.getCode()));
+                }
+                inquiryItem.setProdTitle(batch.getKind());
+                inquiryItem.setSpec(batch.getSpec());
+                inquiryItem.setEncapsulation(batch.getEncapsulation());
+                inquiryItems.add(inquiryItem);
+            }
+        }
+        // 询价单数据插入
+        inquiry.setAmount(inquiryItems.size());
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddsss");
+        try {
+            inquiry.setCode("MALL" + sdf.parse(sdf.format(new Date())).getTime());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        inquiry.setDate(new Date(System.currentTimeMillis()));
+        inquiry.setEndDate(endDate);
+        inquiry.setCount(count);
+        inquiry.setSpec(seekPurchaseBom.getSpec());
+        inquiry.setInquiryItems(inquiryItems);
+        if (!StringUtils.isEmpty(user.getEnterprise())) {
+            inquiry.setEnUU(user.getEnterprise().getUu());
+        }
+        inquiry.setRecorderUU(user.getUserUU());
+        inquiry.setSourceapp("MALL");
+        inquiry.setRemark(seekPurchaseBom.getName());
+        inquiry.setInquiryItems(inquiryItems);
+        String res = "";
+        try {
+            res = HttpUtil.doPost(url + "/inquiry/buyer/save",  FlexJsonUtils.toJsonDeep(inquiry));
+            logger.log("bom求购确认发布成功",user.getUserUU() + ",参数:" + FlexJsonUtils.toJsonDeep(inquiry));
+        } catch (Exception e) {
+            logger.log("bom求购确认发布报错",user.getUserUU() + ",错误:" + e.getMessage() + "参数:" + FlexJsonUtils.toJsonDeep(inquiry));
+            e.printStackTrace();
+            throw new IllegalOperatorException("发布失败");
+        }
+        Map<String, Object> result = new HashMap<>();
+        result.put("successAmount", inquiryItems.size());
+        return ResultMap.success(result);
+    }
+
 }

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


+ 2 - 0
src/main/webapp/resources/css/commonComponent.css

@@ -215,6 +215,8 @@ i.fa-minus-circle{
 .com-check-box,
 .com-check-box label {
     margin-bottom: 0;
+    font-weight: normal;
+    user-select: none;
 }
 .com-check-box input {
     display: none!important;

+ 7 - 5
src/main/webapp/resources/js/admin/controllers/checkMoney/exchangeRate.js

@@ -3,17 +3,19 @@ define(['app/app'], function(app) {
 	app.register.controller('exchangeRateCtrl', ['$scope', 'exchangeRateService', 'toaster', function($scope, exchangeRateService, toaster) {
 		$scope.edit = false;
 		exchangeRateService.getUSD(null, function(date) {
-			$scope.usdExchangeRate = date;
+			$scope.usdExchangeRate = date.data;
 		}, function(response) {
 			toaster.pop('error', '获取信息失败:' + response.data);
 		});
 		
 		$scope.save = function() {
-			$scope.usdExchangeRate.fromCurrency = 'USD';
-			$scope.usdExchangeRate.toCurrency = 'CNY';
-			$scope.usdExchangeRate.type = 'USD';
+			if ($scope.usdExchangeRate.fromCurrency == null || $scope.usdExchangeRate.fromCurrency == '') {
+                $scope.usdExchangeRate.fromCurrency = 'USD';
+                $scope.usdExchangeRate.toCurrency = 'CNY';
+                $scope.usdExchangeRate.type = 'USD';
+			}
 			exchangeRateService.save(null, $scope.usdExchangeRate, function(data) {
-				$scope.usdExchangeRate = data;
+				$scope.usdExchangeRate = data.data;
 				$scope.edit = false;
 				toaster.pop('success', '保存成功');
 			}, function(response) {

+ 13 - 11
src/main/webapp/resources/js/admin/controllers/statsDataCtrl.js

@@ -37,29 +37,26 @@ define([ 'app/app' ], function(app) {
         $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());
-                console.log(currentTime, 'currentTime')
                 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;
-                    $scope.startFormatDate = _formatDate($scope.startDate, 'yyyy-MM-dd');
-                    $scope.endFormatDate = _formatDate($scope.endDate, 'yyyy-MM-dd');
                 } else if (val == 'threeMonth') {
                     $scope.startDate = new Date(currentTime - 3 * 30 * 24 * 60 * 60 * 1000 - 24 * 60 * 60 * 1000);
                     $scope.endDate = endDate;
-                    $scope.startFormatDate = _formatDate($scope.startDate, 'yyyy-MM-dd');
-                    $scope.endFormatDate =  _formatDate($scope.endDate, 'yyyy-MM-dd');
                 } else if (val == 'sixMonth') {
                     $scope.startDate = new Date(currentTime - 6 * 30 * 24 * 60 * 60 * 1000 - 24 * 60 * 60 * 1000);
                     $scope.endDate = endDate;
-                    $scope.startFormatDate = _formatDate($scope.startDate, 'yyyy-MM-dd');
-                    $scope.endFormatDate =  _formatDate($scope.endDate, 'yyyy-MM-dd');
                 }
             }
             if (val != 'autoMonth') {
@@ -128,7 +125,7 @@ define([ 'app/app' ], function(app) {
                     method: 'get',
                     dataType: 'json',
                     url: $scope.ssoUrl + '/api/userspace/inputTime/count/apps',
-                    params: {start: $scope.startFormatDate, end: $scope.endFormatDate, fromApps:'mall,b2b'}
+                    params: {start: $scope.addStartFormatDate, end: $scope.addEndFormatDate, fromApps:'mall,b2b'}
                 }).success(function (data) {
                     $scope.newAddUserSpaceData = data.content
                 }).error(function () {
@@ -139,7 +136,7 @@ define([ 'app/app' ], function(app) {
                     method: 'get',
                     dataType: 'json',
                     url: $scope.ssoUrl + '/api/user/inputTime/count/apps',
-                    params: {start: $scope.startFormatDate, end: $scope.endFormatDate, fromApps:'mall,b2b'}
+                    params: {start: $scope.addStartFormatDate, end: $scope.addEndFormatDate, fromApps:'mall,b2b'}
                 }).success(function (data) {
                     $scope.newAddUserData = data.content
                 }).error(function () {
@@ -150,7 +147,7 @@ define([ 'app/app' ], function(app) {
                     method: 'get',
                     dataType: 'json',
                     url: $scope.ssoUrl + '/api/user/count/notlgoin/month',
-                    params: {start: $scope.startFormatDate, end: $scope.endFormatDate, months: '6,12,24'}
+                    params: {start: $scope.addStartFormatDate, end: $scope.addEndFormatDate, months: '6,12,24'}
                 }).success(function (data) {
                     $scope.monthLogoData = data
                 }).error(function () {
@@ -160,9 +157,14 @@ define([ 'app/app' ], function(app) {
                 toaster.pop('error', '获取运行环境失败');
             });
         };
-
         // 获取不同时间阶段的相关数据
         var initData = function () {
+            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.startFormatDate = _formatDate($scope.startDate, 'yyyy-MM-dd');
+            $scope.endFormatDate =  _formatDate($scope.endDate, 'yyyy-MM-dd');
             getDevOrProdData();
             // 上传产品个数
             Goods.getProductsCmp({fromDate: $scope.startDate.getTime(), toDate: $scope.endDate.getTime()}, function (data) {

+ 111 - 71
src/main/webapp/resources/js/common/query/seekPurchase.js

@@ -1,76 +1,116 @@
 define([ 'ngResource' ], function() {
-	angular.module('seekPurchaseServices', [ 'ngResource' ]).factory('seekPurchase', ['$resource', 'BaseService', function($resource, BaseService) {
+    angular.module('seekPurchaseServices', [ 'ngResource' ]).factory('seekPurchase', ['$resource', 'BaseService', function($resource, BaseService) {
         var rootPath = BaseService.getRootPath();
-		return $resource('seek', {}, {
-		  getSeekUrl: {
-		    url: 'seek/accessUrl',
-        method: 'GET'
-      },
-      getSeekPurchaseRate: {
-        url: 'seek/offer/getSeekPurchaseRate',
-        method: 'GET'
-      },
-      getSeekPushGoodsPageInfo: {
-        url: 'http://218.17.158.219:24000/inquiry/public',
-        method: 'GET',
-      },
-      saveOneSeekPurchase: {
-        url: 'http://218.17.158.219:24000/inquiry/buyer/save',
-        method: 'POST'
-      },
-      saveOneSeekPurchaseProd: {
-        url: 'https://api-inquiry.usoftmall.com/inquiry/buyer/save',
-        method: 'POST'
-      },
-     saveOffer: {
-        url: 'http://218.17.158.219:24000/inquiry/sale/item/save',
-        method: 'POST'
-      },
-      saveOfferProd: {
-        url: 'https://api-inquiry.usoftmall.com/inquiry/sale/item/save',
-        method: 'POST'
-      },
-      getUserSeekPageInfo: {
-        url: 'http://218.17.158.219:24000/inquiry/buyer/list',
-        method: 'GET'
-      },
-      getUserSeekPageInfoByStatus: {
-        url: 'http://218.17.158.219:24000/inquiry/buyer/quotations',
-        method: 'GET'
-      },
-      getMallGoodsList: {
-        url: 'seek/getMallGoodsList',
-        method: 'GET',
-        isArray: true
-      },
-      getSeekPurchaseOfferPageInfo: {
-        url: 'http://218.17.158.219:24000/inquiry/buyer/product/detail',
-        method: 'GET'
-      },
-      getMyOfferPageInfo: {
-        url: 'http://218.17.158.219:24000/inquiry/public/quotation/list',
-        method: 'GET'
-      },
-      updateSeekPurchaseStatus: {
-              url: 'http://218.17.158.219:24000/inquiry/buyer/decide',
-              method: 'POST'
-      },
-      getSeekPurchaseBomListPage: {
-        url: 'http://218.17.158.219:24000/inquiry/buyer/inquiryList',
-        method: 'GET'
-      },
-      findOneBom: {
-          url: 'http://218.17.158.219:24000/inquiry/public/findInquiryById',
-          method: 'GET'
-      },
-      saveBomName: {
-          url: 'seek/updateSeekPurchaseBom',
-          method: 'PUT'
-      },
-      getBomDetail: {
-          url: 'http://218.17.158.219:24000/inquiry/sale/publicInquiry/detail',
-          method: 'GET'
-      }
+        return $resource('seek', {}, {
+            getSeekUrl: {
+                url: 'seek/accessUrl',
+                method: 'GET'
+            },
+            getSeekPurchaseRate: {
+                url: 'seek/offer/getSeekPurchaseRate',
+                method: 'GET'
+            },
+            getSeekPushGoodsPageInfo: {
+                url: 'http://218.17.158.219:24000/inquiry/public',
+                method: 'GET',
+            },
+            saveOneSeekPurchase: {
+                url: 'http://218.17.158.219:24000/inquiry/buyer/save',
+                method: 'POST'
+            },
+            saveOneSeekPurchaseProd: {
+                url: 'https://api-inquiry.usoftmall.com/inquiry/buyer/save',
+                method: 'POST'
+            },
+            saveOffer: {
+                url: 'http://218.17.158.219:24000//inquiry/sale/item/saveQuote',
+                method: 'POST'
+            },
+            saveOfferProd: {
+                url: 'https://api-inquiry.usoftmall.com/inquiry/sale/item/saveQuote',
+                method: 'POST'
+            },
+            getUserSeekPageInfo: {
+                url: 'http://218.17.158.219:24000/inquiry/buyer/list',
+                method: 'GET'
+            },
+            getUserSeekPageInfoByStatus: {
+                url: 'http://218.17.158.219:24000/inquiry/buyer/quotations',
+                method: 'GET'
+            },
+            getMallGoodsList: {
+                url: 'seek/getMallGoodsList',
+                method: 'GET',
+                isArray: true
+            },
+            getSeekPurchaseOfferPageInfo: {
+                url: 'http://218.17.158.219:24000/inquiry/buyer/product/detail',
+                method: 'GET'
+            },
+            getMyOfferPageInfo: {
+                url: 'http://218.17.158.219:24000/inquiry/public/quotation/list',
+                method: 'GET'
+            },
+            updateSeekPurchaseStatus: {
+                url: 'http://218.17.158.219:24000/inquiry/buyer/decide',
+                method: 'POST'
+            },
+            getSeekPurchaseBomListPage: {
+                url: 'http://218.17.158.219:24000/inquiry/buyer/inquiryList',
+                method: 'GET'
+            },
+            findOneBom: {
+                url: 'http://218.17.158.219:24000/inquiry/public/findInquiryById',
+                method: 'GET'
+            },
+            saveBomName: {
+                url: 'seek/updateSeekPurchaseBom',
+                method: 'PUT'
+            },
+            getBomDetail: {
+                url: 'http://218.17.158.219:24000/inquiry/sale/publicInquiry/detail',
+                method: 'GET'
+            },
+            // 获取BOM清单
+            getBomList: {
+                url: 'seek/bom/list',
+                method: 'GET'
+            },
+            // BOM清单详情
+            getBomListDetail: {
+                url: 'seek/bom/detail',
+                method: 'GET'
+            },
+            // 保存bom编辑
+            saveBomEdit: {
+                url: 'seek/bom/edit',
+                method: 'POST'
+            },
+            // 删除BOM信息
+            deleteBom: {
+                url: 'seek/bom/delete',
+                method: 'DELETE'
+            },
+            // 选中的物料询价BOM
+            confirmBomSeekSelected: {
+                url: 'seek/confirmBom/selected',
+                method: 'POST'
+            },
+            // 整个BOM发布询价
+            confirmBomSeekAll: {
+                url: 'seek/confirmBom',
+                method: 'POST'
+            },
+            // 删除bom物料
+            deleteBomProducts: {
+                url: 'seek/bom/detail/delete',
+                method: 'DELETE'
+            },
+            // 删除BOM
+            deleteBom: {
+                url: 'seek/bom/delete',
+                method: 'DELETE'
+            }
 		});
 }])
 });

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

@@ -427,7 +427,7 @@ define([ 'angularAMD', 'ui.router', 'ui-bootstrap', 'ngLocal', 'ngTable', 'commo
 			controller : 'downPaymentCtrl',
 			controllerUrl : 'app/controllers/forstore/buyer_down_payment_ctrl'
 		})).state('buyerSeekPurchase', angularAMD.route({
-			url: '/seekPurchase?type',
+			url: '/seekPurchase?type&bomTab',
 			templateUrl: 'static/view/usercenter/forstore/seekPurchase.html',
 			controller: 'seekPurchaseCtrl',
 			controllerUrl: 'app/controllers/forstore/seek_purchase_ctrl'
@@ -436,6 +436,11 @@ define([ 'angularAMD', 'ui.router', 'ui-bootstrap', 'ngLocal', 'ngTable', 'commo
 			templateUrl: 'static/view/usercenter/forstore/bomDetail.html',
 			controller: 'bomDetailCtrl',
 			controllerUrl: 'app/controllers/forstore/bom_detail_ctrl'
+		})).state('buyerBomListDetail', angularAMD.route({
+			url: '/bomListDetail/:id',
+			templateUrl: 'static/view/usercenter/forstore/bomListDetail.html',
+			controller: 'bomListDetailCtrl',
+			controllerUrl: 'app/controllers/forstore/bomListDetailCtrl'
 		}));
 	}]);
 

+ 477 - 0
src/main/webapp/resources/js/usercenter/controllers/forstore/bomListDetailCtrl.js

@@ -0,0 +1,477 @@
+/**
+ *  支付中心控制器
+ */
+define(['app/app'], function(app) {
+    'use strict';
+    app.register.controller('bomListDetailCtrl', ['$scope', '$rootScope', 'ngTableParams', 'BaseService', 'toaster', 'Authority', '$stateParams', 'seekPurchase', 'Search', function($scope, $rootScope, ngTableParams, BaseService, toaster, Authority, $stateParams, seekPurchase, Search) {
+        document.title = '我的求购-优软商城';
+        // 获取数据
+        var loadData = function () {
+            seekPurchase.getBomListDetail({bomId: $stateParams.id}, function (data) {
+                $scope.bomData = data;
+                if ($scope.bomData.seekPurchaseByBatchs) {
+                    angular.forEach($scope.bomData.seekPurchaseByBatchs, function (item) {
+                        item.$checked = false;
+                        item.showSimilarCodeList = false;
+                        item.showSimilarBrandList = false;
+                        item.isInCodeList = false;
+                        item.isInBrandList = false;
+                    });
+                }
+            }, function (err) {
+                toaster.pop('error', err.data);
+            })
+        }
+        loadData();
+        // 获取字符长度
+        var getRealLen = function (str) {
+            var len = 0;
+            for (var i = 0; i < str.length; i++) {
+                if (str.charCodeAt(i) > 127 || str.charCodeAt(i) === 94) {
+                    len += 2;
+                } else {
+                    len++;
+                }
+            }
+            return len;
+        }
+        // 按字符数剪切字符串
+        var cutOutString = function (str, length) {
+            for (var i = 1; i <= str.length; i++) {
+                if (getRealLen(str.substr(0, i)) > length){
+                    str = str.substr(0, i-1);
+                    break;
+                }
+            }
+            return str;
+        };
+        // 是否编辑BOM
+        $scope.editBom = false;
+        // 是否编辑询价
+        $scope.editSeek = false;
+        // bom数据
+        $scope.bomData = {};
+        // 求购参数
+        $scope.seekObj = {
+            // 截止时间
+            endTime: '',
+            // 采购套数
+            count: ''
+        }
+        // 是否打开时间选择框
+        $scope.endTimeOpen = {
+            open: false
+        };
+        // 发布询价截止日期限制
+        $scope.minDate = new Date();
+        $scope.maxDate = new Date(Date.now() + 1000 * 60 * 60 * 24 * 30 * 3);
+        // 是否全选
+        $scope.checkAll = false;
+        // 初始化是否全选
+        $scope.initCheckAll = function () {
+            var checkAll = true;
+            if ($scope.bomData.seekPurchaseByBatchs) {
+                angular.forEach($scope.bomData.seekPurchaseByBatchs, function (item) {
+                    if (!item.$checked) {
+                        checkAll = false;
+                    }
+                });
+            } else {
+                checkAll = false;
+            }
+            $scope.checkAll = checkAll;
+        }
+        // 点击全选
+        $scope.onCheckAllCheck = function () {
+            angular.forEach($scope.bomData.seekPurchaseByBatchs, function (item) {
+                item.$checked = $scope.checkAll;
+            });
+        }
+        $scope.setAllCheck = function (flag) {
+            $scope.checkAll = flag;
+            $scope.onCheckAllCheck();
+        }
+        // 获取选中的物料数组
+        $scope.getCheckedProductIds = function () {
+            var checkedItems = []
+            angular.forEach($scope.bomData.seekPurchaseByBatchs, function (item) {
+                if (item.$checked) {
+                    checkedItems.push(item.id)
+                }
+            });
+            return checkedItems;
+        }
+
+        // 取消/确认
+        $scope.sure = function (flag) {
+            if (flag) {
+                if ($scope.editBom) {
+                    // 批量验证
+                    for (var i = 0; i < $scope.bomData.seekPurchaseByBatchs.length; i++) {
+                        if ($scope.bomData.seekPurchaseByBatchs[i].$checked && !$scope.checkAllProduct($scope.bomData.seekPurchaseByBatchs[i])) {
+                            return;
+                        }
+                    }
+                    // 保存BOM
+                    seekPurchase.saveBomEdit({}, $scope.tmpEditBom, function (data) {
+                        if (data.success) {
+                            toaster.pop('success', '保存成功');
+                            loadData();
+                            $scope.setEditBom(false);
+                        } else {
+                            toaster.pop('error', data.message);
+                        }
+                    }, function (err) {
+                        toaster.pop('error', err.data);
+                    })
+                } else {
+                    if (!$scope.seekObj.count) {
+                        toaster.pop('error', '请输入采购数量');
+                    } else if (!$scope.seekObj.endTime) {
+                        toaster.pop('error', '请输入截止时间');
+                    } else {
+                        if (!$scope.checkAll) {
+                            // 有无选中的
+                            var checkedItems = $scope.getCheckedProductIds();
+                            if (checkedItems.length == 0) {
+                                toaster.pop('error', '请选择发布的物料');
+                            } else {
+                                seekPurchase.confirmBomSeekSelected({
+                                    detailIds: checkedItems.join(','),
+                                    endTime: $scope.seekObj.endTime,
+                                    count: $scope.seekObj.count
+                                }, null, function (data) {
+                                    if (data.success) {
+                                        toaster.pop('success', '发布成功');
+                                        $scope.setEditSeek(false);
+                                    } else {
+                                        toaster.pop('error', data.message);
+                                    }
+                                }, function (err) {
+                                    toaster.pop('error', err.data);
+                                })
+                            }
+                        } else {
+                            seekPurchase.confirmBomSeekAll({
+                                bomId: $scope.bomData.id,
+                                endTime: $scope.seekObj.endTime,
+                                count: $scope.seekObj.count
+                            }, null, function (data) {
+                                if (data.success) {
+                                    toaster.pop('success', '发布成功');
+                                    $scope.setEditSeek(false);
+                                } else {
+                                    toaster.pop('error', data.message);
+                                }
+                            }, function (err) {
+                                toaster.pop('error', err.data);
+                            })
+                        }
+                    }
+                }
+            } else {
+                if ($scope.editBom) {
+                    // 取消BOM编辑
+                    $scope.setEditBom(false);
+                } else {
+                    // 取消发布求购
+                    $scope.setEditSeek(false);
+                }
+            }
+        }
+
+        // 设置是否编辑BOM
+        $scope.setEditBom = function (editBom) {
+            if (editBom && $scope.editSeek) {
+                toaster.pop('info', '请先保存求购信息');
+                return;
+            }
+            // 编辑中临时数据
+            $scope.tmpEditBom = angular.copy($scope.bomData);
+            // 最少选中一个
+            var unlessCheckOne = false;
+            angular.forEach($scope.bomData.seekPurchaseByBatchs, function (item) {
+                if (item.$checked) {
+                    unlessCheckOne = true;
+                }
+            });
+            if (!unlessCheckOne) {
+                $scope.setAllCheck(true);
+            }
+            if (!editBom) {
+                $scope.setAllCheck(false);
+            }
+            $scope.editBom = editBom;
+        }
+        // 设置是否编辑询价
+        $scope.setEditSeek = function (editSeek) {
+            if (editSeek && $scope.editBom) {
+                toaster.pop('info', '请先保存BOM修改');
+                return;
+            }
+            if ($scope.editSeek) {
+                $scope.seekObj.endTime = '';
+                $scope.seekObj.count = '';
+                $scope.oldCount = 1;
+            }
+            if (!editSeek) {
+                $scope.setAllCheck(false);
+            }
+            $scope.editSeek = editSeek;
+        }
+        // 打开日期选择框
+        $scope.openDatePicker = function ($event) {
+            $event.preventDefault();
+            $event.stopPropagation();
+            $scope.endTimeOpen.open = !$scope.endTimeOpen.open;
+        };
+        // 设置截止日期
+        $scope.changeEndTime = function () {
+            if ($scope.seekObj.endTime) {
+                // 转换为23:59:59时间戳
+                $scope.seekObj.endTime = $scope.seekObj.endTime.getTime() + 23 * 60 * 60 * 1000 + 59 * 60 * 1000 + 59 * 1000;
+            }
+        }
+        // 采购数量输入校验
+        $scope.onCountChange = function () {
+            // 正整数且小于十万
+            if (!/^[1-9][0-9]*$/.test($scope.seekObj.count)) {
+                $scope.seekObj.count = '';
+            }
+            if ($scope.seekObj.count > 99999) {
+                $scope.seekObj.count = 99999;
+            } else if ($scope.seekObj.count < 1) {
+                $scope.seekObj.count = '';
+            }
+        }
+        // 选中的物料id
+        $scope.selectedProductIds = [];
+        // 删除物料提示框
+        $scope.showDeleteBox = false;
+        $scope.setShowDeleteBox = function (flag) {
+            $scope.showDeleteBox = flag;
+        }
+        // 删除物料提示
+        $scope.deleteProduct = function () {
+            if ($scope.editBom || $scope.editSeek) {
+                toaster.pop('info', '请先完成当前操作');
+                return;
+            }
+            $scope.selectedProductIds = $scope.getCheckedProductIds()
+            if ($scope. selectedProductIds.length > 0) {
+                $scope.setShowDeleteBox(true);
+            } else {
+                toaster.pop('info', '请选择需要删除的物料');
+            }
+        }
+        // 删除物料
+        $scope.doDeleteProduct = function () {
+            seekPurchase.deleteBomProducts({detailIds: $scope.selectedProductIds.join(',')}, null, function (data) {
+                if (data.success) {
+                    toaster.pop('success', '删除成功');
+                    loadData();
+                    $scope.setShowDeleteBox(false);
+                } else {
+                    toaster.pop('error', data.message);
+                }
+            }, function (err) {
+                toaster.pop('error', err.data);
+            })
+        }
+        // 删除BOM提示框
+        $scope.showDeleteBomBox = false;
+        $scope.setShowDeleteBomBox = function (flag) {
+            $scope.showDeleteBomBox = flag;
+        }
+        $scope.deleteBom = function () {
+            $scope.setShowDeleteBomBox(true);
+        }
+        $scope.doDeleteBom = function () {
+            seekPurchase.deleteBom({bomId: $scope.bomData.id}, null, function (data) {
+                if (data.success) {
+                    toaster.pop('success', '删除成功');
+                    $scope.setShowDeleteBomBox(false);
+                    window.location.href = 'user#/seekPurchase?type=bomManage&bomTab=bomList';
+                } else {
+                    toaster.pop('error', data.message);
+                }
+            }, function (err) {
+                toaster.pop('error', err.data);
+            })
+        }
+        // bom字段校验(名字+规格)
+        $scope.onTmpEditBomChange = function (key) {
+            if (getRealLen($scope.tmpEditBom[key]) > 100) {
+                $scope.tmpEditBom[key] = cutOutString($scope.tmpEditBom[key], 100);
+            }
+        }
+        // 校验特定的字符
+        $scope.checkNull = function (code) {
+            var str = code;
+            var filterStr = new Array("空", "没", "无", "-", "—", "null", "#N/A");
+            var flag = true;
+            angular.forEach (filterStr, function(item) {
+                if (str == item){
+                    flag = false;
+                    return;
+                }
+            })
+            return flag;
+        }
+        // 校验型号
+        $scope.checkCode = function (item) {
+            $scope.setShowSimilarList(item, 'showSimilarCodeList', item.isInCodeList);
+            var valid = item.code && item.code !== '';
+            if (!valid) {
+                toaster.pop('error', '型号不能为空');
+            }
+            if (!$scope.checkNull(item.code)){
+                toaster.pop('error', '型号输入不合法');
+                valid = false;
+            }
+            return valid;
+        }
+        // 校验品牌
+        $scope.checkBrand = function (item) {
+            $scope.setShowSimilarList(item, 'showSimilarBrandList', item.isInBrandList);
+            var vaild = item.brand
+                && item.brand !== '';
+            if (!vaild) {
+                toaster.pop('error', '品牌不能为空');
+            }
+            if (!$scope.checkNull(item.brand)){
+                toaster.pop('error', '品牌输入不合法');
+                vaild = false;
+            }
+            return vaild;
+        }
+        // 校验类目
+        $scope.checkKind = function (item) {
+            var valid = item.kind && item.kind !== '';
+            if (!valid) {
+                toaster.pop('error', '物料名称不能为空');
+            }
+            return valid;
+        }
+        // 校验规格
+        $scope.checkSpec = function (item) {
+            var valid;
+            if (!$scope.checkNull(item.spec)){
+                toaster.pop('error', '规格输入不合法');
+                valid = false;
+            } else {
+                valid = true;
+            }
+            return valid;
+
+        }
+        // 校验所有
+        $scope.checkAllProduct = function (item) {
+            return $scope.checkBrand(item) && $scope.checkKind(item) && $scope.checkCode(item) && $scope.checkSpec(item);
+        }
+        // 类目输入
+        $scope.onKindChange = function (item) {
+            if (item.kind && getRealLen(item.kind) > 40) {
+                item.kind = cutOutString(item.kind, 40);
+            }
+        };
+        // 规格输入
+        $scope.onSpecChange = function (item) {
+            if (item.spec && getRealLen(item.spec) > 100) {
+                item.spec = cutOutString(item.spec, 100);
+            }
+        };
+        // 型号输入
+        $scope.onCodeChange = function (item) {
+            if ((/[^\x00-\xff]/g).test(item.code)) {
+                var chineseIndex = -1;
+                for (var i = 0; i < item.code.length; i++) {
+                    if ((/[^\x00-\xff]/g).test(item.code.charAt(i))) {
+                        chineseIndex = i;
+                        break;
+                    }
+                }
+                item.code = cutOutString(item.code, chineseIndex);
+            } else if (item.code && getRealLen(item.code) > 100) {
+                item.code = cutOutString(item.code, 100);
+            } else {
+                if (item.code) {
+                    $scope.getSimilarCode(item);
+                } else {
+                    item.showSimilarCodeList = false;
+                }
+            }
+        }
+        // 品牌输入
+        $scope.onBrandChange = function (item) {
+            if ((/[^\x00-\xff]/g).test(item.brand)) {
+                var chineseIndex = -1;
+                for (var i = 0; i < item.brand.length; i++) {
+                    if ((/[^\x00-\xff]/g).test(item.brand.charAt(i)) && !(/[\u4e00-\u9fa5]/).test(item.brand.charAt(i))) {
+                        chineseIndex = i;
+                        break;
+                    }
+                }
+                if (chineseIndex > -1) {
+                    item.brand = item.brand.substring(0, chineseIndex);
+                }
+            } else if (item.brand && getRealLen(item.brand) > 50) {
+                item.brand = cutOutString(item.brand, 50);
+            } else {
+                if (item.brand) {
+                    $scope.getSimilarBrand(item);
+                } else {
+                    item.showSimilarBrandList = false;
+                }
+            }
+        }
+        // 单位用量输入
+        $scope.onAmountChange = function (item) {
+            if (!/^[1-9][0-9]*$/.test(item.amount)) {
+                item.amount = '';
+            }
+            if (item.amount > 9999) {
+                item.amount = 9999;
+            } else if (item.amount < 1) {
+                item.amount = '';
+            }
+        }
+
+        // 联想型号数据
+        $scope.similarCode = [];
+        // 联想品牌数据
+        $scope.similarBrand = [];
+        // 设置联想词的显示
+        $scope.setShowSimilarList = function (item, type, flag) {
+            item[type] = flag;
+        }
+        $scope.getSimilarCode = function (item) {
+            if (item.code) {
+                Search.getSimilarComponents({keyword : item.code}, function (data) {
+                    $scope.similarCode = data || [];
+                    $scope.setShowSimilarList(item, 'showSimilarCodeList', data && data.length);
+                }, function (error) {
+                    toaster.pop('error', '系统错误');
+                })
+            }
+        }
+        $scope.getSimilarBrand = function (item) {
+            if (item.brand) {
+                Search.getSimilarBrands({keyword : item.brand}, function (data) {
+                    $scope.similarBrand = data || [];
+                    $scope.setShowSimilarList(item, 'showSimilarBrandList', data && data.length);
+                }, function (error) {
+                    toaster.pop('error', '系统错误');
+                })
+            }
+        }
+        $scope.setCode = function (item, code) {
+            item.code = code;
+            $scope.setShowSimilarList(item, 'showSimilarCodeList', false);
+        }
+        $scope.setBrand = function (item, brand) {
+            item.brand = brand;
+            $scope.setShowSimilarList(item, 'showSimilarBrandList', false);
+        }
+    }]);
+});

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

@@ -435,7 +435,7 @@ define(['app/app', 'clipboard', 'QRCode'], function (app, clipboard, QRCode) {
                 }
 
                 var clearSeekStatus = function () {
-                  angular.forEach($scope.seekListData.content, function (item) {
+                  angular.forEach($scope.bomInfo.inquiryItems, function (item) {
                     item.$status = 0;
                   })
                 }

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

@@ -318,9 +318,9 @@ define(['app/app'], function(app) {
         };*/
         $scope.unReadMessCount = $rootScope.unReadMessCount;
         $scope.allReadMessCount = 0;
+        //获取所有消息数量
         var getData = function () {
             InternalMessage.getUrl({}, function(data) {
-
                 var url = data.url;
                 if (url == "http://218.17.158.219:24000/message") {
                     url = 'http://192.168.253.6:24000/message';
@@ -339,13 +339,10 @@ define(['app/app'], function(app) {
                 }).success(function (data) {
                     $scope.allReadMessCount = data.count;
                 }).error(function (err) {
-                    toaster.pop('error', err || '获取未读消息数量失败');
+                    toaster.pop('error', err || '获取所有消息数量失败');
                 });
             })
-              /*  $scope.allReadMessCount = data.toRead;
-            }, function (err) {
-                toaster.pop('error', err || '获取未读消息数量失败');
-            })*/
+            //获取消息  isread=0为未读  isread=1为已读 isread=null为全部
             InternalMessage.getUrl({}, function(info) {
                 if (info) {
                     var url = info.url;
@@ -371,9 +368,10 @@ define(['app/app'], function(app) {
                     }).success(function (data) {
                         $scope.messageAllData = data;
                         $scope.messageCurrent = data.content;
-
+                        //获取消息id,并以“,”分隔。以便批量设为已读
                         var mess = new Array();
                         var b = '';
+                        //根据type跳转页面
                         angular.forEach($scope.messageCurrent, function (message) {
                             message.content = $sce.trustAsHtml(message.content);
                             if(message.type =="MALL跳转买家已报价页面"){
@@ -389,6 +387,7 @@ define(['app/app'], function(app) {
                                 b += message.id +",";
                             }
                         })
+                        //设置消息为已读
                         mess = b.substring(0, b.length - 1);
                         var param = {
                             'receiverUu': info.userUU,
@@ -411,6 +410,7 @@ define(['app/app'], function(app) {
                     if ($scope.tab == 'no') {
                         // $rootScope.unReadMessCount = data.totalElements;
                     } else {
+                        //获取未读消息数量
                         var param = {
                             'receiverUu': info.userUU,
                             'receiverEnuu': info.enUU,
@@ -424,7 +424,7 @@ define(['app/app'], function(app) {
                             params: param
                         }).success(function (data) {
                             $rootScope.unReadMessCount = data.count;
-
+                            $scope.unReadMessCount = $rootScope.unReadMessCount;
                         }).error(function (err) {
                             toaster.pop('error', err || '获取未读消息数量失败');
                         });

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

@@ -9,12 +9,76 @@ define(['app/app', 'clipboard', 'QRCode'], function (app, clipboard, QRCode) {
         'ngTableParams', 'Order', 'SessionService', '$filter', '$upload', '$stateParams', 'Search', '$http', 'Authority',
         function ($scope, $location, $rootScope, seekPurchase, toaster, BaseService,
             ngTableParams, Order, SessionService, $filter, $upload, $stateParams, Search, $http, Authority) {
-          $rootScope.active = 'seek_purchase';
-          document.title = '我的求购-优软商城';
-          $scope.activeType = $stateParams.type ? $stateParams.type :'seekManage';
-          $scope.toogleType = function (type) {
-            clearSeekStatus();
-            $scope.activeType = type;
+            $rootScope.active = 'seek_purchase';
+            document.title = '我的求购-优软商城';
+            $scope.activeType = $stateParams.type ? $stateParams.type :'seekManage';
+            $scope.bomTab = 'bomList';
+            $scope.toogleBomTab = function (tab) {
+                $scope.bomTab = tab;
+                if (tab == 'seekRecord') {
+                    $scope.bomTableParams = new ngTableParams({
+                        pageNumber: 1,
+                        pageSize: 10,
+                        page: 1,
+                        count: 10
+                    }, {
+                        total: 0,
+                        getData: function ($defer, params) {
+                            var param = BaseService.parseParams(params.url());
+                            param.pageNumber = param.page
+                            if ($scope.userInfo.enterprise) {
+                                param.enUU = $scope.userInfo.enterprise.uu;
+                            } else {
+                                param.userUU = $scope.userInfo.userUU;
+                            }
+                            // 返回首页
+                            if ($scope.isSearch) {
+                                param.page = 1;
+                                params.page(1);
+                                $scope.isSearch = false;
+                            }
+                            $http({
+                                method: 'get',
+                                dataType: 'json',
+                                url: $scope.seekUrl + '/inquiry/buyer/inquiryList',
+                                params: param
+                            }).success(function (data) {
+                                params.total(data.totalElements);
+                                $scope.bomTotal = data.totalElements;
+                                $defer.resolve(data.content);
+                                $scope.bomDataList = data
+                            }).error(function (response) {
+                                toaster.pop('error', response);
+                            });
+                        }
+                    });
+                } else {
+                    $scope.bomTableParams = new ngTableParams({
+                        pageNumber: 1,
+                        pageSize: 10
+                    }, {
+                        total: 0,
+                        getData: function ($defer, params) {
+                            var param = BaseService.parseParams(params.url());
+                            param.pageNumber = param.page
+                            seekPurchase.getBomList(param, function (data) {
+                                params.total(data.totalElements);
+                                $scope.bomTotal = data.totalElements;
+                                $defer.resolve(data.content);
+                                $scope.bomDataList = data
+                            }, function (response) {
+                                toaster.pop('error', response);
+                            });
+                        }
+                    });
+                }
+            }
+            $scope.toogleType = function (type) {
+                clearSeekStatus();
+                $scope.activeType = type;
+                if (type === 'bomManage') {
+                    $scope.toogleBomTab('bomList');
+                }
           }
           $rootScope.ShaRETimer = {}
 
@@ -106,9 +170,13 @@ define(['app/app', 'clipboard', 'QRCode'], function (app, clipboard, QRCode) {
             $scope.setFilters('dateArea', 'sevenDay', '1')
 
           seekPurchase.getSeekUrl({}, function(data) {
-            var seekUrl = data.url;
-            //   var seekUrl = 'http://10.1.51.82:24002';
-            /*$scope.tab = 'waitOffer';*/
+            $scope.seekUrl = data.url;
+              if ($scope.activeType === 'bomManage') {
+                  if ($stateParams.bomTab) {
+                      $scope.bomTab = $stateParams.bomTab;
+                  }
+                  $scope.toogleBomTab($scope.bomTab);
+              }
             $scope.toogleTab = function (tab) {
               $scope.vendorType = 'self'
                 $scope.tab = tab;
@@ -143,7 +211,7 @@ define(['app/app', 'clipboard', 'QRCode'], function (app, clipboard, QRCode) {
                     $http({
                       method: 'get',
                       dataType: 'json',
-                      url: seekUrl + '/inquiry/buyer/list',
+                      url: $scope.seekUrl + '/inquiry/buyer/list',
                       params: param
                     }).success(function (data) {
                       params.total(data.totalElements);
@@ -176,7 +244,7 @@ define(['app/app', 'clipboard', 'QRCode'], function (app, clipboard, QRCode) {
                     $http({
                       method: 'get',
                       dataType: 'json',
-                      url: seekUrl + '/inquiry/buyer/quotations',
+                      url: $scope.seekUrl + '/inquiry/buyer/quotations',
                       params: param
                     }).success(function (data) {
                       params.total(data.totalElements);
@@ -219,45 +287,6 @@ define(['app/app', 'clipboard', 'QRCode'], function (app, clipboard, QRCode) {
           // 买家求购列表
           $scope.searchStatus = 0;
 
-
-          $scope.bomSearch = {};
-          $scope.bomTableParams = new ngTableParams({
-            pageNumber: 1,
-            pageSize: 10,
-            page: 1,
-            count: 10
-          }, {
-            total: 0,
-            getData: function ($defer, params) {
-                var param = BaseService.parseParams(params.url());
-                param.pageNumber = param.page
-              if ($scope.userInfo.enterprise) {
-                param.enUU = $scope.userInfo.enterprise.uu;
-              } else {
-                param.userUU = $scope.userInfo.userUU;
-              }
-              // 返回首页
-              if ($scope.isSearch) {
-                param.page = 1;
-                params.page(1);
-                $scope.isSearch = false;
-              }
-              $http({
-                method: 'get',
-                dataType: 'json',
-                url: seekUrl + '/inquiry/buyer/inquiryList',
-                params: param
-              }).success(function (data) {
-                params.total(data.totalElements);
-                $scope.bomTotal = data.totalElements;
-                $defer.resolve(data.content);
-                $scope.bomDataList = data
-              }).error(function (response) {
-                toaster.pop('error', response);
-              });
-            }
-          });
-
           var getRealLen = function (str) {
             var len = 0;
             for (var i = 0; i < str.length; i++) {
@@ -499,7 +528,7 @@ define(['app/app', 'clipboard', 'QRCode'], function (app, clipboard, QRCode) {
               var inquiryItems = [];
               inquiryItems.push(inquiryItem);
               inquiry.inquiryItems = inquiryItems;
-              if (seekUrl == 'https://api-inquiry.usoftmall.com') {
+              if ($scope.seekUrl == 'https://api-inquiry.usoftmall.com') {
                   seekPurchase.saveOneSeekPurchaseProd(inquiry,
                       function (data) {
                           $scope.showUseFlag = false;
@@ -530,8 +559,8 @@ define(['app/app', 'clipboard', 'QRCode'], function (app, clipboard, QRCode) {
                   } else {
                       // 校验
                       if ($scope.checkAll()) {
-                          var materialUrl = seekUrl;
-                          if (seekUrl == 'https://api-inquiry.usoftmall.com') {
+                          var materialUrl = $scope.seekUrl;
+                          if ($scope.seekUrl == 'https://api-inquiry.usoftmall.com') {
                               materialUrl = 'https://api-product.usoftmall.com/';
                           }
                           $http({
@@ -612,7 +641,7 @@ define(['app/app', 'clipboard', 'QRCode'], function (app, clipboard, QRCode) {
                 },
               method: 'POST',
               dataType: 'json',
-              url: seekUrl + '/inquiry/buyer/adopt',
+              url: $scope.seekUrl + '/inquiry/buyer/adopt',
               params: {id: of.id, status: 1}
             }).success(function (data) {
               toaster.pop('success', '采纳报价成功');
@@ -647,7 +676,7 @@ define(['app/app', 'clipboard', 'QRCode'], function (app, clipboard, QRCode) {
                       },
                       method: 'POST',
                       dataType: 'json',
-                      url: seekUrl + '/inquiry/buyer/refuse',
+                      url: $scope.seekUrl + '/inquiry/buyer/refuse',
                       params: {id:  $scope.currentRefuseOffer.id, status: 0, refusereason: choice}
                   }).success(function (data) {
                       toaster.pop('refuse', '已拒绝报价');
@@ -1132,7 +1161,13 @@ define(['app/app', 'clipboard', 'QRCode'], function (app, clipboard, QRCode) {
                       toaster.pop('error', data.msg || '系统错误');
                       return;
                   } else {
-                      window.location.href = 'user#/bomDetail/' + id;
+                      if ($scope.bomTab === 'seekRecord') {
+                          // 求购记录
+                          window.location.href = 'user#/bomDetail/' + id;
+                      } else {
+                          // BOM清单
+                          window.location.href = 'user#/bomListDetail/' + id;
+                      }
                   }
               });
           }

+ 14 - 4
src/main/webapp/resources/js/vendor/controllers/forstore/messagePersonalCtrl.js

@@ -282,9 +282,10 @@ define(['app/app'], function(app) {
         };*/
         $scope.unReadMessCount = $rootScope.unReadMessCount;
         $scope.allReadMessCount = 0;
+        //获取所有消息数量
         var getData = function () {
+            //获取所有消息数量
             InternalMessage.getUrl({}, function(data) {
-
                 var url = data.url;
                 if (url == "http://218.17.158.219:24000/message") {
                     url = 'http://192.168.253.6:24000/message';
@@ -303,9 +304,10 @@ define(['app/app'], function(app) {
                 }).success(function (data) {
                     $scope.allReadMessCount = data.count;
                 }).error(function (err) {
-                    toaster.pop('error', err || '获取未读消息数量失败');
+                    toaster.pop('error', err || '获取所有消息数量失败');
                 });
             })
+            //获取消息  isread=0为未读  isread=1为已读 isread=null为全部
             InternalMessage.getUrl({}, function(info) {
                 if (info) {
                     var url = info.url;
@@ -331,9 +333,10 @@ define(['app/app'], function(app) {
                     }).success(function (data) {
                         $scope.messageAllData = data;
                         $scope.messageCurrent = data.content;
-
+                        //获取消息id,并以“,”分隔。以便批量设为已读
                         var mess = new Array();
                         var b = '';
+                        //根据type跳转页面
                         angular.forEach($scope.messageCurrent, function (message) {
                             message.content = $sce.trustAsHtml(message.content);
                             if(message.type =="MALL跳转买家已报价页面"){
@@ -350,6 +353,7 @@ define(['app/app'], function(app) {
                                 b += message.id +",";
                             }
                         })
+                        //设置消息为已读
                         mess = b.substring(0, b.length - 1);
                         var param = {
                             'receiverUu': info.userUU,
@@ -369,9 +373,11 @@ define(['app/app'], function(app) {
                     }).error(function (err) {
                         toaster.pop('error', err || '获取未读消息数量失败');
                     })
+
                     if ($scope.tab == 'no') {
                         // $rootScope.unReadMessCount = data.totalElements;
                     } else {
+                        //获取未读消息数量
                         var param = {
                             'receiverUu': info.userUU,
                             'receiverEnuu': info.enUU,
@@ -385,7 +391,7 @@ define(['app/app'], function(app) {
                             params: param
                         }).success(function (data) {
                             $rootScope.unReadMessCount = data.count;
-
+                            $scope.unReadMessCount = $rootScope.unReadMessCount;
                         }).error(function (err) {
                             toaster.pop('error', err || '获取未读消息数量失败');
                         });
@@ -394,6 +400,10 @@ define(['app/app'], function(app) {
             }, function(response) {
                 toaster.pop('error', '获取消息失败,请重新刷新界面,');
             });
+
+
+
+
         };
 
         // 批量删除

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

@@ -291,6 +291,7 @@ define(['app/app'], function (app) {
                 $scope.inquiryItem.isReplace = 1;
               }
               // $scope.inquiryItem.id = $scope.inquiryItem.itemId;
+              $scope.inquiryItem.sourceId = $scope.inquiryItem.id;
               if (seekUrl == 'https://api-inquiry.usoftmall.com') {
                 seekPurchase.saveOfferProd($scope.inquiryItem, function (data) {
                   toaster.pop('success', '感谢您参与报价,敬请期待回复');

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

@@ -133,20 +133,20 @@
         background: #f1f5ff;
     }
     .seek-purchase .seek-purchase-content >table >tbody >tr.default-row:hover  .sharecode{
-        display: block
+        opacity: 1;
     }
     .seek-purchase .seek-purchase-content >table >tbody >tr.default-row td {
         font-size: 14px;
         text-align: center;
         height: 100%;
     }
-    .seek-purchase .seek-purchase-content >table >tbody >tr.default-row td.operate-seek{
+    .seek-purchase .seek-purchase-content >table >tbody >tr.default-row td .operate-seek{
         text-align: left;
         text-indent: 12px;
         border-right: 1px solid #dae5fd;
         line-height: 68px;
     }
-    .seek-purchase .seek-purchase-content >table >tbody >tr.default-row td.operate-seek >span {
+    .seek-purchase .seek-purchase-content >table >tbody >tr.default-row td .operate-seek >span {
         color: #4290f7;
         cursor: pointer;
         margin-left: 37px;
@@ -221,11 +221,11 @@
         top: 12px;
         right: 10px;
     }
-    .seek-purchase .seek-purchase-content >table >tbody tr.expand-row table tbody tr td.operate a {
+    .seek-purchase .seek-purchase-content >table >tbody tr.expand-row table tbody tr td.operate > a {
         color: #5078cb;
         font-size: 12px;
     }
-    .seek-purchase .seek-purchase-content >table >tbody tr.expand-row table tbody tr td.operate span {
+    .seek-purchase .seek-purchase-content >table >tbody tr.expand-row table tbody tr td.operate > span {
         display: inline-block;
         width: 64px;
         height: 24px;
@@ -353,7 +353,7 @@
         color: #4290f7;
     }
     .seek-purchase .seek-purchase-content .BOM-header {
-        height: 164px;
+        /*height: 164px;*/
         padding: 14px;
     }
     .seek-purchase .seek-purchase-content .BOM-header > a {
@@ -361,11 +361,11 @@
         color: #4290f7;
     }
     .seek-purchase .seek-purchase-content .BOM-header > div {
-        height: 100px;
+        /*height: 100px;*/
         margin: 14px 0 0 0;
         /*line-height: 100px;*/
         border: 1px dashed #fd7748;
-        padding: 10px 66px 0 21px;
+        padding: 20px 30px 20px 21px;
     }
     .seek-purchase .seek-purchase-content .BOM-header > div span {
         font-size: 22px;
@@ -449,7 +449,7 @@
     }
     .seek-purchase .sharecode {
         /*position: absolute;*/
-        display: none;
+        opacity: 0;
         right: 0;
         top: 0;
         /*z-index: 99;*/
@@ -549,28 +549,62 @@
         margin: 15px auto;
         margin-bottom: 10px
     }
+    .clearfix:after {
+        clear: both;
+        content: ' ';
+        display: block;
+        visibility: hidden;
+        zoom: 1;
+    }
+    .pull-right {float: right}
+    .clearfix .title{
+        font-size: 14px;
+        color: #333
+    }
+    .BOM-header .clearfix {
+        margin-bottom: 10px
+    }
 </style>
 <div class="user_right fr seek-purchase">
     <!--求购询价-->
     <div class="seek-purchase-content">
         <div class="BOM-header">
-            <a href="user#/seekPurchase?type=bomManage">&lt;返回BOM列表</a>
+            <a href="user#/seekPurchase?type=bomManage&bomTab=seekRecord">&lt;返回BOM列表</a>
             <div>
-                <div class="BOM-name-area" ng-show="!isEditName">
-                    <span ng-bind="bomInfo.remark"></span>
-                    <a ng-bind="bomInfo.date | date:'yyyy-MM-dd HH:mm:ss'"></a>
-                    <div class="progress">
-                        <div class="left">{{bomInfo.quotedAmount || 0}}</div>
-                        <div class="progressBtn" ng-style="{width: bomInfo.quotedAmount / bomInfo.amount * '100' + '%'}"></div>
-                        <div class="right" ng-if="bomInfo.amount - bomInfo.quotedAmount > 0">{{bomInfo.amount - bomInfo.quotedAmount}}</div>
+                <div class="clearfix">
+                    <div class="BOM-name-area clearfix" ng-show="!isEditName">
+                        <span ng-bind="bomInfo.remark" class="fl"></span>
+                        <!--<a ng-bind="bomInfo.date | date:'yyyy-MM-dd HH:mm:ss'"></a>-->
+                        <div class="pull-right" style="font-size: 14px;">
+                            <div class="progress">
+                                <div class="left">{{bomInfo.quotedAmount || 0}}</div>
+                                <div class="progressBtn" ng-style="{width: bomInfo.quotedAmount / bomInfo.amount * '100' + '%'}"></div>
+                                <div class="right" ng-if="bomInfo.amount - bomInfo.quotedAmount > 0">{{bomInfo.amount - bomInfo.quotedAmount}}</div>
+                            </div>
+                        </div>
                     </div>
-                    <p>本单共<span>{{bomInfo.amount}}</span>个产品,<span>{{bomInfo.quotedAmount || 0}}</span>个已报价(其中{{bomInfo.replaceQuotedAmount || 0}}个为替代料报价)</p>
+                    <p class="BOM-edit fr" ng-show="isEditName">
+                        <input type="text" class="form-control" ng-change="onBomNameChange()" ng-model="bomName">
+                        <a ng-click="setIsEditName(false)">取消</a>
+                        <a ng-click="saveBomName()">确认</a>
+                    </p>
+                </div>
+                <div class="clearfix">
+                    <div class="fl title">规格:{{bomInfo.spec || '-'}}</div>
+                    <div class="title pull-right" style="font-size: 14px;color: #333;">本单共<span style="color: #fd7748;margin-right: 0px;font-size: 14px">{{bomInfo.amount }}</span>个产品,<span style="color: #fd7748;margin-right: 0px;font-size: 14px">{{bomInfo.quotedAmount || 0}}</span>个已报价(其中{{bomInfo.replaceQuotedAmount || 0}}个为替代料报价)</div>
+                </div>
+                <br>
+                <div class="clearfix" ng-hide="bomInfo.quotedAmount > 0 && bomInfo.minPriceSum === 0">
+                    <div class="fl title">采购数量(套):{{bomInfo.count || 0}}</div>
+                    <div class="title pull-right"><strong>价格分析:</strong>按价格最低,<span style="color: #fd7748;margin-right: 0px;font-size: 14px">{{bomInfo.quotedAmount || 0}}</span>个报价,合计¥:<span style="color: #008000;margin-right: 0px;font-size: 14px">{{bomInfo.minPriceSum || 0}}</span></div>
+                </div>
+                <div class="clearfix"  ng-hide="bomInfo.quotedAmount > 0 && bomInfo.minDeliverySum === 0">
+                    <div class="fl title">发布时间:{{bomInfo.date | date:'yyyy-MM-dd HH:mm:ss'}}</div>
+                    <div class="title pull-right">按交期最短,<span style="color: #fd7748;margin-right: 0px;font-size: 14px">{{bomInfo.quotedAmount || 0}}</span>个报价,合计¥:<span style="color: #008000;margin-right: 0px;font-size: 14px">{{bomInfo.minDeliverySum || 0}}</span></div>
+                </div>
+                <div class="clearfix">
+                    <div class="fl title">截止时间:{{bomInfo.endDate | date:'yyyy-MM-dd HH:mm:ss'}}</div>
                 </div>
-                <p class="BOM-edit" ng-show="isEditName">
-                    <input type="text" class="form-control" ng-change="onBomNameChange()" ng-model="bomName">
-                    <a ng-click="setIsEditName(false)">取消</a>
-                    <a ng-click="saveBomName()">确认</a>
-                </p>
                 <!--
                 <div class="fr">
                     <b>配单分析:</b><span>本单共<span class="blue-text" ng-bind="bomInfo.productAmount || 0"></span>个产品,<span class="red-text" ng-bind="bomInfo.offerAmount || 0"></span>个有报价。</span>
@@ -646,12 +680,12 @@
         <table ng-table="seekPurchaseTableParams">
             <thead>
             <tr>
-                <th width="110">发布时间</th>
-                <th width="260">品牌/物料名称</th>
-                <th width="260">型号/规格</th>
-                <th width="110">采购数量(PCS)</th>
-                <th width="120">状态/截止日期</th>
-                <th width="136">操作</th>
+                <!--<th width="110">发布时间</th>-->
+                <th width="310">品牌/物料名称</th>
+                <th width="310">型号/规格</th>
+                <th width="190">单位用量(PCS)</th>
+                <th width="190">状态</th>
+                <!--<th width="136">操作</th>-->
                     <!--
                     <select class="select-adder form-control" ng-model="searchStatus" ng-change="onSearch(searchStatus)">
                         <option value="0">全部</option>
@@ -669,12 +703,12 @@
             </thead>
             <tbody ng-repeat="seek in bomInfo.inquiryItems">
             <tr class="default-row">
-                <td>
-                    <div class="row-wrap">
-                        <div ng-bind="seek.date | date:'yyyy-MM-dd'"></div>
-                        <div class="date-bottom-item" ng-bind="seek.date | date:'HH:mm:ss'"></div>
-                    </div>
-                </td>
+                <!--<td>-->
+                    <!--<div class="row-wrap">-->
+                        <!--<div ng-bind="seek.date | date:'yyyy-MM-dd'"></div>-->
+                        <!--<div class="date-bottom-item" ng-bind="seek.date | date:'HH:mm:ss'"></div>-->
+                    <!--</div>-->
+                <!--</td>-->
                 <td>
                     <div class="row-wrap il-content">
                         <div class="il-box-large il-box">
@@ -702,11 +736,35 @@
                     </div>
                 </td>
                 <td class="left-time">
-                    <div class="row-wrap">
+                    <div class="row-wrap" style="border-right: 1px solid #dae5fd;">
                         <span ng-if="seek.offerAmount == 0 || !seek.offerAmount" style="color:red;">待报价</span>
                         <span ng-if="(seek.agreed == 0 || !seek.agreed) && seek.offerAmount > 0">已报价</span>
                         <span ng-if="seek.agreed == 1" style="color:green;">已采纳</span>
-                        <div style="margin-top: 34px;">{{seek.endDate | date : 'yyyy-MM-dd'}}</div>
+                        <div  class="operate-seek" style="text-align: center">
+                            <span style="margin-left:0;" ng-if="seek.offerAmount > 0" ng-show="!seek.$status || seek.$status == 0" ng-click="setSeekStatus(seek, 2)">查看报价&nbsp;<i class="fa fa-angle-double-down" style="display: contents;"></i></span>
+                            <span style="margin-left:0;" ng-if="seek.goodsAmount > 0" ng-show="!seek.$status || seek.$status == 0" ng-click="setSeekStatus(seek, 1)">商城现货&nbsp;<i class="fa fa-angle-double-down" style="display: contents;"></i></span>
+                            <span style="margin-left:0;" ng-show="seek.$status && (seek.$status == 1 || seek.$status == 2 || seek.$status == 3)" ng-click="setSeekStatus(seek, 0, true)">收起&nbsp;<i class="fa fa-angle-double-up" style="display: contents;"></i></span>
+                            <!--<span ng-if="seek.offerAmount == 0" style="color:red;">待报价</span>-->
+                            <!--<span ng-if="seek.offerAmount > 0">已报价</span>-->
+                            <div class="sharecode" ng-mouseover="setShowShare(seek,$index)" ng-mouseleave="hideShare($index)">
+                                <div class="sharecodeT">分<br/>享</div>
+                                <div class="sharecodeBtn">
+                                    <img src="static/img/user/images/code.png" />
+                                </div>
+                            </div>
+                            <div ng-style="caleTop($index)" class="sharescancode icon-style" ref="sharescancode" ng-mouseover="setShowShare(seek,$index)" ng-mouseleave="hideShare($index)">
+                                <div class="share">
+                                    <div>
+                                        <div class="title">求购分享</div>
+                                        <div class="qrccode" ng-class="'qrccode-canvas_'+$index" width="98" height="98"></div>
+                                        <input readonly ng-value="caleUrl(seek)" ng-class="'qrccode_'+$index" >
+                                        <span ng-class="'copyLink_'+$index" ng-attr-data-clipboard-text={{caleUrl(seek)}}>复制链接</span>
+                                    </div>
+                                </div>
+                            </div>
+                            <!--<span ng-switch-when="202" style="color:green;">已采纳</span>-->
+                        </div>
+                        <!--<div style="margin-top: 34px;">{{seek.endDate | date : 'yyyy-MM-dd'}}</div>-->
                       <!--  <div class="remain" ng-if="seek.remainingTime > 0">
                             剩余&nbsp;<span ng-bind="getDay(seek.remainingTime)" ng-if="getDay(seek.remainingTime) > 0" class="red-text"></span>
                             <i ng-if="getDay(seek.remainingTime) > 0">&nbsp;天&nbsp;</i>
@@ -716,6 +774,7 @@
                         <div class="remain" ng-if="seek.remainingTime <= 0"><span>已截止</span></div>
                         <div class="remain" ng-if="seek.remainingTime == null"><span>-</span></div>-->
                     </div>
+
                 </td>
                 <!--<td class="left-time" ng-if="seek.remainingTime > 0">-->
                     <!--剩余&nbsp;<span ng-bind="getDay(seek.remainingTime)" ng-if="getDay(seek.remainingTime) > 0" class="red-text"></span>-->
@@ -726,30 +785,9 @@
                 <!--<td class="left-time" ng-if="seek.remainingTime <= 0">-->
                     <!--<span style="color: red;">已截止</span>-->
                 <!--</td>-->
-                <td class="operate-seek">
-                    <span style="margin-left:0" ng-if="seek.offerAmount > 0" ng-show="!seek.$status || seek.$status == 0" ng-click="setSeekStatus(seek, 2)">查看报价&nbsp;<i class="fa fa-angle-double-down" style="display: contents;"></i></span>
-                    <span style="margin-left:0" ng-if="seek.goodsAmount > 0" ng-show="!seek.$status || seek.$status == 0" ng-click="setSeekStatus(seek, 1)">商城现货&nbsp;<i class="fa fa-angle-double-down" style="display: contents;"></i></span>
-                    <span style="margin-left:0" ng-show="seek.$status && (seek.$status == 1 || seek.$status == 2 || seek.$status == 3)" ng-click="setSeekStatus(seek, 0, true)">收起&nbsp;<i class="fa fa-angle-double-up" style="display: contents;"></i></span>
-                    <!--<span ng-if="seek.offerAmount == 0" style="color:red;">待报价</span>-->
-                    <!--<span ng-if="seek.offerAmount > 0">已报价</span>-->
-                    <div class="sharecode" ng-mouseover="setShowShare(seek,$index)" ng-mouseleave="hideShare($index)">
-                        <div class="sharecodeT">分<br/>享</div>
-                        <div class="sharecodeBtn">
-                            <img src="static/img/user/images/code.png" />
-                        </div>
-                    </div>
-                    <div ng-style="caleTop($index)" class="sharescancode icon-style" ref="sharescancode" ng-mouseover="setShowShare(seek,$index)" ng-mouseleave="hideShare($index)">
-                        <div class="share">
-                            <div>
-                                <div class="title">求购分享</div>
-                                <div class="qrccode" ng-class="'qrccode-canvas_'+$index" width="98" height="98"></div>
-                                <input readonly ng-value="caleUrl(seek)" ng-class="'qrccode_'+$index" >
-                                <span ng-class="'copyLink_'+$index" ng-attr-data-clipboard-text={{caleUrl(seek)}}>复制链接</span>
-                            </div>
-                        </div>
-                    </div>
-                    <!--<span ng-switch-when="202" style="color:green;">已采纳</span>-->
-                </td>
+                <!--<td>-->
+                   <!---->
+                <!--</td>-->
                 <!--
                 <td class="operate-seek">
                     <span ng-if="seek.offerAmount > 0" ng-show="!seek.$status || seek.$status == 0" ng-click="setSeekStatus(seek, 2)">查看报价&nbsp;<i class="fa fa-angle-double-down"></i></span>
@@ -760,7 +798,7 @@
             </tr>
 
             <tr class="expand-row" ng-if="seek.$status == 1 || seek.$status == 2 || seek.$status == 3">
-                <td colspan="10">
+                <td colspan="4">
                     <div>
                         <div class="switch-line">
                             <a ng-disabled="goodsCount == 0" ng-class="{'active': seek.$status == 1}" ng-click="setSeekStatus(seek, 1, goodsCount == 0)">商城现货(<span ng-bind="goodsCount || 0"></span>)</a>
@@ -866,7 +904,7 @@
                                             <!--<td width="195" ng-bind="of.produceDate || '-'"></td>-->
                                             <td width="221" class="operate">
                                                 <div style="display: inline-block" ng-controller="ChatContactCtrl as chat">
-                                                    <a href="javascript:void(0)" ng-click="chat.contactWithOther(null, currentSeek.qutations[$index].enterprise.uu, chat.UserType.ENTERPRISE)">联系卖家<img src="static/img/seekPurchase/link-buyer.png" alt=""></a>
+                                                    <a href="javascript:void(0)" ng-click="chat.contactWithOther(null, of.enterprise.uu, chat.UserType.ENTERPRISE)">联系卖家<img src="static/img/seekPurchase/link-buyer.png" alt=""></a>
                                                     <div class="com-mall-del-box link-saler-box" ng-if="showLinkBox">
                                                         <div class="title">
                                                             <i ng-click="setShowLinkBox(false)"></i>
@@ -912,7 +950,7 @@
                                         <!--<td width="195" ng-bind="of.produceDate || '-'"></td>-->
                                         <td width="181" class="operate">
                                             <div style="display: inline-block" ng-controller="ChatContactCtrl as chat">
-                                                <a href="javascript:void(0)" ng-click="chat.contactWithOther(null, currentSeek.qutations[$index].enterprise.uu, chat.UserType.ENTERPRISE)">联系卖家<img src="static/img/seekPurchase/link-buyer.png" alt=""></a>
+                                                <a href="javascript:void(0)" ng-click="chat.contactWithOther(null, of.enterprise.uu, chat.UserType.ENTERPRISE)">联系卖家<img src="static/img/seekPurchase/link-buyer.png" alt=""></a>
                                                 <div class="com-mall-del-box link-saler-box" ng-if="showLinkBox">
                                                     <div class="title">
                                                         <i ng-click="setShowLinkBox(false)"></i>
@@ -945,7 +983,7 @@
             </tbody>
             <tbody class="pager-tbody" style="border:0px">
             <tr class="pager-row">
-                <td colspan="10">
+                <td colspan="4">
                     <div>
                         <!--显示&nbsp;{{(seekListData.number - 1 ) * seekListData.size + 1}}-{{seekListData.number * seekListData.size}}&nbsp;条,-->共&nbsp;{{bomInfo.inquiryItems.length}}&nbsp;条
                     </div>
@@ -1107,4 +1145,38 @@
         background: -moz-linear-gradient(left, #8bbdff, #5078cb); /* Firefox 3.6 - 15 */
         background: linear-gradient(left, #8bbdff, #5078cb); /* 标准的语法 */
     }
+    .seek-purchase .seek-purchase-content >table >tbody tr.expand-row table tbody tr td.operate > b.refused-show{
+        position: relative;
+        margin-left: 30px;
+        font-size: 12px;
+        color: #323232;
+        cursor: pointer;
+    }
+    .seek-purchase .seek-purchase-content >table >tbody tr.expand-row table tbody tr td.operate > b.refused-show img{
+        margin-top: -2px;
+    }
+    .seek-purchase .seek-purchase-content >table >tbody tr.expand-row table tbody tr td.operate > b.refused-show .say-price-history{
+        display: inline-block;
+        position: absolute;
+        top: 17px;
+        right: -15px;
+        width: 110px;
+        height: 24px;
+        line-height: 24px;
+        background: #fff;
+        border: 1px solid #fab89a;
+        text-align: center;
+        font-size: 12px;
+        color: #000;
+        opacity: 0;
+        z-index: 1000;
+    }
+    .seek-purchase .seek-purchase-content >table >tbody tr.expand-row table tbody tr td.operate > b.refused-show:hover .say-price-history{
+        opacity: 1;
+    }
+    .seek-purchase .seek-purchase-content >table >tbody tr.expand-row table tbody tr td{
+        height: 68px;
+        line-height: 68px;
+        padding: 0 8px;
+    }
 </style>

+ 388 - 0
src/main/webapp/resources/view/usercenter/forstore/bomListDetail.html

@@ -0,0 +1,388 @@
+<style>
+    .bom-list-detail {
+        font-size: 14px;
+        background: #fff;
+        padding: 12px;
+    }
+    .bom-list-detail .remind {
+        color: #fd7748;
+    }
+    .bom-list-detail .back {
+        color: #4290f7;
+    }
+    .bom-list-detail .operate {
+        margin-top: 28px;
+        margin-left: 27px;
+    }
+    .bom-list-detail .operate .operate-btn {
+        background: #89aefa;
+        border-radius: 2px;
+        color: #fff;
+        padding: 3px 17px;
+        border: 1px solid #89aefa;
+        font-size: 14px;
+        margin-right: 5px;
+    }
+    .bom-list-detail .operate .fr .sure-btn {
+        width: 64px;
+        height: 28px;
+        background: #3c7cf5;
+        color: #fff;
+        border-radius: 2px;
+        border: 1px solid #3c7cf5;
+        font-size: 14px;
+    }
+    .bom-list-detail .operate .fr .cancel-btn {
+        background: #c8c6c6;
+        border-color: #c8c6c6;
+        margin-left: 5px;
+    }
+    .bom-list-detail .operate .operate-btn:first-child {
+        margin-left: 10px;
+    }
+    .bom-list-detail .bom-info {
+        margin: 14px 0 0 0;
+        border: 1px dashed #fd7748;
+        padding: 5px 30px;
+        line-height: 50px;
+    }
+    .bom-list-detail .bom-info .info-list .info-list-item {
+        font-size: 14px;
+        width: 32%;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+        vertical-align: middle;
+        padding: 0;
+    }
+    .bom-list-detail .bom-info .info-list .spec {
+        width: 100%;
+    }
+    .bom-list-detail .bom-info .info-list.seek .spec {
+        width: 33%;
+    }
+    .bom-list-detail .bom-info .info-list .info-list-item b {
+        font-weight: bold;
+    }
+    .bom-list-detail .bom-info .info-list .info-list-item .bom-input {
+        height: 30px;
+        border-radius: 2px;
+        border: 1px solid #dadada;
+        padding: 0 10px;
+        font-size: 14px;
+    }
+    .bom-list-detail .bom-info .info-list .info-list-item:nth-child(1) input {
+        width: 218px;
+    }
+    .bom-list-detail .bom-info .info-list .info-list-item:nth-child(4) input {
+        width: 253px;
+    }
+    .bom-list-detail .bom-info .info-list .expand {
+        color: #666;
+    }
+    .bom-list-detail .bom-info .info-list .amount input {
+        width: 126px;
+    }
+    .bom-list-detail .bom-info .info-list .date input {
+        width: 146px;
+        display: inline-block;
+        cursor: pointer;
+    }
+    .bom-list-detail .bom-info .info-list .date .btn-default{
+        border: none;
+    }
+    .bom-list-detail .bom-info .info-list .date > ul {
+        line-height: normal;
+    }
+    .bom-list-detail .bom-list-table {
+        width: 100%;
+        margin-top: 10px;
+    }
+    .bom-list-detail .bom-list-table thead tr {
+        font-size: 14px;
+        height: 40px;
+        line-height: 40px;
+        background: #89aefa;
+        color: #fff;
+    }
+    .bom-list-detail .bom-list-table thead tr th {
+        font-weight: normal;
+        text-align: center;
+    }
+    .bom-list-detail .bom-list-table thead tr th .com-check-box {
+        position: relative;
+    }
+    .bom-list-detail .bom-list-table thead tr th .com-check-box .check-all {
+        position: absolute;
+        left: 17px;
+        width: 28px;
+        top: 0;
+        display: block;
+    }
+    .bom-list-detail .bom-list-table tbody tr {
+        height: 107px;
+        border-bottom: 1px solid #dae5fd;
+        border-left: 1px solid #dae5fd;
+        border-right: 1px solid #dae5fd;
+    }
+    .bom-list-detail .bom-list-table tbody tr td {
+        font-size: 14px;
+        padding: 0 10px;
+    }
+    .bom-list-detail .bom-list-table tbody tr td:nth-child(1) {
+        text-align: center;
+    }
+    .bom-list-detail .must {
+        color: #ff0000;
+    }
+    .bom-list-detail .bom-list-table tbody tr td .content-line .inline-block {
+        display: inline-block;
+        vertical-align: middle;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+    }
+    .bom-list-detail .bom-list-table tbody tr td.base-info {
+        padding-left: 20px;
+    }
+    .bom-list-detail .bom-list-table tbody tr td.base-info .content-line {
+        margin-bottom: 10px;
+        height: 30px;
+        line-height: 30px;
+    }
+    .bom-list-detail .bom-list-table tbody tr td.base-info .content-line:last-child {
+        margin-bottom: 0;
+    }
+    .bom-list-detail .bom-list-table tbody tr td.base-info .content-line .inline-block{
+        width: 224px;
+    }
+    .bom-list-detail .bom-list-table tbody tr td.pcs-line .content-line .inline-block {
+        width: 134px;
+    }
+    .bom-list-detail .bom-list-table tbody tr td.base-info .content-line .title {
+        width: 80px;
+        text-align: right;
+    }
+    .bom-list-detail .bom-list-table tbody tr td.base-info .content-line .similar-wrap {
+        position: relative;
+        overflow: unset;
+    }
+    .bom-list-detail .bom-list-table tbody tr td.base-info .content-line .similar-wrap ul.similar-list {
+        position: absolute;
+        top: 30px;
+        left: 0;
+        background: #fff;
+        border: 1px solid #b5b5b5;
+        z-index: 1;
+        max-height: 111px;
+        overflow-y: auto;
+        overflow-x: hidden;
+        border-radius: 3px;
+        width: 224px;
+        font-size: 12px;
+    }
+    .bom-list-detail .bom-list-table tbody tr td.base-info .content-line .similar-wrap ul.similar-list li {
+        height: 22px;
+        line-height: 22px;
+        cursor: pointer;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+        padding: 0 5px;
+    }
+    .bom-list-detail .bom-list-table tbody tr td.base-info .content-line .similar-wrap ul.similar-list li:hover {
+        background: #ddd;
+    }
+    .bom-list-detail .bom-list-table tbody tr td.base-info input {
+        width: 100%;
+        height: 30px;
+        border-radius: 2px;
+        border: 1px solid #dadada;
+        font-size: 14px;
+        padding: 0 10px;
+        text-align: center;
+    }
+</style>
+<div class="user_right fr bom-list-detail">
+    <a class="back" href="user#/seekPurchase?type=bomManage&bomTab=bomList">&lt;返回BOM列表</a>
+    <div class="operate">
+        操作:
+        <button class="operate-btn" ng-click="setEditSeek(true)">发布求购</button>
+        <button class="operate-btn" ng-click="setEditBom(true)">编辑BOM</button>
+        <button class="operate-btn" ng-click="deleteProduct()">删除物料</button>
+        <button class="operate-btn" ng-click="deleteBom()">删除本BOM</button>
+        <div class="fr" ng-show="editBom || editSeek">
+            <button class="sure-btn" ng-click="sure(true)">确认</button>
+            <button class="sure-btn cancel-btn" ng-click="sure(false)">取消</button>
+        </div>
+    </div>
+    <div class="bom-info">
+        <ul class="list-inline info-list" ng-class="{'seek': editSeek}">
+            <li class="info-list-item">
+                <b>BOM名称:
+                    <span ng-show="!editBom" ng-bind="bomData.name"></span>
+                    <input class="bom-input" ng-show="editBom" ng-model="tmpEditBom.name" type="text" ng-change="onTmpEditBomChange('name')">
+                </b>
+            </li>
+            <li class="info-list-item" style="margin-left:20px;"><b>本单共<span class="remind" ng-bind="bomData.amount || 0"></span>个产品</b></li>
+            <li class="info-list-item">创建时间:{{bomData.releaseDate | date:'yyyy-MM-dd HH:mm:ss'}}</li>
+            <li class="spec info-list-item">规格:
+                <span ng-show="!editBom" ng-bind="bomData.spec || '-'"></span>
+                <input class="bom-input" ng-show="editBom" ng-model="tmpEditBom.spec" type="text" ng-change="onTmpEditBomChange('spec')">
+            </li>
+            <li class="expand amount info-list-item" ng-if="editSeek">
+                <i class="must">*</i>采购数量(套):
+                <input class="bom-input" type="text" ng-model="seekObj.count" ng-change="onCountChange()">
+            </li>
+            <li class="info-list-item expand date" ng-if="editSeek">
+                <i class="must">*</i>截止时间:
+                <input type="text" ng-model="seekObj.endTime"
+                       class="bom-input select-adder" placeholder="截止时间"
+                       datepicker-popup="yyyy-MM-dd"
+                       is-open="endTimeOpen.open"
+                       min-date="minDate" max-date="maxDate"
+                       current-text="今天" clear-text="清除" close-text="关闭"
+                       ng-click="openDatePicker($event)"
+                       datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+                       ng-change="changeEndTime()"
+                />
+            </li>
+        </ul>
+    </div>
+    <table class="bom-list-table">
+        <thead>
+            <tr>
+                <th>
+                    <label class="com-check-box">
+                        <input type="checkbox" id="checkAll" ng-click="onCheckAllCheck()" ng-model="checkAll">
+                        <label for="checkAll"></label>
+                        <span class="check-all">全选</span>
+                    </label>
+                </th>
+                <th>品牌/物料名称</th>
+                <th>型号/规格</th>
+                <th>单位用量(pcs)</th>
+            </tr>
+        </thead>
+        <tbody>
+            <tr ng-repeat="detail in bomData.seekPurchaseByBatchs track by $index">
+                <td>
+                    <label class="com-check-box">
+                        <input type="checkbox" id="{{$index}}" ng-click="initCheckAll()" ng-model="detail.$checked">
+                        <label for="{{$index}}"></label>
+                    </label>
+                </td>
+                <td class="base-info">
+                    <div class="content-line">
+                        <div class="inline-block title">
+                            <i class="must">*</i>品牌:
+                        </div>
+                        <div class="inline-block" ng-class="{'similar-wrap': tmpEditBom.seekPurchaseByBatchs[$index].showSimilarBrandList}" title="{{detail.brand}}">
+                            <span ng-show="!editBom || !detail.$checked" ng-bind="detail.brand || '-'"></span>
+                            <input ng-show="editBom && detail.$checked"
+                                   ng-model="tmpEditBom.seekPurchaseByBatchs[$index].brand"
+                                   ng-change="onBrandChange(tmpEditBom.seekPurchaseByBatchs[$index])"
+                                   ng-blur="checkBrand(tmpEditBom.seekPurchaseByBatchs[$index])"
+                                   type="text">
+                            <ul class="similar-list"
+                                ng-show="tmpEditBom.seekPurchaseByBatchs[$index].showSimilarBrandList"
+                                ng-mouseenter="tmpEditBom.seekPurchaseByBatchs[$index].isInBrandList = true;"
+                                ng-mouseleave="tmpEditBom.seekPurchaseByBatchs[$index].isInBrandList = false">
+                                <li ng-repeat="sBrand in similarBrand" ng-bind="sBrand.nameEn" title="{{sBrand.nameEn}}" ng-click="setBrand(tmpEditBom.seekPurchaseByBatchs[$index], sBrand.nameEn)"></li>
+                            </ul>
+                        </div>
+                    </div>
+                    <div class="content-line">
+                        <div class="inline-block title">
+                            <i class="must">*</i>物料名称:
+                        </div>
+                        <div class="inline-block" title="{{detail.kind}}">
+                            <span ng-show="!editBom || !detail.$checked" ng-bind="detail.kind || '-'"></span>
+                            <input ng-show="editBom && detail.$checked"
+                                   ng-model="tmpEditBom.seekPurchaseByBatchs[$index].kind"
+                                   ng-change="onKindChange(tmpEditBom.seekPurchaseByBatchs[$index])"
+                                   ng-blur="checkKind(tmpEditBom.seekPurchaseByBatchs[$index])"
+                                   type="text">
+                        </div>
+                    </div>
+                </td>
+                <td class="base-info">
+                    <div class="content-line">
+                        <div class="inline-block title">
+                            <i class="must">*</i>型号:
+                        </div>
+                        <div class="inline-block" ng-class="{'similar-wrap': tmpEditBom.seekPurchaseByBatchs[$index].showSimilarCodeList}" title="{{detail.code}}">
+                            <span ng-show="!editBom || !detail.$checked" ng-bind="detail.code || '-'"></span>
+                            <input ng-show="editBom && detail.$checked"
+                                   ng-model="tmpEditBom.seekPurchaseByBatchs[$index].code"
+                                   ng-change="onCodeChange(tmpEditBom.seekPurchaseByBatchs[$index])"
+                                   ng-blur="checkCode(tmpEditBom.seekPurchaseByBatchs[$index])"
+                                   type="text">
+                            <ul class="similar-list"
+                                ng-show="tmpEditBom.seekPurchaseByBatchs[$index].showSimilarCodeList"
+                                ng-mouseenter="tmpEditBom.seekPurchaseByBatchs[$index].isInCodeList = true;"
+                                ng-mouseleave="tmpEditBom.seekPurchaseByBatchs[$index].isInCodeList = false">
+                                <li ng-repeat="sCode in similarCode" ng-bind="sCode.code" title="{{sCode.code}}" ng-click="setCode(tmpEditBom.seekPurchaseByBatchs[$index], sCode.code)"></li>
+                            </ul>
+                        </div>
+                    </div>
+                    <div class="content-line">
+                        <div class="inline-block title">
+                            规格:
+                        </div>
+                        <div class="inline-block" title="{{detail.spec}}">
+                            <span ng-show="!editBom || !detail.$checked" ng-bind="detail.spec || '-'"></span>
+                            <input ng-show="editBom && detail.$checked"
+                                   ng-model="tmpEditBom.seekPurchaseByBatchs[$index].spec"
+                                   ng-change="onSpecChange(tmpEditBom.seekPurchaseByBatchs[$index])"
+                                   ng-blur="checkSpec(tmpEditBom.seekPurchaseByBatchs[$index])"
+                                   type="text">
+                        </div>
+                    </div>
+                </td>
+                <td class="base-info pcs-line">
+                    <div class="content-line">
+                        <div class="inline-block title">
+                            单位用量:
+                        </div>
+                        <div class="inline-block" title="{{detail.amount}}">
+                            <span ng-show="!editBom || !detail.$checked" ng-bind="detail.amount || '-'"></span>
+                            <input ng-show="editBom && detail.$checked"
+                                   ng-model="tmpEditBom.seekPurchaseByBatchs[$index].amount"
+                                   ng-change="onAmountChange(tmpEditBom.seekPurchaseByBatchs[$index])"
+                                   type="text">
+                        </div>
+                    </div>
+                </td>
+            </tr>
+        </tbody>
+    </table>
+    <div class="com-modal-wrap" ng-if="showDeleteBox">
+        <div class="com-mall-del-box">
+            <div class="title">
+                <i ng-click="setShowDeleteBox(false)"></i>
+            </div>
+            <div class="content">
+                <p><i class="fa fa-exclamation-circle"></i>删除选中的{{selectedProductIds.length}}个物料?</p>
+                <div>
+                    <a ng-click="setShowDeleteBox(false)">取消</a>
+                    <a ng-click="doDeleteProduct()">确认</a>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="com-modal-wrap" ng-if="showDeleteBomBox">
+        <div class="com-mall-del-box">
+            <div class="title">
+                <i ng-click="setShowDeleteBomBox(false)"></i>
+            </div>
+            <div class="content">
+                <p><i class="fa fa-exclamation-circle"></i>是否删除当前BOM?</p>
+                <div>
+                    <a ng-click="setShowDeleteBomBox(false)">取消</a>
+                    <a ng-click="doDeleteBom()">确认</a>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>

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

@@ -945,6 +945,9 @@
     .check-filter .radio-block .com-check-radio:last-child {
         margin-right: 0;
     }
+    .remind-text {
+        color: #fd7748;
+    }
 </style>
 <div class="user_right fr seek-purchase">
     <!--求购询价-->
@@ -964,6 +967,14 @@
             </ul>
         </div>
     </div>
+    <div class="oder" style="margin-top: 10px;" ng-show="activeType == 'bomManage'">
+        <div class="oder01 oder012">
+            <ul>
+                <li ng-class="{'active': bomTab == 'bomList'}"><a href="javascript:void(0)" ng-click="toogleBomTab('bomList')">BOM清单</a></li>
+                <li ng-class="{'active': bomTab == 'seekRecord'}"><a href="javascript:void(0)" ng-click="toogleBomTab('seekRecord')">求购记录</a></li>
+            </ul>
+        </div>
+    </div>
     <div class="seek-purchase-content" ng-show="activeType == 'seekManage'" style="margin-top:0px">
         <div class="publish-purchase">
             <div class="fl">
@@ -1520,15 +1531,11 @@
             <tr ng-repeat="bom in $data">
                 <td ng-click="toBomdetail(bom.id)">
                     <img src="static/img/seekPurchase/Excel.png" alt="">
-                    <div style="width:300px">
-                        <p ng-bind="bom.remark"></p>
-                        <div ng-bind="bom.date | date:'yyyy-MM-dd HH:mm:ss'">
-
-                        </div>
-                        <!--<div>共 <span class="blue-text" ng-bind="bom.amount || 0"></span> 个产品&lt;!&ndash;,<span class="red-text" ng-bind="bom.offerAmount || 0">10</span> 个有报价,<span class="red-text" ng-bind="bom.goodsAmount || 0">7</span> 个有现货&ndash;&gt;</div>-->
-                        <!--<div ng-bind="bom.releaseDate | date:'yyyy-MM-dd HH:mm:ss'"></div>-->
+                    <div style="width:275px">
+                        <p class="text-ellipse" title="{{bom.remark || bom.name}}" ng-bind="bom.remark || bom.name"></p>
+                        <div class="text-ellipse" title="{{bom.spec}}">规格:{{bom.spec || '-'}}</div>
                     </div>
-                    <div>
+                    <div ng-if="bomTab == 'seekRecord'" class="middle">
                         <div class="progress">
                             <div class="left">{{bom.quotedAmount || 0}}</div>
                             <div class="progressBtn" ng-style="{width: bom.quotedAmount / bom.amount * '100' + '%'}"></div>
@@ -1536,6 +1543,12 @@
                         </div>
                         <p>本单共<span>{{bom.amount}}</span>个产品,<span>{{bom.quotedAmount || 0}}</span>个已报价</p>
                     </div>
+                    <div ng-if="bomTab == 'bomList'" class="middle">
+                        <p>本单共<span class="remind-text">{{bom.amount}}</span>个产品</p>
+                    </div>
+                    <div>
+                        创建时间:{{(bom.date || bom.releaseDate) | date:'yyyy-MM-dd HH:mm:ss'}}
+                    </div>
                     <a class="fr">查看详情</a>
                 </td>
             </tr>

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

@@ -69,8 +69,8 @@
 			<li ng-class="{'active' : active == 'vendor_productOn'}" ng-if="!isPcbStore"><span  ui-sref="vendor_upload">产品导入</span></li>
 
 	<!--	<li ng-class="{'active' : active == 'vendor_logistics'}"><span  ui-sref="vendor_logistics">物流管理</span></li>-->
-		<li ng-class="{'active' : active == 'vendor_brand_apply'}" ng-if="!isPcbStore"><span  ui-sref="vendor_brand_apply">品牌申请</span></li>
-		<li ng-class="{'active' : active == 'vendor_component_apply'}" ng-if="!isPcbStore"><span  ui-sref="vendor_component_apply">器件申请</span></li>
+		<!--<li ng-class="{'active' : active == 'vendor_brand_apply'}" ng-if="!isPcbStore"><span  ui-sref="vendor_brand_apply">品牌申请</span></li>-->
+		<!--<li ng-class="{'active' : active == 'vendor_component_apply'}" ng-if="!isPcbStore"><span  ui-sref="vendor_component_apply">器件申请</span></li>-->
 
 		<!--<li ng-class="{'active' : active == 'vendor_repository'}"><span  ui-sref="vendor_repository">仓库管理</span></li>-->
 		<!--<li ng-class="{'active' : active == 'vendor_after_sale'}" class="undo">-->