add
gdg
2021-01-25 8fca402ad743c884d106c0977cb792ca26bd5617
add
已修改31个文件
已添加2个文件
1913 ■■■■ 文件已修改
src/main/java/com/nanometer/smartlab/controller/OpeUseFlowInfoController.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/nanometer/smartlab/controller/WarehouseStockMngController.java 617 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/nanometer/smartlab/dao/OpeApplyDao.xml 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/nanometer/smartlab/dao/OpeReagentStatusDao.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/nanometer/smartlab/dao/OpeReagentStatusDao.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/nanometer/smartlab/dao/OpeUseFlowDao.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/nanometer/smartlab/dao/OpeUseFlowDao.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.xml 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/nanometer/smartlab/entity/OpeApply.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/nanometer/smartlab/entity/OpeApplyReserve.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/nanometer/smartlab/entity/OpeUseFlow.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/nanometer/smartlab/entity/OpeWarehouseReserve.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/nanometer/smartlab/exception/ExceptionEnumCode.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/nanometer/smartlab/service/OpeApplyService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/nanometer/smartlab/service/OpeApplyServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/nanometer/smartlab/service/OpeReagentStatusService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/nanometer/smartlab/service/OpeReagentStatusServiceImpl.java 135 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/nanometer/smartlab/service/OpeUseFlowService.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/nanometer/smartlab/service/OpeUseFlowServiceImpl.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveServiceImpl.java 325 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/WEB-INF/config-mybatis.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/order_input_warehouse.xhtml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/order_mng_ruku.xhtml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/project_mng.xhtml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/reagent_mng.xhtml 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/reagent_user_flow_info.xhtml 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/resources/css/default.css 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/resources/template/耗材导入模板.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/resources/template/试剂导入模板.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/warehouse_reagent_use.xhtml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/warehouse_reagent_use_person.xhtml 231 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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
@@ -42,6 +42,7 @@
import java.math.BigInteger;
import java.net.URLEncoder;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
@@ -123,6 +124,20 @@
     * 打开条形码对话框用
     */
    private List<OpeReagentStatus> reagentStatusSelectListForPerson;
    /**
     *打开条形码对话框用
     */
    private Map<String,Map<String,OpeWarehouseReserve>> warehouseReserveUseTmp=new HashMap<>();
    /**
     * 打开条形码对话框用
     */
    private List<OpeWarehouseReserve> warehouseReserveList = new ArrayList<>();
    /**
     * 打开条形码对话框用
     */
    private OpeWarehouseReserve opeWarehouseReserve = new OpeWarehouseReserve();
    public List<OpeReagentStatus> getReagentStatusSelectListForPerson() {
        return reagentStatusSelectListForPerson;
@@ -200,7 +215,8 @@
    private String supplierId;
    private List<SysSupplier> supplierSelectList;
    //private boolean flag = false;
    //领用单号
    private String receiptNumber;
    // 试剂库
    private LazyDataModel<SysReagent> reagentDataModel;
    // 直接入库试剂List
@@ -612,10 +628,26 @@
    }
//
    public void onUseBtnClickOrderTmp(){
        warehouseReserveUseTmp = new HashMap<>();
        opeWarehouseReserve = new OpeWarehouseReserve();
        if (selectedTmpOrderList == null || selectedTmpOrderList.size()<=0){
            FacesUtils.info("至少选择一个");
            return;
        }
        //相同的试剂不能再多选
        Set<String> checkTable = new HashSet<>();
        for (OpeApplyReserve oar : selectedTmpOrderList) {
            String reagentId = oar.getReagent().getId();
            if (!checkTable.contains(reagentId)) {
                checkTable.add(reagentId);
            }else{
                FacesUtils.info("相同试剂不能重复选择");
                return;
            }
        }
        checkTable = null;
        this.menuController.goToPage(Constants.PAGE_WAREHOUSE_REAGENT_USE_NEW_PERSON, Constants.PAGE_WAREHOUSE_STOCK_MNG);
    }
