feat(wms): 物料变动台账

dev
wanghao 2 weeks ago
parent 9915eff6c7
commit 2d5c3f5e3f

@ -0,0 +1,116 @@
package org.dromara.wms.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.wms.domain.vo.WmsInventoryLedgerVo;
import org.dromara.wms.domain.bo.WmsInventoryLedgerBo;
import org.dromara.wms.service.IWmsInventoryLedgerService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
*
* 访:/wms/inventoryLedger
*
* @author Yinq
* @date 2025-12-02
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/inventoryLedger")
public class WmsInventoryLedgerController extends BaseController {
private final IWmsInventoryLedgerService wmsInventoryLedgerService;
/**
*
*/
@SaCheckPermission("wms:inventoryLedger:list")
@GetMapping("/list")
public TableDataInfo<WmsInventoryLedgerVo> list(WmsInventoryLedgerBo bo, PageQuery pageQuery) {
return wmsInventoryLedgerService.queryPageList(bo, pageQuery);
}
/**
*
*/
@SaCheckPermission("wms:inventoryLedger:export")
@Log(title = "库存变动台账", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(WmsInventoryLedgerBo bo, HttpServletResponse response) {
List<WmsInventoryLedgerVo> list = wmsInventoryLedgerService.queryList(bo);
ExcelUtil.exportExcel(list, "库存变动台账", WmsInventoryLedgerVo.class, response);
}
/**
*
*
* @param ledgerId
*/
@SaCheckPermission("wms:inventoryLedger:query")
@GetMapping("/{ledgerId}")
public R<WmsInventoryLedgerVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable("ledgerId") Long ledgerId) {
return R.ok(wmsInventoryLedgerService.queryById(ledgerId));
}
/**
*
*/
@SaCheckPermission("wms:inventoryLedger:add")
@Log(title = "库存变动台账", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody WmsInventoryLedgerBo bo) {
return toAjax(wmsInventoryLedgerService.insertByBo(bo));
}
/**
*
*/
@SaCheckPermission("wms:inventoryLedger:edit")
@Log(title = "库存变动台账", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody WmsInventoryLedgerBo bo) {
return toAjax(wmsInventoryLedgerService.updateByBo(bo));
}
/**
*
*
* @param ledgerIds
*/
@SaCheckPermission("wms:inventoryLedger:remove")
@Log(title = "库存变动台账", businessType = BusinessType.DELETE)
@DeleteMapping("/{ledgerIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable("ledgerIds") Long[] ledgerIds) {
return toAjax(wmsInventoryLedgerService.deleteWithValidByIds(List.of(ledgerIds), true));
}
/**
*
*/
@GetMapping("/getWmsInventoryLedgerList")
public R<List<WmsInventoryLedgerVo>> getWmsInventoryLedgerList(WmsInventoryLedgerBo bo) {
List<WmsInventoryLedgerVo> list = wmsInventoryLedgerService.queryList(bo);
return R.ok(list);
}
}

@ -0,0 +1,81 @@
package org.dromara.wms.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* wms_inventory_ledger
*
* @author Yinq
* @date 2025-12-02
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("wms_inventory_ledger")
public class WmsInventoryLedger extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@TableId(value = "ledger_id", type = IdType.AUTO)
private Long ledgerId;
/**
*
*/
private String locationCode;
/**
* ID
*/
private Long warehouseId;
/**
* ID
*/
private Long materielId;
/**
*
*/
private String batchNumber;
/**
*
*/
private Double inventoryAmount;
/**
*
*/
private String changeType;
/**
* (0,1)
*/
private String ledgerState;
/**
*
*/
private Double changeAmount;
@TableField(exist = false)
private String warehouseName;
@TableField(exist = false)
private String productCode;
@TableField(exist = false)
private String productName;
@TableField(exist = false)
private String productSpe;
@TableField(exist = false)
private String externalBrand;
}

@ -0,0 +1,71 @@
package org.dromara.wms.domain.bo;
import com.baomidou.mybatisplus.annotation.TableField;
import org.dromara.wms.domain.WmsInventoryLedger;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
/**
* wms_inventory_ledger
*
* @author Yinq
* @date 2025-12-02
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = WmsInventoryLedger.class, reverseConvertGenerate = false)
public class WmsInventoryLedgerBo extends BaseEntity {
/**
* ID
*/
@NotNull(message = "仓库ID不能为空", groups = { EditGroup.class })
private Long ledgerId;
/**
*
*/
private String locationCode;
/**
* ID
*/
private Long warehouseId;
/**
* ID
*/
private Long materielId;
/**
*
*/
private String batchNumber;
/**
*
*/
private Double inventoryAmount;
/**
*
*/
private String changeType;
/**
* (0,1)
*/
private String ledgerState;
/**
*
*/
private Double changeAmount;
private String productCode;
private String productName;
}

