feat(柜机格口操作): 添加带关联信息的操作记录详情查询功能

新增操作记录详情查询接口,包含柜机、商店等关联信息
清空密码时重置备注字段为空
This commit is contained in:
dzq 2026-01-05 17:48:14 +08:00
parent 91aa34efe9
commit 078c18fec9
9 changed files with 175 additions and 46 deletions

View File

@ -11,6 +11,7 @@ import com.agileboot.domain.cabinet.operation.command.AddCabinetCellOperationCom
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.SearchCabinetCellOperationDetailQuery;
import com.agileboot.domain.cabinet.operation.query.SearchCabinetCellOperationQuery;
import io.swagger.v3.oas.annotations.Operation;
import java.util.List;
@ -41,6 +42,13 @@ public class CabinetCellOperationController extends BaseController {
return ResponseDTO.ok(page);
}
@Operation(summary = "柜机格口操作详情列表")
@GetMapping("/page")
public ResponseDTO<PageDTO<CabinetCellOperationDTO>> listDetail(SearchCabinetCellOperationDetailQuery query) {
PageDTO<CabinetCellOperationDTO> page = cabinetCellOperationService.getOperationDetailList(query);
return ResponseDTO.ok(page);
}
@Operation(summary = "新增柜机格口操作")
@AccessLog(title = "柜机格口操作管理", businessType = BusinessTypeEnum.ADD)
@PostMapping

View File

@ -98,6 +98,8 @@ public class CabinetCellServiceImpl extends ServiceImpl<CabinetCellMapper, Cabin
UpdateWrapper<CabinetCellEntity> updateWrapper = new UpdateWrapper<>();
updateWrapper.set("password", null)
.set("password_create_time", null)
// 清空密码时重置备注为空暂不生效
.set("remark", "")
.set("usage_status", 1) // 空闲
.eq("cell_id", cellId)
.eq("deleted", 0);

View File

@ -9,6 +9,7 @@ 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.SearchCabinetCellOperationDetailQuery;
import com.agileboot.domain.cabinet.operation.query.SearchCabinetCellOperationQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.List;
@ -54,4 +55,9 @@ public class CabinetCellOperationApplicationService {
public CabinetCellOperationEntity getByOperationId(Long operationId) {
return cabinetCellOperationService.getById(operationId);
}
public PageDTO<CabinetCellOperationDTO> getOperationDetailList(SearchCabinetCellOperationDetailQuery query) {
Page<CabinetCellOperationDTO> page = cabinetCellOperationService.getOperationDetailList(query);
return new PageDTO<>(page.getRecords(), page.getTotal());
}
}

View File

