添加部门是否是单位字段,新增移动端app商家管理app接口

This commit is contained in:
zjf committed 2026-04-01 20:20:16 +08:00
1 parent d16cbdc395
commit 4af4e7f516
9 files changed
+196 -23

No files matched your search

@@ -37,9 +37,9 @@ public class CanteenOnlineSpuSaveItemDto {
private Integer sort;
/**
* 商品状态: 1 上架(开启) 0 下架(禁用) -1 回收
* 商品状态: 0 上架(默认/开启) 1 下架(禁用) -1 回收
*/
@Schema(description="商品状态: 1 上架(开启) 0 下架(禁用) -1 回收")
@Schema(description="商品状态: 0 上架(默认/开启) 1 下架(禁用) -1 回收")
private Integer status;
/**
@@ -78,9 +78,9 @@ public class CanteenOnlineSpuEntity extends Model<CanteenOnlineSpuEntity> {
private Integer sort;
/**
* 商品状态: 1 上架(开启) 0 下架(禁用) -1 回收
* 商品状态: 0 上架(默认/开启) 1 下架(禁用) -1 回收
*/
@Schema(description="商品状态: 1 上架(开启) 0 下架(禁用) -1 回收")
@Schema(description="商品状态: 0 上架(默认/开启) 1 下架(禁用) -1 回收")
private Integer status;
/**
@@ -96,6 +96,18 @@ public class APPOnlineSpuVO {
@Schema(description="库存")
private Integer stock;
/**
* 商品状态: 0 上架(默认) 1 下架
*/
@Schema(description = "商品状态: 0 上架 1 下架")
private Integer status;
/**
* 是否售罄(库存为空或≤0)
*/
@Schema(description = "是否售罄")
private Boolean soldOut;
/**
* 商品销量
*/
@@ -6,6 +6,7 @@ import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsd.pjcloud.canteen.dto.CanteenOnlineSpuShelfReqDTO;
import com.bsd.pjcloud.canteen.dto.CanteenOnlineSpuUpdateStockReqDTO;
import com.bsd.pjcloud.canteen.dto.canteenonline.CanteenOnlineSpuSaveDto;
import com.bsd.pjcloud.canteen.vo.APPOnlineSpuVO;
@@ -27,6 +28,7 @@ import org.springdoc.core.annotations.ParameterObject;
import org.springframework.http.HttpHeaders;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
@@ -207,15 +209,26 @@ public class CanteenOnlineSpuController {
/**
* 获取菜品列表
*
* @param categoryId 分类编号,不传默认查询全部
* @return
* @param categoryId 分类编号,不传默认查询全部
* @param minPrice 最低价(分),不传不限
* @param maxPrice 最高价(分),不传不限
* @param status 上架状态:0 上架 1 下架,不传不限
* @param stockFilter in_stock 仅非售罄,sold_out 仅售罄,不传不限
* @param priceOrder 按价格排序:asc 升序 desc 降序,不传则按 sort、id
*/
@GetMapping("/app/getCanteenSpuList")
@Operation(summary = "获取在线点餐的菜品列表", description = "1.通过分类id,可以不填,默认查全部,2.商户id,必传")
public R<List<APPOnlineSpuVO>> getCanteenSpuList(@RequestParam(value = "categoryId", required = false) String categoryId,
@RequestParam(value = "merchantId") String merchantId,
@RequestParam(value = "time",required = false)String time) {
return canteenOnlineSpuService.getCanteenOnlineSpuList(categoryId, merchantId,time);
@Operation(summary = "获取在线点餐的菜品列表", description = "商户 id 必传;支持价格区间、上架状态、是否售罄筛选及按价格排序;返回含 status、soldOut")
public R<List<APPOnlineSpuVO>> getCanteenSpuList(
@RequestParam(value = "categoryId", required = false) @Parameter(description = "分类 id,可选") String categoryId,
@RequestParam(value = "merchantId") @Parameter(description = "商户 id,必填") String merchantId,
@RequestParam(value = "time", required = false) @Parameter(description = "日期 yyyy-MM-dd,默认当天") String time,
@RequestParam(value = "minPrice", required = false) @Parameter(description = "最低价(分)") Integer minPrice,
@RequestParam(value = "maxPrice", required = false) @Parameter(description = "最高价(分)") Integer maxPrice,
@RequestParam(value = "status", required = false) @Parameter(description = "0 上架 1 下架") Integer status,
@RequestParam(value = "stockFilter", required = false) @Parameter(description = "in_stock | sold_out") String stockFilter,
@RequestParam(value = "priceOrder", required = false) @Parameter(description = "asc | desc") String priceOrder) {
return canteenOnlineSpuService.getCanteenOnlineSpuList(categoryId, merchantId, time,
minPrice, maxPrice, status, stockFilter, priceOrder);
}
@@ -224,6 +237,10 @@ public class CanteenOnlineSpuController {
public R<APPOnlineSpuVO> getCanteenSpuDetails(@RequestParam(value = "id") Long id) {
CanteenOnlineSpuEntity canteenOnlineSpuEntity = canteenOnlineSpuService.getById(id);
APPOnlineSpuVO bean = BeanUtils.toBean(canteenOnlineSpuEntity, APPOnlineSpuVO.class);
if (bean != null && canteenOnlineSpuEntity != null) {
Integer st = canteenOnlineSpuEntity.getStock();
bean.setSoldOut(st == null || st <= 0);
}
return R.ok(bean);
}
@@ -243,13 +260,44 @@ public class CanteenOnlineSpuController {
}
/**
* 下单/支付等场景扣减库存,会与销量 sales_count 联动,请勿用于商家手工改库存。
*/
@PostMapping("/app/updateSkuStock")
@SysLog("更新菜品库存")
@SysLog("更新菜品库存(订单联动销量)")
@Transactional
public R updateSkuStock(@RequestBody CanteenOnlineSpuUpdateStockReqDTO canteenOnlineSpuUpdateStockReqDTO) {
return canteenOnlineSpuService.updateOnlineSpuSkuStock(canteenOnlineSpuUpdateStockReqDTO);
}
/**
* 商家端手工增减库存(只更新 stock,不修改销量);仅允许操作当前登录单位对应食堂商户下的 SPU。
*/
@PostMapping("/app/adjustStock")
@Operation(summary = "商家调整菜品库存", description = "正数增加、负数减少;不联动销量,与下单接口 /app/updateSkuStock 区分")
@SysLog("商家调整菜品库存")
@Transactional
public R adjustStockForMerchant(@RequestBody CanteenOnlineSpuUpdateStockReqDTO canteenOnlineSpuUpdateStockReqDTO) {
Long deptId = SecurityUtils.getUser().getDeptId();
R<MchManageVo> resp = remoteMchService.getByDeptId(deptId, MerchantTypeEnum.CANTEEN);
if (resp == null || !resp.isOk() || resp.getData() == null) {
return R.failed(resp != null ? resp.getMsg() : "商户不存在");
}
return canteenOnlineSpuService.adjustOnlineSpuStockManual(resp.getData().getId(), canteenOnlineSpuUpdateStockReqDTO);
}
@PostMapping("/app/updateShelfStatus")
@Operation(summary = "商家上架/下架菜品", description = "status:0-上架(默认),1-下架;仅可操作当前单位对应食堂商户下的 SPU")
@SysLog("商家上架下架菜品")
@Transactional
public R updateShelfStatusForMerchant(@RequestBody CanteenOnlineSpuShelfReqDTO dto) {
Long deptId = SecurityUtils.getUser().getDeptId();
R<MchManageVo> resp = remoteMchService.getByDeptId(deptId, MerchantTypeEnum.CANTEEN);
if (resp == null || !resp.isOk() || resp.getData() == null) {
return R.failed(resp != null ? resp.getMsg() : "商户不存在");
}
return canteenOnlineSpuService.updateOnlineSpuShelfStatus(resp.getData().getId(), dto);
}
/**
* 通过ids查询菜品spu
@@ -33,4 +33,21 @@ public interface CanteenOnlineSpuMapper extends PjcloudBaseMapper<CanteenOnlineS
return update(null, updateWrapper);
}
/**
* 仅调整库存,不联动销量(用于商家端手工入库、报损等;下单扣库存请用 {@link #updateStock(Long, Integer)})
*
* @param id 商品 SPU 编号
* @param delta 库存增量(正数增加、负数减少)
*/
default int adjustStockOnly(Long id, Integer delta) {
if (delta == null || delta == 0) {
return 0;
}
String sql = "stock = stock + (" + delta + ")";
LambdaUpdateWrapper<CanteenOnlineSpuEntity> updateWrapper = new LambdaUpdateWrapper<CanteenOnlineSpuEntity>()
.setSql(sql)
.eq(CanteenOnlineSpuEntity::getId, id);
return update(null, updateWrapper);
}
}
@@ -3,6 +3,7 @@ package com.bsd.pjcloud.canteen.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bsd.pjcloud.canteen.dto.CanteenOnlineSpuShelfReqDTO;
import com.bsd.pjcloud.canteen.dto.CanteenOnlineSpuUpdateStockReqDTO;
import com.bsd.pjcloud.canteen.dto.canteenonline.CanteenOnlineSpuSaveDto;
import com.bsd.pjcloud.canteen.entity.CanteenOnlineSpuEntity;
@@ -21,13 +22,20 @@ public interface CanteenOnlineSpuService extends IService<CanteenOnlineSpuEntity
/**
* 根据分类id获取商品列表
* 根据商户id获取商品列表
* @param categoryId
* @param merchantId
* @return
* App 在线菜品列表(含每日菜谱过滤)
*
* @param categoryId 分类 id,可空
* @param merchantId 商户 id,必传
* @param time 日期 yyyy-MM-dd,可空则当天
* @param minPrice 最低价(分),可空
* @param maxPrice 最高价(分),可空
* @param status 上架状态:0 上架 1 下架,可空表示不限
* @param stockFilter 库存:in_stock 仅非售罄,sold_out 仅售罄,可空不限
* @param priceOrder 价格排序:asc / desc,可空则按 sort、id
*/
R<List<APPOnlineSpuVO>> getCanteenOnlineSpuList(String categoryId, String merchantId,String time);
R<List<APPOnlineSpuVO>> getCanteenOnlineSpuList(String categoryId, String merchantId, String time,
Integer minPrice, Integer maxPrice, Integer status,
String stockFilter, String priceOrder);
/**
@@ -37,6 +45,16 @@ public interface CanteenOnlineSpuService extends IService<CanteenOnlineSpuEntity
*/
R updateOnlineSpuSkuStock(CanteenOnlineSpuUpdateStockReqDTO canteenOnlineSpuUpdateStockReqDTO);
/**
* 商家端手工调整库存(只改 stock,不联动 sales_count;需校验 spu 归属 merchantId)
*/
R adjustOnlineSpuStockManual(Long merchantId, CanteenOnlineSpuUpdateStockReqDTO canteenOnlineSpuUpdateStockReqDTO);
/**
* 商家端上架/下架(status:0 上架默认,1 下架;需校验 SPU 归属 merchantId)
*/
R updateOnlineSpuShelfStatus(Long merchantId, CanteenOnlineSpuShelfReqDTO dto);
/**
* 批量新增关联每日菜谱
* @param canteenOnlineSpuSaveDto
@@ -1,8 +1,10 @@
package com.bsd.pjcloud.canteen.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bsd.pjcloud.canteen.dto.CanteenOnlineSpuShelfReqDTO;
import com.bsd.pjcloud.canteen.dto.CanteenOnlineSpuUpdateStockReqDTO;
import com.bsd.pjcloud.canteen.dto.canteenonline.CanteenOnlineSpuSaveDto;
import com.bsd.pjcloud.canteen.dto.canteenonline.CanteenOnlineSpuSaveItemDto;
@@ -54,10 +56,36 @@ public class CanteenOnlineSpuServiceImpl extends ServiceImpl<CanteenOnlineSpuMap
private final CanteenOnlineSpuMapper baseMapper;
@Override
public R<List<APPOnlineSpuVO>> getCanteenOnlineSpuList(String categoryId, String merchantId,String time) {
public R<List<APPOnlineSpuVO>> getCanteenOnlineSpuList(String categoryId, String merchantId, String time,
Integer minPrice, Integer maxPrice, Integer status,
String stockFilter, String priceOrder) {
if (minPrice != null && maxPrice != null && minPrice > maxPrice) {
return R.failed("价格区间无效:minPrice 不能大于 maxPrice");
}
LambdaQueryWrapper<CanteenOnlineSpuEntity> canteenOnlineSpuEntityLambdaQueryWrapper = new LambdaQueryWrapper<>();
canteenOnlineSpuEntityLambdaQueryWrapper.eq(StringUtils.isNotEmpty(categoryId), CanteenOnlineSpuEntity::getCategoryId, categoryId);
canteenOnlineSpuEntityLambdaQueryWrapper.eq(CanteenOnlineSpuEntity::getMerchantId, merchantId);
canteenOnlineSpuEntityLambdaQueryWrapper.ge(minPrice != null, CanteenOnlineSpuEntity::getPrice, minPrice);
canteenOnlineSpuEntityLambdaQueryWrapper.le(maxPrice != null, CanteenOnlineSpuEntity::getPrice, maxPrice);
canteenOnlineSpuEntityLambdaQueryWrapper.eq(status != null, CanteenOnlineSpuEntity::getStatus, status);
String sf = StrUtil.trimToEmpty(stockFilter);
if (StrUtil.equalsIgnoreCase(sf, "in_stock")) {
canteenOnlineSpuEntityLambdaQueryWrapper.gt(CanteenOnlineSpuEntity::getStock, 0);
} else if (StrUtil.equalsIgnoreCase(sf, "sold_out")) {
canteenOnlineSpuEntityLambdaQueryWrapper.and(w ->
w.le(CanteenOnlineSpuEntity::getStock, 0).or().isNull(CanteenOnlineSpuEntity::getStock));
}
String po = StrUtil.trimToEmpty(priceOrder);
if (StrUtil.equalsIgnoreCase(po, "asc")) {
canteenOnlineSpuEntityLambdaQueryWrapper.orderByAsc(CanteenOnlineSpuEntity::getPrice)
.orderByAsc(CanteenOnlineSpuEntity::getSort).orderByDesc(CanteenOnlineSpuEntity::getId);
} else if (StrUtil.equalsIgnoreCase(po, "desc")) {
canteenOnlineSpuEntityLambdaQueryWrapper.orderByDesc(CanteenOnlineSpuEntity::getPrice)
.orderByAsc(CanteenOnlineSpuEntity::getSort).orderByDesc(CanteenOnlineSpuEntity::getId);
} else {
canteenOnlineSpuEntityLambdaQueryWrapper.orderByAsc(CanteenOnlineSpuEntity::getSort)
.orderByDesc(CanteenOnlineSpuEntity::getId);
}
List<CanteenOnlineSpuEntity> canteenSpuEntities = baseMapper.selectList(canteenOnlineSpuEntityLambdaQueryWrapper);
//根据商户查询当前日期的每日菜谱,查询每日菜谱上架的菜的id,然后在从在线订餐的列表筛选出今天有上新的数据
@@ -77,20 +105,22 @@ public class CanteenOnlineSpuServiceImpl extends ServiceImpl<CanteenOnlineSpuMap
return c.getLinkSpuId() == null || linkSpuIds.contains(c.getLinkSpuId());
}).collect(Collectors.toList());
List<APPOnlineSpuVO> bean = BeanUtils.toBean(finallyCanteenSpuEntities, APPOnlineSpuVO.class);
for (int i = 0; i < bean.size(); i++) {
Integer st = finallyCanteenSpuEntities.get(i).getStock();
bean.get(i).setSoldOut(st == null || st <= 0);
}
return R.ok(bean);
}
@Override
public R updateOnlineSpuSkuStock(CanteenOnlineSpuUpdateStockReqDTO canteenOnlineSpuUpdateStockReqDTO) {
// 更新 SKU 库存
// 下单等场景:库存与销量联动(incrCount<0 视为售出)
for (CanteenOnlineSpuUpdateStockReqDTO.Item v : canteenOnlineSpuUpdateStockReqDTO.getItems()) {
// 查询当前库存
CanteenOnlineSpuEntity spu = baseMapper.selectById(v.getId());
if (spu == null) {
return R.failed(spu.getName() + "商品不存在");
return R.failed("商品不存在");
}
// 检查库存是否足够
if (v.getIncrCount() < 0 && Math.abs(v.getIncrCount()) > spu.getStock()) {
return R.failed(spu.getName() + "库存不足,无法完成操作");
}
@@ -99,6 +129,45 @@ public class CanteenOnlineSpuServiceImpl extends ServiceImpl<CanteenOnlineSpuMap
return R.ok();
}
@Override
public R adjustOnlineSpuStockManual(Long merchantId, CanteenOnlineSpuUpdateStockReqDTO dto) {
for (CanteenOnlineSpuUpdateStockReqDTO.Item v : dto.getItems()) {
CanteenOnlineSpuEntity spu = baseMapper.selectById(v.getId());
if (spu == null) {
return R.failed("商品不存在");
}
if (!Objects.equals(spu.getMerchantId(), merchantId)) {
return R.failed("无权操作该商品:" + StrUtil.blankToDefault(spu.getName(), String.valueOf(spu.getId())));
}
if (v.getIncrCount() < 0 && Math.abs(v.getIncrCount()) > spu.getStock()) {
return R.failed(StrUtil.blankToDefault(spu.getName(), "商品") + "库存不足,无法完成操作");
}
baseMapper.adjustStockOnly(v.getId(), v.getIncrCount());
}
return R.ok();
}
@Override
public R updateOnlineSpuShelfStatus(Long merchantId, CanteenOnlineSpuShelfReqDTO dto) {
Integer status = dto.getStatus();
if (status == null || (status != 0 && status != 1)) {
return R.failed("状态非法,仅支持 0-上架、1-下架");
}
CanteenOnlineSpuEntity spu = baseMapper.selectById(dto.getId());
if (spu == null) {
return R.failed("商品不存在");
}
if (!Objects.equals(spu.getMerchantId(), merchantId)) {
return R.failed("无权操作该商品");
}
LambdaUpdateWrapper<CanteenOnlineSpuEntity> uw = new LambdaUpdateWrapper<CanteenOnlineSpuEntity>()
.eq(CanteenOnlineSpuEntity::getId, dto.getId())
.eq(CanteenOnlineSpuEntity::getMerchantId, merchantId)
.set(CanteenOnlineSpuEntity::getStatus, status);
baseMapper.update(null, uw);
return R.ok();
}
@Override
@Transactional
public Object saveCanteenSpuBatch(CanteenOnlineSpuSaveDto canteenOnlineSpuSaveDto) {
@@ -77,6 +77,13 @@ public class SysDept extends Model<SysDept> {
@Schema(description = "是否同步到正元")
private String isSyncZy;
/**
* 是否单位:0-否 1-是(用于订餐等业务区分“单位/部门”)
*/
@Schema(description = "是否单位:0-否 1-是")
@TableField("is_unit")
private Integer isUnit;
/**
* 创建人
*/
@@ -25,6 +25,7 @@
<result property="name" column="name"/>
<result property="hardGroupId" column="hard_group_id"/>
<result property="isSyncZy" column="is_sync_zy"/>
<result property="isUnit" column="is_unit"/>
<result property="sortOrder" column="sort_order"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
@@ -39,6 +40,7 @@
a.hard_group_id,
a.sort_order,
a.is_sync_zy,
a.is_unit,
a.create_by,
a.update_by,
a.create_time,