package com.wtkj.service.impl; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.wtkj.entity.FileShare; import com.wtkj.entity.Project; import com.wtkj.entity.ProjectAuth; import com.wtkj.entity.ProjectGroup; import com.wtkj.service.*; import com.wutong.file.entity.FileAttach; import com.wutong.file.feign.IFileClient; import lombok.AllArgsConstructor; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.redis.cache.BladeRedis; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.StringUtil; import org.springblade.system.entity.Dept; import org.springblade.system.feign.ISysClient; import org.springblade.system.user.entity.User; import org.springblade.system.user.feign.IUserClient; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.Duration; import java.util.ArrayList; import java.util.List; import static com.wtkj.config.MagicValue.ZERO; import static com.wtkj.config.NacosConfigValue.expireIn; import static com.wtkj.config.NacosConfigValue.scanCount; /** * @author Blizzard * @create at 2023-09-19 17:35 * @describe */ @AllArgsConstructor @Service public class QrcodeServiceImpl implements IQrcodeService { private final BladeRedis redis; private final IUserClient userClient; private final IProjectAuthService projectAuthService; private final IProjectGroupService projectGroupService; private final IProjectService projectService; private final IFileShareService fileShareService; private final IFileClient fileClient; private final ISysClient sysClient; @Override public JSONObject createDeptQrcode(Long deptId) { JSONObject res = new JSONObject(); String kv = IdWorker.getIdStr(); Long userId = AuthUtil.getUserId(); redis.setEx(kv, 0, Duration.ofSeconds(expireIn)); res.put("qrcodeId", kv); res.put("createUser", userId); res.put("deptId", deptId); return res; } @Override public boolean inviteToDept(String qrcodeId, Long createUser, Long deptId) { boolean flag = false; boolean exist = isExist(qrcodeId); Long userId = AuthUtil.getUserId(); //二维码可用前提下 if (exist) { //1.绑定机构 R rpc = userClient.bindUser(userId, deptId); //2.保存外部联系人 if (rpc.isSuccess()) { flag = rpc.getData(); } } return flag; } @Override public JSONObject scanInviteToDept(String qrcodeId, Long createUser, Long deptId) { JSONObject res = new JSONObject(); User user = null; Dept topDept = null; Dept dept = null; R userR = userClient.userInfoById(createUser); if (userR.isSuccess()) { user = userR.getData(); } R rpc = sysClient.getDept(deptId); if (rpc.isSuccess()) { Dept data = rpc.getData(); String ancestors = data.getAncestors(); // ancestors 0,1689540492698267649 if (StringUtil.isNotBlank(ancestors) && ancestors.contains(String.valueOf(ZERO))) { List deptIds = Func.toLongList(ancestors); if (deptIds.size() > 1) { Long topDeptId = deptIds.get(1); R deptR = sysClient.getDept(topDeptId); if (deptR.isSuccess()) { topDept = deptR.getData(); dept = data; } } else { topDept = data; } } } res.put("user", user); res.put("topDept", topDept); res.put("dept", dept); return res; } @Override @Transactional(rollbackFor = Exception.class) public boolean inviteToProject(String qrcodeId, Long createUser, Long projectId, Long deptId) { boolean flag = false; boolean exist = isExist(qrcodeId); if (exist) { //1.权限 3.项目组 ProjectAuth auth = new ProjectAuth(); auth.setProjectId(projectId); auth.setTopDept(deptId); auth.setUserDept(Func.firstLong(AuthUtil.getDeptId())); auth.setUserId(AuthUtil.getUserId()); projectAuthService.save(auth); Project project = projectService.getById(projectId); if (project != null) { ProjectGroup group = new ProjectGroup(); group.setProjectId(projectId); group.setInviteDept(project.getCompetentUnit()); group.setBeInvitedDept(deptId); flag = projectGroupService.save(group); } } return flag; } @Override public JSONObject scanInviteToProject(String qrcodeId, Long createUser, Long projectId, Long topDept) { JSONObject res = new JSONObject(); User user = null; String projectName = null; String unitName = null; R userR = userClient.userInfoById(createUser); if (userR.isSuccess()) { user = userR.getData(); } Project project = projectService.getById(projectId); if (project != null) { projectName = project.getName(); Long competentUnit = project.getCompetentUnit(); R dept = sysClient.getDept(competentUnit); if (dept.isSuccess()) { unitName = dept.getData().getDeptName(); } } res.put("user", user); res.put("projectName", projectName); res.put("unitName", unitName); return res; } @Override public JSONObject createGroupQrcode(Long projectId) { JSONObject res = new JSONObject(); String kv = IdWorker.getIdStr(); redis.setEx(kv, 0, Duration.ofSeconds(expireIn)); res.put("createUser", AuthUtil.getUser()); res.put("projectId", projectId); res.put("qrcodeId", kv); return res; } @Override public Long savaShare(FileShare share) { Long key = null; boolean save = fileShareService.save(share); if (save) { key = share.getId(); redis.setEx(String.valueOf(key), 0, Duration.ofDays(3)); } return key; } @Override public List getShare(Long id) { List res = new ArrayList<>(); boolean available = isAvailable(String.valueOf(id)); if (available) { FileShare byId = fileShareService.getById(id); if (byId != null) { String bladeFileIds = byId.getBladeFileIds(); R> rpc = fileClient.fileList(bladeFileIds); if (rpc.isSuccess()) { res = rpc.getData(); } } } return res; } /** * 判断二维码是否有效和是否达到扫描上限 */ private boolean isExist(String key) { boolean flag = false; Boolean exists = redis.exists(key); //如果存在 if (exists) { Long count = redis.incrBy(key, 1); if (count > scanCount) { throw new ServiceException("二维码只能扫描" + scanCount + "次数"); } else { flag = true; } } return flag; } private boolean isAvailable(String key) { boolean flag = false; Boolean exists = redis.exists(key); //如果存在 if (exists) { Long count = redis.incrBy(key, 1); if (count > 20) { throw new ServiceException("二维码只能扫描" + 20 + "次数"); } else { flag = true; } } return flag; } }