Kaynağa Gözat

Merge branch 'master' of http://192.168.1.43:3000/git/sass-lab-distributed-java

zhuchangxue 3 yıl önce
ebeveyn
işleme
b571e8f806
18 değiştirilmiş dosya ile 295 ekleme ve 101 silme
  1. 1 1
      zd-api/zd-api-system/src/main/java/com/zd/system/api/chemical/RemoteStockService.java
  2. 6 5
      zd-api/zd-api-system/src/main/java/com/zd/system/api/domain/SysUser.java
  3. 43 6
      zd-auth/src/main/java/com/zd/auth/controller/TokenController.java
  4. 13 0
      zd-common/zd-common-core/src/main/java/com/zd/common/core/constant/Constants.java
  5. 1 2
      zd-modules/zd-bottle-parent/zd-bottle-api/src/main/java/com/zd/bottle/feign/service/RemoteBottleService.java
  6. 11 1
      zd-modules/zd-bottle-parent/zd-bottle/src/main/java/com/zd/bottle/controller/RfidTagController.java
  7. 2 2
      zd-modules/zd-bottle-parent/zd-bottle/src/main/java/com/zd/bottle/mapper/RfidTagMapper.java
  8. 2 2
      zd-modules/zd-bottle-parent/zd-bottle/src/main/java/com/zd/bottle/service/RfidTagService.java
  9. 9 2
      zd-modules/zd-bottle-parent/zd-bottle/src/main/java/com/zd/bottle/service/impl/AlarmRecordServiceImpl.java
  10. 4 4
      zd-modules/zd-bottle-parent/zd-bottle/src/main/java/com/zd/bottle/service/impl/RfidTagServiceImpl.java
  11. 2 2
      zd-modules/zd-bottle-parent/zd-bottle/src/main/resources/mapper/RfidTagMapper.xml
  12. 5 1
      zd-modules/zd-chemical/src/main/java/com/zd/chemical/controller/HxpStockController.java
  13. 11 2
      zd-modules/zd-chemical/src/main/java/com/zd/chemical/service/impl/HxpStockServiceImpl.java
  14. 7 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabHardwareController.java
  15. 156 57
      zd-modules/zd-modules-system/src/main/java/com/zd/system/controller/SysUserController.java
  16. 1 1
      zd-modules/zd-modules-system/src/main/resources/mapper/system/SysUserMapper.xml
  17. 6 6
      zd-modules/zd-netty/src/main/java/com/zd/netty/sdk/DeJuRFIDClientImpl.java
  18. 15 7
      zd-modules/zd-netty/src/main/java/com/zd/netty/sdk/DeJuRFIDServerImpl.java

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

