feat(shop): 新增申请领用商品格口分配功能

添加申请领用商品格口分配相关功能模块,包括:
- 实体类、DTO、Mapper、Service层实现
- 新增、修改、删除等业务逻辑
- 查询接口及分页功能
- 控制器层API接口
This commit is contained in:
dzq 2025-06-14 14:47:11 +08:00
parent 9f1a87e348
commit d7373d02af
14 changed files with 504 additions and 1 deletions

View File

@ -0,0 +1,67 @@
package com.agileboot.admin.controller.shop;
import com.agileboot.admin.customize.aop.accessLog.AccessLog;
import com.agileboot.common.core.base.BaseController;
import com.agileboot.common.core.dto.ResponseDTO;
import com.agileboot.common.core.page.PageDTO;
import com.agileboot.common.enums.common.BusinessTypeEnum;
import com.agileboot.domain.common.command.BulkOperationCommand;
import com.agileboot.domain.shop.approvalGoodsCell.ApprovalGoodsCellApplicationService;
import com.agileboot.domain.shop.approvalGoodsCell.command.AddApprovalGoodsCellCommand;
import com.agileboot.domain.shop.approvalGoodsCell.command.UpdateApprovalGoodsCellCommand;
import com.agileboot.domain.shop.approvalGoodsCell.db.ApprovalGoodsCellEntity;
import com.agileboot.domain.shop.approvalGoodsCell.query.SearchApprovalGoodsCellQuery;
import io.swagger.v3.oas.annotations.Operation;
import java.util.List;
import javax.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/shop/approval-goods-cells")
@RequiredArgsConstructor
@Validated
public class ApprovalGoodsCellController extends BaseController {
private final ApprovalGoodsCellApplicationService approvalGoodsCellApplicationService;
@Operation(summary = "商品格口审批列表")
@GetMapping
public ResponseDTO<PageDTO<ApprovalGoodsCellEntity>> list(SearchApprovalGoodsCellQuery<ApprovalGoodsCellEntity> query) {
PageDTO<ApprovalGoodsCellEntity> page = approvalGoodsCellApplicationService.getApprovalGoodsCellList(query);
return ResponseDTO.ok(page);
}
@Operation(summary = "新增商品格口审批")
@AccessLog(title = "商品格口审批管理", businessType = BusinessTypeEnum.ADD)
@PostMapping
public ResponseDTO<Void> add(@Validated @RequestBody AddApprovalGoodsCellCommand command) {
approvalGoodsCellApplicationService.addApprovalGoodsCell(command);
return ResponseDTO.ok();
}
@Operation(summary = "修改商品格口审批")
@AccessLog(title = "商品格口审批管理", businessType = BusinessTypeEnum.MODIFY)
@PutMapping("/{approvalGoodsCellId}")
public ResponseDTO<Void> edit(@PathVariable Long approvalGoodsCellId, @Validated @RequestBody UpdateApprovalGoodsCellCommand command) {
command.setApprovalGoodsCellId(approvalGoodsCellId);
approvalGoodsCellApplicationService.updateApprovalGoodsCell(command);
return ResponseDTO.ok();
}
@Operation(summary = "删除商品格口审批")
@AccessLog(title = "商品格口审批管理", businessType = BusinessTypeEnum.DELETE)
@DeleteMapping("/{ids}")
public ResponseDTO<Void> remove(@PathVariable @NotNull List<Long> ids) {
approvalGoodsCellApplicationService.deleteApprovalGoodsCell(new BulkOperationCommand<>(ids));
return ResponseDTO.ok();
}
}

View File

