Browse Source

客户打样申请页打样调整,详情页加入打样操作;
客户打样申请修改为可以多次送样;
客户模具询价,uas上传的附件,在b2b没有显示问题处理;
客户认定单增加合格、不合格分类选项。

git-svn-id: svn+ssh://10.10.101.21/source/platform/platform-b2b@8820 f3bf4e98-0cf0-11e4-a00c-a99a8b9d557d

dongbw 9 years ago
parent
commit
326d091878

+ 97 - 25
src/main/java/com/uas/platform/b2b/controller/SaleSampleController.java

@@ -1,29 +1,6 @@
 package com.uas.platform.b2b.controller;
 
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Sort.Direction;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.stereotype.Controller;
-import org.springframework.util.CollectionUtils;
-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.uas.platform.b2b.model.Attach;
-import com.uas.platform.b2b.model.FileUpload;
-import com.uas.platform.b2b.model.PurchaseProofingApproval;
-import com.uas.platform.b2b.model.PurchaseProofingItem;
-import com.uas.platform.b2b.model.PurchaseProofingSend;
-import com.uas.platform.b2b.model.SearchFilter;
+import com.uas.platform.b2b.model.*;
 import com.uas.platform.b2b.search.SearchService;
 import com.uas.platform.b2b.service.AttachService;
 import com.uas.platform.b2b.service.PurchaseProofingService;
@@ -42,6 +19,23 @@ import com.uas.search.b2b.model.SPage;
 import com.uas.search.b2b.model.Sort;
 import com.uas.search.b2b.model.Sort.Type;
 import com.uas.search.b2b.util.SearchConstants;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.util.CollectionUtils;
