feat(柜机格口操作): 添加柜机格口操作记录相关功能

新增柜机格口操作记录的管理功能,包括增删改查操作,支持通过条件查询操作记录,并提供了相应的DTO、Mapper、Service和Controller实现
This commit is contained in:
dzq 2025-04-21 17:19:10 +08:00
parent afbd0935e7
commit 523e545ace
14 changed files with 510 additions and 1 deletions

View File

@ -0,0 +1,68 @@
package com.agileboot.admin.controller.cabinet;
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.cabinet.operation.CabinetCellOperationApplicationService;
import com.agileboot.domain.cabinet.operation.command.AddCabinetCellOperationCommand;
import com.agileboot.domain.cabinet.operation.command.UpdateCabinetCellOperationCommand;
import com.agileboot.domain.cabinet.operation.db.CabinetCellOperationEntity;
import com.agileboot.domain.cabinet.operation.dto.CabinetCellOperationDTO;
import com.agileboot.domain.cabinet.operation.query.SearchCabinetCellOperationQuery;
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("/cabinet/cellOperations")
@RequiredArgsConstructor
@Validated
public class CabinetCellOperationController extends BaseController {
private final CabinetCellOperationApplicationService cabinetCellOperationService;
@Operation(summary = "柜机格口操作列表")
@GetMapping
public ResponseDTO<PageDTO<CabinetCellOperationDTO>> list(SearchCabinetCellOperationQuery<CabinetCellOperationEntity> query) {
PageDTO<CabinetCellOperationDTO> page = cabinetCellOperationService.getCabinetCellOperationList(query);
return ResponseDTO.ok(page);
}
@Operation(summary = "新增柜机格口操作")
@AccessLog(title = "柜机格口操作管理", businessType = BusinessTypeEnum.ADD)
@PostMapping
public ResponseDTO<Void> add(@Validated @RequestBody AddCabinetCellOperationCommand command) {
cabinetCellOperationService.addCabinetCellOperation(command);
return ResponseDTO.ok();
}
@Operation(summary = "修改柜机格口操作")
@AccessLog(title = "柜机格口操作管理", businessType = BusinessTypeEnum.MODIFY)
@PutMapping("/{operationId}")
public ResponseDTO<Void> edit(@PathVariable Long operationId, @Validated @RequestBody UpdateCabinetCellOperationCommand command) {
command.setOperationId(operationId);
cabinetCellOperationService.updateCabinetCellOperation(command);
return ResponseDTO.ok();
}
@Operation(summary = "删除柜机格口操作")
@AccessLog(title = "柜机格口操作管理", businessType = BusinessTypeEnum.DELETE)
@DeleteMapping("/{ids}")
public ResponseDTO<Void> remove(@PathVariable @NotNull List<Long> ids) {
cabinetCellOperationService.deleteCabinetCellOperation(new BulkOperationCommand<>(ids));
return ResponseDTO.ok();
}
}

View File

