Parcourir la source

Merge branch 'dev' of ssh://10.10.101.21/source/platform-b2b into feature-hejq-product-201808

hejq il y a 7 ans
Parent
commit
7273745e7c

+ 20 - 0
src/main/java/com/uas/platform/b2b/dao/PurcOrderInfoItemDao.java

@@ -2,12 +2,32 @@ package com.uas.platform.b2b.dao;
 
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
 import com.uas.platform.b2b.model.PurcOrderInfoItem;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
 
 @Repository
 public interface PurcOrderInfoItemDao
 		extends JpaRepository<PurcOrderInfoItem, Long>, JpaSpecificationExecutor<PurcOrderInfoItem> {
 
+	/**
+	 * 根据采购客户uu和可发货下载状态查找
+	 * @return
+	 */
+	@Query("from PurcOrderInfoItem p where p.acceptCustuu = :acceptCustuu and p.issuedStatus = :issuedStatus")
+	List<PurcOrderInfoItem> findByAcceptCustuuAndIssuedStatus(@Param("acceptCustuu") long acceptCustuu,@Param("issuedStatus") short issuedStatus);
+
+	/**
+	 * 更新状态
+	 */
+	@Modifying
+	@Transactional
+	@Query("update PurcOrderInfoItem set issuedStatus = 203 where custPurchaseCode = :custPurchaseCode and custPurchaseDetno = :custPurchaseDetno and acceptCustuu = :acceptCustuu")
+	void updateIssuedStatus(@Param("custPurchaseCode") String custPurchaseCode,@Param("custPurchaseDetno") short custPurchaseDetno,@Param("acceptCustuu") long acceptCustuu);
 }

+ 10 - 0
src/main/java/com/uas/platform/b2b/dao/PurchaseOrderItemDao.java

@@ -100,4 +100,14 @@ public interface PurchaseOrderItemDao extends JpaSpecificationExecutor<PurchaseO
 	 */
     @Procedure(procedureName = "purc$reply_batch")
     public void replyByBatch(String idString, String username, String userip, Long enuu, Long useruu, Long batch_delivery);
+
+	/**
+	 * 根据客户采购订单号和序号查找明细(代采)
+	 * @param vendUU 终端供应商uu
+	 * @param custPurchaseCode 客户采购订单号
+	 * @param custPurchaseDetno 客户采购订单序号
+	 * @return
+	 */
+    @Query("from PurchaseOrderItem p where p.order.vendUU = :vendUU and p.custPurchaseCode = :custPurchaseCode and p.custPurchaseDetno = :custPurchaseDetno")
+    List<PurchaseOrderItem> findByCustpurchasecodeAndCustpurchasedetno(@Param("vendUU") Long vendUU,@Param("custPurchaseCode") String custPurchaseCode,@Param("custPurchaseDetno") Short custPurchaseDetno);
 }

+ 25 - 4
src/main/java/com/uas/platform/b2b/erp/controller/PurchaseController.java

@@ -10,10 +10,7 @@ import com.uas.platform.core.logging.BufferedLoggerManager;
 import com.uas.platform.core.util.serializer.FlexJsonUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.*;
 
 import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
@@ -71,6 +68,30 @@ public class PurchaseController {
         return replies;
     }
 
+	/**
+	 * 买家ERP获取代采订单的可发货状态
+	 * @return
+	 */
+	@RequestMapping(value = "/issued",method = RequestMethod.GET)
+	@ResponseBody
+    public List<PurchaseDetail> getIssued() {
+		List<PurchaseDetail> issued = purchaseService.convertIssued(purchaseOrderService.findNotUploadIssued());
+		logger.log("代采订单","更新erp可发货状态",issued.size());
+		return issued;
+	}
+
+	/**
+	 * 回执
+	 * @return
+	 */
+	@RequestMapping(value = "/issued/back",method = RequestMethod.POST)
+	@ResponseBody
+	public void onIssuedSuccess(@RequestParam("data") String data) throws UnsupportedEncodingException {
+		String jsonStr = URLDecoder.decode(data, "UTF-8");
+		List<PurchaseDetail> details = FlexJsonUtils.fromJsonArray(jsonStr, PurchaseDetail.class);
+		purchaseOrderService.onIssuedSucess(details);
+	}
+
 	/**
 	 * 买家ERP主动回复的记录上传到平台 <br>
 	 * 买卖双方直接电话沟通之后,结果由买家填写到ERP系统的情况

+ 9 - 2
src/main/java/com/uas/platform/b2b/erp/model/AcceptNotifyDetail.java

@@ -5,6 +5,7 @@ import com.uas.platform.b2b.model.PurchaseOrder;
 import com.uas.platform.b2b.model.PurchaseOrderItem;
 import com.uas.platform.b2b.model.SaleSendItem;
 import com.uas.platform.b2b.support.SystemSession;
+import org.springframework.util.StringUtils;
 
 /**
  * 收料通知单明细
@@ -88,8 +89,14 @@ public class AcceptNotifyDetail {
 		this.and_detno = item.getNumber();
 		this.and_inqty = item.getQty();
 		this.and_pnid = item.getNotice().getSourceId();
-		this.and_ordercode = item.getNotice().getOrderItem().getOrder().getCode();
-		this.and_orderdetno = item.getNotice().getOrderItem().getNumber();
+		PurchaseOrderItem orderItem = item.getNotice().getOrderItem();
+		if (!StringUtils.isEmpty(orderItem.getCustPurchaseCode())) {
+			this.and_ordercode = orderItem.getCustPurchaseCode();
+			this.and_orderdetno = orderItem.getCustPurchaseDetno();
+		} else {
+			this.and_ordercode = orderItem.getOrder().getCode();
+			this.and_orderdetno = orderItem.getNumber();
+		}
 		this.and_price = item.getPrice();
 		this.and_remark = item.getRemark();
 	}

+ 107 - 1
src/main/java/com/uas/platform/b2b/erp/model/PurchaseDetail.java

@@ -1,10 +1,12 @@
 package com.uas.platform.b2b.erp.model;
 
+import com.uas.platform.b2b.core.util.StringUtil;
 import com.uas.platform.b2b.model.Product;
 import com.uas.platform.b2b.model.PurcOrderInfoItem;
 import com.uas.platform.b2b.support.SystemSession;
 import com.uas.platform.core.model.Status;
 import org.apache.commons.collections.CollectionUtils;
+import org.springframework.util.StringUtils;
 
 import java.util.Date;
 import java.util.HashSet;
@@ -30,6 +32,22 @@ public class PurchaseDetail {
 	private String pd_factory;
 	private String pd_vendspec;
 	private Integer pd_beipin;
+	//终端供应商名称
+	private String pd_purcvendname;
+	//终端供应商uu
+	private Long pd_purcvenduu;
+	//客户采购订单号
+	private String pd_custpurchasecode;
+	//客户采购订单序号
+	private Short pd_custpurchasedetno;
+	//收货客户
+	private String pd_acceptcustname;
+	//收货地址
+	private String pd_acceptcustaddress;
+	//收货客户uu
+	private Long pd_acceptcustuu;
+	//是否能发货
+	private String pd_hasissued;
 	private List<Attach> attaches;
 
 	public String getPd_vendspec() {
@@ -128,7 +146,71 @@ public class PurchaseDetail {
         this.attaches = attaches;
     }
 
-    /**
+	public String getPd_purcvendname() {
+		return pd_purcvendname;
+	}
+
+	public void setPd_purcvendname(String pd_purcvendname) {
+		this.pd_purcvendname = pd_purcvendname;
+	}
+
+	public Long getPd_purcvenduu() {
+		return pd_purcvenduu;
+	}
+
+	public void setPd_purcvenduu(Long pd_purcvenduu) {
+		this.pd_purcvenduu = pd_purcvenduu;
+	}
+
+	public String getPd_custpurchasecode() {
+		return pd_custpurchasecode;
+	}
+
+	public void setPd_custpurchasecode(String pd_custpurchasecode) {
+		this.pd_custpurchasecode = pd_custpurchasecode;
+	}
+
+	public Short getPd_custpurchasedetno() {
+		return pd_custpurchasedetno;
+	}
+
+	public void setPd_custpurchasedetno(Short pd_custpurchasedetno) {
+		this.pd_custpurchasedetno = pd_custpurchasedetno;
+	}
+
+	public String getPd_acceptcustname() {
+		return pd_acceptcustname;
+	}
+
+	public void setPd_acceptcustname(String pd_acceptcustname) {
+		this.pd_acceptcustname = pd_acceptcustname;
+	}
+
+	public String getPd_acceptcustaddress() {
+		return pd_acceptcustaddress;
+	}
+
+	public void setPd_acceptcustaddress(String pd_acceptcustaddress) {
+		this.pd_acceptcustaddress = pd_acceptcustaddress;
+	}
+
+	public Long getPd_acceptcustuu() {
+		return pd_acceptcustuu;
+	}
+
+	public void setPd_acceptcustuu(Long pd_acceptcustuu) {
+		this.pd_acceptcustuu = pd_acceptcustuu;
+	}
+
+	public String getPd_hasissued() {
+		return pd_hasissued;
+	}
+
+	public void setPd_hasissued(String pd_hasissued) {
+		this.pd_hasissued = pd_hasissued;
+	}
+
+	/**
 	 * 转为平台的采购订单明细
 	 * 
 	 * @return
@@ -146,6 +228,17 @@ public class PurchaseDetail {
 		item.setStatus((short) Status.NOT_REPLY.value());
 		item.setProductCode(this.pd_prodcode);
 		item.setBeipin(this.pd_beipin);
+		item.setPurcVendName(this.pd_purcvendname);
+		item.setPurcVenduu(this.pd_purcvenduu);
+		item.setCustPurchaseCode(this.pd_custpurchasecode);
+		item.setCustPurchaseDetno(this.pd_custpurchasedetno);
+		item.setAcceptCustName(this.pd_acceptcustname);
+		item.setAcceptCustAddress(this.pd_acceptcustaddress);
+		item.setAcceptCustuu(this.pd_acceptcustuu);
+		item.setHasIssued(this.pd_hasissued);
+		if (!StringUtils.isEmpty(pd_hasissued)) {
+			item.setIssuedStatus((short)Status.NOT_UPLOAD.value());
+		}
 		if (!CollectionUtils.isEmpty(this.attaches)) {
 			Set<com.uas.platform.b2b.model.Attach> b2bAttaches = new HashSet<com.uas.platform.b2b.model.Attach>();
 			for(Attach attach : this.attaches) {
@@ -157,4 +250,17 @@ public class PurchaseDetail {
 		return item;
 	}
 
+	/**
+	 * 转为erp明细
+	 * @param infoItem
+	 */
+	public PurchaseDetail(PurcOrderInfoItem infoItem) {
+		this.pd_custpurchasecode = infoItem.getCustPurchaseCode();
+		this.pd_custpurchasedetno = infoItem.getCustPurchaseDetno();
+	}
+
+	public PurchaseDetail() {
+
+	}
+
 }

+ 19 - 2
src/main/java/com/uas/platform/b2b/erp/model/PurchaseNotify.java

@@ -5,6 +5,7 @@ import com.uas.platform.b2b.model.PurchaseOrder;
 import com.uas.platform.b2b.model.PurchaseOrderItem;
 import com.uas.platform.b2b.support.SystemSession;
 import com.uas.platform.core.model.Status;
+import org.springframework.util.StringUtils;
 
 import java.util.ArrayList;
 import java.util.Date;