+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 java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 
 /**
  * 卖家获取对应的客户打样申请单
@@ -219,7 +213,7 @@ public class SaleSampleController {
 	}
 
 	/**
-	 * 作为卖家,分页获取客户的打样认定单
+	 * 作为卖家,分页获取客户的打样认定单(全部)
 	 * 
 	 * @param json
 	 * @return
@@ -256,6 +250,84 @@ public class SaleSampleController {
 		return searchService.searchPurchaseProofingApprovalIds(keyword, pageParams);
 	}
 
+	/**
+	 * 作为卖家,分页获取客户的打样认定单(合格)
+	 *
+	 * @param json
+	 * @return
+	 */
+	@RequestMapping(value = "/approval", params = RequestState.AGREED, method = RequestMethod.GET)
+	@ResponseBody
+	public SPage<PurchaseProofingApproval> getQualifiedProofingApprovals(PageParams params, String keyword, Long fromDate,
+																Long endDate) {
+		logger.log("客户认定单", "查看所有客户认定单");
+		// 判断当前用户是否被客户分配
+		com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, null);
+		pageParams.getFilters().put("psa_venduu", SystemSession.getUser().getEnterprise().getUu());
+		pageParams.getFilters().put("psa_finalresult", "合格");
+		SearchFilter filter = userService.distribute();
+		if (filter != null && filter.getDistribute() == null) {
+			return null;
+		}
+		if (filter != null && !CollectionUtils.isEmpty(filter.getDistribute())) {
+			List<Object> list = new ArrayList<>();
+			for (Object object : filter.getDistribute()) {
+				list.add(object);
+			}
+			pageParams.getFilters().put("psa_enuu", new MultiValue(list, true));
+		}
+		if (fromDate != null) {
+			pageParams.getFilters().put(SearchConstants.FROM_DATE_KEY, fromDate);
+		}
+		if (endDate != null) {
+			pageParams.getFilters().put(SearchConstants.END_DATE_KEY, endDate);
+		}
+		List<Sort> sortList = new ArrayList<>();
+		sortList.add(new Sort("psa_indate", false, Type.LONG, new Long(946659661)));
+		sortList.add(new Sort("psa_id", false, Type.LONG, new Long(1)));
+		pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
+		return searchService.searchPurchaseProofingApprovalIds(keyword, pageParams);
+	}
+
+	/**
+	 * 作为卖家,分页获取客户的打样认定单(不合格)
+	 *
+	 * @param json
+	 * @return
+	 */
+	@RequestMapping(value = "/approval", params = RequestState.REFUSED, method = RequestMethod.GET)
+	@ResponseBody
+	public SPage<PurchaseProofingApproval> getUnqualifiedProofingApprovals(PageParams params, String keyword, Long fromDate,
+																Long endDate) {
+		logger.log("客户认定单", "查看所有客户认定单");
+		// 判断当前用户是否被客户分配
+		com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, null);
+		pageParams.getFilters().put("psa_venduu", SystemSession.getUser().getEnterprise().getUu());
+		pageParams.getFilters().put("psa_finalresult", "不合格");
+		SearchFilter filter = userService.distribute();
+		if (filter != null && filter.getDistribute() == null) {
+			return null;
+		}
+		if (filter != null && !CollectionUtils.isEmpty(filter.getDistribute())) {
+			List<Object> list = new ArrayList<>();
+			for (Object object : filter.getDistribute()) {
+				list.add(object);
+			}
+			pageParams.getFilters().put("psa_enuu", new MultiValue(list, true));
+		}
+		if (fromDate != null) {
+			pageParams.getFilters().put(SearchConstants.FROM_DATE_KEY, fromDate);
+		}
+		if (endDate != null) {
+			pageParams.getFilters().put(SearchConstants.END_DATE_KEY, endDate);
+		}
+		List<Sort> sortList = new ArrayList<>();
+		sortList.add(new Sort("psa_indate", false, Type.LONG, new Long(946659661)));
+		sortList.add(new Sort("psa_id", false, Type.LONG, new Long(1)));
+		pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
+		return searchService.searchPurchaseProofingApprovalIds(keyword, pageParams);
+	}
+
 	/**
 	 * 作为卖家,根据ID获取客户的打样认定单详细界面
 	 * 

+ 0 - 4
src/main/java/com/uas/platform/b2b/erp/controller/InquiryMouldController.java

@@ -1,6 +1,5 @@
 package com.uas.platform.b2b.erp.controller;
 
-import com.alibaba.fastjson.JSON;
 import com.uas.platform.b2b.erp.model.InquiryMould;
 import com.uas.platform.b2b.erp.model.InquiryMouldDecide;
 import com.uas.platform.b2b.erp.service.InquiryMouldService;
@@ -62,7 +61,6 @@ public class InquiryMouldController {
 		String jsonStr = URLDecoder.decode(data, "UTF-8");
 		List<InquiryMould> inquirieymoulds = FlexJsonUtils.fromJsonArray(jsonStr, InquiryMould.class);
 		purchaseInquiryMouldService.save(inquiryMouldService.convertInquiryMould(inquirieymoulds));
-		System.out.println("单据写回平台" + JSON.toJSONString(inquirieymoulds));
 		logger.log("询价单", "上传询价单", inquirieymoulds.size());
 	}
 
@@ -102,7 +100,6 @@ public class InquiryMouldController {
 	public List<InquiryMould> getReply() {
 		List<InquiryMould> moulds = inquiryMouldService
 				.convertPurchaseInquiryMouldReply(purchaseInquiryMouldService.findNotUploadReply());
-		System.out.println("待上传的报价单" + JSON.toJSONString(purchaseInquiryMouldService.findNotUploadReply()));
 		if (moulds != null) {
 			logger.log("询价单", "下载询价单报价结果", moulds.size());
 		}
@@ -147,7 +144,6 @@ public class InquiryMouldController {
 	public void onInvalid(@RequestParam("data") String data) throws UnsupportedEncodingException {
 		String jsonStr = URLDecoder.decode(data, "UTF-8");
 		List<InquiryMould> inquiryMoulds = FlexJsonUtils.fromJsonArray(jsonStr, InquiryMould.class);
-		System.out.println("作废的模具询价单传到平台" + JSON.toJSONString(inquiryMoulds));
 		for (InquiryMould inquiryMould : inquiryMoulds) {
 			// 因为存在还未报价就作废单据的情况,所以不能用b2b_im_id,而用in_id来查找单据
 			if (null != inquiryMould.getIn_id()) {

+ 21 - 21
src/main/java/com/uas/platform/b2b/erp/model/InquiryMould.java

@@ -1,19 +1,14 @@
 package com.uas.platform.b2b.erp.model;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.commons.collections.CollectionUtils;
-
 import com.alibaba.dubbo.common.utils.StringUtils;
 import com.uas.platform.b2b.model.EnterpriseInfo;
 import com.uas.platform.b2b.model.PurchaseInquiryMould;
 import com.uas.platform.b2b.model.PurchaseInquiryMouldItem;
 import com.uas.platform.b2b.support.SystemSession;
 import com.uas.platform.core.model.Status;
+import org.apache.commons.collections.CollectionUtils;
+
+import java.util.*;
 
 /**
  * 买家ERP系统的模具询价单
@@ -138,11 +133,6 @@ public class InquiryMould {
 	 */
 	private String in_sendstatus;
 
