From d6c65a4e3d1ca7d9a7bd6806c99fee035d0a44eb Mon Sep 17 00:00:00 2001
From: 李宇 <986321569@qq.com>
Date: 星期三, 27 一月 2021 16:54:34 +0800
Subject: [PATCH] 合并

---
 src/main/java/com/nanometer/smartlab/service/OpeApplyService.java                |    2 
 src/main/webapp/warehouse_reagent_use.xhtml                                      |   64 +
 src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.xml              |  100 ++
 src/main/java/com/nanometer/smartlab/dao/OpeUseFlowDao.xml                       |   49 +
 src/main/webapp/resources/template/试剂导入模板.xlsx                                   |    0 
 src/main/java/com/nanometer/smartlab/dao/OpeApplyDao.xml                         |   11 
 src/main/webapp/reagent_mng.xhtml                                                |    4 
 src/main/java/com/nanometer/smartlab/controller/OpeUseFlowInfoController.java    |   67 +
 src/main/java/com/nanometer/smartlab/entity/OpeWarehouseReserve.java             |   22 
 src/main/java/com/nanometer/smartlab/entity/OpeApply.java                        |   31 
 src/main/java/com/nanometer/smartlab/entity/OpeApplyReserve.java                 |   45 
 src/main/java/com/nanometer/smartlab/entity/OpeUseFlow.java                      |    9 
 src/main/webapp/order_mng_ruku.xhtml                                             |    2 
 src/main/java/com/nanometer/smartlab/controller/WarehouseStockMngController.java |  669 ++++++++++++++-----
 src/main/webapp/resources/css/default.css                                        |    8 
 src/main/java/com/nanometer/smartlab/dao/OpeReagentStatusDao.java                |    2 
 src/main/webapp/project_mng.xhtml                                                |    6 
 src/main/java/com/nanometer/smartlab/dao/OpeReagentStatusDao.xml                 |   16 
 src/main/java/com/nanometer/smartlab/exception/ExceptionEnumCode.java            |    3 
 src/main/webapp/reagent_user_flow_info.xhtml                                     |  127 +++
 src/main/webapp/order_input_warehouse.xhtml                                      |    2 
 src/main/java/com/nanometer/smartlab/service/OpeReagentStatusServiceImpl.java    |  135 +++
 src/main/java/com/nanometer/smartlab/service/OpeApplyServiceImpl.java            |    7 
 src/main/webapp/resources/template/耗材导入模板.xlsx                                   |    0 
 src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.java             |   10 
 src/main/java/com/nanometer/smartlab/service/OpeUseFlowService.java              |   13 
 src/main/webapp/warehouse_reagent_use_person.xhtml                               |  241 ++++++
 src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveService.java     |   16 
 src/main/java/com/nanometer/smartlab/dao/OpeUseFlowDao.java                      |    6 
 src/main/java/com/nanometer/smartlab/service/OpeUseFlowServiceImpl.java          |   99 ++
 src/main/java/com/nanometer/smartlab/service/OpeReagentStatusService.java        |    5 
 src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveServiceImpl.java |  326 ++++++++
 32 files changed, 1,797 insertions(+), 300 deletions(-)

diff --git a/src/main/java/com/nanometer/smartlab/controller/OpeUseFlowInfoController.java b/src/main/java/com/nanometer/smartlab/controller/OpeUseFlowInfoController.java
index fb59033..989d1a1 100644
--- a/src/main/java/com/nanometer/smartlab/controller/OpeUseFlowInfoController.java
+++ b/src/main/java/com/nanometer/smartlab/controller/OpeUseFlowInfoController.java
@@ -1,13 +1,21 @@
 package com.nanometer.smartlab.controller;
 
+import java.text.SimpleDateFormat;
 import java.util.*;
 
 import javax.annotation.Resource;
 
+import com.nanometer.smartlab.entity.SysUser;
+import com.nanometer.smartlab.entity.dto.ApplyListDto;
+import com.nanometer.smartlab.service.SysUserService;
+import com.nanometer.smartlab.util.Utils;
 import org.apache.log4j.Logger;
+import org.primefaces.context.RequestContext;
 import org.primefaces.model.LazyDataModel;
 import org.primefaces.model.SortOrder;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Scope;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Controller;
 
 import com.nanometer.smartlab.entity.OpeUseFlow;
@@ -37,6 +45,8 @@
 
 	private Date endDate;
 
+	private Hashtable printTable;
+
 	public String getHouseName() {
 		return houseName;
 	}
@@ -45,11 +55,18 @@
 		this.houseName = houseName;
 	}
 
+	@Value("${institute.name}")
+	String instituteName;
+
 	@Resource
 	private OpeUseFlowService opeUseFlowService;
 
 	@Resource
 	private SysReagentService sysReagentService;
+
+	@Resource
+	private SysUserService sysUserService;
+
 
 	private List<SysReagent> reagentSelectList;
 
@@ -132,7 +149,48 @@
 		this.reagentCode = reagentCode;
 	}
 
+	/**
+	 * 生成领用单
+	 */
+	public void generateRecipients(OpeUseFlow ouf) {
+		String receiptNumber = ouf.getReceiptNumber();
+		String code = ouf.getReagentCode();
+		//id:个数
+		Map<String, Integer> printInfo = opeUseFlowService.getRegentInfoFromReceiptNumber(receiptNumber);
+		//无法得到当时的领用单的领用人,试剂状态表没有存入,userId会随时变化
+		printTable = null;
+		Integer sum = 0;
+		printTable = new Hashtable();
+		List<ApplyListDto> applyList = new ArrayList<>();
+		//获取当时操作状态为领取的人员
+		Map<String,String>  info= opeUseFlowService.getApplyUserByReagentCode(code);
+		Map applyPersonInfo = sysUserService.getUser(info.get("user_id"));
+		printTable.put("head", instituteName);
+		printTable.put("title", "领用单");
+		printTable.put("applyPerson", applyPersonInfo.get("name"));
+		printTable.put("department", applyPersonInfo.get("meta_value"));
+		String time = new SimpleDateFormat("yyyy-MM-dd").format(info.get("create_time"));
+		printTable.put("date", time);
+		printTable.put("phone", applyPersonInfo.get("phone"));
 
+		printTable.put("receiptNumber", receiptNumber);
+		for (Map.Entry<String, Integer> map  : printInfo.entrySet()) {
+			ApplyListDto lis = new ApplyListDto();
+			Map reagentDetail = sysReagentService.getReagentDetail(map.getKey());
+			lis.setNum(map.getValue().toString()); //数量
+			lis.setMainMetering(String.format("%s%s", reagentDetail.get("main_metering"), reagentDetail.get("unit")));
+			lis.setControlProducts((String) reagentDetail.get("controlProducts"));
+			lis.setProductName((String) reagentDetail.get("name"));
+			lis.setReagentFormat((String) reagentDetail.get("reagentFormat"));
+			lis.setProductCode((String)reagentDetail.get("productCode"));
+			lis.setMemo((String)reagentDetail.get("memo"));
+			applyList.add(lis);
+			sum += map.getValue();
+		}
+		applyList.add(new ApplyListDto("合计", "", "", "", "", String.valueOf(sum), ""));
+		printTable.put("applyList", applyList);
+
+	}
 	public Date getStartDate() {
 		if (null == startDate){
 			Date now = new Date();
@@ -160,4 +218,13 @@
 	public void setEndDate(Date endDate) {
 		this.endDate = endDate;
 	}
+
+
+	public Hashtable getPrintTable() {
+		return printTable;
+	}
+
+	public void setPrintTable(Hashtable printTable) {
+		this.printTable = printTable;
+	}
 }
diff --git a/src/main/java/com/nanometer/smartlab/controller/WarehouseStockMngController.java b/src/main/java/com/nanometer/smartlab/controller/WarehouseStockMngController.java
index b4d60ae..c7697d0 100644
--- a/src/main/java/com/nanometer/smartlab/controller/WarehouseStockMngController.java
+++ b/src/main/java/com/nanometer/smartlab/controller/WarehouseStockMngController.java
@@ -1,15 +1,12 @@
 package com.nanometer.smartlab.controller;
 
+import com.nanometer.smartlab.dao.BaseMetaDao;
 import com.nanometer.smartlab.dao.OpeApplyDao;
 import com.nanometer.smartlab.dao.OpeReagentStatusDao;
 import com.nanometer.smartlab.dao.OpeWarehouseReserveDao;
 import com.nanometer.smartlab.entity.*;
 import com.nanometer.smartlab.entity.dto.ApplyListDto;
-import com.nanometer.smartlab.entity.enumtype.ApplyStatusVo;
-import com.nanometer.smartlab.entity.enumtype.ApplyStatus;
-import com.nanometer.smartlab.entity.enumtype.ArrivalStatus;
-import com.nanometer.smartlab.entity.enumtype.SeeFlag;
-import com.nanometer.smartlab.entity.enumtype.ValidFlag;
+import com.nanometer.smartlab.entity.enumtype.*;
 import com.nanometer.smartlab.exception.BusinessException;
 import com.nanometer.smartlab.exception.ExceptionEnumCode;
 import com.nanometer.smartlab.service.*;
@@ -42,6 +39,7 @@
 import java.math.BigInteger;
 import java.net.URLEncoder;
 import java.sql.Timestamp;
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
@@ -73,6 +71,8 @@
 	private SysSupplierService sysSupplierService;
 	@Resource
 	private OpeOrderService opeOrderService;
+	@Resource
+	private BaseMetaDao baseMetaDao;
 
 	@Resource
 	private MenuController menuController;
@@ -123,6 +123,20 @@
 	 * 打开条形码对话框用
 	 */
 	private List<OpeReagentStatus> reagentStatusSelectListForPerson;
+	/**
+	 *打开条形码对话框用
+	 */
+	private Map<String,Map<String,OpeWarehouseReserve>> warehouseReserveUseTmp=new HashMap<>();
+	/**
+	 * 打开条形码对话框用
+	 */
+	private List<OpeWarehouseReserve> warehouseReserveList = new ArrayList<>();
+
+	/**
+	 * 打开条形码对话框用
+	 */
+	private OpeWarehouseReserve opeWarehouseReserve = new OpeWarehouseReserve();
+
 
 	public List<OpeReagentStatus> getReagentStatusSelectListForPerson() {
 		return reagentStatusSelectListForPerson;
@@ -200,7 +214,8 @@
 	private String supplierId;
 	private List<SysSupplier> supplierSelectList;
 	//private boolean flag = false;
-
+	//领用单号
+	private String receiptNumber;
 	// 试剂库
     private LazyDataModel<SysReagent> reagentDataModel;
 	// 直接入库试剂List
@@ -612,10 +627,26 @@
 	}
 //
 	public void onUseBtnClickOrderTmp(){
+		warehouseReserveUseTmp = new HashMap<>();
+		opeWarehouseReserve = new OpeWarehouseReserve();
 		if (selectedTmpOrderList == null || selectedTmpOrderList.size()<=0){
 			FacesUtils.info("至少选择一个");
 			return;
 		}
+
+
+		//相同的试剂不能再多选
+		Set<String> checkTable = new HashSet<>();
+		for (OpeApplyReserve oar : selectedTmpOrderList) {
+			String reagentId = oar.getReagent().getId();
+			if (!checkTable.contains(reagentId)) {
+				checkTable.add(reagentId);
+			}else{
+				FacesUtils.info("相同试剂不能重复选择");
+				return;
+			}
+		}
+		checkTable = null;
 
 		this.menuController.goToPage(Constants.PAGE_WAREHOUSE_REAGENT_USE_NEW_PERSON, Constants.PAGE_WAREHOUSE_STOCK_MNG);
 	}
@@ -675,9 +706,161 @@
 
 		// 根据选择的试剂获取对应的条形码
 		initReagentStatusSelectListForPerson();
+		//初始化试剂库存所在仓库仓库
+		this.warehouseReserveList = opeWarehouseReserveService.selectWarehouseByReagentIdAndArticleNumber(selectedOpeApplyReserve.getReagent().getId(),selectedOpeApplyReserve.getArticleNumber(),true);
+		//初始化第一个库存
+		if (warehouseReserveList.size()>0)
+			selectChangeReserve(warehouseReserveList.get(0).getWarehouseId());
+		//初始化条形码,通过applyReserve保存的条码显示对应试剂的条码
+		for (OpeApplyReserve oar : selectedTmpOrderList) {
+			if (oar.getReagent().getId().equals(opeWarehouseReserve.getReagentId())) {
+				this.endReagentCodeForPerson = oar.getEndReagentCode2();
+				this.startReagentCodeForPerson = oar.getStartReagentCode2();
+			}
+		}
+		if (warehouseReserveUseTmp.get(selectedOpeApplyReserve.getReagent().getId()) == null) {
+			//初始化库中领用和大小,
+			reagentCodeSelectedList = selectedOpeApplyReserve.getReagentCode();
+			useNum = selectedOpeApplyReserve.getReagentCode() == null?0: selectedOpeApplyReserve.getReagentCode().size();
+			this.endReagentCodeForPerson = null;
+			this.startReagentCodeForPerson = null;
+		}
 
 		RequestContext.getCurrentInstance().execute("PF('reagentCodeDialogForPerson').show()");
 	}
