存酒业务逻辑+mybatisPlus

This commit is contained in:
wangguocheng 2024-04-29 09:42:41 +08:00
parent 8f7acca8e6
commit 963e311b60
16 changed files with 372 additions and 5 deletions

View File

@ -15,6 +15,7 @@
*/
package me.zhengjie.utils;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.data.domain.Page;
import java.util.*;
@ -49,8 +50,12 @@ public class PageUtil extends cn.hutool.core.util.PageUtil {
map.put("totalElements",page.getTotalElements());
return map;
}
public static Map<String,Object> toPlusPage(List<T> list, Integer total) {
Map<String,Object> map = new LinkedHashMap<>(2);
map.put("content",list);
map.put("totalElements",total);
return map;
}
/**
* 自定义分页
*/

View File

@ -93,10 +93,20 @@
<version>2.1.4</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.baomidou</groupId>-->
<!-- <artifactId>mybatis-plus-extension</artifactId>-->
<!-- <version>3.3.2</version>-->
<!-- </dependency>-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.3.2</version>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.3.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
</dependencies>
<profiles>

View File

@ -0,0 +1,36 @@
package me.zhengjie.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.*;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import java.util.Collections;
@Configuration
@MapperScan("me.zhengjie.mybatis.mapper")
@EnableTransactionManagement
public class MybatisPlusConfig {
@Bean
public PaginationInnerInterceptor paginationInnerInterceptor() {
PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor();
// 设置最大单页限制数量默认 500 -1 不受限制
paginationInterceptor.setMaxLimit(-1L);
paginationInterceptor.setDbType(DbType.MYSQL);
// 开启 count join 优化,只针对部分 left join
paginationInterceptor.setOptimizeJoin(true);
return paginationInterceptor;
}
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.setInterceptors(Collections.singletonList(paginationInnerInterceptor()));
return mybatisPlusInterceptor;
}
}

View File

@ -15,6 +15,9 @@
*/
package me.zhengjie.modules.productInfo.product.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import cn.hutool.core.bean.BeanUtil;
import io.swagger.annotations.ApiModelProperty;
@ -36,12 +39,14 @@ import java.io.Serializable;
@Entity
@Data
@Table(name="tb_product")
@TableName("tb_product")
public class TbProduct implements Serializable {
@Id
@Column(name = "`id`")
@GeneratedValue(strategy = GenerationType.IDENTITY)
@ApiModelProperty(value = "id")
@TableId(type = IdType.AUTO)
private Integer id;
@Column(name = "`source_path`")

View File

@ -16,7 +16,10 @@
package me.zhengjie.modules.productInfo.productSku.domain;
import cn.hutool.json.JSON;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import cn.hutool.core.bean.BeanUtil;
import io.swagger.annotations.ApiModelProperty;
@ -35,12 +38,14 @@ import java.io.Serializable;
@Entity
@Data
@Table(name="tb_product_sku")
@TableName("tb_product_sku")
public class TbProductSku implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "`id`")
@ApiModelProperty(value = "自增id")
@TableId(type = IdType.AUTO)
private Integer id;
@Column(name = "`shop_id`")

View File

@ -15,6 +15,9 @@
*/
package me.zhengjie.modules.shopInfo.merchantAccount.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import cn.hutool.core.bean.BeanUtil;
import io.swagger.annotations.ApiModelProperty;
@ -31,6 +34,7 @@ import java.io.Serializable;
**/
@Entity
@Data
@TableName("tb_merchant_account")
@Table(name="tb_merchant_account")
public class TbMerchantAccount implements Serializable {
@ -38,6 +42,7 @@ public class TbMerchantAccount implements Serializable {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "`id`")
@ApiModelProperty(value = "自增id")
@TableId(type = IdType.AUTO)
private Integer id;
@Column(name = "`account`",nullable = false)

View File

@ -15,7 +15,6 @@
*/
package me.zhengjie.modules.shopInfo.shopRegister.service.impl;
import com.baomidou.mybatisplus.extension.api.R;
import me.zhengjie.exception.BadRequestException;
import me.zhengjie.modules.shopInfo.shopRegister.domain.TbMerchantRegister;
import me.zhengjie.utils.ValidationUtil;

View File

@ -0,0 +1,13 @@
package me.zhengjie.mybatis.entity;
import lombok.Data;
@Data
public class StorageVo {
private Integer id;
private String productName;
private String img;
private String account;
private String unit;
private Integer num;
}

View File

@ -0,0 +1,33 @@
package me.zhengjie.mybatis.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("tb_user_storage")
public class TbUserStorage extends Model<TbUserStorage> {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.ASSIGN_UUID)
private String id; // 记录ID
private Integer userId; // 用户ID
private String shopId; // 用户ID
private Integer productId;
private Integer num;
private Integer outNum;
private Integer inNum;
private Date createTime;
private String account;
private String unit;
private String productName;
private Integer skuId;
private String skuName;
private String imgUrl;
}

View File

@ -0,0 +1,30 @@
/*
* Copyright 2019-2020 Zheng Jie
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package me.zhengjie.mybatis.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import me.zhengjie.modules.shopInfo.merchantAccount.domain.TbMerchantAccount;
import me.zhengjie.mybatis.entity.TbUserStorage;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
/**
* @website https://eladmin.vip
* @author lyf
* @date 2024-02-08
**/
public interface TbMerchantAccountMapper extends BaseMapper<TbMerchantAccount> {
}

View File

@ -0,0 +1,10 @@
package me.zhengjie.mybatis.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import me.zhengjie.modules.productInfo.product.domain.TbProduct;
import me.zhengjie.modules.productInfo.productSku.domain.TbProductSku;
public interface TbProducSkutMapper extends BaseMapper<TbProductSku> {
}

View File

@ -0,0 +1,10 @@
package me.zhengjie.mybatis.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import me.zhengjie.modules.productInfo.product.domain.TbProduct;
import me.zhengjie.mybatis.entity.TbUserStorage;
public interface TbProductMapper extends BaseMapper<TbProduct> {
}

View File

@ -0,0 +1,9 @@
package me.zhengjie.mybatis.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import me.zhengjie.mybatis.entity.TbUserStorage;
public interface TbUserStorageMapper extends BaseMapper<TbUserStorage> {
}

View File

@ -0,0 +1,40 @@
package me.zhengjie.mybatis.rest;
import io.swagger.annotations.Api;
import lombok.RequiredArgsConstructor;
import me.zhengjie.annotation.Log;
import me.zhengjie.mybatis.entity.StorageVo;
import me.zhengjie.mybatis.service.ShopService;
import me.zhengjie.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequiredArgsConstructor
@Api(tags = "/shop/storage")
@RequestMapping("/api/storage")
public class StorageController {
@Autowired
private ShopService shopService;
@PostMapping("/findStorage")
public ResponseEntity<Object> findStorage(@RequestParam Integer shopId,String account,Pageable pageable){
return new ResponseEntity<>(shopService.findStorage(shopId,account,pageable), HttpStatus.OK);
}
@PostMapping("/outStorage")
@Log("商品出库")
public ResponseEntity<Object> outStorage(@RequestParam Integer id,@RequestParam Integer num){
String userName = SecurityUtils.getCurrentUsername();
shopService.outStorage(id,userName,num);
return new ResponseEntity<>( HttpStatus.OK);
}
@PostMapping("/inStorage")
@Log("商品入库")
public ResponseEntity<Object> inStorage(@RequestBody StorageVo storageVo){
String userName = SecurityUtils.getCurrentUsername();
shopService.inStorage(storageVo,userName);
return new ResponseEntity<>(HttpStatus.OK);
}
}

View File

@ -0,0 +1,34 @@
/*
* Copyright 2019-2020 Zheng Jie
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package me.zhengjie.mybatis.service;
import me.zhengjie.mybatis.entity.StorageVo;
import org.springframework.data.domain.Pageable;
/**
* @website https://eladmin.vip
* @description 服务接口
* @author admin
* @date 2023-10-30
**/
public interface ShopService {
Object findStorage(Integer shopId, String account, Pageable pageable);
void outStorage(Integer id, String userName, Integer num);
void inStorage(StorageVo storageVo, String userName);
}

View File

