From 1a52289b4d1c7097a654610c132a91716655d3db Mon Sep 17 00:00:00 2001
From: lyfO_o <764716047@qq.com>
Date: 星期五, 11 六月 2021 17:34:34 +0800
Subject: [PATCH] 试剂安全库存

---
 src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.xml              |    7 +
 src/main/java/com/nanometer/smartlab/dao/SysReagentDao.xml                       |   33 ++++++
 src/main/webapp/reagent_mng.xhtml                                                |   65 ++++++++++++
 src/main/java/com/nanometer/smartlab/email/EmailSendSchedule.java                |   44 ++++++--
 src/main/java/com/nanometer/smartlab/service/SysUserService.java                 |    3 
 src/main/java/com/nanometer/smartlab/service/SysUserServiceImpl.java             |    7 +
 src/main/java/com/nanometer/smartlab/dao/SysUserDao.java                         |    3 
 src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.java             |    2 
 src/main/java/com/nanometer/smartlab/service/SysReagentService.java              |    5 +
 src/main/java/com/nanometer/smartlab/controller/ReagentMngController.java        |   30 ++++++
 src/main/java/com/nanometer/smartlab/entity/SysReagent.java                      |   20 ++++
 src/main/java/com/nanometer/smartlab/dao/SysUserDao.xml                          |    9 +
 src/main/java/com/nanometer/smartlab/dao/SysReagentDao.java                      |    5 +
 src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveService.java     |    3 
 src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveServiceImpl.java |   11 ++
 src/main/java/com/nanometer/smartlab/service/SysReagentServiceImpl.java          |   11 ++
 16 files changed, 244 insertions(+), 14 deletions(-)

diff --git a/src/main/java/com/nanometer/smartlab/controller/ReagentMngController.java b/src/main/java/com/nanometer/smartlab/controller/ReagentMngController.java
index 9321228..0e14bda 100644
--- a/src/main/java/com/nanometer/smartlab/controller/ReagentMngController.java
+++ b/src/main/java/com/nanometer/smartlab/controller/ReagentMngController.java
@@ -25,6 +25,7 @@
 
 import javax.annotation.Resource;
 import javax.faces.context.FacesContext;
+import javax.faces.event.ActionListener;
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
@@ -912,4 +913,33 @@
     public void setProductSn(String productSn) {
         this.productSn = productSn;
     }
+
+    public void openUpdateSafetyNumDialog() {
+        if (this.selectedList == null
+                || this.selectedList.size() == 0) {
+            FacesUtils.warn("请选择数据。");
+            return;
+        }
+        if (this.selectedList.size() > 1) {
+            FacesUtils.warn("只能选择一个数据进行修改。");
+            return;
+        }
+        this.sysReagent = this.sysReagentService.getSysReagent(this.selectedList.get(0).getId());
+        if (this.sysReagent.getType() != 1) {
+            FacesUtils.warn("只能选择试剂设置安全库存。");
+            return;
+        }
+        RequestContext.getCurrentInstance().execute("PF('dialog-setSafetynum').show()");
+    }
+
+    public void updateSafetyNum(){
+        if (this.sysReagent.getSafetynum() == null) {
+            FacesUtils.warn("请输入安全库存。");
+            return;
+        }
+        sysReagentService.updateSafetyNum(this.sysReagent);
+        FacesUtils.warn("修改成功。");
+        RequestContext.getCurrentInstance().execute("PF('dialog-setSafetynum').hide()");
+
+    }
 }
diff --git a/src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.java b/src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.java
index 5c2db61..6708780 100644
--- a/src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.java
+++ b/src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.java
@@ -41,4 +41,6 @@
     List<OpeWarehouseReserve> selectWarehouseByRidAndArtiNumberAndWid(Map params);
 
     void updateBtReserve(String id, Integer useNum);
+
+    Integer countByReagentId(String id);
 }