@ -0,0 +1,57 @@
package com.agileboot.domain.cabinet.operation;
import com.agileboot.common.core.page.PageDTO;
import com.agileboot.domain.common.command.BulkOperationCommand;
import com.agileboot.domain.cabinet.operation.command.AddCabinetCellOperationCommand;
import com.agileboot.domain.cabinet.operation.command.UpdateCabinetCellOperationCommand;
import com.agileboot.domain.cabinet.operation.db.CabinetCellOperationEntity;
import com.agileboot.domain.cabinet.operation.db.CabinetCellOperationService;
import com.agileboot.domain.cabinet.operation.dto.CabinetCellOperationDTO;
import com.agileboot.domain.cabinet.operation.model.CabinetCellOperationModel;
import com.agileboot.domain.cabinet.operation.model.CabinetCellOperationModelFactory;
import com.agileboot.domain.cabinet.operation.query.SearchCabinetCellOperationQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.List;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Service
@Slf4j
@RequiredArgsConstructor
public class CabinetCellOperationApplicationService {
private final CabinetCellOperationService cabinetCellOperationService;
private final CabinetCellOperationModelFactory cabinetCellOperationModelFactory;
public PageDTO<CabinetCellOperationDTO> getCabinetCellOperationList(SearchCabinetCellOperationQuery<CabinetCellOperationEntity> query) {
Page<CabinetCellOperationEntity> page = cabinetCellOperationService.getOperationList(query);
List<CabinetCellOperationDTO> dtoList = page.getRecords().stream()
.map(CabinetCellOperationDTO::new)
.collect(Collectors.toList());
return new PageDTO<>(dtoList, page.getTotal());
}
public void addCabinetCellOperation(AddCabinetCellOperationCommand command) {
CabinetCellOperationModel model = cabinetCellOperationModelFactory.create();
model.loadAddCommand(command);
model.insert();
}
public void updateCabinetCellOperation(UpdateCabinetCellOperationCommand command) {
CabinetCellOperationModel model = cabinetCellOperationModelFactory.loadById(command.getOperationId());
model.loadUpdateCommand(command);
model.updateById();
}
public void deleteCabinetCellOperation(BulkOperationCommand<Long> command) {
for (Long id : command.getIds()) {
CabinetCellOperationModel model = cabinetCellOperationModelFactory.loadById(id);
model.deleteById();
}
}
public CabinetCellOperationEntity getByOperationId(Long operationId) {
return cabinetCellOperationService.getById(operationId);
}
}

View File

@ -0,0 +1,11 @@
package com.agileboot.domain.cabinet.operation.command;
import com.agileboot.domain.cabinet.operation.db.CabinetCellOperationEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class AddCabinetCellOperationCommand extends CabinetCellOperationEntity {
}

View File

@ -0,0 +1,16 @@
package com.agileboot.domain.cabinet.operation.command;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.PositiveOrZero;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class UpdateCabinetCellOperationCommand extends AddCabinetCellOperationCommand {
@NotNull
@PositiveOrZero
private Long operationId;
}

View File

@ -0,0 +1,76 @@
package com.agileboot.domain.cabinet.operation.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-04-21
*/
@Getter
@Setter
@TableName("cabinet_cell_operation")
@ApiModel(value = "CabinetCellOperationEntity对象", description = "柜机格口操作记录表")
public class CabinetCellOperationEntity extends BaseEntity<CabinetCellOperationEntity> {
private static final long serialVersionUID = 1L;
@ApiModelProperty("操作流水号")
@TableId(value = "operation_id", type = IdType.AUTO)
private Long operationId;
@ApiModelProperty("关联格口ID")
@TableField("cell_id")
private Long cellId;
@ApiModelProperty("关联商品ID")
@TableField("goods_id")
private Long goodsId;
@ApiModelProperty("商品名称")
@TableField("goods_name")
private String goodsName;
@ApiModelProperty("企业微信用户ID")
@TableField("userid")
private String userid;
@ApiModelProperty("是否内部用户0否 1是")
@TableField("is_internal")
private Boolean isInternal;
@ApiModelProperty("成员名称")
@TableField("`name`")
private String name;
@ApiModelProperty("手机号码")
@TableField("mobile")
private String mobile;
@ApiModelProperty("操作类型1用户 2管理员")
@TableField("operation_type")
private Integer operationType;
@ApiModelProperty("操作状态1正常 2操作失败")
@TableField("`status`")
private Integer status;
@Override
public Serializable pkVal() {
return this.operationId;
}
}

View File

