Bläddra i källkod

四医大短信业务逻辑实现

liubo 3 år sedan
förälder
incheckning
9b22ac2e03

+ 9 - 0
zd-api/zd-api-system/src/main/java/com/zd/system/api/chemical/RemoteStockService.java

@@ -8,6 +8,9 @@ import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.validation.constraints.NotNull;
 
 /**
  * 化学品库存
@@ -30,4 +33,10 @@ public interface RemoteStockService {
 
     @GetMapping(value = "/hxpUserecord/queryUplink")
     public void queryUplinkResult();
+
+    @GetMapping(value = "/sendSydSms")
+    public R sendSydSms(@RequestParam(value = "content", required = true) String content,
+                        @RequestParam(value = "purpose", required = true) Integer purpose,
+                        Long lockApplyId,
+                        @RequestParam(value = "phones", required = true) @NotNull String... phones);
 }

+ 8 - 0
zd-api/zd-api-system/src/main/java/com/zd/system/api/chemical/factory/RemoteStockFallbackFactory.java

@@ -9,6 +9,8 @@ import org.slf4j.LoggerFactory;
 import org.springframework.cloud.openfeign.FallbackFactory;
 import org.springframework.stereotype.Component;
 
+import javax.validation.constraints.NotNull;
+
 /**
  * @author Administrator
  */
@@ -45,6 +47,12 @@ public class RemoteStockFallbackFactory implements FallbackFactory<RemoteStockSe
             public void queryUplinkResult() {
                 logger.error("定时监测四医大短信上行结果异常:{}" , throwable.getMessage());
             }
+
+            @Override
+            public R sendSydSms(String content, Integer purpose, Long lockApplyId, @NotNull String... phones) {
+                logger.error("四医大短信调用失败:{}" ,throwable.getMessage());
+                return R.fail("四医大短信调用失败:" + throwable.getMessage());
+            }
         };
     }
 }

+ 9 - 0
zd-modules/zd-chemical/src/main/java/com/zd/chemical/controller/HxpAlarmRecordController.java

@@ -173,4 +173,13 @@ public class HxpAlarmRecordController extends BaseController {
         List<HxpAlarmRecordVo> list = hxpAlarmRecordService.selectHxpAlarmRecordList(hxpAlarmRecordSearch);
         return getDataTable(list);
     }
+
+
+    /**
+     * 四医大短信告警方案阶梯式通知流程
+     */
+    @GetMapping("/sendPhoneBySyd")
+    public void sendPhoneBySyd(){
+        hxpAlarmRecordService.sendPhoneBySyd();
+    }
 }

+ 23 - 0
zd-modules/zd-chemical/src/main/java/com/zd/chemical/controller/HxpStockController.java

@@ -6,9 +6,11 @@ import java.util.Arrays;
 import java.util.List;
 import java.io.IOException;
 import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.NotNull;
 
 import com.github.pagehelper.PageHelper;
 import com.zd.chemical.domain.vo.*;
+import com.zd.chemical.util.SmsSydUtil;
 import com.zd.common.core.domain.R;
 import com.zd.common.core.domain.per.PerFun;
 import com.zd.common.core.domain.per.PerPrefix;
@@ -16,6 +18,8 @@ import com.zd.common.core.utils.SecurityUtils;
 import com.zd.common.security.service.TokenService;
 import com.zd.system.api.domain.InventoryTag;
 import com.zd.system.api.laboratory.domain.RemoteLabHardware;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import com.zd.common.response.ResultData;