@@ -34,7 +34,7 @@ public interface RemoteStockService {
     @GetMapping(value = "/hxpUserecord/queryUplink")
     public void queryUplinkResult();
 
-    @GetMapping(value = "/sendSydSms")
+    @GetMapping(value = "/hxpStock/sendSydSms")
     public R sendSydSms(@RequestParam(value = "content", required = true) String content,
                         @RequestParam(value = "purpose", required = true) Integer purpose,
                         @RequestParam(value = "lockApplyId") Long lockApplyId,

+ 6 - 5
zd-api/zd-api-system/src/main/java/com/zd/system/api/domain/SysUser.java

@@ -102,6 +102,7 @@ public class SysUser extends BaseEntity {
     /**
      * 最后登录时间
      */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT)
     private Date loginDate;
 
@@ -118,27 +119,27 @@ public class SysUser extends BaseEntity {
      * 角色对象 -- 2.6 弃用
      */
     @Deprecated
-    private List<SysRole> roles;
+    private transient List<SysRole> roles;
 
     /**
      * 2.6 需求新权限数据
      */
-    private List<SysPermitInfo> permits;
+    private transient List<SysPermitInfo> permits;
 
     /**
      * 角色组
      */
-    private Long[] roleIds;
+    private transient Long[] roleIds;
 
     /**
      * 岗位组
      */
-    private Long[] postIds;
+    private transient Long[] postIds;
 
     /**
      * 用户组
      */
-    private Long[] userIds;
+    private transient Long[] userIds;
 
     /**
      * 角色ID

+ 43 - 6
zd-auth/src/main/java/com/zd/auth/controller/TokenController.java

@@ -1,13 +1,12 @@
 package com.zd.auth.controller;
 
+import cn.hutool.core.util.RandomUtil;
 import com.zd.auth.form.LoginBody;
 import com.zd.auth.form.RegisterBody;
 import com.zd.auth.service.SysLoginService;
-import com.zd.common.core.constant.CacheConstants;
-import com.zd.common.core.constant.Constants;
-import com.zd.common.core.constant.SecurityConstants;
-import com.zd.common.core.constant.UserConstants;
+import com.zd.common.core.constant.*;
 import com.zd.common.core.domain.R;
+import com.zd.common.core.exception.CaptchaException;
 import com.zd.common.core.exception.ServiceException;
 import com.zd.common.core.utils.IdUtils;
 import com.zd.common.core.utils.StringUtils;
@@ -15,23 +14,28 @@ import com.zd.common.core.web.domain.AjaxResult;
 import com.zd.common.redis.service.RedisService;
 import com.zd.common.security.service.TokenService;
 import com.zd.system.api.RemoteUserService;
+import com.zd.system.api.chemical.RemoteStockService;
 import com.zd.system.api.domain.SysUser;
 import com.zd.system.api.model.LoginUser;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 
+import static com.zd.common.core.constant.Constants.CODE_EXPIRATION;
+
 /**
  * token 控制
  *
@@ -53,14 +57,29 @@ public class TokenController {
     @Autowired
     private RedisService redisService;
 
+    @Resource
+    private RemoteStockService stockService;
+    @Resource
+    private RedisTemplate<String,String> redisTemplate;
+
     @PostMapping("login")
     public R<?> login(@RequestBody LoginBody form) {
         // 用户登录
         String authType = form.getAuthType() == null ? Constants.GRANT_TYPE_PASSWORD : form.getAuthType();
         LoginUser userInfo;
         if (Objects.equals(authType, Constants.GRANT_TYPE_MOBILE)) {
-            //TODO 验证码校验过程,用户信息查询
-            userInfo = sysLoginService.login(form.getUsername(), UserConstants.USER_LOGIN_PC, form.getPassword());
+            String key = Constants.DEFAULT_CODE_KEY +  Constants.GRANT_TYPE_MOBILE + "@" + form.getUsername();
+            String code = redisTemplate.opsForValue().get(key);
+            if (form.getPassword().equals(code)){
+                R<LoginUser> userR = remoteUserService.getUserInfo(form.getUsername(), SecurityConstants.INNER);
+                if (userR.getCode()== HttpStatus.SUCCESS &&userR.getData()!=null){
+                    userInfo=userR.getData();
+                }else {
+                    throw new ServiceException("系统异常");
+                }
+            }else {
+                throw new CaptchaException("验证码不正确");
+            }
         }else {
             userInfo = sysLoginService.login(form.getUsername(), UserConstants.USER_LOGIN_PC, form.getPassword());
         }
@@ -151,6 +170,24 @@ public class TokenController {
     }
 
     /**
+     * 发送验证码
+     */
+    @PostMapping("/send/code")
+    public R<?> send(@RequestBody LoginBody form) {
+        String username = form.getUsername();
+        R<LoginUser> userR = remoteUserService.getUserInfo(username, SecurityConstants.INNER);
+        if (userR.getCode()!=HttpStatus.SUCCESS || userR.getData()==null){
+            throw new ServiceException("登录用户:" + username + " 不存在",530);
+        }
+        String key = Constants.DEFAULT_CODE_KEY +  Constants.GRANT_TYPE_MOBILE + "@" + username;
+        String code = RandomUtil.randomNumbers(6);
+        redisTemplate.opsForValue().set(key,code,CODE_EXPIRATION,TimeUnit.MINUTES);
+        logger.info("========================>{}<=========================",code);
+        return R.ok(code);
+//        return stockService.sendSydSms(code, 2, null, form.getUsername());
+    }
+
+    /**
      * 学习一体机 用户端登录
      * 接口修改为分两步操作,1 刷卡获取人员信息和token , 2 人脸验证之后再调用一次实现真实登录
      * type : 1 和 2

+ 13 - 0
zd-common/zd-common-core/src/main/java/com/zd/common/core/constant/Constants.java

@@ -167,6 +167,19 @@ public class Constants {
      */
     public static final String GRANT_TYPE_MOBILE = "mobile";
 
+    /**
+     * 手机号类型
+     */
+    public static final String UPDATE_TYPE_MOBILE = "update";
+
+    /**
+     * redis验证码前缀
+     */
 
+    public static final String DEFAULT_CODE_KEY = "DEFAULT_CODE_KEY_";
 
+    /**
+     * 手机登录验证码有效期(分钟)
+     */
+    public static final long CODE_EXPIRATION = 15;
 }

+ 1 - 2
zd-modules/zd-bottle-parent/zd-bottle-api/src/main/java/com/zd/bottle/feign/service/RemoteBottleService.java

@@ -3,7 +3,6 @@ package com.zd.bottle.feign.service;
 import com.zd.bottle.feign.RemoteBottleFallbackFactory;
 import com.zd.common.core.constant.ServiceNameConstants;
 import com.zd.common.core.domain.R;
-import com.zd.system.api.airbottle.factory.RemoteAirBottleFallbackFactory;
 import com.zd.system.api.domain.InventoryTag;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -20,7 +19,7 @@ public interface RemoteBottleService {
      * @param tag 标签信息
      * @return R<Boolean>
      */
-    @PostMapping("alarm/record/remote/add")
+    @PostMapping("alarmRecord/remote/add")
     R<Boolean> remoteAdd(@RequestBody InventoryTag tag);
 
 }

+ 11 - 1
zd-modules/zd-bottle-parent/zd-bottle/src/main/java/com/zd/bottle/controller/RfidTagController.java

@@ -6,6 +6,7 @@ import com.zd.bottle.domain.RfidTag;
 import com.zd.bottle.service.RfidTagService;
 import com.zd.common.core.domain.per.PerFun;
 import com.zd.common.core.domain.per.PerPrefix;
+import com.zd.common.core.exception.ServiceException;
 import com.zd.common.core.utils.poi.ExcelUtil;
 import com.zd.common.core.web.controller.BaseController;
 import com.zd.common.core.web.page.TableDataInfo;
@@ -22,6 +23,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -128,7 +130,15 @@ public class RfidTagController extends BaseController<RfidTag> {
     @Log(title = "RFID标签管理", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public ResultData<Boolean> remove(@PathVariable Long[] ids) {
-        return ResultData.result(service.removeBatchByIds(Arrays.asList(ids)));
+        List<Long> idList = Arrays.asList(ids);
+        LambdaQueryWrapper<RfidTag> wrapper = Wrappers.lambdaQuery(RfidTag.class);
+        wrapper.in(RfidTag::getId,idList).eq(RfidTag::getIsBind,1);
+        List<RfidTag> list = service.list(wrapper);
+        if (!list.isEmpty()){
+            List<String> authCodeList = list.stream().map(RfidTag::getAuthCode).collect(Collectors.toList());
+            throw new ServiceException(String.join(",", authCodeList)+"已被绑定");
+        }
+        return ResultData.result(service.removeBatchByIds(idList));
     }
 
 }

+ 2 - 2
zd-modules/zd-bottle-parent/zd-bottle/src/main/java/com/zd/bottle/mapper/RfidTagMapper.java

@@ -15,10 +15,10 @@ public interface RfidTagMapper extends BaseMapper<RfidTag> {
 
     /***
      * 根据标签码查询
-     * @param tagCode
+     * @param authCode
      * @return
      */
-    RfidTag getRfidByTagCode(String tagCode);
+    RfidTag getRfidByTagCode(String authCode);
 
     /***
      * 修改标签

+ 2 - 2
zd-modules/zd-bottle-parent/zd-bottle/src/main/java/com/zd/bottle/service/RfidTagService.java

@@ -22,10 +22,10 @@ public interface RfidTagService extends IService<RfidTag> {
 
     /***
      * 根据标签码查询
-     * @param tagCode
+     * @param authCode
      * @return
      */
-    RfidTag getRfidByTagCode(String tagCode);
+    RfidTag getRfidByTagCode(String authCode);
 
     /***
      * 修改标签

+ 9 - 2
zd-modules/zd-bottle-parent/zd-bottle/src/main/java/com/zd/bottle/service/impl/AlarmRecordServiceImpl.java

@@ -114,14 +114,14 @@ public class AlarmRecordServiceImpl extends ServiceImpl<AlarmRecordMapper, Alarm
         String electronicTag = tag.getEpc();
         RemoteLabHardware hardware = tag.getRemoteLabHardware();
         LambdaQueryWrapper<RfidTag> queryWrapper = Wrappers.lambdaQuery(RfidTag.class);
-        queryWrapper.eq(RfidTag::getAuthCode, electronicTag);
+        queryWrapper.eq(RfidTag::getTagCode, electronicTag);
         RfidTag rfidTag = tagService.getOne(queryWrapper);
         if (rfidTag == null) {
             log.info(MSG_MATCH, electronicTag, "标签未录入");
             return false;
         }
         LambdaQueryWrapper<BottleStorage> wrapper = Wrappers.lambdaQuery(BottleStorage.class);
-        wrapper.eq(BottleStorage::getElectronicTag, rfidTag.getId());
+        wrapper.eq(BottleStorage::getElectronicTag, rfidTag.getAuthCode());
         BottleStorage bottleStorage = storageService.getOne(wrapper);
         if (bottleStorage != null) {
             String airName = bottleStorage.getAirName();
@@ -131,6 +131,13 @@ public class AlarmRecordServiceImpl extends ServiceImpl<AlarmRecordMapper, Alarm
             List<UsegasApply> applies = applyService.list(lambdaQuery);
             if (applies.isEmpty()){
                 Long id = bottleStorage.getId();
+                //触发RFID警报
+                if (hardware!=null){
+                    R<Boolean> alarm = remoteNettyService.alarm(hardware);//RFID设备报警
+                    log.info(MSG_MATCH,alarm.getCode(),alarm.getMsg());
+                }else {
+                    log.info("==================> rfid 参数有误!"+ tag);
+                }
                 String key = FRID_CODE + electronicTag + id;
                 String frid = redisService.getCacheObject(key);
                 if (frid != null) {

+ 4 - 4
zd-modules/zd-bottle-parent/zd-bottle/src/main/java/com/zd/bottle/service/impl/RfidTagServiceImpl.java

@@ -72,13 +72,13 @@ public class RfidTagServiceImpl extends ServiceImpl<RfidTagMapper, RfidTag> impl
     }
 
     /***
-     * 根据标签码查询
-     * @param tagCode
+     * 根据识别码查询
+     * @param authCode
      * @return
      */
     @Override
-    public RfidTag getRfidByTagCode(String tagCode) {
-        return rfidTagMapper.getRfidByTagCode(tagCode);
+    public RfidTag getRfidByTagCode(String authCode) {
+        return rfidTagMapper.getRfidByTagCode(authCode);
     }
 
     /***

+ 2 - 2
zd-modules/zd-bottle-parent/zd-bottle/src/main/resources/mapper/RfidTagMapper.xml

@@ -21,10 +21,10 @@
         tag_code, is_bind
     </sql>
 
-    <!-- 根据标签码查询-->
+    <!-- 根据识别码查询-->
     <select id="getRfidByTagCode" parameterType="java.lang.String"
             resultType="com.zd.bottle.domain.RfidTag">
-         select * from ab_rfid_tag where tag_code=#{tagCode}
+         select * from ab_rfid_tag where auth_code=#{authCode}
     </select>
 
 

+ 5 - 1
zd-modules/zd-chemical/src/main/java/com/zd/chemical/controller/HxpStockController.java

@@ -224,7 +224,11 @@ public class HxpStockController extends BaseController {
     }
 
     /**
-     * 四医大短信发送方式
+     * 四医大平台发送短信
+     * @param content 发送内容
+     * @param purpose 短信用途 1 化学品告警,2 登录,3 开锁,4 气瓶告警,5 预案告警
+     * @param phones  手机号
+     * @return 发送结果
      */
     @GetMapping(value = "/sendSydSms")
     public R sendSydSms(@RequestParam(value = "content", required = true) String content,

+ 11 - 2
zd-modules/zd-chemical/src/main/java/com/zd/chemical/service/impl/HxpStockServiceImpl.java

@@ -62,8 +62,12 @@ public class HxpStockServiceImpl implements IHxpStockService {
         HxpStockServiceImpl.interval = interval;
     }
 
+    public static Integer phoneMode = 0;
+
     @Value("${phoneMode:0}")
-    public static Integer phoneMode;
+    private void setPhoneMode(Integer phoneMode){
+        HxpStockServiceImpl.phoneMode = phoneMode;
+    }
 
     @Autowired
     private HxpStockMapper hxpStockMapper;
@@ -495,11 +499,16 @@ public class HxpStockServiceImpl implements IHxpStockService {
                 content = "【实验室安全系统】" + subName + "-实验人员未领用即携带化学品离开房间,发生时间:"
                         + DateUtil.format(DateUtil.date(), DateUtils.YYYY_MM_DD_HH_MM_SS)
                         + ",请尽快确认。短信回复“CL”确认已处理。";
-                smsSydUtil.sendSydSms(content, 1, null, to);
+                try {
+                    smsSydUtil.sendSydSms(content, 1, null, to);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
             }
 
 
         }catch (Exception e){
+            e.printStackTrace();
             logger.error("【"+subName+"】RFID触发报警器进行电话通知失败:" + e.getMessage());
         }
     }

+ 7 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabHardwareController.java

@@ -26,6 +26,8 @@ import com.zd.laboratory.domain.vo.LabSensorVO;
 import com.zd.laboratory.service.ILabHardwareService;
 import com.zd.laboratory.service.ILabSensorService;
 import com.zd.laboratory.service.ILabSubjectService;
+import com.zd.laboratory.service.impl.LabSubjectManagerService;
+import com.zd.laboratory.socket.command.Symbol;
 import com.zd.system.api.laboratory.domain.FunctionStatus;
 import com.zd.system.api.laboratory.domain.RemoteLabHardware;
 import com.zd.system.api.laboratory.domain.vo.HardwareCVO;
@@ -62,6 +64,9 @@ public class LabHardwareController extends BaseController {
     private ILabSubjectService labSubjectService;
 
     @Autowired
+    LabSubjectManagerService subjectManagerService;
+
+    @Autowired
     private TokenService tokenService;
 
     @Autowired
@@ -386,6 +391,7 @@ public class LabHardwareController extends BaseController {
         remoteLabHardware.setType(labHardwareVO.getType().getHardwareTypeCode());
         HardwareOperate operate = labHardwareVO.getOperate();
         if (operate==null || operate.getCode()==4){
+            subjectManagerService.control(id, Symbol.command.open);
             R<Boolean> result = nettyService.startMonitorChannels(remoteLabHardware);
             if (result.getCode()== HttpStatus.SUCCESS){
                 operate=HardwareOperate.OPEN;
@@ -393,6 +399,7 @@ public class LabHardwareController extends BaseController {
                 return ResultData.fail(result.getMsg());
             }
         }else {
+            subjectManagerService.control(id, Symbol.command.close);
             R<Boolean> result = nettyService.disconnect(remoteLabHardware);
             if (result.getCode()== HttpStatus.SUCCESS){
                 operate=HardwareOperate.CLOSE;

+ 156 - 57
zd-modules/zd-modules-system/src/main/java/com/zd/system/controller/SysUserController.java

@@ -2,13 +2,19 @@ package com.zd.system.controller;
 
 import java.io.IOException;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 
+import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
 import com.zd.common.core.constant.Constants;
+import com.zd.common.core.constant.HttpStatus;
+import com.zd.common.core.constant.SecurityConstants;
 import com.zd.common.core.domain.per.PerFun;
 import com.zd.common.core.domain.per.PerPrefix;
+import com.zd.common.core.exception.ServiceException;
 import com.zd.common.core.utils.file.ImageUtils;
 import com.zd.common.security.utils.DictUtils;
 import com.zd.system.api.RemoteDeptService;
@@ -19,11 +25,10 @@ import com.zd.system.api.model.SimpleUserVO;
 import com.zd.system.domain.SysLogoConfig;
 import com.zd.system.domain.SysPost;
 import com.zd.system.service.*;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.*;
 import org.apache.commons.lang3.ArrayUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -41,6 +46,8 @@ import com.zd.common.security.annotation.InnerAuth;
 import com.zd.common.security.annotation.PreAuthorize;
 import com.zd.system.api.model.LoginUser;
 
+import static com.zd.common.core.constant.Constants.CODE_EXPIRATION;
+
 /**
  * 用户信息
  *
@@ -76,11 +83,14 @@ public class SysUserController extends BaseController {
     @Autowired
     private ISysDeptService deptService;
 
+    @Resource
+    private RedisTemplate<String, String> redisTemplate;
+
 
     /**
      * 获取用户列表 "system:user:list"
      */
-    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER+ PerFun.LIST)
+    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER + PerFun.LIST)
     @ApiOperation("查询用户列表")
     @GetMapping("/list")
     public TableDataInfo list(SysUser user) {
@@ -108,8 +118,8 @@ public class SysUserController extends BaseController {
     @RequestMapping("/getUserByPhone/{phone}")
     public R<SysUser> getUserByPhone(@PathVariable("phone") String phone) {
         SysUser sysUser = null;
-        if(StringUtils.isNotEmpty(phone)){
-            Long userId= userService.selectUserIdByPhone(phone).getUserId();
+        if (StringUtils.isNotEmpty(phone)) {
+            Long userId = userService.selectUserIdByPhone(phone).getUserId();
             sysUser = userService.selectUserById(userId);
         }
         return R.ok(sysUser);
@@ -121,7 +131,7 @@ public class SysUserController extends BaseController {
 //    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER+ PerFun.LIST)
     @GetMapping("/selectlist")
     public List<SelectUserVO> selectlist(String nickName) {
-        if(StrUtil.isBlank(nickName)) return Collections.EMPTY_LIST;
+        if (StrUtil.isBlank(nickName)) return Collections.EMPTY_LIST;
         SysUser user = new SysUser();
         user.setNickName(nickName);
         List<SysUser> list = userService.selectUserList(user);
@@ -151,7 +161,7 @@ public class SysUserController extends BaseController {
 //    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER+ PerFun.LIST)
     @GetMapping("/selectTeacherList")
     public List<SelectUserVO> selectTeacherList(String nickName) {
-        if(StrUtil.isBlank(nickName)) return Collections.EMPTY_LIST;
+        if (StrUtil.isBlank(nickName)) return Collections.EMPTY_LIST;
         SysUser user = new SysUser();
         user.setNickName(nickName);
         user.setUserType("11");
@@ -178,7 +188,7 @@ public class SysUserController extends BaseController {
 
     //"system:user:export"
     @Log(title = "用户管理", businessType = BusinessType.EXPORT)
-    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER+ PerFun.EXPORT)
+    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER + PerFun.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response, SysUser user) throws IOException {
         List<SysUser> list = userService.selectUserList(user);
@@ -188,7 +198,7 @@ public class SysUserController extends BaseController {
 
     //"system:user:import"
     @Log(title = "用户管理", businessType = BusinessType.IMPORT)
-    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER+ PerFun.IMPORT)
+    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER + PerFun.IMPORT)
     @PostMapping("/importData")
     public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception {
         ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
@@ -206,30 +216,31 @@ public class SysUserController extends BaseController {
 
     /**
      * 获取当前用户信息
+     *
      * @param loginType 区分小程序端登录/PC 端登录  1 PC ,2 小程序
      */
     @InnerAuth
     @GetMapping(value = {"/info/{username}", "/info/{username}/{loginType}"})
     public R<LoginUser> info(@PathVariable("username") String username,
-                         @PathVariable(value = "loginType", required = false) Integer loginType) {
+                             @PathVariable(value = "loginType", required = false) Integer loginType) {
         SysUser sysUser = userService.selectUserByUserName(username);
         if (StringUtils.isNull(sysUser)) {
-            return R.fail(503,"用户名或密码错误");
+            return R.fail(503, "用户名或密码错误");
         }
 
         LoginUser sysUserVo = new LoginUser();
-        if(loginType!=null && UserConstants.USER_LOGIN_HXP == loginType){
+        if (loginType != null && UserConstants.USER_LOGIN_HXP == loginType) {
             List<SysLogoConfig> list = sysLogoConfigService.selectSysLogoConfigList(new SysLogoConfig());
-            if(list.size() > 0 && list.get(0) != null){
-                if(sysUser.getUserType().equals(list.get(0).getUserType()) && "-1".equals(list.get(0).getUserType())){
+            if (list.size() > 0 && list.get(0) != null) {
+                if (sysUser.getUserType().equals(list.get(0).getUserType()) && "-1".equals(list.get(0).getUserType())) {
                     return R.fail("登录失败,没有使用权限!");
                 }
                 // TODO 校验是否有柜锁权限
                 Optional.ofNullable(list.get(0).getSmartLock()).ifPresent(a -> {
-                    sysUserVo.setCabinetLock(a != null && a == 1 ? true:false);
+                    sysUserVo.setCabinetLock(a != null && a == 1 ? true : false);
                 });
                 Optional.ofNullable(list.get(0).getAirBottle()).ifPresent(a -> {
-                    sysUserVo.setAirBottle(a != null && a == 1 ? true:false);
+                    sysUserVo.setAirBottle(a != null && a == 1 ? true : false);
                 });
 
             }
@@ -238,15 +249,15 @@ public class SysUserController extends BaseController {
         sysUserVo.setSysUser(sysUser);
 
 //        if(loginType != null && loginType == UserConstants.USER_LOGIN_PC){
-            // 权限集合
-            Set<String> permissions = permissionService.getMenuPermission(sysUser);
-            sysUserVo.setPermissions(permissions);
+        // 权限集合
+        Set<String> permissions = permissionService.getMenuPermission(sysUser);
+        sysUserVo.setPermissions(permissions);
 
-            sysUser.setPermits(sysPermitMenuService.selectPerMitByUserId(sysUser));
+        sysUser.setPermits(sysPermitMenuService.selectPerMitByUserId(sysUser));
 
-            // 角色集合
-            //Set<String> roles = permissionService.getRolePermission(sysUser.getUserId());
-            //sysUserVo.setRoles(roles);
+        // 角色集合
+        //Set<String> roles = permissionService.getRolePermission(sysUser.getUserId());
+        //sysUserVo.setRoles(roles);
 //        }else {
 //            sysUser.setPermits(ListUtil.empty());
 //        }
@@ -269,9 +280,8 @@ public class SysUserController extends BaseController {
      * @return 结果
      */
     @GetMapping("/phone/{ids}")
-    public R<List<String>> getPhoneByUserIDS(@PathVariable("ids") Long... ids)
-    {
-       return R.ok(userService.queryPhoneByIds(ids));
+    public R<List<String>> getPhoneByUserIDS(@PathVariable("ids") Long... ids) {
+        return R.ok(userService.queryPhoneByIds(ids));
     }
 
     /**
@@ -281,26 +291,21 @@ public class SysUserController extends BaseController {
     @GetMapping("/my/info/Simple")
     public R<SimpleUserVO> myInfoSimple() {
         SysUser sysUser = userService.selectUserById(SecurityUtils.getUserId());
-        if(sysUser!=null)
-        {
+        if (sysUser != null) {
             SimpleUserVO simpleUserVO = new SimpleUserVO();
             simpleUserVO.setUserName(sysUser.getNickName());
             simpleUserVO.setDeptName(Optional.ofNullable(sysUser.getDept())
-                    .map(a->a.getDeptName())
+                    .map(a -> a.getDeptName())
                     .orElse(StrUtil.EMPTY));
             simpleUserVO.setAvatar(sysUser.getAvatar());
             //判断职称
             //如果用户类型为00
-            if("00".equals(sysUser.getUserType()))
-            {
+            if ("00".equals(sysUser.getUserType())) {
                 simpleUserVO.setProfessional("管理员");
             }
-            if(UserConstants.USER_TYPE_STUDENT.equals(sysUser.getUserType()))
-            {
+            if (UserConstants.USER_TYPE_STUDENT.equals(sysUser.getUserType())) {
                 simpleUserVO.setProfessional("学生");
-            }
-            else
-            {
+            } else {
                 String professional = Optional.ofNullable(sysUser.getPosition())
                         .map(a -> DictUtils.getDictCacheLable("professional", a))
                         .orElse(StrUtil.EMPTY);
@@ -324,6 +329,7 @@ public class SysUserController extends BaseController {
         SysUser sysUser = userService.selectUserByUserName(username);
         return R.ok(sysUser);
     }
+
     /**
      * 获取当前用户信息
      */
@@ -333,6 +339,7 @@ public class SysUserController extends BaseController {
         SysUser sysUser = userService.selectUserByCardNum(cardnum);
         return R.ok(sysUser);
     }
+
     /**
      * 注册用户信息
      */
@@ -369,7 +376,7 @@ public class SysUserController extends BaseController {
     /**
      * 根据用户编号获取详细信息 "system:user:query"
      */
-    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER+ PerFun.QUERY)
+    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER + PerFun.QUERY)
     @GetMapping(value = {"/", "/{userId}"})
     public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId) {
         AjaxResult ajax = AjaxResult.success();
@@ -387,7 +394,7 @@ public class SysUserController extends BaseController {
     /**
      * 新增用户 "system:user:add"
      */
-    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER+ PerFun.ADD)
+    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER + PerFun.ADD)
     @Log(title = "用户管理", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@Validated @RequestBody SysUser user) {
@@ -408,7 +415,7 @@ public class SysUserController extends BaseController {
     /**
      * 修改用户 "system:user:edit"
      */
-    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER+ PerFun.EDIT)
+    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER + PerFun.EDIT)
     @Log(title = "用户管理", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@Validated @RequestBody SysUser user) {
@@ -430,7 +437,7 @@ public class SysUserController extends BaseController {
      */
     @Log(title = "用户自己修改手机号", businessType = BusinessType.UPDATE)
     @PutMapping("/change/phone")
-    public AjaxResult changePhone(SysUser user) {
+    public AjaxResult changePhone(SysUser user, String code) {
         if (StringUtils.isNotEmpty(user.getPhonenumber())
                 && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) {
             return AjaxResult.error("修改用户'" + SecurityUtils.getUsername() + "'失败,手机号码已存在");
@@ -456,7 +463,7 @@ public class SysUserController extends BaseController {
     /**
      * 重置密码 "system:user:edit"
      */
-    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER+ PerFun.EDIT)
+    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER + PerFun.EDIT)
     @Log(title = "用户管理", businessType = BusinessType.UPDATE)
     @PutMapping("/resetPwd")
     public AjaxResult resetPwd(@RequestBody SysUser user) {
@@ -469,7 +476,7 @@ public class SysUserController extends BaseController {
     /**
      * 状态修改 "system:user:edit"
      */
-    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER+ PerFun.EDIT)
+    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER + PerFun.EDIT)
     @Log(title = "用户管理", businessType = BusinessType.UPDATE)
     @PutMapping("/changeStatus")
     public AjaxResult changeStatus(@RequestBody SysUser user) {
@@ -481,7 +488,7 @@ public class SysUserController extends BaseController {
     /**
      * 根据用户编号获取授权角色 "system:user:query"
      */
-    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER+ PerFun.QUERY)
+    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER + PerFun.QUERY)
     @GetMapping("/authRole/{userId}")
     public AjaxResult authRole(@PathVariable("userId") Long userId) {
         AjaxResult ajax = AjaxResult.success();
@@ -495,7 +502,7 @@ public class SysUserController extends BaseController {
     /**
      * 用户授权角色 "system:user:edit"
      */
-    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER+ PerFun.EDIT)
+    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER + PerFun.EDIT)
     @Log(title = "用户管理", businessType = BusinessType.GRANT)
     @PutMapping("/authRole")
     public AjaxResult insertAuthRole(Long userId, Long[] roleIds) {
@@ -539,14 +546,15 @@ public class SysUserController extends BaseController {
 
     /**
      * 根据用户名查询
+     *
      * @param nickName
      * @return
      */
     @GetMapping("/selectUserListByName")
-    public List<SysUser> selectUserListByName(String nickName,String userType) {
-        if(StrUtil.isBlank(nickName)) return Collections.EMPTY_LIST;
+    public List<SysUser> selectUserListByName(String nickName, String userType) {
+        if (StrUtil.isBlank(nickName)) return Collections.EMPTY_LIST;
         SysUser user = new SysUser();
-        user.setUserType(StrUtil.isBlank(userType)?"11":userType);//用户身份 11教职工 22学生
+        user.setUserType(StrUtil.isBlank(userType) ? "11" : userType);//用户身份 11教职工 22学生
         user.setNickName(nickName);
         startPage();
         List<SysUser> list = userService.selectUserListByName(user);
@@ -556,12 +564,13 @@ public class SysUserController extends BaseController {
 
     /**
      * 根据用户名查询不在白名单的用户
+     *
      * @param nickName
      * @return
      */
     @GetMapping("/selectUserListByNotWhite")
     public List<SysUser> selectUserListByNotWhite(String nickName) {
-        if(StrUtil.isBlank(nickName)) return Collections.EMPTY_LIST;
+        if (StrUtil.isBlank(nickName)) return Collections.EMPTY_LIST;
         SysUser user = new SysUser();
         //当前登录用户所属院校部门集合
         List<Long> deptIds = userService.getLogingUserDeptids();
@@ -574,6 +583,7 @@ public class SysUserController extends BaseController {
 
     /**
      * 获取职位下的人员
+     *
      * @param user
      * @return
      */
@@ -587,6 +597,7 @@ public class SysUserController extends BaseController {
 
     /**
      * 获取没有关联职位的人员
+     *
      * @param user
      * @return
      */
@@ -622,11 +633,12 @@ public class SysUserController extends BaseController {
 
     /**
      * 电子签名抠图生成图片
+     *
      * @return base64 图片
      */
     @PostMapping("/genSign")
     @ApiOperation("电子签名抠图生成图片")
-    public R<String> getPsPictureSign(@RequestParam("file") MultipartFile file){
+    public R<String> getPsPictureSign(@RequestParam("file") MultipartFile file) {
         try {
             return R.ok(ImageUtils.transparent(file.getInputStream(), 152));
         } catch (Exception e) {
@@ -637,7 +649,7 @@ public class SysUserController extends BaseController {
 
     @PostMapping("/updateSignature")
     @ApiOperation("修改用户电子签名")
-    public R updateSignature(@ApiParam("签名图片") @RequestParam("file") MultipartFile file){
+    public R updateSignature(@ApiParam("签名图片") @RequestParam("file") MultipartFile file) {
 
         //保存
         R<SysFile> fileResult = remoteFileService.upload(file);
@@ -656,18 +668,15 @@ public class SysUserController extends BaseController {
      * 查询用户是否已经上传签名
      */
     @PostMapping("/querySignature")
-    public R querySignature(){
-
+    public R querySignature() {
         SysUser user = userService.selectUserById(SecurityUtils.getUserId());
         Map<String, Object> map = new HashMap<>();
         map.put("isUpload", StringUtils.isNotBlank(user.getSignature()) ? true : false);
         map.put("signature", user.getSignature());
-
         return R.ok(map);
     }
 
 
-
     /**
      * 获取安全负责人用户列表
      */
@@ -695,12 +704,102 @@ public class SysUserController extends BaseController {
      */
     @ApiOperation("获取当前登录用户所属学校的deptid")
     @GetMapping("/getLoginUserSchoolDeptid")
-    public Long getLoginUserSchoolDeptid(){
+    public Long getLoginUserSchoolDeptid() {
         //获取当前登录用户信息
         Long userId = SecurityUtils.getUserId();
         SysUser sysUser = userService.selectUserById(userId);
         SysDept sysDept = deptService.selectDeptById(sysUser.getDept().getDeptId());
-        Long deptId ="0".equals(sysDept.getAncestors())==true?sysDept.getDeptId():Long.valueOf(sysDept.getAncestors().split(",")[1]);
+        Long deptId = "0".equals(sysDept.getAncestors()) == true ? sysDept.getDeptId() : Long.valueOf(sysDept.getAncestors().split(",")[1]);
         return deptId;
     }
+
+    /**
+     * 发送验证码
+     * @param phone 手机号码
+     * @return 验证码
+     */
+    @ApiOperation("发送验证码")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "phone",required = true,value = "手机号")
+    })
+    @PostMapping("/send/code")
+    public R<?> send(@RequestParam String phone) {
+        String key = Constants.DEFAULT_CODE_KEY + Constants.UPDATE_TYPE_MOBILE + "@" + phone;
+        String code = RandomUtil.randomNumbers(6);
+        redisTemplate.opsForValue().set(key, code, CODE_EXPIRATION, TimeUnit.MINUTES);
+        logger.info("========================>{}<=========================", code);
+        return R.ok(code);
+//        return stockService.sendSydSms(code, 2, null, form.getUsername());
+    }
+
+    /**
+     * 验证码校验
+     * @param phone 手机号
+     * @param code 验证码
+     * @return 校对结果
+     */
+    @ApiOperation("验证码校验")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "phone",required = true,value = "手机号"),
+            @ApiImplicitParam(name = "code",required = true,value = "验证码")
+    })
+    @GetMapping("/check/code")
+    public R<?> checkCode(@RequestParam("phone") String phone, @RequestParam("code") String code) {
+        return R.ok(check(phone, code));
+    }
+
+    /**
+     * 用户修改手机号
+     * @param oldPhone 原手机号
+     * @param newPhone 新手机号
+     * @param code 验证码
+     * @return  AjaxResult
+     */
+    @ApiOperation("修改手机号")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "oldPhone",required = true,value = "原手机号"),
+            @ApiImplicitParam(name = "newPhone",required = true,value = "新手机号"),
+            @ApiImplicitParam(name = "code",required = true,value = "验证码")
+    })
+    @Log(title = "用户修改手机号", businessType = BusinessType.UPDATE)
+    @PutMapping("/update/phone")
+    public AjaxResult updatePhone(@RequestParam("oldPhone") String oldPhone,@RequestParam("newPhone") String newPhone,@RequestParam("code") String code) {
+        if (StringUtils.isEmpty(oldPhone) || StringUtils.isEmpty(newPhone)){
+            throw new ServiceException("原密码或新密码不能为空");
+        }
+
+        SysUser user = userService.selectUserIdByPhone(oldPhone);
+        if(user==null){
+            throw new ServiceException("用户查询失败");
+        }
+        user.setPhonenumber(newPhone);
+        if (StringUtils.isNotEmpty(user.getPhonenumber())
+                && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) {
+            return AjaxResult.error("修改用户'" + SecurityUtils.getUsername() + "'失败,手机号码已存在");
+        }
+        Boolean check = check(newPhone, code);
+        if (Boolean.TRUE.equals(check)){
+            user.setUpdateBy(SecurityUtils.getUsername());
+            user.setUserId(SecurityUtils.getUserId());
+            return toAjax(userService.updateUser(user));
+        }
+        throw new ServiceException("验证码不正确,请重新输入");
+    }
+
+    private Boolean check(String phone, String code) {
+        if (StringUtils.isEmpty(phone)) {
+            throw new ServiceException("请输入手机号");
+        }
+        if (StringUtils.isEmpty(code)) {
+            throw new ServiceException("请输入验证码");
+        }
+        String key = Constants.DEFAULT_CODE_KEY + Constants.UPDATE_TYPE_MOBILE + "@" + phone;
+
+        String temp = redisTemplate.opsForValue().get(key);
+        if (temp == null) {
+            throw new ServiceException("验证码已过期");
+        }
+        logger.info("========================>{}:{}<=========================", code, temp);
+        return temp.equals(code);
+    }
 }

+ 1 - 1
zd-modules/zd-modules-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -289,7 +289,7 @@
 
     <select id="selectUserByUserName" parameterType="String" resultMap="SysUserResult">
         <include refid="selectUserNewVo"/>
-        where u.user_name = #{userName} and u.del_flag = 0
+        where (u.user_name = #{userName} or u.phonenumber=#{userName}) and u.del_flag = 0
     </select>
 
     <select id="selectUserCenterByUserName" parameterType="String" resultMap="SysUserResult">

+ 6 - 6
zd-modules/zd-netty/src/main/java/com/zd/netty/sdk/DeJuRFIDClientImpl.java

@@ -106,6 +106,12 @@ public class DeJuRFIDClientImpl implements IService {
     }
 
     private void reSet(RemoteLabHardware hardware, GClient client) {
+        MsgBaseSetBaseband msgBaseSetBaseband = DeJuRFIDServerImpl.setSession(hardware, client);
+        if (0 != msgBaseSetBaseband.getRtCode()) {
+            log.error("Session configuration error.");
+            reConnect(hardware, client);
+            return;
+        }
         MsgBaseSetPower msgBaseSetPower = DeJuRFIDServerImpl.setPower(hardware, client);
         if (0 != msgBaseSetPower.getRtCode()) {
             log.error("Power configuration error.");
@@ -116,12 +122,6 @@ public class DeJuRFIDClientImpl implements IService {
         if (0 != msgBaseInventoryEpc.getRtCode()) {
             log.error("Inventory epc error.");
             reConnect(hardware, client);
-            return;
-        }
-        MsgBaseSetBaseband msgBaseSetBaseband = DeJuRFIDServerImpl.setSession(hardware, client);
-        if (0 != msgBaseSetBaseband.getRtCode()) {
-            log.error("Session configuration error.");
-            reConnect(hardware, client);
         }
     }
 

+ 15 - 7
zd-modules/zd-netty/src/main/java/com/zd/netty/sdk/DeJuRFIDServerImpl.java

@@ -63,8 +63,20 @@ public class DeJuRFIDServerImpl implements IService {
             client = new GClient();
             clientMap.put(ipAddress, client);
         }
+        String[] ip = ipAddress.split(":");
+        int port=8160;
+        if (ip.length==1){
+            ipAddress+=":"+port;
+        }
         if (client.openTcp(ipAddress, TIME_OUT)) {
             stopMsg(client);
+            MsgBaseSetBaseband msgBaseSetBaseband = setSession(hardware, client);
+            if (0 != msgBaseSetBaseband.getRtCode()) {
+                log.info("Session epc error.");
+                close(hardware);
+                open(hardware);
+                return;
+            }
             // 功率配置, 将4个天线功率都设置为30dBm.
             MsgBaseSetPower msgBaseSetPower = setPower(hardware, client);
             if (0 != msgBaseSetPower.getRtCode()) {
@@ -84,14 +96,10 @@ public class DeJuRFIDServerImpl implements IService {
 
             // 订阅标签上报事件
             subscribeHandler(client, hardware);
-            MsgBaseSetBaseband msgBaseSetBaseband = setSession(hardware, client);
-            if (0 != msgBaseSetBaseband.getRtCode()) {
-                log.info("Session epc error.");
-                close(hardware);
-                open(hardware);
-                return;
+            String serialNumber = client.getSerialNumber();
+            if (StringUtils.hasLength(serialNumber)){
+                redisTemplate.opsForValue().set(serialNumber, hardware);
             }
-            redisTemplate.opsForValue().set(client.getSerialNumber(), hardware);
         } else {
             throw new ServiceException("Connect failure.");
         }