From 8fca402ad743c884d106c0977cb792ca26bd5617 Mon Sep 17 00:00:00 2001
From: gdg <764716047@qq.com>
Date: 星期一, 25 一月 2021 11:11:43 +0800
Subject: [PATCH] add

---
 src/main/java/com/nanometer/smartlab/controller/WarehouseStockMngController.java |  617 ++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 450 insertions(+), 167 deletions(-)

diff --git a/src/main/java/com/nanometer/smartlab/controller/WarehouseStockMngController.java b/src/main/java/com/nanometer/smartlab/controller/WarehouseStockMngController.java
index b4d60ae..c226a40 100644
--- a/src/main/java/com/nanometer/smartlab/controller/WarehouseStockMngController.java
+++ b/src/main/java/com/nanometer/smartlab/controller/WarehouseStockMngController.java
@@ -42,6 +42,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;
@@ -123,6 +124,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 +215,8 @@
 	private String supplierId;
 	private List<SysSupplier> supplierSelectList;
 	//private boolean flag = false;
-
+	//领用单号
+	private String receiptNumber;
 	// 试剂库
     private LazyDataModel<SysReagent> reagentDataModel;
 	// 直接入库试剂List
@@ -612,10 +628,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 +707,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 +886,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 +901,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 +921,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 +965,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 +993,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 +1052,9 @@
 		this.selectedTmpOrderList = null;
 		this.selectedTmpList = null;
 		this.selectedInputStorageTmpOrderList = null;
+		this.endReagentCodeForPerson = null;
+		this.startReagentCodeForPerson = null;
+		this.useNum = null;
 		this.menuController.backToPage();
 	}
 
@@ -984,18 +1081,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 +1114,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 +1133,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 +1145,153 @@
 					lr.setValidFlag(ValidFlag.VALID);
 					this.opeLaboratoryReserveService.insert(lr);
 				}
-				this.opeWarehouseReserveService.reagentDStore2(opeList,userId);
+				this.opeWarehouseReserveService.reagentDStore3(opeList,userId);
+
+				//扣库存
+				opeWarehouseReserveService.btWarehouseReserveReduce(list2);
 			}
+
 			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);
+			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);
+					}
+				}
+			}
 		}
 	}
 
@@ -1212,6 +1446,10 @@
 			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);
+			this.receiptNumber = receiptNum;
+
 			//int size = 0;
 			int sum = 0;
 			List<OpeWarehouseReserve> list=new ArrayList<>();
@@ -1280,6 +1518,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,7 +1543,7 @@
 
 					sum += list2.get(i).getSelectNum();
 				}
-				this.opeWarehouseReserveService.reagentDStore2(opeList,userId);
+				this.opeWarehouseReserveService.reagentDStore4(opeList,userId);
 				for(int i=0;i<list2.size();i++){
 					list2.get(i).setReserve(list2.get(i).getReserve()-list2.get(i).getSelectNum());
 					opeWarehouseReserveDao.updateOpeWarehouseReserve(list2.get(i));
@@ -2173,18 +2412,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("请输入条形码开始");
 				}
@@ -2611,8 +2865,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 +2938,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;
+	}
 }

--
Gitblit v1.9.2