diff --git a/src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.xml b/src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.xml
index 40d4822..9cb99b9 100644
--- a/src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.xml
+++ b/src/main/java/com/nanometer/smartlab/dao/OpeWarehouseReserveDao.xml
@@ -208,6 +208,13 @@
 
         order by oa.update_time,oa.reserve
     </select>
+    <select id="countByReagentId" resultType="java.lang.Integer">
+        select ifnull(sum(owr.reserve),0)
+        from ope_warehouse_reserve as owr
+        where owr.reserve > 0
+        and owr.reagent_id = #{id}
+        group by owr.reagent_id
+    </select>
 
     <update id="updateByReId" parameterType="java.util.Map">
         update ope_warehouse_reserve set reagent_id=#{newReId} where reagent_id=#{oldReId}
diff --git a/src/main/java/com/nanometer/smartlab/dao/SysReagentDao.java b/src/main/java/com/nanometer/smartlab/dao/SysReagentDao.java
index 0fabdf9..a0ca110 100644
--- a/src/main/java/com/nanometer/smartlab/dao/SysReagentDao.java
+++ b/src/main/java/com/nanometer/smartlab/dao/SysReagentDao.java
@@ -1,6 +1,7 @@
 package com.nanometer.smartlab.dao;
 
 import com.nanometer.smartlab.entity.SysReagent;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.dao.DataAccessException;
 
 import java.math.BigDecimal;
@@ -36,4 +37,8 @@
     String getReagentUnitByReagentId(String reagentId);
 
     List<SysReagent> getReagent(Map params);
+
+    List<SysReagent> selectReagentSafetyNum();
+
+    void updateSafetyNum(@Param("id") String id, @Param("safetynum") Integer safetynum);
 }
diff --git a/src/main/java/com/nanometer/smartlab/dao/SysReagentDao.xml b/src/main/java/com/nanometer/smartlab/dao/SysReagentDao.xml
index dbc5d1a..248d804 100644
--- a/src/main/java/com/nanometer/smartlab/dao/SysReagentDao.xml
+++ b/src/main/java/com/nanometer/smartlab/dao/SysReagentDao.xml
@@ -29,6 +29,7 @@
     <result property="type" column="type"></result>
     <result property="unitName" column="unitName"></result>
     <result property="formatName" column="formatName"></result>
+    <result property="safetynum" column="safetynum"></result>
   </resultMap>
 
   <sql id="queryWhereSql">
@@ -379,9 +380,34 @@
     </if>
 
   </select>
+    <select id="selectReagentSafetyNum" resultMap="SysReagent">
+      select
+      sr.id,
+      sr.safetynum,
+      sr.name,
+      sr.main_metering,
+      bm1.meta_value reagent_unit,
+      bm2.meta_value reagent_type,
+      bm3.meta_value reagent_format,
+      bm4.meta_value product_home,
+      ss.meta_value as product_home_name,
+       bm.meta_value as control_products_name,
+       supplier.name as supplierName
+      from sys_reagent as sr
+      left join base_meta as ss on sr.product_home = ss.id
+      left join base_meta bm	on bm.id = sr.control_products
+      left join sys_supplier supplier on supplier.id = sr.supplier_id
+      left join base_meta bm1 on bm1.id = sr.reagent_unit
+      left join base_meta bm2 on bm2.id = sr.reagent_type
+      left join base_meta bm3 on bm3.id = sr.reagent_format
+      left join base_meta bm4 on bm4.id = sr.product_home
+      where sr.valid_flag = 1
+      and sr.type = 1
+      and safetynum > 0
+    </select>
 
 
-  <insert id="insertSysReagent" parameterType="com.nanometer.smartlab.entity.SysReagent">
+    <insert id="insertSysReagent" parameterType="com.nanometer.smartlab.entity.SysReagent">
     insert into sys_reagent(id, name, cas, reagent_type, reagent_character, supplier_id, reagent_format, main_metering, reagent_unit, price, per_box, memo, valid_flag, create_time, update_time,deadline, product_sn, dangerous_flag,control_products,product_home,type)
     values (#{id}, #{name}, #{cas}, #{reagentType}, #{reagentCharacter}, #{supplierId}, #{reagentFormat}, #{mainMetering}, #{reagentUnit}, #{price}, #{perBox}, #{memo}, 1, now(), now(),#{deadline}, #{productSn}, #{dangerousFlag},#{controlProducts},#{productHome},#{type})
   </insert>
@@ -436,4 +462,9 @@
       #{item}
     </foreach>
   </update>
+  <update id="updateSafetyNum">
+    update sys_reagent
+    set safetynum = #{safetynum}
+    where id = #{id}
+  </update>
 </mapper>
diff --git a/src/main/java/com/nanometer/smartlab/dao/SysUserDao.java b/src/main/java/com/nanometer/smartlab/dao/SysUserDao.java
index c2502aa..c0bd43b 100644
--- a/src/main/java/com/nanometer/smartlab/dao/SysUserDao.java
+++ b/src/main/java/com/nanometer/smartlab/dao/SysUserDao.java
@@ -60,4 +60,7 @@
 
     List<Map> getExportUserList(@Param("arp") String arp,@Param("name") String name, @Param("departmentName") String departmentName,
                                 @Param("project") String project,@Param("company") String company);
+
+    List<String> getLibrarianEmail();
+
 }
