SEO技术

SEO技术

Products

当前位置:首页 > SEO技术 >

企业网站建设中,哪些要素是友点企业网站管理系统不可或缺的?

96SEO 2026-02-19 21:32 0


3.导入前端代码

unit(标准化产品单元)是商品信息聚合的最小单位是一组可复用、易检索的标准化信息的集合该集合描述了一个产品的特性。

企业网站建设中,哪些要素是友点企业网站管理系统不可或缺的?

如iphone13是SPU它是一个产品的集合

SKUstock

unit(库存量单位)库存进出计量的基本单元可以是件/盒/托盘等单位。

SKU是对于大型连锁超市DC配送中心物流管理的一个必要的方法。

现在已经被引申为产品统一编号的简称每种产品对应有唯一的SKU号。

如iphone13ProMax

规格参数和销售属性

像这里的商品介绍规格与包装都是属于SPU的属性。

它们都属于是规格参数

属性关系-规格参数-销售属性-三级分类

每个三级分类下有各自的属性分组表通过id和catelogid关联能查出每个分类下的属性分组

属性分组表和属性表通过一个属性属性关联表进行关联能查出每个属性分组下的属性

最终这样的关系我们可以查出每个分类的属性分组和每个属性分组对应的属性

SPU-SKU属性表

商品属性表和属性表通过attrid和id进行关联能查出每个spu的属性

sku销售属性表是为了表示spu下不同sku比如1号spu在此表有两个sku这两个sku有不同的销售属性是通过和属性表关联获取的

3.导入前端代码

正常我们是在系统管理里自定义添加步骤都是一样的其实在前端页面添加就是把数据提交到mall_admin表中,这里我们直接把提供的sql语句导入即可

如下结果

这个页面就是三级分类和一个表格显示在一块对吧属于是父子组件交互

4.完善后端接口

/product/attrgroup/list/{catelogId},技术团队的文档管理平台接口文档工具支持在线接口调试一键生成API文档适合编写接口文档、产品文档、使用手册https://easydoc.net/s/78237135/ZUqEdvA4/OXTgKobR

别人告诉你需要什么功能需要返回什么样的数据你就通过接口的形式把他们呢实现出来即可

以后工作了也是这种形式主要是开发接口为多前端其实不用写太多能看懂即可

5.属性分组详情

RequestMapping(/list/{catelogId})public

list(RequestParam

attrGroupService.queryPage(params);PageUtils

page

attrGroupService.queryPage(params,

catelogId);return

params.get(key);QueryWrapperAttrGroupEntity

wrapper

{obj.eq(attr_group_id,key).or().like(attr_group_name,key);});}if

(catelogId

{//如果是默认的是查全部的一级分类IPageAttrGroupEntity

page

QueryAttrGroupEntity().getPage(params),wrapper);return

new

catelogId);IPageAttrGroupEntity

page

QueryAttrGroupEntity().getPage(params),

wrapper);return

attrService.getById(attrId);Long

catelogId

categoryService.findCatelogPath(catelogId);attr.setCatelogPath(path);return

R.ok().put(attr,

给一个分类id不断的查它的父类id直到查不到为止最后把查询到的id到放到一个集合里

怎样写好递归

list);//1.确定递归参数和返回值Collections.reverse(parentPath);return

(Long[])

list){//3.递归逻辑list.add(catelogId);CategoryEntity

entity

(entity.getParentCid()!0){//2.递归终止条件findParentPath(entity.getParentCid(),list);}return

list;

vo){attrService.saveAttr(vo);return

R.ok();

这里注意因为添加规格参数的时候会有选择属性组因为属性组和属性是通过关联关系表连接的所以要有级联操作。

在往pms_attr表插入数据的时候pms_attr_group_relation也要插入

小bug这里有个注意点当添加规格参数的时候如果没有指定规格参数所属分组那么就不应该在关联表中保存关联关系

Override

AttrEntity();//1.将前端接收数据的对象vo赋值给attrEntity对象从而更新数据库BeanUtils.copyProperties(attr,

attrEntity);this.save(attrEntity);if

(attr.getAttrType()

ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode()

null)

{//2.保存关联关系//因为属性组和属性是通过关联关系表连接的AttrAttrgroupRelationEntity

relationEntity

AttrAttrgroupRelationEntity();relationEntity.setAttrGroupId(attr.getAttrGroupId());relationEntity.setAttrId(attrEntity.getAttrId());relationService.save(relationEntity);}}显示规格参数

