jquery 动态增加table元素

jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
<%@taglib  uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>

<c:set scope="request" var="sysModule" value="product" />
<c:set scope="request" var="sysPage" value="allocate_order" />


<c:set var="pageTitle" value="${gto.id == null?'添加调拨单':'编辑调拨单'}" />
<tiles:insertDefinition name="metronicTemplate">
	<tiles:putAttribute name="title">${pageTitle }</tiles:putAttribute>
	<tiles:putAttribute name="page-content">
		<div class="row">
			<div class="col-md-12">
				<div class="portlet light">
					<div class="portlet-title">
						<div class="caption">
							<i class="fa fa-cogs font-green-sharp"></i> <span class="caption-subject font-green-sharp bold uppercase">${pageTitle }</span>
						</div>
						<div class="tools">
							<a href="javascript:;" class="collapse"></a>
						</div>
					</div>
					<div class="portlet-body">
						<%@include file="/WEB-INF/view/include/message.jsp" %>
						
						
						<form:form cssClass="form-horizontal" role="form" method="post"  action="${pageContext.request.contextPath}/allocateOrder/save" id="io_order_form" modelAttribute="gto">
						   <input type="hidden" name="id" value="${gto.id }" />
							<fieldset>
								<div class="row">
									<div class="col-md-4">
										<div class="form-group">
											<label class="control-label col-md-4">调拨单号</label>
											<div class="col-md-8">
												<input type="text" readonly="readonly" class="form-control" name="orderNo" value="${gto.orderNo}">
											</div>
										</div>
									</div>
									 <div class="col-md-4">
										<div class="form-group">
											<label class="control-label col-md-4">调拨日期</label>
											<div class="col-md-8">
												<div class="input-group date date-picker" data-date-format="yyyy-mm-dd">
													<form:input path="transferDate" maxlength="10" cssClass="form-control" />
													<span class="input-group-btn">
														<button class="btn default" type="button"><i class="fa fa-calendar"></i></button>
													</span>
												</div>
											</div>
										</div>
									</div> 
							  </div>
								
							 <div class="row">
							 
							 	   <div class="col-md-4">
										<div class="form-group">
											<label class="control-label col-md-4">调拨出库日期</label>
											<div class="col-md-8">
												<input type="text" class="form-control" readonly="readonly"  value="<fmt:formatDate value="${gto.ocTime}" pattern="yyyy-MM-dd HH:mm:ss" />">
											</div>
										</div>
									</div>
							 
									<div class="col-md-4">
										<div class="form-group">
											<label class="control-label col-md-4">调拨入库日期</label>
											<div class="col-md-8">
												<input type="text" class="form-control" readonly="readonly" value="<fmt:formatDate value="${gto.orTime}" pattern="yyyy-MM-dd HH:mm:ss" />">
											</div>
										</div>
									</div>
									
								
									
									<div class="col-md-4">
										<div class="form-group">
											<label class="control-label col-md-4">备注</label>
											<div class="col-md-8">
												<input type="text" class="form-control" name="note" id="note" value="${gto.note}">
											</div>
										</div>
									</div>
						  </div> 
							</fieldset>
							<fieldset>
								<legend>
									物品信息
									<c:if test="${gto.status != 2}">
										<button type="button" class="btn btn-primary" data-dismiss="alert" onclick="addEditRow();">添加</button>
									</c:if>
								</legend>
								<table class="table table-hover table-bordered table-condensed" id="IoOrder_add_table">
									<thead>
										<tr id="info_tr">
											<th>SKU</th>
											<th>名称</th>
											<th>库存</th>
											<th>锁定库存</th>
											<th>数量</th>
											<th>调出仓库</th>
											<th>调出货位</th>
											<th>调入仓库</th>
											<th>调入货位</th>
											<c:if test="${not empty gto.orTime}">
											<th>实际入库数量</th>
											</c:if>
											<c:if test="${not empty gto.ocTime}">
											<th>实际出库数量</th>
											</c:if> 
											<th></th>
										</tr>
									</thead>
									<tbody id="info_tb">
										<c:forEach items="${gto.items}" var="item" varStatus="status">
											<tr>
												<td><input name="goodsSku" value="${item.goodsSku }" class="form-control input-sm" id="goodsSku_${status.index }" readonly="readonly" size="11" /></td>
												<td><input name="goodsName" value="${item.goodsName }" class="form-control input-sm" id="goodsName_${status.index }" readonly="readonly" /></td>
											
												<td><input name="inventory" value="" class="form-control input-sm" id="" readonly="readonly" size="5" /></td>
												<td><input name="inventoryLock" value="" class="form-control input-sm" id="" readonly="readonly" size="5" /></td>
												
												<td>
												<input name="goodsCount" value="${item.goodsCount }" class="form-control input-sm" id="goodsCount_${status.index }" size="5" />
												</td>
												                   <!--start 出库 -->
												<td>
										
														<select class="form-control input-sm" name="fromStoreId" id="fromStoreId_${status.index }" shelfId="${item.fromStoreShelfId }">
															<option value="">请选择...</option>
															<c:forEach var="ss" items="${store}">
																<option value="${ss.id}" ${item.fromStoreId == ss.id ? 'selected' : '' }>${ss.name}</option>
															</c:forEach>
														</select>
												
												</td>
												<td>
												<input type="text" name="fromStoreShelf" value="${item.fromStoreShelf }" class="form-control input-sm" size="10" />
												<input type="hidden" name="fromStoreShelfId" value="${item.fromStoreShelfId }" />
												</td>
												                  <!-- end 出库 -->
												                  
												                  <!--start 入库 -->
												<td>
										
														<select class="form-control input-sm" name="toStoreId" id="toStoreId_${status.index }" shelfId="${item.toStoreShelfId }">
															<option value="">请选择...</option>
															<c:forEach var="ss" items="${store}">
																<option value="${ss.id}" ${item.toStoreId == ss.id ? 'selected' : '' }>${ss.name}</option>
															</c:forEach>
														</select>
												
												</td>
												<td>
												<input type="text" name="toStoreShelf" value="${item.toStoreShelf }" class="form-control input-sm" size="10" />
												<input type="hidden" name="toStoreShelfId" value="${item.toStoreShelfId }" />
												</td>
												                <!--start 入库 -->
												
												<c:if test="${not empty gto.orTime }">
												<td>
												<input type="text"  value="${item.orNum }" class="form-control input-sm" size="10" />
												</td>
												</c:if>
												
												<c:if test="${not empty gto.ocTime }">
												<td>
												<input type="text"  value="${item.ocNum }" class="form-control input-sm" size="10" />
												</td>
												</c:if> 
												                
												<td>
													<c:if test="${gto.status != 2}">
														
															<a href="javascript:;" class="btn default btn-xs black c-row-del-btns">
																<i class="fa fa-trash-o"></i> <spring:message code="g.label.delete"/>
															</a>
															
													</c:if>
												</td>
											</tr>
										</c:forEach>
									</tbody>
									<tbody>
										<tr>
											<td>&nbsp;</td>
											<td>&nbsp;</td>
											<td>&nbsp;</td>
											<td class="text-right">总数量:</td>
											<td id="sum_count_td">&nbsp;</td>
											<td>&nbsp;</td>
											<td>&nbsp;</td>
											<td>&nbsp;</td>
											<td>&nbsp;</td>
											<td colspan="3">&nbsp;</td>
										</tr>
									</tbody>
								</table>
							</fieldset>
							<fieldset>
								<legend>操作</legend>
								<c:if test="${gto.id != null }">
								<div class="row">
									<div class="col-md-12">
										制单时间:  <fmt:formatDate value="${gto.createdTime}" pattern="yyyy-MM-dd HH:mm:ss" />
										制单人: ${gto.userName}
									</div>
								</div>
								<c:if test="${gto.status == 2 }">
								<div class="row">
									<div class="col-md-12">
										审核时间: <fmt:formatDate value="${gto.auditTime}" pattern="yyyy-MM-dd HH:mm:ss" />
										审核人: ${gto.auditUserName}
									</div>
								</div>
								</c:if>
								</c:if>
								<div class="row text-center">
									<%-- 新建或者未审核时可保存 --%>
									<c:if test="${gto.id == null || gto.status == 1}">
										<button type="submit" id="sub_id" class="btn btn-primary"><spring:message code="g.label.save"/></button>
									</c:if>
									<%-- 未审核才能审核 --%>
									<c:if test="${gto.id != null && gto.status == 1}">
										<a href="${pageContext.request.contextPath }/allocateOrder/approve?id=${gto.id}" class="btn btn-primary c-confirm-link"><spring:message code="g.label.approved"/></a>
									</c:if>
								</div>
							</fieldset>
						
						</form:form>
					</div>
				</div>
			</div>
		</div>
	</tiles:putAttribute>
	<%-- 页面级别的 JS --%>
	<tiles:putAttribute name="js-page">
	<script src="${pageContext.request.contextPath }/resources/assets/global/plugins/datatables/media/js/jquery.dataTables.min.js" type="text/javascript"></script>
	<script src="${pageContext.request.contextPath }/resources/assets/global/plugins/datatables/plugins/bootstrap/dataTables.bootstrap.js" type="text/javascript"></script>
	<script src="${pageContext.request.contextPath }/resources/assets/global/plugins/bootstrap-datepicker/js/bootstrap-datepicker.js" type="text/javascript"></script>
		
		<script>
			var trHtmlPattern = 
					'<tr>' +
					'	<td><input name="goodsSku" class="form-control input-sm" id="goodsSku_{0}" size="11" /></td>'+
					'	<td><input name="goodsName" class="form-control input-sm" id="goodsName_{0}" readonly="readonly" /></td>' +
					'	<td><input name="inventory" class="form-control input-sm" id="inventory_{0}" readonly="readonly" size="5" /></td>'+
					'	<td><input name="inventoryLock" class="form-control input-sm" id="inventoryLock_{0}" readonly="readonly" size="5" /></td>'+
					'	<td><input name="goodsCount" class="form-control input-sm" id="goodsCount_{0}" size="5" /></td>' +
					//出库
					'	<td>' +
					'		<select class="form-control input-sm" name="fromStoreId" id="fromStoreId_{0}">' +
					'			<option value="">请选择...</option>' +
					'			<c:forEach var="ss" items="${store}">' +
					'				<option value="${ss.id}">${ss.name}</option>' +
					'			</c:forEach>' +
					'		</select>' +
					'	</td>' +
					'	<td>' +
					'		<input type="text" name="fromStoreShelf" id="fromStoreShelf_{0}" class="form-control input-sm" size="10" />' +
					'		<input type="hidden" name="fromStoreShelfId" id="fromStoreShelfId_{0}" value="${item.fromStoreShelfId }" />' +
					'	</td>'
					+
					//入库
					'	<td>' +
					'		<select class="form-control input-sm" name="toStoreId" id="toStoreId_{0}">' +
					'			<option value="">请选择...</option>' +
					'			<c:forEach var="ss" items="${store}">' +
					'				<option value="${ss.id}">${ss.name}</option>' +
					'			</c:forEach>' +
					'		</select>' +
					'	</td>' +
					'	<td>' +
					'		<input type="text" name="toStoreShelf" id="toStoreShelf_{0}" class="form-control input-sm" size="10" />' +
					'		<input type="hidden" name="toStoreShelfId" id="toStoreShelfId_{0}" value="${item.toStoreShelfId }" />' +
					'	</td>'
					
					+
					'	<td>' +
					'		<a href="javascript:;" class="btn default btn-xs black c-row-del-btns">' +
					'			<i class="fa fa-trash-o"></i> <spring:message code="g.label.delete"/>' +
					'		</a>' +
					'	</td>' +
					'</tr>';
		
		$(function() {
				$(document).on('blur', 'input[name=goodsSku]', function() {
					var $this = $(this);
					var sku = $.trim($this.val());
					$this.val(sku);
					if (sku == '')
						return false;
					
					var skuCounter = 0;
					$('input[name=goodsSku]').each(function() {
						if ($(this).val() == sku) {
							skuCounter++;
						}
					});
					
					if (skuCounter > 1) {
						alert('已经存在相同SKU行,请在同一行编辑');
						$this.val('');
						$this.blur();
						return;
					}
					
					// 查询商品信息
					$.get('${pageContext.request.contextPath }/goods/load-by-sku.json?sku=' + sku, function(goods) {
					
						 if (goods == null) {
							$this.parents('tr').find('input[name=goodsName], input[name=goodsCost]').val('');
							alert(sku + '不存在!')
							return;
						}

						 var $tr = $this.closest('tr');
						$tr.find('input[name=goodsName]').val(goods.name);
						$tr.find('select[name=fromStoreId]').val(goods.storeId);
						$tr.find('input[name=fromStoreShelfId]').val(goods.storeShelfId);
						$tr.find('input[name=fromStoreShelf]').val(goods.storeShelfCode);
						
						 $.get('${pageContext.request.contextPath }/store/find-storeId-and-shelfCode-and-sku.json?code=' +goods.storeShelfCode+'&storeId='+goods.storeId+'&sku='+sku ,function(data){
							$this.parents('tr').find('input[name=inventory]').val((data.inventory==null||data.inventory==''?0:data.inventory));
							$this.parents('tr').find('input[name=inventoryLock]').val((data.inventoryLock==null||data.inventoryLock==''?0:data.inventoryLock));
							
						},'json'); 
						

						$($this.parents('tr').find('input[name=goodsCount]')).change(function(){
							var $tr = $this.parents('tr');
								var salecount = parseInt($tr.find('input[name=inventory]').val()) - parseInt($tr.find('input[name=inventoryLock]').val());
								var goodsCount = $(this).val();
								if(goodsCount > salecount){
									alert("调拨数量不能大于可用数");
									$this.focus();
									$this.parents('tr').find('input[name=goodsCount]').val('');
									return false;
								}
						});

						
					}, 'json');
				});
				
				
				
				
				$(document).on('click', '.c-row-del-btns', function() {
					$(this).parents('tr').remove();
				});
				
				
				$('#io_order_form').validate({
					errorElement : 'span', //default input error message container
					errorClass : 'help-block help-block-error', // default input error message class
					focusInvalid : false, // do not focus the last invalid input
					ignore : "", // validate all fields including form hidden input
					messages: {
						fromStoreShelfId: '必须输入或输入不正确',
						toStoreShelfId: '必须输入或输入不正确',
						goodsCount:{remote:"不能大于调拨数量"}
					},
					rules : {
						transferDate : { required : true },
						goodsSku : { required : true },
						//goodsName : { required : true },
						goodsCount : { required : true, digits: true, min : 1},
						goodsCost : { required : true, number: true },
						fromStoreId : { required : true },
						fromStoreShelf : { required : true },
						fromStoreShelfId : { required : true },
						toStoreId : { required : true },
						toStoreShelf: { required : true },
						toStoreShelfId: { required : true }
					},

					highlight : function(element) { // hightlight error inputs
						$(element).parent().addClass('has-error'); // set error class to the control group
					},
					unhighlight : function(element) { // revert the change done by hightlight
						$(element).parent().removeClass('has-error'); // set error class to the control group
					},
					success : function(label) {
						label.parent().removeClass('has-error'); // set success class to the control group
					}
				});
				
				$('#io_order_form').submit(function() {
					
					if ($('input[name=goodsSku]').length == 0) {
						alert('请添加SKU信息');
						return false;
					}
				var f=false;	
			    $('select[name=fromStoreId]').each(function(){
			    	var $this = $(this);
			    	var fromStoreId=$this.val();
			    	var toStoreId = $this.closest('tr').find('select[name=toStoreId]').val();
				    //alert(fromStoreId+"--------"+(toStoreId==""));
					 if(fromStoreId!=""&&fromStoreId==toStoreId){
						    f=true;
						    $this.focus();
					    	alert('调出仓库与调入仓库不能相同');
							return false;	
					    }
			    });
				
			       if(f){return false;}
			    
					return true;
				});
				
				$(document).on('change', 'select[name=fromStoreId]', function() {
					var $this = $(this);
					$tr = $this.closest('tr');console.log('$tr.length - ' + $tr.length);
					$tr.find('input[name=fromStoreShelf]').val('');
					$tr.find('input[name=fromStoreShelfId]').val('');
				});
				
				$(document).on('change', 'select[name=toStoreId]', function() {
					var $this = $(this);
					$tr = $this.closest('tr');console.log('$tr.length - ' + $tr.length);
					$tr.find('input[name=toStoreShelf]').val('');
					$tr.find('input[name=toStoreShelfId]').val('');
				});
				
				
				$(document).on('change','input[name=goodsCount]', function() {
					var $this = $(this);
					var $tr = $this.parents('tr');
						var salecount = parseInt($tr.find('input[name=inventory]').val()) - parseInt($tr.find('input[name=inventoryLock]').val());
						var goodsCount = $(this).val();
						if(goodsCount > salecount){
							alert("出货数不能大于可用数");
							$this.focus();
							$this.parents('tr').find('input[name=goodsCount]').val('');
							return false;
						}
				});
				
				$(document).on('change', 'input[name=goodsCount], input[name=goodsCost]', function() {
					sumCount();
				});
				
				 //出库
				$(document).on('change', 'input[name=fromStoreShelf]', function() {
					var $this = $(this);
					$this.siblings('input[name=fromStoreShelfId]').val('');
					var fromStoreId = $this.closest('tr').find('select[name=fromStoreId]').val();
					var goodsSku = $this.closest('tr').find('input[name=goodsSku]').val();
					if (fromStoreId == '') {
						alert('请先选择出库仓库');
						return;
					}
					
					var code = $.trim($this.val());
					if (code == '') {
						return;
					}
					var url = '${pageContext.request.contextPath}/store/find-storeId-and-shelfCode-and-sku.json?code=' + code+'&storeId='+fromStoreId+'&sku='+goodsSku;
					$.getJSON(url).done(function(result){
						console.log(result);
						var $storeShelfIdInput = $this.siblings('input[name=fromStoreShelfId]');
						var inventory = $this.closest('tr').find('input[name=inventory]');
						var inventoryLock = $this.closest('tr').find('input[name=inventoryLock]');
						if (result == null) {
							$this.focus();
							$storeShelfIdInput.val('');
							alert('出库仓位号输入错误,请重新输入');
							return;
						}
						
						if (fromStoreId == result.storeId) {
							$storeShelfIdInput.val(result.id);
							inventory.val((result.inventory==null||result.inventory==''?0:result.inventory));
							inventoryLock.val((result.inventoryLock==null||result.inventoryLock==''?0:result.inventoryLock));
						} else {
							$storeShelfIdInput.val('');
							$this.val('');
							alert('出库仓位号输入错误,请重新输入');
						}
					});
				});
				
				//入库
				$(document).on('change', 'input[name=toStoreShelf]', function() {
					var $this = $(this);
					$this.siblings('input[name=toStoreShelfId]').val('');
					var toStoreId = $this.closest('tr').find('select[name=toStoreId]').val();
					if (toStoreId == '') {
						alert('请先选择入库仓库');
						return;
					}
					
					var code = $.trim($this.val());
					if (code == '') {
						return;
					}
					var url = '${pageContext.request.contextPath}/store/find-StoreId-and-shelfCode.json?code=' + code+"&storeId="+toStoreId;
					$.getJSON(url).done(function(result){
						console.log(result);
						var $storeShelfIdInput = $this.siblings('input[name=toStoreShelfId]');
						if (result == null) {
							$this.focus();
							$storeShelfIdInput.val('');
							alert('入库仓位号输入错误,请重新输入');
							return;
						}
						
						if (toStoreId == result.storeId) {
							$storeShelfIdInput.val(result.id);
						} else {
							$storeShelfIdInput.val('');
							$this.val('');
							alert('入库仓位号输入错误,请重新输入');
						}
					});
				});
			});
   
			var rowNum = 10000;
			function addEditRow() {
				rowNum ++;
				var html = trHtmlPattern.format(rowNum);
				
				$("#info_tb").append(html);
			}
			

			function subFrom(){
				$('#io_order_form').submit();
			}
		
			function dropHtml(rowNum) {
				$('#' + rowNum).remove();
			}
		
			function requestShelfList($tr, selectedValue, shelfId) {
				$.get('${pageContext.request.contextPath }/store/shelf-json?id=' + selectedValue, function(data) {
					xfy.fillSelect($tr.find('select[name=storeShelfId]'), data, 'id', 'code');
					if (shelfId != '') {
						$tr.find('select[name=fromStoreShelfId]').val(shelfId);
					}
				}, 'json');
			}

			$('.date-picker').datepicker({
				orientation: "right",
				autoclose: true
			});
			
			function sumCount() {
				var sumCount = 0;
				
				$('input[name=goodsCount]').each(function() {
					var $this = $(this);
					var goodsCountStr = $.trim($this.val());
					if (goodsCountStr == '') {
						return;
					}
					
					var goodsCountFloat = parseFloat(goodsCountStr);
					sumCount += goodsCountFloat;
					
				});
				
				$('#sum_count_td').html(sumCount);
			}
			
		 sumCount();
			
		</script>
	</tiles:putAttribute>
