1.ai知识库
This commit is contained in:
@@ -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));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user