🆕 重新定义数据表

This commit is contained in:
my_ong 2024-12-06 12:55:34 +08:00
parent 722abb3abf
commit 47100b8e20
38 changed files with 772 additions and 259 deletions

View File

@ -8,15 +8,24 @@ import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.nutz.lang.Strings;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import tech.riemann.ims.dto.request.ApplyInfo;
import tech.riemann.ims.entity.Inventory.ApplyDetail;
import tech.riemann.ims.entity.Inventory.ApplyForm;
import tech.riemann.ims.entity.material.ApplyDetail;
import tech.riemann.ims.entity.material.ApplyForm;
import tech.riemann.ims.entity.material.Material;
import tech.riemann.ims.entity.material.MaterialStockDetail;
import tech.riemann.ims.enums.ApplyTypeEnum;
import tech.riemann.ims.enums.StockStatusEnum;
import tech.riemann.ims.service.material.IApplyDetailService;
import tech.riemann.ims.service.material.IApplyFormService;
import tech.riemann.ims.service.material.IMaterialService;
import tech.riemann.ims.service.material.IMaterialStockDetailService;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author mayong
@ -29,6 +38,8 @@ public class ApplyFormController {
private final IApplyFormService applyFormService;
private final IApplyDetailService applyDetailService;
private final IMaterialStockDetailService materialStockDetailService;
private final IMaterialService materialService;
@GetMapping("apply")
@Operation(summary = "分页查询申请单列表")
@ -55,15 +66,54 @@ public class ApplyFormController {
}
@PutMapping("apply")
@Operation(summary = "增加/编辑申请单")
public void saveOrUpdateApply(@Validated @Parameter(description = "申请单") @RequestBody ApplyInfo applyInfo) {
if (applyInfo.getApplyForm().getId() == null || applyInfo.getApplyForm().getId() <= 0) {
applyFormService.save(applyInfo.getApplyForm());
applyInfo.getApplyDetails().forEach(detail -> detail.setApplyId(applyInfo.getApplyForm().getId()));
applyDetailService.saveBatch(applyInfo.getApplyDetails());
} else {
// TODO 更新申请单
@Operation(summary = "提交申请单")
@Transactional(rollbackFor = Exception.class)
public void saveApply(@Validated @Parameter(description = "申请单") @RequestBody ApplyInfo applyInfo) {
// 如果是采购入库 就新增数据否则只改状态
ApplyTypeEnum applyType = applyInfo.getApplyForm().getType();
// 校验物料数量
Map<Long, Integer> confirmMap = applyInfo.getApplyDetails().stream()
.collect(Collectors.toMap(ApplyDetail::getMaterialId, ApplyDetail::getConfirmQuantity));
Map<Long, Long> dataMap = applyInfo.getDetailList().stream()
.collect(Collectors.groupingBy(MaterialStockDetail::getMaterialId, Collectors.counting()));
confirmMap.forEach((k, v) -> {
Long l = dataMap.get(k);
if(l == null || l.intValue() != v){
throw new IllegalArgumentException("["+k+"]物料数量不匹配");
}
});
// 新增申请单
applyFormService.save(applyInfo.getApplyForm());
for (ApplyDetail applyDetail : applyInfo.getApplyDetails()) {
applyDetail.setApplyId(applyInfo.getApplyForm().getId());
}
applyDetailService.saveBatch(applyInfo.getApplyDetails());
if (applyType == ApplyTypeEnum.PURCHASE_RECEIPT) {
// 新增物料
applyInfo.getDetailList().forEach(detail -> {
detail.setApplyId(applyInfo.getApplyForm().getId());
detail.setStatus(StockStatusEnum.IN);
});
materialStockDetailService.saveBatch(applyInfo.getDetailList());
//记录物料库存数据
confirmMap.forEach((key, value) -> materialService.update(Wrappers.<Material>lambdaUpdate().set(Material::getStock, value)
.eq(Material::getId, key)));
}
else if(applyType == ApplyTypeEnum.LOAN_OUT || applyType == ApplyTypeEnum.RETURN_RECEIPT) {
//修改物料状态
applyInfo.getDetailList().forEach(detail -> materialStockDetailService.update(Wrappers.<MaterialStockDetail>lambdaUpdate()
.set(MaterialStockDetail::getMaterialId, applyType ==ApplyTypeEnum.RETURN_RECEIPT
? StockStatusEnum.IN : StockStatusEnum.OUT)
.eq(MaterialStockDetail::getBarcode, detail.getBarcode())));
//修改物料库存数据
confirmMap.forEach((key, value) -> materialService.update(Wrappers.<Material>lambdaUpdate()
.setSql(applyType == ApplyTypeEnum.LOAN_OUT,"m_stock = m_stock - " + value)
.setSql(applyType == ApplyTypeEnum.RETURN_RECEIPT,"m_stock = m_stock + " + value)
.eq(Material::getId, key)));
}
}
}

View File

@ -13,7 +13,7 @@ import org.nutz.lang.random.R;
import org.springframework.http.HttpStatus;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import tech.riemann.ims.entity.Inventory.Material;
import tech.riemann.ims.entity.material.Material;
import tech.riemann.ims.service.material.IMaterialService;
import java.util.List;

View File

@ -1,11 +1,13 @@
package tech.riemann.ims.dto.request;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import tech.riemann.ims.entity.Inventory.ApplyDetail;
import tech.riemann.ims.entity.Inventory.ApplyForm;
import tech.riemann.ims.entity.material.ApplyDetail;
import tech.riemann.ims.entity.material.ApplyForm;
import tech.riemann.ims.entity.material.MaterialStockDetail;
import java.util.List;
@ -19,7 +21,13 @@ import java.util.List;
@NoArgsConstructor
public class ApplyInfo {
@Schema(description = "申请单")
private ApplyForm applyForm;
@Schema(description = "申请单明细")
private List<ApplyDetail> applyDetails;
@Schema(description = "扫码的条码集合")
private List<MaterialStockDetail> detailList;
}

View File

@ -1,74 +0,0 @@
package tech.riemann.ims.entity.Inventory;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import lombok.experimental.FieldNameConstants;
import lombok.experimental.SuperBuilder;
import org.nutz.dao.entity.annotation.*;
import tech.riemann.ims.entity.IdBaseEntity;
import java.io.Serial;
import java.util.Date;
/**
* @author mayong
* @since 2024/11/26 16:53
*/
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@FieldNameConstants
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("t_apply_form")
@Table("t_apply_form")
@Comment("入库/出库 申请单")
@Schema(name = "ApplyForm", description = "入库/出库 申请单")
public class ApplyForm extends IdBaseEntity {
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "类型", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("af_type")
@Column("af_type")
@Comment("类型")
@ColDefine(type = ColType.INT)
private Integer type; // 1: 采购入库 2: 归还入库 3: 出库外借
@Schema(description = "申请人", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("af_applicant")
@Column("af_applicant")
@Comment("申请人")
@ColDefine(notNull = false, width = 128, precision = 0)
private String applicant;
@Schema(description = "申请日期", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("af_apply_date")
@Column("af_apply_date")
@Comment("申请日期")
@ColDefine(type = ColType.DATE, notNull = false, width = 128, precision = 0)
private Date applyDate;
@Schema(description = "是否确认", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("af_is_confirm")
@Column("af_is_confirm")
@Comment("是否确认")
@ColDefine(type = ColType.BOOLEAN, notNull = false, width = 128, precision = 0)
private Boolean isConfirm; // 0: 未确认 1: 已确认
@Schema(description = "异常说明", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("af_remark")
@Column("af_remark")
@Comment("异常说明")
@ColDefine(type = ColType.TEXT, notNull = false, width = 128, precision = 0)
private String exceptionExplain; // 异常说明
}

View File

@ -1,109 +0,0 @@
package tech.riemann.ims.entity.Inventory;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import lombok.experimental.FieldNameConstants;
import lombok.experimental.SuperBuilder;
import org.nutz.dao.entity.annotation.*;
import tech.riemann.ims.entity.IdBaseEntity;
import java.io.Serial;
/**
* @author mayong
* @since 2024/11/26 17:51
*/
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@FieldNameConstants
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("t_stocktaking")
@Table("t_stocktaking")
@Comment("盘点表")
@Schema(name = "Stocktaking", description = "盘点表")
public class Stocktaking extends IdBaseEntity {
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "盘点key", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("s_key")
@Column("s_key")
@Comment("盘点key")
@ColDefine(notNull = false, width = 128, precision = 0)
private String key;
@Schema(description = "盘点类型", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("s_type")
@Column("s_type")
@Comment("盘点类型(0-全部盘点 1-部分盘点)")
@ColDefine(type = ColType.INT)
private Integer type; // 盘点类型 0-全部盘点 1-部分盘点
@Schema(description = "盘点日期", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("s_date")
@Column("s_date")
@Comment("盘点日期")
@ColDefine(notNull = false, width = 128, precision = 0)
private String date;
@Schema(description = "盘点人", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("s_operator")
@Column("s_operator")
@Comment("盘点人")
@ColDefine(notNull = false, width = 128, precision = 0)
private String operator;
@Schema(description = "盘点审核人", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("s_reviewer")
@Column("s_reviewer")
@Comment("盘点审核人")
@ColDefine(type = ColType.VARCHAR,notNull = false, width = 128, precision = 0)
private String reviewer;
@Schema(description = "盘点任务状态", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("s_status")
@Column("s_status")
@Comment("盘点任务状态(0-未开始 1-进行中 2-已完成)")
@ColDefine(type = ColType.INT)
private Integer status; // 盘点任务状态 0-未开始 1-进行中 2-已完成
@Schema(description = "盘点结果(系统自动生成)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("s_result")
@Column("s_result")
@Comment("盘点结果(系统自动生成)")
@ColDefine(notNull = false, width = 128, precision = 0)
private String result;
@Schema(description = "盘点审核结果", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("s_review_result")
@Column("s_review_result")
@Comment("盘点审核结果(0-通过 1-不通过 2-待审核 3-退回重新盘点)")
@ColDefine(type = ColType.VARCHAR,notNull = false, width = 128, precision = 0)
private String reviewResult; // 盘点审核结果 0-通过 1-不通过 2-待审核 3-退回重新盘点
@Schema(description = "盘点异常情况说明", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("s_exception")
@Column("s_exception")
@Comment("盘点异常情况说明")
@ColDefine(type = ColType.VARCHAR,notNull = false, width = 128, precision = 0)
private String exception;
@Schema(description = "异常情况处理方式", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("s_exception_handle")
@Column("s_exception_handle")
@Comment("异常情况处理方式(0-无需处理 1-忽略并修改库存 2-补充库存 3-其他)")
@ColDefine(type = ColType.VARCHAR,notNull = false, width = 128, precision = 0)
private String exceptionHandle; // 异常情况处理方式 0-无需处理 1-忽略并修改库存 2-补充库存 3-其他
}

View File

@ -1,4 +1,4 @@
package tech.riemann.ims.entity.Inventory;
package tech.riemann.ims.entity.material;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;

View File

@ -0,0 +1,116 @@
package tech.riemann.ims.entity.material;
import club.zhcs.lina.utils.enums.Codebook;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import lombok.experimental.FieldNameConstants;
import lombok.experimental.SuperBuilder;
import org.nutz.dao.entity.annotation.*;
import org.nutz.json.JsonField;
import tech.riemann.ims.entity.IdBaseEntity;
import tech.riemann.ims.enums.ApplyTypeEnum;
import tech.riemann.ims.enums.AuditTypeEnum;
import tech.riemann.ims.enums.HandleEnum;
import java.io.Serial;
import java.time.LocalDateTime;
import java.util.Optional;
/**
* @author mayong
* @since 2024/11/26 16:53
*/
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@FieldNameConstants
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("t_apply_form")
@Table("t_apply_form")
@Comment("入库/出库/盘点 申请单")
@Schema(name = "ApplyForm", description = "入库/出库/盘点 申请单")
public class ApplyForm extends IdBaseEntity {
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "类型1: 采购入库申请 2: 归还入库申请 3: 出库外借申请 4: 盘点申请)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("af_type")
@Column("af_type")
@Comment("类型")
@ColDefine(type = ColType.INT)
private ApplyTypeEnum type;
@Schema(description = "盘点类型1: 全盘 2: 部分盘点)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("af_audit_type")
@Column("af_audit_type")
@Comment("盘点类型")
@ColDefine(type = ColType.INT)
private AuditTypeEnum auditType;
@Schema(description = "申请人", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("af_applicant")
@Column("af_applicant")
@Comment("申请人")
@ColDefine(notNull = false, width = 128, precision = 0)
private String applicant;
@Schema(description = "申请日期", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("af_apply_date")
@Column("af_apply_date")
@Comment("申请日期")
@ColDefine(type = ColType.DATE, notNull = false, width = 128, precision = 0)
private LocalDateTime applyDate;
@Schema(description = "是否确认0: 未确认 1: 已确认)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("af_is_confirm")
@Column("af_is_confirm")
@Comment("是否确认")
@ColDefine(type = ColType.BOOLEAN, notNull = false, width = 128, precision = 0)
private Boolean isConfirm;
@Schema(description = "结果(系统自动生成)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("af_result")
@Column("af_result")
@Comment("结果(系统自动生成)")
@ColDefine(notNull = false, width = 512, precision = 0)
private String result;
@Schema(description = "异常原因", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("af_exception")
@Column("af_exception")
@Comment("异常原因")
@ColDefine(type = ColType.VARCHAR, notNull = false, width = 512, precision = 0)
private String exception;
@Schema(description = "处理方式(0-无需处理 1-忽略并修改库存 2-补充库存 3-其他)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("s_exception_handle")
@Column("s_exception_handle")
@Comment("处理方式(0-无需处理 1-忽略并修改库存 2-补充库存 3-其他)")
@ColDefine(type = ColType.VARCHAR, notNull = false, width = 128, precision = 0)
private HandleEnum handle;
@JsonField
public Codebook getTypeInfo() {
return Optional.of(getType()).orElse(ApplyTypeEnum.PURCHASE_RECEIPT).build();
}
@JsonField
public Codebook getAuditTypeInfo() {
return Optional.of(getAuditType()).orElse(AuditTypeEnum.ALL).build();
}
@JsonField
public Codebook getHandleInfo() {
return Optional.of(getHandle()).orElse(HandleEnum.NO_ACTION).build();
}
}

View File

@ -1,5 +1,6 @@
package tech.riemann.ims.entity.Inventory;
package tech.riemann.ims.entity.material;
import club.zhcs.lina.utils.enums.Codebook;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
@ -11,9 +12,12 @@ import lombok.experimental.Accessors;
import lombok.experimental.FieldNameConstants;
import lombok.experimental.SuperBuilder;
import org.nutz.dao.entity.annotation.*;
import org.nutz.json.JsonField;
import tech.riemann.ims.entity.IdBaseEntity;
import tech.riemann.ims.enums.AssignRuleEnum;
import java.io.Serial;
import java.util.Optional;
@Data
@SuperBuilder
@ -45,12 +49,12 @@ public class Material extends IdBaseEntity {
@ColDefine(notNull = false, width = 128, precision = 0)
private String name;
@Schema(description = "赋码规则", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@Schema(description = "赋码规则(0-低值易耗品(不参与赋码) 1-高价值工具类(参与唯一赋码)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("m_assign_rule")
@Column("m_assign_rule")
@Comment("赋码规则(0-低值易耗品(不参与赋码) 1-高价值工具类(参与唯一赋码))")
@Comment("赋码规则")
@ColDefine(notNull = false, type = ColType.INT)
private Integer assignRule; // 0-低值易耗品不参与赋码 1-高价值工具类参与唯一赋码
private AssignRuleEnum assignRule; // 0-低值易耗品不参与赋码 1-高价值工具类参与唯一赋码
@Schema(description = "类型", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("m_type")
@ -81,4 +85,9 @@ public class Material extends IdBaseEntity {
@ColDefine(notNull = false, width = 500, precision = 0)
private String description;
@JsonField
public Codebook getAssignRuleInfo() {
return Optional.of(getAssignRule()).orElse(AssignRuleEnum.LOW_VALUE).build();
}
}

View File

@ -1,8 +1,9 @@
package tech.riemann.ims.entity.Inventory;
package tech.riemann.ims.entity.material;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -10,14 +11,20 @@ import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import lombok.experimental.FieldNameConstants;
import lombok.experimental.SuperBuilder;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.entity.annotation.ColDefine;
import org.nutz.dao.entity.annotation.Column;
import org.nutz.dao.entity.annotation.Comment;
import org.nutz.dao.entity.annotation.Table;
import tech.riemann.ims.entity.IdBaseEntity;
import java.io.Serial;
/**
* @author mayong
* @since 2024/11/26 16:39
* 物料库条码配置表
*
* @author mayong)
*
* @since 2024-12-06 10:32:29
*/
@Data
@SuperBuilder
@ -30,23 +37,22 @@ import java.io.Serial;
@Table("t_material_barcode_config")
@Comment("物料库条码配置表")
@Schema(name = "MaterialBarcodeConfig", description = "物料库条码配置表")
public class MaterialBarcodeConfig extends IdBaseEntity {
public class MaterialBarcodeConfig extends IdBaseEntity{
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "物料Key", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@Schema(description = "物料Key", requiredMode = RequiredMode.NOT_REQUIRED)
@TableField("mbc_material_key")
@Column("mbc_material_key")
@Comment("物料Key")
@ColDefine(notNull = false, width = 128, precision = 0)
private String materialKey;
private String mbcMaterialKey;
@Schema(description = "最新编码位置", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@Schema(description = "最新编码位置", requiredMode = RequiredMode.NOT_REQUIRED)
@TableField("mbc_latest_location")
@Column("mbc_latest_location")
@Comment("最新编码位置")
@ColDefine(notNull = false, type = ColType.INT)
private Integer latestLocation;
}
@ColDefine(notNull = false, width = 19, precision = 0)
private Long mbcLatestLocation;
}

View File

@ -1,8 +1,10 @@
package tech.riemann.ims.entity.Inventory;
package tech.riemann.ims.entity.material;
import club.zhcs.lina.utils.enums.Codebook;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -14,13 +16,19 @@ import org.nutz.dao.entity.annotation.ColDefine;
import org.nutz.dao.entity.annotation.Column;
import org.nutz.dao.entity.annotation.Comment;
import org.nutz.dao.entity.annotation.Table;
import org.nutz.json.JsonField;
import tech.riemann.ims.entity.IdBaseEntity;
import tech.riemann.ims.enums.StockStatusEnum;
import java.io.Serial;
import java.util.Optional;
/**
* @author mayong
* @since 2024/11/26 17:21
* 物料明细数据表
*
* @author mayong)
*
* @since 2024-12-06 10:32:29
*/
@Data
@SuperBuilder
@ -33,31 +41,41 @@ import java.io.Serial;
@Table("t_material_stock_detail")
@Comment("物料明细数据表")
@Schema(name = "MaterialStockDetail", description = "物料明细数据表")
public class MaterialStockDetail extends IdBaseEntity {
public class MaterialStockDetail extends IdBaseEntity{
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "物料Key", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@TableField("msd_material_key")
@Column("msd_material_key")
@Comment("物料Key")
@ColDefine(notNull = false, width = 128, precision = 0)
private String materialKey;
@Schema(description = "物料ID", requiredMode = RequiredMode.NOT_REQUIRED)
@TableField("msd_material_id")
@Column("msd_material_id")
@Comment("物料ID")
@ColDefine(notNull = false)
private Long materialId;
@Schema(description = "条码", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@Schema(description = "条码", requiredMode = RequiredMode.NOT_REQUIRED)
@TableField("msd_barcode")
@Column("msd_barcode")
@Comment("条码")
@ColDefine(notNull = false, width = 128, precision = 0)
private String barcode;
@Schema(description = "状态", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@Schema(description = "入库申请单", requiredMode = RequiredMode.NOT_REQUIRED)
@TableField("msd_apply_id")
@Column("msd_apply_id")
@Comment("入库申请单")
@ColDefine(notNull = false)
private Long applyId;
@Schema(description = "状态", requiredMode = RequiredMode.NOT_REQUIRED)
@TableField("msd_status")
@Column("msd_status")
@Comment("状态")
@ColDefine(notNull = false, width = 128, precision = 0)
private String status; // 状态 0-在库 1-外借 2-报废
private StockStatusEnum status;
}
@JsonField
public Codebook getStatusInfo() {
return Optional.of(getStatus()).orElse(StockStatusEnum.IN).build();
}
}

View File

@ -0,0 +1,65 @@
package tech.riemann.ims.entity.material;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import lombok.experimental.FieldNameConstants;
import lombok.experimental.SuperBuilder;
import org.nutz.dao.entity.annotation.ColDefine;
import org.nutz.dao.entity.annotation.Column;
import org.nutz.dao.entity.annotation.Comment;
import org.nutz.dao.entity.annotation.Table;
import tech.riemann.ims.entity.IdBaseEntity;
import java.io.Serial;
/**
* 盘点审核表
*
* @author mayong)
*
* @since 2024-12-06 10:32:29
*/
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@FieldNameConstants
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("t_stocktaking_audit")
@Table("t_stocktaking_audit")
@Comment("盘点审核表")
@Schema(name = "StocktakingAudit", description = "盘点审核表")
public class StocktakingAudit extends IdBaseEntity{
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "申请单id", requiredMode = RequiredMode.NOT_REQUIRED)
@TableField("s_apply_id")
@Column("s_apply_id")
@Comment("申请单id")
@ColDefine(notNull = false, width = 10, precision = 0)
private Integer applyId;
@Schema(description = "盘点审核人", requiredMode = RequiredMode.NOT_REQUIRED)
@TableField("s_reviewer")
@Column("s_reviewer")
@Comment("盘点审核人")
@ColDefine(notNull = false, width = 128, precision = 0)
private String reviewer;
@Schema(description = "盘点审核结果(0-通过 1-不通过 2-待审核 3-退回重新盘点)", requiredMode = RequiredMode.NOT_REQUIRED)
@TableField("s_review_result")
@Column("s_review_result")
@Comment("盘点审核结果(0-通过 1-不通过 2-待审核 3-退回重新盘点)")
@ColDefine(notNull = false, width = 128, precision = 0)
private String reviewResult;
}

View File

@ -0,0 +1,25 @@
package tech.riemann.ims.enums;
import club.zhcs.lina.utils.enums.ICodeBook;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author mayong
* @since 2024/12/6 9:26
*/
@Getter
@AllArgsConstructor
public enum ApplyTypeEnum implements ICodeBook {
PURCHASE_RECEIPT("1", "采购入库申请"),
RETURN_RECEIPT("2", "归还入库申请"),
LOAN_OUT("3", "外借出库申请"),
AUDIT("4", "盘点申请"),
;
@EnumValue
final String code;
final String description;
}

View File

@ -0,0 +1,21 @@
package tech.riemann.ims.enums;
import club.zhcs.lina.utils.enums.ICodeBook;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author mayong
* @since 2024/12/6 9:15
*/
@Getter
@AllArgsConstructor
public enum AssignRuleEnum implements ICodeBook {
LOW_VALUE("0", "低值易耗品(不参与赋码)"),
HIGH_VALUE("1", "高价值工具类(参与唯一赋码)");
@EnumValue
final String code;
final String description;
}

View File

@ -0,0 +1,23 @@
package tech.riemann.ims.enums;
import club.zhcs.lina.utils.enums.ICodeBook;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author mayong
* @since 2024/12/6 9:26
*/
@Getter
@AllArgsConstructor
public enum AuditTypeEnum implements ICodeBook {
ALL("1", "全部盘点"),
PARTIAL("2", "部分盘点")
;
@EnumValue
final String code;
final String description;
}

View File

@ -0,0 +1,25 @@
package tech.riemann.ims.enums;
import club.zhcs.lina.utils.enums.ICodeBook;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author mayong
* @since 2024/12/6 10:09
*/
@Getter
@AllArgsConstructor
public enum HandleEnum implements ICodeBook {
NO_ACTION("0", "无需处理"),
IGNORE_AND_SAVE("2", "忽略并保存"),
REPLENISH("3", "补货"),
OTHER("4", "其他")
;
@EnumValue
final String code;
final String description;
}

View File

@ -0,0 +1,28 @@
package tech.riemann.ims.enums;
import club.zhcs.lina.utils.enums.ICodeBook;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author mayong
* @since 2024/12/6 9:34
*/
@Getter
@AllArgsConstructor
public enum StockStatusEnum implements ICodeBook {
IN("0", "在库"),
OUT("1", "外借"),
OFF("2", "下架"),
;
@EnumValue
final String code;
final String description;
}

View File

@ -1,7 +1,7 @@
package tech.riemann.ims.mapper.material;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import tech.riemann.ims.entity.Inventory.ApplyDetail;
import tech.riemann.ims.entity.material.ApplyDetail;
/**
* @author mayong

View File

@ -1,7 +1,7 @@
package tech.riemann.ims.mapper.material;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import tech.riemann.ims.entity.Inventory.ApplyForm;
import tech.riemann.ims.entity.material.ApplyForm;
/**
* @author mayong

View File

@ -0,0 +1,15 @@
package tech.riemann.ims.mapper.material;
import tech.riemann.ims.entity.material.MaterialBarcodeConfig;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* 物料库条码配置表 Mapper 接口
*
* @author mayong)
*
* @since 2024-12-06 10:29:26
*/
public interface MaterialBarcodeConfigMapper extends BaseMapper<MaterialBarcodeConfig> {
}

View File

@ -1,7 +1,7 @@
package tech.riemann.ims.mapper.material;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import tech.riemann.ims.entity.Inventory.Material;
import tech.riemann.ims.entity.material.Material;
/**
* @author mayong

View File

@ -0,0 +1,15 @@
package tech.riemann.ims.mapper.material;
import tech.riemann.ims.entity.material.MaterialStockDetail;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* 物料明细数据表 Mapper 接口
*
* @author mayong)
*
* @since 2024-12-06 10:29:26
*/
public interface MaterialStockDetailMapper extends BaseMapper<MaterialStockDetail> {
}

View File

@ -0,0 +1,15 @@
package tech.riemann.ims.mapper.material;
import tech.riemann.ims.entity.material.StocktakingAudit;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* 盘点审核表 Mapper 接口
*
* @author mayong)
*
* @since 2024-12-06 10:32:29
*/
public interface StocktakingAuditMapper extends BaseMapper<StocktakingAudit> {
}

View File

@ -2,7 +2,7 @@ package tech.riemann.ims.service.material;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nutz.spring.boot.service.interfaces.IdNameEntityService;
import tech.riemann.ims.entity.Inventory.ApplyDetail;
import tech.riemann.ims.entity.material.ApplyDetail;
/**
* @author mayong

View File

@ -2,7 +2,7 @@ package tech.riemann.ims.service.material;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nutz.spring.boot.service.interfaces.IdNameEntityService;
import tech.riemann.ims.entity.Inventory.ApplyForm;
import tech.riemann.ims.entity.material.ApplyForm;
/**
* @author mayong

View File

@ -0,0 +1,18 @@
package tech.riemann.ims.service.material;
import tech.riemann.ims.entity.material.MaterialBarcodeConfig;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nutz.spring.boot.service.interfaces.IdNameEntityService;
/**
* <p>
* 物料库条码配置表 服务类
* </p>
*
* @author mayong)
*
* @since 2024-12-06 10:32:29
*/
public interface IMaterialBarcodeConfigService extends IService<MaterialBarcodeConfig>, IdNameEntityService<MaterialBarcodeConfig> {
}

View File

@ -2,7 +2,7 @@ package tech.riemann.ims.service.material;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nutz.spring.boot.service.interfaces.IdNameEntityService;
import tech.riemann.ims.entity.Inventory.Material;
import tech.riemann.ims.entity.material.Material;
/**
* @author mayong

View File

@ -0,0 +1,18 @@
package tech.riemann.ims.service.material;
import tech.riemann.ims.entity.material.MaterialStockDetail;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nutz.spring.boot.service.interfaces.IdNameEntityService;
/**
* <p>
* 物料明细数据表 服务类
* </p>
*
* @author mayong)
*
* @since 2024-12-06 10:32:29
*/
public interface IMaterialStockDetailService extends IService<MaterialStockDetail>, IdNameEntityService<MaterialStockDetail> {
}

View File

@ -0,0 +1,18 @@
package tech.riemann.ims.service.material;
import tech.riemann.ims.entity.material.StocktakingAudit;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nutz.spring.boot.service.interfaces.IdNameEntityService;
/**
* <p>
* 盘点审核表 服务类
* </p>
*
* @author mayong)
*
* @since 2024-12-06 10:32:29
*/
public interface IStocktakingAuditService extends IService<StocktakingAudit>, IdNameEntityService<StocktakingAudit> {
}

View File

@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.nutz.dao.Dao;
import org.springframework.stereotype.Service;
import tech.riemann.ims.entity.Inventory.ApplyDetail;
import tech.riemann.ims.entity.material.ApplyDetail;
import tech.riemann.ims.mapper.material.ApplyDetailMapper;
import tech.riemann.ims.service.material.IApplyDetailService;

View File

@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.nutz.dao.Dao;
import org.springframework.stereotype.Service;
import tech.riemann.ims.entity.Inventory.ApplyForm;
import tech.riemann.ims.entity.material.ApplyForm;
import tech.riemann.ims.mapper.material.ApplyFormMapper;
import tech.riemann.ims.service.material.IApplyFormService;

View File

@ -0,0 +1,45 @@
package tech.riemann.ims.service.material.impl;
import tech.riemann.ims.entity.material.MaterialBarcodeConfig;
import tech.riemann.ims.mapper.material.MaterialBarcodeConfigMapper;
import tech.riemann.ims.service.material.IMaterialBarcodeConfigService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.nutz.dao.Dao;
import org.springframework.stereotype.Service;
/**
* <p>
* 物料库条码配置表 服务实现类
* </p>
*
* @author mayong)
*
* @since 2024-12-06 10:32:29
*/
@Service
@RequiredArgsConstructor
public class MaterialBarcodeConfigServiceImpl extends ServiceImpl<MaterialBarcodeConfigMapper, MaterialBarcodeConfig> implements IMaterialBarcodeConfigService {
private final Dao dao;
/**
* @return
* @see org.nutz.spring.boot.service.ExtService#dao()
*/
@Override
public Dao dao() {
return dao;
}
/**
* @return
* @see org.nutz.spring.boot.service.interfaces.EntityService#getEntityType()
*/
@Override
public Class<MaterialBarcodeConfig> getEntityType() {
return MaterialBarcodeConfig.class;
}
}

View File

@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.nutz.dao.Dao;
import org.springframework.stereotype.Service;
import tech.riemann.ims.entity.Inventory.Material;
import tech.riemann.ims.entity.material.Material;
import tech.riemann.ims.mapper.material.MaterialMapper;
import tech.riemann.ims.service.material.IMaterialService;

View File

@ -0,0 +1,45 @@
package tech.riemann.ims.service.material.impl;
import tech.riemann.ims.entity.material.MaterialStockDetail;
import tech.riemann.ims.mapper.material.MaterialStockDetailMapper;
import tech.riemann.ims.service.material.IMaterialStockDetailService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.nutz.dao.Dao;
import org.springframework.stereotype.Service;
/**
* <p>
* 物料明细数据表 服务实现类
* </p>
*
* @author mayong)
*
* @since 2024-12-06 10:32:29
*/
@Service
@RequiredArgsConstructor
public class MaterialStockDetailServiceImpl extends ServiceImpl<MaterialStockDetailMapper, MaterialStockDetail> implements IMaterialStockDetailService {
private final Dao dao;
/**
* @return
* @see org.nutz.spring.boot.service.ExtService#dao()
*/
@Override
public Dao dao() {
return dao;
}
/**
* @return
* @see org.nutz.spring.boot.service.interfaces.EntityService#getEntityType()
*/
@Override
public Class<MaterialStockDetail> getEntityType() {
return MaterialStockDetail.class;
}
}

View File

@ -0,0 +1,45 @@
package tech.riemann.ims.service.material.impl;
import tech.riemann.ims.entity.material.StocktakingAudit;
import tech.riemann.ims.mapper.material.StocktakingAuditMapper;
import tech.riemann.ims.service.material.IStocktakingAuditService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.nutz.dao.Dao;
import org.springframework.stereotype.Service;
/**
* <p>
* 盘点审核表 服务实现类
* </p>
*
* @author mayong)
*
* @since 2024-12-06 10:32:29
*/
@Service
@RequiredArgsConstructor
public class StocktakingAuditServiceImpl extends ServiceImpl<StocktakingAuditMapper, StocktakingAudit> implements IStocktakingAuditService {
private final Dao dao;
/**
* @return
* @see org.nutz.spring.boot.service.ExtService#dao()
*/
@Override
public Dao dao() {
return dao;
}
/**
* @return
* @see org.nutz.spring.boot.service.interfaces.EntityService#getEntityType()
*/
@Override
public Class<StocktakingAudit> getEntityType() {
return StocktakingAudit.class;
}
}

View File

@ -0,0 +1,24 @@
<?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="tech.riemann.ims.mapper.material.MaterialBarcodeConfigMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="tech.riemann.ims.entity.material.MaterialBarcodeConfig">
<result column="id" property="id" />
<result column="created_time" property="createdTime" />
<result column="updated_time" property="updatedTime" />
<result column="created_by" property="createdBy" />
<result column="updated_by" property="updatedBy" />
<result column="mbc_material_key" property="mbcMaterialKey" />
<result column="mbc_latest_location" property="mbcLatestLocation" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id,
created_time,
updated_time,
created_by,
updated_by,
mbc_material_key, mbc_latest_location
</sql>
</mapper>

View File

@ -0,0 +1,26 @@
<?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="tech.riemann.ims.mapper.material.MaterialStockDetailMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="tech.riemann.ims.entity.material.MaterialStockDetail">
<result column="id" property="id" />
<result column="created_time" property="createdTime" />
<result column="updated_time" property="updatedTime" />
<result column="created_by" property="createdBy" />
<result column="updated_by" property="updatedBy" />
<result column="msd_material_key" property="msdMaterialKey" />
<result column="msd_barcode" property="msdBarcode" />
<result column="msd_status" property="msdStatus" />
<result column="msd_material_id" property="msdMaterialId" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id,
created_time,
updated_time,
created_by,
updated_by,
msd_material_key, msd_barcode, msd_status, msd_material_id
</sql>
</mapper>

View File

@ -0,0 +1,25 @@
<?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="tech.riemann.ims.mapper.material.StocktakingAuditMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="tech.riemann.ims.entity.material.StocktakingAudit">
<result column="id" property="id" />
<result column="created_time" property="createdTime" />
<result column="updated_time" property="updatedTime" />
<result column="created_by" property="createdBy" />
<result column="updated_by" property="updatedBy" />
<result column="s_apply_id" property="applyId" />
<result column="s_reviewer" property="reviewer" />
<result column="s_review_result" property="reviewResult" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id,
created_time,
updated_time,
created_by,
updated_by,
s_apply_id, s_reviewer, s_review_result
</sql>
</mapper>

View File

@ -1,17 +1,5 @@
package tech.riemann.ims;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.ConstVal;
@ -19,9 +7,19 @@ import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.BeetlTemplateEngine;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import tech.riemann.ims.entity.IdBaseEntity;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;
public class MysqlGenerator {
static String jdbcUrl = "jdbc:mysql://mysql.riemann.tech:13307/hx_jxc?characterEncoding=UTF-8";
@ -67,15 +65,10 @@ public class MysqlGenerator {
public static void main(String[] args) {
String projectPath = System.getProperty("user.dir");
List<String> relationTables = Lang.list("t_role_permission", "t_user_permission", "t_user_role", "t_user_bind");
List<String> relationTables = Lang.list();
NutMap.NEW()
// .addv("acl", Lang.array("t_user", "t_role", "t_permission",
// "t_role_permission", "t_user_permission", "t_user_role",
// "t_user_bind"))
// .addv("dictionary", Lang.array("t_dictionary", "t_group"))
// .addv("sensor", Lang.array("t_sensor", "t_sensor_log"))
// .addv("station", Lang.array("t_station", "t_team"))
.addv("station.status", Lang.array("t_station_status", "t_power_log", "t_working_log"))
.addv("material", Lang.array("t_material_barcode_config", "t_material_stock_detail", "t_stocktaking_audit"))
.entrySet()
.stream()
.forEach(e -> {
@ -83,7 +76,7 @@ public class MysqlGenerator {
FastAutoGenerator.create(jdbcUrl, user, password)
.globalConfig(builder -> {
builder
.author("Kerbores(kerbores@gmail.com)")
.author("mayong)")
.enableSpringdoc()
.commentDate(() -> LocalDateTime.now()
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss",