This commit is contained in:
dzc committed 2025-02-24 10:52:39 +08:00
commit 6c2bf7935a
16 files changed
+211 -30

No files matched your search

@@ -13,7 +13,9 @@ public enum InventoryTypeEnum {
CGRK(1, "CGSQ"),
CKDD(2, "CGDD"),
CKRK(3, "CGRK"),
CKTH(4, "CGTH")
CKTH(4, "CGTH"),
LSCK(5, "LSCK"),
LSTH(6, "LSTH")
;
private final Integer type;
private final String value;
@@ -22,13 +22,13 @@ public class ErpCgDDEditDTO {
* 采购计划编号
*/
@Schema(description="采购计划编号")
private String planCode;
private String code;
/**
* 采购计划单据日期
*/
@Schema(description="采购计划单据日期")
private LocalDate planDate;
private LocalDate ddDate;
/**
* 仓库id
@@ -19,14 +19,14 @@ public class ErpCgDDSaveDTO {
/**
* 采购计划编号
*/
@Schema(description="采购计划编号")
private String planCode;
@Schema(description="编号")
private String code;
/**
* 采购计划单据日期
*/
@Schema(description="采购计划单据日期")
private LocalDate planDate;
@Schema(description="单据日期")
private LocalDate ddDate;
/**
* 仓库id
@@ -40,7 +40,7 @@ public class SmErpCgDdEntity extends Model<SmErpCgDdEntity> {
* 单据日期
*/
@Schema(description="单据日期")
private LocalDate dDate;
private LocalDate ddDate;
/**
* 经办人id
@@ -156,6 +156,8 @@ public class SmErpCgDdEntity extends Model<SmErpCgDdEntity> {
@Schema(description="租户编号")
private Long tenantId;
@Schema(description="关联状态")
private String linkStatus;
@Schema(description="关联编码")
private String linkCode;
@@ -132,4 +132,11 @@ public class SmErpCgPlanEntity extends Model<SmErpCgPlanEntity> {
*/
@Schema(description="租户编号")
private Long tenantId;
@Schema(description="关联状态")
private String linkStatus;
@TableField(exist = false)
@Schema(description="商品名称")
private String productName;
}
@@ -1,15 +1,106 @@
package com.bsd.pjcloud.supermarket.vo.stockwarn;
import com.baomidou.mybatisplus.annotation.*;
import com.bsd.pjcloud.common.core.util.MoneyDeserializer;
import com.bsd.pjcloud.common.core.util.MoneySerializer;
import com.bsd.pjcloud.supermarket.entity.SmErpAuxiliaryCodeEntity;
import com.bsd.pjcloud.supermarket.entity.SmErpSpuEntity;
import com.bsd.pjcloud.supermarket.entity.SmErpUnitEntity;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Data
public class StockWarnVO extends SmErpSpuEntity {
public class StockWarnVO {
/**
* 商品 SPU 编号,自增
*/
@TableId(type = IdType.ASSIGN_ID)
@Schema(description="商品 SPU 编号,自增")
private Long id;
/**
* 货号
*/
@Schema(description="货号")
private String productCode;
/**
* 自编码/条码
*/
@Schema(description="自编码/条码")
private String barcode;
/**
* 商品名称
*/
@Schema(description="商品名称")
private String productName;
/**
* 单位
*/
@Schema(description="单位")
private String unit;
/**
* 商品分类编号
*/
@Schema(description="商品分类编号")
private Long categoryId;
/**
* 商品封面图
*/
@Schema(description="商品封面图")
private String picUrl;
/**
* 库存
*/
@Schema(description="库存")
@TableField(exist = false)
private Integer stock;
/**
* 规格
*/
@Schema(description="规格")
private String spec;
/**
* 装数
*/
@Schema(description="基础装数")
private Integer packageNum;
/**
* 库存上限
*/
@Schema(description="库存上限")
private Integer inventoryUpperLimit;
/**
* 库存下限
*/
@Schema(description="库存下限")
private Integer inventoryLowerLimit;
@Schema(description="预警类型,1,库存不足,2 库存超额")
private String warnType; // 预警类型字段
private Long spuId;
private Integer baseStock;
private Integer currentStock;
}
@@ -180,7 +180,7 @@ public class SmErpCgDdController {
//todo 审核成功条件
// wrapper.eq(SmErpCgPlanEntity::getCheckStatus,);
return R.ok(smErpCgPlanService.pageScope(page, wrapper));
return R.ok(smErpCgPlanService.pageCgsqScope(page, wrapper));
}
}
@@ -73,7 +73,7 @@ public class SmErpCgPlanController {
wrapper.eq(Objects.nonNull(smErpCgPlan.getPlanDate()),SmErpCgPlanEntity::getPlanDate,smErpCgPlan.getPlanDate());
wrapper.eq(Objects.nonNull(smErpCgPlan.getHandlerUserId()),SmErpCgPlanEntity::getHandlerUserId,smErpCgPlan.getHandlerUserId());
wrapper.eq(StrUtil.isNotBlank(smErpCgPlan.getCheckStatus()),SmErpCgPlanEntity::getCheckStatus,smErpCgPlan.getCheckStatus());
return R.ok(smErpCgPlanService.page(page, wrapper));
return R.ok(smErpCgPlanService.pageScope(page, wrapper));
}
@@ -216,7 +216,7 @@ public class SmErpInventoryRecordsController {
LambdaQueryWrapper<SmErpCgDdEntity> wrapper = Wrappers.lambdaQuery();
wrapper.like(StrUtil.isNotBlank(cgDdLinkQueryDTO.getCode()),SmErpCgDdEntity::getCode,cgDdLinkQueryDTO.getCode());
wrapper.eq(Objects.nonNull(cgDdLinkQueryDTO.getDDate()),SmErpCgDdEntity::getDDate,cgDdLinkQueryDTO.getDDate());
wrapper.eq(Objects.nonNull(cgDdLinkQueryDTO.getDDate()),SmErpCgDdEntity::getDdDate,cgDdLinkQueryDTO.getDDate());
//todo 审核成功条件
// wrapper.eq(SmErpCgPlanEntity::getCheckStatus,);
@@ -36,5 +36,9 @@ public interface SmErpCgPlanService extends IService<SmErpCgPlanEntity> {
* @param wrapper
* @return
*/
Page<SmErpCgPlanVo> pageScope(Page page, LambdaQueryWrapper<SmErpCgPlanEntity> wrapper);
Page<SmErpCgPlanVo> pageCgsqScope(Page page, LambdaQueryWrapper<SmErpCgPlanEntity> wrapper);
Object pageScope(Page page, LambdaQueryWrapper<SmErpCgPlanEntity> wrapper);
}
@@ -19,6 +19,7 @@ import com.bsd.pjcloud.supermarket.entity.SmErpCgPlanEntity;
import com.bsd.pjcloud.supermarket.entity.SmErpCgPlanItemEntity;
import com.bsd.pjcloud.supermarket.mapper.SmErpCgDdItemMapper;
import com.bsd.pjcloud.supermarket.mapper.SmErpCgDdMapper;
import com.bsd.pjcloud.supermarket.mapper.SmErpCgPlanMapper;
import com.bsd.pjcloud.supermarket.service.SmErpCgDdService;
import com.bsd.pjcloud.supermarket.vo.cgdd.SmErpCgDdVo;
import com.bsd.pjcloud.supermarket.vo.cgdd.SmeErpCgDdItemVo;
@@ -26,6 +27,7 @@ import com.bsd.pjcloud.supermarket.vo.cgplan.SmErpCgPlanItemVo;
import com.bsd.pjcloud.supermarket.vo.cgplan.SmErpCgPlanVo;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Collections;
import java.util.List;
@@ -45,7 +47,10 @@ public class SmErpCgDdServiceImpl extends ServiceImpl<SmErpCgDdMapper, SmErpCgDd
private final SmErpCgDdItemMapper smErpCgDDItemMapper;
private final SmErpCgPlanMapper smErpCgPlanMapper;
@Override
@Transactional
public Object saveCGDD(ErpCgDDSaveDTO erpCgDDSaveDTO) {
Long deptId = SecurityUtils.getUser().getDeptId();
SmErpCgDdEntity smErpCgDdEntity = BeanUtils.toBean(erpCgDDSaveDTO, SmErpCgDdEntity.class);
@@ -61,6 +66,13 @@ public class SmErpCgDdServiceImpl extends ServiceImpl<SmErpCgDdMapper, SmErpCgDd
cgPlanItemEntity.setDeptId(deptId);
}
smErpCgDDItemMapper.insert(cgPlanItemEntities);
//更新已关联的采购计划,标记为已使用
LambdaQueryWrapper<SmErpCgPlanEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SmErpCgPlanEntity::getPlanCode, erpCgDDSaveDTO.getCode());
SmErpCgPlanEntity smErpCgPlanEntity = new SmErpCgPlanEntity();
smErpCgPlanEntity.setLinkStatus("1");
smErpCgPlanMapper.update(smErpCgPlanEntity,queryWrapper);
return insert;
}
@@ -14,9 +14,11 @@ import com.bsd.pjcloud.supermarket.dto.cgplan.SmCgPlanEditItemDTO;
import com.bsd.pjcloud.supermarket.dto.cgplan.SmCgPlanSaveItemDTO;
import com.bsd.pjcloud.supermarket.entity.SmErpCgPlanEntity;
import com.bsd.pjcloud.supermarket.entity.SmErpCgPlanItemEntity;
import com.bsd.pjcloud.supermarket.entity.SmErpSpuEntity;
import com.bsd.pjcloud.supermarket.entity.SmErpUnitEntity;
import com.bsd.pjcloud.supermarket.mapper.SmErpCgPlanItemMapper;
import com.bsd.pjcloud.supermarket.mapper.SmErpCgPlanMapper;
import com.bsd.pjcloud.supermarket.mapper.SmErpSpuMapper;
import com.bsd.pjcloud.supermarket.mapper.SmErpUnitMapper;
import com.bsd.pjcloud.supermarket.service.SmErpCgPlanService;
import com.bsd.pjcloud.supermarket.vo.cgdd.SmErpCgDdVo;
@@ -26,10 +28,7 @@ import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -46,6 +45,8 @@ public class SmErpCgPlanServiceImpl extends ServiceImpl<SmErpCgPlanMapper, SmErp
private final SmErpUnitMapper smErpUnitMapper;
private final SmErpSpuMapper smErpSpuMapper;
@Override
@@ -93,7 +94,7 @@ public class SmErpCgPlanServiceImpl extends ServiceImpl<SmErpCgPlanMapper, SmErp
}
@Override
public Page<SmErpCgPlanVo> pageScope(Page page, LambdaQueryWrapper<SmErpCgPlanEntity> wrapper) {
public Page<SmErpCgPlanVo> pageCgsqScope(Page page, LambdaQueryWrapper<SmErpCgPlanEntity> wrapper) {
// 1. 查询主表分页数据
Page<SmErpCgPlanEntity> pageData = baseMapper.selectPageByScope(page, wrapper, DataScope.of());
List<SmErpCgPlanEntity> records = pageData.getRecords();
@@ -122,6 +123,7 @@ public class SmErpCgPlanServiceImpl extends ServiceImpl<SmErpCgPlanMapper, SmErp
} else {
itemMap = Collections.emptyMap();
unitList = Collections.emptyList();
}
@@ -134,7 +136,15 @@ public class SmErpCgPlanServiceImpl extends ServiceImpl<SmErpCgPlanMapper, SmErp
SmErpCgPlanItemVo.class
);
itemVos.forEach(item -> {
List<SmErpUnitEntity> unitEntities = unitList.stream().filter(unit -> unit.getSpuId().equals(item.getErpSpuId())).collect(Collectors.toList());
unitEntities.stream().forEach(unit -> {
if(unit.getId().equals(item.getUnitId())){
item.setSpec(unit.getSpec());
item.setUnit(unit.getUnit());
item.setPackageNum(unit.getPackageNum());
item.setPurchasePrice(unit.getPurchasePrice());
}
});
});
vo.setItems(itemVos);
});
@@ -145,4 +155,40 @@ public class SmErpCgPlanServiceImpl extends ServiceImpl<SmErpCgPlanMapper, SmErp
return resultPage;
}
@Override
public Object pageScope(Page page, LambdaQueryWrapper<SmErpCgPlanEntity> wrapper) {
Page pageData = baseMapper.selectPageByScope(page, wrapper, DataScope.of());
List<SmErpCgPlanEntity> records = pageData.getRecords();
// 2. 提前收集所有主表ID(去重处理)
Set<Long> planIds = records.stream()
.map(SmErpCgPlanEntity::getId)
.collect(Collectors.toSet());
LambdaQueryWrapper<SmErpCgPlanItemEntity> smErpCgPlanItemEntityLambdaQueryWrapper = new LambdaQueryWrapper<>();
smErpCgPlanItemEntityLambdaQueryWrapper.in(SmErpCgPlanItemEntity::getPlanId,planIds);
List<SmErpCgPlanItemEntity> cgPlanItemEntities = smErpCgPlanItemMapper.selectList(smErpCgPlanItemEntityLambdaQueryWrapper);
Set<Long> erpSpuIds = cgPlanItemEntities.stream().map(SmErpCgPlanItemEntity::getErpSpuId).collect(Collectors.toSet());
List<SmErpSpuEntity> smErpSpuEntities = smErpSpuMapper.selectList(new LambdaQueryWrapper<SmErpSpuEntity>().in(SmErpSpuEntity::getId, erpSpuIds));
Map<Long,SmErpSpuEntity> spuMap = smErpSpuEntities.stream().collect(Collectors.toMap(SmErpSpuEntity::getId, spu -> spu));
// 按采购计划分组商品名称
Map<Long, List<String>> planGoodsMap = cgPlanItemEntities.stream()
.collect(Collectors.groupingBy(
SmErpCgPlanItemEntity::getPlanId,
Collectors.mapping(
item -> spuMap.getOrDefault(item.getErpSpuId(), new SmErpSpuEntity()).getProductName(),
Collectors.toList()
)
));
// 设置商品名称到主表实体
records.forEach(plan -> {
List<String> names = planGoodsMap.getOrDefault(plan.getId(), Collections.emptyList());
plan.setProductName(String.join(", ", names));
});
return pageData;
}
}
@@ -1,5 +1,6 @@
package com.bsd.pjcloud.supermarket.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bsd.pjcloud.common.core.util.BeanUtils;
import com.bsd.pjcloud.common.security.util.SecurityUtils;
@@ -7,10 +8,8 @@ import com.bsd.pjcloud.supermarket.dto.cgdd.SmCgDDSaveItemDTO;
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.entity.SmErpCgDdEntity;
import com.bsd.pjcloud.supermarket.entity.SmErpCgDdItemEntity;
import com.bsd.pjcloud.supermarket.entity.SmErpInventoryRecordsEntity;
import com.bsd.pjcloud.supermarket.entity.SmErpInventoryRecordsItemEntity;
import com.bsd.pjcloud.supermarket.entity.*;
import com.bsd.pjcloud.supermarket.mapper.SmErpCgDdMapper;
import com.bsd.pjcloud.supermarket.mapper.SmErpInventoryRecordsItemMapper;
import com.bsd.pjcloud.supermarket.mapper.SmErpInventoryRecordsMapper;
import com.bsd.pjcloud.supermarket.mapper.SmErpStockMapper;
@@ -36,6 +35,8 @@ public class SmErpInventoryRecordsServiceImpl extends ServiceImpl<SmErpInventory
private final SmErpInventoryRecordsItemMapper smErpInventoryRecordsItemMapper;
private final SmErpStockService smErpStockService;
private final SmErpCgDdMapper smErpCgDdMapper;
@Override
@Transactional
public Object saveInventoryRecord(InventoryRecordSaveDTO inventoryRecordSaveDTO) {
@@ -65,6 +66,12 @@ public class SmErpInventoryRecordsServiceImpl extends ServiceImpl<SmErpInventory
//更新库存
smErpStockService.updateStock(updateStockDTOS);
//更新已关联的采购,标记为已使用
LambdaQueryWrapper<SmErpCgDdEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SmErpCgDdEntity::getCode, inventoryRecordSaveDTO.getInventoryCode());
SmErpCgDdEntity updateSmErpCgDdEntity = new SmErpCgDdEntity();
updateSmErpCgDdEntity.setLinkStatus("1");
smErpCgDdMapper.update(updateSmErpCgDdEntity,queryWrapper);
return insert;
}
@@ -6,7 +6,7 @@
<resultMap id="smErpCgDdMap" type="com.bsd.pjcloud.supermarket.entity.SmErpCgDdEntity">
<id property="id" column="id"/>
<result property="code" column="code"/>
<result property="dDate" column="d_date"/>
<result property="ddDate" column="dd_date"/>
<result property="handlerUserId" column="handler_user_id"/>
<result property="checkStatus" column="check_status"/>
<result property="checkUserId" column="check_user_id"/>
@@ -26,5 +26,6 @@
<result property="delFlag" column="del_flag"/>
<result property="tenantId" column="tenant_id"/>
<result property="linkCode" column="link_code"/>
<result property="linkStatus" column="link_status"/>
</resultMap>
</mapper>
@@ -21,5 +21,6 @@
<result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/>
<result property="tenantId" column="tenant_id"/>
<result property="linkStatus" column="link_status"/>
</resultMap>
</mapper>
@@ -38,10 +38,18 @@
<select id="selectWarnStockWithSpu" resultMap="stockWarnResultMap">
SELECT
stock.*,
stock.inventory_upper_limit,
stock.inventory_lower_limit,
stock.current_stock+stock+base_stock as stock,
spu.product_code,
spu.product_name,
spu.barcode,
spu.spec,
spu.unit,
spu.package_num,
spu.pic_url,
spu.category_id,
spu.id,
CASE
WHEN (stock.base_stock + stock.current_stock) > stock.inventory_upper_limit THEN '2'
ELSE '1'