1.ai知识库

This commit is contained in:
2026-04-28 11:15:33 +08:00
parent 14532162eb
commit 40a1a7ceaf
6 changed files with 278 additions and 0 deletions

View File

@@ -0,0 +1,34 @@
package cn.iocoder.yudao.module.ydoyun.controller.admin.productreport;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.ydoyun.controller.admin.productreport.vo.ProductSplbQueryReqVO;
import cn.iocoder.yudao.module.ydoyun.service.productreport.ProductReportService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 商品列表报表(王菠萝存储过程)")
@RestController
@RequestMapping("/ydoyun/product-report")
@Validated
public class ProductReportController {
@Resource
private ProductReportService productReportService;
@PostMapping("/splb/query")
@Operation(summary = "商品列表/标签存储过程查询YDY_PT_SPLB、YDY_GET_TAG 等,由 procedureName 区分)",
description = "推荐请求体仅含procedureName、auth已 JSON 字符串化、params已 JSON 字符串化),与存储过程入参 procedureParams 一致。"
+ " 若未传 auth+params则传扁平字段由服务端组包此时 pageNo、pageSize 必填。")
@PreAuthorize("@ss.hasPermission('ydoyun:product-report:query')")
public CommonResult<Object> queryProductSplb(@Valid @RequestBody ProductSplbQueryReqVO reqVO) {
return success(productReportService.queryProductSplb(reqVO));
}
}

View File

@@ -0,0 +1,75 @@
package cn.iocoder.yudao.module.ydoyun.controller.admin.productreport.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.util.List;
@Schema(description = "管理后台 - 商品列表/标签 splb 查询(存储过程,如 YDY_PT_SPLB、YDY_GET_TAG"
+ "推荐:前端正體化 auth、params 字符串,与 postExecuteProcedure 的 procedureParams 一致;"
+ "未传时仍可按扁平字段由后端组包。")
@Data
public class ProductSplbQueryReqVO {
@Schema(description = "存储过程名,如 YDY_PT_SPLB、YDY_GET_TAG", requiredMode = Schema.RequiredMode.REQUIRED, example = "YDY_PT_SPLB")
@NotBlank(message = "procedureName 不能为空")
private String procedureName;
@Schema(description = "若与 params 同传,表示前端已 JSON.stringify 的 @auth 串,后端将直接入 procedureParams 不再组包")
private String auth;
@Schema(description = "若与 auth 同传,表示前端已 JSON.stringify 的 params 串,后端将直接入 procedureParams 不再组包")
private String params;
@Schema(description = "当前登录账号(与 ERP @auth 一致auth 未同传时仍用于后端的扁平组包)", example = "wbluser01")
private String username;
@Schema(description = "页码auth/params 未同传时必填", example = "1")
private Integer pageNo;
@Schema(description = "每页条数auth/params 未同传时必填", example = "10")
private Integer pageSize;
@Schema(description = "品类", example = "1")
private String category;
@Schema(description = "供货商代码(多选)")
private List<String> ghsdm;
@Schema(description = "仓库代码(多选)")
private List<String> ckdm;
@Schema(description = "附加条件1")
private List<String> fjsx1;
@Schema(description = "附加条件2")
private List<String> fjsx2;
@Schema(description = "附加条件3")
private List<String> fjsx3;
@Schema(description = "附加条件4")
private List<String> fjsx4;
@Schema(description = "附加条件5")
private List<String> fjsx5;
@Schema(description = "附加条件6")
private List<String> fjsx6;
@Schema(description = "附加条件7")
private List<String> fjsx7;
@Schema(description = "附加条件8")
private List<String> fjsx8;
@Schema(description = "附加条件9")
private List<String> fjsx9;
@Schema(description = "附加条件10")
private List<String> fjsx10;
@Schema(description = "分析看板排序维度(与前端 sorts 一致;未使用 auth+params 时由后端拼入 params JSON 的 sorts 键)")
private List<ProductSplbSortItemVO> sorts;
@Schema(description = "单条分类排序入参,写入 params 内 sorts 数组")
@Data
public static class ProductSplbSortItemVO {
@Schema(description = "排序字段名,如 catName、bigCatName", example = "catName")
private String sortName;
@Schema(description = "0 未选 / 1 当前维度", example = "1")
private Integer sortType;
}
}

View File