@ -0,0 +1,65 @@
package com.agileboot.domain.shop.approvalGoodsCell;
import com.agileboot.common.core.page.PageDTO;
import com.agileboot.common.core.page.AbstractPageQuery;
import com.agileboot.domain.common.command.BulkOperationCommand;
import com.agileboot.domain.shop.approvalGoodsCell.command.AddApprovalGoodsCellCommand;
import com.agileboot.domain.shop.approvalGoodsCell.command.UpdateApprovalGoodsCellCommand;
import com.agileboot.domain.shop.approvalGoodsCell.db.ApprovalGoodsCellEntity;
import com.agileboot.domain.shop.approvalGoodsCell.db.ApprovalGoodsCellService;
import com.agileboot.domain.shop.approvalGoodsCell.model.ApprovalGoodsCellModel;
import com.agileboot.domain.shop.approvalGoodsCell.model.ApprovalGoodsCellModelFactory;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
@Service
@Slf4j
@RequiredArgsConstructor
public class ApprovalGoodsCellApplicationService {
private final ApprovalGoodsCellService approvalGoodsCellService;
private final ApprovalGoodsCellModelFactory approvalGoodsCellModelFactory;
public PageDTO<ApprovalGoodsCellEntity> getApprovalGoodsCellList(AbstractPageQuery<ApprovalGoodsCellEntity> query) {
Page<ApprovalGoodsCellEntity> page = approvalGoodsCellService.getApprovalGoodsCellList(query);
return new PageDTO<>(page.getRecords(), page.getTotal());
}
public void addApprovalGoodsCell(AddApprovalGoodsCellCommand command) {
ApprovalGoodsCellModel model = approvalGoodsCellModelFactory.create();
model.loadAddCommand(command);
model.insert();
}
public void updateApprovalGoodsCell(UpdateApprovalGoodsCellCommand command) {
ApprovalGoodsCellModel model = approvalGoodsCellModelFactory.loadById(command.getApprovalGoodsCellId());
model.loadUpdateCommand(command);
model.updateById();
}
public void deleteApprovalGoodsCell(BulkOperationCommand<Long> command) {
for (Long id : command.getIds()) {
ApprovalGoodsCellModel model = approvalGoodsCellModelFactory.loadById(id);
model.deleteById();
}
}
public List<ApprovalGoodsCellEntity> getAllApprovalGoodsCells() {
return approvalGoodsCellService.selectAll();
}
public ApprovalGoodsCellEntity getByApprovalId(Long approvalId) {
return approvalGoodsCellService.selectByApprovalId(approvalId);
}
public ApprovalGoodsCellEntity getByCellId(Long cellId) {
return approvalGoodsCellService.selectByCellId(cellId);
}
public List<ApprovalGoodsCellEntity> getByShopId(Long shopId) {
return approvalGoodsCellService.selectByShopId(shopId);
}
}

View File

@ -0,0 +1,11 @@
package com.agileboot.domain.shop.approvalGoodsCell.command;
import com.agileboot.domain.shop.approvalGoodsCell.db.ApprovalGoodsCellEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class AddApprovalGoodsCellCommand extends ApprovalGoodsCellEntity {
}

View File

@ -0,0 +1,16 @@
package com.agileboot.domain.shop.approvalGoodsCell.command;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.PositiveOrZero;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class UpdateApprovalGoodsCellCommand extends AddApprovalGoodsCellCommand {
@NotNull
@PositiveOrZero
private Long approvalGoodsCellId;
}

View File

@ -0,0 +1,76 @@
package com.agileboot.domain.shop.approvalGoodsCell.db;
import com.agileboot.common.core.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
/**
* <p>
* 申请领用商品格口分配表
* </p>
*
* @author valarchie
* @since 2025-06-14
*/
@Getter
@Setter
@TableName("approval_goods_cell")
@ApiModel(value = "ApprovalGoodsCellEntity对象", description = "申请领用商品格口分配表")
public class ApprovalGoodsCellEntity extends BaseEntity<ApprovalGoodsCellEntity> {
private static final long serialVersionUID = 1L;
@ApiModelProperty("主键ID")
@TableId(value = "approval_goods_cell_id", type = IdType.AUTO)
private Long approvalGoodsCellId;
@ApiModelProperty("审批ID")
@TableField("approval_id")
private Long approvalId;
@ApiModelProperty("申请领用商品ID")
@TableField("approval_goods_id")
private Long approvalGoodsId;
@ApiModelProperty("商店ID")
@TableField("shop_id")
private Long shopId;
@ApiModelProperty("柜机ID")
@TableField("cabinet_id")
private Long cabinetId;
@ApiModelProperty("格口ID")
@TableField("cell_id")
private Long cellId;
@ApiModelProperty("分配数量")
@TableField("allocate_quantity")
private Integer allocateQuantity;
@ApiModelProperty("商店名称")
@TableField("shop_name")
private String shopName;
@ApiModelProperty("柜机名称")
@TableField("cabinet_name")
private String cabinetName;
@ApiModelProperty("格口号")
@TableField("cell_no")
private Integer cellNo;
@Override
public Serializable pkVal() {
return this.approvalGoodsCellId;
}
}

View File