/***

GetMapping(/base/list/{catelogId})

public

attrService.queryBaseAttrPage(params,

catelogId);return

catelogId);}//多条件模糊查询//搜索框里的key不但可以对catelog_id进行模糊查询对attr_name也模糊查询String

key

QueryAttrEntity().getPage(params),wrapper);PageUtils

pageUtils

规格参数表pms_attr中有所属分类的信息可以直接调用分类的service进行查询

这里我们就要借助第三张表属性和分组表pms_attr_attrgroup_relation进行查询

通过规格参数表pms_attr获得attr_id之后在调用属性和分组表的service获得属性和分组表的实体类从而获得该属性的分组

下面通过stream流的方式通过map给list集合中的每一项做映射给新实体类AttrRespVo赋值最后返回AttrRespVo

小bug这里显示规格参数的时候会显示规格。

参数对应的分组、分类那么如果它们查出对象分组id或分类id为空那就不设置名字if

(attrId

QueryWrapperAttrEntity().eq(attr_type,

ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode()

ProductConstant.AttrEnum.ATTR_TYPE_SALE.getCode());if

(catelogId

?//IgnoreCase忽略大小写wrapper.eq(catelog_id,

catelogId);}//多条件模糊查询//搜索框里的key不但可以对catelog_id进行模糊查询对attr_name也模糊查询String

key

QueryAttrEntity().getPage(params),wrapper);PageUtils

pageUtils

.map()这个方法是对被筛选过后的流进行映射一般是对属性进行赋值。

ListAttrRespVo

resultList

AttrRespVo();BeanUtils.copyProperties(item,

attrId

QueryWrapperAttrAttrgroupRelationEntity().eq(attr_id,

(attrId

{//attrgroupRelationEntity.getAttrGroupId()也可以这里可以直接放进去对象AttrGroupEntity

attrGroupEntity

attrGroupService.getById(attrId.getAttrGroupId());attrRespvo.setGroupName(attrGroupEntity.getAttrGroupName());}}CategoryEntity

categoryEntity

categoryService.getById(item.getCatelogId());if

(categoryEntity

{attrRespvo.setCatelogName(categoryEntity.getName());}//返回最后的封装结果return

attrRespvo;}).collect(Collectors.toList());//返回的结果是一个集合pageUtils.setList(resultList);//

pageUtils;

可以看出所属分类和分组都是由这条请求查询的那么我们改这个接口功能就行

controller

attrService.getAttrInfo(attrId);return

R.ok().put(attr,

this.getById(attrId);BeanUtils.copyProperties(attrEntity,

respVo);/***

设置分组信息*/AttrAttrgroupRelationEntity

QueryWrapperAttrAttrgroupRelationEntity().eq(attr_id,

null){respVo.setAttrGroupId(attrgroupRelationEntity.getAttrGroupId());Long

attrGroupId

attrgroupRelationEntity.getAttrGroupId();AttrGroupEntity

attrGroupEntity

attrGroupService.getById(attrGroupId);if

(attrGroupEntity

{respVo.setGroupName(attrGroupEntity.getAttrGroupName());}}/***

设置分类信息*/Long

attrEntity.getCatelogId();//有了分类的完整路径接下来就设置分类名字Long[]

catelogPath

categoryService.findCatelogPath(catelogId);respVo.setCatelogPath(catelogPath);//获得分类名字CategoryEntity

categoryEntity

categoryService.getById(catelogId);if

(categoryEntity

{respVo.setCatelogName(categoryEntity.getName());}return

respVo;

{attrService.updateAttr(attr);return

R.ok();

这里做了优化对于规格参数中没有所属分组的如果指定了不在是修改而是添加

怎么判断规格参数有没有所属分组呢

拿attr_id去pms_attr_attrgroup_relation表中查询如果改attr_id存在与该表那就修改关联关系

如果没有数据那么就在此表添加数据

AttrEntity();BeanUtils.copyProperties(attr,

attrEntity);this.updateById(attrEntity);//修改分组关联AttrAttrgroupRelationEntity

new

AttrAttrgroupRelationEntity();attrAttrgroupRelationEntity.setAttrGroupId(attr.getAttrGroupId());attrAttrgroupRelationEntity.setAttrId(attr.getAttrId());//统计attr_id的关联属性,如果没有初始分组,则进行添加操作;有则进行修改操作Integer

count

QueryWrapperAttrAttrgroupRelationEntity().eq(attr_id,

(count

{relation.update(attrAttrgroupRelationEntity,

new

UpdateWrapperAttrAttrgroupRelationEntity().eq(attr_id,

attr.getAttrId()));}

{relation.insert(attrAttrgroupRelationEntity);}

}spu规格维护

0);更新index.js哪里更新找老师的源码controller

public

updateSpuAttr(PathVariable(spuId)

Long

entities){productAttrValueService.updateSpuAttr(spuId,entities);return

R.ok();

{//1、删除spuId之前对应的所有属性this.baseMapper.delete(new

QueryWrapperProductAttrValueEntity().eq(spu_id,spuId));//2、添加商品规格信息ListProductAttrValueEntity

collect

item;}).collect(Collectors.toList());//批量新增this.saveBatch(collect);

}7.

如图http://localhost:88/api/product/attr/sale/list/0?t1660181297434page1limit10key这个接口有问题

controller

GetMapping(/{attrType}/list/{catelogId})

public

attrService.queryBaseAttrPage(params,

type,

在原来对规格参数的基础上加了限制条件如果是规格参数那就是WHERE

attr_type

这里为了使代码更通用1和0的值我们写一个常量来控制如过后期换值了我们直接更改常量的值即可

ProductConstant

AttrEnum{ATTR_TYPE_BASE(1,基本属性),ATTR_TYPE_SALE(0,销售属性);private

int

}在原来对规格参数的基础上加了限制条件如果是规格参数那就是WHERE

attr_type

QueryWrapperAttrEntity().eq(attr_type,

ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode()

ProductConstant.AttrEnum.ATTR_TYPE_SALE.getCode());if

(catelogId

?//IgnoreCase忽略大小写wrapper.eq(catelog_id,

catelogId);}//多条件模糊查询//搜索框里的key不但可以对catelog_id进行模糊查询对attr_name也模糊查询String

key

QueryAttrEntity().getPage(params),wrapper);PageUtils

pageUtils

.map()这个方法是对被筛选过后的流进行映射一般是对属性进行赋值。

ListAttrRespVo

resultList

AttrRespVo();BeanUtils.copyProperties(item,

attrRespvo);AttrAttrgroupRelationEntity

QueryWrapperAttrAttrgroupRelationEntity().eq(attr_id,

null)

{//attrgroupRelationEntity.getAttrGroupId()也可以这里可以直接放进去对象AttrGroupEntity

attrGroupEntity

attrGroupService.getById(attrgroupRelationEntity);attrRespvo.setGroupName(attrGroupEntity.getAttrGroupName());}CategoryEntity

categoryEntity

categoryService.getById(item.getCatelogId());if

(categoryEntity

{attrRespvo.setCatelogName(categoryEntity.getName());}//返回最后的封装结果return

attrRespvo;}).collect(Collectors.toList());//返回的结果是一个集合pageUtils.setList(resultList);//

pageUtils;}销售属性回显

但是销售属性和规格参数用的是同一个回显方法我们也进行更改只有是规格参数的时候才进行分组回显

ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode())

{...

销售属性和规格参数用的是同一个修改方法销售属性进行修改时会对关联表进行一个级联更新但销售属性不需要

所以也在对关联表级联更新的时候进行判断只有销售属性修改的时候才进行级联更新

ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode())

{...

销售属性和规格参数用的是同一个保存方法销售属性进行保存时会对关联表进行一个级联保存但销售属性不需要

所以也在对关联表级联保存的时候进行判断只有销售属性保存的时候才进行级联保存

ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode())

{...

点击分组属性的时候获取到分组id拿分组id去关联表查分组id对应的attr_id拿attr_id去pms_attr表中获取属性controller

/***

RequestMapping(/{attrgroupId}/attr/relation)

public

attrRelation(PathVariable(attrgroupId)

Long

attrService.getRelationAttr(attrgroupId);return

R.ok().put(data,

{//分布查询第一步去关联表中查出所有的组和属性idListAttrAttrgroupRelationEntity

entities

QueryWrapperAttrAttrgroupRelationEntity().eq(attr_group_id,attrgroupId));//第二收集属性idListLong

attrIds

attr.getAttrId();}).collect(Collectors.toList());ListAttrEntity

list

/product/attrgroup/attr/relation/deletepost请求会带来json数据要封装成自定义对象vos需要RequestBody注解意思就是将请求体中的数据封装成vos/***

PostMapping(/attr/relation/delete)

public

{attrService.deleteRelation(vos);return

R.ok();

deleteRelation(AttrGroupRelationVo[]

vos)

{ListAttrAttrgroupRelationEntity

entities

Arrays.asList(vos).stream().map((item)

entity

AttrAttrgroupRelationEntity();BeanUtils.copyProperties(item,

entity);return

entity;}).collect(Collectors.toList());relation.deleteBatchRelation(entities);

}mapper

deleteBatchRelation(Param(entities)

ListAttrAttrgroupRelationEntity

entities);delete

#{item.attrGroupId})/foreach/delete查询分组未关联的属性

controller

/product/attrgroup/{attrgroupId}/noattr/relation*/

RequestMapping(/{attrgroupId}/noattr/relation)

public

params,PathVariable(attrgroupId)

Long

attrService.getNoRelationAttr(params,attrgroupId);return

R.ok().put(page,

获得当前分类下的所有分组获得这些分组下所有已添加的属性添加新属性时移除这些已添加的属性Override

public

1.当前分组只能关联自己所属的分类里面的所有属性*/AttrGroupEntity

attrGroupEntity

attrGroupService.getById(attrgroupId);Long

catelogId

attrGroupEntity.getCatelogId();/***

2.1

当前分类下的所有分组。

收集到他们的组id*/ListAttrGroupEntity

group

QueryWrapperAttrGroupEntity().eq(catelog_id,

catelogId));ListLong

item.getAttrGroupId();}).collect(Collectors.toList());/***

2.2

2通过关系表实体类对象获得所有分组下的所有属性id*/ListAttrAttrgroupRelationEntity