@ -0,0 +1,43 @@
package com.agileboot.domain.cabinet.operation.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 java.util.List;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
/**
* <p>
* 柜机格口操作记录表 Mapper 接口
* </p>
*
* @author valarchie
* @since 2025-04-21
*/
public interface CabinetCellOperationMapper extends BaseMapper<CabinetCellOperationEntity> {
@Select("SELECT * " +
"FROM cabinet_cell_operation " +
"${ew.customSqlSegment}")
Page<CabinetCellOperationEntity> getOperationList(
Page<CabinetCellOperationEntity> page,
@Param(Constants.WRAPPER) Wrapper<CabinetCellOperationEntity> queryWrapper
);
@Select("SELECT * " +
"FROM cabinet_cell_operation " +
"WHERE status = '1' " +
"ORDER BY operation_id DESC " +
"LIMIT 1")
CabinetCellOperationEntity selectFirstEnabledOperation();
@Select("SELECT * " +
"FROM cabinet_cell_operation " +
"WHERE status = '1' " +
"ORDER BY operation_id DESC")
List<CabinetCellOperationEntity> selectAll();
@Select("SELECT * FROM cabinet_cell_operation WHERE cell_id = #{cellId} LIMIT 1")
CabinetCellOperationEntity selectByCellId(@Param("cellId") Long cellId);
}

View File

@ -0,0 +1,18 @@
package com.agileboot.domain.cabinet.operation.db;
import com.agileboot.common.core.page.AbstractPageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 柜机格口操作记录表 服务类
* </p>
*
* @author valarchie
* @since 2025-04-21
*/
public interface CabinetCellOperationService extends IService<CabinetCellOperationEntity> {
Page<CabinetCellOperationEntity> getOperationList(AbstractPageQuery<CabinetCellOperationEntity> query);
}

View File

@ -0,0 +1,24 @@
package com.agileboot.domain.cabinet.operation.db;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import com.agileboot.common.core.page.AbstractPageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
/**
* <p>
* 柜机格口操作记录表 服务实现类
* </p>
*
* @author valarchie
* @since 2025-04-21
*/
@Service
public class CabinetCellOperationServiceImpl extends ServiceImpl<CabinetCellOperationMapper, CabinetCellOperationEntity> implements CabinetCellOperationService {
@Override
public Page<CabinetCellOperationEntity> getOperationList(AbstractPageQuery<CabinetCellOperationEntity> query) {
return this.page(query.toPage(), query.toQueryWrapper());
}
}

View File

@ -0,0 +1,76 @@
package com.agileboot.domain.cabinet.operation.dto;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import java.util.Date;
import com.agileboot.common.annotation.ExcelColumn;
import com.agileboot.common.annotation.ExcelSheet;
import com.agileboot.domain.cabinet.operation.db.CabinetCellOperationEntity;
import lombok.Data;
@ExcelSheet(name = "柜机格口操作记录列表")
@Data
public class CabinetCellOperationDTO {
public CabinetCellOperationDTO(CabinetCellOperationEntity entity) {
if (entity != null) {
BeanUtil.copyProperties(entity, this);
this.statusDesc = convertStatus(entity.getStatus());
this.createTimeStr = DateUtil.format(entity.getCreateTime(), "yyyy-MM-dd HH:mm:ss");
}
}
private String convertStatus(Integer status) {
if (status == null) return "未知状态";
switch(status) {
case 1: return "正常";
case 2: return "操作失败";
default: return "未知状态";
}
}
@ExcelColumn(name = "操作流水号")
private Long operationId;
@ExcelColumn(name = "关联格口ID")
private Long cellId;
@ExcelColumn(name = "关联商品ID")
private Long goodsId;
@ExcelColumn(name = "商品名称")
private String goodsName;
@ExcelColumn(name = "企业微信用户ID")
private String userid;
@ExcelColumn(name = "是否内部用户")
private Boolean isInternal;
@ExcelColumn(name = "成员名称")
private String name;
@ExcelColumn(name = "手机号码")
private String mobile;
@ExcelColumn(name = "操作类型")
private Integer operationType;
@ExcelColumn(name = "操作状态")
private Integer status;
@ExcelColumn(name = "操作状态")
private String statusDesc;
@ExcelColumn(name = "操作人")
private String operator;
@ExcelColumn(name = "创建时间")
private Date createTime;
@ExcelColumn(name = "创建时间")
private String createTimeStr;
}