@@ -48,6 +52,8 @@ public class HxpStockController extends BaseController {
 
     @Autowired
     private TokenService tokenService;
+    @Autowired
+    private SmsSydUtil smsSydUtil;
 
     /**
      * 查询库存管理列表
@@ -220,4 +226,21 @@ public class HxpStockController extends BaseController {
     public void expireCheck() {
         hxpStockService.expireCheck();
     }
+
+    /**
+     * 四医大短信发送方式
+     */
+    @GetMapping(value = "/sendSydSms")
+    public R sendSydSms(@RequestParam(value = "content", required = true) String content,
+                        @RequestParam(value = "purpose", required = true) Integer purpose,
+                        Long lockApplyId,
+                        @RequestParam(value = "phones", required = true) @NotNull String... phones){
+
+        try {
+            return smsSydUtil.sendSydSms(content, purpose, lockApplyId, phones);
+        } catch (Exception e) {
+            logger.error("四医大短信调用发生异常!");
+           return R.fail("调用发生异常");
+        }
+    }
 }

+ 3 - 0
zd-modules/zd-chemical/src/main/java/com/zd/chemical/domain/vo/HxpAlarmRecordSearch.java

@@ -46,6 +46,9 @@ public class HxpAlarmRecordSearch  extends BaseEntity{
     @ApiModelProperty(value = "设备编号")
     private String terminalNum;
 
+    @ApiModelProperty(value = "设备编号")
+    private Integer hasValid;
+
     /**
      * 批量操作的id集合
      */

+ 2 - 0
zd-modules/zd-chemical/src/main/java/com/zd/chemical/mapper/HxpAlarmRecordMapper.java

@@ -70,4 +70,6 @@ public interface HxpAlarmRecordMapper
     int updateByOutStock(Long stockId);
 
     int updateByReturnUserecord(Long userecordId);
+
+    List<HxpAlarmRecord> queryListByNOValid(HxpAlarmRecord alarmRecord);
 }

+ 2 - 0
zd-modules/zd-chemical/src/main/java/com/zd/chemical/service/IHxpAlarmRecordService.java

@@ -76,4 +76,6 @@ public interface IHxpAlarmRecordService
      * @return 结果
      */
     public int handleProcessing(HxpAlarmRecord hxpAlarmRecord);
+
+    void sendPhoneBySyd();
 }

+ 5 - 5
zd-modules/zd-chemical/src/main/java/com/zd/chemical/service/impl/ActApplytaskServiceImpl.java

@@ -186,7 +186,7 @@ public class ActApplytaskServiceImpl implements IActApplytaskService
                         a.setApplyUserid(SecurityUtils.getUserId());
                         actApplytaskNodeMapper.updateActApplytaskNode(a);
                     }else{
-                        //todo 这里需要验证审批人是不是申请人,如果是,需要跳过
+                        // 这里需要验证审批人是不是申请人,如果是,需要跳过
                         if(pre.test(a)&&jumpApply.get("jumpApply")==1){
                             jumpApply.put("jumpApply",1L);
                             a.setNodeStatus(1);
@@ -197,13 +197,13 @@ public class ActApplytaskServiceImpl implements IActApplytaskService
                         }
                     }
                 });
-        //todo 调用回填步数的方法
+        // 调用回填步数的方法
         int flag = proStep(applytask,actHxpapplyInfoVo.getUserId());
         selectionChemical(actApplytaskVo);
         return flag;
     }
 
-    //todo 这里做了执行task回填步数
+    // 这里做了执行task回填步数
     private int proStep(ActApplytask actApplytask,Long userId){
         ActApplytaskNode actApplytaskNode = new ActApplytaskNode();
         actApplytaskNode.setNodeStatus(0);
@@ -280,7 +280,7 @@ public class ActApplytaskServiceImpl implements IActApplytaskService
                         actApplytaskNodeMapper.updateActApplytaskNode(a);
                     }
                 });
-        //todo 这里修改主流程的审批状态变为拒绝
+        // 这里修改主流程的审批状态变为拒绝
         applytask.setApprovalStatus(2);
         applytask.setOverTime(new Date());
         //查询审批单的创建人
@@ -325,7 +325,7 @@ public class ActApplytaskServiceImpl implements IActApplytaskService
         applytask.setNowStep(-1L);
         applytask.setNextStep(-1L);
 
