Feat: Code gen V3 ok

This commit is contained in:
Owen 2024-12-23 17:34:04 +08:00
parent 5907ab9605
commit c2b416a5f8
10 changed files with 230 additions and 12 deletions

View File

@ -0,0 +1,30 @@
package cn.iocoder.yudao.module.haoka.enums;
public interface LogRecordConstants {
String HAOKA_CREATE="创建";
String HAOKA_UPDATE="修改";
String HAOKA_DELETE="删除";
String HAOKA_PRODUCT = "产品";
String HAOKA_PRODUCT_CREATE_SUCCESS = "产品名称:【{{#haoKaProduct.name}}】,编码:【{{#haoKaProduct.sku}}】";
String HAOKA_PRODUCT_UPDATE_SUCCESS = "更新了产品【{{#old.name}}】: {_DIFF{#updateReqVO}}";
String HAOKA_SALE_PRODUCT = "在售商品";
String HAOKA_SALE_PRODUCT_CREATE_SUCCESS = "名称:【{{#create.name}}】,编码:【{{#create.sku}}】";
String HAOKA_SALE_PRODUCT_UPDATE_SUCCESS = "更新【{{#old.name}}】: {_DIFF{#updateReqVO}}";
// ----------------------------
String SYSTEM_USER_CREATE_SUCCESS = "创建了用户【{{#user.nickname}}】";
String SYSTEM_USER_UPDATE_SUB_TYPE = "更新用户";
String SYSTEM_USER_UPDATE_SUCCESS = "更新了用户【{{#user.nickname}}】: {_DIFF{#updateReqVO}}";
String SYSTEM_USER_DELETE_SUB_TYPE = "删除用户";
String SYSTEM_USER_DELETE_SUCCESS = "删除了用户【{{#user.nickname}}】";
String SYSTEM_USER_UPDATE_PASSWORD_SUB_TYPE = "重置用户密码";
String SYSTEM_USER_UPDATE_PASSWORD_SUCCESS = "将用户【{{#user.nickname}}】的密码从【{{#user.password}}】重置为【{{#newPassword}}】";
}

View File

@ -0,0 +1,103 @@
package cn.iocoder.yudao.module.haoka.utils;
public class SnowflakeId {
// 起始的时间戳毫秒
private final static long START_TIMESTAMP = 1609459200000L; // 2021-01-01 00:00:00
// 每一部分占用的位数
private final static long MACHINE_ID_BITS = 10L; // 机器ID占用的位数
private final static long SEQUENCE_BITS = 12L; // 序列号占用的位数
// 每一部分的最大值
private final static long MAX_MACHINE_ID = ~(-1L << MACHINE_ID_BITS); // 机器ID最大值
private final static long MAX_SEQUENCE = ~(-1L << SEQUENCE_BITS); // 序列号最大值
// 每一部分向左的位移
private final static long MACHINE_ID_SHIFT = SEQUENCE_BITS; // 机器ID左移位数
private final static long TIMESTAMP_SHIFT = SEQUENCE_BITS + MACHINE_ID_BITS; // 时间戳左移位数
private final long machineId; // 机器ID
private long sequence = 0L; // 序列号
private long lastTimestamp = -1L; // 上一次生成ID的时间戳
public SnowflakeId() {
this.machineId = 1L;
}
/**
* 构造函数
*
* @param machineId 机器ID (0~1023)
*/
public SnowflakeId(long machineId) {
if (machineId > MAX_MACHINE_ID || machineId < 0) {
throw new IllegalArgumentException("MachineId can't be greater than " + MAX_MACHINE_ID + " or less than 0");
}
this.machineId = machineId;
}
/**
* 生成下一个ID
*
* @return 生成的ID
*/
public synchronized long nextId() {
long currentTimestamp = getCurrentTimestamp();
// 如果当前时间小于上一次生成ID的时间戳说明系统时钟回退过抛出异常
if (currentTimestamp < lastTimestamp) {
throw new RuntimeException("Clock moved backwards. Refusing to generate id for " + (lastTimestamp - currentTimestamp) + " milliseconds");
}
// 如果是同一时间生成的则进行序列号自增
if (currentTimestamp == lastTimestamp) {
sequence = (sequence + 1) & MAX_SEQUENCE;
// 如果序列号溢出则等待下一毫秒
if (sequence == 0) {
currentTimestamp = getNextMillisecond();
}
} else {
// 时间戳改变序列号重置
sequence = 0L;
}
// 更新上一次生成ID的时间戳
lastTimestamp = currentTimestamp;
// 生成ID
return (currentTimestamp - START_TIMESTAMP) << TIMESTAMP_SHIFT // 时间戳部分
| machineId << MACHINE_ID_SHIFT // 机器ID部分
| sequence; // 序列号部分
}
/**
* 获取当前时间戳毫秒
*
* @return 当前时间戳
*/
private long getCurrentTimestamp() {
return System.currentTimeMillis();
}
/**
* 获取下一毫秒的时间戳
*
* @return 下一毫秒的时间戳
*/
private long getNextMillisecond() {
long timestamp = getCurrentTimestamp();
while (timestamp <= lastTimestamp) {
timestamp = getCurrentTimestamp();
}
return timestamp;
}
private static final SnowflakeId SHARE = new SnowflakeId();
public static long generate() {
return SHARE.nextId();
}
}

