Explorar o código

委外变更

git-svn-id: svn+ssh://10.10.101.21/source/platform/platform-b2b@1290 f3bf4e98-0cf0-11e4-a00c-a99a8b9d557d
suntg %!s(int64=10) %!d(string=hai) anos
pai
achega
b414c50dd1

+ 102 - 3
src/main/webapp/resources/js/index/app.js

@@ -233,6 +233,10 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'ser
 			url : "/order/:id",
 			templateUrl : "static/tpl/index/make/order_detail.html",
 			controller: 'SaleOrderDetailCtrl'
+		}).state('make.change', {
+			url : "/change",
+			templateUrl : "static/tpl/index/make/change.html",
+			controller: 'MakeChangeCtrl'
 		});
 	}]);
 	
@@ -716,8 +720,8 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'ser
 				getService()[getState($scope.active)].call(null, BaseService.parseParams(pageParams), function(page){
 					$scope.loading = false;
 					if(page) {
-						params.total(page.totalElements);
 						$defer.resolve(page.content);
+						params.total(page.totalElements);
 						$scope.keywordXls = angular.copy($scope.keyword);//保存当前取值的关键词
 						$scope.fromDateXls = angular.copy($scope.condition.dateFrom ? $scope.condition.dateFrom.getTime() : null);//保存当前取值的起始日期
 						$scope.endDateXls = angular.copy($scope.condition.dateTo ? $scope.condition.dateTo.getTime() : null);//保存当前取值的截止日期
@@ -3424,6 +3428,102 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'ser
 		};
 	}]);
 	
+	/**
+	 * 委外加工变更
+	 */
+	app.controller('MakeChangeCtrl', ['$scope', '$filter', 'MakeChange', 'ngTableParams', 'toaster', 'BaseService', function($scope, $filter, MakeChange, ngTableParams, toaster, BaseService){
+		$scope.active = 'all';
+		$scope.agreedText = '全部';
+		$scope.dateZoneText = '一个月内';
+		$scope.condition = {dateZone: 1};
+		$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;
+		};
+		$scope.setActive = function(state) {
+			if($scope.active != state) {
+				$scope.active = state;
+				if($scope.tableParams.page() == 1)
+					$scope.tableParams.reload();
+				else
+					$scope.tableParams.page(1);
+			}
+		};
+		var getService = function() {
+			return $scope.condition.dateZone ? MakeChange : MakeChange;
+		};
+		$scope.tableParams = new ngTableParams({
+			page : 1, 
+			count : 5,
+			sorting: {
+                orderChangeDate: 'desc' 
+            }
+		}, {
+			total : 0, 
+			counts: [5, 10, 25, 50],
+			getData : function($defer, params) {
+				$scope.loading = true;
+				var pageParams = params.url();
+				pageParams.keyword = $scope.keyword;
+				getService()[getState($scope.active)].call(null, BaseService.parseParams(pageParams), function(page){
+					$scope.loading = false;
+					if(page) {
+						params.total(page.totalElements);
+						$defer.resolve(page.content);
+						$scope.keywordXls = angular.copy($scope.keyword);//保存当前取值的关键词
+					}
+				}, function(response){
+					$scope.loading = false;
+					toaster.pop('error', '数据加载失败', response.data);
+				});
+			}
+		});
+		
+		$scope.openDatePicker = function($event, item, openParam) {
+			$event.preventDefault();
+		    $event.stopPropagation();
+		    item[openParam] = !item[openParam];
+		};
+		
+		// 打开回复
+		$scope.openReply = function(change) {
+			change.$editing = true;
+		};
+		
+		// 关闭回复
+		$scope.closeReply = function(change) {
+			change.$editing = false;
+		}
+		
+		// 确定回复
+		$scope.onReplyClick = function(change) {
+			if(change.$agreed) {
+				var reply = {id: change.id, agreed: Number(change.$agreed), replyRemark: change.replyRemark};
+				$scope.loading = true;
+				MakeChange.reply({itemId: change.id}, reply, function(){
+					$scope.loading = false;
+					toaster.pop('info', '提示', '回复成功');
+					$scope.tableParams.reload();
+				}, function(response){
+					$scope.loading = false;
+					toaster.pop('error', '回复失败', response.data);
+				});
+			}
+		};
+		
+		// 搜索框回车
+		$scope.onSearch = function() {
+			$scope.tableParams.page(1);
+			$scope.tableParams.reload();
+		};
+	}]);
+	
 	/**
 	 * 计算时间差
 	 */