@@ -65,6 +66,17 @@ public class PurchaseNotify extends KeyEntity {
 	 */
 	private Long pn_b2bid;
 
+	//终端供应商,为0表示正常送货提醒
+	private Long pn_terminalvenduu;
+
+	public Long getPn_terminalvenduu() {
+		return pn_terminalvenduu;
+	}
+
+	public void setPn_terminalvenduu(Long pn_terminalvenduu) {
+		this.pn_terminalvenduu = pn_terminalvenduu;
+	}
+
 	public long getPn_id() {
 		return pn_id;
 	}
@@ -164,10 +176,15 @@ public class PurchaseNotify extends KeyEntity {
 		notice.setDate(pn_indate);
 		notice.setDelivery(pn_delivery);
 		notice.setEndQty(pn_endqty);
-		notice.setEnUU(SystemSession.getUser().getEnterprise().getUu());
 		notice.setQty(pn_qty);
 		notice.setRemark(pn_remark);
-		notice.setVendUU(ve_uu);
+		if ((!StringUtils.isEmpty(pn_terminalvenduu)) && (pn_terminalvenduu != 0)) {
+			notice.setVendUU(pn_terminalvenduu);
+			notice.setEnUU(SystemSession.getUser().getEnterprise().getUu());
+		} else {
+			notice.setVendUU(ve_uu);
+			notice.setEnUU(SystemSession.getUser().getEnterprise().getUu());
+		}
 		PurchaseOrder order = new PurchaseOrder();
 		order.setCode(pn_ordercode);
 		PurchaseOrderItem orderItem = new PurchaseOrderItem();

+ 55 - 0
src/main/java/com/uas/platform/b2b/erp/model/SaleDownDetail.java

@@ -26,6 +26,16 @@ public class SaleDownDetail {
 	private String sd_factory;
 	private String sd_prodsource;
 	private String sd_remark;
+	//终端供应商名称
+	private String sd_purcvendname;
+	//终端供应商uu
+	private Long sd_purcvenduu;
+	//客户采购订单序号
+	private Short sd_purcdetno;
+	//收货客户
+	private String sd_acceptcustname;
+	//收货地址
+	private String sd_acceptcustaddress;
 
 	public String getSd_remark() {
 		return sd_remark;
@@ -179,6 +189,46 @@ public class SaleDownDetail {
 		this.sd_prodsource = sd_prodsource;
 	}
 
+	public String getSd_purcvendname() {
+		return sd_purcvendname;
+	}
+
+	public void setSd_purcvendname(String sd_purcvendname) {
+		this.sd_purcvendname = sd_purcvendname;
+	}
+
+	public Long getSd_purcvenduu() {
+		return sd_purcvenduu;
+	}
+
+	public void setSd_purcvenduu(Long sd_purcvenduu) {
+		this.sd_purcvenduu = sd_purcvenduu;
+	}
+
+	public Short getSd_purcdetno() {
+		return sd_purcdetno;
+	}
+
+	public void setSd_purcdetno(Short sd_purcdetno) {
+		this.sd_purcdetno = sd_purcdetno;
+	}
+
+	public String getSd_acceptcustname() {
+		return sd_acceptcustname;
+	}
+
+	public void setSd_acceptcustname(String sd_acceptcustname) {
+		this.sd_acceptcustname = sd_acceptcustname;
+	}
+
+	public String getSd_acceptcustaddress() {
+		return sd_acceptcustaddress;
+	}
+
+	public void setSd_acceptcustaddress(String sd_acceptcustaddress) {
+		this.sd_acceptcustaddress = sd_acceptcustaddress;
+	}
+
 	public SaleDownDetail() {
 
 	}
@@ -208,6 +258,11 @@ public class SaleDownDetail {
 		this.sd_factory = orderItem.getFactory();
 		this.sd_prodsource = orderItem.getProdsource();
 		this.sd_remark = orderItem.getRemark();
+		this.sd_purcvendname = orderItem.getPurcVendName();
+		this.sd_purcvenduu = orderItem.getPurcVenduu();
+		this.sd_purcdetno = orderItem.getCustPurchaseDetno();
+		this.sd_acceptcustname = orderItem.getAcceptCustName();
+		this.sd_acceptcustaddress = orderItem.getAcceptCustAddress();
 	}
 
 	/**

+ 7 - 0
src/main/java/com/uas/platform/b2b/erp/service/PurchaseService.java

@@ -26,6 +26,13 @@ public interface PurchaseService {
 	 */
 	List<PurchaseReply> convertPurchaseOrderReply(List<PurchaseOrderReply> replies);
 
+	/**
+	 * 平台的采购明细转化为erp明细(可发货状态)
+	 * @param items
+	 * @return
+	 */
+	List<PurchaseDetail> convertIssued(List<PurcOrderInfoItem> items);
+
 	/**
 	 * 将买家在ERP的主动回复,转为平台的回复记录
 	 * 

+ 17 - 6
src/main/java/com/uas/platform/b2b/erp/service/impl/PurchaseNotifyServiceImpl.java

@@ -57,12 +57,23 @@ public class PurchaseNotifyServiceImpl implements PurchaseNotifyService {
 					notice.getSourceId());
 			// sourceId不存在新增保存
 			if (CollectionUtils.isEmpty(existNotices)) {
-				List<Long> idList = purchaseOrderItemDao.findIdByEnUUAndOrderCodeAndNumber(notice.getEnUU(),
-                        notice.getOrderItem().getOrder().getCode(), notice.getOrderItem().getNumber());
-				if (!CollectionUtils.isEmpty(idList)) {
-					notice.setOrderItemId(idList.get(0));
-					notice.setOrderItem(null);
-					notices.add(notice);
+				// 终端供应商uu存在
+				if(!StringUtils.isEmpty(notify.getPn_terminalvenduu()) && notify.getPn_terminalvenduu() != 0) {
+					List<PurchaseOrderItem> itemList = purchaseOrderItemDao.findByCustpurchasecodeAndCustpurchasedetno(notice.getVendUU(),notice.getOrderItem().getOrder().getCode(),
+							notice.getOrderItem().getNumber());
+					if (!CollectionUtils.isEmpty(itemList)) {
+						notice.setOrderItemId(itemList.get(0).getId());
+						notice.setOrderItem(null);
+						notices.add(notice);
+					}
+				} else {
+					List<Long> idList = purchaseOrderItemDao.findIdByEnUUAndOrderCodeAndNumber(notice.getEnUU(),
+							notice.getOrderItem().getOrder().getCode(), notice.getOrderItem().getNumber());
+					if (!CollectionUtils.isEmpty(idList)) {
+						notice.setOrderItemId(idList.get(0));
+						notice.setOrderItem(null);
+						notices.add(notice);
+					}
 				}
 				// 对现有的单据,修改
 			} else {

+ 10 - 0
src/main/java/com/uas/platform/b2b/erp/service/impl/PurchaseServiceImpl.java

@@ -146,6 +146,16 @@ public class PurchaseServiceImpl implements PurchaseService {
 		return replies;
 	}
 
+	@Override
+	public List<PurchaseDetail> convertIssued(List<PurcOrderInfoItem> items) {
+		List<PurchaseDetail> details = new ArrayList<>();
+		for (PurcOrderInfoItem infoItem : items) {
+			details.add(new PurchaseDetail(infoItem));
+		}
+		return details;
+	}
+
+
 	/**
 	 * 添加供应商资料
 	 * 

+ 126 - 0
src/main/java/com/uas/platform/b2b/model/PurcOrderInfoItem.java

@@ -155,6 +155,60 @@ public class PurcOrderInfoItem extends AbstractOrderProduct {
 	@Column(name = "pd_returnqty")
 	private Double returnQty;
 
+	/**
+	 * 终端供应商名称
+	 */
+	@Column(name = "pd_purcvendname")
+	private String purcVendName;
+
+	/**
+	 * 终端供应商uu
+	 */
+	@Column(name = "pd_purcvenduu")
+	private Long purcVenduu;
+
+	/**
+	 * 客户采购订单号
+	 */
+	@Column(name = "pd_custpurchasecode")
+	private String custPurchaseCode;
+
+	/**
+	 * 客户采购订单序号
+	 */
+	@Column(name = "pd_custpurchasedetno")
+	private Short custPurchaseDetno;
+
+	/**
+	 * 收货客户
+	 */
+	@Column(name = "pd_acceptcustname")
+	private String acceptCustName;
+
+	/**
+	 * 收货地址
+	 */
+	@Column(name = "pd_acceptcustaddress")
+	private  String acceptCustAddress;
+
+	/**
+	 * 收货客户uu
+	 */
+	@Column(name="pd_acceptcustuu")
+	private Long acceptCustuu;
+
+	/**
+	 * 是否能发货
+	 */
+	@Column(name = "pd_hasissued")
+	private String hasIssued;
+
+	/**
+	 * hasIssued下载到代采买家状态
+	 */
+	@Column(name = "pd_issuedstatus")
+	private Short issuedStatus;
+
 	/**
 	 * 关键词查询相关
 	 */
@@ -368,6 +422,78 @@ public class PurcOrderInfoItem extends AbstractOrderProduct {
 		this.vendspec = vendspec;
 	}
 
+	public String getPurcVendName() {
+		return purcVendName;
+	}
+
+	public void setPurcVendName(String purcVendName) {
+		this.purcVendName = purcVendName;
+	}
+
+	public Long getPurcVenduu() {
+		return purcVenduu;
+	}
+
+	public void setPurcVenduu(Long purcVenduu) {
+		this.purcVenduu = purcVenduu;
+	}
+
+	public String getCustPurchaseCode() {
+		return custPurchaseCode;
+	}
+
+	public void setCustPurchaseCode(String custPurchaseCode) {
+		this.custPurchaseCode = custPurchaseCode;
+	}
+
+	public Short getCustPurchaseDetno() {
+		return custPurchaseDetno;
+	}
+
+	public void setCustPurchaseDetno(Short custPurchaseDetno) {
+		this.custPurchaseDetno = custPurchaseDetno;
+	}
+
+	public String getAcceptCustName() {
+		return acceptCustName;
+	}
+
+	public void setAcceptCustName(String acceptCustName) {
+		this.acceptCustName = acceptCustName;
+	}
+
+	public String getAcceptCustAddress() {
+		return acceptCustAddress;
+	}
+
+	public void setAcceptCustAddress(String acceptCustAddress) {
+		this.acceptCustAddress = acceptCustAddress;
+	}
+
+	public Long getAcceptCustuu() {
+		return acceptCustuu;
+	}
+
+	public void setAcceptCustuu(Long acceptCustuu) {
+		this.acceptCustuu = acceptCustuu;
+	}
+
+	public String getHasIssued() {
+		return hasIssued;
+	}
+
+	public void setHasIssued(String hasIssued) {
+		this.hasIssued = hasIssued;
+	}
+
+	public Short getIssuedStatus() {
+		return issuedStatus;
+	}
+
+	public void setIssuedStatus(Short issuedStatus) {
+		this.issuedStatus = issuedStatus;
+	}
+
 	public double getBalance() {
 		double qtyNum, returnQtyNum, acceptQtyNum;
 		qtyNum = qty == null ? 0 : qty;

+ 83 - 0
src/main/java/com/uas/platform/b2b/model/PurchaseOrderAllItem.java

@@ -174,6 +174,42 @@ public class PurchaseOrderAllItem extends AbstractOrderProduct {
     @Column(name = "pd_audid")
     private Long audId;
 
+	/**
+	 * 终端供应商名称
+	 */
+	@Column(name = "pd_purcvendname")
+	private String purcVendName;
+
+	/**
+	 * 终端供应商uu
+	 */
+	@Column(name = "pd_purcvenduu")
+	private Long purcVenduu;
+
+	/**
+	 * 客户采购订单号
+	 */
+	@Column(name = "pd_custpurchasecode")
+	private String custPurchaseCode;
+
+	/**
+	 * 客户采购订单序号
+	 */
+	@Column(name = "pd_custpurchasedetno")
+	private Short custPurchaseDetno;
+
+	/**
+	 * 收货客户
+	 */
+	@Column(name = "pd_acceptcustname")
+	private String acceptCustName;
+
+	/**
+	 * 收货地址
+	 */
+	@Column(name = "pd_acceptcustaddress")
+	private  String acceptCustAddress;
+
 	/**
 	 * 是否在变更中
 	 */
@@ -443,4 +479,51 @@ public class PurchaseOrderAllItem extends AbstractOrderProduct {
 		return orders;
 	}
 
+	public String getPurcVendName() {
+		return purcVendName;
+	}
+
+	public void setPurcVendName(String purcVendName) {
+		this.purcVendName = purcVendName;
+	}
+
+	public Long getPurcVenduu() {
+		return purcVenduu;
+	}
+
+	public void setPurcVenduu(Long purcVenduu) {
+		this.purcVenduu = purcVenduu;
+	}
+
+	public String getCustPurchaseCode() {
+		return custPurchaseCode;
+	}
+
+	public void setCustPurchaseCode(String custPurchaseCode) {
+		this.custPurchaseCode = custPurchaseCode;
+	}
+
+	public Short getCustPurchaseDetno() {
+		return custPurchaseDetno;
+	}
+
+	public void setCustPurchaseDetno(Short custPurchaseDetno) {
+		this.custPurchaseDetno = custPurchaseDetno;
+	}
+
+	public String getAcceptCustName() {
+		return acceptCustName;
+	}
+
+	public void setAcceptCustName(String acceptCustName) {
+		this.acceptCustName = acceptCustName;
+	}
+
+	public String getAcceptCustAddress() {
+		return acceptCustAddress;
+	}
+
+	public void setAcceptCustAddress(String acceptCustAddress) {
+		this.acceptCustAddress = acceptCustAddress;
+	}
 }

+ 84 - 0
src/main/java/com/uas/platform/b2b/model/PurchaseOrderItem.java

@@ -159,6 +159,42 @@ public class PurchaseOrderItem extends AbstractOrderProduct {
 	@Column(name = "pd_endstatus")
 	private Short endStatus;
 
+	/**
+	 * 终端供应商名称
+	 */
+	@Column(name = "pd_purcvendname")
+	private String purcVendName;
+
+	/**
+	 * 终端供应商uu
+	 */
+	@Column(name = "pd_purcvenduu")
+	private Long purcVenduu;
+
+	/**
+	 * 客户采购订单号
+	 */
+	@Column(name = "pd_custpurchasecode")
+	private String custPurchaseCode;
+
+	/**
+	 * 客户采购订单序号
+	 */
+	@Column(name = "pd_custpurchasedetno")
+	private Short custPurchaseDetno;
+
+	/**
+	 * 收货客户
+	 */
+	@Column(name = "pd_acceptcustname")
+	private String acceptCustName;
+
+	/**
+	 * 收货地址
+	 */
+	@Column(name = "pd_acceptcustaddress")
+	private  String acceptCustAddress;
+
 	public Long getId() {
 		return id;
 	}
@@ -345,6 +381,54 @@ public class PurchaseOrderItem extends AbstractOrderProduct {
 		this.vendspec = vendspec;
 	}
 
+	public String getPurcVendName() {
+		return purcVendName;
+	}
+
+	public void setPurcVendName(String purcVendName) {
+		this.purcVendName = purcVendName;
+	}
+
+	public Long getPurcVenduu() {
+		return purcVenduu;
+	}
+
+	public void setPurcVenduu(Long purcVenduu) {
+		this.purcVenduu = purcVenduu;
+	}
+
+	public String getCustPurchaseCode() {
+		return custPurchaseCode;
+	}
+
+	public void setCustPurchaseCode(String custPurchaseCode) {
+		this.custPurchaseCode = custPurchaseCode;
+	}
+
+	public Short getCustPurchaseDetno() {
+		return custPurchaseDetno;
+	}
+
+	public void setCustPurchaseDetno(Short custPurchaseDetno) {
+		this.custPurchaseDetno = custPurchaseDetno;
+	}
+
+	public String getAcceptCustName() {
+		return acceptCustName;
+	}
+
+	public void setAcceptCustName(String acceptCustName) {
+		this.acceptCustName = acceptCustName;
+	}
+
+	public String getAcceptCustAddress() {
+		return acceptCustAddress;
+	}
+
+	public void setAcceptCustAddress(String acceptCustAddress) {
+		this.acceptCustAddress = acceptCustAddress;
+	}
+
 	public static List<PurchaseOrderItem> distinctItem(List<PurchaseOrderItem> items) {
 		List<PurchaseOrderItem> orderItems = new ArrayList<>();
 		Set<Long> keys = new HashSet<>();

+ 13 - 0
src/main/java/com/uas/platform/b2b/service/PurchaseOrderService.java

@@ -1,5 +1,6 @@
 package com.uas.platform.b2b.service;
 
+import com.uas.platform.b2b.erp.model.PurchaseDetail;
 import com.uas.platform.b2b.model.*;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.search.b2b.model.SPage;
@@ -224,6 +225,12 @@ public interface PurchaseOrderService {
 	 */
 	public List<PurchaseOrderReply> findNotUploadReply();
 
+	/**
+	 * 查找所有待上传的可发货状态(代采订单)
+	 * @return
+	 */
+	List<PurcOrderInfoItem> findNotUploadIssued();
+
 	/**
 	 * 查找所有待上传到卖家的回复记录
 	 * 
@@ -238,6 +245,12 @@ public interface PurchaseOrderService {
 	 */
 	public void onReplyUploadSuccess(String[] idArray);
 
+	/**
+	 * 更新平台状态
+	 * @param items
+	 */
+	void onIssuedSucess(List<PurchaseDetail> items);
+
 	/**
 	 * 回复记录成功传到卖家ERP之后
 	 * 

+ 1239 - 1232
src/main/java/com/uas/platform/b2b/service/impl/PurchaseNoticeServiceImpl.java

@@ -1,1232 +1,1239 @@
-package com.uas.platform.b2b.service.impl;
-
-import com.uas.platform.b2b.core.util.ContextUtils;
-import com.uas.platform.b2b.core.util.SplitArray;
-import com.uas.platform.b2b.core.util.ThreadTask;
-import com.uas.platform.b2b.dao.*;
-import com.uas.platform.b2b.erp.model.PurchaseNotify;
-import com.uas.platform.b2b.event.SaleSendAcceptReleaseEvent;
-import com.uas.platform.b2b.model.*;
-import com.uas.platform.b2b.ps.service.PersonalProductService;
-import com.uas.platform.b2b.search.SearchService;
-import com.uas.platform.b2b.service.PurchaseNoticeService;
-import com.uas.platform.b2b.service.UserService;
-import com.uas.platform.b2b.support.*;
-import com.uas.platform.core.exception.IllegalOperatorException;
-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.Status;
-import com.uas.platform.core.persistence.criteria.PredicateUtils;
-import com.uas.search.b2b.model.SPage;
-import org.apache.commons.collections.CollectionUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.data.jpa.domain.Specification;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.StringUtils;
-
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-import java.math.BigDecimal;
-import java.text.SimpleDateFormat;
-import java.util.*;
-
-/**
- * 发货提醒
- *
- * @author US50
- */
-@Service
-public class PurchaseNoticeServiceImpl implements PurchaseNoticeService {
-
-	private final static UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
-
-	@Autowired
-	private PurchaseNoticeDao purchaseNoticeDao;
-
-	@Autowired
-	private SaleSendDao saleSendDao;
-
-	@Autowired
-	private SaleSendItemDao saleSendItemDao;
-
-	@Autowired
-	private SaleSendAllDao saleSendAllDao;
-
-	@Autowired
-	private SaleSendItemVerifyDao saleSendItemVerifyDao;
-
-	@Autowired
-	private B2bCodeSetDao b2bCodeSetDao;
-
-	@Autowired
-	private BarPackageDao barPackageDao;
-
-	@Autowired
-	private BarSendNotifyDao barSendNotifyDao;
-
-	@Autowired
-	private BarPackageDetailDao barPackageDetailDao;
-
-	@Autowired
-	private CommonDao commonDao;
-
-	@Autowired
-	private BarLPSetingDao barLPSetingDao;
-
-	@Autowired
-	private SearchService searchService;
-
-	@Autowired
-	private DistributeDao distributeDao;
-
-	@Autowired
-	private  RoleDao roleDao;
-
-	@Autowired
-	private  UserOrderDao userOrderDao;
-
-	@Autowired
-	private  UserDao userDao;
-
-	@Autowired
-	private VendorDao vendorDao;
-
-	@Autowired
-    private PersonalProductService personalProductService;
-
-	@Autowired
-	private PurchaseNoticeEndDao noticeEndDao;
-
-	@Autowired
-    private UserService userService;
-
-    /**
-     * 最多数量
-     */
-    final Integer MAX_SIZE = 1000;
-
-	@Override
-	public List<PurchaseNotice> save(List<PurchaseNotice> notices) {
-		notices = purchaseNoticeDao.save(notices);
-		saveUserOrders(notices);
-		return notices;
-	}
-
-	private void saveUserOrders(final List<PurchaseNotice> notices) {
-
-		ThreadTask.getInstance().execute(new Runnable() {
-			@Override
-			public void run() {
-                /* 添加供应商的阅读记录*/
-				for(PurchaseNotice notice : notices) {
-					Set<Long> userUUs = new HashSet<>();
-					// 添加管理员
-					List<Role> roles = roleDao.findByEnUUAndIssys(notice.getVendUU(), Constant.YES);
-					if (!CollectionUtils.isEmpty(roles)) {
-						List<User> admins = userDao.findByRole(roles.get(0).getId());
-						for (User admin : admins) {
-							if (!userUUs.contains(admin.getUserUU())) {
-								userUUs.add(admin.getUserUU());
-							}
-						}
-					}
-					List<Vendor> vendors = vendorDao.findByMyEnUUAndVendUU(notice.getEnUU(), notice.getVendUU());
-					// 查找有权限的用户
-					if (!CollectionUtils.isEmpty(vendors)) {
-						Long vendorId = vendors.get(0).getId();
-						List<Distribute> distributes = distributeDao.findByVendorId(vendorId);
-						if (!CollectionUtils.isEmpty(distributes)) {
-							for (Distribute distribute : distributes) {
-								if (!userUUs.contains(distribute.getUserUU())) {
-									userUUs.add(distribute.getUserUU());
-								}
-							}
-						}
-					}
-					UserOrders userOrders;
-					List<UserOrders> list = new ArrayList<>();
-					for (Long userUU : userUUs) {
-						if (userUU == null) {
-							continue;
-						}
-						userOrders = new UserOrders(userUU, notice.getVendUU(), notice.getId(), "sale", "purc$notice");
-						list.add(userOrders);
-					}
-
-                    /* 添加采购员的阅读记录*/
-                    if (notice.getOrderItem().getOrder().getUserUU() != null) {
-                        userOrders = new UserOrders(notice.getOrderItem().getOrder().getUserUU(), notice.getEnUU(), notice.getId(), "purc", "purc$notice");
-						userOrders.setReadStatus((short) Status.READ.value());
-                        list.add(userOrders);
-                    }
-					userOrderDao.save(list);
-				}
-			}
-		});
-	}
-
-	@Override
-	public Page<PurchaseNotice> findAllByPageInfo(final PageInfo pageInfo, final String keyword, final Long fromDate,
-			final Long endDate, final SearchFilter filter) {
-		return purchaseNoticeDao.findAll(new Specification<PurchaseNotice>() {
-			@Override
-			public Predicate toPredicate(Root<PurchaseNotice> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
-				if (filter != null) {
-					if (!CollectionUtils.isEmpty(filter.getDistribute())) {
-						pageInfo.expression(PredicateUtils.in("enUU", filter.getDistribute(), false));
-					}
-				}
-				if (StringUtils.hasText(keyword)) {
-					List<Object> lists = new ArrayList<>();
-					List<PurchaseNotice> listss = searchService.searchPurchaseNoticeIds(keyword, null).getContent();
-					for (PurchaseNotice list : listss) {
-						lists.add(list.getId());
-					}
-					pageInfo.expression(PredicateUtils.in("id", lists, false));
-				}
-				if (fromDate != null) {
-					pageInfo.expression(PredicateUtils.in("id", purchaseNoticeDao.findByFromDate(
-							SystemSession.getUser().getEnterprise().getUu(), new Date(fromDate)), false));
-				}
-				if (endDate != null) {
-					pageInfo.expression(PredicateUtils.in("id", purchaseNoticeDao
-							.findByEndDate(SystemSession.getUser().getEnterprise().getUu(), new Date(endDate)), false));
-				}
-				return query.where(pageInfo.getPredicates(root, query, builder)).getRestriction();
-			}
-		}, pageInfo);
-	}
-
-    @Override
-	public Page<PurchaseNotice> findDoneByPageInfo(final PageInfo pageInfo, final String keyword, final Long fromDate,
-			final Long endDate) {
-		return purchaseNoticeDao.findAll(new Specification<PurchaseNotice>() {
-			@Override
-			public Predicate toPredicate(Root<PurchaseNotice> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
-				pageInfo.filter("status", Status.REPLIED.value());
-				pageInfo.expression(
-						PredicateUtils.or(PredicateUtils.isNull("end"), PredicateUtils.ne("end", Constant.YES, false)));
-				if (StringUtils.hasText(keyword)) {
-					List<Object> lists = new ArrayList<>();
-					List<PurchaseNotice> listss = searchService.searchPurchaseNoticeIds(keyword, null).getContent();
-					for (PurchaseNotice list : listss) {
-						lists.add(list.getId());
-					}
-					pageInfo.expression(PredicateUtils.in("id", lists, false));
-				}
-				if (fromDate != null) {
-					pageInfo.expression(PredicateUtils.in("id", purchaseNoticeDao.findByFromDate(
-							SystemSession.getUser().getEnterprise().getUu(), new Date(fromDate)), false));
-				}
-				if (endDate != null) {
-					pageInfo.expression(PredicateUtils.in("id", purchaseNoticeDao
-							.findByEndDate(SystemSession.getUser().getEnterprise().getUu(), new Date(endDate)), false));
-				}
-				return query.where(pageInfo.getPredicates(root, query, builder)).getRestriction();
-			}
-		}, pageInfo);
-	}
-
-	@Override
-	public PurchaseNotice findById(Long id) {
-		return purchaseNoticeDao.findOne(id);
-	}
-
-	@Override
-	public void send(List<SaleSendItem> sendItems) {
-		saleSendItemDao.save(sendItems);
-		for (SaleSendItem item : sendItems) {
-			if (item.getNoticeId() != null) {
-			    Double sendQty = saleSendItemDao.getSendQtyByNoticeId(item.getNoticeId());
-				purchaseNoticeDao.updateBySend(item.getNoticeId(), sendQty);
-                logger.log("更新发货提醒发货数量", "ERP主动收料通知单/上传发货单更新发货提醒已发货数量",
-                        "发货单: " + item.getNoticeId() + ",更新数量: " + sendQty);
-				// 更新发货状态
-				updateNoticeStatus(item.getNoticeId());
-			}
-		}
-	}
-
-	@Override
-	public List<SaleSendItem> findSendById(long noticeId) {
-		return saleSendItemDao.findByNoticeId(noticeId);
-	}
-
-	@Override
-	public List<PurchaseNotice> findNotUploadNotice() {
-		return purchaseNoticeDao.findByVendUUAndSendStatus(SystemSession.getUser().getEnterprise().getUu(),
-				(short) Status.NOT_UPLOAD.value());
-	}
-
-	@Override
-	public void onNoticeDownSuccess(String[] idArray) {
-		for (String id : idArray) {
-			PurchaseNotice notice = purchaseNoticeDao.findOne(Long.parseLong(id));
-			if (notice != null) {
-				notice.setSendStatus((short) Status.DOWNLOADED.value());
-				purchaseNoticeDao.save(notice);
-			}
-		}
-	}
-
-	@Override
-	public List<SaleSend> findNotUploadSend() {
-		return saleSendDao.findByCustUUAndSendStatus(SystemSession.getUser().getEnterprise().getUu(),
-				(short) Status.NOT_UPLOAD.value());
-	}
-
-	@Override
-	public List<SaleSend> findNotUploadSendEDI(Long enUU) {
-		return saleSendDao.findByCustUUAndSendStatus(enUU,
-				(short) Status.NOT_UPLOAD.value());
-	}
-
-	@Override
-	public List<SaleSend> findNotSendSend() {
-		return saleSendDao.findByEnUUAndBackStatus(SystemSession.getUser().getEnterprise().getUu(),
-				(short) Status.NOT_UPLOAD.value());
-	}
-
-	@Override
-	public void onSendUploadSuccess(String[] idArray) {
-		for (String id : idArray) {
-			SaleSend send = saleSendDao.findOne(Long.parseLong(id));
-			if (send != null) {
-				send.setSendStatus((short) Status.DOWNLOADED.value());
-				saleSendDao.save(send);
-			}
-		}
-	}
-
-	@Override
-	public void onSendDownSuccess(String[] idArray) {
-		for (String id : idArray) {
-			SaleSend send = saleSendDao.findOne(Long.parseLong(id));
-			if (send != null) {
-				send.setBackStatus((short) Status.DOWNLOADED.value());
-				saleSendDao.save(send);
-			}
-		}
-	}
-
-	@Override
-	public void end(List<PurchaseNotify> notifies) {
-		long enUU = SystemSession.getUser().getEnterprise().getUu();
-		List<PurchaseNoticeEnd> noticeList = noticeEndDao.findByEnUUAndSourceIdList(enUU, CollectionUtil.getKeyCollection(notifies));
-		if (!CollectionUtils.isEmpty(noticeList)) {
-		    for (PurchaseNoticeEnd notice : noticeList) {
-                notice.setEnd(Constant.YES);
-                notice.setEndStatus((short) Status.NOT_UPLOAD.value());
-                notice.setErpDate(new Date(System.currentTimeMillis()));
-            }
-        }
-        noticeEndDao.save(noticeList);
-	}
-
-	@Override
-	public List<PurchaseNotice> findNotSendEnd() {
-		return purchaseNoticeDao.findByVendUUAndEndStatus(SystemSession.getUser().getEnterprise().getUu(),
-				(short) Status.NOT_UPLOAD.value());
-	}
-
-	@Override
-	public void onEndDownSuccess(String[] idArray) {
-		for (String id : idArray) {
-			PurchaseNoticeEnd noticeEnd = noticeEndDao.findOne(Long.parseLong(id));
-			if (noticeEnd != null) {
-                noticeEnd.setEndStatus((short) Status.DOWNLOADED.value());
-                noticeEndDao.save(noticeEnd);
-			}
-		}
-	}
-
-	@Override
-	public SaleSend send(Long noticeId, SaleSend send) {
-		PurchaseNotice notice = purchaseNoticeDao.findOne(noticeId);
-		List<SaleSend> sends = saleSendDao.findByUuid(send.getUuid());
-		//限制同一个供应商给同一个客户发货单号不可以重复,(避免一次发货产生多张单)
-		if (notice != null && CollectionUtils.isEmpty(sends)) {
-			if (notice.getEnd() != null && notice.getEnd() == Constant.YES) {
-				throw new IllegalOperatorException("客户已经取消了本次送货提醒,请刷新重试!");
-			}
-			double thisQty = 0;
-			for (SaleSendItem item : send.getSendItems()) {
-				thisQty += item.getQty();
-			}
-			double endQty = (notice.getEndQty() == null ? 0.0 : notice.getEndQty()) + thisQty;
-			if (endQty > notice.getQty()) {
-				throw new IllegalOperatorException("累计发货数量将超出本次送货提醒的需求数!");
-			}
-			PurchaseOrder order = notice.getOrderItem().getOrder();
-			send.setCurrency(order.getCurrency());
-			send.setBackStatus((short) Status.NOT_UPLOAD.value());
-			send.setSendStatus((short) Status.NOT_UPLOAD.value());
-			// 未收料
-			send.setVerifystatus(Constant.NO);
-			send.setCustUU(notice.getEnUU());
-			send.setCustUserUU(order.getUserUU());
-			send.setDate(new Date());
-			send.setEnUU(SystemSession.getUser().getEnterprise().getUu());
-			send.setPayments(order.getPayments());
-			send.setRate(order.getRate());
-			send.setRecorder(SystemSession.getUser().getUserName());
-			short number = 0;
-			for (SaleSendItem item : send.getSendItems()) {
-				item.setNoticeId(noticeId);
-				item.setNotice(notice);
-				item.setNumber(++number);
-				item.setOrderItem(notice.getOrderItem());
-				item.setOrderItemId(notice.getOrderItem().getId());
-				item.setPrice(notice.getOrderItem().getPrice());
-				item.setSend(send);
-			}
-			List<SaleSendItem> sendItems = saleSendItemDao.save(send.getSendItems());
-			notice.setEndQty(endQty);
-			notice.setStatus((short) (endQty == notice.getQty() ? Status.REPLIED.value() : Status.NOT_REPLY.value()));
-			purchaseNoticeDao.save(notice);
-			if (!CollectionUtils.isEmpty(sendItems)) {
-				List<SaleSend> saleSends = new ArrayList<SaleSend>();
-				saleSends.add(sendItems.get(0).getSend());
-			}
-			// 我的产品库更新
-            personalProductService.covertPersonalProduct(notice.getOrderItem().getProductId(), "单个发货");
-			return sendItems.get(0).getSend();
-		} else {
-			throw new IllegalOperatorException("请对有效的送货提醒发货!");
-		}
-	}
-
-    @Override
-	public int getOnhandCount() {
-		return purchaseNoticeDao.getCountByVendUUAndStatus(SystemSession.getUser().getEnterprise().getUu(),
-				(short) Status.NOT_REPLY.value());
-	}
-
-	@Override
-	public SaleSend send(SaleSend saleSend) {
-		//限制同一个供应商给同一个客户发货单号不可以重复,(避免一次发货产生多张单),存在时不做处理
-		List<SaleSend> sendList = saleSendDao.findByUuid(saleSend.getUuid());
-		if (saleSend != null && CollectionUtils.isEmpty(sendList)) {
-			saleSend.setBackStatus((short) Status.NOT_UPLOAD.value());
-			saleSend.setSendStatus((short) Status.NOT_UPLOAD.value());
-			saleSend.setEnUU(SystemSession.getUser().getEnterprise().getUu());
-			saleSend.setRecorder(SystemSession.getUser().getUserName());
-			saleSend.setDate(new Date());
-            // 未收料
-			saleSend.setVerifystatus(Constant.NO);
-			short number = 0;
-			List<SaleSendItem> sendItems = new ArrayList<SaleSendItem>();
-			for (SaleSendItem item : saleSend.getSendItems()) {
-				PurchaseNotice notice = purchaseNoticeDao.findOne(item.getNoticeId());
-				if (notice != null) {
-					if (notice.getEnd() != null && notice.getEnd() == Constant.YES) {
-						String error = "货车中订单:" + notice.getOrderItem().getOrder().getCode() + "的物料号为"
-								+ notice.getOrderItem().getProduct().getCode() + "的发货通知被取消!";
-						throw new IllegalOperatorException(error);
-					} else {
-						double thisQty = item.getQty();
-						double endQty = (notice.getEndQty() == null ? 0.0 : notice.getEndQty()) + thisQty;
-						if (endQty > notice.getQty()) {
-							throw new IllegalOperatorException("累计发货数量将超出本次送货提醒的需求数!");
-						}
-						item.setNotice(notice);
-                        // 带了序号则不重设序号,不带这重设序号
-						if (item.getNumber() == null || item.getNumber() == 0) {
-							item.setNumber(++number);
-						}
-						item.setOrderItem(notice.getOrderItem());
-						item.setOrderItemId(notice.getOrderItemId());
-						saleSend.setRate(notice.getOrderItem().getOrder().getRate());
-						item.setSend(saleSend);
-						sendItems.add(item);
-					}
-				} else {
-					throw new IllegalOperatorException("参数错误,无效的客户送货提醒单!");
-				}
-
-			}
-			sendItems = saleSendItemDao.save(sendItems);
-			for (SaleSendItem sendItem : sendItems) {
-				PurchaseNotice notice = purchaseNoticeDao.findOne(sendItem.getNoticeId());
-				double endQty = (notice.getEndQty() == null ? 0.0 : notice.getEndQty()) + sendItem.getQty();
-				if (endQty > notice.getQty()) {
-					throw new IllegalOperatorException("累计发货数量将超出本次送货提醒的需求数!");
-				}
-				notice.setEndQty(endQty);
-				notice.setStatus(
-						(short) (endQty == notice.getQty() ? Status.REPLIED.value() : Status.NOT_REPLY.value()));
-				purchaseNoticeDao.save(notice);
-                // 转入我的物料库
-                personalProductService.covertPersonalProduct(notice.getOrderItem().getProductId(), "批量发货");
-			}
-			if (!CollectionUtils.isEmpty(sendItems)) {
-				List<SaleSend> saleSends = new ArrayList<SaleSend>();
-				saleSends.add(sendItems.get(0).getSend());
-			}
-			return sendItems.get(0).getSend();
-		} else {
-			throw new IllegalArgumentException();
-		}
-	}
-
-	@Override
-	public void onSaleSendChange(List<SaleSendItem> sendItems) {
-		for (SaleSendItem item : sendItems) {
-			saleSendItemDao.updateByReply(item.getId(), item.getQty(), item.getReplyRemark());
-			if (item.getNoticeId() != null) {
-			    Double sendQty = saleSendItemDao.getSendQtyByNoticeId(item.getNoticeId());
-				purchaseNoticeDao.updateBySend(item.getNoticeId(), sendQty);
-                logger.log("更新发货提醒发货数量", "ERP上传收料通知的确认数量更新发货提醒已发货数量",
-                        "发货单: " + item.getNoticeId() + ",更新数量: " + sendQty);
-                updateNoticeStatus(item.getNoticeId());
-			}
-		}
-	}
-
-    /**
-     * 更新发货提醒状态
-     *
-     * @param noticeId 发货提醒id
-     */
-    private void updateNoticeStatus(Long noticeId) {
-        PurchaseNotice notice = purchaseNoticeDao.findOne(noticeId);
-        if (notice.getEndQty() < notice.getQty() && notice.getStatus() == Status.REPLIED.value()) {
-            purchaseNoticeDao.updateStatus(notice.getId(), (short) Status.NOT_REPLY.value());
-        }
-    }
-
-    @Override
-	public List<PurchaseNotice> findById(Long[] ids) {
-		return purchaseNoticeDao.findUnEndByIds(ids);
-	}
-
-	@Override
-	public void onVerify(List<SaleSendItemVerify> verifies) {
-		verifies = saleSendItemVerifyDao.save(verifies);
-		List<SaleSendItem> saleSendItems = new ArrayList<>();
-		for (SaleSendItemVerify verify : verifies) {
-			saleSendItemDao.updateByVerify(verify.getSendItemId());
-			updateVerifyStatus(verify.getSendItemId());
-			SaleSendItem item = saleSendItemDao.findOne(verify.getSendItemId());
-			saleSendItems.add(item);
-		}
-		// 买家收料之后给卖家发消息
-		ContextUtils.publishEvent(new SaleSendAcceptReleaseEvent(SaleSendItem.distinct(saleSendItems)));
-	}
-
-	@Override
-	public void unVerify(List<SaleSendItemVerify> verifies) {
-		saleSendItemVerifyDao.delete(verifies);
-		for (SaleSendItemVerify verify : verifies) {
-			saleSendItemDao.updateByVerify(verify.getSendItemId());
-			updateVerifyStatus(verify.getSendItemId());
-		}
-	}
-
-	/**
-	 * 更新发货单的收料状态
-	 * 
-	 * @param sendItemId
-	 */
-	private void updateVerifyStatus(Long sendItemId) {
-		SaleSendItem sendItem = saleSendItemDao.findOne(sendItemId);
-		int totalCount = saleSendItemDao.getTotalCountBySendId(sendItem.getSend().getId());
-		int verifyCount = saleSendItemDao.getFullVerifyCountBySendId(sendItem.getSend().getId());
-		if (verifyCount == totalCount) {
-			sendItem.getSend().setVerifystatus(Constant.YES);
-		} else {
-			sendItem.getSend().setVerifystatus(Constant.NO);
-		}
-		saleSendItemDao.save(sendItem);
-	}
-
-	@Override
-	public SaleSendAll findSaleSendById(Long id) {
-		SaleSendAll send = saleSendAllDao.findOne(id);
-		if (send == null) {
-			throw new IllegalOperatorException("您查找的发货单不存在!");
-		}
-		return send;
-	}
-
-	@Override
-	public Long getAllCount() {
-		return purchaseNoticeDao.countByVendUU(SystemSession.getUser().getEnterprise().getUu());
-	}
-
-	@Override
-	public Long getAllNoticeCountByEnUU(Long enUU) {
-		return purchaseNoticeDao.getCountByEnUUAndStatus(enUU, (short) Status.REPLIED.value());
-	}
-
-	@Override
-	public Long getTodoNoticeCountByEnUU(Long enUU) {
-		return purchaseNoticeDao.getCountByEnUUAndStatus(enUU, (short) Status.NOT_REPLY.value());
-	}
-
-	@Override
-	public Long getWatingNoticeCountByEnUU(Long enUU) {
-		return purchaseNoticeDao.getWatingCountByEnUUAndStatus(enUU);
-	}
-
-	@Override
-	public Long getEndNoticeCountByEnUU(Long enUU) {
-		return purchaseNoticeDao.getEndCountByEnUUAndStatus(enUU);
-	}
-
-	@Override
-	public void updateBarCode(Long id, Double packageQty, Double outBoxQty) {
-		saleSendItemDao.updatePackageQty(id, packageQty, outBoxQty);
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void generateBarcodes(Long id, List<SaleSendItem> sendItem, Long enUU) {
-		SaleSend saleSend = saleSendDao.findOne(id);
-		Long custUU = saleSend.getCustUU();
-		// 获取条码生成规则,判断规则是否审核,已审核,根据规则拼接
-		B2bCodeSet barcodeSet = b2bCodeSetDao.findByEnUUAndType(custUU, "BATCH");
-        // 条码生成规则不为空,已审核
-		if (barcodeSet != null) {
-			if (!"AUDITED".equals(barcodeSet.getStatuscode())) {
-				throw new IllegalOperatorException("请先审核条码生成规则!");
-			}
-		} else {
-			throw new IllegalOperatorException("请先维护条码生成规则!");
-		}
-		// 是否维护包装箱生成规则
-		B2bCodeSet outboxSet = b2bCodeSetDao.findByEnUUAndType(custUU, "PACK");
-		if (outboxSet == null) {
-			throw new IllegalOperatorException("请先维护外箱生成规则!");
-		}
-		String AUDITED_STATUS = "AUDITED";
-		if (!AUDITED_STATUS.equals(outboxSet.getStatuscode())) {
-			throw new IllegalOperatorException("请先审核外箱生成规则!");
-		}
-		for (SaleSendItem item : sendItem) {
-			// 清空原有箱号,箱号明细,条码
-			List<BarSendNotify> bsNotify = barSendNotifyDao.findBySiid(item.getId());
-			for (BarSendNotify notify : bsNotify) {
-				if (notify.getOutboxid() != null) {
-					BarPackage barPackage = barPackageDao.findOne(notify.getOutboxid());
-					if (barPackage != null) {
-						barPackageDetailDao.delete(barPackage.getDetail());
-						barPackageDao.delete(barPackage);
-					}
-				}
-			}
-			barSendNotifyDao.deleteAllBySiid(item.getId());
-			// 获取明细,最小包装数,外箱容量等信息
-			SaleSendItem sItem = saleSendItemDao.findOne(item.getId());
-			double pQty = sItem.getPackageQty(), bQty = sItem.getOutBoxQty(), qty = sItem.getQty();
-			String bar_code, pr_code = sItem.getOrderItem().getProduct().getCode();
-            // 最小包装数件数
-			int aNum = (int) (qty / pQty);
-			double aqtyA = (new BigDecimal(Double.toString(qty))).subtract(new BigDecimal(Double.toString(aNum * pQty)))
-					.doubleValue(); // 小于最小包装数的
-            // ERP中对应的物料ID
-			String sourceId = String.valueOf(sItem.getOrderItem().getProduct().getSourceId());
-			// 获取是否勾选了生成外箱
-			if (item.getIsOutboxChecked()) {
-				// 判断外箱容量是否为最小包装数的整数倍
-				String out_boxcode = null;
-				Long pa_id = null;
-                // 每箱件数
-				int sumJ = (int) (bQty / pQty);
-				if (sumJ * pQty != bQty) {
-					throw new IllegalOperatorException("序号:" + sItem.getNumber() + ",外箱容量不是最小包装数的整数倍!");
-				}
-                // 整数箱数
-				int bNum = (int) (qty / bQty);
-                // 零散数
-				double bqtyB = (new BigDecimal(Double.toString(qty)))
-						.subtract(new BigDecimal(Double.toString(bNum * bQty))).doubleValue();
-				if (aNum >= 1) {
-					for (int i = 0; i < aNum; i++) {
-						if (i % sumJ == 0) {
-							BarPackage barPackage = new BarPackage();
-							out_boxcode = outboxMethod(sourceId, outboxSet);
-							barPackage.setCustUU(custUU);
-							barPackage.setEnUU(enUU);
-							barPackage.setOutboxcode(out_boxcode);
-							barPackage.setProdcode(pr_code);
-							barPackage.setLevel((long) 1);
-							barPackage.setPackdate(new Date());
-							barPackage.setSendStatus((short) Status.NOT_UPLOAD.value());
-							if (i >= aNum - sumJ && bqtyB > 0) {
-								barPackage.setPackageqty(aNum - sumJ);
-								barPackage.setTotalqty(bqtyB);
-							} else {
-								barPackage.setPackageqty(sumJ);
-								barPackage.setTotalqty(bQty);
-							}
-							barPackageDao.save(barPackage);
-							barPackage = barPackageDao.findByOutboxcodeAndEnUU(out_boxcode, enUU);
-							pa_id = barPackage.getId();
-						}
-						bar_code = barcodeMethod(sourceId, barcodeSet);
-						insertBarPd(pa_id, out_boxcode, pQty, bar_code, sItem, enUU);
-					}
-				}
-				if (aqtyA > 0) {
-					bar_code = barcodeMethod(sourceId, barcodeSet);
-					insertBarPd(pa_id, out_boxcode, aqtyA, bar_code, sItem, enUU);
-				}
-				logger.log("发货单", "生成条码和箱号",
-						"发货单:" + sItem.getSend().getCode() + ",明细行序号:" + sItem.getNumber() + ",生成条码和箱号!");
-			} else {
-				if (aNum >= 1) {
-					for (int i = 0; i < aNum; i++) {
-						insertBar(sItem, pQty, enUU, barcodeSet);
-					}
-				}
-				if (aqtyA > 0) {
-					insertBar(sItem, aqtyA, enUU, barcodeSet);
-				}
-				logger.log("发货单", "生成条码",
-						"发货单:" + sItem.getSend().getCode() + ",明细行序号:" + sItem.getNumber() + ",生成条码!");
-			}
-		}
-	}
-
-	private String lpad(int length, String number) {
-		while (number.length() < length) {
-			number = "0" + number;
-		}
-		number = number.substring(number.length() - length, number.length());
-		return number;
-	}
-
-    /**
-     *   YYMMDD 日期格式
-     */
-    final String YYMMDD_PATTERN = "YYMMDD";
-
-    /**
-     * YYMM日期格式
-     */
-    final String YYMM_PATTERN= "YYMM";
-
-    /**
-     * MMDD日期格式
-     */
-    final String MMDD_PATTERN = "MMDD";
-
-    /**
-     * 默认数量
-     */
-    final Integer NULL_COUNT = 0;
-
-    /**
-     * 生成条码号
-     *
-     * @param pr_id
-     * @param barcodeSet
-     * @return
-     */
-	public String barcodeMethod(String pr_id, B2bCodeSet barcodeSet) {
-		StringBuffer code = new StringBuffer();
-		String date = "0";
-		String formPlat = barcodeSet.getFromplat(), dataStr = barcodeSet.getDatestr(),
-				maxdate = barcodeSet.getMaxdate();
-		int lennum = barcodeSet.getLennum().intValue(), maxnum = barcodeSet.getMaxnum().intValue(),
-				lenprid = barcodeSet.getLenprid().intValue();
-		// 拼接
-        // 平台标识
-		code.append(formPlat);
-        // PR_ID物料ID的长度
-		code.append(lpad(lenprid, pr_id));
-		if (YYMMDD_PATTERN.equals(dataStr)) {
-			SimpleDateFormat YMD = new SimpleDateFormat("yyMMdd");
-			date = YMD.format(new Date());
-		} else if (YYMM_PATTERN.equals(dataStr)) {
-			SimpleDateFormat YM = new SimpleDateFormat("yyMM");
-			date = YM.format(new Date());
-		} else if (MMDD_PATTERN.equals(dataStr)) {
-			SimpleDateFormat MD = new SimpleDateFormat("MMdd");
-			date = MD.format(new Date());
-		}
-		code.append(date);
-		barcodeSet.setMaxdate(date);
-        // 如果当前日期大于上次日期
-		if (!("").equals(maxdate) && null != maxdate && (!NULL_COUNT.equals(date))
-				&& (Integer.valueOf(maxdate) > Integer.valueOf(date))) {
-            // 流水重新开始
-			code.append(lpad(lennum, "1"));
-            // 流水号增加1
-			barcodeSet.setMaxnum((long) 2);
-		} else {
-            // 当前流水号
-			code.append(lpad(lennum, String.valueOf(maxnum)));
-            // 流水号增加1
-			barcodeSet.setMaxnum((long) (maxnum + 1));
-		}
-		b2bCodeSetDao.save(barcodeSet);
-		return code.toString();
-	}
-
-    /**
-     * 生成外箱号
-     *
-     * @param pr_id
-     * @param barcodeSet
-     * @return
-     */
-	public String outboxMethod(String pr_id, B2bCodeSet barcodeSet) {
-		StringBuffer code = new StringBuffer();
-		String date = "0";
-		String formPlat = barcodeSet.getFromplat(), dataStr = barcodeSet.getDatestr(),
-				maxdate = barcodeSet.getMaxdate();
-		int lennum = barcodeSet.getLennum().intValue(), maxnum = barcodeSet.getMaxnum().intValue(),
-				lenprid = barcodeSet.getLenprid().intValue();
-        // 平台标识
-		code.append(formPlat);
-        // PR_ID物料ID的长度
-		code.append(lpad(lenprid, pr_id));
-		if (YYMMDD_PATTERN.equals(dataStr)) {
-			SimpleDateFormat YMD = new SimpleDateFormat("yyMMdd");
-			date = YMD.format(new Date());
-		} else if (YYMM_PATTERN.equals(dataStr)) {
-			SimpleDateFormat YM = new SimpleDateFormat("yyMM");
-			date = YM.format(new Date());
-		} else if (MMDD_PATTERN.equals(dataStr)) {
-			SimpleDateFormat MD = new SimpleDateFormat("MMdd");
-			date = MD.format(new Date());
-		}
-		code.append(date);
-		barcodeSet.setMaxdate(date);
-        // 如果当前日期大于上次日期
-		if (!("").equals(maxdate) && null != maxdate && (!NULL_COUNT.equals(date))
-				&& (Integer.valueOf(maxdate) > Integer.valueOf(date))) {
-            // 流水重新开始
-			code.append(lpad(lennum, "1"));
-            // 流水号增加1
-			barcodeSet.setMaxnum((long) 2);
-		} else {
-            // 当前流水号
-			code.append(lpad(lennum, String.valueOf(maxnum)));
-            // 流水号增加1
-			barcodeSet.setMaxnum((long) (maxnum + 1));
-		}
-		b2bCodeSetDao.save(barcodeSet);
-		return code.toString();
-	}
-
-	private void insertBarPd(Long pa_id, String out_boxcode, double qty, String bar_code, SaleSendItem sItem,
-			Long enUU) {
-		BarSendNotify barSendNotify = new BarSendNotify();
-		barSendNotify.setBarcode(bar_code);
-		barSendNotify.setOutboxcode(out_boxcode);
-		barSendNotify.setOutboxid(pa_id);
-		barSendNotify.setPrintstatus("0");
-		barSendNotify.setProdcode(sItem.getOrderItem().getProduct().getCode());
-		barSendNotify.setProdid(sItem.getOrderItem().getProduct().getSourceId());
-		barSendNotify.setQty(qty);
-		barSendNotify.setSendStatus((short) Status.NOT_UPLOAD.value());
-		SaleSendItemAll sendItem = new SaleSendItemAll();
-		sendItem.setId(sItem.getId());
-		barSendNotify.setSaleSendItem(sendItem);
-		barSendNotify.setSinumber(sItem.getNumber());
-		barSendNotify.setSscode(sItem.getSend().getCode());
-		barSendNotify.setSsid(sItem.getSend().getId());
-		barSendNotify.setVendcode(enUU);
-        // 保存发货单明细中的条码
-		barSendNotifyDao.save(barSendNotify);
-
-		BarPackageDetail barPackageDetail = new BarPackageDetail();
-		barPackageDetail.setBarcode(bar_code);
-		barPackageDetail.setBarpackage(barPackageDao.findOne(pa_id));
-		barPackageDetail.setInnerqty(qty);
-        // 保存包装箱明细
-		barPackageDetailDao.save(barPackageDetail);
-	}
-
-	/**
-	 * 发货单明细条码明细生成
-	 * 
-	 * @param sItem
-	 * @param qty
-	 * @param enUU
-	 * @param barcodeSet
-	 */
-	private void insertBar(SaleSendItem sItem, double qty, Long enUU, B2bCodeSet barcodeSet) {
-		BarSendNotify barSendNotify = new BarSendNotify();
-		String bar_code = barcodeMethod(String.valueOf(sItem.getOrderItem().getProductId()), barcodeSet);
-		barSendNotify.setBarcode(bar_code);
-		barSendNotify.setPrintstatus("0");
-		barSendNotify.setProdcode(sItem.getOrderItem().getProduct().getCode());
-		barSendNotify.setProdid(sItem.getOrderItem().getProduct().getSourceId());
-		barSendNotify.setQty(qty);
-		barSendNotify.setSendStatus((short) Status.NOT_UPLOAD.value());
-		SaleSendItemAll sendItem = new SaleSendItemAll();
-		sendItem.setId(sItem.getId());
-		barSendNotify.setSaleSendItem(sendItem);
-		barSendNotify.setSinumber(sItem.getNumber());
-		barSendNotify.setSscode(sItem.getSend().getCode());
-		barSendNotify.setSsid(sItem.getSend().getId());
-		barSendNotify.setVendcode(enUU);
-        // 保存发货单明细中的条码
-		barSendNotifyDao.save(barSendNotify);
-	}
-
-	@Override
-	public List<Map<String, Object>> getPrintBarcodes(Long lpsId, List<SaleSendItem> sendItem, Long enUU) {
-		List<Map<String, Object>> list2 = new ArrayList<Map<String, Object>>();
-		String va = "";
-		String regex = "\\{(?:[A-Za-z][A-Za-z0-9_]*)\\}";
-		BarLabelPrintSetting setting = barLPSetingDao.findOne(lpsId);
-		// 获取打印明细的设置参数
-		List<Map<String, Object>> parameter = commonDao.queryForList(
-				"select la_pagesize, lp_id,lp_valuetype,lp_encode,lp_name,lp_leftrate,lp_toprate,lp_width,lp_ifshownote,lp_font,lp_size,lp_notealignjustify,lp_height from bar$labelParameter left join bar$label on la_id=lp_laid where la_id="
-						+ setting.getLabel().getId());
-		for (SaleSendItem item : sendItem) {
-			List<BarSendNotify> bars = barSendNotifyDao.findBySiid(item.getId());
-			List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
-			for (BarSendNotify barcode : bars) {
-				List<Map<String, Object>> list1 = new ArrayList<Map<String, Object>>();
-				Map<String, Object> mp1 = new HashMap<String, Object>();
-				va = setting.getSql().replaceAll(regex, String.valueOf(barcode.getId()));
-				List<Map<String, Object>> listData = commonDao.queryForList(va);
-				for (Map<String, Object> mapD : listData) {
-					for (Map<String, Object> param : parameter) {
-						mp1 = param;
-						mp1.put("value", mapD.get(param.get("lp_name")));
-						list1.add(mp1);
-					}
-				}
-				Map<String, Object> mp = new HashMap<String, Object>();
-				mp.put("store", list1);
-				list.add(mp);
-			}
-			Map<String, Object> mp = new HashMap<String, Object>();
-			mp.put("si_id", item.getId());
-			mp.put("pagesize", parameter.get(0).get("la_pagesize"));
-			mp.put("data", list);
-			list2.add(mp);
-		}
-		return list2;
-	}
-
-	@Override
-	public List<BarLabelPrintSetting> getPrintTemplate(Long id, String type) {
-		SaleSend saleSend = saleSendDao.findOne(id);
-		Long custUU = saleSend.getCustUU();
-		String caller;
-		String BAR_TYPE = "Bar";
-		if (BAR_TYPE.equals(type)) {
-			caller = "B2B!BarPrint";
-		} else {
-			caller = "B2B!OutBoxPrint";
-		}
-		List<BarLabelPrintSetting> setting = barLPSetingDao.findByEnUUAndCaller(custUU, caller);
-		if (setting.size() > 0) {
-			return setting;
-		} else {
-			throw new IllegalOperatorException("未维护相关的打印模板!");
-		}
-	}
-
-	@Override
-	public List<Map<String, Object>> getSPrintBarcode(Long lpsId, Long bsnId) {
-		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
-		String va = "";
-		String regex = "\\{(?:[A-Za-z][A-Za-z0-9_]*)\\}";
-		BarLabelPrintSetting setting = barLPSetingDao.findOne(lpsId);
-		// 获取打印明细的设置参数
-		List<Map<String, Object>> parameter = commonDao.queryForList(
-				"select la_pagesize, lp_id,lp_valuetype,lp_encode,lp_name,lp_leftrate,lp_toprate,lp_width,lp_ifshownote,lp_font,lp_size,lp_notealignjustify,lp_height from bar$labelParameter left join bar$label on la_id=lp_laid where la_id="
-						+ setting.getLabel().getId());
-		Map<String, Object> map = new HashMap<String, Object>();
-		va = setting.getSql().replaceAll(regex, String.valueOf(bsnId));
-		List<Map<String, Object>> listData = commonDao.queryForList(va);
-		for (Map<String, Object> mapD : listData) {
-			for (Map<String, Object> param : parameter) {
-				map = param;
-				map.put("value", mapD.get(param.get("lp_name")));
-				list.add(map);
-			}
-		}
-		return list;
-	}
-
-	@Override
-	public void updatePrintStatus(List<SaleSendItem> saleSendItems) {
-		List<SaleSendItem> items = new ArrayList<SaleSendItem>();
-		if (!CollectionUtils.isEmpty(saleSendItems)) {
-			for (SaleSendItem item : saleSendItems) {
-				item = saleSendItemDao.findOne(item.getId());
-				if (item != null) {
-					item.setBarPrintStatus((long) 1);
-					items.add(item);
-				}
-			}
-		}
-		saleSendItemDao.save(items);
-	}
-
-    @Override
-    public void printCount(Long id) {
-        SaleSendAll send = saleSendAllDao.findOne(id);
-        if (null == send.getPrint()) {
-        	send.setPrint((short) 1);
-		} else {
-			send.setPrint((short) (send.getPrint() + 1));
-		}
-        saleSendAllDao.save(send);
-    }
-
-	@Override
-	public Map<String, Integer> getNoticeCount(String category) {
-		List<Long> unreadIds = getUnreadIds(category);
-		Map<String, Integer> map = new HashMap<>(3);
-		// 已回复数量
-		Integer repliedCount = 0;
-		// 未回复数量
-		Integer notReplyCount = 0;
-		if (CollectionUtils.isEmpty(unreadIds)){
-			return map;
-		}
-		// 超过1000条需要拆分,不然会报错
-		if (unreadIds.size() > MAX_SIZE) {
-			List<List<Long>> idsArray = SplitArray.splitAry(unreadIds, SplitArray.QUERY_MAX_NUMBER);
-			for (List<Long> ids : idsArray) {
-				// 超过100不再查询,页面显示99+,减少服务器负担
-				if (repliedCount < 100) {
-					repliedCount = repliedCount + purchaseNoticeDao.findRepliedId(ids).size();
-				}
-				if (notReplyCount < 100) {
-					notReplyCount = notReplyCount + purchaseNoticeDao.findNotReplyId(ids).size();
-				}
-				// 当需要查询的数量大于99时停止循环,减少不必要的操作
-				if (notReplyCount > 99 && repliedCount > 99) {
-					break;
-				}
-			}
-		} else {
-			repliedCount = repliedCount + purchaseNoticeDao.findRepliedId(unreadIds).size();
-			notReplyCount = notReplyCount + purchaseNoticeDao.findNotReplyId(unreadIds).size();
-		}
-		map.put("replied", repliedCount);
-		map.put("notReply", notReplyCount);
-		map.put("all", repliedCount + notReplyCount);
-		return map;
-	}
-
-    @Override
-    public SPage<PurchaseNotice> findDoneNoticesByPageInfo(final PageInfo pageInfo, String keyword, final SearchFilter filter) {
-        Page<PurchaseNotice> notices = purchaseNoticeDao.findAll(new Specification<PurchaseNotice>() {
-            @Override
-            public Predicate toPredicate(Root<PurchaseNotice> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
-                if (filter != null) {
-                    if (!CollectionUtils.isEmpty(filter.getDistribute())) {
-                        pageInfo.expression(PredicateUtils.in("enUU", filter.getDistribute(), false));
-                    }
-                    if (filter.getFromDate() != null) {
-                        pageInfo.expression(PredicateUtils.gte("date", new Date(filter.getFromDate()), false));
-                    }
-                    if (filter.getEndDate() != null) {
-                        pageInfo.expression(PredicateUtils.lte("date", new Date(filter.getEndDate()), false));
-                    }
-                }
-                pageInfo.expression(
-                        PredicateUtils.or(PredicateUtils.isNull("end"), PredicateUtils.ne("end", Constant.YES, false)));
-                return query.where(pageInfo.getPredicates(root, query, builder)).getRestriction();
-            }
-        }, pageInfo);
-        return SPageUtils.covertSPage(notices);
-    }
-
-    /**
-     * 查询未阅读数量
-     *
-     * @param category 表名
-     * @return
-     */
-    @Override
-	public List<Long> getUnreadIds(String category) {
-		return userOrderDao.getUnreadIds(SystemSession.getUser().getEnterprise().getUu(), SystemSession.getUser().getUserUU(), "purc$notice", category);
-	}
-
-    /**
-     * 查询发货提醒
-     *
-     * @param pageInfo 分页信息
-     * @param keyword  关键字
-     * @param filter   过滤条件
-     * @return
-     */
-    @Override
-    public SPage<PurchaseNotice> findAllNoticesByPageInfo(final PageInfo pageInfo, String keyword, final SearchFilter filter) {
-		if (filter != null) {
-			if (!CollectionUtils.isEmpty(filter.getDistribute())) {
-				pageInfo.expression(PredicateUtils.in("enUU", filter.getDistribute(), false));
-			}
-			if (filter.getFromDate() != null) {
-				pageInfo.expression(PredicateUtils.gte("date", new Date(filter.getFromDate()), false));
-			}
-			if (filter.getEndDate() != null) {
-				pageInfo.expression(PredicateUtils.lte("date", new Date(filter.getEndDate()), false));
-			}
-		}
-		pageInfo.expression(PredicateUtils.isNull("end"));
-        Page<PurchaseNotice> notices = purchaseNoticeDao.findAll(new Specification<PurchaseNotice>() {
-            @Override
-            public Predicate toPredicate(Root<PurchaseNotice> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
-                List<Predicate> predicatesList = new ArrayList<Predicate>();
-                if (!StringUtils.isEmpty(keyword)) {
-					Predicate custName = builder.like(root.get("orderItem").get("order").get("enterprise").get("enName"), "%" + keyword+ "%");
-                    if (keyword.matches(SearchUtils.UU_REGEXP)) {
-                        Predicate custUU = builder.like(root.get("orderItem").get("order").get("enterprise").get("uu"), "%" + keyword+ "%");
-                        builder.or(custUU);
-                    }
-					Predicate productCode = builder.like(root.get("orderItem").get("productCode"), "%" + keyword+ "%");
-                    Predicate productTitle = builder.like(root.get("orderItem").get("productTitle"), "%" + keyword+ "%");
-                    Predicate productSpec = builder.like(root.get("orderItem").get("productSpec"), "%" + keyword+ "%");
-                    Predicate orderCode = builder.like(root.get("orderItem").get("order").get("code"), "%" + keyword+ "%");
-                    predicatesList.add(builder.or(custName, productCode, productTitle, productSpec, orderCode));
-				}
-                Predicate[] predicates = pageInfo.getPredicates(root, query, builder);
-                Arrays.stream(predicates).forEach(predicate -> {
-                    predicatesList.add(predicate);
-                });
-                return builder.and(predicatesList.toArray(new Predicate[predicatesList.size()]));
-            }
-        }, pageInfo);
-        return SPageUtils.covertSPage(notices);
-    }
-
-    /**
-     * 按条件查询发货提醒
-     *
-     * @param pageInfo  分页信息,过滤条件
-     * @param keyword   搜索词
-     * @param filter    过滤条件
-     * @param state 状态
-     * @return SPage封装的数据
-     */
-    @Override
-    public SPage<PurchaseNotice> findNoticesByPageInfo(PageInfo pageInfo, String keyword, SearchFilter filter, String state) {
-        // 根据状态设置其他条件
-        setState(pageInfo, state, filter);
-        if (filter != null) {
-            if (!CollectionUtils.isEmpty(filter.getDistribute())) {
-                pageInfo.expression(PredicateUtils.in("enUU", filter.getDistribute(), false));
-            }
-            if (filter.getFromDate() != null) {
-                pageInfo.expression(PredicateUtils.gte("date", new Date(filter.getFromDate()), false));
-            }
-            if (filter.getEndDate() != null) {
-                pageInfo.expression(PredicateUtils.lte("date", new Date(filter.getEndDate()), false));
-            }
-        }
-        Page<PurchaseNotice> notices = purchaseNoticeDao.findAll(new Specification<PurchaseNotice>() {
-            @Override
-            public Predicate toPredicate(Root<PurchaseNotice> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
-                List<Predicate> predicatesList = new ArrayList<Predicate>();
-                if (!StringUtils.isEmpty(keyword)) {
-                    Predicate custName = builder.like(root.get("orderItem").get("order").get("enterprise").get("enName"), "%" + keyword+ "%");
-                    if (keyword.matches(SearchUtils.UU_REGEXP)) {
-                        Predicate custUU = builder.like(root.get("orderItem").get("order").get("enterprise").get("uu"), "%" + keyword+ "%");
-                        builder.or(custUU);
-                    }
-                    Predicate productCode = builder.like(root.get("orderItem").get("productCode"), "%" + keyword+ "%");
-                    Predicate productTitle = builder.like(root.get("orderItem").get("productTitle"), "%" + keyword+ "%");
-                    Predicate productSpec = builder.like(root.get("orderItem").get("productSpec"), "%" + keyword+ "%");
-                    Predicate orderCode = builder.like(root.get("orderItem").get("order").get("code"), "%" + keyword+ "%");
-                    predicatesList.add(builder.or(custName, productCode, productTitle, productSpec, orderCode));
-                }
-                Predicate[] predicates = pageInfo.getPredicates(root, query, builder);
-                Arrays.stream(predicates).forEach(predicate -> {
-                    predicatesList.add(predicate);
-                });
-                return builder.and(predicatesList.toArray(new Predicate[predicatesList.size()]));
-            }
-        }, pageInfo);
-        return SPageUtils.covertSPage(notices);
-    }
-
-    /**
-     * 封装相关查询条件
-     *
-     * @param pageInfo 分页参数
-     * @param state 状态
-     *              <pre>
-     *              _todo : 待发货
-     *              done: 已发货
-     *              end: 已取消
-     *              </pre>
-     * @param filter 过滤条件
-     */
-    private void setState(PageInfo pageInfo, String state, SearchFilter filter) {
-        pageInfo.filter("vendUU", SystemSession.getUser().getEnterprise().getUu());
-        SearchFilter distribute = userService.distribute();
-        if (distribute != null && !CollectionUtils.isEmpty(distribute.getDistribute())) {
-            List<Object> list = new ArrayList<>();
-            list.addAll(distribute.getDistribute());
-            filter.setDistribute(list);
-        }
-        if (SearchUtils.TODO_STATE.equals(state)) {
-            pageInfo.expression(PredicateUtils.or(PredicateUtils.isNull("end"), PredicateUtils.eq("end", Constant.NO, false)));
-            pageInfo.filter("status", (short)Status.NOT_REPLY.value());
-            pageInfo.filter("waiting", Constant.NO);
-        } else if (SearchUtils.DONE_STATE.equals(state)) {
-            pageInfo.expression(PredicateUtils.or(PredicateUtils.isNull("end"), PredicateUtils.eq("end", Constant.NO, false)));
-            pageInfo.filter("status", (short)Status.REPLIED.value());
-        } else if (SearchUtils.END_STATE.equals(state)) {
-            pageInfo.filter("end", Constant.YES);
-        } else if (SearchUtils.WAITING_STATE.equals(state)) {
-            pageInfo.filter("waiting", Constant.YES);
-			pageInfo.expression(PredicateUtils.or(PredicateUtils.isNull("end"), PredicateUtils.eq("end", Constant.NO, false)));
-        }
-    }
-
-    @Override
-	@Transactional(rollbackFor = Exception.class)
-	public void setReadByOrder(String category, Long[] sourceId) {
-		userOrderDao.setReadStatus(SystemSession.getUser().getEnterprise().getUu(), SystemSession.getUser().getUserUU(), "purc$notice", category, (short) Status.READ.value(), sourceId);
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public Integer setReadByState(String category) {
-		List<Long> unreadIds = getUnreadIds(category);
-		Integer deleteCount = 0;
-		if (CollectionUtils.isEmpty(unreadIds)){
-			return deleteCount;
-		}
-		List<Long> repliedIds = null;
-		if (unreadIds.size() > MAX_SIZE) {
-			List<List<Long>> idsArray = SplitArray.splitAry(unreadIds, SplitArray.QUERY_MAX_NUMBER);
-			for (List<Long> ids : idsArray) {
-				repliedIds = purchaseNoticeDao.findRepliedId(ids);
-				if (repliedIds.size() != 0) {
-					deleteCount = deleteCount + userOrderDao.delete(SystemSession.getUser().getEnterprise().getUu(),
-							SystemSession.getUser().getUserUU(), "purc$notice", category, repliedIds.toArray(new Long[repliedIds.size()]));
-				}
-			}
-		} else {
-			repliedIds = purchaseNoticeDao.findRepliedId(unreadIds);
-			if (repliedIds.size() != 0) {
-				deleteCount = deleteCount + userOrderDao.delete(SystemSession.getUser().getEnterprise().getUu(),
-						SystemSession.getUser().getUserUU(), "purc$notice", category, repliedIds.toArray(new Long[repliedIds.size()]));
-			}
-		}
-		return deleteCount;
-	}
-
-    /**
-     * 通过ids查询发货信息
-     *
-     * @param ids
-     * @return
-     */
-    @Override
-    public List<PurchaseNotice> findByIds(List<Long> ids) {
-        return purchaseNoticeDao.findAll(ids);
-    }
-}
+package com.uas.platform.b2b.service.impl;
+
+import com.uas.platform.b2b.core.util.ContextUtils;
+import com.uas.platform.b2b.core.util.SplitArray;
+import com.uas.platform.b2b.core.util.ThreadTask;
+import com.uas.platform.b2b.dao.*;
+import com.uas.platform.b2b.erp.model.PurchaseNotify;
+import com.uas.platform.b2b.event.SaleSendAcceptReleaseEvent;
+import com.uas.platform.b2b.model.*;
+import com.uas.platform.b2b.ps.service.PersonalProductService;
+import com.uas.platform.b2b.search.SearchService;
+import com.uas.platform.b2b.service.PurchaseNoticeService;
+import com.uas.platform.b2b.service.UserService;
+import com.uas.platform.b2b.support.*;
+import com.uas.platform.core.exception.IllegalOperatorException;
+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.Status;
+import com.uas.platform.core.persistence.criteria.PredicateUtils;
+import com.uas.search.b2b.model.SPage;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 发货提醒
+ *
+ * @author US50
+ */
+@Service
+public class PurchaseNoticeServiceImpl implements PurchaseNoticeService {
+
+	private final static UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
+
+	@Autowired
+	private PurchaseNoticeDao purchaseNoticeDao;
+
+	@Autowired
+	private SaleSendDao saleSendDao;
+
+	@Autowired
+	private SaleSendItemDao saleSendItemDao;
+
+	@Autowired
+	private SaleSendAllDao saleSendAllDao;
+
+	@Autowired
+	private SaleSendItemVerifyDao saleSendItemVerifyDao;
+
+	@Autowired
+	private B2bCodeSetDao b2bCodeSetDao;
+
+	@Autowired
+	private BarPackageDao barPackageDao;
+
+	@Autowired
+	private BarSendNotifyDao barSendNotifyDao;
+
+	@Autowired
+	private BarPackageDetailDao barPackageDetailDao;
+
+	@Autowired
+	private CommonDao commonDao;
+
+	@Autowired
+	private BarLPSetingDao barLPSetingDao;
+
+	@Autowired
+	private SearchService searchService;
+
+	@Autowired
+	private DistributeDao distributeDao;
+
+	@Autowired
+	private  RoleDao roleDao;
+
+	@Autowired
+	private  UserOrderDao userOrderDao;
+
+	@Autowired
+	private  UserDao userDao;
+
+	@Autowired
+	private VendorDao vendorDao;
+
+	@Autowired
+    private PersonalProductService personalProductService;
+
+	@Autowired
+	private PurchaseNoticeEndDao noticeEndDao;
+
+	@Autowired
+	private EnterpriseDao enterpriseDao;
+
+	@Autowired
+    private UserService userService;
+
+    /**
+     * 最多数量
+     */
+    final Integer MAX_SIZE = 1000;
+
+	@Override
+	public List<PurchaseNotice> save(List<PurchaseNotice> notices) {
+		notices = purchaseNoticeDao.save(notices);
+		saveUserOrders(notices);
+		return notices;
+	}
+
+	private void saveUserOrders(final List<PurchaseNotice> notices) {
+
+		ThreadTask.getInstance().execute(new Runnable() {
+			@Override
+			public void run() {
+                /* 添加供应商的阅读记录*/
+				for(PurchaseNotice notice : notices) {
+					Set<Long> userUUs = new HashSet<>();
+					// 添加管理员
+					List<Role> roles = roleDao.findByEnUUAndIssys(notice.getVendUU(), Constant.YES);
+					if (!CollectionUtils.isEmpty(roles)) {
+						List<User> admins = userDao.findByRole(roles.get(0).getId());
+						for (User admin : admins) {
+							if (!userUUs.contains(admin.getUserUU())) {
+								userUUs.add(admin.getUserUU());
+							}
+						}
+					}
+					List<Vendor> vendors = vendorDao.findByMyEnUUAndVendUU(notice.getEnUU(), notice.getVendUU());
+					// 查找有权限的用户
+					if (!CollectionUtils.isEmpty(vendors)) {
+						Long vendorId = vendors.get(0).getId();
+						List<Distribute> distributes = distributeDao.findByVendorId(vendorId);
+						if (!CollectionUtils.isEmpty(distributes)) {
+							for (Distribute distribute : distributes) {
+								if (!userUUs.contains(distribute.getUserUU())) {
+									userUUs.add(distribute.getUserUU());
+								}
+							}
+						}
+					}
+					UserOrders userOrders;
+					List<UserOrders> list = new ArrayList<>();
+					for (Long userUU : userUUs) {
+						if (userUU == null) {
+							continue;
+						}
+						userOrders = new UserOrders(userUU, notice.getVendUU(), notice.getId(), "sale", "purc$notice");
+						list.add(userOrders);
+					}
+
+                    /* 添加采购员的阅读记录*/
+                    if (notice.getOrderItem().getOrder().getUserUU() != null) {
+                        userOrders = new UserOrders(notice.getOrderItem().getOrder().getUserUU(), notice.getEnUU(), notice.getId(), "purc", "purc$notice");
+						userOrders.setReadStatus((short) Status.READ.value());
+                        list.add(userOrders);
+                    }
+					userOrderDao.save(list);
+				}
+			}
+		});
+	}
+
+	@Override
+	public Page<PurchaseNotice> findAllByPageInfo(final PageInfo pageInfo, final String keyword, final Long fromDate,
+			final Long endDate, final SearchFilter filter) {
+		return purchaseNoticeDao.findAll(new Specification<PurchaseNotice>() {
+			@Override
+			public Predicate toPredicate(Root<PurchaseNotice> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
+				if (filter != null) {
+					if (!CollectionUtils.isEmpty(filter.getDistribute())) {
+						pageInfo.expression(PredicateUtils.in("enUU", filter.getDistribute(), false));
+					}
+				}
+				if (StringUtils.hasText(keyword)) {
+					List<Object> lists = new ArrayList<>();
+					List<PurchaseNotice> listss = searchService.searchPurchaseNoticeIds(keyword, null).getContent();
+					for (PurchaseNotice list : listss) {
+						lists.add(list.getId());
+					}
+					pageInfo.expression(PredicateUtils.in("id", lists, false));
+				}
+				if (fromDate != null) {
+					pageInfo.expression(PredicateUtils.in("id", purchaseNoticeDao.findByFromDate(
+							SystemSession.getUser().getEnterprise().getUu(), new Date(fromDate)), false));
+				}
+				if (endDate != null) {
+					pageInfo.expression(PredicateUtils.in("id", purchaseNoticeDao
+							.findByEndDate(SystemSession.getUser().getEnterprise().getUu(), new Date(endDate)), false));
+				}
+				return query.where(pageInfo.getPredicates(root, query, builder)).getRestriction();
+			}
+		}, pageInfo);
+	}
+
+    @Override
+	public Page<PurchaseNotice> findDoneByPageInfo(final PageInfo pageInfo, final String keyword, final Long fromDate,
+			final Long endDate) {
+		return purchaseNoticeDao.findAll(new Specification<PurchaseNotice>() {
+			@Override
+			public Predicate toPredicate(Root<PurchaseNotice> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
+				pageInfo.filter("status", Status.REPLIED.value());
+				pageInfo.expression(
+						PredicateUtils.or(PredicateUtils.isNull("end"), PredicateUtils.ne("end", Constant.YES, false)));
+				if (StringUtils.hasText(keyword)) {
+					List<Object> lists = new ArrayList<>();
+					List<PurchaseNotice> listss = searchService.searchPurchaseNoticeIds(keyword, null).getContent();
+					for (PurchaseNotice list : listss) {
+						lists.add(list.getId());
+					}
+					pageInfo.expression(PredicateUtils.in("id", lists, false));
+				}
+				if (fromDate != null) {
+					pageInfo.expression(PredicateUtils.in("id", purchaseNoticeDao.findByFromDate(
+							SystemSession.getUser().getEnterprise().getUu(), new Date(fromDate)), false));
+				}
+				if (endDate != null) {
+					pageInfo.expression(PredicateUtils.in("id", purchaseNoticeDao
+							.findByEndDate(SystemSession.getUser().getEnterprise().getUu(), new Date(endDate)), false));
+				}
+				return query.where(pageInfo.getPredicates(root, query, builder)).getRestriction();
+			}
+		}, pageInfo);
+	}
+
+	@Override
+	public PurchaseNotice findById(Long id) {
+		return purchaseNoticeDao.findOne(id);
+	}
+
+	@Override
+	public void send(List<SaleSendItem> sendItems) {
+		saleSendItemDao.save(sendItems);
+		for (SaleSendItem item : sendItems) {
+			if (item.getNoticeId() != null) {
+			    Double sendQty = saleSendItemDao.getSendQtyByNoticeId(item.getNoticeId());
+				purchaseNoticeDao.updateBySend(item.getNoticeId(), sendQty);
+                logger.log("更新发货提醒发货数量", "ERP主动收料通知单/上传发货单更新发货提醒已发货数量",
+                        "发货单: " + item.getNoticeId() + ",更新数量: " + sendQty);
+				// 更新发货状态
+				updateNoticeStatus(item.getNoticeId());
+			}
+		}
+	}
+
+	@Override
+	public List<SaleSendItem> findSendById(long noticeId) {
+		return saleSendItemDao.findByNoticeId(noticeId);
+	}
+
+	@Override
+	public List<PurchaseNotice> findNotUploadNotice() {
+		return purchaseNoticeDao.findByVendUUAndSendStatus(SystemSession.getUser().getEnterprise().getUu(),
+				(short) Status.NOT_UPLOAD.value());
+	}
+
+	@Override
+	public void onNoticeDownSuccess(String[] idArray) {
+		for (String id : idArray) {
+			PurchaseNotice notice = purchaseNoticeDao.findOne(Long.parseLong(id));
+			if (notice != null) {
+				notice.setSendStatus((short) Status.DOWNLOADED.value());
+				purchaseNoticeDao.save(notice);
+			}
+		}
+	}
+
+	@Override
+	public List<SaleSend> findNotUploadSend() {
+		return saleSendDao.findByCustUUAndSendStatus(SystemSession.getUser().getEnterprise().getUu(),
+				(short) Status.NOT_UPLOAD.value());
+	}
+
+	@Override
+	public List<SaleSend> findNotUploadSendEDI(Long enUU) {
+		return saleSendDao.findByCustUUAndSendStatus(enUU,
+				(short) Status.NOT_UPLOAD.value());
+	}
+
+	@Override
+	public List<SaleSend> findNotSendSend() {
+		return saleSendDao.findByEnUUAndBackStatus(SystemSession.getUser().getEnterprise().getUu(),
+				(short) Status.NOT_UPLOAD.value());
+	}
+
+	@Override
+	public void onSendUploadSuccess(String[] idArray) {
+		for (String id : idArray) {
+			SaleSend send = saleSendDao.findOne(Long.parseLong(id));
+			if (send != null) {
+				send.setSendStatus((short) Status.DOWNLOADED.value());
+				saleSendDao.save(send);
+			}
+		}
+	}
+
+	@Override
+	public void onSendDownSuccess(String[] idArray) {
+		for (String id : idArray) {
+			SaleSend send = saleSendDao.findOne(Long.parseLong(id));
+			if (send != null) {
+				send.setBackStatus((short) Status.DOWNLOADED.value());
+				saleSendDao.save(send);
+			}
+		}
+	}
+
+	@Override
+	public void end(List<PurchaseNotify> notifies) {
+		long enUU = SystemSession.getUser().getEnterprise().getUu();
+		List<PurchaseNoticeEnd> noticeList = noticeEndDao.findByEnUUAndSourceIdList(enUU, CollectionUtil.getKeyCollection(notifies));
+		if (!CollectionUtils.isEmpty(noticeList)) {
+		    for (PurchaseNoticeEnd notice : noticeList) {
+                notice.setEnd(Constant.YES);
+                notice.setEndStatus((short) Status.NOT_UPLOAD.value());
+                notice.setErpDate(new Date(System.currentTimeMillis()));
+            }
+        }
+        noticeEndDao.save(noticeList);
+	}
+
+	@Override
+	public List<PurchaseNotice> findNotSendEnd() {
+		return purchaseNoticeDao.findByVendUUAndEndStatus(SystemSession.getUser().getEnterprise().getUu(),
+				(short) Status.NOT_UPLOAD.value());
+	}
+
+	@Override
+	public void onEndDownSuccess(String[] idArray) {
+		for (String id : idArray) {
+			PurchaseNoticeEnd noticeEnd = noticeEndDao.findOne(Long.parseLong(id));
+			if (noticeEnd != null) {
+                noticeEnd.setEndStatus((short) Status.DOWNLOADED.value());
+                noticeEndDao.save(noticeEnd);
+			}
+		}
+	}
+
+	@Override
+	public SaleSend send(Long noticeId, SaleSend send) {
+		PurchaseNotice notice = purchaseNoticeDao.findOne(noticeId);
+		List<SaleSend> sends = saleSendDao.findByUuid(send.getUuid());
+		//限制同一个供应商给同一个客户发货单号不可以重复,(避免一次发货产生多张单)
+		if (notice != null && CollectionUtils.isEmpty(sends)) {
+			if (notice.getEnd() != null && notice.getEnd() == Constant.YES) {
+				throw new IllegalOperatorException("客户已经取消了本次送货提醒,请刷新重试!");
+			}
+			double thisQty = 0;
+			for (SaleSendItem item : send.getSendItems()) {
+				thisQty += item.getQty();
+			}
+			double endQty = (notice.getEndQty() == null ? 0.0 : notice.getEndQty()) + thisQty;
+			if (endQty > notice.getQty()) {
+				throw new IllegalOperatorException("累计发货数量将超出本次送货提醒的需求数!");
+			}
+			PurchaseOrder order = notice.getOrderItem().getOrder();
+			send.setCurrency(order.getCurrency());
+			send.setBackStatus((short) Status.NOT_UPLOAD.value());
+			send.setSendStatus((short) Status.NOT_UPLOAD.value());
+			// 未收料
+			send.setVerifystatus(Constant.NO);
+			send.setCustUU(notice.getEnUU());
+			if (!StringUtils.isEmpty(notice.getOrderItem().getCustPurchaseCode())) {
+				send.setCustUserUU(enterpriseDao.findOne(notice.getEnUU()).getEnAdminuu());
+			} else {
+				send.setCustUserUU(order.getUserUU());
+			}
+			send.setDate(new Date());
+			send.setEnUU(SystemSession.getUser().getEnterprise().getUu());
+			send.setPayments(order.getPayments());
+			send.setRate(order.getRate());
+			send.setRecorder(SystemSession.getUser().getUserName());
+			short number = 0;
+			for (SaleSendItem item : send.getSendItems()) {
+				item.setNoticeId(noticeId);
+				item.setNotice(notice);
+				item.setNumber(++number);
+				item.setOrderItem(notice.getOrderItem());
+				item.setOrderItemId(notice.getOrderItem().getId());
+				item.setPrice(notice.getOrderItem().getPrice());
+				item.setSend(send);
+			}
+			List<SaleSendItem> sendItems = saleSendItemDao.save(send.getSendItems());
+			notice.setEndQty(endQty);
+			notice.setStatus((short) (endQty == notice.getQty() ? Status.REPLIED.value() : Status.NOT_REPLY.value()));
+			purchaseNoticeDao.save(notice);
+			if (!CollectionUtils.isEmpty(sendItems)) {
+				List<SaleSend> saleSends = new ArrayList<SaleSend>();
+				saleSends.add(sendItems.get(0).getSend());
+			}
+			// 我的产品库更新
+            personalProductService.covertPersonalProduct(notice.getOrderItem().getProductId(), "单个发货");
+			return sendItems.get(0).getSend();
+		} else {
+			throw new IllegalOperatorException("请对有效的送货提醒发货!");
+		}
+	}
+
+    @Override
+	public int getOnhandCount() {
+		return purchaseNoticeDao.getCountByVendUUAndStatus(SystemSession.getUser().getEnterprise().getUu(),
+				(short) Status.NOT_REPLY.value());
+	}
+
+	@Override
+	public SaleSend send(SaleSend saleSend) {
+		//限制同一个供应商给同一个客户发货单号不可以重复,(避免一次发货产生多张单),存在时不做处理
+		List<SaleSend> sendList = saleSendDao.findByUuid(saleSend.getUuid());
+		if (saleSend != null && CollectionUtils.isEmpty(sendList)) {
+			saleSend.setBackStatus((short) Status.NOT_UPLOAD.value());
+			saleSend.setSendStatus((short) Status.NOT_UPLOAD.value());
+			saleSend.setEnUU(SystemSession.getUser().getEnterprise().getUu());
+			saleSend.setRecorder(SystemSession.getUser().getUserName());
+			saleSend.setDate(new Date());
+            // 未收料
+			saleSend.setVerifystatus(Constant.NO);
+			short number = 0;
+			List<SaleSendItem> sendItems = new ArrayList<SaleSendItem>();
+			for (SaleSendItem item : saleSend.getSendItems()) {
+				PurchaseNotice notice = purchaseNoticeDao.findOne(item.getNoticeId());
+				if (notice != null) {
+					if (notice.getEnd() != null && notice.getEnd() == Constant.YES) {
+						String error = "货车中订单:" + notice.getOrderItem().getOrder().getCode() + "的物料号为"
+								+ notice.getOrderItem().getProduct().getCode() + "的发货通知被取消!";
+						throw new IllegalOperatorException(error);
+					} else {
+						double thisQty = item.getQty();
+						double endQty = (notice.getEndQty() == null ? 0.0 : notice.getEndQty()) + thisQty;
+						if (endQty > notice.getQty()) {
+							throw new IllegalOperatorException("累计发货数量将超出本次送货提醒的需求数!");
+						}
+						item.setNotice(notice);
+                        // 带了序号则不重设序号,不带这重设序号
+						if (item.getNumber() == null || item.getNumber() == 0) {
+							item.setNumber(++number);
+						}
+						item.setOrderItem(notice.getOrderItem());
+						item.setOrderItemId(notice.getOrderItemId());
+						saleSend.setRate(notice.getOrderItem().getOrder().getRate());
+						item.setSend(saleSend);
+						sendItems.add(item);
+					}
+				} else {
+					throw new IllegalOperatorException("参数错误,无效的客户送货提醒单!");
+				}
+
+			}
+			sendItems = saleSendItemDao.save(sendItems);
+			for (SaleSendItem sendItem : sendItems) {
+				PurchaseNotice notice = purchaseNoticeDao.findOne(sendItem.getNoticeId());
+				double endQty = (notice.getEndQty() == null ? 0.0 : notice.getEndQty()) + sendItem.getQty();
+				if (endQty > notice.getQty()) {
+					throw new IllegalOperatorException("累计发货数量将超出本次送货提醒的需求数!");
+				}
+				notice.setEndQty(endQty);
+				notice.setStatus(
+						(short) (endQty == notice.getQty() ? Status.REPLIED.value() : Status.NOT_REPLY.value()));
+				purchaseNoticeDao.save(notice);
+                // 转入我的物料库
+                personalProductService.covertPersonalProduct(notice.getOrderItem().getProductId(), "批量发货");
+			}
+			if (!CollectionUtils.isEmpty(sendItems)) {
+				List<SaleSend> saleSends = new ArrayList<SaleSend>();
+				saleSends.add(sendItems.get(0).getSend());
+			}
+			return sendItems.get(0).getSend();
+		} else {
+			throw new IllegalArgumentException();
+		}
+	}
+
+	@Override
+	public void onSaleSendChange(List<SaleSendItem> sendItems) {
+		for (SaleSendItem item : sendItems) {
+			saleSendItemDao.updateByReply(item.getId(), item.getQty(), item.getReplyRemark());
+			if (item.getNoticeId() != null) {
+			    Double sendQty = saleSendItemDao.getSendQtyByNoticeId(item.getNoticeId());
+				purchaseNoticeDao.updateBySend(item.getNoticeId(), sendQty);
+                logger.log("更新发货提醒发货数量", "ERP上传收料通知的确认数量更新发货提醒已发货数量",
+                        "发货单: " + item.getNoticeId() + ",更新数量: " + sendQty);
+                updateNoticeStatus(item.getNoticeId());
+			}
+		}
+	}
+
+    /**
+     * 更新发货提醒状态
+     *
+     * @param noticeId 发货提醒id
+     */
+    private void updateNoticeStatus(Long noticeId) {
+        PurchaseNotice notice = purchaseNoticeDao.findOne(noticeId);
+        if (notice.getEndQty() < notice.getQty() && notice.getStatus() == Status.REPLIED.value()) {
+            purchaseNoticeDao.updateStatus(notice.getId(), (short) Status.NOT_REPLY.value());
+        }
+    }
+
+    @Override
+	public List<PurchaseNotice> findById(Long[] ids) {
+		return purchaseNoticeDao.findUnEndByIds(ids);
+	}
+
+	@Override
+	public void onVerify(List<SaleSendItemVerify> verifies) {
+		verifies = saleSendItemVerifyDao.save(verifies);
+		List<SaleSendItem> saleSendItems = new ArrayList<>();
+		for (SaleSendItemVerify verify : verifies) {
+			saleSendItemDao.updateByVerify(verify.getSendItemId());
+			updateVerifyStatus(verify.getSendItemId());
+			SaleSendItem item = saleSendItemDao.findOne(verify.getSendItemId());
+			saleSendItems.add(item);
+		}
+		// 买家收料之后给卖家发消息
+		ContextUtils.publishEvent(new SaleSendAcceptReleaseEvent(SaleSendItem.distinct(saleSendItems)));
+	}
+
+	@Override
+	public void unVerify(List<SaleSendItemVerify> verifies) {
+		saleSendItemVerifyDao.delete(verifies);
+		for (SaleSendItemVerify verify : verifies) {
+			saleSendItemDao.updateByVerify(verify.getSendItemId());
+			updateVerifyStatus(verify.getSendItemId());
+		}
+	}
+
+	/**
+	 * 更新发货单的收料状态
+	 * 
+	 * @param sendItemId
+	 */
+	private void updateVerifyStatus(Long sendItemId) {
+		SaleSendItem sendItem = saleSendItemDao.findOne(sendItemId);
+		int totalCount = saleSendItemDao.getTotalCountBySendId(sendItem.getSend().getId());
+		int verifyCount = saleSendItemDao.getFullVerifyCountBySendId(sendItem.getSend().getId());
+		if (verifyCount == totalCount) {
+			sendItem.getSend().setVerifystatus(Constant.YES);
+		} else {
+			sendItem.getSend().setVerifystatus(Constant.NO);
+		}
+		saleSendItemDao.save(sendItem);
+	}
+
+	@Override
+	public SaleSendAll findSaleSendById(Long id) {
+		SaleSendAll send = saleSendAllDao.findOne(id);
+		if (send == null) {
+			throw new IllegalOperatorException("您查找的发货单不存在!");
+		}
+		return send;
+	}
+
+	@Override
+	public Long getAllCount() {
+		return purchaseNoticeDao.countByVendUU(SystemSession.getUser().getEnterprise().getUu());
+	}
+
+	@Override
+	public Long getAllNoticeCountByEnUU(Long enUU) {
+		return purchaseNoticeDao.getCountByEnUUAndStatus(enUU, (short) Status.REPLIED.value());
+	}
+
+	@Override
+	public Long getTodoNoticeCountByEnUU(Long enUU) {
+		return purchaseNoticeDao.getCountByEnUUAndStatus(enUU, (short) Status.NOT_REPLY.value());
+	}
+
+	@Override
+	public Long getWatingNoticeCountByEnUU(Long enUU) {
+		return purchaseNoticeDao.getWatingCountByEnUUAndStatus(enUU);
+	}
+
+	@Override
+	public Long getEndNoticeCountByEnUU(Long enUU) {
+		return purchaseNoticeDao.getEndCountByEnUUAndStatus(enUU);
+	}
+
+	@Override
+	public void updateBarCode(Long id, Double packageQty, Double outBoxQty) {
+		saleSendItemDao.updatePackageQty(id, packageQty, outBoxQty);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void generateBarcodes(Long id, List<SaleSendItem> sendItem, Long enUU) {
+		SaleSend saleSend = saleSendDao.findOne(id);
+		Long custUU = saleSend.getCustUU();
+		// 获取条码生成规则,判断规则是否审核,已审核,根据规则拼接
+		B2bCodeSet barcodeSet = b2bCodeSetDao.findByEnUUAndType(custUU, "BATCH");
+        // 条码生成规则不为空,已审核
+		if (barcodeSet != null) {
+			if (!"AUDITED".equals(barcodeSet.getStatuscode())) {
+				throw new IllegalOperatorException("请先审核条码生成规则!");
+			}
+		} else {
+			throw new IllegalOperatorException("请先维护条码生成规则!");
+		}
+		// 是否维护包装箱生成规则
+		B2bCodeSet outboxSet = b2bCodeSetDao.findByEnUUAndType(custUU, "PACK");
+		if (outboxSet == null) {
+			throw new IllegalOperatorException("请先维护外箱生成规则!");
+		}
+		String AUDITED_STATUS = "AUDITED";
+		if (!AUDITED_STATUS.equals(outboxSet.getStatuscode())) {
+			throw new IllegalOperatorException("请先审核外箱生成规则!");
+		}
+		for (SaleSendItem item : sendItem) {
+			// 清空原有箱号,箱号明细,条码
+			List<BarSendNotify> bsNotify = barSendNotifyDao.findBySiid(item.getId());
+			for (BarSendNotify notify : bsNotify) {
+				if (notify.getOutboxid() != null) {
+					BarPackage barPackage = barPackageDao.findOne(notify.getOutboxid());
+					if (barPackage != null) {
+						barPackageDetailDao.delete(barPackage.getDetail());
+						barPackageDao.delete(barPackage);
+					}
+				}
+			}
+			barSendNotifyDao.deleteAllBySiid(item.getId());
+			// 获取明细,最小包装数,外箱容量等信息
+			SaleSendItem sItem = saleSendItemDao.findOne(item.getId());
+			double pQty = sItem.getPackageQty(), bQty = sItem.getOutBoxQty(), qty = sItem.getQty();
+			String bar_code, pr_code = sItem.getOrderItem().getProduct().getCode();
+            // 最小包装数件数
+			int aNum = (int) (qty / pQty);
+			double aqtyA = (new BigDecimal(Double.toString(qty))).subtract(new BigDecimal(Double.toString(aNum * pQty)))
+					.doubleValue(); // 小于最小包装数的
+            // ERP中对应的物料ID
+			String sourceId = String.valueOf(sItem.getOrderItem().getProduct().getSourceId());
+			// 获取是否勾选了生成外箱
+			if (item.getIsOutboxChecked()) {
+				// 判断外箱容量是否为最小包装数的整数倍
+				String out_boxcode = null;
+				Long pa_id = null;
+                // 每箱件数
+				int sumJ = (int) (bQty / pQty);
+				if (sumJ * pQty != bQty) {
+					throw new IllegalOperatorException("序号:" + sItem.getNumber() + ",外箱容量不是最小包装数的整数倍!");
+				}
+                // 整数箱数
+				int bNum = (int) (qty / bQty);
+                // 零散数
+				double bqtyB = (new BigDecimal(Double.toString(qty)))
+						.subtract(new BigDecimal(Double.toString(bNum * bQty))).doubleValue();
+				if (aNum >= 1) {
+					for (int i = 0; i < aNum; i++) {
+						if (i % sumJ == 0) {
+							BarPackage barPackage = new BarPackage();
+							out_boxcode = outboxMethod(sourceId, outboxSet);
+							barPackage.setCustUU(custUU);
+							barPackage.setEnUU(enUU);
+							barPackage.setOutboxcode(out_boxcode);
+							barPackage.setProdcode(pr_code);
+							barPackage.setLevel((long) 1);
+							barPackage.setPackdate(new Date());
+							barPackage.setSendStatus((short) Status.NOT_UPLOAD.value());
+							if (i >= aNum - sumJ && bqtyB > 0) {
+								barPackage.setPackageqty(aNum - sumJ);
+								barPackage.setTotalqty(bqtyB);
+							} else {
+								barPackage.setPackageqty(sumJ);
+								barPackage.setTotalqty(bQty);
+							}
+							barPackageDao.save(barPackage);
+							barPackage = barPackageDao.findByOutboxcodeAndEnUU(out_boxcode, enUU);
+							pa_id = barPackage.getId();
+						}
+						bar_code = barcodeMethod(sourceId, barcodeSet);
+						insertBarPd(pa_id, out_boxcode, pQty, bar_code, sItem, enUU);
+					}
+				}
+				if (aqtyA > 0) {
+					bar_code = barcodeMethod(sourceId, barcodeSet);
+					insertBarPd(pa_id, out_boxcode, aqtyA, bar_code, sItem, enUU);
+				}
+				logger.log("发货单", "生成条码和箱号",
+						"发货单:" + sItem.getSend().getCode() + ",明细行序号:" + sItem.getNumber() + ",生成条码和箱号!");
+			} else {
+				if (aNum >= 1) {
+					for (int i = 0; i < aNum; i++) {
+						insertBar(sItem, pQty, enUU, barcodeSet);
+					}
+				}
+				if (aqtyA > 0) {
+					insertBar(sItem, aqtyA, enUU, barcodeSet);
+				}
+				logger.log("发货单", "生成条码",
+						"发货单:" + sItem.getSend().getCode() + ",明细行序号:" + sItem.getNumber() + ",生成条码!");
+			}
+		}
+	}
+
+	private String lpad(int length, String number) {
+		while (number.length() < length) {
+			number = "0" + number;
+		}
+		number = number.substring(number.length() - length, number.length());
+		return number;
+	}
+
+    /**
+     *   YYMMDD 日期格式
+     */
+    final String YYMMDD_PATTERN = "YYMMDD";
+
+    /**
+     * YYMM日期格式
+     */
+    final String YYMM_PATTERN= "YYMM";
+
+    /**
+     * MMDD日期格式
+     */
+    final String MMDD_PATTERN = "MMDD";
+
+    /**
+     * 默认数量
+     */
+    final Integer NULL_COUNT = 0;
+
+    /**
+     * 生成条码号
+     *
+     * @param pr_id
+     * @param barcodeSet
+     * @return
+     */
+	public String barcodeMethod(String pr_id, B2bCodeSet barcodeSet) {
+		StringBuffer code = new StringBuffer();
+		String date = "0";
+		String formPlat = barcodeSet.getFromplat(), dataStr = barcodeSet.getDatestr(),
+				maxdate = barcodeSet.getMaxdate();
+		int lennum = barcodeSet.getLennum().intValue(), maxnum = barcodeSet.getMaxnum().intValue(),
+				lenprid = barcodeSet.getLenprid().intValue();
+		// 拼接
+        // 平台标识
+		code.append(formPlat);
+        // PR_ID物料ID的长度
+		code.append(lpad(lenprid, pr_id));
+		if (YYMMDD_PATTERN.equals(dataStr)) {
+			SimpleDateFormat YMD = new SimpleDateFormat("yyMMdd");
+			date = YMD.format(new Date());
+		} else if (YYMM_PATTERN.equals(dataStr)) {
+			SimpleDateFormat YM = new SimpleDateFormat("yyMM");
+			date = YM.format(new Date());
+		} else if (MMDD_PATTERN.equals(dataStr)) {
+			SimpleDateFormat MD = new SimpleDateFormat("MMdd");
+			date = MD.format(new Date());
+		}
+		code.append(date);
+		barcodeSet.setMaxdate(date);
+        // 如果当前日期大于上次日期
+		if (!("").equals(maxdate) && null != maxdate && (!NULL_COUNT.equals(date))
+				&& (Integer.valueOf(maxdate) > Integer.valueOf(date))) {
+            // 流水重新开始
+			code.append(lpad(lennum, "1"));
+            // 流水号增加1
+			barcodeSet.setMaxnum((long) 2);
+		} else {
+            // 当前流水号
+			code.append(lpad(lennum, String.valueOf(maxnum)));
+            // 流水号增加1
+			barcodeSet.setMaxnum((long) (maxnum + 1));
+		}
+		b2bCodeSetDao.save(barcodeSet);
+		return code.toString();
+	}
+
+    /**
+     * 生成外箱号
+     *
+     * @param pr_id
+     * @param barcodeSet
+     * @return
+     */
+	public String outboxMethod(String pr_id, B2bCodeSet barcodeSet) {
+		StringBuffer code = new StringBuffer();
+		String date = "0";
+		String formPlat = barcodeSet.getFromplat(), dataStr = barcodeSet.getDatestr(),
+				maxdate = barcodeSet.getMaxdate();
+		int lennum = barcodeSet.getLennum().intValue(), maxnum = barcodeSet.getMaxnum().intValue(),
+				lenprid = barcodeSet.getLenprid().intValue();
+        // 平台标识
+		code.append(formPlat);
+        // PR_ID物料ID的长度
+		code.append(lpad(lenprid, pr_id));
+		if (YYMMDD_PATTERN.equals(dataStr)) {
+			SimpleDateFormat YMD = new SimpleDateFormat("yyMMdd");
+			date = YMD.format(new Date());
+		} else if (YYMM_PATTERN.equals(dataStr)) {
+			SimpleDateFormat YM = new SimpleDateFormat("yyMM");
+			date = YM.format(new Date());
+		} else if (MMDD_PATTERN.equals(dataStr)) {
+			SimpleDateFormat MD = new SimpleDateFormat("MMdd");
+			date = MD.format(new Date());
+		}
+		code.append(date);
+		barcodeSet.setMaxdate(date);
+        // 如果当前日期大于上次日期
+		if (!("").equals(maxdate) && null != maxdate && (!NULL_COUNT.equals(date))
+				&& (Integer.valueOf(maxdate) > Integer.valueOf(date))) {
+            // 流水重新开始
+			code.append(lpad(lennum, "1"));
+            // 流水号增加1
+			barcodeSet.setMaxnum((long) 2);
+		} else {
+            // 当前流水号
+			code.append(lpad(lennum, String.valueOf(maxnum)));
+            // 流水号增加1
+			barcodeSet.setMaxnum((long) (maxnum + 1));
+		}
+		b2bCodeSetDao.save(barcodeSet);
+		return code.toString();
+	}
+
+	private void insertBarPd(Long pa_id, String out_boxcode, double qty, String bar_code, SaleSendItem sItem,
+			Long enUU) {
+		BarSendNotify barSendNotify = new BarSendNotify();
+		barSendNotify.setBarcode(bar_code);
+		barSendNotify.setOutboxcode(out_boxcode);
+		barSendNotify.setOutboxid(pa_id);
+		barSendNotify.setPrintstatus("0");
+		barSendNotify.setProdcode(sItem.getOrderItem().getProduct().getCode());
+		barSendNotify.setProdid(sItem.getOrderItem().getProduct().getSourceId());
+		barSendNotify.setQty(qty);
+		barSendNotify.setSendStatus((short) Status.NOT_UPLOAD.value());
+		SaleSendItemAll sendItem = new SaleSendItemAll();
+		sendItem.setId(sItem.getId());
+		barSendNotify.setSaleSendItem(sendItem);
+		barSendNotify.setSinumber(sItem.getNumber());
+		barSendNotify.setSscode(sItem.getSend().getCode());
+		barSendNotify.setSsid(sItem.getSend().getId());
+		barSendNotify.setVendcode(enUU);
+        // 保存发货单明细中的条码
+		barSendNotifyDao.save(barSendNotify);
+
+		BarPackageDetail barPackageDetail = new BarPackageDetail();
+		barPackageDetail.setBarcode(bar_code);
+		barPackageDetail.setBarpackage(barPackageDao.findOne(pa_id));
+		barPackageDetail.setInnerqty(qty);
+        // 保存包装箱明细
+		barPackageDetailDao.save(barPackageDetail);
+	}
+
+	/**
+	 * 发货单明细条码明细生成
+	 * 
+	 * @param sItem
+	 * @param qty
+	 * @param enUU
+	 * @param barcodeSet
+	 */
+	private void insertBar(SaleSendItem sItem, double qty, Long enUU, B2bCodeSet barcodeSet) {
+		BarSendNotify barSendNotify = new BarSendNotify();
+		String bar_code = barcodeMethod(String.valueOf(sItem.getOrderItem().getProductId()), barcodeSet);
+		barSendNotify.setBarcode(bar_code);
+		barSendNotify.setPrintstatus("0");
+		barSendNotify.setProdcode(sItem.getOrderItem().getProduct().getCode());
+		barSendNotify.setProdid(sItem.getOrderItem().getProduct().getSourceId());
+		barSendNotify.setQty(qty);
+		barSendNotify.setSendStatus((short) Status.NOT_UPLOAD.value());
+		SaleSendItemAll sendItem = new SaleSendItemAll();
+		sendItem.setId(sItem.getId());
+		barSendNotify.setSaleSendItem(sendItem);
+		barSendNotify.setSinumber(sItem.getNumber());
+		barSendNotify.setSscode(sItem.getSend().getCode());
+		barSendNotify.setSsid(sItem.getSend().getId());
+		barSendNotify.setVendcode(enUU);
+        // 保存发货单明细中的条码
+		barSendNotifyDao.save(barSendNotify);
+	}
+
+	@Override
+	public List<Map<String, Object>> getPrintBarcodes(Long lpsId, List<SaleSendItem> sendItem, Long enUU) {
+		List<Map<String, Object>> list2 = new ArrayList<Map<String, Object>>();
+		String va = "";
+		String regex = "\\{(?:[A-Za-z][A-Za-z0-9_]*)\\}";
+		BarLabelPrintSetting setting = barLPSetingDao.findOne(lpsId);
+		// 获取打印明细的设置参数
+		List<Map<String, Object>> parameter = commonDao.queryForList(
+				"select la_pagesize, lp_id,lp_valuetype,lp_encode,lp_name,lp_leftrate,lp_toprate,lp_width,lp_ifshownote,lp_font,lp_size,lp_notealignjustify,lp_height from bar$labelParameter left join bar$label on la_id=lp_laid where la_id="
+						+ setting.getLabel().getId());
+		for (SaleSendItem item : sendItem) {
+			List<BarSendNotify> bars = barSendNotifyDao.findBySiid(item.getId());
+			List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
+			for (BarSendNotify barcode : bars) {
+				List<Map<String, Object>> list1 = new ArrayList<Map<String, Object>>();
+				Map<String, Object> mp1 = new HashMap<String, Object>();
+				va = setting.getSql().replaceAll(regex, String.valueOf(barcode.getId()));
+				List<Map<String, Object>> listData = commonDao.queryForList(va);
+				for (Map<String, Object> mapD : listData) {
+					for (Map<String, Object> param : parameter) {
+						mp1 = param;
+						mp1.put("value", mapD.get(param.get("lp_name")));
+						list1.add(mp1);
+					}
+				}
+				Map<String, Object> mp = new HashMap<String, Object>();
+				mp.put("store", list1);
+				list.add(mp);
+			}
+			Map<String, Object> mp = new HashMap<String, Object>();
+			mp.put("si_id", item.getId());
+			mp.put("pagesize", parameter.get(0).get("la_pagesize"));
+			mp.put("data", list);
+			list2.add(mp);
+		}
+		return list2;
+	}
+
+	@Override
+	public List<BarLabelPrintSetting> getPrintTemplate(Long id, String type) {
+		SaleSend saleSend = saleSendDao.findOne(id);
+		Long custUU = saleSend.getCustUU();
+		String caller;
+		String BAR_TYPE = "Bar";
+		if (BAR_TYPE.equals(type)) {
+			caller = "B2B!BarPrint";
+		} else {
+			caller = "B2B!OutBoxPrint";
+		}
+		List<BarLabelPrintSetting> setting = barLPSetingDao.findByEnUUAndCaller(custUU, caller);
+		if (setting.size() > 0) {
+			return setting;
+		} else {
+			throw new IllegalOperatorException("未维护相关的打印模板!");
+		}
+	}
+
+	@Override
+	public List<Map<String, Object>> getSPrintBarcode(Long lpsId, Long bsnId) {
+		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
+		String va = "";
+		String regex = "\\{(?:[A-Za-z][A-Za-z0-9_]*)\\}";
+		BarLabelPrintSetting setting = barLPSetingDao.findOne(lpsId);
+		// 获取打印明细的设置参数
+		List<Map<String, Object>> parameter = commonDao.queryForList(
+				"select la_pagesize, lp_id,lp_valuetype,lp_encode,lp_name,lp_leftrate,lp_toprate,lp_width,lp_ifshownote,lp_font,lp_size,lp_notealignjustify,lp_height from bar$labelParameter left join bar$label on la_id=lp_laid where la_id="
+						+ setting.getLabel().getId());
+		Map<String, Object> map = new HashMap<String, Object>();
+		va = setting.getSql().replaceAll(regex, String.valueOf(bsnId));
+		List<Map<String, Object>> listData = commonDao.queryForList(va);
+		for (Map<String, Object> mapD : listData) {
+			for (Map<String, Object> param : parameter) {
+				map = param;
+				map.put("value", mapD.get(param.get("lp_name")));
+				list.add(map);
+			}
+		}
+		return list;
+	}
+
+	@Override
+	public void updatePrintStatus(List<SaleSendItem> saleSendItems) {
+		List<SaleSendItem> items = new ArrayList<SaleSendItem>();
+		if (!CollectionUtils.isEmpty(saleSendItems)) {
+			for (SaleSendItem item : saleSendItems) {
+				item = saleSendItemDao.findOne(item.getId());
+				if (item != null) {
+					item.setBarPrintStatus((long) 1);
+					items.add(item);
+				}
+			}
+		}
+		saleSendItemDao.save(items);
+	}
+
+    @Override
+    public void printCount(Long id) {
+        SaleSendAll send = saleSendAllDao.findOne(id);
+        if (null == send.getPrint()) {
+        	send.setPrint((short) 1);
+		} else {
+			send.setPrint((short) (send.getPrint() + 1));
+		}
+        saleSendAllDao.save(send);
+    }
+
+	@Override
+	public Map<String, Integer> getNoticeCount(String category) {
+		List<Long> unreadIds = getUnreadIds(category);
+		Map<String, Integer> map = new HashMap<>(3);
+		// 已回复数量
+		Integer repliedCount = 0;
+		// 未回复数量
+		Integer notReplyCount = 0;
+		if (CollectionUtils.isEmpty(unreadIds)){
+			return map;
+		}
+		// 超过1000条需要拆分,不然会报错
+		if (unreadIds.size() > MAX_SIZE) {
+			List<List<Long>> idsArray = SplitArray.splitAry(unreadIds, SplitArray.QUERY_MAX_NUMBER);
+			for (List<Long> ids : idsArray) {
+				// 超过100不再查询,页面显示99+,减少服务器负担
+				if (repliedCount < 100) {
+					repliedCount = repliedCount + purchaseNoticeDao.findRepliedId(ids).size();
+				}
+				if (notReplyCount < 100) {
+					notReplyCount = notReplyCount + purchaseNoticeDao.findNotReplyId(ids).size();
+				}
+				// 当需要查询的数量大于99时停止循环,减少不必要的操作
+				if (notReplyCount > 99 && repliedCount > 99) {
+					break;
+				}
+			}
+		} else {
+			repliedCount = repliedCount + purchaseNoticeDao.findRepliedId(unreadIds).size();
+			notReplyCount = notReplyCount + purchaseNoticeDao.findNotReplyId(unreadIds).size();
+		}
+		map.put("replied", repliedCount);
+		map.put("notReply", notReplyCount);
+		map.put("all", repliedCount + notReplyCount);
+		return map;
+	}
+
+    @Override
+    public SPage<PurchaseNotice> findDoneNoticesByPageInfo(final PageInfo pageInfo, String keyword, final SearchFilter filter) {
+        Page<PurchaseNotice> notices = purchaseNoticeDao.findAll(new Specification<PurchaseNotice>() {
+            @Override
+            public Predicate toPredicate(Root<PurchaseNotice> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
+                if (filter != null) {
+                    if (!CollectionUtils.isEmpty(filter.getDistribute())) {
+                        pageInfo.expression(PredicateUtils.in("enUU", filter.getDistribute(), false));
+                    }
+                    if (filter.getFromDate() != null) {
+                        pageInfo.expression(PredicateUtils.gte("date", new Date(filter.getFromDate()), false));
+                    }
+                    if (filter.getEndDate() != null) {
+                        pageInfo.expression(PredicateUtils.lte("date", new Date(filter.getEndDate()), false));
+                    }
+                }
+                pageInfo.expression(
+                        PredicateUtils.or(PredicateUtils.isNull("end"), PredicateUtils.ne("end", Constant.YES, false)));
+                return query.where(pageInfo.getPredicates(root, query, builder)).getRestriction();
+            }
+        }, pageInfo);
+        return SPageUtils.covertSPage(notices);
+    }
+
+    /**
+     * 查询未阅读数量
+     *
+     * @param category 表名
+     * @return
+     */
+    @Override
+	public List<Long> getUnreadIds(String category) {
+		return userOrderDao.getUnreadIds(SystemSession.getUser().getEnterprise().getUu(), SystemSession.getUser().getUserUU(), "purc$notice", category);
+	}
+
+    /**
+     * 查询发货提醒
+     *
+     * @param pageInfo 分页信息
+     * @param keyword  关键字
+     * @param filter   过滤条件
+     * @return
+     */
+    @Override
+    public SPage<PurchaseNotice> findAllNoticesByPageInfo(final PageInfo pageInfo, String keyword, final SearchFilter filter) {
+		if (filter != null) {
+			if (!CollectionUtils.isEmpty(filter.getDistribute())) {
+				pageInfo.expression(PredicateUtils.in("enUU", filter.getDistribute(), false));
+			}
+			if (filter.getFromDate() != null) {
+				pageInfo.expression(PredicateUtils.gte("date", new Date(filter.getFromDate()), false));
+			}
+			if (filter.getEndDate() != null) {
+				pageInfo.expression(PredicateUtils.lte("date", new Date(filter.getEndDate()), false));
+			}
+		}
+		pageInfo.expression(PredicateUtils.isNull("end"));
+        Page<PurchaseNotice> notices = purchaseNoticeDao.findAll(new Specification<PurchaseNotice>() {
+            @Override
+            public Predicate toPredicate(Root<PurchaseNotice> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
+                List<Predicate> predicatesList = new ArrayList<Predicate>();
+                if (!StringUtils.isEmpty(keyword)) {
+					Predicate custName = builder.like(root.get("orderItem").get("order").get("enterprise").get("enName"), "%" + keyword+ "%");
+                    if (keyword.matches(SearchUtils.UU_REGEXP)) {
+                        Predicate custUU = builder.like(root.get("orderItem").get("order").get("enterprise").get("uu"), "%" + keyword+ "%");
+                        builder.or(custUU);
+                    }
+					Predicate productCode = builder.like(root.get("orderItem").get("productCode"), "%" + keyword+ "%");
+                    Predicate productTitle = builder.like(root.get("orderItem").get("productTitle"), "%" + keyword+ "%");
+                    Predicate productSpec = builder.like(root.get("orderItem").get("productSpec"), "%" + keyword+ "%");
+                    Predicate orderCode = builder.like(root.get("orderItem").get("order").get("code"), "%" + keyword+ "%");
+                    predicatesList.add(builder.or(custName, productCode, productTitle, productSpec, orderCode));
+				}
+                Predicate[] predicates = pageInfo.getPredicates(root, query, builder);
+                Arrays.stream(predicates).forEach(predicate -> {
+                    predicatesList.add(predicate);
+                });
+                return builder.and(predicatesList.toArray(new Predicate[predicatesList.size()]));
+            }
+        }, pageInfo);
+        return SPageUtils.covertSPage(notices);
+    }
+
+    /**
+     * 按条件查询发货提醒
+     *
+     * @param pageInfo  分页信息,过滤条件
+     * @param keyword   搜索词
+     * @param filter    过滤条件
+     * @param state 状态
+     * @return SPage封装的数据
+     */
+    @Override
+    public SPage<PurchaseNotice> findNoticesByPageInfo(PageInfo pageInfo, String keyword, SearchFilter filter, String state) {
+        // 根据状态设置其他条件
+        setState(pageInfo, state, filter);
+        if (filter != null) {
+            if (!CollectionUtils.isEmpty(filter.getDistribute())) {
+                pageInfo.expression(PredicateUtils.in("enUU", filter.getDistribute(), false));
+            }
+            if (filter.getFromDate() != null) {
+                pageInfo.expression(PredicateUtils.gte("date", new Date(filter.getFromDate()), false));
+            }
+            if (filter.getEndDate() != null) {
+                pageInfo.expression(PredicateUtils.lte("date", new Date(filter.getEndDate()), false));
+            }
+        }
+        Page<PurchaseNotice> notices = purchaseNoticeDao.findAll(new Specification<PurchaseNotice>() {
+            @Override
+            public Predicate toPredicate(Root<PurchaseNotice> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
+                List<Predicate> predicatesList = new ArrayList<Predicate>();
+                if (!StringUtils.isEmpty(keyword)) {
+                    Predicate custName = builder.like(root.get("orderItem").get("order").get("enterprise").get("enName"), "%" + keyword+ "%");
+                    if (keyword.matches(SearchUtils.UU_REGEXP)) {
+                        Predicate custUU = builder.like(root.get("orderItem").get("order").get("enterprise").get("uu"), "%" + keyword+ "%");
+                        builder.or(custUU);
+                    }
+                    Predicate productCode = builder.like(root.get("orderItem").get("productCode"), "%" + keyword+ "%");
+                    Predicate productTitle = builder.like(root.get("orderItem").get("productTitle"), "%" + keyword+ "%");
+                    Predicate productSpec = builder.like(root.get("orderItem").get("productSpec"), "%" + keyword+ "%");
+                    Predicate orderCode = builder.like(root.get("orderItem").get("order").get("code"), "%" + keyword+ "%");
+                    predicatesList.add(builder.or(custName, productCode, productTitle, productSpec, orderCode));
+                }
+                Predicate[] predicates = pageInfo.getPredicates(root, query, builder);
+                Arrays.stream(predicates).forEach(predicate -> {
+                    predicatesList.add(predicate);
+                });
+                return builder.and(predicatesList.toArray(new Predicate[predicatesList.size()]));
+            }
+        }, pageInfo);
+        return SPageUtils.covertSPage(notices);
+    }
+
+    /**
+     * 封装相关查询条件
+     *
+     * @param pageInfo 分页参数
+     * @param state 状态
+     *              <pre>
+     *              _todo : 待发货
+     *              done: 已发货
+     *              end: 已取消
+     *              </pre>
+     * @param filter 过滤条件
+     */
+    private void setState(PageInfo pageInfo, String state, SearchFilter filter) {
+        pageInfo.filter("vendUU", SystemSession.getUser().getEnterprise().getUu());
+        SearchFilter distribute = userService.distribute();
+        if (distribute != null && !CollectionUtils.isEmpty(distribute.getDistribute())) {
+            List<Object> list = new ArrayList<>();
+            list.addAll(distribute.getDistribute());
+            filter.setDistribute(list);
+        }
+        if (SearchUtils.TODO_STATE.equals(state)) {
+            pageInfo.expression(PredicateUtils.or(PredicateUtils.isNull("end"), PredicateUtils.eq("end", Constant.NO, false)));
+            pageInfo.filter("status", (short)Status.NOT_REPLY.value());
+            pageInfo.filter("waiting", Constant.NO);
+        } else if (SearchUtils.DONE_STATE.equals(state)) {
+            pageInfo.expression(PredicateUtils.or(PredicateUtils.isNull("end"), PredicateUtils.eq("end", Constant.NO, false)));
+            pageInfo.filter("status", (short)Status.REPLIED.value());
+        } else if (SearchUtils.END_STATE.equals(state)) {
+            pageInfo.filter("end", Constant.YES);
+        } else if (SearchUtils.WAITING_STATE.equals(state)) {
+            pageInfo.filter("waiting", Constant.YES);
+			pageInfo.expression(PredicateUtils.or(PredicateUtils.isNull("end"), PredicateUtils.eq("end", Constant.NO, false)));
+        }
+    }
+
+    @Override
+	@Transactional(rollbackFor = Exception.class)
+	public void setReadByOrder(String category, Long[] sourceId) {
+		userOrderDao.setReadStatus(SystemSession.getUser().getEnterprise().getUu(), SystemSession.getUser().getUserUU(), "purc$notice", category, (short) Status.READ.value(), sourceId);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public Integer setReadByState(String category) {
+		List<Long> unreadIds = getUnreadIds(category);
+		Integer deleteCount = 0;
+		if (CollectionUtils.isEmpty(unreadIds)){
+			return deleteCount;
+		}
+		List<Long> repliedIds = null;
+		if (unreadIds.size() > MAX_SIZE) {
+			List<List<Long>> idsArray = SplitArray.splitAry(unreadIds, SplitArray.QUERY_MAX_NUMBER);
+			for (List<Long> ids : idsArray) {
+				repliedIds = purchaseNoticeDao.findRepliedId(ids);
+				if (repliedIds.size() != 0) {
+					deleteCount = deleteCount + userOrderDao.delete(SystemSession.getUser().getEnterprise().getUu(),
+							SystemSession.getUser().getUserUU(), "purc$notice", category, repliedIds.toArray(new Long[repliedIds.size()]));
+				}
+			}
+		} else {
+			repliedIds = purchaseNoticeDao.findRepliedId(unreadIds);
+			if (repliedIds.size() != 0) {
+				deleteCount = deleteCount + userOrderDao.delete(SystemSession.getUser().getEnterprise().getUu(),
+						SystemSession.getUser().getUserUU(), "purc$notice", category, repliedIds.toArray(new Long[repliedIds.size()]));
+			}
+		}
+		return deleteCount;
+	}
+
+    /**
+     * 通过ids查询发货信息
+     *
+     * @param ids
+     * @return
+     */
+    @Override
+    public List<PurchaseNotice> findByIds(List<Long> ids) {
+        return purchaseNoticeDao.findAll(ids);
+    }
+}

+ 15 - 0
src/main/java/com/uas/platform/b2b/service/impl/PurchaseOrderServiceImpl.java

@@ -4,6 +4,7 @@ import com.uas.platform.b2b.core.util.ContextUtils;
 import com.uas.platform.b2b.core.util.SplitArray;
 import com.uas.platform.b2b.core.util.ThreadTask;
 import com.uas.platform.b2b.dao.*;
+import com.uas.platform.b2b.erp.model.PurchaseDetail;
 import com.uas.platform.b2b.event.PurchaseOrderEndReleaseEvent;
 import com.uas.platform.b2b.event.PurchaseOrderReplyReleaseEvent;
 import com.uas.platform.b2b.event.PurchaseOrderSaveReleaseEvent;
@@ -401,6 +402,12 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
 				(short) Status.NOT_UPLOAD.value());
 	}
 
+	@Override
+	public List<PurcOrderInfoItem> findNotUploadIssued() {
+		return purcOrderInfoItemDao.findByAcceptCustuuAndIssuedStatus(SystemSession.getUser().getEnterprise().getUu(),
+				(short) Status.NOT_UPLOAD.value());
+	}
+
 	@Override
 	public void onReplyUploadSuccess(String[] idArray) {
 		for (String id : idArray) {
@@ -412,6 +419,14 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
 		}
 	}
 
+	@Override
+	public void onIssuedSucess(List<PurchaseDetail> details) {
+		for (PurchaseDetail detail : details) {
+			purcOrderInfoItemDao.updateIssuedStatus(detail.getPd_custpurchasecode(),detail.getPd_custpurchasedetno(),
+					SystemSession.getUser().getEnterprise().getUu());
+		}
+	}
+
 	@Override
 	public void onReplyDownSuccess(String[] idArray) {
 		for (String id : idArray) {

+ 3 - 3
src/test/java/com/uas/platform/b2b/purc/PurchaseNoticeSearchTest.java

@@ -30,9 +30,9 @@ public class PurchaseNoticeSearchTest {
      * @throws Exception
      */
     @Test
-    public void checkAndUpdate() throws Exception {
+    public void checkAndUpdateAA() throws Exception {
         List<Long> ids = new ArrayList<>();
-        for (Long i=1228329L;i<=1228388L;i++) {
+        for (Long i=1228788L;i<=1229289L;i++) {
             ids.add(i);
         }
         List<Long> list = checkAll("purc$notice",ids);
@@ -115,7 +115,7 @@ public class PurchaseNoticeSearchTest {
 
     @Test
     public void test() throws Exception{
-        update("purc$orders",13824692L);
+        update("purc$orders",13832582L);
     }
 
     public void checkIndex() throws Exception{