From 12714c71c7737e21c3268b44a39f8f02befc5cb5 Mon Sep 17 00:00:00 2001 From: gdg <764716047@qq.com> Date: 星期一, 18 一月 2021 09:55:45 +0800 Subject: [PATCH] 模块:仓库库存管理 修改:订单入库流程 提出:秦老师 --- src/main/java/com/nanometer/smartlab/service/OpeApplyService.java | 9 src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.xml | 4 src/main/java/com/nanometer/smartlab/dao/OpeApplyDao.xml | 47 ++ src/main/java/com/nanometer/smartlab/entity/OpeWarehouseReserve.java | 19 + src/main/webapp/warehouse_stock_mng.xhtml | 104 +++++ src/main/java/com/nanometer/smartlab/service/OpeOrderServiceImpl.java | 11 src/main/java/com/nanometer/smartlab/entity/OpeReagentStatus.java | 18 + src/main/java/com/nanometer/smartlab/dao/OpeApplyDao.java | 5 src/main/java/com/nanometer/smartlab/entity/OpeApplyReserve.java | 36 ++ src/main/java/com/nanometer/smartlab/dao/SysReagentDao.java | 1 src/main/java/com/nanometer/smartlab/controller/WarehouseStockMngController.java | 290 ++++++++++++++++ src/main/webapp/resources/css/default.css | 5 src/main/java/com/nanometer/smartlab/service/OpeOrderService.java | 4 src/main/java/com/nanometer/smartlab/dao/OpeReagentStatusDao.java | 2 src/main/webapp/WEB-INF/spring-menu.xml | 9 src/main/java/com/nanometer/smartlab/dao/OpeReagentStatusDao.xml | 4 src/main/java/com/nanometer/smartlab/util/Constants.java | 1 src/main/java/com/nanometer/smartlab/exception/ExceptionEnumCode.java | 5 src/main/webapp/order_input_warehouse.xhtml | 202 +++++++++++ src/main/java/com/nanometer/smartlab/service/OpeReagentStatusServiceImpl.java | 134 +++++++ src/main/java/com/nanometer/smartlab/dao/OpeOrderDao.xml | 21 + src/main/java/com/nanometer/smartlab/service/OpeApplyServiceImpl.java | 69 +++ src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.java | 2 src/main/java/com/nanometer/smartlab/dao/OpeOrderDao.java | 4 src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveService.java | 3 src/main/java/com/nanometer/smartlab/service/OpeReagentStatusService.java | 10 src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveServiceImpl.java | 25 + 27 files changed, 1,033 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/nanometer/smartlab/controller/WarehouseStockMngController.java b/src/main/java/com/nanometer/smartlab/controller/WarehouseStockMngController.java index 04cd748..314fe5a 100644 --- a/src/main/java/com/nanometer/smartlab/controller/WarehouseStockMngController.java +++ b/src/main/java/com/nanometer/smartlab/controller/WarehouseStockMngController.java @@ -5,10 +5,12 @@ import com.nanometer.smartlab.dao.OpeWarehouseReserveDao; import com.nanometer.smartlab.entity.*; import com.nanometer.smartlab.entity.dto.ApplyListDto; +import com.nanometer.smartlab.entity.enumtype.ApplyStatus; import com.nanometer.smartlab.entity.enumtype.ArrivalStatus; import com.nanometer.smartlab.entity.enumtype.SeeFlag; import com.nanometer.smartlab.entity.enumtype.ValidFlag; import com.nanometer.smartlab.exception.BusinessException; +import com.nanometer.smartlab.exception.ExceptionEnumCode; import com.nanometer.smartlab.service.*; import com.nanometer.smartlab.util.*; import org.apache.commons.lang.StringUtils; @@ -26,6 +28,7 @@ import org.springframework.context.annotation.PropertySource; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import javax.faces.context.ExternalContext; @@ -37,6 +40,7 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.net.URLEncoder; +import java.sql.Timestamp; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; @@ -66,6 +70,8 @@ private SysUserService sysUserService; @Resource private SysSupplierService sysSupplierService; + @Resource + private OpeOrderService opeOrderService; @Resource private MenuController menuController; @@ -83,6 +89,8 @@ @Resource(name = "opeReagentStatusDao") OpeReagentStatusDao opeReagentStatusDao; + @Resource + OpeUseFlowService opeUseFlowService; @Resource OpeWarehouseReserveDao opeWarehouseReserveDao; @@ -233,7 +241,20 @@ private List<OpeApplyReserve> selectedListForPerson; private List<OpeApplyReserve> selectedTmpOrderList; private List<OpeApplyReserve> trulySelectedOrderList; - + /** + * 入库车 + */ + private List<OpeApplyReserve> selectedInputStorageTmpOrderList; + private List<OpeApplyReserve> trulyInputStorageTmpSelectedOrderList; + /** + * 订单入库变量 + */ + //到货时间 + private Timestamp arrivalTime; + //收货人 + private String consigneeId; + //OpeApply + private List<OpeApplyReserve> opeApplyList; /** * 条形码对话框中选择的条形码集合 */ @@ -296,6 +317,33 @@ } this.onWarehouseSelectChange(null); + } + + public void initInputWarehouse() { + logger.info("WarehouseStockMngController initInputWarehouse start"); + this.warehouseList = this.sysWarehouseService.getSysWarehouseList(null, null, null, null); + this.warehouseNameMap = new HashMap<String, String>(); + if (this.warehouseList != null && this.warehouseList.size() > 0) { + for (SysWarehouse house : this.warehouseList) { + this.warehouseNameMap.put(house.getId(), house.getName()); + } + } + this.warehouseContainerMap = new HashMap<String, SysWarehouseContainer>(); + this.warehouseIdContainerMap = new HashMap<String, List<SysWarehouseContainer>>(); + List<SysWarehouseContainer> warehouseContainerList = this.sysWarehouseContainerService.getSysWarehouseContainerList(null, null, null, null, null); + if (warehouseContainerList != null && warehouseContainerList.size() > 0) { + for (SysWarehouseContainer container : warehouseContainerList) { + warehouseContainerMap.put(container.getId(), container); + + if (!warehouseIdContainerMap.containsKey(container.getWarehouseId()) + || warehouseIdContainerMap.get(container.getWarehouseId()) == null) { + warehouseIdContainerMap.put(container.getWarehouseId(), new ArrayList<SysWarehouseContainer>()); + } + warehouseIdContainerMap.get(container.getWarehouseId()).add(container); + } + } + + this.onWarehouseSelectChange(null); } private void initReagentSelectList() { @@ -418,6 +466,40 @@ } } + public void addInputStorageOrder() { + if (this.selectedListForPerson == null || this.selectedListForPerson.size() == 0) { + FacesUtils.warn("请选择数据。"); + return; + } + //1.判断非状态为确认的申购单不能入库 + for (OpeApplyReserve opeApplyReserve : this.selectedListForPerson) { + if (opeApplyReserve.getStatus() != ApplyStatus.SUPPLIER_CONFIRM) { + FacesUtils.warn("非已确认的数据不能入库。"); + return; + } + } + //2.加入暂存 + if (selectedInputStorageTmpOrderList !=null && selectedInputStorageTmpOrderList.size()>0){ + ArrayList<OpeApplyReserve> tmp = new ArrayList<>(); + selectedListForPerson.forEach(opeApplyReserve -> { + AtomicBoolean flag = new AtomicBoolean(false); + selectedInputStorageTmpOrderList.forEach(opeApplyReserve1 -> { + if (opeApplyReserve.getId().equals(opeApplyReserve1.getId())){ + flag.set(true); + } + + }); + if(!flag.get()) { + tmp.add(opeApplyReserve); + } + }); + selectedInputStorageTmpOrderList.addAll(tmp); + }else{ + selectedInputStorageTmpOrderList = new ArrayList<>(); + selectedInputStorageTmpOrderList.addAll(selectedListForPerson); + } + } + public void clear(){ selectedTmpList = null; @@ -425,6 +507,10 @@ public void clearOrderTmp(){ selectedTmpOrderList = null; + } + + public void clearInputStorageTmp(){ + selectedInputStorageTmpOrderList = null; } public void cancel(){ @@ -483,6 +569,34 @@ } + public void cancelInputStorageTmp(){ + if (trulyInputStorageTmpSelectedOrderList == null || trulyInputStorageTmpSelectedOrderList.size()<=0){ + FacesUtils.info("至少选择一个"); + return; + } + + if (selectedInputStorageTmpOrderList == null || selectedInputStorageTmpOrderList.size()<=0){ + FacesUtils.info("至少选择一个"); + return; + } + + ArrayList<Object> indexs = new ArrayList<>(); + for (OpeApplyReserve opeApplyReserve : trulyInputStorageTmpSelectedOrderList) { + for (OpeApplyReserve applyReserve : selectedInputStorageTmpOrderList) { + if (opeApplyReserve.getId().equals(applyReserve.getId())) { + indexs.add(opeApplyReserve); + } + } + } + + if (indexs.size()>0){ + indexs.forEach(obj -> { + selectedInputStorageTmpOrderList.remove(obj); + }); + } + + } + public void onUseBtnClick(){ if (selectedTmpList == null || selectedTmpList.size()<=0){ FacesUtils.info("至少选择一个"); @@ -499,6 +613,21 @@ } this.menuController.goToPage(Constants.PAGE_WAREHOUSE_REAGENT_USE_NEW_PERSON, Constants.PAGE_WAREHOUSE_STOCK_MNG); + } + + public void onUseBtnClickInputStorageTmp(){ + if (selectedInputStorageTmpOrderList == null || selectedInputStorageTmpOrderList.size()<=0){ + FacesUtils.info("至少选择一个"); + return; + } + opeApplyList = new ArrayList<>(); + selectedInputStorageTmpOrderList.forEach(opeApplyReserve -> { + OpeApplyReserve applyDetail = opeApplyService.getOpeApplyDetail(opeApplyReserve.getId()); + opeApplyList.add(applyDetail); + + }); + //跳转编辑页面 + this.menuController.goToPage(Constants.PAGE_ORDER_INPUT_WAREHOUSE, Constants.PAGE_WAREHOUSE_STOCK_MNG); } public void onUseBtnClickForPerson() { @@ -823,6 +952,7 @@ public void onCancelBtnClick() { this.selectedTmpOrderList = null; this.selectedTmpList = null; + this.selectedInputStorageTmpOrderList = null; this.menuController.backToPage(); } @@ -1192,6 +1322,52 @@ logger.error(e.getMessage(), e); FacesUtils.warn("操作失败。"); } + } + /** + * @Description: 订单入库保存 + */ + public void onSaveInputWarehouseClick(){ + try{ + //用来检验提交表单得试剂条码是否重复 + Map<String,Boolean> checkTable= new HashMap<>(); + if (opeApplyList != null && opeApplyList.size() > 0) { + for (OpeApplyReserve opeApplyReserve:opeApplyList) { + //0.1获取该申购单的订单 + OpeOrder oo = opeOrderService.getOrder(opeApplyReserve.getId()); + if (oo == null) { + throw new BusinessException(ExceptionEnumCode.ORDER_ERROR,"订单不存在"); + } + //0.2检查条码->得到试剂条码列表 + List<String> codeList = opeReagentStatusService + .checkReagentCode(opeApplyReserve.getStartReagentCode2(), opeApplyReserve.getEndReagentCode2(), opeApplyReserve.getArrivalNum()); + if (codeList != null && codeList.size() > 0) { + for (String code:codeList) { + if (checkTable.get(code) == null) { + checkTable.put(code, true); + }else{ + throw new BusinessException(ExceptionEnumCode.PARAM_EXIST, "当前订单条码重复,"+code); + } + } + } + } + + + checkTable = null; + opeApplyService.orderInputWarehouse(opeApplyList,consigneeId,arrivalTime); + } + + FacesUtils.info("入库完成"); + //返回 + this.onCancelBtnClick(); + }catch (BusinessException e){ + e.printStackTrace(); + FacesUtils.warn(e.getMessage()); + + } catch (Exception e) { + e.printStackTrace(); + FacesUtils.warn("系统异常,操作失败"); + } + } @SuppressWarnings("serial") @@ -2231,4 +2407,116 @@ public void setTabValue(Integer tabValue) { this.tabValue = tabValue; } + + + public List<OpeApplyReserve> getSelectedInputStorageTmpOrderList() { + return selectedInputStorageTmpOrderList; + } + + public void setSelectedInputStorageTmpOrderList(List<OpeApplyReserve> selectedInputStorageTmpOrderList) { + this.selectedInputStorageTmpOrderList = selectedInputStorageTmpOrderList; + } + + public List<OpeApplyReserve> getTrulyInputStorageTmpSelectedOrderList() { + return trulyInputStorageTmpSelectedOrderList; + } + + public void setTrulyInputStorageTmpSelectedOrderList(List<OpeApplyReserve> trulyInputStorageTmpSelectedOrderList) { + this.trulyInputStorageTmpSelectedOrderList = trulyInputStorageTmpSelectedOrderList; + } + + public Timestamp getArrivalTime() { + return arrivalTime; + } + + public void setArrivalTime(Timestamp arrivalTime) { + this.arrivalTime = arrivalTime; + } + + public String getConsigneeId() { + return consigneeId; + } + + public void setConsigneeId(String consigneeId) { + this.consigneeId = consigneeId; + } + + public List getConsignee() { + List<SysUser> dataList = this.sysUserService.getSysUserList(null, null, null, null, null); + //将admin置于首位 + for (int i = 0; i < dataList.size(); i++) { + if ("admin".equals(dataList.get(i).getAccount())){ + dataList.add(0, dataList.remove(i)); + } + } + return dataList; + } + + public List<OpeApplyReserve> getOpeApplyList() { + return opeApplyList; + } + + public void setOpeApplyList(List<OpeApplyReserve> opeApplyList) { + this.opeApplyList = opeApplyList; + } + + + public void setArrival(OpeApplyReserve oar) { + //强制-》全到货 + oar.setArrivalNum(oar.getNum()); + } + + public void reagentStartCodeChange(OpeApplyReserve oar) { + //先输入条形码,到货数量帮填 + oar.setArrivalNum(oar.getNum()); + String startReagentCode2 = oar.getStartReagentCode2(); + String endReagentCode2 = oar.getEndReagentCode2(); + //1.如果开始条码为空,条码就为空,或者没有到货 + if (StringUtils.isBlank(startReagentCode2) + || oar.getArrivalNum() == null || oar.getArrivalNum() < 1) { + + oar.setStartReagentCode2(""); + oar.setEndReagentCode2(""); + return; + } + //2如果开始条码不为空 + //2.0如果包含字母不等于24位的直接不管 + if (startReagentCode2.matches(".*[A-F]+.*")) { + if (startReagentCode2.length() ==24){ + //2.2长度为24位编码的 + BigInteger arrNum = BigInteger.valueOf(oar.getArrivalNum().longValue()); + //后5位随机码 + String randomCode = startReagentCode2.substring(startReagentCode2.length() - 5); + String reagentCodePrefix = startReagentCode2.substring(0,startReagentCode2.length() - 5); + + BigInteger startReagentCodeSuffix = new BigInteger(randomCode); + BigInteger endReagentCodeSuffix = startReagentCodeSuffix.add(arrNum).subtract((new BigInteger("1"))); + String reagentCodeSuffix= autoGenericCode(randomCode, endReagentCodeSuffix); + oar.setEndReagentCode2(reagentCodePrefix + reagentCodeSuffix); + }else{ + oar.setEndReagentCode2(""); + } + }else{ + + BigInteger startReagentCode = new BigInteger(startReagentCode2); + //2.1长度不为24位编码 + //数据1 + BigInteger arrNum = BigInteger.valueOf(oar.getArrivalNum().longValue()); + BigInteger code1 = startReagentCode.add(arrNum).subtract(BigInteger.ONE); + oar.setEndReagentCode2(autoGenericCode(startReagentCode2, code1)); + } + } + + + + + private String autoGenericCode(String code, BigInteger code1) { + String result = ""; + //补充位数 + result = String.format("%0" + code.length() + "d", code1); + + return result; + } + + } diff --git a/src/main/java/com/nanometer/smartlab/dao/OpeApplyDao.java b/src/main/java/com/nanometer/smartlab/dao/OpeApplyDao.java index fa1a74a..4157c6b 100644 --- a/src/main/java/com/nanometer/smartlab/dao/OpeApplyDao.java +++ b/src/main/java/com/nanometer/smartlab/dao/OpeApplyDao.java @@ -2,6 +2,7 @@ import com.nanometer.smartlab.entity.OpeApply; import com.nanometer.smartlab.entity.OpeApplyReserve; +import com.nanometer.smartlab.entity.OpeOrder; import com.nanometer.smartlab.entity.OpeWarehouseReserve; import org.springframework.dao.DataAccessException; @@ -50,4 +51,8 @@ List<OpeApply> selectByReId(String id); public int updateByReId(Map params); + + OpeApplyReserve getOpeApplyDetail(String id); + + void updateOpeApplyInfo(Map params); } diff --git a/src/main/java/com/nanometer/smartlab/dao/OpeApplyDao.xml b/src/main/java/com/nanometer/smartlab/dao/OpeApplyDao.xml index 77ceb4b..3fe1302 100644 --- a/src/main/java/com/nanometer/smartlab/dao/OpeApplyDao.xml +++ b/src/main/java/com/nanometer/smartlab/dao/OpeApplyDao.xml @@ -60,8 +60,10 @@ <result property="applyCode" column="apply_code"></result> <result property="num" column="num"></result> <result property="used" column="used"></result> - <result property="status" column="status" typeHandler="com.nanometer.smartlab.entity.handler.ApplyStatusHandler"></result> + <result property="arrivalNum" column="arrival_num"></result> + <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> <association property="reagent" javaType="com.nanometer.smartlab.entity.SysReagent"> <id property="id" column="reagent_id"></id> <result property="name" column="reagentName"></result> @@ -294,7 +296,9 @@ sr.dangerous_flag, oa.num, oa.used, - su.`name` apply_user_id + oa.arrival_num, + su.`name` apply_user_id, + oa.arrival_time </sql> <sql id="getOpeApplyReserveList_queryJoins1"> @@ -383,8 +387,47 @@ <select id="selectByReId" resultMap="OpeApply"> select * from ope_apply where reagent_id=#{id} </select> + <select id="getOpeApplyDetail" resultMap="OpeApplyReserve"> + select oa.id, oa.apply_code, + sr.id reagent_id, + oa.status, + sr.product_sn reagentProductSn, + sr.`name` reagentName, + bm2.meta_value controlProducts, + bm3.meta_value reagentFormat, + sr.main_metering reagentMainMetering, + sr.price reagentPrice, + sr.cas reagentCas, + oa.article_number articleNumber, + bm4.meta_value reagentCharacter, + bm1.meta_value productHome, + sr.dangerous_flag, + oa.num, + oa.used, + oa.arrival_num, + su.id apply_user_id + from ope_apply as oa + left JOIN sys_reagent sr on sr.id = oa.reagent_id + left JOIN sys_user su on su.id = oa.apply_user_id + left join base_meta as bm2 on sr.control_products = bm2.id + left join base_meta as bm3 on sr.reagent_format = bm3.id + left join base_meta as bm4 on sr.reagent_character = bm4.id + left join base_meta as bm1 on sr.product_home = bm1.id + where oa.valid_flag = 1 + and oa.id = #{0} + </select> + <update id="updateByReId" parameterType="java.util.Map"> update ope_apply set reagent_id=#{newReId} where reagent_id=#{oldReId} </update> + <update id="updateOpeApplyInfo" parameterType="java.util.Map"> + update + ope_apply + set status = #{status}, + arrival_time = #{arrivalTime}, + consignee_id = #{consigneeId} + where valid_flag = 1 + and id = #{applyId} + </update> </mapper> diff --git a/src/main/java/com/nanometer/smartlab/dao/OpeOrderDao.java b/src/main/java/com/nanometer/smartlab/dao/OpeOrderDao.java index 65c24a3..e5afa2a 100644 --- a/src/main/java/com/nanometer/smartlab/dao/OpeOrderDao.java +++ b/src/main/java/com/nanometer/smartlab/dao/OpeOrderDao.java @@ -21,4 +21,8 @@ public void insertOpeOrder(OpeOrder opeOrder) throws DataAccessException; public int updateOpeOrder(OpeOrder opeOrder) throws DataAccessException; public int deleteOpeOrder(List<String> ids) throws DataAccessException; + + OpeOrder selectParentOrder(String id); + + void updateOpeOrderStatus(OpeOrder oo); } diff --git a/src/main/java/com/nanometer/smartlab/dao/OpeOrderDao.xml b/src/main/java/com/nanometer/smartlab/dao/OpeOrderDao.xml index e4a85d7..34f98d0 100644 --- a/src/main/java/com/nanometer/smartlab/dao/OpeOrderDao.xml +++ b/src/main/java/com/nanometer/smartlab/dao/OpeOrderDao.xml @@ -93,4 +93,25 @@ #{item} </foreach> </update> + <update id="updateOpeOrderStatus" parameterType="com.nanometer.smartlab.entity.OpeOrder"> + update ope_order + set status = #{status}, + arrival_time = #{arrivalTime}, + consignee_user_id = #{consigneeUserId} + where id = #{id} + </update> + + <select id="selectParentOrder" resultType="com.nanometer.smartlab.entity.OpeOrder"> + select + oo.id, + oo.status, + oo.order_code orderCode, + oo.order_name orderName, + oo.order_user_id orderUserId + from ope_apply_order oao + left join ope_order oo on oo.id = oao.ope_order_id + where oo.valid_flag = 1 + and oao.ope_apply_id = #{0} + + </select> </mapper> diff --git a/src/main/java/com/nanometer/smartlab/dao/OpeReagentStatusDao.java b/src/main/java/com/nanometer/smartlab/dao/OpeReagentStatusDao.java index 08b49ff..3804a20 100644 --- a/src/main/java/com/nanometer/smartlab/dao/OpeReagentStatusDao.java +++ b/src/main/java/com/nanometer/smartlab/dao/OpeReagentStatusDao.java @@ -51,4 +51,6 @@ public int updateByReId(Map params); List<String> selectReagentCodesByReId(String reagentId); + + void insertOpeReagentStatus2(OpeReagentStatus ors); } diff --git a/src/main/java/com/nanometer/smartlab/dao/OpeReagentStatusDao.xml b/src/main/java/com/nanometer/smartlab/dao/OpeReagentStatusDao.xml index 50dd15a..5025194 100644 --- a/src/main/java/com/nanometer/smartlab/dao/OpeReagentStatusDao.xml +++ b/src/main/java/com/nanometer/smartlab/dao/OpeReagentStatusDao.xml @@ -281,6 +281,10 @@ insert into ope_reagent_status(id, reagent_id, article_number, reagent_code, status, house_id, container_id, user_id, remainder, place, store_type, valid_flag, update_time,project_num) values (#{id}, #{reagentId}, #{articleNumber}, #{reagentCode}, #{status}, #{houseId}, #{containerId}, #{userId}, #{remainder}, #{place}, #{storeType}, 1, now(),#{projectNum}) </insert> + <insert id="insertOpeReagentStatus2" parameterType="com.nanometer.smartlab.entity.OpeReagentStatus"> + insert into ope_reagent_status(id, reagent_id, article_number, reagent_code, status, house_id, container_id, user_id, remainder, place, store_type, valid_flag, update_time,project_num,apply_code,order_code) + values (#{id}, #{reagentId}, #{articleNumber}, #{reagentCode}, #{status}, #{houseId}, #{containerId}, #{userId}, #{remainder}, #{place}, #{storeType}, 1, now(),#{projectNum},#{applyCode},#{orderCode}) + </insert> <select id="getOpeReagentStatusByReagentCode" parameterType="java.lang.String" resultMap="OpeReagentStatus"> select * diff --git a/src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.java b/src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.java index ea1f2cc..52d826e 100644 --- a/src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.java +++ b/src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.java @@ -29,4 +29,6 @@ //仓库指定试剂自加1 void updateCount(Map<String ,Object> params); + + void insertOpeWarehouseReserve2(OpeWarehouseReserve ope); } diff --git a/src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.xml b/src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.xml index 6c81389..2af36fd 100644 --- a/src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.xml +++ b/src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.xml @@ -101,6 +101,10 @@ insert into ope_warehouse_reserve(id, reagent_id, article_number, reserve, valid_flag, update_time,warehouseId) values (#{id}, #{reagentId}, #{articleNumber}, #{reserve}, 1, now(),#{warehouseId}) </insert> + <insert id="insertOpeWarehouseReserve2" parameterType="com.nanometer.smartlab.entity.OpeWarehouseReserve"> + insert into ope_warehouse_reserve(id, reagent_id, article_number, reserve, valid_flag, update_time,warehouseId,apply_code,order_code) + values (#{id}, #{reagentId}, #{articleNumber}, #{reserve}, 1, now(),#{warehouseId},#{applyCode},#{orderCode}) + </insert> <update id="updateOpeWarehouseReserve" parameterType="com.nanometer.smartlab.entity.OpeWarehouseReserve"> update ope_warehouse_reserve set reagent_id=#{reagentId},warehouseId=#{warehouseId}, article_number=#{articleNumber}, reserve=#{reserve}, update_time=now() diff --git a/src/main/java/com/nanometer/smartlab/dao/SysReagentDao.java b/src/main/java/com/nanometer/smartlab/dao/SysReagentDao.java index fd7b957..0fabdf9 100644 --- a/src/main/java/com/nanometer/smartlab/dao/SysReagentDao.java +++ b/src/main/java/com/nanometer/smartlab/dao/SysReagentDao.java @@ -3,6 +3,7 @@ import com.nanometer.smartlab.entity.SysReagent; import org.springframework.dao.DataAccessException; +import java.math.BigDecimal; import java.util.List; import java.util.Map; diff --git a/src/main/java/com/nanometer/smartlab/entity/OpeApplyReserve.java b/src/main/java/com/nanometer/smartlab/entity/OpeApplyReserve.java index fdd6a05..e5bb33b 100644 --- a/src/main/java/com/nanometer/smartlab/entity/OpeApplyReserve.java +++ b/src/main/java/com/nanometer/smartlab/entity/OpeApplyReserve.java @@ -31,6 +31,10 @@ private Integer flag; private ApplyStatus status; + private Integer arrivalNum; + private String containerId; + private String houseId; + private Timestamp arrivalTime; public ApplyStatus getStatus() { return status; @@ -165,4 +169,36 @@ public void setSelectNum(Integer selectNum) { this.selectNum = selectNum; } + + public Integer getArrivalNum() { + return arrivalNum; + } + + public void setArrivalNum(Integer arrivalNum) { + this.arrivalNum = arrivalNum; + } + + public String getContainerId() { + return containerId; + } + + public void setContainerId(String containerId) { + this.containerId = containerId; + } + + public String getHouseId() { + return houseId; + } + + public void setHouseId(String houseId) { + this.houseId = houseId; + } + + public Timestamp getArrivalTime() { + return arrivalTime; + } + + public void setArrivalTime(Timestamp arrivalTime) { + this.arrivalTime = arrivalTime; + } } diff --git a/src/main/java/com/nanometer/smartlab/entity/OpeReagentStatus.java b/src/main/java/com/nanometer/smartlab/entity/OpeReagentStatus.java index c014efd..f42878c 100644 --- a/src/main/java/com/nanometer/smartlab/entity/OpeReagentStatus.java +++ b/src/main/java/com/nanometer/smartlab/entity/OpeReagentStatus.java @@ -31,6 +31,8 @@ private String place; private StoreType storeType; private String projectNum; + private String applyCode; + private String orderCode; private String houseName; private String containerCode; @@ -215,4 +217,20 @@ public void setStoreType(StoreType storeType) { this.storeType = storeType; } + + public String getApplyCode() { + return applyCode; + } + + public void setApplyCode(String applyCode) { + this.applyCode = applyCode; + } + + public String getOrderCode() { + return orderCode; + } + + public void setOrderCode(String orderCode) { + this.orderCode = orderCode; + } } diff --git a/src/main/java/com/nanometer/smartlab/entity/OpeWarehouseReserve.java b/src/main/java/com/nanometer/smartlab/entity/OpeWarehouseReserve.java index 9666499..02c1481 100644 --- a/src/main/java/com/nanometer/smartlab/entity/OpeWarehouseReserve.java +++ b/src/main/java/com/nanometer/smartlab/entity/OpeWarehouseReserve.java @@ -28,6 +28,9 @@ private String warehouseName; private String startReagentCode2; private String endReagentCode2; + private String applyCode; + private String orderCode; + public String getWarehouseId() { return warehouseId; @@ -158,4 +161,20 @@ public void setSelectNum(Integer selectNum) { this.selectNum = selectNum; } + + public String getApplyCode() { + return applyCode; + } + + public void setApplyCode(String applyCode) { + this.applyCode = applyCode; + } + + public String getOrderCode() { + return orderCode; + } + + public void setOrderCode(String orderCode) { + this.orderCode = orderCode; + } } diff --git a/src/main/java/com/nanometer/smartlab/exception/ExceptionEnumCode.java b/src/main/java/com/nanometer/smartlab/exception/ExceptionEnumCode.java index a5ae0d1..e23f12e 100644 --- a/src/main/java/com/nanometer/smartlab/exception/ExceptionEnumCode.java +++ b/src/main/java/com/nanometer/smartlab/exception/ExceptionEnumCode.java @@ -11,7 +11,10 @@ PARAM_NO_EXIST("1003"), PARAM_EXIST("1004"), REAGENT_CODE_EXIST("2001"), - MAIL_SEND_FAIL("3001"); + REAGENT_CODE_INVALID("2002"), + MAIL_SEND_FAIL("3001"), + ORDER_ERROR("4001"); + private String code; diff --git a/src/main/java/com/nanometer/smartlab/service/OpeApplyService.java b/src/main/java/com/nanometer/smartlab/service/OpeApplyService.java index b10d0ad..5c2f2bd 100644 --- a/src/main/java/com/nanometer/smartlab/service/OpeApplyService.java +++ b/src/main/java/com/nanometer/smartlab/service/OpeApplyService.java @@ -2,8 +2,10 @@ import com.nanometer.smartlab.entity.OpeApply; import com.nanometer.smartlab.entity.OpeApplyReserve; +import com.nanometer.smartlab.entity.OpeOrder; import com.nanometer.smartlab.entity.OpeWarehouseReserve; import com.nanometer.smartlab.entity.enumtype.ApplyStatus; +import com.nanometer.smartlab.exception.BusinessException; import java.math.BigDecimal; import java.sql.Timestamp; @@ -62,4 +64,11 @@ public List<OpeApply> selectByReId(String id); public void updateByReId(String newReId,String oldReId); + + OpeApplyReserve getOpeApplyDetail(String applyCode); + + + void updateOpeApplyInfo(ApplyStatus storage, String consigneeId, Timestamp arrivalTime, String applyId); + + void orderInputWarehouse(List<OpeApplyReserve> opeApplyList,String consigneeId,Timestamp arrivalTime) throws BusinessException,Exception; } diff --git a/src/main/java/com/nanometer/smartlab/service/OpeApplyServiceImpl.java b/src/main/java/com/nanometer/smartlab/service/OpeApplyServiceImpl.java index 1f61365..b056160 100644 --- a/src/main/java/com/nanometer/smartlab/service/OpeApplyServiceImpl.java +++ b/src/main/java/com/nanometer/smartlab/service/OpeApplyServiceImpl.java @@ -3,6 +3,7 @@ import com.nanometer.smartlab.dao.OpeApplyDao; import com.nanometer.smartlab.entity.OpeApply; import com.nanometer.smartlab.entity.OpeApplyReserve; +import com.nanometer.smartlab.entity.OpeOrder; import com.nanometer.smartlab.entity.SysUser; import com.nanometer.smartlab.entity.enumtype.ApplyStatus; import com.nanometer.smartlab.entity.enumtype.SeeFlag; @@ -40,6 +41,12 @@ @Resource(name = "opeApplyDao") OpeApplyDao opeApplyDao; + @Resource + OpeOrderService opeOrderService; + @Resource + OpeReagentStatusService opeReagentStatusService; + @Resource + OpeWarehouseReserveService opeWarehouseReserveService; @Resource private SysUserService sysUserService; @@ -633,4 +640,66 @@ params.put("oldReId",oldReId); this.opeApplyDao.updateByReId(params); } + + @Override + public OpeApplyReserve getOpeApplyDetail(String id) { + return opeApplyDao.getOpeApplyDetail(id); + } + + @Override + public void updateOpeApplyInfo(ApplyStatus storage, String consigneeId, Timestamp arrivalTime, String applyId) { + Map<String,Object> params = new HashMap(); + params.put("status", storage); + params.put("consigneeId", consigneeId); + params.put("arrivalTime", arrivalTime); + params.put("applyId", applyId); + opeApplyDao.updateOpeApplyInfo(params); + } + + @Override + @Transactional + public void orderInputWarehouse(List<OpeApplyReserve> opeApplyList,String consigneeId,Timestamp arrivalTime) { + for (OpeApplyReserve opeApplyReserve:opeApplyList) { + //0.1获取该申购单的订单 + OpeOrder oo = opeOrderService.getOrder(opeApplyReserve.getId()); + if (oo == null) { + throw new BusinessException(ExceptionEnumCode.ORDER_ERROR,"订单不存在"); + } + //0.2检查条码->得到试剂条码列表 + List<String> codeList = opeReagentStatusService + .checkReagentCode(opeApplyReserve.getStartReagentCode2(), opeApplyReserve.getEndReagentCode2(), opeApplyReserve.getArrivalNum()); + //1.入库 + if (codeList == null){ + //无条码入库 不需要增加状态和流向 + //1.1库存表增加 + opeWarehouseReserveService.insertOpeWarehouseReserve2(opeApplyReserve, oo); + }else{ + //条码入库 + assert codeList.size() > 0; + //1.1入库(库存表增加) + opeWarehouseReserveService.insertOpeWarehouseReserve2(opeApplyReserve, oo); + //1.2试剂状态表增加,流向增加 + opeReagentStatusService.orderInputWarehouseReagentStatusAndUseFlow(opeApplyReserve,consigneeId,codeList,oo); + } + //2.更改申购单所属订单状态(判断子订单是否全部完成) + //2.1更改该申购单的状态,收货人和到货时间 + this.updateOpeApplyInfo(ApplyStatus.STORAGE,consigneeId,arrivalTime, opeApplyReserve.getId()); + //2.2更改订单状态 + List<OpeApply> oas = opeOrderService.getOpeApplyListByOrder(oo.getId()); + assert oas.size() > 0; + //子订单是否全部入库,是则父单为完成,否则未完成 + boolean flag = oas.stream().allMatch(oa -> oa.getStatus() == ApplyStatus.STORAGE); + oo.setConsigneeUserId(consigneeId); + oo.setArrivalTime(arrivalTime); + if (flag){ + oo.setStatus(ApplyStatus.FINISHED); + opeOrderService.updateOpeOrderStatus(oo); + }else{ + oo.setStatus(ApplyStatus.UNCOMPLETED); + opeOrderService.updateOpeOrder(oo); + } + + } + } + } diff --git a/src/main/java/com/nanometer/smartlab/service/OpeOrderService.java b/src/main/java/com/nanometer/smartlab/service/OpeOrderService.java index ee16210..533afdb 100644 --- a/src/main/java/com/nanometer/smartlab/service/OpeOrderService.java +++ b/src/main/java/com/nanometer/smartlab/service/OpeOrderService.java @@ -33,4 +33,8 @@ public List<EmailStatus> selectByReId(String id); public void updateByReId(String newReId,String oldReId); + + OpeOrder getOrder(String id); + + void updateOpeOrderStatus(OpeOrder oo); } diff --git a/src/main/java/com/nanometer/smartlab/service/OpeOrderServiceImpl.java b/src/main/java/com/nanometer/smartlab/service/OpeOrderServiceImpl.java index fc401f8..50ce804 100644 --- a/src/main/java/com/nanometer/smartlab/service/OpeOrderServiceImpl.java +++ b/src/main/java/com/nanometer/smartlab/service/OpeOrderServiceImpl.java @@ -478,4 +478,15 @@ this.emailStatusDao.updateByReId(params); } + @Override + public OpeOrder getOrder(String id) { + return opeOrderDao.selectParentOrder(id); + } + + @Override + @Transactional + public void updateOpeOrderStatus(OpeOrder oo) { + opeOrderDao.updateOpeOrderStatus(oo); + } + } diff --git a/src/main/java/com/nanometer/smartlab/service/OpeReagentStatusService.java b/src/main/java/com/nanometer/smartlab/service/OpeReagentStatusService.java index fbed957..423d54f 100644 --- a/src/main/java/com/nanometer/smartlab/service/OpeReagentStatusService.java +++ b/src/main/java/com/nanometer/smartlab/service/OpeReagentStatusService.java @@ -1,8 +1,7 @@ package com.nanometer.smartlab.service; -import com.nanometer.smartlab.entity.OpeApply; -import com.nanometer.smartlab.entity.OpeReagentStatus; -import com.nanometer.smartlab.entity.SysUser; +import com.nanometer.smartlab.entity.*; +import com.nanometer.smartlab.exception.BusinessException; import java.util.Date; import java.util.LinkedHashMap; @@ -94,4 +93,9 @@ List<String> getReagentCodes(String reagentId); + //订单入库 新增试剂状态表 和流向 + void orderInputWarehouseReagentStatusAndUseFlow(OpeApplyReserve opeApplyReserve, String userId, List<String> reagentCodeList , OpeOrder opeOrder); + + List<String> checkReagentCode(String startReagentCode2, String endReagentCode2,Integer arrivalNum) throws BusinessException; + } diff --git a/src/main/java/com/nanometer/smartlab/service/OpeReagentStatusServiceImpl.java b/src/main/java/com/nanometer/smartlab/service/OpeReagentStatusServiceImpl.java index 66f3b49..98a63eb 100644 --- a/src/main/java/com/nanometer/smartlab/service/OpeReagentStatusServiceImpl.java +++ b/src/main/java/com/nanometer/smartlab/service/OpeReagentStatusServiceImpl.java @@ -1,5 +1,7 @@ package com.nanometer.smartlab.service; +import java.math.BigInteger; +import java.sql.Timestamp; import java.util.*; import javax.annotation.Resource; @@ -806,5 +808,137 @@ return opeReagentStatusDao.selectReagentCodesByReId(reagentId); } + @Override + /** + * @Description: 订单入库时 的更新试剂状态和更新试剂流向 + */ + @Transactional + public void orderInputWarehouseReagentStatusAndUseFlow + (OpeApplyReserve opeApplyReserve,String userId,List<String> reagentCodeList,OpeOrder opeOrder) { + + + for (String reagentCode : reagentCodeList) { + + //1.新增试剂状态:在仓库有 + OpeReagentStatus ors = new OpeReagentStatus(); + ors.setId(IDUtils.uuid()); + //状态和用户 + ors.setStatus(ArrivalStatus.WAREHOUSE); + ors.setUserId(userId); + //入库场所 + ors.setHouseId(opeApplyReserve.getHouseId()); + ors.setContainerId(opeApplyReserve.getContainerId()); + //试剂编码 id和批号 + ors.setReagentCode(reagentCode); + ors.setReagentId(opeApplyReserve.getReagent().getId()); + ors.setArticleNumber(opeApplyReserve.getArticleNumber()); + //订单和申购单 + ors.setApplyCode(opeApplyReserve.getApplyCode()); + ors.setOrderCode(opeOrder.getOrderCode()); + opeReagentStatusDao.insertOpeReagentStatus2(ors); + + //2.更新试剂流向 + OpeUseFlow ouf = new OpeUseFlow(); + ouf.setId(IDUtils.uuid()); + //持有者 + ouf.setUserId(userId); + //在仓库状态 + ouf.setStatus(ArrivalStatus.WAREHOUSE); + //操作状态->仓库入库 + 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); + ouf.setOperateState(baseMetaList.get(0).getId()); + //地点 + ouf.setHouseId(opeApplyReserve.getHouseId()); + ouf.setContainerId(opeApplyReserve.getContainerId()); + //试剂条码 + ouf.setReagentCode(reagentCode); + //创建时间 + ouf.setCreateTime(new Timestamp(new Date().getTime())); + opeUseFlowDao.insertOpeUseFlow(ouf); + + } + + + + + + } + + /** + * @Description: 校验条码在试剂状态中是否存在 + */ + @Override + public List<String> checkReagentCode(String startReagentCode2, String endReagentCode2,Integer arrivalNum) throws BusinessException { + if (startReagentCode2 == null || startReagentCode2.length() < 1) { + return null; + } + + if (endReagentCode2 == null || endReagentCode2.length() < 1) { + return null; + } + + + + List<String> codeList= new ArrayList<>(); + //1.做24位的字母判断否则就是纯数字 + if (startReagentCode2.matches(".*[A-F]+.*")) { + //长度为24并且后5位随机码得是数字 + if (startReagentCode2.length() == 24 && + endReagentCode2.length() == 24 && + 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); + String regentPrefix2 = endReagentCode2.substring(0, endReagentCode2.length() - 5); + //如果距离不是 到货数量或者非后5位得前缀有问题,则说明输入有问题 + if (randomEnd - randomStart + 1 != arrivalNum||!regentPrefix2.equals(regentPrefix)) { + throw new BusinessException(ExceptionEnumCode.PARAM_EXIST,"试剂的开始结束条码有问题"); + } + for (int random = randomStart; random < randomEnd; random++) { + String random5 = String.format("%0" + 5 + "d", random); + String reagentCode = regentPrefix + random5; + OpeReagentStatus opeReagentStatus = this.getOpeReagentStatusByReagentCode(reagentCode); + if (opeReagentStatus != null) { + throw new BusinessException(ExceptionEnumCode.PARAM_EXIST, + MessageUtil.getMessageByCode(ExceptionEnumCode.PARAM_EXIST.getCode(), "试剂条码", reagentCode)); + }else{ + codeList.add(reagentCode); + } + } + return codeList; + }else{ + throw new BusinessException(ExceptionEnumCode.REAGENT_CODE_INVALID,"输入的试剂条码不合法"); + } + } + + //2.纯数字编码列表生成 + BigInteger reagentCode= new BigInteger(startReagentCode2); + BigInteger endReagentCode = new BigInteger(endReagentCode2); + //条码得距离 如果和到货数量不等 则输入有问题 + if (!endReagentCode.subtract(reagentCode).add(BigInteger.ONE).equals(new BigInteger(String.valueOf(arrivalNum)))) { + throw new BusinessException(ExceptionEnumCode.REAGENT_CODE_INVALID,"试剂的开始结束条码有问题"); + } + + + while (reagentCode.compareTo(endReagentCode) <= 0) { + + String reagentCodeStr = String.format("%0" + startReagentCode2.length() + "d", reagentCode); + OpeReagentStatus opeReagentStatus = this.getOpeReagentStatusByReagentCode(reagentCodeStr); + if (opeReagentStatus != null) { + throw new BusinessException(ExceptionEnumCode.PARAM_EXIST, + MessageUtil.getMessageByCode(ExceptionEnumCode.PARAM_EXIST.getCode(), "试剂条码", reagentCodeStr)); + }else{ + codeList.add(reagentCodeStr); + } + reagentCode = reagentCode.add(BigInteger.ONE); + } + + return codeList; + } + } diff --git a/src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveService.java b/src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveService.java index fbcacba..36f06d1 100644 --- a/src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveService.java +++ b/src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveService.java @@ -4,6 +4,7 @@ import com.nanometer.smartlab.entity.OpeApply; import com.nanometer.smartlab.entity.OpeApplyReserve; +import com.nanometer.smartlab.entity.OpeOrder; import com.nanometer.smartlab.entity.OpeWarehouseReserve; /** @@ -30,4 +31,6 @@ public List<OpeWarehouseReserve> selectByReId(String id); public void updateByReId(String newReId,String oldReId); + + void insertOpeWarehouseReserve2(OpeApplyReserve opeApplyReserve, OpeOrder oo); } diff --git a/src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveServiceImpl.java b/src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveServiceImpl.java index 9086784..1b9ccce 100644 --- a/src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveServiceImpl.java +++ b/src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveServiceImpl.java @@ -8,6 +8,7 @@ import com.nanometer.smartlab.dao.OpeApplyDao; import com.nanometer.smartlab.entity.*; +import com.nanometer.smartlab.entity.enumtype.ValidFlag; import com.nanometer.smartlab.exception.AlarmCode; import com.nanometer.smartlab.exception.AlarmException; import com.nanometer.smartlab.util.IDUtils; @@ -430,7 +431,29 @@ this.opeWarehouseReserveDao.updateByReId(params); } - @Transactional(propagation = Propagation.REQUIRED) + @Override + @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); + + } + + @Transactional(propagation = Propagation.REQUIRED) public void reagentDStore(List<OpeApply> reagentDStoreList, String loginUserId) { if (reagentDStoreList == null) { diff --git a/src/main/java/com/nanometer/smartlab/util/Constants.java b/src/main/java/com/nanometer/smartlab/util/Constants.java index 00cab5c..026ea58 100644 --- a/src/main/java/com/nanometer/smartlab/util/Constants.java +++ b/src/main/java/com/nanometer/smartlab/util/Constants.java @@ -50,6 +50,7 @@ public static final String PAGE_VIEW_ORDER_MNG = "view_order_mng"; public static final String PAGE_CANCEL_ORDER_MNG = "cancel_order_mng"; public static final String PAGE_WAREHOUSE_REAGENT_DIRECT_STORE = "warehouse_reagent_direct_store"; + public static final String PAGE_ORDER_INPUT_WAREHOUSE = "order_input_warehouse"; // -----页面名称(以xhtml文件名为准)end----- diff --git a/src/main/webapp/WEB-INF/spring-menu.xml b/src/main/webapp/WEB-INF/spring-menu.xml index 438de1b..186064f 100644 --- a/src/main/webapp/WEB-INF/spring-menu.xml +++ b/src/main/webapp/WEB-INF/spring-menu.xml @@ -153,6 +153,15 @@ </bean> <bean class="com.nanometer.smartlab.model.MenuModel"> + <property name="id" value="order_input_warehouse"></property> + <property name="title" value="仓库订单领用"></property> + <property name="page" value="order_input_warehouse"></property> + <property name="dispInMenuList" value="false"></property> + <property name="initClazz" value="warehouseStockMngController"></property> + <property name="initMethod" value="initInputWarehouse"></property> + </bean> + + <bean class="com.nanometer.smartlab.model.MenuModel"> <property name="id" value="warehouse_reagent_direct_store"></property> <property name="title" value="试剂直接入库"></property> <property name="page" value="warehouse_reagent_direct_store"></property> diff --git a/src/main/webapp/order_input_warehouse.xhtml b/src/main/webapp/order_input_warehouse.xhtml new file mode 100644 index 0000000..060e5a4 --- /dev/null +++ b/src/main/webapp/order_input_warehouse.xhtml @@ -0,0 +1,202 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html + PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:ui="http://java.sun.com/jsf/facelets" + xmlns:p="http://primefaces.org/ui" + xmlns:h="http://java.sun.com/jsf/html" + xmlns:f="http://java.sun.com/jsf/core" + xmlns:c="http://java.sun.com/jsp/jstl/core"> +<head></head> +<ui:composition> + <h:form id="orderMngRukuForm"> + <p:panel styleClass="center-header"> + <p:outputLabel styleClass="title" value="订单入库"/> + </p:panel> + <p:panel styleClass="center-body"> + <p:panel styleClass="apply-mng-new-body"> + <p:panelGrid styleClass="info grid-padding-bottom2" columns="2"> + <p:outputLabel value="到货时间:"/> + <p:calendar value="#{warehouseStockMngController.arrivalTime}" + converter="timestampConvert" + pattern="yyyy-MM-dd" + locale="zh_CN" + required="true" + requiredMessage="请选择到货时间"/> + + <p:outputLabel value="收货人:"/> + <p:selectOneMenu value="#{warehouseStockMngController.consigneeId}" + filter="true" + filterMatchMode="startsWith" + required="true" + requiredMessage="请选择收货人"> + <f:selectItems value="#{warehouseStockMngController.getConsignee()}" + var="item" + itemValue="#{item.id}" + itemLabel="#{item.name}"/> + </p:selectOneMenu> + </p:panelGrid> + + <p:panel styleClass="btn"> + <p:commandButton value="取消" + process="@this" + update=":centerRootPanel" + actionListener="#{warehouseStockMngController.onCancelBtnClick}" + styleClass="cancel-btn"/> + + <p:commandButton value="确定" + process="@form" + update=":centerRootPanel" + actionListener="#{warehouseStockMngController.onSaveInputWarehouseClick}" + styleClass="save-btn"> + <p:confirm header="确认" message="确认操作?"/> + </p:commandButton> + </p:panel> + </p:panel> + + <p:dataTable styleClass="data-table" + paginator="true" paginatorAlwaysVisible="false" + paginatorPosition="bottom" + value="#{warehouseStockMngController.opeApplyList}" + var="row" rowKey="#{row.id}" + emptyMessage="无数据" + editable="true" + rows="20" + pageLinks="5"> + + <p:column width="100"> + <p:rowEditor/> + </p:column> + + <p:column headerText="申购编号" width="120"> + <h:outputText value="#{row.applyCode}"/> + </p:column> + + <p:column headerText="试剂名称" width="120"> + <h:outputText value="#{row.reagent!=null?row.reagent.name:''}"/> + </p:column> + + <p:column headerText="包装" width="80"> + <h:outputText value="#{row.reagent!=null?(''.concat(row.reagent.mainMetering).concat(baseMetaService.getBaseMetaValue(row.reagent.reagentUnit))):''}"/> + </p:column> + + <p:column headerText="CAS" width="80"> + <h:outputText value="#{row.reagent!=null?row.reagent.cas:''}"/> + </p:column> + + <p:column headerText="厂家" width="80"> + <h:outputText value="#{row.reagent.productHome}"/> + </p:column> + + <p:column headerText="申购数量" width="80"> + <h:outputText value="#{row.num}"/> + </p:column> + + <p:column headerText="申购人" width="80"> + <h:outputText value="#{sysUserService.getSysUser(row.applyUserId).getName()}"/> + </p:column> + + <p:column headerText="到货数量" width="80"> + <p:cellEditor> + <f:facet name="output"> + <h:outputText value="#{row.arrivalNum}" /> + </f:facet> + <f:facet name="input"> + <p:inputText value="#{row.arrivalNum}" + styleClass="arrivalNum" + minValue="0" + required="true" + requiredMessage="请输入到货数量" + onkeyup="this.value = #{row.num}"> + <p:ajax event="keyup" listener="#{warehouseStockMngController.setArrival(row)}"/> + </p:inputText> + </f:facet> + </p:cellEditor> + </p:column> + + <p:column headerText="批号" width="100"> + <p:cellEditor> + <f:facet name="output"> + <h:outputText value="#{row.articleNumber}" /> + </f:facet> + <f:facet name="input"> + <p:inputText value="#{row.articleNumber}" maxlength="32" style="width: 100%" required="true" + requiredMessage="请输入到批号"/> + </f:facet> + </p:cellEditor> + </p:column> + + <p:column headerText="条形码开始" width="200"> + <p:cellEditor> + <f:facet name="output"> + <h:outputText value="#{row.startReagentCode2}"/> + </f:facet> + <f:facet name="input"> + <p:inputText value="#{row.startReagentCode2}" + maxlength="24" + size="24" + styleClass="reagentCodeStart" + onkeyup="this.value = this.value.replace(/[^0-9A-F]/,'')"> + <p:ajax event="change" listener="#{warehouseStockMngController.reagentStartCodeChange(row)}" update="@this,@(.reagentCodeEnd),@(.arrivalNum)"/> + </p:inputText> + </f:facet> + </p:cellEditor> + </p:column> + + <p:column headerText="条形码结束" width="200"> + <p:cellEditor> + <f:facet name="output"> + <h:outputText value="#{row.endReagentCode2}" /> + </f:facet> + <f:facet name="input"> + <p:inputText value="#{row.endReagentCode2}" + maxlength="24" + size="24" + onkeyup="this.value = this.value.replace(/\D/g,'')" + styleClass="reagentCodeEnd"> + </p:inputText> + </f:facet> + </p:cellEditor> + </p:column> + + <p:column headerText="仓库名" width="120"> + <p:cellEditor> + <f:facet name="output"> + <h:outputText value="#{warehouseStockMngController.formatWarehouseName(row.houseId)}"/> + </f:facet> + <f:facet name="input"> + <p:selectOneMenu value="#{row.houseId}" style="width: 110px"> + <p:ajax event="change" process="@this" + listener="#{warehouseStockMngController.onWarehouseSelectChange(row.houseId)}" + update="containerSelect"/> + <f:selectItems value="#{warehouseStockMngController.warehouseList}" var="item" + itemValue="#{item.id}" itemLabel="#{item.name}"/> + </p:selectOneMenu> + </f:facet> + </p:cellEditor> + </p:column> + + <p:column headerText="货柜名" width="120"> + <p:cellEditor> + <f:facet name="output"> + <h:outputText value="#{warehouseStockMngController.formatWarehouseContainerName(row.containerId)}" /> + </f:facet> + <f:facet name="input"> + <p:selectOneMenu id="containerSelect" value="#{row.containerId}" style="width: 110px"> + <f:selectItems value="#{warehouseStockMngController.warehouseContainerList}" var="item" + itemValue="#{item.id}" itemLabel="#{item.containerCode}"/> + </p:selectOneMenu> + </f:facet> + </p:cellEditor> + </p:column> + + </p:dataTable> + + + + </p:panel> + </h:form> +</ui:composition> +</html> \ No newline at end of file diff --git a/src/main/webapp/resources/css/default.css b/src/main/webapp/resources/css/default.css index 48741f1..b35cb19 100644 --- a/src/main/webapp/resources/css/default.css +++ b/src/main/webapp/resources/css/default.css @@ -1102,4 +1102,9 @@ vertical-align: baseline; border-radius: .25em; background-color: #d9534f; +} + + +#tabView\:putInStorageTmpOrder th{ + background: #1c427b !important; } \ No newline at end of file diff --git a/src/main/webapp/warehouse_stock_mng.xhtml b/src/main/webapp/warehouse_stock_mng.xhtml index a97ef7d..f55ec7d 100644 --- a/src/main/webapp/warehouse_stock_mng.xhtml +++ b/src/main/webapp/warehouse_stock_mng.xhtml @@ -7,7 +7,6 @@ xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:p="http://primefaces.org/ui" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core"> -<head></head> <ui:composition> <p:tabView dynamic="true" id="tabView" activeIndex="#{warehouseStockMngController.tabValue}"> <p:ajax event="tabChange" listener="#{warehouseStockMngController.onTabChange}"/> @@ -243,6 +242,95 @@ </p:panel> </h:form> </div> + <div id ="putInStorage" style="display: none"> + <h:form id="putInStorageTmpOrder" styleClass="inputStorageTmp"> + <p:panel styleClass="center-body"> + <p:panelGrid columns="3" styleClass="btn"> + <p:commandButton value="删除" styleClass="del-btn" process="@form" + actionListener="#{warehouseStockMngController.cancelInputStorageTmp}" + update="@(.inputStorageTmp)" + /> + <p:commandButton value="清空" styleClass="del-btn" process="@form" + actionListener="#{warehouseStockMngController.clearInputStorageTmp}" + update="@(.inputStorageTmp)" + /> + <p:commandButton value="提交" styleClass="edit-btn" process="@form" + actionListener="#{warehouseStockMngController.onUseBtnClickInputStorageTmp}" + update=":centerRootPanel"/> + </p:panelGrid> + <p:dataTable id="putInStorageTmpOrderTable" styleClass="data-table" + paginator="true" paginatorAlwaysVisible="false" paginatorPosition="bottom" + lazy="true" value="#{warehouseStockMngController.selectedInputStorageTmpOrderList}" var="row" + selection="#{warehouseStockMngController.trulyInputStorageTmpSelectedOrderList}" + rowKey="#{row.id}" + emptyMessage="无数据" rows="20" pageLinks="5"> + <p:column selectionMode="multiple" style="width: 30px;text-align: center;" /> + + <p:column headerText="申购编号" width="170"> + <h:outputText value="#{row.applyCode}"/> + </p:column> + + <p:column headerText="产品编号"> + <h:outputText value="#{row.reagent.productSn}"/> + </p:column> + + <p:column headerText="试剂名称"> + <h:outputText value="#{row.reagent.name}"/> + </p:column> + + <p:column headerText="管制品"> + <h:outputText value="#{row.reagent.controlProducts}"/> + </p:column> + + <p:column headerText="规格"> + <h:outputText value="#{row.reagent.reagentFormat}"/> + </p:column> + + <p:column headerText="包装"> + <h:outputText + value="#{''.concat(row.reagent.mainMetering).concat(baseMetaService.getBaseMetaValue(row.reagent.reagentUnit))}"/> + </p:column> + + <p:column headerText="价格"> + <h:outputText value="#{row.reagent.price}"/> + </p:column> + + <p:column headerText="CAS"> + <h:outputText value="#{row.reagent.cas}"/> + </p:column> + + <p:column headerText="危险性质"> + <h:outputText value="#{row.reagent.reagentCharacter}"/> + </p:column> + + <p:column headerText="厂商"> + <h:outputText + value="#{row.reagent.productHome}"/> + </p:column> + + <p:column headerText="申请数量"> + <h:outputText + value="#{row.num}"/> + </p:column> + + <p:column headerText="已领用数量"> + <h:outputText + value="#{row.used}"/> + </p:column> + + <p:column headerText="申领人"> + <h:outputText + value="#{row.applyUserId}"/> + </p:column> + + <p:column headerText="订单状态"> + <h:outputText value="#{row.status.getText()}"/> + </p:column> + + </p:dataTable> + </p:panel> + </h:form> + </div> <h:form id="warehouseStockMngFormForPerson"> <p:panel styleClass="center-header" style="border-bottom:none;"> <p:panelGrid styleClass="filter" columns="5"> @@ -259,11 +347,16 @@ <p:panel styleClass="center-body"> <p:panelGrid columns="2" styleClass="btn" rendered="#{warehouseStockMngController.editFlag==1}"> - + <p:commandButton value="入库" styleClass="edit-btn" process="@form" + actionListener="#{warehouseStockMngController.addInputStorageOrder}" + disabled="#{warehouseStockMngController.editFlag==0}" + oncomplete="$('#putInStorage').css('display','block');$('#showTabOrder').css('display','none');" + update="@(.inputStorageTmp)" + ></p:commandButton> <p:commandButton value="领用" styleClass="edit-btn" process="@form" actionListener="#{warehouseStockMngController.addOrder}" disabled="#{warehouseStockMngController.editFlag==0}" - oncomplete="$('#showTabOrder').css('display','block');" + oncomplete="$('#showTabOrder').css('display','block');$('#putInStorage').css('display','none');" update="@(.tmpOrder)" ></p:commandButton> </p:panelGrid> @@ -331,6 +424,11 @@ <p:column headerText="订单状态"> <h:outputText value="#{row.status!=null?row.status.text:''}"></h:outputText> </p:column> + <p:column headerText="到货时间"> + <h:outputText value="#{row.arrivalTime}"> + <f:convertDateTime pattern="yyyy-MM-dd" locale="zh_CN"/> + </h:outputText> + </p:column> </p:dataTable> </p:panel> </h:form> -- Gitblit v1.9.2