商品模块代码提交

This commit is contained in:
Tankaikai
2025-02-24 14:07:42 +08:00
parent e09b55938f
commit 2d8f120303
15 changed files with 901 additions and 3 deletions

View File

@@ -0,0 +1,126 @@
package com.czg.product.dto;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* 耗材库存变动记录
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-02-21
*/
@Data
public class ConsStockFlowDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
private Long id;
/**
* 店铺id
*/
private Long shopId;
/**
* 供应商id
*/
private Long vendorId;
/**
* 出入库类型 in-入库 out-出库
*/
private String inOutType;
/**
* 出入库名目 manual-in:手动入库 manual-out:手动出库 win-in:盘盈入库 loss-out:盘亏出库 order-in:订单退款入库 order-out:订单消费出库
*/
private String inOutItem;
/**
* 出入库日期
*/
private LocalDate inOutDate;
/**
* 应付金额
*/
private BigDecimal amountPayable;
/**
* 实付金额
*/
private BigDecimal actualPaymentAmount;
/**
* 付款日期
*/
private LocalDate paymentDate;
/**
* 批次号
*/
private String batchNo;
/**
* 耗材名称
*/
private String conName;
/**
* 采购价/进价
*/
private BigDecimal purchasePrice;
/**
* 耗材id
*/
private Long conId;
/**
* 单位
*/
private String unitName;
/**
* 变动前的库存
*/
private BigDecimal beforeNumber;
/**
* 出入库数量
*/
private BigDecimal inOutNumber;
/**
* 变动后的库存
*/
private BigDecimal afterNumber;
/**
* 小计
*/
private BigDecimal subTotal;
/**
* 商品id
*/
private Long productId;
/**
* sku id
*/
private Long skuId;
/**
* 商品订单id
*/
private Long orderId;
/**
* 创建人id
*/
private Long createUserId;
/**
* 创建人name
*/
private String createUserName;
/**
* 创建时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,130 @@
package com.czg.product.entity;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* 耗材库存变动记录
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-02-21
*/
@Data
@Table("tb_cons_stock_flow")
public class ConsStockFlow implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
@Id(keyType = KeyType.Auto)
private Long id;
/**
* 店铺id
*/
private Long shopId;
/**
* 供应商id
*/
private Long vendorId;
/**
* 出入库类型 in-入库 out-出库
*/
private String inOutType;
/**
* 出入库名目 manual-in:手动入库 manual-out:手动出库 win-in:盘盈入库 loss-out:盘亏出库 order-in:订单退款入库 order-out:订单消费出库
*/
private String inOutItem;
/**
* 出入库日期
*/
private LocalDate inOutDate;
/**
* 应付金额
*/
private BigDecimal amountPayable;
/**
* 实付金额
*/
private BigDecimal actualPaymentAmount;
/**
* 付款日期
*/
private LocalDate paymentDate;
/**
* 批次号
*/
private String batchNo;
/**
* 耗材id
*/
private Long conId;
/**
* 耗材名称
*/
private String conName;
/**
* 采购价/进价
*/
private BigDecimal purchasePrice;
/**
* 单位
*/
private String unitName;
/**
* 变动前的库存
*/
private BigDecimal beforeNumber;
/**
* 出入库数量
*/
private BigDecimal inOutNumber;
/**
* 变动后的库存
*/
private BigDecimal afterNumber;
/**
* 小计
*/
private BigDecimal subTotal;
/**
* 商品id
*/
private Long productId;
/**
* sku id
*/
private Long skuId;
/**
* 商品订单id
*/
private Long orderId;
/**
* 创建人id
*/
private Long createUserId;
/**
* 创建人name
*/
private String createUserName;
/**
* 创建时间
*/
@Column(onInsertValue = "now()")
private LocalDateTime createTime;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,50 @@
package com.czg.product.enums;
/**
* 出入库名目枚举
*
* @author tankaikai
* @since 2025-02-24 09:54
*/
public enum InOutItemEnum {
/**
* 手动入库
*/
MANUAL_IN("manual-in"),
/**
* 手动出库
*/
MANUAL_OUT("manual-out"),
/**
* 盘盈入库
*/
WIN_IN("win-in"),
/**
* 盘亏出库
*/
LOSS_OUT("loss-out"),
/**
* 订单退款入库
*/
ORDER_IN("order-in"),
/**
* 订单消费出库
*/
ORDER_OUT("order-out");
private String value;
InOutItemEnum(String value) {
this.value = value;
}
public String value() {
return this.value;
}
}

View File

@@ -0,0 +1,30 @@
package com.czg.product.enums;
/**
* 出入库类型枚举
*
* @author tankaikai
* @since 2025-02-24 09:54
*/
public enum InOutTypeEnum {
/**
* 入库
*/
IN("in"),
/**
* 出库
*/
OUT("out");
private String value;
InOutTypeEnum(String value) {
this.value = value;
}
public String value() {
return this.value;
}
}

View File

