From ccc1f083667f7331dd0515c8bcdb12d2c14c5fb2 Mon Sep 17 00:00:00 2001 From: zc Date: Tue, 10 Jun 2025 09:33:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=B4=E5=AE=89=E8=AE=BF=E5=AE=A2=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E8=AE=BF=E5=AE=A2=E6=94=B9=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/controller/TokenController.java | 1 + .../dcsoft/auth/service/SysLoginService.java | 9 +- .../common/core/constant/CacheConstants.java | 2 + .../common/redis/service/RedisService.java | 53 ++- .../system/controller/SysRoleController.java | 12 + .../com/dcsoft/system/utils/UuidUtil.java | 40 +++ .../visitor/controller/VisitorController.java | 328 +++++++++++++++--- .../visitor/domain/VisVisitorExamine.java | 7 + .../dcsoft/system/visitor/domain/Visitor.java | 14 + .../system/visitor/mapper/VisitorMapper.java | 8 +- .../visitor/service/IVisitorService.java | 10 +- .../service/impl/VisitorServiceImpl.java | 76 +++- .../mapper/system/visitor/VisitorMapper.xml | 138 ++++++-- 13 files changed, 603 insertions(+), 95 deletions(-) create mode 100644 dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/utils/UuidUtil.java diff --git a/dcsoft-auth/src/main/java/com/dcsoft/auth/controller/TokenController.java b/dcsoft-auth/src/main/java/com/dcsoft/auth/controller/TokenController.java index fe7a7b0..585084e 100644 --- a/dcsoft-auth/src/main/java/com/dcsoft/auth/controller/TokenController.java +++ b/dcsoft-auth/src/main/java/com/dcsoft/auth/controller/TokenController.java @@ -85,6 +85,7 @@ public class TokenController String s = RsaUiUtils.decryptByPrivateKey(form.getEncrypt()); JSONObject jsonObject = JSONObject.parseObject(s); userInfo = sysLoginService.login(jsonObject.getString("username"), jsonObject.getString("password")); +// userInfo = sysLoginService.login(form.getUsername(), form.getPassword()); } // 获取登录token return R.ok(tokenService.createToken(userInfo)); diff --git a/dcsoft-auth/src/main/java/com/dcsoft/auth/service/SysLoginService.java b/dcsoft-auth/src/main/java/com/dcsoft/auth/service/SysLoginService.java index d8c003e..054d216 100644 --- a/dcsoft-auth/src/main/java/com/dcsoft/auth/service/SysLoginService.java +++ b/dcsoft-auth/src/main/java/com/dcsoft/auth/service/SysLoginService.java @@ -356,15 +356,16 @@ public class SysLoginService //生成六位验证码 String smsCode = SmsUtils.generateSmsCode(); + log.info("{}短信二维码{}", register.getPhone(), smsCode); SmsDTO smsDTO = new SmsDTO(); smsDTO.setTemplateId(smsProperties.getTemplate11()); smsDTO.setCaptcha(smsCode); smsDTO.setPhone(register.getPhone()); - AjaxResult ajaxResult = remoteUserService.sendMessage(smsDTO, SecurityConstants.INNER); - if (!ajaxResult.isSuccess()) { - throw new ServiceException(ajaxResult.get("msg").toString()); - } +// AjaxResult ajaxResult = remoteUserService.sendMessage(smsDTO, SecurityConstants.INNER); +// if (!ajaxResult.isSuccess()) { +// throw new ServiceException(ajaxResult.get("msg").toString()); +// } //缓存次数 int i = 1; diff --git a/dcsoft-common/dcsoft-common-core/src/main/java/com/dcsoft/common/core/constant/CacheConstants.java b/dcsoft-common/dcsoft-common-core/src/main/java/com/dcsoft/common/core/constant/CacheConstants.java index 1540ab7..f7dec2b 100644 --- a/dcsoft-common/dcsoft-common-core/src/main/java/com/dcsoft/common/core/constant/CacheConstants.java +++ b/dcsoft-common/dcsoft-common-core/src/main/java/com/dcsoft/common/core/constant/CacheConstants.java @@ -72,4 +72,6 @@ public class CacheConstants public static final String WEIXIN_URL_LINK = "weixin_url_link"; public static final String WE_COM_TOKEN = "we_com_token:"; + + public static final String VISITOR_SMS_CODE = "visitor_sms_code:"; } diff --git a/dcsoft-common/dcsoft-common-redis/src/main/java/com/dcsoft/common/redis/service/RedisService.java b/dcsoft-common/dcsoft-common-redis/src/main/java/com/dcsoft/common/redis/service/RedisService.java index c2436fe..4aea5fd 100644 --- a/dcsoft-common/dcsoft-common-redis/src/main/java/com/dcsoft/common/redis/service/RedisService.java +++ b/dcsoft-common/dcsoft-common-redis/src/main/java/com/dcsoft/common/redis/service/RedisService.java @@ -1,11 +1,7 @@ package com.dcsoft.common.redis.service; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.TimeUnit; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.formula.functions.T; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.BoundSetOperations; import org.springframework.data.redis.core.HashOperations; @@ -13,18 +9,24 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component; +import java.util.*; +import java.util.concurrent.TimeUnit; + /** * spring redis 工具类 - * + * * @author dcsoft **/ @SuppressWarnings(value = { "unchecked", "rawtypes" }) @Component +@Slf4j public class RedisService { @Autowired public RedisTemplate redisTemplate; + private static final long DEFAULT_TIMEOUT = 60 * 60 * 24 * 7; + /** * 缓存基本的对象,Integer、String、实体类等 * @@ -36,6 +38,43 @@ public class RedisService redisTemplate.opsForValue().set(key, value); } + + /** + * 缓存是否存在,存在返回false,不存在返回true并存储缓存值 + * + * @param key + * @param value + */ + public Boolean setIfAbsent(final String key, final String value, long timeout, TimeUnit timeUnit) + { + try { + return redisTemplate.opsForValue().setIfAbsent(key, value, timeout, timeUnit); + } catch (Exception e) { + log.error("redis error:{}", e.getMessage()); + return false; + } + } + + /** + * 分布式加锁 + * + * @param key + * @param value + */ + public Boolean lock(final String key, final String value, long timeout, TimeUnit timeUnit) + { + try { + if (timeout <= 0) { + timeout = DEFAULT_TIMEOUT; + timeUnit = TimeUnit.SECONDS; + } + return redisTemplate.opsForValue().setIfAbsent(key, value, timeout, timeUnit); + } catch (Exception e) { + log.error("redis error:{}", e.getMessage()); + return false; + } + } + /** * 缓存基本的对象,Integer、String、实体类等 * diff --git a/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/controller/SysRoleController.java b/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/controller/SysRoleController.java index b6136c5..90e1ab7 100644 --- a/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/controller/SysRoleController.java +++ b/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/controller/SysRoleController.java @@ -224,6 +224,18 @@ public class SysRoleController extends BaseController return toAjax(roleService.insertAuthUsers(roleId, userIds)); } + /** + * 访客授权 + */ + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PostMapping("/insertVisitor") + public AjaxResult insertVisitor(@RequestBody SysUser sysUser) { + roleService.checkRoleDataScope(sysUser.getRoleId()); + Long[] userIds = new Long[1]; + userIds[0] = sysUser.getUserId(); + return toAjax(roleService.insertAuthUsers(sysUser.getRoleId(), userIds)); + } + /** * 获取对应角色部门树列表 */ diff --git a/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/utils/UuidUtil.java b/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/utils/UuidUtil.java new file mode 100644 index 0000000..4c8f801 --- /dev/null +++ b/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/utils/UuidUtil.java @@ -0,0 +1,40 @@ +package com.dcsoft.system.utils; + +import java.util.UUID; + +public class UuidUtil { + + public static String[] chars = new String[] { "a", "b", "c", "d", "e", "f", + "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", + "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", + "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", + "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", + "W", "X", "Y", "Z" }; + + + /** + * 获取短UUID + * @return + */ + public static String getShortUuid() { + StringBuffer shortBuffer = new StringBuffer(); + String uuid = UuidUtil.getUuid(); + for (int i = 0; i < 8; i++) { + String str = uuid.substring(i * 4, i * 4 + 4); + int x = Integer.parseInt(str, 16); + shortBuffer.append(chars[x % 0x3E]); // 对62取余 + } + return shortBuffer.toString(); + + } + + /** + * 获得32位UUID + */ + public static String getUuid(){ + String uuid = UUID.randomUUID().toString(); + //去掉“-”符号 + return uuid.replaceAll("-", ""); + } + +} diff --git a/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/visitor/controller/VisitorController.java b/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/visitor/controller/VisitorController.java index 5767d44..16ed6a2 100644 --- a/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/visitor/controller/VisitorController.java +++ b/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/visitor/controller/VisitorController.java @@ -1,11 +1,16 @@ package com.dcsoft.system.visitor.controller; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpException; import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.dcsoft.common.core.constant.CacheConstants; import com.dcsoft.common.core.constant.Constants; +import com.dcsoft.common.core.domain.R; import com.dcsoft.common.core.enums.ExamineEnum; import com.dcsoft.common.core.enums.MatterEnum; import com.dcsoft.common.core.enums.exception.CommonExceptionEnum; @@ -36,6 +41,7 @@ import com.dcsoft.system.uniubi.domain.Person; import com.dcsoft.system.uniubi.service.ISysApiService; import com.dcsoft.system.uniubi.service.ISysSdkService; import com.dcsoft.system.utils.FileUtils; +import com.dcsoft.system.utils.UuidUtil; import com.dcsoft.system.visitor.domain.CheckCodeVo; import com.dcsoft.system.visitor.domain.VisVisitorExamine; import com.dcsoft.system.visitor.domain.Visitor; @@ -175,6 +181,8 @@ public class VisitorController extends BaseController { // 正则表达式匹配大部分国家的手机号码格式 private static final Pattern PHONE_NUMBER_PATTERN = Pattern.compile("^1[3-9]\\d{9}$"); + private static final String APPROVE_KEY = "APPROVE_KEY:APPROVE"; + /** * 查询访客信息列表 */ @@ -292,6 +300,52 @@ public class VisitorController extends BaseController { return success(visitor); } + /** + * 获取访客信息详细信息(审批链接进来) + */ + @PostMapping(value = "/getVisitorInfo") + public AjaxResult getVisitorInfo(@RequestBody JSONObject js) throws Exception { + String data = js.getString("data"); + if (StringUtils.isBlank(data)) { + throw new ServiceException("参数为空,请联系管理员!"); + } + + //数据进行解密 + Object cacheObject = redisService.getCacheObject(CacheConstants.VISITOR_SMS_CODE + data); + if (ObjectUtil.isNull(cacheObject)) { + throw new ServiceException("链接不存在或已过期!"); + } + + String[] split = String.valueOf(cacheObject).split("&"); + Long id = Long.parseLong(split[0]); + String telephone = split[1]; + + Visitor visitor = visitorService.selectVisitorById(id); + visitor.setTelephone(telephone); + + //审核链接进来 + if (StringUtils.isNotBlank(telephone)) { + if (StringUtils.equals(visitor.getExamineState(), ExamineEnum.IN_REVIEW.getCode())) { + //查询当前点击审核链接的人员信息 + SysPeople sysPeople = sysPeopleService.queryPeopleName(telephone, null); + + //根据手机号查询peopleId + visitor.setReviewer(String.valueOf(sysPeople.getId())); + visitor.setPosition(null); + Visitor visitor1 = visitorService.queryReviewProcess(visitor); + if (ObjectUtil.isNotNull(visitor1) && StrUtil.isNotBlank(visitor1.getState())) { + visitor.setExamineState(visitor1.getState()); + } + } + } + + Map map = dictDataService.queryDictData("sys_company_type"); + visitor.setMatterName(MatterEnum.getByCode(visitor.getMatter())); + visitor.setDeptName(map.get(visitor.getDeptId())); + return success(visitor); + } + + /** * 新增访客信息 */ @@ -304,13 +358,30 @@ public class VisitorController extends BaseController { } //判断访客和随访人是否存在预约过的信息 - List visitors = new ArrayList<>(); - visitors.add(visitor); - if (!CollUtil.isEmpty(visitor.getItemList())) { - for (Visitor item : visitor.getItemList()) { - if (!validatePhoneNumber(item.getPhone())) { - throw new ServiceException("您输入的随访人员手机号格式不正确"); - } + List phones = new ArrayList<>(); + List idcards = new ArrayList<>(); + if (CollUtil.isNotEmpty(visitor.getItemList())) { + phones = visitor.getItemList().stream().map(Visitor::getPhone).collect(Collectors.toList()); + idcards = visitor.getItemList().stream().map(Visitor::getIdcard).collect(Collectors.toList()); + } + phones.add(visitor.getPhone()); + if (visitorService.queryVisitorByIdCount(phones) > 0) { + throw new ServiceException("手机号已存在访客预约信息"); + } + idcards.add(visitor.getIdcard()); + if (visitorService.queryVisitorByCardCount(idcards) > 0) { + throw new ServiceException("访客中存在已预约访客"); + } + + LoginUser loginUser = SecurityUtils.getLoginUser(); + visitor.setCreateBy(loginUser.getUsername()); + log.info("新增访客信息:{}", visitor); + int i = visitorService.insertVisitor(visitor); + + // 随访人员 + List itemList = visitor.getItemList(); + if (CollUtil.isNotEmpty(visitor.getItemList())) { + for (Visitor item : itemList) { item.setParentId(visitor.getId()); item.setSource(Constants.ONE); item.setUserId(visitor.getUserId()); @@ -319,52 +390,38 @@ public class VisitorController extends BaseController { item.setStartTime(visitor.getStartTime()); item.setEndTime(visitor.getEndTime()); item.setMatter(visitor.getMatter()); - item.setExamineState(ExamineEnum.IN_REVIEW.getCode()); item.setCreateTime(visitor.getCreateTime()); item.setStartTime(visitor.getStartTime()); item.setEndTime(visitor.getEndTime()); - visitors.add(item); + item.setVisitorType(visitor.getVisitorType()); + item.setVisitingUnit(visitor.getVisitingUnit()); + item.setUserName(visitor.getUserName()); + visitorService.insertVisitor(item); } } - List phones = visitors.stream().map(Visitor::getPhone).collect(Collectors.toList()); - if (visitorService.queryVisitorByIdCount(phones) > 0) { - throw new ServiceException("手机号已存在访客预约信息"); - } - - List idcards = visitors.stream().map(Visitor::getIdcard).collect(Collectors.toList()); - if (visitorService.queryVisitorByCardCount(idcards) > 0) { - throw new ServiceException("访客中存在已预约访客"); - } - - // 校验图片 -// checkPhoto(visitor.getAvatar(), visitor.getName()); - - log.info("新增访客信息:{}", visitors); - for (Visitor visitor1 : visitors) { - visitorService.insertVisitor(visitor1); - } - // 保存附件 if(!CollectionUtils.isEmpty(visitor.getFileList())) { saveSysFile(visitor.getFileList(), String.valueOf(visitor.getId())); } - // 审核通知企微发送消息(小程序来源) -// String appletLink = getAppletLink(String.valueOf(visitor.getId()), "pages/visitor/visitor/examineIndex"); - SysPeople sysPeople = sysPeopleService.selectSysPeopleByUserId(visitor.getUserId()); -// log.info("审核通知链接:{}", appletLink); -// sendWeCom(sysPeople.getPhone(), appletLink + " --访客姓名:" + visitor.getName()); + String content = getContent(visitor, itemList); - // 访客审核 -// SysBranch sysBranch = sysBranchService.selectSysBranchById(visitor.getDeptId()); -// if(sysBranch != null && Constants.ZERO.equals(sysBranch.getIsExamine())) { -// VisVisitorExamine examine = new VisVisitorExamine(); -// examine.setExamine(Constants.ZERO); -// visitor.setExamine(examine); -// updateVisitorExamine(visitor); -// } - return toAjax(true); + // 审核通知企微发送消息(小程序来源) + SysPeople sysPeople = sysPeopleService.selectSysPeopleByUserId(visitor.getUserId()); + String url = getExamineUrl(String.valueOf(visitor.getId()), sysPeople.getPhone()); + log.info("add发送审核链接:{}", url); + //发送钉钉信息 +// asyncsendV2(sysPeople.getPhone(), "text", content + url); + + //发送企微信息 + try { +// sendWeCom(sysPeople.getPhone(), url + " --访客姓名:" + visitor.getName()); + } catch (Exception e) { + log.error("访客add-sendWeCom异常:{}", e.getMessage()); + } + + return toAjax(i); } /** @@ -399,6 +456,61 @@ public class VisitorController extends BaseController { return PHONE_NUMBER_PATTERN.matcher(number).matches(); } + /** + * 获取审核链接 + * + * @return + */ + public String getExamineUrl(String id, String telephone) { + //生成8位短参作为缓存key + String code = UuidUtil.getShortUuid(); + try { + while (redisService.hasKey(code)) { + code = UuidUtil.getShortUuid(); + } + redisService.setCacheObject(CacheConstants.VISITOR_SMS_CODE + code, id + "&" + telephone, 30L, TimeUnit.DAYS); + } catch (Exception e) { + throw new ServiceException("缓存数据异常:" + e.getMessage()); + } + return "https://fk.xyxaks.cn/h5/?c=" + code; + } + + + /** + * 组织链接内容(申请人&随访人基本信息) + * + * @return + */ + public String getContent(Visitor visitor, List itemList) { + String matterName = ""; + if (StringUtils.isNotBlank(visitor.getMatter())) { + matterName = MatterEnum.getByCode(visitor.getMatter()); + } + String startTime = DateUtil.format(visitor.getStartTime(), DatePattern.NORM_DATETIME_FORMATTER); + String endTime = DateUtil.format(visitor.getEndTime(), DatePattern.NORM_DATETIME_FORMATTER); + StringBuilder sb = new StringBuilder(); + sb.append("收到新的访客申请:").append(matterName).append("\n"); + //面试 + if (StringUtils.equals(visitor.getMatter(), MatterEnum.INTERVIEW.getCode())) { + SysBranch sysBranch = sysBranchService.selectSysBranchById(visitor.getDeptId()); + sb.append("面试公司:").append(sysBranch.getName()).append("\n"); + } else {//访客 + sb.append("来访公司:").append(visitor.getVisitingUnit() == null ? "用户未填写" : visitor.getVisitingUnit()).append("\n"); + } + sb.append("申请人:").append(visitor.getName()).append("\n"); + sb.append("申请人联系方式:").append(visitor.getPhone() == null ? "用户未填写" : visitor.getPhone()).append("\n"); + sb.append("预约申请时间:").append(startTime).append("至").append(endTime).append("\n"); + if (CollUtil.isNotEmpty(itemList)) { + for (Visitor item : itemList) { + sb.append("随访人:").append(item.getName()).append("\n"); + sb.append("随访人联系方式:").append(item.getPhone() == null ? "未填写" : item.getPhone()).append("\n"); + } + } + sb.append("点击链接进行审核:"); + log.info("getContent:{}", JSON.toJSONString(sb)); + return sb.toString(); + } + /** * 钉工牌消息通知 */ @@ -743,6 +855,132 @@ public class VisitorController extends BaseController { return toAjax(visitorService.updateVisitor(visitor)); } + + /** + * 流程审核 + */ + @Log(title = "流程审核", businessType = BusinessType.UPDATE) + @PostMapping("/approve") + @Transactional + public AjaxResult approve(@RequestBody Visitor visitor) { + log.info("流程审核入参 {}", JSON.toJSONString(visitor)); + try { + String telephone = StringUtils.isBlank(visitor.getTelephone()) ? "1" : visitor.getTelephone(); + Boolean lock = redisService.lock(APPROVE_KEY, telephone, 60 * 5, TimeUnit.SECONDS); + if (!lock) { + log.error("approve-审核人员正在审核中"); + return error("正在审核中"); + } + List record = visitorService.querySysManageRecord(visitor.getUserId()); + if (CollectionUtils.isEmpty(record)) { + throw new RuntimeException("被访人未授权通行"); + } + + //查询当前审核人基本信息 + SysPeople sysPeople = sysPeopleService.queryPeopleName(telephone, null); + visitor.setUserId(sysPeople.getId()); + visitor.setReviewer(String.valueOf(sysPeople.getId())); + + //查询当前访客信息 + Visitor visitor1 = visitorService.selectVisitorSimpleById(visitor.getId()); + visitor.setCurrentNode(visitor1.getCurrentNode() + 1); + + //赋值公共字段 + VisVisitorExamine examine = visitor.getExamine(); + examine.setVisitorId(visitor.getId()); + visitor.setState(examine.getExamine()); + + //审核通过 + if(Constants.ZERO.equals(examine.getExamine())) { + //被访人审核 + if (visitor1.getCurrentNode() == 1) { + visitor.setNextStepReviewer(visitor.getReviewer2()); + + List list = new ArrayList<>(); + Visitor visitor2 = new Visitor(); + visitor2.setId(visitor.getId()); + visitor2.setReviewer(String.valueOf(sysPeople.getId())); + visitor2.setState(ExamineEnum.PASSED.getCode()); + list.add(visitor2); + Visitor visitor3 = new Visitor(); + visitor3.setId(visitor.getId()); + visitor3.setState(ExamineEnum.IN_REVIEW.getCode()); + visitor3.setReviewer(visitor.getReviewer2()); + list.add(visitor3); + Visitor visitor4 = new Visitor(); + visitor4.setId(visitor.getId()); + visitor4.setState(ExamineEnum.IN_REVIEW.getCode()); + visitor4.setReviewer(visitor.getReviewer3()); + list.add(visitor4); + //保存审核环节表 + visitorService.saveVisitorReviewProcessList(list); + } + //二级审核人审核 + else if (visitor1.getCurrentNode() == 2) { + visitor.setNextStepReviewer(visitor.getReviewer3()); + visitorService.updateVisitorReviewProcess(visitor); + } + //如果有下一级审核人员,发送钉钉,企微审核消息链接 + if (StrUtil.isNotBlank(visitor.getNextStepReviewer())) { + //查询下一节点审核人信息 + SysPeople nextPeople = sysPeopleService.selectSysPeopleById(Long.parseLong(visitor.getNextStepReviewer())); + + //查询随访人员信息 + Visitor visitor2 = new Visitor(); + visitor2.setParentId(visitor.getId()); + List itemList = visitorService.selectVisitorItemList(visitor2); + String content = getContent(visitor1, itemList); + String url = getExamineUrl(String.valueOf(visitor.getId()), nextPeople.getPhone()); + log.info("approve发送审核链接:{}", url); + String str = content + url; +// asyncsendV2(nextPeople.getPhone(), "text", str); + log.info("发送钉钉结束:{}", nextPeople.getPhone()); + } else {//最后一级审核 + visitor.setExamineState(examine.getExamine()); + //保存审核历史表 + examine.setRejectReason(visitor.getRejectReason()); + visVisitorExamineService.insertVisVisitorExamine(examine); + + //修改环节状态 + visitorService.updateVisitorReviewProcess(visitor); + + // 同意后,给被访人和访客们发送审核结束短信 + Visitor visitor2 = new Visitor(); + visitor2.setParentId(visitor.getId()); + List itemList = visitorService.selectVisitorItemList(visitor2); + + } + } + //审核拒绝 + if (Constants.ONE.equals(examine.getExamine())) { + visitor.setExamineState(examine.getExamine()); + //保存审核历史表 + examine.setRejectReason(visitor.getRejectReason()); + visVisitorExamineService.insertVisVisitorExamine(examine); + + try { +// sendWeCom(telephone, visitor.getName() + "的访客审核已驳回"); + } catch (Exception e) { + log.error("访客approve-sendWeCom驳回异常:{}", e.getMessage()); + } + // 申请人发送短信(审核不通过) +// sendMessage(visitor.getPhone(), "1", smsProperties.getTemplate3()); + + } + + visitorService.approve(visitor); + + return toAjax(true); + } catch (Exception e) { + log.error("审核异常:{}", e.getMessage()); + return toAjax(false); + }finally { + redisService.deleteObject(APPROVE_KEY); + } + } + + + /** * 被访人审核 */ @@ -822,10 +1060,10 @@ public class VisitorController extends BaseController { if("7529".equals(people.getPosition())) { visitor.setPosition("8121"); } - String string = visitorService.queryReviewProcess(visitor); + Visitor visitor5 = visitorService.queryReviewProcess(visitor); visitor.setNextStepReviewer(StringUtils.isNotEmpty(visitor.getReviewer2()) ? visitor.getReviewer2() : visitor.getReviewer3()); - if(StringUtils.isNotEmpty(string)) { - visitor.setNextStepReviewer(string); + if(StringUtils.isNotEmpty(visitor5.getReviewer())) { + visitor.setNextStepReviewer(visitor5.getReviewer()); } if(StringUtils.isEmpty(visitor.getNextStepReviewer())) { visitor.setNextStepReviewer(String.valueOf(visitor.getUserId())); @@ -890,7 +1128,7 @@ public class VisitorController extends BaseController { visitor.setState(examine.getExamine()); visitorService.updateVisitorReviewProcess(visitor); - OfficialAccountVo officialAccountVo = sysPeopleService.queryPeopleById(string); + OfficialAccountVo officialAccountVo = sysPeopleService.queryPeopleById(visitor5.getReviewer()); // 审核通知企微发送消息(小程序来源) String appletLink = getAppletLink(String.valueOf(visitor.getId()), "pages/visitor/visitor/examineIndex"); sendWeCom(officialAccountVo.getPhone(), appletLink + " --访客姓名:" + visitor.getName()); diff --git a/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/visitor/domain/VisVisitorExamine.java b/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/visitor/domain/VisVisitorExamine.java index cd55be7..7b4f6d4 100644 --- a/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/visitor/domain/VisVisitorExamine.java +++ b/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/visitor/domain/VisVisitorExamine.java @@ -61,8 +61,15 @@ passwordPermission 密码权限 */ private Long ruleId; + private String rejectReason; + public String getRejectReason() { + return rejectReason; + } + public void setRejectReason(String rejectReason) { + this.rejectReason = rejectReason; + } public void setId(Long id) { diff --git a/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/visitor/domain/Visitor.java b/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/visitor/domain/Visitor.java index e258841..0b739d0 100644 --- a/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/visitor/domain/Visitor.java +++ b/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/visitor/domain/Visitor.java @@ -201,6 +201,11 @@ public class Visitor extends BaseEntity { private List visitor; + /** + * 小程序审核链接的手机号 + **/ + private String telephone; + /** * 离开时间 */ @@ -270,4 +275,13 @@ public class Visitor extends BaseEntity { * 园区 */ private String park; + + /** 当前审批节点 */ + private Integer currentNode; + + /** + * 审核理由 + */ + private String rejectReason; + } diff --git a/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/visitor/mapper/VisitorMapper.java b/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/visitor/mapper/VisitorMapper.java index add1555..fa82ef3 100644 --- a/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/visitor/mapper/VisitorMapper.java +++ b/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/visitor/mapper/VisitorMapper.java @@ -228,7 +228,7 @@ public interface VisitorMapper void updateVisitorReviewProcess(Visitor visitor); - String queryReviewProcess(Visitor visitor); + Visitor queryReviewProcess(Visitor visitor); int queryVisitorReviewProcessCount(Long id); @@ -239,4 +239,10 @@ public interface VisitorMapper List selectAppVisitorList(Visitor visitor); List queryCode(List collect); + + void updateVisitorByParentId(Visitor updateVisitor); + + String selectRecordsByPhone(Long id, String telephone); + + void saveVisitorReviewProcessList(@Param("list") List list); } diff --git a/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/visitor/service/IVisitorService.java b/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/visitor/service/IVisitorService.java index 5101f17..1201f7f 100644 --- a/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/visitor/service/IVisitorService.java +++ b/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/visitor/service/IVisitorService.java @@ -244,9 +244,17 @@ public interface IVisitorService void updateVisitorReviewProcess(Visitor visitor); - String queryReviewProcess(Visitor visitor); + Visitor queryReviewProcess(Visitor visitor); int queryVisitorReviewProcessCount(Long id); List selectAppVisitorList(Visitor visitor); + + Visitor selectVisitorSimpleById(Long id); + + void approve(Visitor visitor); + + String selectRecordsByPhone(Long id, String telephone); + + void saveVisitorReviewProcessList(List list); } diff --git a/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/visitor/service/impl/VisitorServiceImpl.java b/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/visitor/service/impl/VisitorServiceImpl.java index 62868e5..1fe0242 100644 --- a/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/visitor/service/impl/VisitorServiceImpl.java +++ b/dcsoft-modules/dcsoft-system/src/main/java/com/dcsoft/system/visitor/service/impl/VisitorServiceImpl.java @@ -1,13 +1,17 @@ package com.dcsoft.system.visitor.service.impl; import com.dcsoft.common.core.constant.Constants; +import com.dcsoft.common.core.constant.SecurityConstants; import com.dcsoft.common.core.domain.R; +import com.dcsoft.common.core.enums.ExamineEnum; import com.dcsoft.common.core.exception.ServiceException; import com.dcsoft.common.core.utils.CollUtil; import com.dcsoft.common.core.web.page.TableDataInfoPage; import com.dcsoft.common.datascope.annotation.DataScope; +import com.dcsoft.common.security.utils.SecurityUtils; import com.dcsoft.system.api.RemoteFileService; import com.dcsoft.system.api.domain.SysFile; +import com.dcsoft.system.api.model.LoginUser; import com.dcsoft.system.domain.SysBlackList; import com.dcsoft.system.domain.SysBranch; import com.dcsoft.system.domain.SysManageRecord; @@ -31,10 +35,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; -import java.util.Arrays; -import java.util.Collections; -import java.util.Date; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; import static com.dcsoft.common.core.utils.PageUtils.startPage; @@ -63,6 +64,8 @@ public class VisitorServiceImpl implements IVisitorService { @Value("${system.type}") public String systemType; + @Value("${qd.url:http://}") + public String qdUrl; /** * 卡权限创建接口 */ @@ -138,6 +141,8 @@ public class VisitorServiceImpl implements IVisitorService { */ @Override public int insertVisitor(Visitor visitor) { + visitor.setExamineState(ExamineEnum.IN_REVIEW.getCode()); + visitor.setCurrentNode(1); return visitorMapper.insertVisitor(visitor); } @@ -615,6 +620,49 @@ public class VisitorServiceImpl implements IVisitorService { } } + + /** + * 审批 + * + * @param visitor + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void approve(Visitor visitor) { + + //保存审核记录表 + visitorMapper.saveVisitorAuditRecords(visitor); + + // 审核同意 + if (Constants.ZERO.equals(visitor.getExamineState())) { + // 保存审核二维码地址信息 + CheckCodeVo codeVo = new CheckCodeVo(); + codeVo.setCode(qdUrl + visitor.getId() + "&time=" + new Date().getTime()); + codeVo.setVisitorId(String.valueOf(visitor.getId())); + String replace = UUID.randomUUID().toString().replace("-", ""); + codeVo.setId(replace); + if (StringUtils.isNotEmpty(visitor.getCheckCodeId())) { + codeVo.setId(visitor.getCheckCodeId()); + } + + if (visitor != null) { + codeVo.setStartTime(visitor.getStartTime()); + codeVo.setEndTime(visitor.getEndTime()); + } + saveVisCheckCode(codeVo); + } + + visitorMapper.updateVisitor(visitor); + + //修改随访人员信息 + Visitor updateVisitor = new Visitor(); + updateVisitor.setParentId(visitor.getId()); + updateVisitor.setExamineState(visitor.getExamineState()); + visitorMapper.updateVisitorByParentId(updateVisitor); + + } + /** * 保存审核记录 * @@ -662,7 +710,7 @@ public class VisitorServiceImpl implements IVisitorService { } @Override - public String queryReviewProcess(Visitor visitor) { + public Visitor queryReviewProcess(Visitor visitor) { return visitorMapper.queryReviewProcess(visitor); } @@ -703,4 +751,22 @@ public class VisitorServiceImpl implements IVisitorService { } + @Override + public Visitor selectVisitorSimpleById(Long id) { + Visitor visitor = visitorMapper.selectVisitorById(id); + if (visitor == null) { + return new Visitor(); + } + return visitor; + } + + @Override + public String selectRecordsByPhone(Long id, String telephone) { + return visitorMapper.selectRecordsByPhone(id, telephone); + } + + @Override + public void saveVisitorReviewProcessList(List list) { + visitorMapper.saveVisitorReviewProcessList(list); + } } diff --git a/dcsoft-modules/dcsoft-system/src/main/resources/mapper/system/visitor/VisitorMapper.xml b/dcsoft-modules/dcsoft-system/src/main/resources/mapper/system/visitor/VisitorMapper.xml index 7ff6983..24ad50a 100644 --- a/dcsoft-modules/dcsoft-system/src/main/resources/mapper/system/visitor/VisitorMapper.xml +++ b/dcsoft-modules/dcsoft-system/src/main/resources/mapper/system/visitor/VisitorMapper.xml @@ -40,6 +40,10 @@ + + + + @@ -105,7 +109,11 @@ vv.position visitorPosition, vv.visiting_unit, vv.reviewer2, - vv.reviewer3 + vv.reviewer3, + vv.current_node, + vv.examine_state, + vv.visitor_type, + vv.park from vis_visitor vv left join vis_visitor_examine vve on vv.id = vve.visitor_id left join sys_branch sb on vv.dept_id = sb.id @@ -198,7 +206,11 @@ vv1.position visitorPosition, vv1.visiting_unit visitingUnit, vv1.reviewer2, - vv1.reviewer3 + vv1.reviewer3, + vv1.examine_state, + vv1.visitor_type, + vv1.current_node, + vv1.park from vis_visitor_review_process vvrp left join vis_visitor vv1 on vv1.id = vvrp.visitor_id left join sys_people s on vvrp.reviewer = s.id @@ -291,6 +303,7 @@ visitor_type, park, user_name, + current_node, @@ -327,6 +340,7 @@ #{visitorType}, #{park}, #{userName}, + #{currentNode}, @@ -355,8 +369,22 @@ - insert into vis_visitor_review_process (id, visitor_id, reviewer, type) - VALUES (REPLACE(uuid(), '-', ''), #{id}, #{reviewer}, #{type}) + insert into vis_visitor_review_process (id, visitor_id, reviewer, type + + ,state + + ) + VALUES (REPLACE(uuid(), '-', ''), #{id}, #{reviewer}, #{type} + + ,#{state} + ) + + + insert into vis_visitor_review_process (id, visitor_id, reviewer, state) + VALUES + + (REPLACE(uuid(), '-', ''), #{i.id}, #{i.reviewer}, #{i.state}) + @@ -394,6 +422,8 @@ position = #{visitorPosition}, reviewer2 = #{reviewer2}, reviewer3 = #{reviewer3}, + examine_state = #{examineState}, + current_node = #{currentNode}, where id = #{id} @@ -477,6 +507,7 @@ id_card_address = #{idCardAddress}, visiting_unit = #{visitingUnit}, user_name = #{userName}, + current_node = #{currentNode}, where idcard = #{idcard} and out_time is null @@ -488,6 +519,46 @@ and reviewer = #{reviewer} + + update vis_visitor + + name = #{name}, + phone = #{phone}, + sex = #{sex}, + avatar = #{avatar}, + idcard = #{idcard}, + car_no = #{carNo}, + user_id = #{userId}, + dept_id = #{deptId}, + flag = #{flag}, + start_time = #{startTime}, + end_time = #{endTime}, + matter = #{matter}, + res = #{res}, + guid = #{guid}, + face_guid = #{faceGuid}, + remark = #{remark}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + parent_id = #{parentId}, + in_time = #{inTime}, + out_time = #{outTime}, + type = #{type}, + id_card_start_time = #{idCardStartTime}, + id_card_end_time = #{idCardEndTime}, + id_card_address = #{idCardAddress}, + visiting_unit = #{visitingUnit}, + user_name = #{userName}, + position = #{visitorPosition}, + reviewer2 = #{reviewer2}, + reviewer3 = #{reviewer3}, + examine_state = #{examineState}, + current_node = #{currentNode}, + + where parent_id = #{parentId} + delete @@ -794,8 +865,18 @@ order by vvar.created_time desc limit 1 - + select + reviewer, + state + from vis_visitor_review_process + where visitor_id = #{id} + + and type = #{position} + + + and reviewer = #{reviewer} + @@ -828,16 +899,13 @@ vv.parent_id from vis_visitor vv left join vis_visitor vv1 on vv.parent_id = vv1.id where vv.parent_id is not null - - - and vv1.examine_state = '0' - - - and vv1.examine_state = #{examineState} - - and vv.phone = #{createBy} - and vv1.park = #{park} + + and vv1.examine_state = #{examineState} + + + and vv1.park = #{park} + @@ -881,14 +949,9 @@ vv.visiting_unit, vv.reviewer2, vv.reviewer3, - vv.instance_id, vv.examine_state, vv.visitor_type, - vv.park, - vv.current_node, - vv.user_task_count, - vv.procdef_id, - vv.proc_id + vv.park from vis_visitor vv left join vis_visitor_examine vve on vv.id = vve.visitor_id left join sys_branch sb on vv.dept_id = sb.id @@ -924,4 +987,15 @@ and vv.examine_state = 0 +