@ -1,5 +1,6 @@
package com.agileboot.domain.cabinet.operation.db;
import com.agileboot.domain.cabinet.operation.dto.CabinetCellOperationDTO;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
@ -25,6 +26,17 @@ public interface CabinetCellOperationMapper extends BaseMapper<CabinetCellOperat
@Param(Constants.WRAPPER) Wrapper<CabinetCellOperationEntity> queryWrapper
);
@Select("SELECT cco.*, cc.cabinet_id, sc.cabinet_name, sc.shop_id, s.shop_name, cc.cell_no, cc.cell_type " +
"FROM cabinet_cell_operation cco " +
"LEFT JOIN cabinet_cell cc ON cco.cell_id = cc.cell_id " +
"LEFT JOIN smart_cabinet sc ON cc.cabinet_id = sc.cabinet_id " +
"LEFT JOIN shop s ON sc.shop_id = s.shop_id " +
"${ew.customSqlSegment}")
Page<CabinetCellOperationDTO> getOperationDetailList(
Page<CabinetCellOperationDTO> page,
@Param(Constants.WRAPPER) Wrapper<CabinetCellOperationDTO> queryWrapper
);
@Select("SELECT * " +
"FROM cabinet_cell_operation " +
"WHERE status = '1' " +

View File

@ -1,6 +1,8 @@
package com.agileboot.domain.cabinet.operation.db;
import com.agileboot.common.core.page.AbstractPageQuery;
import com.agileboot.domain.cabinet.operation.dto.CabinetCellOperationDTO;
import com.agileboot.domain.cabinet.operation.query.SearchCabinetCellOperationDetailQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
@ -15,4 +17,12 @@ import com.baomidou.mybatisplus.extension.service.IService;
public interface CabinetCellOperationService extends IService<CabinetCellOperationEntity> {
Page<CabinetCellOperationEntity> getOperationList(AbstractPageQuery<CabinetCellOperationEntity> query);
/**
* 获取操作记录详情列表带关联表信息
*
* @param query 查询条件
* @return 分页结果
*/
Page<CabinetCellOperationDTO> getOperationDetailList(SearchCabinetCellOperationDetailQuery query);
}

View File

@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import com.agileboot.common.core.page.AbstractPageQuery;
import com.agileboot.domain.cabinet.operation.dto.CabinetCellOperationDTO;
import com.agileboot.domain.cabinet.operation.query.SearchCabinetCellOperationDetailQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
/**
@ -21,4 +23,9 @@ public class CabinetCellOperationServiceImpl extends ServiceImpl<CabinetCellOper
public Page<CabinetCellOperationEntity> getOperationList(AbstractPageQuery<CabinetCellOperationEntity> query) {
return this.page(query.toPage(), query.toQueryWrapper());
}
@Override
public Page<CabinetCellOperationDTO> getOperationDetailList(SearchCabinetCellOperationDetailQuery query) {
return this.baseMapper.getOperationDetailList(query.toPage(), query.toQueryWrapper());
}
}

View File

@ -8,16 +8,23 @@ 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 com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ExcelSheet(name = "柜机格口操作记录列表")
@Data
public class CabinetCellOperationDTO {
@EqualsAndHashCode(callSuper = true)
public class CabinetCellOperationDTO extends CabinetCellOperationEntity {
public 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");
}
@ -25,52 +32,46 @@ public class CabinetCellOperationDTO {
private String convertStatus(Integer status) {
if (status == null) return "未知状态";
switch(status) {
case 1: return "正常";
case 2: return "操作失败";
default: 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 = "操作状态")
@ApiModelProperty("创建时间字符串")
@TableField(exist = false)
private String statusDesc;
@ExcelColumn(name = "操作人")
private String operator;
@ExcelColumn(name = "创建时间")
private Date createTime;
@ExcelColumn(name = "创建时间")
@ApiModelProperty("创建时间字符串")
@TableField(exist = false)
private String createTimeStr;
}
@ApiModelProperty("柜机ID")
@TableField(exist = false)
private Long cabinetId;
@ApiModelProperty("柜机名称")
@TableField(exist = false)
private String cabinetName;
@ApiModelProperty("商店ID")
@TableField(exist = false)
private Long shopId;
@ApiModelProperty("商店名称")
@TableField(exist = false)
private String shopName;
@ApiModelProperty("格口号")
@TableField(exist = false)
private Integer cellNo;
@ApiModelProperty("格口类型1小格 2中格 3大格 4超大格")
@TableField(exist = false)
private Integer cellType;
}

View File

@ -0,0 +1,61 @@
package com.agileboot.domain.cabinet.operation.query;
import cn.hutool.core.util.StrUtil;
import com.agileboot.common.core.page.AbstractPageQuery;
import com.agileboot.domain.cabinet.operation.dto.CabinetCellOperationDTO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.util.Date;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 柜机格口操作记录详细查询带关联表信息
*
* @author valarchie
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class SearchCabinetCellOperationDetailQuery extends AbstractPageQuery<CabinetCellOperationDTO> {
private Long cabinetId;
private Long shopId;
private Long operationId;
private Long cellId;
private Long goodsId;
private Integer cellNo;
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<CabinetCellOperationDTO> addQueryCondition() {
QueryWrapper<CabinetCellOperationDTO> queryWrapper = new QueryWrapper<>();
queryWrapper
.eq(cabinetId != null, "sc.cabinet_id", cabinetId)
.eq(shopId != null, "s.shop_id", shopId)
.eq(operationId != null, "cco.operation_id", operationId)
.eq(cellId != null, "cco.cell_id", cellId)
.eq(goodsId != null, "cco.goods_id", goodsId)
.eq(cellNo != null, "cc.cell_no", cellNo)
.eq(StrUtil.isNotEmpty(userid), "cco.userid", userid)
.like(StrUtil.isNotEmpty(goodsName), "cco.goods_name", goodsName)
.eq(isInternal != null, "cco.is_internal", isInternal)
.like(StrUtil.isNotEmpty(name), "cco.name", name)
.like(StrUtil.isNotEmpty(mobile), "cco.mobile", mobile)
.eq(operationType != null, "cco.operation_type", operationType)
.eq(status != null, "cco.status", status)
.between(startTime != null && endTime != null, "cco.create_time", startTime, endTime)
.orderByDesc("cco.create_time");
this.timeRangeColumn = "cco.create_time";
return queryWrapper;
}
}

View File

@ -109,4 +109,26 @@ CREATE TABLE `cabinet_cell` (
KEY `idx_goods` (`goods_id`),
CONSTRAINT `fk_cell_cabinet` FOREIGN KEY (`cabinet_id`) REFERENCES `smart_cabinet` (`cabinet_id`),
CONSTRAINT `fk_cell_goods` FOREIGN KEY (`goods_id`) REFERENCES `shop_goods` (`goods_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1268 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='柜机格口信息表';
) ENGINE=InnoDB AUTO_INCREMENT=1268 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='柜机格口信息表';
CREATE TABLE `cabinet_cell_operation` (
`operation_id` bigint NOT NULL AUTO_INCREMENT COMMENT '操作流水号',
`cell_id` bigint NOT NULL COMMENT '关联格口ID',
`goods_id` bigint DEFAULT NULL COMMENT '关联商品ID',
`goods_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '商品名称',
`userid` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '企业微信用户ID',
`is_internal` tinyint(1) DEFAULT '0' COMMENT '是否内部用户0否 1是',
`name` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '成员名称',
`mobile` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '手机号码',
`operation_type` tinyint NOT NULL COMMENT '操作类型1用户 2管理员',
`status` tinyint NOT NULL DEFAULT '1' COMMENT '操作状态1正常 2操作失败',
`creator_id` bigint NOT NULL DEFAULT '0' COMMENT '创建者ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater_id` bigint NOT NULL DEFAULT '0' COMMENT '更新者ID',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '删除标志0存在 1删除',
PRIMARY KEY (`operation_id`),
KEY `idx_cell` (`cell_id`),
KEY `idx_user` (`userid`),
KEY `idx_operation_time` (`create_time`)
) ENGINE=InnoDB AUTO_INCREMENT=5717 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='柜机格口操作记录表';