diff --git a/src/main/java/com/nanometer/smartlab/dao/SysUserDao.xml b/src/main/java/com/nanometer/smartlab/dao/SysUserDao.xml
index 196db18..811f882 100644
--- a/src/main/java/com/nanometer/smartlab/dao/SysUserDao.xml
+++ b/src/main/java/com/nanometer/smartlab/dao/SysUserDao.xml
@@ -377,6 +377,15 @@
         </where>
         order by su.arp ASC
     </select>
+    <select id="getLibrarianEmail" resultType="java.lang.String">
+
+        select su.email
+        from sys_user  as su
+        left join base_role as br on br.id = su.role_id
+        where  br.name = '库管员'
+        and su.email is not null
+        and su.email != ''
+    </select>
     <update id="updateUserPointBySelective" parameterType="java.util.Map">
     update sys_user set point=#{point}
     <where>
diff --git a/src/main/java/com/nanometer/smartlab/email/EmailSendSchedule.java b/src/main/java/com/nanometer/smartlab/email/EmailSendSchedule.java
index 25a3378..8c201c2 100644
--- a/src/main/java/com/nanometer/smartlab/email/EmailSendSchedule.java
+++ b/src/main/java/com/nanometer/smartlab/email/EmailSendSchedule.java
@@ -1,6 +1,7 @@
 package com.nanometer.smartlab.email;
 
 import com.nanometer.smartlab.entity.EmailStatus;
+import com.nanometer.smartlab.entity.OpeWarehouseReserve;
 import com.nanometer.smartlab.entity.SysReagent;
 import com.nanometer.smartlab.entity.enumtype.EmailSendStatus;
 import com.nanometer.smartlab.exception.BusinessException;
@@ -25,6 +26,13 @@
     private OpeOrderService opeOrderService;
 
     private static Logger logger = Logger.getLogger(EmailSendSchedule.class);
+
+    @Resource
+    private SysReagentService sysReagentService;
+    @Resource
+    private OpeWarehouseReserveService opeWarehouseReserveService;
+    @Resource
+    private SysUserService userService;
 
     @Scheduled(fixedDelayString = "${emailSend.schedule.delay}")
     public void EmailSendSchedule(){
@@ -61,13 +69,23 @@
 
 
 //        @Scheduled(cron = "0/5 * * * * ?") //每隔5秒执行一次
-    @Scheduled(cron = "0 0 8 * * ?") //每天8点执行一次
+    @Scheduled(cron = "0 0/3 * * * ?") //每天8点执行一次
     public void EmailSendStock(){
-        List<String> revicerList = new ArrayList<>();
-
+        //收件人为人员角色为库管员的邮箱
+        List<String> revicerList = userService.getLibrarianEmail();
+        //先查试剂表 安全库存大于0,然后去查库存,实际库存小于安全库存的列表
         List<SysReagent> sysReagentList = new ArrayList<>();
-
-
+        //已经填写安全库存的试剂
+        List<SysReagent> alreadyFillIn = sysReagentService.selectReagentSafetyNum();
+        if (alreadyFillIn.size() > 0) {
+            for (SysReagent reagent : alreadyFillIn) {
+                int actualNum = opeWarehouseReserveService.countByReagentId(reagent.getId());
+                if (reagent.getSafetynum() > actualNum) {
+                    reagent.setActualnum(actualNum);
+                    sysReagentList.add(reagent);
+                }
+            }
+        }
         StringBuffer content = new StringBuffer("<html><body>");
         content.append("<div style=\"line-height:1.7;color:#000000;font-size:14px;font-family:Arial\">");
         content.append("<table border=\"1\">");
@@ -89,20 +107,24 @@
             content.append("<td>"+sysReagent.getName()+"</td>");
             content.append("<td>"+sysReagent.getProductSn()+"</td>");
             content.append("<td>"+sysReagent.getCas()+"</td>");
-            content.append("<td>"+sysReagent.getReagentType()+"</td>");
+
+            content.append("<td>"+sysReagent.getReagentType()+"</td>");//
             content.append("<td>"+sysReagent.getSupplierName()+"</td>");
+
             content.append("<td>"+sysReagent.getProductHomeName()+"</td>");
-            content.append("<td>"+sysReagent.getReagentFormat()+"</td>");
-            content.append("<td>"+sysReagent.getReagentUnit()+"</td>");
-            //content.append("<td>"+sysReagent+"</td>");安全库存
-            //content.append("<td>"+sysReagent+"</td>");实际库存
+
+            content.append("<td>"+sysReagent.getReagentFormat()+"</td>");//
+
+            content.append("<td>"+sysReagent.getReagentUnit()+"</td>");//
+            content.append("<td>"+sysReagent.getSafetynum()+"</td>");
+            content.append("<td>"+sysReagent.getActualnum()+"</td>");
             content.append("</tr>");
         }
         content.append("</tbody></table></div>");
         content.append("</body></html>");
 
         try {
-            EmailSend.sendArrivalEmail(revicerList,content.toString());
+//            EmailSend.sendArrivalEmail(revicerList,content.toString());
             //  发送成功,更新邮件发送状态为:已发送
         } catch (BusinessException e) {
             //  发送失败,更新邮件发送状态为:发送失败
diff --git a/src/main/java/com/nanometer/smartlab/entity/SysReagent.java b/src/main/java/com/nanometer/smartlab/entity/SysReagent.java
index 24bd372..9ea2e44 100644
--- a/src/main/java/com/nanometer/smartlab/entity/SysReagent.java
+++ b/src/main/java/com/nanometer/smartlab/entity/SysReagent.java
@@ -43,6 +43,8 @@
     private String formatName;
 
     private String favor;
+    private Integer safetynum;
+    private Integer actualnum;
 
 
     public void change(){
@@ -292,4 +294,22 @@
     public void setControlProducts(String controlProducts) {
         this.controlProducts = controlProducts;
     }
+
+    public Integer getSafetynum() {
+        return safetynum;
+    }
+
+    public void setSafetynum(Integer safetynum) {
+        this.safetynum = safetynum;
+    }
+
+    public Integer getActualnum() {
+        return actualnum;
+    }
+
+    public void setActualnum(Integer actualnum) {
+        this.actualnum = actualnum;
+    }
+
+
 }
diff --git a/src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveService.java b/src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveService.java
index f8ea1b4..051266e 100644
--- a/src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveService.java
+++ b/src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveService.java
@@ -47,4 +47,7 @@
 	List<OpeWarehouseReserve> selectWarehouseByRidAndArticleNumberAndWarehouse(String id, String articleNumber, String warehouseId);
 
 	void updateBtReserve(String id,Integer useNum);
+
+	//根据试剂Id查找当前库存
+    int countByReagentId(String id);
 }
diff --git a/src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveServiceImpl.java b/src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveServiceImpl.java
index d63916b..ecbf8be 100644
--- a/src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveServiceImpl.java
+++ b/src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveServiceImpl.java
@@ -668,7 +668,16 @@
 		opeWarehouseReserveDao.updateBtReserve(id, useNum);
 	}
 