@ -0,0 +1,123 @@
/*
* Copyright 2019-2020 Zheng Jie
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package me.zhengjie.mybatis.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import me.zhengjie.exception.NewBadRequestException;
import me.zhengjie.modules.productInfo.productSku.domain.TbProductSku;
import me.zhengjie.modules.shopInfo.merchantAccount.domain.TbMerchantAccount;
import me.zhengjie.mybatis.entity.StorageVo;
import me.zhengjie.mybatis.entity.TbUserStorage;
import me.zhengjie.mybatis.mapper.TbMerchantAccountMapper;
import me.zhengjie.mybatis.mapper.TbProducSkutMapper;
import me.zhengjie.mybatis.mapper.TbProductMapper;
import me.zhengjie.mybatis.mapper.TbUserStorageMapper;
import me.zhengjie.mybatis.service.ShopService;
import me.zhengjie.utils.*;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.*;
/**
* @author admin
* @website https://eladmin.vip
* @description 服务实现
* @date 2023-10-30
**/
@Service
public class ShopServiceImpl implements ShopService {
@Autowired
private TbUserStorageMapper userStorageMapper;
@Autowired
private TbMerchantAccountMapper tbMerchantAccountMapper;
@Autowired
private TbProducSkutMapper producSkutMapper;
@Autowired
private TbProductMapper productMapper;
@Override
public Object findStorage(Integer shopId, String account, Pageable pageable) {
QueryWrapper<TbUserStorage> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("shop_id", shopId);
if (StringUtils.isNotEmpty(account)) {
queryWrapper.eq("account", account);
}
IPage<TbUserStorage> iPage = userStorageMapper.selectPage(new Page<>(pageable.getPageNumber(), pageable.getPageSize()), queryWrapper);
return PageUtil.toPage(iPage.getRecords(), iPage.getTotal());
}
@Override
public void outStorage(Integer id, String userName, Integer num) {
if (Objects.isNull(num) || num < 0) {
throw new NewBadRequestException("请输入出库数量");
}
QueryWrapper<TbMerchantAccount> wrapper = new QueryWrapper<>();
wrapper.eq("account", userName);
TbMerchantAccount merchantAccount = tbMerchantAccountMapper.selectOne(wrapper);
QueryWrapper<TbUserStorage> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("id", id);
queryWrapper.eq("shop_id", merchantAccount.getShopId());
TbUserStorage userStorage = userStorageMapper.selectOne(queryWrapper);
if (Objects.isNull(userStorage)) {
throw new NewBadRequestException("存储商品在该店铺不存在");
}
if (userStorage.getNum() < num) {
throw new NewBadRequestException("库存不足");
}
userStorage.setNum(userStorage.getNum() - num);
userStorage.setOutNum(userStorage.getOutNum() + num);
userStorageMapper.updateById(userStorage);
}
@Override
public void inStorage(StorageVo storageVo, String userName) {
if (Objects.isNull(storageVo.getNum()) || storageVo.getNum() < 0) {
throw new NewBadRequestException("请输入出库数量");
}
QueryWrapper<TbMerchantAccount> wrapper = new QueryWrapper<>();
wrapper.eq("account", userName);
TbMerchantAccount merchantAccount = tbMerchantAccountMapper.selectOne(wrapper);
QueryWrapper<TbUserStorage> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("product_name", storageVo.getProductName());
queryWrapper.eq("account", storageVo.getAccount());
queryWrapper.eq("shop_id", merchantAccount.getShopId());
TbUserStorage userStorage = userStorageMapper.selectOne(queryWrapper);
if (Objects.nonNull(userStorage)) {
userStorage.setNum(userStorage.getNum() + storageVo.getNum());
userStorage.setInNum(userStorage.getInNum() + storageVo.getNum());
userStorageMapper.updateById(userStorage);
}else {
userStorage = new TbUserStorage();
userStorage.setAccount(storageVo.getAccount());
userStorage.setCreateTime(new Date());
userStorage.setShopId(merchantAccount.getShopId());
userStorage.setNum(storageVo.getNum());
userStorage.setOutNum(0);
userStorage.setInNum(storageVo.getNum());
userStorage.setImgUrl(storageVo.getImg());
userStorage.setProductName(storageVo.getImg());
userStorage.setUnit(storageVo.getUnit());
userStorageMapper.insert(userStorage);
}
}
}