groupId

QueryWrapperAttrAttrgroupRelationEntity().in(attr_group_id,

attrIds

item.getAttrId();}).collect(Collectors.toList());/***

2.3

QueryWrapperAttrEntity().eq(catelog_id,

catelogId).eq(attr_type,ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode());//如果其他分组也没关联属性那么就不加这个条件if

(attrIds

1.IPage对象通过工具类Query获取并通过.getPage(params)封装页面传来分页参数*

page

QueryAttrEntity().getPage(params),

wrapper);PageUtils

常规的调用注意点是saveBatch传的参数是数据对应的实体类

controller

/product/attrgroup/attr/relation*/

public

{relationService.saveBatch(vos);return

R.ok();

saveBatch(ListAttrGroupRelationVo

vos)

{ListAttrAttrgroupRelationEntity

collect

AttrAttrgroupRelationEntity();BeanUtils.copyProperties(item,

relationEntity;}).collect(Collectors.toList());this.saveBatch(collect);

}9.发布商品

/product/categorybrandrelation/brands/list*/

public

relationBrandList(RequestParam(value

catId,

categoryBrandRelationService.getBrandsByCatId(catId);//品牌对象集合在进行筛选赋予品牌对象id和name返回封装的vo给前端ListBrandVo

collect

BrandVo();brandVo.setBrandId(item.getBrandId());brandVo.setBrandName(item.getName());return

brandVo;}).collect(Collectors.toList());return

}service

{//获得CategoryBrandRelationEntity集合对象ListCategoryBrandRelationEntity

catelogId

QueryWrapperCategoryBrandRelationEntity().eq(catelog_id,

catId));//获得所有集合对象中brandid通过brandService查询所有品牌封装成品牌对象集合ListBrandEntity

collect

brandService.getById(brandId);return

entity;}).collect(Collectors.toList());//返回品牌对象集合return

collect;

Controller:处理请求,接受和校验数据Service接受controller传来的数据,进行业务处理Controller接受service处理完的数据,封装页面指定的vo获取分类下所有分组关联属性

也就是说当我们选择手机分类时那就查出手机相关的分组信息并查出每个分组相应属性信息

Data

/product/attrgroup/{catelogId}/withattr*/

GetMapping(/{catelogId}/withattr)

public

getAttrGroupWithAttrs(PathVariable(catelogId)

Long

attrGroupService.getAttrGroupWithAttrsByCatelogId(catelogId);return

}service

object当相应数据需要自定义时用vo是最好的选择不需要对实体类字段进行修改

/***

getAttrGroupWithAttrsByCatelogId(Long

catelogId)

由于这是mp它会得出所有的这种关系并把结果封装成集合*/ListAttrGroupEntity

list

QueryWrapperAttrGroupEntity().eq(catelog_id,

catelogId));/**

要第三张关联表,直接调用关联表的service即查询分组对应的属性id*

以上两步前面已经写好逻辑了直接调用即可attrService.getRelationAttrgroupId*/ListAttrGroupWithAttrsVo

collect

AttrGroupWithAttrsVo();BeanUtils.copyProperties(item,

attrGroupWithAttrsVo);ListAttrEntity

attrs

attrService.getRelationAttr(attrGroupWithAttrsVo.getAttrGroupId());if

(attrs

{attrGroupWithAttrsVo.setAttrs(attrs);}return

attrGroupWithAttrsVo;}).filter((attrvo)

{return

0;}).collect(Collectors.toList());return

