Explorar el Código

fix 新增小程序扫码登录PC

Administrator hace 3 años
padre
commit
0a156460bd

+ 25 - 0
boman-api/boman-domain/src/main/java/com/boman/domain/form/LoginBody.java

@@ -20,6 +20,31 @@ public class LoginBody {
 
     private String logintype;
 
+    /**
+     * 手机号
+     */
+    private String phone;
+    /**
+     * 扫码登录的uuid
+     */
+    private String uuid;
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getUuid() {
+        return uuid;
+    }
+
+    public void setUuid(String uuid) {
+        this.uuid = uuid;
+    }
+
     public String getUsername()
     {
         return username;

+ 55 - 13
boman-auth/src/main/java/com/boman/auth/controller/TokenController.java

@@ -3,7 +3,11 @@ package com.boman.auth.controller;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 
+import com.alibaba.fastjson.JSONObject;
+import com.boman.auth.form.PoolCache;
+import com.boman.auth.form.ScanPool;
 import com.boman.common.core.exception.BaseException;
+import com.boman.common.core.utils.SecurityUtils;
 import com.boman.domain.SysUser;
 import com.boman.domain.WechatEnum;
 import com.boman.domain.dto.AjaxResult;
@@ -15,19 +19,19 @@ import com.boman.domain.dto.R;
 import com.boman.common.core.utils.StringUtils;
 import com.boman.common.security.service.TokenService;
 import com.boman.system.api.model.LoginUser;
-import com.boman.wechat.api.RemoteWechatService ;
+import com.boman.wechat.api.RemoteWechatService;
 
 import java.util.Map;
+import java.util.UUID;
 
 /**
  * token 控制
- * 
+ *
  * @author ruoyi
  */
 @RestController
 //@CrossOrigin
-public class TokenController
-{
+public class TokenController {
     @Autowired
     private TokenService tokenService;
 
@@ -61,7 +65,7 @@ public class TokenController
             sysUser.setId(userInfo.getSysUser().getId());
             sysUser.setOpenId(openId);
             AjaxResult updateResult = sysLoginService.updateUnionId(sysUser);
-            if((Integer) updateResult.get(AjaxResult.CODE_TAG) != 0) {
+            if ((Integer) updateResult.get(AjaxResult.CODE_TAG) != 0) {
                 throw new BaseException("保存小程序唯一标识出错!");
             }
         }
@@ -69,12 +73,52 @@ public class TokenController
         return R.ok(tokenService.createToken(userInfo));
     }
 
+
+    /**
+     * 产生uuid二维码
+     */
+    @PostMapping("getQrCode")
+    public R<?> getQrCode() {
+        String qrCode = tokenService.getQrCode();
+        return R.ok(qrCode);
+    }
+
+
+    /**
+     * 判断二维码是否被扫描
+     */
+    @GetMapping("getPool/{uuid}")
+    public R<?> getPool(@PathVariable String uuid) {
+        return tokenService.getPool(uuid);
+    }
+
+
+    /**
+     * 扫码成功进入确认登录页面记录状态
+     * @param uuid
+     * @return
+     */
+    @GetMapping(value = "scanCode/{uuid}")
+    public R<?> scanCode(@PathVariable String uuid) {
+        return  tokenService.scanCode(uuid);
+    }
+
+    /**
+     * app扫码登录
+     *
+     * @param form
+     * @return
+     */
+    @PostMapping("phoneScanLogin")
+    public R<?> phoneScanLogin(@RequestBody LoginBody form) {
+        LoginUser loginUser = sysLoginService.phoneScanLogin(form);
+        return R.ok(tokenService.createToken(loginUser));
+    }
+
     @DeleteMapping("logout")
-    public R<?> logout(HttpServletRequest request)
-    {
+    public R<?> logout(HttpServletRequest request) {
         LoginUser loginUser = tokenService.getLoginUser(request);
-        if (StringUtils.isNotNull(loginUser))
-        {
+        if (StringUtils.isNotNull(loginUser)) {
             String username = loginUser.getUsername();
             // 删除用户缓存记录
             tokenService.delLoginUser(loginUser.getToken());
@@ -85,11 +129,9 @@ public class TokenController
     }
 
     @PostMapping("refresh")
-    public R<?> refresh(HttpServletRequest request)
-    {
+    public R<?> refresh(HttpServletRequest request) {
         LoginUser loginUser = tokenService.getLoginUser(request);
-        if (StringUtils.isNotNull(loginUser))
-        {
+        if (StringUtils.isNotNull(loginUser)) {
             // 刷新令牌有效期
             tokenService.refreshToken(loginUser);
             return R.ok();

+ 82 - 0
boman-auth/src/main/java/com/boman/auth/form/PoolCache.java

@@ -0,0 +1,82 @@
+package com.boman.auth.form;
+
+import com.boman.common.core.exception.BaseException;
+
+import java.util.Iterator;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @author tjf
+ * @Date: 2021/09/10/16:29
+ */
+public class PoolCache {
+    // 缓存超时时间 5分钟
+    private static Long timeOutSecond = 5 * 60 * 1000L;
+
+    // 每半小时清理一次缓存
+    private static Long cleanIntervalSecond = 30 * 60 * 1000L;
+
+    //此map在多线程中会出现 ConcurrentModificationException
+    //public static Map<String, ScanPool> cacheMap = new HashMap<String, ScanPool>();
+
+    //List
+    //public static CopyOnWriteArrayList<Map<String, ScanPool>> copyOnWriteArrayList = new CopyOnWriteArrayList<Map<String,ScanPool>>();
+
+    //专用于高并发的map类-----Map的并发处理(ConcurrentHashMap)
+    public static ConcurrentHashMap<String, ScanPool> cacheMap = new ConcurrentHashMap<String, ScanPool>();
+
+
+    static {
+        new Thread(new Runnable() {
+
+            @Override
+            public void run() {
+                while (true) {
+                    try {
+                        Thread.sleep(cleanIntervalSecond);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                    clean();
+                }
+            }
+
+            public void clean() {
+
+                try {
+                        /*if (copyOnWriteArrayList.size() > 0) {
+                            Iterator<Map<String, ScanPool>> iterator = copyOnWriteArrayList.iterator();
+                            while (iterator.hasNext()) {
+                                Map<String, ScanPool> map = iterator.next();
+                                Iterator<String> it2 = map.keySet().iterator();
+                                while (it2.hasNext()){
+                                    String uuid = it2.next();
+                                    ScanPool pool = map.get(uuid);
+                                    if (System.currentTimeMillis() - pool.getCreateTime() > timeOutSecond ) {
+                                        copyOnWriteArrayList.remove(map);
+                                        System.err.println("失效了:   ..  "+ uuid);
+                                        System.err.println("失效了:   ..  "+ map);
+                                        break;
+                                    }
+                                }
+                            }
+                        }*/
+
+                    if (cacheMap.keySet().size() > 0) {
+                        Iterator<String> iterator = cacheMap.keySet().iterator();
+                        while (iterator.hasNext()) {
+                            String key = iterator.next();
+                            ScanPool pool = cacheMap.get(key);
+                            if (System.currentTimeMillis() - pool.getCreateTime() > timeOutSecond ) {
+                                cacheMap.remove(key);
+                            }
+                        }
+                    }
+                } catch (Exception e) {
+                    throw new BaseException("定时清理uuid异常!");
+                }
+            }
+        }).start();
+    }
+
+}

+ 96 - 0
boman-auth/src/main/java/com/boman/auth/form/ScanPool.java

@@ -0,0 +1,96 @@
+package com.boman.auth.form;
+
+import java.io.Serializable;
+
+/**
+ * @author tjf
+ * @Date: 2021/09/10/16:28
+ */
+public class ScanPool implements Serializable {
+
+    /**
+     * @Fields serialVersionUID : TODO(用一句话描述这个变量表示什么)
+     */
+    private static final long serialVersionUID = -9117921544228636689L;
+
+
+    private Object session;
+    //创建时间
+    private Long createTime = System.currentTimeMillis();
+
+    //登录状态
+    private boolean scanFlag = false;
+
+    public boolean isScan() {
+        return scanFlag;
+    }
+
+    public void setScan(boolean scanFlag) {
+        this.scanFlag = scanFlag;
+    }
+
+    /**
+     * 获取扫描状态,如果还没有扫描,则等待固定秒数
+     *
+     * @param wiatSecond 需要等待的秒数
+     * @return
+     */
+    public synchronized boolean getScanStatus() {
+        try {
+            if (!isScan()) { //如果还未扫描,则等待
+                this.wait();
+            }
+            if (isScan()) {
+                System.err.println("手机扫描完成设置getScanStatus..true...........");
+                return true;
+            }
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+
+    /**
+     * 扫码之后设置扫码状态
+     *
+     * @param token
+     * @param id
+     */
+    public synchronized void scanSuccess() {
+        try {
+            System.err.println("手机扫描完成setScan(true)....同时释放notifyAll(手机扫码时,根据uuid获得的scanpool对象)");
+            setScan(true);
+            this.notifyAll();
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+    }
+
+    public synchronized void notifyPool() {
+        try {
+            this.notifyAll();
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+    }
+
+    /***********************************************/
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+
+    public Object getSession() {
+        return session;
+    }
+
+    public void setSession(Object session) {
+        this.session = session;
+    }
+}
+

+ 41 - 5
boman-auth/src/main/java/com/boman/auth/service/SysLoginService.java

@@ -1,6 +1,8 @@
 package com.boman.auth.service;
 
+import com.boman.common.redis.service.RedisService;
 import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.form.LoginBody;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import com.boman.domain.constant.Constants;
@@ -17,18 +19,20 @@ import com.boman.system.api.model.LoginUser;
 
 /**
  * 登录校验方法
- * 
+ *
  * @author ruoyi
  */
 @Component
-public class SysLoginService
-{
+public class SysLoginService {
     @Autowired
     private RemoteLogService remoteLogService;
 
     @Autowired
     private RemoteUserService remoteUserService;
 
+    @Autowired
+    private RedisService redisService;
+
     /**
      * 登录
      */
@@ -83,12 +87,44 @@ public class SysLoginService
         return userInfo;
     }
 
+
+    /**
+     * APP扫码登录
+     *
+     * @param form
+     * @return
+     */
+    public LoginUser phoneScanLogin(LoginBody form) {
+        Object cacheObject = redisService.getCacheObject(form.getUuid());
+        if (cacheObject == null) {
+            throw new BaseException("登录超时,请重新登录");
+        }
+        String phone = form.getPhone();
+        if (StringUtils.isBlank(phone)) {
+            throw new BaseException("缺少参数,手机号码");
+        }
+        SysUser user = remoteUserService.getByPhone(phone);
+        String userName = user.getUserName();
+        if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) {
+            remoteLogService.saveLogininfor(userName, Constants.LOGIN_FAIL, "对不起,您的账号已被删除");
+            throw new BaseException("对不起,您的账号:" + userName + " 已被删除");
+        }
+
+        if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
+            remoteLogService.saveLogininfor(userName, Constants.LOGIN_FAIL, "用户已停用,请联系管理员");
+            throw new BaseException("对不起,您的账号:" + userName + " 已停用");
+        }
+        remoteLogService.saveLogininfor(userName, Constants.LOGIN_SUCCESS, "登录成功");
+        redisService.deleteObject(form.getUuid());
+        LoginUser loginUser = remoteUserService.packInfo(user);
+        return loginUser;
+    }
+
     public AjaxResult updateUnionId(SysUser sysUser) {
         return remoteUserService.updateUnionId(sysUser);
     }
 
-    public void logout(String loginName)
-    {
+    public void logout(String loginName) {
         remoteLogService.saveLogininfor(loginName, Constants.LOGOUT, "退出成功");
     }
 }

+ 7 - 0
boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/DateUtils.java

@@ -49,6 +49,13 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
         return new Date();
     }
 
+    public static Date addDayOfDate(Date date,int i){
+        Calendar c = Calendar.getInstance();
+        c.setTime(date);
+        c.add(Calendar.DATE, i);
+        Date newDate = c.getTime();
+        return newDate;
+    }
     /**
      * 当天的开始时间
      */

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
boman-common/boman-common-security/src/main/java/com/boman/common/security/service/TokenService.java


+ 43 - 27
boman-web-core/src/main/java/com/boman/web/core/domain/VaccineInfoOperation.java

@@ -51,6 +51,11 @@ public class VaccineInfoOperation extends BaseEntity {
     @Excel(name = "户籍地")
     private String domicile;
 
+    /**
+     * 户籍地前端展示用 安徽省安庆市潜山市xx乡xx村xx组
+     */
+    private String domicileSelect;
+
     /**
      * 省
      */
@@ -91,7 +96,6 @@ public class VaccineInfoOperation extends BaseEntity {
     /**
      * 身份证号码
      */
-    @Excel(name = "身份证号码")
     private String idCard;
 
     /**
@@ -136,6 +140,13 @@ public class VaccineInfoOperation extends BaseEntity {
     @Excel(name = "接种时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date vaccinationTime;
 
+    /**
+     * 下次应接种时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "下次应接种时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date vaccinationTimeNext;
+
     /**
      * 接种地点
      */
@@ -154,17 +165,6 @@ public class VaccineInfoOperation extends BaseEntity {
     @Excel(name = "暂缓")
     private String suspend;
 
-    /**
-     * 死亡
-     */
-    @Excel(name = "死亡")
-    private String death;
-
-    /**
-     * 失联失踪
-     */
-    @Excel(name = "失联失踪")
-    private String lostInMissing;
 
     /**
      * 应种未种
@@ -220,6 +220,11 @@ public class VaccineInfoOperation extends BaseEntity {
     private String manufacturer;
     /** 現在居住地址 */
     private String nowIn;
+
+    /**
+     * 現在居住地址查询展示 安徽省安庆市潜山市xx乡xx村xx组
+     */
+    private String nowInSelect;
     /**
      * 附件地址
      */
@@ -235,6 +240,30 @@ public class VaccineInfoOperation extends BaseEntity {
      */
     private List<String> idCardS;
 
+    public Date getVaccinationTimeNext() {
+        return vaccinationTimeNext;
+    }
+
+    public void setVaccinationTimeNext(Date vaccinationTimeNext) {
+        this.vaccinationTimeNext = vaccinationTimeNext;
+    }
+
+    public String getDomicileSelect() {
+        return domicileSelect;
+    }
+
+    public void setDomicileSelect(String domicileSelect) {
+        this.domicileSelect = domicileSelect;
+    }
+
+    public String getNowInSelect() {
+        return nowInSelect;
+    }
+
+    public void setNowInSelect(String nowInSelect) {
+        this.nowInSelect = nowInSelect;
+    }
+
     public List<String> getIdCardS() {
         return idCardS;
     }
@@ -443,21 +472,6 @@ public class VaccineInfoOperation extends BaseEntity {
         return suspend;
     }
 
-    public void setDeath(String death) {
-        this.death = death;
-    }
-
-    public String getDeath() {
-        return death;
-    }
-
-    public void setLostInMissing(String lostInMissing) {
-        this.lostInMissing = lostInMissing;
-    }
-
-    public String getLostInMissing() {
-        return lostInMissing;
-    }
 
     public void setShouldBe(String shouldBe) {
         this.shouldBe = shouldBe;
@@ -564,4 +578,6 @@ public class VaccineInfoOperation extends BaseEntity {
     }
 
 
+
+
 }

+ 169 - 51
boman-web-core/src/main/java/com/boman/web/core/service/vaccineInfo/impl/VaccineInfoServiceImpl.java

@@ -6,6 +6,8 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import com.alibaba.fastjson.JSONObject;
 import com.boman.common.core.utils.DateUtils;
@@ -18,6 +20,7 @@ import com.boman.web.core.mapper.VaccineInfoOperationMapper;
 import com.boman.web.core.mapper.VaccineInfoUserMapper;
 import com.boman.web.core.service.vaccineInfo.IVaccineInfoService;
 
+import io.swagger.models.auth.In;
 import org.springframework.stereotype.Service;
 import com.boman.web.core.mapper.VaccineInfoMapper;
 import org.springframework.transaction.annotation.Isolation;
@@ -55,7 +58,7 @@ public class VaccineInfoServiceImpl implements IVaccineInfoService {
     public VaccineInfoOperation selectVaccineInfoById(Long id) {
         VaccineInfoOperation vaccineInfoOperation = vaccineInfoMapper.selectVaccineInfoById(id);
         String vaccineName = vaccineInfoOperation.getVaccineName();
-        if (StringUtils.isNotBlank(vaccineName)){
+        if (StringUtils.isNotBlank(vaccineName)) {
             String dictValue = vaccineInfoMapper.selectSysDictDataByDictLabel(vaccineName);
             vaccineInfoOperation.setDictValue(dictValue);
         }
@@ -72,11 +75,11 @@ public class VaccineInfoServiceImpl implements IVaccineInfoService {
     public List<VaccineInfoOperation> selectVaccineInfoList(VaccineInfoOperation vaccineInfoOperation) {
         Map<String, Object> params = vaccineInfoOperation.getParams();
         String age = params.get("age").toString();
-        if (StringUtils.isNotBlank(age)){
+        if (StringUtils.isNotBlank(age)) {
             String[] split = age.split("-");
-            params.put("startAge",split[0]);
-            if (split.length == 2){
-                params.put("endAge",split[1]);
+            params.put("startAge", split[0]);
+            if (split.length == 2) {
+                params.put("endAge", split[1]);
             }
         }
         //疫苗名称
@@ -88,7 +91,7 @@ public class VaccineInfoServiceImpl implements IVaccineInfoService {
         //接种地点
         String vaccinationPlace = vaccineInfoOperation.getVaccinationPlace();
         List<String> idCardS = new ArrayList<>();
-        if (StringUtils.isNotBlank(vaccineName) || StringUtils.isNotBlank(jici) || vaccinationTime != null || StringUtils.isNotBlank(vaccinationPlace)){
+        if (StringUtils.isNotBlank(vaccineName) || StringUtils.isNotBlank(jici) || vaccinationTime != null || StringUtils.isNotBlank(vaccinationPlace)) {
             VaccineInfoUser vaccineInfoUser = new VaccineInfoUser();
             vaccineInfoUser.setVaccineName(vaccineName);
             vaccineInfoUser.setJici(jici);
@@ -97,7 +100,55 @@ public class VaccineInfoServiceImpl implements IVaccineInfoService {
             idCardS = vaccineInfoUserMapper.selectIdCardList(vaccineInfoUser);
             vaccineInfoOperation.setIdCardS(idCardS);
         }
-        return vaccineInfoMapper.selectVaccineInfoList(vaccineInfoOperation);
+        List<VaccineInfoOperation> vaccineInfoOperations = vaccineInfoMapper.selectVaccineInfoList(vaccineInfoOperation);
+        StringBuilder sbDomicile = new StringBuilder();
+        StringBuilder sbNowIn = new StringBuilder();
+        if (vaccineInfoOperations != null && vaccineInfoOperations.size() > 0) {
+            for (VaccineInfoOperation infoOperation : vaccineInfoOperations) {
+                //省
+                String province = infoOperation.getProvince();
+                //市
+                String city = infoOperation.getCity();
+                //区
+                String region = infoOperation.getRegion();
+/*                //乡镇
+                String villageTowns = infoOperation.getVillageTowns();
+                //村居
+                String village = infoOperation.getVillage();
+                //村民组(社区)
+                String villagerGroup = infoOperation.getVillagerGroup();*/
+                //户籍地
+                String domicile = infoOperation.getDomicile();
+                sbDomicile.append(province).append(city).append(region).append(domicile);
+                infoOperation.setDomicileSelect(sbDomicile.toString());
+                //现居地
+                String nowIn = infoOperation.getNowIn();
+                sbNowIn.append(province).append(city).append(region).append(nowIn);
+                infoOperation.setNowInSelect(sbNowIn.toString());
+                //最后一次的接种时间
+                Date vaccinationTimeLast = infoOperation.getVaccinationTime();
+                //接种的疫苗名称
+                String vaccineNameLast = infoOperation.getVaccineName();
+                Date date = vaccinationTimeNext(vaccinationTimeLast, vaccineNameLast);
+                infoOperation.setVaccinationTimeNext(date);
+            }
+        }
+
+        return vaccineInfoOperations;
+    }
+
+    private Date vaccinationTimeNext(Date vaccinationTime, String vaccineNameLast) {
+        Date date = new Date();
+        if ("科兴中维".equals(vaccineNameLast)) {
+            date = DateUtils.addDayOfDate(vaccinationTime, 14);
+        }else if ("北京生物".equals(vaccineNameLast)){
+            date = DateUtils.addDayOfDate(vaccinationTime, 21);
+        }else if ("深圳康泰".equals(vaccineNameLast)){
+            date = DateUtils.addDayOfDate(vaccinationTime, 28);
+        }else if ("安徽智飞".equals(vaccineNameLast)){
+            date = DateUtils.addDayOfDate(vaccinationTime, 28);
+        }
+        return date;
     }
 
     /**
@@ -112,26 +163,59 @@ public class VaccineInfoServiceImpl implements IVaccineInfoService {
         // 疫苗信息
 //        genNowIn(vaccineInfoOperation);
         vaccineInfoOperation.setCreateTime(DateUtils.getNowDate());
-        int info = vaccineInfoMapper.insertVaccineInfo(vaccineInfoOperation);
         //提取出用户接种疫苗信息列表
         List<VaccineInfoUser> vaccineInfoUserList = vaccineInfoOperation.getVaccineInfoUserList();
-        if (vaccineInfoUserList != null && vaccineInfoUserList.size() > 0){
+        //最后一次接种时间
+        Date vaccinationTime = new Date();
+        String VaccineName = "";
+        String jiCi = "";
+        if (vaccineInfoUserList != null && vaccineInfoUserList.size() > 0) {
             for (VaccineInfoUser vaccineInfoUser : vaccineInfoUserList) {
+                if (vaccineInfoUser.getVaccinationTime().compareTo(vaccinationTime) > 0) {
+                    vaccinationTime = vaccineInfoUser.getVaccinationTime();
+                }
+                //剂次可能是 "加强针"
+                String jici = vaccineInfoUser.getJici();
+                if (isNumeric(jici) && isNumeric(jiCi) && Integer.parseInt(jici) >Integer.parseInt(jiCi)){
+                    jiCi = vaccineInfoUser.getJici();
+                }else if (!isNumeric(jici)){
+                    jiCi = vaccineInfoUser.getJici();
+                }
                 vaccineInfoUser.setIdCard(vaccineInfoOperation.getIdCard());
                 vaccineInfoUser.setCreateBy(SecurityUtils.getUsername());
+                VaccineName = vaccineInfoUser.getVaccineName();
                 vaccineInfoUserMapper.insertVaccineInfoUser(vaccineInfoUser);
             }
         }
+        vaccineInfoOperation.setVaccinationTime(vaccinationTime);
+        vaccineInfoOperation.setVaccineName(VaccineName);
+        vaccineInfoOperation.setJici(jiCi);
+        int info = vaccineInfoMapper.insertVaccineInfo(vaccineInfoOperation);
 
         // 疫苗信息新增操作记录
         vaccineInfoOperation.setOperationType(INSERT);
         vaccineInfoOperation.setVaccineInfoId(vaccineInfoOperation.getId());
         vaccineInfoOperation.setCreateBy(SecurityUtils.getUsername());
+        vaccineInfoOperation.setVaccinationTime(vaccinationTime);
+        vaccineInfoOperation.setVaccineName(VaccineName);
         vaccineInfoOperationMapper.insertVaccineInfoOperation(vaccineInfoOperation);
-
         return info;
     }
 
+
+    /**
+     * 利用正则表达式判断字符串是否是数字
+     * @param str
+     * @return
+     */
+    public boolean isNumeric(String str){
+        Pattern pattern = Pattern.compile("[0-9]*");
+        Matcher isNum = pattern.matcher(str);
+        if( !isNum.matches() ){
+            return false;
+        }
+        return true;
+    }
     /**
      * 修改疫苗信息
      *
@@ -143,20 +227,52 @@ public class VaccineInfoServiceImpl implements IVaccineInfoService {
     public int updateVaccineInfo(VaccineInfoOperation vaccineInfo) {
         vaccineInfo.setUpdateTime(DateUtils.getNowDate());
 //        genNowIn(vaccineInfo);
-        int info = vaccineInfoMapper.updateVaccineInfo(vaccineInfo);
         List<VaccineInfoUser> vaccineInfoUserList = vaccineInfo.getVaccineInfoUserList();
-        if (vaccineInfoUserList != null && vaccineInfoUserList.size() > 0){
+        //最后接种时间
+        Date vaccinationTime = vaccineInfo.getVaccinationTime();
+        //疫苗名称
+        String vaccineName = "";
+        //剂次
+        String jiCi = vaccineInfo.getJici();
+        if (vaccineInfoUserList != null && vaccineInfoUserList.size() > 0) {
             for (VaccineInfoUser vaccineInfoUser : vaccineInfoUserList) {
-                if (vaccineInfoUser.getId() != null){
+                if (vaccineInfoUser.getId() != null) {
                     vaccineInfoUser.setUpdateBy(SecurityUtils.getUsername());
+                    if (vaccineInfoUser.getVaccinationTime().compareTo(vaccinationTime) > 0) {
+                        vaccinationTime = vaccineInfoUser.getVaccinationTime();
+                    }
+                    //剂次可能是 "加强针"
+                    String jici = vaccineInfoUser.getJici();
+                    if (isNumeric(jici) && isNumeric(jiCi) && Integer.parseInt(jici) >Integer.parseInt(jiCi)){
+                        jiCi = vaccineInfoUser.getJici();
+                    }else if (!isNumeric(jici)){
+                        jiCi = vaccineInfoUser.getJici();
+                    }
+                    vaccineName = vaccineInfoUser.getVaccineName();
                     vaccineInfoUserMapper.updateVaccineInfoUser(vaccineInfoUser);
-                }else {
+                } else {
+                    //判断接种时间是否是新
+                    if (vaccineInfoUser.getVaccinationTime().compareTo(vaccinationTime) > 0) {
+                        vaccinationTime = vaccineInfoUser.getVaccinationTime();
+                    }
+                    //剂次可能是 "加强针"
+                    String jici = vaccineInfoUser.getJici();
+                    if (isNumeric(jici) && isNumeric(jiCi) && Integer.parseInt(jici) >Integer.parseInt(jiCi)){
+                        jiCi = vaccineInfoUser.getJici();
+                    }else if (!isNumeric(jici)){
+                        jiCi = vaccineInfoUser.getJici();
+                    }
+                    vaccineName = vaccineInfoUser.getVaccineName();
                     vaccineInfoUser.setIdCard(vaccineInfo.getIdCard());
                     vaccineInfoUser.setCreateBy(SecurityUtils.getUsername());
                     vaccineInfoUserMapper.insertVaccineInfoUser(vaccineInfoUser);
                 }
             }
         }
+        vaccineInfo.setVaccineName(vaccineName);
+        vaccineInfo.setVaccinationTime(vaccinationTime);
+        vaccineInfo.setJici(jiCi);
+        int info = vaccineInfoMapper.updateVaccineInfo(vaccineInfo);
         // 疫苗信息新增操作记录
         vaccineInfo.setOperationType(EDIT);
         vaccineInfo.setCreateTime(new Date());
@@ -176,7 +292,7 @@ public class VaccineInfoServiceImpl implements IVaccineInfoService {
     public int deleteVaccineInfoByIds(Long[] ids) {
         List<VaccineInfoOperation> vaccineInfos = vaccineInfoMapper.selectVaccineInfoByIds(ids);
         String userName = SecurityUtils.getUsername();
-        for(VaccineInfoOperation vaccineInfoOperation : vaccineInfos) {
+        for (VaccineInfoOperation vaccineInfoOperation : vaccineInfos) {
             // 疫苗信息新增操作记录
             vaccineInfoOperation.setOperationType(DELETE);
             vaccineInfoOperation.setCreateTime(new Date());
@@ -206,15 +322,16 @@ public class VaccineInfoServiceImpl implements IVaccineInfoService {
 
     /**
      * 根据身份证号查询用户信息
+     *
      * @param vaccineInfo
      * @return
      */
     @Override
     public VaccineInfoOperation findHjInfo(VaccineInfoOperation vaccineInfo) {
         VaccineInfoOperation hjInfo = vaccineInfoMapper.findHjInfo(vaccineInfo);
-        if (hjInfo == null){
+        if (hjInfo == null) {
             String idCard = vaccineInfo.getIdCard();
-            if (StringUtils.isNotBlank(idCard)){
+            if (StringUtils.isNotBlank(idCard)) {
                 //根据身份证提取出生日和性别,年龄
                 String sex = getSex(idCard);
                 Integer age = getAge(idCard);
@@ -232,30 +349,31 @@ public class VaccineInfoServiceImpl implements IVaccineInfoService {
     /**
      * 15位身份证号
      */
-    private static final Integer FIFTEEN_ID_CARD=15;
+    private static final Integer FIFTEEN_ID_CARD = 15;
     /**
      * 18位身份证号
      */
-    private static final Integer EIGHTEEN_ID_CARD=18;
+    private static final Integer EIGHTEEN_ID_CARD = 18;
     private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
 
     /**
      * 根据身份证号获取性别
+     *
      * @param IDCard
      * @return
      */
-    public static String getSex(String IDCard){
-        String sex ="";
-        if (StringUtils.isNotBlank(IDCard)){
+    public static String getSex(String IDCard) {
+        String sex = "";
+        if (StringUtils.isNotBlank(IDCard)) {
             //15位身份证号
-            if (IDCard.length() == FIFTEEN_ID_CARD){
+            if (IDCard.length() == FIFTEEN_ID_CARD) {
                 if (Integer.parseInt(IDCard.substring(14, 15)) % 2 == 0) {
                     sex = "女";
                 } else {
                     sex = "男";
                 }
                 //18位身份证号
-            }else if(IDCard.length() == EIGHTEEN_ID_CARD){
+            } else if (IDCard.length() == EIGHTEEN_ID_CARD) {
                 // 判断性别
                 if (Integer.parseInt(IDCard.substring(16).substring(0, 1)) % 2 == 0) {
                     sex = "女";
@@ -270,15 +388,16 @@ public class VaccineInfoServiceImpl implements IVaccineInfoService {
 
     /**
      * 根据身份证号获取年龄
+     *
      * @param IDCard
      * @return
      */
-    public static Integer getAge(String IDCard){
+    public static Integer getAge(String IDCard) {
         Integer age = 0;
         Date date = new Date();
-        if (StringUtils.isNotBlank(IDCard)&& isValid(IDCard)){
+        if (StringUtils.isNotBlank(IDCard) && isValid(IDCard)) {
             //15位身份证号
-            if (IDCard.length() == FIFTEEN_ID_CARD){
+            if (IDCard.length() == FIFTEEN_ID_CARD) {
                 // 身份证上的年份(15位身份证为1980年前的)
                 String uyear = "19" + IDCard.substring(6, 8);
                 // 身份证上的月份
@@ -294,7 +413,7 @@ public class VaccineInfoServiceImpl implements IVaccineInfoService {
                     age = Integer.parseInt(fyear) - Integer.parseInt(uyear);
                 }
                 //18位身份证号
-            }else if(IDCard.length() == EIGHTEEN_ID_CARD){
+            } else if (IDCard.length() == EIGHTEEN_ID_CARD) {
                 // 身份证上的年份
                 String year = IDCard.substring(6).substring(0, 4);
                 // 身份证上的月份
@@ -316,21 +435,21 @@ public class VaccineInfoServiceImpl implements IVaccineInfoService {
     }
 
 
-
     /**
      * 身份证验证
+     *
      * @param id 号码内容
      * @return 是否有效
      */
-    public static boolean isValid(String id){
+    public static boolean isValid(String id) {
         Boolean validResult = true;
         //校验长度只能为15或18
         int len = id.length();
-        if (len != FIFTEEN_ID_CARD && len != EIGHTEEN_ID_CARD){
+        if (len != FIFTEEN_ID_CARD && len != EIGHTEEN_ID_CARD) {
             validResult = false;
         }
         //校验生日
-        if (!validDate(id)){
+        if (!validDate(id)) {
             validResult = false;
         }
         return validResult;
@@ -338,55 +457,54 @@ public class VaccineInfoServiceImpl implements IVaccineInfoService {
 
     /**
      * 校验生日
+     *
      * @param id
      * @return
      */
-    private static boolean validDate(String id)
-    {
-        try
-        {
+    private static boolean validDate(String id) {
+        try {
             String birth = id.length() == 15 ? "19" + id.substring(6, 12) : id.substring(6, 14);
             SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
             Date birthDate = sdf.parse(birth);
-            if (!birth.equals(sdf.format(birthDate))){
+            if (!birth.equals(sdf.format(birthDate))) {
                 return false;
             }
-        }
-        catch (ParseException e)
-        {
+        } catch (ParseException e) {
             return false;
         }
         return true;
     }
+
     /**
      * 获取出生日期  yyyy年MM月dd日
+     *
      * @param IDCard
      * @return
      */
-    public static String getBirthday(String IDCard){
-        String birthday="";
-        String year="";
-        String month="";
-        String day="";
-        if (StringUtils.isNotBlank(IDCard)){
+    public static String getBirthday(String IDCard) {
+        String birthday = "";
+        String year = "";
+        String month = "";
+        String day = "";
+        if (StringUtils.isNotBlank(IDCard)) {
             //15位身份证号
-            if (IDCard.length() == FIFTEEN_ID_CARD){
+            if (IDCard.length() == FIFTEEN_ID_CARD) {
                 // 身份证上的年份(15位身份证为1980年前的)
                 year = "19" + IDCard.substring(6, 8);
                 //身份证上的月份
                 month = IDCard.substring(8, 10);
                 //身份证上的日期
-                day= IDCard.substring(10, 12);
+                day = IDCard.substring(10, 12);
                 //18位身份证号
-            }else if(IDCard.length() == EIGHTEEN_ID_CARD){
+            } else if (IDCard.length() == EIGHTEEN_ID_CARD) {
                 // 身份证上的年份
                 year = IDCard.substring(6).substring(0, 4);
                 // 身份证上的月份
                 month = IDCard.substring(10).substring(0, 2);
                 //身份证上的日期
-                day=IDCard.substring(12).substring(0,2);
+                day = IDCard.substring(12).substring(0, 2);
             }
-            birthday=year+"-"+month+"-"+day;
+            birthday = year + "-" + month + "-" + day;
         }
         return birthday;
     }

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio