瀏覽代碼

测试小程序二维码下载

yusm 1 周之前
父節點
當前提交
f43f010b2a

+ 91 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/WxMiniProgramController.java

@@ -0,0 +1,91 @@
+package com.management.platform.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.User;
+import com.management.platform.entity.WechatAccount;
+import com.management.platform.service.UserService;
+import com.management.platform.service.WechatAccountService;
+import com.management.platform.service.impl.QRCodeService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.client.RestTemplate;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+@RestController
+@Slf4j
+@RequestMapping("/wxMini")
+public class WxMiniProgramController {
+    private static final String QR_CODE_URL = "https://api.weixin.qq.com/wxa/getwxacodeunlimit";
+
+    @Resource
+    private WechatAccountService wechatAccountService;
+
+    @Resource
+    private UserService userService;
+
+    @Resource
+    private RestTemplate restTemplate;
+
+    @Autowired
+    private QRCodeService qrCodeService;
+
+
+    @RequestMapping("generateQRCode")
+    public ResponseEntity<org.springframework.core.io.Resource> generateQRCode(HttpServletRequest request) {
+        String token = request.getHeader("Token");
+        User user = userService.getById(token);
+
+        WechatAccount wechatAccount = wechatAccountService.getOne(new QueryWrapper<WechatAccount>().eq("company_id", user.getCompanyId()));
+        if (wechatAccount==null){
+            throw new RuntimeException("该公司未配置相关参数");
+        }
+        //token
+        String accessToken = wechatAccountService.getAccessToken(user.getCompanyId(), wechatAccount.getAppId());
+        return qrCodeService.generateQRCodeResponse(accessToken);
+    }
+
+
+    /**
+     * 批量生成小程序码(返回ZIP包)
+     */
+//    @RequestMapping("/batch-generate")
+//    public ResponseEntity<org.springframework.core.io.Resource> batchGenerateQRCode(HttpServletRequest request) {
+//        try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
+//             ZipOutputStream zos = new ZipOutputStream(baos)) {
+//
+//            for (QRCodeRequest request : requests) {
+//                byte[] qrCode = qrCodeService.generateQRCode(request);
+//
+//                String fileName = "qrcode_" + request.getScene().hashCode() + ".png";
+//                zos.putNextEntry(new ZipEntry(fileName));
+//                zos.write(qrCode);
+//                zos.closeEntry();
+//            }
+//
+//            zos.finish();
+//
+//            ByteArrayResource resource = new ByteArrayResource(baos.toByteArray()) {
+//                @Override
+//                public String getFilename() {
+//                    return "qrcodes.zip";
+//                }
+//            };
+//
+//            return ResponseEntity.ok()
+//                    .contentType(MediaType.parseMediaType("application/zip"))
+//                    .header(HttpHeaders.CONTENT_DISPOSITION,
+//                            "attachment; filename=\"" + resource.getFilename() + "\"")
+//                    .body(resource);
+//
+//        } catch (IOException e) {
+//            throw new RuntimeException("生成ZIP文件失败", e);
+//        } catch (IOException e) {
+//            throw new RuntimeException(e);
+//        }
+//    }
+}

+ 79 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/QRCodeService.java

@@ -0,0 +1,79 @@
+package com.management.platform.service.impl;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.ByteArrayResource;
+import org.springframework.core.io.Resource;
+import org.springframework.http.*;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class QRCodeService {
+
+    private static final String QR_CODE_URL = "https://api.weixin.qq.com/wxa/getwxacodeunlimit";
+
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+
+    public byte[] generateQRCode(String accessToken) {
+
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+
+        Map<String, Object> body = new HashMap<>();
+        body.put("scene", "8453269023523102720");
+        body.put("page", "pages/index/index");
+        body.put("width", 430);
+        body.put("is_hyaline", true);
+
+        HttpEntity<Map<String, Object>> entity = new HttpEntity<>(body,headers);
+
+        ResponseEntity<byte[]> response = restTemplate.exchange(
+                QR_CODE_URL + "?access_token=" + accessToken,
+                HttpMethod.POST,
+                entity,
+                byte[].class);
+        // 验证响应
+        if (response.getStatusCode() != HttpStatus.OK) {
+            throw new RuntimeException("请求失败,状态码: " + response.getStatusCode());
+        }
+        log.info("QR code generation result: {}", response.getBody());
+        byte[] result = response.getBody();
+
+        // 简单验证是否是PNG文件 (PNG文件头)
+        if (result == null || result.length < 8 ||
+                result[0] != (byte) 0x89 || result[1] != 'P' ||
+                result[2] != 'N' || result[3] != 'G') {
+            String error = result != null ? new String(result, StandardCharsets.UTF_8) : "null";
+            throw new RuntimeException("无效的图片数据,可能是错误响应: " + error);
+        }
+
+        return result;
+    }
+
+    public ResponseEntity<Resource> generateQRCodeResponse(String accessToken) {
+        byte[] qrCode = generateQRCode(accessToken);
+
+        ByteArrayResource resource = new ByteArrayResource(qrCode) {
+            @Override
+            public String getFilename() {
+                return "qrcode_" + System.currentTimeMillis() + ".png";
+            }
+        };
+
+        return ResponseEntity.ok()
+                .contentType(MediaType.IMAGE_PNG)
+                .header(HttpHeaders.CONTENT_DISPOSITION,
+                        "inline; filename=\"" + resource.getFilename() + "\"")
+                .body(resource);
+    }
+}
+

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -1564,7 +1564,7 @@ public class ReportController {
             for (Report report : reportList) {
                 //校验分组为车间的分组时,工单号是否必填
                 if (report.getGroupId() != null) {
-                    String groupName = taskGroupService.getById(report.getGroupId()).getName();
+                    String groupName = taskGroupService.getById(report.getGroupId())!=null?taskGroupService.getById(report.getGroupId()).getName():"";
                     if (groupName.contains("车间") && StringUtils.isEmpty(report.getExtraField4())) {
                         HttpRespMsg httpRespMsg = new HttpRespMsg();
                         httpRespMsg.setError("当前选择了带车间的工时分组,对应的工单号必填");