parent
2a0f04ced0
commit
cb2a2b40e3
@ -0,0 +1,27 @@
|
||||
package com.chanko.yunxi.mes.module.heli.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* 物料类型
|
||||
* @author chenxi
|
||||
* @date 2024-02-01 04:42
|
||||
*/
|
||||
@Getter
|
||||
public enum MaterialTypeEnum {
|
||||
|
||||
RAW("1", "原材料"),
|
||||
ACCESSORY("2", "副资材"),
|
||||
OFFICE("3", "办公/劳保"),
|
||||
GIVING("4", "赠送物品"),
|
||||
STANDARD("5", "标准件"),
|
||||
MOULD("6", "模具");
|
||||
|
||||
private String code;
|
||||
private String description;
|
||||
|
||||
MaterialTypeEnum(String code, String description) {
|
||||
this.code = code;
|
||||
this.description = description;
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package com.chanko.yunxi.mes.module.heli.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* 出库类型
|
||||
* @author chenxi
|
||||
* @date 2024-02-01 02:31
|
||||
*/
|
||||
@Getter
|
||||
public enum StockOutTypeEnum {
|
||||
|
||||
RECEIVE(1, "领料出库"),
|
||||
SALE(2, "销售出库"),
|
||||
LOSS(3, "盘亏出库"),
|
||||
OTHER(4, "其他出库");
|
||||
|
||||
private int code;
|
||||
private String description;
|
||||
|
||||
StockOutTypeEnum(int code, String description) {
|
||||
this.code = code;
|
||||
this.description = description;
|
||||
}
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
package com.chanko.yunxi.mes.module.heli.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* 库表类型
|
||||
* @author chenxi
|
||||
* @date 2024-02-01 02:28
|
||||
*/
|
||||
@Getter
|
||||
public enum StockTypeEnum {
|
||||
|
||||
IN(1, "入库"),
|
||||
OUT(2, "出库");
|
||||
|
||||
private int code;
|
||||
private String description;
|
||||
|
||||
StockTypeEnum(int code, String description) {
|
||||
this.code = code;
|
||||
this.description = description;
|
||||
}
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
package com.chanko.yunxi.mes.module.heli.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public enum StorageStatusEnum {
|
||||
|
||||
SAVE(1, "保存"),
|
||||
SUBMIT(2, "提交"),
|
||||
INVALID(3, "作废");
|
||||
|
||||
private int code;
|
||||
private String description;
|
||||
|
||||
StorageStatusEnum(int code, String description) {
|
||||
this.code = code;
|
||||
this.description = description;
|
||||
}
|
||||
}
|
@ -0,0 +1,193 @@
|
||||
package com.chanko.yunxi.mes.module.heli.manager;
|
||||
|
||||
import cn.hutool.core.lang.UUID;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
|
||||
import com.chanko.yunxi.mes.module.heli.controller.admin.deliverorder.vo.DeliverOrderSaveReqVO;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderDO;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderSubDO;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.material.MaterialDO;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storage.StorageDO;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelog.StorageLogDO;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagemat.StorageMatDO;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.mysql.deliverorder.DeliverOrderSubMapper;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.mysql.material.MaterialMapper;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderMapper;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderSubMapper;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.mysql.storage.StorageMapper;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.mysql.storagelog.StorageLogMapper;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.mysql.storagemat.StorageMatMapper;
|
||||
import com.chanko.yunxi.mes.module.heli.enums.*;
|
||||
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.STOCK_IN;
|
||||
|
||||
/**
|
||||
* 跨订单状态交互管理器
|
||||
*
|
||||
* @author chenxi
|
||||
* @date 2024-01-31 10:03
|
||||
*/
|
||||
@Component
|
||||
public class CrossOrderManager {
|
||||
|
||||
@Resource
|
||||
private ProjectOrderMapper projectOrderMapper;
|
||||
@Resource
|
||||
private ProjectOrderSubMapper projectOrderSubMapper;
|
||||
@Resource
|
||||
private DeliverOrderSubMapper deliverOrderSubMapper;
|
||||
@Resource
|
||||
private StorageMapper storageMapper;
|
||||
@Resource
|
||||
private StorageMatMapper storageMatMapper;
|
||||
@Resource
|
||||
private StorageLogMapper storageLogMapper;
|
||||
@Resource
|
||||
private MaterialMapper materialMapper;
|
||||
|
||||
/**
|
||||
* 刷新项目订单发货状态
|
||||
* @param projectOrderIds
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void refreshProjectOrderDeliverStatus(String... projectOrderIds) {
|
||||
// 锁定订单
|
||||
for (String projectOrderId : projectOrderIds) {
|
||||
ProjectOrderDO projectOrderDO = projectOrderMapper.selectOne(new LambdaQueryWrapper<ProjectOrderDO>() {{
|
||||
eq(ProjectOrderDO::getId, projectOrderId);
|
||||
last("LIMIT 1 FOR UPDATE");
|
||||
}});
|
||||
|
||||
// 查询关联子项
|
||||
List<ProjectOrderSubDO> projectOrderSubDOList = projectOrderSubMapper.selectListByProjectOrderId(projectOrderDO.getId());
|
||||
|
||||
// 查询发货记录
|
||||
MPJLambdaWrapper<DeliverOrderSubDO> historyDeliveredSubQuery = new MPJLambdaWrapper<>();
|
||||
historyDeliveredSubQuery.selectAll(DeliverOrderSubDO.class)
|
||||
.leftJoin(DeliverOrderDO.class, DeliverOrderDO::getId, DeliverOrderSubDO::getDeliveryOrderId)
|
||||
.eq(DeliverOrderDO::getDeliverStatus, DeliverOrderStatusEnum.DELIVER.getCode())
|
||||
.in(DeliverOrderSubDO::getSaleOrderSubId, projectOrderSubDOList.stream().map(ProjectOrderSubDO::getId).collect(Collectors.toSet()));
|
||||
List<DeliverOrderSubDO> historyDeliveredSubList = deliverOrderSubMapper.selectList(historyDeliveredSubQuery);
|
||||
if(historyDeliveredSubList.isEmpty()) return;
|
||||
Map<Long, List<DeliverOrderSubDO>> historyDeliveredSubsGroupBySaleSubId = historyDeliveredSubList.stream().collect(Collectors.groupingBy(DeliverOrderSubDO::getSaleOrderSubId));
|
||||
|
||||
// 考虑变更订单情况 只需判断历史发货是否大于等于订单子项数量
|
||||
boolean allDone = projectOrderSubDOList.stream().allMatch(projectOrderSubDO -> {
|
||||
List<DeliverOrderSubDO> historySubList = historyDeliveredSubsGroupBySaleSubId.get(projectOrderSubDO.getId());
|
||||
int historyDeliveredAmount = historySubList == null || historySubList.isEmpty() ? 0 : historySubList.stream().mapToInt(DeliverOrderSubDO::getAmount).sum();
|
||||
return historyDeliveredAmount >= projectOrderSubDO.getAmount();
|
||||
});
|
||||
|
||||
if(allDone){
|
||||
projectOrderDO.setDeliveryStatus(ProjectOrderDeliverStatusEnum.ALL.getCode());
|
||||
}else{
|
||||
projectOrderDO.setDeliveryStatus(ProjectOrderDeliverStatusEnum.PART.getCode());
|
||||
}
|
||||
projectOrderMapper.updateById(projectOrderDO);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成出货单
|
||||
* @param updateReqVO
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void generateStockOutOrder(DeliverOrderSaveReqVO updateReqVO) {
|
||||
|
||||
// 出库表处理
|
||||
StorageDO storageDO = new StorageDO();
|
||||
storageDO.setStockType(StockTypeEnum.OUT.getCode())
|
||||
.setStockOutType(StockOutTypeEnum.SALE.getCode())
|
||||
.setStockNo(UUID.fastUUID().toString(true))
|
||||
.setHeaderNo(updateReqVO.getCode())
|
||||
.setStatus(StorageStatusEnum.SUBMIT.getCode())
|
||||
.setCreateTime(updateReqVO.getDeliverDate())
|
||||
.setDescription(String.format("由发货单%s操作发货后自动生成", updateReqVO.getCode()));
|
||||
storageMapper.insert(storageDO);
|
||||
storageDO.setStockNo(STOCK_IN.getCode(storageDO.getId().toString()));
|
||||
storageMapper.updateById(storageDO);
|
||||
|
||||
// 查询物料id
|
||||
Set<String> materialCodeList = updateReqVO.getDeliverOrderSubs().stream().map(deliverOrderSubDO -> {
|
||||
return String.format("%s-%s", deliverOrderSubDO.getSaleOrderCode(), deliverOrderSubDO.getName());
|
||||
}).collect(Collectors.toSet());
|
||||
List<MaterialDO> subMaterialDOList = materialMapper.selectList(new LambdaQueryWrapper<MaterialDO>() {{
|
||||
in(MaterialDO::getCode, materialCodeList);
|
||||
eq(MaterialDO::getVirtualPart, YesOrNoEnum.Y.name());
|
||||
}});
|
||||
Map<String, List<MaterialDO>> materialGroupByCode = subMaterialDOList.stream().collect(Collectors.groupingBy(MaterialDO::getCode));
|
||||
|
||||
// 出库物料明细
|
||||
ArrayList<StorageMatDO> storageMatDOList = new ArrayList<>(16);
|
||||
for (DeliverOrderSubDO deliverOrderSub : updateReqVO.getDeliverOrderSubs()) {
|
||||
MaterialDO materialDO = materialGroupByCode.get(String.format("%s-%s", deliverOrderSub.getSaleOrderCode(), deliverOrderSub.getName())).get(0);
|
||||
StorageMatDO storageMatDO = new StorageMatDO();
|
||||
storageMatDO.setStockId(storageDO.getId())
|
||||
.setMatId(materialDO.getId())
|
||||
.setStorageOkQty(new BigDecimal(deliverOrderSub.getAmount()));
|
||||
storageMatDOList.add(storageMatDO);
|
||||
}
|
||||
storageMatMapper.insertBatch(storageMatDOList);
|
||||
|
||||
// 将物料信息转化日志信息
|
||||
List<StorageLogDO> logList = BeanUtils.toBean(storageMatDOList,StorageLogDO.class);
|
||||
// 同步库存单状态到日志,便于以后统计
|
||||
for (StorageLogDO log : logList){
|
||||
log.setStatus(storageDO.getStatus());
|
||||
}
|
||||
// 批量保存当前库存物料日志信息
|
||||
storageLogMapper.insertBatch(logList);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成虚拟物料
|
||||
* @author chenxi
|
||||
* @date 2024-02-01 05:32
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void generateVirtualMaterial(String projectOrderCode, List<ProjectOrderSubDO> projectOrderSubs) {
|
||||
ArrayList<MaterialDO> pendingDOList = new ArrayList<>(16);
|
||||
projectOrderSubs.forEach(projectOrderSubDO -> {
|
||||
MaterialDO materialDO = new MaterialDO();
|
||||
materialDO.setCode(String.format("%s-%s", projectOrderCode, projectOrderSubDO.getName()))
|
||||
.setName(projectOrderSubDO.getName())
|
||||
.setMaterialType(MaterialTypeEnum.MOULD.getCode())
|
||||
.setUnit(projectOrderSubDO.getUnit())
|
||||
.setVirtualPart(YesOrNoEnum.Y.name());
|
||||
pendingDOList.add(materialDO);
|
||||
});
|
||||
|
||||
// 判断是否存在对应的编码 如存在则更新 不存在则插入
|
||||
Map<String, List<MaterialDO>> historyGroupByCode = new HashMap<>(16);
|
||||
List<MaterialDO> historyDOList = materialMapper.selectList(new LambdaQueryWrapper<MaterialDO>() {{
|
||||
in(MaterialDO::getCode, pendingDOList.stream().map(MaterialDO::getCode).collect(Collectors.toSet()));
|
||||
}});
|
||||
if(historyDOList != null && !historyDOList.isEmpty()){
|
||||
historyGroupByCode.putAll(historyDOList.stream().collect(Collectors.groupingBy(MaterialDO::getCode)));
|
||||
}
|
||||
|
||||
pendingDOList.forEach(thisTimeMaterialDO -> {
|
||||
List<MaterialDO> historyMaterialList = historyGroupByCode.get(thisTimeMaterialDO.getCode());
|
||||
if(historyMaterialList != null && !historyMaterialList.isEmpty()){
|
||||
MaterialDO historyMaterialDO = historyMaterialList.get(0);
|
||||
thisTimeMaterialDO.setId(historyMaterialDO.getId()).setCreateTime(historyMaterialDO.getCreateTime());
|
||||
materialMapper.updateById(thisTimeMaterialDO);
|
||||
}else{
|
||||
materialMapper.insert(thisTimeMaterialDO);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -1,81 +0,0 @@
|
||||
package com.chanko.yunxi.mes.module.heli.manager;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderDO;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverordersub.DeliverOrderSubDO;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.mysql.deliverordersub.DeliverOrderSubMapper;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderMapper;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderSubMapper;
|
||||
import com.chanko.yunxi.mes.module.heli.enums.DeliverOrderStatusEnum;
|
||||
import com.chanko.yunxi.mes.module.heli.enums.ProjectOrderDeliverStatusEnum;
|
||||
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 跨订单状态交互管理器
|
||||
*
|
||||
* @author chenxi
|
||||
* @date 2024-01-31 10:03
|
||||
*/
|
||||
@Component
|
||||
public class CrossOrderStatusManager {
|
||||
|
||||
@Resource
|
||||
private ProjectOrderMapper projectOrderMapper;
|
||||
@Resource
|
||||
private ProjectOrderSubMapper projectOrderSubMapper;
|
||||
@Resource
|
||||
private DeliverOrderSubMapper deliverOrderSubMapper;
|
||||
|
||||
/**
|
||||
* 刷新项目订单发货状态
|
||||
* @param projectOrderIds
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void refreshProjectOrderDeliverStatus(String... projectOrderIds) {
|
||||
// 锁定订单
|
||||
for (String projectOrderId : projectOrderIds) {
|
||||
ProjectOrderDO projectOrderDO = projectOrderMapper.selectOne(new LambdaQueryWrapper<ProjectOrderDO>() {{
|
||||
eq(ProjectOrderDO::getId, projectOrderId);
|
||||
last("LIMIT 1 FOR UPDATE");
|
||||
}});
|
||||
|
||||
// 查询关联子项
|
||||
List<ProjectOrderSubDO> projectOrderSubDOList = projectOrderSubMapper.selectListByProjectOrderId(projectOrderDO.getId());
|
||||
|
||||
// 查询发货记录
|
||||
MPJLambdaWrapper<DeliverOrderSubDO> historyDeliveredSubQuery = new MPJLambdaWrapper<>();
|
||||
historyDeliveredSubQuery.selectAll(DeliverOrderSubDO.class)
|
||||
.leftJoin(DeliverOrderDO.class, DeliverOrderDO::getId, DeliverOrderSubDO::getDeliveryOrderId)
|
||||
.eq(DeliverOrderDO::getDeliverStatus, DeliverOrderStatusEnum.DELIVER.getCode())
|
||||
.in(DeliverOrderSubDO::getSaleOrderSubId, projectOrderSubDOList.stream().map(ProjectOrderSubDO::getId).collect(Collectors.toSet()));
|
||||
List<DeliverOrderSubDO> historyDeliveredSubList = deliverOrderSubMapper.selectList(historyDeliveredSubQuery);
|
||||
if(historyDeliveredSubList.isEmpty()) return;
|
||||
Map<Long, List<DeliverOrderSubDO>> historyDeliveredSubsGroupBySaleSubId = historyDeliveredSubList.stream().collect(Collectors.groupingBy(DeliverOrderSubDO::getSaleOrderSubId));
|
||||
|
||||
// 考虑变更订单情况 只需判断历史发货是否大于等于订单子项数量
|
||||
boolean allDone = projectOrderSubDOList.stream().allMatch(projectOrderSubDO -> {
|
||||
List<DeliverOrderSubDO> historySubList = historyDeliveredSubsGroupBySaleSubId.get(projectOrderSubDO.getId());
|
||||
int historyDeliveredAmount = historySubList == null || historySubList.isEmpty() ? 0 : historySubList.stream().mapToInt(DeliverOrderSubDO::getAmount).sum();
|
||||
return historyDeliveredAmount >= projectOrderSubDO.getAmount();
|
||||
});
|
||||
|
||||
if(allDone){
|
||||
projectOrderDO.setDeliveryStatus(ProjectOrderDeliverStatusEnum.ALL.getCode());
|
||||
}else{
|
||||
projectOrderDO.setDeliveryStatus(ProjectOrderDeliverStatusEnum.PART.getCode());
|
||||
}
|
||||
projectOrderMapper.updateById(projectOrderDO);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
Loading…
Reference in new issue