From eca9ffa03690ed19e97db00fb4c29ecd6a764fa0 Mon Sep 17 00:00:00 2001 From: SjS Date: Sat, 7 Jun 2025 18:02:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8E=E5=8F=B0=E5=AD=98=E9=85=92=E5=8F=96?= =?UTF-8?q?=E9=85=92=E5=8A=9F=E8=83=BD=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/bst/app/mapper/AppMapper.xml | 1 - .../bst/complaint/mapper/ComplaintMapper.xml | 2 +- .../ruoyi/bst/location/domain/Location.java | 6 + .../bst/location/domain/LocationQuery.java | 7 + .../ruoyi/bst/location/domain/LocationVO.java | 5 + .../bst/location/mapper/LocationMapper.java | 4 +- .../bst/location/mapper/LocationMapper.xml | 62 +++++-- .../location/service/LocationAssembler.java | 17 ++ .../bst/location/service/LocationService.java | 9 +- .../location/service/LocationValidator.java | 21 +++ .../service/impl/LocationAssemblerImpl.java | 51 ++++++ .../service/impl/LocationServiceImpl.java | 53 ++++-- .../service/impl/LocationValidatorImpl.java | 53 ++++++ .../com/ruoyi/bst/storage/domain/Storage.java | 11 ++ .../bst/storage/domain/StorageQuery.java | 10 ++ .../ruoyi/bst/storage/domain/StorageVO.java | 23 +++ .../bst/storage/domain/dto/StorageDTO.java | 15 ++ .../bst/storage/mapper/StorageMapper.java | 6 + .../bst/storage/mapper/StorageMapper.xml | 159 ++++++++++++------ .../bst/storage/service/StorageConverter.java | 19 +++ .../bst/storage/service/StorageService.java | 14 +- .../bst/storage/service/StorageValidator.java | 23 +++ .../service/impl/StorageConverterImpl.java | 50 ++++++ .../service/impl/StorageServiceImpl.java | 98 ++++++++++- .../service/impl/StorageValidatorImpl.java | 62 +++++++ .../domain/enums/StoreStaffPermission.java | 9 +- .../com/ruoyi/bst/team/mapper/TeamMapper.java | 2 +- .../com/ruoyi/bst/team/mapper/TeamMapper.xml | 6 + .../ruoyi/bst/team/service/TeamService.java | 2 +- .../ruoyi/bst/team/service/TeamValidator.java | 15 +- .../team/service/impl/TeamServiceImpl.java | 2 +- .../team/service/impl/TeamValidatorImpl.java | 5 + .../bst/teamUser/mapper/TeamUserMapper.java | 2 + .../bst/teamUser/mapper/TeamUserMapper.xml | 14 +- .../teamUser/service/TeamUserValidator.java | 4 +- .../service/impl/TeamUserValidatorImpl.java | 20 +-- .../ruoyi/web/app/AppStorageController.java | 14 +- .../com/ruoyi/web/bst/LocationController.java | 28 ++- .../com/ruoyi/web/bst/StorageController.java | 46 ++++- .../com/ruoyi/web/bst/TeamController.java | 5 +- .../com/ruoyi/web/bst/TeamUserController.java | 2 + 41 files changed, 829 insertions(+), 128 deletions(-) create mode 100644 ruoyi-service/src/main/java/com/ruoyi/bst/location/service/LocationAssembler.java create mode 100644 ruoyi-service/src/main/java/com/ruoyi/bst/location/service/LocationValidator.java create mode 100644 ruoyi-service/src/main/java/com/ruoyi/bst/location/service/impl/LocationAssemblerImpl.java create mode 100644 ruoyi-service/src/main/java/com/ruoyi/bst/location/service/impl/LocationValidatorImpl.java create mode 100644 ruoyi-service/src/main/java/com/ruoyi/bst/storage/domain/dto/StorageDTO.java create mode 100644 ruoyi-service/src/main/java/com/ruoyi/bst/storage/service/StorageConverter.java create mode 100644 ruoyi-service/src/main/java/com/ruoyi/bst/storage/service/StorageValidator.java create mode 100644 ruoyi-service/src/main/java/com/ruoyi/bst/storage/service/impl/StorageConverterImpl.java create mode 100644 ruoyi-service/src/main/java/com/ruoyi/bst/storage/service/impl/StorageValidatorImpl.java diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/app/mapper/AppMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/app/mapper/AppMapper.xml index 8ab9cb8..f90d9fc 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/app/mapper/AppMapper.xml +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/app/mapper/AppMapper.xml @@ -26,7 +26,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" left join sys_user su on bua.user_id = su.user_id - and ba.id = #{query.id} and ba.name like concat('%', #{query.name}, '%') diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/complaint/mapper/ComplaintMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/complaint/mapper/ComplaintMapper.xml index 63b4f55..5ce6a3a 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/complaint/mapper/ComplaintMapper.xml +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/complaint/mapper/ComplaintMapper.xml @@ -35,7 +35,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and type = #{query.type} and picture = #{query.picture} and contact like concat('%', #{query.contact}, '%') - and su.userName like concat('%', #{query.userName}, '%') + and su.user_name like concat('%', #{query.userName}, '%') ${query.params.dataScope} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/location/domain/Location.java b/ruoyi-service/src/main/java/com/ruoyi/bst/location/domain/Location.java index 6bd8f1e..592eb62 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/location/domain/Location.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/location/domain/Location.java @@ -1,5 +1,6 @@ package com.ruoyi.bst.location.domain; +import com.ruoyi.common.core.validate.ValidGroup; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -7,6 +8,9 @@ import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + /** * 存放位置对象 bst_location * @@ -22,10 +26,12 @@ public class Location extends BaseEntity @Excel(name = "店铺ID") @ApiModelProperty("店铺ID") + @NotNull(message = "店铺ID不能为空",groups = {ValidGroup.Create.class}) private Long storeId; @Excel(name = "位置名称") @ApiModelProperty("位置名称") + @NotBlank(message = "位置名称不能为空",groups = {ValidGroup.Create.class}) private String name; } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/location/domain/LocationQuery.java b/ruoyi-service/src/main/java/com/ruoyi/bst/location/domain/LocationQuery.java index f9debf3..7f91c88 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/location/domain/LocationQuery.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/location/domain/LocationQuery.java @@ -1,7 +1,14 @@ package com.ruoyi.bst.location.domain; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.List; + @Data public class LocationQuery extends LocationVO{ + + @ApiModelProperty("位置ID列表") + private List locationIds; + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/location/domain/LocationVO.java b/ruoyi-service/src/main/java/com/ruoyi/bst/location/domain/LocationVO.java index aeaaa16..82dce48 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/location/domain/LocationVO.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/location/domain/LocationVO.java @@ -1,7 +1,12 @@ package com.ruoyi.bst.location.domain; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class LocationVO extends Location{ + + @ApiModelProperty("当前位置物品数量") + private Integer currentNum; + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/location/mapper/LocationMapper.java b/ruoyi-service/src/main/java/com/ruoyi/bst/location/mapper/LocationMapper.java index 0aff4ba..7fc229f 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/location/mapper/LocationMapper.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/location/mapper/LocationMapper.java @@ -70,5 +70,7 @@ public interface LocationMapper * @param ids 需要删除的数据主键集合 * @return 结果 */ - public int deleteLocationByIds(Long[] ids); + public int deleteLocationByIds(List ids); + + List selectIdByQuery(@Param("query") LocationQuery query); } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/location/mapper/LocationMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/location/mapper/LocationMapper.xml index a1b4e0e..f9c4ffd 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/location/mapper/LocationMapper.xml +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/location/mapper/LocationMapper.xml @@ -1,29 +1,47 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - + + + + select - id, - store_id, - name, - create_time - from bst_location + bl.id, + bl.store_id, + bl.name, + bl.create_time + from + + + + + bst_location + bl + left join bst_store bs on bl.store_id = bs.store_id - and id = #{query.id} - and store_id = #{query.storeId} - and name like concat('%', #{query.name}, '%') + and bl.id = #{query.id} + and bl.store_id = #{query.storeId} + and bl.name like concat('%', #{query.name}, '%') + + and bl.id in + + #{ids} + + + ${@com.ruoyi.framework.util.DataScopeUtil@create(query.scope) + .userSetAlias("bs.user_id") + .storeAlias("bl.store_id",query.storePermissions) + .build() + } ${query.params.dataScope} @@ -39,18 +57,26 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where id = #{id} + + insert into bst_location store_id, name, create_time, - + #{storeId}, #{name}, #{createTime}, - + @@ -128,7 +154,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - delete from bst_location where id = #{id} + delete + from bst_location + where id = #{id} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/location/service/LocationAssembler.java b/ruoyi-service/src/main/java/com/ruoyi/bst/location/service/LocationAssembler.java new file mode 100644 index 0000000..65a2be3 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/location/service/LocationAssembler.java @@ -0,0 +1,17 @@ +package com.ruoyi.bst.location.service; + +import com.ruoyi.bst.location.domain.LocationVO; +import com.ruoyi.bst.team.domain.TeamVO; + +import java.util.List; + +public interface LocationAssembler { + + /** + * 拼接存酒数量 + * @param list + */ + void assembleStorageNum(List list); + + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/location/service/LocationService.java b/ruoyi-service/src/main/java/com/ruoyi/bst/location/service/LocationService.java index 0ac03e0..d60812e 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/location/service/LocationService.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/location/service/LocationService.java @@ -19,8 +19,13 @@ public interface LocationService * @param id 存放位置主键 * @return 存放位置 */ - public LocationVO selectLocationById(Long id); + public LocationVO selectLocationById(Long id,boolean scope); + default LocationVO selectLocationById(Long id){ + return this.selectLocationById(id,false); + } + + public LocationVO selectOne(LocationQuery query); /** * 查询存放位置列表 * @@ -51,7 +56,7 @@ public interface LocationService * @param ids 需要删除的存放位置主键集合 * @return 结果 */ - public int deleteLocationByIds(Long[] ids); + public int deleteLocationByIds(List ids); /** * 删除存放位置信息 diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/location/service/LocationValidator.java b/ruoyi-service/src/main/java/com/ruoyi/bst/location/service/LocationValidator.java new file mode 100644 index 0000000..df3b0c0 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/location/service/LocationValidator.java @@ -0,0 +1,21 @@ +package com.ruoyi.bst.location.service; + +import java.util.List; + +public interface LocationValidator { + + /** + * 判断当前用户是否可以修改位置信息 + * @param locationId 位置ID + * @return 是否允许 + */ + boolean canEdit(Long locationId); + + /** + * 判断当前用户是否可以删除位置信息 + * @param locationIds 位置ID集合 + * @return 是否允许 + */ + boolean canDelete(List locationIds); + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/location/service/impl/LocationAssemblerImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/location/service/impl/LocationAssemblerImpl.java new file mode 100644 index 0000000..ce032ea --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/location/service/impl/LocationAssemblerImpl.java @@ -0,0 +1,51 @@ +package com.ruoyi.bst.location.service.impl; + +import com.ruoyi.bst.location.domain.LocationQuery; +import com.ruoyi.bst.location.domain.LocationVO; +import com.ruoyi.bst.location.service.LocationAssembler; +import com.ruoyi.bst.location.service.LocationService; +import com.ruoyi.bst.storage.domain.StorageQuery; +import com.ruoyi.bst.storage.domain.StorageVO; +import com.ruoyi.bst.storage.service.StorageService; +import com.ruoyi.bst.team.domain.TeamVO; +import com.ruoyi.bst.team.service.TeamAssembler; +import com.ruoyi.bst.teamUser.domain.TeamUserQuery; +import com.ruoyi.bst.teamUser.domain.TeamUserVO; +import com.ruoyi.bst.teamUser.domain.enums.RoleType; +import com.ruoyi.bst.teamUser.service.TeamUserService; +import com.ruoyi.common.utils.collection.CollectionUtils; +import io.swagger.annotations.ApiModelProperty; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +public class LocationAssemblerImpl implements LocationAssembler { + + @Autowired + private StorageService storageService; + + @Override + public void assembleStorageNum(List list) { + if (CollectionUtils.isEmptyElement(list)) { + return; + } + + List locationIds = CollectionUtils.map(list, LocationVO::getId); + StorageQuery query = new StorageQuery(); + + query.setLocationIds(locationIds); + List storageList = storageService.selectCurrentNum(query); + Map idToCurrentNum = storageList.stream().collect(Collectors.toMap(StorageVO::getLocationId, StorageVO::getCurrentNum)); + + for (LocationVO location : list) { + Integer currentNum = idToCurrentNum.get(location.getId()); + location.setCurrentNum(currentNum); + } + } + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/location/service/impl/LocationServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/location/service/impl/LocationServiceImpl.java index 9145a50..db53799 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/location/service/impl/LocationServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/location/service/impl/LocationServiceImpl.java @@ -1,7 +1,17 @@ package com.ruoyi.bst.location.service.impl; import java.util.List; + +import com.github.pagehelper.PageHelper; +import com.ruoyi.bst.storage.domain.StorageQuery; +import com.ruoyi.bst.storage.domain.StorageVO; +import com.ruoyi.bst.storage.service.StorageService; +import com.ruoyi.bst.storeStaff.domain.enums.StoreStaffPermission; +import com.ruoyi.bst.team.domain.TeamQuery; +import com.ruoyi.bst.team.domain.TeamVO; import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.ServiceUtil; +import com.ruoyi.common.utils.collection.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.bst.location.mapper.LocationMapper; @@ -17,10 +27,11 @@ import com.ruoyi.bst.location.service.LocationService; * @date 2025-06-06 */ @Service -public class LocationServiceImpl implements LocationService -{ +public class LocationServiceImpl implements LocationService { @Autowired private LocationMapper locationMapper; + @Autowired + private StorageService storageService; /** * 查询存放位置 @@ -29,9 +40,22 @@ public class LocationServiceImpl implements LocationService * @return 存放位置 */ @Override - public LocationVO selectLocationById(Long id) - { - return locationMapper.selectLocationById(id); + public LocationVO selectLocationById(Long id, boolean scope) { + if (id == null) { + return null; + } + LocationQuery query = new LocationQuery(); + query.setId(id); + query.setScope(scope); + query.addStorePermission(StoreStaffPermission.LOCATION_VIEW.getCode()); + return this.selectOne(query); + } + + @Override + public LocationVO selectOne(LocationQuery query) { + PageHelper.startPage(1, 1); + List list = this.selectLocationList(query); + return CollectionUtils.firstElement(list); } /** @@ -41,8 +65,7 @@ public class LocationServiceImpl implements LocationService * @return 存放位置 */ @Override - public List selectLocationList(LocationQuery location) - { + public List selectLocationList(LocationQuery location) { return locationMapper.selectLocationList(location); } @@ -53,8 +76,7 @@ public class LocationServiceImpl implements LocationService * @return 结果 */ @Override - public int insertLocation(Location location) - { + public int insertLocation(Location location) { location.setCreateTime(DateUtils.getNowDate()); return locationMapper.insertLocation(location); } @@ -66,8 +88,7 @@ public class LocationServiceImpl implements LocationService * @return 结果 */ @Override - public int updateLocation(Location location) - { + public int updateLocation(Location location) { return locationMapper.updateLocation(location); } @@ -78,8 +99,11 @@ public class LocationServiceImpl implements LocationService * @return 结果 */ @Override - public int deleteLocationByIds(Long[] ids) - { + public int deleteLocationByIds(List ids) { + StorageQuery query = new StorageQuery(); + query.setLocationIds(ids); + List storageList = storageService.selectStorageList(query); + ServiceUtil.assertion(storageList != null && !storageList.isEmpty(),"当前位置有物品存放,不允许删除"); return locationMapper.deleteLocationByIds(ids); } @@ -90,8 +114,7 @@ public class LocationServiceImpl implements LocationService * @return 结果 */ @Override - public int deleteLocationById(Long id) - { + public int deleteLocationById(Long id) { return locationMapper.deleteLocationById(id); } } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/location/service/impl/LocationValidatorImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/location/service/impl/LocationValidatorImpl.java new file mode 100644 index 0000000..6e9e95e --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/location/service/impl/LocationValidatorImpl.java @@ -0,0 +1,53 @@ +package com.ruoyi.bst.location.service.impl; + +import com.ruoyi.bst.location.domain.LocationQuery; +import com.ruoyi.bst.location.domain.LocationVO; +import com.ruoyi.bst.location.mapper.LocationMapper; +import com.ruoyi.bst.location.service.LocationValidator; +import com.ruoyi.bst.storeStaff.domain.enums.StoreStaffPermission; +import com.ruoyi.bst.team.domain.TeamQuery; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.collection.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; + +@Service +public class LocationValidatorImpl implements LocationValidator { + + @Autowired + private LocationMapper locationMapper; + + @Override + public boolean canEdit(Long locationId) { + return canOperate(Arrays.asList(locationId)); + } + + @Override + public boolean canDelete(List locationIds) { + return canOperate(locationIds); + } + + private boolean canOperate(List locationIds) { + return hasPermission(locationIds, StoreStaffPermission.LOCATION_EDIT.getCode()); + } + + private boolean hasPermission(List locationIds, String permission) { + if (SecurityUtils.isSysAdmin()) { + return true; + } + if (CollectionUtils.isEmptyElement(locationIds)) { + return true; + } + // 查询拼桌 + LocationQuery query = new LocationQuery(); + query.setLocationIds(locationIds); + query.setScope(true); + query.addStorePermission(permission); + List locationIdList = locationMapper.selectIdByQuery(query); + return new HashSet<>(locationIdList).containsAll(locationIds); + } +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/storage/domain/Storage.java b/ruoyi-service/src/main/java/com/ruoyi/bst/storage/domain/Storage.java index 34c734c..8ee292c 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/storage/domain/Storage.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/storage/domain/Storage.java @@ -5,6 +5,7 @@ import java.util.List; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.bst.specValue.domain.SpecValue; +import com.ruoyi.common.core.validate.ValidGroup; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -12,6 +13,9 @@ import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + /** * 存酒对象 bst_storage * @@ -27,26 +31,32 @@ public class Storage extends BaseEntity @Excel(name = "存放位置ID") @ApiModelProperty("存放位置ID") + @NotNull(message = "存放位置ID不能为空",groups = {ValidGroup.Create.class}) private Long locationId; @Excel(name = "店铺ID") @ApiModelProperty("店铺ID") + @NotNull(message = "店铺ID不能为空",groups = {ValidGroup.Create.class}) private Long storeId; @Excel(name = "用户ID") @ApiModelProperty("用户ID") + @NotNull(message = "用户ID不能为空",groups = {ValidGroup.Create.class}) private Long userId; @Excel(name = "商品skuID") @ApiModelProperty("商品skuID") + @NotNull(message = "商品skuID不能为空",groups = {ValidGroup.Create.class}) private Long skuId; @Excel(name = "商品名称") @ApiModelProperty("商品名称") + @NotBlank(message = "商品名称不能为空",groups = {ValidGroup.Create.class}) private String goodsName; @Excel(name = "存放数量") @ApiModelProperty("存放数量") + @NotNull(message = "存放数量不能为空",groups = {ValidGroup.Create.class}) private Integer totalNum; @Excel(name = "已取数量") @@ -59,6 +69,7 @@ public class Storage extends BaseEntity private Date deadline; @ApiModelProperty("规格值列表") + @NotNull(message = "规格值列表不能为空",groups = {ValidGroup.Create.class}) private List specValue; } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/storage/domain/StorageQuery.java b/ruoyi-service/src/main/java/com/ruoyi/bst/storage/domain/StorageQuery.java index 24f12af..057a8fb 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/storage/domain/StorageQuery.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/storage/domain/StorageQuery.java @@ -1,7 +1,17 @@ package com.ruoyi.bst.storage.domain; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.List; + @Data public class StorageQuery extends StorageVO{ + + @ApiModelProperty("位置ID列表") + private List locationIds; + + @ApiModelProperty("存酒信息ID列表") + private List storageIds; + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/storage/domain/StorageVO.java b/ruoyi-service/src/main/java/com/ruoyi/bst/storage/domain/StorageVO.java index 6124a31..ea5c37a 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/storage/domain/StorageVO.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/storage/domain/StorageVO.java @@ -1,7 +1,30 @@ package com.ruoyi.bst.storage.domain; +import com.ruoyi.common.annotation.Excel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class StorageVO extends Storage{ + + @ApiModelProperty("用户名称") + private String userName; + + @ApiModelProperty("商品名称") + private String goodsName; + + @ApiModelProperty("店铺名称") + private String storeName; + + @ApiModelProperty("位置名称") + private String locationName; + + @Excel(name = "当前数量") + @ApiModelProperty("当前数量") + private Integer currentNum; + + public Integer getCurrentNum() { + return getTotalNum() - getTakenNum(); + } + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/storage/domain/dto/StorageDTO.java b/ruoyi-service/src/main/java/com/ruoyi/bst/storage/domain/dto/StorageDTO.java new file mode 100644 index 0000000..bc7de40 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/storage/domain/dto/StorageDTO.java @@ -0,0 +1,15 @@ +package com.ruoyi.bst.storage.domain.dto; + +import com.ruoyi.bst.storage.domain.Storage; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class StorageDTO { + + @ApiModelProperty("存酒信息ID") + private Long storageId; + + @ApiModelProperty("取酒数量") + private Integer number; +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/storage/mapper/StorageMapper.java b/ruoyi-service/src/main/java/com/ruoyi/bst/storage/mapper/StorageMapper.java index 1fc6805..0b8f914 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/storage/mapper/StorageMapper.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/storage/mapper/StorageMapper.java @@ -71,4 +71,10 @@ public interface StorageMapper * @return 结果 */ public int deleteStorageByIds(Long[] ids); + + List selectCurrentNum(@Param("query") StorageQuery query); + + List selectIdByQuery(@Param("query") StorageQuery query); + + int batchGetWine(@Param("list") List toStorageUpdate); } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/storage/mapper/StorageMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/storage/mapper/StorageMapper.xml index 72d0eea..32fd523 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/storage/mapper/StorageMapper.xml +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/storage/mapper/StorageMapper.xml @@ -1,43 +1,45 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - + + + + + + + + + + + + select - bst.id, - bst.location_id, - bst.store_id, - bst.user_id, - bst.sku_id, - bst.goods_name, - bst.total_num, - bst.taken_num, - bst.deadline, - bst.spec_value, - bst.remark, - bst.create_time, - bs.name as goods_name, - bstor.name as store_name, - su.name as user_name, - bl.name as location_name - from + bst.id, + bst.location_id, + bst.store_id, + bst.user_id, + bst.sku_id, + bst.goods_name, + bst.total_num, + bst.taken_num, + bst.deadline, + bst.spec_value, + bst.remark, + bst.create_time, + bg.name as goods_name, + bstor.store_name, + su.user_name, + bl.name as location_name + from + @@ -45,22 +47,34 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" left join bst_sku bsk on bst.sku_id = bsk.id left join bst_goods bg on bsk.goods_id = bg.id left join sys_user su on bst.user_id = su.user_id - left join bst_store bstor on bst.store_id = bstor.id + left join bst_store bstor on bst.store_id = bstor.store_id left join bst_location bl on bst.location_id = bl.id - and id = #{query.id} - and location_id = #{query.locationId} - and store_id = #{query.storeId} - and user_id = #{query.userId} - and sku_id = #{query.skuId} - and goods_name like concat('%', #{query.goodsName}, '%') - and total_num = #{query.totalNum} - and taken_num = #{query.takenNum} - and deadline = #{query.deadline} - and spec_value = #{query.specValue} - and remark like concat('%', #{query.remark}, '%') + and bst.id = #{query.id} + and bst.location_id = #{query.locationId} + and bst.store_id = #{query.storeId} + and bst.user_id = #{query.userId} + and bst.sku_id = #{query.skuId} + and bst.goods_name like concat('%', #{query.goodsName}, '%') + and bst.total_num = #{query.totalNum} + and bst.taken_num = #{query.takenNum} + and bst.deadline <= #{query.deadline} + and bst.spec_value = #{query.specValue} + and bst.remark like concat('%', #{query.remark}, '%') + and su.user_name like concat('%', #{query.userName}, '%') + + and bst.location_id in + + #{ids} + + + ${@com.ruoyi.framework.util.DataScopeUtil@create(query.scope) + .userSetAlias("bsotr.user_id") + .storeAlias("bst.store_id",query.storePermissions) + .build() + } ${query.params.dataScope} @@ -76,6 +90,26 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where id = #{id} + + + + + insert into bst_storage @@ -90,7 +124,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" spec_value, remark, create_time, - + #{locationId}, #{storeId}, @@ -100,10 +134,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{totalNum}, #{takenNum}, #{deadline}, - #{specValue,typeHandler=com.ruoyi.bst.storage.mapper.typehandler.SpecValueListTypeHandler, + + #{specValue,typeHandler=com.ruoyi.bst.storage.mapper.typehandler.SpecValueListTypeHandler, + #{remark}, #{createTime}, - + @@ -140,7 +176,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" default, #{i.deadline}, default, - #{i.specValue,typeHandler=com.ruoyi.bst.storage.mapper.typehandler.SpecValueListTypeHandler}, + + #{i.specValue,typeHandler=com.ruoyi.bst.storage.mapper.typehandler.SpecValueListTypeHandler}, + default, #{i.remark}, default, @@ -236,7 +274,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - WHEN #{item.id} THEN #{item.specValue,typeHandler=com.ruoyi.bst.storage.mapper.typehandler.SpecValueListTypeHandler} + WHEN #{item.id} THEN + #{item.specValue,typeHandler=com.ruoyi.bst.storage.mapper.typehandler.SpecValueListTypeHandler} WHEN #{item.id} THEN `spec_value` @@ -271,11 +310,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - update bst_storage + update bst_storage bst - where id = #{data.id} + where bst.id = #{data.id} + + + + + UPDATE bst_storage bs + JOIN ( + + SELECT #{item.id} AS id, #{item.takenNum} AS delta + + ) AS updates ON bs.id = updates.id + SET bs.taken_num = bs.taken_num + updates.delta + WHERE (bs.taken_num + updates.delta) <= bs.total_num @@ -287,13 +338,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" total_num = #{data.totalNum}, taken_num = #{data.takenNum}, deadline = #{data.deadline}, - spec_value = #{data.specValue,typeHandler=com.ruoyi.bst.storage.mapper.typehandler.SpecValueListTypeHandler}, + spec_value = + #{data.specValue,typeHandler=com.ruoyi.bst.storage.mapper.typehandler.SpecValueListTypeHandler}, + remark = #{data.remark}, create_time = #{data.createTime}, - delete from bst_storage where id = #{id} + delete + from bst_storage + where id = #{id} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/storage/service/StorageConverter.java b/ruoyi-service/src/main/java/com/ruoyi/bst/storage/service/StorageConverter.java new file mode 100644 index 0000000..66b84a5 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/storage/service/StorageConverter.java @@ -0,0 +1,19 @@ +package com.ruoyi.bst.storage.service; + + +import com.ruoyi.bst.model.domain.Model; +import com.ruoyi.bst.storage.domain.Storage; + +public interface StorageConverter { + + /** + * 创建时转换为PO + */ + Storage toPoByCreate(Storage data); + + /** + * 更新时转换为PO + */ + Storage toPoByUpdate(Storage data); + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/storage/service/StorageService.java b/ruoyi-service/src/main/java/com/ruoyi/bst/storage/service/StorageService.java index fd25e1c..d0b6620 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/storage/service/StorageService.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/storage/service/StorageService.java @@ -4,6 +4,7 @@ import java.util.List; import com.ruoyi.bst.storage.domain.Storage; import com.ruoyi.bst.storage.domain.StorageVO; import com.ruoyi.bst.storage.domain.StorageQuery; +import com.ruoyi.bst.storage.domain.dto.StorageDTO; /** * 存酒Service接口 @@ -19,7 +20,13 @@ public interface StorageService * @param id 存酒主键 * @return 存酒 */ - public StorageVO selectStorageById(Long id); + public StorageVO selectStorageById(Long id,boolean scope); + + default StorageVO selectStorageById(Long id){ + return selectStorageById(id,false); + } + + public StorageVO selectOne(StorageQuery query); /** * 查询存酒列表 @@ -62,4 +69,9 @@ public interface StorageService public int deleteStorageById(Long id); int storageWine(List storageList); + + List selectCurrentNum(StorageQuery query); + + int getWine(List list); + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/storage/service/StorageValidator.java b/ruoyi-service/src/main/java/com/ruoyi/bst/storage/service/StorageValidator.java new file mode 100644 index 0000000..c25fcdc --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/storage/service/StorageValidator.java @@ -0,0 +1,23 @@ +package com.ruoyi.bst.storage.service; + +import java.util.List; + +public interface StorageValidator { + + /** + * 判断当前用户是否可以修改存酒信息 + * @param storageId 存酒信息ID + * @return 是否允许 + */ + boolean canEdit(Long storageId); + + boolean canEdit(List storageIds); + + /** + * 判断当前用户是否可以删除存酒信息 + * @param storageIds 位置ID集合 + * @return 是否允许 + */ + boolean canDelete(List storageIds); + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/storage/service/impl/StorageConverterImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/storage/service/impl/StorageConverterImpl.java new file mode 100644 index 0000000..c78895f --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/storage/service/impl/StorageConverterImpl.java @@ -0,0 +1,50 @@ +package com.ruoyi.bst.storage.service.impl; + +import com.ruoyi.bst.model.domain.Model; +import com.ruoyi.bst.storage.domain.Storage; +import com.ruoyi.bst.storage.service.StorageConverter; +import org.springframework.stereotype.Service; + +@Service +public class StorageConverterImpl implements StorageConverter { + @Override + public Storage toPoByCreate(Storage data) { + if (data == null) { + return null; + } + Storage po = new Storage(); + + po.setLocationId(data.getLocationId()); + po.setStoreId(data.getStoreId()); + po.setUserId(data.getUserId()); + po.setSkuId(data.getSkuId()); + po.setGoodsName(data.getGoodsName()); + po.setTotalNum(data.getTotalNum()); + po.setDeadline(data.getDeadline()); + po.setSpecValue(data.getSpecValue()); + po.setRemark(data.getRemark()); + + return po; + } + + @Override + public Storage toPoByUpdate(Storage data) { + if (data == null) { + return null; + } + Storage po = new Storage(); + + po.setId(data.getId()); + po.setLocationId(data.getLocationId()); + po.setStoreId(data.getStoreId()); + po.setUserId(data.getUserId()); + po.setSkuId(data.getSkuId()); + po.setGoodsName(data.getGoodsName()); + po.setTotalNum(data.getTotalNum()); + po.setDeadline(data.getDeadline()); + po.setSpecValue(data.getSpecValue()); + po.setRemark(data.getRemark()); + + return po; + } +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/storage/service/impl/StorageServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/storage/service/impl/StorageServiceImpl.java index fa283f9..180c2eb 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/storage/service/impl/StorageServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/storage/service/impl/StorageServiceImpl.java @@ -1,7 +1,21 @@ package com.ruoyi.bst.storage.service.impl; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import com.github.pagehelper.PageHelper; +import com.ruoyi.bst.location.domain.LocationQuery; +import com.ruoyi.bst.location.domain.LocationVO; +import com.ruoyi.bst.storage.domain.dto.StorageDTO; +import com.ruoyi.bst.storageRecord.domain.StorageRecord; +import com.ruoyi.bst.storageRecord.service.StorageRecordService; +import com.ruoyi.bst.storeStaff.domain.enums.StoreStaffPermission; import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.ServiceUtil; +import com.ruoyi.common.utils.collection.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.bst.storage.mapper.StorageMapper; @@ -9,6 +23,7 @@ import com.ruoyi.bst.storage.domain.Storage; import com.ruoyi.bst.storage.domain.StorageVO; import com.ruoyi.bst.storage.domain.StorageQuery; import com.ruoyi.bst.storage.service.StorageService; +import org.springframework.transaction.support.TransactionTemplate; /** * 存酒Service业务层处理 @@ -21,6 +36,12 @@ public class StorageServiceImpl implements StorageService { @Autowired private StorageMapper storageMapper; + @Autowired + private TransactionTemplate transactionTemplate; + @Autowired + private StorageRecordService storageRecordService; + @Autowired + private StorageService storageService; /** * 查询存酒 @@ -29,11 +50,25 @@ public class StorageServiceImpl implements StorageService * @return 存酒 */ @Override - public StorageVO selectStorageById(Long id) + public StorageVO selectStorageById(Long id,boolean scope) { - return storageMapper.selectStorageById(id); + if (id == null) { + return null; + } + StorageQuery query = new StorageQuery(); + query.setId(id); + query.setScope(scope); + query.addStorePermission(StoreStaffPermission.STORAGE_VIEW.getCode()); + return this.selectOne(query); } + + @Override + public StorageVO selectOne(StorageQuery query) { + PageHelper.startPage(1, 1); + List list = this.selectStorageList(query); + return CollectionUtils.firstElement(list); + } /** * 查询存酒列表 * @@ -102,4 +137,63 @@ public class StorageServiceImpl implements StorageService }); return storageMapper.batchInsert(storageList); } + + @Override + public List selectCurrentNum(StorageQuery query) { + return storageMapper.selectCurrentNum(query); + } + + + @Override + public int getWine(List list) { + // 查询需要更新的存酒信息id列表 + List ids = list.stream() + .map(StorageDTO::getStorageId) + .collect(Collectors.toList()); + + // 查询出对应的map用于更新数据 + StorageQuery query = new StorageQuery(); + query.setStorageIds(ids); + Map storageMap = storageMapper.selectStorageList(query) + .stream() + .collect(Collectors.toMap(Storage::getId,Storage->Storage)); + + List toStorageUpdate = new ArrayList<>(); + List toStorageRecordInsert = new ArrayList<>(); + + for (StorageDTO dto : list) { + Storage storage = storageMap.get(dto.getStorageId()); + if (storage == null) { + continue; + } + + // 生成数据用于批量取酒 + StorageVO data = new StorageVO(); + data.setId(storage.getId()); + data.setTakenNum(dto.getNumber()); + toStorageUpdate.add(data); + + // 生成记录 + StorageRecord record = new StorageRecord(); + record.setStorageId(storage.getId()); + record.setStoreId(storage.getStoreId()); + record.setUserId(storage.getUserId()); + record.setReason("用户"+storage.getUserId()+"取酒"+dto.getNumber()+"瓶"); + record.setNumber(dto.getNumber()); + record.setCreateTime(DateUtils.getNowDate()); + toStorageRecordInsert.add(record); + } + + + Integer result = transactionTemplate.execute(status -> { + // 批量减少数量,根据ID限制 + int i = storageMapper.batchGetWine(toStorageUpdate); + ServiceUtil.assertion(i != toStorageUpdate.size(),"物品数量不足,取酒失败"); + // 批量插入记录 + i = storageRecordService.batchInsert(toStorageRecordInsert); + ServiceUtil.assertion(i <= 0,"生成记录失败"); + return i; + }); + return result == null ? 0 : result; + } } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/storage/service/impl/StorageValidatorImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/storage/service/impl/StorageValidatorImpl.java new file mode 100644 index 0000000..f0a26e8 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/storage/service/impl/StorageValidatorImpl.java @@ -0,0 +1,62 @@ +package com.ruoyi.bst.storage.service.impl; + +import com.ruoyi.bst.location.domain.LocationQuery; +import com.ruoyi.bst.location.mapper.LocationMapper; +import com.ruoyi.bst.location.service.LocationValidator; +import com.ruoyi.bst.storage.domain.StorageQuery; +import com.ruoyi.bst.storage.mapper.StorageMapper; +import com.ruoyi.bst.storage.service.StorageValidator; +import com.ruoyi.bst.storeStaff.domain.enums.StoreStaffPermission; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.collection.CollectionUtils; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; + +@Service +public class StorageValidatorImpl implements StorageValidator { + + + private final StorageMapper storageMapper; + + public StorageValidatorImpl(StorageMapper storageMapper) { + this.storageMapper = storageMapper; + } + + @Override + public boolean canEdit(Long storageId) { + return canOperate(Arrays.asList(storageId)); + } + + @Override + public boolean canEdit(List storageIds) { + return canOperate(storageIds); + } + + @Override + public boolean canDelete(List storageIds) { + return canOperate(storageIds); + } + + private boolean canOperate(List storageIds) { + return hasPermission(storageIds, StoreStaffPermission.STORAGE_EDIT.getCode()); + } + + private boolean hasPermission(List storageIds, String permission) { + if (SecurityUtils.isSysAdmin()) { + return true; + } + if (CollectionUtils.isEmptyElement(storageIds)) { + return true; + } + // 查询拼桌 + StorageQuery query = new StorageQuery(); + query.setStorageIds(storageIds); + query.setScope(true); + query.addStorePermission(permission); + List storageIdList = storageMapper.selectIdByQuery(query); + return new HashSet<>(storageIdList).containsAll(storageIds); + } +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/storeStaff/domain/enums/StoreStaffPermission.java b/ruoyi-service/src/main/java/com/ruoyi/bst/storeStaff/domain/enums/StoreStaffPermission.java index 65d5c05..eb26a06 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/storeStaff/domain/enums/StoreStaffPermission.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/storeStaff/domain/enums/StoreStaffPermission.java @@ -26,9 +26,12 @@ public enum StoreStaffPermission { GOODS_CATEGORY_VIEW("goods:category:view","查看商品分类"), GOODS_CATEGORY_EDIT("goods:category:edit","修改商品分类"), GOODS_VIEW("goods:view","查看商品"), - GOODS_EDIT("goods:edit","修改商品"); - - + GOODS_EDIT("goods:edit","修改商品"), + LOCATION_VIEW("location:view","查看存放位置"), + LOCATION_EDIT("location:edit","修改存放位置"), + STORAGE_VIEW("storage:view","查看存酒明细"), + STORAGE_EDIT("storage:edit","修改存酒明细"), + STORAGE_RECORD_VIEW("storage:record:edit","查看取酒记录"); private final String code; diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/team/mapper/TeamMapper.java b/ruoyi-service/src/main/java/com/ruoyi/bst/team/mapper/TeamMapper.java index 2c6a579..85c0ec5 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/team/mapper/TeamMapper.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/team/mapper/TeamMapper.java @@ -70,7 +70,7 @@ public interface TeamMapper * @param ids 需要删除的数据主键集合 * @return 结果 */ - public int deleteTeamByIds(Long[] ids); + public int deleteTeamByIds(List ids); int addCurrentNums(@Param("data") TeamVO vo); diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/team/mapper/TeamMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/team/mapper/TeamMapper.xml index 41430a4..6f6d852 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/team/mapper/TeamMapper.xml +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/team/mapper/TeamMapper.xml @@ -57,6 +57,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and bt.status = #{query.status} and bs.store_name like concat('%', #{query.storeName}, '%') and bb.booth_name like concat('%', #{query.boothName}, '%') + + and bt.id in + + #{ids} + + ${@com.ruoyi.framework.util.DataScopeUtil@create(query.scope) .userSetAlias("bs.user_id") .storeAlias("bt.store_id",query.storePermissions) diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/team/service/TeamService.java b/ruoyi-service/src/main/java/com/ruoyi/bst/team/service/TeamService.java index 9c7e023..fb87fb1 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/team/service/TeamService.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/team/service/TeamService.java @@ -61,7 +61,7 @@ public interface TeamService * @param ids 需要删除的拼桌主键集合 * @return 结果 */ - public int deleteTeamByIds(Long[] ids); + public int deleteTeamByIds(List ids); /** * 删除拼桌信息 diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/team/service/TeamValidator.java b/ruoyi-service/src/main/java/com/ruoyi/bst/team/service/TeamValidator.java index 55dc807..9a4354e 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/team/service/TeamValidator.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/team/service/TeamValidator.java @@ -1,5 +1,7 @@ package com.ruoyi.bst.team.service; +import java.util.List; + public interface TeamValidator { /** @@ -9,7 +11,18 @@ public interface TeamValidator { */ boolean canAddUser(Long teamId); - + /** + * 判断当前用户是否可以编辑拼桌信息 + * @param teamId 拼桌ID + * @return 是否允许 + */ boolean canEdit(Long teamId); + /** + * 判断当前用户是否可以删除拼桌信息 + * @param teamIds 拼桌ID + * @return 是否允许 + */ + boolean canDelete(List teamIds); + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/team/service/impl/TeamServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/team/service/impl/TeamServiceImpl.java index dd46bb6..d3aa182 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/team/service/impl/TeamServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/team/service/impl/TeamServiceImpl.java @@ -134,7 +134,7 @@ public class TeamServiceImpl implements TeamService { * @return 结果 */ @Override - public int deleteTeamByIds(Long[] ids) { + public int deleteTeamByIds(List ids) { return teamMapper.deleteTeamByIds(ids); } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/team/service/impl/TeamValidatorImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/team/service/impl/TeamValidatorImpl.java index 71f159b..ea50c20 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/team/service/impl/TeamValidatorImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/team/service/impl/TeamValidatorImpl.java @@ -39,6 +39,11 @@ public class TeamValidatorImpl implements TeamValidator { return canOperate(Arrays.asList(teamId)); } + @Override + public boolean canDelete(List teamIds) { + return canOperate(teamIds); + } + // 是否可以操作拼桌队伍 private boolean canOperate(List teamIds) { return hasPermission(teamIds, StoreStaffPermission.TEAM_EDIT.getCode()); diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/teamUser/mapper/TeamUserMapper.java b/ruoyi-service/src/main/java/com/ruoyi/bst/teamUser/mapper/TeamUserMapper.java index 04258a1..745a57c 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/teamUser/mapper/TeamUserMapper.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/teamUser/mapper/TeamUserMapper.java @@ -82,4 +82,6 @@ public interface TeamUserMapper List selectUserIdsByTeamId(@Param("teamId") Long teamId); List selectDistinctTeamUserList(@Param("query") TeamUserQuery query); + + List selectIdByQuery(@Param("query") TeamUserQuery query); } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/teamUser/mapper/TeamUserMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/teamUser/mapper/TeamUserMapper.xml index 9fb7f6d..97e5f87 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/teamUser/mapper/TeamUserMapper.xml +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/teamUser/mapper/TeamUserMapper.xml @@ -33,7 +33,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" su.avatar, su.sex, su_inviter.nick_name as inviter_name - from bst_team_user btu + from + + + + bst_team_user btu left join bst_team bt on btu.team_id = bt.id left join bst_store bs on bt.store_id = bs.store_id left join sys_user su on btu.user_id = su.user_id @@ -105,6 +109,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" distinct by btu.user_id + + insert into bst_team_user diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/teamUser/service/TeamUserValidator.java b/ruoyi-service/src/main/java/com/ruoyi/bst/teamUser/service/TeamUserValidator.java index 54a5308..42148bf 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/teamUser/service/TeamUserValidator.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/teamUser/service/TeamUserValidator.java @@ -11,10 +11,10 @@ public interface TeamUserValidator { /** * 判断当前用户是否可以编辑拼桌信息 - * @param teamId 用户ID + * @param teamUserId 用户ID * @return 是否允许 */ - boolean canEdit(Long teamId); + boolean canEdit(Long teamUserId); /** diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/teamUser/service/impl/TeamUserValidatorImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/teamUser/service/impl/TeamUserValidatorImpl.java index 65de299..35b93a9 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/teamUser/service/impl/TeamUserValidatorImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/teamUser/service/impl/TeamUserValidatorImpl.java @@ -40,8 +40,8 @@ public class TeamUserValidatorImpl implements TeamUserValidator { } @Override - public boolean canEdit(Long teamId) { - return canOperate(Arrays.asList(teamId)); + public boolean canEdit(Long teamUserId) { + return canOperate(Arrays.asList(teamUserId)); } @Override @@ -55,26 +55,24 @@ public class TeamUserValidatorImpl implements TeamUserValidator { } // 是否可以操作拼桌队员 - private boolean canOperate(List teamIds) { - return hasPermission(teamIds, StoreStaffPermission.TEAM_USER_EDIT.getCode()); + private boolean canOperate(List teamUserIds) { + return hasPermission(teamUserIds, StoreStaffPermission.TEAM_USER_EDIT.getCode()); } - - private boolean hasPermission(List teamIds, String permission) { + private boolean hasPermission(List teamUserIds, String permission) { if (SecurityUtils.isSysAdmin()) { return true; } - if (CollectionUtils.isEmptyElement(teamIds)) { + if (CollectionUtils.isEmptyElement(teamUserIds)) { return true; } // 查询拼桌用户 TeamUserQuery query = new TeamUserQuery(); - query.setTeamUserIds(teamIds); + query.setTeamUserIds(teamUserIds); query.setScope(true); query.addStorePermission(permission); - //List teamIdList = teamMapper.selectIdByQuery(query); - //return new HashSet<>(teamIdList).containsAll(teamIds); - return true; + List teamUserIdList = teamUserMapper.selectIdByQuery(query); + return new HashSet<>(teamUserIdList).containsAll(teamUserIds); } } diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/app/AppStorageController.java b/ruoyi-web/src/main/java/com/ruoyi/web/app/AppStorageController.java index f9cdd73..be36d23 100644 --- a/ruoyi-web/src/main/java/com/ruoyi/web/app/AppStorageController.java +++ b/ruoyi-web/src/main/java/com/ruoyi/web/app/AppStorageController.java @@ -1,8 +1,11 @@ package com.ruoyi.web.app; import com.ruoyi.bst.storage.domain.Storage; +import com.ruoyi.bst.storage.domain.StorageQuery; import com.ruoyi.bst.storage.service.StorageService; +import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -11,7 +14,7 @@ import java.util.List; @RestController @RequestMapping("/app/storage") -public class AppStorageController { +public class AppStorageController extends BaseController { @Autowired private StorageService storageService; @@ -22,4 +25,13 @@ public class AppStorageController { return AjaxResult.success(storageService.storageWine(storageList)); } + @ApiOperation("我的存酒信息") + @GetMapping("/myWine") + public TableDataInfo myWine(@RequestParam Long storeId) { + StorageQuery query = new StorageQuery(); + query.setUserId(getUserId()); + query.setStoreId(storeId); + return getDataTable(storageService.selectStorageList(query)); + } + } diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/bst/LocationController.java b/ruoyi-web/src/main/java/com/ruoyi/web/bst/LocationController.java index 69a811f..c3a33bf 100644 --- a/ruoyi-web/src/main/java/com/ruoyi/web/bst/LocationController.java +++ b/ruoyi-web/src/main/java/com/ruoyi/web/bst/LocationController.java @@ -3,15 +3,21 @@ package com.ruoyi.web.bst; import com.ruoyi.bst.location.domain.Location; import com.ruoyi.bst.location.domain.LocationQuery; import com.ruoyi.bst.location.domain.LocationVO; +import com.ruoyi.bst.location.service.LocationAssembler; import com.ruoyi.bst.location.service.LocationService; +import com.ruoyi.bst.location.service.LocationValidator; +import com.ruoyi.bst.storeStaff.domain.enums.StoreStaffPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.validate.ValidGroup; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; +import org.checkerframework.checker.units.qual.A; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; @@ -29,6 +35,10 @@ public class LocationController extends BaseController { @Autowired private LocationService locationService; + @Autowired + private LocationAssembler locationAssembler; + @Autowired + private LocationValidator locationValidator; /** * 查询存放位置列表 @@ -39,7 +49,10 @@ public class LocationController extends BaseController { startPage(); startOrderBy(); + query.setScope(true); + query.addStorePermission(StoreStaffPermission.LOCATION_VIEW.getCode()); List list = locationService.selectLocationList(query); + locationAssembler.assembleStorageNum(list); return getDataTable(list); } @@ -51,6 +64,7 @@ public class LocationController extends BaseController @PostMapping("/export") public void export(HttpServletResponse response, LocationQuery query) { + query.setScope(true); List list = locationService.selectLocationList(query); ExcelUtil util = new ExcelUtil(LocationVO.class); util.exportExcel(response, list, "存放位置数据"); @@ -63,7 +77,7 @@ public class LocationController extends BaseController @GetMapping(value = "/{id}") public AjaxResult getInfo(@PathVariable("id") Long id) { - return success(locationService.selectLocationById(id)); + return success(locationService.selectLocationById(id,true)); } /** @@ -72,7 +86,7 @@ public class LocationController extends BaseController @PreAuthorize("@ss.hasPermi('bst:location:add')") @Log(title = "存放位置", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody Location location) + public AjaxResult add(@RequestBody @Validated(ValidGroup.Create.class) Location location) { return toAjax(locationService.insertLocation(location)); } @@ -83,8 +97,11 @@ public class LocationController extends BaseController @PreAuthorize("@ss.hasPermi('bst:location:edit')") @Log(title = "存放位置", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@RequestBody Location location) + public AjaxResult edit(@RequestBody @Validated(ValidGroup.Update.class) Location location) { + if (!locationValidator.canEdit(location.getId())){ + return AjaxResult.error("您没有权限修改存放位置信息"); + } return toAjax(locationService.updateLocation(location)); } @@ -94,8 +111,11 @@ public class LocationController extends BaseController @PreAuthorize("@ss.hasPermi('bst:location:remove')") @Log(title = "存放位置", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") - public AjaxResult remove(@PathVariable Long[] ids) + public AjaxResult remove(@PathVariable List ids) { + if (!locationValidator.canDelete(ids)){ + return AjaxResult.error("您没有权限修改存放位置信息"); + } return toAjax(locationService.deleteLocationByIds(ids)); } } diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/bst/StorageController.java b/ruoyi-web/src/main/java/com/ruoyi/web/bst/StorageController.java index ec7c64f..5363a41 100644 --- a/ruoyi-web/src/main/java/com/ruoyi/web/bst/StorageController.java +++ b/ruoyi-web/src/main/java/com/ruoyi/web/bst/StorageController.java @@ -3,18 +3,25 @@ package com.ruoyi.web.bst; import com.ruoyi.bst.storage.domain.Storage; import com.ruoyi.bst.storage.domain.StorageQuery; import com.ruoyi.bst.storage.domain.StorageVO; +import com.ruoyi.bst.storage.domain.dto.StorageDTO; +import com.ruoyi.bst.storage.service.StorageConverter; import com.ruoyi.bst.storage.service.StorageService; +import com.ruoyi.bst.storage.service.StorageValidator; +import com.ruoyi.bst.storeStaff.domain.enums.StoreStaffPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.validate.ValidGroup; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; import java.util.List; /** @@ -29,6 +36,10 @@ public class StorageController extends BaseController { @Autowired private StorageService storageService; + @Autowired + private StorageConverter storageConverter; + @Autowired + private StorageValidator storageValidator; /** * 查询存酒列表 @@ -39,6 +50,8 @@ public class StorageController extends BaseController { startPage(); startOrderBy(); + query.setScope(true); + query.addStorePermission(StoreStaffPermission.STORAGE_VIEW.getCode()); List list = storageService.selectStorageList(query); return getDataTable(list); } @@ -51,6 +64,7 @@ public class StorageController extends BaseController @PostMapping("/export") public void export(HttpServletResponse response, StorageQuery query) { + query.setScope(true); List list = storageService.selectStorageList(query); ExcelUtil util = new ExcelUtil(StorageVO.class); util.exportExcel(response, list, "存酒数据"); @@ -63,7 +77,7 @@ public class StorageController extends BaseController @GetMapping(value = "/{id}") public AjaxResult getInfo(@PathVariable("id") Long id) { - return success(storageService.selectStorageById(id)); + return success(storageService.selectStorageById(id,true)); } /** @@ -72,8 +86,9 @@ public class StorageController extends BaseController @PreAuthorize("@ss.hasPermi('bst:storage:add')") @Log(title = "存酒", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody Storage storage) + public AjaxResult add(@RequestBody @Validated(ValidGroup.Create.class) Storage storage) { + storageConverter.toPoByCreate(storage); return toAjax(storageService.insertStorage(storage)); } @@ -83,19 +98,32 @@ public class StorageController extends BaseController @PreAuthorize("@ss.hasPermi('bst:storage:edit')") @Log(title = "存酒", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@RequestBody Storage storage) + public AjaxResult edit(@RequestBody @Validated(ValidGroup.Update.class) Storage storage) { + if (!storageValidator.canEdit(storage.getId())){ + return AjaxResult.error("您无权限修改当前存酒信息"); + } return toAjax(storageService.updateStorage(storage)); } + /** - * 删除存酒 + * 修改存酒 */ - @PreAuthorize("@ss.hasPermi('bst:storage:remove')") - @Log(title = "存酒", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public AjaxResult remove(@PathVariable Long[] ids) + @PreAuthorize("@ss.hasPermi('bst:storage:getWine')") + @Log(title = "取酒", businessType = BusinessType.UPDATE) + @PutMapping("/getWine") + public AjaxResult getWine(@RequestBody List dtoList) { - return toAjax(storageService.deleteStorageByIds(ids)); + // 权限相关校验 + List ids = new ArrayList<>(); + dtoList.forEach(storage->{ + ids.add(storage.getStorageId()); + }); + if (!storageValidator.canEdit(ids)){ + return AjaxResult.error("您无权限修改当前存酒信息"); + } + return toAjax(storageService.getWine(dtoList)); } + } diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/bst/TeamController.java b/ruoyi-web/src/main/java/com/ruoyi/web/bst/TeamController.java index 72b258b..712b9c0 100644 --- a/ruoyi-web/src/main/java/com/ruoyi/web/bst/TeamController.java +++ b/ruoyi-web/src/main/java/com/ruoyi/web/bst/TeamController.java @@ -126,8 +126,11 @@ public class TeamController extends BaseController @PreAuthorize("@ss.hasPermi('bst:team:remove')") @Log(title = "拼桌", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") - public AjaxResult remove(@PathVariable Long[] ids) + public AjaxResult remove(@PathVariable List ids) { + if (teamValidator.canDelete(ids)){ + return AjaxResult.error("您没有权限删除当前拼桌信息"); + } return toAjax(teamService.deleteTeamByIds(ids)); } diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/bst/TeamUserController.java b/ruoyi-web/src/main/java/com/ruoyi/web/bst/TeamUserController.java index 59a88c8..6183411 100644 --- a/ruoyi-web/src/main/java/com/ruoyi/web/bst/TeamUserController.java +++ b/ruoyi-web/src/main/java/com/ruoyi/web/bst/TeamUserController.java @@ -60,6 +60,7 @@ public class TeamUserController extends BaseController @PostMapping("/export") public void export(HttpServletResponse response, TeamUserQuery query) { + query.setScope(true); List list = teamUserService.selectTeamUserList(query); ExcelUtil util = new ExcelUtil(TeamUserVO.class); util.exportExcel(response, list, "拼桌用户数据"); @@ -108,6 +109,7 @@ public class TeamUserController extends BaseController return toAjax(teamUserService.deleteTeamUserByIds(ids)); } + @PreAuthorize("@ss.hasPermi('bst:teamUser:kick')") @Log(title = "踢出用户", businessType = BusinessType.OTHER) @PutMapping("/kick")