diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/SupermarketSpuUpdateStockReqDTO.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/SupermarketSpuUpdateStockReqDTO.java index 50359909d..17b864c1d 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/SupermarketSpuUpdateStockReqDTO.java +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/SupermarketSpuUpdateStockReqDTO.java @@ -45,7 +45,7 @@ public class SupermarketSpuUpdateStockReqDTO { * 负数:扣减库存 */ @NotNull(message = "库存变化数量不能为空") - private Integer incrCount; + private Double incrCount; } diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/inventoryrecords/InventoryRecordEditDTO.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/inventoryrecords/InventoryRecordEditDTO.java new file mode 100644 index 000000000..ee8253d37 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/inventoryrecords/InventoryRecordEditDTO.java @@ -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 items; + + + + +} diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/inventoryrecords/InventoryRecordEditItemDTO.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/inventoryrecords/InventoryRecordEditItemDTO.java new file mode 100644 index 000000000..34c0d6cbf --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/inventoryrecords/InventoryRecordEditItemDTO.java @@ -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; + + +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/inventoryrecords/UpdateStockDTO.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/inventoryrecords/UpdateStockDTO.java index bb16e1095..d27d92548 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/inventoryrecords/UpdateStockDTO.java +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/inventoryrecords/UpdateStockDTO.java @@ -31,7 +31,7 @@ public class UpdateStockDTO { * 负数:扣减库存 */ @NotNull(message = "库存变化数量不能为空") - private Integer incrCount; + private Double incrCount; } diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/SmErpInventoryRecordsEntity.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/SmErpInventoryRecordsEntity.java index 97ae11e38..01e9c9825 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/SmErpInventoryRecordsEntity.java +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/SmErpInventoryRecordsEntity.java @@ -172,4 +172,7 @@ public class SmErpInventoryRecordsEntity extends Model wrapper = Wrappers.lambdaQuery(); wrapper.like(StrUtil.isNotBlank(inventoryLinkQueryDTO.getCode()),SmErpInventoryRecordsEntity::getInventoryCode,inventoryLinkQueryDTO.getCode()); wrapper.eq(Objects.nonNull(inventoryLinkQueryDTO.getDdDate()),SmErpInventoryRecordsEntity::getInventoryDate,inventoryLinkQueryDTO.getDdDate()); diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpCgDdService.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpCgDdService.java index 7ba991bfa..ecf420e81 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpCgDdService.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpCgDdService.java @@ -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 { @@ -37,4 +39,12 @@ public interface SmErpCgDdService extends IService { Object pageScope(Page page, LambdaQueryWrapper wrapper); + + + /** + * 删除 + * @param list + * @return + */ + Object removeCgDdByIds(ArrayList list); } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpInventoryRecordsService.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpInventoryRecordsService.java index 1ba0168d6..cf1e077ca 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpInventoryRecordsService.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpInventoryRecordsService.java @@ -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 { @@ -66,4 +69,16 @@ public interface SmErpInventoryRecordsService extends IService list); } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpCgDdServiceImpl.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpCgDdServiceImpl.java index b99455cfd..d1e00f821 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpCgDdServiceImpl.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpCgDdServiceImpl.java @@ -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 items = erpCgDDEditDTO.getItems(); - List cgPlanItemEntities = BeanUtils.toBean(items, SmErpCgDdItemEntity.class); + List cgDdItemEntities = BeanUtils.toBean(items, SmErpCgDdItemEntity.class); - List insertCollect = cgPlanItemEntities.stream() + List insertCollect = cgDdItemEntities.stream() .filter(supermarketUnitEntity -> supermarketUnitEntity.getId() == null).collect(Collectors.toList()); insertCollect.forEach(c -> c.setHId(smErpCgDdEntity.getId())); -// -// List updateCollect = cgPlanItemEntities.stream() -// .filter(supermarketUnitEntity -> supermarketUnitEntity.getId() != null).collect(Collectors.toList()); -// smErpCgPlanItemMapper.updateById(updateCollect); - smErpCgDDItemMapper.insertOrUpdate(cgPlanItemEntities); + + + List updateCollect = cgDdItemEntities.stream() + .filter(supermarketUnitEntity -> supermarketUnitEntity.getId() != null).collect(Collectors.toList()); + smErpCgDDItemMapper.updateById(updateCollect); + smErpCgDDItemMapper.insert(insertCollect); + + List existingCodeIds = smErpCgDDItemMapper.selectList( + new LambdaQueryWrapper() + .eq(SmErpCgDdItemEntity::getHId, smErpCgDdEntity.getId()) + ).stream().map(SmErpCgDdItemEntity::getId).collect(Collectors.toList()); + + // 收集本次提交的ID(排除新增的) + List submittedCodeIds = updateCollect.stream() + .map(SmErpCgDdItemEntity::getId) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + // 计算需要删除的ID + List 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 pageData = baseMapper.selectPageByScope(page, wrapper, DataScope.of()); List records = pageData.getRecords(); - + if (CollectionUtils.isEmpty(records)){ + return pageData; + } // 2. 提前收集所有主表ID(去重处理) Set planIds = records.stream() .map(SmErpCgDdEntity::getId) @@ -226,4 +247,25 @@ public class SmErpCgDdServiceImpl extends ServiceImpl list) { + //首先先查询是否有当前数据权限 + LambdaQueryWrapper eq = new LambdaQueryWrapper().in(SmErpCgDdEntity::getId, list); + List smErpCgDdEntities = baseMapper.selectListByScope(eq,DataScope.of()); + List delIds= smErpCgDdEntities.stream().map(smErpCgDdEntity -> smErpCgDdEntity.getId()).collect(Collectors.toList()); + + + LambdaQueryWrapper itemEntityLambdaQueryWrapper = new LambdaQueryWrapper().in(SmErpCgDdItemEntity::getHId, delIds); + smErpCgDDItemMapper.delete(itemEntityLambdaQueryWrapper); + baseMapper.deleteByIds(delIds); + List toDeleteIds = delIds.stream() + .filter(id -> !list.contains(id)) + .collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(toDeleteIds)){ + return R.failed("越权删除!"); + } + return R.ok(); + } } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpCgPlanServiceImpl.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpCgPlanServiceImpl.java index 81d855746..3274e6445 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpCgPlanServiceImpl.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpCgPlanServiceImpl.java @@ -85,11 +85,32 @@ public class SmErpCgPlanServiceImpl extends ServiceImpl insertCollect = cgPlanItemEntities.stream() .filter(supermarketUnitEntity -> supermarketUnitEntity.getId() == null).collect(Collectors.toList()); insertCollect.forEach(c -> c.setPlanId(smErpCgPlanEntity.getId())); -// -// List updateCollect = cgPlanItemEntities.stream() -// .filter(supermarketUnitEntity -> supermarketUnitEntity.getId() != null).collect(Collectors.toList()); -// smErpCgPlanItemMapper.updateById(updateCollect); - smErpCgPlanItemMapper.insertOrUpdate(cgPlanItemEntities); + + List updateCollect = cgPlanItemEntities.stream() + .filter(supermarketUnitEntity -> supermarketUnitEntity.getId() != null).collect(Collectors.toList()); + smErpCgPlanItemMapper.updateById(updateCollect); + smErpCgPlanItemMapper.insert(insertCollect); + + List existingCodeIds = smErpCgPlanItemMapper.selectList( + new LambdaQueryWrapper() + .eq(SmErpCgPlanItemEntity::getPlanId, smErpCgPlanEntity.getId()) + ).stream().map(SmErpCgPlanItemEntity::getId).collect(Collectors.toList()); + + // 收集本次提交的ID(排除新增的) + List submittedCodeIds = updateCollect.stream() + .map(SmErpCgPlanItemEntity::getId) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + // 计算需要删除的ID + List toDeleteCodeIds = existingCodeIds.stream() + .filter(id -> !submittedCodeIds.contains(id)) + .collect(Collectors.toList()); + + // 批量删除失效条码 + if (!toDeleteCodeIds.isEmpty()) { + smErpCgPlanItemMapper.deleteByIds(toDeleteCodeIds); + } return R.ok(i); } diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpInventoryRecordsServiceImpl.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpInventoryRecordsServiceImpl.java index 9897f2aa5..0226d9ab4 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpInventoryRecordsServiceImpl.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpInventoryRecordsServiceImpl.java @@ -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 wrapper) { Page pageData = baseMapper.selectPageByScope(page, wrapper, DataScope.of()); - List records = pageData.getRecords(); - + List records = pageData.getRecords(); + if (CollectionUtils.isEmpty(records)){ + return pageData; + } // 2. 提前收集所有主表ID(去重处理) Set planIds = records.stream() - .map(SmErpCgPlanEntity::getId) + .map(SmErpInventoryRecordsEntity::getId) .collect(Collectors.toSet()); // 3. 批量查询所有子表数据(仅1次数据库查询) @@ -322,5 +322,65 @@ public class SmErpInventoryRecordsServiceImpl extends ServiceImpl items = inventoryRecordEditDTO.getItems(); + List smErpInventoryRecordsItemEntityList = BeanUtils.toBean(items, SmErpInventoryRecordsItemEntity.class); + + List updateItems = smErpInventoryRecordsItemEntityList.stream(). + filter(smErpInventoryRecordsItemEntity -> smErpInventoryRecordsItemEntity.getId() == null).collect(Collectors.toList()); + List insertItems = smErpInventoryRecordsItemEntityList.stream(). + filter(smErpInventoryRecordsItemEntity -> smErpInventoryRecordsItemEntity.getId() != null).collect(Collectors.toList()); + smErpInventoryRecordsItemMapper.updateById(updateItems); + smErpInventoryRecordsItemMapper.insert(insertItems); + + List existingCodeIds = smErpInventoryRecordsItemMapper.selectList( + new LambdaQueryWrapper() + .eq(SmErpInventoryRecordsItemEntity::getInventoryId, smErpInventoryRecordsEntity.getId()) + ).stream().map(SmErpInventoryRecordsItemEntity::getId).collect(Collectors.toList()); + + // 收集本次提交的ID(排除新增的) + List submittedCodeIds = updateItems.stream() + .map(SmErpInventoryRecordsItemEntity::getId) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + // 计算需要删除的ID + List toDeleteCodeIds = existingCodeIds.stream() + .filter(id -> !submittedCodeIds.contains(id)) + .collect(Collectors.toList()); + + // 批量删除失效条码 + if (!toDeleteCodeIds.isEmpty()) { + smErpInventoryRecordsItemMapper.deleteByIds(toDeleteCodeIds); + } + + return i; + } + + @Override + public Object removeBatch(ArrayList list) { + //首先先查询是否有当前数据权限 + LambdaQueryWrapper eq = new LambdaQueryWrapper().in(SmErpInventoryRecordsEntity::getId, list); + List smErpCgDdEntities = baseMapper.selectListByScope(eq,DataScope.of()); + List delIds= smErpCgDdEntities.stream().map(smErpCgDdEntity -> smErpCgDdEntity.getId()).collect(Collectors.toList()); + + LambdaQueryWrapper itemEntityLambdaQueryWrapper = new LambdaQueryWrapper() + .in(SmErpInventoryRecordsItemEntity::getInventoryId, delIds); + smErpInventoryRecordsItemMapper.delete(itemEntityLambdaQueryWrapper); + baseMapper.deleteByIds(delIds); + List toDeleteIds = delIds.stream() + .filter(id -> !list.contains(id)) + .collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(toDeleteIds)){ + return R.failed("越权删除!"); + } + return R.ok(); + } + } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpSpuServiceImpl.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpSpuServiceImpl.java index ce7da6ba5..38f2239c2 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpSpuServiceImpl.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpSpuServiceImpl.java @@ -109,6 +109,10 @@ public class SmErpSpuServiceImpl extends ServiceImpl smErpUnitEntityList = supermarketSpu.getSmErpUnitEntityList(); + List 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 smErpUnitEntityList = supermarketSpu.getSmErpUnitEntityList(); + if (CollectionUtils.isNotEmpty(smErpUnitEntityList)) { + + List baseUnits = smErpUnitEntityList.stream() + .filter(unit -> Boolean.TRUE.equals(unit.getIsBase())) + .collect(Collectors.toList()); + + // 检查基础单位数量 + if ( baseUnits.size() != 1) { + return R.failed("必须且只能指定一个基础包装单位!"); + } + //id为null新增 - List insertCollect = smErpUnitEntityList.stream() + List insertUnits = smErpUnitEntityList.stream() .filter(supermarketUnitEntity -> supermarketUnitEntity.getId() == null).collect(Collectors.toList()); - insertCollect.forEach(supermarketUnitEntity -> supermarketUnitEntity.setSpuId(supermarketSpu.getId())); - List updateCollect = smErpUnitEntityList.stream() + insertUnits.forEach(supermarketUnitEntity -> supermarketUnitEntity.setSpuId(supermarketSpu.getId())); + List 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 updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper + .eq(SmErpUnitEntity::getSpuId, supermarketSpu.getId()) + .ne(SmErpUnitEntity::getId, currentBaseUnitId) + .set(SmErpUnitEntity::getIsBase, false); + smErpUnitService.update(updateWrapper); + } + // 删除失效单位 + // 获取现有所有包装单位ID + List existingUnitIds = smErpUnitService.list( + new LambdaQueryWrapper() + .eq(SmErpUnitEntity::getSpuId, supermarketSpu.getId()) + ).stream().map(SmErpUnitEntity::getId).collect(Collectors.toList()); + + // 收集本次提交的ID(排除新增的) + List submittedIds = smErpUnitEntityList.stream() + .map(SmErpUnitEntity::getId) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + // 计算需要删除的ID + List 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 supermarketAuxiliaryCodeEntity.setSpuId(supermarketSpu.getId())); smErpAuxiliaryCodeService.saveBatch(insertCollect); smErpAuxiliaryCodeService.updateBatchById(updateCollect); + + // 获取现有所有条码ID + List existingCodeIds = smErpAuxiliaryCodeService.list( + new LambdaQueryWrapper() + .eq(SmErpAuxiliaryCodeEntity::getSpuId, supermarketSpu.getId()) + ).stream().map(SmErpAuxiliaryCodeEntity::getId).collect(Collectors.toList()); + + // 收集本次提交的ID(排除新增的) + List submittedCodeIds = smErpAuxiliaryCodeEntityList.stream() + .map(SmErpAuxiliaryCodeEntity::getId) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + // 计算需要删除的ID + List 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 updateStockDTOS = new ArrayList(); + //出库主表数据 + 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 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 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 smErpSpuImportDtos, BindingResult bindingResult) { - if (CollectionUtils.isEmpty(smErpSpuImportDtos)) { - return R.failed("导入数据不能为空"); - } - List> errorList = new ArrayList<>(); - List successList = new ArrayList<>(); - for (int i = 0; i < smErpSpuImportDtos.size(); i++) { - int rowNumber = i + 1; - SmErpSpuImportDto dto = smErpSpuImportDtos.get(i); - List errorReasons = new ArrayList<>(); - // 数据校验阶段 - List validationErrors = ErpSpuValidator.validate(dto, rowNumber); - String productCode = dto.getProductCode(); - if (!validationErrors.isEmpty()) { - errorList.add(createErrorInfo(rowNumber, productCode, validationErrors)); - continue; - } - //新增商品 - //1.先查询当前货号是否存在,存在即更新,不存在即新增 - List smErpSpuEntities = baseMapper.selectListByScope(new LambdaQueryWrapper(). - 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().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 smErpSpuImportDtos, BindingResult bindingResult) { - if (CollectionUtils.isEmpty(smErpSpuImportDtos)) { - return R.failed("导入数据不能为空"); - } - - List> errorList = new ArrayList<>(); - List successList = new ArrayList<>(); - - for (int i = 0; i < smErpSpuImportDtos.size(); i++) { - int rowNumber = i + 1; - SmErpSpuImportDto dto = smErpSpuImportDtos.get(i); - List errorReasons = new ArrayList<>(); - String productCode = dto.getProductCode(); - - try { - // 数据校验 - List 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() - .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 errorReasons) { - try { - SmErpCategoryEntity category = smErpCategoryMapper.selectOne( - new LambdaQueryWrapper() - .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() - .eq(SmErpCategoryEntity::getName, categoryName) - ).getId(); - } - return null; - } - - // 处理新增商品 - private void handleNewSpu(SmErpSpuImportDto dto, Long categoryId, List errorReasons, - int rowNumber, String productCode, List> 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 errorReasons, int rowNumber, String productCode, - List> 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 errorReasons, - int rowNumber, String productCode, List> errorList) { - // 处理包装单位 - SmErpUnitEntity unit = smErpUnitService.getOne( - new LambdaQueryWrapper() - .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() - .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() - .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> errorList) { - Map 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 createErrorInfo(int row, String name, List reasons) { - return new HashMap() {{ - put("row", row); - put("supplierName", name); - put("reasons", reasons); - }}; - } -*/ - -// private R buildImportResult(int total, int successCount, List> errorList) { -// Map 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 createErrorInfo(int row, String name, List reasons) { -// return new HashMap() {{ -// put("row", row); -// put("supplierName", name); -// put("reasons", reasons); -// }}; -// } - /* @Override - @Transactional(rollbackFor = Exception.class) - public R importErpSpu(List smErpSpuImportDtos, BindingResult bindingResult) { - if (CollectionUtils.isEmpty(smErpSpuImportDtos)) { - return R.failed("导入数据不能为空"); - } - - List> errorList = new ArrayList<>(); - List successList = new ArrayList<>(); - - // 批量处理分类 - Map categoryMap = resolveCategories(smErpSpuImportDtos, errorList); - - // 批量处理商品 - List spuBatch = new ArrayList<>(); - List unitBatch = new ArrayList<>(); - List stockBatch = new ArrayList<>(); - List codeBatch = new ArrayList<>(); - - for (int i = 0; i < smErpSpuImportDtos.size(); i++) { - int rowNumber = i + 1; - SmErpSpuImportDto dto = smErpSpuImportDtos.get(i); - List errorReasons = new ArrayList<>(); - String productCode = dto.getProductCode(); - - try { - // 数据校验 - List 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 resolveCategories(List dtos, List> errorList) { - // 获取所有分类名称 - Set categoryNames = dtos.stream() - .map(SmErpSpuImportDto::getClassification) - .collect(Collectors.toSet()); - - // 批量查询已有分类 - List existCategories = smErpCategoryMapper.selectList( - new LambdaQueryWrapper() - .in(SmErpCategoryEntity::getName, categoryNames)); - - Map categoryMap = existCategories.stream() - .collect(Collectors.toMap(SmErpCategoryEntity::getName, SmErpCategoryEntity::getId)); - - // 找出需要新增的分类 - List 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 spuList) { - // 按货号分组 - Map> spuMap = spuList.stream() - .collect(Collectors.groupingBy(SmErpSpuEntity::getProductCode)); - - // 批量查询已存在的商品 - List existSpus = baseMapper.selectList( - new LambdaQueryWrapper() - .in(SmErpSpuEntity::getProductCode, spuMap.keySet())); - - // 分离新增和更新数据 - List toInsert = new ArrayList<>(); - List toUpdate = new ArrayList<>(); - - spuList.forEach(spu -> { - Optional 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 unitBatch, - List stockBatch, - List 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 diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmErpInventoryRecordsMapper.xml b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmErpInventoryRecordsMapper.xml index 9d00a4195..62052c9ba 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmErpInventoryRecordsMapper.xml +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmErpInventoryRecordsMapper.xml @@ -27,6 +27,7 @@ +