Browse Source

增加购物车功能

git-svn-id: svn+ssh://10.10.101.21/source/platform/platform-b2b@7262 f3bf4e98-0cf0-11e4-a00c-a99a8b9d557d
hejq 9 years ago
parent
commit
19bdd0f10c

+ 32 - 16
src/main/java/com/uas/platform/b2b/controller/BaseInfoController.java

@@ -106,6 +106,18 @@ public class BaseInfoController {
 		return "success";
 	}
 
+	/**
+	 * 获取附件信息
+	 * 
+	 * @param id
+	 * @return
+	 */
+	@RequestMapping(value = "/getAttach/{id}", method = RequestMethod.GET)
+	@ResponseBody
+	public ModelMap getAttachById(@PathVariable("id") Long id) {
+		return baseInfoService.getAttachById(id);
+	}
+
 	/**
 	 * 更新物料信息
 	 * 
@@ -113,11 +125,12 @@ public class BaseInfoController {
 	 * @return
 	 */
 	@RequestMapping(value = "/updateProdInfo", method = RequestMethod.POST)
-	public Product updateProdInfo(@RequestBody String prodInfo) {
+	@ResponseBody
+	public ModelMap updateProdInfo(String prodInfo, FileUpload uploadItem) {
 		Product productInfo = FlexJsonUtils.fromJson(prodInfo, Product.class);
 		logger.log("更新物料", "[" + SystemSession.getUser().getUserName() + "]更新了id为" + productInfo.getId() + "的["
 				+ productInfo.getTitle() + "]");
-		return baseInfoService.update(productInfo);
+		return baseInfoService.update(productInfo, uploadItem);
 	}
 
 	/**
@@ -127,10 +140,10 @@ public class BaseInfoController {
 	 * @return
 	 */
 	@RequestMapping(value = "/addNewProduct", method = RequestMethod.POST)
-	public Product addNewProduct(@RequestBody String prodInfo) {
+	@ResponseBody
+	public ModelMap addNewProduct(String prodInfo, FileUpload uploadItem) {
 		Product productInfo = FlexJsonUtils.fromJson(prodInfo, Product.class);
-		logger.log("新增物料", "[" + SystemSession.getUser().getUserName() + "] 新增了物料:[" + productInfo.getTitle() + "]");
-		return baseInfoService.addNewProduct(productInfo);
+		return baseInfoService.addNewProduct(productInfo, uploadItem);
 	}
 
 	/**
@@ -209,31 +222,33 @@ public class BaseInfoController {
 	}
 	
 	/**
-	 * 存储平台下的采购单
+	 * 加入购物车
 	 * 
 	 * @param json
 	 * @return
 	 */
-	@RequestMapping(value = "/newPurcOrder", method = RequestMethod.POST)
+	@RequestMapping(value = "/addtoCart", method = RequestMethod.POST)
 	public ResponseEntity<ModelMap> save(@RequestBody String json) {
 		NewPurcOrder neworder = FlexJsonUtils.fromJson(json, NewPurcOrder.class);
-		List<PurchaseOrderAllItem> item = new ArrayList<>();
-		item = baseInfoService.save(neworder);
 		ModelMap map = new ModelMap();
-		map.put("id", item.get(0).getOrder().getId());
+		map = baseInfoService.addtoCart(neworder);
 		return new ResponseEntity<ModelMap>(map, HttpStatus.OK);
 	}
 	
 	/**
-	 * 发送请求到账户中心,查询合作企业列表
+	 * 存储平台下的采购单
 	 * 
+	 * @param json
 	 * @return
-	 * @throws Exception
 	 */
-	@RequestMapping(value = "/getAllPartners", method = RequestMethod.GET)
-	public List<BasePartnersInfo> getAllPartnersInfos() throws Exception {
-		return baseInfoService
-				.getPartnersInfosByBusinessCode(SystemSession.getUser().getEnterprise().getEnBussinessCode());
+	@RequestMapping(value = "/newPurcOrder", method = RequestMethod.POST)
+	public ResponseEntity<ModelMap> newPurcOrder(@RequestBody String json) {
+		NewPurcOrder neworder = FlexJsonUtils.fromJson(json, NewPurcOrder.class);
+		List<PurchaseOrderAllItem> item = new ArrayList<>();
+		item = baseInfoService.save(neworder);
+		ModelMap map = new ModelMap();
+		map.put("id", item.get(0).getOrder().getId());
+		return new ResponseEntity<ModelMap>(map, HttpStatus.OK);
 	}
 
 	/**
@@ -288,4 +303,5 @@ public class BaseInfoController {
 			throws Exception {
 		return baseInfoService.getUserSpaceDetails(params, keyword);
 	}
+	
 }

+ 90 - 0
src/main/java/com/uas/platform/b2b/controller/CartController.java

@@ -0,0 +1,90 @@
+package com.uas.platform.b2b.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.uas.platform.b2b.model.Cart;
+import com.uas.platform.b2b.service.CartService;
+import com.uas.platform.core.model.PageParams;
+
+/**
+ * 购物车
+ * 
+ * @author hejq
+ * @time 创建时间:2017年2月27日
+ */
+@RestController
+@RequestMapping("/cart")
+public class CartController {
+
+	@Autowired
+	private CartService cartService;
+
+	/**
+	 * 查询购物车信息
+	 * 
+	 * @param params
+	 * @return
+	 */
+	@RequestMapping(value = "/getCartList", method = RequestMethod.GET)
+	@ResponseBody
+	public Page<Cart> getCartList(PageParams params, String keyword) {
+		return cartService.getCartList(params, keyword);
+	};
+
+	/**
+	 * 提交生成采购单
+	 * 
+	 * @param id
+	 * @return
+	 */
+	@RequestMapping(value = "/addToOrder/{id}", method = RequestMethod.GET)
+	@ResponseBody
+	public ModelMap addToOrder(@PathVariable Long id) {
+		return cartService.addToOrder(id);
+	};
+
+	/**
+	 * 删除一条购物车信息
+	 * 
+	 * @param id
+	 * @return
+	 */
+	@RequestMapping(value = "/deleteCart/{id}", method = RequestMethod.DELETE)
+	@ResponseBody
+	public ModelMap deleteCart(@PathVariable Long id) {
+		return cartService.deleteCart(id);
+	};
+
+	/**
+	 * 删除一条购物车明细
+	 */
+	@RequestMapping(value = "/deleteCartDetail/{id}", method = RequestMethod.DELETE)
+	@ResponseBody
+	public ModelMap deleteCartDetail(@PathVariable Long id) {
+		return cartService.deleteCartDetail(id);
+	};
+
+	/**
+	 * 清空购物车
+	 * 
+	 * @return
+	 */
+	@RequestMapping(value = "/deleteCarts", method = RequestMethod.DELETE)
+	@ResponseBody
+	public ModelMap deleteCarts() {
+		return cartService.deleteCarts();
+	};
+
+	@RequestMapping(value = "/getCartDetail/{id}", method = RequestMethod.GET)
+	@ResponseBody
+	public Cart getCartDetail(@PathVariable Long id) {
+		return cartService.getCartDetail(id);
+	}
+}

+ 33 - 0
src/main/java/com/uas/platform/b2b/dao/CartDao.java

@@ -0,0 +1,33 @@
+package com.uas.platform.b2b.dao;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import com.uas.platform.b2b.model.Cart;
+
+@Repository
+public interface CartDao extends JpaSpecificationExecutor<Cart>, JpaRepository<Cart, Long> {
+
+	/**
+	 * 通过当前企业uu查询所有未提交的购物车信息
+	 * 
+	 * @param enuu
+	 * @return
+	 */
+	List<Cart> findByEnUUAndStatus(Long enuu, Integer status);
+
+	/**
+	 * 查询当前企业待处理的购物车数量
+	 * 
+	 * @param enuu
+	 * @param status
+	 * @return
+	 */
+	@Query("select count(o) from Cart o where o.enUU = :enUU and o.status = :status")
+	public int getTodoCountByEnUUAndStatus(@Param("enUU") long enUU, @Param("status") int status);
+}

+ 12 - 0
src/main/java/com/uas/platform/b2b/dao/CartDetailDao.java

@@ -0,0 +1,12 @@
+package com.uas.platform.b2b.dao;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import com.uas.platform.b2b.model.CartDetail;
+
+@Repository
+public interface CartDetailDao extends JpaRepository<CartDetail, Long>, JpaSpecificationExecutor<CartDetail> {
+
+}

+ 15 - 2
src/main/java/com/uas/platform/b2b/model/AddPartner.java

@@ -116,6 +116,12 @@ public class AddPartner implements Serializable {
 	@Column(name = "ap_reason")
 	private String reason;
 
+	/**
+	 * 来源id(账户中心)
+	 */
+	@Column(name = "ap_sourceid")
+	private Long sourceId;
+
 	public Long getId() {
 		return id;
 	}
@@ -236,13 +242,20 @@ public class AddPartner implements Serializable {
 		this.reason = reason;
 	}
 
+	public Long getSourceId() {
+		return sourceId;
+	}
+
+	public void setSourceId(Long sourceId) {
+		this.sourceId = sourceId;
+	}
+
 	@Override
 	public String toString() {
 		return "AddPartner [id=" + id + ", client=" + client + ", clientuu=" + clientuu + ", applicant=" + applicant
 				+ ", applicantuu=" + applicantuu + ", applydate=" + applydate + ", applyStatuscode=" + applyStatuscode
 				+ ", applyStatus=" + applyStatus + ", supplier=" + supplier + ", supplieruu=" + supplieruu
 				+ ", auditor=" + auditor + ", auditoruu=" + auditoruu + ", auditdate=" + auditdate + ", result="
-				+ result + ", reason=" + reason + "]";
+				+ result + ", reason=" + reason + ", sourceId=" + sourceId + "]";
 	}
-
 }

+ 337 - 0
src/main/java/com/uas/platform/b2b/model/Cart.java

@@ -0,0 +1,337 @@
+package com.uas.platform.b2b.model;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+import javax.persistence.OrderBy;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+
+/**
+ * 购物车
+ * 
+ * @author hejq
+ * @time 创建时间:2017年2月25日
+ */
+@Entity
+@Table(name = "purc$cart")
+public class Cart implements Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	
+	/**
+	 * id
+	 */
+	@Id
+	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "purc$ca_gen")
+	@SequenceGenerator(name = "purc$ca_gen", sequenceName = "purc$ca_seq", allocationSize = 1)
+	@Column(name = "ca_id")
+	private Long id;
+
+	/**
+	 * 采购企业UU
+	 */
+	@Column(name = "ca_enuu")
+	private Long enUU;
+
+	/**
+	 * 采购企业
+	 */
+	@OneToOne(cascade = { CascadeType.MERGE, CascadeType.REFRESH })
+	@JoinColumn(name = "ca_enuu", insertable = false, updatable = false)
+	private EnterpriseInfo enterprise;
+
+	/**
+	 * 采购单所属采购员
+	 */
+	@OneToOne(cascade = { CascadeType.REFRESH })
+	@JoinColumn(name = "ca_useruu", insertable = false, updatable = false)
+	private User user;
+
+	/**
+	 * 采购单所属采购员UU
+	 */
+	@Column(name = "ca_useruu")
+	private Long userUU;
+
+	/**
+	 * 购物车单号
+	 */
+	@Column(name = "ca_code")
+	private String code;
+
+	/**
+	 * 单据归属日期
+	 */
+	@Column(name = "ca_date")
+	private Date date;
+
+	/**
+	 * 录单人
+	 */
+	@Column(name = "ca_recorder")
+	private String recorder;
+
+	/**
+	 * 审核人
+	 */
+	@Column(name = "ca_auditor")
+	private String auditor;
+
+	/**
+	 * 供应商UU
+	 */
+	@Column(name = "ca_venduu")
+	private Long vendUU;
+
+	/**
+	 * 供应商联系人UU
+	 */
+	@Column(name = "ca_venduseruu")
+	private Long vendUserUU;
+
+	/**
+	 * 收货地址
+	 */
+	@Column(name = "ca_shipaddress")
+	private String shipAddress;
+
+	/**
+	 * 备注
+	 */
+	@Column(name = "ca_remark")
+	private String remark;
+
+	/**
+	 * 付款币种
+	 */
+	@Column(name = "ca_currency")
+	private String currency;
+
+	/**
+	 * 汇率
+	 */
+	@Column(name = "ca_rate")
+	private Float rate;
+
+	/**
+	 * 付款方式
+	 */
+	@Column(name = "ca_payments")
+	private String payments;
+
+	/**
+	 * 购物车明细
+	 */
+	@OneToMany(mappedBy = "cart", cascade = { CascadeType.REFRESH }, fetch = FetchType.EAGER)
+	@OrderBy("number")
+	private Set<CartDetail> cartDetails;
+
+	/**
+	 * 应付供应商名称
+	 */
+	@Column(name = "ca_receivename")
+	private String receiveName;
+
+	/**
+	 * 应付供应商编号
+	 */
+	@Column(name = "ca_receivecode")
+	private String receiveCode;
+
+	/**
+	 * 供应商名称
+	 */
+	@Transient
+	private String enName;
+	
+	/**
+	 * 提交状态
+	 */
+	@Column(name = "ca_status")
+	private Integer status;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Long getEnUU() {
+		return enUU;
+	}
+
+	public void setEnUU(Long enUU) {
+		this.enUU = enUU;
+	}
+
+	public EnterpriseInfo getEnterprise() {
+		return enterprise;
+	}
+
+	public void setEnterprise(EnterpriseInfo enterprise) {
+		this.enterprise = enterprise;
+	}
+
+	public User getUser() {
+		return user;
+	}
+
+	public void setUser(User user) {
+		this.user = user;
+	}
+
+	public Long getUserUU() {
+		return userUU;
+	}
+
+	public void setUserUU(Long userUU) {
+		this.userUU = userUU;
+	}
+
+	public String getCode() {
+		return code;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public Date getDate() {
+		return date;
+	}
+
+	public void setDate(Date date) {
+		this.date = date;
+	}
+
+	public String getRecorder() {
+		return recorder;
+	}
+
+	public void setRecorder(String recorder) {
+		this.recorder = recorder;
+	}
+
+	public String getAuditor() {
+		return auditor;
+	}
+
+	public void setAuditor(String auditor) {
+		this.auditor = auditor;
+	}
+
+	public Long getVendUU() {
+		return vendUU;
+	}
+
+	public void setVendUU(Long vendUU) {
+		this.vendUU = vendUU;
+	}
+
+	public Long getVendUserUU() {
+		return vendUserUU;
+	}
+
+	public void setVendUserUU(Long vendUserUU) {
+		this.vendUserUU = vendUserUU;
+	}
+
+	public String getShipAddress() {
+		return shipAddress;
+	}
+
+	public void setShipAddress(String shipAddress) {
+		this.shipAddress = shipAddress;
+	}
+
+	public String getRemark() {
+		return remark;
+	}
+
+	public void setRemark(String remark) {
+		this.remark = remark;
+	}
+
+	public String getCurrency() {
+		return currency;
+	}
+
+	public void setCurrency(String currency) {
+		this.currency = currency;
+	}
+
+	public Float getRate() {
+		return rate;
+	}
+
+	public void setRate(Float rate) {
+		this.rate = rate;
+	}
+
+	public String getPayments() {
+		return payments;
+	}
+
+	public void setPayments(String payments) {
+		this.payments = payments;
+	}
+
+	public Set<CartDetail> getCartDetails() {
+		return cartDetails;
+	}
+
+	public void setCartDetails(Set<CartDetail> cartDetails) {
+		this.cartDetails = cartDetails;
+	}
+
+	public String getReceiveName() {
+		return receiveName;
+	}
+
+	public void setReceiveName(String receiveName) {
+		this.receiveName = receiveName;
+	}
+
+	public String getReceiveCode() {
+		return receiveCode;
+	}
+
+	public void setReceiveCode(String receiveCode) {
+		this.receiveCode = receiveCode;
+	}
+
+	public String getEnName() {
+		return enName;
+	}
+
+	public void setEnName(String enName) {
+		this.enName = enName;
+	}
+
+	public Integer getStatus() {
+		return status;
+	}
+
+	public void setStatus(Integer status) {
+		this.status = status;
+	}
+
+}

+ 255 - 0
src/main/java/com/uas/platform/b2b/model/CartDetail.java

@@ -0,0 +1,255 @@
+package com.uas.platform.b2b.model;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToOne;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+
+import org.codehaus.jackson.annotate.JsonIgnore;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+@Entity
+@Table(name = "purc$cartdetail")
+public class CartDetail {
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "purc$cartdetail_gen")
+	@SequenceGenerator(name = "purc$cartdetail_gen", sequenceName = "purc$cartdetail_seq", allocationSize = 1)
+	@Column(name = "cad_id")
+	private Long id;
+
+	/**
+	 * 序号
+	 */
+	@Column(name = "cad_number")
+	private Short number;
+
+	/**
+	 * 购物车主记录
+	 */
+	@ManyToOne(cascade = CascadeType.ALL, optional = true)
+	@JoinColumn(name = "cad_caid", nullable = false)
+	private Cart cart;
+
+	/**
+	 * 产品ID
+	 */
+	@Column(name = "cad_prid")
+	private Long productId;
+
+	/**
+	 * 产品
+	 */
+	@OneToOne(cascade = { CascadeType.REFRESH })
+	@JoinColumn(name = "cad_prid", insertable = false, updatable = false)
+	private Product product;
+
+	/**
+	 * 数量
+	 */
+	@Column(name = "cad_qty")
+	private Double qty;
+
+	/**
+	 * 备注
+	 */
+	@Column(name = "cad_remark")
+	private String remark;
+
+	/**
+	 * 送货工厂
+	 */
+	@Column(name = "cad_factory")
+	private String factory;
+
+	/**
+	 * 供应商规格
+	 */
+	@Column(name = "cad_vendspec")
+	private String vendspec;
+
+	/**
+	 * 含税单价
+	 */
+	@Column(name = "cad_price")
+	private Double price;
+
+	/**
+	 * 税率
+	 */
+	@Column(name = "cad_taxrate")
+	private Float taxrate;
+
+	/**
+	 * 含税金额
+	 */
+	@Column(name = "cad_amount", insertable = false, updatable = false)
+	private Double amount;
+
+	/**
+	 * 不含税单价
+	 */
+	@Column(name = "cad_notaxprice", insertable = false, updatable = false)
+	private Double noTaxPrice;
+
+	/**
+	 * 不含税金额
+	 */
+	@Column(name = "cad_notaxamount", insertable = false, updatable = false)
+	private Double noTaxAmount;
+
+	/**
+	 * 交货日期
+	 */
+	@Column(name = "cad_delivery")
+	private Date delivery;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Short getNumber() {
+		return number;
+	}
+
+	public void setNumber(Short number) {
+		this.number = number;
+	}
+
+	@JsonIgnore
+	@JSONField(serialize = false)
+	public Cart getCart() {
+		return cart;
+	}
+
+	public void setCart(Cart cart) {
+		this.cart = cart;
+	}
+
+	public Long getProductId() {
+		return productId;
+	}
+
+	public void setProductId(Long productId) {
+		this.productId = productId;
+	}
+
+	public Product getProduct() {
+		return product;
+	}
+
+	public void setProduct(Product product) {
+		this.product = product;
+	}
+
+	public Double getQty() {
+		return qty;
+	}
+
+	public void setQty(Double qty) {
+		this.qty = qty;
+	}
+
+	public String getRemark() {
+		return remark;
+	}
+
+	public void setRemark(String remark) {
+		this.remark = remark;
+	}
+
+	public String getFactory() {
+		return factory;
+	}
+
+	public void setFactory(String factory) {
+		this.factory = factory;
+	}
+
+	public String getVendspec() {
+		return vendspec;
+	}
+
+	public void setVendspec(String vendspec) {
+		this.vendspec = vendspec;
+	}
+
+	public Double getPrice() {
+		return price;
+	}
+
+	public void setPrice(Double price) {
+		this.price = price;
+	}
+
+	public Float getTaxrate() {
+		return taxrate;
+	}
+
+	public void setTaxrate(Float taxrate) {
+		this.taxrate = taxrate;
+	}
+
+	public Double getAmount() {
+		return amount;
+	}
+
+	public void setAmount(Double amount) {
+		this.amount = amount;
+	}
+
+	public Double getNoTaxPrice() {
+		return noTaxPrice;
+	}
+
+	public void setNoTaxPrice(Double noTaxPrice) {
+		this.noTaxPrice = noTaxPrice;
+	}
+
+	public Double getNoTaxAmount() {
+		return noTaxAmount;
+	}
+
+	public void setNoTaxAmount(Double noTaxAmount) {
+		this.noTaxAmount = noTaxAmount;
+	}
+
+	public Date getDelivery() {
+		return delivery;
+	}
+
+	public void setDelivery(Date delivery) {
+		this.delivery = delivery;
+	}
+
+	public static List<Cart> distinct(List<CartDetail> details) {
+		List<Cart> carts = new ArrayList<Cart>();
+		Set<Long> keys = new HashSet<Long>();
+		for (CartDetail detail : details) {
+			if (!keys.contains(detail.getCart().getId())) {
+				carts.add(detail.getCart());
+				keys.add(detail.getCart().getId());
+			}
+		}
+		return carts;
+	}
+
+}

+ 20 - 2
src/main/java/com/uas/platform/b2b/service/BaseInfoService.java

@@ -5,6 +5,7 @@ import java.util.List;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.ui.ModelMap;
 
+import com.uas.platform.b2b.model.FileUpload;
 import com.uas.platform.b2b.model.Product;
 import com.uas.platform.b2b.model.PurchaseOrderAllItem;
 import com.uas.platform.b2b.model.Vendor;
@@ -30,7 +31,7 @@ public interface BaseInfoService {
 	 * @param prodInfo
 	 * @return
 	 */
-	public Product update(Product prodInfo);
+	public ModelMap update(Product prodInfo, FileUpload uploadItem);
 
 	/**
 	 * 新增物料
@@ -38,7 +39,7 @@ public interface BaseInfoService {
 	 * @param prodInfo
 	 * @return
 	 */
-	public Product addNewProduct(Product prodInfo);
+	public ModelMap addNewProduct(Product prodInfo, FileUpload uploadItem);
 
 	/**
 	 * 通过id查询物料信息
@@ -64,6 +65,14 @@ public interface BaseInfoService {
 	 */
 	public List<PurchaseOrderAllItem> save(NewPurcOrder neworder);
 
+	/**
+	 * 加入购物车
+	 * 
+	 * @param neworder
+	 * @return
+	 */
+	public ModelMap addtoCart(NewPurcOrder neworder);
+
 	/**
 	 * 添加为客户
 	 * 
@@ -98,4 +107,13 @@ public interface BaseInfoService {
 	 * @throws Exception
 	 */
 	SPage<UserSpaceDetail> getUserSpaceDetails(PageParams params, String keyword) throws Exception;
+
+	/**
+	 * 通过id获取附件信息
+	 * 
+	 * @param id
+	 * @return
+	 */
+	public ModelMap getAttachById(Long id);
+
 }

+ 64 - 0
src/main/java/com/uas/platform/b2b/service/CartService.java

@@ -0,0 +1,64 @@
+package com.uas.platform.b2b.service;
+
+import org.springframework.data.domain.Page;
+import org.springframework.ui.ModelMap;
+
+import com.uas.platform.b2b.model.Cart;
+import com.uas.platform.core.model.PageParams;
+
+public interface CartService {
+
+	/**
+	 * 查询购物车信息
+	 * 
+	 * @param params
+	 * @return
+	 */
+	Page<Cart> getCartList(PageParams params, String keyword);
+
+	/**
+	 * 生成采购单
+	 * 
+	 * @param id
+	 * @return
+	 */
+	public ModelMap addToOrder(Long id);
+
+	/**
+	 * 删除一条购物车信息
+	 * 
+	 * @param id
+	 * @return
+	 */
+	public ModelMap deleteCart(Long id);
+
+	/**
+	 * 删除一条购物车明细
+	 * 
+	 * @param id
+	 * @return
+	 */
+	public ModelMap deleteCartDetail(Long id);
+
+	/**
+	 * 清空购物车
+	 * 
+	 * @return
+	 */
+	public ModelMap deleteCarts();
+
+	/**
+	 * 查询购物车详情
+	 * 
+	 * @param id
+	 * @return
+	 */
+	public Cart getCartDetail(Long id);
+
+	/**
+	 * 查询待处理货物总数(主表)
+	 * 
+	 * @return
+	 */
+	public Object getCartTodoCount();
+}

+ 123 - 32
src/main/java/com/uas/platform/b2b/service/impl/BaseInfoServiceImpl.java

@@ -1,7 +1,6 @@
 package com.uas.platform.b2b.service.impl;
 
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -18,20 +17,26 @@ import org.springframework.ui.ModelMap;
 import com.uas.account.entity.RequsetStatus;
 import com.uas.account.support.Page;
 import com.uas.account.util.AccountUtils;
+import com.uas.platform.b2b.dao.CartDetailDao;
 import com.uas.platform.b2b.dao.ComponentDao;
 import com.uas.platform.b2b.dao.EnterpriseDao;
 import com.uas.platform.b2b.dao.ProductDao;
 import com.uas.platform.b2b.dao.PurchaseOrderAllItemDao;
 import com.uas.platform.b2b.dao.UserBaseInfoDao;
 import com.uas.platform.b2b.dao.VendorDao;
+import com.uas.platform.b2b.model.Attach;
+import com.uas.platform.b2b.model.Cart;
+import com.uas.platform.b2b.model.CartDetail;
 import com.uas.platform.b2b.model.Component;
 import com.uas.platform.b2b.model.Enterprise;
 import com.uas.platform.b2b.model.EnterpriseInfo;
+import com.uas.platform.b2b.model.FileUpload;
 import com.uas.platform.b2b.model.Product;
 import com.uas.platform.b2b.model.PurchaseOrderAll;
 import com.uas.platform.b2b.model.PurchaseOrderAllItem;
 import com.uas.platform.b2b.model.UserBaseInfo;
 import com.uas.platform.b2b.model.Vendor;
+import com.uas.platform.b2b.service.AttachService;
 import com.uas.platform.b2b.service.BaseInfoService;
 import com.uas.platform.b2b.support.SystemSession;
 import com.uas.platform.b2b.support.UsageBufferedLogger;
@@ -69,6 +74,12 @@ public class BaseInfoServiceImpl implements BaseInfoService {
 	@Autowired
 	private UserBaseInfoDao userBaseInfoDao;
 
+	@Autowired
+	private AttachService attachService;
+
+	@Autowired
+	private CartDetailDao cartDetailDao;
+
 	/**
 	 * 批量导入物料资料
 	 */
@@ -136,6 +147,7 @@ public class BaseInfoServiceImpl implements BaseInfoService {
 					}
 					product.setEnUU(SystemSession.getUser().getEnterprise().getUu());
 					product.setUserUU(SystemSession.getUser().getUserUU());
+					product.setSourceApp("B2B");
 					if (alters.size() > 0) {
 						modelMap.put("alters", alters);
 					}
@@ -158,41 +170,66 @@ public class BaseInfoServiceImpl implements BaseInfoService {
 	 * 更新物料信息
 	 */
 	@Override
-	public Product update(Product prodInfo) {
-		Product productInfo = productDao.findOne(prodInfo.getId());
-		productInfo.setBrand(prodInfo.getBrand());
-		productInfo.setCmpCode(prodInfo.getCmpCode());
-		productInfo.setCmpUuId(prodInfo.getCmpUuId());
-		productInfo.setTitle(prodInfo.getTitle());
-		productInfo.setSpec(prodInfo.getSpec());
-		productInfo.setUnit(prodInfo.getUnit());
-		productInfo.setCode(prodInfo.getCode());
-		return productDao.save(productInfo);
+	public ModelMap update(Product prodInfo, FileUpload uploadItem) {
+		ModelMap map = new ModelMap();
+		if (uploadItem.getFile() != null) {// 附件存在
+			Attach attach = attachService.upload(uploadItem, "productAttach", "平台客户上传物料照片或附件");
+			if (attach == null) {
+				map.put("error", "文件太大");
+			} else {
+				prodInfo.setAttach(attach);
+			}
+		}
+		productDao.save(prodInfo);
+		map.put("success", "物料更新成功");
+		return map;
 	}
 
 	/**
 	 * 新增物料
 	 */
 	@Override
-	public Product addNewProduct(Product prodInfo) {
-		Product productInfo = new Product();
-		productInfo.setBrand(prodInfo.getBrand());
-		productInfo.setCmpCode(prodInfo.getCmpCode());
-		productInfo.setCmpUuId(prodInfo.getCmpUuId());
-		productInfo.setCode(prodInfo.getCode());
-		productInfo.setTitle(prodInfo.getTitle());
-		productInfo.setSpec(prodInfo.getSpec());
-		productInfo.setUnit(prodInfo.getUnit());
-		productInfo.setUserUU(SystemSession.getUser().getUserUU());
-		productInfo.setEnUU(SystemSession.getUser().getEnterprise().getUu());
-		List<Component> comp = componentDao.findByCode(prodInfo.getCode());
-		if (!CollectionUtils.isEmpty(comp)) {
-			productInfo.setCmpUuId(comp.get(0).getUuid());
-			productInfo.setCmpCode(comp.get(0).getCode());
-		} else {
-			productInfo.setCmpCode(prodInfo.getCode());
+	public ModelMap addNewProduct(Product prodInfo, FileUpload uploadItem) {
+		ModelMap map = new ModelMap();
+		if (uploadItem.getFile() != null) {// 附件存在
+			Attach attach = attachService.upload(uploadItem, "productAttach", "平台客户上传物料照片或附件");
+			if (attach == null) {
+				map.put("error", "文件太大");
+			} else {
+				prodInfo.setAttach(attach);
+			}
 		}
-		return productDao.save(productInfo);
+		List<Product> products = productDao.findByEnUUAndCode(SystemSession.getUser().getEnterprise().getUu(),
+				prodInfo.getCode());
+		Product product = new Product();
+		if (prodInfo.getCmpUuId() != null) {
+			product = productDao.findByEnUUAndCmpUuId(SystemSession.getUser().getEnterprise().getUu(),
+					prodInfo.getCmpUuId());
+		}
+		if (!CollectionUtils.isEmpty(products)) {
+			map.put("error", "物料已存在");
+			map.put("id", products.get(0).getId());
+		}
+		if (product != null) {
+			map.put("error", "该器件物料已存在,正在跳转详情页面.....");
+			map.put("id", product.getId());
+		}
+		if (CollectionUtils.isEmpty(products) && product == null) {
+			prodInfo.setUserUU(SystemSession.getUser().getUserUU());
+			prodInfo.setEnUU(SystemSession.getUser().getEnterprise().getUu());
+			prodInfo.setSourceApp("B2B");
+			List<Component> comp = componentDao.findByCode(prodInfo.getCode());
+			if (!CollectionUtils.isEmpty(comp)) {
+				prodInfo.setCmpUuId(comp.get(0).getUuid());
+				prodInfo.setCmpCode(comp.get(0).getCode());
+			} else {
+				prodInfo.setCmpCode(prodInfo.getCode());
+			}
+			prodInfo = productDao.save(prodInfo);
+			map.put("id", prodInfo.getId());
+			map.put("success", "物料添加成功");
+		}
+		return map;
 	}
 
 	@Override
@@ -250,9 +287,7 @@ public class BaseInfoServiceImpl implements BaseInfoService {
 				i++;
 			}
 		}
-		logger.log("平台新增采购单",
-				"[" + SystemSession.getUser().getEnterprise() + "]的[" + SystemSession.getUser().getUserName() + "]向["
-						+ neworder.getCust().getEnName() + "]下了一张采购单,时间:" + new Date());
+		logger.log("平台新增采购订单", "新增采购单", SystemSession.getUser().getUserName() + "新增了采购单");
 		return purchaseOrderAllItemDao.save(orderItems);
 	}
 
@@ -392,4 +427,60 @@ public class BaseInfoServiceImpl implements BaseInfoService {
 		return userSpaceDetails;
 	}
 
+	@Override
+	public ModelMap addtoCart(NewPurcOrder neworder) {
+		ModelMap map = new ModelMap();
+		Cart cart = new Cart();
+		Set<CartDetail> cartDetails = new HashSet<CartDetail>();
+		EnterpriseInfo enter = enterpriseDao.findEnterpriseInfoByUu(SystemSession.getUser().getEnterprise().getUu());
+		// 主记录
+		cart.setCode(neworder.getCode());
+		cart.setDate(neworder.getDate());
+		cart.setEnUU(SystemSession.getUser().getEnterprise().getUu());
+		cart.setRecorder(SystemSession.getUser().getUserName());
+		cart.setUserUU(SystemSession.getUser().getUserUU());
+		cart.setEnterprise(enter);
+		cart.setUser(SystemSession.getUser());
+		cart.setVendUserUU(neworder.getCustUserUU());
+		cart.setVendUU(neworder.getCust().getUu());
+		cart.setCurrency("RMB");
+		cart.setShipAddress(SystemSession.getUser().getEnterprise().getEnAddress());
+		cart.setReceiveName(neworder.getCust().getEnName());
+		cart.setReceiveCode(String.valueOf(neworder.getCust().getUu()));
+		cart.setEnName(neworder.getCust().getEnName());
+		cart.setStatus(Status.UNAUDIT.value());
+		short i = 1;
+		if (!CollectionUtils.isEmpty(neworder.getOrderItems())) {
+			for (OrderItems orderitem : neworder.getOrderItems()) {
+				// 采购详情
+				CartDetail cartDetail = new CartDetail();
+				cartDetail.setDelivery(orderitem.getDelivery());
+				cartDetail.setQty(Double.valueOf(orderitem.getQty()));
+				cartDetail.setProduct(productDao.findOne(orderitem.getId()));
+				cartDetail.setRemark(orderitem.getRemark());
+				cartDetail.setProductId(orderitem.getId());
+				cartDetail.setNumber(i);
+				cartDetail.setCart(cart);
+				cartDetail.setPrice(Double.valueOf(orderitem.getPrice()));
+				cartDetails.add(cartDetail);
+				i++;
+			}
+		}
+		List<CartDetail> cartDets = cartDetailDao.save(cartDetails);
+		logger.log("购物车添加商品", "向购物车添加商品(id=" + cartDets.get(0).getCart().getId() + ")",
+				SystemSession.getUser().getUserUU(), SystemSession.getUser().getIp());
+		map.put("success", "加入购物车成功");
+		map.put("id", cartDets.get(0).getCart().getId());
+		return map;
+	}
+
+	@Override
+	public ModelMap getAttachById(Long id) {
+		ModelMap map = new ModelMap();
+		Attach attach = attachService.getAttach(id);
+		map.put("url", attach.getPath());
+		return map;
+	}
+
+
 }

+ 176 - 0
src/main/java/com/uas/platform/b2b/service/impl/CartServiceImpl.java

@@ -0,0 +1,176 @@
+package com.uas.platform.b2b.service.impl;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.ui.ModelMap;
+
+import com.uas.platform.b2b.dao.CartDao;
+import com.uas.platform.b2b.dao.CartDetailDao;
+import com.uas.platform.b2b.dao.ProductDao;
+import com.uas.platform.b2b.dao.PurchaseOrderAllItemDao;
+import com.uas.platform.b2b.model.Cart;
+import com.uas.platform.b2b.model.CartDetail;
+import com.uas.platform.b2b.model.PurchaseOrderAll;
+import com.uas.platform.b2b.model.PurchaseOrderAllItem;
+import com.uas.platform.b2b.service.CartService;
+import com.uas.platform.b2b.support.SystemSession;
+import com.uas.platform.b2b.support.UsageBufferedLogger;
+import com.uas.platform.core.logging.BufferedLoggerManager;
+import com.uas.platform.core.model.Constant;
+import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
+import com.uas.platform.core.model.Status;
+
+@Service
+public class CartServiceImpl implements CartService {
+
+	private final static UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
+
+	@Autowired
+	private CartDao cartDao;
+
+	@Autowired
+	private CartDetailDao cartDetailDao;
+
+	@Autowired
+	private PurchaseOrderAllItemDao purchaseOrderAllItemDao;
+
+	@Autowired
+	private ProductDao productDao;
+
+	@Override
+	public org.springframework.data.domain.Page<Cart> getCartList(PageParams params, String keyword) {
+		final PageInfo pageInfo = new PageInfo();
+		pageInfo.filter("enUU", SystemSession.getUser().getEnterprise().getUu());
+		pageInfo.filter("status", Status.UNAUDIT.value());
+		return cartDao.findAll(new Specification<Cart>() {
+			public Predicate toPredicate(Root<Cart> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
+				return query.where(pageInfo.getPredicates(root, query, builder)).getRestriction();
+			}
+		}, pageInfo);
+	}
+
+	@Override
+	public ModelMap addToOrder(Long id) {
+		ModelMap map = new ModelMap();
+		Cart cart = cartDao.findOne(id);
+		PurchaseOrderAll purcOrder = new PurchaseOrderAll();
+		Set<PurchaseOrderAllItem> orderItems = new HashSet<PurchaseOrderAllItem>();
+		purcOrder.setCode(cart.getCode());
+		purcOrder.setDate(new Date());
+		purcOrder.setEnUU(SystemSession.getUser().getEnterprise().getUu());
+		purcOrder.setSendStatus((short) Status.NOT_UPLOAD.value());
+		purcOrder.setStatus((short) Status.NOT_REPLY.value());
+		purcOrder.setRecorder(SystemSession.getUser().getUserName());
+		purcOrder.setUserUU(SystemSession.getUser().getUserUU());
+		purcOrder.setEnterprise(cart.getEnterprise());
+		purcOrder.setUser(SystemSession.getUser());
+		purcOrder.setVendUserUU(cart.getUserUU());
+		purcOrder.setVendUU(cart.getEnUU());
+		purcOrder.setDisplay(Constant.YES);
+		purcOrder.setCurrency("RMB");
+		purcOrder.setType("平台采购");
+		purcOrder.setAuditor(SystemSession.getUser().getUserName());
+		purcOrder.setShipAddress(SystemSession.getUser().getEnterprise().getEnAddress());
+		purcOrder.setReceiveName(cart.getReceiveName());
+		purcOrder.setReceiveCode(String.valueOf(cart.getReceiveCode()));
+		purcOrder.setEnName(cart.getEnName());
+		short i = 1;
+		if (!CollectionUtils.isEmpty(cart.getCartDetails())) {
+			for (CartDetail cartdetail : cart.getCartDetails()) {
+				// 采购详情
+				PurchaseOrderAllItem orderItem = new PurchaseOrderAllItem();
+				orderItem.setDelivery(cartdetail.getDelivery());
+				orderItem.setQty(Double.valueOf(cartdetail.getQty()));
+				orderItem.setProduct(productDao.findOne(cartdetail.getId()));
+				orderItem.setRemark(cartdetail.getRemark());
+				orderItem.setProductId(cartdetail.getId());
+				orderItem.setStatus((short) Status.NOT_REPLY.value());
+				orderItem.setNumber(i);
+				orderItem.setOrder(purcOrder);
+				orderItem.setPrice(Double.valueOf(cartdetail.getPrice()));
+				orderItems.add(orderItem);
+				i++;
+			}
+		}
+		List<PurchaseOrderAllItem> orderItem = purchaseOrderAllItemDao.save(orderItems);
+		cart.setStatus(Status.ENABLED.value());
+		cartDao.save(cart);
+		logger.log("平台新增采购单", "新增了一张采购单(" + orderItem.get(0).getOrder().getId() + ")",
+				SystemSession.getUser().getUserUU(), SystemSession.getUser().getIp());
+		map.put("id", orderItem.get(0).getOrder().getId());
+		map.put("success", "下单成功,正在跳转详情页面...");
+		return map;
+	}
+
+	@Override
+	public ModelMap deleteCart(Long id) {
+		ModelMap map = new ModelMap();
+		Cart cart = cartDao.findOne(id);
+		if (cart != null && !CollectionUtils.isEmpty(cart.getCartDetails())) {
+			for (CartDetail detail : cart.getCartDetails()) {
+				cartDetailDao.delete(detail.getId());
+			}
+		} else {
+			map.put("error", "该条记录不存在,可能已被删除");
+		}
+		map.put("success", "删除成功");
+		return map;
+	}
+
+	@Override
+	public ModelMap deleteCartDetail(Long id) {
+		ModelMap map = new ModelMap();
+		CartDetail detail = cartDetailDao.findOne(id);
+		if (detail == null) {
+			map.put("error", "该条明细不存在,可能已被删除");
+		} else {
+			cartDetailDao.delete(id);
+			map.put("success", "该条明细已删除");
+		}
+		return map;
+	}
+
+	@Override
+	public ModelMap deleteCarts() {
+		ModelMap map = new ModelMap();
+		List<Cart> carts = cartDao.findByEnUUAndStatus(SystemSession.getUser().getEnterprise().getUu(),
+				Status.UNAUDIT.value());
+		if (!CollectionUtils.isEmpty(carts)) {
+			for (Cart cart : carts) {
+				if (!CollectionUtils.isEmpty(cart.getCartDetails())) {
+					for (CartDetail detail : cart.getCartDetails()) {
+						cartDetailDao.delete(detail.getId());
+						map.put("success", "购物车已清空");
+					}
+				}
+			}
+		} else {
+			map.put("error", "购物车删除失败");
+		}
+		return map;
+	}
+
+	@Override
+	public Cart getCartDetail(Long id) {
+		return cartDao.findOne(id);
+	}
+
+	@Override
+	public Object getCartTodoCount() {
+		return cartDao.getTodoCountByEnUUAndStatus(SystemSession.getUser().getEnterprise().getUu(),
+				Status.UNAUDIT.value());
+	}
+}

+ 387 - 28
src/main/webapp/resources/js/index/app.js

@@ -1,6 +1,6 @@
-define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'service/Make', 'service/Fa', 'service/Account', 'service/Alert', 'service/CheckTel', 'ui.router', 'ui.bootstrap', 'file-upload', 'ngSanitize', 'service/BaseInfo'], function() {
+define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'service/Make', 'service/Fa', 'service/Account', 'service/Alert', 'service/CheckTel', 'ui.router', 'ui.bootstrap', 'file-upload', 'ngSanitize', 'service/BaseInfo', 'service/Cart'], function() {
 	'use strict';
-	var app = angular.module('myApp', [ 'toaster', 'angularCharts', 'ngTable', 'ui.router', 'common.services', 'PurcServices', 'MakeServices', 'FaServices', 'AccountServices', 'AlertServices', 'ui.bootstrap', 'angularFileUpload', 'ngSanitize', 'CheckTelModule', 'ProductServices']);
+	var app = angular.module('myApp', [ 'toaster', 'angularCharts', 'ngTable', 'ui.router', 'common.services', 'PurcServices', 'MakeServices', 'FaServices', 'AccountServices', 'AlertServices', 'ui.bootstrap', 'angularFileUpload', 'ngSanitize', 'CheckTelModule', 'ProductServices', 'CartServices']);
 	app.init = function() {
 		angular.bootstrap(document, [ 'myApp' ]);
 	};
@@ -100,9 +100,17 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'ser
 			templateUrl : "static/tpl/index/purc/order_detail.html",
 			controller: 'PurcOrderDetailCtrl'
 		}).state('purc.newOrder', {
-			url : "addOrder",
+			url : "/addOrder",
 			templateUrl : "static/tpl/index/purc/addOrder.html",
 			controller : 'PurcNewOrderCtrl'
+		}).state('purc.cart', {
+			url : "/cart",
+			templateUrl : "static/tpl/index/purc/cart.html",
+			controller : 'CartController'
+		}).state('purc.cartDetail', {
+			url : "/cart/:id",
+			templateUrl : "static/tpl/index/purc/cart_detail.html",
+			controller : 'CartDetailController'
 		}).state('sale.todo', {
 			url : "/todo",
 			templateUrl : "static/tpl/index/sale/todo.html"
@@ -3581,6 +3589,7 @@ app.controller('SaleSendCtrl', ['$scope', '$filter', 'SaleSend', 'ngTableParams'
 			$modalInstance.close();
 		}
 	}]);
+	
 	app.controller('SaleSampleDetailCtrl', ['$scope', '$stateParams', 'PurcSample', 'toaster', 'ReportService', function($scope, $stateParams, PurcSample, toaster, ReportService){
 		var loading = true;
 		var loadData = function() {
@@ -5610,6 +5619,7 @@ app.controller('SaleSendCtrl', ['$scope', '$filter', 'SaleSend', 'ngTableParams'
 			}
 		};
 	}]);
+	
 	app.controller('AddVendorCtrl', ['$scope', '$modalInstance', 'user', 'AccountUser', 'toaster', function($scope, $modalInstance, user, AccountUser, toaster){
 		$scope.checkboxes = {
 				checked : false
@@ -6907,7 +6917,7 @@ app.controller('SaleSendCtrl', ['$scope', '$filter', 'SaleSend', 'ngTableParams'
 	/**
 	 * 物料资料
 	 */
-	app.controller('ProductListCtrl', ['$scope', 'GetProductInfo', 'ngTableParams', '$filter', 'BaseService', 'toaster', function($scope, GetProductInfo, ngTableParams, $filter, BaseService, toaster) {
+	app.controller('ProductListCtrl', ['$scope', 'GetProductInfo', 'ngTableParams', '$filter', 'BaseService', 'toaster', '$timeout', function($scope, GetProductInfo, ngTableParams, $filter, BaseService, toaster, $timeout) {
 		$scope.active = 'all';
 		$scope.agreedText = '全部';
 		$scope.dateZoneText = '一个月内';
@@ -6972,11 +6982,13 @@ app.controller('SaleSendCtrl', ['$scope', '$filter', 'SaleSend', 'ngTableParams'
 		
 		//删除
 		$scope.deleteById = function(id) {
-			console.log(id);
 			GetProductInfo.deleteById({id: id}, function(data) {
 				toaster.pop("success", "提示", "删除成功");
+				$timeout(function() {
+					window.location.reload();
+				}, 500);
 			}), function(response) {
-				toaster.pop("error", "删除失败", response);
+				toaster.pop("error", "删除失败", response.data);
 			};
 		}
 		
@@ -6995,7 +7007,6 @@ app.controller('SaleSendCtrl', ['$scope', '$filter', 'SaleSend', 'ngTableParams'
 				file: file,
 				method: 'POST'
 			}).success(function(data) {
-				console.log(data);
 				$scope.result = data;
 				$scope.success = $scope.result.success;
 				$scope.total = $scope.result.total;
@@ -7030,13 +7041,30 @@ app.controller('SaleSendCtrl', ['$scope', '$filter', 'SaleSend', 'ngTableParams'
 	app.controller('ProductDetailCtrl', ['$scope', 'GetProductInfo', '$upload', 'ngTableParams', '$stateParams', 'toaster', function($scope, GetProductInfo, $upload, ngTableParams, $stateParams, toaster) {
 		var loadData = function() {
 			GetProductInfo.getOne({id: $stateParams.id}, function(data) {
+				if(data.attach) {
+					GetProductInfo.getAttach({id: data.attach.id}, function(data) {
+						console.log(data.url);
+						// 查看范例
+						$scope.showImg = function() {
+							var src = data.url, box = $('#image-box');
+							box.show();
+							box.find('img').attr('src', src);
+							box.find('a').click(function(){
+								box.hide();
+							});
+							box.dblclick(function(){
+								box.hide();
+							});
+						};
+					})
+				}
 				$scope.prodInfo = data;
 				$scope.prodInfo.$editing = false;
 				$scope.loading = false;
 			});
 		};
 		loadData();
-		
+
 		// 更新
 		$scope.update = function() {
 			$scope.prodInfo.$editing = true;
@@ -7048,19 +7076,76 @@ app.controller('SaleSendCtrl', ['$scope', '$filter', 'SaleSend', 'ngTableParams'
 		};
 		
 		$scope.submit = function(prodInfo) {
-			console.log(prodInfo);
-			GetProductInfo.update({}, prodInfo, function(data) {
-				toaster.pop("success", "提示", "提交成功");
-			}, function(res) {
-				toaster.pop("error", "提示" + res);
+			var file = $scope.myFiles, file = file && file.length > 0 ? file[0] : null;// 可以不传附件
+			console.log(file);
+			$upload.upload({
+				url: 'product/baseInfo/updateProdInfo',
+				file: file,
+				method: 'POST',
+				data: {
+					prodInfo: $scope.prodInfo
+				},
+			}).success(function(data) {
+				if(data.success) {
+					toaster.pop('success', '提示', data.success);
+					window.location.reload();
+				}
+				if(data.error) {
+					toaster.pop('error', '提示', data.error);
+				}
+			}).error(function(data) {
+				$scope.loadingShow = false;
+				toaster.pop('error', '操作失败', data.error);
 			});
 		}
+		
+		$scope.previewShow = false;
+		$scope.pdfShow = false;
+		$scope.noneFileShow = true;
+		$scope.$watch('myFiles', function(){
+			if($scope.myFiles) {
+				$scope.noneFileShow = false;
+				var file = $scope.myFiles[0];
+				if(file.name.indexOf('.pdf') != -1 || file.name.indexOf('.PDF') != -1) {//pdf文件
+					$scope.pdfShow = true;
+					$scope.previewShow = false;
+					$scope.imgPreviewName = file.name;
+				} else{
+					if (typeof(Worker) !== "undefined") {//支持HTML5
+						$scope.imgPreview = getObjectURL(file);
+						$scope.imgPreviewName = file.name;
+					} else{//不支持HTML5
+						$scope.imgPreview = 'static/img/all/preview-error.jpg';
+						$scope.imgPreviewName = file.name;
+					}
+					$scope.previewShow = true;
+					$scope.pdfShow = false;
+				}
+			} else {
+				$scope.noneFileShow = true;
+				$scope.previewShow = false;
+				$scope.pdfShow = false;
+			}
+		});
+		//建立一个可存取到该file的url
+		var getObjectURL = function(file) {
+			var url = null ; 
+			if (window.createObjectURL!=undefined) { // basic
+				url = window.createObjectURL(file) ;
+			} else if (window.URL!=undefined) { // mozilla(firefox)
+				url = window.URL.createObjectURL(file) ;
+			} else if (window.webkitURL!=undefined) { // webkit or chrome
+				url = window.webkitURL.createObjectURL(file) ;
+			}
+			return url ;
+		};
+		
 	}]);
 	
 	/**
 	 * 新增物料
 	 */
-	app.controller('NewProdInfoCtrl', ['$scope', 'GetProductInfo', '$upload', 'ngTableParams', '$stateParams', 'toaster', '$modal', 'ComponentActive', 'KindAPI', function($scope, GetProductInfo, $upload, ngTableParams, $stateParams, toaster, $modal, ComponentActive, KindAPI) {
+	app.controller('NewProdInfoCtrl', ['$scope', 'GetProductInfo', '$upload', 'ngTableParams', '$stateParams', 'toaster', '$modal', 'ComponentActive', 'KindAPI', '$timeout', function($scope, GetProductInfo, $upload, ngTableParams, $stateParams, toaster, $modal, ComponentActive, KindAPI, $timeout) {
 
 		$scope.prodInfo = {unit: 'PCS'};
 		// 选择类目
@@ -7097,15 +7182,83 @@ app.controller('SaleSendCtrl', ['$scope', '$filter', 'SaleSend', 'ngTableParams'
 
 		//提交
 		$scope.submit = function(prodInfo){
-			GetProductInfo.addNewProd({}, prodInfo, function(data) {
-				toaster.pop("success", "提示", "提交成功");
-				//提交后跳转到详情页面,防止重复提交
-				window.location.href="#/baseInfo/prodList/"+data.id;
-			}, function(res) {
-				toaster.pop("error", "提示" + res);
+			var file = $scope.myFiles, file = file && file.length > 0 ? file[0] : null;// 可以不传附件
+			$upload.upload({
+				url: 'product/baseInfo/addNewProduct',
+				file: file,
+				method: 'POST',
+				data: {
+					prodInfo: $scope.prodInfo
+				},
+			}).success(function(data) {
+				if(data.success) {
+					toaster.pop('success', '提示', data.success);
+					$timeout(function() {
+						//提交后跳转到详情页面,防止重复提交
+						window.location.href="#/baseInfo/prodList/"+data.id;
+					}, 500);
+				}
+				if(data.error) {
+					toaster.pop('error', '提示', data.error);
+					$timeout(function() {
+						//提交后跳转到详情页面,防止重复提交
+						window.location.href="#/baseInfo/prodList/"+data.id;
+					}, 500);
+				}
+				
+			}).error(function(data) {
+				$scope.loadingShow = false;
+				toaster.pop('error', '操作失败', data.error);
 			});
+//			GetProductInfo.addNewProd({}, prodInfo, function(data) {
+//				toaster.pop("success", "提示", "提交成功");
+//				
+//				
+//			}, function(res) {
+//				toaster.pop("error", "提示" + res);
+//			});
 		};
 		
+		$scope.previewShow = false;
+		$scope.pdfShow = false;
+		$scope.noneFileShow = true;
+		$scope.$watch('myFiles', function(){
+			if($scope.myFiles) {
+				$scope.noneFileShow = false;
+				var file = $scope.myFiles[0];
+				if(file.name.indexOf('.pdf') != -1 || file.name.indexOf('.PDF') != -1) {//pdf文件
+					$scope.pdfShow = true;
+					$scope.previewShow = false;
+					$scope.imgPreviewName = file.name;
+				} else{
+					if (typeof(Worker) !== "undefined") {//支持HTML5
+						$scope.imgPreview = getObjectURL(file);
+						$scope.imgPreviewName = file.name;
+					} else{//不支持HTML5
+						$scope.imgPreview = 'static/img/all/preview-error.jpg';
+						$scope.imgPreviewName = file.name;
+					}
+					$scope.previewShow = true;
+					$scope.pdfShow = false;
+				}
+			} else {
+				$scope.noneFileShow = true;
+				$scope.previewShow = false;
+				$scope.pdfShow = false;
+			}
+		});
+		//建立一个可存取到该file的url
+		var getObjectURL = function(file) {
+			var url = null ; 
+			if (window.createObjectURL!=undefined) { // basic
+				url = window.createObjectURL(file) ;
+			} else if (window.URL!=undefined) { // mozilla(firefox)
+				url = window.URL.createObjectURL(file) ;
+			} else if (window.webkitURL!=undefined) { // webkit or chrome
+				url = window.webkitURL.createObjectURL(file) ;
+			}
+			return url ;
+		};
 		// 取消
 		$scope.cancel = function(){
 			$scope.prodInfo = angular.copy($scope.prodInfo);
@@ -7349,7 +7502,7 @@ app.controller('SaleSendCtrl', ['$scope', '$filter', 'SaleSend', 'ngTableParams'
 	/**
 	 * 新增采购单
 	 */
-	app.controller('PurcNewOrderCtrl',['$scope', '$modal', 'toaster', '$filter', 'newPurcOrder', function($scope, $modal, toaster, $filter, newPurcOrder) {
+	app.controller('PurcNewOrderCtrl',['$scope', '$modal', 'toaster', '$filter', 'addtoCart', function($scope, $modal, toaster, $filter, addtoCart) {
 		$scope.order = {
 				date : new Date(),
 				cust : {
@@ -7414,7 +7567,7 @@ app.controller('SaleSendCtrl', ['$scope', '$filter', 'SaleSend', 'ngTableParams'
 		};
 		
 		// 查找客户物料
-		$scope.dbfindCustProd = function(){
+		$scope.dbfindCustProd = function(index){
 			if($scope.order.cust.uu) {
 				var modalInstance = $modal.open({
 					templateUrl: 'static/tpl/index/purc/modal/purc_order_custProd.html',
@@ -7430,7 +7583,7 @@ app.controller('SaleSendCtrl', ['$scope', '$filter', 'SaleSend', 'ngTableParams'
 				modalInstance.result.then(function(data) {
 					$scope.order.orderItems.push(data);
 					for(var i = 0; i < $scope.order.orderItems.length; i++) {
-						if($scope.order.orderItems[i].code == null) {
+						if($scope.order.orderItems[i].code == null || i == index) {
 							$scope.order.orderItems.splice(i, 1);
 						}
 					}
@@ -7452,11 +7605,11 @@ app.controller('SaleSendCtrl', ['$scope', '$filter', 'SaleSend', 'ngTableParams'
 		};
 		
 		
-		// 保存
-		$scope.save = function(order){
+		// 添加到购物车
+		$scope.addToCart = function(order) {
 			$scope.loading = true;
 			if(!$scope.order.code) //新增,设单号
-				$scope.order.code = 'BMP' + $filter('date')(new Date(), 'yyMMddHHmmss_sss');
+				$scope.order.code = 'B2B' + $filter('date')(new Date(), 'yyMMddHHmmss_sss');
 			$scope.order.custUU = $scope.order.cust.uu;
 			$scope.order.custUserUU = $scope.order.custUser.userUU;
 			if($scope.order.date instanceof Date) {
@@ -7467,10 +7620,35 @@ app.controller('SaleSendCtrl', ['$scope', '$filter', 'SaleSend', 'ngTableParams'
 					$scope.order.orderItems[i].delivery = $scope.order.orderItems[i].delivery.getTime();
 				}
 			}
-			newPurcOrder.save({}, $scope.order, function(data){
+			addtoCart.save({}, $scope.order, function(data){
 				$scope.loading = false;
 				toaster.pop('success', '成功', '保存成功');
-				window.location.hash = '#/purc/order/'+data.id;
+				window.location.hash = '#/purc/cart/'+data.id;
+			}, function(response){
+				$scope.loading = false;
+				toaster.pop('error', '保存失败', response.data);
+			});
+		};
+		
+		// 立即购买
+		$scope.addToOrder = function(order) {
+			$scope.loading = true;
+			if(!$scope.order.code) //新增,设单号
+				$scope.order.code = 'B2B' + $filter('date')(new Date(), 'yyMMddHHmmss_sss');
+			$scope.order.custUU = $scope.order.cust.uu;
+			$scope.order.custUserUU = $scope.order.custUser.userUU;
+			if($scope.order.date instanceof Date) {
+				$scope.order.date = $scope.order.date.getTime();
+			}
+			for(var i = 0; i < $scope.order.orderItems.length; i++) {
+				if($scope.order.orderItems[i].delivery instanceof Date) {
+					$scope.order.orderItems[i].delivery = $scope.order.orderItems[i].delivery.getTime();
+				}
+			}
+			addtoCart.save({}, $scope.order, function(data){
+				$scope.loading = false;
+				toaster.pop('success', '成功', '保存成功');
+				window.location.hash = '#/purc/cart/'+data.id;
 			}, function(response){
 				$scope.loading = false;
 				toaster.pop('error', '保存失败', response.data);
@@ -7967,6 +8145,187 @@ app.controller('SaleSendCtrl', ['$scope', '$filter', 'SaleSend', 'ngTableParams'
 		});
 	}]);
 	
+	/**
+	 * 购物车
+	 */
+	app.controller('CartController', ['$scope', 'toaster', 'getCartList', 'ngTableParams', '$filter', 'BaseService', 'cartOperation', '$timeout', function($scope, toaster, getCartList, ngTableParams, $filter, BaseService, cartOperation, $timeout) {
+		$scope.active = 'all';
+		$scope.agreedText = '全部';
+		$scope.dateZoneText = '一个月内';
+		$scope.condition = {dateZone: 1};
+		$scope.currency = Symbol.currency;//将币别转化为对应的符号
+		$scope.changeAgreed = function(agreed) {
+			$scope.condition.agreed = agreed;
+			$scope.agreedText = typeof agreed == 'undefined' ? '全部' : (agreed == 1 ? '已同意' : '不同意');
+			$scope.condition.$agreedOpen = false;
+		};
+		$scope.changeDateZone = function(zone) {
+			$scope.condition.dateZone = zone;
+			$scope.dateZoneText = typeof zone == 'undefined' ? '半年前' : (zone == 1 ? '一个月内' : '半年内');
+			$scope.condition.$dateZoneOpen = false;
+			getDateCondition(zone, $scope.condition);
+			$scope.tableParams.reload();
+		};
+		$scope.setActive = function(state) {
+			if($scope.active != state) {
+				$scope.active = state;
+				if($scope.tableParams.page() == 1)
+					$scope.tableParams.reload();
+				else
+					$scope.tableParams.page(1);
+			}
+		};
+		var getService = function() {
+			return getCartList;
+		};
+		
+		$scope.tableParams = new ngTableParams({
+			page : 1, 
+			count : 5,
+			sorting: {
+            }
+		}, {
+			total : 0, 
+			counts: [5, 10, 25, 50],
+			getData : function($defer, params) {
+				$scope.loading = true;
+				var pageParams = params.url();
+				pageParams.keyword = $scope.keyword;
+				getService()[getState($scope.active)].call(null, BaseService.parseParams(pageParams), function(page) {
+					$scope.loading = false;
+					if(page) {
+						params.total(page.totalElements);
+						$defer.resolve(page.content);
+						$scope.keywordXls = angular.copy(pageParams.keyword);//保存当前取值的关键词
+					}
+				}, function(response) {
+					$scope.loading = false;
+					toaster.pop('error', '数据加载失败', response.data);
+				});
+			}
+		});
+
+		$scope.getCartTotal = function(items) {
+  			var sum = 0;
+  			angular.forEach(items, function(item){
+  				sum += item.qty * item.price;
+  			});
+  			return sum;
+  		};
+  		
+		// 搜索框回车
+		$scope.onSearch = function() {
+			$scope.tableParams.page(1);
+			$scope.tableParams.reload();
+		};
+		
+		// 提交
+		$scope.addtoOrder = function(id) {
+			cartOperation.addToOrder({id: id}, {}, function(data) {
+				if(data.success) {
+					toaster.pop('success', '提示', data.success);
+					$timeout(function() {
+						window.location.hash = '#/purc/cartdetail/'+data.id;
+					},500);
+				}
+				if(data.error) {
+					toaster.pop('error', '提示', data.error);
+				}
+			}, function(response) {
+				toaster.pop('erroer', '提示', response.data);
+			});
+		};
+		
+		// 删除一条主记录
+		$scope.deleteCart = function(id) {
+			cartOperation.deleteCart({id: id}, {}, function(data) {
+				if(data.success) {
+					toaster.pop('success', '提示', data.success);
+					$timeout(function() {
+						window.location.reload();
+					},500);
+				}
+				if(data.error) {
+					toaster.pop('error', '提示', data.error);
+				}
+			}, function(response) {
+				toaster.pop('erroer', '提示', response.data);
+			});
+		};
+		
+		// 删除一条明细
+		$scope.deleteDetail = function(id) {
+			cartOperation.deleteCartDetail({id: id}, {}, function(data) {
+				if(data.success) {
+					toaster.pop('success', '提示', data.success);
+					$timeout(function() {
+						window.location.reload();
+					},500);
+				}
+				if(data.error) {
+					toaster.pop('error', '提示', data.error);
+				}
+			}, function(response) {
+				toaster.pop('erroer', '提示', response.data);
+			});
+		};
+		
+		// 清空购物车
+		$scope.clearCart = function() {
+			cartOperation.deleteCarts({}, function(data) {
+				if(data.success) {
+					toaster.pop('success', '提示', data.success);
+					$timeout(function() {
+						window.location.reload();
+					},500);
+				}
+				if(data.error) {
+					toaster.pop('error', '提示', data.error);
+				}
+			}, function(response) {
+				toaster.pop('erroer', '提示', response.data);
+			});
+		}
+	}]);
+	
+	/**
+	 * 购物车详情
+	 */
+	app.controller('CartDetailController', ['$scope', 'cartOperation', '$stateParams', 'toaster', '$timeout', function($scope, cartOperation, $stateParams, toaster, $timeout) {
+		var loadData = function() {
+			cartOperation.getCartDetail({id: $stateParams.id}, function(data) {
+				if(data.code) {
+					$scope.cart = data;
+					var sum = 0;
+					angular.forEach($scope.cart.cartDetails, function(item) {
+						sum += item.qty * item.price;
+					});
+					$scope.cart.total = sum;
+					$scope.loading = false;
+				} else {
+					window.location.hash = '#/purc/cart';
+				}
+			});
+		};
+		loadData();
+		
+		// 删除一条明细
+		$scope.deleteDetail = function(id) {
+			cartOperation.deleteCartDetail({id: id}, {}, function(data) {
+				if(data.success) {
+					toaster.pop('success', '提示', data.success);
+					$timeout(function() {
+						window.location.reload();
+					},500);
+				}
+				if(data.error) {
+					toaster.pop('error', '提示', data.error);
+				}
+			}, function(response) {
+				toaster.pop('erroer', '提示', response.data);
+			});
+		};
+	}]);
 	
 	return app;
 });

+ 17 - 3
src/main/webapp/resources/js/index/services/BaseInfo.js

@@ -46,12 +46,16 @@ define(['ngResource'], function() {
 				}
 			},
 			businessGroups: {
-				url: "v/enterbusinessGroups",
+				url: "product/baseInfo/enterbusinessGroups",
 				method : 'GET',
 				headers: {
 					'Content-Type' : 'application/text;charset=UTF-8'
 				}
 			},
+			getAttach: {
+				url: "product/baseInfo/getAttach/:id",
+				method: 'GET',
+			}
 		})
 	}]).factory('ComponentActive', ['$resource', function($resource) {
 		//获取ComponentActive的分页数据
@@ -298,8 +302,8 @@ define(['ngResource'], function() {
 				}
 			},
 		})
-	}]).factory('newPurcOrder', ['$resource', function($resource) {
-		return $resource('product/baseInfo/newPurcOrder', {}, {
+	}]).factory('addtoCart', ['$resource', function($resource) {
+		return $resource('product/baseInfo/addtoCart', {}, {
 			save: {
 				method: 'POST',
 				isArray: false,
@@ -314,5 +318,15 @@ define(['ngResource'], function() {
 				url: "B2BtoAccountUrlController/account/manageUrl.action",
 			}
 		})
+	}]).factory('newPurcOrder', ['$resource', function($resource) {
+		return $resource('product/baseInfo/newPurcOrder', {}, {
+			save: {
+				method: 'POST',
+				isArray: false,
+				headers: {
+					'Content-Type' : 'application/text;charset=UTF-8'
+				}
+			},
+		})
 	}]);
 });

+ 32 - 0
src/main/webapp/resources/js/index/services/Cart.js

@@ -0,0 +1,32 @@
+define(['ngResource'], function() {
+	angular.module('CartServices', [ 'ngResource']).factory('cartOperation', ['$resource', function($resource) {
+		return $resource('cart', {}, {
+			addToOrder: {
+				url: 'cart/addToOrder/:id',
+				method: 'GET'
+			},
+			deleteCart: {
+				url: 'cart/deleteCart/:id',
+				method: 'DELETE'
+			},
+			deleteCartDetail: {
+				url: 'cart/deleteCartDetail/:id',
+				method: 'DELETE'
+			},
+			deleteCarts: {
+				url: 'cart/deleteCarts',
+				method: 'DELETE'
+			},
+			getCartDetail: {
+				url: 'cart/getCartDetail/:id',
+				method: 'GET'
+			}
+		})
+	}]).factory('getCartList', ['$resource', function($resource) {
+		return $resource('cart/getCartList', {}, {
+			getAll: {
+				isArray: false
+			}
+		})
+	}]);
+})

+ 28 - 4
src/main/webapp/resources/tpl/index/baseInfo/newProdInfo.html

@@ -133,7 +133,7 @@
 				</div>
 			</div>
 			<div class="form-group form-group-sm has-feedback">
-				<label for="customer" class="col-sm-2 control-label"><span class="text-inverse text-bold">* </span>物料名称</label>
+				<label for="name" class="col-sm-2 control-label"><span class="text-inverse text-bold">* </span>物料名称</label>
 				<div class="col-sm-4">
 					<div class="">
 						<input ng-model="prodInfo.title" type="text" class="form-control" id="customer" 
@@ -143,7 +143,7 @@
 				</div>
 			</div>
 			<div class="form-group form-group-sm has-feedback">
-				<label for="customerUser" class="col-sm-2 control-label"><span class="text-inverse text-bold">* </span>物料编号</label>
+				<label for="code" class="col-sm-2 control-label"><span class="text-inverse text-bold">* </span>物料编号</label>
 				<div class="col-sm-4">
 					<div class="">
 						<input ng-model="prodInfo.code" type="text" class="form-control input-dbfind" id="custUser" 
@@ -153,7 +153,7 @@
 				</div>
 			</div>
 			<div class="form-group form-group-sm has-feedback">
-				<label for="product" class="col-sm-2 control-label"><span class="text-inverse text-bold">* </span>物料规格</label>
+				<label for="spec" class="col-sm-2 control-label"><span class="text-inverse text-bold">* </span>物料规格</label>
 				<div class="col-sm-4">
 					<div class="productSpec">
 						<textarea ng-model="prodInfo.spec" type="text"  id="product"  class="input-dbfind"
@@ -163,7 +163,7 @@
 				</div>
 			</div>
 			<div class="form-group form-group-sm has-feedback">
-				<label for="customerUser" class="col-sm-2 control-label">单位</label>
+				<label for="unit" class="col-sm-2 control-label">单位</label>
 				<div class="col-sm-4">
 					<div class="">
 						<input ng-model="prodInfo.unit" type="text" class="form-control input-dbfind" id="custUser" 
@@ -171,6 +171,30 @@
 					</div>
 				</div>
 			</div>
+			<div class="form-group form-group-sm has-feedback">
+				<label for="file" class="col-sm-2 control-label">附件</label>
+				<div class="col-sm-4">
+					<div class="">
+						<input ng-file-select accept="image/*,application/pdf,*.pdf" ng-model="myFiles" type="file" 
+			      		ng-multiple="false" class="form-control" id="enImage" name="enImage" placeholder="图片或PDF文件">
+				      	<div class="well margin-b-0" >
+				      		<div ng-show="previewShow">
+				      			<img ng-show="previewShow" alt="营业执照复印件" src="{{imgPreview}}" width="200px" height="100px">
+				      			<div>
+					      			&nbsp;&nbsp;<span class="text-primary"><b>{{imgPreviewName}}</b></span>
+					      		</div>
+				      		</div>
+				      		<div ng-show="pdfShow">
+				      			<img ng-show="pdfShow" src="static/img/all/pdf.jpg" alt="PDF文件" width="30px" height="40px">
+					      		&nbsp;&nbsp;<span class="text-primary"><b>{{imgPreviewName}}</b></span>
+				      		</div>
+				      		<div ng-show="noneFileShow">
+				      			<span class="text-warning">请上传清晰照片的图片文件或PDF文件</span>
+				      		</div>
+				      	</div>
+					</div>
+				</div>
+			</div>
 		</div>
 	</form>
 	<div class="form-group form-group-sm">

+ 101 - 4
src/main/webapp/resources/tpl/index/baseInfo/productDetail.html

@@ -76,6 +76,61 @@
 	width: 276.656px;
 	height: auto;
 }
+
+#image-box .x-floating-wrap {
+	position: fixed;
+	z-index: 99998;
+	background: #000;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	opacity: 0.5;
+}
+#image-box .x-floating {
+	position: fixed;
+	z-index: 99999;
+	top: 60px;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	text-align: center;
+	vertical-align: middle;
+}
+#image-box .x-floating img {
+	margin: auto auto;
+	max-width: 100%;
+	max-height: 80%;
+	-webkit-user-select: none;
+	-moz-user-select: none;
+	-ms-user-select: none;
+	user-select: none
+}
+
+#image-box .x-close-wrap {
+	position: fixed;
+	top: 0;
+	right: 0;
+	z-index: 100000;
+	width: 120px;
+  	height: 120px;
+	margin: -60px -60px 0 0;
+	border-radius: 100%;
+	background: #000;
+	opacity: .3
+}
+
+#image-box .x-close-wrap a {
+	position: absolute;
+	left: 25px;
+	bottom: 25px;
+	font-size: 42px;
+	color: #fff
+}
+
+#image-box .x-close-wrap:hover {
+	opacity: .7
+}
 </style>
 <div class="loading" ng-class="{'in': loading}">
 	<i></i>
@@ -112,7 +167,6 @@
 				<div class="">
 					<input ng-model="prodInfo.cmpCode" type="text" class="form-control input-dbfind" id="custUser" 
 						placeholder="原厂型号" readonly="readonly" style="cursor: pointer;">
-					<span class="form-control-feedback text-simple"><i class="fa fa-search"></i></span>
 				</div>
 			</div>
 		</div>
@@ -122,7 +176,6 @@
 				<div class="">
 					<input ng-model="prodInfo.cmpUuId" type="text" class="form-control input-dbfind" id="custUser" 
 						placeholder="标准料号" readonly="readonly" style="cursor: pointer;">
-					<span class="form-control-feedback text-simple"><i class="fa fa-search"></i></span>
 				</div>
 			</div>
 		</div>
@@ -132,7 +185,6 @@
 				<div class="">
 					<input ng-model="prodInfo.title" ng-readonly="!prodInfo.$editing" type="text" class="form-control" id="customer" 
 						placeholder="物料名称" style="cursor: pointer;" ng-click="dbfindCustProd()" ng-required="true">
-					<span class="form-control-feedback text-simple"><i class="fa fa-search"></i></span>
 				</div>
 			</div>
 		</div>
@@ -142,7 +194,6 @@
 				<div class="">
 					<input ng-model="prodInfo.code" type="text" class="form-control input-dbfind" id="custUser" 
 						placeholder="物料编号" ng-readonly="!prodInfo.$editing" style="cursor: pointer;">
-					<span class="form-control-feedback text-simple"><i class="fa fa-search"></i></span>
 				</div>
 			</div>
 		</div>
@@ -164,6 +215,43 @@
 				</div>
 			</div>
 		</div>
+	<!-- 	<div class="form-group form-group-sm has-feedback">
+			<label for="customerUser" class="col-sm-2 control-label">应用类型</label>
+			<div class="col-sm-4">
+				<div class="">
+					<input ng-model="prodInfo.sourceApp" type="text" class="form-control input-dbfind" id="custUser" 
+						placeholder="应用" ng-readonly="!prodInfo.$editing" style="cursor: pointer;">
+				</div>
+			</div>
+		</div> -->
+		<div class="form-group form-group-sm has-feedback">
+			<label for="file" class="col-sm-2 control-label">附件</label>
+			<div class="col-sm-4">
+				<div class="">
+					<div ng-if="prodInfo.attach">
+						<!-- <a href="file/{{prodInfo.attach.id}}" class="file" target="_blank">{{prodInfo.attach.name}}</a> -->
+						<a ng-click="showImg()">{{prodInfo.attach.name}}</a>
+					</div>
+					<input ng-file-select accept="image/*,application/pdf,*.pdf" ng-model="myFiles" type="file" 
+		      		ng-multiple="false" class="form-control" id="enImage" name="enImage" placeholder="图片或PDF文件" ng-disabled="!prodInfo.$editing">
+			      	<div class="well margin-b-0" >
+			      		<div ng-show="previewShow">
+			      			<img ng-show="previewShow" alt="营业执照复印件" src="{{imgPreview}}" width="200px" height="100px">
+			      			<div>
+				      			&nbsp;&nbsp;<span class="text-primary"><b>{{imgPreviewName}}</b></span>
+				      		</div>
+			      		</div>
+			      		<div ng-show="pdfShow">
+			      			<img ng-show="pdfShow" src="static/img/all/pdf.jpg" alt="PDF文件" width="30px" height="40px">
+				      		&nbsp;&nbsp;<span class="text-primary"><b>{{imgPreviewName}}</b></span>
+			      		</div>
+			      		<div ng-show="noneFileShow">
+			      			<span class="text-warning">请上传清晰照片的图片文件或PDF文件</span>
+			      		</div>
+			      	</div>
+				</div>
+			</div>
+		</div>
 		</div>
 		<div class="form-group form-group-sm">
 			<div class="col-sm-2"></div>
@@ -180,5 +268,14 @@
 				<button class="btn btn-success btn-sm" style="width: 100%;" ng-click="submit(prodInfo)">提交</button>
 			</div>
 		</div>
+		<div id="image-box" style="display: none">
+			<div class="x-close-wrap" title="关闭">
+				<a href="javascript:void(0);">&times;</a>
+			</div>
+			<div class="x-floating-wrap"></div>
+			<div class="x-floating">
+				<img />
+			</div>
+		</div>
 	</form>
 </div>

+ 9 - 4
src/main/webapp/resources/tpl/index/purc/addOrder.html

@@ -78,7 +78,7 @@
 								<div class="">
 									<input ng-model="item.code" type="text" class="form-control input-dbfind" id="product" 
 										placeholder="点击选择物料" readonly="readonly" style="cursor: pointer;"
-										ng-click="dbfindCustProd()" ng-required="true">
+										ng-click="dbfindCustProd($index)" ng-required="true">
 									<span class="form-control-feedback text-simple"><i class="fa fa-search"></i></span>
 								</div>
 							</div>
@@ -165,14 +165,19 @@
 					<div class="col-sm-2">
 						<button class="btn btn-primary btn-sm" style="width: 100%;" ng-click="addProduct()">增加</button>
 					</div>
-					<div class="col-sm-2"><button class="btn btn-warning btn-sm" style="width: 100%;" ng-click="deleteProduct($index)" ng-if="!$first">删除</button></div>
+					<div class="col-sm-2">
+						<button class="btn btn-warning btn-sm" style="width: 100%;" ng-click="deleteProduct($index)" ng-if="!$first">删除</button>
+					</div>
 				</div>
 				</div>
 			</div>
 				<div class="form-group form-group-sm">
 					<div class="col-sm-2"></div>
-					<div class="col-sm-3">
-						<button class="btn btn-success btn-sm" style="width: 100%;" ng-click="save(order)" ng-disabled="orderForm.$invalid">提交</button>
+					<div class="col-sm-2">
+						<button class="btn btn-success btn-sm" style="width: 100%;" ng-click="addToCart(order)" ng-disabled="orderForm.$invalid">添加到购物车</button>
+					</div>
+					<div class="col-sm-2">
+						<button class="btn btn-success btn-sm" style="width: 100%;" ng-click="addToOrder(order)" ng-disabled="orderForm.$invalid">立即购买</button>
 					</div>
 				</div>
 			</form>

+ 225 - 0
src/main/webapp/resources/tpl/index/purc/cart.html

@@ -0,0 +1,225 @@
+<style>
+.condition .more.open {
+	margin-top: 10px;
+	height: 36px;
+	opacity: 1;
+}
+
+.condition .more .form-group {
+	margin-bottom: 10px;
+}
+
+.cart-table .header>th {
+	height: 38px;
+	text-align: center;
+	background: #f5f5f5;
+	bcart-top: 1px solid #e8e8e8;
+	bcart-bottom: 1px solid #e8e8e8;
+}
+
+.cart-table .sep-row {
+	height: 10px;
+}
+
+.cart-table .selector {
+	vertical-align: middle;
+	margin: 0 0 2px 0;
+}
+
+.toolbar label {
+	margin-right: 10px;
+	margin-bottom: 0;
+}
+
+.toolbar .select_all {
+	margin: 0 6px 0 10px;
+	line-height: 20px;
+}
+
+.toolbar .btn {
+	-moz-bcart-radius: 2px;
+	margin-right: 5px;
+	bcart: 1px solid #dcdcdc;
+	bcart-radius: 2px;
+	-webkit-bcart-radius: 2px;
+}
+
+.cart-table .cart-hd {
+	background: #f5f5f5;
+	height: 40px;
+	line-height: 40px;
+}
+
+.cart-table .cart-hd td.first {
+	padding-left: 20px;
+}
+
+.cart-table .cart-hd .cart-main span {
+	margin-right: 8px;
+}
+
+.cart-table .cart-hd .cart-code {
+	font-style: normal;
+	font-family: verdana;
+}
+
+.cart-table .cart-hd .cart-sum {
+	padding: 0 5px;
+}
+
+.cart-table>tbody {
+	bcart: 1px solid transparent;
+}
+
+.cart-table>tbody:hover {
+	bcart-color: #56a022;
+	bcart-width: 2px;
+}
+
+.cart-table .operates {
+	display: none;
+}
+
+.cart-table .operates i {
+	padding: 0 2px;
+}
+
+.cart-table>tbody:hover .operates {
+	display: block;
+}
+.cart-table>tbody:hover .operates-status {
+	display: none;
+}
+
+
+.cart-table .cart-bd {
+	bcart-bottom: 1px solid #e6e6e6;
+}
+
+.cart-table .cart-bd>td {
+	padding: 10px 5px;
+	vertical-align: top;
+	position: relative;
+}
+
+.cart-table .cart-bd .product {
+	padding-left: 20px;
+}
+
+.cart-table .cart-bd .cart-number {
+	position: absolute;
+	top: -1px;
+	left: -1px;
+	width: 20px;
+	height: 20px;
+	line-height: 20px;
+	text-align: center;
+	background: #f5f5f5;
+	font-weight: 500;
+	bcart: solid 1px #d5d5d5;
+	bcart-radius: 0 0 10px 0;
+}
+
+.cart-table .cart-bd .cart-number.key {
+	background: #56a022;
+	color: #ffffff;
+}
+
+.unPrinted {
+	color: #56a022;
+}
+
+.info-container .info:hover {
+	color: #CC3333;
+}
+
+#cart-title {
+	font-size: 16px;
+}
+</style>
+<div class="block">
+<div class="loading in" ng-class="{'in': loading}">
+	<i></i>
+</div>
+<div class="condition block">
+	<div class="row" id="cart-title">
+		<div class="col-xs-6">
+			<a class="label label-info label-2x">购物车<i class="fa fa-shopping-cart fa-lg"></i> <span ng-bind="tableParams.total()" class="text-num"></span></a>&nbsp;
+			<a ng-click="clearCart()" class="label label-danger label-lg" ng-if="tableParams.total() != 0">清空<i class="fa fa-trash fa-lg"></i></a>
+		</div>
+	</div>
+</div>
+<table class="cart-table block" ng-table="tableParams">
+	<thead>
+		<tr class="header">
+			<th>商品</th>
+			<th width="80">单价</th>
+			<th width="100">数量</th>
+			<th width="120">交货日期</th>
+			<th width="180">备注</th>
+			<th width="120">操作</th>
+		</tr>
+		<tr class="sep-row">
+			<td colspan="5"></td>
+		</tr>
+	</thead>
+	<tbody ng-if="tableParams.total() == 0">
+		<tr>
+			<td class="text-center" colspan="7">
+				<br>
+				<div class="text-muted"><h3><i class="fa fa-spinner"></i> 购物车空空如也</h3></div>
+				<br>
+				<div>
+					<a href="#/purc/addOrder">立即添加商品</a>
+				</div>
+			</td>
+		</tr>
+	</tbody>
+	<tbody ng-repeat="cart in $data track by cart.id">
+		<tr class="cart-hd" ng-dblclick="cart.$collapsed=!cart.$collapsed" ng-class="{'text-bold': cart.display>0}">
+			<td class="first">供应商:<a class="text-bold" ng-bind="::cart.receiveName" href="#/purc/cart/{{cart.id}}"></a></td>
+			<td colspan="3">录单人:<span class="text-bold" ng-bind="::cart.recorder"></span>(<span class="text-num text-bold"
+					ng-bind="::cart.date | date:'yyyy-MM-dd'"></span> )</td>
+			<td colspan="1" class="cart-sum">{{::cart.currency}}: <span
+				ng-bind="getCartTotal(cart.cartDetails) | number : 2"
+				class="text-num text-bold"></span>
+			</td>
+			<td colspan="2" class="text-center">
+				<a class="label label-success" ng-click="addtoOrder(cart.id)">提交</a>
+				<a class="label label-danger" ng-click="deleteCart(cart.id)">删除</a>
+			</td>
+		</tr>
+		<tr class="cart-bd" ng-repeat="detail in cart.cartDetails track by detail.id"
+			ng-if="!cart.$collapsed "><!-- && (!searchFilterXls.keyword || detail.key || cart.$showAll) -->
+			<td class="product">
+				<div class="text-num cart-number" ng-class="{'key': detail.key&&cart.$showAll}" title="第{{::detail.number}}行">{{::detail.number}}</div>
+				<div class="text-num text-bold">
+					<span ng-bind="::detail.product.code"></span>
+				</div>
+				<div>
+					<span ng-bind="::detail.product.title"></span>
+				</div>
+				<div class="text-muted"
+					ng-bind="::detail.product.spec"></div>
+			</td>
+			<td class="text-center">
+				<div class="text-num" ng-bind="::detail.price | number:6"></div>
+				<div class="text-muted">税率:{{::detail.taxrate || 0}}%</div>
+			</td>
+			<td class="text-center">
+				<div class="text-num" ng-bind="::detail.qty"></div>
+				<div class="text-muted" ng-bind="::detail.product.unit"></div>
+			</td>
+			<td class="text-center br-l">
+				<div class="text-num" ng-bind="::detail.delivery | date:'yyyy-MM-dd'"></div>
+			</td>
+			<td class="text-center">
+				<div class="text-num" ng-bind="::detail.remark"></div>
+			</td>
+			<td class="text-center">
+				<a class="label label-lg label-danger" ng-click="deleteDetail(detail.id)">删除</a>
+			</td>
+		</tr>
+	</tbody>
+</table>
+</div>

+ 109 - 0
src/main/webapp/resources/tpl/index/purc/cart_detail.html

@@ -0,0 +1,109 @@
+<div class="loading" ng-class="{'in': loading}">
+	<i></i>
+</div>
+<div class="pane base-info">
+	<div class="pane-header f16">
+		购物车<!-- <a ng-click="print(cart)" class="pull-right text-simple"><i
+			class="fa fa-print fa-fw"></i>打印</a> -->
+	</div>
+	<div class="pane-body">
+		<div class="headerline">
+			<span class="index">1</span> <span class="content">购物车信息</span>
+		</div>
+		<div class="row row-sm item">
+			<div class="col-xs-3">
+				<span class="title">供应商</span>
+				<div class="content" ng-bind="::cart.receiveName"></div>
+			</div>
+			<div class="col-xs-3">
+				<span class="title">日期</span>
+				<div class="content" ng-bind="::cart.date | date:'yyyy-MM-dd'"></div>
+			</div>
+			<div class="col-xs-3">
+				<span class="title">录单人</span>
+				<div class="content" ng-bind="::cart.recorder"></div>
+			</div>
+		</div>
+		<div class="row row-sm item">
+			<div class="col-xs-3">
+				<span class="title">币别</span>
+				<div class="content" ng-bind="::cart.currency"></div>
+			</div>
+			<div class="col-xs-3">
+				<span class="title">金额</span>
+				<div class="content" ng-bind="::cart.total"></div>
+			</div>
+			<div class="col-xs-3">
+				<span class="title">汇率</span>
+				<div class="content" ng-bind="::cart.rate"></div>
+			</div>
+		</div>
+		<div class="row row-sm item">
+			<div class="col-xs-9">
+				<span class="title">交货地址</span>
+				<div class="content" ng-bind="::cart.enterprise.enAddress"></div>
+			</div>
+		</div>
+		<div class="headerline">
+			<span class="index">2</span> <span class="content">商品清单</span>
+		</div>
+		<div class="block">
+			<table class="block table table-default table-striped table-hover">
+				<thead>
+					<tr class="header">
+						<th width="50" class="br-r">行号</th>
+						<th>商品</th>
+						<th width="80">单价</th>
+						<th width="100">数量</th>
+						<th width="120">交货日期</th>
+						<th width="180">备注</th>
+						<th width="100">操作</th>
+					</tr>
+				</thead>
+				<tbody>
+					<tr ng-repeat="item in cart.cartDetails track by item.id">
+						<td class="text-center text-num text-bold f-16 text-success br-r">
+							<span ng-bind="::item.number"></span>
+						</td>
+						<td>
+							<div class="text-num text-bold">
+								<span ng-bind="::item.product.code"></span>
+							</div>
+							<div>
+								<span ng-bind="::item.product.title"></span>
+							</div>
+							<div class="text-muted" ng-bind="::item.product.spec"></div>
+							<div class="text-muted text-bold" ng-if="item.vendspec"><span ng-bind="::item.vendspec"></span></div>
+							<div class="text-bold text-inverse" ng-if="item.factory">送货工厂:<span ng-bind="::item.factory"></span></div>
+						</td>
+						<td class="text-center">
+							<div class="text-num" ng-bind="::item.price | number:6"></div>
+							<div class="text-muted">税率:{{::item.taxrate || 0}}%</div>
+						</td>
+						<td class="text-center">
+							<div class="text-num" ng-bind="::item.qty"></div>
+							<div class="text-muted" ng-bind="::item.product.unit"></div>
+							<div style="margin: 0 auto" ng-if="item.$editing">
+								<input type="text" ng-model="item.reply.qty" min="0" max="{{item.qty}}"
+									ng-init="item.reply.qty=item.qty-item.replyQty"
+									class="form-control input-xs" placeholder="0~{{item.qty-item.replyQty}}">
+							</div>
+						</td>
+						<td class="text-center">
+							<div class="text-num"
+								ng-bind="::item.delivery | date:'yyyy-MM-dd'">
+							</div>
+						</td>
+						<td>
+							<div ng-bind="::item.remark">
+							</div>
+						</td>
+						<td class="text-center">
+							<a class="btn btn-sm btn-danger" ng-click="deleteDetail(item.id)">删除</a>
+						</td>
+					</tr>
+				</tbody>
+			</table>
+		</div>
+	</div>
+</div>

+ 3 - 0
src/main/webapp/resources/tpl/index/purc/left.html

@@ -22,6 +22,9 @@
 	<ul class="list-unstyled">
 		<li ui-sref-active="active"><a ui-sref="purc.newOrder">新增采购订单</a></li>
 	</ul>
+	<ul class="list-unstyled">
+		<li ui-sref-active="active"><a ui-sref="purc.cart">购物车</a></li>
+	</ul>
 </div>
 <div class="left-nav">
 	<ul class="list-unstyled">

+ 6 - 0
src/main/webapp/resources/tpl/index/purc/right.html

@@ -181,6 +181,12 @@
 				ng-bind="todo.purcTodo"></span>
 			</a>
 		</div>
+		<div class="item-wrap">
+			<a class="item-inner" ui-sref="purc.cart"> <span
+				class="inner-text">购物车</span> <span class="badge"
+				ng-bind="todo.cartTodo"></span>
+			</a>
+		</div>
 		<!-- <div class="item-wrap">
 			<a class="item-inner" ui-sref="sale.change"> <span
 				class="inner-text">变更中</span> <span class="badge"