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