wangmh 8 лет назад
Родитель
Сommit
4aa370d31e
45 измененных файлов с 3089 добавлено и 1193 удалено
  1. 142 0
      src/main/java/com/uas/platform/b2b/controller/PiaoPlusNoticeController.java
  2. 4 1
      src/main/java/com/uas/platform/b2b/controller/SaleApBillOutController.java
  3. 2 1
      src/main/java/com/uas/platform/b2b/dao/ProductTempDao.java
  4. 1 1
      src/main/java/com/uas/platform/b2b/dao/PurchaseApBillOutDao.java
  5. 53 0
      src/main/java/com/uas/platform/b2b/erp/controller/BillOutController.java
  6. 6 29
      src/main/java/com/uas/platform/b2b/erp/controller/RelationshipController.java
  7. 489 0
      src/main/java/com/uas/platform/b2b/erp/model/BillOut.java
  8. 353 0
      src/main/java/com/uas/platform/b2b/erp/model/BillOutDetail.java
  9. 6 26
      src/main/java/com/uas/platform/b2b/erp/service/impl/ARCheckServiceImpl.java
  10. 17 0
      src/main/java/com/uas/platform/b2b/erp/service/impl/BillOutService.java
  11. 81 0
      src/main/java/com/uas/platform/b2b/erp/service/impl/BillOutServiceImpl.java
  12. 6 26
      src/main/java/com/uas/platform/b2b/erp/service/impl/InquiryMouldServiceImpl.java
  13. 6 26
      src/main/java/com/uas/platform/b2b/erp/service/impl/InquiryServiceImpl.java
  14. 6 26
      src/main/java/com/uas/platform/b2b/erp/service/impl/MakeServiceImpl.java
  15. 12 30
      src/main/java/com/uas/platform/b2b/erp/service/impl/PurchaseForecastServiceImpl.java
  16. 6 28
      src/main/java/com/uas/platform/b2b/erp/service/impl/PurchaseSampleServiceImpl.java
  17. 6 26
      src/main/java/com/uas/platform/b2b/erp/service/impl/PurchaseServiceImpl.java
  18. 6 28
      src/main/java/com/uas/platform/b2b/erp/service/impl/QuotationServiceImpl.java
  19. 6 30
      src/main/java/com/uas/platform/b2b/erp/service/impl/TenderServiceImpl.java
  20. 34 0
      src/main/java/com/uas/platform/b2b/erp/service/impl/VendorServiceImpl.java
  21. 84 0
      src/main/java/com/uas/platform/b2b/model/PublicInquiryItem.java
  22. 32 0
      src/main/java/com/uas/platform/b2b/model/PurchaseApBillOut.java
  23. 2 2
      src/main/java/com/uas/platform/b2b/model/PurchaseApBillOutItem.java
  24. 73 0
      src/main/java/com/uas/platform/b2b/service/PiaoPlusService.java
  25. 15 0
      src/main/java/com/uas/platform/b2b/service/PurchaseApBillOutService.java
  26. 185 181
      src/main/java/com/uas/platform/b2b/service/impl/BaseInfoServiceImpl.java
  27. 14 5
      src/main/java/com/uas/platform/b2b/service/impl/PagingReleaseServiceImpl.java
  28. 958 0
      src/main/java/com/uas/platform/b2b/service/impl/PiaoPlusServiceImpl.java
  29. 20 4
      src/main/java/com/uas/platform/b2b/service/impl/ProductUsersServiceImpl.java
  30. 206 315
      src/main/java/com/uas/platform/b2b/service/impl/PurcProductServiceImpl.java
  31. 29 1
      src/main/java/com/uas/platform/b2b/service/impl/PurchaseApBillOutServiceImpl.java
  32. 11 29
      src/main/java/com/uas/platform/b2b/service/impl/VendorsServiceImpl.java
  33. BIN
      src/main/resources/jxls-tpl/baseInfo/baseInfo_prod_example.xls
  34. BIN
      src/main/resources/jxls-tpl/sale/upload_userproduct_example.xls
  35. 33 13
      src/main/webapp/WEB-INF/views/normal/index.html
  36. 114 23
      src/main/webapp/resources/css/index.css
  37. 40 31
      src/main/webapp/resources/js/index/app.js
  38. 4 0
      src/main/webapp/resources/tpl/index/approvalFlow/enterprise.html
  39. 2 2
      src/main/webapp/resources/tpl/index/approvalFlow/modal/uplodaByBatch.html
  40. 0 3
      src/main/webapp/resources/tpl/index/baseInfo/uploadByBatch.html
  41. 4 1
      src/main/webapp/resources/tpl/index/fa/apBillOut.html
  42. 12 6
      src/main/webapp/resources/tpl/index/fa/apBillOut_detail.html
  43. 4 6
      src/main/webapp/resources/tpl/index/purc/pubInquiry.html
  44. 2 3
      src/main/webapp/resources/tpl/index/purc/pubInquiry_detail.html
  45. 3 290
      src/main/webapp/resources/tpl/index/sale/pubinquiry.html

+ 142 - 0
src/main/java/com/uas/platform/b2b/controller/PiaoPlusNoticeController.java

@@ -0,0 +1,142 @@
+package com.uas.platform.b2b.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.uas.platform.b2b.model.PurchaseApBillOut;
+import com.uas.platform.b2b.service.PurchaseApBillOutService;
+import com.uas.platform.b2b.service.PurchaseApCheckService;
+import org.apache.commons.io.IOUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+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 javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+
+/**
+ * 票加加开票数据回传接口
+ *
+ * @author huangct
+ * @time 创建时间:2018年03月07日
+ */
+
+@SuppressWarnings("deprecation")
+@Controller
+@RequestMapping("/public/apBillOut")
+public class PiaoPlusNoticeController {
+
+	@Autowired
+	PurchaseApCheckService purchaseApCheckService;
+
+	@Autowired
+	private PurchaseApBillOutService purchaseApBillOutService;
+
+	/**
+	 * 电子发票开票成功通知
+	 * @param data
+	 * @return
+	 */
+	@RequestMapping(value = "/electricBillSuccessNotice", method = RequestMethod.POST)
+	@ResponseBody
+	public ModelMap electricBillSuccessNotice(@RequestParam("data") String data){
+		JSONObject noticeData = JSONObject.parseObject(data);
+		String taxpayerId = noticeData.getString("taxpayerId");
+		String billRequestNum = noticeData.getString("billRequestNum");
+		String orderNo = noticeData.getString("orderNo");
+		String reIssue = noticeData.getString("reIssue");//是否允许重开 0允许,1不允许
+		String code = noticeData.getString("code");
+		String resMsg = noticeData.getString("resMsg");
+
+
+		return null;
+	}
+
+	/**
+	 * 电子开票失败通知
+	 * @param data
+	 * @return
+	 */
+	@RequestMapping(value = "/electricBillFailNotice", method = RequestMethod.POST)
+	@ResponseBody
+	public ModelMap electricBillFailNotice(@RequestParam("data") String data){
+		JSONObject noticeData = JSONObject.parseObject(data);
+		String taxpayerId = noticeData.getString("taxpayerId");
+		String billRequestNum = noticeData.getString("billRequestNum");
+		String orderNo = noticeData.getString("orderNo");
+		String reIssue = noticeData.getString("reIssue");//是否允许重开 0允许,1不允许
+
+		//电子发票只有这俩个
+		String code = noticeData.getString("code");
+		String resMsg = noticeData.getString("resMsg");
+
+		return null;
+	}
+
+	/**
+	 * 纸质发票开票成功通知
+	 * @param request
+	 * @return
+	 */
+	@RequestMapping(value = "/paperBillSuccessNotice", method = RequestMethod.POST)
+	@ResponseBody
+	public JSONObject billSuccessNotice(HttpServletRequest request) throws IOException {
+		String data = IOUtils.toString(request.getInputStream(), request.getCharacterEncoding());
+		JSONObject jsonObject = new JSONObject();
+		JSONObject noticeData = JSONObject.parseObject(data);
+		String taxpayerId = noticeData.getString("taxpayerId");
+		String fpdm = noticeData.getString("fpdm");//发票代码
+		String fphm = noticeData.getString("fphm");//发票号码
+		String billRequestNum = noticeData.getString("billRequestNum");//请求流水号
+		String orderNo = noticeData.getString("orderNo");
+		String reIssue = noticeData.getString("reIssue");//是否允许重开 0允许,1不允许
+		String code = noticeData.getString("code");//0000 成功
+		String resMsg = noticeData.getString("resMsg");
+
+		PurchaseApBillOut apBillOut = purchaseApBillOutService.findByCode(orderNo);
+
+		apBillOut.setNsrsbh(taxpayerId);
+		apBillOut.setInfoTypeCode(fpdm);
+		apBillOut.setInfoNumber(fphm);
+		apBillOut.setRequestCode(billRequestNum);
+		apBillOut.setReissue(reIssue);
+		apBillOut.setRetmsg(resMsg);
+
+		//修改开票单状态
+		apBillOut.setCheckStatus("已开票");
+
+		purchaseApBillOutService.save(apBillOut);
+
+		jsonObject.put("code", "0000");
+		jsonObject.put("resMsg", "开票成功!");
+
+		return jsonObject;
+	}
+
+	/**
+	 * 纸质开票失败通知
+	 * @param data
+	 * @return
+	 */
+	@RequestMapping(value = "/paperBillFailNotice", method = RequestMethod.POST)
+	@ResponseBody
+	public ModelMap billFailNotice(@RequestParam("data") String data){
+		JSONObject noticeData = JSONObject.parseObject(data);
+		String taxpayerId = noticeData.getString("taxpayerId");
+		String billRequestNum = noticeData.getString("billRequestNum");
+		String totalMoney = noticeData.getString("totalMoney");//税金合计
+		String fplx = noticeData.getString("fplx");//发票类型  1表示蓝票,2表示红票
+		String fpdm = noticeData.getString("fpdm");//发票代码  开票结果为成功时必填
+		String fphm = noticeData.getString("fphm");//发票号码  开票结果为成功时必填
+		String yfpdm = noticeData.getString("yfpdm");//原发票代码  开票类型为红票时必填
+		String yfphm = noticeData.getString("yfphm");//原发票号码  开票类型为红票时必填
+		String sysOrderNo = noticeData.getString("sysOrderNo");//BPM申请单编号  当前开票请求由BPM发起时回填,否则该字段为空。
+
+		String code = noticeData.getString("code");
+		String resMsg = noticeData.getString("resMsg");
+
+		return null;
+	}
+}

+ 4 - 1
src/main/java/com/uas/platform/b2b/controller/SaleApBillOutController.java

