From 40a1a7ceafdd54aeecf00a046d16713e9d79d00c Mon Sep 17 00:00:00 2001 From: ouhaolan Date: Tue, 28 Apr 2026 11:15:33 +0800 Subject: [PATCH] =?UTF-8?q?1.ai=E7=9F=A5=E8=AF=86=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProductReportController.java | 34 ++++++ .../vo/ProductSplbQueryReqVO.java | 75 +++++++++++++ .../storeuser/vo/StoreUserEditRespVO.java | 26 +++++ .../productreport/ProductReportService.java | 17 +++ .../ProductReportServiceImpl.java | 100 ++++++++++++++++++ .../support/ErpReportDatabaseBuilder.java | 26 +++++ 6 files changed, 278 insertions(+) create mode 100644 yudao-module-ydoyun/src/main/java/cn/iocoder/yudao/module/ydoyun/controller/admin/productreport/ProductReportController.java create mode 100644 yudao-module-ydoyun/src/main/java/cn/iocoder/yudao/module/ydoyun/controller/admin/productreport/vo/ProductSplbQueryReqVO.java create mode 100644 yudao-module-ydoyun/src/main/java/cn/iocoder/yudao/module/ydoyun/controller/admin/storeuser/vo/StoreUserEditRespVO.java create mode 100644 yudao-module-ydoyun/src/main/java/cn/iocoder/yudao/module/ydoyun/service/productreport/ProductReportService.java create mode 100644 yudao-module-ydoyun/src/main/java/cn/iocoder/yudao/module/ydoyun/service/productreport/ProductReportServiceImpl.java create mode 100644 yudao-module-ydoyun/src/main/java/cn/iocoder/yudao/module/ydoyun/support/ErpReportDatabaseBuilder.java diff --git a/yudao-module-ydoyun/src/main/java/cn/iocoder/yudao/module/ydoyun/controller/admin/productreport/ProductReportController.java b/yudao-module-ydoyun/src/main/java/cn/iocoder/yudao/module/ydoyun/controller/admin/productreport/ProductReportController.java new file mode 100644 index 0000000..9ff74df --- /dev/null +++ b/yudao-module-ydoyun/src/main/java/cn/iocoder/yudao/module/ydoyun/controller/admin/productreport/ProductReportController.java @@ -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 queryProductSplb(@Valid @RequestBody ProductSplbQueryReqVO reqVO) { + return success(productReportService.queryProductSplb(reqVO)); + } +} diff --git a/yudao-module-ydoyun/src/main/java/cn/iocoder/yudao/module/ydoyun/controller/admin/productreport/vo/ProductSplbQueryReqVO.java b/yudao-module-ydoyun/src/main/java/cn/iocoder/yudao/module/ydoyun/controller/admin/productreport/vo/ProductSplbQueryReqVO.java new file mode 100644 index 0000000..c957b50 --- /dev/null +++ b/yudao-module-ydoyun/src/main/java/cn/iocoder/yudao/module/ydoyun/controller/admin/productreport/vo/ProductSplbQueryReqVO.java @@ -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 ghsdm; + + @Schema(description = "仓库代码(多选)") + private List ckdm; + + @Schema(description = "附加条件1") + private List fjsx1; + @Schema(description = "附加条件2") + private List fjsx2; + @Schema(description = "附加条件3") + private List fjsx3; + @Schema(description = "附加条件4") + private List fjsx4; + @Schema(description = "附加条件5") + private List fjsx5; + @Schema(description = "附加条件6") + private List fjsx6; + @Schema(description = "附加条件7") + private List fjsx7; + @Schema(description = "附加条件8") + private List fjsx8; + @Schema(description = "附加条件9") + private List fjsx9; + @Schema(description = "附加条件10") + private List fjsx10; + + @Schema(description = "分析看板排序维度(与前端 sorts 一致;未使用 auth+params 时由后端拼入 params JSON 的 sorts 键)") + private List 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; + } +} diff --git a/yudao-module-ydoyun/src/main/java/cn/iocoder/yudao/module/ydoyun/controller/admin/storeuser/vo/StoreUserEditRespVO.java b/yudao-module-ydoyun/src/main/java/cn/iocoder/yudao/module/ydoyun/controller/admin/storeuser/vo/StoreUserEditRespVO.java new file mode 100644 index 0000000..6126fb5 --- /dev/null +++ b/yudao-module-ydoyun/src/main/java/cn/iocoder/yudao/module/ydoyun/controller/admin/storeuser/vo/StoreUserEditRespVO.java @@ -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 storeIds; +} diff --git a/yudao-module-ydoyun/src/main/java/cn/iocoder/yudao/module/ydoyun/service/productreport/ProductReportService.java b/yudao-module-ydoyun/src/main/java/cn/iocoder/yudao/module/ydoyun/service/productreport/ProductReportService.java new file mode 100644 index 0000000..f9931d9 --- /dev/null +++ b/yudao-module-ydoyun/src/main/java/cn/iocoder/yudao/module/ydoyun/service/productreport/ProductReportService.java @@ -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 两个参数传入(VARCHAR,params 为 JSON 字符串) + */ + Object queryProductSplb(@Valid ProductSplbQueryReqVO reqVO); +} diff --git a/yudao-module-ydoyun/src/main/java/cn/iocoder/yudao/module/ydoyun/service/productreport/ProductReportServiceImpl.java b/yudao-module-ydoyun/src/main/java/cn/iocoder/yudao/module/ydoyun/service/productreport/ProductReportServiceImpl.java new file mode 100644 index 0000000..77ae56a --- /dev/null +++ b/yudao-module-ydoyun/src/main/java/cn/iocoder/yudao/module/ydoyun/service/productreport/ProductReportServiceImpl.java @@ -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 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 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 nullToEmpty(List v) { + return v == null ? Collections.emptyList() : v; + } + + private static List nullToEmptySorts(List v) { + return v == null || v.isEmpty() ? Collections.emptyList() : v; + } +} diff --git a/yudao-module-ydoyun/src/main/java/cn/iocoder/yudao/module/ydoyun/support/ErpReportDatabaseBuilder.java b/yudao-module-ydoyun/src/main/java/cn/iocoder/yudao/module/ydoyun/support/ErpReportDatabaseBuilder.java new file mode 100644 index 0000000..e79a4d2 --- /dev/null +++ b/yudao-module-ydoyun/src/main/java/cn/iocoder/yudao/module/ydoyun/support/ErpReportDatabaseBuilder.java @@ -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() {} + + /** + * 王菠萝租户 ERP(E3_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; + } +}