collect;}测试

在线JSON字符串转Java实体类(JavaBean、Entity)-BeJSON.com

直接解析json数据封装成实体类

因为所有传来的信息都在vo里所以我们把信息拷贝到对应的实体类中如果vo没有的那就可以自己赋值

表结构如下

这里的infoEntity.setCreateTime(new

Date());infoEntity.setUpdateTime(new

Date());是因为前端传入的是没有这两个字段的我们自己赋值即可

SpuInfoEntity

this.saveBaseInfo(infoEntity);保存spu的描述图片

pms_spu_info_desc

String.join()的作用是把集合中的元素通过,分割形成一个一个的字符串

ListString

descEntity.setSpuId(infoEntity.getId());

descEntity.setDecript(String.join(,,

decript));

spuInfoDescService.saveSpuInfoDesc(descEntity);保存spu的图片集

pms_spu_images

imagesService.saveImages(infoEntity.getId(),

从vo中获取所有规格参数集合

ProductAttrValueEntity();valueEntity.setAttrId(attr.getAttrId());AttrEntity

attrService.getById(attr.getAttrId());valueEntity.setAttrName(id.getAttrName());valueEntity.setAttrValue(attr.getAttrValues());valueEntity.setQuickShow(attr.getShowDesc());valueEntity.setSpuId(infoEntity.getId());return

valueEntity;

}).collect(Collectors.toList());

attrValueService.saveProductAttr(collect);保存spu的积分信息

mall_sms

BeanUtils.copyProperties(bounds,

spuBoundTo);

spuBoundTo.setSpuId(infoEntity.getId());

couponFeignService.saveSpuBounds(spuBoundTo);

(r0.getCode()

couponFeignService.saveSpuBounds(spuBoundTo);保存当前spu对应的所有sku信息

ListSkus

image.getImgUrl();}}SkuInfoEntity

skuInfoEntity

SkuInfoEntity();BeanUtils.copyProperties(item,

skuInfoEntity);//添加vo中没有的信息skuInfoEntity.setBrandId(infoEntity.getBrandId());skuInfoEntity.setCatalogId(infoEntity.getCatalogId());skuInfoEntity.setSaleCount(0L);skuInfoEntity.setSpuId(infoEntity.getId());skuInfoEntity.setSkuDefaultImg(defalutImg);skuInfoService.saveSkuInfo(skuInfoEntity);//6.2sku图片信息;pms_sku_images//没有图片路径的无需保存Long

skuId

skuInfoEntity.getSkuId();ListSkuImagesEntity

imageEntities

item.getImages().stream().map(img

{SkuImagesEntity

SkuImagesEntity();skuImagesEntity.setSkuId(skuId);skuImagesEntity.setImgUrl(img.getImgUrl());skuImagesEntity.setDefaultImg(img.getDefaultImg());return

skuImagesEntity;}).filter(entity

{return

!StringUtils.isEmpty(entity.getImgUrl());}).collect(Collectors.toList());skuImagesService.saveBatch(imageEntities);//6.3sku的销售属性;pms_sku_sale_attr_valueListAttr

attr

item.getAttr();ListSkuSaleAttrValueEntity

attr.stream().map(a

SkuSaleAttrValueEntity();BeanUtils.copyProperties(a,

attrValueEntity);attrValueEntity.setSkuId(skuId);return

attrValueEntity;}).collect(Collectors.toList());skuSaleAttrValueService.saveBatch(skuSaleAttrValueEntities);//6.4sku的优惠满减信息(跨服务);SkuReductionTo

skuReductionTo

SkuReductionTo();BeanUtils.copyProperties(item,

skuReductionTo);skuReductionTo.setSkuId(skuId);if

skuReductionTo.getFullPrice().compareTo(new

BigDecimal(0))

couponFeignService.saveSkuReduction(skuReductionTo);if

(r1.getCode()

{log.error(远程保存spu积分信息异常);}}});

}测试

spuInfoService.queryPageByCondition(params);return

R.ok().put(page,

queryPageByCondition(MapString,

Object

{queryWrapper.eq(publish_status,

status);}String

(!StringUtils.isEmpty(catelogId)

!0.equalsIgnoreCase(catelogId))

page

QuerySpuInfoEntity().getPage(params),queryWrapper);return

new

skuInfoService.queryPageByParams(params);return

R.ok().put(page,

(!StringUtils.isEmpty(catelogId)

!0.equalsIgnoreCase(catelogId))

catelogId);}String

QuerySkuInfoEntity().getPage(params),queryWrapper);return

new