-        //todo 这里修改主流程的审批状态变为撤销
+        // 这里修改主流程的审批状态变为撤销
         applytask.setApprovalStatus(3);
         applytask.setOverTime(new Date());
         int flag = actApplytaskMapper.updateActApplytask(applytask);

+ 9 - 9
zd-modules/zd-chemical/src/main/java/com/zd/chemical/service/impl/ActHxpapplyServiceImpl.java

@@ -73,14 +73,14 @@ public class ActHxpapplyServiceImpl implements IActHxpapplyService
     @Override
     public ActHxpapplyInfoVo selectActHxpapplyById(Long id,Integer tickStatus)
     {
-        //todo 利用申请的id,查询出工作流对应的配置节点
+        // 利用申请的id,查询出工作流对应的配置节点
         ActApplytask actApplytask = new ActApplytask();
         actApplytask.setTaskId(id);
         List <ActApplytask> actApplytasks = actApplytaskMapper.selectActApplytaskList(actApplytask);
         Function<List <ActApplytask>,ActApplytask> function = x->x.stream().findFirst().orElse(null);
         ActApplytask apply = function.apply(actApplytasks);
         Predicate<List <ActApplytask>> pre = p->p.size()>0;
-        //todo 查询申请单相关的化学品详细信息列表
+        // 查询申请单相关的化学品详细信息列表
         ActHxpapplyInfoVo actHxpapplyInfoVo = actHxpapplyMapper.selectActHxpapplyById(id);
         ActHxpapplyDetail actHxpapplyDetail = new ActHxpapplyDetail();
         actHxpapplyDetail.setHxpapplyId(id);
@@ -104,7 +104,7 @@ public class ActHxpapplyServiceImpl implements IActHxpapplyService
         consumer.accept(actHxpapplyDetailVos);
         actHxpapplyInfoVo.setActHxpapplyDetailList(actHxpapplyDetailVos);
 
-        //todo 查出工作流子节点
+        // 查出工作流子节点
         if(pre.test(actApplytasks)){
             actHxpapplyInfoVo.setActApplytask(apply);
             actHxpapplyInfoVo.setApprovalStatus(apply.getApprovalStatus());
@@ -160,7 +160,7 @@ public class ActHxpapplyServiceImpl implements IActHxpapplyService
                     }).collect(Collectors.toList());
             actHxpapplyInfoVo.setConfigInfoList(configInfoList);
         }else{
-            //todo 如果是草稿箱的,需要查询机柜化学品剩余量的计算值
+            // 如果是草稿箱的,需要查询机柜化学品剩余量的计算值
             List <Long> cabinetCollect = Optional.ofNullable(actHxpapplyDetailVos).orElseGet(Collections::emptyList)
                     .stream()
                     .map(ActHxpapplyDetailVo::getCabinetId)
@@ -333,7 +333,7 @@ public class ActHxpapplyServiceImpl implements IActHxpapplyService
         return 1;
     }
 
-    //todo 生成申购编号
+    // 生成申购编号
     private String generateApplyNum(){
         LocalDateTime localDateTime = LocalDateTime.now();
         return localDateTime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
@@ -412,7 +412,7 @@ public class ActHxpapplyServiceImpl implements IActHxpapplyService
         proStep(stepMap,actApplytask,createUserId);
     }
 
-    //todo 这里做了执行task回填步数
+    // 这里做了执行task回填步数
     private void proStep(Map<String,Long> stepMap,ActApplytask actApplytask,Long createUserId){
         actApplytask.setNowStep(stepMap.get("nowStep"));
         actApplytask.setNextStep(stepMap.get("nextStep"));
@@ -445,7 +445,7 @@ public class ActHxpapplyServiceImpl implements IActHxpapplyService
         actApplytaskMapper.updateActApplytask(actApplytask);
     }
 
