[Lilishop Mall] Nº 4 a 7. Desenvolvimento de código de lógica de negócios, envolvendo: módulo commodity

  Apenas o back-end está envolvido, veja a coluna superior para todos os diretórios, códigos, documentos e caminhos de interface são: 

[Lilishop Mall] Registre as notas de estudo do sistema de shopping B2B2C ~


Todo o artigo combinará a introdução de negócios para focar na lógica de design, que inclui a classe de interface e a classe de negócios, e a análise específica do código-fonte, o código-fonte não é complicado de ler ~

Atenção: Alguns comentários no código-fonte estão errados, alguns comentários têm significados completamente opostos e alguns comentários não estão corretos. Atualizei-os durante o processo de leitura e adicionei novos comentários onde não sabia. Portanto, tenha cuidado ao ler o código-fonte !

Índice

A1. Módulo de mercadoria

B0. Prefácio

C1. Tabela de associação de commodities e análise de subtabela

C2. Análise operacional de tabelas e subtabelas de associação de commodities (ignorável)

B1. Novo produto

C1. Análise de classe DTO de mercadoria GoodsOperationDTO

C2. Lógica de negócios

        D1. Lógica de negócios principal

        D2. Operação real da lógica de negócios

C3. Lógica do código

        D1. Construtor novo objeto PO de mercadoria

        D2. De acordo com o negócio, verifique e defina as informações do produto

        D3. Obtenha a miniatura do conjunto [as miniaturas de commodities são unificadas e explicadas aqui]

        D4. definir parâmetros de commodities

        D5. Construtor novo objeto skuPO de mercadoria

        D6. Renderização do modelo de vendas

        D7. Modifique o estoque de commodities para ser a soma do estoque do sku de commodities

        D8. Envie a mensagem rocketMq que gera o índice es commodity sku 

        D9. Construa as informações da lista EsGoodsIndex do índice SKU de commodities

        D10. Armazenamento de segmentação de palavras

        Índice de sku de commodities D11.save es

C3. Resumo

A2. Registros de ferramentas de terceiros (podem ser ignorados)

B1.hutool

Uso da ferramenta C1.JSONUtil


O módulo de commodities é o núcleo do sistema de shopping. Não é uma simples adição, exclusão, modificação e consulta. Afinal, ele envolverá muitas tabelas de negócios, então parece simples, mas o negócio ainda é relativamente complicado. Cada interface (que pode ser entendido como uma operação comercial) pode envolver muitas operações comerciais.

O design e a interface da estrutura de dados foram analisados ​​​​no design detalhado No3 antes e, em seguida, a interface será analisada primeiro e a estrutura de dados deve ser combinada ~

Analisamos apenas as principais interfaces e registramos as semelhantes em conjunto ~

A1. Módulo de mercadoria

B0. Prefácio

Antes de iniciar, primeiro registre as informações do módulo do produto.

C1. Tabela de associação de commodities e análise de subtabela

Em primeiro lugar, a tabela de produtos será associada a sete tabelas: classificação do produto, marca do produto, especificação do produto, parâmetro do produto, unidade do produto, modelo de custo de envio e classificação da loja, mas apenas classificação do produto, marca do produto, modelo de custo de envio e a classificação da loja está relacionada à tabela de produtos. As demais especificações do produto, parâmetros do produto e unidades do produto são fracamente relacionadas e não estão relacionadas à tabela de produtos. Elas são apenas opcionais e os dados são salvos diretamente na tabela de produtos.

Categoria da mercadoria: deve ser selecionada até o último nível, é de múltipla escolha, então você pode armazenar o id da categoria da mercadoria junto e separá-los com vírgulas;

Marca de commodities: é uma escolha única e pode ser armazenada diretamente;

Modelo de custo de envio: é selecionado individualmente e pode ser armazenado diretamente;

Categoria da loja: é multi-escolha, portanto, os IDs da categoria da loja podem ser armazenados juntos e separados por vírgulas;

Especificação da mercadoria: a especificação corresponde ao sku da mercadoria e é armazenada na tabela sku da mercadoria, e os dados salvos não são a identificação;

