兴安访客小程序访客改造

This commit is contained in:
zc
2025-06-10 09:33:07 +08:00
parent 2d23219a0f
commit ccc1f08366
13 changed files with 603 additions and 95 deletions

View File

@@ -85,6 +85,7 @@ public class TokenController
String s = RsaUiUtils.decryptByPrivateKey(form.getEncrypt()); String s = RsaUiUtils.decryptByPrivateKey(form.getEncrypt());
JSONObject jsonObject = JSONObject.parseObject(s); JSONObject jsonObject = JSONObject.parseObject(s);
userInfo = sysLoginService.login(jsonObject.getString("username"), jsonObject.getString("password")); userInfo = sysLoginService.login(jsonObject.getString("username"), jsonObject.getString("password"));
// userInfo = sysLoginService.login(form.getUsername(), form.getPassword());
} }
// 获取登录token // 获取登录token
return R.ok(tokenService.createToken(userInfo)); return R.ok(tokenService.createToken(userInfo));

View File

@@ -356,15 +356,16 @@ public class SysLoginService
//生成六位验证码 //生成六位验证码
String smsCode = SmsUtils.generateSmsCode(); String smsCode = SmsUtils.generateSmsCode();
log.info("{}短信二维码{}", register.getPhone(), smsCode);
SmsDTO smsDTO = new SmsDTO(); SmsDTO smsDTO = new SmsDTO();
smsDTO.setTemplateId(smsProperties.getTemplate11()); smsDTO.setTemplateId(smsProperties.getTemplate11());
smsDTO.setCaptcha(smsCode); smsDTO.setCaptcha(smsCode);
smsDTO.setPhone(register.getPhone()); smsDTO.setPhone(register.getPhone());
AjaxResult ajaxResult = remoteUserService.sendMessage(smsDTO, SecurityConstants.INNER); // AjaxResult ajaxResult = remoteUserService.sendMessage(smsDTO, SecurityConstants.INNER);
if (!ajaxResult.isSuccess()) { // if (!ajaxResult.isSuccess()) {
throw new ServiceException(ajaxResult.get("msg").toString()); // throw new ServiceException(ajaxResult.get("msg").toString());
} // }
//缓存次数 //缓存次数
int i = 1; int i = 1;

View File

@@ -72,4 +72,6 @@ public class CacheConstants
public static final String WEIXIN_URL_LINK = "weixin_url_link"; public static final String WEIXIN_URL_LINK = "weixin_url_link";
public static final String WE_COM_TOKEN = "we_com_token:"; public static final String WE_COM_TOKEN = "we_com_token:";
public static final String VISITOR_SMS_CODE = "visitor_sms_code:";
} }

View File

@@ -1,11 +1,7 @@
package com.dcsoft.common.redis.service; package com.dcsoft.common.redis.service;
import java.util.Collection; import lombok.extern.slf4j.Slf4j;
import java.util.Iterator; import org.apache.poi.ss.formula.functions.T;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundSetOperations; import org.springframework.data.redis.core.BoundSetOperations;
import org.springframework.data.redis.core.HashOperations; 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.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.*;
import java.util.concurrent.TimeUnit;
/** /**
* spring redis 工具类 * spring redis 工具类
* *
* @author dcsoft * @author dcsoft
**/ **/
@SuppressWarnings(value = { "unchecked", "rawtypes" }) @SuppressWarnings(value = { "unchecked", "rawtypes" })
@Component @Component
@Slf4j
public class RedisService public class RedisService
{ {
@Autowired @Autowired
public RedisTemplate redisTemplate; public RedisTemplate redisTemplate;
private static final long DEFAULT_TIMEOUT = 60 * 60 * 24 * 7;
/** /**
* 缓存基本的对象Integer、String、实体类等 * 缓存基本的对象Integer、String、实体类等
* *
@@ -36,6 +38,43 @@ public class RedisService
redisTemplate.opsForValue().set(key, value); 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、实体类等 * 缓存基本的对象Integer、String、实体类等
* *

View File

@@ -224,6 +224,18 @@ public class SysRoleController extends BaseController
return toAjax(roleService.insertAuthUsers(roleId, userIds)); 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));
}
/** /**
* 获取对应角色部门树列表 * 获取对应角色部门树列表
*/ */

View File

@@ -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("-", "");
}
}