-    //todo 这里处理一下跳过审核,只有当前审批人是申请人的时候,才做审批通过(或审)
+    // 这里处理一下跳过审核,只有当前审批人是申请人的时候,才做审批通过(或审)
     private void jumpApplyFun(Predicate<List <ActAudituser>> pre,List <ActAudituser> actAuditusers,Map<String,Long> jumpApply,ActApplytaskNode actApplytaskNode){
         if(pre.test(actAuditusers) && jumpApply.get("jumpApply")==1){
             actApplytaskNode.setNodeStatus(1);
@@ -457,7 +457,7 @@ public class ActHxpapplyServiceImpl implements IActHxpapplyService
         }
     }
 
-    //todo 这里处理一下跳过审核,只有当前审批人是申请人的时候,才做审批通过(依次审批)
+    // 这里处理一下跳过审核,只有当前审批人是申请人的时候,才做审批通过(依次审批)
     private void jumpApplyFun(Long createUserId,Long auditUserId,Map<String,Long> jumpApply,ActApplytaskNode actApplytaskNode){
         if(createUserId.longValue() == auditUserId.longValue() && jumpApply.get("jumpApply")==1){
             actApplytaskNode.setNodeStatus(1);
@@ -469,7 +469,7 @@ public class ActHxpapplyServiceImpl implements IActHxpapplyService
         }
     }
 
-    //todo 提出工作流节点保存
+    // 提出工作流节点保存
     private void insertNodeSave(ActApplytaskNode actApplytaskNode){
         actApplytaskNodeMapper.insertActApplytaskNode(actApplytaskNode);
     }

+ 40 - 0
zd-modules/zd-chemical/src/main/java/com/zd/chemical/service/impl/HxpAlarmRecordServiceImpl.java

@@ -1,16 +1,21 @@
 package com.zd.chemical.service.impl;
 
 import java.util.List;
+import java.util.Map;
 
+import cn.hutool.core.date.DateUtil;
 import com.zd.chemical.domain.vo.AioAlarmRecordVo;
 import com.zd.chemical.domain.vo.HxpAlarmRecordSearch;
 import com.zd.chemical.domain.vo.HxpAlarmRecordVo;
 import com.zd.chemical.domain.vo.HxpCabinetVo;
+import com.zd.chemical.mapper.HxpUserecordMapper;
+import com.zd.chemical.util.SmsSydUtil;
 import com.zd.common.core.domain.per.PerPrefix;
 import com.zd.common.core.exception.ServiceException;
 import com.zd.common.core.utils.DateUtils;
 import com.zd.common.core.utils.SecurityUtils;
 import com.zd.common.datascope.annotation.DataScope;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.zd.chemical.mapper.HxpAlarmRecordMapper;
@@ -23,10 +28,15 @@ import com.zd.chemical.service.IHxpAlarmRecordService;
  * @author liubo
  * @date 2022-06-16
  */