@ -0,0 +1,140 @@
package org.dromara.wms.domain.vo;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import org.dromara.wms.domain.WmsInventoryLedger;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* wms_inventory_ledger
*
* @author Yinq
* @date 2025-12-02
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = WmsInventoryLedger.class)
public class WmsInventoryLedgerVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
private Long ledgerId;
@ExcelProperty(value = "仓库名称")
private String warehouseName;
/**
*
*/
@ExcelProperty(value = "租户编号")
private String tenantId;
/**
*
*/
@ExcelProperty(value = "库位编码")
private String locationCode;
/**
* ID
*/
@ExcelProperty(value = "仓库ID")
private Long warehouseId;
/**
* ID
*/
private Long materielId;
/**
*
*/
@ExcelProperty(value = "成品编码")
private String productCode;
/**
*
*/
@ExcelProperty(value = "成品名称")
private String productName;
@ExcelProperty(value = "外部品牌")
private String externalBrand;
/**
*
*/
@ExcelProperty(value = "物料描述")
private String productSpe;
/**
*
*/
@ExcelProperty(value = "批次号")
private String batchNumber;
/**
*
*/
@ExcelProperty(value = "原始库存")
private Double inventoryAmount;
/**
*
*/
@ExcelProperty(value = "变动类型", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "wms_ledger_change_type")
private String changeType;
/**
* (0,1)
*/
@ExcelProperty(value = "变动状态(0减少,1增加)", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "wms_ledger_state")
private String ledgerState;
/**
*
*/
@ExcelProperty(value = "变动数量")
private Double changeAmount;
/**
*
*/
@ExcelProperty(value = "创建部门")
private Long createDept;
/**
*
*/
@ExcelProperty(value = "创建人")
private Long createBy;
/**
*
*/
@ExcelProperty(value = "创建时间")
private Date createTime;
/**
*
*/
@ExcelProperty(value = "更新人")
private Long updateBy;
/**
*
*/
@ExcelProperty(value = "更新时间")
private Date updateTime;
}

@ -0,0 +1,37 @@
package org.dromara.wms.mapper;
import java.util.List;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.dromara.wms.domain.WmsInventoryLedger;
import org.dromara.wms.domain.vo.WmsInventoryLedgerVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* Mapper
*
* @author Yinq
* @date 2025-12-02
*/
public interface WmsInventoryLedgerMapper extends BaseMapperPlus<WmsInventoryLedger, WmsInventoryLedgerVo> {
/**
*
*
* @param page
* @param queryWrapper
* @return
*/
public Page<WmsInventoryLedgerVo> selectCustomWmsInventoryLedgerVoList(@Param("page") Page<WmsInventoryLedgerVo> page, @Param(Constants.WRAPPER) MPJLambdaWrapper<WmsInventoryLedger> queryWrapper);
/**
*
*
* @param queryWrapper
* @return
*/
public List<WmsInventoryLedgerVo> selectCustomWmsInventoryLedgerVoList(@Param(Constants.WRAPPER) MPJLambdaWrapper<WmsInventoryLedger> queryWrapper);
}