@@ -86,6 +86,9 @@ public class SaleApBillOutController {
 	@Autowired
 	private SOAPConsoleService sOAPConsoleService;
 
+	@Autowired
+	private PiaoPlusService piaoPlusService;
+
 	private final static UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
 
 	/**
@@ -94,7 +97,7 @@ public class SaleApBillOutController {
 	 * @param id
 	 * @return
 	 */
-	//hct 此方法只是更新了打印次数  目前处于弃用状态
+	// 此方法只是更新了打印次数  目前处于弃用状态
 	@RequestMapping(value = "/printCount/{id}", method = RequestMethod.POST)
 	@ResponseBody
 	public ResponseEntity<String> printCount(@PathVariable("id") Long id) {

+ 2 - 1
src/main/java/com/uas/platform/b2b/dao/ProductTempDao.java

@@ -56,7 +56,8 @@ public class ProductTempDao {
 
     public void matchExists(String importId) {
         jdbcTemplate.update("Merge Into (Select * From Products_Temp Where Pr_Import_Id=? And Pr_Exist_Id Is Null) T " +
-                "Using Products P On (T.Pr_Title=P.Pr_Title And ((T.Pr_Cmpcode=P.Pr_Cmpcode And T.Pr_Brand=P.Pr_Brand) Or (T.Pr_Cmpcode=P.Pr_Pcmpcode And T.Pr_Brand=P.Pr_Pbrand)) " +
+                "Using Products P On ((T.pr_code = P.pr_code Or (T.Pr_Title=P.Pr_Title And T.Pr_Cmpcode=P.Pr_Cmpcode And T.Pr_Brand=P.Pr_Brand) " +
+                "Or (T.Pr_Title=P.Pr_Title And T.Pr_Cmpcode=P.Pr_Pcmpcode And T.Pr_Brand=P.Pr_Pbrand)) " +
                 "and t.pr_enuu=p.pr_enuu) when matched then update set t.pr_exist_id=p.pr_id", importId);
     }
 

+ 1 - 1
src/main/java/com/uas/platform/b2b/dao/PurchaseApBillOutDao.java

@@ -3,7 +3,6 @@ package com.uas.platform.b2b.dao;
 import com.uas.platform.b2b.model.PurchaseApBillOut;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
-import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.jpa.repository.query.Procedure;
 import org.springframework.stereotype.Repository;
 
@@ -15,4 +14,5 @@ public interface PurchaseApBillOutDao extends JpaSpecificationExecutor<PurchaseA
     @Procedure(procedureName = "TAXCODE_INSERT")
     public void  saveData(String a,String b,String c,String d,String e,String f,String g,String h,String i,String j,String k,String l,String m,String n,String o,String p,String q,String s);
 
+    public List<PurchaseApBillOut> findByEnUuAndCode(long enUU, String bi_code);
 }

+ 53 - 0
src/main/java/com/uas/platform/b2b/erp/controller/BillOutController.java

@@ -0,0 +1,53 @@
+package com.uas.platform.b2b.erp.controller;
+
+import com.uas.platform.b2b.erp.model.BillOut;
+import com.uas.platform.b2b.erp.service.impl.BillOutService;
+import com.uas.platform.b2b.erp.support.ErpBufferedLogger;
+import com.uas.platform.b2b.service.PurchaseApBillOutService;
+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 java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.List;
+
+/**
+ * 应收开票数据接口
+ *
+ * @author huangct
+ * 
+ */
+@Controller
+@RequestMapping("/erp/purchase/BillOut")
+public class BillOutController {
+
+	@Autowired
+	private PurchaseApBillOutService purchaseApBillOutService;
+	
+	@Autowired
+	private BillOutService billOutService;
+
+	private final static ErpBufferedLogger logger = BufferedLoggerManager.getLogger(ErpBufferedLogger.class);
+
+	/**
+	 * 将ERP的应收开票写到平台
+	 * 
+	 * @param data
+	 * @return
+	 * @throws UnsupportedEncodingException
+	 */
+	@RequestMapping(method = RequestMethod.POST)
+	@ResponseBody
+	public void saveApBills(@RequestParam("data") String data) throws UnsupportedEncodingException {
+		String jsonStr = URLDecoder.decode(data, "UTF-8");
+		List<BillOut> billOuts = FlexJsonUtils.fromJsonArray(jsonStr, BillOut.class);
+		purchaseApBillOutService.saveByItem(billOutService.convertBillOuts(billOuts));
+		logger.log("应收开票单", "上传应收开票单", billOuts.size());
+	}
+}

+ 6 - 29
src/main/java/com/uas/platform/b2b/erp/controller/RelationshipController.java

@@ -1,14 +1,12 @@
 package com.uas.platform.b2b.erp.controller;
 
-import com.uas.sso.entity.PartnershipRecordView;
-import com.uas.sso.util.AccountUtils;
 import com.uas.platform.b2b.dao.EnterpriseDao;
 import com.uas.platform.b2b.dao.VendorDao;
+import com.uas.platform.b2b.erp.service.VendorService;
 import com.uas.platform.b2b.model.Enterprise;
 import com.uas.platform.b2b.model.Vendor;
 import com.uas.platform.b2b.support.SystemSession;
 import com.uas.platform.b2b.support.UsageBufferedLogger;
-import com.uas.platform.b2b.temporary.model.PartnershipRecord;
 import com.uas.platform.core.logging.BufferedLoggerManager;
 import com.uas.platform.core.model.Constant;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -34,6 +32,9 @@ public class RelationshipController {
 	@Autowired
 	private EnterpriseDao enterpriseDao;
 
+	@Autowired
+	private VendorService vendorService;
+
 	private final static UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
 
 	@RequestMapping(method = RequestMethod.POST)
@@ -44,6 +45,7 @@ public class RelationshipController {
 		boolean ok = true;
 		String error = null;
 		long enUU = SystemSession.getUser().getEnterprise().getUu();
+        final String appId = "uas";// 应用来源
 		if (!StringUtils.isEmpty(otheruu)) {
 			Enterprise enterprise = enterpriseDao.findEnterpriseByUu(otheruu);
 			if (enterprise != null) {
@@ -52,7 +54,7 @@ public class RelationshipController {
 					Vendor vendor = addVendor(otheruu, enUU);// 添加企业的供应商资料
 					// 添加企业圈合作伙伴资料
 					if (null != vendor) {
-						addPartnerShipRecord(vendor);
+						vendorService.addPartnerShipRecord(vendor, appId);
 					}
 				}
 			} else {
@@ -65,31 +67,6 @@ public class RelationshipController {
 		return infos;
 	}
 
-	private void addPartnerShipRecord(Vendor vendor) {
-		PartnershipRecord shipRecord = new PartnershipRecord("uas", vendor);
-		PartnershipRecordView record = new PartnershipRecordView();
-		record.setAppId(shipRecord.getAppId());
-		record.setCustName(shipRecord.getCustName());
-		record.setCustUID(shipRecord.getCustUID());
-		record.setCustUserCode(Long.valueOf(shipRecord.getCustUserCode()));
-		record.setCustUserEmail(shipRecord.getCustUserEmail());
-		record.setCustUserName(shipRecord.getCustUserName());
-		record.setCustUserTel(shipRecord.getCustUserTel());
-		record.setVendName(shipRecord.getVendName());
-		record.setVendUID(shipRecord.getVendUID());
-		record.setVendUserCode(Long.valueOf(shipRecord.getVendUserCode()));
-		record.setVendUserEmail(shipRecord.getVendUserEmail());
-		record.setVendUserName(shipRecord.getVendUserName());
-		record.setVendUserTel(shipRecord.getVendUserTel());
-		try {
-			AccountUtils.synchronizeRecord(record);
-			vendor.setSynchStatus(Constant.YES);
-			vendorDao.save(vendor);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
 	private Vendor addVendor(Long enuu, Long venduu) {
 		Vendor vendor = new Vendor();
 		vendor.setMyEnUU(enuu);

+ 489 - 0
src/main/java/com/uas/platform/b2b/erp/model/BillOut.java

@@ -0,0 +1,489 @@
+package com.uas.platform.b2b.erp.model;
+
+import com.uas.platform.b2b.model.Product;
+import com.uas.platform.b2b.model.PurchaseApBillOut;
+import com.uas.platform.b2b.model.PurchaseApBillOutInfo;
+import com.uas.platform.b2b.model.PurchaseApBillOutItem;
+import com.uas.platform.b2b.support.SystemSession;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * ERP应收开票主表数据
+ * @author huangct
+ * @date 2018年2月08日10:14:24
+ *
+ */
+public class BillOut {
+    private String bi_id;
+    private String bi_code;
+    private Date bi_date;
+    private String bi_custcode;
+    private String bi_custname;
+    private String bi_sellercode;
+    private String bi_seller;
+    private Double bi_amount;
+    private String bi_recorder;
+    private Date bi_indate;
+    private String bi_status;
+    private String bi_remark;
+    private String bi_cop;
+    private String bi_currency;
+    private Double bi_rate;
+    private String bi_vouchercode;
+    private String bi_costvouchercode;
+    private String bi_departmentcode;
+    private String bi_department;
+    private String bi_refno;
+    private String bi_salekind;
+    private Double bi_taxdiffer;
+    private Double bi_taxamount;
+    private String bi_salemethod;
+    private String bi_discountamount;
+    private String bi_discount;
+    private String bi_catecode;
+    private String bi_catename;
+    private String bi_setkind;
+    private String bi_sendkind;
+    private String bi_tradecode;
+    private String bi_tradename;
+    private String bi_pricekind;
+    private String bi_pidepartmentcode;
+    private String bi_pidepartmentname;
+    private String bi_statuscode;
+    private Date bi_auditdate;
+    private String bi_auditer;
+    private String bi_paymentscode;
+    private String bi_paymentsmethod;
+    private Double bi_payamount;
+    private Date bi_postdate;
+    private String bi_postman;
+    private String bi_thispayamount;
+    private Date bi_paydate;
+    private List<BillOutDetail> details;
+    private Long bi_custuu;
+
+    public String getBi_id() {
+        return bi_id;
+    }
+
+    public void setBi_id(String bi_id) {
+        this.bi_id = bi_id;
+    }
+
+    public String getBi_code() {
+        return bi_code;
+    }
+
+    public void setBi_code(String bi_code) {
+        this.bi_code = bi_code;
+    }
+
+    public Date getBi_date() {
+        return bi_date;
+    }
+
+    public void setBi_date(Date bi_date) {
+        this.bi_date = bi_date;
+    }
+
+    public String getBi_custcode() {
+        return bi_custcode;
+    }
+
+    public void setBi_custcode(String bi_custcode) {
+        this.bi_custcode = bi_custcode;
+    }
+
+    public String getBi_custname() {
+        return bi_custname;
+    }
+
+    public void setBi_custname(String bi_custname) {
+        this.bi_custname = bi_custname;
+    }
+
+    public String getBi_sellercode() {
+        return bi_sellercode;
+    }
+
+    public void setBi_sellercode(String bi_sellercode) {
+        this.bi_sellercode = bi_sellercode;
+    }
+
+    public String getBi_seller() {
+        return bi_seller;
+    }
+
+    public void setBi_seller(String bi_seller) {
+        this.bi_seller = bi_seller;
+    }
+
+    public Double getBi_amount() {
+        return bi_amount;
+    }
+
+    public void setBi_amount(Double bi_amount) {
+        this.bi_amount = bi_amount;
+    }
+
+    public String getBi_recorder() {
+        return bi_recorder;
+    }
+
+    public void setBi_recorder(String bi_recorder) {
+        this.bi_recorder = bi_recorder;
+    }
+
+    public Date getBi_indate() {
+        return bi_indate;
+    }
+
+    public void setBi_indate(Date bi_indate) {
+        this.bi_indate = bi_indate;
+    }
+
+    public String getBi_status() {
+        return bi_status;
+    }
+
+    public void setBi_status(String bi_status) {
+        this.bi_status = bi_status;
+    }
+
+    public String getBi_remark() {
+        return bi_remark;
+    }
+
+    public void setBi_remark(String bi_remark) {
+        this.bi_remark = bi_remark;
+    }
+
+    public String getBi_cop() {
+        return bi_cop;
+    }
+
+    public void setBi_cop(String bi_cop) {
+        this.bi_cop = bi_cop;
+    }
+
+    public String getBi_currency() {
+        return bi_currency;
+    }
+
+    public void setBi_currency(String bi_currency) {
+        this.bi_currency = bi_currency;
+    }
+
+    public Double getBi_rate() {
+        return bi_rate;
+    }
+
+    public void setBi_rate(Double bi_rate) {
+        this.bi_rate = bi_rate;
+    }
+
+    public String getBi_vouchercode() {
+        return bi_vouchercode;
+    }
+
+    public void setBi_vouchercode(String bi_vouchercode) {
+        this.bi_vouchercode = bi_vouchercode;
+    }
+
+    public String getBi_costvouchercode() {
+        return bi_costvouchercode;
+    }
+
+    public void setBi_costvouchercode(String bi_costvouchercode) {
+        this.bi_costvouchercode = bi_costvouchercode;
+    }
+
+    public String getBi_departmentcode() {
+        return bi_departmentcode;
+    }
+
+    public void setBi_departmentcode(String bi_departmentcode) {
+        this.bi_departmentcode = bi_departmentcode;
+    }
+
+    public String getBi_department() {
+        return bi_department;
+    }
+
+    public void setBi_department(String bi_department) {
+        this.bi_department = bi_department;
+    }
+
+    public String getBi_refno() {
+        return bi_refno;
+    }
+
+    public void setBi_refno(String bi_refno) {
+        this.bi_refno = bi_refno;
+    }
+
+    public String getBi_salekind() {
+        return bi_salekind;
+    }
+
+    public void setBi_salekind(String bi_salekind) {
+        this.bi_salekind = bi_salekind;
+    }
+
+    public Double getBi_taxdiffer() {
+        return bi_taxdiffer;
+    }
+
+    public void setBi_taxdiffer(Double bi_taxdiffer) {
+        this.bi_taxdiffer = bi_taxdiffer;
+    }
+
+    public Double getBi_taxamount() {
+        return bi_taxamount;
+    }
+
+    public void setBi_taxamount(Double bi_taxamount) {
+        this.bi_taxamount = bi_taxamount;
+    }
+
+    public String getBi_salemethod() {
+        return bi_salemethod;
+    }
+
+    public void setBi_salemethod(String bi_salemethod) {
+        this.bi_salemethod = bi_salemethod;
+    }
+
+    public String getBi_discountamount() {
+        return bi_discountamount;
+    }
+
+    public void setBi_discountamount(String bi_discountamount) {
+        this.bi_discountamount = bi_discountamount;
+    }
+
+    public String getBi_discount() {
+        return bi_discount;
+    }
+
+    public void setBi_discount(String bi_discount) {
+        this.bi_discount = bi_discount;
+    }
+
+    public String getBi_catecode() {
+        return bi_catecode;
+    }
+
+    public void setBi_catecode(String bi_catecode) {
+        this.bi_catecode = bi_catecode;
+    }
+
+    public String getBi_catename() {
+        return bi_catename;
+    }
+
+    public void setBi_catename(String bi_catename) {
+        this.bi_catename = bi_catename;
+    }
+
+    public String getBi_setkind() {
+        return bi_setkind;
+    }
+
+    public void setBi_setkind(String bi_setkind) {
+        this.bi_setkind = bi_setkind;
+    }
+
+    public String getBi_sendkind() {
+        return bi_sendkind;
+    }
+
+    public void setBi_sendkind(String bi_sendkind) {
+        this.bi_sendkind = bi_sendkind;
+    }
+
+    public String getBi_tradecode() {
+        return bi_tradecode;
+    }
+
+    public void setBi_tradecode(String bi_tradecode) {
+        this.bi_tradecode = bi_tradecode;
+    }
+
+    public String getBi_tradename() {
+        return bi_tradename;
+    }
+
+    public void setBi_tradename(String bi_tradename) {
+        this.bi_tradename = bi_tradename;
+    }
+
+    public String getBi_pricekind() {
+        return bi_pricekind;
+    }
+
+    public void setBi_pricekind(String bi_pricekind) {
+        this.bi_pricekind = bi_pricekind;
+    }
+
+    public String getBi_pidepartmentcode() {
+        return bi_pidepartmentcode;
+    }
+
+    public void setBi_pidepartmentcode(String bi_pidepartmentcode) {
+        this.bi_pidepartmentcode = bi_pidepartmentcode;
+    }
+
+    public String getBi_pidepartmentname() {
+        return bi_pidepartmentname;
+    }
+
+    public void setBi_pidepartmentname(String bi_pidepartmentname) {
+        this.bi_pidepartmentname = bi_pidepartmentname;
+    }
+
+    public String getBi_statuscode() {
+        return bi_statuscode;
+    }
+
+    public void setBi_statuscode(String bi_statuscode) {
+        this.bi_statuscode = bi_statuscode;
+    }
+
+    public Date getBi_auditdate() {
+        return bi_auditdate;
+    }
+
+    public void setBi_auditdate(Date bi_auditdate) {
+        this.bi_auditdate = bi_auditdate;
+    }
+
+    public String getBi_auditer() {
+        return bi_auditer;
+    }
+
+    public void setBi_auditer(String bi_auditer) {
+        this.bi_auditer = bi_auditer;
+    }
+
+    public String getBi_paymentscode() {
+        return bi_paymentscode;
+    }
+
+    public void setBi_paymentscode(String bi_paymentscode) {
+        this.bi_paymentscode = bi_paymentscode;
+    }
+
+    public String getBi_paymentsmethod() {
+        return bi_paymentsmethod;
+    }
+
+    public void setBi_paymentsmethod(String bi_paymentsmethod) {
+        this.bi_paymentsmethod = bi_paymentsmethod;
+    }
+
+    public Double getBi_payamount() {
+        return bi_payamount;
+    }
+
+    public void setBi_payamount(Double bi_payamount) {
+        this.bi_payamount = bi_payamount;
+    }
+
+    public Date getBi_postdate() {
+        return bi_postdate;
+    }
+
+    public void setBi_postdate(Date bi_postdate) {
+        this.bi_postdate = bi_postdate;
+    }
+
+    public String getBi_postman() {
+        return bi_postman;
+    }
+
+    public void setBi_postman(String bi_postman) {
+        this.bi_postman = bi_postman;
+    }
+
+    public String getBi_thispayamount() {
+        return bi_thispayamount;
+    }
+
+    public void setBi_thispayamount(String bi_thispayamount) {
+        this.bi_thispayamount = bi_thispayamount;
+    }
+
+    public Date getBi_paydate() {
+        return bi_paydate;
+    }
+
+    public void setBi_paydate(Date bi_paydate) {
+        this.bi_paydate = bi_paydate;
+    }
+
+    public List<BillOutDetail> getDetails() {
+        return details;
+    }
+
+    public void setDetails(List<BillOutDetail> details) {
+        this.details = details;
+    }
+
+    public Long getBi_custuu() {
+        return bi_custuu;
+    }
+
+    public void setBi_custuu(Long bi_custuu) {
+        this.bi_custuu = bi_custuu;
+    }
+
+    public PurchaseApBillOut convert(PurchaseApBillOutInfo customerApBillOutInfo, PurchaseApBillOutInfo apBillOutInfo, List<Product> products) {
+        PurchaseApBillOut purchaseApBillOut = new PurchaseApBillOut();
+        purchaseApBillOut.setTaxSum(this.bi_taxamount);
+        purchaseApBillOut.setDiffer(this.bi_taxdiffer);
+        purchaseApBillOut.setRecordDate(this.bi_indate);
+        purchaseApBillOut.setRecorder(this.bi_recorder);
+        purchaseApBillOut.setCheckStatus("未开票");//未开票 已开票 已作废
+        purchaseApBillOut.setRemark(this.bi_remark);
+        purchaseApBillOut.setAuditDate(this.bi_auditdate);
+        //purchaseApBillOut.setResDate(null);//作废日期
+        //purchaseApBillOut.setResMan(null);//作废人
+        //purchaseApBillOut.setStatus(null);//状态 short
+        purchaseApBillOut.setAmount(this.bi_amount);
+        purchaseApBillOut.setPayAmount(this.bi_payamount);
+        purchaseApBillOut.setCurrency(this.bi_currency);
+        purchaseApBillOut.setRate(this.bi_rate);
+        //客户企业开票信息
+        purchaseApBillOut.setCustUu(this.bi_custuu);
+        if (customerApBillOutInfo != null) {
+            purchaseApBillOut.setCustomerApBillOutInfo(customerApBillOutInfo);
+        }
+        purchaseApBillOut.setCustName(this.bi_custname);
+        //当前企业开票信息
+        purchaseApBillOut.setEnUu(SystemSession.getUser().getEnterprise().getUu());
+        if (apBillOutInfo != null) {
+            purchaseApBillOut.setApBillOutInfo(apBillOutInfo);
+        }
+        purchaseApBillOut.setCode(this.bi_code);
+        //purchaseApBillOut.setPrint(null);//打印次数
+
+        if (!CollectionUtils.isEmpty(this.details)) {
+            Set<PurchaseApBillOutItem> purchaseApBillOutItems = new HashSet<PurchaseApBillOutItem>();
+            for (BillOutDetail billOutDetail : this.details) {
+                for (Product product : products) {
+                    if (SystemSession.getUser().getEnterprise().getUu().equals(product.getEnUU()) && billOutDetail.getArd_prodcode().equals(product.getCode())) {
+                        purchaseApBillOutItems.add(billOutDetail.convert(product));
+                    }
+                }
+            }
+            purchaseApBillOut.setItems(purchaseApBillOutItems);
+        }
+        return purchaseApBillOut;
+    }
+}

+ 353 - 0
src/main/java/com/uas/platform/b2b/erp/model/BillOutDetail.java

@@ -0,0 +1,353 @@
+package com.uas.platform.b2b.erp.model;
+
+import com.uas.platform.b2b.model.Product;
+import com.uas.platform.b2b.model.PurchaseApBillOutItem;
+
+/**
+ * ERP应收开票从表数据
+ * @author huangct
+ * @date 2018年2月08日10:24:24
+ *
+ */
+public class BillOutDetail {
+    private String ard_id;
+    private String ard_biid;
+    private Short ard_detno;
+    private String ard_code;
+    private String ard_ordercode;
+    private Double ard_orderamount;
+    private String ard_aramount;
+    private String ard_havepay;
+    private Double ard_nowbalance;
+    private String ard_remark;
+    private String ard_description;
+    private String ard_emcode;
+    private String ard_catecode;
+    private String ard_diffamount;
+    private Long ard_orderdetno;
+    private String ard_prodcode;
+    private Double ard_nowqty;
+    private Double ard_qty;
+    private Double ard_price;
+    private Double ard_costprice;
+    private Double ard_taxrate;
+    private Double ard_nowprice;
+    private String ard_taxamount;
+    private String ard_discount;
+    private String ard_discountamount;
+    private String ard_status;
+    private String ard_statuscode;
+    private String ard_billprice;
+    private String ard_arprice;
+    private String ard_discountnetamount;
+    private String ard_discounttaxamount;
+    private Long ard_orderid;
+    private String ard_poststatus;
+    private String ard_adid;
+    private String ard_tempamount;
+
+    public String getArd_id() {
+        return ard_id;
+    }
+
+    public void setArd_id(String ard_id) {
+        this.ard_id = ard_id;
+    }
+
+    public String getArd_biid() {
+        return ard_biid;
+    }
+
+    public void setArd_biid(String ard_biid) {
+        this.ard_biid = ard_biid;
+    }
+
+    public Short getArd_detno() {
+        return ard_detno;
+    }
+
+    public void setArd_detno(Short ard_detno) {
+        this.ard_detno = ard_detno;
+    }
+
+    public String getArd_code() {
+        return ard_code;
+    }
+
+    public void setArd_code(String ard_code) {
+        this.ard_code = ard_code;
+    }
+
+    public String getArd_ordercode() {
+        return ard_ordercode;
+    }
+
+    public void setArd_ordercode(String ard_ordercode) {
+        this.ard_ordercode = ard_ordercode;
+    }
+
+    public Double getArd_orderamount() {
+        return ard_orderamount;
+    }
+
+    public void setArd_orderamount(Double ard_orderamount) {
+        this.ard_orderamount = ard_orderamount;
+    }
+
+    public String getArd_aramount() {
+        return ard_aramount;
+    }
+
+    public void setArd_aramount(String ard_aramount) {
+        this.ard_aramount = ard_aramount;
+    }
+
+    public String getArd_havepay() {
+        return ard_havepay;
+    }
+
+    public void setArd_havepay(String ard_havepay) {
+        this.ard_havepay = ard_havepay;
+    }
+
+    public Double getArd_nowbalance() {
+        return ard_nowbalance;
+    }
+
+    public void setArd_nowbalance(Double ard_nowbalance) {
+        this.ard_nowbalance = ard_nowbalance;
+    }
+
+    public String getArd_remark() {
+        return ard_remark;
+    }
+
+    public void setArd_remark(String ard_remark) {
+        this.ard_remark = ard_remark;
+    }
+
+    public String getArd_description() {
+        return ard_description;
+    }
+
+    public void setArd_description(String ard_description) {
+        this.ard_description = ard_description;
+    }
+
+    public String getArd_emcode() {
+        return ard_emcode;
+    }
+
+    public void setArd_emcode(String ard_emcode) {
+        this.ard_emcode = ard_emcode;
+    }
+
+    public String getArd_catecode() {
+        return ard_catecode;
+    }
+
+    public void setArd_catecode(String ard_catecode) {
+        this.ard_catecode = ard_catecode;
+    }
+
+    public String getArd_diffamount() {
+        return ard_diffamount;
+    }
+
+    public void setArd_diffamount(String ard_diffamount) {
+        this.ard_diffamount = ard_diffamount;
+    }
+
+    public Long getArd_orderdetno() {
+        return ard_orderdetno;
+    }
+
+    public void setArd_orderdetno(Long ard_orderdetno) {
+        this.ard_orderdetno = ard_orderdetno;
+    }
+
+    public String getArd_prodcode() {
+        return ard_prodcode;
+    }
+
+    public void setArd_prodcode(String ard_prodcode) {
+        this.ard_prodcode = ard_prodcode;
+    }
+
+    public Double getArd_nowqty() {
+        return ard_nowqty;
+    }
+
+    public void setArd_nowqty(Double ard_nowqty) {
+        this.ard_nowqty = ard_nowqty;
+    }
+
+    public Double getArd_qty() {
+        return ard_qty;
+    }
+
+    public void setArd_qty(Double ard_qty) {
+        this.ard_qty = ard_qty;
+    }
+
+    public Double getArd_price() {
+        return ard_price;
+    }
+
+    public void setArd_price(Double ard_price) {
+        this.ard_price = ard_price;
+    }
+
+    public Double getArd_costprice() {
+        return ard_costprice;
+    }
+
+    public void setArd_costprice(Double ard_costprice) {
+        this.ard_costprice = ard_costprice;
+    }
+
+    public Double getArd_taxrate() {
+        return ard_taxrate;
+    }
+
+    public void setArd_taxrate(Double ard_taxrate) {
+        this.ard_taxrate = ard_taxrate;
+    }
+
+    public Double getArd_nowprice() {
+        return ard_nowprice;
+    }
+
+    public void setArd_nowprice(Double ard_nowprice) {
+        this.ard_nowprice = ard_nowprice;
+    }
+
+    public String getArd_taxamount() {
+        return ard_taxamount;
+    }
+
+    public void setArd_taxamount(String ard_taxamount) {
+        this.ard_taxamount = ard_taxamount;
+    }
+
+    public String getArd_discount() {
+        return ard_discount;
+    }
+
+    public void setArd_discount(String ard_discount) {
+        this.ard_discount = ard_discount;
+    }
+
+    public String getArd_discountamount() {
+        return ard_discountamount;
+    }
+
+    public void setArd_discountamount(String ard_discountamount) {
+        this.ard_discountamount = ard_discountamount;
+    }
+
+    public String getArd_status() {
+        return ard_status;
+    }
+
+    public void setArd_status(String ard_status) {
+        this.ard_status = ard_status;
+    }
+
+    public String getArd_statuscode() {
+        return ard_statuscode;
+    }
+
+    public void setArd_statuscode(String ard_statuscode) {
+        this.ard_statuscode = ard_statuscode;
+    }
+
+    public String getArd_billprice() {
+        return ard_billprice;
+    }
+
+    public void setArd_billprice(String ard_billprice) {
+        this.ard_billprice = ard_billprice;
+    }
+
+    public String getArd_arprice() {
+        return ard_arprice;
+    }
+
+    public void setArd_arprice(String ard_arprice) {
+        this.ard_arprice = ard_arprice;
+    }
+
+    public String getArd_discountnetamount() {
+        return ard_discountnetamount;
+    }
+
+    public void setArd_discountnetamount(String ard_discountnetamount) {
+        this.ard_discountnetamount = ard_discountnetamount;
+    }
+
+    public String getArd_discounttaxamount() {
+        return ard_discounttaxamount;
+    }
+
+    public void setArd_discounttaxamount(String ard_discounttaxamount) {
+        this.ard_discounttaxamount = ard_discounttaxamount;
+    }
+
+    public Long getArd_orderid() {
+        return ard_orderid;
+    }
+
+    public void setArd_orderid(Long ard_orderid) {
+        this.ard_orderid = ard_orderid;
+    }
+
+    public String getArd_poststatus() {
+        return ard_poststatus;
+    }
+
+    public void setArd_poststatus(String ard_poststatus) {
+        this.ard_poststatus = ard_poststatus;
+    }
+
+    public String getArd_adid() {
+        return ard_adid;
+    }
+
+    public void setArd_adid(String ard_adid) {
+        this.ard_adid = ard_adid;
+    }
+
+    public String getArd_tempamount() {
+        return ard_tempamount;
+    }
+
+    public void setArd_tempamount(String ard_tempamount) {
+        this.ard_tempamount = ard_tempamount;
+    }
+
+    public PurchaseApBillOutItem convert(Product product) {
+        PurchaseApBillOutItem purchaseApBillOutItem = new PurchaseApBillOutItem();
+        purchaseApBillOutItem.setNumber(this.ard_detno);
+        //purchaseApBillOutItem.setStatus(null);//状态?
+        //purchaseApBillOutItem.setStatusCode(null);//状态码?
+        purchaseApBillOutItem.setNowPrice(this.ard_nowprice);//开票单价
+        //ard_nowbalance  开票金额
+        //ard_orderamount  发票金额
+        purchaseApBillOutItem.setCostPrice(this.ard_costprice);
+        purchaseApBillOutItem.setPrice(this.ard_price);//发票单价
+        purchaseApBillOutItem.setTaxrate(this.ard_taxrate);
+        purchaseApBillOutItem.setQty(this.ard_qty);
+        purchaseApBillOutItem.setNowQty(this.ard_nowqty);
+        purchaseApBillOutItem.setProduct(product);
+        purchaseApBillOutItem.setPrid(product.getId());
+        purchaseApBillOutItem.setProdCode(this.ard_prodcode);
+        purchaseApBillOutItem.setOrderCode(this.ard_ordercode);//发票单号  客户订单单号  ??
+        purchaseApBillOutItem.setOrderDetno(this.ard_orderdetno);
+        purchaseApBillOutItem.setCode(this.ard_code);
+        purchaseApBillOutItem.setOrderId(this.ard_orderid);//发票id  ??
+        //purchaseApBillOutItem.setOldQty(); //已开票数量 ??
+
+        return purchaseApBillOutItem;
+    }
+}

+ 6 - 26
src/main/java/com/uas/platform/b2b/erp/service/impl/ARCheckServiceImpl.java

@@ -8,6 +8,7 @@ import com.uas.platform.b2b.dao.VendorDao;
 import com.uas.platform.b2b.erp.model.ARCheck;
 import com.uas.platform.b2b.erp.model.ARCheckReply;
 import com.uas.platform.b2b.erp.service.ARCheckService;
+import com.uas.platform.b2b.erp.service.VendorService;
 import com.uas.platform.b2b.model.*;
 import com.uas.platform.b2b.support.SystemSession;
 import com.uas.platform.b2b.temporary.model.PartnershipRecord;
@@ -36,9 +37,13 @@ public class ARCheckServiceImpl implements ARCheckService {
 	@Autowired
 	private SaleARCheckItemDao saleARCheckItemDao;
 
+	@Autowired
+	private VendorService vendorService;
+
 	@Override
 	public List<SaleARCheckItem> convertARChecks(List<ARCheck> arChecks) {
 		List<SaleARCheckItem> arCheckItems = new ArrayList<SaleARCheckItem>();
+        final String appId = "uas";// 应用来源
 		long vendUU = SystemSession.getUser().getEnterprise().getUu();// 卖方UU号
 		if (!CollectionUtils.isEmpty(arChecks)) {
 			for (ARCheck arCheck : arChecks) {
@@ -49,7 +54,7 @@ public class ARCheckServiceImpl implements ARCheckService {
 					if (CollectionUtils.isEmpty(existVendors)) {// 不存在供应商关系,增加供应商关系
 						Vendor vendor = addVendor(customer);
 						if (null != vendor) {
-							addPartnerShipRecord(vendor); // 添加合作伙伴关系
+							vendorService.addPartnerShipRecord(vendor, appId); // 添加合作伙伴关系
 						}
 					}
 					SaleARCheck saleARCheck = arCheck.convert();
@@ -66,31 +71,6 @@ public class ARCheckServiceImpl implements ARCheckService {
 		return arCheckItems;
 	}
 
-	private void addPartnerShipRecord(Vendor vendor) {
-		PartnershipRecord shipRecord = new PartnershipRecord("uas", vendor);
-		com.uas.account.entity.PartnershipRecord record = new com.uas.account.entity.PartnershipRecord();
-		record.setAppId(shipRecord.getAppId());
-		record.setCustName(shipRecord.getCustName());
-		record.setCustUID(shipRecord.getCustUID());
-		record.setCustUserCode(shipRecord.getCustUserCode());
-		record.setCustUserEmail(shipRecord.getCustUserEmail());
-		record.setCustUserName(shipRecord.getCustUserName());
-		record.setCustUserTel(shipRecord.getCustUserTel());
-		record.setVendName(shipRecord.getVendName());
-		record.setVendUID(shipRecord.getVendUID());
-		record.setVendUserCode(shipRecord.getVendUserCode());
-		record.setVendUserEmail(shipRecord.getVendUserEmail());
-		record.setVendUserName(shipRecord.getVendUserName());
-		record.setVendUserTel(shipRecord.getVendUserTel());
-		try {
-			AccountUtils.synchronizeRecord(record);
-			vendor.setSynchStatus(Constant.YES);
-			vendorDao.save(vendor);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
 	/**
 	 * 在UU号正确但两者之间不存在供应商关系时,添加供应商关系
 	 * 

+ 17 - 0
src/main/java/com/uas/platform/b2b/erp/service/impl/BillOutService.java

@@ -0,0 +1,17 @@
+package com.uas.platform.b2b.erp.service.impl;
+
+import com.uas.platform.b2b.erp.model.BillOut;
+import com.uas.platform.b2b.model.PurchaseApBillOutItem;
+
+import java.util.List;
+
+public interface BillOutService {
+
+	/**
+	 * 将ERP系统的应收开票单,转为平台的应收开票单
+	 * 
+	 * @param billOuts
+	 * @return
+	 */
+	List<PurchaseApBillOutItem> convertBillOuts(List<BillOut> billOuts);
+}

+ 81 - 0
src/main/java/com/uas/platform/b2b/erp/service/impl/BillOutServiceImpl.java

@@ -0,0 +1,81 @@
+package com.uas.platform.b2b.erp.service.impl;
+
+import com.uas.platform.b2b.dao.ProductDao;
+import com.uas.platform.b2b.dao.PurchaseApBillOutDao;
+import com.uas.platform.b2b.dao.PurchaseApBillOutInfoDao;
+import com.uas.platform.b2b.erp.model.BillOut;
+import com.uas.platform.b2b.erp.model.BillOutDetail;
+import com.uas.platform.b2b.model.Product;
+import com.uas.platform.b2b.model.PurchaseApBillOut;
+import com.uas.platform.b2b.model.PurchaseApBillOutInfo;
+import com.uas.platform.b2b.model.PurchaseApBillOutItem;
+import com.uas.platform.b2b.support.SystemSession;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+@Service
+public class BillOutServiceImpl implements BillOutService {
+
+	@Autowired
+	private PurchaseApBillOutDao purchaseApBillOutDao;
+
+	@Autowired
+	private ProductDao productDao;
+
+	@Autowired
+	private PurchaseApBillOutInfoDao purchaseApBillOutInfoDao;
+
+
+	@Override
+	public List<PurchaseApBillOutItem> convertBillOuts(List<BillOut> billOuts) {
+		List<PurchaseApBillOutItem> apBillItems = new ArrayList<PurchaseApBillOutItem>();
+		long enUU = SystemSession.getUser().getEnterprise().getUu();
+		for (BillOut billOut : billOuts) {
+			List<PurchaseApBillOut> billOuts2 = purchaseApBillOutDao.findByEnUuAndCode(enUU, billOut.getBi_code());
+			//Enterprise vendor = enterpriseDao.findEnterpriseByUu(billOut.getAb_vendoruu());
+			if (billOuts2.size() == 0) {
+				Long custuu = billOut.getBi_custuu();
+				PurchaseApBillOutInfo customerApBillOutInfo = null;
+				PurchaseApBillOutInfo apBillOutInfo = purchaseApBillOutInfoDao.findByUu(enUU);
+				if (custuu != null) {
+					customerApBillOutInfo = purchaseApBillOutInfoDao.findByUu(custuu);
+				}
+
+				//获取物料
+				List<BillOutDetail> billOutDetails = billOut.getDetails();
+				List<Product> billOutProducts = new ArrayList<>();
+				if (!CollectionUtils.isEmpty(billOutDetails)) {
+					for (BillOutDetail billOutDetail : billOutDetails) {
+						List<Product> products = productDao.findByEnUUAndCode(enUU, billOutDetail.getArd_prodcode());
+						if (!CollectionUtils.isEmpty(products)) {
+							billOutProducts.add(products.get(0));
+						}
+					}
+				}
+
+
+				PurchaseApBillOut purchaseApBillOut = billOut.convert(customerApBillOutInfo, apBillOutInfo, billOutProducts);
+				Iterator<PurchaseApBillOutItem> items = purchaseApBillOut.getItems().iterator();
+				while (items.hasNext()) {
+					PurchaseApBillOutItem purchaseApBillOutItem = items.next();
+					List<Product> products = productDao.findByEnUUAndCode(enUU, purchaseApBillOutItem.getProduct().getCode());
+					if (products.size() > 0) {
+						purchaseApBillOutItem.setProduct(products.get(0));
+						purchaseApBillOutItem.setPrid(products.get(0).getId());
+						purchaseApBillOutItem.setApBillOut(purchaseApBillOut);
+						//TODO purchaseApBillOutItem.setErpDate(new Date());
+						apBillItems.add(purchaseApBillOutItem);
+					} else {
+						items.remove();
+					}
+				}
+			}
+		}
+		return apBillItems;
+	}
+}

+ 6 - 26
src/main/java/com/uas/platform/b2b/erp/service/impl/InquiryMouldServiceImpl.java

@@ -6,6 +6,7 @@ import com.uas.platform.b2b.dao.*;
 import com.uas.platform.b2b.erp.model.InquiryMould;
 import com.uas.platform.b2b.erp.model.InquiryMouldDecide;
 import com.uas.platform.b2b.erp.service.InquiryMouldService;
+import com.uas.platform.b2b.erp.service.VendorService;
 import com.uas.platform.b2b.model.*;
 import com.uas.platform.b2b.support.SystemSession;
 import com.uas.platform.b2b.temporary.model.PartnershipRecord;
@@ -35,9 +36,13 @@ public class InquiryMouldServiceImpl implements InquiryMouldService {
 	@Autowired
 	private UserDao userDao;
 
+	@Autowired
+	private VendorService vendorService;
+
 	@Override
 	public List<PurchaseInquiryMould> convertInquiryMould(List<InquiryMould> inquiries) {
 		List<PurchaseInquiryMould> purcMould = new ArrayList<PurchaseInquiryMould>();
+		final String appId = "uas";// 应用来源
 		long enUU = SystemSession.getUser().getEnterprise().getUu();
 		for (InquiryMould inquiry : inquiries) {
 			// 先进行判断是否存在
@@ -58,7 +63,7 @@ public class InquiryMouldServiceImpl implements InquiryMouldService {
 				} else {
 					vendor = addVendor(purchaseInquiryMould);
 					if (null != vendor) {
-						addPartnerShipRecord(vendor); // 添加合作伙伴关系
+						vendorService.addPartnerShipRecord(vendor, appId); // 添加合作伙伴关系
 					}
 				}
 				if (vendor != null) {
@@ -95,31 +100,6 @@ public class InquiryMouldServiceImpl implements InquiryMouldService {
 		return purcMould;
 	}
 
-	private void addPartnerShipRecord(Vendor vendor) {
-		PartnershipRecord shipRecord = new PartnershipRecord("uas", vendor);
-		com.uas.account.entity.PartnershipRecord record = new com.uas.account.entity.PartnershipRecord();
-		record.setAppId(shipRecord.getAppId());
-		record.setCustName(shipRecord.getCustName());
-		record.setCustUID(shipRecord.getCustUID());
-		record.setCustUserCode(shipRecord.getCustUserCode());
-		record.setCustUserEmail(shipRecord.getCustUserEmail());
-		record.setCustUserName(shipRecord.getCustUserName());
-		record.setCustUserTel(shipRecord.getCustUserTel());
-		record.setVendName(shipRecord.getVendName());
-		record.setVendUID(shipRecord.getVendUID());
-		record.setVendUserCode(shipRecord.getVendUserCode());
-		record.setVendUserEmail(shipRecord.getVendUserEmail());
-		record.setVendUserName(shipRecord.getVendUserName());
-		record.setVendUserTel(shipRecord.getVendUserTel());
-		try {
-			AccountUtils.synchronizeRecord(record);
-			vendor.setSynchStatus(Constant.YES);
-			vendorDao.save(vendor);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
 	@Override
 	public List<InquiryMould> convertPurchaseInquiryMouldReply(List<PurchaseInquiryMould> purchaseInquiryMoulds) {
 		List<InquiryMould> inquiryMoulds = new ArrayList<InquiryMould>();

+ 6 - 26
src/main/java/com/uas/platform/b2b/erp/service/impl/InquiryServiceImpl.java

@@ -15,6 +15,7 @@ import com.uas.platform.b2b.erp.model.InquiryDecide;
 import com.uas.platform.b2b.erp.model.InquiryDetail;
 import com.uas.platform.b2b.erp.model.InquiryDetailDet;
 import com.uas.platform.b2b.erp.service.InquiryService;
+import com.uas.platform.b2b.erp.service.VendorService;
 import com.uas.platform.b2b.erp.support.ErpBufferedLogger;
 import com.uas.platform.b2b.event.PurchaseInquiryItemSaveReleaseEvent;
 import com.uas.platform.b2b.model.Enterprise;
@@ -69,6 +70,9 @@ public class InquiryServiceImpl implements InquiryService {
 	@Autowired
     private CommonDao commonDao;
 
+	@Autowired
+	private VendorService vendorService;
+
     private final static ErpBufferedLogger logger = BufferedLoggerManager.getLogger(ErpBufferedLogger.class);
 
 	private final static UsageBufferedLogger usageLogger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
@@ -76,6 +80,7 @@ public class InquiryServiceImpl implements InquiryService {
 	@Override
 	public List<PurchaseInquiryItem> convertInquiry(List<Inquiry> inquiries) {
 		List<PurchaseInquiryItem> inquiryItems = new ArrayList<PurchaseInquiryItem>();
+		final String appId = "uas";// 应用来源
 		long enUU = SystemSession.getUser().getEnterprise().getUu();
 		for (Inquiry inquiry : inquiries) {
 			// 先查看是否已存在
@@ -109,7 +114,7 @@ public class InquiryServiceImpl implements InquiryService {
 							vendor = addVendor(item);
 							// 添加合作伙伴关系
 							if (null != vendor) {
-								addPartnerShipRecord(vendor);
+								vendorService.addPartnerShipRecord(vendor, appId);
 							}
 						}
 						if (vendor != null) {
@@ -131,31 +136,6 @@ public class InquiryServiceImpl implements InquiryService {
 		return inquiryItems;
 	}
 
-	private void addPartnerShipRecord(Vendor vendor) {
-		PartnershipRecord shipRecord = new PartnershipRecord("uas", vendor);
-		com.uas.account.entity.PartnershipRecord record = new com.uas.account.entity.PartnershipRecord();
-		record.setAppId(shipRecord.getAppId());
-		record.setCustName(shipRecord.getCustName());
-		record.setCustUID(shipRecord.getCustUID());
-		record.setCustUserCode(shipRecord.getCustUserCode());
-		record.setCustUserEmail(shipRecord.getCustUserEmail());
-		record.setCustUserName(shipRecord.getCustUserName());
-		record.setCustUserTel(shipRecord.getCustUserTel());
-		record.setVendName(shipRecord.getVendName());
-		record.setVendUID(shipRecord.getVendUID());
-		record.setVendUserCode(shipRecord.getVendUserCode());
-		record.setVendUserEmail(shipRecord.getVendUserEmail());
-		record.setVendUserName(shipRecord.getVendUserName());
-		record.setVendUserTel(shipRecord.getVendUserTel());
-		try {
-			AccountUtils.synchronizeRecord(record);
-			vendor.setSynchStatus(Constant.YES);
-			vendorDao.save(vendor);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
 	@Override
 	public List<InquiryDetail> convertPurchaseInquiryReply(List<PurchaseInquiryItem> inquiryItems) {
 		List<InquiryDetail> details = new ArrayList<InquiryDetail>();

+ 6 - 26
src/main/java/com/uas/platform/b2b/erp/service/impl/MakeServiceImpl.java

@@ -10,6 +10,7 @@ import com.uas.platform.b2b.erp.model.Make;
 import com.uas.platform.b2b.erp.model.MakeEnd;
 import com.uas.platform.b2b.erp.model.MakeReply;
 import com.uas.platform.b2b.erp.service.MakeService;
+import com.uas.platform.b2b.erp.service.VendorService;
 import com.uas.platform.b2b.event.MakeOrderEndReleaseEvent;
 import com.uas.platform.b2b.model.*;
 import com.uas.platform.b2b.support.SystemSession;
@@ -39,9 +40,13 @@ public class MakeServiceImpl implements MakeService {
 	@Autowired
 	private VendorDao vendorDao;
 
+	@Autowired
+	private VendorService vendorService;
+
 	@Override
 	public List<MakeOrder> convertMakes(List<Make> makes) {
 		List<MakeOrder> makeOrders = new ArrayList<MakeOrder>();
+        final String appId = "uas";// 应用来源
 		long enUU = SystemSession.getUser().getEnterprise().getUu();
 		for (Make make : makes) {
 			List<MakeOrder> orders = makeOrderDao.findByEnUUAndCode(enUU, make.getMa_code());
@@ -57,7 +62,7 @@ public class MakeServiceImpl implements MakeService {
 				if (CollectionUtils.isEmpty(vendors)) {
 					vend = addVendor(make);
 					if (null != vend) {
-						addPartnerShipRecord(vend); // 添加合作伙伴
+						vendorService.addPartnerShipRecord(vend, appId); // 添加合作伙伴
 					}
 				} else {
 					vend = vendors.get(0);
@@ -71,31 +76,6 @@ public class MakeServiceImpl implements MakeService {
 		return makeOrders;
 	}
 
-	private void addPartnerShipRecord(Vendor vendor) {
-		PartnershipRecord shipRecord = new PartnershipRecord("uas", vendor);
-		com.uas.account.entity.PartnershipRecord record = new com.uas.account.entity.PartnershipRecord();
-		record.setAppId(shipRecord.getAppId());
-		record.setCustName(shipRecord.getCustName());
-		record.setCustUID(shipRecord.getCustUID());
-		record.setCustUserCode(shipRecord.getCustUserCode());
-		record.setCustUserEmail(shipRecord.getCustUserEmail());
-		record.setCustUserName(shipRecord.getCustUserName());
-		record.setCustUserTel(shipRecord.getCustUserTel());
-		record.setVendName(shipRecord.getVendName());
-		record.setVendUID(shipRecord.getVendUID());
-		record.setVendUserCode(shipRecord.getVendUserCode());
-		record.setVendUserEmail(shipRecord.getVendUserEmail());
-		record.setVendUserName(shipRecord.getVendUserName());
-		record.setVendUserTel(shipRecord.getVendUserTel());
-		try {
-			AccountUtils.synchronizeRecord(record);
-			vendor.setSynchStatus(Constant.YES);
-			vendorDao.save(vendor);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
 	/**
 	 * 增加供应商关系
 	 * 

+ 12 - 30
src/main/java/com/uas/platform/b2b/erp/service/impl/PurchaseForecastServiceImpl.java

@@ -1,12 +1,11 @@
 package com.uas.platform.b2b.erp.service.impl;
 
-import com.uas.account.util.AccountUtils;
 import com.uas.platform.b2b.dao.*;
 import com.uas.platform.b2b.erp.model.PurchaseForecast;
 import com.uas.platform.b2b.erp.service.PurchaseForecastService;
+import com.uas.platform.b2b.erp.service.VendorService;
 import com.uas.platform.b2b.model.*;
 import com.uas.platform.b2b.support.SystemSession;
-import com.uas.platform.b2b.temporary.model.PartnershipRecord;
 import com.uas.platform.core.model.Constant;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -30,6 +29,14 @@ public class PurchaseForecastServiceImpl implements PurchaseForecastService {
 	@Autowired
 	private PurchaseForecastAllDao purchaseForecastDao;
 
+	@Autowired
+	private VendorService vendorService;
+
+    /**
+     * 应用来源
+     */
+    private final String APPID = "uas";
+
 	@Override
 	public List<PurchaseForecastAllItem> convertPurchaseForecast(List<PurchaseForecast> purchaseForecasts) {
 		List<PurchaseForecastAllItem> items = new ArrayList<PurchaseForecastAllItem>();
@@ -59,7 +66,7 @@ public class PurchaseForecastServiceImpl implements PurchaseForecastService {
 							if (vendors.size() == 0) {
 								vendor = addVendor(item);
 								if (null != vendor) {
-									addPartnerShipRecord(vendor); // 添加合作伙伴关系
+									vendorService.addPartnerShipRecord(vendor, APPID); // 添加合作伙伴关系
 								}
 							} else {
 								vendor = vendors.get(0);
@@ -93,31 +100,6 @@ public class PurchaseForecastServiceImpl implements PurchaseForecastService {
 		return items;
 	}
 
-	private void addPartnerShipRecord(Vendor vendor) {
-		PartnershipRecord shipRecord = new PartnershipRecord("uas", vendor);
-		com.uas.account.entity.PartnershipRecord record = new com.uas.account.entity.PartnershipRecord();
-		record.setAppId(shipRecord.getAppId());
-		record.setCustName(shipRecord.getCustName());
-		record.setCustUID(shipRecord.getCustUID());
-		record.setCustUserCode(shipRecord.getCustUserCode());
-		record.setCustUserEmail(shipRecord.getCustUserEmail());
-		record.setCustUserName(shipRecord.getCustUserName());
-		record.setCustUserTel(shipRecord.getCustUserTel());
-		record.setVendName(shipRecord.getVendName());
-		record.setVendUID(shipRecord.getVendUID());
-		record.setVendUserCode(shipRecord.getVendUserCode());
-		record.setVendUserEmail(shipRecord.getVendUserEmail());
-		record.setVendUserName(shipRecord.getVendUserName());
-		record.setVendUserTel(shipRecord.getVendUserTel());
-		try {
-			AccountUtils.synchronizeRecord(record);
-			vendor.setSynchStatus(Constant.YES);
-			vendorDao.save(vendor);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
 	@Override
 	public List<PurchaseForecastAllItem> convertEDIPurchaseForecast(List<PurchaseForecast> purchaseForecasts, Long enUU) {
 		List<PurchaseForecastAllItem> items = new ArrayList<PurchaseForecastAllItem>();
@@ -146,7 +128,7 @@ public class PurchaseForecastServiceImpl implements PurchaseForecastService {
 							if (vendors.size() == 0) {
 								vendor = addVendor(item);
 								if (null != vendor) {
-									addPartnerShipRecord(vendor);
+                                    vendorService.addPartnerShipRecord(vendor, APPID); // 添加合作伙伴关系
 								}
 							} else {
 								vendor = vendors.get(0);
@@ -183,7 +165,7 @@ public class PurchaseForecastServiceImpl implements PurchaseForecastService {
 	/**
 	 * 添加供应商资料
 	 * 
-	 * @param forecast
+	 * @param forecastItem
 	 */
 	private Vendor addVendor(PurchaseForecastAllItem forecastItem) {
 		Enterprise enterprise = enterpriseDao.findOne(forecastItem.getVendUU());

+ 6 - 28
src/main/java/com/uas/platform/b2b/erp/service/impl/PurchaseSampleServiceImpl.java

@@ -1,13 +1,12 @@
 package com.uas.platform.b2b.erp.service.impl;
 
-import com.uas.account.util.AccountUtils;
 import com.uas.platform.b2b.dao.*;
 import com.uas.platform.b2b.erp.model.ProductSample;
 import com.uas.platform.b2b.erp.model.ProductSampleApproval;
 import com.uas.platform.b2b.erp.service.PurchaseSampleService;
+import com.uas.platform.b2b.erp.service.VendorService;
 import com.uas.platform.b2b.model.*;
 import com.uas.platform.b2b.support.SystemSession;
-import com.uas.platform.b2b.temporary.model.PartnershipRecord;
 import com.uas.platform.core.model.Constant;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -35,9 +34,13 @@ public class PurchaseSampleServiceImpl implements PurchaseSampleService {
 	@Autowired
 	private VendorDao vendorDao;
 
+	@Autowired
+	private VendorService vendorService;
+
 	@Override
 	public List<PurchaseProofingItem> convertProofing(List<ProductSample> samples) {
 		List<PurchaseProofingItem> proofingItems = new ArrayList<PurchaseProofingItem>();
+		final String appId = "uas";// 应用来源
 		long enUU = SystemSession.getUser().getEnterprise().getUu();
 		for (ProductSample sample : samples) {
 			List<PurchaseProofing> proofingList = purchaseProofingDao.findByEnUUAndCode(enUU, sample.getPs_code());
@@ -66,7 +69,7 @@ public class PurchaseSampleServiceImpl implements PurchaseSampleService {
 						if (vendors.size() == 0) {// 供应商列表中不存在供应商关系
 							vendor = addVendor(proofingItem);// 增加供应商关系
 							if (null != vendor) {
-								addPartnerShipRecord(vendor);
+								vendorService.addPartnerShipRecord(vendor, appId);
 							}
 						} else {
 							vendor = vendors.get(0);
@@ -91,31 +94,6 @@ public class PurchaseSampleServiceImpl implements PurchaseSampleService {
 		return proofingItems;
 	}
 
-	private void addPartnerShipRecord(Vendor vendor) {
-		PartnershipRecord shipRecord = new PartnershipRecord("uas", vendor);
-		com.uas.account.entity.PartnershipRecord record = new com.uas.account.entity.PartnershipRecord();
-		record.setAppId(shipRecord.getAppId());
-		record.setCustName(shipRecord.getCustName());
-		record.setCustUID(shipRecord.getCustUID());
-		record.setCustUserCode(shipRecord.getCustUserCode());
-		record.setCustUserEmail(shipRecord.getCustUserEmail());
-		record.setCustUserName(shipRecord.getCustUserName());
-		record.setCustUserTel(shipRecord.getCustUserTel());
-		record.setVendName(shipRecord.getVendName());
-		record.setVendUID(shipRecord.getVendUID());
-		record.setVendUserCode(shipRecord.getVendUserCode());
-		record.setVendUserEmail(shipRecord.getVendUserEmail());
-		record.setVendUserName(shipRecord.getVendUserName());
-		record.setVendUserTel(shipRecord.getVendUserTel());
-		try {
-			AccountUtils.synchronizeRecord(record);
-			vendor.setSynchStatus(Constant.YES);
-			vendorDao.save(vendor);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
 	/**
 	 * 添加供应商资料
 	 * 

+ 6 - 26
src/main/java/com/uas/platform/b2b/erp/service/impl/PurchaseServiceImpl.java

@@ -8,6 +8,7 @@ import com.uas.platform.b2b.erp.model.Purchase;
 import com.uas.platform.b2b.erp.model.PurchaseDetailEnd;
 import com.uas.platform.b2b.erp.model.PurchaseReply;
 import com.uas.platform.b2b.erp.service.PurchaseService;
+import com.uas.platform.b2b.erp.service.VendorService;
 import com.uas.platform.b2b.model.*;
 import com.uas.platform.b2b.support.SystemSession;
 import com.uas.platform.b2b.support.UsageBufferedLogger;
@@ -48,11 +49,15 @@ public class PurchaseServiceImpl implements PurchaseService {
 	@Autowired
 	private UserOrderDao userOrderDao;
 
+	@Autowired
+	private VendorService vendorService;
+
 	private final static UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
 
 	@Override
 	public List<PurcOrderInfoItem> convertPurchase(List<Purchase> purchases) {
 		List<PurcOrderInfoItem> orderItems = new ArrayList<PurcOrderInfoItem>();
+        final String appId = "uas";// 应用来源
 		long enUU = SystemSession.getUser().getEnterprise().getUu();
 		for (Purchase purchase : purchases) {
 			// 先查看是否已存在
@@ -65,7 +70,7 @@ public class PurchaseServiceImpl implements PurchaseService {
 				if (vendors.size() == 0) {// 供应商资料在平台上不存在
 					vendor = addVendor(order);// 添加企业的供应商资料
 					if (null != vendor) {
-						addPartnerShipRecord(vendor);// 添加企业圈合作伙伴关系
+						vendorService.addPartnerShipRecord(vendor, appId);// 添加企业圈合作伙伴关系
 					}
 				} else {// 供应商资料在平台上存在
 					vendor = vendors.get(0);
@@ -106,31 +111,6 @@ public class PurchaseServiceImpl implements PurchaseService {
 		return orderItems;
 	}
 
-	private void addPartnerShipRecord(Vendor vendor) {
-		PartnershipRecord shipRecord = new PartnershipRecord("uas", vendor);
-		com.uas.account.entity.PartnershipRecord record = new com.uas.account.entity.PartnershipRecord();
-		record.setAppId(shipRecord.getAppId());
-		record.setCustName(shipRecord.getCustName());
-		record.setCustUID(shipRecord.getCustUID());
-		record.setCustUserCode(shipRecord.getCustUserCode());
-		record.setCustUserEmail(shipRecord.getCustUserEmail());
-		record.setCustUserName(shipRecord.getCustUserName());
-		record.setCustUserTel(shipRecord.getCustUserTel());
-		record.setVendName(shipRecord.getVendName());
-		record.setVendUID(shipRecord.getVendUID());
-		record.setVendUserCode(shipRecord.getVendUserCode());
-		record.setVendUserEmail(shipRecord.getVendUserEmail());
-		record.setVendUserName(shipRecord.getVendUserName());
-		record.setVendUserTel(shipRecord.getVendUserTel());
-		try {
-			AccountUtils.synchronizeRecord(record);
-			vendor.setSynchStatus(Constant.YES);
-			vendorDao.save(vendor);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
 	@Override
 	public List<PurchaseReply> convertPurchaseOrderReply(List<PurchaseOrderReply> orderReplies) {
 		List<PurchaseReply> replies = new ArrayList<PurchaseReply>();

+ 6 - 28
src/main/java/com/uas/platform/b2b/erp/service/impl/QuotationServiceImpl.java

@@ -1,13 +1,12 @@
 package com.uas.platform.b2b.erp.service.impl;
 
-import com.uas.account.util.AccountUtils;
 import com.uas.platform.b2b.dao.*;
 import com.uas.platform.b2b.erp.model.Quotation;
 import com.uas.platform.b2b.erp.model.QuotationDecide;
 import com.uas.platform.b2b.erp.service.QuotationService;
+import com.uas.platform.b2b.erp.service.VendorService;
 import com.uas.platform.b2b.model.*;
 import com.uas.platform.b2b.support.SystemSession;
-import com.uas.platform.b2b.temporary.model.PartnershipRecord;
 import com.uas.platform.core.model.Constant;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -33,12 +32,16 @@ public class QuotationServiceImpl implements QuotationService {
 	@Autowired
 	private UserDao userDao;
 
+	@Autowired
+	private VendorService vendorService;
+
 	@Override
 	public Map<String, List<SaleQuotationItem>> convertQuotation(List<Quotation> quotations) {
 		Map<String, List<SaleQuotationItem>> mapSaleQuotationItem = new HashMap<String, List<SaleQuotationItem>>();
 		List<SaleQuotationItem> saveItems = new ArrayList<SaleQuotationItem>();
 		List<SaleQuotationItem> resItems = new ArrayList<SaleQuotationItem>();
 		long enUU = SystemSession.getUser().getEnterprise().getUu();
+        final String appId = "uas";// 应用来源
 		for (Quotation quotation : quotations) {
 			// 先查看是否已存在
 			List<SaleQuotation> quotations2 = saleQuotationDao.findByEnUUAndCode(enUU, quotation.getQu_code());
@@ -71,7 +74,7 @@ public class QuotationServiceImpl implements QuotationService {
 				} else {// 不存在对应的供应商资料,增加供应商关系
 					vendor = addVendor(saleQuotation);
 					if (null != vendor) {
-						addPartnerShipRecord(vendor); // 添加供应商关系同时增加合作伙伴关系记录
+                        vendorService.addPartnerShipRecord(vendor, appId); // 添加供应商关系同时增加合作伙伴关系记录
 					}
 				}
 				if (vendor != null && vendor.getMyEnUU() != null) {
@@ -109,31 +112,6 @@ public class QuotationServiceImpl implements QuotationService {
 		return mapSaleQuotationItem;
 	}
 
-	private void addPartnerShipRecord(Vendor vendor) {
-		PartnershipRecord shipRecord = new PartnershipRecord("uas", vendor);
-		com.uas.account.entity.PartnershipRecord record = new com.uas.account.entity.PartnershipRecord();
-		record.setAppId(shipRecord.getAppId());
-		record.setCustName(shipRecord.getCustName());
-		record.setCustUID(shipRecord.getCustUID());
-		record.setCustUserCode(shipRecord.getCustUserCode());
-		record.setCustUserEmail(shipRecord.getCustUserEmail());
-		record.setCustUserName(shipRecord.getCustUserName());
-		record.setCustUserTel(shipRecord.getCustUserTel());
-		record.setVendName(shipRecord.getVendName());
-		record.setVendUID(shipRecord.getVendUID());
-		record.setVendUserCode(shipRecord.getVendUserCode());
-		record.setVendUserEmail(shipRecord.getVendUserEmail());
-		record.setVendUserName(shipRecord.getVendUserName());
-		record.setVendUserTel(shipRecord.getVendUserTel());
-		try {
-			AccountUtils.synchronizeRecord(record);
-			vendor.setSynchStatus(Constant.YES);
-			vendorDao.save(vendor);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
 	@Override
 	public List<QuotationDecide> convertQuotationDecide(List<SaleQuotationItem> quotationItems) {
 		List<QuotationDecide> decides = new ArrayList<QuotationDecide>();

+ 6 - 30
src/main/java/com/uas/platform/b2b/erp/service/impl/TenderServiceImpl.java

@@ -7,6 +7,7 @@ import com.uas.platform.b2b.dao.*;
 import com.uas.platform.b2b.erp.model.B2BVendor;
 import com.uas.platform.b2b.erp.model.SaleTenderErp;
 import com.uas.platform.b2b.erp.service.TenderService;
+import com.uas.platform.b2b.erp.service.VendorService;
 import com.uas.platform.b2b.event.PurchaseTenderDecideReleaseEvent;
 import com.uas.platform.b2b.event.PurchaseTenderSaveReleaseEvent;
 import com.uas.platform.b2b.model.*;
@@ -97,6 +98,9 @@ public class TenderServiceImpl implements TenderService {
     @Autowired
     private SaleTenderQuestionDao saleTenderQuestionDao;
 
+    @Autowired
+    private VendorService vendorService;
+
     /**
      * 短信接口
      */
@@ -723,6 +727,7 @@ public class TenderServiceImpl implements TenderService {
      */
     private void addSaleTender(PurchaseTender tender, List<TenderContactInfo> contactInfos, PurchaseTenderProd tenderProd) {
         List<SaleTender> eventList = new ArrayList<>();
+        final String appId = "uas";// 应用来源
         if (!CollectionUtils.isEmpty(contactInfos)) {
             List<SaleTenderItem> saleTenderItems = new ArrayList<>();
             for (TenderContactInfo contactInfo : contactInfos) {
@@ -757,7 +762,7 @@ public class TenderServiceImpl implements TenderService {
                                 if (vendors.size() == 0) {// 供应商列表中不存在供应商关系
                                     vendor = addVendor(saleTender);// 增加供应商关系
                                     if (null != vendor) {
-                                        addPartnerShipRecord(vendor);
+                                        vendorService.addPartnerShipRecord(vendor, appId);
                                     }
                                 } else {
                                     vendor = vendors.get(0);
@@ -885,35 +890,6 @@ public class TenderServiceImpl implements TenderService {
         return null;
     }
 
-    /**
-     * 添加合作伙伴关系
-     * @param vendor
-     */
-    private void addPartnerShipRecord(Vendor vendor) {
-        PartnershipRecord shipRecord = new PartnershipRecord("uas", vendor);
-        com.uas.account.entity.PartnershipRecord record = new com.uas.account.entity.PartnershipRecord();
-        record.setAppId(shipRecord.getAppId());
-        record.setCustName(shipRecord.getCustName());
-        record.setCustUID(shipRecord.getCustUID());
-        record.setCustUserCode(shipRecord.getCustUserCode());
-        record.setCustUserEmail(shipRecord.getCustUserEmail());
-        record.setCustUserName(shipRecord.getCustUserName());
-        record.setCustUserTel(shipRecord.getCustUserTel());
-        record.setVendName(shipRecord.getVendName());
-        record.setVendUID(shipRecord.getVendUID());
-        record.setVendUserCode(shipRecord.getVendUserCode());
-        record.setVendUserEmail(shipRecord.getVendUserEmail());
-        record.setVendUserName(shipRecord.getVendUserName());
-        record.setVendUserTel(shipRecord.getVendUserTel());
-        try {
-            AccountUtils.synchronizeRecord(record);
-            vendor.setSynchStatus(Constant.YES);
-            vendorDao.save(vendor);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
     /**
      * 删除产品明细
      *

+ 34 - 0
src/main/java/com/uas/platform/b2b/erp/service/impl/VendorServiceImpl.java

@@ -15,8 +15,10 @@ import com.uas.platform.b2b.model.Vendor;
 import com.uas.platform.b2b.support.MessageConf;
 import com.uas.platform.b2b.support.SysConf;
 import com.uas.platform.b2b.support.SystemSession;
+import com.uas.platform.b2b.temporary.model.PartnershipRecord;
 import com.uas.platform.b2b.temporary.model.SmsMessage;
 import com.uas.platform.core.logging.BufferedLoggerManager;
+import com.uas.platform.core.model.Constant;
 import com.uas.platform.core.model.Status;
 import com.uas.platform.core.util.HttpUtil;
 import com.uas.platform.core.util.serializer.FlexJsonUtils;
@@ -209,4 +211,36 @@ public class VendorServiceImpl implements VendorService{
         String sql = "update purc$vendors set ve_erpstatus = 203 where ve_id in (" + ids +")";
         commonDao.getJdbcTemplate().update(sql);
     }
+
+    /**
+     * 添加合作伙伴
+     *
+     * @param vendor 供应商资料
+     * @param appId  应用来源
+     */
+    @Override
+    public void addPartnerShipRecord(Vendor vendor, String appId) {
+        PartnershipRecord shipRecord = new PartnershipRecord(appId, vendor);
+        com.uas.account.entity.PartnershipRecord record = new com.uas.account.entity.PartnershipRecord();
+        record.setAppId(shipRecord.getAppId());
+        record.setCustName(shipRecord.getCustName());
+        record.setCustUID(shipRecord.getCustUID());
+        record.setCustUserCode(shipRecord.getCustUserCode());
+        record.setCustUserEmail(shipRecord.getCustUserEmail());
+        record.setCustUserName(shipRecord.getCustUserName());
+        record.setCustUserTel(shipRecord.getCustUserTel());
+        record.setVendName(shipRecord.getVendName());
+        record.setVendUID(shipRecord.getVendUID());
+        record.setVendUserCode(shipRecord.getVendUserCode());
+        record.setVendUserEmail(shipRecord.getVendUserEmail());
+        record.setVendUserName(shipRecord.getVendUserName());
+        record.setVendUserTel(shipRecord.getVendUserTel());
+        try {
+            AccountUtils.synchronizeRecord(record);
+            vendor.setSynchStatus(Constant.YES);
+            vendorDao.save(vendor);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
 }

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

@@ -323,6 +323,42 @@ public class PublicInquiryItem implements Serializable {
 	@Transient
 	private String quDomain;
 
+	/**
+	 * 物料编号
+	 */
+	@Transient
+	private String prodCode;
+
+	/**
+	 * 名称
+	 */
+	@Transient
+	private String prodTitle;
+
+	/**
+	 * 规格
+	 */
+	@Transient
+	private String spec;
+
+	/**
+	 * 单位
+	 */
+	@Transient
+	private String unit;
+
+	/**
+	 * 型号
+	 */
+	@Transient
+	private String cmpCode;
+
+	/**
+	 * 品牌
+	 */
+	@Transient
+	private String inbrand;
+
 	public Long getId() {
 		return id;
 	}
@@ -686,6 +722,54 @@ public class PublicInquiryItem implements Serializable {
 		this.quDomain = quDomain;
 	}
 
+	public String getProdCode() {
+		return prodCode;
+	}
+
+	public void setProdCode(String prodCode) {
+		this.prodCode = prodCode;
+	}
+
+	public String getProdTitle() {
+		return prodTitle;
+	}
+
+	public void setProdTitle(String prodTitle) {
+		this.prodTitle = prodTitle;
+	}
+
+	public String getSpec() {
+		return spec;
+	}
+
+	public void setSpec(String spec) {
+		this.spec = spec;
+	}
+
+	public String getUnit() {
+		return unit;
+	}
+
+	public void setUnit(String unit) {
+		this.unit = unit;
+	}
+
+	public String getCmpCode() {
+		return cmpCode;
+	}
+
+	public void setCmpCode(String cmpCode) {
+		this.cmpCode = cmpCode;
+	}
+
+	public String getInbrand() {
+		return inbrand;
+	}
+
+	public void setInbrand(String inbrand) {
+		this.inbrand = inbrand;
+	}
+
 	/**
 	 * 回复记录的描述
 	 * 

+ 32 - 0
src/main/java/com/uas/platform/b2b/model/PurchaseApBillOut.java

@@ -250,6 +250,22 @@ public class PurchaseApBillOut implements Serializable {
 	@Column(name = "pabo_kpdh")
 	private String kpdh;
 
+	//票加加字段
+
+	/**
+	 * 请求流水号
+	 * @return
+	 */
+	@Column(name = "request_code")
+	private String requestCode;
+
+	/**
+	 * 是否允许重开  0允许,1不允许
+	 * @return
+	 */
+	@Column(name = "reissue")
+	private String reissue;
+
 	public Long getId() {
 		return id;
 	}
@@ -537,4 +553,20 @@ public class PurchaseApBillOut implements Serializable {
 	public void setKpdh(String kpdh) {
 		this.kpdh = kpdh;
 	}
+
+	public String getRequestCode() {
+		return requestCode;
+	}
+
+	public void setRequestCode(String requestCode) {
+		this.requestCode = requestCode;
+	}
+
+	public String getReissue() {
+		return reissue;
+	}
+
+	public void setReissue(String reissue) {
+		this.reissue = reissue;
+	}
 }

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

@@ -50,7 +50,7 @@ public class PurchaseApBillOutItem implements Serializable {
 	private Integer statusCode;
 
 	/**
-	 * 开票单价  //已用作明细开票金额
+	 * 开票单价
 	 */
 	@Column(name = "pai_nowprice")
 	private Double nowPrice;
@@ -62,7 +62,7 @@ public class PurchaseApBillOutItem implements Serializable {
 	private Double costPrice;
 
 	/**
-	 * 发票单价  //已用作产品单价
+	 * 发票单价
 	 */
 	@Column(name = "pai_price")
 	private Double price;

+ 73 - 0
src/main/java/com/uas/platform/b2b/service/PiaoPlusService.java

@@ -0,0 +1,73 @@
+package com.uas.platform.b2b.service;
+
+import com.uas.platform.b2b.model.PurchaseApBillOut;
+import org.springframework.ui.ModelMap;
+
+/**
+ * Created by 黄诚天 on 2018/02/25.
+ *
+ * 票加加服务接口
+ */
+public interface PiaoPlusService {
+
+    /**
+     * 发票开具
+     *
+     * @param apBillOut
+     * @return
+     */
+    public ModelMap invoiceIssued(PurchaseApBillOut apBillOut);
+
+    /**
+     * 发票作废  冲红
+     *
+     * @param apBillOut
+     * @return
+     */
+    public ModelMap InvoiceCancel(PurchaseApBillOut apBillOut);
+
+    /**
+     * 查询发票信息
+     *
+     * @param apBillOut
+     * @return
+     */
+    public ModelMap queryInvoiceMessage(PurchaseApBillOut apBillOut);
+
+    /**
+     * 开票统计
+     *
+     * @param queryDate 指定的统计月份。格式YYYYMM
+     * @return
+     */
+    public ModelMap querybillingcount(String queryDate);
+
+    /**
+     * 余票查询 查询金税盘剩余发票
+     * @return
+     */
+    public ModelMap queryBillLeftCount();
+
+    /**
+     * 发票打印  专票和普通,可以通过该接口打印纸质发票。目前仅支持百望税盘
+     * @param apBillOut
+     * @return
+     */
+    public ModelMap printInvoice (PurchaseApBillOut apBillOut);
+
+    /**
+     * 快递单信息获取接口
+     * 外部系统,在开票成功后,可通过订单编号和税号,来获取某个订单的快递单号
+     * @param apBillOut
+     * @return
+     */
+    public ModelMap queryDelivery(PurchaseApBillOut apBillOut);
+
+    /**
+     * 上传接口
+     * 用于在票加加产品纸质发票功能中,导入申请单时规范导入文件的格式与内容
+     * @param apBillOut
+     * @return
+     */
+    public ModelMap uploadInvoice(PurchaseApBillOut apBillOut);
+}

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

@@ -148,4 +148,19 @@ public interface PurchaseApBillOutService {
 	 * @return
 	 */
 	public ModelMap invoiceCancel(PurchaseApBillOut apBillOut);
+
+	/**
+	 * 保存开票明细
+	 **/
+	public void saveByItem(List<PurchaseApBillOutItem> apBillOutItems);
+
+	/**
+	 * 保存票加加返回的开票信息
+	 */
+	public void save(PurchaseApBillOut purchaseApBillOut);
+
+	/**
+	 * 根据单号获取开票信息
+	 **/
+	public PurchaseApBillOut findByCode(String orderNo);
 }

+ 185 - 181
src/main/java/com/uas/platform/b2b/service/impl/BaseInfoServiceImpl.java

@@ -11,6 +11,7 @@ import com.uas.platform.b2b.dao.EnterpriseDao;
 import com.uas.platform.b2b.dao.ProductDao;
 import com.uas.platform.b2b.dao.ProductMatchResultDao;
 import com.uas.platform.b2b.dao.ProductStatusDao;
+import com.uas.platform.b2b.dao.ProductTempDao;
 import com.uas.platform.b2b.dao.PurchaseOrderAllDao;
 import com.uas.platform.b2b.dao.PurchaseOrderAllItemDao;
 import com.uas.platform.b2b.dao.RoleDao;
@@ -26,6 +27,7 @@ import com.uas.platform.b2b.model.EnterpriseInfo;
 import com.uas.platform.b2b.model.FileUpload;
 import com.uas.platform.b2b.model.Product;
 import com.uas.platform.b2b.model.ProductStatus;
+import com.uas.platform.b2b.model.ProductTemp;
 import com.uas.platform.b2b.model.PurchaseOrderAll;
 import com.uas.platform.b2b.model.PurchaseOrderAllItem;
 import com.uas.platform.b2b.model.Role;
@@ -128,6 +130,9 @@ public class BaseInfoServiceImpl implements BaseInfoService {
 	@Autowired
 	private ProductStatusDao productStatusDao;
 
+	@Autowired
+    private ProductTempDao productTempDao;
+
 	/**
 	 * 一次上传允许的最大数量
 	 */
@@ -139,213 +144,212 @@ public class BaseInfoServiceImpl implements BaseInfoService {
 	 */
 	@Override
 	public ModelMap releaseByWorkbook(Workbook workbook) {
-		ModelMap modelMap = new ModelMap();
-		List<String> alters = new ArrayList<String>();
-		List<String> infos = new ArrayList<String>();
-		List<Product> products = new ArrayList<Product>();
-		List<Product> productsInfo = new ArrayList<Product>();
-		Sheet sheet = workbook.getSheetAt(0);
-		String codePrefix = "PR" + DateUtils.format(new Date(), "yyMMddHHmmss") + StringUtil.getRandomNumber(3);
-		int rowNum = sheet.getLastRowNum();
-		Row headerRow = sheet.getRow(0);
-		int total = 0;
-		if (headerRow != null) {
-			for (int r = 3; r <= rowNum; r++) {
-				Row row = sheet.getRow(r);
-				if (row != null && row.getCell(1) != null && row.getCell(1).getCellType() != Cell.CELL_TYPE_BLANK) {
-					total++;
-					Product product = new Product();
-
-					// 物料编号
-					if (row.getCell(0) != null && row.getCell(0).getCellType() != Cell.CELL_TYPE_BLANK) {
-						row.getCell(0).setCellType(Cell.CELL_TYPE_STRING);
-						product.setCode(row.getCell(0).getStringCellValue().trim());
-					} else {
-						product.setCode(codePrefix + StringUtils.leftPad(String.valueOf(r), 4, "0"));
-					}
+        long start = System.currentTimeMillis();
+        ModelMap modelMap = new ModelMap();
+        List<ProductTemp> temps = new ArrayList<>();
+        Long enUU = SystemSession.getUser().getEnterprise().getUu();
+        Long userUU = SystemSession.getUser().getUserUU();
+        // 生成随机物料编码
+        String codePrefix = "PR" + DateUtils.format(new Date(), "yyMMddHHmmss") + StringUtil.getRandomNumber(3);
+        Sheet sheet = workbook.getSheetAt(0);
+        int rowNum = sheet.getLastRowNum();
+        Row headerRow = sheet.getRow(0);
+        int total = 0;
+        short isSale = Constant.YES;
+        short isPurchase = Constant.NO;
+        String importId = StringUtil.getRandomNumber(8);
+        if (headerRow != null) {
+            for (int r = 3; r <= rowNum; r++) {
+                Row row = sheet.getRow(r);
+                if (row != null && row.getCell(1) != null && row.getCell(1).getCellType() != Cell.CELL_TYPE_BLANK) {
+                    total++;
+                    ProductTemp temp = new ProductTemp();
+                    temp.setPr_import_id(importId);
+                    temp.setPr_enuu(enUU);
+                    temp.setPr_useruu(userUU);
+                    temp.setPr_issale(isSale);
+                    temp.setPr_ispurchase(isPurchase);
+                    temp.setPr_sourceapp("B2B");
+                    // 物料编号
+                    if (row.getCell(0) != null && row.getCell(0).getCellType() != Cell.CELL_TYPE_BLANK) {
+                        row.getCell(0).setCellType(Cell.CELL_TYPE_STRING);
+                        temp.setPr_code(row.getCell(0).getStringCellValue().trim());
+                    } else {
+                        temp.setPr_code(codePrefix + StringUtils.leftPad(String.valueOf(r), 4, "0"));
+                    }
 
-					// 物料名称
-					if (row.getCell(1) != null && row.getCell(1).getCellType() != Cell.CELL_TYPE_BLANK) {
-						row.getCell(1).setCellType(Cell.CELL_TYPE_STRING);
-						product.setTitle(row.getCell(1).getStringCellValue().trim());
-					} else {
+                    // 物料名称
+                    if (row.getCell(1) != null && row.getCell(1).getCellType() != Cell.CELL_TYPE_BLANK) {
+                        row.getCell(1).setCellType(Cell.CELL_TYPE_STRING);
+                        temp.setPr_title(row.getCell(1).getStringCellValue().trim());
+                    } else {
                         modelMap.put("error", "第" + (r + 1) + "行物料名称未填写");
                         return modelMap;
                     }
 
-					// 物料规格
-					if (row.getCell(2) != null && row.getCell(2).getCellType() != Cell.CELL_TYPE_BLANK) {
-						row.getCell(2).setCellType(Cell.CELL_TYPE_STRING);
-						product.setSpec(row.getCell(2).getStringCellValue().trim());
-					} else {
+                    // 物料规格
+                    if (row.getCell(2) != null && row.getCell(2).getCellType() != Cell.CELL_TYPE_BLANK) {
+                        row.getCell(2).setCellType(Cell.CELL_TYPE_STRING);
+                        temp.setPr_spec(row.getCell(2).getStringCellValue().trim());
+                    } else {
                         modelMap.put("error", "第" + (r + 1) + "行物料规格未填写");
                         return modelMap;
                     }
 
-					// 原厂型号
-					if (row.getCell(3) != null && row.getCell(3).getCellType() != Cell.CELL_TYPE_BLANK) {
-						row.getCell(3).setCellType(Cell.CELL_TYPE_STRING);
-						product.setCmpCode(row.getCell(3).getStringCellValue().trim());
-					} else {
+                    // 原厂型号
+                    if (row.getCell(3) != null && row.getCell(3).getCellType() != Cell.CELL_TYPE_BLANK) {
+                        row.getCell(3).setCellType(Cell.CELL_TYPE_STRING);
+                        temp.setPr_cmpcode(row.getCell(3).getStringCellValue().trim());
+                    } else {
                         modelMap.put("error", "第" + (r + 1) + "行物料型号未填写");
                         return modelMap;
                     }
 
-					// 品牌
-					if (row.getCell(4) != null && row.getCell(4).getCellType() != Cell.CELL_TYPE_BLANK) {
-						row.getCell(4).setCellType(Cell.CELL_TYPE_STRING);
-						product.setBrand(row.getCell(4).getStringCellValue().trim());
-					} else {
+                    // 品牌
+                    if (row.getCell(4) != null && row.getCell(4).getCellType() != Cell.CELL_TYPE_BLANK) {
+                        row.getCell(4).setCellType(Cell.CELL_TYPE_STRING);
+                        temp.setPr_brand(row.getCell(4).getStringCellValue().trim());
+                    } else {
                         modelMap.put("error", "第" + (r + 1) + "行品牌未填写");
                         return modelMap;
                     }
 
-					// 单位
-					if (row.getCell(5) != null && row.getCell(5).getCellType() != Cell.CELL_TYPE_BLANK) {
-						row.getCell(5).setCellType(Cell.CELL_TYPE_STRING);
-						if (null != row.getCell(5).getStringCellValue()
-								&& !row.getCell(5).getStringCellValue().trim().equals("")) {
-							product.setUnit(row.getCell(5).getStringCellValue());
-						}
-					} else {
+                    // 单位
+                    if (row.getCell(5) != null && row.getCell(5).getCellType() != Cell.CELL_TYPE_BLANK) {
+                        row.getCell(5).setCellType(Cell.CELL_TYPE_STRING);
+                        if (null != row.getCell(5).getStringCellValue()
+                                && !row.getCell(5).getStringCellValue().trim().equals("")) {
+                            temp.setPr_unit(row.getCell(5).getStringCellValue());
+                        }
+                    } else {
                         modelMap.put("error", "第" + (r + 1) + "行单位未填写");
                         return modelMap;
                     }
-					// 最小包装量
-					if (row.getCell(6) != null) {
-						row.getCell(6).setCellType(Cell.CELL_TYPE_STRING);
-						if (null != row.getCell(6).getStringCellValue().trim()
-								&& !row.getCell(6).getStringCellValue().trim().equals("")) {
-							product.setMinPack(Double.valueOf(row.getCell(6).getStringCellValue()));
-						}
-					}
-					// 最小订购量
-					if (row.getCell(7) != null) {
-						row.getCell(7).setCellType(Cell.CELL_TYPE_STRING);
-						if (null != row.getCell(7).getStringCellValue().trim()
-								&& !row.getCell(7).getStringCellValue().trim().equals("")) {
-							product.setMinOrder(Double.valueOf(row.getCell(7).getStringCellValue()));
-						}
-					}
-					// 交货周期
-					if (row.getCell(8) != null) {
-						row.getCell(8).setCellType(Cell.CELL_TYPE_STRING);
-						if (null != row.getCell(8).getStringCellValue().trim()
-								&& !row.getCell(8).getStringCellValue().trim().equals("")) {
-							product.setLeadtime(Double.valueOf(row.getCell(8).getStringCellValue()));
-						}
-					}
-					// 交货提前期
-					if (row.getCell(9) != null) {
-						row.getCell(9).setCellType(Cell.CELL_TYPE_STRING);
-						if (null != row.getCell(9).getStringCellValue().trim()
-								&& !row.getCell(9).getStringCellValue().trim().equals("")) {
-							product.setLtinstock(Double.valueOf(row.getCell(9).getStringCellValue()));
-						}
-					}
-					// 判断是否存在
-					List<Product> prods = productDao.findByEnUUAndCode(SystemSession.getUser().getEnterprise().getUu(),
-							product.getCode());
-					if (!CollectionUtils.isEmpty(prods)) {
-						// 如果存在且不是ERP传来的物料,允许修改
-						if (!"ERP".equals(prods.get(0).getSourceApp())) {
-							Product temp = new Product();
-							BeanUtils.copyProperties(prods.get(0), temp);
-							temp.setCode(product.getCode());
-							temp.setTitle(product.getTitle());
-							temp.setSpec(product.getSpec());
-							temp.setCmpCode(product.getCmpCode());
-							temp.setBrand(product.getBrand());
-							temp.setUnit(product.getUnit());
-							temp.setMinPack(product.getMinPack());
-							temp.setMinOrder(product.getMinOrder());
-							temp.setLeadtime(product.getLeadtime());
-							temp.setLtinstock(product.getLtinstock());
-							BeanUtils.copyProperties(temp, product);
-							alters.add(product.getCode());
-						} else {
-							// ERP上传的物料不更新
-							infos.add(product.getCode());
-							product.setCode(null);
-						}
-						// 如果已存在,且被禁用,修改为可用
-						List<ProductStatus> productStatuses = productStatusDao.findByPrIdAndB2bDisabled(prods.get(0).getId(), Constant.YES);
-						if (!CollectionUtils.isEmpty(productStatuses)) {
-							ProductStatus status = productStatuses.get(0);
-							status.setB2bDisabled(Constant.NO);
-							productStatusDao.save(status);
-						}
-					}
-					product.setEnUU(SystemSession.getUser().getEnterprise().getUu());
-					product.setUserUU(SystemSession.getUser().getUserUU());
-					product.setIsPubsale(Constant.NO);
-					product.setIsShow(Constant.NO);
-					product.setIsSale(Constant.YES);
-					product.setSourceApp("B2B");
-					if (alters.size() > 0) {
-						modelMap.put("alters", alters);
-					}
-					if (infos.size() > 0) {
-						modelMap.put("infos", infos);
-					}
-					if (product.getCode() != null) {
-						products.add(product);
-					}
-					if (product.getStandard() == null) {
-						product.setStandard(Constant.NO);
-					}
-					product.setErpDate(new Date());
-					productsInfo.add(product);
-					modelMap.put("total", total);
-					modelMap.put("products", productsInfo);
-				}
-			}
+                    // 最小包装量
+                    if (row.getCell(6) != null) {
+                        row.getCell(6).setCellType(Cell.CELL_TYPE_STRING);
+                        if (null != row.getCell(6).getStringCellValue().trim()
+                                && !row.getCell(6).getStringCellValue().trim().equals("")) {
+                            try {
+                                temp.setPr_minpack(Double.valueOf(row.getCell(6).getStringCellValue()));
+                            } catch (NumberFormatException e) {
+                                throw new IllegalOperatorException("第" + (r + 1) + "行最小包装量填写不规范,请填数字");
+                            }
+                        }
+                    }
+                    // 最小订购量
+                    if (row.getCell(7) != null) {
+                        row.getCell(7).setCellType(Cell.CELL_TYPE_STRING);
+                        if (null != row.getCell(7).getStringCellValue().trim()
+                                && !row.getCell(7).getStringCellValue().trim().equals("")) {
+                            try {
+                                temp.setPr_minorder(Double.valueOf(row.getCell(7).getStringCellValue()));
+                            } catch (NumberFormatException e) {
+                                throw new IllegalOperatorException("第" + (r + 1) + "行最小订购量填写不规范,请填数字");
+                            }
+                        }
+                    }
+                    // 交货周期
+                    if (row.getCell(8) != null) {
+                        row.getCell(8).setCellType(Cell.CELL_TYPE_STRING);
+                        if (null != row.getCell(8).getStringCellValue().trim()
+                                && !row.getCell(8).getStringCellValue().trim().equals("")) {
+                            try {
+                                temp.setPr_leadtime(Double.valueOf(row.getCell(8).getStringCellValue()));
+                            } catch (NumberFormatException e) {
+                                throw new IllegalOperatorException("第" + (r + 1) + "行交货周期填写不规范,请填数字");
+                            }
+                        }
+                    }
+                    // 交货提前期
+                    if (row.getCell(9) != null) {
+                        row.getCell(9).setCellType(Cell.CELL_TYPE_STRING);
+                        if (null != row.getCell(9).getStringCellValue().trim()
+                                && !row.getCell(9).getStringCellValue().trim().equals("")) {
+                            try {
+                                temp.setPr_ltinstock(Double.valueOf(row.getCell(9).getStringCellValue()));
+                            } catch (NumberFormatException e) {
+                                throw new IllegalOperatorException("第" + (r + 1) + "行交货提前期填写不规范,请填数字");
+                            }
+                        }
+                    }
+                    temps.add(temp);
+                }
+            }
             if (total > MAX_ROWNUM) {
                 throw new IllegalOperatorException("批量导入超过限制行数5000行,不能导入!");
             }
-			if (!CollectionUtils.isEmpty(products)) {
-				try {
-					ProductUtils.paginationUpdate(products);
-//					saveUserOrders(products);
-					modelMap.put("success", products.size());
-				} catch (Exception e) {
-					modelMap.put("error", "上传出现问题");
-				}
-			}
-		}
-		return modelMap;
+            modelMap.put("total", total);
+            // 本地校验
+            checkTempProducts(temps, modelMap);
+            // 保存到公共库
+            saveToDataCenter(temps, modelMap);
+            System.out.println("总耗时:" + (System.currentTimeMillis() - start));
+        }
+        return modelMap;
 
 	}
 
-//	private void saveUserOrders(final List<Product> products) {
-//		final Long userUU = SystemSession.getUser().getUserUU();
-//		ThreadTask.getInstance().execute(new Runnable() {
-//			@Override
-//			public void run() {
-//				/* 添加供应商的阅读记录*/
-//				List<UserOrders> list = new ArrayList<>();
-//				if (!CollectionUtils.isEmpty(products)) {
-//					int i = 0;
-//					List<User> users = userDao.findByEnUU(products.get(0).getEnUU());
-//					for (Product product : products) {
-//						i++;
-//						UserOrders userOrders;
-//						for (User user : users) {
-//							if (user == null || Objects.equals(user.getUserUU(), userUU)) {
-//								continue;
-//							}
-//							userOrders = new UserOrders(user.getUserUU(), product.getEnUU(), product.getId(), "purc", "products");
-//							list.add(userOrders);
-//						}
-//						if (i > 99) {
-//							break;
-//						}
-//					}
-//					userOrderDao.save(list);
-//				}
-//			}
-//		});
-//	}
+    /**
+     * 校验导入的物料
+     *
+     * @param temps
+     */
+    private void checkTempProducts(List<ProductTemp> temps, ModelMap modelMap) {
+        long start = System.currentTimeMillis();
+        if (!org.springframework.util.CollectionUtils.isEmpty(temps)) {
+            String importId = temps.get(0).getPr_import_id();
+            // 放入数据库
+            productTempDao.save(temps);
+            // 匹配已存在物料
+            productTempDao.matchExists(importId);
+            // 已禁用物料自动解禁
+            productTempDao.toggleDisabled(importId);
+            // 返回在物料库已存在的物料名称
+            List<String> existed = productTempDao.getExistsTitle(importId);
+            if (!org.springframework.util.CollectionUtils.isEmpty(existed)) {
+                modelMap.put("alters", existed);
+            }
+            System.out.println("校验:" + (System.currentTimeMillis() - start));
+        }
+    }
+
+    /**
+     * 保存到公共库
+     */
+    private void saveToDataCenter(List<ProductTemp> temps, ModelMap modelMap){
+        long start = System.currentTimeMillis();
+        if (!org.springframework.util.CollectionUtils.isEmpty(temps)) {
+            String importId = temps.get(0).getPr_import_id();
+            // 已匹配+未匹配到的物料
+            List<Product> products = productTempDao.getProducts(importId);
+            System.out.println("取匹配后结果:" + (System.currentTimeMillis() - start));
+            start = System.currentTimeMillis();
+			try {
+				// 更新物料并插入个人物料
+				ModelMap map = ProductUtils.paginationUpdateAndAddToProductUser(products);
+				System.out.println("更新物料:" + (System.currentTimeMillis() - start));
+				if ("true".equals(map.get("success"))) {
+					modelMap.put("success", null != map.get("result") ? map.get("result") : 0);
+				} else {
+					modelMap.put("error", "物料添加失败(" + null != map.get("message") ? map.get("message") : "" + ")");
+				}
+//                start = System.currentTimeMillis();
+//                if (!CollectionUtils.isEmpty(idList)) {
+//                    // 更新个人物料
+//                    List<ProductUsers> productUsersList = productTempDao.getNotMatchedProductUsers(importId,
+//                            temps.get(0).getPr_enuu(), temps.get(0).getPr_useruu(), idList);
+//                    if (!CollectionUtils.isEmpty(productUsersList)) {
+//                        ProductUtils.updateProductUsersByBatch(productUsersList);
+//                        modelMap.put("success", productUsersList.size());
+//                        System.out.println("更新个人物料:" + (System.currentTimeMillis() - start));
+//                    }
+//                }
+			} catch (Exception e) {
+				modelMap.put("error", "物料添加失败(" + e.getMessage() + ")");
+			}
+        }
+    }
 
 	/**
 	 * 更新物料信息

+ 14 - 5
src/main/java/com/uas/platform/b2b/service/impl/PagingReleaseServiceImpl.java

@@ -38,6 +38,17 @@ public class PagingReleaseServiceImpl implements PagingReleaseService {
 
     @Autowired
     private PagingReleaseDetailDao pagingReleaseDetailDao;
+
+    /**
+     * 消息类型 (在B2B消息中拼接跳转单据详情url请求时需要)
+     */
+    private final String INQUIRY_TYPE = "公共询价";
+
+    /**
+     * 消息类型,公共询价的采纳结果
+     */
+    private final String INQUIRY_DECIDE_TYPE = "公共询价采纳结果";
+
     /**
      * 获取未读消息数量
      *
@@ -85,17 +96,15 @@ public class PagingReleaseServiceImpl implements PagingReleaseService {
     @Override
     public com.uas.account.support.Page<MessageModel> getPublicMessage(String keyword, PageParams params, Short isRead) throws Exception {
         com.uas.account.support.Page<MessageModel> page =  MessageUtils.getMessage(params, isRead, keyword);
-        List<MessageModel> messageModelList = new ArrayList<>();
         if (page != null) {
             for (MessageModel messageModel : page.getContent()) {
                 // 拼接公共询价链接
-                if ("公共询价".equals(messageModel.getType())) {
-
+                if (INQUIRY_TYPE.equals(messageModel.getType())) {
                     messageModel.setUrl("#/baseInfo/inquiryList/" + messageModel.getSourceId());
+                } else if (INQUIRY_DECIDE_TYPE.equals(messageModel.getType())) {
+                    messageModel.setUrl("#/sale/pubinquiry/" + messageModel.getSourceId());
                 }
-                messageModelList.add(messageModel);
             }
-            page.setContent(messageModelList);
         }
         return page;
     }

+ 958 - 0
src/main/java/com/uas/platform/b2b/service/impl/PiaoPlusServiceImpl.java

@@ -0,0 +1,958 @@
+package com.uas.platform.b2b.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.uas.platform.b2b.dao.PurchaseApBillOutDao;
+import com.uas.platform.b2b.dao.PurchaseApBillOutInfoDao;
+import com.uas.platform.b2b.model.Product;
+import com.uas.platform.b2b.model.PurchaseApBillOut;
+import com.uas.platform.b2b.model.PurchaseApBillOutInfo;
+import com.uas.platform.b2b.model.PurchaseApBillOutItem;
+import com.uas.platform.b2b.service.PiaoPlusService;
+import com.uas.platform.b2b.support.SystemSession;
+import com.uas.platform.core.util.HttpUtil;
+import com.uas.ps.core.util.StringUtils;
+import com.uas.sso.common.encrypt.MD5;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.ui.ModelMap;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.text.DecimalFormat;
+import java.util.*;
+
+@Service
+public class PiaoPlusServiceImpl implements PiaoPlusService{
+    @Autowired
+    PurchaseApBillOutDao purchaseApBillOutDao;
+
+    @Autowired
+    PurchaseApBillOutInfoDao purchaseApBillOutInfoDao;
+
+    DecimalFormat df = new DecimalFormat("#.00");
+    private boolean isBaiWang = true;
+
+    @Override
+    public ModelMap invoiceIssued(PurchaseApBillOut apBillOut) {
+        ModelMap result = new ModelMap();
+        StringBuilder errorMsg = new StringBuilder();
+
+        String url = "http://192.168.253.75:8282/icloud/invoice/issue.json";
+        String invoiceKind = "004";//004:专票,007:普票, 026:电子票.百望税盘必填
+        String eqptType = "1";//设备类型 0税控服务,1税控盘.百望税盘必填
+        String collectorPhone = "18770087064";
+        String drawer = SystemSession.getUser().getUserName();
+        String taxDiskCode = "";
+        String taxDiskPwd = "";
+        String taxSignPwd = "";
+
+        Set<PurchaseApBillOutItem> apBillOutItems = apBillOut.getItems();
+        //获取购方开票信息
+        PurchaseApBillOutInfo customerApBillOutInfo = apBillOut.getCustomerApBillOutInfo();
+        if (customerApBillOutInfo == null) {
+            result.put("error", errorMsg.append("获取不到购方开票信息,请先完善!"));
+            return result;
+        }
+        //获取销方开票信息
+        PurchaseApBillOutInfo apBillOutInfo = apBillOut.getApBillOutInfo();
+        if (apBillOutInfo == null) {
+            result.put("error", errorMsg.append("获取不到销方开票信息,请先完善!"));
+            return result;
+        }
+
+        //签名部分
+        List<String> paras = new ArrayList<>();
+        paras.add("buyerName=" + apBillOut.getCustName());
+        paras.add("collectorPhone=" + collectorPhone);//TODO 收票人手机
+        paras.add("drawer=" + drawer);//开票人
+        paras.add("orderNo=" + apBillOut.getCode());
+        //专票时以下参数参与签名
+        if ("004".equals(invoiceKind)) {
+            paras.add("buyerTaxpayerId=" + customerApBillOutInfo.getTaxNr());
+            paras.add("buyerAddr=" + customerApBillOutInfo.getAddress());
+            paras.add("buyerMobile=" + customerApBillOutInfo.getTel());
+            paras.add("buyerAccountNo=" + customerApBillOutInfo.getBankAccountNr());
+        }
+        paras.add("taxpayerId=" + apBillOutInfo.getTaxNr());
+        //百望税盘时以下参数参与 //TODO 判断
+        if (isBaiWang && "1".equals(eqptType)) {
+            paras.add("issueAddressCode=" + apBillOut.getKpdh());//TODO 开票点代码
+            paras.add("eqptType=" + eqptType);
+            paras.add("invoiceKind=" + invoiceKind);//TODO 发票种类编码
+            //百望税盘且设备类型eqptType为1参与
+            paras.add("taxDiskCode=" + taxDiskCode);//T税控盘编号
+            paras.add("taxDiskPwd=" + taxDiskPwd);//税控盘口令
+            paras.add("taxSignPwd=" + taxSignPwd);//税务数字证书密码
+        }
+        String[] paraArr = new String[paras.size()];
+        String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
+        String sign = sign("icloud/invoice/issue.json", "POST", timestamp, paras.toArray(paraArr));
+
+        Map<String,Object> paraMap = new HashMap<>();
+        if (StringUtils.isEmpty(apBillOutInfo.getTaxNr())) {
+            result.put("error", errorMsg.append("获取不到纳税人识别号!"));
+        }
+        if (StringUtils.isEmpty(apBillOut.getCustName())) {
+            result.put("error", errorMsg.append("获取不到购买方名称!"));
+        }
+        if (StringUtils.isEmpty(collectorPhone)) {
+            result.put("error", errorMsg.append("获取不到收票人手机!"));
+        }
+        if (StringUtils.isEmpty(drawer)) {
+            result.put("error", errorMsg.append("获取不到开票人名称!"));
+        }
+        if (StringUtils.isEmpty(apBillOut.getCode())) {
+            result.put("error", errorMsg.append("获取不到订单号!"));
+        }
+        paraMap.put("taxpayerId", apBillOutInfo.getTaxNr());//纳税人识别号
+        paraMap.put("buyerName", apBillOut.getCustName());//购买方名称
+        paraMap.put("collectorPhone", collectorPhone);//TODO 收票人手机
+        paraMap.put("drawer", SystemSession.getUser().getUserName());//开票人
+        paraMap.put("orderNo", apBillOut.getCode());//订单号
+        //以下为可为空字段
+        paraMap.put("saleAccountNo", customerApBillOutInfo.getBankAccountNr());//销售方银行账号
+        paraMap.put("buyerTaxpayerId", customerApBillOutInfo.getTaxNr());//购买方识别号
+        paraMap.put("buyerAddr", customerApBillOutInfo.getAddress());//购买方地址
+        paraMap.put("buyerMobile", customerApBillOutInfo.getTel());//购买方电话
+        paraMap.put("buyerAccountNo", customerApBillOutInfo.getBankAccountNr());//购买方银行及账号  开户行及账号
+        paraMap.put("storeCode", "");//店铺编码
+        paraMap.put("buyerEmail", "");//购买方邮箱
+        paraMap.put("payee", customerApBillOutInfo.getPayee());//收款人
+        paraMap.put("checker", customerApBillOutInfo.getChecker());//复核人
+        paraMap.put("priceTaxAmount", apBillOut.getTaxSum());//价税合计金额   小数点后2位,以元为单位精确到分
+        if (isBaiWang && StringUtils.isEmpty(apBillOut.getKpdh())) {
+            result.put("error", errorMsg.append("获取不到百望税盘时的开票点代码!"));
+        }
+        if (isBaiWang && StringUtils.isEmpty(eqptType)) {
+            result.put("error", errorMsg.append("获取不到百望税盘时的设备的类型!"));
+        }
+        if (isBaiWang && StringUtils.isEmpty(invoiceKind)) {
+            result.put("error", errorMsg.append("获取不到百望税盘时的开票的类型!"));
+        }
+        if (isBaiWang && "1".equals(eqptType) && StringUtils.isEmpty(taxDiskCode)) {
+            result.put("error", errorMsg.append("获取不到百望税盘时的税控盘编号!"));
+        }
+        if (isBaiWang && "1".equals(eqptType) && StringUtils.isEmpty(taxDiskPwd)) {
+            result.put("error", errorMsg.append("获取不到百望税盘时的税控盘口令!"));
+        }
+        if (isBaiWang && "1".equals(eqptType) && StringUtils.isEmpty(taxSignPwd)) {
+            result.put("error", errorMsg.append("获取不到百望税盘时的税务数字证书密码!"));
+        }
+        if (result.size() > 0) {
+            return result;
+        }
+        paraMap.put("issueAddressCode", apBillOut.getKpdh());//开票点代码  百望税盘必填
+        paraMap.put("eqptType", eqptType);//设备类型 0税控服务,1税控盘.百望税盘必填
+        paraMap.put("invoiceKind", invoiceKind);//004:专票,007:普票,026:电子票.百望税盘必填
+        paraMap.put("taxDiskCode", taxDiskCode);//税控盘编号  百望税盘且设备类型为1必填
+        paraMap.put("taxDiskPwd", taxDiskPwd);//税控盘口令  百望税盘且设备类型为1必填
+        paraMap.put("taxSignPwd", taxSignPwd);//税务数字证书密码  百望税盘且设备类型为1必填
+        paraMap.put("remark", apBillOut.getRemark());
+
+        JSONArray wares = new JSONArray();
+        for (PurchaseApBillOutItem apBillOutItem : apBillOutItems) {
+            // wares  商品行项目信息(发票明细)
+            JSONObject ware = new JSONObject(16, true);
+            Product product = apBillOutItem.getProduct();
+            if (product == null) {
+                result.put("error", errorMsg.append("获取不到商品信息!"));
+                return result;
+            }
+            if (StringUtils.isEmpty(product.getTitle())) {
+                result.put("error", errorMsg.append("获取不到商品名称!"));
+            }
+            if (StringUtils.isEmpty(apBillOutItem.getNowQty())) {
+                result.put("error", errorMsg.append("获取不到商品开票数量!"));
+            }
+            if (StringUtils.isEmpty(apBillOutItem.getNowPrice())) {
+                result.put("error", errorMsg.append("获取不到商品开票单价!"));
+            }
+            if (StringUtils.isEmpty(product.getGoodstaxno())) {
+                result.put("error", errorMsg.append("获取不到商品编码!"));
+            }
+            if (StringUtils.isEmpty(apBillOutItem.getTaxrate())) {
+                result.put("error", errorMsg.append("获取不到商品税率!"));
+            }
+            ware.put("wareName", product.getTitle());//商品名称
+            ware.put("count", apBillOutItem.getNowQty());//数量 整数
+            ware.put("unitPrice", apBillOutItem.getNowPrice());//单价 小数点后2位,以元为单位精确到分,含税价
+            ware.put("wareNo", product.getGoodstaxno());//商品编码  应与税局最新发行的商品和服务税收分类与编码相一致
+            ware.put("taxRate", apBillOutItem.getTaxrate());
+            //否
+            ware.put("unit", product.getUnit());//单位
+            ware.put("standard", product.getSpec());//规格型号
+            ware.put("discountAmount", "");//优惠后总额
+
+            wares.add(ware);
+        }
+
+        paraMap.put("wareListInfo", wares.toString());
+
+        //调用票加加开票接口
+        try {
+            HttpUtil.Response response = HttpUtil.sendPostRequest(url, paraMap);
+            JSONObject resultJo = JSON.parseObject(response.getResponseText());
+            String code = resultJo.getString("code");//结果码 0000代表成功,其它为失败
+            String resMsg = resultJo.getString("resMsg");
+            String requestCode = resultJo.getString("requestCode");//请求流水号
+            if ("0000".equals(code)) {
+                apBillOut.setRetmsg(resMsg);
+                apBillOut.setRequestCode(requestCode);
+                //修改开票单状态
+                apBillOut.setCheckStatus("已开票");
+
+                try {
+                    purchaseApBillOutDao.save(apBillOut);
+                } catch (Exception e) {
+                    result.put("dbError","开具发票成功,但过程中数据库更新开票单失败,需要人工紧急处理,作废此开票单据");
+                }
+
+                result.put("apBillOut",apBillOut);
+            } else {
+                result.put("resultJo",resultJo);
+                //map.put("error","发票开具失败");
+                result.put("error",errorMsg.append(resMsg));
+            }
+        } catch (NullPointerException e) {
+            result.put("error",errorMsg.append("从票加加开票接口获取数据失败"));
+            e.printStackTrace();
+        } catch (Exception e) {
+            result.put("error",errorMsg.append("链接票加加开票接口失败"));
+            e.printStackTrace();
+        }
+
+        return result;
+    }
+
+    @Override
+    public ModelMap InvoiceCancel(PurchaseApBillOut apBillOut) {
+        ModelMap result = new ModelMap();
+        StringBuilder errorMsg = new StringBuilder();
+
+        String url = "http://192.168.253.75:8282/icloud/invoice/revoke.json";
+        String invoiceKind = "004";//004:专票,007:普票, 026:电子票.百望税盘必填
+        String eqptType = "1";//设备类型 0税控服务,1税控盘.百望税盘必填
+        String taxDiskCode = "";
+        String taxDiskPwd = "";
+        String taxSignPwd = "";
+
+        Set<PurchaseApBillOutItem> apBillOutItems = apBillOut.getItems();
+        //获取购方开票信息
+        PurchaseApBillOutInfo customerApBillOutInfo = apBillOut.getCustomerApBillOutInfo();
+        if (customerApBillOutInfo == null) {
+            result.put("error", errorMsg.append("获取不到购方开票信息,请先完善!"));
+            return result;
+        }
+        //获取销方开票信息
+        PurchaseApBillOutInfo apBillOutInfo = apBillOut.getApBillOutInfo();
+        if (apBillOutInfo == null) {
+            result.put("error", errorMsg.append("获取不到销方开票信息,请先完善!"));
+            return result;
+        }
+
+        //签名部分
+        List<String> paras = new ArrayList<>();
+        paras.add("orderNo=" + apBillOut.getCode());
+        paras.add("replacedInvoiceCode=" + apBillOut.getInfoTypeCode());
+        paras.add("replacedInvoiceNo=" + apBillOut.getInfoNumber());
+        paras.add("revokeReson=" + "");//冲红原因
+        paras.add("taxpayerId=" + apBillOutInfo.getTaxNr());
+        //百望税盘参与 //TODO 判断
+        if (isBaiWang) {
+            paras.add("eqptType=" + eqptType);
+            paras.add("issueAddressCode=" + apBillOut.getKpdh());//TODO 开票点代码
+            paras.add("invoiceKind=" + invoiceKind);//TODO 发票种类编码
+        }
+
+        if (isBaiWang && "1".equals(eqptType)) {
+            paras.add("taxDiskCode=" + taxDiskCode);// 税控盘编号
+            paras.add("taxDiskPwd=" + taxDiskPwd);// 税控盘口令
+            paras.add("taxSignPwd=" + taxSignPwd);// 税务数字证书密码
+        }
+
+        int kplx = -1;//TODO 开票类型
+        if (isBaiWang && kplx < 0 && "004".equals(invoiceKind)) {
+            paras.add("redInfoCode=" + "");//TODO 红字信息表编号
+        }
+
+        if (isBaiWang && "004".equals(invoiceKind)) {
+            paras.add("noticeOrderCode=" + "");//TODO 通知单编号
+        }
+
+        String[] paraArr = new String[paras.size()];
+        String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
+        String sign = sign("icloud/invoice/revoke.json", "POST", timestamp, paras.toArray(paraArr));
+
+        Map<String,Object> paraMap = new HashMap<>();
+        String revokeReson = "";
+        if (StringUtils.isEmpty(apBillOutInfo.getTaxNr())) {
+            result.put("error", errorMsg.append("获取不到纳税人识别号!"));
+        }
+        if (StringUtils.isEmpty(apBillOut.getInfoTypeCode())) {
+            result.put("error", errorMsg.append("获取不到原发票代码!"));
+        }
+        if (StringUtils.isEmpty(apBillOut.getInfoNumber())) {
+            result.put("error", errorMsg.append("获取不到原发票号码!"));
+        }
+        if (StringUtils.isEmpty(revokeReson)) {
+            result.put("error", errorMsg.append("获取不到冲红原因!"));
+        }
+        if (StringUtils.isEmpty(apBillOut.getCode())) {
+            result.put("error", errorMsg.append("获取不到订单号!"));
+        }
+        paraMap.put("taxpayerId", apBillOutInfo.getTaxNr());//纳税人识别号
+        paraMap.put("replacedInvoiceCode", apBillOut.getInfoTypeCode());//原发票代码
+        paraMap.put("replacedInvoiceNo", apBillOut.getInfoNumber());//原发票号码
+        paraMap.put("revokeReson", revokeReson);//冲红原因
+        paraMap.put("orderNo", apBillOut.getCode());//订单号
+        //以下为可为空字段
+        String issueAddressCode = apBillOut.getKpdh();
+        String redInfoCode = "";
+        String noticeOrderCode = "";
+        if (isBaiWang && StringUtils.isEmpty(issueAddressCode)) {
+            result.put("error", errorMsg.append("获取不到百望税盘时的开票点代码!"));
+        }
+        if (isBaiWang && StringUtils.isEmpty(eqptType)) {
+            result.put("error", errorMsg.append("获取不到百望税盘时的设备的类型!"));
+        }
+        if (isBaiWang && StringUtils.isEmpty(invoiceKind)) {
+            result.put("error", errorMsg.append("获取不到百望税盘时的开票的类型!"));
+        }
+        if (isBaiWang && "1".equals(eqptType) && StringUtils.isEmpty(taxDiskCode)) {
+            result.put("error", errorMsg.append("获取不到百望税盘时的税控盘编号!"));
+        }
+        if (isBaiWang && "1".equals(eqptType) && StringUtils.isEmpty(taxDiskPwd)) {
+            result.put("error", errorMsg.append("获取不到百望税盘时的税控盘口令!"));
+        }
+        if (isBaiWang && "1".equals(eqptType) && StringUtils.isEmpty(taxSignPwd)) {
+            result.put("error", errorMsg.append("获取不到百望税盘时的税务数字证书密码!"));
+        }
+        if (isBaiWang && "004".equals(invoiceKind) && StringUtils.isEmpty(redInfoCode)) {
+            result.put("error", errorMsg.append("获取不到百望税盘时专票冲红的红字信息表编号!"));
+        }
+        if (isBaiWang && "004".equals(invoiceKind) && StringUtils.isEmpty(noticeOrderCode)) {
+            result.put("error", errorMsg.append("获取不到百望税盘时专票冲红的通知单编号!"));
+        }
+        if (result.size() > 0) {
+            return result;
+        }
+        paraMap.put("issueAddressCode", issueAddressCode);//开票点代码  百望税盘必填
+        paraMap.put("eqptType", eqptType);//设备类型 0税控服务,1税控盘.百望税盘必填
+        paraMap.put("invoiceKind", invoiceKind);//004:专票,007:普票,026:电子票.百望税盘必填
+        paraMap.put("taxDiskCode", taxDiskCode);//税控盘编号  百望税盘且设备类型为1必填
+        paraMap.put("taxDiskPwd", taxDiskPwd);//税控盘口令  百望税盘且设备类型为1必填
+        paraMap.put("taxSignPwd", taxSignPwd);//税务数字证书密码  百望税盘且设备类型为1必填
+        paraMap.put("redInfoCode", redInfoCode);//红字信息表编号  百望税盘, 专票红冲时,必填。
+        paraMap.put("noticeOrderCode", noticeOrderCode);//通知单编号  百望税盘,专票红冲时,必填。
+
+
+        //调用票加加冲红接口
+        try {
+            HttpUtil.Response response = HttpUtil.sendPostRequest(url, paraMap);
+            JSONObject resultJo = JSON.parseObject(response.getResponseText());
+            String code = resultJo.getString("code");//结果码 0000代表成功,其它为失败
+            String resMsg = resultJo.getString("resMsg");
+            String requestCode = resultJo.getString("requestCode");//请求流水号
+            if ("0000".equals(code)) {
+                apBillOut.setRetmsg(resMsg);
+                apBillOut.setRequestCode(requestCode);
+                //修改开票单状态
+                apBillOut.setCheckStatus("已作废");
+
+                try {
+                    purchaseApBillOutDao.save(apBillOut);
+                } catch (Exception e) {
+                    result.put("dbError","冲红发票成功,但过程中数据库更新开票单失败,需要人工紧急处理,作废此开票单据");
+                }
+
+                result.put("apBillOut",apBillOut);
+            } else {
+                result.put("resultJo",resultJo);
+                result.put("error",errorMsg.append(resMsg));
+            }
+        } catch (NullPointerException e) {
+            result.put("error",errorMsg.append("从票加加开票接口获取数据失败"));
+            e.printStackTrace();
+        } catch (Exception e) {
+            result.put("error",errorMsg.append("链接票加加开票接口失败"));
+            e.printStackTrace();
+        }
+
+        return result;
+    }
+
+    @Override
+    public ModelMap queryInvoiceMessage(PurchaseApBillOut apBillOut) {
+        Map<String,Object> paraMap = new HashMap<>();
+        String url = "http://192.168.253.75:8282/icloud/invoice/query.json";
+        String invoiceKind = "004";//004:专票,007:普票, 026:电子票.百望税盘必填
+        String eqptType = "1";//设备类型 0税控服务,1税控盘.百望税盘必填
+
+        Set<PurchaseApBillOutItem> apBillOutItems = apBillOut.getItems();
+        //获取购方开票信息
+        PurchaseApBillOutInfo customerApBillOutInfo = apBillOut.getCustomerApBillOutInfo();
+        //获取销方开票信息
+        PurchaseApBillOutInfo apBillOutInfo = apBillOut.getApBillOutInfo();
+
+        //签名部分  发票代码+发票号码、订单号三选一.传入什么参数就用什么参数签名,为空不参与签名
+        List<String> paras = new ArrayList<>();
+        String invoiceCode = apBillOut.getInfoTypeCode();
+        String invoiceNum = apBillOut.getInfoNumber();
+        String orderNo = apBillOut.getCode();
+        String requestCode = "";//请求流水号
+        if (StringUtils.isEmpty(requestCode) && (StringUtils.isEmpty(invoiceCode) && StringUtils.isEmpty(invoiceNum)) && StringUtils.isEmpty(orderNo)) {
+            //TODO 为空不参与签名
+        } else if (!StringUtils.isEmpty(requestCode)){
+            paras.add("requestCode=" + requestCode);
+            paraMap.put("requestCode", requestCode);
+        } else if (!(StringUtils.isEmpty(invoiceNum) && StringUtils.isEmpty(invoiceCode))) {
+            paras.add("invoiceCode=" + invoiceCode);
+            paras.add("invoiceNum=" + invoiceNum);
+            paraMap.put("invoiceCode", invoiceCode);
+            paraMap.put("invoiceNum", invoiceNum);
+        } else if (!StringUtils.isEmpty(orderNo)) {
+            paras.add("orderNo=" + orderNo);
+            paraMap.put("orderNo", orderNo);
+        }
+
+        paras.add("taxpayerId=" + apBillOutInfo.getTaxNr());
+        String[] paraArr = new String[paras.size()];
+        String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
+        String sign = sign("icloud/invoice/query.json", "POST", timestamp, paras.toArray(paraArr));
+
+        paraMap.put("taxpayerId", apBillOutInfo.getTaxNr());//纳税人识别号
+        paraMap.put("needItem", false);//是否需要商品详情
+
+        //调用票加加查询开票接口
+        try {
+            HttpUtil.Response response = HttpUtil.sendPostRequest(url, paraMap);
+            JSONObject responseJo = JSON.parseObject(response.getResponseText());
+            String code = responseJo.getString("code");//0000代表开具成功,1111代表未开具,2222代表开具中,其它代表开具失败
+            String resMsg = responseJo.getString("resMsg");
+            //TODO 查询结果处理
+
+        } catch (NullPointerException e) {
+            System.out.print("error从票加加开票接口获取数据失败");
+            e.printStackTrace();
+        } catch (Exception e) {
+            System.out.print("error链接票加加开票接口失败");
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+
+    @Override
+    public ModelMap querybillingcount(String queryDate) {
+        Map<String,Object> paraMap = new HashMap<>();
+        String url = "http://192.168.253.75:8282/icloud/invoice/querybillingcount.json";
+        PurchaseApBillOutInfo apBillOutInfo = purchaseApBillOutInfoDao.findByUu(SystemSession.getUser().getEnterprise().getUu());
+        String taxpayerId = apBillOutInfo.getTaxNr();
+
+        //签名部分
+        List<String> paras = new ArrayList<>();
+        paras.add("taxpayerId=" + taxpayerId);
+        paras.add("queryDate=" + queryDate);
+        String[] paraArr = new String[paras.size()];
+        String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
+        String sign = sign("icloud/invoice/querybillingcount.json", "POST", timestamp, paras.toArray(paraArr));
+
+        paraMap.put("taxpayerId", taxpayerId);
+        paraMap.put("queryDate", queryDate);
+
+        //调用票加加统计开票接口
+        try {
+            HttpUtil.Response response = HttpUtil.sendPostRequest(url, paraMap);
+            JSONObject responseJo = JSON.parseObject(response.getResponseText());
+            String code = responseJo.getString("code");//0000代表成功其它代表失败
+            String resMsg = responseJo.getString("resMsg");
+            String totalCount = responseJo.getString("totalCount");//提交开票量
+            String totalSuccCount = responseJo.getString("totalSuccCount");//成功开票量
+            String totalMoney = responseJo.getString("totalMoney");//开票总金额
+
+        } catch (NullPointerException e) {
+            System.out.print("error从票加加开票接口获取数据失败");
+            e.printStackTrace();
+        } catch (Exception e) {
+            System.out.print("error链接票加加开票接口失败");
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+
+    @Override
+    public ModelMap queryBillLeftCount() {
+        Map<String,Object> paraMap = new HashMap<>();
+        String url = "http://192.168.253.75:8282/icloud/invoice/queryBillLeftCount.json";
+        String eqptType = "1";
+        PurchaseApBillOutInfo apBillOutInfo = purchaseApBillOutInfoDao.findByUu(SystemSession.getUser().getEnterprise().getUu());
+        String taxpayerId = apBillOutInfo.getTaxNr();
+
+        List<String> paras = new ArrayList<>();
+        paras.add("taxpayerId=" + taxpayerId);
+        paraMap.put("taxpayerId", taxpayerId);
+
+        if (isBaiWang) {
+            paras.add("eqptType=" + eqptType);
+            paras.add("machineCode=" + "");
+            paras.add("invoiceKind=" + "");
+            paraMap.put("eqptType", eqptType);//设备类型 0税控服务,1税控盘.百望税盘必填
+            paraMap.put("machineCode", "");//机器编号 百望税盘必填。 设备类型0为:核心板编号、1为:税盘编号
+            paraMap.put("invoiceKind", "");//004:专票,007:普票,026:电子票.百望税盘必填
+        }
+
+        if (isBaiWang && "0".equals(eqptType)) {
+            paras.add("teminalFlag=" + "");
+            paraMap.put("teminalFlag", "");//百望税盘且设备类型为0必填,开票点代码
+        }
+
+        if (isBaiWang && "1".equals(eqptType)) {
+            paras.add("taxDiskCode=" + "");
+            paras.add("taxDiskPwd=" + "");
+            paras.add("taxSignPwd=" + "");
+            paraMap.put("taxDiskCode", "");//税控盘编号  百望税盘且设备类型为1必填
+            paraMap.put("taxDiskPwd", "");//税控盘口令  百望税盘且设备类型为1必填
+            paraMap.put("taxSignPwd", "");//税务数字证书密码  百望税盘且设备类型为1必填
+        }
+
+        String[] paraArr = new String[paras.size()];
+        String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
+        String sign = sign("icloud/invoice/querybillingcount.json", "POST", timestamp, paras.toArray(paraArr));
+
+        //调用票加加统计开票接口
+        try {
+            HttpUtil.Response response = HttpUtil.sendPostRequest(url, paraMap);
+            JSONObject responseJo = JSON.parseObject(response.getResponseText());
+            String code = responseJo.getString("code");//0000代表成功其它代表失败
+            String resMsg = responseJo.getString("resMsg");
+            String leftInvoiceNum = responseJo.getString("leftInvoiceNum");//剩余发票量
+
+        } catch (NullPointerException e) {
+            System.out.print("error从票加加开票接口获取数据失败");
+            e.printStackTrace();
+        } catch (Exception e) {
+            System.out.print("error链接票加加开票接口失败");
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+
+    @Override
+    public ModelMap printInvoice(PurchaseApBillOut apBillOut) {
+        ModelMap result = new ModelMap();
+        StringBuilder errorMsg = new StringBuilder();
+
+        Map<String,Object> paraMap = new HashMap<>();
+        String url = "http://192.168.253.75:8282/icloud/invoice/printInvoice.json";
+        String invoiceKind = "004";//004:专票,007:普票, 026:电子票.百望税盘必填
+        String eqptType = "1";//设备类型 0税控服务,1税控盘.百望税盘必填
+        String taxDiskCode = "";
+        String taxDiskPwd = "";
+        String taxSignPwd = "";
+        String invoiceNum = "";//(税控盘必填)单张打印
+        String printKind = "";//(税控盘必填)0:发票打印,1:清单打印  (批量打印不支持清单打印)
+        String printType = "";//(税控盘必填)1:单张打印
+
+        Set<PurchaseApBillOutItem> apBillOutItems = apBillOut.getItems();
+        //获取购方开票信息
+        //PurchaseApBillOutInfo customerApBillOutInfo = apBillOut.getCustomerApBillOutInfo();
+        //获取销方开票信息
+        PurchaseApBillOutInfo apBillOutInfo = apBillOut.getApBillOutInfo();
+        if (apBillOutInfo == null) {
+            result.put("error", errorMsg.append("获取不到销方开票信息,请先完善!"));
+            return result;
+        }
+
+        //签名部分
+        List<String> paras = new ArrayList<>();
+        String issueAddressCode = apBillOut.getKpdh();
+        if (StringUtils.isEmpty(apBillOutInfo.getTaxNr())) {
+            result.put("error", errorMsg.append("获取不到纳税人识别号!"));
+        }
+        if (StringUtils.isEmpty(eqptType)) {
+            result.put("error", errorMsg.append("获取不到设备类型!"));
+        }
+        if (StringUtils.isEmpty(issueAddressCode)) {
+            result.put("error", errorMsg.append("获取不到开票点代码!"));
+        }
+        if (StringUtils.isEmpty(invoiceKind)) {
+            result.put("error", errorMsg.append("获取不到开票类型!"));
+        }
+        if (StringUtils.isEmpty(apBillOut.getInfoTypeCode())) {
+            result.put("error", errorMsg.append("获取不到发票代码!"));
+        }
+        paras.add("taxpayerId=" + apBillOutInfo.getTaxNr());
+        paras.add("eqptType="+ eqptType);
+        paras.add("issueAddressCode=" + issueAddressCode);//开票点代码
+        paras.add("invoiceKind=" + invoiceKind);//004:专票,007:普票
+        paras.add("invoiceCode=" + apBillOut.getInfoTypeCode());//发票代码
+
+        paraMap.put("taxpayerId", apBillOutInfo.getTaxNr());
+        paraMap.put("eqptType", eqptType);
+        paraMap.put("issueAddressCode", apBillOut.getKpdh());
+        paraMap.put("invoiceKind", invoiceKind);
+        paraMap.put("invoiceCode", apBillOut.getInfoTypeCode());
+
+        if ("1".equals(eqptType)) {
+            if (StringUtils.isEmpty(invoiceNum)) {
+                result.put("error", errorMsg.append("获取不到税控盘单张打印时发票号码!"));
+            }
+            if (StringUtils.isEmpty(printKind)) {
+                result.put("error", errorMsg.append("获取不到税控盘的打印类型设置!"));
+            }
+            if (StringUtils.isEmpty(printType)) {
+                result.put("error", errorMsg.append("获取不到税控盘打印方式!"));
+            }
+
+            paras.add("invoiceNum=" + invoiceNum);
+            paras.add("printKind=" + printKind);
+            paras.add("printType=" + printType);
+
+            paraMap.put("invoiceNum", invoiceNum);
+            paraMap.put("printKind", printKind);
+            paraMap.put("printType", printType);
+        }
+
+        if (isBaiWang && "1".equals(eqptType)) {
+            if (StringUtils.isEmpty(taxDiskCode)) {
+                result.put("error", errorMsg.append("获取不到百望税盘时的税控盘编号!"));
+            }
+            if (StringUtils.isEmpty(taxDiskPwd)) {
+                result.put("error", errorMsg.append("获取不到百望税盘时的税控盘口令!"));
+            }
+            if (StringUtils.isEmpty(taxSignPwd)) {
+                result.put("error", errorMsg.append("获取不到百望税盘时的税务数字证书密码!"));
+            }
+
+            paras.add("taxDiskCode=" + taxDiskCode);
+            paras.add("taxDiskPwd=" + taxDiskPwd);
+            paras.add("taxSignPwd=" + taxSignPwd);
+
+            paraMap.put("taxDiskCode", taxDiskCode);
+            paraMap.put("taxDiskPwd", taxDiskPwd);
+            paraMap.put("taxSignPwd", taxSignPwd);
+
+        }
+
+        String[] paraArr = new String[paras.size()];
+        String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
+        String sign = sign("icloud/invoice/printInvoice.json", "POST", timestamp, paras.toArray(paraArr));
+
+        //调用票加加发票打印接口
+        try {
+            HttpUtil.Response response = HttpUtil.sendPostRequest(url, paraMap);
+            JSONObject resultJo = JSON.parseObject(response.getResponseText());
+            String code = resultJo.getString("code");//0000代表成功其它代表失败
+            String resMsg = resultJo.getString("resMsg");
+            if ("0000".equals(code)) {
+                result.put("retmsg",resultJo.getString("retmsg"));
+                //添加打印次数
+                apBillOut.setPrint((short) ((apBillOut.getPrint() == null ? 0 : apBillOut.getPrint()) + 1));
+                try {
+                    purchaseApBillOutDao.save(apBillOut);
+                } catch (Exception e) {
+                    result.put("dbError","发票打印成功,但过程中数据库更新开票单打印次数失败,需要人工处理干预");
+                }
+            } else {
+                result.put("resultJo",resultJo);
+                result.put("error",errorMsg.append(resMsg));
+            }
+        } catch (NullPointerException e) {
+            result.put("error",errorMsg.append("从票加加开票接口获取数据失败"));
+            e.printStackTrace();
+        } catch (Exception e) {
+            result.put("error",errorMsg.append("链接票加加开票接口失败"));
+            e.printStackTrace();
+        }
+
+
+        return result;
+    }
+
+    @Override
+    public ModelMap queryDelivery(PurchaseApBillOut apBillOut) {
+        Map<String,Object> paraMap = new HashMap<>();
+        String url = "http://192.168.253.75:8282/imanager/manager/fetchDeliveryTrackingNumbers.ysy";
+        //获取销方开票信息
+        PurchaseApBillOutInfo apBillOutInfo = apBillOut.getApBillOutInfo();
+        String sysOrderNo = apBillOut.getCode();
+        String taxpayerId = apBillOutInfo.getTaxNr();
+        paraMap.put("sysOrderNo", sysOrderNo);
+        paraMap.put("taxpayerId", taxpayerId);
+
+        //调用票加加快递单信息获取接口
+        try {
+            HttpUtil.Response response = HttpUtil.sendPostRequest(url, paraMap);
+            JSONObject responseJo = JSON.parseObject(response.getResponseText());
+            String code = responseJo.getString("code");//0000代表成功其它代表失败
+            String resMsg = responseJo.getString("resMsg");
+            String data = responseJo.getString("data");
+            String remark = responseJo.getString("remark");
+            String businessName = responseJo.getString("businessName");
+            String number = responseJo.getString("number");
+        } catch (NullPointerException e) {
+            System.out.print("error从票加加开票接口获取数据失败");
+            e.printStackTrace();
+        } catch (Exception e) {
+            System.out.print("error链接票加加开票接口失败");
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+
+    @Override
+    public ModelMap uploadInvoice(PurchaseApBillOut apBillOut) {
+        ModelMap result = new ModelMap();
+        StringBuilder errorMsg = new StringBuilder();
+
+        //Map<String,Object> paraMap = new HashMap<>();
+        JSONObject paraMap = new JSONObject(16,true);
+        String url = "http://test.fapiaoxx.com/imanager/manager/getInvoiceInfoFromBPM.ysy";
+        //String eqptType = "1";//设备类型 0税控服务,1税控盘.百望税盘必填
+        String mediumType = "2";//1: 电子发票; 2: 纸质发票
+        String category = "4";//发票分类  1: 增值税专用发票; 4: 增值税普通发票(纸质);10: 增值税普通发票(电子)
+        boolean isZhuanpiao = true;
+
+        Set<PurchaseApBillOutItem> apBillOutItems = apBillOut.getItems();
+        //获取购方开票信息
+        PurchaseApBillOutInfo customerApBillOutInfo = apBillOut.getCustomerApBillOutInfo();
+        if (customerApBillOutInfo == null) {
+            result.put("error", errorMsg.append("获取不到购方开票信息,请先完善!"));
+            return result;
+        }
+        //获取销方开票信息
+        PurchaseApBillOutInfo apBillOutInfo = apBillOut.getApBillOutInfo();
+        if (apBillOutInfo == null) {
+            result.put("error", errorMsg.append("获取不到销方开票信息,请先完善!"));
+            return result;
+        }
+
+        //签名部分
+        List<String> paras = new ArrayList<>();
+        paras.add("sysOrderNo=" + apBillOut.getCode());
+        paras.add("taxpayerId=" + apBillOutInfo.getTaxNr());
+        String timestamp = String.valueOf(System.currentTimeMillis());
+        paras.add("timestamp=" + timestamp);
+        String[] paraArr = new String[paras.size()];
+        String sign = sign("test.fapiaoxx.com/imanager/manager/getInvoiceInfoFromBPM.ysy", "POST", timestamp, paras.toArray(paraArr));
+
+        if (StringUtils.isEmpty(apBillOut.getCode())) {
+            result.put("error", errorMsg.append("获取不到申请单编号!"));
+        }
+        if (StringUtils.isEmpty(mediumType)) {
+            result.put("error", errorMsg.append("获取不到发票媒介类型!"));
+        }
+        if (StringUtils.isEmpty(category)) {
+            result.put("error", errorMsg.append("获取不到发票分类!"));
+        }
+        if (StringUtils.isEmpty(apBillOutInfo.getTaxNr())) {
+            result.put("error", errorMsg.append("获取不到纳税人识别号!"));
+        }
+        if (StringUtils.isEmpty(customerApBillOutInfo.getEnName())) {
+            result.put("error", errorMsg.append("获取不到购买方名称!"));
+        }
+        paraMap.put("sysOrderNo", apBillOut.getCode());//申请单编号
+        paraMap.put("mediumType", mediumType);//发票媒介类型
+        paraMap.put("category", category);//发票分类
+        paraMap.put("taxpayerId", apBillOutInfo.getTaxNr());
+        paraMap.put("buyerName", customerApBillOutInfo.getEnName());
+        //以下为可为空字段
+        String buyerTaxpayerId = customerApBillOutInfo.getTaxNr();
+        String buyerAddr = apBillOutInfo.getAddress();
+        String buyerMobile = apBillOutInfo.getTel();
+        String buyerAccountNo = apBillOutInfo.getBankAccountNr();
+        if (isZhuanpiao) {
+            if (StringUtils.isEmpty(buyerTaxpayerId)) {
+                result.put("error", errorMsg.append("上传专票申请单时获取不到购买方识别号!"));
+            }
+            if (StringUtils.isEmpty(buyerAddr)) {
+                result.put("error", errorMsg.append("上传专票申请单时获取不到购买方地址!"));
+            }
+            if (StringUtils.isEmpty(buyerMobile)) {
+                result.put("error", errorMsg.append("上传专票申请单时获取不到购方电话!"));
+            }
+            if (StringUtils.isEmpty(buyerAccountNo)) {
+                result.put("error", errorMsg.append("上传专票申请单时获取不到购买方银行及账号!"));
+            }
+        } else {
+            if (StringUtils.isEmpty(buyerTaxpayerId)) {
+                buyerTaxpayerId = "";
+            }
+            if (StringUtils.isEmpty(buyerAddr)) {
+                buyerAddr = "";
+            }
+            if (StringUtils.isEmpty(buyerMobile)) {
+                buyerMobile = "";
+            }
+            if (StringUtils.isEmpty(buyerAccountNo)) {
+                buyerAccountNo = "";
+            }
+        }
+        paraMap.put("buyerTaxpayerId", buyerTaxpayerId);
+        paraMap.put("buyerAddr", buyerAddr);
+        paraMap.put("buyerMobile", buyerMobile);
+        paraMap.put("buyerAccountNo", buyerAccountNo);
+
+        if (StringUtils.isEmpty(apBillOutInfo.getChecker())) {
+            paraMap.put("checker", "");
+        } else {
+            paraMap.put("checker", apBillOutInfo.getChecker());
+        }
+
+        paraMap.put("drawer", "");
+
+        if (StringUtils.isEmpty(apBillOutInfo.getPayee())) {
+            paraMap.put("payee", "");
+        } else {
+            paraMap.put("payee", apBillOutInfo.getPayee());
+        }
+
+        if (StringUtils.isEmpty(apBillOut.getRemark())) {
+            paraMap.put("remark", "");
+        } else {
+            paraMap.put("remark", apBillOut.getRemark());
+        }
+
+        paraMap.put("urlAddress", "");//开票成功回调地址  用于回调开票成功信息
+        paraMap.put("settlementNum", "");//结算单号
+        paraMap.put("contractNum", "");//合同编号
+        paraMap.put("businessInfo", "");//业务信息
+
+        //明细
+        List<JSONObject> wares = new ArrayList<>();
+        for (PurchaseApBillOutItem apBillOutItem : apBillOutItems) {
+            // wares  商品行项目信息(发票明细)
+            Product product = apBillOutItem.getProduct();
+            product.setGoodstaxno((Math.random() + 50) + "");//TODO
+            if (product == null) {
+                result.put("error", errorMsg.append("获取不到商品信息!"));
+                return result;
+            }
+            if (StringUtils.isEmpty(product.getTitle())) {
+                result.put("error", errorMsg.append("获取不到商品名称!"));
+            }
+            if (StringUtils.isEmpty(product.getGoodstaxno())) {
+                result.put("error", errorMsg.append("获取不到商品编码!"));
+            }
+            if (StringUtils.isEmpty(apBillOutItem.getNowQty())) {
+                result.put("error", errorMsg.append("获取不到商品开票数量!"));
+            }
+            if (StringUtils.isEmpty(apBillOutItem.getNowPrice())) {
+                result.put("error", errorMsg.append("获取不到商品开票单价!"));
+            }
+            if (StringUtils.isEmpty(apBillOutItem.getTaxrate())) {
+                result.put("error", errorMsg.append("获取不到商品税率!"));
+            }
+
+            JSONObject ware = new JSONObject(16, true);
+            ware.put("wareName", product.getTitle());//商品名称
+            ware.put("wareNo", "1090232070000000000");//TODO product.getGoodstaxno() 商品编码  应与税局最新发行的商品和服务税收分类与编码相一致
+            if (StringUtils.isEmpty(product.getSpec())) {
+                ware.put("standard", "");//规格型号
+            } else {
+                ware.put("standard", product.getSpec());//规格型号
+            }
+            if (StringUtils.isEmpty(product.getUnit())) {
+                ware.put("unit", "");//单位
+            } else {
+                ware.put("unit", product.getUnit());//单位
+            }
+            ware.put("count", apBillOutItem.getNowQty());//数量 整数
+            ware.put("unitPrice", apBillOutItem.getNowPrice());//单价 小数点后2位,以元为单位精确到分,含税价
+            ware.put("amount", 1.00);//价税合计金额
+            ware.put("taxRate", apBillOutItem.getTaxrate()/100.00);//0表示免税,两位小数,0.17
+            wares.add(ware);
+        }
+
+        paraMap.put("invitem", wares);
+
+        if (result.size() > 0) {
+            return result;
+        }
+
+        //调用票加加上传接口
+        try {
+            String a = paraMap.toString();
+            url = url + "?timestamp=" + timestamp + "&sign=" + sign;
+            //HttpUtil.Response response = HttpUtil.sendPostRequest(url, paraMap);
+            String resultStr =  HttpUtil.sendPost(url, paraMap.toString());
+            JSONObject resultJo = JSON.parseObject(resultStr);
+            String code = resultJo.getString("code");//0000代表成功其它代表失败
+            String resMsg = resultJo.getString("resMsg");;
+
+            if ("0000".equals(code)) {
+                result.put("success", "发票上传成功,开票中!");
+                apBillOut.setRetmsg(resMsg);
+                //apBillOut.setCheckStatus("开票中");
+                try {
+                    purchaseApBillOutDao.save(apBillOut);
+                } catch (Exception e) {
+                    result.put("dbError","上传发票成功,但过程中数据库更新开票单失败,需要人工紧急处理,重新上传此开票单据");
+                }
+            }
+
+            result.put("resultJo",resultStr);
+        } catch (NullPointerException e) {
+            result.put("error",errorMsg.append("从票加加开票接口获取数据失败"));
+            e.printStackTrace();
+        } catch (Exception e) {
+            result.put("error",errorMsg.append("链接票加加开票接口失败"));
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+
+    /**
+     * 生成签名
+     * @return
+     */
+    private String sign(String api, String httpMethod, String timestamp, String prars[]) {
+        StringBuilder content = new StringBuilder();
+        content.append(httpMethod);
+        //获取请求的url
+        content.append(api);
+        //参数按字典排序
+        content.append(sort(prars));
+        //content.append("timestamp=" + timestamp);
+        //String taxpayerKey = "626454404969499358070752";//优软
+        String taxpayerKey = "487843442563106693107397";//丰唐
+        content.append(taxpayerKey);
+
+        String sign = null;
+        try {
+            sign = MD5.toMD5(URLEncoder.encode(content.toString(),"UTF-8"));
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        return sign;
+    }
+
+    /**
+     * 按字典排序 升序
+     * @param a
+     */
+    public StringBuilder sort(String a[]) {
+        for (int i = 0; i < a.length - 1; i++) {
+            for (int j = i + 1; j < a.length; j++) {
+                if (a[j].compareTo(a[i]) < 0) {
+                    String temp = a[i];
+                    a[i] = a[j];
+                    a[j] = temp;
+                }
+            }
+        }
+
+        StringBuilder paras = new StringBuilder();
+        for (int i = 0; i < a.length; i++) {
+            paras.append(a[i]);
+        }
+
+        return paras;
+    }
+}

+ 20 - 4
src/main/java/com/uas/platform/b2b/service/impl/ProductUsersServiceImpl.java

@@ -268,7 +268,11 @@ public class ProductUsersServiceImpl implements ProductUsersService {
                         row.getCell(6).setCellType(Cell.CELL_TYPE_STRING);
                         if (null != row.getCell(6).getStringCellValue().trim()
                                 && !row.getCell(6).getStringCellValue().trim().equals("")) {
-                            temp.setPr_minpack(Double.valueOf(row.getCell(6).getStringCellValue()));
+                            try {
+                                temp.setPr_minpack(Double.valueOf(row.getCell(6).getStringCellValue()));
+                            } catch (NumberFormatException e) {
+                                throw new IllegalOperatorException("第" + (r + 1) + "行最小包装量填写不规范,请填数字");
+                            }
                         }
                     }
                     // 最小订购量
@@ -276,7 +280,11 @@ public class ProductUsersServiceImpl implements ProductUsersService {
                         row.getCell(7).setCellType(Cell.CELL_TYPE_STRING);
                         if (null != row.getCell(7).getStringCellValue().trim()
                                 && !row.getCell(7).getStringCellValue().trim().equals("")) {
-                            temp.setPr_minorder(Double.valueOf(row.getCell(7).getStringCellValue()));
+                            try {
+                                temp.setPr_minorder(Double.valueOf(row.getCell(7).getStringCellValue()));
+                            } catch (NumberFormatException e) {
+                                throw new IllegalOperatorException("第" + (r + 1) + "行最小订购量填写不规范,请填数字");
+                            }
                         }
                     }
                     // 交货周期
@@ -284,7 +292,11 @@ public class ProductUsersServiceImpl implements ProductUsersService {
                         row.getCell(8).setCellType(Cell.CELL_TYPE_STRING);
                         if (null != row.getCell(8).getStringCellValue().trim()
                                 && !row.getCell(8).getStringCellValue().trim().equals("")) {
-                            temp.setPr_leadtime(Double.valueOf(row.getCell(8).getStringCellValue()));
+                            try {
+                                temp.setPr_leadtime(Double.valueOf(row.getCell(8).getStringCellValue()));
+                            } catch (NumberFormatException e) {
+                                throw new IllegalOperatorException("第" + (r + 1) + "行交货周期填写不规范,请填数字");
+                            }
                         }
                     }
                     // 交货提前期
@@ -292,7 +304,11 @@ public class ProductUsersServiceImpl implements ProductUsersService {
                         row.getCell(9).setCellType(Cell.CELL_TYPE_STRING);
                         if (null != row.getCell(9).getStringCellValue().trim()
                                 && !row.getCell(9).getStringCellValue().trim().equals("")) {
-                            temp.setPr_ltinstock(Double.valueOf(row.getCell(9).getStringCellValue()));
+                            try {
+                                temp.setPr_ltinstock(Double.valueOf(row.getCell(9).getStringCellValue()));
+                            } catch (NumberFormatException e) {
+                                throw new IllegalOperatorException("第" + (r + 1) + "行交货提前期填写不规范,请填数字");
+                            }
                         }
                     }
                     temps.add(temp);

+ 206 - 315
src/main/java/com/uas/platform/b2b/service/impl/PurcProductServiceImpl.java

@@ -5,15 +5,15 @@ import com.uas.platform.b2b.core.util.StringUtil;
 import com.uas.platform.b2b.dao.EnterpriseDao;
 import com.uas.platform.b2b.dao.ProductDao;
 import com.uas.platform.b2b.dao.ProductStatusDao;
+import com.uas.platform.b2b.dao.ProductTempDao;
 import com.uas.platform.b2b.model.Enterprise;
 import com.uas.platform.b2b.model.Product;
-import com.uas.platform.b2b.model.ProductStatus;
+import com.uas.platform.b2b.model.ProductTemp;
 import com.uas.platform.b2b.ps.ProductUtils;
 import com.uas.platform.b2b.service.PurcProductService;
 import com.uas.platform.b2b.support.SystemSession;
 import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.model.Constant;
-import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.Row;
@@ -39,334 +39,225 @@ public class PurcProductServiceImpl implements PurcProductService {
 	@Autowired
 	private ProductStatusDao productStatusDao;
 
+	@Autowired
+    private ProductTempDao productTempDao;
+
 	/**
 	 * 一次上传允许的最大数量
 	 */
 	private final static Integer MAX_ROWNUM = 5000;
 
-	/**
-	 * 批量导入物料资料
-	 */
-	@Override
-	public ModelMap releaseByWorkbook(Workbook workbook) {
-		ModelMap modelMap = new ModelMap();
-		List<String> alters = new ArrayList<String>();
-		List<String> infos = new ArrayList<String>();
-		List<Product> products = new ArrayList<Product>();
-		List<Product> oldProducts = new ArrayList<>();
-		List<Product> productsInfo = new ArrayList<Product>();
-		Sheet sheet = workbook.getSheetAt(0);
-		String codePrefix = "PR" + DateUtils.format(new Date(), "yyMMddHHmmss") + StringUtil.getRandomNumber(3);
-		int rowNum = sheet.getLastRowNum();
-		Row headerRow = sheet.getRow(0);
-		int total = 0;
-		if (headerRow != null) {
-			for (int r = 3; r <= rowNum; r++) {
-				Row row = sheet.getRow(r);
-				if (row != null && row.getCell(1) != null && row.getCell(1).getCellType() != Cell.CELL_TYPE_BLANK) {
-					total++;
-					Product product = new Product();
-					//TODO huangct 上传文件中存在必填信息缺失的情况处理
-
-					// 物料编号
-					if (row.getCell(0) != null) {
-						row.getCell(0).setCellType(Cell.CELL_TYPE_STRING);
-						product.setCode(row.getCell(0).getStringCellValue().trim());
-					} else {
-						product.setCode(codePrefix + StringUtils.leftPad(String.valueOf(r), 4, "0"));
-					}
+    /**
+     * 批量导入物料资料
+     */
+    @Override
+    public ModelMap releaseByWorkbook(Workbook workbook) {
+        long start = System.currentTimeMillis();
+        ModelMap modelMap = new ModelMap();
+        List<ProductTemp> temps = new ArrayList<>();
+        Long enUU = SystemSession.getUser().getEnterprise().getUu();
+        Long userUU = SystemSession.getUser().getUserUU();
+        // 生成随机物料编码
+        String codePrefix = "PR" + DateUtils.format(new Date(), "yyMMddHHmmss") + StringUtil.getRandomNumber(3);
+        Sheet sheet = workbook.getSheetAt(0);
+        int rowNum = sheet.getLastRowNum();
+        Row headerRow = sheet.getRow(0);
+        int total = 0;
+        short isSale = Constant.NO;
+        short isPurchase = Constant.YES;
+        String importId = StringUtil.getRandomNumber(8);
+        if (headerRow != null) {
+            for (int r = 3; r <= rowNum; r++) {
+                Row row = sheet.getRow(r);
+                if (row != null && row.getCell(1) != null && row.getCell(1).getCellType() != Cell.CELL_TYPE_BLANK) {
+                    total++;
+                    ProductTemp temp = new ProductTemp();
+                    temp.setPr_import_id(importId);
+                    temp.setPr_enuu(enUU);
+                    temp.setPr_useruu(userUU);
+                    temp.setPr_issale(isSale);
+                    temp.setPr_ispurchase(isPurchase);
+                    temp.setPr_sourceapp("B2B");
+                    // 物料编号
+                    if (row.getCell(0) != null && row.getCell(0).getCellType() != Cell.CELL_TYPE_BLANK) {
+                        row.getCell(0).setCellType(Cell.CELL_TYPE_STRING);
+                        temp.setPr_code(row.getCell(0).getStringCellValue().trim());
+                    } else {
+                        temp.setPr_code(codePrefix + StringUtils.leftPad(String.valueOf(r), 4, "0"));
+                    }
 
-					// 物料名称
-					if (row.getCell(1) != null && row.getCell(1).getCellType() != Cell.CELL_TYPE_BLANK) {
-						row.getCell(1).setCellType(Cell.CELL_TYPE_STRING);
-						product.setTitle(row.getCell(1).getStringCellValue().trim());
-					} else {
-						modelMap.put("error", "第" + (r + 1) + "行物料名称未填写");
-						return modelMap;
-					}
+                    // 物料名称
+                    if (row.getCell(1) != null && row.getCell(1).getCellType() != Cell.CELL_TYPE_BLANK) {
+                        row.getCell(1).setCellType(Cell.CELL_TYPE_STRING);
+                        temp.setPr_title(row.getCell(1).getStringCellValue().trim());
+                    } else {
+                        modelMap.put("error", "第" + (r + 1) + "行物料名称未填写");
+                        return modelMap;
+                    }
 
-					// 物料规格
-					if (row.getCell(2) != null && row.getCell(2).getCellType() != Cell.CELL_TYPE_BLANK) {
-						row.getCell(2).setCellType(Cell.CELL_TYPE_STRING);
-						product.setSpec(row.getCell(2).getStringCellValue().trim());
-					} else {
-						modelMap.put("error", "第" + (r + 1) + "行物料规格未填写");
-						return modelMap;
-					}
+                    // 物料规格
+                    if (row.getCell(2) != null && row.getCell(2).getCellType() != Cell.CELL_TYPE_BLANK) {
+                        row.getCell(2).setCellType(Cell.CELL_TYPE_STRING);
+                        temp.setPr_spec(row.getCell(2).getStringCellValue().trim());
+                    } else {
+                        modelMap.put("error", "第" + (r + 1) + "行物料规格未填写");
+                        return modelMap;
+                    }
 
-					// 原厂型号
-					if (row.getCell(3) != null && row.getCell(3).getCellType() != Cell.CELL_TYPE_BLANK) {
-						row.getCell(3).setCellType(Cell.CELL_TYPE_STRING);
-						product.setCmpCode(row.getCell(3).getStringCellValue().trim());
-					} else {
+                    // 原厂型号
+                    if (row.getCell(3) != null && row.getCell(3).getCellType() != Cell.CELL_TYPE_BLANK) {
+                        row.getCell(3).setCellType(Cell.CELL_TYPE_STRING);
+                        temp.setPr_cmpcode(row.getCell(3).getStringCellValue().trim());
+                    } else {
                         modelMap.put("error", "第" + (r + 1) + "行物料型号未填写");
                         return modelMap;
                     }
 
-					// 品牌
-					if (row.getCell(4) != null && row.getCell(4).getCellType() != Cell.CELL_TYPE_BLANK) {
-						row.getCell(4).setCellType(Cell.CELL_TYPE_STRING);
-						product.setBrand(row.getCell(4).getStringCellValue().trim());
-					} else {
-						modelMap.put("error", "第" + (r + 1) + "行品牌未填写");
-						return modelMap;
-					}
+                    // 品牌
+                    if (row.getCell(4) != null && row.getCell(4).getCellType() != Cell.CELL_TYPE_BLANK) {
+                        row.getCell(4).setCellType(Cell.CELL_TYPE_STRING);
+                        temp.setPr_brand(row.getCell(4).getStringCellValue().trim());
+                    } else {
+                        modelMap.put("error", "第" + (r + 1) + "行品牌未填写");
+                        return modelMap;
+                    }
 
-					// 单位
-					if (row.getCell(5) != null && row.getCell(5).getCellType() != Cell.CELL_TYPE_BLANK) {
-						row.getCell(5).setCellType(Cell.CELL_TYPE_STRING);
-						if (null != row.getCell(5).getStringCellValue()
-								&& !row.getCell(5).getStringCellValue().trim().equals("")) {
-							product.setUnit(row.getCell(5).getStringCellValue());
-						}
-					} else {
-						modelMap.put("error", "第" + (r + 1) + "行单位未填写");
-						return modelMap;
-					}
-					// 最小包装量
-					if (row.getCell(6) != null) {
-						row.getCell(6).setCellType(Cell.CELL_TYPE_STRING);
-						if (null != row.getCell(6).getStringCellValue().trim()
-								&& !row.getCell(6).getStringCellValue().trim().equals("")) {
-							product.setMinPack(Double.valueOf(row.getCell(6).getStringCellValue()));
-						}
-					}
-					// 最小订购量
-					if (row.getCell(7) != null) {
-						row.getCell(7).setCellType(Cell.CELL_TYPE_STRING);
-						if (null != row.getCell(7).getStringCellValue().trim()
-								&& !row.getCell(7).getStringCellValue().trim().equals("")) {
-							product.setMinOrder(Double.valueOf(row.getCell(7).getStringCellValue()));
-						}
-					}
-					// 交货周期
-					if (row.getCell(8) != null) {
-						row.getCell(8).setCellType(Cell.CELL_TYPE_STRING);
-						if (null != row.getCell(8).getStringCellValue().trim()
-								&& !row.getCell(8).getStringCellValue().trim().equals("")) {
-							product.setLeadtime(Double.valueOf(row.getCell(8).getStringCellValue()));
-						}
-					}
-					// 交货提前期
-					if (row.getCell(9) != null) {
-						row.getCell(9).setCellType(Cell.CELL_TYPE_STRING);
-						if (null != row.getCell(9).getStringCellValue().trim()
-								&& !row.getCell(9).getStringCellValue().trim().equals("")) {
-							product.setLtinstock(Double.valueOf(row.getCell(9).getStringCellValue()));
-						}
-					}
-					List<Product> prods = productDao.findByEnUUAndCode(SystemSession.getUser().getEnterprise().getUu(),
-							product.getCode());
-					if (CollectionUtils.isEmpty(prods)) {
-						// product.setCode(product.getCode());
-						// List<Component> components =
-						// componentDao.findByCode(product.getCmpCode());
-						// if (components.size() == 1) {
-						// Component cmp = components.get(0);
-						// if
-						// (cmp.getBrand().getNameEn().equals(product.getBrand())
-						// &&
-						// cmp.getKind().getNameCn().equals(product.getTitle()))
-						// {// 先匹配英文文
-						// product.setPbranden(cmp.getBrand().getNameEn());
-						// product.setPbrand(cmp.getBrand().getNameCn());
-						// product.setCmpUuId(cmp.getUuid());
-						// product.setPcmpcode(cmp.getCode());
-						// product.setKind(cmp.getKind().getNameCn());
-						// product.setKinden(cmp.getKind().getNameEn());
-						// product.setStandard(Constant.YES);
-						// product.setMessage("success");
-						// } else if
-						// (!cmp.getBrand().getNameEn().equals(product.getBrand())
-						// &&
-						// cmp.getBrand().getNameCn().equals(product.getBrand())
-						// &&
-						// cmp.getKind().getNameCn().equals(product.getTitle()))
-						// {// 再匹配中文
-						// product.setPbranden(cmp.getBrand().getNameEn());
-						// product.setPbrand(cmp.getBrand().getNameCn());
-						// product.setCmpUuId(cmp.getUuid());
-						// product.setPcmpcode(cmp.getCode());
-						// product.setKind(cmp.getKind().getNameCn());
-						// product.setKinden(cmp.getKind().getNameEn());
-						// product.setStandard(Constant.YES);
-						// product.setMessage("success");
-						// }
-						// } else if (components.size() > 1) {
-						// for (Component cmp : components) {// 器件有多个,先匹配品牌
-						// if
-						// (cmp.getBrand().getNameEn().equals(product.getBrand())
-						// &&
-						// cmp.getKind().getNameCn().equals(product.getTitle()))
-						// {// 先匹配英文文
-						// product.setPbranden(cmp.getBrand().getNameEn());
-						// product.setPbrand(cmp.getBrand().getNameCn());
-						// product.setCmpUuId(cmp.getUuid());
-						// product.setPcmpcode(cmp.getCode());
-						// product.setKind(cmp.getKind().getNameCn());
-						// product.setKinden(cmp.getKind().getNameEn());
-						// product.setStandard(Constant.YES);
-						// product.setMessage("success");
-						// } else if
-						// (!cmp.getBrand().getNameEn().equals(product.getBrand())
-						// &&
-						// cmp.getBrand().getNameCn().equals(product.getBrand())
-						// &&
-						// cmp.getKind().getNameCn().equals(product.getTitle()))
-						// {// 再匹配中文
-						// product.setPbranden(cmp.getBrand().getNameEn());
-						// product.setPbrand(cmp.getBrand().getNameCn());
-						// product.setCmpUuId(cmp.getUuid());
-						// product.setPcmpcode(cmp.getCode());
-						// product.setKind(cmp.getKind().getNameCn());
-						// product.setKinden(cmp.getKind().getNameEn());
-						// product.setStandard(Constant.YES);
-						// product.setMessage("success");
-						// } else {// 给出提示
-						// product.setMessage(product.getCode() +
-						// "存在多个品牌,需要手动选择匹配");
-						// }
-						// }
-						// }
-					} else {
-						Product oldProd = prods.get(0);
-						if (oldProd.getIsPubsale() == null) {
-							// oldProd.setIsPurchase(Constant.YES);
-							// if (oldProd.getCmpUuId() == null) {
-							// List<Component> components =
-							// componentDao.findByCode(product.getCmpCode());
-							// if (components.size() == 1) {
-							// oldProd.setPbranden(components.get(0).getBrand().getNameEn());
-							// oldProd.setPbrand(components.get(0).getBrand().getNameCn());
-							// oldProd.setCmpUuId(components.get(0).getUuid());
-							// oldProd.setPcmpcode(components.get(0).getCode());
-							// oldProd.setKind(components.get(0).getKind().getNameCn());
-							// oldProd.setKinden(components.get(0).getKind().getNameEn());
-							// oldProd.setStandard(Constant.YES);
-							// } else {
-							// oldProd.setStandard(Constant.NO);
-							// }
-							// } else {
-							// Component component =
-							// componentDao.findByUuid(oldProd.getCmpUuId());
-							// oldProd.setPbrand(component.getBrand().getNameCn());
-							// oldProd.setPbranden(component.getBrand().getNameEn());
-							// oldProd.setKind(component.getKind().getNameCn());
-							// oldProd.setKinden(component.getKind().getNameEn());
-							// oldProd.setStandard(Constant.YES);
-							// }
-							oldProd.setIsPurchase(Constant.YES);
-							// 如果已存在,且被禁用,修改为可用
-							List<ProductStatus> productStatuses = productStatusDao.findByPrIdAndB2bDisabled(oldProd.getId(), Constant.YES);
-							if (!CollectionUtils.isEmpty(productStatuses)) {
-								ProductStatus status = productStatuses.get(0);
-								status.setB2bDisabled(Constant.NO);
-								productStatusDao.save(status);
-							}
-//							ProductUtils.updateOne(oldProd);
-                            oldProducts.add(oldProd);
-						}
-						// else if (oldProd.getIsPurchase() != null) {
-						// if (!oldProd.getIsPurchase().equals(Constant.YES)) {
-						// if (oldProd.getCmpUuId() == null) {
-						// List<Component> components =
-						// componentDao.findByCode(product.getCmpCode());
-						// if (components.size() == 1) {
-						// oldProd.setPbranden(components.get(0).getBrand().getNameEn());
-						// oldProd.setPbrand(components.get(0).getBrand().getNameCn());
-						// oldProd.setCmpUuId(components.get(0).getUuid());
-						// oldProd.setPcmpcode(components.get(0).getCode());
-						// oldProd.setKind(components.get(0).getKind().getNameCn());
-						// oldProd.setKinden(components.get(0).getKind().getNameEn());
-						// oldProd.setStandard(Constant.YES);
-						// } else {
-						// oldProd.setStandard(Constant.NO);
-						// }
-						// } else {
-						// Component component =
-						// componentDao.findByUuid(oldProd.getCmpUuId());
-						// oldProd.setPbrand(component.getBrand().getNameCn());
-						// oldProd.setPbranden(component.getBrand().getNameEn());
-						// oldProd.setKind(component.getKind().getNameCn());
-						// oldProd.setKinden(component.getKind().getNameEn());
-						// oldProd.setStandard(Constant.YES);
-						// }
-						// oldProd.setIsPurchase(Constant.YES);
-						// }
-						// }
-						alters.add(product.getCode());
-						product.setCode(null);
-					}
-					product.setEnUU(SystemSession.getUser().getEnterprise().getUu());
-					product.setUserUU(SystemSession.getUser().getUserUU());
-					product.setSourceApp("B2B");
-					product.setIsPurchase(Constant.YES);
-					product.setIsPubsale(Constant.NO);
-					product.setIsShow(Constant.NO);
-					if (product.getStandard() == null) {
-						product.setStandard(Constant.NO);
-					}
-					if (alters.size() > 0) {
-						modelMap.put("alters", alters);
-					}
-					if (infos.size() > 0) {
-						modelMap.put("infos", infos);
-					}
-					if (product.getCode() != null) {
-						products.add(product);
-					}
-					product.setErpDate(new Date());
-					productsInfo.add(product);
-					modelMap.put("total", total);
-					modelMap.put("products", productsInfo);
-				}
-			}
-			if (total > MAX_ROWNUM) {
-				throw new IllegalOperatorException("批量导入超过限制行数5000行,不能导入!");
-			}
-			if (!CollectionUtils.isEmpty(products) || !CollectionUtils.isEmpty(oldProducts)) {
-				try {
-				    products.addAll(oldProducts);
-					ProductUtils.paginationUpdate(products);
-					modelMap.put("success", products.size());
-				} catch (Exception e) {
-					modelMap.put("error", "上传失败,可能存在编号相同的物料");
-				}
-			}
-		}
-		return modelMap;
+                    // 单位
+                    if (row.getCell(5) != null && row.getCell(5).getCellType() != Cell.CELL_TYPE_BLANK) {
+                        row.getCell(5).setCellType(Cell.CELL_TYPE_STRING);
+                        if (null != row.getCell(5).getStringCellValue()
+                                && !row.getCell(5).getStringCellValue().trim().equals("")) {
+                            temp.setPr_unit(row.getCell(5).getStringCellValue());
+                        }
+                    } else {
+                        modelMap.put("error", "第" + (r + 1) + "行单位未填写");
+                        return modelMap;
+                    }
+                    // 最小包装量
+                    if (row.getCell(6) != null) {
+                        row.getCell(6).setCellType(Cell.CELL_TYPE_STRING);
+                        if (null != row.getCell(6).getStringCellValue().trim()
+                                && !row.getCell(6).getStringCellValue().trim().equals("")) {
+                            try {
+                                temp.setPr_minpack(Double.valueOf(row.getCell(6).getStringCellValue()));
+                            } catch (NumberFormatException e) {
+                                throw new IllegalOperatorException("第" + (r + 1) + "行最小包装量填写不规范,请填数字");
+                            }
+                        }
+                    }
+                    // 最小订购量
+                    if (row.getCell(7) != null) {
+                        row.getCell(7).setCellType(Cell.CELL_TYPE_STRING);
+                        if (null != row.getCell(7).getStringCellValue().trim()
+                                && !row.getCell(7).getStringCellValue().trim().equals("")) {
+                            try {
+                                temp.setPr_minorder(Double.valueOf(row.getCell(7).getStringCellValue()));
+                            } catch (NumberFormatException e) {
+                                throw new IllegalOperatorException("第" + (r + 1) + "行最小订购量填写不规范,请填数字");
+                            }
+                        }
+                    }
+                    // 交货周期
+                    if (row.getCell(8) != null) {
+                        row.getCell(8).setCellType(Cell.CELL_TYPE_STRING);
+                        if (null != row.getCell(8).getStringCellValue().trim()
+                                && !row.getCell(8).getStringCellValue().trim().equals("")) {
+                            try {
+                                temp.setPr_leadtime(Double.valueOf(row.getCell(8).getStringCellValue()));
+                            } catch (NumberFormatException e) {
+                                throw new IllegalOperatorException("第" + (r + 1) + "行交货周期填写不规范,请填数字");
+                            }
+                        }
+                    }
+                    // 交货提前期
+                    if (row.getCell(9) != null) {
+                        row.getCell(9).setCellType(Cell.CELL_TYPE_STRING);
+                        if (null != row.getCell(9).getStringCellValue().trim()
+                                && !row.getCell(9).getStringCellValue().trim().equals("")) {
+                            try {
+                                temp.setPr_ltinstock(Double.valueOf(row.getCell(9).getStringCellValue()));
+                            } catch (NumberFormatException e) {
+                                throw new IllegalOperatorException("第" + (r + 1) + "行交货提前期填写不规范,请填数字");
+                            }
+                        }
+                    }
+                    temps.add(temp);
+                }
+            }
+            if (total > MAX_ROWNUM) {
+                throw new IllegalOperatorException("批量导入超过限制行数5000行,不能导入!");
+            }
+            modelMap.put("total", total);
+            // 本地校验
+            checkTempProducts(temps, modelMap);
+            // 保存到公共库
+            saveToDataCenter(temps, modelMap);
+            System.out.println("总耗时:" + (System.currentTimeMillis() - start));
+        }
+        return modelMap;
 
-	}
+    }
+
+    /**
+     * 校验导入的物料
+     *
+     * @param temps
+     */
+    private void checkTempProducts(List<ProductTemp> temps, ModelMap modelMap) {
+        long start = System.currentTimeMillis();
+        if (!org.springframework.util.CollectionUtils.isEmpty(temps)) {
+            String importId = temps.get(0).getPr_import_id();
+            // 放入数据库
+            productTempDao.save(temps);
+            // 匹配已存在物料
+            productTempDao.matchExists(importId);
+            // 已禁用物料自动解禁
+            productTempDao.toggleDisabled(importId);
+            // 返回在物料库已存在的物料名称
+            List<String> existed = productTempDao.getExistsTitle(importId);
+            if (!org.springframework.util.CollectionUtils.isEmpty(existed)) {
+                modelMap.put("alters", existed);
+            }
+            System.out.println("校验:" + (System.currentTimeMillis() - start));
+        }
+    }
 
-//	private void saveUserOrders(final List<Product> products) {
-//		final Long userUU = SystemSession.getUser().getUserUU();
-//		ThreadTask.getInstance().execute(new Runnable() {
-//			@Override
-//			public void run() {
-//				/* 添加供应商的阅读记录*/
-//				List<UserOrders> list = new ArrayList<>();
-//				if (!CollectionUtils.isEmpty(products)) {
-//					int i = 0;
-//					List<User> users = userDao.findByEnUU(products.get(0).getEnUU());
-//					for (Product product : products) {
-//						i++;
-//						UserOrders userOrders;
-//						for (User user : users) {
-//							if (user == null || Objects.equals(user.getUserUU(), userUU)) {
-//								continue;
-//							}
-//							userOrders = new UserOrders(user.getUserUU(), product.getEnUU(), product.getId(), "sale", "products");
-//							list.add(userOrders);
-//						}
-//						if (i > 99) {
-//							break;
-//						}
-//					}
-//					userOrderDao.save(list);
-//				}
-//			}
-//		});
-//	}
+    /**
+     * 保存到公共库
+     */
+    private void saveToDataCenter(List<ProductTemp> temps, ModelMap modelMap){
+        long start = System.currentTimeMillis();
+        if (!org.springframework.util.CollectionUtils.isEmpty(temps)) {
+            String importId = temps.get(0).getPr_import_id();
+            // 已匹配+未匹配到的物料
+            List<Product> products = productTempDao.getProducts(importId);
+            System.out.println("取匹配后结果:" + (System.currentTimeMillis() - start));
+            start = System.currentTimeMillis();
+            try {
+                // 更新物料并插入个人物料
+                ModelMap map = ProductUtils.paginationUpdateAndAddToProductUser(products);
+                System.out.println("更新物料:" + (System.currentTimeMillis() - start));
+                if ("true".equals(map.get("success"))) {
+                    modelMap.put("success", null != map.get("result") ? map.get("result") : 0);
+                } else {
+                    modelMap.put("error", "物料添加失败(" + null != map.get("message") ? map.get("message") : "" + ")");
+                }
+//                start = System.currentTimeMillis();
+//                if (!CollectionUtils.isEmpty(idList)) {
+//                    // 更新个人物料
+//                    List<ProductUsers> productUsersList = productTempDao.getNotMatchedProductUsers(importId,
+//                            temps.get(0).getPr_enuu(), temps.get(0).getPr_useruu(), idList);
+//                    if (!CollectionUtils.isEmpty(productUsersList)) {
+//                        ProductUtils.updateProductUsersByBatch(productUsersList);
+//                        modelMap.put("success", productUsersList.size());
+//                        System.out.println("更新个人物料:" + (System.currentTimeMillis() - start));
+//                    }
+//                }
+            } catch (Exception e) {
+                modelMap.put("error", "物料添加失败(" + e.getMessage() + ")");
+            }
+        }
+    }
 
 	@Override
 	public void switchPorduct(String status) throws Exception {

+ 29 - 1
src/main/java/com/uas/platform/b2b/service/impl/PurchaseApBillOutServiceImpl.java

@@ -3,6 +3,7 @@ package com.uas.platform.b2b.service.impl;
 import com.uas.platform.b2b.dao.*;
 import com.uas.platform.b2b.model.*;
 import com.uas.platform.b2b.search.SearchService;
+import com.uas.platform.b2b.service.PiaoPlusService;
 import com.uas.platform.b2b.service.PurchaseApBillOutService;
 import com.uas.platform.b2b.service.SOAPConsoleService;
 import com.uas.platform.b2b.support.SystemSession;
@@ -63,6 +64,9 @@ public class PurchaseApBillOutServiceImpl implements PurchaseApBillOutService {
 	@Autowired
 	private SOAPConsoleService soapConsoleService;
 
+	@Autowired
+	private PiaoPlusService piaoPlusService;
+
 	/*@Override
 	public List<PurchaseApCheck> findNotUploadAPcheck() {
 		return purchaseApCheckDao.findByCustUuAndStatusAndCheckStatus(SystemSession.getUser().getEnterprise().getUu(),
@@ -215,7 +219,9 @@ public class PurchaseApBillOutServiceImpl implements PurchaseApBillOutService {
 		PurchaseApBillOut apBillOut = purchaseApBillOutDao.findOne(id);
 		if (apBillOut != null) {
 			//调用航天接口开具发票
-			map =soapConsoleService.invoiceIssued(apBillOut);
+			//map =soapConsoleService.invoiceIssued(apBillOut);
+			//调用票加加上传接口
+			map = piaoPlusService.uploadInvoice(apBillOut);
 		} else {
 			map.put("error", "不存在此开票单");
 		}
@@ -478,4 +484,26 @@ public class PurchaseApBillOutServiceImpl implements PurchaseApBillOutService {
 		}
 		return map;
 	}
+
+	@Override
+	public void saveByItem(List<PurchaseApBillOutItem> apBillOutItems) {
+		List<PurchaseApBillOutItem> purchaseApBillOutItems = purchaseApBillOutItemDao.save(apBillOutItems);
+	}
+
+	@Override
+	public PurchaseApBillOut findByCode(String orderNo) {
+		long enUU = SystemSession.getUser().getEnterprise().getUu();
+		List<PurchaseApBillOut> list = purchaseApBillOutDao.findByEnUuAndCode(enUU, orderNo);
+		if (list.size() > 0) {
+			return list.get(0);
+		}
+		return null;
+	}
+
+	@Override
+	public void save(PurchaseApBillOut apBillOut) {
+		purchaseApBillOutDao.save(apBillOut);
+	}
+
+
 }

+ 11 - 29
src/main/java/com/uas/platform/b2b/service/impl/VendorsServiceImpl.java

@@ -25,7 +25,6 @@ import com.uas.platform.b2b.temporary.model.PartnershipRecord;
 import com.uas.platform.core.model.Constant;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.Status;
-import com.uas.sso.entity.PartnershipRecordView;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.jpa.domain.Specification;
@@ -69,6 +68,14 @@ public class VendorsServiceImpl implements VendorService {
 	@Autowired
 	private UserDao userDao;
 
+	@Autowired
+	private com.uas.platform.b2b.erp.service.VendorService vendorService;
+
+    /**
+     * 应用来源
+     */
+    private final String APPID = "uas";
+
 	@Override
 	public List<Vendor> findMyVendors() {
 		return vendorDao.findByMyEnUU(SystemSession.getUser().getEnterprise().getUu());
@@ -86,35 +93,10 @@ public class VendorsServiceImpl implements VendorService {
 		vendor.setCustswitch(Constant.YES);
 		vendor.setVendswitch(Constant.YES);
 		Vendor vendor1 = vendorDao.save(vendor);
-		addPartnerShipRecord(vendor1); // 添加合作伙伴关系
+		vendorService.addPartnerShipRecord(vendor1, APPID); // 添加合作伙伴关系
 		return vendor1;
 	}
 
-	private void addPartnerShipRecord(Vendor vendor) {
-		PartnershipRecord shipRecord = new PartnershipRecord("uas", vendor);
-		PartnershipRecordView record = new PartnershipRecordView();
-		record.setAppId(shipRecord.getAppId());
-		record.setCustName(shipRecord.getCustName());
-		record.setCustUID(shipRecord.getCustUID());
-		record.setCustUserCode(Long.valueOf(shipRecord.getCustUserCode()));
-		record.setCustUserEmail(shipRecord.getCustUserEmail());
-		record.setCustUserName(shipRecord.getCustUserName());
-		record.setCustUserTel(shipRecord.getCustUserTel());
-		record.setVendName(shipRecord.getVendName());
-		record.setVendUID(shipRecord.getVendUID());
-		record.setVendUserCode(Long.valueOf(shipRecord.getVendUserCode()));
-		record.setVendUserEmail(shipRecord.getVendUserEmail());
-		record.setVendUserName(shipRecord.getVendUserName());
-		record.setVendUserTel(shipRecord.getVendUserTel());
-		try {
-			String result = AccountUtils.synchronizeRecord(record);
-			vendor.setSynchStatus(Constant.YES);
-			vendorDao.save(vendor);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
 	@Override
 	public List<Vendor> addVendors(List<Vendor> vendors) {
 		List<Vendor> validVendors = new ArrayList<Vendor>();
@@ -122,7 +104,7 @@ public class VendorsServiceImpl implements VendorService {
 			Vendor vend = addVendor(vendor);
 			if (vend != null) {
 				validVendors.add(vend);
-				addPartnerShipRecord(vend); // 添加合作伙伴关系
+                vendorService.addPartnerShipRecord(vend, APPID); // 添加合作伙伴关系
 			}
 		}
 		return validVendors;
@@ -312,7 +294,7 @@ public class VendorsServiceImpl implements VendorService {
 		int i = 0;
 		for (Vendor vendor : vendors) {
 			i++;
-			addPartnerShipRecord(vendor);
+            vendorService.addPartnerShipRecord(vendor, APPID);
 		}
 	}
 

BIN
src/main/resources/jxls-tpl/baseInfo/baseInfo_prod_example.xls


BIN
src/main/resources/jxls-tpl/sale/upload_userproduct_example.xls


+ 33 - 13
src/main/webapp/WEB-INF/views/normal/index.html

@@ -53,17 +53,13 @@
 						<input type="search" ng-model="keyword" placeholder=" 输入企业或器件" ng-search="search(keyword)"><a class="btn input-group-addon" ng-click="search(keyword)">搜索</a>
 					</div>
 				</ul>
-				<div id="home-headerBtns" ng-controller="HeaderCtrl">
-					<a href="javascript:void(0);" class="user-btn" ui-sref="approvalflow.user"><span ng-bind="userInfo.userName"></span><i class="fa fa-user fa-lg"></i></a>
-					<a href="javascript:void(0);" class="moblie-btn"><i class="fa fa-tablet fa-lg"></i></a>
-					<a ng-click="showMessage()" title="查看消息" ng-class="{'notice-dot': message.toRead > 0}"><i class="fa fa-comments-o fa-lg"></i><em></em></a>
-					<a ui-sref="approvalflow.flow"><i class="fa fa-cog fa-lg"></i></a>
-					<a ng-click="logout()" title="退出登录"><i class="fa fa-power-off fa-lg"></i></a>
+				<div id="home-headerName">
+					<a ui-sref="approvalflow.enterprise"><span ng-bind="userInfo.enterprise.enName"></span> <i class="fa fa-chevron-down"></i></a>
 				</div>
-				<div class="user-tk">
+				<div class="name-tk">
 					<div>
 						<ul class="user-message">
-							<li class="active"><a ui-sref="approvalflow.enterprise"><span>{{userInfo.enterprise.enName}}</span><span>({{userInfo.enterprise.uu}})</span></a></li>
+							<li><a ui-sref="approvalflow.enterprise">&nbsp;(<span ng-bind="userInfo.enterprise.uu" class="red"></span>)<span class="red" ng-bind="userInfo.enterprise.enName"></span>{{}}&nbsp;</span></a></li>
 							<li ng-repeat="e in userInfo.enSelect">
 								<a ng-click="switchto(e.uu)">{{e.enName}}</a>
 							</li>
@@ -71,6 +67,21 @@
 						<div class="cart"><img src="static/img/all/carts.png" alt=""/></div>
 					</div>
 				</div>
+				<div id="home-headerBtns" ng-controller="HeaderCtrl">
+					<a href="javascript:void(0);" class="user-btn" ui-sref="approvalflow.user"><i class="fa fa-user fa-lg"></i><span ng-bind="userInfo.userName"></span><i class="fa fa-chevron-down"></i></a>
+				</div>
+				<div class="user-tk">
+					<div>
+						<ul class="user-message">
+							<li><a ui-sref="approvalflow.userProduct">我的产品库</a></li>
+							<li><a ng-click="showMessage()" ng-class="{'notice-dot': message.toRead > 0}">消息中心<em></em></a></li>
+							<li><a ui-sref="approvalflow.flow">基础设置</a></li>
+							<li><a class="moblie-btn">手机二级维码</a></li>
+							<li ng-click="logout()">退出账户</li>
+						</ul>
+						<div class="cart"><img src="static/img/all/carts.png" alt=""/></div>
+					</div>
+				</div>
 				<div class="erweima-tk">
 					<div>
 						<p>扫描二维码<br/>下载手机客户端</p>
@@ -414,16 +425,25 @@
 		$('.dropdown-tab a.href').click(function(){
 			$(".dropdown-tab").hide();
 		});
-		$('#home-headerBtns .user-btn').hover(function(){
-			$(".user-tk").toggle();
-			$('.user-tk').mouseenter(function(){
+		$('#home-headerName a').hover(function(){
+			$(".name-tk").toggle();
+			$('.name-tk').mouseenter(function(){
 				$(this).show();
 			});
-			$('.user-tk').mouseleave(function(){
+			$('.name-tk').mouseleave(function(){
 				$(this).hide();
 			});
 		})
-		$('#home-headerBtns .moblie-btn ').hover(function(){
+        $('#home-headerBtns .user-btn').hover(function(){
+            $(".user-tk").toggle();
+            $('.user-tk').mouseenter(function(){
+                $(this).show();
+            });
+            $('.user-tk').mouseleave(function(){
+                $(this).hide();
+            });
+        })
+		$('.user-tk .moblie-btn ').hover(function(){
 			$(".erweima-tk").toggle();
 			$('.erweima-tk').mouseenter(function(){
 				$(this).show();

+ 114 - 23
src/main/webapp/resources/css/index.css

@@ -710,11 +710,9 @@ ul>li.item-link>a {
 	color: #969696;
 }
 #header.navbar-inverse .navbar-nav>li{
-	margin-left: 70px;
-}
-#header.navbar-inverse .navbar-nav>li:last-child{
-	margin-left: 60px;
+	margin: 0 20px;
 }
+
 #header.navbar-inverse .navbar-nav>li>a {
 	font-size: 20px;
 	font-famliy: Microsoft Yahei;
@@ -726,7 +724,7 @@ ul>li.item-link>a {
 
 /** 顶部 start **/
 #home-search {
-	margin-left: 580px;
+	margin-left: 450px;
 	margin-top: 7px;
 	position: absolute;
 }
@@ -781,9 +779,35 @@ ul>li.item-link>a {
 	padding-left: 10px;
 }
 
+#home-headerName{
+	position: absolute;
+	right: 160px;
+	top: 3px;
+	width: 200px;
+	padding-right: 20px;
+	height: 50px;
+	line-height: 50px;
+	color: #333333;
+	font-size: 14px;
+}
+#home-headerName span{
+	display:inline-block;
+	width:100%;
+	overflow: hidden;
+	text-overflow: ellipsis;
+	white-space: nowrap;
+}
+#home-headerName i{
+	position:absolute;
+	top:15px;
+	right:0;
+}
+
+
 #home-headerBtns {
 	position: absolute;
 	right: 0;
+	top:0;
     padding-right: 35px;
 	height: 50px;
 	line-height: 50px;
@@ -791,7 +815,7 @@ ul>li.item-link>a {
 	font-size: 16px;
 }
 #home-headerBtns i {
-	padding-left: 20px;
+	padding:0 10px;
 }
 #home-headerBtns a{
 	display: inline-block;
@@ -810,9 +834,7 @@ ul>li.item-link>a {
 #home-headerBtns a:hover i.fa-user{
 	color: #d32526;
 }
-#home-headerBtns a.user-btn i{
-	padding-left: 5px;
-}
+
 #home-headerBtns a span{
 	font-size: 13px;
 	color: #000;
@@ -2725,21 +2747,21 @@ input.ng-invalid.ng-dirty,textarea.ng-invalid.ng-dirty {
 	color: #323232;
 }
 /*账号切换 begin*/
-.user-tk {
+.name-tk {
 	position: absolute;
 	text-align: left;
-	 display: none;
-	right: 93px;
+	display: none;
+	right: 155px;
 	top: 44px;
 	/* animation: slideDown .2s ease-in 1 normal both; */
 	width: 250px;
 
 }
-.user-tk div{
+.name-tk div{
 	margin-top: 10px;
 	position: relative ;
 }
-.user-tk .user-message{
+.name-tk .user-message{
 	padding-left: 0;
 	margin-bottom: 0;
 	width: 250px;
@@ -2750,7 +2772,7 @@ input.ng-invalid.ng-dirty,textarea.ng-invalid.ng-dirty {
 	max-height: 550px;
 	overflow-y: auto;
 }
-.user-tk .user-message li{
+.name-tk .user-message li{
 	width: 250px;
 	overflow: hidden;
 	text-overflow: ellipsis;
@@ -2759,45 +2781,114 @@ input.ng-invalid.ng-dirty,textarea.ng-invalid.ng-dirty {
 	line-height: 50px;
 	border-bottom: 1px solid #ccc;
 }
-.user-tk .user-message li:last-child {
+.name-tk .user-message li:last-child {
 	border-bottom: none;
 }
-.user-tk .user-message li a{
+.name-tk .user-message li:first-child a{
+	color:#d32526;
+}
+.name-tk .user-message li:first-child a span.red{
+	color:#d32526;
+}
+.name-tk .user-message li a{
 	padding-left: 10px;
 	display: inline-block;
 	width: 250px;
 	height: 38px;
 	overflow: hidden;
+	text-overflow: ellipsis;
+	white-space: nowrap;
 }
-.user-tk .user-message li.active a{
+.name-tk .user-message li.active a{
 	width: 250px;
 	margin-top: 12px;
 	line-height: 38px;
 	background: #e8e8e8;
 }
-.user-tk .user-message li.active a span{
+.name-tk .user-message li.active a span{
 	font-size: 13px;
 	color: #000;
 }
-.user-tk .user-message li.active a span:first-child{
+.name-tk .user-message li.active a span:first-child{
 	float: left;
 	font-size: 13px;
 	color: #d32526;
-    width: 155px;
+	width: 155px;
 	overflow: hidden;
 	text-overflow: ellipsis;
 	white-space: nowrap;
 }
-.user-tk .user-message li a span:last-child {
+.name-tk .user-message li a span:last-child {
 	float: left;
 	font-size: 13px;
 	color: #999;
 }
-.user-tk div .cart {
+.name-tk div .cart {
 	position: absolute;
 	top: -28px;
 	left: 85px;
 }
+.name-tk div .cart img{
+	width: 25px;
+	height: 15px;
+}
+/*操作类型切换 begin*/
+.user-tk {
+	position: absolute;
+	text-align: left;
+	 display: none;
+	right: 0;
+	top: 44px;
+	/* animation: slideDown .2s ease-in 1 normal both; */
+	width: 150px;
+
+}
+.user-tk div{
+	margin-top: 10px;
+	position: relative ;
+}
+.user-tk .user-message{
+	padding:0;
+	margin-bottom: 0;
+	list-style: none;
+	box-shadow: 3px 3px 5px #ccc;
+	overflow: hidden;
+	background: #fff;
+}
+.user-tk .user-message li{
+	width: 100%;
+	overflow: hidden;
+	text-overflow: ellipsis;
+	white-space: nowrap;
+	height: 35px;
+	line-height: 35px;
+	padding-left:15px;
+}
+
+.user-tk .user-message li a{
+	display: inline-block;
+	height: 38px;
+	overflow: hidden;
+}
+.user-tk .user-message li a:hover{
+	display: inline-block;
+	height: 38px;
+	overflow: hidden;
+	color:#52a9fa;
+}
+
+.user-tk .user-message li:last-child{
+	padding:0;
+	text-align: center;
+	font-size: 14px;
+	color: #ea6c6d;
+	background: #f4f4f4;
+}
+.user-tk div .cart {
+	position: absolute;
+	top: -28px;
+	left: 45px;
+}
 .user-tk div .cart img{
 	width: 25px;
 	height: 15px;

+ 40 - 31
src/main/webapp/resources/js/index/app.js

@@ -4900,7 +4900,7 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
                             toaster.pop('success', '提示', data.success);
                             $timeout(function () {
                                 $rootScope.active = 'done';
-                                window.location.hash = "#/purc/inquiry_unapply";
+                                window.location.hash = "#/baseInfo/inquiryList";
                             }, 500);
                         }
                         if (data.error) {
@@ -5597,22 +5597,26 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
 
         // 转客户询价
         $scope.transtoInquiry = function (inquiryItem) {
-            var modalInstance = $modal.open({
-                templateUrl: 'static/tpl/index/baseInfo/modal/quotation_modal.html',
-                controller: 'QuoteCtrl',
-                size: 'lg',
-                resolve: {
-                    inquiryItem: function () {
-                        return inquiryItem
+            if ($scope.currentEn.uu == inquiryItem.inquiry.enUU) {
+                toaster.pop('warning', '不能对自己企业报价');
+            } else {
+                var modalInstance = $modal.open({
+                    templateUrl: 'static/tpl/index/baseInfo/modal/quotation_modal.html',
+                    controller: 'QuoteCtrl',
+                    size: 'lg',
+                    resolve: {
+                        inquiryItem: function () {
+                            return inquiryItem
+                        }
                     }
-                }
-            });
+                });
 
-            modalInstance.result.then(function (data) {
-                $scope.tableParams.reload();
-            }, function () {
+                modalInstance.result.then(function (data) {
+                    $scope.tableParams.reload();
+                }, function () {
 
-            });
+                });
+            }
         }
 
         // 跳转到我的报价列表
@@ -7655,7 +7659,7 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
                             toaster.pop('error', '提示', '发货失败,请刷新页面重试');
                         }
                     }, function (response) {
-                        toaster.pop('error', '错误', '发货失败');
+                        toaster.pop('error', '错误', response.data);
                     });
                     isSumbit = true;
                     return true;
@@ -13779,7 +13783,7 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
                             toaster.pop('error', '提示', data.error);
                         }
                         $scope.result = data;
-                        $scope.products = $scope.result.products;
+                        // $scope.products = $scope.result.products;
                         $scope.success = $scope.result.success;
                         $scope.total = $scope.result.total;
                         $scope.alters = $scope.result.alters;
@@ -22403,7 +22407,7 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
                             toaster.pop('error', '提示', data.error);
                         }
                         $scope.result = data;
-                        $scope.products = $scope.result.products;
+                        // $scope.products = $scope.result.products;
                         $scope.success = $scope.result.success;
                         $scope.total = $scope.result.total;
                         $scope.alters = $scope.result.alters;
@@ -24099,27 +24103,32 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
     /**
      * 针对买家,已转询价单的客户公共询价单明细
      */
-    app.controller('PurcPubInquiryDetailCtrl', ['$scope', '$stateParams', 'publicInquiry', '$filter', 'toaster', '$upload', 'token', 'CurrentRole', function ($scope, $stateParams, publicInquiry, $filter, toaster, $upload, token, CurrentRole) {
+    app.controller('PurcPubInquiryDetailCtrl', ['$scope', '$stateParams', 'publicInquiry', '$filter', 'toaster', '$upload', 'token', 'CurrentRole', 'AccountEnterprise', '$http', function ($scope, $stateParams, publicInquiry, $filter, toaster, $upload, token, CurrentRole, AccountEnterprise, $http) {
         // 获取当前用户是否为普通用户
         CurrentRole.isUser({}, {}, function (data) {
             $scope.isUser = data.isUser;
         });
 
-        var loadData = function () {
-            publicInquiry.detail({id: $stateParams.id}, function (data) {
-                $scope.newinquiryItems = data;
-                var inquiry = data;
-                //inquiry.inquiryItems = data;
-                angular.forEach(inquiry.attachs, function (attach) {
-                    attach.type = attach.name.substr(attach.name.lastIndexOf('.') + 1);
+        AccountEnterprise.get({}, function(data) {
+            $scope.currentEn = data;
+            publicInquiry.getUrl({}, function(data) {
+                var url = data.url;
+                $http({
+                    method: 'get',
+                    dataType: 'json',
+                    url: url + '/inquiry/buyer/detail',
+                    params: {id: $stateParams.id, enuu: $scope.currentEn.uu}
+                }).success(function (response) {
+                    $scope.newinquiryItems = response;
+                    var inquiry = response;
+                    angular.forEach(inquiry.attachs, function (attach) {
+                        attach.type = attach.name.substr(attach.name.lastIndexOf('.') + 1);
+                    });
+                    $scope.inquiry = inquiry;
                 });
-                $scope.inquiry = inquiry;
-            }, function (response) {
-                $scope.loading = false;
-                toaster.pop('error', '', response.data);
+
             });
-        };
-        loadData();
+        });
         $scope.getMinDate = function (item) {
             return $filter('date')(item.inquiry.date, 'yyyy-MM-dd');
         };

+ 4 - 0
src/main/webapp/resources/tpl/index/approvalFlow/enterprise.html

@@ -418,6 +418,10 @@
 					<span class="title">企业UU号:</span>
 					<div class="content" ng-bind="::enterprise.uu"></div>
 				</div>
+				<div class="com-text col-xs-6">
+					<span class="title">注册时间:</span>
+					<div class="content" ng-bind="::enterprise.enDate | date:'yyyy-MM-dd HH:mm:ss'"></div>
+				</div>
 			</div>
 			<!-- <div class="col-xs-4">
 				<div class="com-text col-xs-12">

+ 2 - 2
src/main/webapp/resources/tpl/index/approvalFlow/modal/uplodaByBatch.html

@@ -72,8 +72,8 @@
 </div>
 <div class="modal-footer Deputy">
 	<div class="text-center">
-		<button class="btn btn-success btn-sm" ng-click="enSure()" type="button">确定</button>
-		<button class="btn btn-danger btn-sm" ng-click="cancel()" type="button">取消</button>
+		<button class="btn btn-success" ng-click="enSure()" type="button">关闭</button>
+		<!--<button class="btn btn-danger btn-sm" ng-click="cancel()" type="button">取消</button>-->
 	</div>
 </div>
 <!-- block end -->

+ 0 - 3
src/main/webapp/resources/tpl/index/baseInfo/uploadByBatch.html

@@ -308,9 +308,6 @@ table.table.table-striped  thead {
 		<div ng-repeat="alter in alters">
 			物料 <span class="text-inverse">{{alter}}</span> 已存在,更新成功
 		</div>
-		<div ng-repeat="info in infos">
-			物料 <span class="text-inverse">{{info}}</span> 是从UAS上传的物料,请在UAS系统内更新
-		</div>
 		</p>
 	</div>
 	<div class="headerline">

+ 4 - 1
src/main/webapp/resources/tpl/index/fa/apBillOut.html

@@ -219,7 +219,7 @@
 					<div class="">
 						<span>单据编号:</span>
 						<span class="text-num"><a ui-sref="fa.apBillOut_detail({id:billOut.id})" title="点击查看详情">{{::billOut.code}}</a></span>
-						<span class="pull-right text-num" title="录单时间">{{::billOut.recordDate | date:'MM月dd日 HH:mm'}} <i class="fa fa-clock-o"></i></span>
+						<span class="pull-right text-num" title="录单时间">{{::billOut.recordDate | date:'yyyy年MM月dd日 HH:mm'}} <i class="fa fa-clock-o"></i></span>
 					</div>
 					<div class="main">
 						<strong><i class="fa fa-star" ng-class="{'text-default':billOut.status==201}"></i> {{::billOut.custName}}</strong>
@@ -256,6 +256,9 @@
 					<div ng-if="billOut.checkStatus == '已开票'" class="text-center text-muted f14">
 						<br> <i class="fa fa-check-square-o"></i> 已开票
 					</div>
+					<div ng-if="billOut.checkStatus == '开票中'" class="text-center text-muted f14">
+						<br> <i class="fa fa-check-square-o"></i> 开票中
+					</div>
 					<div ng-if="billOut.checkStatus == '部分开票'" class="text-center text-muted f14">
 						<br> <i class="fa fa-check-square-o"></i> 部分开票
 					</div>

+ 12 - 6
src/main/webapp/resources/tpl/index/fa/apBillOut_detail.html

@@ -68,7 +68,7 @@
 			</div>
 			<div class="col-xs-3">
 				<span class="title">录单日期</span>
-				<div class="content" ng-bind="::data.recordDate | date:'MM月dd日 HH:mm'"></div>
+				<div class="content" ng-bind="::data.recordDate | date:'yyyy年MM月dd日 HH:mm'"></div>
 			</div>
 			<div class="col-xs-3">
 				<span class="title">录单人</span>
@@ -133,10 +133,13 @@
 						<th width="100">客户单据编号</th>
 						<th width="80">单据类型</th>
 						<th>序号</th>
-						<th>单价</th>
 						<th>税率</th>
-						<th>对账数量</th>
-						<th>对账金额</th>
+						<th>开票单价</th>
+						<th>开票数量</th>
+						<th>开票金额</th>
+						<th>发票单价</th>
+						<th>发票数量</th>
+						<th>发票金额</th>
 						<th width="40">采购单号</th>
 						<th>采购序号</th>
 						<th>应付供应商名称</th>
@@ -150,10 +153,13 @@
 						<td ng-bind="item.inoutno"></td>
 						<td ng-bind="item.orderClass"></td>
 						<td ng-bind="item.inoutnodetno"></td>
-						<td ng-bind="item.price"></td>
 						<td ng-bind="item.taxrate"></td>
-						<td ng-bind="item.nowQty"></td>
 						<td ng-bind="item.nowPrice | number:2"></td>
+						<td ng-bind="item.nowQty | number:2"></td>
+						<td >{{::item.nowPrice * item.nowQty | number:2}}</td>
+						<td ng-bind="item.price | number:2"></td>
+						<td ng-bind="item.qty | number:2"></td>
+						<td >{{::item.price * item.qty | number:2}}</td>
 						<td ng-bind="item.orderCode"></td>
 						<td ng-bind="item.orderDetno"></td>
 						<td ng-bind="data.apBillOutInfo.enName"></td>

+ 4 - 6
src/main/webapp/resources/tpl/index/purc/pubInquiry.html

@@ -303,9 +303,7 @@ margin-left: 55px;
 	<div class="pub-com_head">
 		<span>公共询价</span>
 		<div class="p-right">
-			<a ui-sref="purc.inquiry_unapply" title="待提交"><img src="static/img/icon/wait.png"/>待发布</a>
 			<a ui-sref="purc.pubinquiry_new" title="新增公共询价单"><img src="static/img/icon/add.png"/>新增</a>
-			<!--<a href="#" ng-click="exportXls()" target="_self" class="text-simple" title="导出Excel表格"><i class="fa fa-file-excel-o fa-fw"></i>导出</a>-->
 		</div>
 	</div>
 	<div class="menu condition block">
@@ -361,7 +359,7 @@ margin-left: 55px;
 						<div class="form-group form-group-sm has-feedback" dropdown auto-close="outsideClick"
 							 on-toggle="searchAdvance=open">
 							<input type="search" class="form-control input-sm" ng-model="keyword"
-								   ng-search="onSearch(keyword)" placeholder="输入单据编号、客户名称、物料名称搜索" style="width: 100%"/>
+								   ng-search="onSearch(keyword)" placeholder="输入单据编号、供应商名称、物料名称搜索" style="width: 100%"/>
 							<a class="btn input-group-addon" ng-click="onSearch(keyword)">搜索</a>
 						</div>
 					</div>
@@ -477,7 +475,7 @@ margin-left: 55px;
 					<span class="text-num text-bold"
 									  title="{{inquiryItem.inquiry.date}}"
 									  ng-bind="::inquiryItem.inquiry.date | date:'yyyy-MM-dd'"></span>
-					<span g-bind="::inquiryItem.enterprise.enName"></span>
+					<span ng-bind="inquiryItem.vendName"></span>
 					<span>流水号:<a title="查看详情" class="text-num order-detail" ng-bind="::inquiryItem.inquiry.code" target="_self"
 								 href="#/purc/publicInquiry/{{::inquiryItem.inquiry.id}}" ng-click="setOrdersRead(inquiryItem.id)"></a></span>
 				</div>
@@ -504,8 +502,8 @@ margin-left: 55px;
 				<div ng-bind="inquiryItem.product.cmpCode || inquiryItem.cmpCode" title="物料型号:{{inquiryItem.product.cmpCode || inquiryItem.cmpCode}}"></div>
 				<div ng-bind="inquiryItem.product.spec || inquiryItem.spec" title="物料规格:{{inquiryItem.product.spec || inquiryItem.spec}}"></div>
 				<div ng-bind="inquiryItem.product.brand || inquiryItem.inbrand" title="物料品牌:{{inquiryItem.product.brand || inquiryItem.inbrand}}"></div>
-				<div ng-if="inquiryItem.inquiry.attachs.length" class="text-muted">
-					<i class="fa fa-paperclip fa-fw" style="color: #ffa340; font-size: 18px;"></i>附件:<a class="file" ng-repeat="attach in inquiryItem.inquiry.attachs" href="file/{{attach.id}}">{{::attach.name}}</a>
+				<div ng-if="inquiryItem.attachUrl" class="text-muted">
+					<i class="fa fa-paperclip fa-fw" style="color: #ffa340; font-size: 18px;"></i>附件:<a class="file" href="{{inquiryItem.attachUrl}}" target="_blank">{{::inquiryItem.attachName}}</a>
 				</div>
 			</td>
 			<td class="text-center">

+ 2 - 3
src/main/webapp/resources/tpl/index/purc/pubInquiry_detail.html

@@ -500,7 +500,7 @@ i, em {
                                     <span>交货周期</span>
                                     <span>最小订购</span>
                                     <span>最小包装</span>
-                                    <span>有效期</span>
+                                    <span>附件</span>
                                     <span>操作</span>
                                 </dt>
                                 <dd ng-repeat = "inquiryItem in product.inquiryItems">
@@ -541,8 +541,7 @@ i, em {
                                     <span class="prod-number">{{inquiryItem.minOrderQty|| '无'}}</span>
                                     <span class="prod-number">{{inquiryItem.minPackQty|| '无'}}</span>
                                     <span style="line-height: 20px; padding-top: 5px;">
-                                        <em>{{inquiryItem.vendFromDate| date:'yyyy-MM-dd'}}</em><br/>
-                                        <em>{{inquiryItem.vendToDate|date: 'yyyy-MM-dd'}}</em>
+                                        <a href="{{inquiryItem.attachUrl}}" target="_blank">{{inquiryItem.attachName}}</a>
                                     </span>
                                     <span ng-if="inquiryItem.status == 200" class="text-trans info">暂未报价</span>
                                     <span ng-if="inquiryItem.status == 201 && inquiryItem.agreed == null"><a ng-click="accept(inquiryItem.id)">采纳</a><a ng-click="refuse(inquiryItem.id)">拒绝</a></span>

+ 3 - 290
src/main/webapp/resources/tpl/index/sale/pubinquiry.html

@@ -393,6 +393,9 @@
 						</div>
 					</a>
 				</div>
+                <div ng-if="inquiryItem.attachUrl" class="text-muted">
+                    <i class="fa fa-paperclip fa-fw" style="color: #ffa340; font-size: 18px;"></i>附件:<a class="file" href="{{inquiryItem.attachUrl}}" target="_blank">{{::inquiryItem.attachName}}</a>
+                </div>
 			</td>
 			<td class="text-center">
 				<span ng-bind="inquiryItem.product.brand || inquiryItem.inbrand || '-'"></span>
@@ -434,294 +437,4 @@
 		</tr>
 		</tbody>
 	</table>
-	<!--<table class="order-table block" ng-table="tableParams">-->
-		<!--<thead>-->
-		<!--<tr class="header">-->
-			<!--<th>产品</th>-->
-			<!--<th width="60">单位</th>-->
-			<!--<th width="110"><span class="text-default">≥</span>分段数</th>-->
-			<!--<th width="90">价格</th>-->
-			<!--<th width="80">最小订购</th>-->
-			<!--<th width="80">最小包装</th>-->
-			<!--<th width="120">有效期</th>-->
-			<!--<th width="75">操作</th>-->
-		<!--</tr>-->
-		<!--<tr class="sep-row">-->
-			<!--<td colspan="7"></td>-->
-		<!--</tr>-->
-		<!--</thead>-->
-		<!--<tbody ng-if="tableParams.total() == 0">-->
-		<!--<tr>-->
-			<!--<td colspan="7">-->
-				<!--<div class="row text-muted info-container" style="padding: 50px 10px;">-->
-					<!--<div class="col-md-4 text-center">-->
-						<!--<br>-->
-						<!--<br>-->
-						<!--<div><img src="static/img/all/info.png" width="130px" height="90px"></div>-->
-						<!--<div class="f16">当前没有对应的客户询价单!</div>-->
-					<!--</div>-->
-					<!--<div class="col-md-8 br-l">-->
-						<!--<div class="f16">-->
-							<!--<p>为什么我没有接收到客户的询价单?</p>-->
-						<!--</div>-->
-						<!--<div class="f14">-->
-							<!--<div class="info">-->
-								<!--<p>1、您的客户还没有提交审核询价单<br>-->
-									<!--解决:与您的客户沟通确认单据是否已经审核(只有客户ERP中已经审核的单据才能接收到)</p>-->
-							<!--</div>-->
-							<!--<div class="info">-->
-								<!--<p>2、客户ERP中供应商信息有误<br>-->
-									<!--解决:与您的客户沟通确认您的信息在客户的供应商资料中是否维护正确,尤其是企业UU号</p>-->
-							<!--</div>-->
-							<!--<div class="info">-->
-								<!--<p>3、您的客户正在使用旧版本的UAS商务平台<br>-->
-									<!--解决:我们仍有部分用户在使用旧版本UAS商务平台系统,你可以用您的企业UU号和管理员个人UU号 <a href="http://www.usoftchina.com" class="text-bold text-link" title="http://www.usoftchina.com" target="_blank">登陆旧版本UAS商务平台</a></p>-->
-							<!--</div>-->
-						<!--</div>-->
-						<!--<br>-->
-						<!--<br>-->
-					<!--</div>-->
-				<!--</div>-->
-			<!--</td>-->
-		<!--</tr>-->
-		<!--</tbody>-->
-		<!--<tbody ng-repeat="inquiryItem in $data track by inquiryItem.id">-->
-		<!--<tr class="order-hd">-->
-			<!--<td class="first" colspan="4">-->
-				<!--<div class="order-main">-->
-						<!--&lt;!&ndash;<span> <input type="checkbox" class="selector"-->
-									  <!--ng-model="inquiryItem.$selected">-->
-						<!--</span> &ndash;&gt;-->
-					<!--<a href="javascript:void(0)" ng-if="!isUnread(inquiryItem.id)">-->
-						<!--<i class="fa fa-circle-thin"></i>-->
-					<!--</a>-->
-					<!--<a href="javascript:void(0)" ng-if="isUnread(inquiryItem.id)">-->
-						<!--<i class="fa fa-circle" style="color: #f40;"></i>-->
-					<!--</a>-->
-					<!--&nbsp;&nbsp;<span class="text-num text-bold" title="{{inquiryItem.inquiry.date}}"-->
-									  <!--ng-bind="::inquiryItem.inquiry.date | date:'yyyy-MM-dd'"></span>-->
-					<!--<span-->
-							<!--ng-bind="::inquiryItem.inquiry.enterprise.enName"></span>-->
-					<!--<span>流水号:<a title="查看详情"-->
-						<!--class="text-num order-detail" ng-bind="::inquiryItem.inquiry.code" ui-sref="sale.pubinquiry_detail({id:inquiryItem.inquiry.id})" target="_self"-->
-						<!--ng-click="setOrdersRead(inquiryItem.id)"></a>-->
-					<!--</span>-->
-				<!--</div>-->
-			<!--</td>-->
-			<!--<td>-->
-				<!--币别:<span ng-bind="::(isUser?'-':inquiryItem.currency)"></span>-->
-			<!--</td>-->
-			<!--<td>-->
-				<!--税率:<input  type="text" ng-pattern="/^\+?[1-9]\d*$/" ng-model="inquiryItem.taxrate" style="width: 25px" ng-readonly="!inquiryItem.$editing">%-->
-			<!--</td>-->
-			<!--<td class="text-right" colspan="1" class="order-sum">-->
-				<!--<div ng-if="inquiryItem.replyable">-->
-					<!--<span class="text-inverse text-bold" ng-bind="::inquiryItem.inquiry.endDate | timespan"></span>-->
-					<!--<span class="text-muted">后截止报价</span>-->
-				<!--</div>-->
-			<!--</td>-->
-			<!--<td class="text-center">-->
-				<!--<div class="">-->
-					<!--类型: <span ng-bind="::inquiryItem.inquiry.inquirytype || '无'"></span>-->
-				<!--</div>-->
-			<!--</td>-->
-		<!--</tr>-->
-		<!--<tr class="order-bd">-->
-			<!--<td class="product">-->
-				<!--<div class="text-num text-bold" ng-bind="::inquiryItem.product.code"></div>-->
-				<!--<div ng-bind="::inquiryItem.product.title"></div>-->
-				<!--<div class="text-muted" ng-bind="::inquiryItem.product.spec"></div>-->
-				<!--<div ng-if="::inquiryItem.brand && !inquiryItem.$editing" class="text-muted">-->
-					<!--品牌:<span ng-bind="::inquiryItem.brand"></span>-->
-				<!--</div>-->
-				<!--<div ng-if="::inquiryItem.vendorprodcode && !inquiryItem.$editing" class="text-muted">-->
-					<!--供应商物料编号:<span ng-bind="::inquiryItem.vendorprodcode"></span>-->
-				<!--</div>-->
-				<!--<div ng-if="::inquiryItem.needquantity" class="text-num text-bold">-->
-					<!--需求数量:<span ng-bind="::inquiryItem.needquantity"></span>-->
-				<!--</div>-->
-				<!--<div ng-show="inquiryItem.remark">-->
-					<!--备注:{{::inquiryItem.remark}}-->
-				<!--</div>-->
-				<!--<div ng-if="inquiryItem.inquiry.attachs.length" class="text-muted">-->
-					<!--<i class="fa fa-paperclip fa-fw" style="color: #ffa340; font-size: 18px;"></i>附件:<a class="file" ng-repeat="attach in inquiryItem.inquiry.attachs" href="file/{{attach.id}}">{{::attach.name}}</a>-->
-				<!--</div>-->
-				<!--<div ng-if="inquiryItem.attaches.length" class="text-muted">-->
-					<!--<i class="fa fa-paperclip fa-fw" style="color: #ffa340; font-size: 18px;"></i>报价附件:-->
-					<!--<div ng-repeat="attach in inquiryItem.attaches">-->
-						<!--<a class="file" href="file/{{attach.id}}">{{::attach.name}}&nbsp;</a>-->
-						<!--<a ng-show="inquiryItem.$editing" ng-click="deleteAttach(inquiryItem.attaches, $index)" title="删除附件"><i class="fa fa-trash-o fa-lg"></i></a>-->
-					<!--</div>-->
-				<!--</div>-->
-				<!--<div class="form-group" ng-if="inquiryItem.$editing" style="width: 180px;">-->
-					<!--<input type="text" class="form-control input-xs"-->
-						   <!--ng-model="inquiryItem.brand" placeholder="物料品牌">-->
-				<!--</div>-->
-				<!--<div class="form-group" ng-if="inquiryItem.$editing" style="width: 180px;">-->
-					<!--<input type="text" class="form-control input-xs"-->
-						   <!--ng-model="inquiryItem.vendorprodcode" placeholder="供应商物料编号">-->
-				<!--</div>-->
-				<!--<div class="form-group" ng-if="inquiryItem.$editing" style="width: 220px;">-->
-					<!--<input type="text" class="form-control input-xs" ng-change="verify(inquiryItem.leadtime,'leadtime')" ng-pattern="/^\+?[1-9]\d*$/"-->
-						   <!--ng-model="inquiryItem.leadtime" placeholder="交货周期(确切天数)" style="display: inline-block;width: 180px;">-->
-					<!--<span ng-if="!inquiryItem.leadtime" class="text-inverse"> 必填*</span>-->
-					<!--<div style="margin-left: 50px;"class="text-bold text-inverse" ng-show="!leadtimeVerify">请填数字!</div>-->
-				<!--</div>-->
-				<!--<div class="input-group form-group" ng-if="inquiryItem.$editing" style="width: 300px;">-->
-					<!--<div class="input-group-addon">上传附件:</div>-->
-					<!--<input type="file" ng-model="inquiryItem.myFiles" ng-file-select-->
-						   <!--ng-multiple="false" class="form-control input-sm input-group" name="file">-->
-				<!--</div>-->
-			<!--</td>-->
-			<!--<td class="text-center">-->
-				<!--<span ng-bind="::inquiryItem.product.unit"></span>-->
-			<!--</td>-->
-			<!--<td class="text-center">-->
-				<!--<div ng-show="!inquiryItem.$editing">-->
-					<!--<div ng-repeat="reply in inquiryItem.replies">-->
-						<!--<span ng-bind="reply.lapQty"></span>-->
-					<!--</div>-->
-				<!--</div>-->
-				<!--<div style="margin: 0 auto;" ng-if="inquiryItem.$editing">-->
-					<!--<div ng-repeat="reply in inquiryItem.replies">-->
-						<!--<div class="form-group input-group input-group-xs">-->
-							<!--<input type="text" class="form-control input-xs" ng-class="{'input-error': !replylapQtys[$index]}"  ng-change="verifylapQty(reply.lapQty,$index, inquiryItem)"-->
-								   <!--ng-model="reply.lapQty" min="{{$index == 0 ? 0 :(inquiryItem.replies[$index - 1].lapQty + 1)}}" ng-pattern="/^\+?[1-9]\d*$/"-->
-								   <!--ng-Readonly="$index == 0"  placeholder="数量" />-->
-								   <!--<span class="input-group-btn" ng-show="$index != 0">-->
-									<!--<button class="btn btn-default" type="button"-->
-											<!--ng-click="removeStep(inquiryItem, $index)">-->
-										<!--<i class="fa fa-trash-o"></i>-->
-									<!--</button>-->
-								<!--</span>-->
-						<!--</div>-->
-						<!--<div class="text-bold text-inverse" style="margin-top:-15px" ng-show="!replylapQtys[$index]">分段数量递增!</div>-->
-					<!--</div>-->
-					<!--<a ng-click="addStep(inquiryItem)" class="btn btn-default btn-xs"-->
-					   <!--ng-show="!inquiryItem.custLap">添加分段</a>-->
-				<!--</div>-->
-			<!--</td>-->
-			<!--<td class="text-center br-l">-->
-				<!--<div ng-show="!inquiryItem.$editing">-->
-					<!--<div ng-repeat="reply in inquiryItem.replies">-->
-						<!--<span ng-bind="isUser?'':(reply.price | number:6)"></span> <span-->
-							<!--ng-show="reply.price == null || isUser" class="text-muted">-</span>-->
-					<!--</div>-->
-
-				<!--</div>-->
-				<!--<div style="margin: 0 auto;" ng-if="inquiryItem.$editing">-->
-					<!--<div ng-repeat="reply in inquiryItem.replies">-->
-						<!--<div class="form-group">-->
-							<!--<input type="text" class="form-control input-xs " ng-class="{'input-error': !replyPrices[$index]}" ng-model="reply.price"-->
-								   <!--ng-change="verify(reply.price,$index)" placeholder="单价(必填)" ng-init="reply.price = isUser?'-':reply.price"/>-->
-							<!--<div class="text-bold text-inverse" style="margin-bottom:-15px" ng-show="!replyPrices[$index]">请填数字!</div>-->
-						<!--</div>-->
-					<!--</div>-->
-				<!--</div>-->
-			<!--</td>-->
-			<!--<td class="text-center br-l">-->
-				<!--<div ng-show="!inquiryItem.$editing">-->
-					<!--<span ng-bind="inquiryItem.minOrderQty"></span> <span-->
-						<!--ng-show="inquiryItem.minOrderQty == null" class="text-muted">-</span>-->
-				<!--</div>-->
-				<!--<div ng-if="inquiryItem.$editing">-->
-					<!--<input type="text" class="form-control input-xs" ng-change="verify(inquiryItem.minOrderQty,'minOrderQty')"-->
-						   <!--ng-class="{'input-error': !minOrderQtyVerify}" ng-model="inquiryItem.minOrderQty" placeholder="最小订购" >-->
-					<!--<div class="text-bold text-inverse" ng-show="!minOrderQtyVerify">请填数字!</div>-->
-				<!--</div>-->
-			<!--</td>-->
-			<!--<td class="text-center br-l">-->
-				<!--<div ng-show="!inquiryItem.$editing">-->
-					<!--<span ng-bind="inquiryItem.minPackQty"></span> <span-->
-						<!--ng-show="inquiryItem.minPackQty == null" class="text-muted">-</span>-->
-				<!--</div>-->
-				<!--<div ng-if="inquiryItem.$editing">-->
-					<!--<input type="text" class="form-control input-xs"-->
-						   <!--ng-model="inquiryItem.minPackQty" placeholder="最小包装"-->
-						   <!--ng-change="verify(inquiryItem.minPackQty,'minPackQty')" ng-class="{'input-error': !minPackQtyVerify}" >-->
-					<!--<div class="text-bold text-inverse" ng-show="!minPackQtyVerify">请填数字!</div>-->
-				<!--</div>-->
-			<!--</td>-->
-			<!--<td class="text-center br-l">-->
-				<!--<div ng-init="parseDate(inquiryItem)">-->
-					<!--<div ng-show="inquiryItem.toDate">-->
-						<!--<span class="text-muted">从 </span><span-->
-							<!--ng-bind="inquiryItem.fromDate | date:'yyyy-MM-dd'"></span> <span-->
-							<!--class="text-muted">到 </span><span-->
-							<!--ng-bind="inquiryItem.toDate | date:'yyyy-MM-dd'"></span>-->
-					<!--</div>-->
-					<!--<div ng-show="!inquiryItem.toDate">-->
-						<!--<span class="text-muted">-</span>-->
-					<!--</div>-->
-				<!--</div>-->
-			<!--</td>-->
-			<!--<td class="text-center br-l">-->
-				<!--<div ng-if="inquiryItem.status == 201 && inquiryItem.agreed == null && inquiryItem.invalid != 1" class="block">-->
-					<!--<span class="text-trans warning">已报价</span>-->
-					<!--<div ng-if="inquiryItem.inquiry.overdue == 0 && inquiryItem.inquiry.check != 1" style="padding-top: 50px;">-->
-						<!--<div ng-show="!inquiryItem.$editing && inquiryItem.replyable">-->
-							<!--<a ng-click="inquiryItem.$editing=!inquiryItem.$editing;  getToken();">修改报价</a>-->
-						<!--</div>-->
-						<!--<div ng-show="inquiryItem.$editing">-->
-							<!--<div>-->
-								<!--<a ng-click="inquiryItem.$editing=!inquiryItem.$editing; cancel()">取消</a>-->
-							<!--</div>-->
-							<!--<div>-->
-								<!--<button ng-click="onReplyClick(inquiryItem, true);setOrdersRead(inquiryItem.id)"-->
-										<!--ng-disabled="!isValid(inquiryItem, true)"-->
-										<!--class="btn btn-link btn-xs text-inverse">-->
-									<!--保存并<br>确认报价-->
-								<!--</button>-->
-							<!--</div>-->
-						<!--</div>-->
-					<!--</div>-->
-					<!--<div ng-if="inquiryItem.inquiry.check == 1" class="text-muted" style="padding-top: 50px;">客户正在<br>审批...</div>-->
-				<!--</div>-->
-				<!--<div ng-if="inquiryItem.status == 201 && inquiryItem.agreed == 1 && inquiryItem.invalid != 1" class="block">-->
-					<!--<span class="text-trans success">已采纳</span>-->
-				<!--</div>-->
-				<!--<div ng-if="inquiryItem.status == 201 && inquiryItem.invalid == 1" class="block">-->
-					<!--<span class="text-trans text-light">已失效</span>-->
-				<!--</div>-->
-				<!--<div ng-if="inquiryItem.status == 314" class="block">-->
-					<!--<span class="text-trans text-light">已作废</span>-->
-				<!--</div>-->
-				<!--<div ng-if="inquiryItem.status == 201 && inquiryItem.agreed == 0" class="block">-->
-					<!--<span class="text-trans error">未采纳</span>-->
-				<!--</div>-->
-				<!--<div ng-if="inquiryItem.status == 200">-->
-					<!--<div ng-if="inquiryItem.inquiry.overdue == 0 && inquiryItem.inquiry.check != 1">-->
-						<!--<div ng-show="!inquiryItem.$editing">-->
-							<!--<a ng-click="inquiryItem.$editing=!inquiryItem.$editing; getToken()">报 价</a>-->
-						<!--</div>-->
-						<!--<div ng-show="inquiryItem.$editing">-->
-							<!--<div>-->
-								<!--<a ng-click="inquiryItem.$editing=!inquiryItem.$editing; cancel()">取消</a>-->
-							<!--</div>-->
-							<!--<div>-->
-								<!--<button ng-click="onReplyClick(inquiryItem);setOrdersRead(inquiryItem.id)"-->
-										<!--ng-disabled="!isValid(inquiryItem)"-->
-										<!--class="btn btn-link btn-xs text-default">保存</button>-->
-							<!--</div>-->
-							<!--<div>-->
-								<!--<button ng-click="onReplyClick(inquiryItem, true);setOrdersRead(inquiryItem.id)"-->
-										<!--ng-disabled="!isValid(inquiryItem, true)"-->
-										<!--class="btn btn-link btn-xs text-inverse">-->
-									<!--保存并<br>确认报价-->
-								<!--</button>-->
-							<!--</div>-->
-						<!--</div>-->
-					<!--</div>-->
-					<!--<div ng-if="inquiryItem.inquiry.overdue == 0 && inquiryItem.inquiry.check == 1">-->
-						<!--<span class="text-trans half">未报价</span>-->
-						<!--<div class="text-muted" style="padding-top: 50px;">询价单已<br>被提交...</div>-->
-					<!--</div>-->
-					<!--<div ng-if="inquiryItem.inquiry.overdue == 1" class="block">-->
-						<!--<span class="text-trans error">已过期</span>-->
-					<!--</div>-->
-				<!--</div>-->
-			<!--</td>-->
-		<!--</tr>-->
-		<!--</tbody>-->
-	<!--</table>-->
 </div>