Compare commits
3 Commits
539819d474
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| e7a12d8828 | |||
| c88b41fd46 | |||
| f751d17771 |
@@ -0,0 +1,7 @@
|
||||
# 2026-09-01 工作记录
|
||||
|
||||
## 修复 getOrderQRCodeUnlimited scene 参数 bug
|
||||
- 文件:`src/main/java/com/gxwebsoft/common/system/controller/WxLoginController.java`
|
||||
- 问题:后台管理端调用 `/getOrderQRCodeUnlimited/e9?page=pages/event/detail/index` 时,因未传 `scene`,回退逻辑生成 `scene=orderNo=e9`,而 `pages/event/detail/index` 页面期望 `scene=e9`(直接读 options.scene)。
|
||||
- 修复:scene 取值优先级改为 `显式 scene > 自定义页面用原始 orderNo > 兼容原订单核销(orderNo=xxx)`;page 无参时默认 `package/admin/order-scan`。
|
||||
- 兼容性:原订单核销用法(不带参数)行为不变;自定义页面默认用原始 orderNo;需 `orderNo=` 格式可显式传 `?scene=orderNo=e9`。
|
||||
@@ -0,0 +1,10 @@
|
||||
# 2026-09-03
|
||||
|
||||
## 修复:素材管理搜索报 Unknown column 'b.name'
|
||||
|
||||
- 文件:`src/main/java/com/gxwebsoft/common/system/mapper/xml/FileRecordMapper.xml`
|
||||
- 根因:`selectSql` 的 `keywords` 模糊搜索块(2024-11-25 提交 cf4f010 引入,疑似从 UserVerifyMapper 复制过来未改别名)写成了 `b.name` / `b.comments`。
|
||||
该块中 `a` = sys_file_record,`b` = sys_user;sys_user **没有** `name` 字段(只有 username / nickname / real_name / phone),故 MySQL 报 `Unknown column 'b.name' in 'where clause'`。
|
||||
- 修复:关键词改为搜索文件侧字段 `a.name` / `a.path` / `a.comments`,加上传者 `b.username` / `b.nickname` / `b.real_name`;
|
||||
`a.create_user_id = #{param.keywords}` 用 `<if test="param.keywords.matches('[0-9]+')">` 包住,避免非数字关键词被 MySQL 隐式转成 0。
|
||||
- 教训:跨 mapper 复制动态 SQL 片段时,务必核对表别名与目标表字段(sys_user 无 name 列)。
|
||||
@@ -35,7 +35,9 @@ import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
@@ -965,19 +967,31 @@ public class WxLoginController extends BaseController {
|
||||
return fail("获取失败", null);
|
||||
}
|
||||
|
||||
@Operation(summary = "获取微信小程序码-数量极多的业务场景(支持自定义页面与场景值)")
|
||||
@Operation(summary = "获取微信小程序码-数量极多的业务场景(直接返回图片字节,支持自定义页面与场景值)")
|
||||
@GetMapping("/getOrderQRCodeUnlimited/{orderNo}")
|
||||
public ApiResult<?> getOrderQRCodeUnlimited(@PathVariable("orderNo") String orderNo,
|
||||
public void getOrderQRCodeUnlimited(@PathVariable("orderNo") String orderNo,
|
||||
@RequestParam(required = false) String page,
|
||||
@RequestParam(required = false) String scene) {
|
||||
@RequestParam(required = false) String scene,
|
||||
HttpServletResponse response) throws IOException {
|
||||
final User loginUser = getLoginUser();
|
||||
if(loginUser == null){
|
||||
return fail("请先登录");
|
||||
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "请先登录");
|
||||
return;
|
||||
}
|
||||
String apiUrl = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + getAccessToken(loginUser.getTenantId());
|
||||
final HashMap<String, Object> map = new HashMap<>();
|
||||
// scene 优先用入参,否则回退兼容原订单核销逻辑:orderNo=xxx
|
||||
map.put("scene", StrUtil.isNotBlank(scene) ? scene : "orderNo=".concat(orderNo));
|
||||
// scene 优先级:显式 scene > 自定义页面用原始 orderNo > 兼容原订单核销(orderNo=xxx)
|
||||
String sceneValue;
|
||||
if (StrUtil.isNotBlank(scene)) {
|
||||
sceneValue = scene;
|
||||
} else if (StrUtil.isNotBlank(page)) {
|
||||
// 自定义页面场景:小程序端通过 options.scene 直接读取业务值(如活动/订单号)
|
||||
sceneValue = orderNo;
|
||||
} else {
|
||||
// 兼容原订单核销场景:scene=orderNo=xxx,默认跳转 package/admin/order-scan
|
||||
sceneValue = "orderNo=".concat(orderNo);
|
||||
}
|
||||
map.put("scene", sceneValue);
|
||||
// page 优先用入参,否则回退兼容原订单核销页面
|
||||
map.put("page", StrUtil.isNotBlank(page) ? page : "package/admin/order-scan");
|
||||
map.put("env_version", "trial");
|
||||
@@ -985,17 +999,12 @@ public class WxLoginController extends BaseController {
|
||||
byte[] qrCode = HttpRequest.post(apiUrl)
|
||||
.body(JSON.toJSONString(map))
|
||||
.execute().bodyBytes();
|
||||
System.out.println("qrCode = " + qrCode);
|
||||
|
||||
// 保存的文件名称
|
||||
final String fileName = CommonUtil.randomUUID8().concat(".png");
|
||||
// 保存路径
|
||||
String filePath = getUploadDir().concat("qrcode/") + fileName;
|
||||
File file = FileUtil.writeBytes(qrCode, filePath);
|
||||
if (file != null) {
|
||||
return success(config.getFileServer().concat("/qrcode/").concat(fileName));
|
||||
}
|
||||
return fail("获取失败", null);
|
||||
// 直接将小程序码图片字节写回响应,不依赖 file.websoft.top 文件服务器
|
||||
response.setContentType("image/png");
|
||||
response.setHeader("Cache-Control", "no-cache");
|
||||
response.getOutputStream().write(qrCode);
|
||||
response.getOutputStream().flush();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -59,11 +59,17 @@
|
||||
<if test="param.contentType != null">
|
||||
AND a.content_type LIKE CONCAT('%', #{param.contentType}, '%')
|
||||
</if>
|
||||
<if test="param.keywords != null">
|
||||
<if test="param.keywords != null and param.keywords != ''">
|
||||
AND (
|
||||
a.create_user_id = #{param.keywords}
|
||||
OR b.name LIKE CONCAT('%', #{param.keywords}, '%')
|
||||
OR b.comments LIKE CONCAT('%', #{param.keywords}, '%')
|
||||
a.`name` LIKE CONCAT('%', #{param.keywords}, '%')
|
||||
OR a.path LIKE CONCAT('%', #{param.keywords}, '%')
|
||||
OR a.comments LIKE CONCAT('%', #{param.keywords}, '%')
|
||||
OR b.username LIKE CONCAT('%', #{param.keywords}, '%')
|
||||
OR b.nickname LIKE CONCAT('%', #{param.keywords}, '%')
|
||||
OR b.real_name LIKE CONCAT('%', #{param.keywords}, '%')
|
||||
<if test="param.keywords.matches('[0-9]+')">
|
||||
OR a.create_user_id = #{param.keywords}
|
||||
</if>
|
||||
)
|
||||
</if>
|
||||
</where>
|
||||
|
||||
Reference in New Issue
Block a user