+@Slf4j
 @Service
 public class HxpAlarmRecordServiceImpl implements IHxpAlarmRecordService {
     @Autowired
     private HxpAlarmRecordMapper hxpAlarmRecordMapper;
+    @Autowired
+    private HxpUserecordMapper hxpUserecordMapper;
+    @Autowired
+    private SmsSydUtil smsSydUtil;
 
     /**
      * 查询化学品报警记录
@@ -130,4 +140,34 @@ public class HxpAlarmRecordServiceImpl implements IHxpAlarmRecordService {
         hxpAlarmRecord.setHandlingUserId(SecurityUtils.getUserId());
         return hxpAlarmRecordMapper.updateHxpAlarmRecord(hxpAlarmRecord);
     }
+
+    @Override
+    public void sendPhoneBySyd() {
+
+        String subName;
+
+        HxpAlarmRecord alarmRecord = new HxpAlarmRecord();
+        alarmRecord.setAlarmMode(3);
+        alarmRecord.setHasValid(0);
+        alarmRecord.setHandlingStatus(1);
+        List<HxpAlarmRecord> list = hxpAlarmRecordMapper.queryListByNOValid(alarmRecord);
+
+        Map<String,Object> subInfo;
+        String content;
+        for (HxpAlarmRecord hxpAlarmRecord : list) {
+
+            subInfo = hxpUserecordMapper.selectSubInfoById(hxpAlarmRecord.getSubId());
+            if(subInfo != null){
+                subName = subInfo.get("name")==null?"":String.valueOf(subInfo.get("name"));
+                content = "【实验室安全系统】" + subName + "-实验人员未领用即携带化学品离开房间,发生时间:"
+                        + DateUtil.format(DateUtil.date(), DateUtils.YYYY_MM_DD_HH_MM_SS)
+                        + ",请尽快确认。短信回复“CL”确认已处理。";
+                try {
+                    smsSydUtil.sendSydSms(content, 1, null, new String[]{hxpAlarmRecord.getLiableUserIds()});
+                } catch (Exception e) {
+                    log.error("四医大阶梯通知发送异常:" + e.getMessage());
+                }
+            }
+        }
+    }
 }

+ 40 - 6
zd-modules/zd-chemical/src/main/java/com/zd/chemical/service/impl/HxpStockServiceImpl.java

@@ -7,6 +7,7 @@ import com.zd.chemical.domain.*;
 import com.zd.chemical.domain.vo.*;
 import com.zd.chemical.mapper.*;
 import com.zd.chemical.service.*;
+import com.zd.chemical.util.SmsSydUtil;
 import com.zd.common.core.domain.per.PerPrefix;
 import com.zd.common.core.exception.ServiceException;
 import com.zd.common.core.utils.DateUtils;
@@ -59,6 +60,9 @@ public class HxpStockServiceImpl implements IHxpStockService {
         HxpStockServiceImpl.interval = interval;
     }
 
+    @Value("${phoneMode:0}")
+    private Integer phoneMode;
+
     @Autowired
     private HxpStockMapper hxpStockMapper;
     @Autowired
@@ -89,6 +93,8 @@ public class HxpStockServiceImpl implements IHxpStockService {
     private HxpCabinetlockLogMapper hxpCabinetlockLogMapper;
     @Resource
     private RemoteNettyService remoteNettyService;
+    @Autowired
+    private SmsSydUtil smsSydUtil;
     /**
      * 查询库存管理
      *
@@ -361,7 +367,7 @@ public class HxpStockServiceImpl implements IHxpStockService {
                 hxpAlarmRecordMapper.insertHxpAlarmRecord(hxpAlarmRecord);
 
                 // TODO 报警通知演示临时通知给实验室管理员  phones
-                sendPhoneAlarm(subName, hxpStock.getChemicalName(), subInfo.get("phones") + "");
+                sendPhoneAlarm(hxpStock.getSubId(), subName, hxpStock.getChemicalName(), subInfo.get("phones") + "");
 
                 // 控制响铃时长
                 if(smartTerminal.get("ringTime") != null){
@@ -429,18 +435,46 @@ public class HxpStockServiceImpl implements IHxpStockService {
         return false;
     }
 
-    private void sendPhoneAlarm(String subName, String chemicalName, String phones) {
+    private void sendPhoneAlarm(Long subId, String subName, String chemicalName, String phones) {
+
         try {
             String[] to = phones.split(",");
             if(to == null && to.length == 0){
                 logger.error("RFID触发电话报警失败:实验室【"+subName+"】管理员未配置手机号!");
                 return;
             }
-            AlarmEntrty alarmEntrty = new AlarmEntrty(Routes.NoticePush, to,
-                    "电话报警:" + subName + "的化学品" + chemicalName + "违规带离实验室,请尽快确认!");
-            AjaxResult result = remoteAlarmService.send(alarmEntrty);
 
-            logger.error(JSONUtil.toJsonStr(result));
+            for (String s : to) {
+                HxpAlarmRecord hxpAlarmRecord = new HxpAlarmRecord();
+                hxpAlarmRecord.setAlarmContent("未领用即携带化学品离开实验室【"+subName+"】," + "化学品("+chemicalName+"),请尽快确认!");
+                hxpAlarmRecord.setAlarmType(2);
+                hxpAlarmRecord.setAlarmMode(3);
+                hxpAlarmRecord.setHasValid(1);
+                hxpAlarmRecord.setAlarmTime(DateUtils.getNowDate());
+                hxpAlarmRecord.setSubId(subId);
+                hxpAlarmRecord.setHandlingStatus(1);
+                hxpAlarmRecord.setLiableUserIds(s);
+
+                hxpAlarmRecordMapper.insertHxpAlarmRecord(hxpAlarmRecord);
+            }
+
+            // 判断四医大还是其他学校短信方案
+            String content;
+            if(phoneMode == 0){
+                content = "电话报警:" + subName + "的化学品" + chemicalName + "违规带离实验室,请尽快确认!";
+                AlarmEntrty alarmEntrty = new AlarmEntrty(Routes.NoticePush, to, content);
+                AjaxResult result = remoteAlarmService.send(alarmEntrty);
+
+                logger.error(JSONUtil.toJsonStr(result));
+            }else if(phoneMode == 1){
+
+                content = "【实验室安全系统】" + subName + "-实验人员未领用即携带化学品离开房间,发生时间:"
+                        + DateUtil.format(DateUtil.date(), DateUtils.YYYY_MM_DD_HH_MM_SS)
+                        + ",请尽快确认。短信回复“CL”确认已处理。";
+                smsSydUtil.sendSydSms(content, 1, null, to);
+            }
+
+
         }catch (Exception e){
             logger.error("【"+subName+"】RFID触发报警器进行电话通知失败:" + e.getMessage());
         }

+ 5 - 1
zd-modules/zd-chemical/src/main/java/com/zd/chemical/util/SmsSydUtil.java

@@ -12,6 +12,7 @@ import com.zd.chemical.service.ISydSmsLogService;
 import com.zd.common.core.domain.R;
 import com.zd.common.core.utils.DateUtils;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
@@ -41,6 +42,7 @@ public class SmsSydUtil {
 
     private static Map<Integer, String> DOWN_MAP;
 
+    @Autowired
     private ISydSmsLogService sydSmsLogService;
 
     SmsSydUtil(){
@@ -119,9 +121,11 @@ public class SmsSydUtil {
 
         log.info("四医大短信下发参数:UUID," + pack.getBatchID() + "手机号:" + phones.toString() + "内容:" + content);
 
+        List<MessageData> msgs = new ArrayList<>();
         for (String phone : phones) {
-            pack.addMsg(MessageData.getInstance(phone, content));
+            msgs.add(MessageData.getInstance(phone, content));
         }
+        pack.setMsgs(msgs);
 
         GsmsResponse resp = DOWN_PM.post(account, pack);
         log.info("四医大短信下发返回结果:" + resp.toString());

+ 15 - 0
zd-modules/zd-chemical/src/main/resources/mapper/chemical/HxpAlarmRecordMapper.xml

@@ -147,6 +147,21 @@
             left join sys_dept d on s.dept_id = d.dept_id
         where ar.has_valid = 1 and ar.id = #{id}
     </select>
+    <select id="queryListByNOValid" resultType="com.zd.chemical.domain.HxpAlarmRecord">
+        <include refid="selectHxpAlarmRecordListVo"/>
+        <where>
+           alarm_time &lt;= now()
+            <if test="hasValid != null">
+                and has_valid = #{hasValid}
+            </if>
+            <if test="alarmMode != null">
+                and alarm_mode = #{alarmMode}
+            </if>
+            <if test="handlingStatus != null">
+                and handling_status = #{handlingStatus}
+            </if>
+        </where>
+    </select>
 
     <insert id="insertHxpAlarmRecord" parameterType="com.zd.chemical.domain.HxpAlarmRecord" useGeneratedKeys="true"
             keyProperty="id">