View File

@ -1,5 +1,9 @@
package cn.iocoder.yudao.module.haoka.controller.admin.onsaleproduct;
import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.module.haoka.controller.admin.product.vo.HaoKaProductRespVO;
import cn.iocoder.yudao.module.haoka.dal.dataobject.product.HaoKaProductDO;
import cn.iocoder.yudao.module.haoka.service.product.HaoKaProductService;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@ -11,18 +15,22 @@ import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.constraints.*;
import jakarta.validation.*;
import jakarta.servlet.http.*;
import java.util.*;
import java.io.IOException;
import java.util.stream.Collectors;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
import cn.iocoder.yudao.module.haoka.controller.admin.onsaleproduct.vo.*;
@ -38,6 +46,9 @@ public class OnSaleProductController {
@Resource
private OnSaleProductService onSaleProductService;
@Resource
private HaoKaProductService haoKaProductService;
@PostMapping("/create")
@Operation(summary = "创建在售产品")
@PreAuthorize("@ss.hasPermission('haoka:on-sale-product:create')")
@ -76,7 +87,20 @@ public class OnSaleProductController {
@PreAuthorize("@ss.hasPermission('haoka:on-sale-product:query')")
public CommonResult<PageResult<OnSaleProductRespVO>> getOnSaleProductPage(@Valid OnSaleProductPageReqVO pageReqVO) {
PageResult<OnSaleProductDO> pageResult = onSaleProductService.getOnSaleProductPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, OnSaleProductRespVO.class));
PageResult<OnSaleProductRespVO> bean = BeanUtils.toBean(pageResult, OnSaleProductRespVO.class);
if (CollectionUtil.isNotEmpty(bean.getList())) {
List<Long> collect = bean.getList().stream().map(OnSaleProductRespVO::getParentProductId)
.toList();
List<HaoKaProductDO> haoKaProductDOS = haoKaProductService.listByIds(collect);
Map<Long, HaoKaProductDO> map = haoKaProductDOS.stream().collect(Collectors.toMap(HaoKaProductDO::getId, it -> it));
bean.getList().forEach(it -> {
HaoKaProductDO haoKaProductDO = map.get(it.getParentProductId());
it.setParentProduct(BeanUtils.toBean(haoKaProductDO, HaoKaProductRespVO.class));
});
}
return success(bean);
}
@GetMapping("/export-excel")
@ -84,12 +108,12 @@ public class OnSaleProductController {
@PreAuthorize("@ss.hasPermission('haoka:on-sale-product:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportOnSaleProductExcel(@Valid OnSaleProductPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<OnSaleProductDO> list = onSaleProductService.getOnSaleProductPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "在售产品.xls", "数据", OnSaleProductRespVO.class,
BeanUtils.toBean(list, OnSaleProductRespVO.class));
BeanUtils.toBean(list, OnSaleProductRespVO.class));
}
}
}

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.haoka.controller.admin.onsaleproduct.vo;
import cn.iocoder.yudao.module.haoka.controller.admin.product.vo.HaoKaProductRespVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
@ -22,6 +23,11 @@ public class OnSaleProductRespVO {
@ExcelProperty("产品")
private Long parentProductId;
@ExcelIgnore
@Schema(description = "产品", requiredMode = Schema.RequiredMode.REQUIRED)
private HaoKaProductRespVO parentProduct;
@Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("商品名称")
private String name;
@ -115,4 +121,4 @@ public class OnSaleProductRespVO {
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}
}

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.haoka.controller.admin.onsaleproduct.vo;
import com.mzt.logapi.starter.annotation.DiffLogField;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
@ -14,14 +15,17 @@ public class OnSaleProductSaveReqVO {
@Schema(description = "产品", requiredMode = Schema.RequiredMode.REQUIRED, example = "17875")
@NotNull(message = "产品不能为空")
@DiffLogField(name = "产品ID")
private Long parentProductId;
@Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "商品名称不能为空")
@DiffLogField(name = "商品名称")
private String name;
@Schema(description = "商家编码", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "商家编码不能为空")
@DiffLogField(name = "商家编码")
private String sku;
@Schema(description = "商品注意点")
@ -34,6 +38,7 @@ public class OnSaleProductSaveReqVO {
private String acceptanceRules;
@Schema(description = "结算要求")
@DiffLogField(name = "结算要求")
private String settlementRequirement;
@Schema(description = "佣金结算规则(内部)")
@ -44,6 +49,7 @@ public class OnSaleProductSaveReqVO {
private Boolean needSaleUploadImage;
@Schema(description = "产品主图")
@DiffLogField(name = "产品主图")
private String mainImg;
@Schema(description = "商品分享图")
@ -81,9 +87,10 @@ public class OnSaleProductSaveReqVO {
@Schema(description = "上架", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "上架不能为空")
@DiffLogField(name = "上架")
private Boolean onSale;
@Schema(description = "是否顶置")
private Boolean isTop;
}
}

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.haoka.controller.admin.product.vo;
import com.mzt.logapi.starter.annotation.DiffLogField;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
@ -15,14 +16,17 @@ public class HaoKaProductSaveReqVO {
@Schema(description = "运营商", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "运营商不能为空")
@DiffLogField(name = "运营商")
private Integer operator;
@Schema(description = "产品编码", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "产品编码不能为空")
@DiffLogField(name = "产品编码")
private String sku;
@Schema(description = "产品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
@NotEmpty(message = "产品名称不能为空")
@DiffLogField(name = "产品名称")
private String name;
@Schema(description = "产品类型", example = "21014")
@ -58,6 +62,7 @@ public class HaoKaProductSaveReqVO {
private Boolean enableStockLimit;
@Schema(description = "库存数量")
@DiffLogField(name = "库存数量")
private Integer stockNum;
@Schema(description = "库存报警数量")
@ -73,6 +78,7 @@ public class HaoKaProductSaveReqVO {
private String estimatedRevenue;
@Schema(description = "上架")
@DiffLogField(name = "上架")
private Boolean onSale;
@Schema(description = "是否顶置")

View File

@ -25,7 +25,7 @@ public class OnSaleProductDO extends BaseDO {
/**
* ID
*/
@TableId
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/**
* 产品
@ -126,4 +126,4 @@ public class OnSaleProductDO extends BaseDO {
*/
private Long deptId;
}
}

View File

@ -25,7 +25,7 @@ public class HaoKaProductDO extends BaseDO {
/**
* 产品ID
*/
@TableId(type = IdType.ASSIGN_ID)
@TableId
private Long id;
/**
* 运营商

View File

@ -1,5 +1,11 @@
package cn.iocoder.yudao.module.haoka.service.onsaleproduct;
import cn.iocoder.yudao.module.haoka.controller.admin.product.vo.HaoKaProductSaveReqVO;
import cn.iocoder.yudao.module.haoka.enums.LogRecordConstants;
import cn.iocoder.yudao.module.haoka.utils.SnowflakeId;
import com.mzt.logapi.context.LogRecordContext;
import com.mzt.logapi.service.impl.DiffParseFunction;
import com.mzt.logapi.starter.annotation.LogRecord;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@ -30,21 +36,37 @@ public class OnSaleProductServiceImpl implements OnSaleProductService {
private OnSaleProductMapper onSaleProductMapper;
@Override
@LogRecord(type = LogRecordConstants.HAOKA_SALE_PRODUCT,
subType = LogRecordConstants.HAOKA_UPDATE,
bizNo = "{{#create.id}}",
success = LogRecordConstants.HAOKA_SALE_PRODUCT_CREATE_SUCCESS)
public Long createOnSaleProduct(OnSaleProductSaveReqVO createReqVO) {
// 插入
OnSaleProductDO onSaleProduct = BeanUtils.toBean(createReqVO, OnSaleProductDO.class);
onSaleProductMapper.insert(onSaleProduct);
onSaleProduct.setId(SnowflakeId.generate());
// 日志
LogRecordContext.putVariable("create",onSaleProduct);
// 返回
return onSaleProduct.getId();
}
@Override
@LogRecord(type = LogRecordConstants.HAOKA_SALE_PRODUCT,
subType = LogRecordConstants.HAOKA_UPDATE,
bizNo = "{{#updateReqVO.id}}",
success = LogRecordConstants.HAOKA_SALE_PRODUCT_UPDATE_SUCCESS)
public void updateOnSaleProduct(OnSaleProductSaveReqVO updateReqVO) {
// 校验存在
validateOnSaleProductExists(updateReqVO.getId());
// 更新
OnSaleProductDO updateObj = BeanUtils.toBean(updateReqVO, OnSaleProductDO.class);
OnSaleProductDO old = onSaleProductMapper.selectById(updateObj.getId());
onSaleProductMapper.updateById(updateObj);
LogRecordContext.putVariable(DiffParseFunction.OLD_OBJECT, BeanUtils.toBean(old, OnSaleProductSaveReqVO.class));
LogRecordContext.putVariable("old", old);
}
@Override
@ -71,4 +93,4 @@ public class OnSaleProductServiceImpl implements OnSaleProductService {
return onSaleProductMapper.selectPage(pageReqVO);
}
}
}

View File

@ -1,7 +1,13 @@
package cn.iocoder.yudao.module.haoka.service.product;
import cn.iocoder.yudao.module.haoka.utils.SnowflakeId;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.haoka.enums.LogRecordConstants;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mzt.logapi.context.LogRecordContext;
import com.mzt.logapi.service.impl.DiffParseFunction;
import com.mzt.logapi.starter.annotation.LogRecord;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@ -13,7 +19,6 @@ import cn.iocoder.yudao.module.haoka.controller.admin.product.vo.*;
import cn.iocoder.yudao.module.haoka.dal.dataobject.product.HaoKaProductDO;
import cn.iocoder.yudao.module.haoka.dal.dataobject.superiorproductconfig.SuperiorProductConfigDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.haoka.dal.mysql.product.HaoKaProductMapper;
@ -29,6 +34,7 @@ import static cn.iocoder.yudao.module.haoka.enums.ErrorCodeConstants.*;
*/
@Service
@Validated
@Slf4j
public class HaoKaProductServiceImpl extends ServiceImpl<HaoKaProductMapper, HaoKaProductDO> implements HaoKaProductService {
@Resource
@ -37,15 +43,25 @@ public class HaoKaProductServiceImpl extends ServiceImpl<HaoKaProductMapper, Hao
private SuperiorProductConfigMapper superiorProductConfigMapper;
@Override
@LogRecord(type = LogRecordConstants.HAOKA_PRODUCT,
subType = LogRecordConstants.HAOKA_CREATE,
bizNo = "{{#haoKaProduct.id}}",
success = LogRecordConstants.HAOKA_PRODUCT_CREATE_SUCCESS)
public Long createHaoKaProduct(HaoKaProductSaveReqVO createReqVO) {
// 插入
HaoKaProductDO haoKaProduct = BeanUtils.toBean(createReqVO, HaoKaProductDO.class);
haoKaProduct.setId(SnowflakeId.generate());
haoKaProductMapper.insert(haoKaProduct);
// 返回
// 日志
LogRecordContext.putVariable("haoKaProduct",haoKaProduct);
return haoKaProduct.getId();
}
@Override
@LogRecord(type = LogRecordConstants.HAOKA_PRODUCT,
subType = LogRecordConstants.HAOKA_UPDATE,
bizNo = "{{#updateReqVO.id}}",
success = LogRecordConstants.HAOKA_PRODUCT_UPDATE_SUCCESS)
public void updateHaoKaProduct(HaoKaProductSaveReqVO updateReqVO) {
// 校验存在
validateHaoKaProductExists(updateReqVO.getId());
@ -63,7 +79,11 @@ public class HaoKaProductServiceImpl extends ServiceImpl<HaoKaProductMapper, Hao
throw new IllegalArgumentException("该产品未配置自动生产模块,请先配置自动生产!");
}
}
HaoKaProductDO old = haoKaProductMapper.selectById(updateReqVO.getId());
haoKaProductMapper.updateById(updateObj);
LogRecordContext.putVariable(DiffParseFunction.OLD_OBJECT, BeanUtils.toBean(old, HaoKaProductSaveReqVO.class));
LogRecordContext.putVariable("old", old);
}
@Override