View File

@ -0,0 +1,39 @@
package com.agileboot.domain.cabinet.operation.model;
import cn.hutool.core.bean.BeanUtil;
import com.agileboot.domain.cabinet.operation.command.AddCabinetCellOperationCommand;
import com.agileboot.domain.cabinet.operation.command.UpdateCabinetCellOperationCommand;
import com.agileboot.domain.cabinet.operation.db.CabinetCellOperationEntity;
import com.agileboot.domain.cabinet.operation.db.CabinetCellOperationService;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class CabinetCellOperationModel extends CabinetCellOperationEntity {
private CabinetCellOperationService cabinetCellOperationService;
public CabinetCellOperationModel(CabinetCellOperationEntity entity, CabinetCellOperationService cabinetCellOperationService) {
this(cabinetCellOperationService);
if (entity != null) {
BeanUtil.copyProperties(entity, this);
}
}
public CabinetCellOperationModel(CabinetCellOperationService cabinetCellOperationService) {
this.cabinetCellOperationService = cabinetCellOperationService;
}
public void loadAddCommand(AddCabinetCellOperationCommand command) {
if (command != null) {
BeanUtil.copyProperties(command, this, "id");
}
}
public void loadUpdateCommand(UpdateCabinetCellOperationCommand command) {
if (command != null) {
loadAddCommand(command);
}
}
}

View File

@ -0,0 +1,27 @@
package com.agileboot.domain.cabinet.operation.model;
import com.agileboot.common.exception.ApiException;
import com.agileboot.common.exception.error.ErrorCode;
import com.agileboot.domain.cabinet.operation.db.CabinetCellOperationEntity;
import com.agileboot.domain.cabinet.operation.db.CabinetCellOperationService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
public class CabinetCellOperationModelFactory {
private final CabinetCellOperationService cabinetCellOperationService;
public CabinetCellOperationModel loadById(Long operationId) {
CabinetCellOperationEntity entity = cabinetCellOperationService.getById(operationId);
if (entity == null) {
throw new ApiException(ErrorCode.Business.COMMON_OBJECT_NOT_FOUND, operationId, "柜机操作记录");
}
return new CabinetCellOperationModel(entity, cabinetCellOperationService);
}
public CabinetCellOperationModel create() {
return new CabinetCellOperationModel(cabinetCellOperationService);
}
}

View File

@ -0,0 +1,49 @@
package com.agileboot.domain.cabinet.operation.query;
import cn.hutool.core.util.StrUtil;
import com.agileboot.common.core.page.AbstractPageQuery;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.util.Date;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class SearchCabinetCellOperationQuery<T> extends AbstractPageQuery<T> {
private Long operationId;
private Long cellId;
private Long goodsId;
private String userid;
private String goodsName;
private Boolean isInternal;
private String name;
private String mobile;
private Integer operationType;
private Integer status;
private Date startTime;
private Date endTime;
@Override
public QueryWrapper<T> addQueryCondition() {
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
queryWrapper
.eq(operationId != null, "operation_id", operationId)
.eq(cellId != null, "cell_id", cellId)
.eq(goodsId != null, "goods_id", goodsId)
.eq(StrUtil.isNotEmpty(userid), "userid", userid)
.like(StrUtil.isNotEmpty(goodsName), "goods_name", goodsName)
.eq(isInternal != null, "is_internal", isInternal)
.like(StrUtil.isNotEmpty(name), "name", name)
.like(StrUtil.isNotEmpty(mobile), "mobile", mobile)
.eq(operationType != null, "operation_type", operationType)
.eq(status != null, "status", status)
.between(startTime != null && endTime != null, "create_time", startTime, endTime)
.orderByDesc("create_time");
this.timeRangeColumn = "create_time";
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.cabinet.operation.db.CabinetCellOperationMapper">
</mapper>

View File

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