加入微服务注册中心加入网关获取仓库列表就是对仓库表的简单查询逆向生成代码以帮我们生成好只要配置好网关就可以直接显示

我们只要记住反是单表操作的逆向生成以帮我们生成好了我们能拿来直接用就像增加仓库、删除、修改都是可以直接用的

多条件分页查询

QueryWareInfoEntity().getPage(params),queryWrapper);return

new

}多条件查询都是一样的套路获得你搜索的key然后拿这个key去模糊匹配多个字段

比如这里拿你输入的key会在name、address、areacode做模糊查询条件直接通过or来拼接

查询库存

查询库存也是单表操作CRUD都帮我们做好了我们就在分页的基础上加上多条件查询即可

//多条件分页查询

QueryWareSkuEntity().getPage(params),queryWrapper);return

new

{QueryWrapperPurchaseDetailEntity

queryWrapper

QueryWrapperPurchaseDetailEntity();String

key

(String)params.get(key);if(!StringUtils.isEmpty(key)){queryWrapper.and(w-{w.eq(purchase_id,key).or().eq(sku_id,key);});}String

status

(String)params.get(status);if(!StringUtils.isEmpty(status))

{queryWrapper.eq(status,status);}String

wareId

(String)params.get(wareId);if(!StringUtils.isEmpty(wareId))

{queryWrapper.eq(ware_id,wareId);}IPagePurchaseDetailEntity

page

QueryPurchaseDetailEntity().getPage(params),queryWrapper);return

new

如果没有选中采购单那么会自动创建采购单进行合并有的话就用采购单idcontroller

