Browse Source

【商务平台】 增加查看自己委外加工的订单

git-svn-id: svn+ssh://10.10.101.21/source/platform/platform-b2b@6224 f3bf4e98-0cf0-11e4-a00c-a99a8b9d557d
hejq 9 years ago
parent
commit
a802d4a898

+ 113 - 0
src/main/java/com/uas/platform/b2b/controller/MakeOutOrderController.java

@@ -0,0 +1,113 @@
+package com.uas.platform.b2b.controller;
+
+import java.text.SimpleDateFormat;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.alibaba.fastjson.JSON;
+import com.uas.platform.b2b.model.MakeOrder;
+import com.uas.platform.b2b.model.SearchFilter;
+import com.uas.platform.b2b.service.MakeOrderService;
+import com.uas.platform.b2b.service.UserService;
+import com.uas.platform.b2b.support.JxlsExcelView;
+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.PageInfo;
+import com.uas.platform.core.model.PageParams;
+import com.uas.platform.core.util.serializer.FlexJsonUtils;
+
+/**
+ * 查看自己委外加工的订单
+ * 
+ * @author hejq
+ * @time 创建时间:2016年10月17日
+ */
+@Controller
+@RequestMapping("/make/outorders")
+public class MakeOutOrderController {
+
+	@Autowired
+	private MakeOrderService makeOrderService;
+
+	@SuppressWarnings("deprecation")
+	@Autowired
+	private UserService userService;
+
+	private final static UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
+
+	/**
+	 * 获取所有的委外加工单详细信息
+	 * 
+	 * @param params
+	 * @param searchFilter
+	 * @return
+	 */
+	@RequestMapping(method = RequestMethod.GET)
+	@ResponseBody
+	public Page<MakeOrder> getAllMakeOutOrders(PageParams params, String searchFilter) {
+		System.out.println(JSON.toJSON(params));
+		System.out.println(searchFilter);
+		logger.log("委外加工单", "查看委托客户加工的单据列表(全部)");
+		// 自己作为客户
+		PageInfo pageInfo = new PageInfo(params);
+		// 我作为卖家,把我的企业ID作为供应商ID传入
+		pageInfo.filter("enUU", SystemSession.getUser().getEnterprise().getUu());
+		SearchFilter filter = FlexJsonUtils.fromJson(searchFilter, SearchFilter.class);
+		// 判断当前用户是否被客户分配
+		@SuppressWarnings("deprecation")
+		SearchFilter filter2 = userService.distribute();
+		if (filter2 != null) {
+			if (filter2.getDistribute() == null) {
+				return null;
+			} else {
+				filter.setDistribute(filter2.getDistribute());
+			}
+		}
+		return makeOrderService.findByPageInfo(pageInfo, filter);
+
+	}
+
+	/**
+	 * 根据id查找委外加工单明细
+	 *
+	 * @param id
+	 * @return
+	 */
+	@RequestMapping(value = "/{id}", method = RequestMethod.GET)
+	@ResponseBody
+	public MakeOrder getReceivedPurchaseOrderItemById(@PathVariable("id") Long id) {
+		logger.log("自己委外加工单", "获取单个自己委外加工单,id:" + id);
+		return makeOrderService.findById(id);
+	}
+
+	/**
+	 * 导出 excel - 全部
+	 * 
+	 * @param params
+	 * @return
+	 */
+	@RequestMapping(value = "/xls", method = RequestMethod.GET)
+	public ModelAndView exportOrders(String searchFilter) {
+		SearchFilter filter = FlexJsonUtils.fromJson(searchFilter, SearchFilter.class);
+		PageInfo pageInfo = new PageInfo(1, JxlsExcelView.MAX_SIZE, 0);
+		pageInfo.sorting("date", Direction.DESC);
+		pageInfo.filter("vendUU", SystemSession.getUser().getEnterprise().getUu());
+		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
+		ModelAndView modelAndView = new ModelAndView();
+		modelAndView.addObject("dateFormat", dateFormat);
+		modelAndView.addObject("state", "全部");
+		modelAndView.addObject("data", makeOrderService.findByPageInfo(pageInfo, filter).getContent());
+		modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/make/makeOrder", "委外加工单列表_全部"));
+		logger.log("自己委外加工单", "导出Excel列表", "导出全部Excel列表");
+		return modelAndView;
+	}
+}