-	/**
-	 * 附件
-	 */
-	private String in_attach;
-
 	/**
 	 * 模具询价明细
 	 */
@@ -161,6 +151,8 @@ public class InquiryMould {
 
 	private Long b2b_im_id;
 
+	private List<Attach> attaches;
+
 	public Long getIn_id() {
 		return in_id;
 	}
@@ -340,14 +332,6 @@ public class InquiryMould {
 		this.in_recorderid = in_recorderid;
 	}
 
-	public String getIn_attach() {
-		return in_attach;
-	}
-
-	public void setIn_attach(String in_attach) {
-		this.in_attach = in_attach;
-	}
-
 	public String getIn_checksendStatus() {
 		return in_checksendStatus;
 	}
@@ -380,6 +364,14 @@ public class InquiryMould {
 		this.in_status = in_status;
 	}
 
+	public List<Attach> getAttaches() {
+		return attaches;
+	}
+
+	public void setAttaches(List<Attach> attaches) {
+		this.attaches = attaches;
+	}
+
 	/**
 	 * 转为平台的模具询价
 	 * 
@@ -438,6 +430,14 @@ public class InquiryMould {
 			}
 			inquiryMould.setInquiryMouldItems(inquiryMouldItems);
 		}
+		if (!CollectionUtils.isEmpty(this.attaches)) {
+			Set<com.uas.platform.b2b.model.Attach> b2bAttaches = new HashSet<com.uas.platform.b2b.model.Attach>();
+			for(Attach attach : this.attaches) {
+				com.uas.platform.b2b.model.Attach b2bAttach = attach.convertToB2bAttach("客户模具询价单附件");
+				b2bAttaches.add(b2bAttach);
+			}
+			inquiryMould.setAttachs(b2bAttaches);
+		}
 		return inquiryMould;
 	}
 

+ 7 - 42
src/main/java/com/uas/platform/b2b/model/PurchaseInquiryMould.java

@@ -1,30 +1,14 @@
 package com.uas.platform.b2b.model;
 
-import java.io.Serializable;
-import java.util.Date;
-import java.util.Set;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
-import javax.persistence.OrderBy;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
-
-import org.hibernate.annotations.ForeignKey;
-import org.hibernate.annotations.Where;
-
 import com.uas.platform.b2b.core.util.DateUtils;
 import com.uas.platform.core.model.Constant;
 import com.uas.platform.core.model.Status;
 
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Set;
+
 /**
  * 模具询价
  * 
@@ -250,10 +234,8 @@ public class PurchaseInquiryMould implements Serializable {
 	/**
 	 * 附件
 	 */
-	@OneToMany(fetch = FetchType.EAGER)
-	@JoinColumn(name = "rel_key", insertable = false, updatable = false)
-	@ForeignKey(name = "none")
-	@Where(clause = "rel_table = 'purc$inquirymould'")
+	@OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
+	@JoinTable(name = "purc$inquirymouldattach", joinColumns = @JoinColumn(name = "im_id", referencedColumnName = "im_id"), inverseJoinColumns = @JoinColumn(name="at_id", referencedColumnName = "at_id"))
 	private Set<Attach> attachs;
 
 	/**
@@ -270,15 +252,6 @@ public class PurchaseInquiryMould implements Serializable {
 	@OrderBy("detno")
 	private Set<PurchaseInquiryMouldItem> inquiryMouldItems;
 
-	// /**
-	// * 询价物料明细
-	// */
-	// @OneToMany(mappedBy = "inquiryMould", cascade = { CascadeType.REFRESH,
-	// CascadeType.PERSIST, CascadeType.REMOVE,
-	// CascadeType.MERGE }, fetch = FetchType.EAGER)
-	// @OrderBy("detno")
-	// private Set<PurchaseInquiryMouldDetail> inquiryMouldDetails;
-
 	/**
 	 * 是否过期(0未过期,1已过期)(表中的im_overdue字段只是search项目过滤时报错时建立,无实际意义也不会赋值,
 	 * 只是用于搜索项目对是否已过期的判断,这里使用视图中的im_overdue来做其他操作)
@@ -286,14 +259,6 @@ public class PurchaseInquiryMould implements Serializable {
 	@Column(name = "im_overdue", insertable = false, updatable = false)
 	private Short overdue;
 
-	// /**
-	// * 报价明细
-	// */
-	// @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
-	// @JoinColumn(name = "mr_imid")
-	// @OrderBy("id")
-	// private Set<PurchaseInquiryMouldReply> replies;
-
 	public Long getId() {
 		return id;
 	}

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

@@ -5711,7 +5711,8 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
 		}
 	}]);
 	