Parâmetros de mercadoria: Como os parâmetros são customizados pelo terminal M e são multi-item, é mais apropriado armazená-los no tipo json

Unidade de mercadoria: o conteúdo dos dados armazenados diretamente não será associado;

Em segundo lugar, após a criação da tabela de produtos, serão geradas subtabelas: tabela de sku de produtos, tabela de atlas de produtos, tabela de regras de atacado,

Parte dos dados da tabela SKU do produto é igual à informação da tabela do produto e parte vem da tabela de especificações.

C2. Análise operacional de tabelas e subtabelas de associação de commodities (ignorável)

Deixe-me explicar brevemente aqui, porque as sete tabelas de associação do produto podem afetar umas às outras e a tabela de produtos, por exemplo, a marca do produto e a categoria do produto, a categoria do produto será associada à marca do produto, se a categoria do produto associada for desativado A marca do produto será lembrada neste momento: a categoria foi vinculada à marca, desvincule-a primeiro: [\"telefone celular\",\"fone de ouvido/headset\"].

Portanto, quando se trata do relacionamento, você deve considerar várias operações de dados em comparação com o design do negócio.Se a lógica não for fornecida no design, você deve perguntar com clareza! ! ! Muito importante! ! !

Não vou descrevê-lo em detalhes aqui. Ao analisar as sete tabelas acima, vou analisá-lo em detalhes~~~~

B1. Novo produto

C1. Análise de classe DTO de mercadoria GoodsOperationDTO

Esta classe é o tipo de parâmetro de entrada da interface. Como as informações do produto são mais complicadas, uma classe DTO precisa ser adicionada. Essa classe DTO contém o tipo de parâmetro de entrada da interface analisado no artigo anterior~~~

Concentre-se no tipo de referência,

Como os atributos de parâmetro de mercadoria e atributos de atacado são complexos e numerosos, e existem regras de atributo de campo, uma classe também pode ser abstraída no tempo, então o objeto de referência personalizado é usado diretamente para receber; entre eles estão a classe de grupo de parâmetros GoodsParamsDTO e a mercadoria parâmetros no grupo Class GoodsParamsItemDTO, WholesaleDTO;

Os atributos de especificação de mercadoria também são complexos e numerosos, mas não há regras de atributo de campo e uma classe de campo específica não pode ser abstraída, então a coleção de mapas é usada para receber ~~~

Abaixo estão alguns campos~~~

public class GoodsOperationDTO implements Serializable {

    //与其他表无关联的,基本数据类型的业务基本信息;
    @ApiModelProperty(hidden = true)
    private String goodsId;

    @ApiModelProperty(value = "商品名称", required = true)
    @NotEmpty(message = "商品名称不能为空")
    @Length(max = 50, message = "商品名称不能超过50个字符")
    private String goodsName;
。。。
    //与其他表关联的业务基本信息,可理解为外键;
    @ApiModelProperty(value = "商品分类path,逗号隔开")
    private String categoryPath;

    @ApiModelProperty(value = "店铺分类id,逗号隔开", required = true)
    @Size(max = 200, message = "选择了太多店铺分类")
    private String storeCategoryPath;
。。。
    //引用类型的业务基本信息;
    @ApiModelProperty(value = "商品参数")
    private List<GoodsParamsDTO> goodsParamsDTOList;

    @ApiModelProperty(value = "sku列表,因为无法匹配pojo类,所以是用map接收")
    @Valid
    private List<Map<String, Object>> skuList;

。。。
    //业务校验/判断的字段;
    @ApiModelProperty(value = "是否有规格", hidden = true)
    private String haveSpec;

    @ApiModelProperty(value = "是否重新生成sku数据")
    private Boolean regeneratorSkuFlag = true;
。。。

}

C2. Lógica de negócios

A lógica de negócios principal refere-se às principais operações de negócios da interface, não combinadas com outras situações de reuso ou situações de negócios! ! !

A lógica de negócios da operação real é uma operação que combina código de reutilização e outras condições de negócios , portanto, a operação real definitivamente terá algum julgamento ou outra lógica de código.

Portanto, a principal lógica de negócios é principalmente explicar o que a interface faz especificamente, que é para compreensão de front-end, compreensão de design e compreensão de back-end, enquanto a lógica de negócios de operação real é explicar como a interface é implementada com a lógica de negócios, apenas para compreensão de back-end.

D1. Lógica de negócios principal

  1. Gere as informações básicas do produto e do skulist do produto de acordo com o DTO do produto, salve o produto e o skulist e, em seguida, gere e salve as informações da subtabela correspondente;
  2. Depois que o produto for adicionado com sucesso, se o produto tiver passado na revisão e estiver na prateleira, você precisará gerar a lista de índices de sku do produto es com base nas informações do produto e salvar a lista de índices de sku do produto es após a segmentação e armazenamento de palavras.

D2. Operação real da lógica de negócios

Em seguida, precisamos implementar ainda mais a lógica de negócios principal!

Ao introduzir a lógica de negócios, algumas outras estruturas de código serão envolvidas.Se houver necessidade de explicar, será marcada com sombreamento verde e, em seguida, será introduzida em detalhes na lógica de código a seguir.

GoodsStoreController#save:

  1. Obtenha o parâmetro de entrada DTO, chame o método de serviço para adicionar produtos;
  2. Return ResultUtil.success(), se houver uma exceção, digite a interceptação da exceção e retorne a exceção;

GoodsServiceImpl#addGoods:

  1. O construtor cria um objeto PO do produto e define as informações básicas no DTO para o PO do produto, que pode verificar se as informações do DTO são válidas;
  2. De acordo com o negócio, verifique e defina as informações do produto : 1. Determine se o tipo de produto é virtual ou físico e, em seguida, configure o modelo de entrega; 2. Determine se o id do produto existe, se ele é adicionado ou modificado; 3. Determine se o produto precisa ser revisado; 4. Julgue se o usuário atual é uma loja e defina as informações da loja;
  3. Defina a primeira imagem na lista de álbuns do produto como a imagem padrão do produto e obtenha a miniatura definida, etc.;
  4. Definir parâmetros de commodities , os parâmetros são convertidos para o tipo JSON e salvos;
  5. salvar as informações do produto; [As informações básicas do produto foram configuradas para esta etapa];
  6. Determine se há informações do catálogo de produtos GoodsGalleryList no DTO do produto, salve as informações do catálogo de produtos; [associação de subtabela]
  7. Determine se há informações de especificação do produto skuList no DTO do produto, use o construtor new a product skuPO object no loop for e defina as informações básicas do produto para o produto skuPO e, em seguida, defina as informações de especificação do produto para o produto skuPO ;
  8. Renderize de acordo com o modo de vendas . Se for um modo de atacado, você precisa renderizar as informações de sku e salvar as informações de atacado; [associação de subtabela]
  9. O primeiro na lista de álbuns definidos é a imagem padrão do álbum do produto e obtém a miniatura definida, etc.;
  10. Faça um loop do sku do produto, defina o primeiro conjunto na lista de imagens na especificação json como a imagem padrão do sku do produto e obtenha a miniatura do conjunto, etc.;
  11. Informações de SKU de mercadoria salvas em lote; [associação de subtabela]
  12. Modifique o estoque de commodities para ser a soma do estoque do sku de commodities ;
  13. Caso o produto tenha sido aprovado e esteja na prateleira, envie a mensagem rocketMq para gerar o es product sku index , sendo necessário apenas passar o id do produto.
  14. Quando o MQ é executado, as informações do produto e as informações do skulist do produto são obtidas por meio do ID do produto e, em seguida , as informações da lista EsGoodsIndex do índice sku do produto es são construídas com base nessas duas informações e a palavra segmentação é armazenada de acordo com os parâmetros do produto e o produto nomes na lista , e o produto es é salvo índice sku ;

Abaixo está uma captura de tela do método de adição de produtos do serviço. Para a lógica de código específica, consulte a análise de lógica de código abaixo ~~ 

C3. Lógica do código

D1. Construtor novo objeto PO de mercadoria

Em primeiro lugar, sabemos que a tabela product PO contém as informações básicas do produto, portanto pode ser atribuída diretamente através do construtor da classe PO. Como a tabela product DTO é relativamente complicada, ela precisa ser verificada antes de usar o método Objeto DTO para construir o objeto PO, e outras empresas também reutilizarão objetos DTO para construir objetos PO, portanto, adicione manualmente esse tipo de método de construção à classe PO ~

@EqualsAndHashCode(callSuper = true)
@Data
@TableName("li_goods")
@ApiModel(value = "商品")
public class Goods extends BaseEntity {
。。。
    public Goods(GoodsOperationDTO goodsOperationDTO) {
        //基本信息赋值
        this.goodsName = goodsOperationDTO.getGoodsName();
        this.categoryPath = goodsOperationDTO.getCategoryPath();
        this.storeCategoryPath = goodsOperationDTO.getStoreCategoryPath();
        this.brandId = goodsOperationDTO.getBrandId();
        this.templateId = goodsOperationDTO.getTemplateId();
        this.recommend = goodsOperationDTO.getRecommend();
        this.sellingPoint = goodsOperationDTO.getSellingPoint();
        this.salesModel = goodsOperationDTO.getSalesModel();
        this.goodsUnit = goodsOperationDTO.getGoodsUnit();
        this.intro = goodsOperationDTO.getIntro();
        this.mobileIntro = goodsOperationDTO.getMobileIntro();
        this.goodsVideo = goodsOperationDTO.getGoodsVideo();
        this.price = goodsOperationDTO.getPrice();
        if (goodsOperationDTO.getGoodsParamsDTOList() != null && goodsOperationDTO.getGoodsParamsDTOList().isEmpty()) {
            this.params = JSONUtil.toJsonStr(goodsOperationDTO.getGoodsParamsDTOList());
        }
        //判断是否立即上架
        this.marketEnable = Boolean.TRUE.equals(goodsOperationDTO.getRelease()) ? GoodsStatusEnum.UPPER.name() : GoodsStatusEnum.DOWN.name();
        this.goodsType = goodsOperationDTO.getGoodsType();
        //商品评分,初始100
        this.grade = 100D;

        //循环sku,判定sku是否有效,根据销售模式、商品类型
        /*
            sn 、quantity:是任何销售模式下、任何商品类型下都有的
            price、cost:是零售销售模式下、任何商品类型下有的
            weight:是任何销售模式下、商品实物类型下有的
         */
        for (Map<String, Object> sku : goodsOperationDTO.getSkuList()) {
            //判定参数不能为空
            if (!sku.containsKey("sn") || sku.get("sn") == null) {
                throw new ServiceException(ResultCode.GOODS_SKU_SN_ERROR);
            }
            if (!sku.containsKey("quantity") || StringUtil.isEmpty(sku.get("quantity").toString()) || Convert.toInt(sku.get("quantity").toString()) < 0) {
                throw new ServiceException(ResultCode.GOODS_SKU_QUANTITY_ERROR);
            }
            //判断参数是否有效,并且是非批发销售模式下的
            if ((!sku.containsKey("price") || StringUtil.isEmpty(sku.get("price").toString()) || Convert.toDouble(sku.get("price")) <= 0)
                    //非批发销售模式。添加此判断是因为成本和价格仅针对零售销售模式而言,但是前端有可能会先填写过零售模式的规格后又修改为批发模式,就会导致price参数不对,如果是批发销售模式此参数就无所谓了
                    && !goodsOperationDTO.getSalesModel().equals(GoodsSalesModeEnum.WHOLESALE.name())) {
                throw new ServiceException(ResultCode.GOODS_SKU_PRICE_ERROR);
            }
            if ((!sku.containsKey("cost") || StringUtil.isEmpty(sku.get("cost").toString()) || Convert.toDouble(sku.get("cost")) <= 0)
                    //非批发销售模式
                    && !goodsOperationDTO.getSalesModel().equals(GoodsSalesModeEnum.WHOLESALE.name())) {
                throw new ServiceException(ResultCode.GOODS_SKU_COST_ERROR);
            }
            //虚拟商品没有重量字段
            if (this.goodsType.equals(GoodsTypeEnum.PHYSICAL_GOODS.name()) &&
                    (!sku.containsKey("weight") || sku.containsKey("weight") && (StringUtil.isEmpty(sku.get("weight").toString()) || Convert.toDouble(sku.get("weight").toString()) < 0))) {
                throw new ServiceException(ResultCode.GOODS_SKU_WEIGHT_ERROR);
            }
            sku.values().forEach(i -> {
                if (CharSequenceUtil.isBlank(i.toString())) {
                    throw new ServiceException(ResultCode.MUST_HAVE_GOODS_SKU_VALUE);
                }
            });
        }
    }
。。。
}

D2. De acordo com o negócio, verifique e defina as informações do produto

Contar apenas com o novo objeto PO do construtor não é o mais completo, podendo haver serviços especiais que precisem ser modificados novamente, então adicione um cuidado especial para lidar com serviços especiais.

Por exemplo, o seguinte negócio precisa ser adicionado aqui:

//cn.lili.modules.goods.serviceimpl.GoodsServiceImpl
    /**
     * 根据业务,检查商品信息
     * 如果商品是虚拟商品则无需配置配送模板
     * 如果商品是实物商品需要配置配送模板
     * 判断商品id是否存在。修改商品时会复用此方法
     * 判断商品是否需要审核。系统配置里面设置的
     * 判断当前用户是否为店铺,并设置店铺信息
     *
     * @param goods 商品
     */
    private void checkGoods(Goods goods) {
        //判断商品类型,是虚拟的还是实物的
        switch (goods.getGoodsType()) {
            case "PHYSICAL_GOODS":
                if ("0".equals(goods.getTemplateId())) {
                    throw new ServiceException(ResultCode.PHYSICAL_GOODS_NEED_TEMP);
                }
                break;
            case "VIRTUAL_GOODS":
                if (!"0".equals(goods.getTemplateId())) {
                    goods.setTemplateId("0");
                }
                break;
            default:
                throw new ServiceException(ResultCode.GOODS_TYPE_ERROR);
        }
        //检查商品是否存在--修改商品时使用
        if (goods.getId() != null) {
            this.checkExist(goods.getId());
        } else {
            //评论次数
            goods.setCommentNum(0);
            //购买次数
            goods.setBuyCount(0);
            //购买次数
            goods.setQuantity(0);
            //商品评分
            goods.setGrade(100.0);
        }

        //获取商品系统配置决定是否审核
        Setting setting = settingService.get(SettingEnum.GOODS_SETTING.name());
        GoodsSetting goodsSetting = JSONUtil.toBean(setting.getSettingValue(), GoodsSetting.class);
        //set审核状态
        goods.setAuthFlag(Boolean.TRUE.equals(goodsSetting.getGoodsCheck()) ? GoodsAuthEnum.TOBEAUDITED.name() : GoodsAuthEnum.PASS.name());
        //判断当前用户是否为店铺
        if (Objects.requireNonNull(UserContext.getCurrentUser()).getRole().equals(UserEnums.STORE)) {
            StoreVO storeDetail = this.storeService.getStoreDetail();
            if (storeDetail.getSelfOperated() != null) {
                goods.setSelfOperated(storeDetail.getSelfOperated());
            }
            goods.setStoreId(storeDetail.getId());
            goods.setStoreName(storeDetail.getStoreName());
            goods.setSelfOperated(storeDetail.getSelfOperated());
        } else {
            throw new ServiceException(ResultCode.STORE_NOT_LOGIN_ERROR);
        }
    }

D3. Obtenha a miniatura do conjunto [as miniaturas de commodities são unificadas e explicadas aqui]

Cada produto e sku de produto tem sua própria imagem padrão separada, bem como a miniatura e a imagem pequena da imagem padrão.

Há uma diferença entre esta imagem padrão e a lista de álbuns e geralmente a primeira imagem na lista de álbuns será usada como imagem padrão.

  • A imagem padrão do produto, que pode ser usada para a imagem exibida na lista da lista de produtos S-end;
  • A imagem padrão do sku do produto, que pode ser usada para a imagem exibida na lista ao pesquisar produtos no lado B;
  • Não sei onde é usado para o álbum do produto, mas o sku do produto, ou seja, a imagem da especificação do produto, é por padrão o [ao adicionar/modificar produtos no lado S] do álbum do produto tirado, mas o álbum sku pode ser modificado;
  • O álbum de sku do produto, que pode ser usado para a imagem do produto exibida à esquerda quando os detalhes do produto são abertos no lado B;

Quando os usuários adicionam/modificam produtos, eles carregam fotos e, em seguida, obtêm o URL de armazenamento de imagens. [Para o método de upload, consulte cn.lili.controller.common.UploadController#upload, que é carregado no OSS do Alibaba Cloud]

Então, ao adicionar um produto, ele obterá sua miniatura e outras informações de acordo com a URL da imagem original acima. Como pode ser reutilizado, é abstraído em um método.

 O mesmo vale para a imagem padrão do sku do produto, então não vou repetir aqui

D4. definir parâmetros de commodities

Isso é apenas para registrar, os parâmetros do produto são armazenados como JSON e serão convertidos no tipo de parâmetro do produto nas funções subsequentes, como obter informações do produto, sem negócios complicados. O ponto principal é que o formato de passagem de valor do front-end deve ser consistente com o tipo de objeto pojo correspondente no back-end~~ Caso contrário, a conversão do formato json falhará!

D5. Construtor novo objeto skuPO de mercadoria

Os produtos terão skus de produto com especificações diferentes. Por exemplo, o celular XX tem quatro skus de produto: memória amarela 60G, memória branca 60G, memória amarela 120G e memória branca 120G. Assim como quando queremos comprar um telefone celular quando visitamos o Taobao, devemos selecionar a especificação e o modelo para determinar o SKU do produto antes de fazer um pedido.

Portanto, o sku do produto também é relativamente complicado, e as informações de especificação do sku são adicionadas com base em parte das informações do produto, o que equivale a uma subtabela do produto. Como muitas funções de negócios, como a função de adicionar produtos seckill, são operadas de acordo com o sku do produto, o sistema da loja armazena diretamente parte das informações do produto na tabela sku, de modo que, ao consultar, basta consultar diretamente o sku tabela. Se as informações do produto forem modificadas, também modificará as informações correspondentes no sku do produto e, em seguida, adicionará ou atualizará ~

É simples de dizer, mas os detalhes são um pouco complicados.

Em primeiro lugar, como existem vários skus, é necessário um loop for para criar GoodsSku e definir suas informações. As informações de especificação em cada GoodsSku são divididas em dois tipos, um é original e fixo ("sn", "custo", " preço", "quantidade", "peso"), um é definido pelo usuário ("cor", "memória" etc.), para fixo, podemos usar campos fixos, para personalizado, podemos usar apenas json O formato é armazenados e de fácil acesso.

Como a construção de skulist será reutilizada em muitos lugares, é mais conveniente abstraí-la diretamente no Builder~

 

 D6. Renderização do modelo de vendas

 Em primeiro lugar, precisamos saber por que a renderização do modo de vendas é colocada aqui?

Existem dois modelos de vendas: varejo e atacado. O varejo é muito simples, basta adicionar as especificações normais do produto, enquanto o atacado será um sku de produto especial.

Primeiro, olhe para o design da página:

 

 Assim, podemos saber que, no modo de atacado, as especificações de atacado são determinadas de acordo com o modo de atacado, e os preços de todas as mercadorias sku são os mesmos ~~~

Observação: No modo de atacado, você precisa preencher o peso individual do produto. Esse peso é o peso de todos os skus do produto. O front-end definirá o peso do sku como um peso unificado ~

Depois de entender o relacionamento, podemos operar diretamente no modo atacado ao editar as informações do sku, que podem ser entendidas como a renderização dos dados do sku.

O sistema de loja fornece uma classe abstrata de renderização de modo de vendas separada e, em seguida, implementa uma classe de renderização de modo de atacado, por meio da qual o sku de mercadoria é associado à classe de negócios de atacado.

 

D7. Modifique o estoque de commodities para ser a soma do estoque do sku de commodities

Na verdade, não há lógica nisso, mas estou me perguntando por que a soma do inventário é colocada na lista de sku recém-adicionada e a modificação do banco de dados é chamada? 

Como não há como obter o estoque total diretamente ao salvar o produto antes, e o armazenamento de sku após obter a lista de sku neste método GoodsSkuServiceImpl#add requer o ID do produto, portanto, obtenha o inventário do produto e salve-o em um loop antes salvar o produto e executar o processamento de pré-processamento ou pós-processamento após obter o inventário por meio do skulist aqui.

D8. Envie a mensagem rocketMq que gera o índice es commodity sku 

Para o lado S da loja, o principal é adicionar produtos de sucesso e informações de sku de produtos. Como o membro B precisa navegar e pesquisar produtos e a quantidade de dados é grande, introduzimos o mecanismo de pesquisa es. Então, quando o produto e outras informações são armazenadas no mysql, é necessário julgar se deve adicioná-lo ao mecanismo de pesquisa es de acordo com o negócio, ou seja, gerar o índice sku do produto es em es! ! !

Como o negócio de geração de índices por es é voltado principalmente para o lado B do membro, isso não afeta o negócio de adição de produtos no lado S da loja, portanto essa operação pode ser adicionada ao mp, o que equivale a uma operação assíncrona ~~~

Usamos diretamente o ID do produto como a mensagem a ser transmitida. Depois que o mq o monitora, primeiro obtemos as informações do produto e as informações do sku do produto por meio do id do produto e, em seguida, executamos outras operações. As informações do produto não serão transmitidas diretamente aqui. Primeiro , a quantidade de dados é grande. Em segundo lugar, os dados em tempo real do produto não podem ser garantidos.

 ​​​

D9. Construa as informações da lista EsGoodsIndex do índice SKU de commodities

Esta etapa é problemática e não complicada. Primeiro, obtemos as informações do produto e as informações da lista de sku do produto por meio do id do produto e, em seguida, definimos o valor de cada objeto sku do produto es.

Deve-se observar aqui que o campo de objeto sku do produto es deve estar em conformidade com a exibição do front-end. E alguns valores de status não podem faltar! ! !

D10. Armazenamento de segmentação de palavras

Registre-o aqui e, em seguida, descreva a palavra segmentação em detalhes ao analisar o lado B para obter produtos.

Índice de sku de commodities D11.save es

Registre-o aqui, pois ele é salvo em arquivos comuns, então é só usar a interface do ElasticsearchRepository diretamente!

 


C3. Resumo

Na lógica de interface de produto recém-adicionada analisada acima, a lógica chave é descrita e o julgamento de status envolvido (como a configuração do status de revisão do produto) não será descrito em detalhes e deve seguir o design.

Outra coisa é que a lógica de adicionar uma interface de produto e editar uma interface de produto é semelhante, mas existem algumas diferenças. Portanto, haverá alguns métodos de reutilização~~~, vamos nos concentrar em introduzir os métodos de reutilização na lógica de edição~~~

A2. Registros de ferramentas de terceiros (podem ser ignorados)

B1.hutool

Uso da ferramenta C1.JSONUtil

  1. String JSONUtil#toJsonStr(java.lang.Object) Converter objeto em json
  2. T JSONUtil#toBean(java.lang.String, java.lang.Class<T>) converte json em objeto
  3. List<T> JSONUtil#toList(java.lang.String, java.lang.Class<T>) Converter json em lista de objetos

Acho que você gosta

Origin blog.csdn.net/vaevaevae233/article/details/128628548
Recomendado
Clasificación