+ 198 - 4
src/main/webapp/resources/js/index/app.js

@@ -346,6 +346,14 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'ser
 			url : "/change/:id",
 			templateUrl : "static/tpl/index/make/change_detail.html",
 			controller: 'MakeChangeDetailCtrl'
+		}).state('make.outorder', {
+			url : "/outorder",
+			templateUrl : "static/tpl/index/make/outorder.html",
+			controller: 'MakeOutOrderCtrl'
+		}).state('make.outorder_detail', {
+			url : "/outorder/:id",
+			templateUrl : "static/tpl/index/make/outorder_detail.html",
+			controller: 'MakeOutOrderDetailCtrl'
 		}).state('make.accept', {
 			url : "/accept",
 			templateUrl : "static/tpl/index/make/accept.html",
@@ -4171,7 +4179,7 @@ app.controller('SaleSendCtrl', ['$scope', '$filter', 'SaleSend', 'ngTableParams'
 		// 点击勾选全部的复选框
 		$scope.checkAll = function(){
 			$scope.totalMoney = 0;
-			$scope.filteredData = $filter('filter')($scope.data,$scope.condition.uuorname,$scope.condition.venduuorname);
+			$scope.filteredData = $filter('filter')($scope.data, $scope.condition.uuorname, $scope.condition.venduuorname);
 			var uuorname = $scope.suuorname;			
 			var venduuorname = $scope.venduuorname;
 			var dateFrom = $scope.condition.dateFrom;
@@ -4264,7 +4272,7 @@ app.controller('SaleSendCtrl', ['$scope', '$filter', 'SaleSend', 'ngTableParams'
 					sendcode: '',
 					whname: '',
 			};
-			
+
 			//应收对账单明细行来源表信息
 			$scope.sourceInfo = {
 					sourceId: '',
@@ -4352,14 +4360,14 @@ app.controller('SaleSendCtrl', ['$scope', '$filter', 'SaleSend', 'ngTableParams'
 				$scope.item.receiveName = check.receiveName;
 				$scope.item.sendcode = check.sendcode;
 				$scope.item.whname = check.whname;
-				
-					
+
 				//来源表相关信息	
 	  			$scope.sourceInfo.sourceId = check.sourceId;
 				$scope.sourceInfo.sourceTable = check.sourceTable;
 				$scope.sourceInfo.newYCheckQty = ((check.yCheckQty || 0) + check.thisCheckQty);
 					
 				sourceInfos.push($scope.sourceInfo);
+				console.log($scope.sourceInfo);
 	  			$scope.apCheck.items.push($scope.item);
 				$scope.haveSelected = true;
 			}
@@ -4527,6 +4535,7 @@ app.controller('SaleSendCtrl', ['$scope', '$filter', 'SaleSend', 'ngTableParams'
 		$scope.loading = true;
 		AccountUser.findDistribute({},function(data) {
 			$scope.distributes = data;
+			console.log($scope.distributes);
 		},function(response) {
 			toaster.pop('error', '系统错误', response.data);
 		})
@@ -5890,6 +5899,191 @@ app.controller('SaleSendCtrl', ['$scope', '$filter', 'SaleSend', 'ngTableParams'
 			}
 		};
 	}]);
+	
+	/**
+	 * 委外加工
+	 */
+	app.controller('MakeOutOrderCtrl', ['$scope', '$filter', 'MakeOutOrder', 'ngTableParams', 'toaster','ReportService', 'BaseService',
+	        function($scope, $filter, MakeOutOrder, ngTableParams, toaster,ReportService, 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;
+			getDateCondition(zone, $scope.condition);
+			$scope.tableParams.reload();
+		};
+		$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  MakeOutOrder;
+		};
+		$scope.tableParams = new ngTableParams({
+			page : 1, 
+			count : 5,
+			sorting: {
+				date: 'desc' 
+            }
+		}, {
+			total : 0, 
+			counts: [5, 10, 25, 50],
+			getData : function($defer, params) {
+				$scope.loading = true;
+				var pageParams = params.url();
+				pageParams.searchFilter = {};
+				pageParams.searchFilter.keyword = $scope.keyword;
+				pageParams.searchFilter.fromDate = $scope.condition.dateFrom ? $scope.condition.dateFrom.getTime() : null;
+				pageParams.searchFilter.endDate = $scope.condition.dateTo ? $scope.condition.dateTo.getTime() : null;
+				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(pageParams.searchFilter);//保存当前取值的关键词
+					}
+				}, 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;
+				MakeOutOrder.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();
+		};
+		
+		// 选择查找日期
+		$scope.onDateCondition = function(){
+			$scope.tableParams.page(1);
+			$scope.tableParams.reload();
+		};
+	}]);
+	
+	/**
+	 * 委外加工详细
+	 */
+	app.controller('MakeOutOrderDetailCtrl', ['$scope', '$stateParams', 'MakeOutOrder', 'toaster', 'ReportService', function($scope, $stateParams, MakeOutOrder, toaster, ReportService) {
+		var loadData = function() {
+			MakeOutOrder.get({id: $stateParams.id}, function(data){
+				$scope.order = data;
+				var sum = $scope.order.qty * $scope.order.price;
+				$scope.order.total = sum;
+				$scope.loading = false;
+			});
+		};
+		loadData();
+		// 获取回复记录
+		$scope.getReply = function(item) {
+			if(!item.replies) {
+				MakeOutOrder.getReply({orderId: item.id}, function(replies){
+					item.replies = replies;
+				});
+			}
+		};
+		$scope.openDatePicker = function($event, item, openParam) {
+			$event.preventDefault();
+		    $event.stopPropagation();
+		    item[openParam] = !item[openParam];
+		};
+		
+		// 点击回复
+		$scope.onReplyClick = function(order, inverse) {
+			if(order.reply) {
+				if(!order.reply.qty || order.reply.qty < 0 || order.reply.qty > order.qty) {
+					toaster.pop('warning', '提示', '请填写有效的回复数量!');
+					return;
+				}
+				var reply = angular.copy(order.reply);
+				if(reply.delivery) {
+					if(typeof reply.delivery == 'object')
+						reply.delivery = reply.delivery.getTime();
+				} else {
+					reply.delivery = order.delivery;
+				}
+				if(inverse && inverse == -1) reply.qty = -1 * reply.qty;// 取相反
+				$scope.loading = true;
+				MakeOutOrder.reply({orderId: order.id}, reply, function(){
+					$scope.loading = false;
+					toaster.pop('info', '提示', (inverse == -1 ? '撤销成功':'回复成功'));
+					loadData();
+				}, function(response){
+					$scope.loading = false;
+					toaster.pop('error', '回复失败', response.data);
+				});
+			}
+		};
+		
+		// 打开回复
+		$scope.openReply = function(order) {
+			if(!order.reply) {
+				order.reply = {
+					qty: order.qty - (order.replyQty ? order.replyQty : 0),
+					delivery: order.delivery
+				}
+			}
+			order.$editing = true;
+		};
+		
+		// 关闭回复
+		$scope.closeReply = function(order) {
+			order.$editing = false;
+		}
+		
+		$scope.print = function(order) {
+			MakeOutOrder.printCount({id: order.id},{});//增加打印此次
+			ReportService.print(order.enUU, 'make', '{make_outorders.ma_id}=' + order.id, ' 自己委外加工订单-' + order.code);
+		};
+	}]);
+	
 	/**
 	 * 计算时间差
 	 */

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

@@ -63,5 +63,9 @@ define([ 'ngResource'], function() {
 		return $resource('make/return/:id',{},{
 			getAll: {}
 		});
+	}]).factory('MakeOutOrder', ['$resource',function($resource){
+		return $resource('make/outorders/:id', {}, {
+			getAll: {}
+		})
 	}]);
 });

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

@@ -11,6 +11,7 @@
 	<ul class="list-unstyled">
 		<li ui-sref-active="active"><a ui-sref="make.order">客户委外加工单</a></li>
 		<li ui-sref-active="active"><a ui-sref="make.change">客户委外变更单</a></li>
+		<li ui-sref-active="active"><a ui-sref="make.outorder">委外加工单</a></li>
 	</ul>
 </div>
 <div class="left-nav">

+ 374 - 0
src/main/webapp/resources/tpl/index/make/outorder.html

@@ -0,0 +1,374 @@
+<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-9">
+				<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')"
+							ng-change="onDateCondition()">
+						<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')"
+							ng-change="onDateCondition()">
+						<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> 
+				</div> <!-- 分页 -->
+			</td>
+			<td class="text-center">
+				<a href="make/outorders/xls?_state={{active}}&searchFilter={{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="order in $data track by order.id">
+		<tr class="order-hd" ng-dbclick="order.$collapsed=!order.$collapsed" ng-class="{'text-bold': order.display>0}">
+			<td class="first">
+				<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="make.outorder_detail({id:order.id})" target="_self"></a></span>
+				</div>
+			</td>
+			<td colspan="3"><!-- <a ng-bind="::order.enterprise.enName"></a> --></td>
+			<td colspan="1" class="order-sum">{{::order.currency}}: <span
+				ng-bind="::order.qty * order.price| number : 2"
+				class="text-num text-bold"></span>
+			</td>
+			<td colspan="1" class="text-center">
+				<div class="operates">
+					<a ng-click="print(order)" title="打印{{order.print? '(已打印)':'(未打印)'}}" ng-class="{'unPrinted' : !order.print, 'text-muted': order.print}"><i
+						class="fa fa-print fa-lg"></i></a><a 
+						ng-click="order.$collapsed=!order.$collapsed" class="text-muted"
+						title="收拢"><i class="fa fa-toggle-down fa-lg"></i></a>
+				</div>
+			</td>
+		</tr>
+		<tr class="order-bd" ng-if="!order.$collapsed">
+			<td class="product">
+				<div class="text-num text-bold" title="物料编号">
+					<span ng-bind="::order.product.code"></span>
+				</div>
+				<div title="物料名称">
+					<span ng-bind="::order.product.title"></span>
+				</div>
+				<div class="text-muted" title="物料规格"
+					ng-bind="::order.product.spec"></div>
+				<div>
+					计划加工日期:<span class="text-num" ng-bind="::order.commence | date:'yyyy-MM-dd'"></span>
+					 <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>
+				<div class="text-bold text-inverse" ng-if="order.factory">送货工厂:<span ng-bind="::order.factory"></span></div>
+			</td>
+			<td class="text-center">
+				<div class="text-num" ng-bind="::order.price | number:6"></div>
+				<div class="text-muted">税率:{{::order.taxrate || 0}}%</div>
+			</td>
+			<td class="text-center">
+				<div class="text-num" ng-bind="::order.qty"></div>
+				<div class="text-muted" ng-bind="::order.product.unit"></div>
+				<div style="margin: 0 auto" ng-if="order.$editing">
+					<input type="number" ng-model="order.reply.qty" min="0" max="{{item.qty}}"
+						class="form-control input-xs" placeholder="0~{{order.qty-(order.replyQty ? order.replyQty : 0)}}">
+				</div>
+			</td>
+			<td class="text-center br-l">
+				<!-- <div class="text-num" ng-bind="::order.commence | date:'yyyy-MM-dd'"></div>
+				<div>-</div>
+				<div class="text-num" ng-bind="::order.complete | date:'yyyy-MM-dd'"></div> -->
+				<div class="text-num" ng-bind="::order.delivery | date: 'yyyy-MM-dd'"></div>
+				<br>
+				<div style="margin: 0 auto"
+					class="input-group input-group-xs input-trigger"
+					ng-if="order.$editing">
+					<input type="text" ng-model="order.reply.delivery"
+						class="form-control" placeholder="回复交期"
+						datepicker-popup="yyyy-MM-dd" is-open="order.$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, order, '$opened')"> <span
+						class="input-group-btn">
+						<button type="button" class="btn btn-default"
+							ng-click="openDatePicker($event, order, '$opened')">
+							<i class="fa fa-calendar"></i>
+						</button>
+					</span>
+				</div>
+			</td>
+			<td class="br-l">
+				<div ng-if="!order.$editing">
+					<div ng-if="!order.replyQty" class="text-muted text-center">未回复</div>
+					<div ng-if="order.replyQty > 0 && order.replyQty < order.qty">
+						<div class="progress progress-sm">
+							<div class="progress-bar progress-bar-success"
+								ng-style="{'width': 100*order.replyQty/order.qty + '%'}">
+								<span class="sr-only"></span>
+							</div>
+						</div>
+						已回复 <span class="text-default">{{::order.replyQty}}</span> /
+						<span>{{::order.qty}}</span>
+					</div>
+					<div ng-if="order.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(order)">回复历史<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-if="!order.replies">正在加载...</li>
+									<li ng-repeat="reply in ::order.replies">
+										<div class="row row-sm"
+											ng-class="{'text-inverse': $index==0}">
+											<div class="col-xs-6">
+												数量 {{::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="order.acceptQty"
+							class="text-success text-center text-bold f14">
+							客户验收:{{::order.acceptQty}}</div>
+						<div ng-if="order.returnsqty"
+							class="text-error text-center text-bold f14">
+							客户验退:{{::order.returnsqty}}</div>
+				</div>
+				<div style="margin: 0 auto" ng-if="order.$editing">
+					<br><br><input type="text" ng-model="order.reply.remark"
+						class="form-control input-xs" placeholder="回复备注" />
+				</div>
+			</td>
+			<td class="text-center br-l">
+				<div ng-if="order.replyQty>=order.qty && !item.$editing && !item.end" class="block">
+					<span class="text-trans success">已回复</span>
+				</div>
+				<div ng-if="order.end" class="block">
+					<span class="text-trans warning">已结案</span>
+				</div>
+				<!-- <div ng-if="(!order.replyQty || order.replyQty<order.qty) && !order.end">
+					<div ng-show="!order.$editing">
+						<a ng-click="openReply(order)">回复</a>
+					</div>
+					<div ng-if="order.$editing">
+						<div>
+							<a ng-click="closeReply(order)">取消</a>
+						</div>
+						<br>
+						<div class="text-left">
+							<a ng-click="onReplyClick(order)" class="text-inverse">
+								<i class="fa fa-check-square-o"></i> 确认回复
+							</a>
+						</div>
+					</div>
+				</div> -->
+			</td>
+		</tr>
+		<tr class="order-bd" ng-if="!order.$collapsed">
+			<td colspan="6">
+				<div class="row">
+				</div>
+			</td>
+		</tr>
+	</tbody>
+</table>
+</div>

+ 224 - 0
src/main/webapp/resources/tpl/index/make/outorder_detail.html

@@ -0,0 +1,224 @@
+<div class="loading" ng-class="{'in': loading}">
+	<i></i>
+</div>
+<div class="pane base-info">
+	<div class="pane-header f16">
+		委外加工单<a ng-click="print(order)" class="pull-right text-simple"><i
+			class="fa fa-print fa-fw"></i>打印</a>
+	</div>
+	<div class="pane-body">
+		<div class="headerline">
+			<span class="index">1</span> <span class="content">委外资料</span>
+		</div>
+		<div class="row row-sm item">
+			<div class="col-xs-3">
+				<span class="title">委外单号</span>
+				<div class="content" ng-bind="::order.code"></div>
+			</div>
+			<div class="col-xs-3">
+				<span class="title">日期</span>
+				<div class="content" ng-bind="::order.date | date:'yyyy-MM-dd'"></div>
+			</div>
+<!-- 			<div class="col-xs-6">
+				<span class="title">客户</span>
+				<div class="content" ng-bind="::order.enterprise.enName"></div>
+			</div> -->
+		</div>
+		<div class="row row-sm item">
+			<div class="col-xs-3">
+				<span class="title">委外类型</span>
+				<div class="content" ng-bind="::order.type"></div>
+			</div>
+			<div class="col-xs-3">
+				<span class="title">录单人</span>
+				<div class="content" ng-bind="::order.recorder"></div>
+			</div>
+			<div class="col-xs-3">
+				<span class="title">审批人</span>
+				<div class="content" ng-bind="::order.auditor"></div>
+			</div>
+			<div class="col-xs-3">
+				<span class="title">委外员</span>
+				<div class="content" ng-bind="::order.user.userName"></div>
+			</div>
+		</div>
+		<div class="headerline">
+			<span class="index">2</span> <span class="content">交易信息</span>
+		</div>
+		<div class="row row-sm item">
+			<div class="col-xs-3">
+				<span class="title">币别</span>
+				<div class="content" ng-bind="::order.currency"></div>
+			</div>
+			<div class="col-xs-3">
+				<span class="title">汇率</span>
+				<div class="content" ng-bind="::order.rate"></div>
+			</div>
+			<div class="col-xs-6">
+				<span class="title">付款方式</span>
+				<div class="content" ng-bind="::order.payments"></div>
+			</div>
+		</div>
+		<div class="row row-sm item">
+			<div class="col-xs-3">
+				<span class="title">金额</span>
+				<div class="content" ng-bind="::order.total"></div>
+			</div>
+			<div class="col-xs-9">
+				<span class="title">交货地址</span>
+				<div class="content" ng-bind="::order.shipAddress "></div>
+				<div class="content" ng-if="!order.shipAddress ">无</div>
+			</div>
+		</div>
+		<div class="headerline">
+			<span class="index">3</span> <span class="content">商品清单</span>
+		</div>
+		<div class="block">
+			<table class="block table table-default table-striped table-hover">
+				<thead>
+					<tr class="header">
+						<th width="50" class="br-r">行号</th>
+						<th>商品</th>
+						<th width="80">单价</th>
+						<th width="100">数量</th>
+						<th width="120">交货日期</th>
+						<th width="180">回复状态</th>
+						<th width="100">操作</th>
+					</tr>
+				</thead>
+				<tbody>
+					<tr>
+						<td class="text-center text-num text-bold f-16 text-success br-r">
+							<span >1</span>
+						</td>
+						<td>
+							<div class="text-num text-bold">
+								<span ng-bind="::order.product.code"></span>
+							</div>
+							<div>
+								<span ng-bind="::order.product.title"></span>
+							</div>
+							<div class="text-muted" ng-bind="::order.product.spec"></div>
+						</td>
+						<td class="text-center">
+							<div class="text-num" ng-bind="::order.price | number:6"></div>
+							<div class="text-muted">税率:{{::order.taxrate || 0}}%</div>
+						</td>
+						<td class="text-center">
+							<div class="text-num" ng-bind="::order.qty"></div>
+							<div class="text-muted" ng-bind="::order.product.unit"></div>
+							<div style="margin: 0 auto" ng-if="order.$editing">
+								<input type="text" ng-model="order.reply.qty" min="0" max="{{order.qty}}"
+									ng-init="order.reply.qty=order.qty-order.replyQty"
+									class="form-control input-xs" placeholder="0~{{order.qty-order.replyQty}}">
+							</div>
+						</td>
+						<td class="text-center">
+							<div class="text-num"
+								ng-bind="::order.delivery | date:'yyyy-MM-dd'"></div> <br>
+							<div style="margin: 0 auto"
+								class="input-group input-group-xs input-trigger"
+								ng-if="order.$editing">
+								<input type="text" ng-model="order.reply.delivery"
+									ng-init="order.reply.delivery=parseDate(order.delivery)"
+									class="form-control" placeholder="回复交期"
+									datepicker-popup="yyyy-MM-dd" is-open="order.$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, order, '$opened')"> <span
+									class="input-group-btn">
+									<button type="button" class="btn btn-default"
+										ng-click="openDatePicker($event, order, '$opened')">
+										<i class="fa fa-calendar"></i>
+									</button>
+								</span>
+							</div>
+						</td>
+						<td>
+							<div ng-show="!order.$editing">
+								<div ng-if="!order.replyQty" class="text-muted text-center">未回复</div>
+								<div ng-if="order.replyQty > 0 && order.replyQty < order.qty">
+									<div class="progress progress-sm">
+										<div class="progress-bar progress-bar-success"
+											ng-style="{'width': 100*order.replyQty/order.qty + '%'}">
+											<span class="sr-only"></span>
+										</div>
+									</div>
+									已回复 <span class="text-default">{{::order.replyQty}}</span> / <span>{{::order.qty}}</span>
+								</div>
+								<div ng-if="order.replyQty > 0" class="dropdown"
+									ng-class="{'text-center': order.replyQty>=order.qty}">
+									<a href="javascript:void(0);"
+										class="dropdown-toggle text-default"
+										ng-mouseover="getReply(order)">回复历史<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 ::order.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}}{{::reply.date
+														| date:'yyyy-MM-dd HH:mm:ss'}}回复</div>
+												</li>
+											</ul>
+										</div>
+									</div>
+								</div>
+							</div>
+							<div style="margin: 0 auto" ng-if="order.$editing">
+								<br> <br> <input type="text"
+									ng-model="order.reply.remark" class="form-control input-xs"
+									placeholder="回复备注" />
+							</div>
+							<div ng-if="order.acceptQty" class="text-success text-center text-bold f14">
+								客户验收:{{::order.acceptQty}}{{::order.product.unit}}
+							</div>
+							<div ng-if="order.returnQty" class="text-error text-center text-bold f14">
+								客户验退:{{::order.returnQty}}{{::order.product.unit}}
+							</div>
+						</td>
+						<td class="text-center">
+							<div ng-if="order.replyQty>=order.qty" class="block">
+								<span class="text-trans success">已回复</span>
+							</div>
+							<div ng-if="order.end" class="block">
+								<span class="text-trans warning">已结案</span>
+							</div>
+							<!-- <div
+								ng-if="(!order.replyQty || order.replyQty<=order.qty) && !order.end">
+								<br ng-if="order.replyQty>=order.qty">
+								<br ng-if="order.replyQty>=order.qty">
+								<div ng-show="!order.$editing">
+									<a ng-click="order.$editing=!order.$editing">回复</a>
+								</div>
+								<div ng-if="order.$editing">
+									<div>
+										<a ng-click="order.$editing=!order.$editing">取消</a>
+									</div>
+									<br>
+									<div class="text-left">
+										<a ng-click="onReplyClick(order)" class="text-inverse">
+											<i class="fa fa-arrow-up"></i> 确认回复
+										</a>
+										<br>
+										<a ng-click="onReplyClick(order, -1)" class="text-muted" title="减去已回复数量">
+											<i class="fa fa-arrow-down"></i> 撤销回复</a>
+									</div>
+								</div>
+							</div> -->
+						</td>
+					</tr>
+				</tbody>
+			</table>
+		</div>
+	</div>
+</div>