-	app.controller('SaleSampleDetailCtrl', ['$scope', '$stateParams', 'PurcSample', 'toaster', 'ReportService', function($scope, $stateParams, PurcSample, toaster, ReportService){
+	app.controller('SaleSampleDetailCtrl', ['$scope', '$stateParams', 'PurcSample', 'toaster', '$modal', 'BaseService', function($scope, $stateParams, PurcSample, toaster, $modal, BaseService){
+        BaseService.scrollBackToTop();
 		var loading = true;
 		var loadData = function() {
 			PurcSample.get({id: $stateParams.id}, function(data){
@@ -5737,6 +5738,24 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
 			});
 		};
 		loadData();
+
+        $scope.openSend = function(index, sample) {
+            var modalInstance = $modal.open({
+                animation: true,
+                templateUrl: 'static/tpl/index/sale/sample_send.html',
+                controller: 'SampleSendCtrl',
+                resolve: {
+                    sampleItem: function(){return sample;}
+                }
+            });
+
+            modalInstance.result.then(function(){
+                toaster.pop('info', '提示', '送样成功');
+                $scope.tableParams.reload();
+            }, function(){
+
+            });
+        };
 	}]);
 	
 	/**
@@ -5791,6 +5810,22 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
 						params.total(page.totalElement);
 						$defer.resolve(page.content);
 						$scope.keywordXls = angular.copy($scope.keyword);//保存当前取值的关键词
+                        angular.forEach(page.content, function(proofing) { // 为了支持多次送样,读取列表的时候获取送样信息作为比较依据
+                            if( !proofing.send) {
+                                proofing.getSendInfo = '加载中...';
+                                PurcSample.getSend({id: proofing.id}, function(data){
+                                    if(data) {
+                                        proofing.getSendInfo = null;
+                                        proofing.send = data;
+                                    } else {
+                                        proofing.getSendInfo = '无送样信息';
+                                        proofing.send = '无送样信息';
+                                    }
+                                }, function(response){
+                                    proofing.getSendInfo = '加载失败!';
+                                });
+                            }
+                        });
 					}
 				}, function(response){
 					$scope.loading = false;
@@ -5853,8 +5888,16 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
 	}]);
 	
 	app.controller('SampleSendCtrl', ['$scope', '$modalInstance', 'sampleItem', 'PurcSample', '$upload', 'toaster', function($scope, $modalInstance, sampleItem, PurcSample, $upload, toaster){
-		$scope.sampleItem = sampleItem;
-		$scope.sampleItem.sampleSend = $scope.sampleItem.sampleSend || {};
+        if( !sampleItem.send) {
+            PurcSample.getSend({id: sampleItem.id}, function(data){
+                if(data) {
+                    sampleItem.send = data; // 获取送样信息
+                }
+            }, function(response){
+            });
+        }
+        $scope.sampleItem = sampleItem;
+        $scope.sampleItem.sampleSend = $scope.sampleItem.sampleSend || {};
 		
 		//确认送样
 		$scope.ok = function (form) {

+ 11 - 1
src/main/webapp/resources/js/index/services/Purc.js

@@ -509,7 +509,17 @@ define([ 'ngResource'], function() {
 			getItem: {
 				url: 'sale/sample/approval/:id',
 				method: 'GET',
-			}
+			},
+			getAgreed: {
+                params: {
+                    _state: 'agreed'
+                }
+            },
+            getRefused: {
+                params: {
+                    _state: 'refused'
+                }
+            }
 		});
 	}]).factory('PurcOrderItemHis', ['$resource', function($resource) {
 		return $resource('sale/orders/history/items', {}, {

+ 20 - 0
src/main/webapp/resources/tpl/index/sale/approval.html

@@ -136,6 +136,26 @@
 	<div class="loading in" ng-class="{'in': loading}">
 		<i></i>
 	</div>
+	<div class="menu 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('agreed')">合格</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('refused')">不合格</button>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
 	<div class="condition block">
 		<div class="search-bg condition block">
 			<div class="row">

+ 2 - 2
src/main/webapp/resources/tpl/index/sale/inquiry.html

@@ -311,10 +311,10 @@
 					备注:{{::inquiryItem.remark}}
 				</div>
 				<div ng-if="inquiryItem.inquiry.attachs.length" class="text-muted">
-					附件:<a class="file" ng-repeat="attach in inquiryItem.inquiry.attachs" href="file/{{attach.id}}">{{::attach.name}}</a>
+					附件:<a class="file" ng-repeat="attach in inquiryItem.inquiry.attachs" target="_blank" href="file/{{attach.id}}">{{::attach.name}}</a>
 				</div>
 				<div ng-if="inquiryItem.attaches.length && !inquiryItem.$editing" class="text-muted">
-					报价附件:<a class="file" ng-repeat="attach in inquiryItem.attaches" href="file/{{attach.id}}">{{::attach.name}}</a>
+					报价附件:<a class="file" ng-repeat="attach in inquiryItem.attaches" target="_blank" href="file/{{attach.id}}">{{::attach.name}}</a>
 				</div>
 				<div class="form-group" ng-if="inquiryItem.$editing" style="width: 180px;">
 					<input type="text" class="form-control input-xs"

+ 36 - 36
src/main/webapp/resources/tpl/index/sale/inquiry_mould.html

@@ -172,47 +172,47 @@ tbody td div.text-mould {
 		<i></i>
 	</div>
 	<div class="menu 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 class="btn-group btn-group-sm">
-							<button type="button" class="btn btn-default btn-line"
-								ng-class="{'btn-info':active=='end'}" ng-click="setActive('end')">已过期</button>
-						</div>
-						<div class="btn-group btn-group-sm">
-							<button type="button" class="btn btn-default btn-line"
-								ng-class="{'btn-info':active=='invalid'}" ng-click="setActive('invalid')">已作废</button>
-						</div>
+		<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>
-				<!--<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 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 class="btn-group btn-group-sm">
+						<button type="button" class="btn btn-default btn-line"
+							ng-class="{'btn-info':active=='end'}" ng-click="setActive('end')">已过期</button>
+					</div>
+					<div class="btn-group btn-group-sm">
+						<button type="button" class="btn btn-default btn-line"
+							ng-class="{'btn-info':active=='invalid'}" ng-click="setActive('invalid')">已作废</button>
 					</div>
 				</div>
-				<div class="col-xs-1">
-					<div class="text-default f14 total">
-						共 <span ng-bind="tableParams.total()" class="text-num"></span>
+			</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>
+			<div class="col-xs-1">
+				<div class="text-default f14 total">
+					共 <span ng-bind="tableParams.total()" class="text-num"></span>
+				</div>
+			</div>-->
 		</div>
+	</div>
 	<div class="height10">&nbsp;</div>
 	<div class="condition block">
 		<div class="search-bg condition block">
@@ -438,7 +438,7 @@ tbody td div.text-mould {
 						</div>
 					</div>
 					<div ng-if="inquiryMould.attachs.length" class="text-muted">
-						附件:<a class="file" ng-repeat="attach in inquiryMould.attachs" href="file/{{attach.id}}">{{::attach.name}}</a>
+						附件:<a class="file" ng-repeat="attach in inquiryMould.attachs" target="_blank" href="file/{{attach.id}}">{{::attach.name}}</a>
 					</div>
 				<!-- 	<div ng-if="inquiryMould.$editing && inquiryMould.attachs.length" class="text-muted">
 						附件:<a class="file" ng-repeat="attach in inquiryMould.attachs" href="" title="编辑报价时无法获取附件">{{::attach.name}}</a>

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

@@ -94,7 +94,7 @@ tbody td .text-waiting {
 				</div>
 				<div class="title" ng-bind="::file.name"></div>
 				<div class="download">
-					<a href="file/{{file.id}}">下载</a>
+					<a target="_blank" href="file/{{file.id}}">下载</a>
 				</div>
 			</div>
 		</div>

+ 6 - 1
src/main/webapp/resources/tpl/index/sale/sample.html

@@ -370,7 +370,7 @@
 
 			</td>
 			<td class="br-l text-center">
-				<div class="operates" ng-show="sample.status == 401">
+				<div ng-show="sample.status == 401">
 					<a ng-click="openSend($index, sample)" class="text-muted" title="送样">
 						<i class="fa fa-paper-plane fa-lg fa-fw"></i><br>
 						送样
@@ -379,6 +379,11 @@
 				<div ng-if="sample.status == 400" class="block">
 					<span class="text-trans success">已送样</span>
 				</div>
+				<div ng-if="sample.status == 400 && sample.qty > sample.send.sendQty" style="margin-top: 40px;">
+					<a ng-click="openSend($index, sample)" class="text-muted" title="送样">
+						送样
+					</a>
+				</div>
 			</td>
 		</tr>
 	</tbody>

+ 18 - 0
src/main/webapp/resources/tpl/index/sale/sample_detail.html

@@ -76,6 +76,8 @@
 						<th width="120">交货日期</th>
 						<th width="110">送样人</th>
 						<th width="140">附加信息</th>
+						<th width="100" ng-show="sample.status == 401">操作</th>
+						<th width="100" ng-show="sample.status == 400">状态</th>
 					</tr>
 				</thead>
 				<tbody>
@@ -119,6 +121,22 @@
 								</div>
 							</div>
 						</td>
+						<td class="text-center">
+							<div ng-show="sample.status == 401">
+								<a ng-click="openSend($index, sample)" class="text-muted" title="送样">
+									<i class="fa fa-paper-plane fa-lg fa-fw"></i><br>
+									送样
+								</a>
+							</div>
+							<div ng-if="sample.status == 400" class="block">
+								<span class="text-trans success">已送样</span>
+							</div>
+							<div ng-if="sample.status == 400 && sample.qty > sample.send.sendQty" style="margin-top: 40px;" >
+								<a ng-click="openSend($index, sample)" class="text-muted" title="送样">
+									送样
+								</a>
+							</div>
+						</td>
 					</tr>
 				</tbody>
 			</table>

+ 2 - 2
src/main/webapp/resources/tpl/index/sale/sample_send.html

@@ -88,10 +88,10 @@
 			<label class="col-md-2 col-sm-2 col"><strong
 					class="text-inverse">*</strong>数量:</label>
 			<div class="col-md-4 col-sm-4 col input-group"
-				 ng-init="sampleItem.sampleSend.sendQty = sampleItem.qty">
+				 ng-init="sampleItem.sampleSend.sendQty = sampleItem.qty - (sampleItem.send.sendQty || 0)">
 				<input ng-model="sampleItem.sampleSend.sendQty" required placeholder="必填,整数"
 					   class="form-control input-sm" type="number"
-					   max="{{sampleItem.qty}}" min="0"> <span
+					   max="{{sampleItem.qty}} - {{(sampleItem.send.sendQty || 0)}}" min="0"> <span
 					style="width: 30px;" class="input-group-addon">{{sampleItem.proofing.product.unit}}</span>
 			</div>
 			<label class="col-md-2 col-sm-2 col">单重:</label>