Merge branches 'master' and 'master' of http://gitea.zianxin.com/zianxin-tec/biz-api-cloud
This commit is contained in:
commit
6b1265cdb9
17 files changed
+530
-572
No files matched your search
+1
-1
@@ -45,7 +45,7 @@ public class SupermarketSpuUpdateStockReqDTO {
|
||||
* 负数:扣减库存
|
||||
*/
|
||||
@NotNull(message = "库存变化数量不能为空")
|
||||
private Integer incrCount;
|
||||
private Double incrCount;
|
||||
|
||||
}
|
||||
|
||||
|
||||
+129
@@ -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;
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
+100
@@ -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;
|
||||
|
||||
|
||||
}
|
||||
+1
-1
@@ -31,7 +31,7 @@ public class UpdateStockDTO {
|
||||
* 负数:扣减库存
|
||||
*/
|
||||
@NotNull(message = "库存变化数量不能为空")
|
||||
private Integer incrCount;
|
||||
private Double incrCount;
|
||||
|
||||
|
||||
}
|
||||
+3
@@ -172,4 +172,7 @@ public class SmErpInventoryRecordsEntity extends Model<SmErpInventoryRecordsEnti
|
||||
@Schema(description="经办人名称")
|
||||
@TableField(exist = false)
|
||||
private String handlerUserName;
|
||||
|
||||
@Schema(description="收货数量")
|
||||
private Integer receiveAmount;
|
||||
}
|
||||
+1
-1
@@ -57,7 +57,7 @@ public class SmErpInventoryRecordsItemEntity extends Model<SmErpInventoryRecords
|
||||
* 出入库数量
|
||||
*/
|
||||
@Schema(description="出入库数量")
|
||||
private Integer quantity;
|
||||
private Double quantity;
|
||||
|
||||
/**
|
||||
* 单价
|
||||
|
||||
+1
-1
@@ -21,7 +21,7 @@ public class SmErpCgDdVo {
|
||||
private String code;
|
||||
|
||||
|
||||
@Schema(description="据日期")
|
||||
@Schema(description="单据日期")
|
||||
private LocalDate ddDate;
|
||||
|
||||
/**
|
||||
|
||||
+1
-1
@@ -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)));
|
||||
}
|
||||
|
||||
|
||||
|
||||
+5
-9
@@ -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());
|
||||
|
||||
+10
@@ -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);
|
||||
}
|
||||
+15
@@ -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);
|
||||
}
|
||||
+55
-13
@@ -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();
|
||||
}
|
||||
}
|
||||
+26
-5
@@ -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);
|
||||
}
|
||||
|
||||
+67
-7
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+113
-532
@@ -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
|
||||
|
||||
+1
@@ -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">
|
||||
|
||||
+1
-1
@@ -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>
|
||||
|
||||
Reference in new issue
Block a user