Browse Source

主动报价功能更新: epr反提交传到平台更新状态;erp采纳结果传到平台更新平台结果并分类展示

hejq 8 years ago
parent
commit
48507d7159

+ 29 - 18
src/main/java/com/uas/platform/b2b/erp/controller/InquiryDownController.java

@@ -1,16 +1,5 @@
 package com.uas.platform.b2b.erp.controller;
 
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.util.List;
-
-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 com.uas.platform.b2b.erp.model.Inquiry;
 import com.uas.platform.b2b.erp.model.InquiryDecide;
 import com.uas.platform.b2b.erp.service.InquiryService;
@@ -19,13 +8,23 @@ import com.uas.platform.b2b.service.SaleQuotationService;
 import com.uas.platform.core.logging.BufferedLoggerManager;
 import com.uas.platform.core.util.ArrayUtils;
 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;
 
 /**
  * 对买家ERP的数据接口<br>
  * 买家接收供应商的主动报价
- * 
+ *
  * @author yingp
- * 
+ *
  */
 @Controller
 @RequestMapping("/erp/purchase/quotation")
@@ -41,7 +40,7 @@ public class InquiryDownController {
 
 	/**
 	 * 买家ERP从平台获取主动报价
-	 * 
+	 *
 	 * @return
 	 */
 	@RequestMapping(method = RequestMethod.GET)
@@ -54,7 +53,7 @@ public class InquiryDownController {
 
 	/**
 	 * 平台的主动报价传到买家ERP之后,修改平台里面的主动报价的上传状态
-	 * 
+	 *
 	 * @return
 	 * @throws UnsupportedEncodingException
 	 */
@@ -82,7 +81,7 @@ public class InquiryDownController {
 
 	/**
 	 * 买家ERP(不)采纳了价格之后,修改平台里面的主动报价的状态
-	 * 
+	 *
 	 * @param data
 	 * @throws UnsupportedEncodingException
 	 */
@@ -97,14 +96,26 @@ public class InquiryDownController {
 
 	/**
 	 * 买家在收到报价信息后,点击提交按钮后,状态传至平台
-	 * 
+	 *
 	 * @param data
 	 * @throws UnsupportedEncodingException
 	 */
 	@RequestMapping(value = "/checking", method = RequestMethod.POST)
 	@ResponseBody
 	public void checkInquiry(@RequestParam("data") String data) throws UnsupportedEncodingException {
+		saleQuotationService.check(ArrayUtils.convertStringToNumberArray(URLDecoder.decode(data, "UTF-8"), Long.class));
+	}
+
+	/**
+	 * 买家在收到报价信息后,点击提交按钮后,状态传至平台
+	 *
+	 * @param data
+	 * @throws UnsupportedEncodingException
+	 */
+	@RequestMapping(value = "/rechecking", method = RequestMethod.POST)
+	@ResponseBody
+	public void reCheckInquiry(@RequestParam("data") String data) throws UnsupportedEncodingException {
 		saleQuotationService
-				.check(ArrayUtils.convertStringToNumberArray(URLDecoder.decode(data, "UTF-8"), Long.class));
+				.recheck(ArrayUtils.convertStringToNumberArray(URLDecoder.decode(data, "UTF-8"), Long.class));
 	}
 }

+ 4 - 4
src/main/java/com/uas/platform/b2b/model/SaleQuotationDone.java

@@ -24,17 +24,17 @@ import org.hibernate.annotations.Where;
  * 平台里面,供应商发起的主动报价单<br>
  * (以供应商的视角)
  *  存在根据截止日期判断是否过期,所以采用视图
- * 
+ *
  * @author yingp
- * 
+ *
  */
 @Table(name = "v$sale$quotation")
-@Where(clause = "(qu_status = 101 or qu_status = 311) and qu_agreed is null")
+@Where(clause = "(qu_status = 101 or qu_status = 311) and qu_agreed is null and qu_overdue = 0")
 @Entity
 public class SaleQuotationDone implements Serializable {
 
 	/**
-	 * 
+	 *
 	 */
 	private static final long serialVersionUID = 1L;
 

+ 25 - 22
src/main/java/com/uas/platform/b2b/service/SaleQuotationService.java

@@ -1,33 +1,29 @@
 package com.uas.platform.b2b.service;
 
-import java.util.List;
-
 import com.uas.platform.b2b.erp.model.Inquiry;
-import com.uas.platform.b2b.model.SaleQuotation;
-import com.uas.platform.b2b.model.SaleQuotationAll;
-import com.uas.platform.b2b.model.SaleQuotationDone;
-import com.uas.platform.b2b.model.SaleQuotationItem;
-import com.uas.platform.b2b.model.SearchFilter;
+import com.uas.platform.b2b.model.*;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.search.b2b.model.SPage;
 
+import java.util.List;
+
 public interface SaleQuotationService {
 
 	/**
 	 * 批量保存主动报价
-	 * 
+	 *
 	 * @param items
 	 *            主动报价明细
 	 * @return
 	 */
 	public void save(List<SaleQuotationItem> items);
-	
+
 	/**
 	 * 保存主动报价 - 用于在平台上录入
 	 * @param item
 	 */
 	public SaleQuotationItem save(SaleQuotationItem item);
-	
+
 	/**
 	 * 获取明细
 	 * @param id
@@ -37,49 +33,49 @@ public interface SaleQuotationService {
 
 	/**
 	 * 未传到买家ERP的主动报价
-	 * 
+	 *
 	 * @return
 	 */
 	public List<SaleQuotation> findNotUploadQuotation();
 
 	/**
 	 * 未回传到卖家ERP的主动报价
-	 * 
+	 *
 	 * @return
 	 */
 	public List<SaleQuotation> findNotBackQuotation();
 
 	/**
 	 * 主动报价成功传到买家之后
-	 * 
+	 *
 	 * @param idArray
 	 */
 	public void onQuotationUploadSuccess(String[] idArray);
 
 	/**
 	 * 主动报价成功回传到卖家之后
-	 * 
+	 *
 	 * @param idArray
 	 */
 	public void onQuotationBackSuccess(String[] idArray);
 
 	/**
 	 * 主动报价信息(不)采纳之后,写到平台
-	 * 
+	 *
 	 * @param quotationItems
 	 */
 	public void onReplyDecide(List<SaleQuotationItem> quotationItems);
 
 	/**
 	 * 查找所有待上传到卖家ERP的主动报价的采纳结果
-	 * 
+	 *
 	 * @return
 	 */
 	List<SaleQuotationItem> findNotUploadQuotationDecide();
 
 	/**
 	 * 平台的主动报价的采纳结果传到供应商ERP之后,修改平台里面的采纳结果上传状态
-	 * 
+	 *
 	 * @param idArray
 	 */
 	public void onQuotationDecideDownSuccess(String[] idArray);
@@ -94,19 +90,19 @@ public interface SaleQuotationService {
 
 	/**
 	 * 查询待回复的询价单
-	 * 
+	 *
 	 * @return
 	 */
 	public Long getInquiryTodo();
 
 	/**
 	 * 删除
-	 * 
+	 *
 	 * @param id
 	 */
 	public void deleteById(Long id);
 
-    void onReplyInvalid(List<Inquiry> inquiries);
+	void onReplyInvalid(List<Inquiry> inquiries);
 
 	List<SaleQuotation> findNotUploadQuotationReplyInvalid();
 
@@ -116,17 +112,24 @@ public interface SaleQuotationService {
 
 	/**
 	 * erp主动报价单提交后更新平台状态,给用户提示
-	 * 
+	 *
 	 * @param ids
 	 */
 	public void check(Long[] ids);
 
 	/**
 	 * 重新处理已提交的单据,将待审批的归纳到已提交里面
-	 * 
+	 *
 	 * @param pageInfo
 	 * @param filter
 	 * @return
 	 */
 	public SPage<SaleQuotationDone> findDoneByPageInfo(PageInfo pageInfo, SearchFilter filter);
+
+	/**
+	 * erp主动报价反提交单据状态更新到平台,给用户提示
+	 *
+	 * @param ids
+	 */
+	public void recheck(Long[] ids);
 }

+ 39 - 37
src/main/java/com/uas/platform/b2b/service/impl/SaleQuotationServiceImpl.java

@@ -1,36 +1,12 @@
 package com.uas.platform.b2b.service.impl;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.data.jpa.domain.Specification;
-import org.springframework.stereotype.Service;
-import org.springframework.util.CollectionUtils;
-
 import com.uas.platform.b2b.core.util.ContextUtils;
-import com.uas.platform.b2b.dao.CommonDao;
-import com.uas.platform.b2b.dao.PagingReleaseCountDao;
-import com.uas.platform.b2b.dao.SaleQuotationAllDao;
-import com.uas.platform.b2b.dao.SaleQuotationDao;
-import com.uas.platform.b2b.dao.SaleQuotationDoneDao;
-import com.uas.platform.b2b.dao.SaleQuotationItemDao;
+import com.uas.platform.b2b.dao.*;
 import com.uas.platform.b2b.erp.model.Inquiry;
 import com.uas.platform.b2b.event.SaleQuotationDecideReleaseEvent;
 import com.uas.platform.b2b.event.SaleQuotationInvalidReleaseEvent;
 import com.uas.platform.b2b.event.SaleQuotationSaveEvent;
-import com.uas.platform.b2b.model.SaleQuotation;
-import com.uas.platform.b2b.model.SaleQuotationAll;
-import com.uas.platform.b2b.model.SaleQuotationDone;
-import com.uas.platform.b2b.model.SaleQuotationItem;
-import com.uas.platform.b2b.model.SearchFilter;
+import com.uas.platform.b2b.model.*;
 import com.uas.platform.b2b.service.SaleQuotationService;
 import com.uas.platform.b2b.support.SystemSession;
 import com.uas.platform.core.exception.NotFoundException;
@@ -38,6 +14,19 @@ import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.Status;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
 import com.uas.search.b2b.model.SPage;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
 
 @Service
 public class SaleQuotationServiceImpl implements SaleQuotationService {
@@ -47,7 +36,7 @@ public class SaleQuotationServiceImpl implements SaleQuotationService {
 
 	@Autowired
 	private SaleQuotationDao saleQuotationDao;
-	
+
 	@Autowired
 	private SaleQuotationAllDao saleQuotationAllDao;
 	@Autowired
@@ -87,6 +76,7 @@ public class SaleQuotationServiceImpl implements SaleQuotationService {
 	@Override
 	public void onReplyDecide(List<SaleQuotationItem> quotationItems) {
 		saleQuotationItemDao.save(quotationItems);
+		saleQuotationDao.save(quotationItems.get(0).getQuotation());
 		ContextUtils.publishEvent(new SaleQuotationDecideReleaseEvent(quotationItems));
 	}
 
@@ -123,7 +113,7 @@ public class SaleQuotationServiceImpl implements SaleQuotationService {
 		saveEvent(list);// 保存触发相应的动作(关键词库、推送)
 		return newItem;
 	}
-	
+
 	/**
 	 * 保存主动报价触发的事件(关键词库、推送)
 	 * @param items
@@ -146,7 +136,7 @@ public class SaleQuotationServiceImpl implements SaleQuotationService {
 
 	@Override
 	public SPage<SaleQuotationAll> findAllDetailByPageInfo(final PageInfo pageInfo,
-			final String keyword, final SearchFilter filter) {
+														   final String keyword, final SearchFilter filter) {
 		SPage<SaleQuotationAll> quos = new SPage<SaleQuotationAll>();
 		if (filter != null) {
 			if (!CollectionUtils.isEmpty(filter.getDistribute()))
@@ -171,8 +161,8 @@ public class SaleQuotationServiceImpl implements SaleQuotationService {
 
 	@Override
 	public List<SaleQuotation> findNotBackQuotation() {
-		return saleQuotationDao.findByEnUUAndStatusAndBackStatus(SystemSession.getUser().getEnterprise().getUu(), 
-					(short) Status.SUBMITTED.value(), (short) Status.NOT_UPLOAD.value());
+		return saleQuotationDao.findByEnUUAndStatusAndBackStatus(SystemSession.getUser().getEnterprise().getUu(),
+				(short) Status.SUBMITTED.value(), (short) Status.NOT_UPLOAD.value());
 	}
 
 	@Override
@@ -205,11 +195,11 @@ public class SaleQuotationServiceImpl implements SaleQuotationService {
 		}
 	}
 
-    @Override
-    public void onReplyInvalid(List<Inquiry> inquiries) {
+	@Override
+	public void onReplyInvalid(List<Inquiry> inquiries) {
 		List<SaleQuotation> saveQuotations = new ArrayList<>();
-        for (Inquiry inquiry : inquiries) {
-        	if (inquiry.getB2b_qu_id() != null) {
+		for (Inquiry inquiry : inquiries) {
+			if (inquiry.getB2b_qu_id() != null) {
 				SaleQuotation quotation = saleQuotationDao.findOne(inquiry.getB2b_qu_id());
 				quotation.setStatus((short)Status.DISABLED.value());
 				quotation.setInvalidSendStatus((short) Status.NOT_UPLOAD.value()); // 获取作废信息时,更新SAAS作废上传状态为待上传
@@ -218,7 +208,7 @@ public class SaleQuotationServiceImpl implements SaleQuotationService {
 		}
 		ContextUtils.publishEvent(new SaleQuotationInvalidReleaseEvent(saveQuotations));
 		saleQuotationDao.save(saveQuotations);
-    }
+	}
 
 	@Override
 	public List<SaleQuotation> findNotUploadQuotationReplyInvalid() {
@@ -255,6 +245,17 @@ public class SaleQuotationServiceImpl implements SaleQuotationService {
 		}
 	}
 
+	@Override
+	public void recheck(Long[] ids) {
+		for (Long id : ids) {
+			SaleQuotation quotation = saleQuotationDao.findOne(id);
+			if (quotation != null) {
+				quotation.setStatus((short) Status.INPUTTING.value());
+				saleQuotationDao.save(quotation);
+			}
+		}
+	}
+
 	@Override
 	public SPage<SaleQuotationDone> findDoneByPageInfo(final PageInfo pageInfo, SearchFilter filter) {
 		SPage<SaleQuotationDone> quos = new SPage<SaleQuotationDone>();
@@ -268,7 +269,7 @@ public class SaleQuotationServiceImpl implements SaleQuotationService {
 		}
 		Page<SaleQuotationDone> quotations = saleQuotationDoneDao.findAll(new Specification<SaleQuotationDone>() {
 			public Predicate toPredicate(Root<SaleQuotationDone> root, CriteriaQuery<?> query,
-					CriteriaBuilder builder) {
+										 CriteriaBuilder builder) {
 				return query.where(pageInfo.getPredicates(root, query, builder)).getRestriction();
 			}
 		}, pageInfo);
@@ -279,4 +280,5 @@ public class SaleQuotationServiceImpl implements SaleQuotationService {
 		quos.setTotalPage(quotations.getTotalPages());
 		return quos;
 	}
+
 }

+ 31 - 31
src/main/webapp/resources/tpl/index/sale/quotation_list.html

@@ -1,25 +1,25 @@
 <style>
-.list {
-	border-top: solid 1px #e8e8e8;
-}
+	.list {
+		border-top: solid 1px #e8e8e8;
+	}
 
-.order-table{
-	background: #fff;
-}
+	.order-table{
+		background: #fff;
+	}
 
-.inquiry-cz{
-	font-size: 14px;
-	padding: 0;
-	margin-left: 55px;
-}
-.inquiry-cz a{
-	color: #5078cb;
-	float: left;
-	margin-left: 62px;
-}
-.inquiry-cz a img{
-	margin-right: 3px;
-}
+	.inquiry-cz{
+		font-size: 14px;
+		padding: 0;
+		margin-left: 55px;
+	}
+	.inquiry-cz a{
+		color: #5078cb;
+		float: left;
+		margin-left: 62px;
+	}
+	.inquiry-cz a img{
+		margin-right: 3px;
+	}
 </style>
 <link rel="stylesheet" href="static/css/public.css">
 <div id="public">
@@ -32,27 +32,27 @@
 				<div class="btn-group btn-group-sm btn-group-justified">
 					<div class="btn-group btn-group-sm">
 						<button type="button" class="btn btn-default btn-line"
-							ng-class="{'btn-info':active=='all'}" ng-click="setActive('all')">全部</button>
+								ng-class="{'btn-info':active=='all'}" ng-click="setActive('all')">全部</button>
 					</div>
 					<div class="btn-group btn-group-sm">
 						<button type="button" class="btn btn-default btn-line"
-							ng-class="{'btn-info':active=='done'}"
-							ng-click="setActive('done')">已报价</button>
+								ng-class="{'btn-info':active=='done'}"
+								ng-click="setActive('done')">已报价</button>
 					</div>
 					<div class="btn-group btn-group-sm">
 						<button type="button" class="btn btn-default btn-line"
-							ng-class="{'btn-info':active=='agreed'}"
-							ng-click="setActive('agreed')">已采纳</button>
+								ng-class="{'btn-info':active=='agreed'}"
+								ng-click="setActive('agreed')">已采纳</button>
 					</div>
 					<div class="btn-group btn-group-sm">
 						<button type="button" class="btn btn-default btn-line"
-							ng-class="{'btn-info':active=='refused'}"
-							ng-click="setActive('refused')">未采纳</button>
+								ng-class="{'btn-info':active=='refused'}"
+								ng-click="setActive('refused')">未采纳</button>
 					</div>
 					<div class="btn-group btn-group-sm">
 						<button type="button" class="btn btn-default btn-line"
-							ng-class="{'btn-info':active=='todo'}"
-							ng-click="setActive('todo')">未提交</button>
+								ng-class="{'btn-info':active=='todo'}"
+								ng-click="setActive('todo')">未提交</button>
 					</div>
 					<div class="btn-group btn-group-sm">
 						<button type="button" class="btn btn-default btn-line"
@@ -66,7 +66,7 @@
 			</div>-->
 		</div>
 	</div>
-<!--<div class="height10">&nbsp;</div>-->
+	<!--<div class="height10">&nbsp;</div>-->
 	<div class="condition block">
 		<div class="search-bg condition block" style="padding: 10px 15px;">
 			<div class="row">
@@ -285,10 +285,10 @@
 					<span class="text-trans text-light">已作废</span>
 				</div>
 				<div ng-if=" quotationItem.quotationItems[0].agreed == 1 && quotationItem.overdue != 1" class="block">
-					<span class="text-trans success">报价已采纳</span>
+					<span class="text-trans success">已采纳</span>
 				</div>
 				<div ng-if="quotationItem.quotationItems[0].agreed == 0 && quotationItem.overdue != 1" class="block">
-					<span class="text-trans error">报价未采纳</span>
+					<span class="text-trans error">未采纳</span>
 				</div>
 				<div ng-if="quotationItem.status == 100">
 					<a ui-sref="sale.quotation.item({id:quotationItem.id})">详情>></a>

+ 129 - 129
src/main/webapp/resources/tpl/index/sale/quotation_new.html

@@ -1,117 +1,117 @@
 <style>
-.new {
-	padding: 0px 40px 20px 20px;
-	margin-top: 20px;
-}
+	.new {
+		padding: 0px 40px 20px 20px;
+		margin-top: 20px;
+	}
 
-.new label {
-	font-size: 14px;
-	font-weight: normal;
-	font-family: "Microsoft YaHei" ! important;
-}
+	.new label {
+		font-size: 14px;
+		font-weight: normal;
+		font-family: "Microsoft YaHei" ! important;
+	}
 
-.headerline {
-	font-size: 16px;
-  	font-family: Microsoft YaHei,SimHei,Verdana;
-  	font-weight: 500;
-  	line-height: 22px;
-  	margin: 25px 0;
-  	clear: both;
-  	zoom: 1;
-  	border-top: 1px solid #eee;
-  	position: relative;
-}
+	.headerline {
+		font-size: 16px;
+		font-family: Microsoft YaHei,SimHei,Verdana;
+		font-weight: 500;
+		line-height: 22px;
+		margin: 25px 0;
+		clear: both;
+		zoom: 1;
+		border-top: 1px solid #eee;
+		position: relative;
+	}
 
-.headerline .content {
-	position: absolute;
-	top: -12px;
-	left: 20px;
-	line-height: 24px;
-  	padding: 0 15px 0 10px;
-  	background: #fff;
-  	z-index: 2;
-}
+	.headerline .content {
+		position: absolute;
+		top: -12px;
+		left: 20px;
+		line-height: 24px;
+		padding: 0 15px 0 10px;
+		background: #fff;
+		z-index: 2;
+	}
 
-.headerline .end {
-	position: absolute;
-	top: -12px;
-	right: 20px;
-	line-height: 24px;
-  	padding-left: 15px;
-  	background: #fff;
-  	z-index: 2;
-}
+	.headerline .end {
+		position: absolute;
+		top: -12px;
+		right: 20px;
+		line-height: 24px;
+		padding-left: 15px;
+		background: #fff;
+		z-index: 2;
+	}
 
-.input-group-addon {
-	background-color: inherit;
-  	border: 1px solid #e1e1e1;
-  	color: #888 !important;
-}
+	.input-group-addon {
+		background-color: inherit;
+		border: 1px solid #e1e1e1;
+		color: #888 !important;
+	}
 
-.status {
-	position: absolute;
-	top: -10px;
-	right: 5px;
-	background-color: #fff;
-	border: 1px solid;
-	padding: 3px 14px;
-	font-size: 16px;
-	font-family: "LiShu";
-	border-radius: 10px;
-	-moz-transform: rotate(-10deg);
-	-webkit-transform: rotate(-10deg);
-	-o-transform: rotate(-10deg);
-	transform: rotate(-10deg);
-	border-radius: 10px;
-	opacity: 0.7;
-	white-space: nowrap;
-}
-.num-ctrl{
-	width: 60px;
-	padding: 0 !important;
-	line-height: 34px;
-}
-.title-div {
-	font-size: 14px;
-	font-weight: 600;
-	padding-left: 20px;
-	height: 50px;
-	padding-top: 11px;
-}
-.form-horizontal .control-label{
-	text-align: left;
-	padding-left: 25px;
-}
-.form-horizontal .form-control{
-	border: #bfbfbf 1px solid !important;
-	height: 34px;
-	background: #fff;
-	font-size: 14px;
-}
-.form-horizontal .input-group-btn button{
-	height: 34px;
-	border: #bfbfbf 1px solid !important;
-	background: #bfbfbf;
-	font-size: 14px;
-	color: #fff;
-}
-.customer-input{
-	border: #bfbfbf 1px solid !important;
-	height: 34px;
-	background: #fff;
-	font-size: 14px;
-	border-radius: 5px;
-	width: 100%;
-	display: inline-block;
-	color: #323232;
-	line-height: 34px;
-	padding-left: 10px;
-}
-.dot .text-inverse{
-	position: absolute;
-	right: 5px;
-	top: 12px;
-}
+	.status {
+		position: absolute;
+		top: -10px;
+		right: 5px;
+		background-color: #fff;
+		border: 1px solid;
+		padding: 3px 14px;
+		font-size: 16px;
+		font-family: "LiShu";
+		border-radius: 10px;
+		-moz-transform: rotate(-10deg);
+		-webkit-transform: rotate(-10deg);
+		-o-transform: rotate(-10deg);
+		transform: rotate(-10deg);
+		border-radius: 10px;
+		opacity: 0.7;
+		white-space: nowrap;
+	}
+	.num-ctrl{
+		width: 60px;
+		padding: 0 !important;
+		line-height: 34px;
+	}
+	.title-div {
+		font-size: 14px;
+		font-weight: 600;
+		padding-left: 20px;
+		height: 50px;
+		padding-top: 11px;
+	}
+	.form-horizontal .control-label{
+		text-align: left;
+		padding-left: 25px;
+	}
+	.form-horizontal .form-control{
+		border: #bfbfbf 1px solid !important;
+		height: 34px;
+		background: #fff;
+		font-size: 14px;
+	}
+	.form-horizontal .input-group-btn button{
+		height: 34px;
+		border: #bfbfbf 1px solid !important;
+		background: #bfbfbf;
+		font-size: 14px;
+		color: #fff;
+	}
+	.customer-input{
+		border: #bfbfbf 1px solid !important;
+		height: 34px;
+		background: #fff;
+		font-size: 14px;
+		border-radius: 5px;
+		width: 100%;
+		display: inline-block;
+		color: #323232;
+		line-height: 34px;
+		padding-left: 10px;
+	}
+	.dot .text-inverse{
+		position: absolute;
+		right: 5px;
+		top: 12px;
+	}
 </style>
 <div class="loading" ng-class="{'in': loading}">
 	<i></i>
@@ -145,8 +145,8 @@
 			<label for="code" class="col-sm-2 control-label">单据编号:</label>
 			<div class="col-sm-4">
 				<div class="">
-					<input ng-model="item.quotation.code" readonly="readonly" type="text" class="form-control" id="code" 
-						>
+					<input ng-model="item.quotation.code" readonly="readonly" type="text" class="form-control" id="code"
+					>
 				</div>
 			</div>
 		</div>
@@ -154,8 +154,8 @@
 			<label for="customer" class="col-sm-2 control-label">客户:</label>
 			<div class="col-sm-4">
 				<div class="">
-					<input ng-model="item.quotation.cust.enName" readonly="readonly" type="text" class="form-control" id="customer" 
-						placeholder="点击选择客户" style="cursor: pointer;" ng-click="dbfindCust()" ng-required="true" ng-disabled="isDisabled()">
+					<input ng-model="item.quotation.cust.enName" readonly="readonly" type="text" class="form-control" id="customer"
+						   placeholder="点击选择客户" style="cursor: pointer;" ng-click="dbfindCust()" ng-required="true" ng-disabled="isDisabled()">
 					<span class="form-control-feedback text-simple" ng-if="item.$editing"><i class="fa fa-search"></i></span>
 					<span class="text-inverse text-bold">* </span>
 				</div>
@@ -176,9 +176,9 @@
 			<label for="product" class="col-sm-2 control-label">产品编号:</label>
 			<div class="col-sm-4">
 				<div class="">
-					<input ng-model="item.product.code" type="text" class="form-control input-dbfind" id="product" 
-						placeholder="点击选择产品" readonly="readonly" style="cursor: pointer;"
-						ng-click="dbfindCustProd()" ng-required="true" ng-disabled="isDisabled()">
+					<input ng-model="item.product.code" type="text" class="form-control input-dbfind" id="product"
+						   placeholder="点击选择产品" readonly="readonly" style="cursor: pointer;"
+						   ng-click="dbfindCustProd()" ng-required="true" ng-disabled="isDisabled()">
 					<span class="form-control-feedback text-simple"  ng-if="item.$editing"><i class="fa fa-search"></i></span>
 					<span class="text-inverse text-bold">* </span>
 				</div>
@@ -212,7 +212,7 @@
 			<div class="col-sm-4">
 				<input ng-model="item.product.unit" type="text" class="form-control input-dbfind" id="product"
 					   placeholder="" readonly="readonly" style="cursor: pointer;"
-					  ng-required="true">
+					   ng-required="true">
 			</div>
 		</div>
 		<div class="form-group form-group-sm">
@@ -233,7 +233,7 @@
 			<label for="leadtime" class="col-sm-2 control-label">交货周期(天):</label>
 			<div class="col-sm-4">
 				<input ng-model="item.leadtime" type="number" class="form-control" id="leadtime" ng-pattern="/^[0-9]*[1-9][0-9]*$/"
-					placeholder="只可以为正整数" ng-readonly="!item.$editing" ng-required="true" ng-disabled="isDisabled()">
+					   placeholder="只可以为正整数" ng-readonly="!item.$editing" ng-required="true" ng-disabled="isDisabled()">
 				<span class="text-inverse text-bold">* </span>
 			</div>
 			<label class="col-sm-2 control-label">价格有效日期:</label>
@@ -268,16 +268,16 @@
 			</div>
 			<label for="taxrate" class="col-sm-2 control-label">税率:</label>
 			<div class="col-sm-4">
-				<input ng-model="item.quotation.taxrate" type="text" class="form-control" id="taxrate" 
-					placeholder="税率" ng-readonly="!item.$editing" ng-required="true" ng-disabled="isDisabled()">
+				<input ng-model="item.quotation.taxrate" type="text" class="form-control" id="taxrate"
+					   placeholder="税率" ng-readonly="!item.$editing" ng-required="true" ng-disabled="isDisabled()">
 				<span class="text-inverse text-bold">* </span>
 			</div>
 		</div>
 		<div class="form-group form-group-sm">
 			<label for="remark" class="col-sm-2 control-label">备注:</label>
 			<div class="col-sm-10">
-				<textarea ng-model="item.quotation.remark" class="form-control" rows="3" cols="3" id="remark" 
-					placeholder="" ng-readonly="!item.$editing" ng-disabled="isDisabled()">
+				<textarea ng-model="item.quotation.remark" class="form-control" rows="3" cols="3" id="remark"
+						  placeholder="" ng-readonly="!item.$editing" ng-disabled="isDisabled()">
 				</textarea>
 			</div>
 		</div>
@@ -293,9 +293,9 @@
 			<div class="col-sm-3">
 				<div class="input-group">
 					<div class="input-group-addon">≥</div>
-					<input ng-model="price.lapQty" type="number" class="form-control" id="qty{{$index + 1}}" 
-						placeholder="最小数量" ng-readonly="$first || !item.$editing" ng-required="true"
-						ng-disabled="isDisabled()">
+					<input ng-model="price.lapQty" type="number" class="form-control" id="qty{{$index + 1}}"
+						   placeholder="最小数量" ng-readonly="$first || !item.$editing" ng-required="true"
+						   ng-disabled="isDisabled()">
 					<div class="input-group-addon">{{item.product.unit}}</div>
 				</div>
 				<span class="text-inverse text-bold">* </span>
@@ -303,8 +303,8 @@
 			<label for="price{{$index + 1}}" class="num-ctrl col-sm-1 control-label" style="text-align: right;">单价</label>
 			<div class="col-sm-2">
 				<input ng-model="price.price" type="text" class="form-control" id="price{{$index + 1}}" placeholder="单价"
-					ng-pattern="/^[1-9]\d*\.{0,1}\d*|0\.\d*[1-9]\d*$/" ng-readonly="!item.$editing" ng-required="true"
-					ng-disabled="isDisabled()">
+					   ng-pattern="/^[1-9]\d*\.{0,1}\d*|0\.\d*[1-9]\d*$/" ng-readonly="!item.$editing" ng-required="true"
+					   ng-disabled="isDisabled()">
 				<span class="text-inverse text-bold">* </span>
 			</div>
 			<label class="col-sm-3" style="line-height: 30px;" ng-hide = "isDisabled()">
@@ -315,15 +315,15 @@
 		<div class="form-group form-group-sm" style="margin-top: 50px;">
 			<div class="col-sm-2"></div>
 			<!--<div class="col-sm-2" ng-if="!item.$editing && item.quotation.status == 100">-->
-				<!--<button class="public-btn01 btn btn-warning btn-sm" style="width: 100%;" ng-click="update()">修改</button>-->
+			<!--<button class="public-btn01 btn btn-warning btn-sm" style="width: 100%;" ng-click="update()">修改</button>-->
 			<!--</div>-->
 			<!--<div class="col-sm-2" ng-if="item.$editing && item.quotation.status == 100">-->
-				<!--<button class="public-btn01 btn btn-info btn-sm" style="width: 100%;" ng-click="cancel()">取消</button>-->
+			<!--<button class="public-btn01 btn btn-info btn-sm" style="width: 100%;" ng-click="cancel()">取消</button>-->
 			<!--</div>-->
-			<div class="col-sm-2" ng-if="item.$editing && item.quotation.status != 101">
+			<div class="col-sm-2" ng-if="item.$editing && item.quotation.status != 101  && item.agreed == null">
 				<button class="public-btn01 btn btn-success btn-sm" style="width: 100%;" ng-disabled="quotationForm.$invalid" ng-click="save()">保存</button>
 			</div>
-			<div class="col-sm-2" ng-if="item.quotation.status != 101">
+			<div class="col-sm-2" ng-if="item.quotation.status != 101 && item.agreed == null">
 				<button class="public-btn01 btn btn-success btn-sm" style="width: 100%;" ng-disabled="quotationForm.$invalid" ng-click="submit()">提交</button>
 			</div>
 			<div class="col-sm-2" ng-if="item.quotation.status == 100">