@@ -675,9 +707,161 @@
        // 根据选择的试剂获取对应的条形码
        initReagentStatusSelectListForPerson();
        //初始化试剂库存所在仓库仓库
        this.warehouseReserveList = opeWarehouseReserveService.selectWarehouseByReagentIdAndArticleNumber(selectedOpeApplyReserve.getReagent().getId(),selectedOpeApplyReserve.getArticleNumber(),true);
        //初始化第一个库存
        if (warehouseReserveList.size()>0)
            selectChangeReserve(warehouseReserveList.get(0).getWarehouseId());
        //初始化条形码,通过applyReserve保存的条码显示对应试剂的条码
        for (OpeApplyReserve oar : selectedTmpOrderList) {
            if (oar.getReagent().getId().equals(opeWarehouseReserve.getReagentId())) {
                this.endReagentCodeForPerson = oar.getEndReagentCode2();
                this.startReagentCodeForPerson = oar.getStartReagentCode2();
            }
        }
        if (warehouseReserveUseTmp.get(selectedOpeApplyReserve.getReagent().getId()) == null) {
            //初始化库中领用和大小,
            reagentCodeSelectedList = selectedOpeApplyReserve.getReagentCode();
            useNum = selectedOpeApplyReserve.getReagentCode() == null?0: selectedOpeApplyReserve.getReagentCode().size();
            this.endReagentCodeForPerson = null;
            this.startReagentCodeForPerson = null;
        }
        RequestContext.getCurrentInstance().execute("PF('reagentCodeDialogForPerson').show()");
    }
    /**
    * 变换库存
    */
    public void selectChangeReserve(String  id) {
        if (warehouseReserveList.size() > 0) {
            warehouseReserveList.forEach(owr -> {
                if (owr.getWarehouseId().equals(id)){
                    opeWarehouseReserve.setId(owr.getId());
                    opeWarehouseReserve.setWarehouseId(id);
                    opeWarehouseReserve.setWarehouseName(owr.getWarehouseName());
                    opeWarehouseReserve.setReserve(owr.getReserve());
                    opeWarehouseReserve.setReagentId(owr.getReagentId());
                }
            });
        }
    }
    /**
    * 补贴条码->添加x仓库的n个试剂
    */
    public void add2() {
        //0.判断该批次是否再仓库有库存
        if (opeWarehouseReserve.getId() == null) {
            FacesUtils.warn("没有库存");
            return;
        }
        //1.判断领取数量
        if (useNum > opeWarehouseReserve.getReserve()) {
            FacesUtils.warn("领用数量不能超过库存");
            return;
        }
        //2.加入Map
        OpeWarehouseReserve owr = new OpeWarehouseReserve();
        owr.setId(opeWarehouseReserve.getId());
        owr.setWarehouseId(opeWarehouseReserve.getWarehouseId());
        owr.setWarehouseName(opeWarehouseReserve.getWarehouseName());
        owr.setReserve(opeWarehouseReserve.getReserve());
        owr.setReagentId(opeWarehouseReserve.getReagentId());
        owr.setUseNum(useNum);
        if (warehouseReserveUseTmp.get(owr.getReagentId()) == null) {
            Map<String, OpeWarehouseReserve> tmp = new HashMap<>();
            tmp.put(owr.getWarehouseId(), owr);
            warehouseReserveUseTmp.put(owr.getReagentId(), tmp);
        }else{
            warehouseReserveUseTmp.get(owr.getReagentId()).put(owr.getWarehouseId(), owr);
        }
        //变换条码
        btCodeChange();
    }
    /**
    * 取消一个仓库领取
    */
    public void remove2(OpeWarehouseReserve owr) {
        if (warehouseReserveUseTmp.get(owr.getReagentId()).size() > 0) {
            warehouseReserveUseTmp.get(owr.getReagentId()).remove(owr.getWarehouseId());
            //变换条码
            btCodeChange();
        }
    }
    /**
    *  获取暂存表单
    */
    public List<OpeWarehouseReserve> getDataTmp() {
        List<OpeWarehouseReserve> list = new ArrayList<>();
        Map<String, OpeWarehouseReserve> dataMap = warehouseReserveUseTmp.
                get(opeWarehouseReserve.getReagentId());
        if (dataMap ==null) {
            return list;
        }
        Set<Map.Entry<String, OpeWarehouseReserve>> entries = dataMap.entrySet();
        for (Map.Entry<String, OpeWarehouseReserve> e : entries) {
            list.add(e.getValue());
        }
        return list;
    }
    /**
    * @Description: 补贴结束条码的生成
    */
    public void btCodeChange(){
        //1.获取补贴试剂总数
        List<OpeWarehouseReserve> dataTmp = getDataTmp();
        int distance =  dataTmp.stream().mapToInt(item -> item.getUseNum() == null ? 0 : item.getUseNum()).sum();
        //1.如果开始条码为空,距离为0
        if (StringUtils.isBlank(startReagentCodeForPerson)
                || distance < 1) {
            return;
        }
        //2如果开始条码不为空
        //2.0如果包含字母不等于24位的直接不管
        if (startReagentCodeForPerson.matches(".*\\D+.*")) {
            if (startReagentCodeForPerson.length() ==24 &&
                    startReagentCodeForPerson.matches(".*([A-F]|\\d)+.*") &&
                    startReagentCodeForPerson.substring(startReagentCodeForPerson.length() - 5).matches("\\d{5}")){
                //2.2长度为24位编码的
                BigInteger arrNum = BigInteger.valueOf(distance);
                //后5位随机码
                String randomCode = startReagentCodeForPerson.substring(startReagentCodeForPerson.length() - 5);
                String reagentCodePrefix = startReagentCodeForPerson.substring(0,startReagentCodeForPerson.length() - 5);
                BigInteger startReagentCodeSuffix = new BigInteger(randomCode);
                BigInteger endReagentCodeSuffix = startReagentCodeSuffix.add(arrNum).subtract((new BigInteger("1")));
                String reagentCodeSuffix= autoGenericCode(randomCode, endReagentCodeSuffix);
                endReagentCodeForPerson = (reagentCodePrefix + reagentCodeSuffix);
            }else{
                endReagentCodeForPerson = ("");
            }
        }else{
            BigInteger startReagentCode = new BigInteger(startReagentCodeForPerson);
            //2.1长度不为24位编码
            //数据1
            BigInteger arrNum = BigInteger.valueOf(distance);
            BigInteger code1 = startReagentCode.add(arrNum).subtract(BigInteger.ONE);
            endReagentCodeForPerson = (autoGenericCode(startReagentCodeForPerson, code1));
        }
        //把数据放入applyReserve
        for (OpeApplyReserve oar : selectedTmpOrderList) {
            if (oar.getReagent().getId().equals(this.opeWarehouseReserve.getReagentId())) {
                oar.setEndReagentCode2(endReagentCodeForPerson);
                oar.setStartReagentCode2(startReagentCodeForPerson);
            }
        }
    }
    public void onYesBtnClickForPerson() {
        try {
@@ -702,6 +886,9 @@
            // 将当前选择条形码保存到库存中
            for (OpeApplyReserve opeApplyReserve : this.selectedTmpOrderList) {
                if (opeApplyReserve.getId().equals(this.selectedOpeApplyReserve.getId())) {
                    //list OpeWarehouseReserve
                    //getReserve 总数小于 useNum 报错
                    OpeWarehouseReserve wa=opeWarehouseReserveService.getOpeWarehouseReserve(opeApplyReserve.getReagent().getId(),opeApplyReserve.getArticleNumber());
                    if(this.useNum > wa.getReserve())
                    {
@@ -714,9 +901,15 @@
                        opeApplyReserve.setReagentCode(this.reagentCodeSelectedList);
                    }
                    opeApplyReserve.setFlag(1);
                    //删除前面部分的补贴条码领用显示
                    warehouseReserveUseTmp.remove(opeApplyReserve.getReagent().getId());
                    endReagentCodeForPerson = null;
                    startReagentCodeForPerson = null;
                    break;
                }
            }
            //FacesUtils.info("选择条形码个数为" + this.reagentCodeSelectedList.size());
            RequestContext.getCurrentInstance().execute("PF('reagentCodeDialogForPerson').hide()");
@@ -728,98 +921,43 @@
    public void onYesBtnClickForPerson2() {
        try {
            //if (this.reagentCodeSelectedList == null || this.reagentCodeSelectedList.size() == 0) {
            //FacesUtils.warn("请选择条形码。");
            //return;
            //}
            if(this.useNum == null || this.useNum <= 0)
            {
                FacesUtils.warn("请输入大于0的领用数量!");
            //1.获取补贴试剂总数,判断数量
            List<OpeWarehouseReserve> dataTmp = getDataTmp();
            //distance为领用总数
            int distance = dataTmp.stream().mapToInt(item -> item.getUseNum() == null ? 0 : item.getUseNum()).sum();
            if (distance < 1) {
                FacesUtils.warn("请领取试剂");
                return;
            }
            System.out.println("====onYesBtnClick======");
            BigDecimal startReagentCode2 = new BigDecimal(startReagentCodeForPerson);
            BigDecimal endReagentCode2 = new BigDecimal(endReagentCodeForPerson);
            // 检查条形码结束要大于条形码开始
            if (endReagentCode2.compareTo(startReagentCode2) == -1) {
                FacesUtils.warn("条形码开始必须小于条形码结束。");
            //2.申购单已经领用的数量+当前准备领用的数量不能超过 单子的申请数量
            if (selectedOpeApplyReserve.getNum() < selectedOpeApplyReserve.getUsed() + distance) {
                FacesUtils.warn("当前领用数量超过订单的申请数量");
                return;
            }
            // 检查条形码和到货数量是否匹配
            if (endReagentCode2.subtract(startReagentCode2).intValue() != (useNum - 1)) {
                FacesUtils.warn("条形码数量和领用数量不一致。");
                return;
            }
            BigInteger startReagentCode3=new BigInteger(startReagentCodeForPerson);
            BigInteger endReagentCode3=new BigInteger(endReagentCodeForPerson);
            int len = startReagentCodeForPerson.length() - String.valueOf(startReagentCode3).length();
            String temp = "";
            for (int i = 0; i < len; i++) {
                temp += "0";
            }
            String str="";
            for (BigInteger i = startReagentCode3; i.compareTo(endReagentCode3) < 1; i = i.add(BigInteger.ONE)) {
                String code = temp + String.valueOf(i);
                OpeReagentStatus status=this.opeReagentStatusService.getOpeReagentStatusByReagentCode(code);
                if(status==null){
                }else{
                    if(status.getStatus()==ArrivalStatus.WAREHOUSE){
                    }else{
                        str+=code+",";
                    }
                }
            }
            if(str!=null && !str.equals("")){
                FacesUtils.info("条形码"+str.substring(0,str.length()-1)+"已被领用");
                return;
            }
            List<String> codeList = opeReagentStatusService
                    .checkReagentCode(startReagentCodeForPerson, endReagentCodeForPerson, distance);
            // 将当前选择条形码保存到库存中
            List<String> codeList=new ArrayList<>();
            for (OpeApplyReserve opeApplyReserve : this.selectedTmpOrderList) {
                if (opeApplyReserve.getId().equals(this.selectedOpeApplyReserve.getId())) {
//                    OpeWarehouseReserve wa=opeWarehouseReserveService.getOpeWarehouseReserve(opeApplyReserve.getReagent().getId(),opeApplyReserve.getArticleNumber());
//                    if(wa==null){
//                        wa=new OpeWarehouseReserve();
//                        wa.setReserve(0);
//                    }
//                    if(this.useNum > wa.getReserve())
//                    {
//                        FacesUtils.warn("库存不够,请确认或申购!");
//                        return;
//                    }
                    if (this.useNum+opeApplyReserve.getUsed() > opeApplyReserve.getNum()){
                        FacesUtils.warn("领用数量超出申请数量!");
                        return;
                    }
                    opeApplyReserve.setSelectNum(useNum);
                    opeApplyReserve.setStartReagentCode(startReagentCode2);
                    opeApplyReserve.setEndReagentCode(endReagentCode2);
                    opeApplyReserve.setStartReagentCode2(temp+startReagentCode2.toString());
                    opeApplyReserve.setEndReagentCode2(temp+endReagentCode2.toString());
                    for (BigInteger i = new BigInteger(startReagentCodeForPerson); i.compareTo(new BigInteger(endReagentCodeForPerson)) < 1; i = i.add(BigInteger.ONE)) {
                        codeList.add(i.toString());
                    }
                    /*for(int i=Integer.parseInt(startReagentCodeForPerson);i<=Integer.parseInt(endReagentCodeForPerson);i++){
                        codeList.add(Integer.toString(i));
                    }*/
                    if(codeList != null)
                    {
                        opeApplyReserve.setReagentCode(codeList);
                    }
                    opeApplyReserve.setSelectNum(distance);
                    opeApplyReserve.setStartReagentCode2(this.startReagentCodeForPerson);
                    opeApplyReserve.setEndReagentCode2(this.endReagentCodeForPerson);
                    opeApplyReserve.setReagentCode(codeList);
                    opeApplyReserve.setCacheUpdateList(getDataTmp());
                    opeApplyReserve.setFlag(0);
                    reagentCodeSelectedList = null;
                    break;
                }
            }
            //FacesUtils.info("选择条形码个数为" + codeList.size());
            RequestContext.getCurrentInstance().execute("PF('reagentCodeDialogForPerson').hide()");
        } catch (BusinessException e) {
            logger.error("操作失败。", e);
            FacesUtils.warn(e.getMessage());
        } catch (Exception e) {
            logger.error("操作失败。", e);
            FacesUtils.warn("操作失败。");
@@ -827,72 +965,25 @@
    }
    public void onYesBtnClick2(){
        try{
            if(this.useNum == null || this.useNum <= 0)
            {
        try {
            if (this.useNum == null || this.useNum <= 0) {
                FacesUtils.warn("请输入大于0的领用数量!");
                return;
            }
            BigDecimal startReagentCode2 = new BigDecimal(startReagentCode);
            BigDecimal endReagentCode2 = new BigDecimal(endReagentCode);
            // 检查条形码结束要大于条形码开始
            if (endReagentCode2.compareTo(startReagentCode2) == -1) {
                FacesUtils.warn("条形码开始必须小于条形码结束。");
                return;
            }
            // 检查条形码和到货数量是否匹配
            if (endReagentCode2.subtract(startReagentCode2).intValue() != (useNum - 1)) {
                FacesUtils.warn("条形码数量和领用数量不一致。");
                return;
            }
            BigInteger startReagentCode3=new BigInteger(startReagentCode);
            BigInteger endReagentCode3=new BigInteger(endReagentCode);
            int len = startReagentCode.length() - String.valueOf(startReagentCode3).length();
            List<String> codeList = opeReagentStatusService
                    .checkReagentCode(startReagentCode, endReagentCode, useNum);
            String temp = "";
            for (int i = 0; i < len; i++) {
                temp += "0";
            }
            String str="";
            for (BigInteger i = startReagentCode3; i.compareTo(endReagentCode3) < 1; i = i.add(BigInteger.ONE)) {
                String code = temp + String.valueOf(i);
                OpeReagentStatus status=this.opeReagentStatusService.getOpeReagentStatusByReagentCode(code);
                if(status==null){
                }else{
                    if(status.getStatus()==ArrivalStatus.WAREHOUSE){
                    }else{
                        str+=code+",";
                    }
                }
            }
            if(str!=null && !str.equals("")){
                FacesUtils.info("条形码"+str.substring(0,str.length()-1)+"已被领用");
                return;
            }
            List<String> codeList=new ArrayList<>();
            for (OpeWarehouseReserve opeWarehouseReserve : this.selectedTmpList) {
                if (opeWarehouseReserve.getId().equals(this.selectedOpeWarehouseReserve.getId())) {
                    if(this.useNum > opeWarehouseReserve.getReserve())
                    {
                    if (this.useNum > opeWarehouseReserve.getReserve()) {
                        FacesUtils.warn("库存不够,请确认或申购!");
                        return;
                    }
                    opeWarehouseReserve.setSelectNum(useNum);
                    opeWarehouseReserve.setStartReagentCode(startReagentCode2);
                    opeWarehouseReserve.setEndReagentCode(endReagentCode2);
                    opeWarehouseReserve.setStartReagentCode2(temp+startReagentCode2.toString());
                    opeWarehouseReserve.setEndReagentCode2(temp+endReagentCode2.toString());
                    for (BigInteger i = new BigInteger(startReagentCode); i.compareTo(new BigInteger(endReagentCode)) < 1; i = i.add(BigInteger.ONE)) {
                        codeList.add(i.toString());
                    }
                    /*for(int i=Integer.parseInt(startReagentCode);i<=Integer.parseInt(endReagentCode);i++){
                        codeList.add(Integer.toString(i));
                    }*/
                    if(codeList != null)
                    {
                    opeWarehouseReserve.setStartReagentCode2(startReagentCode);
                    opeWarehouseReserve.setEndReagentCode2(endReagentCode);
                    if (codeList != null) {
                        opeWarehouseReserve.setReagentCodes(codeList);
                    }
                    opeWarehouseReserve.setFlag(0);
@@ -902,10 +993,13 @@
            }
            //FacesUtils.info("选择条形码个数为" + codeList.size());
            RequestContext.getCurrentInstance().execute("PF('reagentCodeDialog').hide()");
            } catch (Exception e) {
                logger.error("操作失败。", e);
                FacesUtils.warn("操作失败。");
            }
        } catch (BusinessException e) {
            logger.error(e.getMessage());
            FacesUtils.warn(e.getMessage());
        } catch (Exception e) {
            logger.error("操作失败。", e);
            FacesUtils.warn("操作失败。");
        }
    }
    public void onYesBtnClick() {
@@ -958,6 +1052,9 @@
        this.selectedTmpOrderList = null;
        this.selectedTmpList = null;
        this.selectedInputStorageTmpOrderList = null;
        this.endReagentCodeForPerson = null;
        this.startReagentCodeForPerson = null;
        this.useNum = null;
        this.menuController.backToPage();
    }
@@ -984,18 +1081,31 @@
                FacesUtils.warn("请选择申领人。");
                return;
            }
            List<OpeApplyReserve> list=new ArrayList<>();
            List<OpeApplyReserve> list2=new ArrayList<>();
            //int size = 0;
            for(OpeApplyReserve app:this.selectedTmpOrderList){
                if (app.getFlag() == null) {
                    FacesUtils.warn("请选择。");
                    return;
                }
                if(app.getFlag()==1){
                    list.add(app);
                }else {
                    list2.add(app);
                }
            }
            //1.1判断库存
            checkReserve(list);
            checkReserve(list2);
            //1.2判断提交的条码是否重复(只有补贴条码需要判断)
            checkReagentCode(list2);
            //库中领取
            if(list.size()>0&&list!=null){
                //扣库存 对象中的reagentCode存的是id
                for(OpeApplyReserve app:list){
                    List<String> reagentCode=app.getReagentCode();
                    if(reagentCode!=null && reagentCode.size()>0){
@@ -1004,25 +1114,15 @@
                            if (!this.opeReagentStatusService.isAllowWarehouseUse(opeReagentStatus)) {
                                FacesUtils.warn("只能申领在仓库的试剂。");
                                return;
                            }else {
                                opeReagentStatus.setHouseId(laboratoryId);
                                opeReagentStatus.setContainerId(laboratoryContainerId);
                                this.opeReagentStatusDao.updateOpeReagentStatusDao(opeReagentStatus);
                                OpeLaboratoryReserve lr=new OpeLaboratoryReserve();
                                lr.setReagentId(app.getReagent().getId());
                                lr.setHouseId(laboratoryId);
                                lr.setContainerId(laboratoryContainerId);
                                lr.setReserve(app.getSelectNum());
                                lr.setUserId(userId);
                                lr.setValidFlag(ValidFlag.VALID);
                                this.opeLaboratoryReserveService.insert(lr);
                            }
                        }
                    }
                }
                this.opeWarehouseReserveService.claimForPerson(list, userId,projectNum);
                this.opeWarehouseReserveService.claimForPerson(list, userId,projectNum,laboratoryId,laboratoryContainerId);
            }
            //补贴条码
            if(list2.size()>0&&list!=null){
                List<OpeApply> opeList=new ArrayList<>();
                for(int i=0;i<list2.size();i++){
@@ -1033,6 +1133,8 @@
                    opeApply.setReagent(list2.get(i).getReagent());
                    opeApply.setStartReagentCode(list2.get(i).getStartReagentCode2());
                    opeApply.setEndReagentCode(list2.get(i).getEndReagentCode2());
                    opeApply.setReagentCodeList(list2.get(i).getReagentCode());
                    opeApply.setId(list2.get(i).getId());
                    opeList.add(opeApply);
                    OpeLaboratoryReserve lr=new OpeLaboratoryReserve();
                    lr.setReagentId(list2.get(i).getReagent().getId());
@@ -1043,21 +1145,153 @@
                    lr.setValidFlag(ValidFlag.VALID);
                    this.opeLaboratoryReserveService.insert(lr);
                }
                this.opeWarehouseReserveService.reagentDStore2(opeList,userId);
                this.opeWarehouseReserveService.reagentDStore3(opeList,userId);
                //扣库存
                opeWarehouseReserveService.btWarehouseReserveReduce(list2);
            }
            for(int i=0;i<list2.size();i++){
                OpeWarehouseReserve opeWarehouseReserve=new OpeWarehouseReserve();
                OpeApplyReserve re=new OpeApplyReserve();
                re.setUsed(list2.get(i).getSelectNum()+list2.get(i).getUsed());
                re.setId(list2.get(i).getId());
                opeApplyDao.updateOpeApplyUsed(re);//修改已领数量
            }
            //更新申购单状态
            for (OpeApplyReserve oar : selectedTmpOrderList) {
                //确认
                if (oar.getStatus() == ApplyStatus.SUPPLIER_CONFIRM) {
                    //领用完 就改成已经入库
                    if (oar.getNum() == oar.getUsed() + oar.getSelectNum()) {
                        opeApplyService.updateOpeApplyInfo(ApplyStatus.STORAGE,null,null, oar.getId());
                        //2.2更改订单状态
                        OpeOrder oo = opeOrderService.getOrder(oar.getId());
                        List<OpeApply> oas = opeOrderService.getOpeApplyListByOrder(oo.getId());
                        assert oas.size() > 0;
                        //子订单是否全部入库,是则父单为已入库,否则未完成
                        boolean flag = oas.stream().allMatch(oa -> oa.getStatus() == ApplyStatus.STORAGE);
                        oo.setArrivalTime(arrivalTime);
                        if (flag){
                            oo.setStatus(ApplyStatus.STORAGE);
                            opeOrderService.updateOpeOrderStatus(oo);
                        }else{
                            oo.setStatus(ApplyStatus.UNCOMPLETED);
                            opeOrderService.updateOpeOrder(oo);
                        }
                    }
                }
            }
            FacesUtils.info("申领成功。");
            this.menuController.goToPage(Constants.PAGE_WAREHOUSE_STOCK_MNG, Constants.PAGE_WAREHOUSE_REAGENT_USE_NEW);
        } catch (Exception e) {
            //领用单生成
            printTable = null;
            printTable = new Hashtable();
            int sum = 0;
            List<ApplyListDto> applyList = new ArrayList<>();
            Map applyPersonInfo = sysUserService.getUser(userId);
            printTable.put("head", instituteName);
            printTable.put("title", "领用单");
            printTable.put("applyPerson", applyPersonInfo.get("name"));
            printTable.put("department", applyPersonInfo.get("meta_value"));
            printTable.put("date", Utils.now("yyyy-MM-dd"));
            printTable.put("phone", applyPersonInfo.get("phone"));
            String receiptNum = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
            printTable.put("receiptNumber", receiptNum);
            this.receiptNumber = receiptNum;
            for (OpeApplyReserve oar : selectedTmpOrderList) {
                ApplyListDto lis = new ApplyListDto();
                Map reagentDetail = sysReagentService.getReagentDetail(oar.getReagent().getId());
                lis.setNum(String.valueOf(oar.getSelectNum())); //数量
                lis.setMainMetering(String.format("%s%s", reagentDetail.get("main_metering"), reagentDetail.get("unit")));
                lis.setControlProducts((String) reagentDetail.get("controlProducts"));
                lis.setProductName((String) reagentDetail.get("name"));
                lis.setReagentFormat((String) reagentDetail.get("reagentFormat"));
                lis.setProductCode((String)reagentDetail.get("productCode"));
                lis.setMemo((String)reagentDetail.get("memo"));
                applyList.add(lis);
                sum += oar.getSelectNum();
            }
            applyList.add(new ApplyListDto("合计", "", "", "", "", String.valueOf(sum), ""));
            printTable.put("applyList", applyList);
            //返回
//            onCancelBtnClick();
            RequestContext.getCurrentInstance().execute("PF('printDialog').show()");
        } catch (BusinessException e){
            logger.info(e.getMessage());
            FacesUtils.warn(e.getMessage());
        }
        catch (Exception e) {
            logger.error("操作失败。", e);
            FacesUtils.warn("操作失败。");
        }
    }
    public void receiptNumberChange( ){
    }
    /**
     * 点击打印  关联所有流向和领用单号e
     */
    public void associatedFlowReceiptNumber() {
        try {
            opeUseFlowService.updateReceiptNumberByCode(selectedTmpOrderList, receiptNumber);
            //弹出打印窗口
            RequestContext.getCurrentInstance().execute("document.getElementById('indirectPrint').click()");
        } catch (Exception e) {
            logger.info(e.getMessage());
        }
    }
    public void associatedFlowReceiptNumber2() {
        try {
            opeUseFlowService.updateReceiptNumberByCode2(selectedTmpList, receiptNumber);
            //弹出打印窗口
            RequestContext.getCurrentInstance().execute("document.getElementById('indirectPrint').click()");
        } catch (Exception e) {
            logger.info(e.getMessage());
        }
    }
    private void checkReserve(List<OpeApplyReserve> list) {
        if (list == null || list.size() < 1) {
            return;
        }
        for (OpeApplyReserve oar : list) {
            boolean flag = (oar.getFlag() != 1);
            List<OpeWarehouseReserve> owr = opeWarehouseReserveService
                    .selectWarehouseByReagentIdAndArticleNumber(oar.getReagent().getId(), oar.getArticleNumber(),flag);
            int sum = owr.stream().mapToInt(item -> item.getReserve() == null ? 0 : item.getReserve()).sum();
            //剩余库存不足领取数量
            if (sum < oar.getSelectNum()) {
                throw new BusinessException(ExceptionEnumCode.APPLY_NUM_OVER, "库存已经不够");
            }
        }
    }
    private void checkReagentCode(List<OpeApplyReserve> list){
        if (list == null || list.size() < 1) {
            return;
        }
        Set<String> checkSet = new HashSet<>();
        for (OpeApplyReserve oar : list) {
            List<String> codeList = opeReagentStatusService
                    .checkReagentCode(oar.getStartReagentCode2(), oar.getEndReagentCode2(), oar.getSelectNum());
            oar.setReagentCode(codeList);
            if (codeList != null && codeList.size() > 0) {
                for (String code:codeList) {
                    if (!checkSet.contains(code)) {
                        checkSet.add(code);
                    }else{
                        throw new BusinessException(ExceptionEnumCode.PARAM_EXIST, "当前订单条码重复,"+code);
                    }
                }
            }
        }
    }
@@ -1212,6 +1446,10 @@
            printTable.put("date", Utils.now("yyyy-MM-dd"));
            printTable.put("phone", applyPersonInfo.get("phone"));
            String receiptNum = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
            printTable.put("receiptNumber", receiptNum);
            this.receiptNumber = receiptNum;
            //int size = 0;
            int sum = 0;
            List<OpeWarehouseReserve> list=new ArrayList<>();
@@ -1280,6 +1518,7 @@
                    opeApply.setReagent(this.sysReagentService.getSysReagent(list2.get(i).getReagentId()));
                    opeApply.setStartReagentCode(list2.get(i).getStartReagentCode2());
                    opeApply.setEndReagentCode(list2.get(i).getEndReagentCode2());
                    opeApply.setReagentCodeList(list2.get(i).getReagentCodes());
                    opeList.add(opeApply);
                    OpeLaboratoryReserve lr=new OpeLaboratoryReserve();
                    lr.setReagentId(list2.get(i).getReagentId());
@@ -1304,7 +1543,7 @@
                    sum += list2.get(i).getSelectNum();
                }
                this.opeWarehouseReserveService.reagentDStore2(opeList,userId);
                this.opeWarehouseReserveService.reagentDStore4(opeList,userId);
                for(int i=0;i<list2.size();i++){
                    list2.get(i).setReserve(list2.get(i).getReserve()-list2.get(i).getSelectNum());
                    opeWarehouseReserveDao.updateOpeWarehouseReserve(list2.get(i));
@@ -2173,18 +2412,33 @@
        System.out.println("===============================");
            if(useNum!=null && useNum>0){
                if(startReagentCode!=null && !startReagentCode.equals("")){
                if (startReagentCode.matches(".*\\D+.*")) {
                                if (startReagentCode.length() ==24 &&
                                        startReagentCode.matches(".*([A-F]|\\d)+.*") &&
                                        startReagentCode.substring(startReagentCode.length() - 5).matches("\\d{5}")){
                    BigDecimal start=new BigDecimal(startReagentCode.trim());
                    String str=startReagentCode;
                    String up="";
                    int len = startReagentCode.length() - String.valueOf(start).length();
                    String temp = "";
                    for (int i = 0; i < len; i++) {
                        temp += "0";
                            //2.2长度为24位编码的
                            BigInteger arrNum = BigInteger.valueOf((long)useNum);
                            //后5位随机码
                            String randomCode = startReagentCode.substring(startReagentCode.length() - 5);
                            String reagentCodePrefix = startReagentCode.substring(0,startReagentCode.length() - 5);
                            BigInteger startReagentCodeSuffix = new BigInteger(randomCode);
                            BigInteger endReagentCodeSuffix = startReagentCodeSuffix.add(arrNum).subtract((new BigInteger("1")));
                            String reagentCodeSuffix= autoGenericCode(randomCode, endReagentCodeSuffix);
                            endReagentCode= (reagentCodePrefix + reagentCodeSuffix);
                        }else{
                            endReagentCode = ("");
                        }
                    }else{
                        BigInteger startReagentCode2 = new BigInteger(startReagentCode);
                        //2.1长度不为24位编码
                        //数据1
                        BigInteger arrNum = BigInteger.valueOf((long)useNum);
                        BigInteger code1 = startReagentCode2.add(arrNum).subtract(BigInteger.ONE);
                        endReagentCode=(autoGenericCode(startReagentCode, code1));
                    }
                    BigDecimal end = start.add(new BigDecimal(useNum-1));
                    endReagentCode=temp+end.toString();
                    //endReagentCode=Integer.toString(useNum-1+Integer.parseInt(startReagentCode));
                }else{
                    FacesUtils.info("请输入条形码开始");
                }
@@ -2611,8 +2865,11 @@
        }
        //2如果开始条码不为空
        //2.0如果包含字母不等于24位的直接不管
        if (startReagentCode2.matches(".*[A-F]+.*")) {
            if (startReagentCode2.length() ==24){
        if (startReagentCode2.matches(".*\\D+.*")) {
            if (startReagentCode2.length() ==24 &&
                    startReagentCode2.matches(".*([A-F]|\\d)+.*") &&
                    startReagentCode2.substring(startReagentCode2.length() - 5).matches("\\d{5}")){
                //2.2长度为24位编码的
                BigInteger arrNum = BigInteger.valueOf(oar.getArrivalNum().longValue());
                //后5位随机码
@@ -2681,4 +2938,30 @@
        return statusSelectList;
    }
    public List<OpeWarehouseReserve> getWarehouseReserveList() {
        return warehouseReserveList;
    }
    public void setWarehouseReserveList(List<OpeWarehouseReserve> warehouseReserveList) {
        this.warehouseReserveList = warehouseReserveList;
    }
    public OpeWarehouseReserve getOpeWarehouseReserve() {
        return opeWarehouseReserve;
    }
    public void setOpeWarehouseReserve(OpeWarehouseReserve opeWarehouseReserve) {
        this.opeWarehouseReserve = opeWarehouseReserve;
    }
    public String getReceiptNumber() {
        return receiptNumber;
    }
    public void setReceiptNumber(String receiptNumber) {
        this.receiptNumber = receiptNumber;
    }
}
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
@@ -434,4 +434,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>
@@ -138,7 +144,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,6 +18,8 @@
    @SuppressWarnings("rawtypes")
    int getOpeWarehouseReserveTotalCount(Map params) throws DataAccessException;
    List<OpeWarehouseReserve> getOpeWarehouseReserveList2(Map params) throws DataAccessException;
    void insertOpeWarehouseReserve(OpeWarehouseReserve opeWarehouseReserve);
    int updateOpeWarehouseReserve(OpeWarehouseReserve opeWarehouseReserve);
@@ -31,4 +33,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
@@ -118,6 +118,65 @@
    <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
        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">
        update ope_warehouse_reserve set reagent_id=#{newReId} where reagent_id=#{oldReId}
@@ -127,6 +186,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;
@@ -328,9 +330,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;
    }
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
@@ -31,7 +31,10 @@
    private String applyCode;
    private String orderCode;
    /**
     * 补贴条码的暂存领用数量
     */
    public Integer useNum;
    public String getWarehouseId() {
        return warehouseId;
    }
@@ -177,4 +180,14 @@
    public void setOrderCode(String orderCode) {
        this.orderCode = orderCode;
    }
    public Integer getUseNum() {
        return useNum;
    }
    public void setUseNum(Integer useNum) {
        this.useNum = useNum;
    }
}
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);
    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,167 @@
        }
    }
    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 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(opeApply.getReagent().getMainMetering()!=null?opeApply.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);
                    // 试剂使用情况领用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 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(opeApply.getReagent().getMainMetering()!=null?opeApply.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);
                    // 试剂使用情况领用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 +628,123 @@
    @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.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) {
        if (opeList.size() < 1) {
            return;
        }
        for (OpeApplyReserve oar : opeList) {
            String reagentId = oar.getReagent().getId();
            //开始库存扣除
            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();
                    }
                    //更新库存
                    opeWarehouseReserveService.updateBtReserve(warehouseReserve.getId(),usedNum);
                    if (numLeave < 1) {
                        break;
                    }
            }
        }
        }
    }
    @Transactional(propagation = Propagation.REQUIRED)
    public void reagentDStore(List<OpeApply> reagentDStoreList, String loginUserId) {
        if (reagentDStoreList == null) {
src/main/webapp/WEB-INF/config-mybatis.xml
@@ -15,7 +15,7 @@
        <setting name="useGeneratedKeys" value="false"/>
        <setting name="defaultExecutorType" value="SIMPLE"/>
        <setting name="defaultStatementTimeout" value="25000"/>
        <setting name="logImpl" value="LOG4J" />
        <setting name="logImpl" value="STDOUT_LOGGING" />
    </settings>
    <typeHandlers>
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/耗材导入模板.xlsx
Binary files differ
src/main/webapp/resources/template/试剂导入模板.xlsx
Binary files differ
src/main/webapp/warehouse_reagent_use.xhtml
@@ -213,7 +213,10 @@
                <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 style="width: 300px;">
                            <p:inputText value="#{warehouseStockMngController.receiptNumber}" valueChangeListener="#{warehouseStockMngController.receiptNumberChange}">
                            <p:ajax event="valueChange" listener="#{warehouseStockMngController.receiptNumberChange()}"  />
                        </p:inputText></div>
                    </div>
                </div>
@@ -288,8 +291,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,222 @@
                <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: 10mm 10mm 0mm 2mm;">
                <h:form id="printDialog">
                    <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="#{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;float: right;">
                            <div style="width: 100px;">日期:</div>
                            <div style="width: 300px;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>
                        <div style="display: inline-flex;float: right;">
                            <div style="width: 100px;">联系方式:</div>
                            <div style="width: 300px;">
                                <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}" />
                        </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">
                        <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="930" 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:commandButton value="添加"
                                               process="@this,useNum"
                                               styleClass="yes-btn"
                                               actionListener="#{warehouseStockMngController.add2()}"
                                               update="@(.reagentCode),endReagentCode"
                                               style="position: relative;left: 20px;width: 58px;height: 34px;">
                              </p:commandButton>
                            </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 +334,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">