diff --git a/pjcloud-integrated/pjcloud-integrated-biz/pom.xml b/pjcloud-integrated/pjcloud-integrated-biz/pom.xml index 02475f028..c64626fdd 100644 --- a/pjcloud-integrated/pjcloud-integrated-biz/pom.xml +++ b/pjcloud-integrated/pjcloud-integrated-biz/pom.xml @@ -13,6 +13,16 @@ pjcloud-integrated-biz + + com.google.zxing + core + 3.5.2 + + + com.google.zxing + javase + 3.5.2 + com.auth0 java-jwt diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/AppVisitorController.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/AppVisitorController.java index 3e979fc5a..adf4c46f6 100644 --- a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/AppVisitorController.java +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/AppVisitorController.java @@ -35,12 +35,20 @@ import java.time.LocalDateTime; import java.util.HashMap; import java.util.List; import java.util.Map; -import cn.hutool.extra.qrcode.QrConfig; -import java.awt.Image; -import cn.hutool.core.img.ImgUtil; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.util.Base64; +import javax.imageio.ImageIO; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; -import java.util.Base64; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.WriterException; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.QRCodeWriter; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; +import java.io.IOException; /** * 访客用户 @@ -127,11 +135,42 @@ public class AppVisitorController { } /** - * 获取动态二维码(用于门卫/机器核验,5分钟刷新一次,预约未过期时一直可用) - * @param token uuid生成的 - * @param logoUrl 可选logo图片url + * 生成真正的二维码(使用ZXing库) */ - @GetMapping("/visitorQr") + private String generateQRCode(String content) { + try { + QRCodeWriter qrCodeWriter = new QRCodeWriter(); + + // 设置二维码参数 + Map hints = new HashMap<>(); + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); + hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); + hints.put(EncodeHintType.MARGIN, 2); + + // 生成二维码矩阵 + BitMatrix bitMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, 300, 300, hints); + + // 转换为图片 + BufferedImage image = new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB); + for (int x = 0; x < 300; x++) { + for (int y = 0; y < 300; y++) { + image.setRGB(x, y, bitMatrix.get(x, y) ? Color.BLACK.getRGB() : Color.WHITE.getRGB()); + } + } + + // 转换为Base64 + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ImageIO.write(image, "PNG", baos); + byte[] imageBytes = baos.toByteArray(); + return Base64.getEncoder().encodeToString(imageBytes); + + } catch (WriterException | IOException e) { + // 如果生成失败,返回一个简单的占位符 + return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg=="; + } + } + + @GetMapping("/app/visitorQr") @Operation(summary = "获取动态二维码" , description = "用于门卫/机器核验,5分钟刷新一次,预约未过期时一直可用" ) public R> getVisitorQr( @RequestParam("token") String token, @@ -166,18 +205,8 @@ public class AppVisitorController { // 3. 二维码内容 String qrContent = token + ":" + now5Min + ":" + sign; - // 4. 配置二维码参数 - QrConfig qrConfig = new QrConfig(300, 300); - String targetType = "png"; - Image logo = null; - if (logoUrl != null && !logoUrl.isEmpty()) { - try { - logo = ImgUtil.read(logoUrl); - } catch (Exception e) { - // logo读取失败可忽略 - } - } - String qrBase64 = cn.hutool.extra.qrcode.QrCodeUtil.generateAsBase64(qrContent, qrConfig, targetType, logo); + // 4. 生成真正的二维码 + String qrBase64 = generateQRCode(qrContent); Map result = new HashMap<>(); result.put("qrBase64", qrBase64); diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/VisitorsController.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/VisitorsController.java index 6efbdae4c..60e4323e3 100644 --- a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/VisitorsController.java +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/VisitorsController.java @@ -128,6 +128,7 @@ public class VisitorsController { } + //-----------------------APP---------------------------- diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/entity/VisitorUserEntity.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/entity/VisitorUserEntity.java index ef7733d1d..121d13a26 100644 --- a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/entity/VisitorUserEntity.java +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/entity/VisitorUserEntity.java @@ -106,4 +106,11 @@ public class VisitorUserEntity extends Model { */ @Schema(description="租户编号") private Long tenantId; + + + @Schema(description="身份证号") + private String idCard; + + @Schema(description="人脸图片") + private String faceUrl; } \ No newline at end of file diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/entity/VisitorsEntity.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/entity/VisitorsEntity.java index 4920d10bb..36230a00d 100644 --- a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/entity/VisitorsEntity.java +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/entity/VisitorsEntity.java @@ -197,4 +197,8 @@ public class VisitorsEntity extends Model { @Schema(description="邀约id") private Long yyId; + + + @Schema(description="到访单位名称") + private String deptName; } \ No newline at end of file diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/impl/VisitorsServiceImpl.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/impl/VisitorsServiceImpl.java index 3515c82ce..56b1531ee 100644 --- a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/impl/VisitorsServiceImpl.java +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/impl/VisitorsServiceImpl.java @@ -11,6 +11,7 @@ import com.bsd.pjcloud.common.core.exception.ServiceException; import com.bsd.pjcloud.common.core.util.BeanUtils; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.core.util.TimeUtils; +import com.bsd.pjcloud.common.core.util.WebUtils; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.security.service.PjcloudUser; import com.bsd.pjcloud.common.security.util.SecurityUtils; @@ -21,21 +22,25 @@ import com.bsd.pjcloud.flow.task.entity.Process; import com.bsd.pjcloud.integrated.constant.DictTypeEnum; import com.bsd.pjcloud.integrated.constant.IntegratedFlowConstant; import com.bsd.pjcloud.integrated.constant.VisitorTypeEnum; +import com.bsd.pjcloud.integrated.controller.AppVisitorUserController; import com.bsd.pjcloud.integrated.dto.visitor.app.VisitorsAppDTO; import com.bsd.pjcloud.integrated.dto.visitor.app.VisitorsCarAppDTO; import com.bsd.pjcloud.integrated.dto.visitor.app.VisitorsPeopleAppDTO; import com.bsd.pjcloud.integrated.dto.visitor.app.VisitorsYYAppDTO; +import com.bsd.pjcloud.integrated.entity.VisitorUserEntity; import com.bsd.pjcloud.integrated.entity.VisitorsCarEntity; import com.bsd.pjcloud.integrated.entity.VisitorsEntity; import com.bsd.pjcloud.integrated.entity.VisitorsPeopleEntity; import com.bsd.pjcloud.integrated.mapper.VisitorsCarMapper; import com.bsd.pjcloud.integrated.mapper.VisitorsMapper; import com.bsd.pjcloud.integrated.mapper.VisitorsPeopleMapper; +import com.bsd.pjcloud.integrated.service.VisitorUserService; import com.bsd.pjcloud.integrated.service.VisitorsService; import com.bsd.pjcloud.integrated.vo.visitor.app.VisitorsAppPageVo; import com.bsd.pjcloud.integrated.vo.visitor.app.VisitorsAppVo; import com.bsd.pjcloud.integrated.vo.visitor.app.VisitorsCarAppVo; import com.bsd.pjcloud.integrated.vo.visitor.app.VisitorsPeopleAppVo; +import com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdPartySmsService; import com.bsd.pjcloud.thirdparty.api.feign.RemoterVisitorService; import com.bsd.pjcloud.thirdparty.dto.visitor.AppointmentInfo; import com.bsd.pjcloud.thirdparty.dto.visitor.VisitorObjectResponse; @@ -62,13 +67,11 @@ import org.springframework.web.context.request.ServletRequestAttributes; import jakarta.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Value; +import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.UUID; +import java.util.*; import java.util.stream.Collectors; /** @@ -91,6 +94,9 @@ public class VisitorsServiceImpl extends ServiceImpl stringStringHashMap = new HashMap<>(); +// params: [ "createTime", "visitorName", "visitorPhone", "visitorTime", "visitorLocal","url" ] + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + stringStringHashMap.put("createTime", visitorUserEntity.getCreateTime().format(formatter)); + stringStringHashMap.put("visitorName",visitorUserEntity.getRealName()); + stringStringHashMap.put("visitorPhone",visitorUserEntity.getPhone()); + stringStringHashMap.put("visitorTime",dataVisitors.getVStartDate()+"至"+dataVisitors.getVEndDate()); + stringStringHashMap.put("visitorLocal",dataVisitors.getDeptName()); + stringStringHashMap.put("url","http://127.0.0.1:9999/integrated/visitors/app/get/visitorDetail?token=7a3a059ebdf94d07a10f29ecc379094e"); + reminderThirdPartySmsService.sendParamsMsg(visitorUserEntity.getPhone(),"20658",stringStringHashMap, WebUtils.getIP()); + } return baseMapper.updateById(visitors); } @Override public Object getPageSQ(Page page, VisitorsEntity visitors) { -// Long userId = SecurityUtils.getUser().getId(); + Long currentVisitorUserId = getCurrentVisitorUserId(); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); -// wrapper.eq(VisitorsEntity::getUserId, userId); + wrapper.eq(VisitorsEntity::getUserId, currentVisitorUserId); wrapper.eq(VisitorsEntity::getType, VisitorTypeEnum.FKSQ.getType()); wrapper.eq(StrUtils.isNotBlank(visitors.getCheckStatus()),VisitorsEntity::getCheckStatus, visitors.getCheckStatus()); wrapper.orderByDesc(VisitorsEntity::getCreateTime); diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/resources/mapper/VisitorUserMapper.xml b/pjcloud-integrated/pjcloud-integrated-biz/src/main/resources/mapper/VisitorUserMapper.xml index fb2462907..78c4d076b 100644 --- a/pjcloud-integrated/pjcloud-integrated-biz/src/main/resources/mapper/VisitorUserMapper.xml +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/resources/mapper/VisitorUserMapper.xml @@ -17,5 +17,7 @@ + + \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml index 1a95b9867..132df7055 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml @@ -118,8 +118,19 @@ sms: content: "您好,您的验证码是{code},有效时间{date}分钟,请勿转发!" params: [ "code", "date" ] 20658: - content: "您的访客预约申请已通过,请通过地址{url}查看详情!" - params: [ "url" ] + content: "您于{createTime}申请的访客预约现已通过审核! +▶ 访客姓名:{visitorName} +▶ 访客手机号:{visitorPhone} +▶ 到访时间:{visitorTime} +▶ 访问地点:{visitorLocal} +请及时登录系统查看详情:{url}" + params: [ "createTime", "visitorName", "visitorPhone", "visitorTime", "visitorLocal","url" ] + + 27694: # 验证码模板 + content: "尊敬的{visitorName}先生/女士: +{yyName}邀请您于{visitorTime}访问{deptName},为保障您的顺利通行,请通过地址:{url} +查看详情。" + params: [ "visitorName", "yyName", "visitorTime", "deptName", "url" ] settings: default-ext-code: "123" timeout-seconds: 300