@ -0,0 +1,39 @@
package com.agileboot.domain.shop.approvalGoodsCell.db;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* <p>
* 申请领用商品格口分配表 Mapper 接口
* </p>
*
* @author valarchie
* @since 2025-06-14
*/
public interface ApprovalGoodsCellMapper extends BaseMapper<ApprovalGoodsCellEntity> {
@Select("SELECT * FROM approval_goods_cell ${ew.customSqlSegment}")
Page<ApprovalGoodsCellEntity> getApprovalGoodsCellList(
Page<ApprovalGoodsCellEntity> page,
@Param(Constants.WRAPPER) Wrapper<ApprovalGoodsCellEntity> queryWrapper
);
@Select("SELECT * FROM approval_goods_cell ORDER BY create_time DESC")
List<ApprovalGoodsCellEntity> selectAll();
@Select("SELECT * FROM approval_goods_cell WHERE approval_id = #{approvalId} LIMIT 1")
ApprovalGoodsCellEntity selectByApprovalId(Long approvalId);
@Select("SELECT * FROM approval_goods_cell WHERE cell_id = #{cellId} LIMIT 1")
ApprovalGoodsCellEntity selectByCellId(Long cellId);
@Select("SELECT * FROM approval_goods_cell WHERE shop_id = #{shopId} ORDER BY create_time DESC")
List<ApprovalGoodsCellEntity> selectByShopId(Long shopId);
}

View File

@ -0,0 +1,27 @@
package com.agileboot.domain.shop.approvalGoodsCell.db;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 申请领用商品格口分配表 服务类
* </p>
*
* @author valarchie
* @since 2025-06-14
*/
import com.agileboot.common.core.page.AbstractPageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.List;
public interface ApprovalGoodsCellService extends IService<ApprovalGoodsCellEntity> {
Page<ApprovalGoodsCellEntity> getApprovalGoodsCellList(AbstractPageQuery<ApprovalGoodsCellEntity> query);
List<ApprovalGoodsCellEntity> selectAll();
ApprovalGoodsCellEntity selectByApprovalId(Long approvalId);
ApprovalGoodsCellEntity selectByCellId(Long cellId);
List<ApprovalGoodsCellEntity> selectByShopId(Long shopId);
}

View File

@ -0,0 +1,44 @@
package com.agileboot.domain.shop.approvalGoodsCell.db;
import com.agileboot.common.core.page.AbstractPageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 申请领用商品格口分配表 服务实现类
* </p>
*
* @author valarchie
* @since 2025-06-14
*/
@Service
public class ApprovalGoodsCellServiceImpl extends ServiceImpl<ApprovalGoodsCellMapper, ApprovalGoodsCellEntity> implements ApprovalGoodsCellService {
@Override
public Page<ApprovalGoodsCellEntity> getApprovalGoodsCellList(AbstractPageQuery<ApprovalGoodsCellEntity> query) {
return baseMapper.getApprovalGoodsCellList(query.toPage(), query.toQueryWrapper());
}
@Override
public List<ApprovalGoodsCellEntity> selectAll() {
return baseMapper.selectAll();
}
@Override
public ApprovalGoodsCellEntity selectByApprovalId(Long approvalId) {
return baseMapper.selectByApprovalId(approvalId);
}
@Override
public ApprovalGoodsCellEntity selectByCellId(Long cellId) {
return baseMapper.selectByCellId(cellId);
}
@Override
public List<ApprovalGoodsCellEntity> selectByShopId(Long shopId) {
return baseMapper.selectByShopId(shopId);
}
}

View File

@ -0,0 +1,48 @@
package com.agileboot.domain.shop.approvalGoodsCell.dto;
import cn.hutool.core.bean.BeanUtil;
import com.agileboot.common.annotation.ExcelColumn;
import com.agileboot.common.annotation.ExcelSheet;
import com.agileboot.domain.shop.approvalGoodsCell.db.ApprovalGoodsCellEntity;
import lombok.Data;
@ExcelSheet(name = "申请领用商品格口分配表")
@Data
public class ApprovalGoodsCellDTO {
public ApprovalGoodsCellDTO(ApprovalGoodsCellEntity entity) {
if (entity != null) {
BeanUtil.copyProperties(entity, this);
}
}
@ExcelColumn(name = "主键ID")
private Long approvalGoodsCellId;
@ExcelColumn(name = "审批ID")
private Long approvalId;
@ExcelColumn(name = "申请领用商品ID")
private Long approvalGoodsId;
@ExcelColumn(name = "商店ID")
private Long shopId;
@ExcelColumn(name = "柜机ID")
private Long cabinetId;
@ExcelColumn(name = "格口ID")
private Long cellId;
@ExcelColumn(name = "分配数量")
private Integer allocateQuantity;
@ExcelColumn(name = "商店名称")
private String shopName;
@ExcelColumn(name = "柜机名称")
private String cabinetName;
@ExcelColumn(name = "格口号")
private Integer cellNo;
}

View File