</tiles:insertDefinition>




Controller层

@RequestMapping("edit")
	public ModelAndView edit(@RequestParam(value="id", required=false) Long id){
		ModelAndView mv = new ModelAndView();
		GoodsTransferOrder gto=null;
		if (id != null) {
			gto=goodsTransferOrderService.get(id);
			List<GoodsTransferOrderItem> items=goodsTransferOrderItemDao.findItem(gto.getOrderNo());
			gto.setItems(items);
		}else{
			gto=new GoodsTransferOrder();
			gto.setOrderNo(xxNoGenerateService.generate(XxNoType.DB));
		}
		mv.addObject("gto",gto);
		List<Store> listStore =  storeService.findStroe();
		mv.addObject("store", listStore);
		mv.setViewName("goods/allocateorder-edit");
		return mv;
	}
	
	
	
	/**
	 * 添加调拨单
	 * @param attr
	 * @param sessionUser
	 * @param goodsSku
	 * @param goodsName
	 * @param goodsCount
	 * @param fromStoreId
	 * @param fromStoreShelfId
	 * @param toStoreId
	 * @param toStoreShelfId
	 * @param fromStoreShelf
	 * @param toStoreShelf
	 * @param order
	 * @return
	 */
	@RequestMapping("save")
	public String save(RedirectAttributes attr,
			@ModelAttribute(App.SESSION_USER_KEY) SessionUser sessionUser,
			@RequestParam("goodsSku") List<String> goodsSku,
			@RequestParam("goodsName") List<String> goodsName,
			@RequestParam("goodsCount") List<Integer> goodsCount,
			@RequestParam("fromStoreId") List<Integer> fromStoreId,
			@RequestParam("fromStoreShelfId") List<Integer> fromStoreShelfId,
			@RequestParam("toStoreId") List<Integer> toStoreId,
			@RequestParam("toStoreShelfId") List<Integer> toStoreShelfId,
			@RequestParam("fromStoreShelf") List<String> fromStoreShelf,
			@RequestParam("toStoreShelf") List<String> toStoreShelf,
			GoodsTransferOrder order){
		
		List<GoodsTransferOrderItem> items = new ArrayList<>(3);
		order.setItems(items);
		try {
			
		for (int i = 0; i < goodsSku.size(); i++) {
			GoodsTransferOrderItem item = new GoodsTransferOrderItem();
			item.setGoodsSku(goodsSku.get(i));
			item.setGoodsName(goodsName.get(i));
			item.setFromStoreId(fromStoreId.get(i));
			item.setFromStoreShelfId(fromStoreShelfId.get(i));
			item.setGoodsCount(goodsCount.get(i));
	        item.setToStoreId(toStoreId.get(i));
	        item.setToStoreShelfId(toStoreShelfId.get(i));
	        item.setFromStoreShelf(fromStoreShelf.get(i));
	        item.setToStoreShelf(toStoreShelf.get(i));
			items.add(item);
			
			if(item.getFromStoreId().equals(item.getToStoreId())){
				if(order.getOrderNo()!=null){
				operateLogService.insert("update","调拨单号:"+order.getOrderNo()+"sku:"+item.getGoodsSku()+"---->调出仓库与调入仓库不能相同",sessionUser.getUserId(),"库存管理","调拨单");
				}
				throw new DuplicateDataExcepption("sku:"+item.getGoodsSku()+"---->调出仓库与调入仓库不能相同");
			}
			
		 }

		 if (order.getId() == null) {
				order.setStatus(1);
				String dateStr = dft.format(Calendar.getInstance().getTime());
				String fmt =String.format("LS-%s-",dateStr)+"%d";
				order.setSerialNumber(tableKeyService.nextSerialNumber("goods_transfer_order",fmt));
				// 制单人
				order.setOperatorId(sessionUser.getUserId());
				this.goodsTransferOrderService.save(order);
				attr.addFlashAttribute("successMessage", "g.tips.success");
				operateLogService.insert("insert","调拨单 ->添加: 调拨单号="+order.getOrderNo(),sessionUser.getUserId(),"库存管理","调拨单");
			 }else {
				this.goodsTransferOrderService.update(order);
				attr.addFlashAttribute("successMessage", "g.tips.success");
				try{
					GoodsTransferOrder gtoOld=goodsTransferOrderService.get(order.getId().longValue());
					String editMsg= CommonUtil.getEditMsg(gtoOld,order,order.getClass().getName());
					operateLogService.insert("update","调拨单 ->更新: 调拨单号="+order.getOrderNo()+"["+editMsg+"]",sessionUser.getUserId(),"库存管理","调拨单");
				}catch(Exception e){
					e.printStackTrace();
				 }
			 }
		  } catch (InventoryShortageException e) {
				attr.addFlashAttribute("errorMessage", e.getGoodsInventory().getGoodsSku() + "库存不足");
		  }catch(DuplicateDataExcepption e){
			  attr.addFlashAttribute("errorMessage", e.getMessage());	 
		  }
		
		return "redirect:/allocateOrder/list";
	}
	
	
	/**
	 * 审核
	 * @param attr
	 * @param sessionUser
	 * @param id
	 * @return
	 */
	@RequestMapping("approve")
	public String approve(RedirectAttributes attr,
			@ModelAttribute(App.SESSION_USER_KEY) SessionUser sessionUser, 
			@RequestParam(value="id") Long id) {
		GoodsTransferOrder gto=goodsTransferOrderService.get(id);
	    synchronized (gto.getOrderNo().intern()){	
		try {
			if(gto.getStatus()==1){
			this.goodsTransferOrderService.approve(id, sessionUser.getUserId());
			}
			attr.addFlashAttribute("successMessage", "g.tips.success");
			operateLogService.insert("update","调拨单 ->审核: 调拨单号="+gto.getOrderNo(),sessionUser.getUserId(),"库存管理","调拨单");
		 } catch (InventoryShortageException e) {
			attr.addFlashAttribute("errorMessage", e.getGoodsInventory().getGoodsSku() + "库存不足");
			operateLogService.insert("update","调拨单 ->审核: 调拨单号="+gto.getOrderNo()+"----"+e.getGoodsInventory().getGoodsSku() + "库存不足",sessionUser.getUserId(),"库存管理","调拨单");
		 }
		
		return "redirect:/allocateOrder/list";
	    }	
	}
	
	/**
	 * 删除调拨单
	 * @param attr
	 * @param id
	 * @return
	 */
	@RequestMapping("delete")
	public String delete(RedirectAttributes attr,
			@ModelAttribute(App.SESSION_USER_KEY) SessionUser sessionUser, 
			@RequestParam(value="id") Long id) {
		GoodsTransferOrder gto=goodsTransferOrderService.get(id);
		if(gto.getStatus()==1){
		this.goodsTransferOrderService.delete(id);
		operateLogService.insert("delete","调拨单 ->删除: 调拨单号="+gto.getOrderNo(),sessionUser.getUserId(),"库存管理","调拨单");
		attr.addFlashAttribute("successMessage", "g.tips.success");
		}else{
		attr.addFlashAttribute("errorMessage",gto.getOrderNo()+":末审核调拨单才能删除操作");	
		}
		return "redirect:/allocateOrder/list";
	}
	
	
	@RequestMapping("pageJson")
	@ResponseBody
	public DataTableResponse<GoodsTransferOrder> GoodsTransferOrderPageJson(@RequestBody DataTableRequest<GoodsTransferOrderParam> dtr) {
		PageRequest pageRequest = WebHelper.assemblePageRequest(dtr);
		Page<GoodsTransferOrder> page = this.goodsTransferOrderService.findPage(pageRequest,dtr.getParams());
		return WebHelper.assembleDataTableResponse(dtr, page);
	}
	

猜你喜欢

转载自anlinko.iteye.com/blog/2316107