@@ -0,0 +1,58 @@
package com.czg.product.param;
import com.czg.validator.group.DefaultGroup;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 库存盘点入参
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-02-20
*/
@Data
public class ConsCheckStockParam implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 耗材id
*/
@NotNull(message = "耗材id不能为空", groups = DefaultGroup.class)
private Long conId;
/**
* 耗材名称
*/
@NotBlank(message = "耗材名称不能为空", groups = DefaultGroup.class)
private String conName;
/**
* 账存数量
*/
@NotNull(message = "账存数量不能为空", groups = DefaultGroup.class)
private BigDecimal stockNumber;
/**
* 实际数量
*/
@NotNull(message = "实际数量不能为空", groups = DefaultGroup.class)
private BigDecimal actualNumber;
/**
* 盈亏数量
*/
@NotNull(message = "盈亏数量不能为空", groups = DefaultGroup.class)
private BigDecimal winLossNumber;
/**
* 单价
*/
@NotNull(message = "单价不能为空", groups = DefaultGroup.class)
private BigDecimal price;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,56 @@
package com.czg.product.param;
import com.czg.validator.group.DefaultGroup;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 出入库耗材入参
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-02-20
*/
@Data
public class ConsInOutStockBodyParam implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 耗材id
*/
@NotNull(message = "耗材id不能为空", groups = DefaultGroup.class)
private String conId;
/**
* 耗材名称
*/
@NotBlank(message = "耗材名称不能为空", groups = DefaultGroup.class)
private String conName;
/**
* 采购价/进价
*/
@NotNull(message = "进价不能为空", groups = DefaultGroup.class)
private BigDecimal purchasePrice;
/**
* 单位
*/
@NotBlank(message = "单位不能为空", groups = DefaultGroup.class)
private String unitName;
/**
* 出入库数量
*/
@NotNull(message = "数量不能为空", groups = DefaultGroup.class)
@Min(value = 0, message = "数量不能小于0")
private BigDecimal inOutNumber;
/**
* 小计
*/
@NotNull(message = "小计不能为空", groups = DefaultGroup.class)
private BigDecimal subTotal;
}

View File

@@ -0,0 +1,60 @@
package com.czg.product.param;
import com.alibaba.fastjson2.annotation.JSONField;
import com.czg.validator.group.DefaultGroup;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
/**
* 出入库入参
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-02-20
*/
@Data
public class ConsInOutStockHeadParam implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 供应商id
*/
private Long vendorId;
/**
* 出入库日期
*/
@NotNull(message = "出入库日期不能为空", groups = DefaultGroup.class)
@JSONField(format = "yyyy-MM-dd")
private LocalDate inOutDate;
/**
* 应付金额
*/
private BigDecimal amountPayable;
/**
* 实付金额
*/
private BigDecimal actualPaymentAmount;
/**
* 付款日期
*/
private LocalDate paymentDate;
/**
* 批次号
*/
private String batchNo;
/**
* 备注
*/
private String remark;
/**
* 耗材明细列表
*/
List<ConsInOutStockBodyParam> bodyList;
}

View File

@@ -0,0 +1,49 @@
package com.czg.product.service;
import com.czg.product.entity.ConsStockFlow;
import com.czg.product.param.ConsCheckStockParam;
import com.czg.product.param.ConsInOutStockHeadParam;
import com.czg.product.vo.ConsCheckStockRecordVo;
import com.mybatisflex.core.service.IService;
import java.util.List;
/**
* 耗材库存变动记录
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-02-21
*/
public interface ConsStockFlowService extends IService<ConsStockFlow> {
/**
* 手动入库
*
* @param param 手动出库入参
*/
void inStock(ConsInOutStockHeadParam param);
/**
* 手动出库
*
* @param param 手动出库入参
*/
void outStock(ConsInOutStockHeadParam param);
/**
* 库存盘点
*
* @param param 库存盘点入参
*/
void checkStock(ConsCheckStockParam param);
/**
* 获取盘点记录
*
* @param conId 耗材id
* @return 盘点记录列表
*/
List<ConsCheckStockRecordVo> getCheckStockRecordList(Long conId);
}

View File

@@ -0,0 +1,73 @@
package com.czg.product.vo;
import cn.hutool.core.util.NumberUtil;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 库存盘点记录
*
* @author tankaikai
* @since 2025-02-24 13:40
*/
@Data
public class ConsCheckStockRecordVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 耗材id
*/
private Long conId;
/**
* 耗材名称
*/
private String conName;
/**
* 单价
*/
private BigDecimal purchasePrice;
/**
* 账存数量
*/
private BigDecimal beforeNumber;
/**
* 盈亏数量
*/
private BigDecimal inOutNumber;
/**
* 盘点后的数量
*/
@JSONField(serialize = false)
private BigDecimal afterNumber;
/**
* 盈亏金额
*/
private BigDecimal winLossAmount;
/**
* 实际库存
*/
private BigDecimal actualNumber;
/**
* 盘点时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
* 备注
*/
private String remark;
public BigDecimal getWinLossAmount() {
return NumberUtil.mul(purchasePrice, purchasePrice);
}
public BigDecimal getActualNumber() {
return afterNumber;
}
}

View File

@@ -19,7 +19,7 @@ public class ShopProductSkuInfoVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* id
* sku-id
*/
private Long id;
/**