@@ -0,0 +1,26 @@
package cn.iocoder.yudao.module.ydoyun.controller.admin.storeuser.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Schema(description = "管理后台 - 门店用户(编辑)信息")
@Data
public class StoreUserEditRespVO {
@Schema(description = "系统用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long userId;
@Schema(description = "用户名称")
private String username;
@Schema(description = "用户昵称")
private String nickname;
@Schema(description = "手机号")
private String mobile;
@Schema(description = "已绑定的门店编号列表(编辑时全量提交以更新绑定)")
private List<Long> storeIds;
}

View File

@@ -0,0 +1,17 @@
package cn.iocoder.yudao.module.ydoyun.service.productreport;
import cn.iocoder.yudao.module.ydoyun.controller.admin.productreport.vo.ProductSplbQueryReqVO;
import javax.validation.Valid;
/**
* 商品报表(王菠萝 E3存储过程执行
*/
public interface ProductReportService {
/**
* 按 {@link ProductSplbQueryReqVO#getProcedureName()} 在 ERPWBL 上执行存储过程;
* 与前端约定通过 @auth、@params 两个参数传入VARCHARparams 为 JSON 字符串)
*/
Object queryProductSplb(@Valid ProductSplbQueryReqVO reqVO);
}

View File

@@ -0,0 +1,100 @@
package cn.iocoder.yudao.module.ydoyun.service.productreport;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.ydoyun.config.ProcedureHttpClient;
import cn.iocoder.yudao.module.ydoyun.controller.admin.productreport.vo.ProductSplbQueryReqVO;
import cn.iocoder.yudao.module.ydoyun.controller.admin.reportdatabase.vo.ReportDatabaseRespVO;
import cn.iocoder.yudao.module.ydoyun.controller.admin.reportpage.vo.ProcedureRequestVO;
import cn.iocoder.yudao.module.ydoyun.dal.dataobject.reportdatabase.ReportDatabaseDO;
import cn.iocoder.yudao.module.ydoyun.support.ErpReportDatabaseBuilder;
import com.alibaba.fastjson.JSON;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import static cn.hutool.core.util.StrUtil.isAllNotBlank;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.invalidParamException;
/**
* 与 ReportPageService 相同通道HTTP 调存储过程服务;王菠萝使用 {@link ErpReportDatabaseBuilder#buildErpDatabaseWBL()}。
*/
@Slf4j
@Service
@Validated
@RequiredArgsConstructor
public class ProductReportServiceImpl implements ProductReportService {
private final ProcedureHttpClient httpClient;
@Override
public Object queryProductSplb(ProductSplbQueryReqVO reqVO) {
ReportDatabaseDO db = ErpReportDatabaseBuilder.buildErpDatabaseWBL();
boolean hasAuth = StrUtil.isNotBlank(reqVO.getAuth());
boolean hasParams = StrUtil.isNotBlank(reqVO.getParams());
if (hasAuth != hasParams) {
throw invalidParamException("auth 与 params 需同时传或同时不传");
}
LinkedHashMap<String, Object> procedureParams = new LinkedHashMap<>(2);
if (isAllNotBlank(reqVO.getAuth(), reqVO.getParams())) {
// 前端正體化 JSON 字串,与 ProcedureRequestVO#params 一致
procedureParams.put("auth", reqVO.getAuth().trim());
procedureParams.put("params", reqVO.getParams().trim());
} else {
if (reqVO.getPageNo() == null) {
throw invalidParamException("未同传 auth/params 时pageNo 不能为空");
}
if (reqVO.getPageSize() == null) {
throw invalidParamException("未同传 auth/params 时pageSize 不能为空");
}
String auth = JSON.toJSONString(
Collections.singletonMap("username", StrUtil.emptyToNull(reqVO.getUsername()) == null ? "" : reqVO.getUsername().trim()));
Map<String, Object> p = new LinkedHashMap<>(16);
p.put("username", reqVO.getUsername());
p.put("pageNo", reqVO.getPageNo());
p.put("pageSize", reqVO.getPageSize());
p.put("category", reqVO.getCategory());
p.put("ghsdm", nullToEmpty(reqVO.getGhsdm()));
p.put("ckdm", nullToEmpty(reqVO.getCkdm()));
p.put("fjsx1", nullToEmpty(reqVO.getFjsx1()));
p.put("fjsx2", nullToEmpty(reqVO.getFjsx2()));
p.put("fjsx3", nullToEmpty(reqVO.getFjsx3()));
p.put("fjsx4", nullToEmpty(reqVO.getFjsx4()));
p.put("fjsx5", nullToEmpty(reqVO.getFjsx5()));
p.put("fjsx6", nullToEmpty(reqVO.getFjsx6()));
p.put("fjsx7", nullToEmpty(reqVO.getFjsx7()));
p.put("fjsx8", nullToEmpty(reqVO.getFjsx8()));
p.put("fjsx9", nullToEmpty(reqVO.getFjsx9()));
p.put("fjsx10", nullToEmpty(reqVO.getFjsx10()));
p.put("sorts", nullToEmptySorts(reqVO.getSorts()));
String params = JSON.toJSONString(p);
procedureParams.put("auth", auth);
procedureParams.put("params", params);
}
ProcedureRequestVO request = new ProcedureRequestVO();
request.setReportDatabase(BeanUtils.toBean(db, ReportDatabaseRespVO.class));
request.setProcedureName(reqVO.getProcedureName().trim());
request.setParams(procedureParams);
log.info("[商品报表 splb] procedure={}, prebuiltAuthParams={}, username={}", request.getProcedureName(), hasAuth, reqVO.getUsername());
return httpClient.postExecuteProcedure(request);
}
private static List<String> nullToEmpty(List<String> v) {
return v == null ? Collections.emptyList() : v;
}
private static List<ProductSplbQueryReqVO.ProductSplbSortItemVO> nullToEmptySorts(List<ProductSplbQueryReqVO.ProductSplbSortItemVO> v) {
return v == null || v.isEmpty() ? Collections.emptyList() : v;
}
}

View File

@@ -0,0 +1,26 @@
package cn.iocoder.yudao.module.ydoyun.support;
import cn.iocoder.yudao.module.ydoyun.dal.dataobject.reportdatabase.ReportDatabaseDO;
/**
* ERP 报表执行使用的数据源描述(供存储过程 HTTP 服务等使用,与库表 ydoyun_report_database 结构一致)。
*/
public final class ErpReportDatabaseBuilder {
private ErpReportDatabaseBuilder() {}
/**
* 王菠萝租户 ERPE3_WBL数据源与 ProcedureRequestVO.reportDatabase 字段对应
*/
public static ReportDatabaseDO buildErpDatabaseWBL() {
ReportDatabaseDO db = new ReportDatabaseDO();
db.setDbName("ERPWBL 数据源");
db.setDbType("sqlserver");
db.setHost("113.240.228.197");
db.setPort(36688);
db.setUsername("baison");
db.setPassword("Bs6688$");
db.setDatabaseName("E3_WBL");
return db;
}
}