Selaa lähdekoodia

平台新增采购单功能更新,界面UI调整

git-svn-id: svn+ssh://10.10.101.21/source/platform/platform-b2b@10181 f3bf4e98-0cf0-11e4-a00c-a99a8b9d557d
hejq 8 vuotta sitten
vanhempi
commit
0ea93276db

+ 15 - 8
src/main/java/com/uas/platform/b2b/controller/CartController.java

@@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RestController;
 
 import com.alibaba.dubbo.common.utils.CollectionUtils;
+import com.alibaba.fastjson.JSONObject;
 import com.uas.platform.b2b.model.PurchaseOrderAll;
 import com.uas.platform.b2b.model.SearchFilter;
 import com.uas.platform.b2b.model.Vendor;
@@ -21,6 +22,7 @@ import com.uas.platform.b2b.service.UserService;
 import com.uas.platform.b2b.support.SystemSession;
 import com.uas.platform.b2b.support.UsageBufferedLogger;
 import com.uas.platform.core.logging.BufferedLoggerManager;
+import com.uas.platform.core.model.Constant;
 import com.uas.platform.core.model.PageParams;
 import com.uas.platform.core.model.Status;
 import com.uas.search.b2b.model.MultiValue;
@@ -72,12 +74,17 @@ public class CartController {
 	 */
 	@RequestMapping(value = "/cartList", method = RequestMethod.GET)
 	@ResponseBody
-	public SPage<PurchaseOrderAll> getPurchaseOrderItems(PageParams params, String keyword) {
-		logger.log("购物车", "查看购物车信息");
-		com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, null);
+	public SPage<PurchaseOrderAll> getCarts(PageParams params, String searchFilter) {
+		logger.log("购物车", "查询购物车信息");
+		JSONObject jsonObject = JSONObject.parseObject(searchFilter);
+		String keyword = jsonObject.getString("keyword");
+		com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, searchFilter);
 		// 当前登录企业作为供应商
+
+		List<Sort> sortList = new ArrayList<>();
+		sortList.add(new Sort("pu_id", false, Type.LONG, new Long(1)));
+		pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
 		pageParams.getFilters().put("pu_enuu", SystemSession.getUser().getEnterprise().getUu());
-		pageParams.getFilters().put("pu_status", Status.UNAUDIT.value());
 		SearchFilter filter = userService.distribute();
 		if (filter != null && filter.getDistribute() == null) {
 			return null;
@@ -87,14 +94,14 @@ public class CartController {
 			for (Object object : filter.getDistribute()) {
 				list.add(object);
 			}
-			pageParams.getFilters().put("pu_enuu", new MultiValue(list, true));
+			pageParams.getFilters().put("pu_venduu", new MultiValue(list, true));
 		}
-		List<Sort> sortList = new ArrayList<>();
-		sortList.add(new Sort("pu_id", false, Type.LONG, new Long(1)));
-		pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
+		pageParams.getFilters().put("pu_end", Constant.NO);
+		pageParams.getFilters().put("pu_status", (short) Status.UNAUDIT.value());
 		return searchService.searchPurchaseOrderIds(keyword, pageParams);
 	}
 
+
 	/**
 	 * 提交生成采购单
 	 * 

+ 1 - 0
src/main/java/com/uas/platform/b2b/service/impl/BaseInfoServiceImpl.java

@@ -546,6 +546,7 @@ public class BaseInfoServiceImpl implements BaseInfoService {
 		order.setVendusertel(neworder.getVendusertel());
 		order.setRate(neworder.getRate());
 		order = purchaseOrderAllDao.save(order);
+		order.setDisplay(Constant.YES);
 		short i = 1;
 		if (!CollectionUtils.isEmpty(neworder.getOrderItems())) {
 			for (OrderItems orderitem : neworder.getOrderItems()) {

+ 5 - 1
src/main/java/com/uas/platform/b2b/service/impl/PurcOrderServiceImpl.java

@@ -30,6 +30,7 @@ import com.uas.platform.b2b.temporary.model.Customers;
 import com.uas.platform.b2b.temporary.model.NewPurcOrder;
 import com.uas.platform.b2b.temporary.model.OrderItems;
 import com.uas.platform.b2b.temporary.model.ProductInfo;
+import com.uas.platform.core.model.Status;
 
 @Service
 public class PurcOrderServiceImpl implements PurcOrderService {
@@ -231,6 +232,8 @@ public class PurcOrderServiceImpl implements PurcOrderService {
 			neworder.setRemark(order.getRemark());
 			neworder.setShipaddress(order.getShipAddress());
 			neworder.setVenduser(order.getVenduser());
+			neworder.setRate(order.getRate());
+			neworder.setStatus((short) Status.UNAUDIT.value());
 			Enterprise enter = enterpriseDao.findEnterpriseByUu(order.getVendUU());
 			Customers cust = new Customers();
 			cust.setUu(enter.getUu());
@@ -246,7 +249,8 @@ public class PurcOrderServiceImpl implements PurcOrderService {
 					item.setQty(String.valueOf(orderitem.getQty()));
 					item.setRemark(orderitem.getRemark());
 					item.setPrice(String.valueOf(orderitem.getPrice()));
-					item.setId(orderitem.getProductId());
+					item.setId(null);
+					item.setPrid(orderitem.getProductId());
 					item.setTaxrate(orderitem.getTaxrate());
 					items.add(item);
 				}

+ 36 - 19
src/main/webapp/resources/js/index/app.js

@@ -2268,7 +2268,6 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
                 getDelveryCondition(zone, $scope.condition);
                 $scope.tableParams.reload();
             };
-  		
             $scope.SearchMethod = false;
          var getService = function() {
         	 return $scope.SearchMethod ? PurcOrders : PurcOrdersInfo;
@@ -12783,18 +12782,30 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
 		$scope.dateZoneText = '一个月内';
 		$scope.condition = {dateZone: 1};
 		$scope.currency = Symbol.currency;//将币别转化为对应的符号
-		$scope.changeAgreed = function(agreed) {
-			$scope.condition.agreed = agreed;
-			$scope.agreedText = typeof agreed == 'undefined' ? '全部' : (agreed == 1 ? '已同意' : '不同意');
-			$scope.condition.$agreedOpen = false;
-		};
-		$scope.changeDateZone = function(zone) {
-			$scope.condition.dateZone = zone;
-			$scope.dateZoneText = typeof zone == 'undefined' ? '半年前' : (zone == 1 ? '一个月内' : '半年内');
-			$scope.condition.$dateZoneOpen = false;
-			getDateCondition(zone, $scope.condition);
-			$scope.tableParams.reload();
-		};
+		  /* 时间筛选初始化*/
+        var fromDate = new Date();
+        var toDate = new Date();
+        fromDate.setMonth(fromDate.getMonth() - 1);
+        fromDate.setHours(0,0,0,0);
+        toDate.setHours(23,59,59,999);
+        $scope.condition.dateFrom = fromDate;
+        $scope.condition.dateTo = toDate;
+
+        $scope.changeDateZone = function(zone) {
+            $scope.condition.dateZone = zone;
+            $scope.dateZoneText = zone == 1? '最近一个月' : (zone == 3 ? '最近三个月' : (zone == 6 ? '最近六个月' : '自定义'));
+            $scope.condition.$dateZoneOpen = false;
+            getDateCondition(zone, $scope.condition);
+            $scope.tableParams.page(1);
+            $scope.tableParams.reload();
+        };
+        $scope.changeDeliveryZone = function(zone) {
+            $scope.condition.deliveryZoneText = zone;
+            $scope.deliveryZoneText = typeof zone == 'undefined' ? '不限' : (zone == -1 ? '不限' : (zone == 1 ? '一个月内' : '两个月内'));
+            $scope.condition.$delievryZoneOpen = false;
+            getDelveryCondition(zone, $scope.condition);
+            $scope.tableParams.reload();
+        };
 		$scope.setActive = function(state) {
 			if($scope.active != state) {
 				$scope.active = state;
@@ -12826,13 +12837,16 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
 			getData : function($defer, params) {
 				$scope.loading = true;
 				var pageParams = params.url();
-				pageParams.keyword = $scope.keyword;
+				pageParams.searchFilter = { // 筛选条件
+  						keyword: $scope.keyword,
+  						fromDate: getDateTime($scope.condition.dateFrom),
+  						endDate: getDateTime($scope.condition.dateTo)
+  				};
 				getService()[getState($scope.active)].call(null, BaseService.parseParams(pageParams), function(page) {
 					$scope.loading = false;
 					if(page) {
 						params.total(page.totalElement);
 						$defer.resolve(page.content);
-						$scope.keywordXls = angular.copy(pageParams.keyword);//保存当前取值的关键词
 					}
 				}, function(response) {
 					$scope.loading = false;
@@ -12850,8 +12864,11 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
   		};
   		
 		// 搜索框回车
-		$scope.onSearch = function() {
-			$scope.searchMethod = true;
+		$scope.onSearch = function(keyword) {
+			console.log(keyword);
+			if(keyword != null && keyword != '') {
+				$scope.searchMethod = true;
+			}
 			$scope.tableParams.page(1);
 			$scope.tableParams.reload();
 		};
@@ -12899,7 +12916,7 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
 				if(data.success) {
 					toaster.pop('success', '提示', data.success);
 					$timeout(function() {
-						window.location.reload();
+						$scope.tableParams.reload();
 					},500);
 				}
 				if(data.error) {
@@ -12916,7 +12933,7 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
 				if(data.success) {
 					toaster.pop('success', '提示', data.success);
 					$timeout(function() {
-						window.location.reload();
+						$scope.tableParams.reload();
 					},500);
 				}
 				if(data.error) {

+ 254 - 91
src/main/webapp/resources/tpl/index/purc/cart.html

@@ -6,22 +6,22 @@
 }
 
 .condition .more .form-group {
-	margin-bottom: 10px;
+	margin-bottom: 0;
 }
 
-.cart-table .header>th {
+.order-table .header>th {
 	height: 38px;
 	text-align: center;
 	background: #f5f5f5;
-	bcart-top: 1px solid #e8e8e8;
-	bcart-bottom: 1px solid #e8e8e8;
+	border-top: 1px solid #e8e8e8;
+	border-bottom: 1px solid #e8e8e8;
 }
 
-.cart-table .sep-row {
+.order-table .sep-row {
 	height: 10px;
 }
 
-.cart-table .selector {
+.order-table .selector {
 	vertical-align: middle;
 	margin: 0 0 2px 0;
 }
@@ -37,76 +37,78 @@
 }
 
 .toolbar .btn {
-	-moz-bcart-radius: 2px;
+	-moz-border-radius: 2px;
 	margin-right: 5px;
-	bcart: 1px solid #dcdcdc;
-	bcart-radius: 2px;
-	-webkit-bcart-radius: 2px;
+	border: 1px solid #dcdcdc;
+	border-radius: 2px;
+	-webkit-border-radius: 2px;
 }
 
-.cart-table .cart-hd {
+.order-table .order-hd {
 	background: #f5f5f5;
 	height: 40px;
 	line-height: 40px;
 }
 
-.cart-table .cart-hd td.first {
+.order-table .order-hd td.first {
 	padding-left: 20px;
 }
 
-.cart-table .cart-hd .cart-main span {
+.order-table .order-hd .order-main span {
 	margin-right: 8px;
 }
 
-.cart-table .cart-hd .cart-code {
+.order-table .order-hd .order-code {
 	font-style: normal;
 	font-family: verdana;
 }
 
-.cart-table .cart-hd .cart-sum {
+.order-table .order-hd .order-sum {
 	padding: 0 5px;
 }
 
-.cart-table>tbody {
-	bcart: 1px solid transparent;
-}
-
-.cart-table>tbody:hover {
-	bcart-color: #56a022;
-	bcart-width: 2px;
+/*.order-table>tbody {
+	border: 1px solid transparent;
+	border-bottom: 10px #ddd solid;
+}*/
+.order-table>tbody:hover{
+	border: #d32526 2px solid !important;
 }
+/*.order-table>tbody:hover .order-hd td{
+	border-top: #d32526 2px solid !important;
+}*/
 
-.cart-table .operates {
+.order-table .operates {
 	display: none;
 }
 
-.cart-table .operates i {
+.order-table .operates i {
 	padding: 0 2px;
 }
 
-.cart-table>tbody:hover .operates {
+.order-table>tbody:hover .operates {
 	display: block;
 }
-.cart-table>tbody:hover .operates-status {
+.order-table>tbody:hover .operates-status {
 	display: none;
 }
 
 
-.cart-table .cart-bd {
-	bcart-bottom: 1px solid #e6e6e6;
+.order-table .order-bd {
+	border-bottom: 1px solid #e6e6e6;
 }
 
-.cart-table .cart-bd>td {
+.order-table .order-bd>td {
 	padding: 10px 5px;
 	vertical-align: top;
 	position: relative;
 }
 
-.cart-table .cart-bd .product {
+.order-table .order-bd .product {
 	padding-left: 20px;
 }
 
-.cart-table .cart-bd .cart-number {
+.order-table .order-bd .order-number {
 	position: absolute;
 	top: -1px;
 	left: -1px;
@@ -116,11 +118,11 @@
 	text-align: center;
 	background: #f5f5f5;
 	font-weight: 500;
-	bcart: solid 1px #d5d5d5;
-	bcart-radius: 0 0 10px 0;
+	border: solid 1px #d5d5d5;
+	border-radius: 0 0 10px 0;
 }
 
-.cart-table .cart-bd .cart-number.key {
+.order-table .order-bd .order-number.key {
 	background: #56a022;
 	color: #ffffff;
 }
@@ -132,108 +134,269 @@
 .info-container .info:hover {
 	color: #CC3333;
 }
-
-#cart-title {
-	font-size: 16px;
-}
-.addCart-btn{
-	width: 105px;
-	height: 36px;
-	display: inline-block;
-	background: #5078cb;
-	text-align: center;
-	color: #fff;
+.buy-cart{
 	font-size: 14px;
-	line-height: 36px;
+	padding: 0;
+	margin-left: 50px;
 }
-.addCart-btn:hover{
-	background: #3a89d1;
-	color: #fff;
-	text-decoration: none;
+.buy-cart a{
+	color: #5078cb;
+	float: left;
+	margin-left: 15px;
+}
+.buy-cart a img{
+	margin-right: 3px;
+}
+#public .menu .btn-group{
+	height: inherit !important;
 }
 </style>
 <link rel="stylesheet" href="static/css/public.css">
 <div class="block" id="public">
 <div class="loading in" ng-class="{'in': loading}">
 	<i></i>
+</div><div class="pub-com_head">
+	<span>购物车</span>
+	<div class="p-right">
+		<a ng-click="clearCart()"><i class="fa fa-trash"></i>清空</a>
+		<a ui-sref="purc.newOrder" title="新增采购单"><img src="static/img/icon/add.png"/>新增</a>
+	</div>
 </div>
 <div class="condition block">
-	<div class="row" id="cart-title">
-		<div class="col-xs-6">
-			<a class="label label-info label-2x">购物车<i class="fa fa-shopping-cart fa-lg"></i> <span ng-bind="tableParams.total()" class="text-num"></span></a>&nbsp;
-			<a ng-click="clearCart()" class="label label-danger label-lg" ng-if="tableParams.total() != 0">清空<i class="fa fa-trash fa-lg"></i></a>
+	<div class="search-bg condition block" style="padding: 10px 15px;">
+		<div class="row">
+			<div id="topSearch" style="float: left">
+				<a ng-click="changeDateZone(1);condition.$open=false" title="最近一个月" ng-class="{'active':condition.dateZone=='1'}">最近一个月</a>
+				<a ng-click="changeDateZone(3);condition.$open=false" title="最近三个月" ng-class="{'active':condition.dateZone=='3'}">最近三个月</a>
+				<a ng-click="changeDateZone(6);condition.$open=false" title="最近六个月" ng-class="{'active':condition.dateZone=='6'}">最近六个月</a>
+				<a ng-click="condition.$open=!condition.$open;changeDateZone(-1)" title="自定义" ng-class="{'active':condition.dateZone=='-1'}" >自定义</a>
+			</div>
+			<div class="col-xs-6" style="float: right;">
+				<div class="search">
+					<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%"/>
+						<a class="btn input-group-addon" ng-click="onSearch(keyword)">搜索</a>
+					</div>
+				</div>
+			</div>
+		</div>
+		<div class="more-list more" ng-class="{'open': condition.$open}">
+			<form class="form-inline">
+				<div class="form-group ">
+					<label>日期:</label>
+					<div class="btn-group btn-menu" dropdown is-open="condition.$dateZoneOpen">
+						<ul class="dropdown-menu">
+							<li><a ng-click="changeDateZone(1)">一个月内</a></li>
+							<li><a ng-click="changeDateZone(6)">半年内</a></li>
+							<li><a ng-click="changeDateZone()">半年前</a></li>
+						</ul>
+					</div>
+					<div class="form-group input-group input-group-xs input-trigger">
+						<input type="text" ng-model="condition.dateFrom"
+							   class="form-control" placeholder="从"
+							   datepicker-popup="yyyy-MM-dd" is-open="condition.$fromOpened"
+							   ng-required="true" max-date = "condition.dateTo"
+							   current-text="今天" clear-text="清除" close-text="关闭"
+							   datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+							   ng-focus="openFilterDatePicker($event, condition, '$fromOpened')">
+						<span class="input-group-btn">
+						<button type="button" class="btn btn-default"
+								ng-click="openFilterDatePicker($event, condition, '$fromOpened')">
+							<i class="fa fa-calendar"></i>
+						</button>
+					</span>
+					</div>
+					<div class="form-group input-group input-group-xs input-trigger">
+						<input type="text" ng-model="condition.dateTo"
+							   class="form-control" placeholder="到"
+							   datepicker-popup="yyyy-MM-dd" is-open="condition.$toOpened"
+							   ng-required="true" min-date = "condition.dateFrom"
+							   current-text="今天" clear-text="清除" close-text="关闭"
+							   datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+							   ng-focus="openFilterDatePicker($event, condition, '$toOpened')">
+						<span class="input-group-btn">
+						<button type="button" class="btn btn-default"
+								ng-click="openFilterDatePicker($event, condition, '$toOpened')">
+							<i class="fa fa-calendar"></i>
+						</button>
+					</span>
+					</div>
+				</div>
+			</form>
 		</div>
 	</div>
 </div>
-<table class="cart-table block" ng-table="tableParams">
+<table class="order-table block" ng-table="tableParams">
 	<thead>
 		<tr class="header">
-			<th>商品</th>
-			<th width="80">单价</th>
+			<th>物料</th>
+			<th width="80">含税单价</th>
+			<th width="100">税率</th>
 			<th width="100">数量</th>
 			<th width="120">交货日期</th>
-			<th width="180">备注</th>
+			<th width="180">单据状态</th>
 			<th width="120">操作</th>
 		</tr>
-		<tr class="sep-row">
-			<td colspan="5"></td>
-		</tr>
 	</thead>
 	<tbody ng-if="tableParams.total() == 0">
 		<tr>
-			<td class="text-center" colspan="7">
-				<br>
-				<div class="text-muted"><h3><i class="fa fa-spinner"></i> 购物车空空如也</h3></div>
-				<br>
-				<div>
-					<a href="#/purc/addOrder" class="addCart-btn">立即添加商品</a>
+			<td colspan="6">
+				<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、您的采购单在ERP系统上还没审核,订单无法上传到平台<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="order in $data| orderBy : '-date' track by cart.id">
-		<tr class="cart-hd" ng-dblclick="order.$collapsed=!order.$collapsed" ng-class="{'text-bold': cart.display>0}">
-			<td class="first">供应商:<a class="text-bold" ng-bind="::order.receiveName" href="#/purc/cart/{{order.id}}"></a></td>
-			<td colspan="3">录单人:<span class="text-bold" ng-bind="::order.recorder"></span>(<span class="text-num text-bold"
-					ng-bind="::order.date | date:'yyyy-MM-dd'"></span> )</td>
-			<td colspan="1" class="cart-sum">{{::order.currency}}: <span
+	<tbody ng-repeat="order in $data track by order.id">
+		<tr class="order-hd" ng-dblclick="order.$collapsed=!order.$collapsed" ng-class="{'text-bold': order.display>0}">
+			<td class="first" colspan="5">
+				<div class="order-main">
+					<!--<span> <input type="checkbox" class="selector"
+						ng-model="order.$selected" ng-click="checkOne(order)">
+					</span> -->
+					<span class="text-num text-bold"
+						ng-bind="::order.date | date:'yyyy-MM-dd'"></span>
+					<span>订单号:<a
+						class="text-num" ng-bind="::order.code" ui-sref="purc.cartDetail({id:order.id})" target="_self"></a></span>
+					<span ng-bind="::order.receiveName"></span>
+				</div>
+			</td>
+			<td class="order-sum">{{::order.currency}}: <span
 				ng-bind="getCartTotal(order.orderItems) | number : 2"
 				class="text-num text-bold"></span>
 			</td>
-			<td colspan="2" class="text-center">
-				<a class="label label-success" ng-click="addtoOrder(order.id)">提交</a>
-				<a class="label label-danger" ng-click="deleteCart(order.id)">删除</a>
+			<td class="text-center">
+				<a ng-click="copyorder(order.id)">复制</a>
+				<a ng-click="deleteCart(order.id)">删除</a>
 			</td>
 		</tr>
-		<tr class="cart-bd" ng-repeat="detail in order.orderItems track by detail.id"
-			ng-if="!cart.$collapsed "><!-- && (!searchFilterXls.keyword || detail.key || cart.$showAll) -->
+		<tr class="order-bd" ng-repeat="item in order.orderItems track by item.id"
+			ng-if="!order.$collapsed "><!-- && (!searchFilterXls.keyword || item.key || order.$showAll) -->
 			<td class="product">
-				<div class="text-num cart-number" ng-class="{'key': detail.key&&order.$showAll}" title="第{{::detail.number}}行">{{::detail.number}}</div>
+				<div class="text-num order-number" ng-class="{'key': item.key&&order.$showAll}" title="第{{::item.number}}行">{{::item.number}}</div>
 				<div class="text-num text-bold">
-					<span ng-bind="::detail.product.code"></span>
+					<span ng-bind="::item.product.code"></span>
 				</div>
 				<div>
-					<span ng-bind="::detail.product.title"></span>
+					<span ng-bind="::item.product.title"></span>
 				</div>
 				<div class="text-muted"
-					ng-bind="::detail.product.spec"></div>
+					ng-bind="::item.product.spec"></div>
+				<div class="text-muted text-bold" ng-if="item.vendspec"><span ng-bind="::item.vendspec"></span></div>
+				<div class="text-bold text-inverse" ng-if="item.factory">送货工厂:<span ng-bind="::item.factory"></span></div>
+				<div class="text-bold text-inverse" ng-if="item.remark">备注:<span ng-bind="::item.remark"></span></div>
 			</td>
 			<td class="text-center">
-				<div class="text-num" ng-bind="::detail.price | number:6"></div>
-				<div class="text-muted">税率:{{::detail.taxrate || 0}}%</div>
+				<div class="text-num" ng-bind="::item.price | number:6"></div>
 			</td>
+			<td class="text-center"><div class="text-muted">{{::item.taxrate || 0}}</div></td>
 			<td class="text-center">
-				<div class="text-num" ng-bind="::detail.qty"></div>
-				<div class="text-muted" ng-bind="::detail.product.unit"></div>
+				<div class="text-num" ng-bind="::item.qty"></div>
+				<div class="text-muted" ng-bind="::item.product.unit"></div>
+				<div style="margin: 0 auto" ng-if="item.$editing">
+					<input type="number" ng-model="item.reply.qty" min="0" max="{{item.qty}}"
+						ng-init="item.reply.qty=item.qty-item.replyQty"
+						class="form-control input-xs" placeholder="0~{{item.qty-item.replyQty}}">
+				</div>
 			</td>
 			<td class="text-center br-l">
-				<div class="text-num" ng-bind="::detail.delivery | date:'yyyy-MM-dd'"></div>
+				<div class="text-num" ng-bind="::item.delivery | date:'yyyy-MM-dd'"></div>
+				<br>
+				<div style="margin: 0 auto"
+					class="input-group input-group-xs input-trigger"
+					ng-if="item.$editing">
+					<input type="text" ng-model="item.reply.delivery"
+						class="form-control" placeholder="回复交期"
+						datepicker-popup="yyyy-MM-dd" is-open="item.$opened"
+						min-date="order.date" ng-required="true" current-text="今天"
+						clear-text="清除" close-text="关闭"
+						datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+						ng-focus="openDatePicker($event, item, '$opened')"> <span
+						class="input-group-btn">
+						<button type="button" class="btn btn-default"
+							ng-click="openDatePicker($event, item, '$opened')">
+							<i class="fa fa-calendar"></i>
+						</button>
+					</span>
+				</div>
 			</td>
-			<td class="text-center">
-				<div class="text-num" ng-bind="::detail.remark"></div>
+			<td class="br-l">
+				<div ng-if="!item.$editing">
+					<div ng-if="!item.replyQty" class="text-muted text-center">未回复</div>
+					<div ng-if="item.replyQty > 0 && item.replyQty < item.qty">
+						<div class="progress progress-sm">
+							<div class="progress-bar progress-bar-success"
+								ng-style="{'width': 100*item.replyQty/item.qty + '%'}">
+								<span class="sr-only"></span>
+							</div>
+						</div>
+						已回复 <span class="text-default">{{::item.replyQty}}</span> /
+						<span>{{::item.qty}}</span>
+					</div>
+					<div ng-if="item.replyQty > 0" class="dropdown" ng-class="{'text-center': item.replyQty>=item.qty}">
+						<a href="javascript:void(0);" class="dropdown-toggle text-default"
+							ng-mouseover="getReply(item)">回复历史<i class="fa fa-fw fa-angle-down"></i></a>
+						<div class="dropdown-menu pane" style="width: 270px;">
+							<div class="pane-body">
+								<ul class="list-unstyled list-menu">
+									<li ng-repeat="reply in ::item.replies">
+										<div class="row row-sm"
+											ng-class="{'text-inverse': $index==0}">
+											<div class="col-xs-6">
+												<span ng-if="reply.qty < 0"> 撤销</span>
+												数量 {{::reply.qty}}
+											</div>
+											<div class="col-xs-6">交期{{::reply.delivery |
+												date:'yyyy-MM-dd'}}</div>
+										</div>
+										<div class="text-muted">{{::reply.recorder}}&nbsp;&nbsp;{{::reply.date
+											| date:'MM-dd HH:mm'}}&nbsp;回复</div>
+									</li>
+								</ul>
+							</div>
+						</div>
+					</div>
+					<div ng-if="item.acceptQty" class="text-success text-center text-bold f14">
+						已验收:{{::item.acceptQty}}{{::item.product.unit}}
+					</div>
+					<div ng-if="item.returnQty" class="text-error text-center text-bold f14">
+						已验退:{{::item.returnQty}}{{::item.product.unit}}
+					</div>
+				</div>
+				<div style="margin: 0 auto" ng-if="item.reply.remark != null">
+					<br><br><span type="text" ng-model="item.reply.remark"></span>
+				</div>
 			</td>
-			<td class="text-center">
-				<a class="label label-lg label-danger" ng-click="deleteDetail(detail.id)">删除</a>
+			<td class="text-center br-l">
+				<a ng-click="deleteDetail(item.id)">删除</a>
 			</td>
 		</tr>
 	</tbody>