diff --git a/agileboot-admin/src/main/java/com/agileboot/admin/controller/cabinet/CabinetCellOperationController.java b/agileboot-admin/src/main/java/com/agileboot/admin/controller/cabinet/CabinetCellOperationController.java new file mode 100644 index 0000000..f1a698f --- /dev/null +++ b/agileboot-admin/src/main/java/com/agileboot/admin/controller/cabinet/CabinetCellOperationController.java @@ -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> list(SearchCabinetCellOperationQuery query) { + PageDTO page = cabinetCellOperationService.getCabinetCellOperationList(query); + return ResponseDTO.ok(page); + } + + @Operation(summary = "新增柜机格口操作") + @AccessLog(title = "柜机格口操作管理", businessType = BusinessTypeEnum.ADD) + @PostMapping + public ResponseDTO add(@Validated @RequestBody AddCabinetCellOperationCommand command) { + cabinetCellOperationService.addCabinetCellOperation(command); + return ResponseDTO.ok(); + } + + @Operation(summary = "修改柜机格口操作") + @AccessLog(title = "柜机格口操作管理", businessType = BusinessTypeEnum.MODIFY) + @PutMapping("/{operationId}") + public ResponseDTO 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 remove(@PathVariable @NotNull List ids) { + cabinetCellOperationService.deleteCabinetCellOperation(new BulkOperationCommand<>(ids)); + return ResponseDTO.ok(); + } +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/CabinetCellOperationApplicationService.java b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/CabinetCellOperationApplicationService.java new file mode 100644 index 0000000..0daeae3 --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/CabinetCellOperationApplicationService.java @@ -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 getCabinetCellOperationList(SearchCabinetCellOperationQuery query) { + Page page = cabinetCellOperationService.getOperationList(query); + List 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 command) { + for (Long id : command.getIds()) { + CabinetCellOperationModel model = cabinetCellOperationModelFactory.loadById(id); + model.deleteById(); + } + } + + public CabinetCellOperationEntity getByOperationId(Long operationId) { + return cabinetCellOperationService.getById(operationId); + } +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/command/AddCabinetCellOperationCommand.java b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/command/AddCabinetCellOperationCommand.java new file mode 100644 index 0000000..720423e --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/command/AddCabinetCellOperationCommand.java @@ -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 { + +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/command/UpdateCabinetCellOperationCommand.java b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/command/UpdateCabinetCellOperationCommand.java new file mode 100644 index 0000000..5a933db --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/command/UpdateCabinetCellOperationCommand.java @@ -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; + +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/db/CabinetCellOperationEntity.java b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/db/CabinetCellOperationEntity.java new file mode 100644 index 0000000..cee61fd --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/db/CabinetCellOperationEntity.java @@ -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; + +/** + *

+ * 柜机格口操作记录表 + *

+ * + * @author valarchie + * @since 2025-04-21 + */ +@Getter +@Setter +@TableName("cabinet_cell_operation") +@ApiModel(value = "CabinetCellOperationEntity对象", description = "柜机格口操作记录表") +public class CabinetCellOperationEntity extends BaseEntity { + + 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; + } + +} diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/db/CabinetCellOperationMapper.java b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/db/CabinetCellOperationMapper.java new file mode 100644 index 0000000..d37b468 --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/db/CabinetCellOperationMapper.java @@ -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; + +/** + *

+ * 柜机格口操作记录表 Mapper 接口 + *

+ * + * @author valarchie + * @since 2025-04-21 + */ +public interface CabinetCellOperationMapper extends BaseMapper { + @Select("SELECT * " + + "FROM cabinet_cell_operation " + + "${ew.customSqlSegment}") + Page getOperationList( + Page page, + @Param(Constants.WRAPPER) Wrapper 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 selectAll(); + + @Select("SELECT * FROM cabinet_cell_operation WHERE cell_id = #{cellId} LIMIT 1") + CabinetCellOperationEntity selectByCellId(@Param("cellId") Long cellId); +} diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/db/CabinetCellOperationService.java b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/db/CabinetCellOperationService.java new file mode 100644 index 0000000..b29a025 --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/db/CabinetCellOperationService.java @@ -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; + +/** + *

+ * 柜机格口操作记录表 服务类 + *

+ * + * @author valarchie + * @since 2025-04-21 + */ +public interface CabinetCellOperationService extends IService { + + Page getOperationList(AbstractPageQuery query); +} diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/db/CabinetCellOperationServiceImpl.java b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/db/CabinetCellOperationServiceImpl.java new file mode 100644 index 0000000..f69e2b4 --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/db/CabinetCellOperationServiceImpl.java @@ -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; + +/** + *

+ * 柜机格口操作记录表 服务实现类 + *

+ * + * @author valarchie + * @since 2025-04-21 + */ +@Service +public class CabinetCellOperationServiceImpl extends ServiceImpl implements CabinetCellOperationService { + + @Override + public Page getOperationList(AbstractPageQuery query) { + return this.page(query.toPage(), query.toQueryWrapper()); + } +} diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/dto/CabinetCellOperationDTO.java b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/dto/CabinetCellOperationDTO.java new file mode 100644 index 0000000..aaf747b --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/dto/CabinetCellOperationDTO.java @@ -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; +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/model/CabinetCellOperationModel.java b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/model/CabinetCellOperationModel.java new file mode 100644 index 0000000..cc00db4 --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/model/CabinetCellOperationModel.java @@ -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); + } + } +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/model/CabinetCellOperationModelFactory.java b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/model/CabinetCellOperationModelFactory.java new file mode 100644 index 0000000..c7cd661 --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/model/CabinetCellOperationModelFactory.java @@ -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); + } +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/query/SearchCabinetCellOperationQuery.java b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/query/SearchCabinetCellOperationQuery.java new file mode 100644 index 0000000..72e82ff --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/operation/query/SearchCabinetCellOperationQuery.java @@ -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 extends AbstractPageQuery { + + 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 addQueryCondition() { + QueryWrapper 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; + } +} \ No newline at end of file diff --git a/agileboot-domain/src/main/resources/mapper/cabinet/CabinetCellOperationMapper.xml b/agileboot-domain/src/main/resources/mapper/cabinet/CabinetCellOperationMapper.xml new file mode 100644 index 0000000..25e55d7 --- /dev/null +++ b/agileboot-domain/src/main/resources/mapper/cabinet/CabinetCellOperationMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/mybatisplus/CodeGenerator.java b/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/mybatisplus/CodeGenerator.java index d810fa6..653ac3a 100644 --- a/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/mybatisplus/CodeGenerator.java +++ b/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/mybatisplus/CodeGenerator.java @@ -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();