【需求开发】初步完成发货与仓储交互逻辑

pull/3/head
zengchenxi 9 months ago
parent 2a0f04ced0
commit cb2a2b40e3

@ -1,4 +1,4 @@
芋道源码 http://www.iocoder.cn 上海长江云息数字科技有限公司
Application Version: ${mes.info.version} Application Version: ${mes.info.version}
Spring Boot Version: ${spring-boot.version} Spring Boot Version: ${spring-boot.version}

@ -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;
}
}

@ -10,7 +10,7 @@ import lombok.Getter;
@Getter @Getter
public enum YesOrNoEnum { public enum YesOrNoEnum {
YES(1), NO(0); Y(1), N(0);
private int code; private int code;

@ -33,7 +33,7 @@ import static com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEn
import com.chanko.yunxi.mes.module.heli.controller.admin.deliverorder.vo.*; import com.chanko.yunxi.mes.module.heli.controller.admin.deliverorder.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderDO; 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.deliverorder.DeliverOrderSubDO;
import com.chanko.yunxi.mes.module.heli.service.deliverorder.DeliverOrderService; import com.chanko.yunxi.mes.module.heli.service.deliverorder.DeliverOrderService;
@Tag(name = "管理后台 - 发货订单") @Tag(name = "管理后台 - 发货订单")

@ -1,6 +1,6 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.deliverorder.vo; package com.chanko.yunxi.mes.module.heli.controller.admin.deliverorder.vo;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverordersub.DeliverOrderSubDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderSubDO;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;

@ -1,4 +1,4 @@
package com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverordersub; package com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder;
import lombok.*; import lombok.*;
import java.util.*; import java.util.*;

@ -243,7 +243,7 @@ public class ProjectOrderDO extends BaseDO {
} }
public boolean canDelete(){ public boolean canDelete(){
return this.orderStatus.intValue() == ProjectOrderStatusEnum.SAVE.getCode() && this.hasAlter.intValue() == YesOrNoEnum.NO.getCode(); return this.orderStatus.intValue() == ProjectOrderStatusEnum.SAVE.getCode() && this.hasAlter.intValue() == YesOrNoEnum.N.getCode();
} }
public boolean canOperate(OperateTypeEnum operateTypeEnum){ public boolean canOperate(OperateTypeEnum operateTypeEnum){

@ -6,8 +6,6 @@ import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX;
import com.chanko.yunxi.mes.module.heli.controller.admin.deliverorder.vo.DeliverOrderPageReqVO; import com.chanko.yunxi.mes.module.heli.controller.admin.deliverorder.vo.DeliverOrderPageReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.customer.CustomerDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.customer.CustomerDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.system.dal.dataobject.dept.DeptDO;
import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO; import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;

@ -1,14 +1,11 @@
package com.chanko.yunxi.mes.module.heli.dal.mysql.deliverordersub; package com.chanko.yunxi.mes.module.heli.dal.mysql.deliverorder;
import java.util.*;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import com.chanko.yunxi.mes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX; import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverordersub.DeliverOrderSubDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderSubDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/** /**
* Mapper * Mapper
* *

@ -32,7 +32,8 @@ public interface MaterialMapper extends BaseMapperX<MaterialDO> {
query.like(!StringUtils.isEmpty(reqVO.getName()), MaterialDO::getName, reqVO.getName()) query.like(!StringUtils.isEmpty(reqVO.getName()), MaterialDO::getName, reqVO.getName())
.like(!StringUtils.isEmpty(reqVO.getCode()), MaterialDO::getCode, reqVO.getCode()) .like(!StringUtils.isEmpty(reqVO.getCode()), MaterialDO::getCode, reqVO.getCode())
.eq(!StringUtils.isEmpty(reqVO.getMaterialType()), MaterialDO::getMaterialType, reqVO.getMaterialType()) .eq(!StringUtils.isEmpty(reqVO.getMaterialType()), MaterialDO::getMaterialType, reqVO.getMaterialType())
.eq(reqVO.getStatus() != null, MaterialDO::getStatus, reqVO.getStatus()); .eq(reqVO.getStatus() != null, MaterialDO::getStatus, reqVO.getStatus())
.eq(!StringUtils.isEmpty(reqVO.getVirtualPart()), MaterialDO::getVirtualPart, reqVO.getVirtualPart());
return selectPage(reqVO, query); return selectPage(reqVO, query);
} }

@ -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);
}
}
}

@ -4,7 +4,7 @@ import java.util.*;
import javax.validation.*; import javax.validation.*;
import com.chanko.yunxi.mes.module.heli.controller.admin.deliverorder.vo.*; import com.chanko.yunxi.mes.module.heli.controller.admin.deliverorder.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderDO; 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.deliverorder.DeliverOrderSubDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam; import com.chanko.yunxi.mes.framework.common.pojo.PageParam;

@ -7,18 +7,18 @@ import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum;
import com.chanko.yunxi.mes.module.heli.controller.admin.deliverorder.vo.DeliverOrderPageReqVO; import com.chanko.yunxi.mes.module.heli.controller.admin.deliverorder.vo.DeliverOrderPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.deliverorder.vo.DeliverOrderSaveReqVO; 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.DeliverOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverordersub.DeliverOrderSubDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderSubDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; 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.projectorder.ProjectOrderSubDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.deliverorder.DeliverOrderMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.deliverorder.DeliverOrderMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.deliverordersub.DeliverOrderSubMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.deliverorder.DeliverOrderSubMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderMapper; 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.projectorder.ProjectOrderSubMapper;
import com.chanko.yunxi.mes.module.heli.enums.BusinesTypeEnum; import com.chanko.yunxi.mes.module.heli.enums.BusinesTypeEnum;
import com.chanko.yunxi.mes.module.heli.enums.DeliverOrderStatusEnum; import com.chanko.yunxi.mes.module.heli.enums.DeliverOrderStatusEnum;
import com.chanko.yunxi.mes.module.heli.enums.ProjectOrderDeliverStatusEnum; import com.chanko.yunxi.mes.module.heli.enums.ProjectOrderDeliverStatusEnum;
import com.chanko.yunxi.mes.module.heli.manager.CrossOrderStatusManager; import com.chanko.yunxi.mes.module.heli.manager.CrossOrderManager;
import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService; import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -57,7 +57,7 @@ public class DeliverOrderServiceImpl implements DeliverOrderService {
@Resource @Resource
private ProjectOrderSubMapper projectOrderSubMapper; private ProjectOrderSubMapper projectOrderSubMapper;
@Resource @Resource
private CrossOrderStatusManager crossOrderStatusManager; private CrossOrderManager crossOrderManager;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@ -85,7 +85,7 @@ public class DeliverOrderServiceImpl implements DeliverOrderService {
OperateTypeEnum operateTypeEnum = OperateTypeEnum.valueOf(createReqVO.getActive()); OperateTypeEnum operateTypeEnum = OperateTypeEnum.valueOf(createReqVO.getActive());
if(operateTypeEnum == OperateTypeEnum.DELIVER) { if(operateTypeEnum == OperateTypeEnum.DELIVER) {
crossOrderStatusManager.refreshProjectOrderDeliverStatus(createReqVO.getSaleOrderIds().split(",")); crossOrderManager.refreshProjectOrderDeliverStatus(createReqVO.getSaleOrderIds().split(","));
} }
// 返回 // 返回
return deliverOrder.getId(); return deliverOrder.getId();
@ -155,8 +155,10 @@ public class DeliverOrderServiceImpl implements DeliverOrderService {
// 更新子表 // 更新子表
updateDeliverOrderSubList(updateReqVO.getId(), updateReqVO.getDeliverOrderSubs(), updateReqVO.getDeliverOrderOtherSubs()); updateDeliverOrderSubList(updateReqVO.getId(), updateReqVO.getDeliverOrderSubs(), updateReqVO.getDeliverOrderOtherSubs());
if(operateTypeEnum == OperateTypeEnum.DELIVER) { if(updateObj.getDeliverStatus().intValue() == DeliverOrderStatusEnum.DELIVER.getCode()) {
crossOrderStatusManager.refreshProjectOrderDeliverStatus(updateReqVO.getSaleOrderIds().split(",")); crossOrderManager.refreshProjectOrderDeliverStatus(updateReqVO.getSaleOrderIds().split(","));
crossOrderManager.generateStockOutOrder(updateReqVO);
} }
} }

@ -15,6 +15,7 @@ import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderSubMa
import com.chanko.yunxi.mes.module.heli.enums.BusinesTypeEnum; import com.chanko.yunxi.mes.module.heli.enums.BusinesTypeEnum;
import com.chanko.yunxi.mes.module.heli.enums.ProjectOrderStatusEnum; import com.chanko.yunxi.mes.module.heli.enums.ProjectOrderStatusEnum;
import com.chanko.yunxi.mes.module.heli.enums.YesOrNoEnum; import com.chanko.yunxi.mes.module.heli.enums.YesOrNoEnum;
import com.chanko.yunxi.mes.module.heli.manager.CrossOrderManager;
import com.chanko.yunxi.mes.module.heli.service.customer.CustomerService; import com.chanko.yunxi.mes.module.heli.service.customer.CustomerService;
import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService; import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService;
import com.chanko.yunxi.mes.module.infra.controller.admin.file.vo.file.FilePageReqVO; import com.chanko.yunxi.mes.module.infra.controller.admin.file.vo.file.FilePageReqVO;
@ -30,7 +31,10 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
@ -64,6 +68,9 @@ public class ProjectOrderServiceImpl implements ProjectOrderService {
@Resource @Resource
private FileService fileService; private FileService fileService;
@Resource
private CrossOrderManager crossOrderManager;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Long createProjectOrder(ProjectOrderSaveReqVO createReqVO) { public Long createProjectOrder(ProjectOrderSaveReqVO createReqVO) {
@ -97,7 +104,7 @@ public class ProjectOrderServiceImpl implements ProjectOrderService {
SerialNumberDO serialNumberDO = serialNumberService.getSerialNumber(BusinesTypeEnum.PROJECT_ORDER_SNAPSHOT.name(), projectOrder.getCode()); SerialNumberDO serialNumberDO = serialNumberService.getSerialNumber(BusinesTypeEnum.PROJECT_ORDER_SNAPSHOT.name(), projectOrder.getCode());
serialNumberDO.setSerialNumber(serialNumberDO.getSerialNumber()+1); serialNumberDO.setSerialNumber(serialNumberDO.getSerialNumber()+1);
projectOrder.setId(null) projectOrder.setId(null)
.setIsSnapshot(YesOrNoEnum.YES.getCode()) .setIsSnapshot(YesOrNoEnum.Y.getCode())
.setSnapshotId(createReqVO.getId()) .setSnapshotId(createReqVO.getId())
.setSnapshotCode(createReqVO.getCode()) .setSnapshotCode(createReqVO.getCode())
.setSnapshotOrderTime(createReqVO.getOrderTime()) .setSnapshotOrderTime(createReqVO.getOrderTime())
@ -132,7 +139,8 @@ public class ProjectOrderServiceImpl implements ProjectOrderService {
public void updateProjectOrder(ProjectOrderSaveReqVO updateReqVO) { public void updateProjectOrder(ProjectOrderSaveReqVO updateReqVO) {
// 校验存在 // 校验存在
ProjectOrderDO oldDO = validateProjectOrderExists(updateReqVO.getId()); ProjectOrderDO oldDO = validateProjectOrderExists(updateReqVO.getId());
if(!oldDO.canOperate(OperateTypeEnum.valueOf(updateReqVO.getActive()))){ OperateTypeEnum operateTypeEnum = OperateTypeEnum.valueOf(updateReqVO.getActive());
if(!oldDO.canOperate(operateTypeEnum)){
throw exception(INVALID_OPERATE); throw exception(INVALID_OPERATE);
} }
// 更新 // 更新
@ -143,6 +151,11 @@ public class ProjectOrderServiceImpl implements ProjectOrderService {
// 更新子表 // 更新子表
updateProjectOrderSubList(updateReqVO.getId(), updateReqVO.getProjectOrderSubs()); updateProjectOrderSubList(updateReqVO.getId(), updateReqVO.getProjectOrderSubs());
// 如已启动 按子项目生成虚拟物料数据
if(updateObj.getOrderStatus().intValue() == ProjectOrderStatusEnum.APPROVE.getCode()){
crossOrderManager.generateVirtualMaterial(updateReqVO.getCode(), updateReqVO.getProjectOrderSubs());
}
} }
@Override @Override

@ -189,7 +189,7 @@ const queryParams = reactive({
invUpperLimit: undefined, invUpperLimit: undefined,
invLowerLimit: undefined, invLowerLimit: undefined,
barcode: undefined, barcode: undefined,
virtualPart: undefined, virtualPart: "N",
logo: undefined, logo: undefined,
}) })
const queryFormRef = ref() // const queryFormRef = ref() //

@ -2,3 +2,6 @@ ALTER table wms_storage MODIFY column header_no VARCHAR(128);
ALTER table wms_storage_mat MODIFY column wh_id BIGINT(20) null; ALTER table wms_storage_mat MODIFY column wh_id BIGINT(20) null;
ALTER table wms_storage_mat MODIFY column rg_id BIGINT(20) null; ALTER table wms_storage_mat MODIFY column rg_id BIGINT(20) null;
ALTER table wms_storage_mat MODIFY column pn_id BIGINT(20) null; ALTER table wms_storage_mat MODIFY column pn_id BIGINT(20) null;
UPDATE base_material set virtual_part = 'N';
ALTER TABLE base_material MODIFY COLUMN virtual_part CHAR ( 1 ) NOT NULL DEFAULT 'N' COMMENT '虚拟物料标识只能填写Y和NY表示虚拟物料N表示反之';

Loading…
Cancel
Save