+	/**
+	* 变换库存
+	*/
+	public void selectChangeReserve(String  id) {
+		if (warehouseReserveList.size() > 0) {
+			warehouseReserveList.forEach(owr -> {
+				if (owr.getWarehouseId().equals(id)){
+					opeWarehouseReserve.setId(owr.getId());
+					opeWarehouseReserve.setWarehouseId(id);
+					opeWarehouseReserve.setWarehouseName(owr.getWarehouseName());
+					opeWarehouseReserve.setReserve(owr.getReserve());
+					opeWarehouseReserve.setReagentId(owr.getReagentId());
+				}
+			});
+		}
+	}
+
+	/**
+	* 补贴条码->添加x仓库的n个试剂
+	*/
+	public void add2() {
+
+		//0.判断该批次是否再仓库有库存
+		if (opeWarehouseReserve.getId() == null) {
+			FacesUtils.warn("没有库存");
+			return;
+		}
+		//1.判断领取数量
+		if (useNum > opeWarehouseReserve.getReserve()) {
+			FacesUtils.warn("领用数量不能超过库存");
+			return;
+		}
+		//2.加入Map
+		OpeWarehouseReserve owr = new OpeWarehouseReserve();
+		owr.setId(opeWarehouseReserve.getId());
+		owr.setWarehouseId(opeWarehouseReserve.getWarehouseId());
+		owr.setWarehouseName(opeWarehouseReserve.getWarehouseName());
+		owr.setReserve(opeWarehouseReserve.getReserve());
+		owr.setReagentId(opeWarehouseReserve.getReagentId());
+		owr.setUseNum(useNum);
+		if (warehouseReserveUseTmp.get(owr.getReagentId()) == null) {
+			Map<String, OpeWarehouseReserve> tmp = new HashMap<>();
+			tmp.put(owr.getWarehouseId(), owr);
+			warehouseReserveUseTmp.put(owr.getReagentId(), tmp);
+		}else{
+			warehouseReserveUseTmp.get(owr.getReagentId()).put(owr.getWarehouseId(), owr);
+		}
+		//变换条码
+		btCodeChange();
+	}
+	
+	/**
+	* 取消一个仓库领取
+	*/
+	public void remove2(OpeWarehouseReserve owr) {
+		if (warehouseReserveUseTmp.get(owr.getReagentId()).size() > 0) {
+			warehouseReserveUseTmp.get(owr.getReagentId()).remove(owr.getWarehouseId());
+			//变换条码
+			btCodeChange();
+		}
+	}
+
+	/**
+	*  获取暂存表单
+	*/
+	public List<OpeWarehouseReserve> getDataTmp() {
+
+		List<OpeWarehouseReserve> list = new ArrayList<>();
+
+
+		Map<String, OpeWarehouseReserve> dataMap = warehouseReserveUseTmp.
+				get(opeWarehouseReserve.getReagentId());
+		if (dataMap ==null) {
+			return list;
+		}
+		Set<Map.Entry<String, OpeWarehouseReserve>> entries = dataMap.entrySet();
+		for (Map.Entry<String, OpeWarehouseReserve> e : entries) {
+			list.add(e.getValue());
+		}
+		return list;
+	}
+	/**
+	* @Description: 补贴结束条码的生成
+	*/
+	public void btCodeChange(){
+		//1.获取补贴试剂总数
+		List<OpeWarehouseReserve> dataTmp = getDataTmp();
+		int distance =  dataTmp.stream().mapToInt(item -> item.getUseNum() == null ? 0 : item.getUseNum()).sum();
+
+		//1.如果开始条码为空,距离为0
+		if (StringUtils.isBlank(startReagentCodeForPerson)
+				|| distance < 1) {
+			return;
+		}
+		//2如果开始条码不为空
+		//2.0如果包含字母不等于24位的直接不管
+		if (startReagentCodeForPerson.matches(".*\\D+.*")) {
+			if (startReagentCodeForPerson.length() ==24 &&
+                    startReagentCodeForPerson.matches(".*([A-F]|\\d)+.*") &&
+                    startReagentCodeForPerson.substring(startReagentCodeForPerson.length() - 5).matches("\\d{5}")){
+				//2.2长度为24位编码的
+				BigInteger arrNum = BigInteger.valueOf(distance);
+				//后5位随机码
+				String randomCode = startReagentCodeForPerson.substring(startReagentCodeForPerson.length() - 5);
+				String reagentCodePrefix = startReagentCodeForPerson.substring(0,startReagentCodeForPerson.length() - 5);
+
+				BigInteger startReagentCodeSuffix = new BigInteger(randomCode);
+				BigInteger endReagentCodeSuffix = startReagentCodeSuffix.add(arrNum).subtract((new BigInteger("1")));
+				String reagentCodeSuffix= autoGenericCode(randomCode, endReagentCodeSuffix);
+				endReagentCodeForPerson = (reagentCodePrefix + reagentCodeSuffix);
+			}else{
+				endReagentCodeForPerson = ("");
+			}
+		}else{
+
+			BigInteger startReagentCode = new BigInteger(startReagentCodeForPerson);
+			//2.1长度不为24位编码
+			//数据1
+			BigInteger arrNum = BigInteger.valueOf(distance);
+			BigInteger code1 = startReagentCode.add(arrNum).subtract(BigInteger.ONE);
+			endReagentCodeForPerson = (autoGenericCode(startReagentCodeForPerson, code1));
+		}
+		//把数据放入applyReserve
+		for (OpeApplyReserve oar : selectedTmpOrderList) {
+			if (oar.getReagent().getId().equals(this.opeWarehouseReserve.getReagentId())) {
+				oar.setEndReagentCode2(endReagentCodeForPerson);
+				oar.setStartReagentCode2(startReagentCodeForPerson);
+			}
+		}
+	}
+
+
+
 
 	public void onYesBtnClickForPerson() {
 		try {
@@ -702,6 +885,9 @@
 			// 将当前选择条形码保存到库存中
 			for (OpeApplyReserve opeApplyReserve : this.selectedTmpOrderList) {
 				if (opeApplyReserve.getId().equals(this.selectedOpeApplyReserve.getId())) {
+					//list OpeWarehouseReserve
+					//getReserve 总数小于 useNum 报错
+
 					OpeWarehouseReserve wa=opeWarehouseReserveService.getOpeWarehouseReserve(opeApplyReserve.getReagent().getId(),opeApplyReserve.getArticleNumber());
 					if(this.useNum > wa.getReserve())
 					{
@@ -714,9 +900,15 @@
 						opeApplyReserve.setReagentCode(this.reagentCodeSelectedList);
 					}
 					opeApplyReserve.setFlag(1);
+					//删除前面部分的补贴条码领用显示
+					warehouseReserveUseTmp.remove(opeApplyReserve.getReagent().getId());
+					endReagentCodeForPerson = null;
+					startReagentCodeForPerson = null;
 					break;
 				}
 			}
+
+
 
 			//FacesUtils.info("选择条形码个数为" + this.reagentCodeSelectedList.size());
 			RequestContext.getCurrentInstance().execute("PF('reagentCodeDialogForPerson').hide()");
@@ -728,98 +920,43 @@
 
 	public void onYesBtnClickForPerson2() {
 		try {
-			//if (this.reagentCodeSelectedList == null || this.reagentCodeSelectedList.size() == 0) {
-			//FacesUtils.warn("请选择条形码。");
-			//return;
-			//}
 
-			if(this.useNum == null || this.useNum <= 0)
-			{
-				FacesUtils.warn("请输入大于0的领用数量!");
+			//1.获取补贴试剂总数,判断数量
+			List<OpeWarehouseReserve> dataTmp = getDataTmp();
+			//distance为领用总数
+			int distance = dataTmp.stream().mapToInt(item -> item.getUseNum() == null ? 0 : item.getUseNum()).sum();
+			if (distance < 1) {
+				FacesUtils.warn("请领取试剂");
 				return;
 			}
-			System.out.println("====onYesBtnClick======");
-			BigDecimal startReagentCode2 = new BigDecimal(startReagentCodeForPerson);
-			BigDecimal endReagentCode2 = new BigDecimal(endReagentCodeForPerson);
-			// 检查条形码结束要大于条形码开始
-			if (endReagentCode2.compareTo(startReagentCode2) == -1) {
-				FacesUtils.warn("条形码开始必须小于条形码结束。");
+			//2.申购单已经领用的数量+当前准备领用的数量不能超过 单子的申请数量
+			if (selectedOpeApplyReserve.getNum() < selectedOpeApplyReserve.getUsed() + distance) {
+				FacesUtils.warn("当前领用数量超过订单的申请数量");
 				return;
 			}
-			// 检查条形码和到货数量是否匹配
-			if (endReagentCode2.subtract(startReagentCode2).intValue() != (useNum - 1)) {
-				FacesUtils.warn("条形码数量和领用数量不一致。");
-				return;
-			}
-
-			BigInteger startReagentCode3=new BigInteger(startReagentCodeForPerson);
-			BigInteger endReagentCode3=new BigInteger(endReagentCodeForPerson);
-			int len = startReagentCodeForPerson.length() - String.valueOf(startReagentCode3).length();
-			String temp = "";
-			for (int i = 0; i < len; i++) {
-				temp += "0";
-			}
-			String str="";
-			for (BigInteger i = startReagentCode3; i.compareTo(endReagentCode3) < 1; i = i.add(BigInteger.ONE)) {
-				String code = temp + String.valueOf(i);
-				OpeReagentStatus status=this.opeReagentStatusService.getOpeReagentStatusByReagentCode(code);
-				if(status==null){
-
-				}else{
-					if(status.getStatus()==ArrivalStatus.WAREHOUSE){
-
-					}else{
-						str+=code+",";
-					}
-				}
-			}
-			if(str!=null && !str.equals("")){
-				FacesUtils.info("条形码"+str.substring(0,str.length()-1)+"已被领用");
-				return;
-			}
-
+			List<String> codeList = opeReagentStatusService
+					.checkReagentCode(startReagentCodeForPerson, endReagentCodeForPerson, distance);
 
 
 			// 将当前选择条形码保存到库存中
-			List<String> codeList=new ArrayList<>();
 			for (OpeApplyReserve opeApplyReserve : this.selectedTmpOrderList) {
 				if (opeApplyReserve.getId().equals(this.selectedOpeApplyReserve.getId())) {
-//					OpeWarehouseReserve wa=opeWarehouseReserveService.getOpeWarehouseReserve(opeApplyReserve.getReagent().getId(),opeApplyReserve.getArticleNumber());
-//					if(wa==null){
-//						wa=new OpeWarehouseReserve();
-//						wa.setReserve(0);
-//					}
-//					if(this.useNum > wa.getReserve())
-//					{
-//						FacesUtils.warn("库存不够,请确认或申购!");
-//						return;
-//					}
-					if (this.useNum+opeApplyReserve.getUsed() > opeApplyReserve.getNum()){
-						FacesUtils.warn("领用数量超出申请数量!");
-						return;
-					}
-					opeApplyReserve.setSelectNum(useNum);
-					opeApplyReserve.setStartReagentCode(startReagentCode2);
-					opeApplyReserve.setEndReagentCode(endReagentCode2);
-					opeApplyReserve.setStartReagentCode2(temp+startReagentCode2.toString());
-					opeApplyReserve.setEndReagentCode2(temp+endReagentCode2.toString());
-					for (BigInteger i = new BigInteger(startReagentCodeForPerson); i.compareTo(new BigInteger(endReagentCodeForPerson)) < 1; i = i.add(BigInteger.ONE)) {
-						codeList.add(i.toString());
-					}
-					/*for(int i=Integer.parseInt(startReagentCodeForPerson);i<=Integer.parseInt(endReagentCodeForPerson);i++){
-						codeList.add(Integer.toString(i));
-					}*/
-					if(codeList != null)
-					{
-						opeApplyReserve.setReagentCode(codeList);
-					}
+					opeApplyReserve.setSelectNum(distance);
+					opeApplyReserve.setStartReagentCode2(this.startReagentCodeForPerson);
+					opeApplyReserve.setEndReagentCode2(this.endReagentCodeForPerson);
+					opeApplyReserve.setReagentCode(codeList);
+					opeApplyReserve.setCacheUpdateList(getDataTmp());
 					opeApplyReserve.setFlag(0);
+					reagentCodeSelectedList = null;
 					break;
 				}
 			}
 
 			//FacesUtils.info("选择条形码个数为" + codeList.size());
 			RequestContext.getCurrentInstance().execute("PF('reagentCodeDialogForPerson').hide()");
+		} catch (BusinessException e) {
+			logger.error("操作失败。", e);
+			FacesUtils.warn(e.getMessage());
 		} catch (Exception e) {
 			logger.error("操作失败。", e);
 			FacesUtils.warn("操作失败。");
@@ -827,72 +964,25 @@
 	}
 
 	public void onYesBtnClick2(){
-		try{
-			if(this.useNum == null || this.useNum <= 0)
-			{
+		try {
+			if (this.useNum == null || this.useNum <= 0) {
 				FacesUtils.warn("请输入大于0的领用数量!");
 				return;
 			}
-			BigDecimal startReagentCode2 = new BigDecimal(startReagentCode);
-			BigDecimal endReagentCode2 = new BigDecimal(endReagentCode);
-			// 检查条形码结束要大于条形码开始
-			if (endReagentCode2.compareTo(startReagentCode2) == -1) {
-				FacesUtils.warn("条形码开始必须小于条形码结束。");
-				return;
-			}
-			// 检查条形码和到货数量是否匹配
-			if (endReagentCode2.subtract(startReagentCode2).intValue() != (useNum - 1)) {
-				FacesUtils.warn("条形码数量和领用数量不一致。");
-				return;
-			}
-			BigInteger startReagentCode3=new BigInteger(startReagentCode);
-			BigInteger endReagentCode3=new BigInteger(endReagentCode);
-			int len = startReagentCode.length() - String.valueOf(startReagentCode3).length();
+			List<String> codeList = opeReagentStatusService
+					.checkReagentCode(startReagentCode, endReagentCode, useNum);
 
-			String temp = "";
-			for (int i = 0; i < len; i++) {
-				temp += "0";
-			}
-			String str="";
-			for (BigInteger i = startReagentCode3; i.compareTo(endReagentCode3) < 1; i = i.add(BigInteger.ONE)) {
-				String code = temp + String.valueOf(i);
-				OpeReagentStatus status=this.opeReagentStatusService.getOpeReagentStatusByReagentCode(code);
-				if(status==null){
-
-				}else{
-					if(status.getStatus()==ArrivalStatus.WAREHOUSE){
-
-					}else{
-						str+=code+",";
-					}
-				}
-			}
-			if(str!=null && !str.equals("")){
-				FacesUtils.info("条形码"+str.substring(0,str.length()-1)+"已被领用");
-				return;
-			}
-
-			List<String> codeList=new ArrayList<>();
 			for (OpeWarehouseReserve opeWarehouseReserve : this.selectedTmpList) {
 				if (opeWarehouseReserve.getId().equals(this.selectedOpeWarehouseReserve.getId())) {
-					if(this.useNum > opeWarehouseReserve.getReserve())
-					{
+					if (this.useNum > opeWarehouseReserve.getReserve()) {
 						FacesUtils.warn("库存不够,请确认或申购!");
 						return;
 					}
 					opeWarehouseReserve.setSelectNum(useNum);
-					opeWarehouseReserve.setStartReagentCode(startReagentCode2);
-					opeWarehouseReserve.setEndReagentCode(endReagentCode2);
-					opeWarehouseReserve.setStartReagentCode2(temp+startReagentCode2.toString());
-					opeWarehouseReserve.setEndReagentCode2(temp+endReagentCode2.toString());
-					for (BigInteger i = new BigInteger(startReagentCode); i.compareTo(new BigInteger(endReagentCode)) < 1; i = i.add(BigInteger.ONE)) {
-						codeList.add(i.toString());
-					}
-					/*for(int i=Integer.parseInt(startReagentCode);i<=Integer.parseInt(endReagentCode);i++){
-						codeList.add(Integer.toString(i));
-					}*/
-					if(codeList != null)
-					{
+					opeWarehouseReserve.setStartReagentCode2(startReagentCode);
+					opeWarehouseReserve.setEndReagentCode2(endReagentCode);
+
+					if (codeList != null) {
 						opeWarehouseReserve.setReagentCodes(codeList);
 					}
 					opeWarehouseReserve.setFlag(0);
@@ -902,10 +992,13 @@
 			}
 			//FacesUtils.info("选择条形码个数为" + codeList.size());
 			RequestContext.getCurrentInstance().execute("PF('reagentCodeDialog').hide()");
-			} catch (Exception e) {
-				logger.error("操作失败。", e);
-				FacesUtils.warn("操作失败。");
-			}
+		} catch (BusinessException e) {
+			logger.error(e.getMessage());
+			FacesUtils.warn(e.getMessage());
+		} catch (Exception e) {
+			logger.error("操作失败。", e);
+			FacesUtils.warn("操作失败。");
+		}
 	}
 
 	public void onYesBtnClick() {
@@ -958,6 +1051,9 @@
 		this.selectedTmpOrderList = null;
 		this.selectedTmpList = null;
 		this.selectedInputStorageTmpOrderList = null;
+		this.endReagentCodeForPerson = null;
+		this.startReagentCodeForPerson = null;
+		this.useNum = null;
 		this.menuController.backToPage();
 	}
 
@@ -984,18 +1080,31 @@
 				FacesUtils.warn("请选择申领人。");
 				return;
 			}
+
 			List<OpeApplyReserve> list=new ArrayList<>();
 			List<OpeApplyReserve> list2=new ArrayList<>();
 			//int size = 0;
 			for(OpeApplyReserve app:this.selectedTmpOrderList){
+				if (app.getFlag() == null) {
+					FacesUtils.warn("请选择。");
+					return;
+				}
 				if(app.getFlag()==1){
 					list.add(app);
 				}else {
 					list2.add(app);
 				}
-
 			}
+
+			//1.1判断库存
+			checkReserve(list);
+			checkReserve(list2);
+			//1.2判断提交的条码是否重复(只有补贴条码需要判断)
+			checkReagentCode(list2);
+			//库中领取
 			if(list.size()>0&&list!=null){
+				//扣库存 对象中的reagentCode存的是id
+
 				for(OpeApplyReserve app:list){
 					List<String> reagentCode=app.getReagentCode();
 					if(reagentCode!=null && reagentCode.size()>0){
@@ -1004,25 +1113,15 @@
 							if (!this.opeReagentStatusService.isAllowWarehouseUse(opeReagentStatus)) {
 								FacesUtils.warn("只能申领在仓库的试剂。");
 								return;
-							}else {
-								opeReagentStatus.setHouseId(laboratoryId);
-								opeReagentStatus.setContainerId(laboratoryContainerId);
-								this.opeReagentStatusDao.updateOpeReagentStatusDao(opeReagentStatus);
-								OpeLaboratoryReserve lr=new OpeLaboratoryReserve();
-								lr.setReagentId(app.getReagent().getId());
-								lr.setHouseId(laboratoryId);
-								lr.setContainerId(laboratoryContainerId);
-								lr.setReserve(app.getSelectNum());
-								lr.setUserId(userId);
-								lr.setValidFlag(ValidFlag.VALID);
-								this.opeLaboratoryReserveService.insert(lr);
 							}
 						}
 					}
 				}
 
-				this.opeWarehouseReserveService.claimForPerson(list, userId,projectNum);
+				this.opeWarehouseReserveService.claimForPerson(list, userId,projectNum,laboratoryId,laboratoryContainerId);
 			}
+
+			//补贴条码
 			if(list2.size()>0&&list!=null){
 				List<OpeApply> opeList=new ArrayList<>();
 				for(int i=0;i<list2.size();i++){
@@ -1033,6 +1132,8 @@
 					opeApply.setReagent(list2.get(i).getReagent());
 					opeApply.setStartReagentCode(list2.get(i).getStartReagentCode2());
 					opeApply.setEndReagentCode(list2.get(i).getEndReagentCode2());
+					opeApply.setReagentCodeList(list2.get(i).getReagentCode());
+					opeApply.setId(list2.get(i).getId());
 					opeList.add(opeApply);
 					OpeLaboratoryReserve lr=new OpeLaboratoryReserve();
 					lr.setReagentId(list2.get(i).getReagent().getId());
@@ -1043,21 +1144,156 @@
 					lr.setValidFlag(ValidFlag.VALID);
 					this.opeLaboratoryReserveService.insert(lr);
 				}
-				this.opeWarehouseReserveService.reagentDStore2(opeList,userId);
+				this.opeWarehouseReserveService.reagentDStore3(opeList,userId);
+
+				//扣库存
+				opeWarehouseReserveService.btWarehouseReserveReduce(list2,userId);
 			}
+
 			for(int i=0;i<list2.size();i++){
 				OpeWarehouseReserve opeWarehouseReserve=new OpeWarehouseReserve();
-
 				OpeApplyReserve re=new OpeApplyReserve();
 				re.setUsed(list2.get(i).getSelectNum()+list2.get(i).getUsed());
 				re.setId(list2.get(i).getId());
 				opeApplyDao.updateOpeApplyUsed(re);//修改已领数量
 			}
+
+			//更新申购单状态
+			for (OpeApplyReserve oar : selectedTmpOrderList) {
+				//确认
+				if (oar.getStatus() == ApplyStatus.SUPPLIER_CONFIRM) {
+					//领用完 就改成已经入库
+					if (oar.getNum() == oar.getUsed() + oar.getSelectNum()) {
+						opeApplyService.updateOpeApplyInfo(ApplyStatus.STORAGE,null,null, oar.getId());
+						//2.2更改订单状态
+						OpeOrder oo = opeOrderService.getOrder(oar.getId());
+						List<OpeApply> oas = opeOrderService.getOpeApplyListByOrder(oo.getId());
+						assert oas.size() > 0;
+						//子订单是否全部入库,是则父单为已入库,否则未完成
+						boolean flag = oas.stream().allMatch(oa -> oa.getStatus() == ApplyStatus.STORAGE);
+						oo.setArrivalTime(arrivalTime);
+						if (flag){
+							oo.setStatus(ApplyStatus.STORAGE);
+							opeOrderService.updateOpeOrderStatus(oo);
+						}else{
+							oo.setStatus(ApplyStatus.UNCOMPLETED);
+							opeOrderService.updateOpeOrder(oo);
+						}
+					}
+				}
+			}
+
 			FacesUtils.info("申领成功。");
-			this.menuController.goToPage(Constants.PAGE_WAREHOUSE_STOCK_MNG, Constants.PAGE_WAREHOUSE_REAGENT_USE_NEW);
-		} catch (Exception e) {
+			//领用单生成
+			printTable = null;
+			printTable = new Hashtable();
+			int sum = 0;
+			List<ApplyListDto> applyList = new ArrayList<>();
+			Map applyPersonInfo = sysUserService.getUser(userId);
+			printTable.put("head", instituteName);
+			printTable.put("title", "领用单");
+			printTable.put("applyPerson", applyPersonInfo.get("name"));
+			printTable.put("department", applyPersonInfo.get("meta_value"));
+			printTable.put("date", Utils.now("yyyy-MM-dd"));
+			printTable.put("phone", applyPersonInfo.get("phone"));
+			String receiptNum = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
+			printTable.put("receiptNumber", receiptNum);
+			printTable.put("project", applyPersonInfo.get("project"));
+			SysLaboratory lab = sysLaboratoryService.getSysLaboratory(laboratoryId);
+			printTable.put("lab", lab.getName());
+			this.receiptNumber = receiptNum;
+			for (OpeApplyReserve oar : selectedTmpOrderList) {
+				ApplyListDto lis = new ApplyListDto();
+				Map reagentDetail = sysReagentService.getReagentDetail(oar.getReagent().getId());
+				lis.setNum(String.valueOf(oar.getSelectNum())); //数量
+				lis.setMainMetering(String.format("%s%s", reagentDetail.get("main_metering"), reagentDetail.get("unit")));
+				lis.setControlProducts((String) reagentDetail.get("controlProducts"));
+				lis.setProductName((String) reagentDetail.get("name"));
+				lis.setReagentFormat((String) reagentDetail.get("reagentFormat"));
+				lis.setProductCode((String)reagentDetail.get("productCode"));
+				lis.setMemo((String)reagentDetail.get("memo"));
+				applyList.add(lis);
+				sum += oar.getSelectNum();
+			}
+			applyList.add(new ApplyListDto("合计", "", "", "", "", String.valueOf(sum), ""));
+			printTable.put("applyList", applyList);
+			//返回
+//			onCancelBtnClick();
+			RequestContext.getCurrentInstance().execute("PF('printDialog').show()");
+		} catch (BusinessException e){
+			logger.info(e.getMessage());
+			FacesUtils.warn(e.getMessage());
+		}
+		catch (Exception e) {
 			logger.error("操作失败。", e);
 			FacesUtils.warn("操作失败。");
+		}
+	}
+
+	public void receiptNumberChange( ){
+	}
+
+	/**
+	 * 点击打印  关联所有流向和领用单号e
+	 */
+	public void associatedFlowReceiptNumber() {
+		try {
+			opeUseFlowService.updateReceiptNumberByCode(selectedTmpOrderList, receiptNumber);
+			//弹出打印窗口
+			RequestContext.getCurrentInstance().execute("document.getElementById('indirectPrint').click()");
+		} catch (Exception e) {
+			logger.info(e.getMessage());
+		}
+
+	}
+
+	public void associatedFlowReceiptNumber2() {
+		try {
+			opeUseFlowService.updateReceiptNumberByCode2(selectedTmpList, receiptNumber);
+			//弹出打印窗口
+			RequestContext.getCurrentInstance().execute("document.getElementById('indirectPrint').click()");
+		} catch (Exception e) {
+			logger.info(e.getMessage());
+		}
+
+	}
+
+
+	private void checkReserve(List<OpeApplyReserve> list) {
+		if (list == null || list.size() < 1) {
+			return;
+		}
+		for (OpeApplyReserve oar : list) {
+
+			boolean flag = (oar.getFlag() != 1);
+			List<OpeWarehouseReserve> owr = opeWarehouseReserveService
+					.selectWarehouseByReagentIdAndArticleNumber(oar.getReagent().getId(), oar.getArticleNumber(),flag);
+			int sum = owr.stream().mapToInt(item -> item.getReserve() == null ? 0 : item.getReserve()).sum();
+			//剩余库存不足领取数量
+			if (sum < oar.getSelectNum()) {
+				throw new BusinessException(ExceptionEnumCode.APPLY_NUM_OVER, "库存已经不够");
+			}
+		}
+	}
+
+	private void checkReagentCode(List<OpeApplyReserve> list){
+		if (list == null || list.size() < 1) {
+			return;
+		}
+		Set<String> checkSet = new HashSet<>();
+		for (OpeApplyReserve oar : list) {
+			List<String> codeList = opeReagentStatusService
+					.checkReagentCode(oar.getStartReagentCode2(), oar.getEndReagentCode2(), oar.getSelectNum());
+			oar.setReagentCode(codeList);
+			if (codeList != null && codeList.size() > 0) {
+				for (String code:codeList) {
+					if (!checkSet.contains(code)) {
+						checkSet.add(code);
+					}else{
+						throw new BusinessException(ExceptionEnumCode.PARAM_EXIST, "当前订单条码重复,"+code);
+					}
+				}
+			}
 		}
 	}
 
@@ -1211,6 +1447,12 @@
 			printTable.put("department", applyPersonInfo.get("meta_value"));
 			printTable.put("date", Utils.now("yyyy-MM-dd"));
 			printTable.put("phone", applyPersonInfo.get("phone"));
+			printTable.put("project", applyPersonInfo.get("project"));
+			SysLaboratory lab = sysLaboratoryService.getSysLaboratory(laboratoryId);
+			String receiptNum = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
+			printTable.put("receiptNumber", receiptNum);
+			printTable.put("lab", lab.getName());
+			this.receiptNumber = receiptNum;
 
 			//int size = 0;
 			int sum = 0;
@@ -1280,6 +1522,7 @@
 					opeApply.setReagent(this.sysReagentService.getSysReagent(list2.get(i).getReagentId()));
 					opeApply.setStartReagentCode(list2.get(i).getStartReagentCode2());
 					opeApply.setEndReagentCode(list2.get(i).getEndReagentCode2());
+					opeApply.setReagentCodeList(list2.get(i).getReagentCodes());
 					opeList.add(opeApply);
 					OpeLaboratoryReserve lr=new OpeLaboratoryReserve();
 					lr.setReagentId(list2.get(i).getReagentId());
@@ -1304,10 +1547,40 @@
 
 					sum += list2.get(i).getSelectNum();
 				}
-				this.opeWarehouseReserveService.reagentDStore2(opeList,userId);
+				this.opeWarehouseReserveService.reagentDStore4(opeList,userId);
 				for(int i=0;i<list2.size();i++){
+
+					List<String> reagentCodes = opeReagentStatusService
+							.generateReagentCode(list2.get(i).getStartReagentCode2(), list2.get(i).getEndReagentCode2());
+					Integer selectNum = list2.get(i).getSelectNum();
+					for (int j = 0;j<selectNum;j++){
+						// 试剂使用情况入库insert
+						OpeUseFlow opeUseFlow = new OpeUseFlow();
+						opeUseFlow.setReagentCode(reagentCodes.get(0));
+						opeUseFlow.setStatus(ArrivalStatus.WAREHOUSE);
+						//仓库信息
+						List<OpeWarehouseReserve> warehouseReserveInfo = opeWarehouseReserveService
+								.selectWarehouseByRidAndArticleNumberAndWarehouse(list2.get(i).getReagent().getId()
+										, list2.get(i).getArticleNumber()
+										, list2.get(i).getWarehouseId());
+						opeUseFlow.setHouseId(list2.get(i).getWarehouseId());
+						opeUseFlow.setContainerId(warehouseReserveInfo.get(0).getContainerId());
+						opeUseFlow.setCreateTime(warehouseReserveInfo.get(0).getUpdateTime());
+						opeUseFlow.setUserId(userId);
+						opeUseFlow.setRemainder(list2.get(i).getReagent().getMainMetering()!=null?list2.get(i).getReagent().getMainMetering():new BigDecimal(0));
+						opeUseFlow.setStoreType(StoreType.DIRECTSTORE);
+
+						Map<String, String> metaMap = new HashMap<>();
+						metaMap.put("groupId", "operate_status");
+						metaMap.put("metaKey", String.valueOf(OperateStatus.WAREHOUSEIN.getKey()));
+						List<BaseMeta> baseMetaList = baseMetaDao.getBaseMetaList(metaMap);
+						opeUseFlow.setOperateState(baseMetaList.get(0).getId());
+						this.opeUseFlowService.insertOpeUseFlow(opeUseFlow);
+						reagentCodes.remove(0);
+					}
+
 					list2.get(i).setReserve(list2.get(i).getReserve()-list2.get(i).getSelectNum());
-					opeWarehouseReserveDao.updateOpeWarehouseReserve(list2.get(i));
+					opeWarehouseReserveDao.updateOpeWarehouseReserve2(list2.get(i));
 				}
 
 
@@ -2173,18 +2446,33 @@
 		System.out.println("===============================");
 			if(useNum!=null && useNum>0){
 				if(startReagentCode!=null && !startReagentCode.equals("")){
+				if (startReagentCode.matches(".*\\D+.*")) {
+								if (startReagentCode.length() ==24 &&
+					                    startReagentCode.matches(".*([A-F]|\\d)+.*") &&
+					                    startReagentCode.substring(startReagentCode.length() - 5).matches("\\d{5}")){
 
-					BigDecimal start=new BigDecimal(startReagentCode.trim());
-					String str=startReagentCode;
-					String up="";
-					int len = startReagentCode.length() - String.valueOf(start).length();
-					String temp = "";
-					for (int i = 0; i < len; i++) {
-						temp += "0";
+							//2.2长度为24位编码的
+							BigInteger arrNum = BigInteger.valueOf((long)useNum);
+							//后5位随机码
+							String randomCode = startReagentCode.substring(startReagentCode.length() - 5);
+							String reagentCodePrefix = startReagentCode.substring(0,startReagentCode.length() - 5);
+
+							BigInteger startReagentCodeSuffix = new BigInteger(randomCode);
+							BigInteger endReagentCodeSuffix = startReagentCodeSuffix.add(arrNum).subtract((new BigInteger("1")));
+							String reagentCodeSuffix= autoGenericCode(randomCode, endReagentCodeSuffix);
+							endReagentCode= (reagentCodePrefix + reagentCodeSuffix);
+						}else{
+							endReagentCode = ("");
+						}
+					}else{
+
+						BigInteger startReagentCode2 = new BigInteger(startReagentCode);
+						//2.1长度不为24位编码
+						//数据1
+						BigInteger arrNum = BigInteger.valueOf((long)useNum);
+						BigInteger code1 = startReagentCode2.add(arrNum).subtract(BigInteger.ONE);
+						endReagentCode=(autoGenericCode(startReagentCode, code1));
 					}
-					BigDecimal end = start.add(new BigDecimal(useNum-1));
-					endReagentCode=temp+end.toString();
-					//endReagentCode=Integer.toString(useNum-1+Integer.parseInt(startReagentCode));
 				}else{
 					FacesUtils.info("请输入条形码开始");
 				}
@@ -2405,8 +2693,9 @@
 				//{
 				//	this.oriLaboratoryId = this.laboratory.get(0).getId();
 				//}
-				this.laboratoryId=this.laboratory.get(0).getId();
-				this.laboratoryContainers = this.sysLaboratoryContainerService.getSysLaboratoryContainerList(this.laboratory.get(0).getId());
+
+				this.laboratoryId= laboratoryId==null?this.laboratory.get(0).getId():laboratoryId;
+				this.laboratoryContainers = this.sysLaboratoryContainerService.getSysLaboratoryContainerList(laboratoryId);
 			}else {
 				this.oriLaboratoryId = null;
 				this.laboratoryContainers = null;
@@ -2445,6 +2734,7 @@
 	}
 
 	public String getLaboratoryContainerId() {
+
 		return laboratoryContainerId;
 	}
 
@@ -2611,8 +2901,11 @@
 		}
 		//2如果开始条码不为空
 		//2.0如果包含字母不等于24位的直接不管
-		if (startReagentCode2.matches(".*[A-F]+.*")) {
-			if (startReagentCode2.length() ==24){
+
+		if (startReagentCode2.matches(".*\\D+.*")) {
+			if (startReagentCode2.length() ==24 &&
+					startReagentCode2.matches(".*([A-F]|\\d)+.*") &&
+					startReagentCode2.substring(startReagentCode2.length() - 5).matches("\\d{5}")){
 				//2.2长度为24位编码的
 				BigInteger arrNum = BigInteger.valueOf(oar.getArrivalNum().longValue());
 				//后5位随机码
@@ -2681,4 +2974,30 @@
 		return statusSelectList;
 	}
 
+
+
+
+	public List<OpeWarehouseReserve> getWarehouseReserveList() {
+		return warehouseReserveList;
+	}
+
+	public void setWarehouseReserveList(List<OpeWarehouseReserve> warehouseReserveList) {
+		this.warehouseReserveList = warehouseReserveList;
+	}
+
+	public OpeWarehouseReserve getOpeWarehouseReserve() {
+		return opeWarehouseReserve;
+	}
+
+	public void setOpeWarehouseReserve(OpeWarehouseReserve opeWarehouseReserve) {
+		this.opeWarehouseReserve = opeWarehouseReserve;
+	}
+
+	public String getReceiptNumber() {
+		return receiptNumber;
+	}
+
+	public void setReceiptNumber(String receiptNumber) {
+		this.receiptNumber = receiptNumber;
+	}
 }
diff --git a/src/main/java/com/nanometer/smartlab/dao/OpeApplyDao.xml b/src/main/java/com/nanometer/smartlab/dao/OpeApplyDao.xml
index 38cef0d..b55d128 100644
--- a/src/main/java/com/nanometer/smartlab/dao/OpeApplyDao.xml
+++ b/src/main/java/com/nanometer/smartlab/dao/OpeApplyDao.xml
@@ -64,6 +64,7 @@
     <result property="status" column="status" typeHandler="com.nanometer.smartlab.entity.handler.ApplyStatusHandler"></result>
     <result property="applyUserId" column="apply_user_id"></result>
     <result property="arrivalTime" column="arrival_time"></result>
+    <result property="articleNumber" column="articleNumber"></result>
     <result property="projectManage" column="projectManage"/>
     <result property="project" column="project"/>
     <association property="reagent" javaType="com.nanometer.smartlab.entity.SysReagent">
@@ -470,9 +471,13 @@
     <update id="updateOpeApplyInfo" parameterType="java.util.Map">
         update
         ope_apply
-        set status = #{status},
-        arrival_time = #{arrivalTime},
-        consignee_id = #{consigneeId}
+        set status = #{status}
+        <if test="arrivalTime!=null" >
+            ,arrival_time = #{arrivalTime}
+        </if>
+        <if test="consigneeId!=null" >
+            ,consignee_id = #{consigneeId}
+        </if>
         where valid_flag = 1
         and id = #{applyId}
     </update>
diff --git a/src/main/java/com/nanometer/smartlab/dao/OpeReagentStatusDao.java b/src/main/java/com/nanometer/smartlab/dao/OpeReagentStatusDao.java
index 3804a20..b2dc7b2 100644
--- a/src/main/java/com/nanometer/smartlab/dao/OpeReagentStatusDao.java
+++ b/src/main/java/com/nanometer/smartlab/dao/OpeReagentStatusDao.java
@@ -53,4 +53,6 @@
     List<String> selectReagentCodesByReId(String reagentId);
 
     void insertOpeReagentStatus2(OpeReagentStatus ors);
+
+    int countReagentByArticleAndWarehouse(Map params);
 }
diff --git a/src/main/java/com/nanometer/smartlab/dao/OpeReagentStatusDao.xml b/src/main/java/com/nanometer/smartlab/dao/OpeReagentStatusDao.xml
index 5025194..17ab524 100644
--- a/src/main/java/com/nanometer/smartlab/dao/OpeReagentStatusDao.xml
+++ b/src/main/java/com/nanometer/smartlab/dao/OpeReagentStatusDao.xml
@@ -223,7 +223,6 @@
     from ope_reagent_status as oa
    <include refid="queryJoins3"/>
     where oa.valid_flag = 1
-    	  and (oa.status = -1 or oa.status = 0 )
     <include refid="queryWhereSql3"/>
 	<if	test="applyPerson != null and applyPerson != ''"  >
 		and su.name like concat("%",#{applyPerson},"%")
@@ -263,7 +262,6 @@
    <include refid="queryJoins2"/>
    left  join sys_user su on su.id = oa.user_id
     where oa.valid_flag = 1
-   		 and (oa.status = -1 or oa.status = 0 )
     <include refid="queryWhereSql2"/>
 	  <if	test="applyPerson != null and applyPerson != ''"  >
 		  and su.name like concat("%",#{applyPerson},"%")
@@ -434,4 +432,18 @@
 	and valid_flag = 1
 	ORDER BY update_time
 </select>
+    <select id="countReagentByArticleAndWarehouse" resultType="java.lang.Integer">
+		select count(*)
+		from ope_reagent_status
+		WHERE status = 1
+		<if test="reagentId != null and reagentId !=''">
+			and reagent_id = #{reagentId}
+		</if>
+		<if test="articleNumber != null and articleNumber !=''">
+			and article_number = #{articleNumber}
+		</if>
+		<if test="warehouseId != null and warehouseId !=''">
+			and house_id = #{warehouseId}
+		</if>
+	</select>
 </mapper>
diff --git a/src/main/java/com/nanometer/smartlab/dao/OpeUseFlowDao.java b/src/main/java/com/nanometer/smartlab/dao/OpeUseFlowDao.java
index 5dbf82c..3b913f9 100644
--- a/src/main/java/com/nanometer/smartlab/dao/OpeUseFlowDao.java
+++ b/src/main/java/com/nanometer/smartlab/dao/OpeUseFlowDao.java
@@ -29,4 +29,10 @@
     int updateTimeByCode(Map params);
 
     OpeUseFlow getOpeUseFlowByCode(@Param("reagentCode") String reagentCode);
+
+    void updateReceiptNumber(String code, String receiptNumber);
+
+    List<Map> getRegentInfoFromReceiptNumber(String receiptNumber);
+
+    Map getUserIdByReagentCode(String reagentCode, String id);
 }
diff --git a/src/main/java/com/nanometer/smartlab/dao/OpeUseFlowDao.xml b/src/main/java/com/nanometer/smartlab/dao/OpeUseFlowDao.xml
index 6fb9af4..d0b9b40 100644
--- a/src/main/java/com/nanometer/smartlab/dao/OpeUseFlowDao.xml
+++ b/src/main/java/com/nanometer/smartlab/dao/OpeUseFlowDao.xml
@@ -24,6 +24,7 @@
     <result column="laboratoryContainerName" jdbcType="VARCHAR" property="laboratoryContainerName" />
     <result column="laboratoryContainerCode" jdbcType="VARCHAR" property="laboratoryContainerCode" />
     <result column="operatestateName" jdbcType="VARCHAR" property="operatestateName" />
+    <result column="receipt_number" jdbcType="VARCHAR" property="receiptNumber" />
 
     <association property="reagent" javaType="com.nanometer.smartlab.entity.SysReagent">
       	<id property="id" column="reagentId"/>
@@ -48,7 +49,12 @@
     <update id="updateTimeByCode" parameterType="java.util.Map">
         update ope_use_flow set create_time=now() where reagent_code=#{code} and status=#{status}
     </update>
-  <sql id="queryWhereSql">
+    <update id="updateReceiptNumber">
+        update ope_use_flow
+        set receipt_number = #{1}
+        where reagent_code = #{0}
+    </update>
+    <sql id="queryWhereSql">
     <if test="reagentId != null and reagentId != ''">
       and ors.reagent_id = #{reagentId}
     </if>
@@ -110,9 +116,29 @@
 	</sql>
 
 	<select id="getOpeUseFlowList" parameterType="java.util.Map" resultMap="OpeUseFlow">
-	    <include refid="queryColumns"/>
+        select oa.*,
+        sr.*,
+        ors.article_number as articleNumber,
+        sr.id as reagentId,
+        su.name as userName,
+        ss.name as supplierName,
+        l.name as laboratoryName,
+        w.name as warehouseName,
+        lc.name as warehouseContainerName,
+        wc.name as laboratoryContainerName,
+        lc.container_code as warehouseContainerCode,
+        wc.container_code as laboratoryContainerCode,
+        bm1.meta_value as operatestateName
 	    from ope_use_flow as oa
-	   <include refid="queryJoins"/>
+        left join ope_reagent_status ors on ors.reagent_code = oa.reagent_code
+        left join sys_reagent sr on ors.reagent_id = sr.id
+        left join sys_supplier as ss on sr.supplier_id = ss.id
+        left join sys_user as su on oa.user_id = su.id
+        left join sys_warehouse_container wc on wc.id = oa.container_id
+        left join sys_warehouse w on w.id = wc.warehouse_id
+        left join sys_laboratory_container lc on lc.id = oa.container_id
+        left join sys_laboratory l on l.id = lc.laboratory_id
+        left join base_meta bm1 on bm1.id = oa.operatestate
 	    where oa.valid_flag = 1
 	    <include refid="queryWhereSql"/>
    		order by oa.create_time desc
@@ -138,7 +164,22 @@
     ORDER BY create_time DESC
     LIMIT 1
   </select>
-  <insert id="insertOpeUseFlow" parameterType="com.nanometer.smartlab.entity.OpeUseFlow">
+    <select id="getRegentInfoFromReceiptNumber" resultType="java.util.Map">
+        SELECT ors.reagent_id reagentId,count(ors.reagent_id) count
+        from  ope_use_flow ouf
+        LEFT JOIN ope_reagent_status ors on ors.reagent_code = ouf.reagent_code
+        WHERE ouf.receipt_number = #{0}
+        GROUP BY ors.reagent_id
+    </select>
+    <select id="getUserIdByReagentCode" resultType="java.util.Map">
+        select user_id,create_time
+        from ope_use_flow
+        where reagent_code =#{0}
+        and operatestate =#{1}
+        and valid_flag = 1
+        limit 1
+    </select>
+    <insert id="insertOpeUseFlow" parameterType="com.nanometer.smartlab.entity.OpeUseFlow">
     insert into ope_use_flow(id, reagent_code, status, house_id, container_id, user_id, remainder, place, store_type, valid_flag, create_time, realstatus, operatestate)
     values (#{id}, #{reagentCode}, #{status}, #{houseId}, #{containerId}, #{userId}, #{remainder}, #{place}, #{storeType}, 1, #{createTime}, #{realstatus},#{operateState})
   </insert>
diff --git a/src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.java b/src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.java
index 52d826e..5c2db61 100644
--- a/src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.java
+++ b/src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.java
@@ -18,9 +18,13 @@
     @SuppressWarnings("rawtypes")
     int getOpeWarehouseReserveTotalCount(Map params) throws DataAccessException;
 
+    List<OpeWarehouseReserve> getOpeWarehouseReserveList2(Map params) throws DataAccessException;
+
     void insertOpeWarehouseReserve(OpeWarehouseReserve opeWarehouseReserve);
 
     int updateOpeWarehouseReserve(OpeWarehouseReserve opeWarehouseReserve);
+
+    int updateOpeWarehouseReserve2(OpeWarehouseReserve opeWarehouseReserve);
 
     OpeWarehouseReserve getOpeWarehouseReserve(OpeWarehouseReserve opeWarehouseReserve);
 
@@ -31,4 +35,10 @@
     void updateCount(Map<String ,Object> params);
 
     void insertOpeWarehouseReserve2(OpeWarehouseReserve ope);
+
+    List<OpeWarehouseReserve> selectWarehouseByReagentIdAndArticleNumber(Map params);
+
+    List<OpeWarehouseReserve> selectWarehouseByRidAndArtiNumberAndWid(Map params);
+
+    void updateBtReserve(String id, Integer useNum);
 }
diff --git a/src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.xml b/src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.xml
index a922fe3..198aed0 100644
--- a/src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.xml
+++ b/src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.xml
@@ -7,6 +7,7 @@
     <result property="reserve" column="reserve"></result>
     <result property="updateTime" column="update_time"></result>
       <result property="warehouseId" column="warehouseId"></result>
+      <result property="containerId" column="container_id"></result>
       <result property="warehouseName" column="warehouseName"></result>
     <result property="validFlag" column="valid_flag" typeHandler="com.nanometer.smartlab.entity.handler.ValidFlagHandler"></result>
 
@@ -102,32 +103,100 @@
   </select>
 
     <insert id="insertOpeWarehouseReserve" parameterType="com.nanometer.smartlab.entity.OpeWarehouseReserve">
-        insert into ope_warehouse_reserve(id, reagent_id, article_number, reserve, valid_flag, update_time,warehouseId)
-        values (#{id}, #{reagentId}, #{articleNumber}, #{reserve}, 1, now(),#{warehouseId})
+        insert into ope_warehouse_reserve(id, reagent_id, article_number, reserve, valid_flag, update_time,warehouseId,container_id)
+        values (#{id}, #{reagentId}, #{articleNumber}, #{reserve}, 1, now(),#{warehouseId},#{containerId})
     </insert>
     <insert id="insertOpeWarehouseReserve2" parameterType="com.nanometer.smartlab.entity.OpeWarehouseReserve">
-        insert into ope_warehouse_reserve(id, reagent_id, article_number, reserve, valid_flag, update_time,warehouseId,apply_code,order_code)
-        values (#{id}, #{reagentId}, #{articleNumber}, #{reserve}, 1, now(),#{warehouseId},#{applyCode},#{orderCode})
+        insert into ope_warehouse_reserve(id, reagent_id, article_number, reserve, valid_flag, update_time,warehouseId,apply_code,order_code,container_id)
+        values (#{id}, #{reagentId}, #{articleNumber}, #{reserve}, 1, now(),#{warehouseId},#{applyCode},#{orderCode},#{containerId})
     </insert>
 
     <update id="updateOpeWarehouseReserve" parameterType="com.nanometer.smartlab.entity.OpeWarehouseReserve">
         update ope_warehouse_reserve
         <set>
-            reagent_id=#{reagentId},
-            reserve=#{reserve},
-            update_time=now(),
-            <if test="articleNumber != null and articleNumber !=''">
-                article_number=#{articleNumber},
-            </if>
-            <if test="warehouseId != null and warehouseId !=''">
-                warehouseId=#{warehouseId},
-            </if>
+        reagent_id=#{reagentId},
+        reserve=#{reserve},
+        update_time=now(),
+        container_id=#{containerId},
+        <if test="articleNumber != null and articleNumber !=''">
+            article_number=#{articleNumber},
+        </if>
+        <if test="warehouseId != null and warehouseId !=''">
+            warehouseId=#{warehouseId},
+        </if>
         </set>
+        where id=#{id}
+    </update>
+
+    <update id="updateOpeWarehouseReserve2" parameterType="com.nanometer.smartlab.entity.OpeWarehouseReserve">
+        update ope_warehouse_reserve
+         set reserve=#{reserve}
         where id=#{id}
     </update>
 
     <select id="selectByReId" resultMap="OpeWarehouseReserve">
         select * from ope_warehouse_reserve where reagent_id=#{id}
+    </select>
+    <select id="selectWarehouseByReagentIdAndArticleNumber" resultMap="OpeWarehouseReserve" parameterType="java.util.Map">
+        SELECT
+            owr.id,
+            owr.reagent_id,
+            owr.warehouseId,
+            sw.NAME warehouseName,
+            sum( owr.reserve ) reserve
+        FROM
+            ope_warehouse_reserve owr
+            LEFT JOIN sys_warehouse sw ON sw.id = owr.warehouseId
+        WHERE
+            sw.valid_flag = 1
+            AND owr.valid_flag = 1
+            and owr.reserve > 0
+            and  owr.reagent_id = #{reagentId}
+        <if test="articleNumber != null and articleNumber != ''">
+            and owr.article_number = #{articleNumber}
+        </if>
+        GROUP BY
+            reagent_id,
+            warehouseId
+        HAVING
+            reserve > 0
+    </select>
+
+    <select id="selectWarehouseByRidAndArtiNumberAndWid" resultMap="OpeWarehouseReserve" parameterType="java.util.Map">
+        SELECT
+        owr.id,
+        owr.reagent_id,
+        owr.warehouseId,
+        sw.NAME warehouseName,
+        owr.reserve,
+        owr.article_number,
+        owr.container_id,
+        owr.update_time
+        FROM
+        ope_warehouse_reserve owr
+        LEFT JOIN sys_warehouse sw ON sw.id = owr.warehouseId
+        WHERE
+        sw.valid_flag = 1
+        AND owr.valid_flag = 1
+        and owr.reserve > 0
+        and  owr.reagent_id = #{reagentId}
+        <if test="articleNumber != null and articleNumber != ''">
+            and owr.article_number = #{articleNumber}
+        </if>
+        <if test="warehouseId != null and warehouseId != ''">
+            and owr.warehouseId = #{warehouseId}
+        </if>
+    </select>
+
+    <select id="getOpeWarehouseReserveList2" resultMap="OpeWarehouseReserve" parameterType="java.util.Map">
+
+        <include refid="queryColumns"/>
+        from ope_warehouse_reserve as oa
+        <include refid="queryJoins"/>
+        where oa.valid_flag = 1 and oa.reserve > 0
+        <include refid="queryWhereSql"/>
+
+        order by oa.update_time,oa.reserve
     </select>
 
     <update id="updateByReId" parameterType="java.util.Map">
@@ -138,6 +207,11 @@
     <update id="updateCount" parameterType="java.util.Map">
         update ope_warehouse_reserve set reserve=reserve+1 where reagent_id=#{reagentId} and article_number=#{articleNumber}
     </update>
+    <update id="updateBtReserve">
+        UPDATE ope_warehouse_reserve
+        set reserve = reserve - #{1}
+        where id = #{0}
+    </update>
 
 
 </mapper>
diff --git a/src/main/java/com/nanometer/smartlab/entity/OpeApply.java b/src/main/java/com/nanometer/smartlab/entity/OpeApply.java
index 2e35b5c..e2eba2e 100644
--- a/src/main/java/com/nanometer/smartlab/entity/OpeApply.java
+++ b/src/main/java/com/nanometer/smartlab/entity/OpeApply.java
@@ -6,6 +6,7 @@
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.sql.Timestamp;
+import java.util.*;
 
 /**
  * Created by johnny on 17/11/23.
@@ -84,6 +85,7 @@
     private String articleNumber;
     private String startReagentCode;
     private String endReagentCode;
+    private List<String> reagentCodeList;
     private String houseId;
     private String containerId;
     private String placeId;
@@ -97,6 +99,9 @@
     private BigDecimal applyPrice;
     private int stockFlag;
     private String stockFlagValue;
+    //用于存放仓库 和仓库货柜的id
+    private String warehouseId;
+    private String warehouseContainerId;
 
     public String getStockFlagValue() {
         return stockFlagValue;
@@ -328,9 +333,15 @@
 		this.projectId = projectId;
 	}
 
+    public List<String> getReagentCodeList() {
+        return reagentCodeList;
+    }
 
+    public void setReagentCodeList(List<String> reagentCodeList) {
+        this.reagentCodeList = reagentCodeList;
+    }
 
-	public String getProjectOwner() {
+    public String getProjectOwner() {
 		return projectOwner;
 	}
 
@@ -348,7 +359,23 @@
 		this.ownerDepartment = ownerDepartment;
 	}
 
-	@Override
+    public String getWarehouseId() {
+        return warehouseId;
+    }
+
+    public void setWarehouseId(String warehouseId) {
+        this.warehouseId = warehouseId;
+    }
+
+    public String getWarehouseContainerId() {
+        return warehouseContainerId;
+    }
+
+    public void setWarehouseContainerId(String warehouseContainerId) {
+        this.warehouseContainerId = warehouseContainerId;
+    }
+
+    @Override
 	public int compareTo(OpeApply o) {
         if(this.projectOwner == null || o.getProjectOwner() == null){
             return 1;
diff --git a/src/main/java/com/nanometer/smartlab/entity/OpeApplyReserve.java b/src/main/java/com/nanometer/smartlab/entity/OpeApplyReserve.java
index c9e9a18..389d25d 100644
--- a/src/main/java/com/nanometer/smartlab/entity/OpeApplyReserve.java
+++ b/src/main/java/com/nanometer/smartlab/entity/OpeApplyReserve.java
@@ -7,29 +7,30 @@
 import java.math.BigDecimal;
 import java.sql.Timestamp;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Created by johnny on 17/11/23.
  */
-public class OpeApplyReserve implements Serializable,Comparable<OpeApplyReserve> {
+public class OpeApplyReserve implements Serializable, Comparable<OpeApplyReserve> {
 
-    private String id;
-    // 申购编号
-    private String applyCode;
-    // 申请数量
-    private Integer num;
-    // 已领用数量
-    private Integer used;
-    // 申购试剂
-    private SysReagent reagent;
-    // 申购者
-    private String applyUserId;
-    // 批号
-    private String articleNumber;
-    //领用数量
-    private Integer selectNum;
+	private String id;
+	// 申购编号
+	private String applyCode;
+	// 申请数量
+	private Integer num;
+	// 已领用数量
+	private Integer used;
+	// 申购试剂
+	private SysReagent reagent;
+	// 申购者
+	private String applyUserId;
+	// 批号
+	private String articleNumber;
+	//领用数量
+	private Integer selectNum;
 
-    private Integer flag;
+	private Integer flag;
 	private ApplyStatus status;
 	private Integer arrivalNum;
 	private String containerId;
@@ -52,6 +53,7 @@
 
 	private String startReagentCode2;
 	private String endReagentCode2;
+	private List<OpeWarehouseReserve> cacheUpdateList;
 
 	public String getStartReagentCode2() {
 		return startReagentCode2;
@@ -220,4 +222,13 @@
     public void setProjectManage(String projectManage) {
         this.projectManage = projectManage;
     }
+
+
+	public List<OpeWarehouseReserve> getCacheUpdateList() {
+		return cacheUpdateList;
+	}
+
+	public void setCacheUpdateList(List<OpeWarehouseReserve> cacheUpdateList) {
+		this.cacheUpdateList = cacheUpdateList;
+	}
 }
diff --git a/src/main/java/com/nanometer/smartlab/entity/OpeUseFlow.java b/src/main/java/com/nanometer/smartlab/entity/OpeUseFlow.java
index 108a403..f6dd09a 100644
--- a/src/main/java/com/nanometer/smartlab/entity/OpeUseFlow.java
+++ b/src/main/java/com/nanometer/smartlab/entity/OpeUseFlow.java
@@ -41,6 +41,7 @@
     
     private String operatestateName;
     private String operateState;
+    private String receiptNumber;
     
 
 
@@ -229,4 +230,12 @@
 	public void setStoreType(StoreType storeType) {
 		this.storeType = storeType;
 	}
+
+    public String getReceiptNumber() {
+        return receiptNumber;
+    }
+
+    public void setReceiptNumber(String receiptNumber) {
+        this.receiptNumber = receiptNumber;
+    }
 }
diff --git a/src/main/java/com/nanometer/smartlab/entity/OpeWarehouseReserve.java b/src/main/java/com/nanometer/smartlab/entity/OpeWarehouseReserve.java
index 02c1481..5fcd8a3 100644
--- a/src/main/java/com/nanometer/smartlab/entity/OpeWarehouseReserve.java
+++ b/src/main/java/com/nanometer/smartlab/entity/OpeWarehouseReserve.java
@@ -30,8 +30,14 @@
     private String endReagentCode2;
     private String applyCode;
     private String orderCode;
+    //新增 货柜id
+    private String containerId;
 
 
+    /**
+     * 补贴条码的暂存领用数量
+     */
+    public Integer useNum;
     public String getWarehouseId() {
         return warehouseId;
     }
@@ -177,4 +183,20 @@
     public void setOrderCode(String orderCode) {
         this.orderCode = orderCode;
     }
+
+    public Integer getUseNum() {
+        return useNum;
+    }
+
+    public void setUseNum(Integer useNum) {
+        this.useNum = useNum;
+    }
+
+    public String getContainerId() {
+        return containerId;
+    }
+
+    public void setContainerId(String containerId) {
+        this.containerId = containerId;
+    }
 }
diff --git a/src/main/java/com/nanometer/smartlab/exception/ExceptionEnumCode.java b/src/main/java/com/nanometer/smartlab/exception/ExceptionEnumCode.java
index e23f12e..0acb3c4 100644
--- a/src/main/java/com/nanometer/smartlab/exception/ExceptionEnumCode.java
+++ b/src/main/java/com/nanometer/smartlab/exception/ExceptionEnumCode.java
@@ -13,7 +13,8 @@
 	REAGENT_CODE_EXIST("2001"),
 	REAGENT_CODE_INVALID("2002"),
 	MAIL_SEND_FAIL("3001"),
-	ORDER_ERROR("4001");
+	ORDER_ERROR("4001"),
+	APPLY_NUM_OVER("55555");
 
 
 	private String code;
diff --git a/src/main/java/com/nanometer/smartlab/service/OpeApplyService.java b/src/main/java/com/nanometer/smartlab/service/OpeApplyService.java
index 083cd89..7369cb2 100644
--- a/src/main/java/com/nanometer/smartlab/service/OpeApplyService.java
+++ b/src/main/java/com/nanometer/smartlab/service/OpeApplyService.java
@@ -71,4 +71,6 @@
     void updateOpeApplyInfo(ApplyStatus storage, String consigneeId, Timestamp arrivalTime, String applyId);
 
     void orderInputWarehouse(List<OpeApplyReserve> opeApplyList,String consigneeId,Timestamp arrivalTime) throws BusinessException,Exception;
+
+    void btUpdateApplyAndOrder(List<OpeApply> opeList);
 }
diff --git a/src/main/java/com/nanometer/smartlab/service/OpeApplyServiceImpl.java b/src/main/java/com/nanometer/smartlab/service/OpeApplyServiceImpl.java
index 90690cd..4f09cda 100644
--- a/src/main/java/com/nanometer/smartlab/service/OpeApplyServiceImpl.java
+++ b/src/main/java/com/nanometer/smartlab/service/OpeApplyServiceImpl.java
@@ -707,5 +707,12 @@
 
         }
     }
+    /**
+    * 补贴条码更新订单的领用数量
+    */
+    @Override
+    public void btUpdateApplyAndOrder(List<OpeApply> opeList) {
+
+    }
 
 }
diff --git a/src/main/java/com/nanometer/smartlab/service/OpeReagentStatusService.java b/src/main/java/com/nanometer/smartlab/service/OpeReagentStatusService.java
index a96607c..da2cb69 100644
--- a/src/main/java/com/nanometer/smartlab/service/OpeReagentStatusService.java
+++ b/src/main/java/com/nanometer/smartlab/service/OpeReagentStatusService.java
@@ -67,6 +67,8 @@
 	boolean updateReagentStatus(OpeReagentStatus opeReagentStatus);
 	boolean updateReagentStatus2(OpeReagentStatus opeReagentStatus);
 
+	boolean updateReagentStatus3(OpeReagentStatus opeReagentStatus);
+
 	int getLogOpeReagentStatusTotalCount(String reagentLogId, Integer status, String userLogId, String loginId);
 
 	List<OpeReagentStatus> getLogOpeReagentStatusList(String reagentLogId, Integer status, String userLogId,
@@ -98,6 +100,9 @@
 
 	List<String> checkReagentCode(String startReagentCode2, String endReagentCode2,Integer arrivalNum) throws BusinessException;
 
+	List<String> generateReagentCode(String startReagentCode2, String endReagentCode2);
 
 	void updateOpeReagentStatus(OpeReagentStatus opeReagentStatus);
+
+	int getReagentNumInWarehouse(String id, String articleNumber, String warehouseId);
 }
diff --git a/src/main/java/com/nanometer/smartlab/service/OpeReagentStatusServiceImpl.java b/src/main/java/com/nanometer/smartlab/service/OpeReagentStatusServiceImpl.java
index 923413f..30b76c3 100644
--- a/src/main/java/com/nanometer/smartlab/service/OpeReagentStatusServiceImpl.java
+++ b/src/main/java/com/nanometer/smartlab/service/OpeReagentStatusServiceImpl.java
@@ -472,27 +472,28 @@
 		}
 	}
 
+	@Override
 	@Transactional(propagation = Propagation.REQUIRED)
-	public boolean updateReagentStatus(OpeReagentStatus opeReagentStatus) {
+	public boolean updateReagentStatus3(OpeReagentStatus opeReagentStatus) {
 		try {
-
+			//1.判断->试剂状态是否为在仓库
 			if (isAllowWarehouseUse(opeReagentStatus)) {
-				// 减少库存
-				OpeWarehouseReserve opeWarehouseReserve = this.opeWarehouseReserveService.getOpeWarehouseReserve(
-						opeReagentStatus.getReagent().getId(), opeReagentStatus.getArticleNumber());
-				opeWarehouseReserve.setReserve(opeWarehouseReserve.getReserve() - 1);
-				this.opeWarehouseReserveService.updateOpeWarehouseReserve(opeWarehouseReserve);
+				//1.1获得 试剂的库存选择批次
+				List<OpeWarehouseReserve> owrList = this.opeWarehouseReserveService
+						.getOpeWarehouseReserveList(opeReagentStatus.getReagent().getId(), opeReagentStatus.getArticleNumber(),opeReagentStatus.getHouseId());
+				//在同一个仓库有相同批次的试剂,根据时间早的,个数少的先扣除库存
+				owrList.get(0).setReserve(owrList.get(0).getReserve() - 1);
+				this.opeWarehouseReserveService.updateOpeWarehouseReserve(owrList.get(0));
 			}
-
+			//设置 试剂状态->领用待入库
 			opeReagentStatus.setStatus(ArrivalStatus.NOREGISTER);
-
-//			opeReagentStatus.setHouseId(null);
-//			opeReagentStatus.setContainerId(null);
 			int row = this.opeReagentStatusDao.updateOpeReagentStatusDao(opeReagentStatus);
 
 			if (row == 0) {
 				return false;
 			}
+
+
 
 			OpeUseFlow opeUseFlow = new OpeUseFlow();
 			opeUseFlow.setReagentCode(opeReagentStatus.getReagentCode());
@@ -511,6 +512,52 @@
 
 			this.opeUseFlowService.insertOpeUseFlow(opeUseFlow);
 
+			return true;
+		} catch (DuplicateKeyException ex) {
+			logger.warn(ex.getMessage(), ex);
+			throw new AlarmException(AlarmCode.DATA_DUPLICATE,
+					MessageUtil.getMessage(AlarmCode.DATA_DUPLICATE.getCode()));
+		} catch (DataIntegrityViolationException ex) {
+			logger.warn(ex.getMessage(), ex);
+			throw new AlarmException(AlarmCode.DATA_CONFICT, MessageUtil.getMessage(AlarmCode.DATA_CONFICT.getCode()));
+		} catch (DataAccessException ex) {
+			logger.error(ex.getMessage(), ex);
+			throw new BusinessException(ExceptionEnumCode.DB_ERR,
+					MessageUtil.getMessageByCode(ExceptionEnumCode.DB_ERR.getCode()), ex);
+		}
+	}
+
+	@Transactional(propagation = Propagation.REQUIRED)
+	public boolean updateReagentStatus(OpeReagentStatus opeReagentStatus) {
+		try {
+
+			if (isAllowWarehouseUse(opeReagentStatus)) {
+				// 减少库存
+				OpeWarehouseReserve opeWarehouseReserve = this.opeWarehouseReserveService.getOpeWarehouseReserve(
+						opeReagentStatus.getReagent().getId(), opeReagentStatus.getArticleNumber());
+				opeWarehouseReserve.setReserve(opeWarehouseReserve.getReserve() - 1);
+				this.opeWarehouseReserveService.updateOpeWarehouseReserve(opeWarehouseReserve);
+			}
+			opeReagentStatus.setStatus(ArrivalStatus.NOREGISTER);
+			int row = this.opeReagentStatusDao.updateOpeReagentStatusDao(opeReagentStatus);
+			if (row == 0) {
+				return false;
+			}
+			OpeUseFlow opeUseFlow = new OpeUseFlow();
+			opeUseFlow.setReagentCode(opeReagentStatus.getReagentCode());
+			opeUseFlow.setStatus(opeReagentStatus.getStatus());
+			opeUseFlow.setHouseId(opeReagentStatus.getHouseId());
+			opeUseFlow.setContainerId(opeReagentStatus.getContainerId());
+			opeUseFlow.setUserId(opeReagentStatus.getUserId());
+			opeUseFlow.setPlace(opeReagentStatus.getPlace());
+			opeUseFlow.setRemainder(opeReagentStatus.getRemainder());
+
+			Map<String, String> metaMap = new HashMap<>();
+			metaMap.put("groupId", "operate_status");
+			metaMap.put("metaKey", String.valueOf(OperateStatus.WAREHOUSEOUT.getKey()));
+			List<BaseMeta> baseMetaList = baseMetaDao.getBaseMetaList(metaMap);
+			opeUseFlow.setOperateState(baseMetaList.get(0).getId());
+			this.opeUseFlowService.insertOpeUseFlow(opeUseFlow);
 			return true;
 		} catch (DuplicateKeyException ex) {
 			logger.warn(ex.getMessage(), ex);
@@ -884,11 +931,12 @@
 
 		List<String> codeList= new ArrayList<>();
 		//1.做24位的字母判断否则就是纯数字
-		if (startReagentCode2.matches(".*[A-F]+.*")) {
+		if (startReagentCode2.matches(".*\\D+.*")) {
 			//长度为24并且后5位随机码得是数字
 			if (startReagentCode2.length() == 24 &&
 					endReagentCode2.length() == 24 &&
-					startReagentCode2.substring(startReagentCode2.length()-5).matches("/d{5}")) {
+					startReagentCode2.matches(".*([A-F]|\\d)+.*") &&
+					startReagentCode2.substring(startReagentCode2.length()-5).matches("\\d{5}")) {
 				//24位指定编码生成
 				Integer randomStart = Integer.valueOf(startReagentCode2.substring(startReagentCode2.length() - 5));
 				Integer randomEnd = Integer.valueOf(endReagentCode2.substring(endReagentCode2.length() - 5));
@@ -898,7 +946,7 @@
 				if (randomEnd - randomStart + 1 != arrivalNum||!regentPrefix2.equals(regentPrefix)) {
 					throw new BusinessException(ExceptionEnumCode.PARAM_EXIST,"试剂的开始结束条码有问题");
 				}
-				for (int random = randomStart; random < randomEnd; random++) {
+				for (int random = randomStart; random <= randomEnd; random++) {
 					String random5 = String.format("%0" + 5 + "d", random);
 					String reagentCode = regentPrefix + random5;
 					OpeReagentStatus opeReagentStatus = this.getOpeReagentStatusByReagentCode(reagentCode);
@@ -940,10 +988,69 @@
 		return codeList;
 	}
 
+
+	@Override
+	public List<String> generateReagentCode(String startReagentCode2, String endReagentCode2) {
+		if (startReagentCode2 == null || startReagentCode2.length() < 1) {
+			throw new BusinessException(ExceptionEnumCode.REAGENT_CODE_INVALID,"试剂条码不合法");
+		}
+
+		if (endReagentCode2 == null || endReagentCode2.length() < 1) {
+			throw new BusinessException(ExceptionEnumCode.REAGENT_CODE_INVALID,"试剂条码不合法");
+		}
+
+
+
+		List<String> codeList= new ArrayList<>();
+		//1.做24位的字母判断否则就是纯数字
+		if (startReagentCode2.matches(".*\\D+.*")) {
+			//长度为24并且后5位随机码得是数字
+			if (startReagentCode2.length() == 24 &&
+					endReagentCode2.length() == 24 &&
+					startReagentCode2.matches(".*([A-F]|\\d)+.*") &&
+					startReagentCode2.substring(startReagentCode2.length()-5).matches("\\d{5}")) {
+				//24位指定编码生成
+				Integer randomStart = Integer.valueOf(startReagentCode2.substring(startReagentCode2.length() - 5));
+				Integer randomEnd = Integer.valueOf(endReagentCode2.substring(endReagentCode2.length() - 5));
+				String regentPrefix = startReagentCode2.substring(0, startReagentCode2.length() - 5);
+
+				for (int random = randomStart; random <= randomEnd; random++) {
+					String random5 = String.format("%0" + 5 + "d", random);
+					String reagentCode = regentPrefix + random5;
+					codeList.add(reagentCode);
+				}
+				return codeList;
+			}else{
+				throw new BusinessException(ExceptionEnumCode.REAGENT_CODE_INVALID,"试剂条码不合法");
+			}
+		}
+
+		//2.纯数字编码列表生成
+		BigInteger reagentCode= new BigInteger(startReagentCode2);
+		BigInteger endReagentCode = new BigInteger(endReagentCode2);
+
+		while (reagentCode.compareTo(endReagentCode) <= 0) {
+			String reagentCodeStr =  String.format("%0" + startReagentCode2.length() + "d", reagentCode);
+			codeList.add(reagentCodeStr);
+			reagentCode = reagentCode.add(BigInteger.ONE);
+		}
+
+		return codeList;
+	}
+
 	@Override
 	public void updateOpeReagentStatus(OpeReagentStatus opeReagentStatus) {
 		opeReagentStatusDao.updateOpeReagentStatusDao(opeReagentStatus);
 	}
 
+	@Override
+	public int getReagentNumInWarehouse(String id, String articleNumber, String warehouseId) {
+		Map<String, Object> params = new HashMap<>();
+		params.put("reagentId", id);
+		params.put("articleNumber", articleNumber);
+		params.put("warehouseId", warehouseId);
+		return opeReagentStatusDao.countReagentByArticleAndWarehouse(params);
+	}
+
 
 }
diff --git a/src/main/java/com/nanometer/smartlab/service/OpeUseFlowService.java b/src/main/java/com/nanometer/smartlab/service/OpeUseFlowService.java
index 1f93c1d..8c8242d 100644
--- a/src/main/java/com/nanometer/smartlab/service/OpeUseFlowService.java
+++ b/src/main/java/com/nanometer/smartlab/service/OpeUseFlowService.java
@@ -1,6 +1,9 @@
 package com.nanometer.smartlab.service;
 
+import com.nanometer.smartlab.entity.OpeApplyReserve;
 import com.nanometer.smartlab.entity.OpeUseFlow;
+import com.nanometer.smartlab.entity.OpeWarehouseReserve;
+import com.nanometer.smartlab.entity.SysReagent;
 
 import java.text.ParseException;
 import java.util.Date;
@@ -34,4 +37,14 @@
 	void updateTimeByCode(String code);
 
 	OpeUseFlow getOpeUseFlowByCode(String reagentCode);
+
+    void updateReceiptNumber(String code, String receiptNumber);
+
+	void updateReceiptNumberByCode(List<OpeApplyReserve> codeTmp,String receiptNumber);
+
+	Map<String, Integer> getRegentInfoFromReceiptNumber(String receiptNumber);
+
+	Map<String,String>  getApplyUserByReagentCode(String reagentCode);
+
+    void updateReceiptNumberByCode2(List<OpeWarehouseReserve> codeTmp, String receiptNumber);
 }
diff --git a/src/main/java/com/nanometer/smartlab/service/OpeUseFlowServiceImpl.java b/src/main/java/com/nanometer/smartlab/service/OpeUseFlowServiceImpl.java
index bcd04a3..2d7ab3e 100644
--- a/src/main/java/com/nanometer/smartlab/service/OpeUseFlowServiceImpl.java
+++ b/src/main/java/com/nanometer/smartlab/service/OpeUseFlowServiceImpl.java
@@ -1,21 +1,19 @@
 package com.nanometer.smartlab.service;
 
 import java.math.BigDecimal;
-import java.sql.Time;
 import java.sql.Timestamp;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
 
 import javax.annotation.Resource;
-import javax.ejb.EJB;
 
+import com.nanometer.smartlab.dao.BaseMetaDao;
 import com.nanometer.smartlab.dao.SysLaboratoryContainerDao;
 import com.nanometer.smartlab.dao.SysWarehouseContainerDao;
 import com.nanometer.smartlab.entity.*;
+import com.nanometer.smartlab.entity.enumtype.OperateStatus;
 import com.nanometer.smartlab.util.Constants;
-import com.nanometer.smartlab.util.Utils;
-import com.sun.org.apache.regexp.internal.RE;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang3.time.DateUtils;
 import org.apache.log4j.Logger;
@@ -54,6 +52,14 @@
 
     @Resource
     private SysUserService sysUserService;
+    @Resource
+    private OpeReagentStatusService opeReagentStatusService;
+    @Resource
+    private OpeUseFlowService opeUseFlowService;
+    @Resource
+    private SysReagentService sysReagentService;
+    @Resource
+    private BaseMetaDao baseMetaDao;
 
 
     @Transactional(propagation = Propagation.REQUIRED)
@@ -363,4 +369,89 @@
     public OpeUseFlow getOpeUseFlowByCode(String reagentCode) {
         return opeUseFlowDao.getOpeUseFlowByCode(reagentCode);
     }
+
+    @Override
+    public void updateReceiptNumber(String code, String receiptNumber) {
+        opeUseFlowDao.updateReceiptNumber(code, receiptNumber);
+    }
+
+    @Transactional
+    public void updateReceiptNumberByCode(List<OpeApplyReserve> selectedTmpOrderList,String receiptNumber) {
+
+        for (OpeApplyReserve oar : selectedTmpOrderList) {
+            //根据id或者试剂的条码直接查找 状态表单 查询订单所有的流向
+            List<String> codeTmp = opeReagentStatusService
+                    .generateReagentCode(oar.getStartReagentCode2(), oar.getEndReagentCode2());
+            assert codeTmp.size() > 0;
+
+            if (oar.getFlag() == 1) {
+                //库中领取 code存的是 试剂状态的id
+                for (String statusId : codeTmp) {
+                    String code = opeReagentStatusService.getOpeReagentStatus(statusId).getReagentCode();
+                    //此时状态为领用待入库
+                    opeUseFlowService.updateReceiptNumber(code, receiptNumber);
+                }
+            }else{
+                for (String code : codeTmp) {
+                    opeUseFlowService.updateReceiptNumber(code, receiptNumber);
+                }
+            }
+
+        }
+
+
+    }
+
+    @Override
+    public Map<String, Integer> getRegentInfoFromReceiptNumber(String receiptNumber) {
+        List<Map> maps = opeUseFlowDao.getRegentInfoFromReceiptNumber(receiptNumber);
+        if (maps.size() > 0) {
+            Map<String, Integer> printInfo = new HashMap<>();
+            for (Map map : maps) {
+                Integer count =Integer.parseInt(String.valueOf(map.get("count")));;
+                String reagentId = (String) map.get("reagentId");
+                SysReagent reagent = sysReagentService.getSysReagent(reagentId);
+                printInfo.put(reagent.getId(), count);
+            }
+            return printInfo;
+        }
+
+        return null;
+    }
+
+    @Override
+    public Map getApplyUserByReagentCode(String reagentCode) {
+
+        Map<String, String> metaMap2 = new HashMap<>();
+        metaMap2.put("groupId", "operate_status");
+        metaMap2.put("metaKey", String.valueOf(OperateStatus.WAREHOUSEOUT.getKey()));
+        List<BaseMeta> baseMetaList2 = baseMetaDao.getBaseMetaList(metaMap2);
+        String id = baseMetaList2.get(0).getId();
+        return opeUseFlowDao.getUserIdByReagentCode(reagentCode, id);
+    }
+
+    @Override
+    public void updateReceiptNumberByCode2(List<OpeWarehouseReserve> selectTmpList, String receiptNumber) {
+        for (OpeWarehouseReserve owr : selectTmpList) {
+            //根据id或者试剂的条码直接查找 状态表单 查询订单所有的流向
+            List<String> codeTmp = opeReagentStatusService
+                    .generateReagentCode(owr.getStartReagentCode2(), owr.getEndReagentCode2());
+            assert codeTmp.size() > 0;
+
+            if (owr.getFlag() == 1) {
+                //库中领取 code存的是 试剂状态的id
+                for (String statusId : codeTmp) {
+                    String code = opeReagentStatusService.getOpeReagentStatus(statusId).getReagentCode();
+                    //此时状态为领用待入库
+                    opeUseFlowService.updateReceiptNumber(code, receiptNumber);
+                }
+            }else{
+                for (String code : codeTmp) {
+                    opeUseFlowService.updateReceiptNumber(code, receiptNumber);
+                }
+            }
+
+        }
+
+    }
 }
diff --git a/src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveService.java b/src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveService.java
index d7f1d38..07a1fdd 100644
--- a/src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveService.java
+++ b/src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveService.java
@@ -20,17 +20,31 @@
 	int getOpeWarehouseReserveTotalCountByName(String reagentId, String supplierId,String productSn);
 	OpeWarehouseReserve getOpeWarehouseReserve(String reagentId, String articleNumber);
 	OpeWarehouseReserve getOpeWarehouseReserve2(String reagentId, String articleNumber,String warehouseId);
+
+	List<OpeWarehouseReserve> getOpeWarehouseReserveList(String reagentId, String articleNumber,String warehouseId);
 	OpeWarehouseReserve getOpeWarehouseReserveBy(String reagentId, String articleNumber);
 
 	OpeWarehouseReserve insertOpeWarehouseReserve(OpeWarehouseReserve opeWarehouseReserve);
 	boolean updateOpeWarehouseReserve(OpeWarehouseReserve opeWarehouseReserve);
 	void claim(List<OpeWarehouseReserve> selectedList, String userId,String projectNum);
-	void claimForPerson(List<OpeApplyReserve> selectedListForPerson, String userId,String projectNum);
+	void claimForPerson(List<OpeApplyReserve> selectedListForPerson, String userId,String projectNum,String laboratoryId,String laboratoryContainerId);
 	void reagentDStore(List<OpeApply> reagentDStoreList, String loginUserId);
 	void reagentDStore2(List<OpeApply> reagentDStoreList, String loginUserId);
+
+	void reagentDStore3(List<OpeApply> reagentDStoreList, String loginUserId);
+
+	void reagentDStore4(List<OpeApply> reagentDStoreList, String loginUserId);
 
 	public List<OpeWarehouseReserve> selectByReId(String id);
 	public void updateByReId(String newReId,String oldReId);
 
 	void insertOpeWarehouseReserve2(OpeApplyReserve opeApplyReserve, OpeOrder oo);
+
+	List<OpeWarehouseReserve> selectWarehouseByReagentIdAndArticleNumber(String id,String articleNumber,boolean flag);
+
+	void btWarehouseReserveReduce(List<OpeApplyReserve> opeList,String userId);
+
+	List<OpeWarehouseReserve> selectWarehouseByRidAndArticleNumberAndWarehouse(String id, String articleNumber, String warehouseId);
+
+	void updateBtReserve(String id,Integer useNum);
 }
diff --git a/src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveServiceImpl.java b/src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveServiceImpl.java
index 5a3b5b5..c26f32f 100644
--- a/src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveServiceImpl.java
+++ b/src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveServiceImpl.java
@@ -7,6 +7,7 @@
 import javax.annotation.Resource;
 
 import com.nanometer.smartlab.dao.OpeApplyDao;
+import com.nanometer.smartlab.dao.OpeReagentStatusDao;
 import com.nanometer.smartlab.entity.*;
 import com.nanometer.smartlab.entity.enumtype.ValidFlag;
 import com.nanometer.smartlab.exception.AlarmCode;
@@ -55,6 +56,10 @@
 
     @Resource(name="opeApplyDao")
 	private OpeApplyDao opeApplyDao;
+	@Resource
+	private OpeReagentStatusDao opeReagentStatusDao;
+	@Resource
+	private OpeLaboratoryReserveService opeLaboratoryReserveService;
 
 	@Transactional(propagation = Propagation.REQUIRED)
 	public List<OpeWarehouseReserve> getOpeWarehouseReserveList(String reagentId, String supplierId, Integer first,
@@ -165,6 +170,17 @@
 					MessageUtil.getMessageByCode(ExceptionEnumCode.DB_ERR.getCode()), e);
 		}
 	}
+
+	@Override
+	public List<OpeWarehouseReserve> getOpeWarehouseReserveList(String reagentId, String articleNumber,String warehouseId) {
+		Map<String, String> params = new HashMap<>();
+		params.put("reagentId", reagentId);
+		params.put("warehouseId", warehouseId);
+		params.put("articleNumber", articleNumber);
+
+		return this.opeWarehouseReserveDao.getOpeWarehouseReserveList2(params);
+	}
+
 	@Transactional(propagation = Propagation.REQUIRED)
 	public OpeWarehouseReserve insertOpeWarehouseReserve(OpeWarehouseReserve opeWarehouseReserve) {
 		try {
@@ -208,7 +224,7 @@
 	}
 
 	@Transactional(propagation = Propagation.REQUIRED)
-	public void claimForPerson(List<OpeApplyReserve> selectedListForPerson,String userId,String projectNum){
+	public void claimForPerson(List<OpeApplyReserve> selectedListForPerson,String userId,String projectNum,String laboratoryId,String laboratoryContainerId){
 		try{
 			for(OpeApplyReserve app:selectedListForPerson){
 				List<String> reagentCodes = app.getReagentCode();
@@ -219,9 +235,23 @@
 						opeReagentStatus.setUserId(userId);
 						opeReagentStatus.setProjectNum(projectNum);
 						//boolean flag = this.opeReagentStatusService.updateReagentStatus(opeReagentStatus);
-						this.opeReagentStatusService.updateReagentStatus(opeReagentStatus);
+						this.opeReagentStatusService.updateReagentStatus3(opeReagentStatus);
 						ss.add(opeReagentStatus);
+						//更新试剂状态和
+						opeReagentStatus.setHouseId(laboratoryId);
+						opeReagentStatus.setContainerId(laboratoryContainerId);
+						this.opeReagentStatusDao.updateOpeReagentStatusDao(opeReagentStatus);
+
 					}
+					//更新是现实库存
+					OpeLaboratoryReserve lr=new OpeLaboratoryReserve();
+					lr.setReagentId(app.getReagent().getId());
+					lr.setHouseId(laboratoryId);
+					lr.setContainerId(laboratoryContainerId);
+					lr.setReserve(app.getSelectNum());
+					lr.setUserId(userId);
+					lr.setValidFlag(ValidFlag.VALID);
+					this.opeLaboratoryReserveService.insert(lr);
 					/*HashSet<String> set=new HashSet<>();//存放批号
 					for(int i=0;i<ss.size();i++){
 						set.add(ss.get(i).getArticleNumber());
@@ -420,6 +450,135 @@
 		}
 	}
 
+	public void reagentDStore4(List<OpeApply> reagentDStoreList, String loginUserId){
+		if (reagentDStoreList == null) {
+			return;
+		}
+		OpeReagentStatus opeReagentStatus = null;
+		for (OpeApply opeApply : reagentDStoreList) {
+			List<String> codeList = opeApply.getReagentCodeList();
+			for (String reagentCode:codeList) {
+				if (this.opeReagentStatusService.isOpeReagentStatusExist(reagentCode)) {//条码存在
+					//throw new BusinessException(ExceptionEnumCode.REAGENT_CODE_EXIST, "入库试剂:" + opeApply.getReagent().getName() + "的试剂条形码[" + reagentCode + "]已存在。");
+					// 试剂最新状态update
+					opeReagentStatus=this.opeReagentStatusService.getOpeReagentStatusByReagentCode(reagentCode);
+					//opeReagentStatus = new OpeReagentStatus();
+					//opeReagentStatus.setId(id);
+					//opeReagentStatus.setReagentId(opeApply.getReagent().getId());
+					opeReagentStatus.setArticleNumber(opeApply.getArticleNumber());
+					opeReagentStatus.setReagentCode(reagentCode);
+					opeReagentStatus.setStatus(ArrivalStatus.NOREGISTER);
+					opeReagentStatus.setHouseId(opeApply.getHouseId());
+					opeReagentStatus.setContainerId(opeApply.getContainerId());
+					opeReagentStatus.setUserId(loginUserId);
+					//opeReagentStatus.setPlace(opeApply.getPlaceId());
+					//opeReagentStatus.setRemainder(opeApply.getReagent().getMainMetering()!=null?(new BigDecimal(opeApply.getReagent().getMainMetering())):new BigDecimal(0));
+					//opeReagentStatus.setStoreType(StoreType.DIRECTSTORE);
+					this.opeReagentStatusService.updateReagentStatus2(opeReagentStatus);
+
+					// 试剂使用情况领用insert
+					/*OpeUseFlow ouf=new OpeUseFlow();
+					ouf.setReagentCode(opeReagentStatus.getReagentCode());
+					ouf.setStatus(opeReagentStatus.getStatus());
+					ouf.setHouseId(opeReagentStatus.getHouseId());
+					ouf.setContainerId(opeReagentStatus.getContainerId());
+					ouf.setUserId(opeReagentStatus.getUserId());
+					ouf.setPlace(opeReagentStatus.getPlace());
+					ouf.setRemainder(opeApply.getReagent().getMainMetering()!=null?(new BigDecimal(opeApply.getReagent().getMainMetering())):new BigDecimal(0));
+					ouf.setStoreType(StoreType.DIRECTSTORE);
+
+					Map<String, String> metaMap2 = new HashMap<>();
+					metaMap2.put("groupId", "operate_status");
+					metaMap2.put("metaKey", String.valueOf(OperateStatus.WAREHOUSEOUT.getKey()));
+					List<BaseMeta> baseMetaList2 = baseMetaDao.getBaseMetaList(metaMap2);
+					ouf.setOperateState(baseMetaList2.get(0).getId());
+					this.opeUseFlowService.insertOpeUseFlow(ouf);*/
+				}else{//条码不存在
+					// 试剂最新状态insert
+					opeReagentStatus = new OpeReagentStatus();
+					opeReagentStatus.setReagentId(opeApply.getReagent().getId());
+					opeReagentStatus.setArticleNumber(opeApply.getArticleNumber());
+					opeReagentStatus.setReagentCode(reagentCode);
+					opeReagentStatus.setStatus(ArrivalStatus.NOREGISTER);
+					opeReagentStatus.setHouseId(opeApply.getHouseId());
+					opeReagentStatus.setContainerId(opeApply.getContainerId());
+					opeReagentStatus.setUserId(loginUserId);
+					//opeReagentStatus.setPlace(opeApply.getPlaceId());
+					//opeReagentStatus.setRemainder(opeApply.getReagent().getMainMetering()!=null?(new BigDecimal(opeApply.getReagent().getMainMetering())):new BigDecimal(0));
+					opeReagentStatus.setStoreType(StoreType.DIRECTSTORE);
+					this.opeReagentStatusService.insertOpeReagentStatus(opeReagentStatus);
+
+
+					// 试剂使用情况领用insert
+					OpeUseFlow ouf=new OpeUseFlow();
+					ouf.setReagentCode(opeReagentStatus.getReagentCode());
+					ouf.setStatus(opeReagentStatus.getStatus());
+					ouf.setHouseId(opeReagentStatus.getHouseId());
+					ouf.setContainerId(opeReagentStatus.getContainerId());
+					ouf.setUserId(opeReagentStatus.getUserId());
+					ouf.setPlace(opeReagentStatus.getPlace());
+					ouf.setRemainder(opeApply.getReagent().getMainMetering()!=null?opeApply.getReagent().getMainMetering():new BigDecimal(0));
+					ouf.setStoreType(StoreType.DIRECTSTORE);
+
+					Map<String, String> metaMap2 = new HashMap<>();
+					metaMap2.put("groupId", "operate_status");
+					metaMap2.put("metaKey", String.valueOf(OperateStatus.WAREHOUSEOUT.getKey()));
+					List<BaseMeta> baseMetaList2 = baseMetaDao.getBaseMetaList(metaMap2);
+					ouf.setOperateState(baseMetaList2.get(0).getId());
+					this.opeUseFlowService.insertOpeUseFlow(ouf);
+				}
+			}
+
+		}
+	}
+	public void reagentDStore3(List<OpeApply> reagentDStoreList, String loginUserId){
+		if (reagentDStoreList == null) {
+			return;
+		}
+		for (OpeApply opeApply : reagentDStoreList) {
+
+			for (String reagentCode:opeApply.getReagentCodeList()) {
+				if (this.opeReagentStatusService.isOpeReagentStatusExist(reagentCode)) {
+					//条码存在
+					throw new BusinessException(ExceptionEnumCode.REAGENT_CODE_EXIST, "入库试剂:" + opeApply.getReagent().getName() + "的试剂条形码[" + reagentCode + "]已存在。");
+
+				}else{
+					//条码不存在
+					// 试剂状态insert
+					OpeReagentStatus opeReagentStatus = new OpeReagentStatus();
+					opeReagentStatus.setReagentId(opeApply.getReagent().getId());
+					opeReagentStatus.setArticleNumber(opeApply.getArticleNumber());
+					opeReagentStatus.setReagentCode(reagentCode);
+					opeReagentStatus.setStatus(ArrivalStatus.NOREGISTER);
+					opeReagentStatus.setHouseId(opeApply.getHouseId());
+					opeReagentStatus.setContainerId(opeApply.getContainerId());
+					opeReagentStatus.setUserId(loginUserId);
+					opeReagentStatus.setStoreType(StoreType.DIRECTSTORE);
+					this.opeReagentStatusService.insertOpeReagentStatus(opeReagentStatus);
+
+
+					// 试剂使用情况领用insert
+					OpeUseFlow ouf=new OpeUseFlow();
+					ouf.setReagentCode(opeReagentStatus.getReagentCode());
+					ouf.setStatus(opeReagentStatus.getStatus());
+					ouf.setHouseId(opeReagentStatus.getHouseId());
+					ouf.setContainerId(opeReagentStatus.getContainerId());
+					ouf.setUserId(opeReagentStatus.getUserId());
+					ouf.setPlace(opeReagentStatus.getPlace());
+					ouf.setRemainder(opeApply.getReagent().getMainMetering()!=null?opeApply.getReagent().getMainMetering():new BigDecimal(0));
+					ouf.setStoreType(StoreType.DIRECTSTORE);
+
+					Map<String, String> metaMap2 = new HashMap<>();
+					metaMap2.put("groupId", "operate_status");
+					metaMap2.put("metaKey", String.valueOf(OperateStatus.WAREHOUSEOUT.getKey()));
+					List<BaseMeta> baseMetaList2 = baseMetaDao.getBaseMetaList(metaMap2);
+					ouf.setOperateState(baseMetaList2.get(0).getId());
+					this.opeUseFlowService.insertOpeUseFlow(ouf);
+				}
+			}
+
+		}
+	}
 	@Override
 	public List<OpeWarehouseReserve> selectByReId(String id) {
 		return this.opeWarehouseReserveDao.selectByReId(id);
@@ -437,25 +596,155 @@
 	@Transactional
     public void insertOpeWarehouseReserve2(OpeApplyReserve opeApplyReserve, OpeOrder oo) {
 
-		OpeWarehouseReserve ope = new OpeWarehouseReserve();
-		//库存为到货数量
-		ope.setReserve(opeApplyReserve.getArrivalNum());
-		//仓库
-		ope.setWarehouseId(opeApplyReserve.getHouseId());
-		//试剂
-		ope.setReagentId(opeApplyReserve.getReagent().getId());
-		//订单编号
-		ope.setOrderCode(oo.getOrderCode());
-		// 申购编号
-		ope.setApplyCode(opeApplyReserve.getApplyCode());
-		//批号
-		ope.setArticleNumber(opeApplyReserve.getArticleNumber());
-		ope.setId(IDUtils.uuid());
-		opeWarehouseReserveDao.insertOpeWarehouseReserve2(ope);
+		OpeWarehouseReserve ope = this.opeWarehouseReserveService
+				.getOpeWarehouseReserve2(opeApplyReserve.getReagent().getId(), opeApplyReserve.getArticleNumber(),opeApplyReserve.getHouseId());
+		if (ope == null) {
+
+			ope = new OpeWarehouseReserve();
+			//库存为到货数量
+			ope.setReserve(opeApplyReserve.getArrivalNum());
+			//仓库
+			ope.setWarehouseId(opeApplyReserve.getHouseId());
+			//仓库的货柜号
+			ope.setContainerId(opeApplyReserve.getContainerId());
+			//试剂
+			ope.setReagentId(opeApplyReserve.getReagent().getId());
+			//订单编号
+			ope.setOrderCode(oo.getOrderCode());
+			// 申购编号
+			ope.setApplyCode(opeApplyReserve.getApplyCode());
+			//批号
+			ope.setArticleNumber(opeApplyReserve.getArticleNumber());
+			ope.setId(IDUtils.uuid());
+			opeWarehouseReserveDao.insertOpeWarehouseReserve2(ope);
+		}else {
+			ope.setReserve(ope.getReserve() + opeApplyReserve.getArrivalNum());
+			this.opeWarehouseReserveService.updateOpeWarehouseReserve(ope);
+		}
+
+
+
 
     }
 
-    @Transactional(propagation = Propagation.REQUIRED)
+	@Override
+	public List<OpeWarehouseReserve> selectWarehouseByReagentIdAndArticleNumber(String id,String articleNumber,boolean flag) {
+		Map<String, String> params = new HashMap<>();
+		params.put("reagentId", id);
+		params.put("articleNumber", articleNumber);
+		List<OpeWarehouseReserve> reserveList = opeWarehouseReserveDao.selectWarehouseByReagentIdAndArticleNumber(params);
+		//减去 每个仓库中的试剂有条码的个数
+		//count(reagent_id,warehouseId,1)
+		if (reserveList.size() > 0) {
+			for (OpeWarehouseReserve owr : reserveList) {
+				//根据批次号 仓库名和试剂 得到在仓库有条码的试剂总数
+				if (flag) {
+					int numOfReagentHasCode = opeReagentStatusService.getReagentNumInWarehouse(id, articleNumber, owr.getWarehouseId());
+					//仓库显示 可以补贴条码的试剂总数
+					owr.setReserve(owr.getReserve()-numOfReagentHasCode);
+				}
+			}
+		}
+		return reserveList;
+	}
+	/**
+	* 补贴扣库存去除有条码的数据
+	*/
+	public List<OpeWarehouseReserve> selectWarehouseByRidAndArticleNumberAndWarehouse(String id,String articleNumber,String warehouseId) {
+		Map<String, String> params = new HashMap<>();
+		params.put("reagentId", id);
+		params.put("articleNumber", articleNumber);
+		params.put("warehouseId", warehouseId);
+		List<OpeWarehouseReserve> reserveList = opeWarehouseReserveDao.selectWarehouseByRidAndArtiNumberAndWid(params);
+		//减去 每个仓库中的试剂有条码的个数
+		//count(reagent_id,warehouseId,1)
+		if (reserveList.size() > 0) {
+			for (OpeWarehouseReserve owr : reserveList) {
+				//根据批次号 仓库名和试剂 得到在仓库有条码的试剂总数
+				int numOfReagentHasCode = opeReagentStatusService.getReagentNumInWarehouse(id, owr.getArticleNumber(), owr.getWarehouseId());
+				//仓库显示 可以补贴条码的试剂总数
+				owr.setReserve(owr.getReserve()-numOfReagentHasCode);
+			}
+		}
+		return reserveList;
+	}
+
+	@Override
+	public void updateBtReserve(String id, Integer useNum) {
+		opeWarehouseReserveDao.updateBtReserve(id, useNum);
+	}
+
+	@Override
+	public void btWarehouseReserveReduce(List<OpeApplyReserve> opeList,String userId) {
+		if (opeList.size() < 1) {
+			return;
+		}
+		for (OpeApplyReserve oar : opeList) {
+			String reagentId = oar.getReagent().getId();
+			List<String> reagentCodes = new ArrayList<>(oar.getReagentCode());
+			//开始库存扣除
+			List<OpeWarehouseReserve> cacheUpdateList = oar.getCacheUpdateList();
+			for (OpeWarehouseReserve owr : cacheUpdateList) {
+				//1.根据仓库id和试剂id搜索不同批号的试剂库存
+				List<OpeWarehouseReserve> reserveList = opeWarehouseReserveService
+						.selectWarehouseByRidAndArticleNumberAndWarehouse(reagentId, owr.getArticleNumber(), owr.getWarehouseId());
+				Integer numLeave = owr.getUseNum();
+
+				for (OpeWarehouseReserve warehouseReserve:reserveList){
+					//库存大于剩余领用-》直接扣完
+					int usedNum = 0;
+					if (warehouseReserve.getReserve() > numLeave) {
+					//	warehouseReserve.setReserve(warehouseReserve.getReserve() - numLeave);
+						usedNum = numLeave;
+						numLeave = 0;
+					} else {
+						numLeave = numLeave - warehouseReserve.getReserve();
+					//	warehouseReserve.setReserve(0);
+						usedNum =  warehouseReserve.getReserve();
+					}
+
+					//更新流向,加入一条
+					if (usedNum > 0) {
+						for (int i = 0; i < usedNum; i++) {
+							// 试剂使用情况入库insert TODO 流向需要当时的时间和地点
+							OpeUseFlow opeUseFlow = new OpeUseFlow();
+							opeUseFlow.setReagentCode(reagentCodes.get(0));
+							opeUseFlow.setStatus(ArrivalStatus.WAREHOUSE);
+							opeUseFlow.setUserId(userId);
+							//仓库地点
+							opeUseFlow.setHouseId(warehouseReserve.getWarehouseId());
+							opeUseFlow.setContainerId(warehouseReserve.getContainerId());
+							opeUseFlow.setRemainder(oar.getReagent().getMainMetering()!=null?oar.getReagent().getMainMetering():new BigDecimal(0));
+							//入库时间
+							opeUseFlow.setCreateTime(warehouseReserve.getUpdateTime());
+							opeUseFlow.setStoreType(StoreType.DIRECTSTORE);
+
+							Map<String, String> metaMap = new HashMap<>();
+							metaMap.put("groupId", "operate_status");
+							metaMap.put("metaKey", String.valueOf(OperateStatus.WAREHOUSEIN.getKey()));
+							List<BaseMeta> baseMetaList = baseMetaDao.getBaseMetaList(metaMap);
+							opeUseFlow.setOperateState(baseMetaList.get(0).getId());
+							this.opeUseFlowService.insertOpeUseFlow(opeUseFlow);
+							reagentCodes.remove(0);
+						}
+
+					}
+
+					
+					//更新库存
+					opeWarehouseReserveService.updateBtReserve(warehouseReserve.getId(),usedNum);
+					if (numLeave < 1) {
+						break;
+					}
+			}
+
+
+
+		}
+		}
+	}
+
+	@Transactional(propagation = Propagation.REQUIRED)
 	public void reagentDStore(List<OpeApply> reagentDStoreList, String loginUserId) {
 
 		if (reagentDStoreList == null) {
@@ -537,6 +826,7 @@
                 opeWarehouseReserve.setArticleNumber(opeApply.getArticleNumber());
                 opeWarehouseReserve.setReserve(0);
                 opeWarehouseReserve.setWarehouseId(opeApply.getHouseId());
+                opeWarehouseReserve.setContainerId(opeApply.getContainerId());
             }
             opeWarehouseReserve.setReserve(opeWarehouseReserve.getReserve() + opeApply.getArrivalNum());
             if (StringUtils.isBlank(opeWarehouseReserve.getId())) {
diff --git a/src/main/webapp/order_input_warehouse.xhtml b/src/main/webapp/order_input_warehouse.xhtml
index 060e5a4..ee15bf2 100644
--- a/src/main/webapp/order_input_warehouse.xhtml
+++ b/src/main/webapp/order_input_warehouse.xhtml
@@ -46,7 +46,7 @@
                                      actionListener="#{warehouseStockMngController.onCancelBtnClick}"
                                      styleClass="cancel-btn"/>
 
-                    <p:commandButton value="确定"
+                    <p:commandButton value="保存"
                                      process="@form"
                                      update=":centerRootPanel"
                                      actionListener="#{warehouseStockMngController.onSaveInputWarehouseClick}"
diff --git a/src/main/webapp/order_mng_ruku.xhtml b/src/main/webapp/order_mng_ruku.xhtml
index fe90a89..fad8cbd 100644
--- a/src/main/webapp/order_mng_ruku.xhtml
+++ b/src/main/webapp/order_mng_ruku.xhtml
@@ -118,7 +118,7 @@
                             <h:outputText value="#{row.articleNumber}" />
                         </f:facet>
                         <f:facet name="input">
-                            <p:inputText value="#{row.articleNumber}" maxlength="32" style="width: 100%"/>
+                            <p:inputText value="#{row.articleNumber}" maxlength="32" style="width: 100%" required="true" requiredMessage="请输入批号"/>
                         </f:facet>
                     </p:cellEditor>
                 </p:column>
diff --git a/src/main/webapp/project_mng.xhtml b/src/main/webapp/project_mng.xhtml
index d859bb3..238c70e 100644
--- a/src/main/webapp/project_mng.xhtml
+++ b/src/main/webapp/project_mng.xhtml
@@ -96,7 +96,7 @@
                         <p:outputLabel value="课题编号"></p:outputLabel>
                     </p:column>
                     <p:column>
-                        <p:inputText value="#{projectMngController.sysProject.projectId}"></p:inputText>
+                        <p:inputText value="#{projectMngController.sysProject.projectId}" required="true" requiredMessage="请填写课题编号"></p:inputText>
                     </p:column>
                 </p:row>
                 <p:row>
@@ -104,7 +104,7 @@
                         <p:outputLabel value="课题名称"></p:outputLabel>
                     </p:column>
                     <p:column>
-                        <p:inputText value="#{projectMngController.sysProject.projectName}"></p:inputText>
+                        <p:inputText value="#{projectMngController.sysProject.projectName}" required="true" requiredMessage="请填写课题名称"></p:inputText>
                     </p:column>
                 </p:row>
                 <p:row>
@@ -120,7 +120,7 @@
                                         itemValue="#{item.id}" forceSelection="true">
                             <p:ajax event="itemSelect" process="@this" update="@this" />
                             <p:column>
-                                <h:outputText value="#{item.name}" />
+                                <h:outputText value="#{item.name}" required="true" requiredMessage="请填写课题负责人"/>
                             </p:column>
                         </p:autoComplete>
                     </p:column>
diff --git a/src/main/webapp/reagent_mng.xhtml b/src/main/webapp/reagent_mng.xhtml
index 93964e3..5c0222d 100644
--- a/src/main/webapp/reagent_mng.xhtml
+++ b/src/main/webapp/reagent_mng.xhtml
@@ -39,7 +39,7 @@
             </p:panelGrid>
         </p:panel>
         <p:panel styleClass="center-body">
-            <p:panelGrid columns="5" styleClass="btn">
+            <p:panelGrid columns="7" styleClass="btn">
                 <p:commandButton value="新建" styleClass="new-btn"
                                  process="@this"
                                  actionListener="#{reagentMngController.onNewBtnClick}"
@@ -57,8 +57,10 @@
                 </p:commandButton>
 				<p:commandButton value="试剂导入" styleClass="import-btn" onclick="importReagent()"
                 ></p:commandButton>
+                <a href="resources/template/试剂导入模板.xlsx" style="display: inline-block;"><img src="resources/images/xlsx.png" width="30px;" alt=""/></a>
                 <p:commandButton value="耗材导入" styleClass="import-btn" onclick="importReagent2()"
                 ></p:commandButton>
+                <a href="resources/template/耗材导入模板.xlsx" style="display: inline-block;"><img src="resources/images/xlsx.png" width="30px;" alt=""/></a>
                 <script>
 					function importReagent(){
 						$("#reagentMngForm\\:importReagentBtn_input").click();
diff --git a/src/main/webapp/reagent_user_flow_info.xhtml b/src/main/webapp/reagent_user_flow_info.xhtml
index 91e413b..02ca1f0 100644
--- a/src/main/webapp/reagent_user_flow_info.xhtml
+++ b/src/main/webapp/reagent_user_flow_info.xhtml
@@ -33,7 +33,118 @@
 				</p:panelGrid>
 			</p:panel>
 		</p:panel>
+
 		<p:panel styleClass="center-body">
+			<p:dialog id="apply-ui" header="领用单" widgetVar="printDialog" appendTo="@(body)" modal="true" resizable="false"
+			width="1000">
+				<div id="printTarget">
+					<div style=" margin: 10mm 10mm 0mm 2mm;">
+						<h:form id="printDialog">
+
+							<p:outputPanel style="text-align: center;font-size: 14px;font-weight: 700;">#{opeUseFlowInfoController.printTable['head']}</p:outputPanel>
+							<p:outputPanel style="text-align: center;font-size: 15px;margin: 20px;font-weight: 700;">#{opeUseFlowInfoController.printTable['title']}</p:outputPanel>
+							<div>
+								<div style="display: flex;flex-direction: row;justify-content: flex-end;">
+									<div style="width: 100px;">单据编号:</div>
+									<div style="width: 300px;">#{opeUseFlowInfoController.printTable['receiptNumber']}</div>
+								</div>
+							</div>
+
+							<div style="margin: 10px 0;">
+								<div style="display: inline-flex;">
+									<div style="width: 100px;margin-left: 10px;">部门:</div>
+									<div style="width: 300px;">#{opeUseFlowInfoController.printTable['department']}</div>
+								</div>
+								<div style="display: inline-flex;float: right;">
+									<div style="width: 100px;">日期:</div>
+									<div style="width: 300px;padding-top: 1px;">
+										<div>#{opeUseFlowInfoController.printTable['date']}</div>
+									</div>
+								</div>
+							</div>
+
+							<div style="margin-bottom: 20px;">
+								<div style="display: inline-flex;">
+									<div style="width: 100px;margin-left: 10px;">申购人:</div>
+									<div style="width: 300px;">#{opeUseFlowInfoController.printTable['applyPerson']}</div>
+								</div>
+								<div style="display: inline-flex;float: right;">
+									<div style="width: 100px;">联系方式:</div>
+									<div style="width: 300px;">
+										<div >#{opeUseFlowInfoController.printTable['phone']}</div>
+									</div>
+								</div>
+							</div>
+
+
+
+
+							<p:dataTable id="printTB" styleClass="apply-list"
+										 value="#{opeUseFlowInfoController.printTable['applyList']}" var="row" >
+								<p:column headerText="产品编号" width="150px;" style="text-align: center;">
+									<h:outputText value="#{row.productCode}" />
+								</p:column>
+								<p:column headerText="产品名称" width="150px;" style="text-align: center;">
+									<h:outputText value="#{row.productName}" />
+								</p:column>
+
+								<p:column headerText="管制品" width="100px;" style="text-align: center;">
+									<h:outputText value="#{row.controlProducts}" />
+								</p:column>
+
+								<p:column headerText="规格型号" width="160px;" style="text-align: center;">
+									<h:outputText value="#{row.reagentFormat}" />
+								</p:column>
+
+								<p:column headerText="包装" width="90px;" style="text-align: center;">
+									<h:outputText value="#{row.mainMetering==null?'':row.mainMetering}" />
+								</p:column>
+
+								<p:column headerText="数量" width="90px;" style="text-align: center;">
+									<h:outputText value="#{row.num}" />
+								</p:column>
+
+								<p:column headerText="备注" width="170px;" style="text-align: center;">
+									<h:outputText value="#{row.memo}" />
+								</p:column>
+							</p:dataTable>
+
+							<div style="margin-top: 20px;">
+								<div style="display: flex;flex-direction: row;justify-content: flex-end;">
+									<div style="width: 100px">签收人:</div>
+									<div style="width: 300px"></div>
+								</div>
+							</div>
+
+							<div style="margin: 10px 0">
+								<div style="display: flex;flex-direction: row;justify-content: flex-end;">
+									<div style="width: 100px">日期:</div>
+									<div style="width: 300px"></div>
+								</div>
+							</div>
+
+							<p:panel styleClass="btn  no-print">
+								<div class="div-btn cancel" id="cancel">关闭</div>
+								<div class="div-btn print" id="print">打印</div>
+							</p:panel>
+						</h:form>
+					</div>
+				</div>
+				<script type="text/javascript" src="resources/js/print.js"/>
+				<script type="text/javascript">
+					$(function () {
+						$("#print").on("click", function () {
+							jQuery.print('#printTarget');
+						});
+						$("#cancel").on("click", function () {
+							$("#reagentUseFlowInfoForm\\:apply-ui a").click();
+						})
+					})
+
+
+				</script>
+			</p:dialog>
+
 			<p:dataTable id="reagentUseFlowInfoDataTable" styleClass="data-table"
 				paginator="true" paginatorAlwaysVisible="false" paginatorPosition="bottom"
 				lazy="true" value="#{opeUseFlowInfoController.dataModel}" var="row"
@@ -80,6 +191,22 @@
                     <h:outputText value="#{row.warehouseName}" rendered="#{!empty row.warehouseName}"/>
 				</p:column>
 
+<!--				<p:column headerText="领用单号">-->
+<!--					<h:outputText value="#{row.receiptNumber}"/>-->
+<!--				</p:column>-->
+
+
+<!--				<p:column headerText="操作" style="text-align: center">-->
+<!--				<p:commandButton value="生成领用单"-->
+<!--								 actionListener="#{opeUseFlowInfoController.generateRecipients(row)}"-->
+<!--								 rendered="#{row.receiptNumber != null}"-->
+<!--								 update="reagentUseFlowInfoForm:apply-ui"-->
+<!--								 oncomplete="PF('printDialog').show()"-->
+<!--								 async="true"-->
+<!--				>-->
+<!--				</p:commandButton>-->
+<!--				</p:column>-->
+
 			</p:dataTable>
 		</p:panel>
 	</h:form>
diff --git a/src/main/webapp/resources/css/default.css b/src/main/webapp/resources/css/default.css
index b35cb19..04dcbe4 100644
--- a/src/main/webapp/resources/css/default.css
+++ b/src/main/webapp/resources/css/default.css
@@ -1107,4 +1107,10 @@
 
 #tabView\:putInStorageTmpOrder th{
     background: #1c427b !important;
-}
\ No newline at end of file
+}
+
+.reagentCode th{
+    background: #64a9cb !important;
+    border-radius: 0 !important;
+    color: #ffffff !important;
+}
diff --git "a/src/main/webapp/resources/template/\350\200\227\346\235\220\345\257\274\345\205\245\346\250\241\346\235\277.xlsx" "b/src/main/webapp/resources/template/\350\200\227\346\235\220\345\257\274\345\205\245\346\250\241\346\235\277.xlsx"
new file mode 100644
index 0000000..65be38e
--- /dev/null
+++ "b/src/main/webapp/resources/template/\350\200\227\346\235\220\345\257\274\345\205\245\346\250\241\346\235\277.xlsx"
Binary files differ
diff --git "a/src/main/webapp/resources/template/\350\257\225\345\211\202\345\257\274\345\205\245\346\250\241\346\235\277.xlsx" "b/src/main/webapp/resources/template/\350\257\225\345\211\202\345\257\274\345\205\245\346\250\241\346\235\277.xlsx"
new file mode 100644
index 0000000..b0aa021
--- /dev/null
+++ "b/src/main/webapp/resources/template/\350\257\225\345\211\202\345\257\274\345\205\245\346\250\241\346\235\277.xlsx"
Binary files differ
diff --git a/src/main/webapp/warehouse_reagent_use.xhtml b/src/main/webapp/warehouse_reagent_use.xhtml
index 744234c..5232d75 100644
--- a/src/main/webapp/warehouse_reagent_use.xhtml
+++ b/src/main/webapp/warehouse_reagent_use.xhtml
@@ -205,41 +205,53 @@
 
 	<p:dialog id="apply-ui" header="领用单" widgetVar="printDialog" appendTo="@(body)" modal="true" resizable="false">
 		<div id="printTarget">
-			<div style=" margin: 10mm 10mm 0mm 2mm;">
-		<h:form id="printDialog">
+			<div style="margin: 11mm 27mm 0mm 30mm;">
+		<h:form id="printDialog" style="width: 1100px">
 
 			<p:outputPanel style="text-align: center;font-size: 14px;font-weight: 700;">#{warehouseStockMngController.printTable['head']}</p:outputPanel>
 			<p:outputPanel style="text-align: center;font-size: 15px;margin: 20px;font-weight: 700;">#{warehouseStockMngController.printTable['title']}</p:outputPanel>
-				<div>
-					<div style="display: flex;flex-direction: row;justify-content: flex-end;">
-						<div style="width: 100px;">单据编号:</div>
-						<div style="width: 300px;"><input style="border: 0;" value=""/></div>
+			<div>
+				<div style="display: flex;flex-direction: row;justify-content: flex-end;width: 1081px;">
+					<div style="width: 98px;">单据编号:</div>
+					<div style="width:183px;">
+						<!--                                <input style="border: 0;" value="#{warehouseStockMngController.printTable['receiptNumber']}"/>-->
+						<p:inputText value="#{warehouseStockMngController.receiptNumber}" valueChangeListener="#{warehouseStockMngController.receiptNumberChange}">
+							<p:ajax event="valueChange" listener="#{warehouseStockMngController.receiptNumberChange()}"  />
+						</p:inputText>
 					</div>
 				</div>
+			</div>
 
 			<div style="margin: 10px 0;">
 				<div style="display: inline-flex;">
 					<div style="width: 100px;margin-left: 10px;">部门:</div>
 					<div style="width: 300px;">#{warehouseStockMngController.printTable['department']}</div>
 				</div>
+				<div style="display: inline-flex;">
+					<div style="width: 100px;">申购人:</div>
+					<div style="width: 200px;padding-top: 1px;">#{warehouseStockMngController.printTable['applyPerson']}</div>
+				</div>
 				<div style="display: inline-flex;float: right;">
 					<div style="width: 100px;">日期:</div>
-					<div style="width: 300px;padding-top: 1px;"><input style="border: 0;" value="#{warehouseStockMngController.printTable['date']}"/></div>
+					<div style="width: 200px;padding-top: 1px;"><input style="border: 0;" value="#{warehouseStockMngController.printTable['date']}"/></div>
 				</div>
 			</div>
 
 			<div style="margin-bottom: 20px;">
 				<div style="display: inline-flex;">
-					<div style="width: 100px;margin-left: 10px;">申购人:</div>
-					<div style="width: 300px;">#{warehouseStockMngController.printTable['applyPerson']}</div>
+					<div style="width: 100px;margin-left: 10px;">课题组</div>
+					<div style="width: 300px;">#{warehouseStockMngController.printTable['project']}</div>
+				</div>
+				<div style="display: inline-flex;">
+					<div style="width: 100px;">使用地点:</div>
+					<div style="width: 200px;padding-top: 1px;">#{warehouseStockMngController.printTable['lab']}</div>
 				</div>
 				<div style="display: inline-flex;float: right;">
 					<div style="width: 100px;">联系方式:</div>
-					<div style="width: 300px;">
+					<div style="width: 200px;">
 						<input style="border: 0;" value="#{warehouseStockMngController.printTable['phone']}"/></div>
 				</div>
 			</div>
-
 
 
 
@@ -261,7 +273,7 @@
 		</p:column>
 
 		<p:column headerText="包装" width="90px;" style="text-align: center;">
-			<h:outputText value="#{row.mainMetering==null?'':row.mainMetering}" />
+			<h:outputText value="#{row.mainMetering==null?'':row.mainMetering.replace('null','')}" />
 		</p:column>
 
 		<p:column headerText="数量" width="90px;" style="text-align: center;">
@@ -288,8 +300,32 @@
 			</div>
 
 			<p:panel styleClass="btn  no-print">
-			<div class="div-btn cancel" id="cancel">关闭</div>
-			<div class="div-btn print" id="print">打印</div>
+				<p:commandButton value="关闭"
+								 process="@this"
+								 styleClass="yes-btn"
+								 actionListener="#{warehouseStockMngController.onCancelBtnClick}"
+								 style="position: relative;left: 20px;"
+								 update=":centerRootPanel"
+								 oncomplete="PF('printDialog').hide()">
+				</p:commandButton>
+				<div style="display: none" id="indirectPrint"></div>
+				<p:commandButton value="打印"
+								 styleClass="yes-btn"
+								 actionListener="#{warehouseStockMngController.associatedFlowReceiptNumber2()}"
+								 style="position: relative;left: 20px;"
+				>
+				</p:commandButton>
+
+				<script type="text/javascript" src="resources/js/print.js"/>
+				<script type="text/javascript">
+					$(function () {
+						$("#indirectPrint").on("click", function () {
+							jQuery.print('#printTarget')
+						})
+					})
+
+
+				</script>
 			</p:panel>
 		</h:form>
 			</div>
diff --git a/src/main/webapp/warehouse_reagent_use_person.xhtml b/src/main/webapp/warehouse_reagent_use_person.xhtml
index a3073a5..bfdf613 100644
--- a/src/main/webapp/warehouse_reagent_use_person.xhtml
+++ b/src/main/webapp/warehouse_reagent_use_person.xhtml
@@ -107,41 +107,232 @@
 				<p:column headerText="条形码">
 					<p:commandButton value="操作" styleClass="edit-btn" process="@form"
 						actionListener="#{warehouseStockMngController.onReagentCodeBtnClickForPerson(row)}"
-						update=":reagentCodeDialogForPerson">
+						update=":reagentCodeDialogForPerson,@(.startReagentCode),@(.endReagentCode)">
 					</p:commandButton>
 				</p:column>
 			</p:dataTable>
 		</p:panel>
 	</h:form>
+	<p:dialog id="apply-ui" header="领用单" widgetVar="printDialog" appendTo="@(body)" modal="true" resizable="false">
+		<div id="printTarget">
+			<div style=" margin: 11mm 27mm 0mm 30mm;">
+				<h:form id="printDialog" style="width: 1100px">
 
+					<p:outputPanel style="text-align: center;font-size: 14px;font-weight: 700;">#{warehouseStockMngController.printTable['head']}</p:outputPanel>
+					<p:outputPanel style="text-align: center;font-size: 15px;margin: 20px;font-weight: 700;">#{warehouseStockMngController.printTable['title']}</p:outputPanel>
+					<div>
+						<div style="display: flex;flex-direction: row;justify-content: flex-end;width: 1081px;">
+							<div style="width: 98px;">单据编号:</div>
+							<div style="width: 183px;">
+<!--                                <input style="border: 0;" value="#{warehouseStockMngController.printTable['receiptNumber']}"/>-->
+                                <p:inputText value="#{warehouseStockMngController.receiptNumber}" valueChangeListener="#{warehouseStockMngController.receiptNumberChange}">
+									<p:ajax event="valueChange" listener="#{warehouseStockMngController.receiptNumberChange()}"  />
+								</p:inputText>
+                            </div>
+						</div>
+					</div>
+
+					<div style="margin: 10px 0;">
+						<div style="display: inline-flex;">
+							<div style="width: 100px;margin-left: 10px;">部门:</div>
+							<div style="width: 300px;">#{warehouseStockMngController.printTable['department']}</div>
+						</div>
+						<div style="display: inline-flex;">
+							<div style="width: 100px;">申购人:</div>
+							<div style="width: 200px;padding-top: 1px;">#{warehouseStockMngController.printTable['applyPerson']}</div>
+						</div>
+						<div style="display: inline-flex;float: right;">
+							<div style="width: 100px;">日期:</div>
+							<div style="width: 200px;padding-top: 1px;"><input style="border: 0;" value="#{warehouseStockMngController.printTable['date']}"/></div>
+						</div>
+					</div>
+
+					<div style="margin-bottom: 20px;">
+						<div style="display: inline-flex;">
+							<div style="width: 100px;margin-left: 10px;">课题组</div>
+							<div style="width: 300px;">#{warehouseStockMngController.printTable['project']}</div>
+						</div>
+						<div style="display: inline-flex;">
+							<div style="width: 100px;">使用地点:</div>
+							<div style="width: 200px;padding-top: 1px;">#{warehouseStockMngController.printTable['lab']}</div>
+						</div>
+						<div style="display: inline-flex;float: right;">
+							<div style="width: 100px;">联系方式:</div>
+							<div style="width: 200px;">
+								<input style="border: 0;" value="#{warehouseStockMngController.printTable['phone']}"/></div>
+						</div>
+					</div>
+
+
+
+
+					<p:dataTable id="printTB" styleClass="apply-list"
+								 value="#{warehouseStockMngController.printTable['applyList']}" var="row" >
+						<p:column headerText="产品编号" width="150px;" style="text-align: center;">
+							<h:outputText value="#{row.productCode}" />
+						</p:column>
+						<p:column headerText="产品名称" width="150px;" style="text-align: center;">
+							<h:outputText value="#{row.productName}" />
+						</p:column>
+
+						<p:column headerText="管制品" width="100px;" style="text-align: center;">
+							<h:outputText value="#{row.controlProducts}" />
+						</p:column>
+
+						<p:column headerText="规格型号" width="160px;" style="text-align: center;">
+							<h:outputText value="#{row.reagentFormat}" />
+						</p:column>
+
+						<p:column headerText="包装" width="90px;" style="text-align: center;">
+							<h:outputText value="#{row.mainMetering==null?'':row.mainMetering.replace('null','')}" />
+						</p:column>
+
+						<p:column headerText="数量" width="90px;" style="text-align: center;">
+							<h:outputText value="#{row.num}" />
+						</p:column>
+
+						<p:column headerText="备注" width="170px;" style="text-align: center;">
+							<h:outputText value="#{row.memo}" />
+						</p:column>
+					</p:dataTable>
+
+					<div style="margin-top: 20px;margin-right: 94px;">
+						<div style="display: flex;flex-direction: row;justify-content: flex-end;">
+							<div style="width: 100px">签收人:</div>
+							<div style="width: 100px"></div>
+						</div>
+					</div>
+
+					<div style="margin: 10px 94px 10px 0;">
+						<div style="display: flex;flex-direction: row;justify-content: flex-end;">
+							<div style="width: 100px">日期:</div>
+							<div style="width: 100px"></div>
+						</div>
+					</div>
+
+
+
+					<p:panel styleClass="btn  no-print">
+						<p:commandButton value="关闭"
+										 process="@this"
+										 styleClass="yes-btn"
+										 actionListener="#{warehouseStockMngController.onCancelBtnClick}"
+										 style="position: relative;left: 20px;"
+										 update=":centerRootPanel"
+										 oncomplete="PF('printDialog').hide()">
+						</p:commandButton>
+						<div style="display: none" id="indirectPrint"></div>
+						<p:commandButton value="打印"
+										 styleClass="yes-btn"
+										 actionListener="#{warehouseStockMngController.associatedFlowReceiptNumber()}"
+										 style="position: relative;left: 20px;"
+										 >
+						</p:commandButton>
+
+						<script type="text/javascript" src="resources/js/print.js"/>
+						<script type="text/javascript">
+							$(function () {
+								$("#indirectPrint").on("click", function () {
+									jQuery.print('#printTarget')
+								})
+							})
+
+
+						</script>
+					</p:panel>
+				</h:form>
+			</div>
+		</div>
+	</p:dialog>
 	<p:dialog modal="true" header="领用详情" appendTo="@(body)" id="reagentCodeDialogForPerson"
-		widgetVar="reagentCodeDialogForPerson" resizable="false" width="800" class="ui-dialog">
+		widgetVar="reagentCodeDialogForPerson" resizable="false" width="1000" class="ui-dialog">
 		<p:tabView dynamic="true" style="margin-left: 26px">
-			<p:tab title="补贴条码">
+			<p:tab title="补贴条码" id="applyInOrder">
 				<h:form id="reagentCodeDialogForm2">
-					<!--<p:panel styleClass="center-header content2">-->
-					<p:panelGrid styleClass="center-header content2">
-						<p:row>
-							<p:column><p:outputLabel value="领用数量:"></p:outputLabel></p:column>
-							<p:column><p:inputNumber value="#{warehouseStockMngController.useNum}"
+					<p:panelGrid styleClass="center-header content2" columns="6">
+						<p:column style="width: 60px !important;"><p:outputLabel value="仓库名:"/></p:column>
+							<p:selectOneMenu value="#{warehouseStockMngController.opeWarehouseReserve.warehouseId}" >
+									<p:ajax event="change" process="@this" listener="#{warehouseStockMngController.selectChangeReserve(warehouseStockMngController.opeWarehouseReserve.warehouseId)}"
+											update="reserve"/>
+									<f:selectItems value="#{warehouseStockMngController.warehouseReserveList}"
+												   var="item"
+												   itemValue="#{item.warehouseId}"
+												   itemLabel="#{item.warehouseName}"/>
+							</p:selectOneMenu>
+
+
+							<p:column>
+								<p:outputLabel id="reserve"  value="可供库存:" style="width: 100px;">
+									<span style="color: #1c427b;font-weight: bolder;font-size: 20px">#{warehouseStockMngController.opeWarehouseReserve.reserve}</span>
+								</p:outputLabel>
+							</p:column>
+
+
+							<p:outputLabel value="领用数量:" style="width: 80px;"/>
+							<p:inputNumber value="#{warehouseStockMngController.useNum}"
 													 minValue="0" decimalPlaces="0"
-													 required="true" requiredMessage="请输入领用数量" id="useNum"/></p:column>
-							<p:column></p:column>
-							<p:column></p:column>
-						</p:row>
-						<p:row>
-							<p:column><p:outputLabel value="条形码开始">
-								<p:commandLink value="自动生成" process="@this useNum startReagentCode" action="#{warehouseStockMngController.handleEventForPerson}"  update="endReagentCode" >
-
-								</p:commandLink>
-							</p:outputLabel></p:column>
-							<p:column><p:inputText id="startReagentCode" value="#{warehouseStockMngController.startReagentCodeForPerson}" maxlength="32" required="true" requiredMessage="请输入条形码开始"/></p:column>
-							<p:column><p:outputLabel value="条形码结束"></p:outputLabel></p:column>
-							<p:column><p:inputText id="endReagentCode" value="#{warehouseStockMngController.endReagentCodeForPerson}" maxlength="32" required="true" requiredMessage="请输入条形码结束"/></p:column>
-						</p:row>
-
-
+													 required="true" requiredMessage="请输入领用数量" id="useNum"/>
+							<p:column>
+								<p:panel styleClass="btn" style="text-align: right">
+							  <p:commandButton value="添加"
+											   process="@this,useNum"
+											   styleClass="yes-btn"
+											   actionListener="#{warehouseStockMngController.add2()}"
+											   update="@(.reagentCode),endReagentCode"
+											   style="position: relative;left: -8px;width: 62px;height: 34px;font-size: 12px;background-color: #ee7135">
+							  </p:commandButton>
+								</p:panel>
+							</p:column>
 					</p:panelGrid>
+					<p:separator style="margin: 15px"/>
+					<p:dataTable id="reagentCode" styleClass="reagentCode"
+									 paginatorPosition="bottom"
+									 lazy="true"
+									 value="#{warehouseStockMngController.getDataTmp()}"
+									 var="row"
+									 rowKey="#{row.id}"
+								     scrollable="false"
+								     rows="5" pageLinks="5"
+									 emptyMessage="无领用数据">
+
+							<p:column headerText="操作"  style="text-align: center;">
+								<p:commandButton  style="background: #e68280; border: 1px solid #e68280;color: white;" styleClass="store-btn"
+												  value="取消"
+												  actionListener="#{warehouseStockMngController.remove2(row)}"
+												  process="@this"
+												  update="@(.reagentCode),@(.endReagentCode)">
+								</p:commandButton>
+							</p:column>
+
+							<p:column headerText="仓库名" style="text-align: center;">
+								<h:outputText value="#{row.warehouseName}" />
+							</p:column>
+							<p:column headerText="试剂名称"  style="text-align: center;">
+								<h:outputText value="#{sysReagentService.getSysReagent(row.reagentId).name}" />
+							</p:column>
+
+							<p:column headerText="库存"  style="text-align: center;">
+								<h:outputText value="#{row.reserve}" />
+							</p:column>
+
+							<p:column headerText="领用数量" style="text-align: center;">
+								<h:outputText value="#{row.useNum}" />
+							</p:column>
+						</p:dataTable>
+
+					<p:panelGrid styleClass="center-header content2" columns="4" id="code" style="margin-top:20px;">
+
+						<p:outputLabel value="条形码开始"/>
+						<p:inputText id="startReagentCode" styleClass="startReagentCode" value="#{warehouseStockMngController.startReagentCodeForPerson}" maxlength="32" required="true" requiredMessage="请输入条形码开始">
+							<p:ajax event="change" listener="#{warehouseStockMngController.btCodeChange()}" update="endReagentCode"/>
+						</p:inputText>
+
+						<p:outputLabel value="条形码结束"/>
+						<p:inputText id="endReagentCode" styleClass="endReagentCode" value="#{warehouseStockMngController.endReagentCodeForPerson}" maxlength="32" required="true" requiredMessage="请输入条形码结束"/>
+					</p:panelGrid>
+
+
+
 					<!--</p:panel>-->
 					<p:panel styleClass="btn" style="text-align: right">
 						<p:commandButton value="确定"
@@ -153,7 +344,7 @@
 					</p:panel>
 				</h:form>
 			</p:tab>
-			<p:tab title="库中领取">
+			<p:tab title="库中领取" id="applyInWarehouse">
 				<h:form id="reagentCodeDialogForm">
 					<p:panel styleClass="center-header content2">
 						<p:panelGrid styleClass="filter" columns="6">

--
Gitblit v1.9.2