前台接口功能完善

This commit is contained in:
SjS 2025-06-10 18:15:13 +08:00
parent 8be737c5ed
commit c67688823b
26 changed files with 222 additions and 33 deletions

View File

@ -37,4 +37,16 @@ public class AccessTokenUtil {
}
return token;
}
/**
* 清除token
* @param appId
*/
public static void clearToken(String appId) {
if (StringUtils.isBlank(appId)) {
return;
}
RedisCache redisCache = SpringUtils.getBean(RedisCache.class);
redisCache.deleteObject(CacheConstants.WX_ACCESS_TOKEN + appId);
}
}

View File

@ -55,7 +55,7 @@ public class WxAuthService {
* @param config
* @return
*/
public String getWxPhoneNumber(String mobileCode, WxConfig config) {
public String getWxPhoneNumber(String mobileCode, WxConfig config,boolean retry) {
String url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=";
// 根据手机号获取到用户名
@ -73,7 +73,12 @@ public class WxAuthService {
Integer errcode = body.getInteger("errcode");
if (errcode == null || !errcode.equals(0)) {
log.error("获取手机号失败 {}", body);
throw new ServiceException("获取手机号失败");
// 若获取手机号失败则清除access_token并且重试
AccessTokenUtil.clearToken(config.getAppId());
if (retry) {
return getWxPhoneNumber(mobileCode, config, false);
}
throw new ServiceException("获取手机号失败" + body.toJSONString());
}
String phoneInfo = body.getString("phone_info");

View File

@ -249,7 +249,7 @@ public class SysLoginService
// 优先使用手机号登录如果提供了手机号验证码
if (StringUtils.hasText(body.getMobileCode())) {
phone = wxAuthService.getWxPhoneNumber(body.getMobileCode(), wxConfig);
phone = wxAuthService.getWxPhoneNumber(body.getMobileCode(), wxConfig,true);
// 查询用户
user = userService.selectUserByUserName(phone);

View File

@ -11,4 +11,5 @@ public class GoodsQuery extends GoodsVO{
@ApiModelProperty("商品ID列表")
private List<Long> goodsIds;
}

View File

@ -18,4 +18,7 @@ public class GoodsVO extends Goods{
@ApiModelProperty("商品SKU")
private List<SkuVO> skuVO;
@ApiModelProperty("所属分类")
private String categoryName;
}

View File

@ -1,9 +1,11 @@
package com.ruoyi.bst.goods.mapper;
import java.util.Arrays;
import java.util.List;
import com.ruoyi.bst.goods.domain.Goods;
import com.ruoyi.bst.goods.domain.GoodsVO;
import com.ruoyi.bst.goods.domain.GoodsQuery;
import com.ruoyi.common.domain.vo.LongStringVO;
import org.apache.ibatis.annotations.Param;
/**
@ -73,4 +75,6 @@ public interface GoodsMapper
public int deleteGoodsByIds(@Param("ids") List<Long> ids);
List<Long> selectIdByQuery(@Param("query") GoodsQuery query);
List<LongStringVO> selectGoodsNameGroupById(@Param("query") GoodsQuery query);
}

View File

@ -35,7 +35,8 @@
bg.create_time,
bg.min_price,
bg.max_price,
bg.total_stock
bg.total_stock,
bgc.name as category_name
from
<include refid="searchTables"/>
</sql>
@ -43,6 +44,7 @@
<sql id="searchTables">
bst_goods bg
left join bst_store bs on bg.store_id = bs.store_id
left join bst_goods_category bgc on bg.category_id = bgc.id
</sql>
<sql id="searchCondition">
@ -85,6 +87,16 @@
</where>
</select>
<select id="selectGoodsNameGroupById" resultType="com.ruoyi.common.domain.vo.LongStringVO">
select bg.id as `key`,
bg.name as `value`
from <include refid="searchTables"/>
<where>
<include refid="searchCondition"/>
</where>
group by `key`
</select>
<insert id="insertGoods" parameterType="Goods" useGeneratedKeys="true" keyProperty="id">
insert into bst_goods
<trim prefix="(" suffix=")" suffixOverrides=",">

View File

@ -1,9 +1,11 @@
package com.ruoyi.bst.goods.service;
import java.util.Arrays;
import java.util.List;
import com.ruoyi.bst.goods.domain.Goods;
import com.ruoyi.bst.goods.domain.GoodsVO;
import com.ruoyi.bst.goods.domain.GoodsQuery;
import com.ruoyi.common.domain.vo.LongStringVO;
/**
* 商品Service接口
@ -70,4 +72,7 @@ public interface GoodsService
int updateGoodsBasicInfo(Goods goods);
void assembler(List<GoodsVO> list);
List<LongStringVO> selectGoodsNameGroupById(GoodsQuery query);
}

View File

@ -6,11 +6,13 @@ import java.util.Collections;
import java.util.List;
import com.github.pagehelper.PageHelper;
import com.ruoyi.bst.goods.service.GoodsAssembler;
import com.ruoyi.bst.goods.service.GoodsService;
import com.ruoyi.bst.sku.domain.Sku;
import com.ruoyi.bst.sku.domain.SkuQuery;
import com.ruoyi.bst.sku.domain.SkuVO;
import com.ruoyi.bst.sku.service.SkuService;
import com.ruoyi.bst.spec.domain.Spec;
import com.ruoyi.bst.spec.domain.SpecQuery;
import com.ruoyi.bst.spec.domain.SpecVO;
import com.ruoyi.bst.spec.service.SpecAssembler;
@ -19,6 +21,7 @@ import com.ruoyi.bst.specValue.domain.SpecValue;
import com.ruoyi.bst.specValue.domain.SpecValueVO;
import com.ruoyi.bst.specValue.service.SpecValueService;
import com.ruoyi.bst.storeStaff.domain.enums.StoreStaffPermission;
import com.ruoyi.common.domain.vo.LongStringVO;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.ServiceUtil;
import com.ruoyi.common.utils.collection.CollectionUtils;
@ -52,6 +55,8 @@ public class GoodsServiceImpl implements GoodsService
private SkuService skuService;
@Autowired
private SpecAssembler specAssembler;
@Autowired
private GoodsAssembler goodsAssembler;
/**
* 查询商品
@ -353,4 +358,16 @@ public class GoodsServiceImpl implements GoodsService
data.setStatus(goods.getStatus());
return goodsMapper.updateGoods(goods);
}
@Override
public void assembler(List<GoodsVO> list) {
List<SpecVO> specList = new ArrayList<>();
goodsAssembler.assembleSpecList(list);
}
@Override
public List<LongStringVO> selectGoodsNameGroupById(GoodsQuery query) {
return goodsMapper.selectGoodsNameGroupById(query);
}
}

View File

@ -44,6 +44,7 @@ public class LocationAssemblerImpl implements LocationAssembler {
for (LocationVO location : list) {
Integer currentNum = idToCurrentNum.get(location.getId());
currentNum = currentNum == null ? 0 : currentNum;
location.setCurrentNum(currentNum);
}
}

View File

@ -3,10 +3,15 @@ package com.ruoyi.bst.sku.domain;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class SkuQuery extends SkuVO {
@ApiModelProperty("goodsId")
@ApiModelProperty("商品ID")
private Long goodsId;
@ApiModelProperty("skuID列表")
private List<Long> skuIds;
}

View File

@ -1,5 +1,6 @@
package com.ruoyi.bst.storage.domain;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
@ -32,27 +33,27 @@ 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 goodsId;
@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 = "存放数量")
@ -67,10 +68,9 @@ public class Storage extends BaseEntity
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "存放期限", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty("存放期限")
private Date deadline;
private LocalDateTime deadline;
@ApiModelProperty("规格值列表")
@NotNull(message = "规格值列表不能为空",groups = {ValidGroup.Create.class})
private List<SpecValue> specValue;
@Excel(name = "存放状态")

View File

@ -17,4 +17,6 @@ public class StorageQuery extends StorageVO{
@ApiModelProperty("是否被取完")
private Boolean takenAll;
}

View File

@ -10,9 +10,6 @@ public class StorageVO extends Storage{
@ApiModelProperty("用户名称")
private String userName;
@ApiModelProperty("商品名称")
private String goodsName;
@ApiModelProperty("店铺名称")
private String storeName;
@ -22,9 +19,6 @@ public class StorageVO extends Storage{
@ApiModelProperty("当前数量")
private Integer currentNum;
@ApiModelProperty("商品ID")
private Long goodsId;
public Integer getCurrentNum() {
return getTotalNum() - getTakenNum();
}

View File

@ -1,17 +1,23 @@
package com.ruoyi.bst.storage.domain.dto;
import com.ruoyi.bst.storage.domain.Storage;
import com.ruoyi.bst.storage.domain.StorageVO;
import com.ruoyi.common.core.validate.ValidGroup;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
import java.util.List;
@Data
public class DepositStorageDTO {
@ApiModelProperty("店铺ID")
@NotNull(message = "店铺ID不能为空",groups = ValidGroup.Create.class)
private Long storeId;
@ApiModelProperty("用户电话")
@NotNull(message = "用户电话不能为空",groups = ValidGroup.Create.class)
private String phone;
@ -19,9 +25,17 @@ public class DepositStorageDTO {
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("存放位置ID")
@NotNull(message = "存放位置ID不能为空",groups = ValidGroup.Create.class)
private Long locationId;
@ApiModelProperty("存放天数")
private Integer storageDays;
@Valid
@ApiModelProperty("存酒信息")
@NotNull(message = "存酒信息不能为空",groups = ValidGroup.Create.class)
private List<Storage> storage;
}

View File

@ -10,7 +10,6 @@
<result property="storeId" column="store_id"/>
<result property="userId" column="user_id"/>
<result property="skuId" column="sku_id"/>
<result property="goodsName" column="goods_name"/>
<result property="totalNum" column="total_num"/>
<result property="takenNum" column="taken_num"/>
<result property="deadline" column="deadline"/>
@ -19,6 +18,7 @@
<result property="remark" column="remark"/>
<result property="status" column="status"/>
<result property="createTime" column="create_time"/>
<result property="goodsId" column="goods_id"/>
</resultMap>
<sql id="selectStorageVo">
@ -32,12 +32,10 @@
bst.total_num,
bst.taken_num,
bst.deadline,
bst.spec_value,
bst.remark,
bst.create_time,
bst.status,
bg.name as goods_name,
bg.id as goods_id,
bstor.store_name,
su.user_name,
bl.name as location_name
@ -47,8 +45,7 @@
<sql id="searchTables">
bst_storage bst
left join bst_sku bsk on bst.sku_id = bsk.id
left join bst_goods bg on bsk.goods_id = bg.id
left join bst_goods bg on bst.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.store_id
left join bst_location bl on bst.location_id = bl.id
@ -165,13 +162,13 @@
store_id,
user_id,
sku_id,
goods_name,
total_num,
taken_num,
deadline,
spec_value,
remark,
create_time,
goods_id,
</trim>
values
<foreach collection="list" item="i" separator=",">
@ -184,8 +181,6 @@
<if test="i.userId == null ">default,</if>
<if test="i.skuId != null ">#{i.skuId},</if>
<if test="i.skuId == null ">default,</if>
<if test="i.goodsName != null and i.goodsName != ''">#{i.goodsName},</if>
<if test="i.goodsName == null or i.goodsName == ''">default,</if>
<if test="i.totalNum != null ">#{i.totalNum},</if>
<if test="i.totalNum == null ">default,</if>
<if test="i.takenNum != null ">#{i.takenNum},</if>
@ -200,6 +195,8 @@
<if test="i.remark == null ">default,</if>
<if test="i.createTime != null ">#{i.createTime},</if>
<if test="i.createTime == null ">default,</if>
<if test="i.goodsId != null ">#{i.goodsId},</if>
<if test="i.goodsId == null ">default,</if>
</trim>
</foreach>
</insert>

View File

@ -0,0 +1,17 @@
package com.ruoyi.bst.storage.service;
import com.ruoyi.bst.spec.domain.SpecVO;
import com.ruoyi.bst.storage.domain.Storage;
import com.ruoyi.bst.storage.domain.StorageVO;
import java.util.List;
public interface StorageAssembler {
/**
* 拼接规格值列表
* @param list 规格项列表
*/
void assembleGoodsName(List<Storage> list);
}

View File

@ -0,0 +1,61 @@
package com.ruoyi.bst.storage.service.impl;
import com.ruoyi.bst.goods.domain.GoodsQuery;
import com.ruoyi.bst.goods.mapper.GoodsMapper;
import com.ruoyi.bst.goods.service.GoodsAssembler;
import com.ruoyi.bst.goods.service.GoodsService;
import com.ruoyi.bst.sku.domain.SkuQuery;
import com.ruoyi.bst.sku.domain.SkuVO;
import com.ruoyi.bst.sku.mapper.SkuMapper;
import com.ruoyi.bst.spec.domain.SpecVO;
import com.ruoyi.bst.spec.service.SpecAssembler;
import com.ruoyi.bst.specValue.domain.SpecValueQuery;
import com.ruoyi.bst.specValue.domain.SpecValueVO;
import com.ruoyi.bst.specValue.service.SpecValueService;
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.mapper.StorageMapper;
import com.ruoyi.bst.storage.service.StorageAssembler;
import com.ruoyi.common.core.domain.vo.UserVO;
import com.ruoyi.common.domain.vo.LongIntegerVO;
import com.ruoyi.common.domain.vo.LongStringVO;
import com.ruoyi.common.utils.collection.CollectionUtils;
import javafx.util.converter.LongStringConverter;
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 StorageAssemblerImpl implements StorageAssembler {
@Autowired
private SpecValueService specValueService;
@Autowired
private StorageMapper storageMapper;
@Autowired
private SkuMapper skuMapper;
@Autowired
private GoodsService goodsService;
@Override
public void assembleGoodsName(List<Storage> list) {
if (CollectionUtils.isEmptyElement(list)) {
return;
}
List<Long> goodsIds = list.stream().map(Storage::getGoodsId).collect(Collectors.toList());
GoodsQuery query = new GoodsQuery();
query.setGoodsIds(goodsIds);
Map<Long, String> idToNameMap = goodsService.selectGoodsNameGroupById(query)
.stream().collect(Collectors.toMap(LongStringVO::getKey, LongStringVO::getValue));
for (Storage storage : list) {
storage.setGoodsName(idToNameMap.get(storage.getGoodsId()));
}
}
}

View File

@ -1,5 +1,6 @@
package com.ruoyi.bst.storage.service.impl;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@ -7,11 +8,14 @@ import java.util.Map;
import java.util.stream.Collectors;
import com.github.pagehelper.PageHelper;
import com.ruoyi.bst.goods.service.GoodsAssembler;
import com.ruoyi.bst.location.domain.LocationQuery;
import com.ruoyi.bst.location.domain.LocationVO;
import com.ruoyi.bst.sku.service.SkuService;
import com.ruoyi.bst.storage.domain.dto.DepositStorageDTO;
import com.ruoyi.bst.storage.domain.dto.TakeOutWineDTO;
import com.ruoyi.bst.storage.domain.enums.StorageStatus;
import com.ruoyi.bst.storage.service.StorageAssembler;
import com.ruoyi.bst.storageRecord.domain.StorageRecord;
import com.ruoyi.bst.storageRecord.service.StorageRecordService;
import com.ruoyi.bst.storeStaff.domain.enums.StoreStaffPermission;
@ -47,6 +51,12 @@ public class StorageServiceImpl implements StorageService {
private StorageService storageService;
@Autowired
private UserService userService;
@Autowired
private SkuService skuService;
@Autowired
private GoodsAssembler goodsAssembler;
@Autowired
private StorageAssembler storageAssembler;
/**
* 查询存酒
@ -139,9 +149,13 @@ public class StorageServiceImpl implements StorageService {
UserVO user = userService.selectUserByPhonenumber(dto.getPhone());
ServiceUtil.assertion(user == null,"当前用户不存在");
storageAssembler.assembleGoodsName(dto.getStorage());
// 设置对应属性进行批量插入
dto.getStorage().forEach(storage -> {
storage.setRemark(dto.getRemark());
storage.setStoreId(dto.getStoreId());
storage.setLocationId(dto.getLocationId());
storage.setDeadline(LocalDateTime.now().plusDays(dto.getStorageDays()));
storage.setCreateTime(DateUtils.getNowDate());
storage.setUserId(user.getUserId());
list.add(storage);

View File

@ -1,7 +1,12 @@
package com.ruoyi.bst.storageRecord.domain;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class StorageRecordQuery extends StorageRecordVO{
@ApiModelProperty("商品名称")
private String goodsName;
}

View File

@ -33,7 +33,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
bg.id as goods_id,
su.user_name,
bst.goods_name,
bst.spec_value,
bst.total_num,
bst.taken_num
from <include refid="searchTables"/>
@ -53,8 +52,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="query.storeId != null "> and bsr.store_id = #{query.storeId}</if>
<if test="query.userId != null "> and bsr.user_id = #{query.userId}</if>
<if test="query.reason != null and query.reason != ''"> and bsr.reason = #{query.reason}</if>
<if test="query.storeName != null and query.storeName != ''"> and bs.store_name = #{query.storeName}</if>
<if test="query.userName != null and query.userName != ''"> and su.user_name = #{query.userName}</if>
<if test="query.storeName != null and query.storeName != ''"> and bs.store_name like concat ('%',#{query.storeName},'%') </if>
<if test="query.userName != null and query.userName != ''"> and su.user_name like concat ('%',#{query.userName},'%') </if>
<if test="query.goodsName != null and query.goodsName != ''"> and bg.name like concat ('%',#{query.goodsName},'%') </if>
<if test="query.number != null "> and bsr.umber = #{query.number}</if>
${@com.ruoyi.framework.util.DataScopeUtil@create(query.scope)
.userSetAlias("bs.user_id")

View File

@ -0,0 +1,11 @@
package com.ruoyi.common.domain.vo;
import lombok.Data;
@Data
public class LongStringVO {
private Long key;
private String value;
}

View File

@ -34,10 +34,8 @@ public class ChatTask {
List<ChatCacheDTO> cacheList = redisCache.getAndClearCacheList(pendingKey);
// TODO 批量新增主表
List<Chat> chatList = CollectionUtils.map(cacheList, ChatCacheDTO::getChat);
// TODO 获取子表数据并扁平化
List<ChatMsg> msgList = cacheList.stream().map(ChatCacheDTO::getMsgList).flatMap(Collection::stream).collect(Collectors.toList());
// 数据库操作

View File

@ -26,9 +26,11 @@ public class AppStorageController extends BaseController {
@ApiOperation("我的存酒信息")
@GetMapping("/myWine")
public TableDataInfo myWine(@RequestParam Long storeId) {
startPage();
StorageQuery query = new StorageQuery();
query.setUserId(getUserId());
query.setStoreId(storeId);
query.setTakenAll(false);
return getDataTable(storageService.selectStorageList(query));
}

View File

@ -3,6 +3,7 @@ package com.ruoyi.web.bst;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.ruoyi.bst.goods.service.GoodsAssembler;
import com.ruoyi.bst.goods.service.GoodsConverter;
import com.ruoyi.bst.goods.service.GoodsService;
import com.ruoyi.bst.goods.service.GoodsValidator;

View File

@ -62,7 +62,7 @@ public class StorageController extends BaseController
* 导出存酒列表
*/
@PreAuthorize("@ss.hasPermi('bst:storage:export')")
@Log(title = "存酒", businessType = BusinessType.EXPORT)
@Log(title = "导出存酒列表", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, StorageQuery query)
{
@ -98,7 +98,7 @@ public class StorageController extends BaseController
* 修改存酒
*/
@PreAuthorize("@ss.hasPermi('bst:storage:edit')")
@Log(title = "存酒", businessType = BusinessType.UPDATE)
@Log(title = "修改存酒信息", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody @Validated(ValidGroup.Update.class) Storage storage)
{
@ -115,6 +115,14 @@ public class StorageController extends BaseController
@Log(title = "存酒", businessType = BusinessType.OTHER)
@PutMapping("/storageWine")
public AjaxResult storageWine(@RequestBody @Validated(ValidGroup.Create.class) DepositStorageDTO dto) {
// 权限校验
List<Long> ids = new ArrayList<>();
dto.getStorage().forEach(storage -> {
ids.add(storage.getId());
});
if (!storageValidator.canEdit(ids)){
return AjaxResult.error("您无权限修改当前存酒信息");
}
return AjaxResult.success(storageService.storageWine(dto));
}