@@ -3471,8 +3571,7 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'ser
 			}
 		};
 	}]);
-	
-		
+			
 	/**
 	 * 状态码  -> 描述
 	 */

+ 10 - 0
src/main/webapp/resources/js/index/services/Make.js

@@ -18,5 +18,15 @@ define([ 'ngResource'], function() {
 				}
 			}
 		});
+	}]).factory('MakeChange', ['$resource', function($resource) {
+		return $resource('make/changes/:id', {}, {
+			reply: {
+				url: 'make/changes/:itemId/reply',
+				method: 'POST',
+				params: {
+					itemId: 'itemId'
+				}
+			}
+		});
 	}]);
 });

+ 293 - 0
src/main/webapp/resources/tpl/index/make/change.html

@@ -0,0 +1,293 @@
+<style>
+.order-table .header>th {
+	height: 38px;
+	text-align: center;
+	background: #f5f5f5;
+	border-top: 1px solid #e8e8e8;
+	border-bottom: 1px solid #e8e8e8;
+}
+
+.order-table .sep-row {
+	height: 10px;
+}
+
+.order-table .selector {
+	vertical-align: middle;
+	margin: 0 0 2px 0;
+}
+
+.toolbar label {
+	margin-right: 10px;
+	margin-bottom: 0;
+}
+
+.toolbar .select_all {
+	margin: 0 6px 0 10px;
+	line-height: 20px;
+}
+
+.toolbar .btn {
+	-moz-border-radius: 2px;
+	margin-right: 5px;
+	border: 1px solid #dcdcdc;
+	border-radius: 2px;
+	-webkit-border-radius: 2px;
+}
+
+.order-table .order-hd {
+	background: #f5f5f5;
+	height: 40px;
+	line-height: 40px;
+}
+
+.order-table .order-hd td.first {
+	padding-left: 20px;
+}
+
+.order-table .order-hd .order-main span {
+	margin-right: 8px;
+}
+
+.order-table .order-hd .order-code {
+	font-style: normal;
+	font-family: verdana;
+}
+
+.order-table .order-hd .order-sum {
+	padding: 0 5px;
+}
+
+.order-table .order-info {
+	padding-left: 45px;
+}
+
+.order-table>tbody {
+	border: 1px solid transparent;
+}
+
+.order-table>tbody:hover {
+	border-color: #56a022;
+	border-width: 2px;
+}
+
+.order-table .operates {
+	display: none;
+}
+
+.order-table>tbody:hover .operates {
+	display: block;
+}
+
+.order-table .order-bd {
+	border-bottom: 1px solid #e6e6e6;
+}
+
+.order-table .order-bd>td {
+	padding: 10px 5px;
+	vertical-align: top;
+	position: relative;
+}
+
+.order-table .order-bd .product {
+	padding-left: 20px;
+}
+
+</style>
+<div class="block">
+<div class="loading in" ng-class="{'in': loading}">
+	<i></i>
+</div>
+<div class="condition block">
+		<div class="row">
+			<div class="col-xs-4">
+				<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>
+					</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>
+					</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>
+					</div>
+				</div>
+			</div>
+			<div class="col-xs-5">
+				<div class="search">
+					<div class="form-group form-group-sm has-feedback">
+						<input type="search" class="form-control input-sm" ng-model="keyword" ng-search="onSearch()" placeholder="输入商品、客户名称或单据流水号搜索" /><span
+							class="form-control-feedback text-simple"><i
+							class="fa fa-search"></i></span>
+					</div>
+				</div>
+			</div>
+			<div class="col-xs-1">
+				<div class="text-default f14 total">
+					共 <span ng-bind="tableParams.total()" class="text-num"></span>
+				</div>
+			</div>
+			<div class="col-xs-2 toggle">
+				<a ng-click="condition.$open=!condition.$open" class="text-simple"><span ng-bind="condition.$open ? '简化筛选条件' : '更多筛选条件'"></span><i class="fa fa-fw" ng-class="{'fa-angle-up': condition.$open, 'fa-angle-down': !condition.$open}"></i></a>
+			</div>
+		</div>
+		<div class="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">
+				  <button type="button" dropdown-toggle style="width: 85px;" class="btn btn-default btn-xs dropdown-toggle">
+				    	{{dateZoneText}}<i class="fa fa-fw fa-angle-down icon-right"></i></span>
+				  </button>
+				  <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"
+							current-text="今天" clear-text="清除" close-text="关闭"
+							datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+							ng-focus="openDatePicker($event, condition, '$fromOpened')">
+						<span class="input-group-btn">
+							<button type="button" class="btn btn-default"
+								ng-click="openDatePicker($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"
+							current-text="今天" clear-text="清除" close-text="关闭"
+							datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+							ng-focus="openDatePicker($event, condition, '$toOpened')">
+						<span class="input-group-btn">
+							<button type="button" class="btn btn-default"
+								ng-click="openDatePicker($event, condition, '$toOpened')">
+								<i class="fa fa-calendar"></i>
+							</button>
+						</span>
+					</div>
+			  </div>
+			  <div class="form-group">
+			    <label>处理结果:</label>
+			    <div class="btn-group btn-menu" dropdown is-open="condition.$agreedOpen">
+				  <button type="button" dropdown-toggle style="width: 70px;" class="btn btn-default btn-xs dropdown-toggle">
+				    	{{agreedText}}<i class="fa fa-fw fa-angle-down icon-right"></i></span>
+				  </button>
+				  <ul class="dropdown-menu">
+					<li><a ng-click="changeAgreed()">全部</a></li>
+				    <li><a ng-click="changeAgreed(1)">已同意</a></li>
+				    <li><a ng-click="changeAgreed(0)">不同意</a></li>
+				  </ul>
+				</div>
+			  </div>
+			</form>
+		</div>
+	</div>
+<table class="order-table block" ng-table="tableParams">
+	<thead>
+		<tr class="header">
+			<th>商品</th>
+			<th width="100">单价</th>
+			<th>数量</th>
+			<th width="120">计划加工日期</th>
+			<th width="140">备注</th>
+			<th width="80">操作</th>
+		</tr>
+		<tr class="sep-row">
+			<td colspan="6"></td>
+		</tr>
+		<tr class="toolbar toolbar-top">
+			<td colspan="5">
+				<div>
+					<label><input type="checkbox" class="selector select_all"
+						ng-model="selectAll">全选</label> <a ng-disabled="true" href="javascript:void(0)"
+						class="btn btn-default btn-xs" title="不支持批量回复">批量回复</a>
+				</div> <!-- 分页 -->
+			</td>
+			<td class="text-center">
+				<a href="sale/changes/xls?_state={{active}}&keyword={{keywordXls}}" target="_self" class="text-simple" title="导出Excel表格"><i class="fa fa-file-excel-o fa-fw"></i>导出</a>
+			</td>
+		</tr>
+		<tr class="sep-row">
+			<td colspan="6"></td>
+		</tr>
+	</thead>
+	<tbody ng-repeat="change in $data track by change.id">
+		<tr class="order-hd">
+			<td class="first">
+				<div class="order-main">
+					<span> <input type="checkbox" class="selector"
+						ng-model="change.$selected">
+					</span> <span class="text-num text-bold"
+						ng-bind="::change.orderChange.date | date:'yyyy-MM-dd'"></span> <span>流水号:<a
+						class="text-num" ng-bind="::change.orderChange.code" ui-sref="sale.change_detail({id:change.id})" target="_self"></a></span> <span>订单:<a
+						class="text-num text-bold" ng-bind="::change.orderCode" ui-sref="sale.order_detail({id:change.orderId})" target="_blank"></a></span>
+				</div>
+			</td>
+			<td colspan="3"><a
+				ng-bind="::change.orderChange.enterprise.enName"></a></td>
+			<td colspan="1" class="" title="{{change.orderChange.remark}}">
+				<div class="text-ellipsis" ng-bind="change.orderChange.remark" style="width: 120px;"></div>
+			</td>
+			<td colspan="1" class="text-center">
+				<div class="operates">
+					<!-- <a href="#" class="text-muted" title="打印"><i
+						class="fa fa-print fa-lg fa-fw"></i></a> -->
+				</div>
+			</td>
+		</tr>
+		<tr class="order-bd">
+			<td class="product">
+				<div>
+					<span class="text-num text-bold" ng-bind="::change.product.code"></span>
+					<span class="text-light">
+				</div>
+				<div ng-bind="::change.product.title"></div>
+				<div class="text-muted" ng-bind="::change.product.spec"></div>
+				<div class="" ng-if="::change.reason">变更原因:<span ng-bind="::change.reason"></span></div>
+			</td>
+			<td class="text-center">
+				<div class="text-num"
+					ng-class="{'text-inverse': change.newPrice != change.oldPrice}"
+					title="{{change.newPrice}}" ng-bind="::change.newPrice | number:6"></div>
+				<div ng-show="change.newPrice != change.oldPrice">
+					<s class="text-num text-muted" ng-bind="::change.oldPrice | number:6"></s>
+				</div>
+			</td>
+			<td class="text-center">
+				<div class="text-num"
+					ng-class="{'text-inverse': change.newQty != change.oldQty}"
+					title="{{change.newQty}}" ng-bind="::change.newQty"></div>
+				<div ng-show="change.newQty != change.oldQty">
+					<s class="text-num text-muted" title="{{change.oldQty}}"
+						ng-bind="::change.oldQty"></s>
+				</div>
+				<div class="text-muted" ng-bind="::change.product.unit"></div>
+			</td>
+			<td class="text-center br-l">
+				<div class="text-num">
+					<span ng-class="{'text-inverse': change.newCommence != change.oldCommence}" ng-bind="::change.newCommence | date:'yyyy-MM-dd'"></span>
+				</div>
+				<div class="text-num text-muted" ng-show="change.newCommence != change.oldCommence"><s ng-bind="::change.oldCommence | date:'yyyy-MM-dd'"></s></div>
+				<div>至</div>
+				<div class="text-num"><span ng-class="{'text-inverse': change.newComplete != change.oldComplete}" ng-bind="::change.newComplete | date:'yyyy-MM-dd'"></span></div>
+				<div class="text-num text-muted" ng-show="change.newComplete != change.oldComplete"><s ng-bind="::change.oldComplete | date:'yyyy-MM-dd'"></s></div>
+			</td>
+			<td class="text-left br-l" colspan="2">
+				<p class="text-muted">备注:<span ng-bind="::change.remark"></span></p>
+			</td>
+		</tr>
+	</tbody>
+</table>
+</div>

