【小西】优化生日品同步网易严选功能,使其支持多SPU对多SKU关系

目录

  • 前言
  • 思路
  • 代码实现
    • 实体ThemeActivityGift:spuId由 String类型变为JSONArray
    • ThemeActivityGiftServiceImpl改造
      • handleYxGiftByOperation:保存的是严选的生日品
      • checkSpuIds:校验SPU有效性
      • checkSpuIdExist:校验单个spuId是否存在
      • checkSkuIds:校验SKUs的有效性
      • checkSkuIdExist:校验单个SKU ID是否存在
      • checkNoRepeatValue:判断是否有重复的值

前言

业务需求如下:
在这里插入图片描述
内心觉得这个需求写的真“棒”,我花了好长时间才理解清楚,这需求的写法对刚加入进来项目的新人一点都不友好。唉,而且这个需求它写出来都有错(改善点中应该是SPUID而不是SKUID),所以啊工作中还是要多交流,不然呵呵 ,被带偏绝对跑不了,增加开发难度,唉

思路

首先:理解业务需求:
现状:上架网易严选生日品的功能中SPU名称不支持输入多个值,SPU名称和SKU列表是一对多关系。需加入多SPU对多SKU的场景。

重点:从一个开发者角度考虑的场景,这个思路清晰了可帮助我们自测代码,减少BUG。

我觉得场景可以分以下四种情况:
第一种:输入正确的SPU和SKU

1、单SPU+单SKU通过
2、单SPU+多SKU通过
3、多SPU+多SKU通过

第二种:输入错误的SPU和SKU

1、单SPU+单SKU不通过
2、单SPU+多SKU不通过
3、多SPU+多SKU不通过

第三种:添加是正确的但不是网易严选的SPU 不通过

第四种:重复插入的SPU 不通过

重点考虑多SPU+多SKU 的校验场景,我的想法为:验证SKU的模块中,只要所有的sku去遍历spu,只要校验通过其中一个spu,就算校验成功。

举例如下:
商品A和B的SPU和SKU如下所示:

ASPU:10018002 SKU :10019005
BSPU:1273186784766128130 SKU:1273186784774516738,1273186784778711042

现在在前端输入多SPU+多SKU,如下所示:

名称SPU列表和SKU列表
A+BSPU:10018002,1273186784766128130 SKU : 10019005,1273186784774516738,1273186784778711042

那么校验SKU时,只要SKU中的值和其中一个SPU校验通过,就算成功。

代码实现

实体ThemeActivityGift:spuId由 String类型变为JSONArray

    /*** 对接网易严选的spuName*/private String spuName;/*** 对接网易严选的spuId(外键)*/@TableField(typeHandler = JsonArrayTypeHandler.class, jdbcType = JdbcType.VARCHAR)private JSONArray spuIdArray;/*** 对接网易严选的skuIdArray(外键)*/@TableField(typeHandler = JsonArrayTypeHandler.class, jdbcType = JdbcType.VARCHAR)private JSONArray skuIdArray;

ThemeActivityGiftServiceImpl改造