@ -0,0 +1,69 @@
package org.dromara.wms.service;
import org.dromara.wms.domain.WmsInventoryLedger;
import org.dromara.wms.domain.vo.WmsInventoryLedgerVo;
import org.dromara.wms.domain.bo.WmsInventoryLedgerBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* Service
*
* @author Yinq
* @date 2025-12-02
*/
public interface IWmsInventoryLedgerService {
/**
*
*
* @param ledgerId
* @return
*/
WmsInventoryLedgerVo queryById(Long ledgerId);
/**
*
*
* @param bo
* @param pageQuery
* @return
*/
TableDataInfo<WmsInventoryLedgerVo> queryPageList(WmsInventoryLedgerBo bo, PageQuery pageQuery);
/**
*
*
* @param bo
* @return
*/
List<WmsInventoryLedgerVo> queryList(WmsInventoryLedgerBo bo);
/**
*
*
* @param bo
* @return
*/
Boolean insertByBo(WmsInventoryLedgerBo bo);
/**
*
*
* @param bo
* @return
*/
Boolean updateByBo(WmsInventoryLedgerBo bo);
/**
*
*
* @param ids
* @param isValid
* @return
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

@ -0,0 +1,143 @@
package org.dromara.wms.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.wms.domain.WmsBaseProduct;
import org.dromara.wms.domain.WmsWarehouseInfo;
import org.springframework.stereotype.Service;
import org.dromara.wms.domain.bo.WmsInventoryLedgerBo;
import org.dromara.wms.domain.vo.WmsInventoryLedgerVo;
import org.dromara.wms.domain.WmsInventoryLedger;
import org.dromara.wms.mapper.WmsInventoryLedgerMapper;
import org.dromara.wms.service.IWmsInventoryLedgerService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* Service
*
* @author Yinq
* @date 2025-12-02
*/
@RequiredArgsConstructor
@Service
public class WmsInventoryLedgerServiceImpl implements IWmsInventoryLedgerService {
private final WmsInventoryLedgerMapper baseMapper;
/**
*
*
* @param ledgerId
* @return
*/
@Override
public WmsInventoryLedgerVo queryById(Long ledgerId){
return baseMapper.selectVoById(ledgerId);
}
/**
*
*
* @param bo
* @param pageQuery
* @return
*/
@Override
public TableDataInfo<WmsInventoryLedgerVo> queryPageList(WmsInventoryLedgerBo bo, PageQuery pageQuery) {
MPJLambdaWrapper<WmsInventoryLedger> lqw = buildQueryWrapper(bo);
Page<WmsInventoryLedgerVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
*
*
* @param bo
* @return
*/
@Override
public List<WmsInventoryLedgerVo> queryList(WmsInventoryLedgerBo bo) {
MPJLambdaWrapper<WmsInventoryLedger> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private MPJLambdaWrapper<WmsInventoryLedger> buildQueryWrapper(WmsInventoryLedgerBo bo) {
Map<String, Object> params = bo.getParams();
MPJLambdaWrapper<WmsInventoryLedger> lqw = JoinWrappers.lambda(WmsInventoryLedger.class)
.selectAll(WmsInventoryLedger.class)
.like(StringUtils.isNotBlank(bo.getLocationCode()), WmsInventoryLedger::getLocationCode, bo.getLocationCode())
.eq(bo.getWarehouseId() != null, WmsInventoryLedger::getWarehouseId, bo.getWarehouseId())
.eq(bo.getMaterielId() != null, WmsInventoryLedger::getMaterielId, bo.getMaterielId())
.eq(StringUtils.isNotBlank(bo.getBatchNumber()), WmsInventoryLedger::getBatchNumber, bo.getBatchNumber())
.eq(StringUtils.isNotBlank(bo.getChangeType()), WmsInventoryLedger::getChangeType, bo.getChangeType())
.eq(StringUtils.isNotBlank(bo.getLedgerState()), WmsInventoryLedger::getLedgerState, bo.getLedgerState())
.leftJoin(WmsBaseProduct.class, WmsBaseProduct::getProductId, WmsInventoryLedger::getMaterielId)
.select(WmsBaseProduct::getProductName, WmsBaseProduct::getProductCode,WmsBaseProduct::getProductSpe)
.leftJoin(WmsWarehouseInfo.class, WmsWarehouseInfo::getWarehouseId, WmsInventoryLedger::getWarehouseId)
.select(WmsWarehouseInfo::getWarehouseName, WmsWarehouseInfo::getWarehouseCode)
;
return lqw;
}
/**
*
*
* @param bo
* @return
*/
@Override
public Boolean insertByBo(WmsInventoryLedgerBo bo) {
WmsInventoryLedger add = MapstructUtils.convert(bo, WmsInventoryLedger.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setLedgerId(add.getLedgerId());
}
return flag;
}
/**
*
*
* @param bo
* @return
*/
@Override
public Boolean updateByBo(WmsInventoryLedgerBo bo) {
WmsInventoryLedger update = MapstructUtils.convert(bo, WmsInventoryLedger.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
*
*/
private void validEntityBeforeSave(WmsInventoryLedger entity){
//TODO 做一些数据校验,如唯一约束
}
/**
*
*
* @param ids
* @param isValid
* @return
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}

@ -0,0 +1,14 @@
<?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="org.dromara.wms.mapper.WmsInventoryLedgerMapper">
<resultMap type="org.dromara.wms.domain.vo.WmsInventoryLedgerVo" id="WmsInventoryLedgerResult">
</resultMap>
<select id="selectCustomWmsInventoryLedgerVoList" resultMap="WmsInventoryLedgerResult">
select ledger_id, tenant_id, location_code, warehouse_id, materiel_id, batch_number, inventory_amount, change_type, ledger_state, change_amount, create_dept, create_by, create_time, update_by, update_time from wms_inventory_ledger t
${ew.getCustomSqlSegment}
</select>
</mapper>
Loading…
Cancel
Save