/***

purchaseService.mergePurchase(mergeVo);if(flag){return

R.ok();}else

R.error().put(msg,请选择新建或已分配的采购需求);}

}VO如下Data

实际上就是创建完采购需求对象和采购单对象后点击合并这两个对象信息会发生变化整体就是做这些操作

具体的看注释这里还用到了一些枚举类的写法通过枚举类获得状态信息了解即可这里就不写了可以去看老师的源码

Transactional

{//一、获取Vo中的信息//如果指定了采购单那就获取采购单的idLong

purchaseId

mergeVo.getPurchaseId();//获得采购需求的idListLong

items

mergeVo.getItems();//二、过滤采购需求//对采购需求id进行过滤如果采购需求处于新建或者已分配的收集成新的集合//这样做的目的是为了进行筛选如果你选中正在采购的是不会被合并的ListLong

collect

{//通过采购需求的id获取采购需求实体类PurchaseDetailEntity

purchaseDetailEntity

purchaseDetailService.getById(i);if

(purchaseDetailEntity.getStatus()

WareConstant.PurchaseDetailStatusEnum.CREATED.getCode()||

purchaseDetailEntity.getStatus()

WareConstant.PurchaseDetailStatusEnum.ASSIGNED.getCode())

{return

false;}}).collect(Collectors.toList());//三、没有指定采购单逻辑和指定了的逻辑if

(collect

PurchaseEntity();//如果是新创建的采购单创建时间更新时间状态都是没有默认值的所以这默认值我们自己来赋值purchaseEntity.setCreateTime(new

Date());purchaseEntity.setUpdateTime(new

Date());//这里设置采购单的状态采用的是枚举类的形式获取purchaseEntity.setStatus(WareConstant.PurchaseStatusEnum.CREATED.getCode());this.save(purchaseEntity);//获得自动创建的采购单idpurchaseId

finalPurchaseId

purchaseId;ListPurchaseDetailEntity

collect1

{//获取所有的采购需求对象//更新采购需求的状态一共需要该两个点一个是采购状态一个是采购单id。

设置采购需求的id是为了区分是哪一个进行了更改PurchaseDetailEntity

purchaseDetailEntity

purchaseDetailService.getById(i);purchaseDetailEntity.setPurchaseId(finalPurchaseId);purchaseDetailEntity.setId(i);purchaseDetailEntity.setStatus(WareConstant.PurchaseDetailStatusEnum.ASSIGNED.getCode());return

purchaseDetailEntity;}).collect(Collectors.toList());//批量更改采购需求这里是MP里的接口可直接传入对象MP会自动读取里面的IDpurchaseDetailService.updateBatchById(collect1);//四、优化时间更新为了显示的时间符合我们的样式PurchaseEntity

purchaseEntity

PurchaseEntity();purchaseEntity.setId(purchaseId);purchaseEntity.setUpdateTime(new

this.updateById(purchaseEntity);}

else

ids){purchaseService.received(ids);return

R.ok();

采购单状态改为已领取采购需求状态改为正在采购Overridepublic

void

{//1.确认当前采购单状态ListPurchaseEntity

collect

{//通过采购单id获取采购单对象PurchaseEntity

purchaseEntity

WareConstant.PurchaseStatusEnum.CREATED.getCode()

||id.getStatus()

WareConstant.PurchaseStatusEnum.ASSIGNED.getCode())

{return

{//对上面收集好的在进行过滤改变采购单状态为已领取RECEIVEitem.setStatus(WareConstant.PurchaseStatusEnum.RECEIVE.getCode());//对上面收集好的在进行过滤改变采购单更新时间item.setUpdateTime(new

Date());return

item;}).collect(Collectors.toList());//2.批量修改改变采购单状态this.updateBatchById(collect);//3.改变采购需求中的状态if

(collect

purchaseDetailService.listDetailByPurchaseId(item.getId());ListPurchaseDetailEntity

detailEntities

PurchaseDetailEntity();purchaseDetailEntity.setId(entity.getId());//将采购需求中的状态改为正在采购purchaseDetailEntity.setStatus(WareConstant.PurchaseDetailStatusEnum.BUYING.getCode());return

purchaseDetailEntity;}).collect(Collectors.toList());purchaseDetailService.updateBatchById(detailEntities);});}}完成采购

/***

doneVo){purchaseService.done(doneVo);return

R.ok();

true;//获取采购单id集合ListPurchaseItemDoneVo

items

doneVo.getItems();//收集结果ListPurchaseDetailEntity

updates

WareConstant.PurchaseDetailStatusEnum.HASERROR.getCode())

{flag

false;purchaseDetailEntity.setStatus(item.getStatus());}

else

{//二、采购需求状态发生变化purchaseDetailEntity.setStatus(WareConstant.PurchaseDetailStatusEnum.FINISH.getCode());//由采购单的id获取采购需求对象有什么用呢是用来给增加库存时赋值用的PurchaseDetailEntity

entity

purchaseDetailService.getById(item.getItemId());//三、库存增加wareSkuService.addStock(entity.getSkuId(),

entity.getWareId(),

entity.getSkuNum());}//采购完成采购需求中的状态也会发生变化给实体类对象指明id从而修改对象的状态purchaseDetailEntity.setId(item.getItemId());//把要修改的采购需求对象放到集合里updates.add(purchaseDetailEntity);}//因为一个采购单里有多个采购需求合并的所以批量修改采购需求对象purchaseDetailService.updateBatchById(updates);//四.改变采购单状态PurchaseEntity

purchaseEntity

PurchaseEntity();purchaseEntity.setId(id);purchaseEntity.setStatus(flag

WareConstant.PurchaseStatusEnum.FINISH.getCode()

:WareConstant.PurchaseStatusEnum.HASERROR.getCode());purchaseEntity.setUpdateTime(new

Date());this.updateById(purchaseEntity);}这里id

6是对6号采购单发起操作里面的item9和10是采购单对应的采购需求

{id:16,items:[{itemId:17,status:3,reason:},{itemId:18,status:4,reason:无货}]

}采购单状态如下

怎么显示呢锁定库存就是本表库存表相关的可以直接设置而sku_name是mall-product微服务里才能查询的到的

指定微服务

/product/skuinfo/info/{skuId}给网关发请求

FeignClient(“mall-gateway”)/api/product/skuinfo/info/{skuId}FeignClient(mall-gateway)

public

{RequestMapping(/api/product/skuinfo/info/{skuId})public

Long

skuId);}增加库存的时候注入FeignService接口即可实现远程调用

Transactional

{//判断如果没有此库存记录,则为新增操作;如果有则为更改操作ListWareSkuEntity

wareSkuEntities

QueryWrapperWareSkuEntity().eq(sku_id,

skuId).eq(ware_id,

WareSkuEntity();wareSkuEntity.setSkuId(skuId);wareSkuEntity.setStock(skuNum);wareSkuEntity.setWareId(wareId);wareSkuEntity.setStockLocked(0);//TODO

远程查询sku的名字//如果查询名字查询失败了事务回滚有点不值得所以用trycatch来捕捉一下try

info

productFeignService.info(skuId);MapString,Object

skuInfo

0){wareSkuEntity.setSkuName((String)

catch

{e.printStackTrace();}wareSkuDao.insert(wareSkuEntity);}

else



SEO优化服务概述

作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。

百度官方合作伙伴 白帽SEO技术 数据驱动优化 效果长期稳定

SEO优化核心服务

网站技术SEO

  • 网站结构优化 - 提升网站爬虫可访问性
  • 页面速度优化 - 缩短加载时间,提高用户体验
  • 移动端适配 - 确保移动设备友好性
  • HTTPS安全协议 - 提升网站安全性与信任度
  • 结构化数据标记 - 增强搜索结果显示效果

内容优化服务

  • 关键词研究与布局 - 精准定位目标关键词
  • 高质量内容创作 - 原创、专业、有价值的内容
  • Meta标签优化 - 提升点击率和相关性
  • 内容更新策略 - 保持网站内容新鲜度
  • 多媒体内容优化 - 图片、视频SEO优化

外链建设策略

  • 高质量外链获取 - 权威网站链接建设
  • 品牌提及监控 - 追踪品牌在线曝光
  • 行业目录提交 - 提升网站基础权威
  • 社交媒体整合 - 增强内容传播力
  • 链接质量分析 - 避免低质量链接风险

SEO服务方案对比

服务项目 基础套餐 标准套餐 高级定制
关键词优化数量 10-20个核心词 30-50个核心词+长尾词 80-150个全方位覆盖
内容优化 基础页面优化 全站内容优化+每月5篇原创 个性化内容策略+每月15篇原创
技术SEO 基本技术检查 全面技术优化+移动适配 深度技术重构+性能优化
外链建设 每月5-10条 每月20-30条高质量外链 每月50+条多渠道外链
数据报告 月度基础报告 双周详细报告+分析 每周深度报告+策略调整
效果保障 3-6个月见效 2-4个月见效 1-3个月快速见效

SEO优化实施流程

我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:

1

网站诊断分析

全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。

2

关键词策略制定

基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。

3

技术优化实施

解决网站技术问题,优化网站结构,提升页面速度和移动端体验。

4

内容优化建设

创作高质量原创内容,优化现有页面,建立内容更新机制。

5

外链建设推广

获取高质量外部链接,建立品牌在线影响力,提升网站权威度。

6

数据监控调整

持续监控排名、流量和转化数据,根据效果调整优化策略。

SEO优化常见问题

SEO优化一般需要多长时间才能看到效果?
SEO是一个渐进的过程,通常需要3-6个月才能看到明显效果。具体时间取决于网站现状、竞争程度和优化强度。我们的标准套餐一般在2-4个月内开始显现效果,高级定制方案可能在1-3个月内就能看到初步成果。
你们使用白帽SEO技术还是黑帽技术?
我们始终坚持使用白帽SEO技术,遵循搜索引擎的官方指南。我们的优化策略注重长期效果和可持续性,绝不使用任何可能导致网站被惩罚的违规手段。作为百度官方合作伙伴,我们承诺提供安全、合规的SEO服务。
SEO优化后效果能持续多久?
通过我们的白帽SEO策略获得的排名和流量具有长期稳定性。一旦网站达到理想排名,只需适当的维护和更新,效果可以持续数年。我们提供优化后维护服务,确保您的网站长期保持竞争优势。
你们提供SEO优化效果保障吗?
我们提供基于数据的SEO效果承诺。根据服务套餐不同,我们承诺在约定时间内将核心关键词优化到指定排名位置,或实现约定的自然流量增长目标。所有承诺都会在服务合同中明确约定,并提供详细的KPI衡量标准。

SEO优化效果数据

基于我们服务的客户数据统计,平均优化效果如下:

+85%
自然搜索流量提升
+120%
关键词排名数量
+60%
网站转化率提升
3-6月
平均见效周期

行业案例 - 制造业

  • 优化前:日均自然流量120,核心词无排名
  • 优化6个月后:日均自然流量950,15个核心词首页排名
  • 效果提升:流量增长692%,询盘量增加320%

行业案例 - 电商

  • 优化前:月均自然订单50单,转化率1.2%
  • 优化4个月后:月均自然订单210单,转化率2.8%
  • 效果提升:订单增长320%,转化率提升133%

行业案例 - 教育

  • 优化前:月均咨询量35个,主要依赖付费广告
  • 优化5个月后:月均咨询量180个,自然流量占比65%
  • 效果提升:咨询量增长414%,营销成本降低57%

为什么选择我们的SEO服务

专业团队

  • 10年以上SEO经验专家带队
  • 百度、Google认证工程师
  • 内容创作、技术开发、数据分析多领域团队
  • 持续培训保持技术领先

数据驱动

  • 自主研发SEO分析工具
  • 实时排名监控系统
  • 竞争对手深度分析
  • 效果可视化报告

透明合作

  • 清晰的服务内容和价格
  • 定期进展汇报和沟通
  • 效果数据实时可查
  • 灵活的合同条款

我们的SEO服务理念

我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。

提交需求或反馈

Demand feedback