P98
领取采购单
PurchaseController
/**
* 领取采购单
* @param ids
* @return
*/
@PostMapping("/receive")
public R received(@RequestBody List<Long> ids){
purchaseService.receive(ids);
return R.ok();
}
PurchaseServiceImpl
/**
* ids采购单的id
* @param ids
*/
@Override
public void receive(List<Long> ids) {
//1.确认当前采购单是新建或者已分配状态
List<PurchaseEntity> collect = ids.stream().map(id -> {
PurchaseEntity byId = this.getById(id);
return byId;
}).filter(item -> {
//选择新建或已分配的采购单
if (item.getStatus() == WareConstant.PurchaseStatusEnum.CREATED.getCode()
|| item.getStatus() == WareConstant.PurchaseStatusEnum.ASSIGNED.getCode()) {
return true;
}
return false;
}).map(item->{
//已被选择的设为已领取
item.setStatus(WareConstant.PurchaseStatusEnum.RECEIVE.getCode());
item.setUpdateTime(new Date());
return item;
}).collect(Collectors.toList());
//2.改变采购单的状态
this.updateBatchById(collect);
//3.改变采购项的状态
collect.forEach((item)->{
List<PurchaseDetailEntity> entities = purchaseDetailService.listDetailByPurchaseId(item.getId());
//收集需要更新状态的采购项
List<PurchaseDetailEntity> detailEntities = entities.stream().map(entity -> {
PurchaseDetailEntity entity1 = new PurchaseDetailEntity();
entity1.setId(entity.getId());
entity1.setStatus(WareConstant.PurchaseDetailEnum.BUYING.getCode());
return entity1;
}).collect(Collectors.toList());
purchaseDetailService.updateBatchById(detailEntities);
});
}
PurchaseDetailServiceImpl
@Override
public List<PurchaseDetailEntity> listDetailByPurchaseId(Long id) {
//根据采购id获取各个采购项,然后更新其状态
//获取采购项
List<PurchaseDetailEntity> purchaseId =this.list(new QueryWrapper<PurchaseDetailEntity>().eq("purchase_id",id));
return purchaseId;
}
1号采购单有两单采购需求
领取1号采购单--领取后状态----正在采购
优化
如果采购需求是处在正在采购状态,如果选择合并,应不能再合并【留作业了】
领取完采购单,接着完成采购单,完成后可以点击完成。采购需求中的采购单id、采购商品和采购数量等需要加入库存中。
完成采购
{"id":1, //采购单id
"items":[ //采购项
{"itemId":1,"status":3,"reason":""},
{"itemId":2,status:4,"reason":"无货"}
]}
ware
@Data
public class PurchaseDoneVo {
@NotNull
private Long id;//采购单id
private List<PurchaseItemDoneVo> items;
}
@Data
public class PurchaseItemDoneVo {
private Long itemId;
private Integer status;
private String reason;
}
PurchaseController
/**
* 完成采购单
* @param doneVo
* @return
*/
@PostMapping("/done")
public R finish(@RequestBody PurchaseDoneVo doneVo){
purchaseService.done(doneVo);
return R.ok();
}
PurchaseServiceImpl
@Transactional
@Override
public void done(PurchaseDoneVo doneVo) {
Long id = doneVo.getId();
//2.改变采购项的状态--完成或失败
Boolean flag =true;
List<PurchaseItemDoneVo> items = doneVo.getItems();
List<PurchaseDetailEntity>updates = new ArrayList<>();
for(PurchaseItemDoneVo item: items){
PurchaseDetailEntity detailEntity = new PurchaseDetailEntity();
//分离成功采购项
if(item.getStatus()==WareConstant.PurchaseDetailEnum.HASERROR.getCode()){
//失败的
flag=false;
detailEntity.setStatus(item.getStatus());
}else{
//成功采购项
detailEntity.setStatus(WareConstant.PurchaseDetailEnum.FINISH.getCode());
//3.将完成的采购保存入库--wms_ware_sku
final PurchaseDetailEntity entity = purchaseDetailService.getById(item.getItemId());
wareSkuService.addStock(entity.getSkuId(),entity.getWareId(),entity.getSkuNum());
}
//采购单的id
detailEntity.setId(item.getItemId());
updates.add(detailEntity);
}
//批量更新
purchaseDetailService.updateBatchById(updates);
//改变采购单状态
PurchaseEntity purchaseEntity = new PurchaseEntity();
purchaseEntity.setId(id);
purchaseEntity.setStatus(flag ?WareConstant.PurchaseDetailEnum.FINISH.getCode() : WareConstant.PurchaseDetailEnum.HASERROR.getCode());
purchaseEntity.setUpdateTime(new Date());
this.updateById(purchaseEntity);
}
WareSkuServiceImpl
@Override
public void addStock(Long skuId, Long wareId, Integer skuNum) {
//判断如果还没这个库存记录新增
List<WareSkuEntity> entities = wareSkuDao.selectList(new QueryWrapper<WareSkuEntity>().eq("sku_id", skuId).eq("ware_id", wareId));
if(entities==null ||entities.size() ==0){
//新增
WareSkuEntity wareSkuEntity = new WareSkuEntity();
wareSkuEntity.setSkuId(skuId);
wareSkuEntity.setStock(skuNum);
wareSkuEntity.setWareId(wareId);
wareSkuDao.insert(wareSkuEntity);
}else{
wareSkuDao.addStock(skuId,wareId,skuNum);
}
}
@Autowired WareSkuDao wareSkuDao;
@Override
public void addStock(Long skuId, Long wareId, Integer skuNum) {
wareSkuDao.addStock(skuId,wareId,skuNum);
}
多个参数一定要指定@param
@Mapper
public interface WareSkuDao extends BaseMapper<WareSkuEntity> {
void addStock(@Param("skuId") Long skuId, @Param("wareId") Long wareId, @Param("skuNum") Integer skuNum);
}
<update id="addStock">
update wms_ware_sku set stock = stock+#{stock} where sku_id=#{skuId} and ware_id=#{wareId};
</update>
分页
将启动类的开启事务和包扫描注解剪切到WareMybatisConfig
package com.example.gulimall.ware.config;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableTransactionManagement //开启事务
@MapperScan("com.example.gulimall.ware.dao")
public class WareMybatisConfig {
@Bean
public PaginationInterceptor paginationInterceptor(){
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
//设置请求的页面大于最大页后操作,TRUE调回到首页,false继续请求,默认false
paginationInterceptor.setOverflow(true);
//设置最大单页限制数量,默认500条,-1不受限制
paginationInterceptor.setLimit(1000);
return paginationInterceptor;
}
}
测试
{"id":1,
"items":[
{"itemId":1,"status":3,"reason":""},
{"itemId":2,"status":4,"reason":"无货"}
]}
http://localhost:88/api/ware/purchase/done
测试2
合并整单--直接确定,不选采单人
在这里分配采购人--admin
领取3号采购单
已领取
添加 sku_name和锁定库存
1)、让所有请求过网关;
* 1、@FeignClient("gulimall-gateway"):给gulimall-gateway所在的机器发请求
* 2、/api/product/skuinfo/info/{skuId}
* 2)、直接让后台指定服务处理
* 1、@FeignClient("gulimall-product")
* 2、/product/skuinfo/info/{skuId}
启动类中添加@EnableFeignClients
WareSkuServiceImpl @Autowired ProductFeignService productFeignService;
@FeignClient("gulimall-product") //指明调用的远程服务
public interface ProductFeignService {
/**
* /product/skuinfo/info/{skuId}:
* 先找gulimall-product,然后发送请求/api/product/skuinfo/info/{skuId}
* /api/product/skuinfo/info/{skuId}:
* 直接经过网关到对应服务查询
* @FeignClient("gulimall-gateway")
*
* @param skuId
* @return
*/
@RequestMapping("/product/skuinfo/info/{skuId}")
public R info(@PathVariable("skuId") Long skuId);
}
WareSkuServiceImpl
@Override
public void addStock(Long skuId, Long wareId, Integer skuNum) {
//判断如果还没记录这个库存新增
List<WareSkuEntity> entities = wareSkuDao.selectList(new QueryWrapper<WareSkuEntity>().eq("sku_id", skuId).eq("ware_id", wareId));
if(entities==null ||entities.size() ==0){
//新增
WareSkuEntity wareSkuEntity = new WareSkuEntity();
wareSkuEntity.setSkuId(skuId);
wareSkuEntity.setStock(skuNum);
wareSkuEntity.setWareId(wareId);
//设置锁定库存默认值为0
wareSkuEntity.setStock(0);
//TODO 远程查询sku的名字,如果失败,整个事务无需回滚
/*整个事务无需回滚做法
1。自己catch异常
2.高级部分说
*/
try{
//设置存入库存的商品名称
R info = productFeignService.info(skuId);
Map<String,Object> data = (Map<String, Object>) info.get("skuInfo");
if(info.getCode()==0){
wareSkuEntity.setSkuName((String) data.get("skuName"));
}
}catch (Exception e){}
wareSkuDao.insert(wareSkuEntity);
}else{
wareSkuDao.addStock(skuId,wareId,skuNum);
}
}
P100
商品维护----sku管理---规格
点规格报400 : /src/router/index.js 在mainRoutes->children里面加上:
{ path: '/product-attrupdate', component: _import('modules/product/attrupdate'), name: 'attr-update', meta: { title: '规格维护', isTab: true } }
获取sku规格--pms_product_attr_value
AttrController
@Autowired
ProductAttrValueService productAttrValueService;
@GetMapping("/base/listforspu/{spuId}")
public R baseAttrListForSpu(@PathVariable("spuId") Long spuId){
List<ProductAttrValueEntity> entities = productAttrValueService.baseAttrListForSpu(spuId);
return R.ok().put("data",entities);
}
ProductAttrValueServiceImpl
@Override
public List<ProductAttrValueEntity> baseAttrListForSpu(Long spuId) {
final List<ProductAttrValueEntity> entities = this.baseMapper.selectList(new QueryWrapper<ProductAttrValueEntity>().eq("spu_id", spuId));
return entities;
}
修改规格
AttrController
/**
* 修改规格
*/
@PostMapping("/update/{spuId}")
public R updateSpuAttr(@PathVariable("spuId") Long spuId,
@RequestBody List<ProductAttrValueEntity> entities){
productAttrValueService.updateSpuAttr(spuId,entities);
return R.ok();
}
ProductAttrValueServiceImpl
@Transactional
@Override
public void updateSpuAttr(Long spuId, List<ProductAttrValueEntity> entities) {
//1.删除这个spuId之前对应的所有属性
this.baseMapper.delete(new QueryWrapper<ProductAttrValueEntity>().eq("spu_id",spuId));
//2.加入新的数据---更新
//对entities中的每一个对应的项遍历设置
final List<ProductAttrValueEntity> collect = entities.stream().map(item -> {
item.setSpuId(spuId);
return item;
}).collect(Collectors.toList());
//批量保存
this.saveBatch(collect);
}
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml
chmod -R 777 /mydata/elasticsearch/
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.56.10:9200 -p 5601:5601 \
-d kibana:7.4.2
ipconfig 查看虚拟机IP
docker exec -it 容器名称或容器id /bin/bash
进入 根目录下的config目录,修改kibana,yml文件