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; } } 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; } } 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> 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); } 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> 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); } 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> 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); } 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> 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; 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; } } 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; } } 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; } } 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; 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); } src/main/java/com/nanometer/smartlab/service/OpeApplyServiceImpl.java
@@ -707,5 +707,12 @@ } } /** * 补贴条码更新订单的领用数量 */ @Override public void btUpdateApplyAndOrder(List<OpeApply> opeList) { } } 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); } 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); } } 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); } 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); } } } } } 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); } 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())) { 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}" 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> 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> 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(); 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> src/main/webapp/resources/css/default.css
@@ -1107,4 +1107,10 @@ #tabView\:putInStorageTmpOrder th{ background: #1c427b !important; } } .reagentCode th{ background: #64a9cb !important; border-radius: 0 !important; color: #ffffff !important; } src/main/webapp/resources/template/耗材导入模板.xlsxBinary files differ
src/main/webapp/resources/template/试剂导入模板.xlsxBinary files differ
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> 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">