@ -0,0 +1,39 @@
package com.agileboot.domain.shop.approvalGoodsCell.model;
import cn.hutool.core.bean.BeanUtil;
import com.agileboot.domain.shop.approvalGoodsCell.command.AddApprovalGoodsCellCommand;
import com.agileboot.domain.shop.approvalGoodsCell.command.UpdateApprovalGoodsCellCommand;
import com.agileboot.domain.shop.approvalGoodsCell.db.ApprovalGoodsCellEntity;
import com.agileboot.domain.shop.approvalGoodsCell.db.ApprovalGoodsCellService;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class ApprovalGoodsCellModel extends ApprovalGoodsCellEntity {
private ApprovalGoodsCellService approvalGoodsCellService;
public ApprovalGoodsCellModel(ApprovalGoodsCellEntity entity, ApprovalGoodsCellService approvalGoodsCellService) {
this(approvalGoodsCellService);
if (entity != null) {
BeanUtil.copyProperties(entity, this);
}
}
public ApprovalGoodsCellModel(ApprovalGoodsCellService approvalGoodsCellService) {
this.approvalGoodsCellService = approvalGoodsCellService;
}
public void loadAddCommand(AddApprovalGoodsCellCommand command) {
if (command != null) {
BeanUtil.copyProperties(command, this, "id");
}
}
public void loadUpdateCommand(UpdateApprovalGoodsCellCommand command) {
if (command != null) {
loadAddCommand(command);
}
}
}

View File

@ -0,0 +1,27 @@
package com.agileboot.domain.shop.approvalGoodsCell.model;
import com.agileboot.common.exception.ApiException;
import com.agileboot.common.exception.error.ErrorCode;
import com.agileboot.domain.shop.approvalGoodsCell.db.ApprovalGoodsCellEntity;
import com.agileboot.domain.shop.approvalGoodsCell.db.ApprovalGoodsCellService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
public class ApprovalGoodsCellModelFactory {
private final ApprovalGoodsCellService approvalGoodsCellService;
public ApprovalGoodsCellModel loadById(Long approvalGoodsCellId) {
ApprovalGoodsCellEntity entity = approvalGoodsCellService.getById(approvalGoodsCellId);
if (entity == null) {
throw new ApiException(ErrorCode.Business.COMMON_OBJECT_NOT_FOUND, approvalGoodsCellId, "申请领用商品格口分配");
}
return new ApprovalGoodsCellModel(entity, approvalGoodsCellService);
}
public ApprovalGoodsCellModel create() {
return new ApprovalGoodsCellModel(approvalGoodsCellService);
}
}

View File

@ -0,0 +1,39 @@
package com.agileboot.domain.shop.approvalGoodsCell.query;
import cn.hutool.core.util.StrUtil;
import com.agileboot.common.core.page.AbstractPageQuery;
import com.agileboot.domain.shop.approvalGoodsCell.db.ApprovalGoodsCellEntity;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class SearchApprovalGoodsCellQuery<T> extends AbstractPageQuery<T> {
private Long approvalId;
private Long approvalGoodsId;
private Long shopId;
private Long cabinetId;
private Long cellId;
private String shopName;
private String cabinetName;
private Integer cellNo;
@Override
public QueryWrapper<T> addQueryCondition() {
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
queryWrapper
.eq(approvalId != null, "approval_id", approvalId)
.eq(approvalGoodsId != null, "approval_goods_id", approvalGoodsId)
.eq(shopId != null, "shop_id", shopId)
.eq(cabinetId != null, "cabinet_id", cabinetId)
.eq(cellId != null, "cell_id", cellId)
.like(StrUtil.isNotEmpty(shopName), "shop_name", shopName)
.like(StrUtil.isNotEmpty(cabinetName), "cabinet_name", cabinetName)
.eq(cellNo != null, "cell_no", cellNo);
return queryWrapper;
}
}

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.agileboot.domain.shop.approvalGoodsCell.db.ApprovalGoodsCellMapper">
</mapper>

View File

@ -61,7 +61,7 @@ public class CodeGenerator {
//生成的类 放在orm子模块下的/target/generated-code目录底下 //生成的类 放在orm子模块下的/target/generated-code目录底下
.module("/agileboot-orm/target/generated-code") .module("/agileboot-orm/target/generated-code")
.parentPackage("com.agileboot") .parentPackage("com.agileboot")
.tableName("approval_goods") .tableName("approval_goods_cell")
// 决定是否继承基类 // 决定是否继承基类
.isExtendsFromBaseEntity(true) .isExtendsFromBaseEntity(true)
.build(); .build();