From 86675be1a3bd1909220b544fc0e680a6978f9a26 Mon Sep 17 00:00:00 2001 From: Yen Date: Tue, 3 Sep 2024 17:12:00 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20spu=E5=AF=BC=E5=85=A5=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=EF=BC=9Bopt:=20=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1=E9=80=82?= =?UTF-8?q?=E9=85=8D=E5=85=AC=E4=BC=97=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qs/serve/controller/WxSvcLoginApi.java | 6 ++- .../BirActivityCenterGoodsController.java | 18 ++++++++ .../bms/controller/BmsRegionController.java | 19 ++++++-- .../goods/controller/GoodsSkuController.java | 12 ++++- .../controller/GoodsSkuOptionController.java | 12 ++--- .../goods/controller/GoodsSpuController.java | 46 +++++++++++++------ .../controller/GoodsSpuOptionController.java | 13 +++++- .../serve/modules/goods/entity/GoodsSku.java | 17 +++++++ .../serve/modules/goods/entity/GoodsSpu.java | 10 ++++ .../goods/entity/vo/GoodsSkuExportVo.java | 45 +++++++++++++++++- .../goods/entity/vo/GoodsSpuExportVo.java | 38 +++++++++++++++ .../qs/serve/modules/wx/api/WxSvcUserApi.java | 23 +++++++--- .../wx/service/impl/WxUserServiceImpl.java | 3 +- .../resources/mapper/goods/GoodsSkuMapper.xml | 3 ++ .../resources/mapper/goods/GoodsSpuMapper.xml | 2 + 15 files changed, 232 insertions(+), 35 deletions(-) diff --git a/src/main/java/com/qs/serve/controller/WxSvcLoginApi.java b/src/main/java/com/qs/serve/controller/WxSvcLoginApi.java index 2276308b..da183cbf 100644 --- a/src/main/java/com/qs/serve/controller/WxSvcLoginApi.java +++ b/src/main/java/com/qs/serve/controller/WxSvcLoginApi.java @@ -1,5 +1,6 @@ package com.qs.serve.controller; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.qs.serve.common.framework.redis.RedisService; import com.qs.serve.common.framework.security.model.LoginUser; import com.qs.serve.common.framework.security.model.LoginUserType; @@ -73,12 +74,15 @@ public class WxSvcLoginApi { try { wxUser = wxUserService.login(wxLoginUser,request); } catch (Exception e) { - log.warn(e.getMessage()); + Assert.throwEx(e.getMessage()); } if(wxUser==null){ Assert.throwEx(HttpCode.WX_ERR); } + + Map objectMap = genTokenInfo(request, wxUser); + return R.ok(objectMap); } diff --git a/src/main/java/com/qs/serve/modules/bir/controller/BirActivityCenterGoodsController.java b/src/main/java/com/qs/serve/modules/bir/controller/BirActivityCenterGoodsController.java index 32ae9f5f..8fd0ddc1 100644 --- a/src/main/java/com/qs/serve/modules/bir/controller/BirActivityCenterGoodsController.java +++ b/src/main/java/com/qs/serve/modules/bir/controller/BirActivityCenterGoodsController.java @@ -29,6 +29,7 @@ import com.qs.serve.modules.bms.service.BmsChannelService; import com.qs.serve.modules.bms.service.BmsSupplierChannelService; import com.qs.serve.modules.his.service.HisUserChannelPointService; import com.qs.serve.modules.oss.service.OssService; +import com.qs.serve.modules.tbs.common.TbsCostApplyState; import com.qs.serve.modules.tbs.entity.*; import com.qs.serve.modules.tbs.mapper.*; import com.qs.serve.modules.tbs.service.TbsActivityChannelService; @@ -116,6 +117,23 @@ public class BirActivityCenterGoodsController { return R.ok(); } + /** + * 移除退回的费用申请 + * @return + */ + @GetMapping("/toSyncBackCost") + public R toSyncBackCost(){ + List list = tbsCostApplyService.list(new LambdaQueryWrapper() + .eq(TbsCostApply::getChargeState, TbsCostApplyState.State_4_refused.getCode()) + .orderByDesc(TbsCostApply::getId) + .last(" limit 10000") + ); + for (TbsCostApply costApply : list) { + centerGoodsService.rebuildBir(Arrays.asList(costApply.getId())); + } + return R.ok(); + } + @GetMapping("/toSyncBirToday") public R toSyncBirEcro2(){ //Long[] ids = new Long[]{}; diff --git a/src/main/java/com/qs/serve/modules/bms/controller/BmsRegionController.java b/src/main/java/com/qs/serve/modules/bms/controller/BmsRegionController.java index 11832321..0b09bb3d 100644 --- a/src/main/java/com/qs/serve/modules/bms/controller/BmsRegionController.java +++ b/src/main/java/com/qs/serve/modules/bms/controller/BmsRegionController.java @@ -172,12 +172,25 @@ public class BmsRegionController { BmsSupplier supplier = bmsSupplierService.getById(supplierId); regionIds.addAll(supplier.listSaleRegionIds()); } - return buildRegionTreeByRegionIds(stopFlag, new ArrayList<>(regionIds)); + return buildRegionTreeByRegionIds(userIds,stopFlag, new ArrayList<>(regionIds)); } @Nullable - private List buildRegionTreeByRegionIds(Integer stopFlag, List regionIds) { - List supplierIds = hisUserSupplierService.selectHisSupplier(null,false); + private List buildRegionTreeByRegionIds(Integer stopFlag, List regionIds){ + return this.buildRegionTreeByRegionIds(null,stopFlag,regionIds); + } + + @Nullable + private List buildRegionTreeByRegionIds(List userIds,Integer stopFlag, List regionIds) { + List supplierIds; + if(CollectionUtil.isNotEmpty(userIds)){ + BmsSupplier supplier = new BmsSupplier(); + supplier.setSelectUserIdsFlag(true); + supplier.setSelectUserIds(userIds); + supplierIds = hisUserSupplierService.selectHisSupplier(supplier,false); + }else { + supplierIds = hisUserSupplierService.selectHisSupplier(null,false); + } supplierIds.add(0L); List supplierList = bmsSupplierService.listByIds(supplierIds); List firstRegionIds = supplierList.stream().map(a->a.getRegionFirst()).collect(Collectors.toList()); diff --git a/src/main/java/com/qs/serve/modules/goods/controller/GoodsSkuController.java b/src/main/java/com/qs/serve/modules/goods/controller/GoodsSkuController.java index 900d52df..6678833a 100644 --- a/src/main/java/com/qs/serve/modules/goods/controller/GoodsSkuController.java +++ b/src/main/java/com/qs/serve/modules/goods/controller/GoodsSkuController.java @@ -49,7 +49,7 @@ import java.util.Random; import java.util.stream.Collectors; /** - * 商品 sku + * 商品SKU 查询相关接口 * @author YenHex * @since 2022-10-09 */ @@ -151,5 +151,15 @@ public class GoodsSkuController { return R.ok(result); } + /** + * 导出(Post) + * @param param + * @return + */ + @PostMapping("/export") + public R> export4Post(@RequestBody GoodsSku param){ + return this.export(param); + } + } diff --git a/src/main/java/com/qs/serve/modules/goods/controller/GoodsSkuOptionController.java b/src/main/java/com/qs/serve/modules/goods/controller/GoodsSkuOptionController.java index c43ccbce..88893b6b 100644 --- a/src/main/java/com/qs/serve/modules/goods/controller/GoodsSkuOptionController.java +++ b/src/main/java/com/qs/serve/modules/goods/controller/GoodsSkuOptionController.java @@ -49,7 +49,7 @@ import java.util.Random; import java.util.stream.Collectors; /** - * 商品 sku + * 商品SKU 操作层接口 * @author YenHex * @since 2022-10-09 */ @@ -70,7 +70,7 @@ public class GoodsSkuOptionController { /** - * 编辑 + * 批量编辑状态 * @param param * @return */ @@ -87,12 +87,12 @@ public class GoodsSkuOptionController { goodsSku.setOrderOnlineFlag(param.getOrderOnlineFlag()); goodsSkuService.update(goodsSku,new LambdaQueryWrapper() .in(GoodsSku::getId,param.getSkuIds())); - goodsSpuService.initSkuNum(); + //goodsSpuService.initSkuNum(); return R.ok(); } /** - * 编辑 + * 批量编辑特殊品状态 * @param param * @return */ @@ -122,7 +122,7 @@ public class GoodsSkuOptionController { sku.setSpecialFlag(flag); goodsSkuService.updateById(sku); } - goodsSpuService.initSkuNum(); + //goodsSpuService.initSkuNum(); return R.ok(); } @@ -161,7 +161,7 @@ public class GoodsSkuOptionController { } /** - * 编辑 + * 保存 * @param param * @return */ diff --git a/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpuController.java b/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpuController.java index 86297ba3..3bcfac85 100644 --- a/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpuController.java +++ b/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpuController.java @@ -49,7 +49,7 @@ import java.util.*; import java.util.stream.Collectors; /** - * 商品 spu + * 商品SPU 查询相关接口 * @author YenHex * @since 2022-10-09 */ @@ -303,7 +303,7 @@ public class GoodsSpuController { */ @PostMapping("listLast2Month") public R> listLast2Month(@RequestBody @Valid GoodsHisOrderQuery query){ - LocalDate date = LocalDate.now().plusMonths(-2); + LocalDate date = LocalDate.now().plusMonths(-3); List invCodes = dispatchDataMapper.selectLast2MonthInvCode(date,query.getSupplierCode()); if(CollectionUtil.isNotEmpty(invCodes)){ LambdaQueryWrapper skuLqw = new LambdaQueryWrapper<>(); @@ -329,9 +329,9 @@ public class GoodsSpuController { spuLqw.eq(GoodsSpu::getOrderFlag,1); if(CollectionUtil.isNotEmpty(query.getCateIds())){ spuLqw.and(an->{ - an.notIn(GoodsSpu::getCategoryFirst,query.getCateIds()) - .or().notIn(GoodsSpu::getCategorySecond,query.getCateIds()) - .or().notIn(GoodsSpu::getCategoryThird,query.getCateIds()); + an.in(GoodsSpu::getCategoryFirst,query.getCateIds()) + .or().in(GoodsSpu::getCategorySecond,query.getCateIds()) + .or().in(GoodsSpu::getCategoryThird,query.getCateIds()); }); } @@ -438,6 +438,16 @@ public class GoodsSpuController { return R.ok(goodsSpu); } + /** + * 导出 + * @param param + * @return + */ + @PostMapping("/export") + public R> export4Post(@RequestBody GoodsSpu param){ + return this.export(param); + } + /** * 导出 * @param param @@ -450,17 +460,25 @@ public class GoodsSpuController { } List list = goodsSpuService.selectSpuList(param); List exportVoList = list.stream().map(a->{ - GoodsSpuExportVo vo = new GoodsSpuExportVo(); - vo.setId(a.getId()); - vo.setSpuCode(a.getSpuCode()); - vo.setName(a.getName()); - vo.setShelf(a.getShelf()); - vo.setOrderFlag(a.getOrderFlag()); - vo.setCostFlag(a.getCostFlag()); - vo.setGoodsSaleType(a.getGoodsSaleType()); - vo.setSpuCunhuoFlag(a.getSpuCunhuoFlag()); + GoodsSpuExportVo vo = CopierUtil.copy(a,new GoodsSpuExportVo()); +// vo.setId(a.getId()); +// vo.setSpuCode(a.getSpuCode()); +// vo.setName(a.getName()); +// vo.setShelf(a.getShelf()); +// vo.setOrderFlag(a.getOrderFlag()); +// vo.setCostFlag(a.getCostFlag()); +// vo.setGoodsSaleType(a.getGoodsSaleType()); +// vo.setSpuCunhuoFlag(a.getSpuCunhuoFlag()); vo.setCateCode(a.getCateThirdCode()); vo.setCateName(a.getCateThirdLabel()); +// vo.setSaleNum(a.getSaleNum()); +// vo.setTasteValue(a.getTasteValue()); +// vo.setSkuNumVal(a.getSkuNumVal()); +// vo.setBookBelong(a.getBookBelong()); +// vo.setBookName(a.getBookName()); +// vo.setCateFirstLabel(a.getCateFirstLabel()); +// vo.setCateSecondLabel(a.getCateSecondLabel()); +// vo.setCateThirdLabel(a.getCateThirdLabel()); return vo; }).collect(Collectors.toList()); return R.ok(exportVoList); diff --git a/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpuOptionController.java b/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpuOptionController.java index 9f425f89..80482089 100644 --- a/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpuOptionController.java +++ b/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpuOptionController.java @@ -29,9 +29,10 @@ import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.util.*; +import java.util.stream.Collectors; /** - * 商品 spu + * 商品SPU 操作层接口 * @author YenHex * @since 2022-10-09 */ @@ -82,7 +83,7 @@ public class GoodsSpuOptionController { * @param param * @return */ - @GetMapping("/updateStateBatch") + @PostMapping("/updateStateBatch") @SysLog(module = SystemModule.GOODS, title = "spu", biz = BizType.UPDATE) public R updateShelfBatch(@RequestBody GoodsSpuStateBo param){ param.initProp(); @@ -201,6 +202,14 @@ public class GoodsSpuOptionController { final String SAVE = "1"; final String NONE = "4"; + Set spuCodeSet = param.getSpuList().stream() + .map(GoodsSpuImportBo.SpuItem::getSpuCode) + .collect(Collectors.toSet()); + + if(param.getSpuList().size()!=spuCodeSet.size()){ + Assert.throwEx("SKU编码不可重复"); + } + //导入 List spuCodes = new ArrayList<>(); List cateCodes = new ArrayList<>(); diff --git a/src/main/java/com/qs/serve/modules/goods/entity/GoodsSku.java b/src/main/java/com/qs/serve/modules/goods/entity/GoodsSku.java index d2cd63fe..c271f74d 100644 --- a/src/main/java/com/qs/serve/modules/goods/entity/GoodsSku.java +++ b/src/main/java/com/qs/serve/modules/goods/entity/GoodsSku.java @@ -192,6 +192,23 @@ public class GoodsSku implements Serializable { @TableField(exist = false) private String seriesName; + /** + * 品牌 + */ + @TableField(exist = false) + private String brandCode; + /** + * 分类 + */ + @TableField(exist = false) + private String categoryCode; + /** + * 系列 + */ + @TableField(exist = false) + private String seriesCode; + + /** * spuCode */ diff --git a/src/main/java/com/qs/serve/modules/goods/entity/GoodsSpu.java b/src/main/java/com/qs/serve/modules/goods/entity/GoodsSpu.java index 643e3cdb..23ed764d 100644 --- a/src/main/java/com/qs/serve/modules/goods/entity/GoodsSpu.java +++ b/src/main/java/com/qs/serve/modules/goods/entity/GoodsSpu.java @@ -160,6 +160,14 @@ public class GoodsSpu implements Serializable { @TableField(exist = false) private String cateThirdLabel; + /** 一级类目:品牌名称 */ + @TableField(exist = false) + private String cateFirstCode; + + /** 二级类目:类目名称 */ + @TableField(exist = false) + private String cateSecondCode; + /** 三级类目:系列名称 */ @TableField(exist = false) private String cateThirdCode; @@ -281,6 +289,8 @@ public class GoodsSpu implements Serializable { this.setWeight(goodsSku.getWeight()==null?"0":goodsSku.getWeight().toString()); this.setVolume(goodsSku.getVolume()==null?"0":goodsSku.getVolume().toString()); this.setUuid(goodsSku.getSpuId()+"_"+goodsSku.getId()); + this.setSkuBelong(goodsSku.getBelong()); + } } diff --git a/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSkuExportVo.java b/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSkuExportVo.java index d819c28a..132b135b 100644 --- a/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSkuExportVo.java +++ b/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSkuExportVo.java @@ -21,7 +21,6 @@ import java.util.List; * @since 2022-10-09 */ @Data -@TableName("goods_sku") public class GoodsSkuExportVo implements Serializable { private static final long serialVersionUID = 1L; @@ -80,6 +79,8 @@ public class GoodsSkuExportVo implements Serializable { @NotNull(message = "产地不能为空") private String belong; + /** 账套名称 */ + private String bookName; /** 包装 */ @NotNull(message = "包装不能为空") private String wrapVal; @@ -91,5 +92,47 @@ public class GoodsSkuExportVo implements Serializable { /** 可投放费用标识 */ private Integer costFlag; + private String skuAddCode; + /** 规格值 */ + private String specInfos; + /** 净重 */ + private BigDecimal invUnitWeight; + /** 单位id */ + private Long unitId; + + /** 单位 */ + private String unitName; + + /** + * 品牌 + */ + @TableField(exist = false) + private String brandName; + /** + * 分类 + */ + @TableField(exist = false) + private String categoryName; + /** + * 系列 + */ + @TableField(exist = false) + private String seriesName; + + /** + * 品牌 + */ + @TableField(exist = false) + private String brandCode; + /** + * 分类 + */ + @TableField(exist = false) + private String categoryCode; + /** + * 系列 + */ + @TableField(exist = false) + private String seriesCode; } diff --git a/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSpuExportVo.java b/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSpuExportVo.java index 47972479..46cb5a23 100644 --- a/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSpuExportVo.java +++ b/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSpuExportVo.java @@ -60,5 +60,43 @@ public class GoodsSpuExportVo implements Serializable { private String cateName; + /** 账套名称 */ + private String bookName; + + /** 销量 */ + private Integer saleNum; + + /** 产品口味(非sku规格值) */ + private String tasteValue; + + /** 可下单/特殊品/未启用数量 */ + private String skuNumVal; + + /** 账套编码 */ + private String bookBelong; + + /** 一级类目:品牌名称 */ + @TableField(exist = false) + private String cateFirstLabel; + + /** 二级类目:类目名称 */ + @TableField(exist = false) + private String cateSecondLabel; + + /** 三级类目:系列名称 */ + @TableField(exist = false) + private String cateThirdLabel; + + /** 一级类目:品牌名称 */ + @TableField(exist = false) + private String cateFirstCode; + + /** 二级类目:类目名称 */ + @TableField(exist = false) + private String cateSecondCode; + + /** 三级类目:系列名称 */ + @TableField(exist = false) + private String cateThirdCode; } diff --git a/src/main/java/com/qs/serve/modules/wx/api/WxSvcUserApi.java b/src/main/java/com/qs/serve/modules/wx/api/WxSvcUserApi.java index 2e395ea5..272d675b 100644 --- a/src/main/java/com/qs/serve/modules/wx/api/WxSvcUserApi.java +++ b/src/main/java/com/qs/serve/modules/wx/api/WxSvcUserApi.java @@ -11,10 +11,7 @@ import com.qs.serve.common.model.consts.RedisCacheKeys; import com.qs.serve.common.model.dto.R; import com.qs.serve.common.model.enums.BizType; import com.qs.serve.common.model.enums.InterType; -import com.qs.serve.common.util.AuthContextUtils; -import com.qs.serve.common.util.IdUtil; -import com.qs.serve.common.util.JwtUtils; -import com.qs.serve.common.util.StringUtils; +import com.qs.serve.common.util.*; import com.qs.serve.modules.base.TencentYunSmsService; import com.qs.serve.modules.base.TianYiYunSmsService; import com.qs.serve.modules.sys.entity.SysDept; @@ -67,6 +64,7 @@ public class WxSvcUserApi { @GetMapping("/info") public R info(){ WxUser wxUser = wxUserService.getCurrentWxUser(true); + SysUserVo sysUserVo = null; if(StringUtils.hasText(wxUser.getSysUserId())){ SysUser sysUser = sysUserService.getById(wxUser.getSysUserId()); if(sysUser!=null){ @@ -80,10 +78,23 @@ public class WxSvcUserApi { LoginUser userDetails = userDetailsService.buildLoginUser(sysUser); sysUser.setAuthorIds(menuIds); sysUser.setAuthorList(userDetails.getAuthorList()); - SysUserVo sysUserVo = sysUser.toSysUserVo(false); - wxUser.setSysUserInfo(sysUserVo); + sysUserVo = sysUser.toSysUserVo(false); } } + + if(wxUser.getAppType()!=null&&wxUser.getAppType().equals(3)){ + //企业微信转化为公众号用户 + WxUser wxUser1 = wxUserService.getOne(new LambdaQueryWrapper() + .eq(WxUser::getSysUserId,wxUser.getSysUserId()) + .eq(WxUser::getAppType,2),false); + if(wxUser1==null){ + Assert.throwEx("请前往公众号绑定信息"); + } + wxUser1.setSysUserInfo(sysUserVo); + return R.ok(wxUser1); + }else { + wxUser.setSysUserInfo(sysUserVo); + } return R.ok(wxUser); } diff --git a/src/main/java/com/qs/serve/modules/wx/service/impl/WxUserServiceImpl.java b/src/main/java/com/qs/serve/modules/wx/service/impl/WxUserServiceImpl.java index 2881db45..c08868aa 100644 --- a/src/main/java/com/qs/serve/modules/wx/service/impl/WxUserServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/wx/service/impl/WxUserServiceImpl.java @@ -69,6 +69,7 @@ public class WxUserServiceImpl extends ServiceImpl impleme @Autowired private RedisService redisService; + @Autowired private SysUserMapper sysUserMapper; private List getOpenIds(WxMpUserService wxMpUserService,String nextOpenId){ @@ -216,7 +217,7 @@ public class WxUserServiceImpl extends ServiceImpl impleme //if(StringUtils.hasText(wxCpUser.getMobile())){ //List sysUsers = sysUserMapper.selectList(new LambdaQueryWrapper() // .eq(SysUser::getMobile,wxCpUser.getMobile())); - List sysUsers = sysUserMapper.selectList(new LambdaQueryWrapper().eq(SysUser::getName,userId)); + List sysUsers = sysUserMapper.selectList(new LambdaQueryWrapper().eq(SysUser::getCode,userId)); if(sysUsers.size()>0){ if(sysUsers.size()>1){ //log.error("企业微信登录,一个号码被多人使用:{}",wxCpUser.getMobile()); diff --git a/src/main/resources/mapper/goods/GoodsSkuMapper.xml b/src/main/resources/mapper/goods/GoodsSkuMapper.xml index b75d81d2..93c810ee 100644 --- a/src/main/resources/mapper/goods/GoodsSkuMapper.xml +++ b/src/main/resources/mapper/goods/GoodsSkuMapper.xml @@ -148,6 +148,9 @@ cate1.`name` as brandName, cate2.`name` as categoryName, cate3.`name` as seriesName, + cate1.`code` as brandCode, + cate2.`code` as categoryCode, + cate3.`code` as seriesCode, FROM `goods_sku` `goods_sku` LEFT JOIN `goods_spu` ON `goods_sku`.`spu_id` = `goods_spu`.id diff --git a/src/main/resources/mapper/goods/GoodsSpuMapper.xml b/src/main/resources/mapper/goods/GoodsSpuMapper.xml index d0ddb224..3882c53c 100644 --- a/src/main/resources/mapper/goods/GoodsSpuMapper.xml +++ b/src/main/resources/mapper/goods/GoodsSpuMapper.xml @@ -249,6 +249,8 @@ `cate1`.`name` AS `cate_first_label`, `cate2`.`name` AS `cate_second_label`, `cate3`.`name` AS `cate_third_label`, + `cate1`.`code` AS `cate_first_code`, + `cate2`.`code` AS `cate_second_code`, `cate3`.`code` AS `cate_third_code`, FROM `goods_spu` `goods_spu`