This commit is contained in:
dzc committed 2025-03-07 17:16:47 +08:00
commit 6b1265cdb9
17 files changed
+530 -572

No files matched your search

@@ -45,7 +45,7 @@ public class SupermarketSpuUpdateStockReqDTO {
* 负数:扣减库存
*/
@NotNull(message = "库存变化数量不能为空")
private Integer incrCount;
private Double incrCount;
}
@@ -0,0 +1,129 @@
package com.bsd.pjcloud.supermarket.dto.inventoryrecords;
import com.baomidou.mybatisplus.annotation.*;
import com.bsd.pjcloud.supermarket.dto.cgplan.SmCgPlanEditItemDTO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@Data
@Schema(description = "出入库记录修改对象")
public class InventoryRecordEditDTO {
/**
* 主键
*/
@Schema(description="主键")
private Long id;
/**
* 单据编号(规则生成,出入库编号)
*/
@Schema(description="单据编号(规则生成,出入库编号)")
private String inventoryCode;
/**
* 单据日期
*/
@Schema(description="单据日期")
private LocalDate inventoryDate;
/**
* 单据类型(字典inventory_type)采购入库、采购退货、盘点入库等
*/
@Schema(description="单据类型(字典inventory_type)采购入库、采购退货、盘点入库等")
private String inventoryType;
/**
* 来源ID(根据类型指向对应的表,如采购单ID、退货单ID等)
*/
@Schema(description="来源code")
private String linkCode;
/**
* 仓库id
*/
@Schema(description="仓库id")
private String warehouseId;
/**
* 经办人id
*/
@Schema(description="经办人id")
private Long handlerUserId;
/**
* 审批状态
*/
@Schema(description="审批状态")
private String checkStatus;
/**
* 审批人id
*/
@Schema(description="审批人id")
private String checkUserId;
/**
* 审核日期
*/
@Schema(description="审核日期")
private LocalDateTime checkTime;
/**
* 商户编号
*/
@Schema(description="商户编号")
private Long merchantId;
/**
* 部门id
*/
@Schema(description="部门id")
private Long deptId;
/**
* 货商
*/
@Schema(description="货商")
private Long supplierId;
/**
* 备注
*/
@Schema(description="备注")
private String remark;
/**
* 订单类型(1入库 2出库)
*/
@Schema(description="订单类型(1入库 2出库)")
private String orderType;
/**
* 入库总金额
*/
@Schema(description="入库总金额")
private Integer totalAmount;
@Schema(description="收货数量")
private Integer receiveAmount;
/**
* @Link SmCgPlanEditItemDTO
*/
@Schema(description="采购计划-item")
private List<InventoryRecordEditItemDTO> items;
}
@@ -0,0 +1,100 @@
package com.bsd.pjcloud.supermarket.dto.inventoryrecords;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@Schema(description = "出入库记录编辑-item")
public class InventoryRecordEditItemDTO {
/**
* id
*/
@Schema(description="id")
private Long id;
/**
* 单据类型(字典inventory_type)
*/
@Schema(description="单据类型(字典inventory_type)")
private String inventoryType;
/**
* 商品id
*/
@Schema(description="商品id")
private Long erpSpuId;
/**
* 商户编号
*/
@Schema(description="商户编号")
private Long merchantId;
/**
* 部门id
*/
@Schema(description="部门id")
private Long deptId;
/**
* 出入库数量
*/
@Schema(description="出入库数量")
private Double quantity;
/**
* 单价
*/
@Schema(description="单价")
private Integer unitPrice;
/**
* 总金额
*/
@Schema(description="总金额")
private Integer totalAmount;
/**
* 税率%
*/
@Schema(description="税率%")
private Integer taxRate;
/**
* 税前金额
*/
@Schema(description="税前金额")
private Integer taxAmount;
/**
* 货商
*/
@Schema(description="货商")
private Long supplierId;
/**
* 备注
*/
@Schema(description="备注")
private String remark;
/**
* 订单类型(1入库 2出库)
*/
@Schema(description="订单类型(1入库 2出库)")
private String orderType;
/**
* 包装单位id
*/
@Schema(description="包装单位id")
private Long unitId;
}
@@ -31,7 +31,7 @@ public class UpdateStockDTO {
* 负数:扣减库存
*/
@NotNull(message = "库存变化数量不能为空")
private Integer incrCount;
private Double incrCount;
}
@@ -172,4 +172,7 @@ public class SmErpInventoryRecordsEntity extends Model<SmErpInventoryRecordsEnti
@Schema(description="经办人名称")
@TableField(exist = false)
private String handlerUserName;
@Schema(description="收货数量")
private Integer receiveAmount;
}
@@ -57,7 +57,7 @@ public class SmErpInventoryRecordsItemEntity extends Model<SmErpInventoryRecords
* 出入库数量
*/
@Schema(description="出入库数量")
private Integer quantity;
private Double quantity;
/**
* 单价
@@ -21,7 +21,7 @@ public class SmErpCgDdVo {
private String code;
@Schema(description="据日期")
@Schema(description="单据日期")
private LocalDate ddDate;
/**
@@ -145,7 +145,7 @@ public class SmErpCgDdController {
@DeleteMapping
@PreAuthorize("@pms.hasPermission('supermarket_smErpCgDd_del')" )
public R removeById(@RequestBody Long[] ids) {
return R.ok(smErpCgDdService.removeBatchByIds(CollUtil.toList(ids)));
return R.ok(smErpCgDdService.removeCgDdByIds(CollUtil.toList(ids)));
}
@@ -12,10 +12,7 @@ import com.bsd.pjcloud.common.log.annotation.SysLog;
import com.bsd.pjcloud.common.security.util.SecurityUtils;
import com.bsd.pjcloud.supermarket.dto.cgdd.CGPlanLinkQueryDTO;
import com.bsd.pjcloud.supermarket.dto.cgplan.ErpCgPlanDTO;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.CGDdLinkQueryDTO;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.InventoryDetailQueryDTO;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.InventoryLinkQueryDTO;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.InventoryRecordSaveDTO;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.*;
import com.bsd.pjcloud.supermarket.entity.*;
import com.bsd.pjcloud.supermarket.service.*;
import com.bsd.pjcloud.supermarket.vo.cgplan.ErpUnitVo;
@@ -105,15 +102,15 @@ public class SmErpInventoryRecordsController {
/**
* 修改出入库记录表
* @param smErpInventoryRecords 出入库记录表
* @param inventoryRecordEditDTO 出入库记录表
* @return R
*/
@Operation(summary = "修改出入库记录表" , description = "修改出入库记录表" )
@SysLog("修改出入库记录表" )
@PutMapping
@PreAuthorize("@pms.hasPermission('supermarket_smErpInventoryRecords_edit')" )
public R updateById(@RequestBody SmErpInventoryRecordsEntity smErpInventoryRecords) {
return R.ok(smErpInventoryRecordsService.updateById(smErpInventoryRecords));
public R updateById(@RequestBody InventoryRecordEditDTO inventoryRecordEditDTO) {
return R.ok(smErpInventoryRecordsService.updateInventoryRecord(inventoryRecordEditDTO));
}
/**
@@ -126,7 +123,7 @@ public class SmErpInventoryRecordsController {
@DeleteMapping
@PreAuthorize("@pms.hasPermission('supermarket_smErpInventoryRecords_del')" )
public R removeById(@RequestBody Long[] ids) {
return R.ok(smErpInventoryRecordsService.removeBatchByIds(CollUtil.toList(ids)));
return R.ok(smErpInventoryRecordsService.removeBatch(CollUtil.toList(ids)));
}
@@ -207,7 +204,6 @@ public class SmErpInventoryRecordsController {
@Operation(summary = "获取出入库订单分页" , description = "关联订单" )
@GetMapping("/inventory/page" )
public R getInventoryPage(@ParameterObject Page page, @ParameterObject InventoryLinkQueryDTO inventoryLinkQueryDTO) {
LambdaQueryWrapper<SmErpInventoryRecordsEntity> wrapper = Wrappers.lambdaQuery();
wrapper.like(StrUtil.isNotBlank(inventoryLinkQueryDTO.getCode()),SmErpInventoryRecordsEntity::getInventoryCode,inventoryLinkQueryDTO.getCode());
wrapper.eq(Objects.nonNull(inventoryLinkQueryDTO.getDdDate()),SmErpInventoryRecordsEntity::getInventoryDate,inventoryLinkQueryDTO.getDdDate());
@@ -8,6 +8,8 @@ import com.bsd.pjcloud.supermarket.dto.cgdd.ErpCgDDSaveDTO;
import com.bsd.pjcloud.supermarket.entity.SmErpCgDdEntity;
import com.bsd.pjcloud.supermarket.entity.SmErpCgPlanEntity;
import java.util.ArrayList;
public interface SmErpCgDdService extends IService<SmErpCgDdEntity> {
@@ -37,4 +39,12 @@ public interface SmErpCgDdService extends IService<SmErpCgDdEntity> {
Object pageScope(Page page, LambdaQueryWrapper<SmErpCgDdEntity> wrapper);
/**
* 删除
* @param list
* @return
*/
Object removeCgDdByIds(ArrayList<Long> list);
}
@@ -4,9 +4,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.InventoryDetailQueryDTO;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.InventoryRecordEditDTO;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.InventoryRecordSaveDTO;
import com.bsd.pjcloud.supermarket.entity.SmErpInventoryRecordsEntity;
import java.util.ArrayList;
public interface SmErpInventoryRecordsService extends IService<SmErpInventoryRecordsEntity> {
@@ -66,4 +69,16 @@ public interface SmErpInventoryRecordsService extends IService<SmErpInventoryRec
* @return
*/
Object getInventoryDetailById(Long id);
/**
* 更新出入库
* @param inventoryRecordEditDTO
* @return
*/
Object updateInventoryRecord(InventoryRecordEditDTO inventoryRecordEditDTO);
Object removeBatch(ArrayList<Long> list);
}
@@ -27,10 +27,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -82,23 +79,45 @@ public class SmErpCgDdServiceImpl extends ServiceImpl<SmErpCgDdMapper, SmErpCgDd
}
@Override
@Transactional
public Object updateByErpCgDdEditDTO(ErpCgDDEditDTO erpCgDDEditDTO) {
SmErpCgDdEntity smErpCgDdEntity = BeanUtils.toBean(erpCgDDEditDTO, SmErpCgDdEntity.class);
int i = baseMapper.updateById(smErpCgDdEntity);
//更新采购计划-item
List<SmCgDDEditItemDTO> items = erpCgDDEditDTO.getItems();
List<SmErpCgDdItemEntity> cgPlanItemEntities = BeanUtils.toBean(items, SmErpCgDdItemEntity.class);
List<SmErpCgDdItemEntity> cgDdItemEntities = BeanUtils.toBean(items, SmErpCgDdItemEntity.class);
List<SmErpCgDdItemEntity> insertCollect = cgPlanItemEntities.stream()
List<SmErpCgDdItemEntity> insertCollect = cgDdItemEntities.stream()
.filter(supermarketUnitEntity -> supermarketUnitEntity.getId() == null).collect(Collectors.toList());
insertCollect.forEach(c -> c.setHId(smErpCgDdEntity.getId()));
//
// List<SmErpCgPlanItemEntity> updateCollect = cgPlanItemEntities.stream()
// .filter(supermarketUnitEntity -> supermarketUnitEntity.getId() != null).collect(Collectors.toList());
// smErpCgPlanItemMapper.updateById(updateCollect);
smErpCgDDItemMapper.insertOrUpdate(cgPlanItemEntities);
List<SmErpCgDdItemEntity> updateCollect = cgDdItemEntities.stream()
.filter(supermarketUnitEntity -> supermarketUnitEntity.getId() != null).collect(Collectors.toList());
smErpCgDDItemMapper.updateById(updateCollect);
smErpCgDDItemMapper.insert(insertCollect);
List<Long> existingCodeIds = smErpCgDDItemMapper.selectList(
new LambdaQueryWrapper<SmErpCgDdItemEntity>()
.eq(SmErpCgDdItemEntity::getHId, smErpCgDdEntity.getId())
).stream().map(SmErpCgDdItemEntity::getId).collect(Collectors.toList());
// 收集本次提交的ID(排除新增的)
List<Long> submittedCodeIds = updateCollect.stream()
.map(SmErpCgDdItemEntity::getId)
.filter(Objects::nonNull)
.collect(Collectors.toList());
// 计算需要删除的ID
List<Long> toDeleteCodeIds = existingCodeIds.stream()
.filter(id -> !submittedCodeIds.contains(id))
.collect(Collectors.toList());
// 批量删除失效条码
if (!toDeleteCodeIds.isEmpty()) {
smErpCgDDItemMapper.deleteByIds(toDeleteCodeIds);
}
return R.ok(i);
}
@@ -107,7 +126,9 @@ public class SmErpCgDdServiceImpl extends ServiceImpl<SmErpCgDdMapper, SmErpCgDd
// 1. 查询主表分页数据
Page<SmErpCgDdEntity> pageData = baseMapper.selectPageByScope(page, wrapper, DataScope.of());
List<SmErpCgDdEntity> records = pageData.getRecords();
if (CollectionUtils.isEmpty(records)){
return pageData;
}
// 2. 提前收集所有主表ID(去重处理)
Set<Long> planIds = records.stream()
.map(SmErpCgDdEntity::getId)
@@ -226,4 +247,25 @@ public class SmErpCgDdServiceImpl extends ServiceImpl<SmErpCgDdMapper, SmErpCgDd
return pageData;
}
@Override
@Transactional
public Object removeCgDdByIds(ArrayList<Long> list) {
//首先先查询是否有当前数据权限
LambdaQueryWrapper<SmErpCgDdEntity> eq = new LambdaQueryWrapper<SmErpCgDdEntity>().in(SmErpCgDdEntity::getId, list);
List<SmErpCgDdEntity> smErpCgDdEntities = baseMapper.selectListByScope(eq,DataScope.of());
List<Long> delIds= smErpCgDdEntities.stream().map(smErpCgDdEntity -> smErpCgDdEntity.getId()).collect(Collectors.toList());
LambdaQueryWrapper<SmErpCgDdItemEntity> itemEntityLambdaQueryWrapper = new LambdaQueryWrapper<SmErpCgDdItemEntity>().in(SmErpCgDdItemEntity::getHId, delIds);
smErpCgDDItemMapper.delete(itemEntityLambdaQueryWrapper);
baseMapper.deleteByIds(delIds);
List<Long> toDeleteIds = delIds.stream()
.filter(id -> !list.contains(id))
.collect(Collectors.toList());
if (!CollectionUtils.isEmpty(toDeleteIds)){
return R.failed("越权删除!");
}
return R.ok();
}
}
@@ -85,11 +85,32 @@ public class SmErpCgPlanServiceImpl extends ServiceImpl<SmErpCgPlanMapper, SmErp
List<SmErpCgPlanItemEntity> insertCollect = cgPlanItemEntities.stream()
.filter(supermarketUnitEntity -> supermarketUnitEntity.getId() == null).collect(Collectors.toList());
insertCollect.forEach(c -> c.setPlanId(smErpCgPlanEntity.getId()));
//
// List<SmErpCgPlanItemEntity> updateCollect = cgPlanItemEntities.stream()
// .filter(supermarketUnitEntity -> supermarketUnitEntity.getId() != null).collect(Collectors.toList());
// smErpCgPlanItemMapper.updateById(updateCollect);
smErpCgPlanItemMapper.insertOrUpdate(cgPlanItemEntities);
List<SmErpCgPlanItemEntity> updateCollect = cgPlanItemEntities.stream()
.filter(supermarketUnitEntity -> supermarketUnitEntity.getId() != null).collect(Collectors.toList());
smErpCgPlanItemMapper.updateById(updateCollect);
smErpCgPlanItemMapper.insert(insertCollect);
List<Long> existingCodeIds = smErpCgPlanItemMapper.selectList(
new LambdaQueryWrapper<SmErpCgPlanItemEntity>()
.eq(SmErpCgPlanItemEntity::getPlanId, smErpCgPlanEntity.getId())
).stream().map(SmErpCgPlanItemEntity::getId).collect(Collectors.toList());
// 收集本次提交的ID(排除新增的)
List<Long> submittedCodeIds = updateCollect.stream()
.map(SmErpCgPlanItemEntity::getId)
.filter(Objects::nonNull)
.collect(Collectors.toList());
// 计算需要删除的ID
List<Long> toDeleteCodeIds = existingCodeIds.stream()
.filter(id -> !submittedCodeIds.contains(id))
.collect(Collectors.toList());
// 批量删除失效条码
if (!toDeleteCodeIds.isEmpty()) {
smErpCgPlanItemMapper.deleteByIds(toDeleteCodeIds);
}
return R.ok(i);
}
@@ -7,14 +7,12 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bsd.pjcloud.admin.api.entity.SysUser;
import com.bsd.pjcloud.admin.api.feign.RemoteUserService;
import com.bsd.pjcloud.common.core.util.BeanUtils;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.common.security.util.SecurityUtils;
import com.bsd.pjcloud.supermarket.constant.OrderTypeEnum;
import com.bsd.pjcloud.supermarket.dto.cgdd.SmCgDDSaveItemDTO;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.InventoryDetailQueryDTO;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.InventoryRecordSaveDTO;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.InventoryRecordSaveItemDTO;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.UpdateStockDTO;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.*;
import com.bsd.pjcloud.supermarket.entity.*;
import com.bsd.pjcloud.supermarket.mapper.*;
import com.bsd.pjcloud.supermarket.service.SmErpInventoryRecordsService;
@@ -162,11 +160,13 @@ public class SmErpInventoryRecordsServiceImpl extends ServiceImpl<SmErpInventory
public Object pageInventoryScope(Page page, LambdaQueryWrapper<SmErpInventoryRecordsEntity> wrapper) {
Page pageData = baseMapper.selectPageByScope(page, wrapper, DataScope.of());
List<SmErpCgPlanEntity> records = pageData.getRecords();
List<SmErpInventoryRecordsEntity> records = pageData.getRecords();
if (CollectionUtils.isEmpty(records)){
return pageData;
}
// 2. 提前收集所有主表ID(去重处理)
Set<Long> planIds = records.stream()
.map(SmErpCgPlanEntity::getId)
.map(SmErpInventoryRecordsEntity::getId)
.collect(Collectors.toSet());
// 3. 批量查询所有子表数据(仅1次数据库查询)
@@ -322,5 +322,65 @@ public class SmErpInventoryRecordsServiceImpl extends ServiceImpl<SmErpInventory
return bean;
}
@Override
@Transactional
public Object updateInventoryRecord(InventoryRecordEditDTO inventoryRecordEditDTO) {
SmErpInventoryRecordsEntity smErpInventoryRecordsEntity = BeanUtils.toBean(inventoryRecordEditDTO, SmErpInventoryRecordsEntity.class);
int i = baseMapper.updateById(smErpInventoryRecordsEntity);
List<InventoryRecordEditItemDTO> items = inventoryRecordEditDTO.getItems();
List<SmErpInventoryRecordsItemEntity> smErpInventoryRecordsItemEntityList = BeanUtils.toBean(items, SmErpInventoryRecordsItemEntity.class);
List<SmErpInventoryRecordsItemEntity> updateItems = smErpInventoryRecordsItemEntityList.stream().
filter(smErpInventoryRecordsItemEntity -> smErpInventoryRecordsItemEntity.getId() == null).collect(Collectors.toList());
List<SmErpInventoryRecordsItemEntity> insertItems = smErpInventoryRecordsItemEntityList.stream().
filter(smErpInventoryRecordsItemEntity -> smErpInventoryRecordsItemEntity.getId() != null).collect(Collectors.toList());
smErpInventoryRecordsItemMapper.updateById(updateItems);
smErpInventoryRecordsItemMapper.insert(insertItems);
List<Long> existingCodeIds = smErpInventoryRecordsItemMapper.selectList(
new LambdaQueryWrapper<SmErpInventoryRecordsItemEntity>()
.eq(SmErpInventoryRecordsItemEntity::getInventoryId, smErpInventoryRecordsEntity.getId())
).stream().map(SmErpInventoryRecordsItemEntity::getId).collect(Collectors.toList());
// 收集本次提交的ID(排除新增的)
List<Long> submittedCodeIds = updateItems.stream()
.map(SmErpInventoryRecordsItemEntity::getId)
.filter(Objects::nonNull)
.collect(Collectors.toList());
// 计算需要删除的ID
List<Long> toDeleteCodeIds = existingCodeIds.stream()
.filter(id -> !submittedCodeIds.contains(id))
.collect(Collectors.toList());
// 批量删除失效条码
if (!toDeleteCodeIds.isEmpty()) {
smErpInventoryRecordsItemMapper.deleteByIds(toDeleteCodeIds);
}
return i;
}
@Override
public Object removeBatch(ArrayList<Long> list) {
//首先先查询是否有当前数据权限
LambdaQueryWrapper<SmErpInventoryRecordsEntity> eq = new LambdaQueryWrapper<SmErpInventoryRecordsEntity>().in(SmErpInventoryRecordsEntity::getId, list);
List<SmErpInventoryRecordsEntity> smErpCgDdEntities = baseMapper.selectListByScope(eq,DataScope.of());
List<Long> delIds= smErpCgDdEntities.stream().map(smErpCgDdEntity -> smErpCgDdEntity.getId()).collect(Collectors.toList());
LambdaQueryWrapper<SmErpInventoryRecordsItemEntity> itemEntityLambdaQueryWrapper = new LambdaQueryWrapper<SmErpInventoryRecordsItemEntity>()
.in(SmErpInventoryRecordsItemEntity::getInventoryId, delIds);
smErpInventoryRecordsItemMapper.delete(itemEntityLambdaQueryWrapper);
baseMapper.deleteByIds(delIds);
List<Long> toDeleteIds = delIds.stream()
.filter(id -> !list.contains(id))
.collect(Collectors.toList());
if (!CollectionUtils.isEmpty(toDeleteIds)){
return R.failed("越权删除!");
}
return R.ok();
}
}
@@ -109,6 +109,10 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
//新增包装类型
List<SmErpUnitEntity> smErpUnitEntityList = supermarketSpu.getSmErpUnitEntityList();
List<SmErpUnitEntity> isBaseNum = smErpUnitEntityList.stream().filter(smErpUnitEntity -> smErpUnitEntity.getIsBase() == true).collect(Collectors.toList());
if (isBaseNum.size()!=1){
return R.failed("必须且只能指定一个基础包装单位!");
}
if (CollectionUtils.isNotEmpty(smErpUnitEntityList)) {
smErpUnitEntityList.forEach(supermarketUnitEntity -> supermarketUnitEntity.setSpuId(supermarketSpu.getId()));
smErpUnitService.saveBatch(smErpUnitEntityList);
@@ -153,15 +157,67 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
//新增包装类型
List<SmErpUnitEntity> smErpUnitEntityList = supermarketSpu.getSmErpUnitEntityList();
if (CollectionUtils.isNotEmpty(smErpUnitEntityList)) {
List<SmErpUnitEntity> baseUnits = smErpUnitEntityList.stream()
.filter(unit -> Boolean.TRUE.equals(unit.getIsBase()))
.collect(Collectors.toList());
// 检查基础单位数量
if ( baseUnits.size() != 1) {
return R.failed("必须且只能指定一个基础包装单位!");
}
//id为null新增
List<SmErpUnitEntity> insertCollect = smErpUnitEntityList.stream()
List<SmErpUnitEntity> insertUnits = smErpUnitEntityList.stream()
.filter(supermarketUnitEntity -> supermarketUnitEntity.getId() == null).collect(Collectors.toList());
insertCollect.forEach(supermarketUnitEntity -> supermarketUnitEntity.setSpuId(supermarketSpu.getId()));
List<SmErpUnitEntity> updateCollect = smErpUnitEntityList.stream()
insertUnits.forEach(supermarketUnitEntity -> supermarketUnitEntity.setSpuId(supermarketSpu.getId()));
List<SmErpUnitEntity> updateUnits = smErpUnitEntityList.stream()
.filter(supermarketUnitEntity -> supermarketUnitEntity.getId() != null).collect(Collectors.toList());
smErpUnitService.updateBatchById(updateCollect);
smErpUnitService.saveBatch(insertCollect);
smErpUnitService.updateBatchById(updateUnits);
smErpUnitService.saveBatch(insertUnits);
//判断是否修改了基础包装单位,如果修改了基础包装单位的类型,其他的要变成false
// 获取当前有效的基础单位ID(处理新增单位的情况)
Long currentBaseUnitId = baseUnits.get(0).getId() != null ?
baseUnits.get(0).getId() :
insertUnits.stream()
.filter(SmErpUnitEntity::getIsBase)
.findFirst()
.map(SmErpUnitEntity::getId)
.orElse(null);
// 更新其他单位为非基础
if (currentBaseUnitId != null) {
LambdaUpdateWrapper<SmErpUnitEntity> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper
.eq(SmErpUnitEntity::getSpuId, supermarketSpu.getId())
.ne(SmErpUnitEntity::getId, currentBaseUnitId)
.set(SmErpUnitEntity::getIsBase, false);
smErpUnitService.update(updateWrapper);
}
// 删除失效单位
// 获取现有所有包装单位ID
List<Long> existingUnitIds = smErpUnitService.list(
new LambdaQueryWrapper<SmErpUnitEntity>()
.eq(SmErpUnitEntity::getSpuId, supermarketSpu.getId())
).stream().map(SmErpUnitEntity::getId).collect(Collectors.toList());
// 收集本次提交的ID(排除新增的)
List<Long> submittedIds = smErpUnitEntityList.stream()
.map(SmErpUnitEntity::getId)
.filter(Objects::nonNull)
.collect(Collectors.toList());
// 计算需要删除的ID
List<Long> toDeleteIds = existingUnitIds.stream()
.filter(id -> !submittedIds.contains(id))
.collect(Collectors.toList());
// 批量删除失效单位
if (!toDeleteIds.isEmpty()) {
smErpUnitService.removeByIds(toDeleteIds);
}
} else {
return R.failed("包装类型不能为空");
}
@@ -173,9 +229,32 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
insertCollect.stream().forEach(supermarketAuxiliaryCodeEntity -> supermarketAuxiliaryCodeEntity.setSpuId(supermarketSpu.getId()));
smErpAuxiliaryCodeService.saveBatch(insertCollect);
smErpAuxiliaryCodeService.updateBatchById(updateCollect);
// 获取现有所有条码ID
List<Long> existingCodeIds = smErpAuxiliaryCodeService.list(
new LambdaQueryWrapper<SmErpAuxiliaryCodeEntity>()
.eq(SmErpAuxiliaryCodeEntity::getSpuId, supermarketSpu.getId())
).stream().map(SmErpAuxiliaryCodeEntity::getId).collect(Collectors.toList());
// 收集本次提交的ID(排除新增的)
List<Long> submittedCodeIds = smErpAuxiliaryCodeEntityList.stream()
.map(SmErpAuxiliaryCodeEntity::getId)
.filter(Objects::nonNull)
.collect(Collectors.toList());
// 计算需要删除的ID
List<Long> toDeleteCodeIds = existingCodeIds.stream()
.filter(id -> !submittedCodeIds.contains(id))
.collect(Collectors.toList());
// 批量删除失效条码
if (!toDeleteCodeIds.isEmpty()) {
smErpAuxiliaryCodeService.removeByIds(toDeleteCodeIds);
}
} else {
return R.failed("辅助条码不能为空");
}
return R.ok();
}
@@ -201,8 +280,22 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
@Transactional
public R updateSpuStock(SupermarketSpuUpdateStockReqDTO updateStockReqDTO) {
List<UpdateStockDTO> updateStockDTOS = new ArrayList<UpdateStockDTO>();
//出库主表数据
SmErpInventoryRecordsEntity smErpInventoryRecordsEntity = new SmErpInventoryRecordsEntity();
String s = sequence.nextNo();
String result = InventoryTypeEnum.LSCK.getValue() + "-" + s;
smErpInventoryRecordsEntity.setInventoryCode(result);
smErpInventoryRecordsEntity.setInventoryDate(LocalDate.now());
smErpInventoryRecordsEntity.setInventoryType(InventoryTypeEnum.LSCK.getType());
smErpInventoryRecordsEntity.setOrderType(OrderTypeEnum.CK.getType());
smErpInventoryRecordsEntity.setDeviceType(updateStockReqDTO.getDeviceType());
List<SmErpInventoryRecordsItemEntity> smErpInventoryRecordsItemEntityList = new ArrayList<>();
for (SupermarketSpuUpdateStockReqDTO.Item v : updateStockReqDTO.getItems()) {
SmErpUnitEntity smErpUnitEntity = smErpUnitService.getById(v.getId());
//计算包装单位实际需要扣减的库存
Double incrCount = (smErpUnitEntity.getPackageNum()) * v.getIncrCount();
// 查询当前库存
Long spuId = smErpUnitEntity.getSpuId();
SmErpSpuEntity spu = baseMapper.selectById(spuId);
@@ -218,36 +311,36 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
// 检查库存是否足够
if (v.getIncrCount() < 0 && Math.abs(v.getIncrCount()) > smErpStockEntity.getCurrentStock()) {
if (incrCount < 0 && Math.abs(incrCount) > smErpStockEntity.getCurrentStock()) {
return R.failed(spu.getProductName() + "库存不足,无法完成操作");
}
UpdateStockDTO updateStockDTO = new UpdateStockDTO(spuId, v.getIncrCount());
UpdateStockDTO updateStockDTO = new UpdateStockDTO(spuId, incrCount);
updateStockDTOS.add(updateStockDTO);
smErpStockService.updateStock(updateStockDTOS);
//todo 生成出入库记录
SmErpInventoryRecordsEntity smErpInventoryRecordsEntity = new SmErpInventoryRecordsEntity();
String s = sequence.nextNo();
String result = InventoryTypeEnum.LSCK.getValue() + "-" + s;
smErpInventoryRecordsEntity.setInventoryCode(result);
smErpInventoryRecordsEntity.setInventoryDate(LocalDate.now());
smErpInventoryRecordsEntity.setInventoryType(InventoryTypeEnum.LSCK.getType());
smErpInventoryRecordsEntity.setOrderType(OrderTypeEnum.CK.getType());
smErpInventoryRecordsEntity.setDeviceType(updateStockReqDTO.getDeviceType());
smErpInventoryRecordsMapper.insert(smErpInventoryRecordsEntity);
//生成出入库记录
SmErpInventoryRecordsItemEntity smErpInventoryRecordsItemEntity = new SmErpInventoryRecordsItemEntity();
smErpInventoryRecordsItemEntity.setInventoryId(smErpInventoryRecordsEntity.getId());
smErpInventoryRecordsItemEntity.setErpSpuId(spuId);
smErpInventoryRecordsItemEntity.setQuantity(v.getIncrCount());
smErpInventoryRecordsItemEntity.setQuantity(incrCount);
smErpInventoryRecordsItemEntity.setUnitId(v.getId());
smErpInventoryRecordsItemEntity.setOrderType(OrderTypeEnum.CK.getType());
//todo 添加收款金额字段和会员卡号,用于记录零售业务
// 添加收款金额字段和会员卡号,用于记录零售业务,后续扩展使用
smErpInventoryRecordsItemEntity.setUnitPrice
(smErpUnitEntity.getPromotionPrice()==null || smErpUnitEntity.getPromotionPrice()==0
?smErpUnitEntity.getRetailPrice():smErpUnitEntity.getPromotionPrice());
smErpInventoryRecordsItemMapper.insert(smErpInventoryRecordsItemEntity);
smErpInventoryRecordsItemEntityList.add(smErpInventoryRecordsItemEntity);
}
int sum = smErpInventoryRecordsItemEntityList.stream().map(smErpInventoryRecordsItemEntity -> smErpInventoryRecordsItemEntity.getUnitPrice()).mapToInt(Integer::intValue).sum();
smErpInventoryRecordsEntity.setTotalAmount(sum);
smErpInventoryRecordsEntity.setReceiveAmount(sum);
//生成出入库记录
smErpInventoryRecordsMapper.insert(smErpInventoryRecordsEntity);
smErpInventoryRecordsItemEntityList.forEach(smErpInventoryRecordsItemEntity -> {
smErpInventoryRecordsItemEntity.setInventoryId(smErpInventoryRecordsEntity.getId());
});
smErpInventoryRecordsItemMapper.insert(smErpInventoryRecordsItemEntityList);
return R.ok();
}
@@ -394,518 +487,6 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
return smErpSpuEntities;
}
/* @Override
@Transactional
public R importErpSpu(List<SmErpSpuImportDto> smErpSpuImportDtos, BindingResult bindingResult) {
if (CollectionUtils.isEmpty(smErpSpuImportDtos)) {
return R.failed("导入数据不能为空");
}
List<Map<String, Object>> errorList = new ArrayList<>();
List<SmErpSupplierEntity> successList = new ArrayList<>();
for (int i = 0; i < smErpSpuImportDtos.size(); i++) {
int rowNumber = i + 1;
SmErpSpuImportDto dto = smErpSpuImportDtos.get(i);
List<String> errorReasons = new ArrayList<>();
// 数据校验阶段
List<String> validationErrors = ErpSpuValidator.validate(dto, rowNumber);
String productCode = dto.getProductCode();
if (!validationErrors.isEmpty()) {
errorList.add(createErrorInfo(rowNumber, productCode, validationErrors));
continue;
}
//新增商品
//1.先查询当前货号是否存在,存在即更新,不存在即新增
List<SmErpSpuEntity> smErpSpuEntities = baseMapper.selectListByScope(new LambdaQueryWrapper<SmErpSpuEntity>().
eq(SmErpSpuEntity::getProductCode, productCode), DataScope.of());
if (CollectionUtils.isEmpty(smErpSpuEntities)) {
//新增
SmErpSpuEntity smErpSpuEntity = BeanUtils.toBean(dto, SmErpSpuEntity.class);
if (dto.getCommodityNature().equals("电子称称重商品")){
smErpSpuEntity.setProductNature("2");
}else {
smErpSpuEntity.setProductNature("1");
}
//先查询分类是否有,没有自动新增
SmErpCategoryEntity smErpCategoryEntity = smErpCategoryMapper.selectOne
(new LambdaQueryWrapper<SmErpCategoryEntity>().eq(SmErpCategoryEntity::getName, dto.getClassification()));
if (smErpCategoryEntity == null) {
//新增分类
SmErpCategoryEntity smErpCategoryEntity1 = new SmErpCategoryEntity();
smErpCategoryEntity1.setName(dto.getClassification());
smErpCategoryEntity1.setStatus("0");
smErpCategoryMapper.insert(smErpCategoryEntity1);
smErpSpuEntity.setCategoryId(smErpCategoryEntity1.getId());
}else {
smErpSpuEntity.setCategoryId(smErpCategoryEntity.getId());
}
baseMapper.insert(smErpSpuEntity);
//新增包装单位
SmErpUnitEntity smErpUnitEntity = BeanUtils.toBean(dto, SmErpUnitEntity.class);
smErpUnitEntity.setIsBase(true);
smErpUnitEntity.setSpuId(smErpSpuEntity.getId());
smErpUnitService.save(smErpUnitEntity);
//新增库存
SmErpStockEntity smErpStockEntity = new SmErpStockEntity();
smErpStockEntity.setCurrentStock(dto.getStock());
smErpStockEntity.setBaseStock(dto.getStock());
smErpStockEntity.setInventoryLowerLimit(dto.getInventoryLowerLimit());
smErpStockEntity.setInventoryUpperLimit(dto.getInventoryUpperLimit());
smErpStockEntity.setErpSpuId(smErpSpuEntity.getId());
smErpStockMapper.insert(smErpStockEntity);
//新增辅助条码
SmErpAuxiliaryCodeEntity smErpAuxiliaryCodeEntity = new SmErpAuxiliaryCodeEntity();
smErpAuxiliaryCodeEntity.setBarCode(dto.getBarCode());
smErpAuxiliaryCodeEntity.setSpuId(smErpSpuEntity.getId());
smErpAuxiliaryCodeEntity.setUnitId(smErpUnitEntity.getId());
smErpAuxiliaryCodeService.save(smErpAuxiliaryCodeEntity);
}else {
//查到相同的货号,更新
}
}
return null;
}*/
/*
@Override
@Transactional
public R importErpSpu(List<SmErpSpuImportDto> smErpSpuImportDtos, BindingResult bindingResult) {
if (CollectionUtils.isEmpty(smErpSpuImportDtos)) {
return R.failed("导入数据不能为空");
}
List<Map<String, Object>> errorList = new ArrayList<>();
List<SmErpSpuEntity> successList = new ArrayList<>();
for (int i = 0; i < smErpSpuImportDtos.size(); i++) {
int rowNumber = i + 1;
SmErpSpuImportDto dto = smErpSpuImportDtos.get(i);
List<String> errorReasons = new ArrayList<>();
String productCode = dto.getProductCode();
try {
// 数据校验
List<String> validationErrors = ErpSpuValidator.validate(dto, rowNumber);
if (!validationErrors.isEmpty()) {
errorList.add(createErrorInfo(rowNumber, productCode, validationErrors));
continue;
}
// 解析商品分类
Long categoryId = resolveCategory(dto.getClassification(), errorReasons);
if (categoryId == null) {
errorList.add(createErrorInfo(rowNumber, productCode, errorReasons));
continue;
}
// 查询现有商品
SmErpSpuEntity existingSpu = baseMapper.selectOne(new LambdaQueryWrapper<SmErpSpuEntity>()
.eq(SmErpSpuEntity::getProductCode, productCode));
if (existingSpu == null) {
// 新增逻辑
handleNewSpu(dto, categoryId, errorReasons, rowNumber, productCode, errorList);
} else {
// 更新逻辑
handleExistingSpu(existingSpu, dto, categoryId, errorReasons, rowNumber, productCode, errorList);
}
// 记录成功数据
if (errorReasons.isEmpty()) {
successList.add(baseMapper.selectById(existingSpu != null ? existingSpu.getId() : null));
}
} catch (Exception e) {
errorReasons.add("系统异常: " + e.getMessage());
errorList.add(createErrorInfo(rowNumber, productCode, errorReasons));
}
}
return buildImportResult(smErpSpuImportDtos.size(), successList.size(), errorList);
}
// 处理分类(公共方法)
private Long resolveCategory(String categoryName, List<String> errorReasons) {
try {
SmErpCategoryEntity category = smErpCategoryMapper.selectOne(
new LambdaQueryWrapper<SmErpCategoryEntity>()
.eq(SmErpCategoryEntity::getName, categoryName)
);
if (category != null) return category.getId();
// 新建分类
SmErpCategoryEntity newCategory = new SmErpCategoryEntity();
newCategory.setName(categoryName);
newCategory.setStatus("0"); // 假设0为启用状态
if (smErpCategoryMapper.insert(newCategory) > 0) {
return newCategory.getId();
}
errorReasons.add("分类创建失败");
} catch (DuplicateKeyException e) {
// 处理并发创建场景
return smErpCategoryMapper.selectOne(
new LambdaQueryWrapper<SmErpCategoryEntity>()
.eq(SmErpCategoryEntity::getName, categoryName)
).getId();
}
return null;
}
// 处理新增商品
private void handleNewSpu(SmErpSpuImportDto dto, Long categoryId, List<String> errorReasons,
int rowNumber, String productCode, List<Map<String, Object>> errorList) {
try {
SmErpSpuEntity newSpu = BeanUtils.toBean(dto, SmErpSpuEntity.class);
newSpu.setProductNature(dto.getCommodityNature().equals("电子称称重商品") ? "2" : "1");
newSpu.setCategoryId(categoryId);
if (baseMapper.insert(newSpu) <= 0) {
errorReasons.add("商品创建失败");
errorList.add(createErrorInfo(rowNumber, productCode, errorReasons));
return;
}
// 处理关联数据
handleRelatedData(newSpu, dto, errorReasons, rowNumber, productCode, errorList);
} catch (DuplicateKeyException e) {
errorReasons.add("货号已存在");
errorList.add(createErrorInfo(rowNumber, productCode, errorReasons));
}
}
// 处理更新商品
private void handleExistingSpu(SmErpSpuEntity existingSpu, SmErpSpuImportDto dto, Long categoryId,
List<String> errorReasons, int rowNumber, String productCode,
List<Map<String, Object>> errorList) {
try {
// 更新主数据
org.springframework.beans.BeanUtils.copyProperties(dto, existingSpu);
existingSpu.setProductNature(dto.getCommodityNature().equals("电子称称重商品") ? "2" : "1");
existingSpu.setCategoryId(categoryId);
if (baseMapper.updateById(existingSpu) <= 0) {
errorReasons.add("商品更新失败");
errorList.add(createErrorInfo(rowNumber, productCode, errorReasons));
return;
}
// 处理关联数据
handleRelatedData(existingSpu, dto, errorReasons, rowNumber, productCode, errorList);
} catch (Exception e) {
errorReasons.add("更新异常: " + e.getMessage());
errorList.add(createErrorInfo(rowNumber, productCode, errorReasons));
}
}
// 处理关联数据(单位、库存、条码)
private void handleRelatedData(SmErpSpuEntity spu, SmErpSpuImportDto dto, List<String> errorReasons,
int rowNumber, String productCode, List<Map<String, Object>> errorList) {
// 处理包装单位
SmErpUnitEntity unit = smErpUnitService.getOne(
new LambdaQueryWrapper<SmErpUnitEntity>()
.eq(SmErpUnitEntity::getSpuId, spu.getId())
);
try {
if (unit != null) {
// 更新单位
org.springframework.beans.BeanUtils.copyProperties(dto, unit);
smErpUnitService.updateById(unit);
} else {
// 新增单位
unit = BeanUtils.toBean(dto, SmErpUnitEntity.class);
unit.setSpuId(spu.getId());
unit.setIsBase(true);
smErpUnitService.save(unit);
}
} catch (Exception e) {
errorReasons.add("包装单位处理失败: " + e.getMessage());
}
// 处理库存
SmErpStockEntity stock = smErpStockMapper.selectOne(
new LambdaQueryWrapper<SmErpStockEntity>()
.eq(SmErpStockEntity::getErpSpuId, spu.getId())
);
try {
if (stock != null) {
// 更新库存
stock.setCurrentStock(dto.getStock());
stock.setBaseStock(dto.getStock());
stock.setInventoryLowerLimit(dto.getInventoryLowerLimit());
stock.setInventoryUpperLimit(dto.getInventoryUpperLimit());
smErpStockMapper.updateById(stock);
} else {
// 新增库存
stock = BeanUtils.toBean(dto, SmErpStockEntity.class);
stock.setErpSpuId(spu.getId());
smErpStockMapper.insert(stock);
}
} catch (Exception e) {
errorReasons.add("库存处理失败: " + e.getMessage());
}
// 处理辅助条码
SmErpAuxiliaryCodeEntity code = smErpAuxiliaryCodeService.getOne(
new LambdaQueryWrapper<SmErpAuxiliaryCodeEntity>()
.eq(SmErpAuxiliaryCodeEntity::getSpuId, spu.getId())
);
try {
if (code != null) {
// 更新条码
code.setBarCode(dto.getBarCode());
code.setUnitId(unit.getId());
smErpAuxiliaryCodeService.updateById(code);
} else {
// 新增条码
code = new SmErpAuxiliaryCodeEntity();
code.setBarCode(dto.getBarCode());
code.setSpuId(spu.getId());
code.setUnitId(unit.getId());
smErpAuxiliaryCodeService.save(code);
}
} catch (Exception e) {
errorReasons.add("条码处理失败: " + e.getMessage());
}
// 记录错误
if (!errorReasons.isEmpty()) {
errorList.add(createErrorInfo(rowNumber, productCode, errorReasons));
}
}
// 构建返回结果(与供应商导入保持一致)
private R buildImportResult(int total, int successCount, List<Map<String, Object>> errorList) {
Map<String, Object> result = new LinkedHashMap<>();
result.put("total", total);
result.put("successCount", successCount);
result.put("errorCount", errorList.size());
if (!errorList.isEmpty()) {
result.put("errors", errorList);
return R.failed(result,"部分数据导入失败");
}
return R.ok( result,"成功导入所有" + successCount + "条数据");
}
// 错误信息构建方法
private Map<String, Object> createErrorInfo(int row, String name, List<String> reasons) {
return new HashMap<String, Object>() {{
put("row", row);
put("supplierName", name);
put("reasons", reasons);
}};
}
*/
// private R buildImportResult(int total, int successCount, List<Map<String, Object>> errorList) {
// Map<String, Object> result = new LinkedHashMap<>();
// result.put("total", total);
// result.put("successCount", successCount);
// result.put("errorCount", errorList.size());
//
// if (!errorList.isEmpty()) {
// result.put("errors", errorList);
// return R.failed(result,"部分数据导入失败");
// }
// return R.ok( result,"成功导入所有" + successCount + "条数据");
// }
// // 错误信息构建方法
// private Map<String, Object> createErrorInfo(int row, String name, List<String> reasons) {
// return new HashMap<String, Object>() {{
// put("row", row);
// put("supplierName", name);
// put("reasons", reasons);
// }};
// }
/* @Override
@Transactional(rollbackFor = Exception.class)
public R importErpSpu(List<SmErpSpuImportDto> smErpSpuImportDtos, BindingResult bindingResult) {
if (CollectionUtils.isEmpty(smErpSpuImportDtos)) {
return R.failed("导入数据不能为空");
}
List<Map<String, Object>> errorList = new ArrayList<>();
List<SmErpSpuEntity> successList = new ArrayList<>();
// 批量处理分类
Map<String, Long> categoryMap = resolveCategories(smErpSpuImportDtos, errorList);
// 批量处理商品
List<SmErpSpuEntity> spuBatch = new ArrayList<>();
List<SmErpUnitEntity> unitBatch = new ArrayList<>();
List<SmErpStockEntity> stockBatch = new ArrayList<>();
List<SmErpAuxiliaryCodeEntity> codeBatch = new ArrayList<>();
for (int i = 0; i < smErpSpuImportDtos.size(); i++) {
int rowNumber = i + 1;
SmErpSpuImportDto dto = smErpSpuImportDtos.get(i);
List<String> errorReasons = new ArrayList<>();
String productCode = dto.getProductCode();
try {
// 数据校验
List<String> validationErrors = ErpSpuValidator.validate(dto, rowNumber);
if (!validationErrors.isEmpty()) {
errorList.add(createErrorInfo(rowNumber, productCode, validationErrors));
continue;
}
// 获取分类ID
Long categoryId = categoryMap.get(dto.getClassification());
if (categoryId == null) {
errorReasons.add("分类不存在且创建失败");
errorList.add(createErrorInfo(rowNumber, productCode, errorReasons));
continue;
}
// 构造商品实体
SmErpSpuEntity spu = BeanUtils.toBean(dto, SmErpSpuEntity.class);
spu.setProductNature("电子称称重商品".equals(dto.getCommodityNature()) ? "2" : "1");
spu.setCategoryId(categoryId);
spuBatch.add(spu);
// 构造关联数据
buildRelatedData(dto, spu, unitBatch, stockBatch, codeBatch);
successList.add(spu);
} catch (Exception e) {
errorReasons.add("系统异常: " + e.getMessage());
errorList.add(createErrorInfo(rowNumber, productCode, errorReasons));
}
}
// 批量数据库操作
try {
// 批量插入/更新商品
if (!spuBatch.isEmpty()) {
saveOrUpdateBatchSpu(spuBatch);
}
// 批量处理关联数据
if (!unitBatch.isEmpty()) {
smErpUnitService.saveOrUpdateBatch(unitBatch);
}
if (!stockBatch.isEmpty()) {
smErpStockService.saveOrUpdateBatch(stockBatch);
}
if (!codeBatch.isEmpty()) {
smErpAuxiliaryCodeService.saveOrUpdateBatch(codeBatch);
}
} catch (Exception e) {
throw new RuntimeException("批量操作失败", e);
}
return buildImportResult(smErpSpuImportDtos.size(), successList.size(), errorList);
}
// 批量处理分类
private Map<String, Long> resolveCategories(List<SmErpSpuImportDto> dtos, List<Map<String, Object>> errorList) {
// 获取所有分类名称
Set<String> categoryNames = dtos.stream()
.map(SmErpSpuImportDto::getClassification)
.collect(Collectors.toSet());
// 批量查询已有分类
List<SmErpCategoryEntity> existCategories = smErpCategoryMapper.selectList(
new LambdaQueryWrapper<SmErpCategoryEntity>()
.in(SmErpCategoryEntity::getName, categoryNames));
Map<String, Long> categoryMap = existCategories.stream()
.collect(Collectors.toMap(SmErpCategoryEntity::getName, SmErpCategoryEntity::getId));
// 找出需要新增的分类
List<SmErpCategoryEntity> newCategories = categoryNames.stream()
.filter(name -> !categoryMap.containsKey(name))
.map(name -> {
SmErpCategoryEntity category = new SmErpCategoryEntity();
category.setName(name);
category.setStatus("0");
return category;
})
.collect(Collectors.toList());
// 批量插入新分类
if (!newCategories.isEmpty()) {
smCategoryService.saveBatch(newCategories);
newCategories.forEach(cat -> categoryMap.put(cat.getName(), cat.getId()));
}
return categoryMap;
}
// 批量保存或更新商品
private void saveOrUpdateBatchSpu(List<SmErpSpuEntity> spuList) {
// 按货号分组
Map<String, List<SmErpSpuEntity>> spuMap = spuList.stream()
.collect(Collectors.groupingBy(SmErpSpuEntity::getProductCode));
// 批量查询已存在的商品
List<SmErpSpuEntity> existSpus = baseMapper.selectList(
new LambdaQueryWrapper<SmErpSpuEntity>()
.in(SmErpSpuEntity::getProductCode, spuMap.keySet()));
// 分离新增和更新数据
List<SmErpSpuEntity> toInsert = new ArrayList<>();
List<SmErpSpuEntity> toUpdate = new ArrayList<>();
spuList.forEach(spu -> {
Optional<SmErpSpuEntity> exist = existSpus.stream()
.filter(e -> e.getProductCode().equals(spu.getProductCode()))
.findFirst();
if (exist.isPresent()) {
SmErpSpuEntity entity = exist.get();
org.springframework.beans.BeanUtils.copyProperties(spu, entity);
toUpdate.add(entity);
} else {
toInsert.add(spu);
}
});
// 批量操作
if (!toInsert.isEmpty()) {
this.saveBatch((toInsert));
}
if (!toUpdate.isEmpty()) {
this.updateBatchById(toUpdate);
}
}
// 构建关联数据
private void buildRelatedData(SmErpSpuImportDto dto, SmErpSpuEntity spu,
List<SmErpUnitEntity> unitBatch,
List<SmErpStockEntity> stockBatch,
List<SmErpAuxiliaryCodeEntity> codeBatch) {
// 包装单位
SmErpUnitEntity unit = BeanUtils.toBean(dto, SmErpUnitEntity.class);
unit.setSpuId(spu.getId());
unit.setIsBase(true);
unitBatch.add(unit);
// 库存
SmErpStockEntity stock = BeanUtils.toBean(dto, SmErpStockEntity.class);
stock.setErpSpuId(spu.getId());
stock.setCurrentStock(dto.getStock());
stock.setBaseStock(dto.getStock());
stockBatch.add(stock);
// 辅助条码
SmErpAuxiliaryCodeEntity code = new SmErpAuxiliaryCodeEntity();
code.setBarCode(dto.getBarCode());
code.setSpuId(spu.getId());
code.setUnitId(unit.getId());
codeBatch.add(code);
}
*/
@Override
@@ -27,6 +27,7 @@
<result property="delFlag" column="del_flag"/>
<result property="tenantId" column="tenant_id"/>
<result property="deviceType" column="device_type"/>
<result property="receiveAmount" column="receive_amount"/>
</resultMap>
<select id="getInventoryDetailPageByScope"
resultType="com.bsd.pjcloud.supermarket.vo.inventoryrecord.InventoryRecordPageVo" parameterType="com.bsd.pjcloud.supermarket.dto.inventoryrecords.InventoryDetailQueryDTO">
@@ -40,7 +40,7 @@
LEFT JOIN sm_erp_spu esp
on sp.erp_spu_id = esp.id
LEFT JOIN sm_erp_unit u
on esp.id=u.spu_id
on esp.id=u.spu_id and u.is_base=1
LEFT JOIN sm_erp_stock stock
on esp.id = stock.erp_spu_id
<where>