+ 2 - 2
src/main/webapp/resources/tpl/index/make/left.html

@@ -10,8 +10,7 @@
 	</div>
 	<ul class="list-unstyled">
 		<li ui-sref-active="active"><a ui-sref="make.order">客户委外加工单</a></li>
-		<li ui-sref-active="active"><a ui-sref="sale.change">客户委外变更单</a></li>
-		<li ui-sref-active="active"><a ui-sref="sale.notice">委外发货提醒</a></li>
+		<li ui-sref-active="active"><a ui-sref="make.change">客户委外变更单</a></li>
 	</ul>
 </div>
 <div class="left-nav">
@@ -19,6 +18,7 @@
 		<i></i>委外出货管理
 	</div>
 	<ul class="list-unstyled">
+		<li ui-sref-active="active"><a ui-sref="sale.notice">委外发货提醒</a></li>
 		<li ui-sref-active="active"><a ui-sref="sale.send">委外发货单</a></li>
 		<li ui-sref-active="active"><a ui-sref="sale.accept">客户委外验收单</a></li>
 		<li ui-sref-active="active"><a ui-sref="sale.returns">客户委外退货单</a></li>

+ 3 - 0
src/main/webapp/resources/tpl/index/make/order.html

@@ -270,6 +270,9 @@
 					 <i class="fa fa-arrows-h text-muted"></i> 
 					<span class="text-num" ng-bind="::order.complete | date:'yyyy-MM-dd'"></span>
 				</div>
+				<div ng-if="::order.remark" class="text-muted">
+					备注:<span ng-bind="::order.remark"></span>
+				</div>
 			</td>
 			<td class="text-center">
 				<div class="text-num" ng-bind="::order.price | number:6"></div>

+ 0 - 56
src/main/webapp/resources/tpl/index/make/right.html

@@ -153,59 +153,3 @@
 	width: 30%;
 }
 </style>
-<!-- right static-bar Start -->
-<div class="rbar">
-	<div class="item-wrap" ng-controller="TruckCtrl">
-		<div class="item-inner">
-			<span class="inner-text"> <!-- <i class="fa fa-fw fa-truck fa-2x"></i> -->我的货车
-			</span> <span class="badge" ng-bind="truckCount"></span>
-		</div>
-		<div class="tip">
-			<ul class="list-unstyled">
-				<li ng-click="openTrack()"><a><i class="fa fa-cubes fa-2x icon-left"></i>打开<br>货车</a></li>
-				<li ng-click="clearAll()"><a><i class="fa fa-undo fa-2x icon-left"></i>清空<br>货车</a></li>
-			</ul>
-		</div>
-	</div>
-	<div class="bar-center" ng-controller="TodoCtrl">
-		<div class="item-wrap">
-			<a class="item-inner" ui-sref="sale.inquiry"> <span
-				class="inner-text">待报价</span> <span class="badge"
-				ng-bind="todo.inquiry"></span>
-			</a>
-			<div class="tip" style="display: none;">报价</div>
-		</div>
-		<div class="item-wrap">
-			<a class="item-inner" ui-sref="sale.order"> <span
-				class="inner-text">待回复</span> <span class="badge"
-				ng-bind="todo.order"></span>
-			</a>
-		</div>
-		<div class="item-wrap">
-			<a class="item-inner" ui-sref="sale.change"> <span
-				class="inner-text">变更中</span> <span class="badge"
-				ng-bind="todo.orderChange"></span>
-			</a>
-		</div>
-		<div class="item-wrap">
-			<a class="item-inner" ui-sref="sale.notice"> <span
-				class="inner-text">待发货</span> <span class="badge"
-				ng-bind="todo.notice"></span>
-			</a>
-		</div>
-	</div>
-	<div class="bar-bottom">
-		<div class="item-wrap">
-			<div class="item-inner">
-				<span class="inner-text"><i
-					class="fa fa-fw fa-headphones fa-lg"></i></span>
-			</div>
-		</div>
-		<div class="item-wrap">
-			<div class="item-inner">
-				<span class="inner-text"><i class="fa fa-fw fa-tablet fa-lg"></i></span>
-			</div>
-		</div>
-	</div>
-</div>
-<!-- right static-bar End -->

+ 9 - 1
src/main/webapp/resources/tpl/index/sale/order.html

@@ -314,7 +314,7 @@
 			</td>
 		</tr>
 		<tr class="order-bd" ng-repeat="item in order.orderItems track by item.id"
-			ng-if="!order.$collapsed">
+			ng-if="!order.$collapsed && (!keyword || item.key || order.$showAll)">
 			<td class="product">
 				<div class="text-num text-bold">
 					<span ng-bind="::item.product.code"></span>
@@ -437,6 +437,14 @@
 				</div>
 			</td>
 		</tr>
+		<tr ng-if="!order.$collapsed && keyword" style="cursor: pointer;padding: 10px 0;">
+			<td colspan="6" class="text-center text-simple" ng-if="!order.$showAll" style="cursor: pointer;padding: 10px 0;" ng-click="order.$showAll = true">
+				展开所有明细(包括不含关键词的) <i class="fa fa-angle-down"></i>
+			</td>
+			<td colspan="6" class="text-center text-simple" ng-if="order.$showAll" style="cursor: pointer;padding: 10px 0;" ng-click="order.$showAll = false">
+				收起不含关键词的明细 <i class="fa fa-angle-up"></i>
+			</td>
+		</tr>
 	</tbody>
 </table>
 </div>