From 0105a573611ae384b1b490d95107cc845452b4bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=B8=85?= Date: Mon, 4 Aug 2025 21:45:40 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ErpMaterialInventoryRecordController.java | 10 +- .../domain/ErpMaterialInventoryRecord.java | 4 + .../domain/ErpMaterialPickingInfo.java | 28 ++--- .../domain/ErpMaterialPutawayInfo.java | 4 + .../bo/ErpMaterialInventoryRecordBo.java | 15 ++- .../domain/bo/ErpMaterialPickingBo.java | 2 +- .../bo/ErpMaterialPickingInfoAddBo.java | 119 ++++++++++++++++++ .../domain/bo/ErpMaterialPickingInfoBo.java | 22 ---- .../vo/ErpMaterialInventoryRecordVo.java | 6 +- .../domain/vo/ErpMaterialPickingInfoVo.java | 21 +++- .../domain/vo/ErpMaterialPutawayInfoVo.java | 6 + .../ErpMaterialInventoryRecordMapper.java | 15 +++ .../IErpMaterialInventoryRecordService.java | 7 +- ...ErpMaterialInventoryRecordServiceImpl.java | 23 +++- .../impl/ErpMaterialPickingServiceImpl.java | 94 ++++++++------ .../impl/ErpMaterialPutawayServiceImpl.java | 6 + .../impl/ErpMaterialReturnsServiceImpl.java | 10 ++ .../ErpMaterialInventoryRecordMapper.xml | 100 ++++++++++++--- .../resources/mapper/ErpMaterialMapper.xml | 73 ++++++----- maintain-ui/src/api/business/material.js | 11 +- .../views/business/materialPicking/add.vue | 6 +- .../views/business/materialPicking/index.vue | 42 +++++-- .../views/business/materialPutaway/index.vue | 31 +++-- .../views/business/materialReturns/index.vue | 22 ++-- .../views/business/materialStock/index.vue | 4 +- .../src/views/business/repairForm/info.vue | 9 +- .../settlementMaterial/info/index1.vue | 7 +- 27 files changed, 520 insertions(+), 177 deletions(-) create mode 100644 maintain-business/src/main/java/com/maintain/business/domain/bo/ErpMaterialPickingInfoAddBo.java diff --git a/maintain-business/src/main/java/com/maintain/business/controller/ErpMaterialInventoryRecordController.java b/maintain-business/src/main/java/com/maintain/business/controller/ErpMaterialInventoryRecordController.java index cd1ae94..613eb3d 100644 --- a/maintain-business/src/main/java/com/maintain/business/controller/ErpMaterialInventoryRecordController.java +++ b/maintain-business/src/main/java/com/maintain/business/controller/ErpMaterialInventoryRecordController.java @@ -37,13 +37,21 @@ public class ErpMaterialInventoryRecordController extends BaseController { private final IErpMaterialInventoryRecordService iErpMaterialInventoryRecordService; /** - * 查询物料库存记录列表 + * 查询物料库存汇总记录列表 */ @GetMapping("/list") public TableDataInfo list(ErpMaterialInventoryRecordBo bo, PageQuery pageQuery) { return iErpMaterialInventoryRecordService.customQueryPageList(bo, pageQuery); } + /** + * 查询物料库存明细记录列表 + */ + @GetMapping("/inventoryList") + public TableDataInfo inventoryList(ErpMaterialInventoryRecordBo bo, PageQuery pageQuery) { + return iErpMaterialInventoryRecordService.customQueryPageInventoryList(bo, pageQuery); + } + /** * 查询物料库存记录列表 */ diff --git a/maintain-business/src/main/java/com/maintain/business/domain/ErpMaterialInventoryRecord.java b/maintain-business/src/main/java/com/maintain/business/domain/ErpMaterialInventoryRecord.java index 98353e5..e02b4bd 100644 --- a/maintain-business/src/main/java/com/maintain/business/domain/ErpMaterialInventoryRecord.java +++ b/maintain-business/src/main/java/com/maintain/business/domain/ErpMaterialInventoryRecord.java @@ -46,6 +46,10 @@ public class ErpMaterialInventoryRecord extends BaseEntity { * 仓库ID */ private Long warehouseId; + /** + * 供应商ID + */ + private Long vendorId; /** * 数量 */ diff --git a/maintain-business/src/main/java/com/maintain/business/domain/ErpMaterialPickingInfo.java b/maintain-business/src/main/java/com/maintain/business/domain/ErpMaterialPickingInfo.java index ac02cfa..510397e 100644 --- a/maintain-business/src/main/java/com/maintain/business/domain/ErpMaterialPickingInfo.java +++ b/maintain-business/src/main/java/com/maintain/business/domain/ErpMaterialPickingInfo.java @@ -37,22 +37,6 @@ public class ErpMaterialPickingInfo extends BaseEntity { * 出库单ID */ private Long pickingId; - /** - * 物资分类ID - */ - private Long materialTypeId; - /** - * 物资分类名称 - */ - private String materialTypeName; - /** - * 仓库货位类型 - */ - private String warehouseLocationType; - /** - * 仓库货位ID - */ - private Long warehouseLocationId; /** * 仓库ID */ @@ -113,6 +97,18 @@ public class ErpMaterialPickingInfo extends BaseEntity { * 出库金额 */ private BigDecimal money; + /** + * 记录ID + */ + private Long recordId; + /** + * 入库单价(铺货结算) + */ + private BigDecimal putawayPrice; + /** + * 入库金额(铺货结算) + */ + private BigDecimal putawayMoney; /** * 状态(1已领料 2已退料) */ diff --git a/maintain-business/src/main/java/com/maintain/business/domain/ErpMaterialPutawayInfo.java b/maintain-business/src/main/java/com/maintain/business/domain/ErpMaterialPutawayInfo.java index 7e33d4d..495249d 100644 --- a/maintain-business/src/main/java/com/maintain/business/domain/ErpMaterialPutawayInfo.java +++ b/maintain-business/src/main/java/com/maintain/business/domain/ErpMaterialPutawayInfo.java @@ -112,6 +112,10 @@ public class ErpMaterialPutawayInfo extends BaseEntity { * 已退数量 */ private BigDecimal returnedNumber; + /** + * 已出数量 + */ + private BigDecimal issuedNumber; /** * 状态(1登记中 2已入库) */ diff --git a/maintain-business/src/main/java/com/maintain/business/domain/bo/ErpMaterialInventoryRecordBo.java b/maintain-business/src/main/java/com/maintain/business/domain/bo/ErpMaterialInventoryRecordBo.java index 7a15d67..d061cea 100644 --- a/maintain-business/src/main/java/com/maintain/business/domain/bo/ErpMaterialInventoryRecordBo.java +++ b/maintain-business/src/main/java/com/maintain/business/domain/bo/ErpMaterialInventoryRecordBo.java @@ -11,6 +11,8 @@ import javax.validation.constraints.*; import java.util.Date; import java.math.BigDecimal; +import java.util.List; + import com.maintain.common.core.domain.BaseEntity; /** @@ -78,10 +80,21 @@ public class ErpMaterialInventoryRecordBo extends BaseEntity { private Long warehouseId; /** - * 仓库ID + * 仓库ID列表 + */ + private List warehouseIdList; + + /** + * 仓库名称 */ private String warehouseName; + /** + * 供应商ID + */ + @NotNull(message = "供应商ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long vendorId; + /** * 数量 */ diff --git a/maintain-business/src/main/java/com/maintain/business/domain/bo/ErpMaterialPickingBo.java b/maintain-business/src/main/java/com/maintain/business/domain/bo/ErpMaterialPickingBo.java index 76e71a0..30b4b22 100644 --- a/maintain-business/src/main/java/com/maintain/business/domain/bo/ErpMaterialPickingBo.java +++ b/maintain-business/src/main/java/com/maintain/business/domain/bo/ErpMaterialPickingBo.java @@ -118,7 +118,7 @@ public class ErpMaterialPickingBo extends BaseEntity { private Date outTime; @NotEmpty(message = "出库明细不能为空", groups = { AddGroup.class, EditGroup.class }) - private List materialList; + private List materialList; } diff --git a/maintain-business/src/main/java/com/maintain/business/domain/bo/ErpMaterialPickingInfoAddBo.java b/maintain-business/src/main/java/com/maintain/business/domain/bo/ErpMaterialPickingInfoAddBo.java new file mode 100644 index 0000000..cbc9f15 --- /dev/null +++ b/maintain-business/src/main/java/com/maintain/business/domain/bo/ErpMaterialPickingInfoAddBo.java @@ -0,0 +1,119 @@ +package com.maintain.business.domain.bo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.maintain.common.core.domain.BaseEntity; +import com.maintain.common.core.validate.AddGroup; +import com.maintain.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.List; + +/** + * 物料出库明细业务对象 erp_material_picking_info + * + * @author liushuai + * @date 2025-04-03 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class ErpMaterialPickingInfoAddBo extends BaseEntity { + + /** + * 记录ID + */ + @NotNull(message = "记录ID不能为空", groups = { EditGroup.class }) + private Long recordId; + + /** + * 明细ID + */ + @NotNull(message = "明细ID不能为空", groups = { EditGroup.class }) + private Long infoId; + + /** + * 仓库ID + */ + @NotNull(message = "仓库ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long warehouseId; + + /** + * 仓库名称 + */ + private String warehouseName; + + /** + * 供应商ID + */ + @NotNull(message = "供应商ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long vendorId; + + /** + * 供应商名称 + */ + private String vendorName; + + /** + * 物料ID + */ + @NotNull(message = "物料ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long materialId; + + /** + * 物资编码 + */ + private String materialCode; + + /** + * 物资名称 + */ + private String materialName; + + /** + * 物资规格 + */ + private String materialSpecifications; + + /** + * 物资单位 + */ + private String materialUnit; + + /** + * 质保期(月) + */ + private Integer materialWarrantyPeriod; + + /** + * 参考价 + */ + private BigDecimal referencePrice; + + /** + * 销售价 + */ + private BigDecimal sellingPrice; + + /** + * 出库数量 + */ + @NotNull(message = "出库数量不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal collectNumber; + + /** + * 单价 + */ + @NotNull(message = "单价不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal price; + + /** + * 金额 + */ + @NotNull(message = "金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal money; + + +} diff --git a/maintain-business/src/main/java/com/maintain/business/domain/bo/ErpMaterialPickingInfoBo.java b/maintain-business/src/main/java/com/maintain/business/domain/bo/ErpMaterialPickingInfoBo.java index 960a74e..87d9de3 100644 --- a/maintain-business/src/main/java/com/maintain/business/domain/bo/ErpMaterialPickingInfoBo.java +++ b/maintain-business/src/main/java/com/maintain/business/domain/bo/ErpMaterialPickingInfoBo.java @@ -42,28 +42,6 @@ public class ErpMaterialPickingInfoBo extends BaseEntity { @NotNull(message = "出库单ID不能为空", groups = { AddGroup.class, EditGroup.class }) private Long pickingId; - /** - * 物资分类ID - */ - @NotNull(message = "物资分类ID不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long materialTypeId; - - /** - * 物资分类名称 - */ - private String materialTypeName; - - /** - * 仓库货位类型 - */ - private String warehouseLocationType; - - /** - * 仓库货位ID - */ - @NotNull(message = "仓库货位ID不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long warehouseLocationId; - /** * 仓库ID */ diff --git a/maintain-business/src/main/java/com/maintain/business/domain/vo/ErpMaterialInventoryRecordVo.java b/maintain-business/src/main/java/com/maintain/business/domain/vo/ErpMaterialInventoryRecordVo.java index db76186..14dab79 100644 --- a/maintain-business/src/main/java/com/maintain/business/domain/vo/ErpMaterialInventoryRecordVo.java +++ b/maintain-business/src/main/java/com/maintain/business/domain/vo/ErpMaterialInventoryRecordVo.java @@ -27,6 +27,11 @@ public class ErpMaterialInventoryRecordVo implements Serializable { */ private Long id; + /** + * 主键 + */ + private Long recordId; + /** * 明细ID(入库|退货|出库|退料) */ @@ -62,7 +67,6 @@ public class ErpMaterialInventoryRecordVo implements Serializable { /** * 物料ID */ - @ExcelProperty(value = "物料ID") private Long materialId; /** diff --git a/maintain-business/src/main/java/com/maintain/business/domain/vo/ErpMaterialPickingInfoVo.java b/maintain-business/src/main/java/com/maintain/business/domain/vo/ErpMaterialPickingInfoVo.java index 91bd176..1a95189 100644 --- a/maintain-business/src/main/java/com/maintain/business/domain/vo/ErpMaterialPickingInfoVo.java +++ b/maintain-business/src/main/java/com/maintain/business/domain/vo/ErpMaterialPickingInfoVo.java @@ -67,7 +67,6 @@ public class ErpMaterialPickingInfoVo implements Serializable { /** * 供应商ID */ - @ExcelProperty(value = "供应商ID") private Long vendorId; /** @@ -141,6 +140,21 @@ public class ErpMaterialPickingInfoVo implements Serializable { @ExcelProperty(value = "出库金额") private BigDecimal money; + /** + * 记录ID + */ + private Long recordId; + + /** + * 入库单价(铺货结算) + */ + private BigDecimal putawayPrice; + + /** + * 入库金额(铺货结算) + */ + private BigDecimal putawayMoney; + /** * 状态(1已领料 2已退料) */ @@ -160,6 +174,11 @@ public class ErpMaterialPickingInfoVo implements Serializable { @ExcelProperty(value = "创建时间") private Date createTime; + /** + * 库存 + */ + private BigDecimal inventory; + /** * 可选价格列表 */ diff --git a/maintain-business/src/main/java/com/maintain/business/domain/vo/ErpMaterialPutawayInfoVo.java b/maintain-business/src/main/java/com/maintain/business/domain/vo/ErpMaterialPutawayInfoVo.java index 651ed67..e25f740 100644 --- a/maintain-business/src/main/java/com/maintain/business/domain/vo/ErpMaterialPutawayInfoVo.java +++ b/maintain-business/src/main/java/com/maintain/business/domain/vo/ErpMaterialPutawayInfoVo.java @@ -169,6 +169,12 @@ public class ErpMaterialPutawayInfoVo implements Serializable { @ExcelProperty(value = "已退数量") private BigDecimal returnedNumber; + /** + * 已出数量 + */ + @ExcelProperty(value = "已出数量") + private BigDecimal issuedNumber; + /** * 状态(1登记中 2已入库) */ diff --git a/maintain-business/src/main/java/com/maintain/business/mapper/ErpMaterialInventoryRecordMapper.java b/maintain-business/src/main/java/com/maintain/business/mapper/ErpMaterialInventoryRecordMapper.java index 0398116..9b0161c 100644 --- a/maintain-business/src/main/java/com/maintain/business/mapper/ErpMaterialInventoryRecordMapper.java +++ b/maintain-business/src/main/java/com/maintain/business/mapper/ErpMaterialInventoryRecordMapper.java @@ -37,6 +37,21 @@ public interface ErpMaterialInventoryRecordMapper extends BaseMapperPlus customQueryList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + /** + * 自定义分页查询(每一条入库记录运算) + * @param page + * @param queryWrapper + * @return + */ + Page customQueryPageInventoryList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * + * @param id + * @return + */ + ErpMaterialInventoryRecordVo customQueryInventoryById(@Param("id") Long id); + /** * 查询物料库存列表 diff --git a/maintain-business/src/main/java/com/maintain/business/service/IErpMaterialInventoryRecordService.java b/maintain-business/src/main/java/com/maintain/business/service/IErpMaterialInventoryRecordService.java index 0eee35a..4f7cd25 100644 --- a/maintain-business/src/main/java/com/maintain/business/service/IErpMaterialInventoryRecordService.java +++ b/maintain-business/src/main/java/com/maintain/business/service/IErpMaterialInventoryRecordService.java @@ -28,10 +28,15 @@ public interface IErpMaterialInventoryRecordService { TableDataInfo queryPageList(ErpMaterialInventoryRecordBo bo, PageQuery pageQuery); /** - * 查询物料库存记录列表(自定义查询) + * 查询物料汇总记录列表(自定义查询) */ TableDataInfo customQueryPageList(ErpMaterialInventoryRecordBo bo, PageQuery pageQuery); + /** + * 查询物料库存记录列表(自定义查询) + */ + TableDataInfo customQueryPageInventoryList(ErpMaterialInventoryRecordBo bo, PageQuery pageQuery); + /** * 查询物料库存记录列表 */ diff --git a/maintain-business/src/main/java/com/maintain/business/service/impl/ErpMaterialInventoryRecordServiceImpl.java b/maintain-business/src/main/java/com/maintain/business/service/impl/ErpMaterialInventoryRecordServiceImpl.java index 396cfcb..24c01f3 100644 --- a/maintain-business/src/main/java/com/maintain/business/service/impl/ErpMaterialInventoryRecordServiceImpl.java +++ b/maintain-business/src/main/java/com/maintain/business/service/impl/ErpMaterialInventoryRecordServiceImpl.java @@ -51,7 +51,7 @@ public class ErpMaterialInventoryRecordServiceImpl implements IErpMaterialInvent } /** - * 查询物料库存记录列表(自定义查询) + * 查询物料汇总记录列表(自定义查询) * * @param bo * @param pageQuery @@ -74,6 +74,27 @@ public class ErpMaterialInventoryRecordServiceImpl implements IErpMaterialInvent return query; } + /** + * 查询物料明细记录列表(自定义查询) + * + * @param bo + * @param pageQuery + */ + @Override + public TableDataInfo customQueryPageInventoryList(ErpMaterialInventoryRecordBo bo, PageQuery pageQuery) { + QueryWrapper query = Wrappers.query(); + query + .eq("t.type", 1) + .like(StringUtils.isNotBlank(bo.getMaterialName()),"t.material_name", bo.getMaterialName()) + .like(StringUtils.isNotBlank(bo.getMaterialCode()),"t.material_code", bo.getMaterialCode()) + .like(null != bo.getVendorId(),"t.vendor_id", bo.getVendorId()) + .like(null != bo.getWarehouseId(), "t.warehouse_id", bo.getWarehouseId()) + .in(!bo.getWarehouseIdList().isEmpty(), "t.warehouse_id", bo.getWarehouseIdList()) + .orderByDesc("t.create_time"); + Page queryPageList = baseMapper.customQueryPageInventoryList(pageQuery.build(), query); + return TableDataInfo.build(queryPageList); + } + /** * 查询物料库存记录列表 */ diff --git a/maintain-business/src/main/java/com/maintain/business/service/impl/ErpMaterialPickingServiceImpl.java b/maintain-business/src/main/java/com/maintain/business/service/impl/ErpMaterialPickingServiceImpl.java index 00cc390..ab1825c 100644 --- a/maintain-business/src/main/java/com/maintain/business/service/impl/ErpMaterialPickingServiceImpl.java +++ b/maintain-business/src/main/java/com/maintain/business/service/impl/ErpMaterialPickingServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.maintain.business.domain.*; +import com.maintain.business.domain.bo.ErpMaterialPickingInfoAddBo; import com.maintain.business.domain.bo.ErpMaterialPickingInfoBo; import com.maintain.business.domain.vo.*; import com.maintain.business.mapper.*; @@ -64,6 +65,10 @@ public class ErpMaterialPickingServiceImpl implements IErpMaterialPickingService lqw.eq(ErpMaterialPickingInfo::getPickingId, id); List infoVoList = pickingInfoMapper.selectVoList(lqw); if (!infoVoList.isEmpty()) { + for (ErpMaterialPickingInfoVo infoVo : infoVoList) { + ErpMaterialInventoryRecordVo recordVo = materialInventoryRecordMapper.customQueryInventoryById(infoVo.getRecordId()); + infoVo.setInventory(recordVo.getInventory()); + } materialVo.setPickingInfoList(infoVoList); } return materialVo; @@ -154,7 +159,7 @@ public class ErpMaterialPickingServiceImpl implements IErpMaterialPickingService add.setReceiveUserId(LoginHelper.getUserId()); add.setReceiveUserName(LoginHelper.getUsername()); add.setReceiveTime(new Date()); - BigDecimal moneyTotal = bo.getMaterialList().stream().map(ErpMaterialPickingInfoBo::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal moneyTotal = bo.getMaterialList().stream().map(ErpMaterialPickingInfoAddBo::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add); add.setOutMoney(moneyTotal); add.setCreateDeptId(LoginHelper.getUserId()); validEntityBeforeSave(add); @@ -162,16 +167,14 @@ public class ErpMaterialPickingServiceImpl implements IErpMaterialPickingService if (flag) { List collect = bo.getMaterialList().stream().map(item -> { ErpMaterialPickingInfo info = BeanUtil.toBean(item, ErpMaterialPickingInfo.class); - ErpMaterial material = materialMapper.selectById(item.getMaterialId()); - BeanUtil.copyProperties(material, info); info.setId(null); info.setRepairFormId(bo.getRepairFormId()); info.setPickingId(add.getId()); - info.setWarehouseId(item.getWarehouseId()); - info.setWarehouseName(item.getWarehouseName()); info.setState(bo.getState()); - info.setPrice(item.getPrice()); - info.setMoney(item.getMoney()); + /* 查询记录 */ + ErpMaterialInventoryRecord record = materialInventoryRecordMapper.selectById(item.getRecordId()); + info.setPutawayPrice(record.getPrice()); + info.setPutawayMoney(record.getMoney()); return info; }).collect(Collectors.toList()); pickingInfoMapper.insertBatch(collect); @@ -179,24 +182,29 @@ public class ErpMaterialPickingServiceImpl implements IErpMaterialPickingService /* 创建物料库存记录表 */ if (bo.getState().equals(PickingState.TWO.getCode())) { List inventoryRecordList = collect.stream().map(item -> { - LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); - lambdaQueryWrapper - .eq(ErpMaterialInventoryRecord::getWarehouseId, item.getWarehouseId()) - .eq(ErpMaterialInventoryRecord::getMaterialId, item.getMaterialId()); - List recordVoList = materialInventoryRecordMapper.customQueryList(lambdaQueryWrapper); - if (recordVoList.isEmpty()) { + ErpMaterialInventoryRecordVo recordVo = materialInventoryRecordMapper.customQueryInventoryById(item.getRecordId()); + if (null == recordVo) { throw new ServiceException("仓库["+item.getWarehouseName()+"]中物料["+item.getMaterialName()+"]库存异常,请联系管理员!"); } - ErpMaterialInventoryRecordVo recordVo = recordVoList.get(0); if (item.getCollectNumber().compareTo(recordVo.getInventory()) > 0) { throw new ServiceException("仓库["+item.getWarehouseName()+"]中物料["+item.getMaterialName()+"]库存不足,请调整后重试!"); } + /* 记录已出数量 */ + ErpMaterialInventoryRecord inventoryRecord = materialInventoryRecordMapper.selectById(item.getRecordId()); + if (null == inventoryRecord) { + throw new ServiceException("库存存在异常,请联系管理员!!!"); + } + ErpMaterialPutawayInfo putawayInfo = putawayInfoMapper.selectById(inventoryRecord.getInfoId()); + putawayInfo.setIssuedNumber(putawayInfo.getIssuedNumber().add(item.getCollectNumber())); + putawayInfoMapper.updateById(putawayInfo); + /* 创建库存记录 */ ErpMaterialInventoryRecord record = new ErpMaterialInventoryRecord(); record.setInfoId(item.getId()); record.setMaterialId(item.getMaterialId()); ErpWarehouseVo warehouseVo = warehouseMapper.selectVoById(item.getWarehouseId()); record.setWarehouseId(warehouseVo.getId()); record.setDeptId(warehouseVo.getDeptId()); + record.setVendorId(item.getVendorId()); record.setNumber(item.getCollectNumber()); record.setPrice(item.getPrice()); record.setMoney(item.getMoney()); @@ -216,7 +224,7 @@ public class ErpMaterialPickingServiceImpl implements IErpMaterialPickingService @Override public Boolean updateByBo(ErpMaterialPickingBo bo) { ErpMaterialPicking update = BeanUtil.toBean(bo, ErpMaterialPicking.class); - BigDecimal moneyTotal = bo.getMaterialList().stream().map(ErpMaterialPickingInfoBo::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal moneyTotal = bo.getMaterialList().stream().map(ErpMaterialPickingInfoAddBo::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add); ErpRepairForm repairForm = repairFormMapper.selectById(bo.getRepairFormId()); ErpCar erpCar = carMapper.selectById(repairForm.getCarId()); update.setCarId(erpCar.getId()); @@ -232,19 +240,19 @@ public class ErpMaterialPickingServiceImpl implements IErpMaterialPickingService pickingInfoMapper.delete(lqw); // 批量新增材料明细 - List infoBoList = bo.getMaterialList(); - List collect = infoBoList.stream().map(item -> { + List materialList = bo.getMaterialList(); + List collect = materialList.stream().map(item -> { ErpMaterialPickingInfo info = BeanUtil.toBean(item, ErpMaterialPickingInfo.class); - ErpMaterial material = materialMapper.selectById(item.getMaterialId()); - BeanUtil.copyProperties(material, info); info.setId(null); info.setPickingId(update.getId()); info.setRepairFormId(update.getRepairFormId()); - info.setWarehouseId(item.getWarehouseId()); - info.setWarehouseName(item.getWarehouseName()); info.setState(bo.getState()); info.setPrice(item.getPrice()); info.setMoney(item.getMoney()); + /* 查询记录 */ + ErpMaterialInventoryRecord record = materialInventoryRecordMapper.selectById(item.getRecordId()); + info.setPutawayPrice(record.getPrice()); + info.setPutawayMoney(record.getMoney()); return info; }).collect(Collectors.toList()); pickingInfoMapper.insertBatch(collect); @@ -252,24 +260,29 @@ public class ErpMaterialPickingServiceImpl implements IErpMaterialPickingService /* 创建物料库存记录表 */ if (bo.getState().equals(PickingState.TWO.getCode())) { List inventoryRecordList = collect.stream().map(item -> { - LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); - lambdaQueryWrapper - .eq(ErpMaterialInventoryRecord::getWarehouseId, item.getWarehouseId()) - .eq(ErpMaterialInventoryRecord::getMaterialId, item.getMaterialId()); - List recordVoList = materialInventoryRecordMapper.customQueryList(lambdaQueryWrapper); - if (recordVoList.isEmpty()) { + ErpMaterialInventoryRecordVo recordVo = materialInventoryRecordMapper.customQueryInventoryById(item.getRecordId()); + if (null == recordVo) { throw new ServiceException("仓库["+item.getWarehouseName()+"]中物料["+item.getMaterialName()+"]库存异常,请联系管理员!"); } - ErpMaterialInventoryRecordVo recordVo = recordVoList.get(0); if (item.getCollectNumber().compareTo(recordVo.getInventory()) > 0) { throw new ServiceException("仓库["+item.getWarehouseName()+"]中物料["+item.getMaterialName()+"]库存不足,请调整后重试!"); } + /* 记录已出数量 */ + ErpMaterialInventoryRecord inventoryRecord = materialInventoryRecordMapper.selectById(item.getRecordId()); + if (null == inventoryRecord) { + throw new ServiceException("库存存在异常,请联系管理员!!!"); + } + ErpMaterialPutawayInfo putawayInfo = putawayInfoMapper.selectById(inventoryRecord.getInfoId()); + putawayInfo.setIssuedNumber(putawayInfo.getIssuedNumber().add(item.getCollectNumber())); + putawayInfoMapper.updateById(putawayInfo); + /* 创建库存记录 */ ErpMaterialInventoryRecord record = new ErpMaterialInventoryRecord(); record.setInfoId(item.getId()); record.setMaterialId(item.getMaterialId()); ErpWarehouseVo warehouseVo = warehouseMapper.selectVoById(item.getWarehouseId()); record.setWarehouseId(warehouseVo.getId()); record.setDeptId(warehouseVo.getDeptId()); + record.setVendorId(item.getVendorId()); record.setNumber(item.getCollectNumber()); record.setPrice(item.getPrice()); record.setMoney(item.getMoney()); @@ -307,7 +320,7 @@ public class ErpMaterialPickingServiceImpl implements IErpMaterialPickingService List pickingInfoVoList = pickingInfoMapper.selectVoList(queryWrapper); if (!pickingInfoVoList.isEmpty()) { LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); - lambdaQueryWrapper.eq(ErpMaterialInventoryRecord::getInfoId, pickingInfoVoList.stream().map(ErpMaterialPickingInfoVo::getId).collect(Collectors.toList())); + lambdaQueryWrapper.in(ErpMaterialInventoryRecord::getInfoId, pickingInfoVoList.stream().map(ErpMaterialPickingInfoVo::getId).collect(Collectors.toList())); materialInventoryRecordMapper.delete(lambdaQueryWrapper); } // 删除领料出库单明细 @@ -337,24 +350,25 @@ public class ErpMaterialPickingServiceImpl implements IErpMaterialPickingService queryWrapper.in(ErpMaterialPickingInfo::getPickingId, ids).eq(ErpMaterialPickingInfo::getState, PickingState.ONE.getCode()); List pickingInfoVoList = pickingInfoMapper.selectVoList(queryWrapper); List inventoryRecordList = pickingInfoVoList.stream().map(item -> { - LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); - lambdaQueryWrapper - .eq(ErpMaterialInventoryRecord::getWarehouseId, item.getWarehouseId()) - .eq(ErpMaterialInventoryRecord::getMaterialId, item.getMaterialId()); - List recordVoList = materialInventoryRecordMapper.customQueryList(lambdaQueryWrapper); - if (recordVoList.isEmpty()) { + ErpMaterialInventoryRecordVo recordVo = materialInventoryRecordMapper.customQueryInventoryById(item.getRecordId()); + if (null == recordVo) { throw new ServiceException("仓库["+item.getWarehouseName()+"]中物料["+item.getMaterialName()+"]库存异常,请联系管理员!"); } - ErpMaterialInventoryRecordVo recordVo = recordVoList.get(0); if (item.getCollectNumber().compareTo(recordVo.getInventory()) > 0) { throw new ServiceException("仓库["+item.getWarehouseName()+"]中物料["+item.getMaterialName()+"]库存不足,请调整后重试!"); } + /* 记录已出数量 */ + ErpMaterialPutawayInfo putawayInfo = putawayInfoMapper.selectById(recordVo.getInfoId()); + putawayInfo.setIssuedNumber(putawayInfo.getIssuedNumber().add(item.getCollectNumber())); + putawayInfoMapper.updateById(putawayInfo); + /* 创建库存记录 */ ErpMaterialInventoryRecord record = new ErpMaterialInventoryRecord(); record.setInfoId(item.getId()); record.setMaterialId(item.getMaterialId()); ErpWarehouseVo warehouseVo = warehouseMapper.selectVoById(item.getWarehouseId()); record.setWarehouseId(warehouseVo.getId()); record.setDeptId(warehouseVo.getDeptId()); + record.setVendorId(item.getVendorId()); record.setNumber(item.getCollectNumber()); record.setPrice(item.getPrice()); record.setMoney(item.getMoney()); @@ -397,12 +411,20 @@ public class ErpMaterialPickingServiceImpl implements IErpMaterialPickingService List pickingInfoVoList = pickingInfoMapper.selectVoList(queryWrapper); if (!pickingInfoVoList.isEmpty()) { List inventoryRecordList = pickingInfoVoList.stream().map(item -> { + /* 回退入库明细中已出数量 */ + ErpMaterialInventoryRecordVo recordVo = materialInventoryRecordMapper.customQueryInventoryById(item.getRecordId()); + ErpMaterialPutawayInfo putawayInfo = putawayInfoMapper.selectById(recordVo.getInfoId()); + putawayInfo.setIssuedNumber(putawayInfo.getIssuedNumber().subtract(item.getCollectNumber())); + putawayInfoMapper.updateById(putawayInfo); + + /* 创建库存记录 */ ErpMaterialInventoryRecord record = new ErpMaterialInventoryRecord(); record.setInfoId(item.getId()); record.setMaterialId(item.getMaterialId()); ErpWarehouseVo warehouseVo = warehouseMapper.selectVoById(item.getWarehouseId()); record.setWarehouseId(warehouseVo.getId()); record.setDeptId(warehouseVo.getDeptId()); + record.setVendorId(item.getVendorId()); record.setNumber(item.getCollectNumber()); record.setPrice(item.getPrice()); record.setMoney(item.getMoney()); diff --git a/maintain-business/src/main/java/com/maintain/business/service/impl/ErpMaterialPutawayServiceImpl.java b/maintain-business/src/main/java/com/maintain/business/service/impl/ErpMaterialPutawayServiceImpl.java index 4ee6479..91f17f1 100644 --- a/maintain-business/src/main/java/com/maintain/business/service/impl/ErpMaterialPutawayServiceImpl.java +++ b/maintain-business/src/main/java/com/maintain/business/service/impl/ErpMaterialPutawayServiceImpl.java @@ -127,6 +127,8 @@ public class ErpMaterialPutawayServiceImpl implements IErpMaterialPutawayService putawayInfo.setMaterialId(material.getId()); putawayInfo.setPutawayId(add.getId()); putawayInfo.setState(bo.getState()); + putawayInfo.setVendorId(item.getVendorId()); + putawayInfo.setVendorName(item.getVendorName()); return putawayInfo; }).collect(Collectors.toList()); putawayInfoMapper.insertBatch(collect); @@ -139,6 +141,7 @@ public class ErpMaterialPutawayServiceImpl implements IErpMaterialPutawayService record.setMaterialId(item.getMaterialId()); record.setWarehouseId(warehouseVo.getId()); record.setDeptId(warehouseVo.getDeptId()); + record.setVendorId(item.getVendorId()); record.setNumber(item.getPutawayNumber()); record.setPrice(item.getPutawayPrice()); record.setMoney(item.getPutawayMoney()); @@ -188,6 +191,7 @@ public class ErpMaterialPutawayServiceImpl implements IErpMaterialPutawayService if (null != warehouseVo) { record.setDeptId(warehouseVo.getDeptId()); } + record.setVendorId(item.getVendorId()); record.setNumber(item.getPutawayNumber()); record.setPrice(item.getPutawayPrice()); record.setMoney(item.getPutawayMoney()); @@ -229,6 +233,8 @@ public class ErpMaterialPutawayServiceImpl implements IErpMaterialPutawayService ErpMaterial material = materialMapper.selectById(item.getMaterialId()); BeanUtil.copyProperties(material, putawayInfo); putawayInfo.setId(null); + putawayInfo.setVendorId(item.getVendorId()); + putawayInfo.setVendorName(item.getVendorName()); putawayInfo.setMaterialId(material.getId()); putawayInfo.setPutawayId(update.getId()); putawayInfo.setState(bo.getState()); diff --git a/maintain-business/src/main/java/com/maintain/business/service/impl/ErpMaterialReturnsServiceImpl.java b/maintain-business/src/main/java/com/maintain/business/service/impl/ErpMaterialReturnsServiceImpl.java index 017365a..4b2e8ec 100644 --- a/maintain-business/src/main/java/com/maintain/business/service/impl/ErpMaterialReturnsServiceImpl.java +++ b/maintain-business/src/main/java/com/maintain/business/service/impl/ErpMaterialReturnsServiceImpl.java @@ -137,6 +137,10 @@ public class ErpMaterialReturnsServiceImpl implements IErpMaterialReturnsService BeanUtil.copyProperties(putawayInfo, returnsInfo); returnsInfo.setId(null); returnsInfo.setReturnsId(materialReturns.getId()); + returnsInfo.setCreateTime(null); + returnsInfo.setCreateBy(null); + returnsInfo.setUpdateTime(null); + returnsInfo.setUpdateBy(null); return returnsInfo; }).collect(Collectors.toList()); materialReturnsInfoMapper.insertBatch(collect); @@ -148,6 +152,7 @@ public class ErpMaterialReturnsServiceImpl implements IErpMaterialReturnsService record.setMaterialId(item.getMaterialId()); record.setWarehouseId(warehouseVo.getId()); record.setDeptId(warehouseVo.getDeptId()); + record.setVendorId(item.getVendorId()); record.setNumber(item.getReturnsNumber()); record.setPrice(item.getReturnsPrice()); record.setMoney(item.getReturnsMoney()); @@ -200,6 +205,10 @@ public class ErpMaterialReturnsServiceImpl implements IErpMaterialReturnsService BeanUtil.copyProperties(putawayInfo, returnsInfo); returnsInfo.setId(null); returnsInfo.setReturnsId(materialReturns.getId()); + returnsInfo.setCreateTime(null); + returnsInfo.setCreateBy(null); + returnsInfo.setUpdateTime(null); + returnsInfo.setUpdateBy(null); return returnsInfo; }).collect(Collectors.toList()); materialReturnsInfoMapper.insertBatch(collect); @@ -211,6 +220,7 @@ public class ErpMaterialReturnsServiceImpl implements IErpMaterialReturnsService record.setMaterialId(item.getMaterialId()); record.setWarehouseId(warehouseVo.getId()); record.setDeptId(warehouseVo.getDeptId()); + record.setVendorId(item.getVendorId()); record.setNumber(item.getReturnsNumber()); record.setPrice(item.getReturnsPrice()); record.setMoney(item.getReturnsMoney()); diff --git a/maintain-business/src/main/resources/mapper/ErpMaterialInventoryRecordMapper.xml b/maintain-business/src/main/resources/mapper/ErpMaterialInventoryRecordMapper.xml index 8485683..6f0e913 100644 --- a/maintain-business/src/main/resources/mapper/ErpMaterialInventoryRecordMapper.xml +++ b/maintain-business/src/main/resources/mapper/ErpMaterialInventoryRecordMapper.xml @@ -36,11 +36,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" r.type, w.name as warehouseName, r.material_id, + r.vendor_id, + v.vendor_name, m.material_code, m.material_name, m.material_specifications, - m.vendor_id, - m.vendor_name, m.material_unit, m.material_brand, m.procurement_subject, @@ -55,32 +55,91 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" IFNULL(bac.bacNumber, 0) AS bacNumber, IFNULL(put.putNumber, 0) - IFNULL(ret.retNumber, 0) - IFNULL(pic.picNumber, 0) + IFNULL(bac.bacNumber, 0) AS inventory - FROM erp_material_inventory_record r + FROM erp_material_inventory_record r LEFT JOIN erp_material m ON r.material_id = m.id LEFT JOIN erp_warehouse w ON r.warehouse_id = w.id - LEFT JOIN(SELECT warehouse_id, material_id, SUM(number) AS putNumber + LEFT JOIN erp_material_vendor v ON r.vendor_id = v.id + LEFT JOIN(SELECT warehouse_id, material_id, vendor_id, SUM(number) AS putNumber FROM erp_material_inventory_record WHERE type = '1' - GROUP BY warehouse_id, material_id) put - ON r.warehouse_id = put.warehouse_id AND r.material_id = put.material_id - LEFT JOIN(SELECT warehouse_id, material_id, SUM(number) AS retNumber + GROUP BY warehouse_id, material_id, vendor_id) put + ON r.warehouse_id = put.warehouse_id AND r.material_id = put.material_id AND r.vendor_id = put.vendor_id + LEFT JOIN(SELECT warehouse_id, material_id, vendor_id, SUM(number) AS retNumber FROM erp_material_inventory_record WHERE type = '2' - GROUP BY warehouse_id, material_id) ret - ON r.warehouse_id = ret.warehouse_id AND r.material_id = ret.material_id - LEFT JOIN(SELECT warehouse_id, material_id, SUM(number) AS picNumber + GROUP BY warehouse_id, material_id, vendor_id) ret + ON r.warehouse_id = ret.warehouse_id AND r.material_id = ret.material_id AND r.vendor_id = ret.vendor_id + LEFT JOIN(SELECT warehouse_id, material_id, vendor_id, SUM(number) AS picNumber FROM erp_material_inventory_record WHERE type = '3' - GROUP BY warehouse_id, material_id) pic - ON r.warehouse_id = pic.warehouse_id AND r.material_id = pic.material_id - LEFT JOIN(SELECT warehouse_id, material_id, SUM(number) AS bacNumber + GROUP BY warehouse_id, material_id, vendor_id) pic + ON r.warehouse_id = pic.warehouse_id AND r.material_id = pic.material_id AND r.vendor_id = pic.vendor_id + LEFT JOIN(SELECT warehouse_id, material_id, vendor_id, SUM(number) AS bacNumber FROM erp_material_inventory_record WHERE type = '4' - GROUP BY warehouse_id, material_id) bac - ON r.warehouse_id = bac.warehouse_id AND r.material_id = bac.material_id - GROUP BY r.warehouse_id, r.material_id + GROUP BY warehouse_id, material_id, vendor_id) bac + ON r.warehouse_id = bac.warehouse_id AND r.material_id = bac.material_id AND r.vendor_id = bac.vendor_id + GROUP BY r.warehouse_id, r.material_id, r.vendor_id ) t + + SELECT t.* FROM (SELECT + r.id as recordId, + r.info_id, + r.material_id, + r.warehouse_id, + r.vendor_id, + r.price, + r.type, + r.create_time, + IFNULL(put.put_number, 0) - IFNULL(ret.ret_number, 0) - IFNULL(pic.out_number, 0) + IFNULL(back.back_number, 0) AS inventory, + m.material_code, + m.material_name, + m.material_specifications, + m.material_unit, + m.material_brand, + m.procurement_subject, + m.compatible_with, + m.material_warranty_period, + m.reference_price, + m.selling_price, + m.material_url, + v.vendor_name, + w.name as warehouseName + FROM erp_material_inventory_record r + LEFT JOIN erp_material m ON r.material_id = m.id + LEFT JOIN erp_warehouse w ON r.warehouse_id = w.id + LEFT JOIN erp_material_vendor v ON r.vendor_id = v.id + LEFT JOIN ( + SELECT material_id, warehouse_id, vendor_id, SUM(number) AS put_number + FROM erp_material_inventory_record + WHERE type = '1' + GROUP BY material_id, warehouse_id, vendor_id + ) put ON r.material_id = put.material_id AND r.warehouse_id = put.warehouse_id AND r.vendor_id = put.vendor_id + LEFT JOIN ( + SELECT material_id, warehouse_id, vendor_id, SUM(number) AS ret_number + FROM erp_material_inventory_record + WHERE type = '2' + GROUP BY material_id, warehouse_id, vendor_id + ) ret ON r.material_id = ret.material_id AND r.warehouse_id = ret.warehouse_id AND r.vendor_id = ret.vendor_id + LEFT JOIN ( + SELECT material_id, warehouse_id, vendor_id, SUM(number) AS out_number + FROM erp_material_inventory_record + WHERE type = '3' + GROUP BY material_id, warehouse_id, vendor_id + ) pic ON r.material_id = pic.material_id AND r.warehouse_id = pic.warehouse_id AND r.vendor_id = pic.vendor_id + LEFT JOIN ( + SELECT material_id, warehouse_id, vendor_id, SUM(number) AS back_number + FROM erp_material_inventory_record + WHERE type = '4' + GROUP BY material_id, warehouse_id, vendor_id + ) back ON r.material_id = back.material_id AND r.warehouse_id = back.warehouse_id AND r.vendor_id = back.vendor_id + ) t + + + diff --git a/maintain-business/src/main/resources/mapper/ErpMaterialMapper.xml b/maintain-business/src/main/resources/mapper/ErpMaterialMapper.xml index 6b759a0..ef19a70 100644 --- a/maintain-business/src/main/resources/mapper/ErpMaterialMapper.xml +++ b/maintain-business/src/main/resources/mapper/ErpMaterialMapper.xml @@ -31,41 +31,38 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" SELECT t.* FROM( - SELECT - r.warehouse_id, w.name as warehouse_name, r.material_id, m.material_code, m.material_name, m.material_specifications, - m.vendor_id, m.vendor_name, m.material_unit, m.material_brand, m.procurement_subject, m.compatible_with, - m.material_warranty_period,m.reference_price, m.selling_price, m.material_url, - IFNULL(put.putNumber,0) AS putNumber, IFNULL(ret.retNumber,0) AS retNumber, - IFNULL(pic.picNumber,0) AS picNumber, IFNULL(bac.bacNumber,0) AS bacNumber, - IFNULL(put.putNumber,0) - IFNULL(ret.retNumber,0) - IFNULL(pic.picNumber,0) + IFNULL(bac.bacNumber,0) AS inventory - FROM erp_material_inventory_record r - LEFT JOIN erp_material m ON r.material_id = m.id - LEFT JOIN erp_warehouse w ON r.warehouse_id = w.id - LEFT JOIN( - SELECT warehouse_id, material_id, SUM(number) AS putNumber - FROM erp_material_inventory_record - WHERE type = '1' - GROUP BY warehouse_id, material_id - ) put ON r.warehouse_id = put.warehouse_id AND r.material_id = put.material_id - LEFT JOIN( - SELECT warehouse_id, material_id, SUM(number) AS retNumber - FROM erp_material_inventory_record - WHERE type = '2' - GROUP BY warehouse_id, material_id - ) ret ON r.warehouse_id = ret.warehouse_id AND r.material_id = ret.material_id - LEFT JOIN( - SELECT warehouse_id, material_id, SUM(number) AS picNumber - FROM erp_material_inventory_record - WHERE type = '3' - GROUP BY warehouse_id, material_id - ) pic ON r.warehouse_id = pic.warehouse_id AND r.material_id = pic.material_id - LEFT JOIN( - SELECT warehouse_id, material_id, SUM(number) AS bacNumber - FROM erp_material_inventory_record - WHERE type = '4' - GROUP BY warehouse_id, material_id - ) bac ON r.warehouse_id = bac.warehouse_id AND r.material_id = bac.material_id - GROUP BY r.warehouse_id, r.material_id + SELECT + r.warehouse_id, w.name as warehouse_name, r.material_id, r.vendor_id, v.vendor_name, m.material_code, + m.material_name, m.material_specifications, m.material_unit, m.material_brand, m.procurement_subject, m.compatible_with, + m.material_warranty_period,m.reference_price, m.selling_price, m.material_url, + IFNULL(put.putNumber,0) AS putNumber, IFNULL(ret.retNumber,0) AS retNumber, + IFNULL(pic.picNumber,0) AS picNumber, IFNULL(bac.bacNumber,0) AS bacNumber, + IFNULL(put.putNumber,0) - IFNULL(ret.retNumber,0) - IFNULL(pic.picNumber,0) + IFNULL(bac.bacNumber,0) AS inventory + FROM erp_material_inventory_record r + LEFT JOIN erp_material m ON r.material_id = m.id + LEFT JOIN erp_warehouse w ON r.warehouse_id = w.id + LEFT JOIN erp_material_vendor v ON r.vendor_id = v.id + LEFT JOIN(SELECT warehouse_id, material_id, vendor_id, SUM(number) AS putNumber + FROM erp_material_inventory_record + WHERE type = '1' + GROUP BY warehouse_id, material_id, vendor_id) put + ON r.warehouse_id = put.warehouse_id AND r.material_id = put.material_id AND r.vendor_id = put.vendor_id + LEFT JOIN(SELECT warehouse_id, material_id, vendor_id, SUM(number) AS retNumber + FROM erp_material_inventory_record + WHERE type = '2' + GROUP BY warehouse_id, material_id, vendor_id) ret + ON r.warehouse_id = ret.warehouse_id AND r.material_id = ret.material_id AND r.vendor_id = ret.vendor_id + LEFT JOIN(SELECT warehouse_id, material_id, vendor_id, SUM(number) AS picNumber + FROM erp_material_inventory_record + WHERE type = '3' + GROUP BY warehouse_id, material_id, vendor_id) pic + ON r.warehouse_id = pic.warehouse_id AND r.material_id = pic.material_id AND r.vendor_id = pic.vendor_id + LEFT JOIN(SELECT warehouse_id, material_id, vendor_id, SUM(number) AS bacNumber + FROM erp_material_inventory_record + WHERE type = '4' + GROUP BY warehouse_id, material_id, vendor_id) bac + ON r.warehouse_id = bac.warehouse_id AND r.material_id = bac.material_id AND r.vendor_id = bac.vendor_id + GROUP BY r.warehouse_id, r.material_id, r.vendor_id ) t