-	@Override
+    @Override
+    public int countByReagentId(String id) {
+		int num = 0;
+		if (opeWarehouseReserveDao.countByReagentId(id) != null) {
+			num = opeWarehouseReserveDao.countByReagentId(id);
+		}
+		return num;
+    }
+
+    @Override
 	public void btWarehouseReserveReduce(List<OpeApplyReserve> opeList) {
 		if (opeList.size() < 1) {
 			return;
diff --git a/src/main/java/com/nanometer/smartlab/service/SysReagentService.java b/src/main/java/com/nanometer/smartlab/service/SysReagentService.java
index 775a88f..b259e92 100644
--- a/src/main/java/com/nanometer/smartlab/service/SysReagentService.java
+++ b/src/main/java/com/nanometer/smartlab/service/SysReagentService.java
@@ -38,4 +38,9 @@
     String getReagentUnitByReagentId(String reagentId);
 
     List<SysReagent>  getReagent(String name, String cas, String factory, String specifications, String packing);
+
+    List<SysReagent> selectReagentSafetyNum();
+
+    void updateSafetyNum(SysReagent sysReagent);
+
 }
diff --git a/src/main/java/com/nanometer/smartlab/service/SysReagentServiceImpl.java b/src/main/java/com/nanometer/smartlab/service/SysReagentServiceImpl.java
index 9c299bf..82d0f3d 100644
--- a/src/main/java/com/nanometer/smartlab/service/SysReagentServiceImpl.java
+++ b/src/main/java/com/nanometer/smartlab/service/SysReagentServiceImpl.java
@@ -157,6 +157,17 @@
         return sysReagentDao.getReagent(params);
     }
 
+    @Override
+    public List<SysReagent> selectReagentSafetyNum() {
+
+        return sysReagentDao.selectReagentSafetyNum();
+    }
+
+    @Override
+    public void updateSafetyNum(SysReagent sysReagent) {
+        sysReagentDao.updateSafetyNum(sysReagent.getId(), sysReagent.getSafetynum());
+    }
+
 
     @Transactional(propagation = Propagation.REQUIRED)
     public int getSysReagentTotalCount(String name, String cas, String supplierId,Integer type) {
diff --git a/src/main/java/com/nanometer/smartlab/service/SysUserService.java b/src/main/java/com/nanometer/smartlab/service/SysUserService.java
index 8915b4d..861ba03 100644
--- a/src/main/java/com/nanometer/smartlab/service/SysUserService.java
+++ b/src/main/java/com/nanometer/smartlab/service/SysUserService.java
@@ -52,4 +52,7 @@
     List<Map> getExportUserList(String arp, String name, String departmentName, String project, String company);
 
     void exportUser2Excel(List<Map> list)throws Exception;
+
+    List<String> getLibrarianEmail();
+
 }
diff --git a/src/main/java/com/nanometer/smartlab/service/SysUserServiceImpl.java b/src/main/java/com/nanometer/smartlab/service/SysUserServiceImpl.java
index 11afaf0..021fbca 100644
--- a/src/main/java/com/nanometer/smartlab/service/SysUserServiceImpl.java
+++ b/src/main/java/com/nanometer/smartlab/service/SysUserServiceImpl.java
@@ -421,4 +421,11 @@
     }
 
 
+    //获取库管员邮箱
+    @Override
+    public List<String> getLibrarianEmail() {
+        return sysUserDao.getLibrarianEmail();
+    }
+
+
 }
diff --git a/src/main/webapp/reagent_mng.xhtml b/src/main/webapp/reagent_mng.xhtml
index 5c0222d..e4c1195 100644
--- a/src/main/webapp/reagent_mng.xhtml
+++ b/src/main/webapp/reagent_mng.xhtml
@@ -39,7 +39,7 @@
             </p:panelGrid>
         </p:panel>
         <p:panel styleClass="center-body">
-            <p:panelGrid columns="7" styleClass="btn">
+            <p:panelGrid columns="8" styleClass="btn">
                 <p:commandButton value="新建" styleClass="new-btn"
                                  process="@this"
                                  actionListener="#{reagentMngController.onNewBtnClick}"
@@ -54,6 +54,11 @@
                                  actionListener="#{reagentMngController.onDeleteBtnClick}"
                                  update="@form">
                     <p:confirm header="确认" message="确认操作?"></p:confirm>
+                </p:commandButton>
+                <p:commandButton value="安全库存" styleClass="del-btn"
+                                 process="@form"
+                                 actionListener="#{reagentMngController.openUpdateSafetyNumDialog}"
+                                 update=":dialogForm-safetynum">
                 </p:commandButton>
 				<p:commandButton value="试剂导入" styleClass="import-btn" onclick="importReagent()"
                 ></p:commandButton>
@@ -134,6 +139,9 @@
                    <p:column headerText="每箱数量">
                             <h:outputText value="#{row.perBox}"></h:outputText>
                         </p:column>
+                <p:column headerText="安全库存" rendered="#{reagentMngController.type == 1}">
+                    <h:outputText value="#{row.safetynum}" ></h:outputText>
+                </p:column>
 <!--                        <p:column headerText="库存">-->
 <!--                            <h:outputText value="#{row.reserve}"></h:outputText>-->
 <!--                        </p:column>-->
@@ -465,5 +473,60 @@
             </p:panel>
         </h:form>
     </p:dialog>
+
+    <p:dialog modal="true" header="设置安全库存" appendTo="@(body)"
+              id="dialog-setSafetynum" widgetVar="dialog-setSafetynum"
+              resizable="false" width="1000">
+        <h:form id="dialogForm-safetynum">
+            <p:panelGrid styleClass="content2 grid-padding-bottom2">
+                <p:row>
+                    <p:column>
+                        <p:outputLabel value="试剂名称"/>
+                    </p:column>
+                    <p:column>
+                        <p:inputText value="#{reagentMngController.sysReagent.name}"
+                                     maxlength="100"
+                                     disabled="true" />
+                    </p:column>
+                    <p:column>
+                        <p:outputLabel value="CAS"/>
+                    </p:column>
+                    <p:column>
+                        <p:inputText value="#{reagentMngController.sysReagent.cas}"
+                                     maxlength="100"
+                                     disabled="true"/>
+                    </p:column>
+                </p:row>
+                <p:row>
+                    <p:column>
+                        <p:outputLabel value="产品编号"/>
+                    </p:column>
+                    <p:column>
+                        <p:inputText value="#{reagentMngController.sysReagent.productSn}"
+                                     maxlength="100"
+                                     disabled="true"/>
+
+                    </p:column>
+
+                    <p:column>
+                        <p:outputLabel value="安全库存"/>
+                    </p:column>
+                    <p:column>
+                        <p:inputNumber value="#{reagentMngController.sysReagent.safetynum}"
+                                       minValue="0"
+                                       decimalPlaces="0"
+                                     maxlength="100"/>
+
+                    </p:column>
+                </p:row>
+            </p:panelGrid>
+            <p:panel styleClass="btn">
+                <p:commandButton value="保存" actionListener="#{reagentMngController.updateSafetyNum}"
+                                 process="@form" update=":reagentMngForm:reagentMngDataTable">
+                    <p:confirm header="确认" message="确认操作?"/>
+                </p:commandButton>
+            </p:panel>
+        </h:form>
+    </p:dialog>
 </ui:composition>
 </html>

--
Gitblit v1.9.2