礼品新增功能访问的是如下方法:

    /*** @Description: 主题活动礼品新增*/@Overridepublic R saveGift(ThemeActivityGiftDTO themeActivityGiftDto) {//虚拟商品的积分值不能为空,请检查if (ObjectUtil.isNotNull(themeActivityGiftDto.getIsVirtual()) && themeActivityGiftDto.getIsVirtual().equals(WelfareBlessingVirtualEnum.IS_VIRTUAL.getValue())) {if (ObjectUtil.isNull(themeActivityGiftDto.getPointsValue())) {return R.failed("虚拟商品的积分值不能为空,请检查");}}//对9级的逻辑进行礼品价格层面的限制。//保存的是网易品if (StrUtil.isAllNotBlank(themeActivityGiftDto.getSpuIds(), themeActivityGiftDto.getSpuName(), themeActivityGiftDto.getSkuIds())) {Pair<Boolean, String> handleResult = handleYxGiftByOperation(themeActivityGiftDto, WelfareConst.OPERATION_CREATE);if (handleResult.getKey().equals(Boolean.FALSE)) {return R.failed(handleResult.getValue());}return R.ok();}ThemeActivityGift themeActivityGift = BeanUtil.copyProperties(themeActivityGiftDto, ThemeActivityGift.class);//保存的是主题活动if (themeActivityGift.getType().equals(ThemeActivityGiftTypeEnum.DEFAULT.getValue())) {if (StrUtil.hasBlank(themeActivityGiftDto.getSpec(), themeActivityGiftDto.getSpecValueString())) {return R.failed("请输入对应的规格以及规格值!");}String spec = themeActivityGiftDto.getSpec();String specValues = themeActivityGiftDto.getSpecValueString();themeActivityGift.setSpec(spec);themeActivityGift.setSpecValueArray(JSONUtil.parseArray(StrUtil.splitToArray(specValues, ThemeActivityConst.COMMA)));}themeActivityGift.setSpuName(null);themeActivityGift.setSpuIdArray(null);themeActivityGift.setSkuIdArray(null);return R.ok(baseMapper.insert(themeActivityGift));}

要对其中网易品实现方法handleYxGiftByOperation进行改造,重点改造checkSpuIds()和checkSkuIds()方法

handleYxGiftByOperation:保存的是严选的生日品

    /*** @Description: 保存的是严选的生日品*/private Pair<Boolean, String> handleYxGiftByOperation(ThemeActivityGiftDTO themeActivityGiftDto, int operation) {String spuIds = themeActivityGiftDto.getSpuIds();String skuIds = themeActivityGiftDto.getSkuIds();Pair<Boolean, String> checkSpuIdFlag = checkSpuIds(themeActivityGiftDto, spuIds);Pair<Boolean, String> checkSkuIdFlag = checkSkuIds(spuIds, skuIds);if (Boolean.FALSE.equals(checkSpuIdFlag.getKey())) {return new Pair<>(Boolean.FALSE, checkSpuIdFlag.getValue());}if (Boolean.FALSE.equals(checkSkuIdFlag.getKey())) {return new Pair<>(Boolean.FALSE, checkSkuIdFlag.getValue());}ThemeActivityGift themeActivityGift = BeanUtil.copyProperties(themeActivityGiftDto, ThemeActivityGift.class);themeActivityGift.setSpuIdArray(JSONUtil.parseArray(StrUtil.splitToArray(spuIds, ThemeActivityConst.COMMA)));themeActivityGift.setSkuIdArray(JSONUtil.parseArray(StrUtil.splitToArray(skuIds, ThemeActivityConst.COMMA)));if (WelfareConst.OPERATION_CREATE == operation) {baseMapper.insert(themeActivityGift);} else {baseMapper.updateById(themeActivityGift);}return new Pair<>(Boolean.TRUE, null);}

checkSpuIds:校验SPU有效性

 /*** @Description: 校验SPU有效性*/private Pair<Boolean, String> checkSpuIds(ThemeActivityGiftDTO themeActivityGiftDto, String spuIdArrays) {//兼容新建礼品时,没有giftIdString giftId = ObjectUtil.isNotNull(themeActivityGiftDto.getId()) ? themeActivityGiftDto.getId() : "";if (StrUtil.isBlank(spuIdArrays)) {return new Pair<>(Boolean.FALSE, "spuIds不能为空,请检查");}//把string转化为数据库存储的数组形式来进行新增重复数据校验,如10018002,1273186784766128130 转化为["10018002,1273186784766128130"]spuIdArrays=spuIdArrays.replace(",", "\",\"");spuIdArrays="[\""+spuIdArrays+"\"]";//在更新礼品记录时,校验重复,不能与自身记录进行判断Wrapper<ThemeActivityGift> queryWrapper;if (StrUtil.isBlank(giftId)) {queryWrapper = Wrappers.<ThemeActivityGift>lambdaQuery().eq(ThemeActivityGift::getSpuIdArray,spuIdArrays);} else {queryWrapper = Wrappers.<ThemeActivityGift>lambdaQuery().eq(ThemeActivityGift::getSpuIdArray, spuIdArrays).ne(ThemeActivityGift::getId, giftId);}ThemeActivityGift themeActivityGift = this.baseMapper.selectOne(queryWrapper);if (ObjectUtil.isNotNull(themeActivityGift)) {return new Pair<>(Boolean.FALSE, "该SpuId已与现有的礼品绑定,请检查");}//重复校验完后进行复原spuIdArrays=spuIdArrays.replace("\",\"",",");spuIdArrays=spuIdArrays.replace("[\"", "");spuIdArrays=spuIdArrays.replace("\"]", "");//多个SPUif (spuIdArrays.contains(ThemeActivityConst.COMMA)) {String[] spuIdArray = StrUtil.splitToArray(spuIdArrays, ThemeActivityConst.COMMA);if (!checkNoRepeatValue(spuIdArray)) {return new Pair<>(Boolean.FALSE, "检测到重复的spuId,请检查");}for (String spuId : spuIdArray) {if (!checkSpuIdExist(spuId)) {return new Pair<>(Boolean.FALSE, "校验单个SPU ID是否存在失败,spuId =" + spuId);}}return new Pair<>(Boolean.TRUE, null);}//单个SPUif (!checkSpuIdExist(spuIdArrays)) {return new Pair<>(Boolean.FALSE, "校验单个SPU ID是否存在失败, spuIdArrays =" + spuIdArrays);}return new Pair<>(Boolean.TRUE, null);}

checkSpuIdExist:校验单个spuId是否存在

	/*** @Description: 校验单个spuId是否存在*/private boolean checkSpuIdExist(String spuId) {log.info("checkSpuIdExist spuId= 【{}】", spuId);GoodsSpu goodsSpu = goodsSpuService.getById(spuId);if (ObjectUtil.isNull(goodsSpu)) {log.info("获取GoodSpu异常,请检查");return  Boolean.FALSE;}if (!ProductChannelEnum.YANXUAN.getValue().equals(goodsSpu.getChannel())) {log.info("维护的SpuId并非网易严选的品,请检查");return  Boolean.FALSE;}return Boolean.TRUE;}

checkSkuIds:校验SKUs的有效性

    /*** @Description: 校验SKUs的有效性*/private Pair<Boolean, String> checkSkuIds(String spuIds, String skuIdArrays) {if (StrUtil.isBlank(skuIdArrays)) {return new Pair<>(Boolean.FALSE, " SKU ID数组不能为空,请检查");}//多个SKUif (skuIdArrays.contains(ThemeActivityConst.COMMA)) {String[] skuIdArray = StrUtil.splitToArray(skuIdArrays, ThemeActivityConst.COMMA);if (!checkNoRepeatValue(skuIdArray)) {return new Pair<>(Boolean.FALSE, "检测到重复的skuId,请检查");}for (String skuId : skuIdArray) {if (!checkSkuIdExist(spuIds, skuId)) {return new Pair<>(Boolean.FALSE, "获取GoodSku异常,校验单个SKU ID是否存在,skuId =" + skuId);}}return new Pair<>(Boolean.TRUE, null);}//单个SKUif (!checkSkuIdExist(spuIds, skuIdArrays)) {return new Pair<>(Boolean.FALSE, "获取GoodSku异常,校验单个SKU ID是否存在, skuIdArrays =" + skuIdArrays);}return new Pair<>(Boolean.TRUE, null);}

checkSkuIdExist:校验单个SKU ID是否存在

       /*** @Description: 校验单个SKU ID是否存在*/private boolean checkSkuIdExist(String spuIds, String skuId) {log.info("checkSkuIdExist spuIds= 【{}】,skuId= 【{}】", spuIds, skuId);GoodsSku goodsSku = goodsSkuService.getById(skuId);if (ObjectUtil.isNull(goodsSku)) {log.error("checkSkuIdExist fail. goodsSku是空的!请检查!");return Boolean.FALSE;}//多SPUif (spuIds.contains(ThemeActivityConst.COMMA)) {String[] spuIdArray = StrUtil.splitToArray(spuIds, ThemeActivityConst.COMMA);boolean  checkSpuFlag=false;//检查多spu+多spu的情况,只要spu和其中一个sku对应上,就检验成功for (String  spuId : spuIdArray) {if (StrUtil.equals(spuId, goodsSku.getSpuId())) {checkSpuFlag=true;}}if (checkSpuFlag) {return Boolean.TRUE;}else{log.error("checkSkuIdExist fail. 添加的skuId必须是属于这个spu商品的!请检查!");return Boolean.FALSE;}} else{//单SPUif (!StrUtil.equals(spuIds, goodsSku.getSpuId())) {log.error("checkSkuIdExist fail. 添加的skuId必须是属于这个spu商品的!请检查!");return Boolean.FALSE;}}return Boolean.TRUE;}

checkNoRepeatValue:判断是否有重复的值

    /*** @Description: 判断是否有重复的值*/public static boolean checkNoRepeatValue(String[] array) {HashSet<String> hashSet = new HashSet<>();for (int i = 0; i < array.length; i++) {hashSet.add(array[i]);}if (hashSet.size() == array.length) {return Boolean.TRUE;}return Boolean.FALSE;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/43481.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【小西】通过商品渠道新增咪咕埋点功能,ThreadUtil.execAsync()线程异步

前言 通过商品渠道新增咪咕埋点功能&#xff1a;当用户通过小西访问了咪咕相关的商品时&#xff0c;需要把这访问记录下来&#xff0c;发送给咪咕方。 实现 打算在咪咕商品api里写实现逻辑。因为小西是访问的第三方接口&#xff0c;可能会出现一些不可控因素&#xff0c;如&…

【小西】同步咪咕订单给咪咕方(写接口给第三方)

同步咪咕订单给咪咕方 前言思路实现1、定义请求体和响应信息MiGuOrderSyncReqMiGuOrderSyncResp 2、nacos定义好咪咕相关配置信息3、同步咪咕参数配置4、MiGuOrderSyncControl5、MiGuOrderSyncService6、MiGuOrderSyncServiceImplCreateAscIISignUtil 生成参数 字典排序 签名Hm…

【小西】优化若依导出功能,若依继承导出

前言 现需求是在原有的导出功能基础上&#xff0c;新增两列。 实现 因为新增两列不是数据库表中字段。因此&#xff0c;需要需要建立一个VO类。 原本想用若依继承导出&#xff0c;如下所示&#xff1a; Data public class ThemeActivityUserVO extends ThemeActivityUser…

极光尔沃A6-3d打印机体验

第一次使用3d打印机来打印模件&#xff0c;打印的是机械臂夹爪部位的小零件&#xff0c;设计的效果图如下图1所示。 图1&#xff1a;设计的夹爪部位原图 1、模件的设计 本模件使用的是solidworks软件进行的设计&#xff0c;当然可以使用其他的软件设计。最终保存的时候要以.st…

微信小游戏开发新手教程1-人人都能做游戏

如果你正在阅读这篇文章&#xff0c;那么你就是我所说的“人人”了。在此我默认你符合如下的几个条件&#xff1a; 有一定的阅读理解能力对做游戏有一定的兴趣&#xff08;否则你为什么要看这篇文章呢&#xff09;有一台电脑&#xff08;做游戏至少需要一台电脑&#xff09; …

一起用Go做一个小游戏(下)

打包资源 使用file2byteslice包我们可以将图片和config.json文件打包进二进制程序中&#xff0c;之后编译生成一个二进制程序。然后拷贝这一个文件即可&#xff0c;不用再拷贝图片和其他配置文件了。 golang有很多第三方包可以将打包资源&#xff0c;原理其实很简单——读取资源…

chatgpt赋能python:Python简单小游戏制作教程——让你学会编写游戏代码

Python简单小游戏制作教程——让你学会编写游戏代码 Python是一种高级编程语言&#xff0c;越来越受欢迎&#xff0c;因为它易于学习和使用&#xff0c;而且灵活性非常高。在这篇文章中&#xff0c;我们将教你如何用Python编写一个简单的小游戏。让我们开始吧&#xff01; 需…

ChatGPT-4终究会取代人类嘛?

随着人工智能技术的迅速发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;已经成为了一个热门领域。其中&#xff0c;ChatGPT-4是一个备受瞩目的自然语言处理工具。在2022年高考语文中&#xff0c;ChatGPT-4表现出色&#xff0c;说明它在自然语言处理领域有很强的实力。…

宋宝华: 僵尸进程的成因以及僵尸可以被“杀死”吗?

僵尸不可能被杀死&#xff0c;因为它已经死了&#xff0c;不存在再死一次的问题。死的对立面是活&#xff0c;死者已死。只有活的进程才可能被杀死。 什么是僵尸 首先要明确一点&#xff0c;僵尸进程的含义是&#xff1a;子进程已经死了&#xff0c;但是父进程还没有wait它的一…

僵尸进程zombie与孤儿进程orphan

代码已上传至https://github.com/gatieme/AderXCoding/tree/master/system/unix/zombie 问题提出 以前在学习《unix环境高级编程》进程时候&#xff0c;提到孤儿进程和僵尸进程&#xff0c;但是一直对这两个概念比较模糊。于是今天做了一些测试程序,并把这些记录下来. 僵尸进程…

僵尸进程以及如何处理僵尸进程

僵尸进程&#xff1a;就是已经结束了的进程&#xff0c;但是没有从进程表中删除。太多了会导致进程表里面条目满了&#xff0c;进而导致系统崩溃&#xff0c;倒是不占用其他系统资源。最后有defunct的标记&#xff0c;就表明是僵尸进程。 今天配置Redis的时候结束停止Redis服务…

僵尸进程的一点玩法

僵尸进程的一点玩法 前言被忽略的RundownProtectionExAcquireRundownProtection 应用总结 前言 这几天在看WRK的时候&#xff0c;偶然间发现的一个东西&#xff0c;逆向之后&#xff0c;发现了个僵尸进程的玩法。目前菜鸡一枚&#xff0c;有说的不准确的地方&#xff0c;请大家…

PAT——1094 谷歌的招聘

2004 年 7 月&#xff0c;谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌&#xff08;如下图&#xff09;用于招聘。内容超级简单&#xff0c;就是一个以 .com 结尾的网址&#xff0c;而前面的网址是一个 10 位素数&#xff0c;这个素数是自然常数 e 中最早出现的 10 位连续…

PTA—7-5 谷歌的招聘

实际上这题是不难的&#xff0c;甚至说有点简单&#xff0c;连我这样的小菜比都可以顺利的AC。 废话不多说来看题目。 2004 年 7 月&#xff0c;谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌&#xff08;如下图&#xff09;用于招聘。内容超级简单&#xff0c;就是一个以…

AI对话AI才是正解?KAUST研究团队提出基于角色扮演的大模型交互代理框架CAMEL

电影《盗梦空间》中有这样一句非常经典的台词&#xff1a; “世上最具有可塑性的寄生虫是什么&#xff1f;是人类的想法。人类大脑中一个简单的想法&#xff0c;就可以建立一座庞大的城市。有时一个想法也可以改变世界&#xff0c;并改写一切规则&#xff0c;这就是我为什么要…

chatGpt的快捷使用

首页的界面&#xff0c;非常好看&#xff0c;有我经常使用的入口 第一步&#xff1a;打开edge浏览器 第二步&#xff1a;右上角的扩展程序 第三步&#xff1a;点击 扩展 第四步&#xff1a; 第五步&#xff1a; 第六步&#xff1a; 第七步&#xff1a; 新打开Tab页&#xf…

windows下通过远程桌面访问linux图形界面

一、安装epel库 epel库安装之前无法使用yum install xrdp命令安装xrdp 命令&#xff1a;yum install epel-release之后会自动匹配对应版本的rpm包&#xff0c;并解决依赖关系进行安装。 二、安装xrdp xrdp作为linux的图形化界面 1.命令&#xff1a;yum install xrdp2.开启…

如何在Mac上快速显示桌面以便快速访问

macOS 环境中充满了可用于执行有用任务的快捷方式和手势。其中之一被简单地命名为“显示桌面”。当您打开一大堆应用程序窗口时&#xff0c;这个方便的功能可以为您节省宝贵的时间。一起来看看如何在Mac上快速显示桌面的方法吧。 1.使用触控板手势 触控板手势可能很难描述&…

大牛证券解析恒指大跌800点+全球股市大跌

今日两市差异化或许是像上一年白马抱团强化相同&#xff0c;而本年白马被丢掉&#xff0c;接力的科技与锂电&#xff0c;而这两个板块特别是&#xff08;成果爆发工作高成长为特性&#xff09;&#xff0c;锂电有宁德时代&#xff0c;比亚迪、容百科技等&#xff0c;芯片&#…

股票大跌期权对冲

股票期权的出世标示着股票能够及时止损&#xff0c; 股票期权能够很好的与股票做对冲&#xff0c;可以把股票亏损的风险降低&#xff0c;减少投资者面对股票行情下跌产生的亏损。 股票期权的上市让股票多了一种对冲方式&#xff0c;投资者买入股票的时候同时买入一手认沽期权&…