View File

@@ -1,11 +1,16 @@
package com.dcsoft.system.visitor.controller; 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.HttpException;
import cn.hutool.http.HttpUtil; import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.dcsoft.common.core.constant.CacheConstants; import com.dcsoft.common.core.constant.CacheConstants;
import com.dcsoft.common.core.constant.Constants; 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.ExamineEnum;
import com.dcsoft.common.core.enums.MatterEnum; import com.dcsoft.common.core.enums.MatterEnum;
import com.dcsoft.common.core.enums.exception.CommonExceptionEnum; 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.ISysApiService;
import com.dcsoft.system.uniubi.service.ISysSdkService; import com.dcsoft.system.uniubi.service.ISysSdkService;
import com.dcsoft.system.utils.FileUtils; 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.CheckCodeVo;
import com.dcsoft.system.visitor.domain.VisVisitorExamine; import com.dcsoft.system.visitor.domain.VisVisitorExamine;
import com.dcsoft.system.visitor.domain.Visitor; 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 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); 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<String, String> 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<Visitor> visitors = new ArrayList<>(); List<String> phones = new ArrayList<>();
visitors.add(visitor); List<String> idcards = new ArrayList<>();
if (!CollUtil.isEmpty(visitor.getItemList())) { if (CollUtil.isNotEmpty(visitor.getItemList())) {
for (Visitor item : visitor.getItemList()) { phones = visitor.getItemList().stream().map(Visitor::getPhone).collect(Collectors.toList());
if (!validatePhoneNumber(item.getPhone())) { idcards = visitor.getItemList().stream().map(Visitor::getIdcard).collect(Collectors.toList());
throw new ServiceException("您输入的随访人员手机号格式不正确"); }
} 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<Visitor> itemList = visitor.getItemList();
if (CollUtil.isNotEmpty(visitor.getItemList())) {
for (Visitor item : itemList) {
item.setParentId(visitor.getId()); item.setParentId(visitor.getId());
item.setSource(Constants.ONE); item.setSource(Constants.ONE);
item.setUserId(visitor.getUserId()); item.setUserId(visitor.getUserId());
@@ -319,52 +390,38 @@ public class VisitorController extends BaseController {
item.setStartTime(visitor.getStartTime()); item.setStartTime(visitor.getStartTime());
item.setEndTime(visitor.getEndTime()); item.setEndTime(visitor.getEndTime());
item.setMatter(visitor.getMatter()); item.setMatter(visitor.getMatter());
item.setExamineState(ExamineEnum.IN_REVIEW.getCode());
item.setCreateTime(visitor.getCreateTime()); item.setCreateTime(visitor.getCreateTime());
item.setStartTime(visitor.getStartTime()); item.setStartTime(visitor.getStartTime());
item.setEndTime(visitor.getEndTime()); item.setEndTime(visitor.getEndTime());
visitors.add(item); item.setVisitorType(visitor.getVisitorType());
item.setVisitingUnit(visitor.getVisitingUnit());
item.setUserName(visitor.getUserName());
visitorService.insertVisitor(item);
} }
} }
List<String> phones = visitors.stream().map(Visitor::getPhone).collect(Collectors.toList());
if (visitorService.queryVisitorByIdCount(phones) > 0) {
throw new ServiceException("手机号已存在访客预约信息");
}
List<String> 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())) { if(!CollectionUtils.isEmpty(visitor.getFileList())) {
saveSysFile(visitor.getFileList(), String.valueOf(visitor.getId())); saveSysFile(visitor.getFileList(), String.valueOf(visitor.getId()));
} }
// 审核通知企微发送消息(小程序来源) String content = getContent(visitor, itemList);
// 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());
// 访客审核 // 审核通知企微发送消息(小程序来源)
// SysBranch sysBranch = sysBranchService.selectSysBranchById(visitor.getDeptId()); SysPeople sysPeople = sysPeopleService.selectSysPeopleByUserId(visitor.getUserId());
// if(sysBranch != null && Constants.ZERO.equals(sysBranch.getIsExamine())) { String url = getExamineUrl(String.valueOf(visitor.getId()), sysPeople.getPhone());
// VisVisitorExamine examine = new VisVisitorExamine(); log.info("add发送审核链接{}", url);
// examine.setExamine(Constants.ZERO); //发送钉钉信息
// visitor.setExamine(examine); // asyncsendV2(sysPeople.getPhone(), "text", content + url);
// updateVisitorExamine(visitor);
// } //发送企微信息
return toAjax(true); 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 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<Visitor> 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)); 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<SysManageRecord> 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<Visitor> 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<Visitor> 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<Visitor> 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())) { if("7529".equals(people.getPosition())) {
visitor.setPosition("8121"); visitor.setPosition("8121");
} }
String string = visitorService.queryReviewProcess(visitor); Visitor visitor5 = visitorService.queryReviewProcess(visitor);
visitor.setNextStepReviewer(StringUtils.isNotEmpty(visitor.getReviewer2()) ? visitor.getReviewer2() : visitor.getReviewer3()); visitor.setNextStepReviewer(StringUtils.isNotEmpty(visitor.getReviewer2()) ? visitor.getReviewer2() : visitor.getReviewer3());
if(StringUtils.isNotEmpty(string)) { if(StringUtils.isNotEmpty(visitor5.getReviewer())) {
visitor.setNextStepReviewer(string); visitor.setNextStepReviewer(visitor5.getReviewer());
} }
if(StringUtils.isEmpty(visitor.getNextStepReviewer())) { if(StringUtils.isEmpty(visitor.getNextStepReviewer())) {
visitor.setNextStepReviewer(String.valueOf(visitor.getUserId())); visitor.setNextStepReviewer(String.valueOf(visitor.getUserId()));
@@ -890,7 +1128,7 @@ public class VisitorController extends BaseController {
visitor.setState(examine.getExamine()); visitor.setState(examine.getExamine());
visitorService.updateVisitorReviewProcess(visitor); 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"); String appletLink = getAppletLink(String.valueOf(visitor.getId()), "pages/visitor/visitor/examineIndex");
sendWeCom(officialAccountVo.getPhone(), appletLink + " --访客姓名:" + visitor.getName()); sendWeCom(officialAccountVo.getPhone(), appletLink + " --访客姓名:" + visitor.getName());

View File

@@ -61,8 +61,15 @@ passwordPermission 密码权限 */
private Long ruleId; private Long ruleId;
private String rejectReason;
public String getRejectReason() {
return rejectReason;
}
public void setRejectReason(String rejectReason) {
this.rejectReason = rejectReason;
}
public void setId(Long id) public void setId(Long id)
{ {

View File

@@ -201,6 +201,11 @@ public class Visitor extends BaseEntity {
private List<Visitor> visitor; private List<Visitor> visitor;
/**
* 小程序审核链接的手机号
**/
private String telephone;
/** /**
* 离开时间 * 离开时间
*/ */
@@ -270,4 +275,13 @@ public class Visitor extends BaseEntity {
* 园区 * 园区
*/ */
private String park; private String park;
/** 当前审批节点 */
private Integer currentNode;
/**
* 审核理由
*/
private String rejectReason;
} }

View File

@@ -228,7 +228,7 @@ public interface VisitorMapper
void updateVisitorReviewProcess(Visitor visitor); void updateVisitorReviewProcess(Visitor visitor);
String queryReviewProcess(Visitor visitor); Visitor queryReviewProcess(Visitor visitor);
int queryVisitorReviewProcessCount(Long id); int queryVisitorReviewProcessCount(Long id);
@@ -239,4 +239,10 @@ public interface VisitorMapper
List<Visitor> selectAppVisitorList(Visitor visitor); List<Visitor> selectAppVisitorList(Visitor visitor);
List<CheckCodeVo> queryCode(List<Long> collect); List<CheckCodeVo> queryCode(List<Long> collect);
void updateVisitorByParentId(Visitor updateVisitor);
String selectRecordsByPhone(Long id, String telephone);
void saveVisitorReviewProcessList(@Param("list") List<Visitor> list);
} }

View File

@@ -244,9 +244,17 @@ public interface IVisitorService
void updateVisitorReviewProcess(Visitor visitor); void updateVisitorReviewProcess(Visitor visitor);
String queryReviewProcess(Visitor visitor); Visitor queryReviewProcess(Visitor visitor);
int queryVisitorReviewProcessCount(Long id); int queryVisitorReviewProcessCount(Long id);
List<Visitor> selectAppVisitorList(Visitor visitor); List<Visitor> selectAppVisitorList(Visitor visitor);
Visitor selectVisitorSimpleById(Long id);
void approve(Visitor visitor);
String selectRecordsByPhone(Long id, String telephone);
void saveVisitorReviewProcessList(List<Visitor> list);
} }

View File

@@ -1,13 +1,17 @@
package com.dcsoft.system.visitor.service.impl; package com.dcsoft.system.visitor.service.impl;
import com.dcsoft.common.core.constant.Constants; 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.domain.R;
import com.dcsoft.common.core.enums.ExamineEnum;
import com.dcsoft.common.core.exception.ServiceException; import com.dcsoft.common.core.exception.ServiceException;
import com.dcsoft.common.core.utils.CollUtil; import com.dcsoft.common.core.utils.CollUtil;
import com.dcsoft.common.core.web.page.TableDataInfoPage; import com.dcsoft.common.core.web.page.TableDataInfoPage;
import com.dcsoft.common.datascope.annotation.DataScope; 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.RemoteFileService;
import com.dcsoft.system.api.domain.SysFile; 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.SysBlackList;
import com.dcsoft.system.domain.SysBranch; import com.dcsoft.system.domain.SysBranch;
import com.dcsoft.system.domain.SysManageRecord; import com.dcsoft.system.domain.SysManageRecord;
@@ -31,10 +35,7 @@ import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.net.URLDecoder; import java.net.URLDecoder;
import java.util.Arrays; import java.util.*;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.dcsoft.common.core.utils.PageUtils.startPage; import static com.dcsoft.common.core.utils.PageUtils.startPage;
@@ -63,6 +64,8 @@ public class VisitorServiceImpl implements IVisitorService {
@Value("${system.type}") @Value("${system.type}")
public String systemType; public String systemType;
@Value("${qd.url:http://}")
public String qdUrl;
/** /**
* 卡权限创建接口 * 卡权限创建接口
*/ */
@@ -138,6 +141,8 @@ public class VisitorServiceImpl implements IVisitorService {
*/ */
@Override @Override
public int insertVisitor(Visitor visitor) { public int insertVisitor(Visitor visitor) {
visitor.setExamineState(ExamineEnum.IN_REVIEW.getCode());
visitor.setCurrentNode(1);
return visitorMapper.insertVisitor(visitor); 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 @Override
public String queryReviewProcess(Visitor visitor) { public Visitor queryReviewProcess(Visitor visitor) {
return visitorMapper.queryReviewProcess(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<Visitor> list) {
visitorMapper.saveVisitorReviewProcessList(list);
}
} }

View File

@@ -40,6 +40,10 @@
<result property="visitingUnit" column="visiting_unit"/> <result property="visitingUnit" column="visiting_unit"/>
<result property="reviewer2" column="reviewer2"/> <result property="reviewer2" column="reviewer2"/>
<result property="reviewer3" column="reviewer3"/> <result property="reviewer3" column="reviewer3"/>
<result property="examineState" column="examine_state"/>
<result property="park" column="park"/>
<result property="visitorType" column="visitor_type"/>
<result property="currentNode" column="current_node"/>
<association property="branch" column="dept_id" javaType="SysBranch" resultMap="branchResult"/> <association property="branch" column="dept_id" javaType="SysBranch" resultMap="branchResult"/>
<association property="people" column="user_id" javaType="SysPeople" resultMap="peopleResult"/> <association property="people" column="user_id" javaType="SysPeople" resultMap="peopleResult"/>
<association property="examine" column="id" javaType="VisVisitorExamine" resultMap="examineResult"/> <association property="examine" column="id" javaType="VisVisitorExamine" resultMap="examineResult"/>
@@ -105,7 +109,11 @@
vv.position visitorPosition, vv.position visitorPosition,
vv.visiting_unit, vv.visiting_unit,
vv.reviewer2, vv.reviewer2,
vv.reviewer3 vv.reviewer3,
vv.current_node,
vv.examine_state,
vv.visitor_type,
vv.park
from vis_visitor vv from vis_visitor vv
left join vis_visitor_examine vve on vv.id = vve.visitor_id left join vis_visitor_examine vve on vv.id = vve.visitor_id
left join sys_branch sb on vv.dept_id = sb.id left join sys_branch sb on vv.dept_id = sb.id
@@ -198,7 +206,11 @@
vv1.position visitorPosition, vv1.position visitorPosition,
vv1.visiting_unit visitingUnit, vv1.visiting_unit visitingUnit,
vv1.reviewer2, vv1.reviewer2,
vv1.reviewer3 vv1.reviewer3,
vv1.examine_state,
vv1.visitor_type,
vv1.current_node,
vv1.park
from vis_visitor_review_process vvrp from vis_visitor_review_process vvrp
left join vis_visitor vv1 on vv1.id = vvrp.visitor_id left join vis_visitor vv1 on vv1.id = vvrp.visitor_id
left join sys_people s on vvrp.reviewer = s.id left join sys_people s on vvrp.reviewer = s.id
@@ -291,6 +303,7 @@
<if test="visitorType != null">visitor_type,</if> <if test="visitorType != null">visitor_type,</if>
<if test="park != null">park,</if> <if test="park != null">park,</if>
<if test="userName != null">user_name,</if> <if test="userName != null">user_name,</if>
<if test="currentNode != null">current_node,</if>
</trim> </trim>
<trim prefix="values (" suffix=")" suffixOverrides=","> <trim prefix="values (" suffix=")" suffixOverrides=",">
@@ -327,6 +340,7 @@
<if test="visitorType != null">#{visitorType},</if> <if test="visitorType != null">#{visitorType},</if>
<if test="park != null">#{park},</if> <if test="park != null">#{park},</if>
<if test="userName != null">#{userName},</if> <if test="userName != null">#{userName},</if>
<if test="currentNode != null">#{currentNode},</if>
</trim> </trim>
</insert> </insert>
@@ -355,8 +369,22 @@
</foreach> </foreach>
</insert> </insert>
<insert id="saveVisitorReviewProcess"> <insert id="saveVisitorReviewProcess">
insert into vis_visitor_review_process (id, visitor_id, reviewer, type) insert into vis_visitor_review_process (id, visitor_id, reviewer, type
VALUES (REPLACE(uuid(), '-', ''), #{id}, #{reviewer}, #{type}) <if test="state != null and state != ''">
,state
</if>
)
VALUES (REPLACE(uuid(), '-', ''), #{id}, #{reviewer}, #{type}
<if test="state != null and state != ''">
,#{state}
</if>)
</insert>
<insert id="saveVisitorReviewProcessList">
insert into vis_visitor_review_process (id, visitor_id, reviewer, state)
VALUES
<foreach collection="list" item="i" index="index" separator=",">
(REPLACE(uuid(), '-', ''), #{i.id}, #{i.reviewer}, #{i.state})
</foreach>
</insert> </insert>
<update id="updateVisitor" parameterType="Visitor"> <update id="updateVisitor" parameterType="Visitor">
@@ -394,6 +422,8 @@
<if test="visitorPosition != null">position = #{visitorPosition},</if> <if test="visitorPosition != null">position = #{visitorPosition},</if>
<if test="reviewer2 != null">reviewer2 = #{reviewer2},</if> <if test="reviewer2 != null">reviewer2 = #{reviewer2},</if>
<if test="reviewer3 != null">reviewer3 = #{reviewer3},</if> <if test="reviewer3 != null">reviewer3 = #{reviewer3},</if>
<if test="examineState != null">examine_state = #{examineState},</if>
<if test="currentNode != null">current_node = #{currentNode},</if>
</trim> </trim>
where id = #{id} where id = #{id}
</update> </update>
@@ -477,6 +507,7 @@
<if test="idCardAddress != null">id_card_address = #{idCardAddress},</if> <if test="idCardAddress != null">id_card_address = #{idCardAddress},</if>
<if test="visitingUnit != null">visiting_unit = #{visitingUnit},</if> <if test="visitingUnit != null">visiting_unit = #{visitingUnit},</if>
<if test="userName != null">user_name = #{userName},</if> <if test="userName != null">user_name = #{userName},</if>
<if test="currentNode != null">current_node = #{currentNode},</if>
</trim> </trim>
where idcard = #{idcard} and out_time is null where idcard = #{idcard} and out_time is null
</update> </update>
@@ -488,6 +519,46 @@
and reviewer = #{reviewer} and reviewer = #{reviewer}
</if> </if>
</update> </update>
<update id="updateVisitorByParentId">
update vis_visitor
<trim prefix="SET" suffixOverrides=",">
<if test="name != null and name != ''">name = #{name},</if>
<if test="phone != null">phone = #{phone},</if>
<if test="sex != null">sex = #{sex},</if>
<if test="avatar != null">avatar = #{avatar},</if>
<if test="idcard != null">idcard = #{idcard},</if>
<if test="carNo != null">car_no = #{carNo},</if>
<if test="userId != null">user_id = #{userId},</if>
<if test="deptId != null">dept_id = #{deptId},</if>
<if test="flag != null">flag = #{flag},</if>
<if test="startTime != null">start_time = #{startTime},</if>
<if test="endTime != null">end_time = #{endTime},</if>
<if test="matter != null">matter = #{matter},</if>
<if test="res != null">res = #{res},</if>
<if test="guid != null">guid = #{guid},</if>
<if test="faceGuid != null">face_guid = #{faceGuid},</if>
<if test="remark != null">remark = #{remark},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="parentId != null">parent_id = #{parentId},</if>
<if test="inTime != null">in_time = #{inTime},</if>
<if test="outTime != null">out_time = #{outTime},</if>
<if test="type != null">type = #{type},</if>
<if test="idCardStartTime != null">id_card_start_time = #{idCardStartTime},</if>
<if test="idCardEndTime != null">id_card_end_time = #{idCardEndTime},</if>
<if test="idCardAddress != null">id_card_address = #{idCardAddress},</if>
<if test="visitingUnit != null">visiting_unit = #{visitingUnit},</if>
<if test="userName != null">user_name = #{userName},</if>
<if test="visitorPosition != null">position = #{visitorPosition},</if>
<if test="reviewer2 != null">reviewer2 = #{reviewer2},</if>
<if test="reviewer3 != null">reviewer3 = #{reviewer3},</if>
<if test="examineState != null">examine_state = #{examineState},</if>
<if test="currentNode != null">current_node = #{currentNode},</if>
</trim>
where parent_id = #{parentId}
</update>
<delete id="deleteVisitorById" parameterType="Long"> <delete id="deleteVisitorById" parameterType="Long">
delete delete
@@ -794,8 +865,18 @@
order by vvar.created_time desc order by vvar.created_time desc
limit 1 limit 1
</select> </select>
<select id="queryReviewProcess" resultType="java.lang.String"> <select id="queryReviewProcess" resultType="com.dcsoft.system.visitor.domain.Visitor">
select reviewer from vis_visitor_review_process where visitor_id = #{id} and type = #{position} select
reviewer,
state
from vis_visitor_review_process
where visitor_id = #{id}
<if test="position != null and position != ''">
and type = #{position}
</if>
<if test="reviewer != null and reviewer != ''">
and reviewer = #{reviewer}
</if>
</select> </select>
<select id="queryVisitorReviewProcessCount" resultType="java.lang.Integer"> <select id="queryVisitorReviewProcessCount" resultType="java.lang.Integer">
select sum(if(state is null, 1, 0)) state from vis_visitor_review_process where visitor_id = #{id} group by visitor_id select sum(if(state is null, 1, 0)) state from vis_visitor_review_process where visitor_id = #{id} group by visitor_id
@@ -805,21 +886,11 @@
select reviewer, select reviewer,
state, state,
sp.position type, sp.position type,
date_format(updated_time, '%Y-%m-%d %H:%i:%s') createdTime, date_format(created_time, '%Y-%m-%d %H:%i:%s') createdTime,
sp.name reviewerName sp.name reviewerName
from vis_visitor_review_process vvrp from vis_visitor_review_process vvrp
left join sys_people sp on vvrp.reviewer = sp.id and sp.del_flag = '0' left join sys_people sp on vvrp.reviewer = sp.id and sp.del_flag = '0'
where visitor_id = #{id} where visitor_id = #{id}
union all
select reviewer,
state,
sp.position type,
date_format(created_time, '%Y-%m-%d %H:%i:%s') createdTime,
sp.name reviewerName
from vis_visitor_audit_records vvar
left join sys_people sp on vvar.reviewer = sp.id and sp.del_flag = '0'
left join vis_visitor vv on vvar.visitor_id = vv.id
where visitor_id = #{id} and vvar.reviewer = vv.user_id
order by ifnull(createdTime, 'zzz') order by ifnull(createdTime, 'zzz')
</select> </select>
@@ -828,16 +899,13 @@
vv.parent_id vv.parent_id
from vis_visitor vv left join vis_visitor vv1 on vv.parent_id = vv1.id from vis_visitor vv left join vis_visitor vv1 on vv.parent_id = vv1.id
where vv.parent_id is not null where vv.parent_id is not null
<choose>
<when test="examineState != null and examineState == 3">
and vv1.examine_state = '0'
</when>
<when test="examineState != null and examineState != 3">
and vv1.examine_state = #{examineState}
</when>
</choose>
and vv.phone = #{createBy} and vv.phone = #{createBy}
and vv1.park = #{park} <if test="examineState != null and examineState != 3">
and vv1.examine_state = #{examineState}
</if>
<if test="park != null and park != ''">
and vv1.park = #{park}
</if>
</select> </select>
@@ -881,14 +949,9 @@
vv.visiting_unit, vv.visiting_unit,
vv.reviewer2, vv.reviewer2,
vv.reviewer3, vv.reviewer3,
vv.instance_id,
vv.examine_state, vv.examine_state,
vv.visitor_type, vv.visitor_type,
vv.park, vv.park
vv.current_node,
vv.user_task_count,
vv.procdef_id,
vv.proc_id
from vis_visitor vv from vis_visitor vv
left join vis_visitor_examine vve on vv.id = vve.visitor_id left join vis_visitor_examine vve on vv.id = vve.visitor_id
left join sys_branch sb on vv.dept_id = sb.id left join sys_branch sb on vv.dept_id = sb.id
@@ -924,4 +987,15 @@
</foreach> </foreach>
and vv.examine_state = 0 and vv.examine_state = 0
</select> </select>
<select id="selectRecordsByPhone" resultType="java.lang.String">
SELECT
r.state
FROM
`vis_visitor_audit_records` r
LEFT JOIN sys_people p ON r.reviewer = p.id
WHERE
r.visitor_id = #{id}
AND p.phone = #{telephone}
ORDER BY r.created_time desc LIMIT 1
</select>
</mapper> </mapper>