|
|
|
@ -26,6 +26,7 @@ import com.chanko.yunxi.mes.module.biz.dal.dataobject.storage.StorageDO;
|
|
|
|
|
import com.chanko.yunxi.mes.module.biz.dal.dataobject.storagemat.StorageMatDO;
|
|
|
|
|
import com.chanko.yunxi.mes.module.biz.dal.dataobject.supplier.SupplierDO;
|
|
|
|
|
import com.chanko.yunxi.mes.module.biz.dal.dataobject.systemparameters.SystemParametersDO;
|
|
|
|
|
import com.chanko.yunxi.mes.module.biz.dal.dataobject.taskdispatch.TaskDispatchDO;
|
|
|
|
|
import com.chanko.yunxi.mes.module.biz.dal.dataobject.taskdispatch.TaskDispatchDetailDO;
|
|
|
|
|
import com.chanko.yunxi.mes.module.biz.dal.dataobject.taskreport.TaskReportDO;
|
|
|
|
|
import com.chanko.yunxi.mes.module.biz.dal.dataobject.warehouse.WarehouseDO;
|
|
|
|
@ -38,6 +39,7 @@ import com.chanko.yunxi.mes.module.biz.dal.mysql.storage.StorageMapper;
|
|
|
|
|
import com.chanko.yunxi.mes.module.biz.dal.mysql.supplier.SupplierMapper;
|
|
|
|
|
import com.chanko.yunxi.mes.module.biz.dal.mysql.systemparameters.SystemParametersMapper;
|
|
|
|
|
import com.chanko.yunxi.mes.module.biz.dal.mysql.taskdispatch.TaskDispatchDetailMapper;
|
|
|
|
|
import com.chanko.yunxi.mes.module.biz.dal.mysql.taskdispatch.TaskDispatchMapper;
|
|
|
|
|
import com.chanko.yunxi.mes.module.biz.dal.mysql.taskreport.TaskReportMapper;
|
|
|
|
|
import com.chanko.yunxi.mes.module.biz.dal.mysql.warehouse.WarehouseMapper;
|
|
|
|
|
import com.chanko.yunxi.mes.module.biz.dal.mysql.workshop.WorkshopMapper;
|
|
|
|
@ -129,6 +131,9 @@ public class ChanjetManager {
|
|
|
|
|
@Resource
|
|
|
|
|
private HttpServletRequest request;
|
|
|
|
|
|
|
|
|
|
@Resource
|
|
|
|
|
private TaskDispatchMapper taskDispatchMapper;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private Boolean getSystemParameters(){
|
|
|
|
|
Boolean chanjet_switch = true;
|
|
|
|
@ -826,7 +831,7 @@ public class ChanjetManager {
|
|
|
|
|
ProjectOrderSubDO subDO = new ProjectOrderSubDO();
|
|
|
|
|
BeanUtil.copyProperties(mList.get(0), subDO);
|
|
|
|
|
|
|
|
|
|
// subDO.setAmount(mList.stream().mapToInt(QuerySaleOrderListResDTO::getAmount).sum());
|
|
|
|
|
subDO.setAmount(mList.stream().mapToInt(QuerySaleOrderListResDTO::getAmount).sum());
|
|
|
|
|
subDO.setOrderAmount(mList.stream().mapToInt(QuerySaleOrderListResDTO::getAmount).sum());
|
|
|
|
|
subDOList.add(subDO);
|
|
|
|
|
});
|
|
|
|
@ -837,28 +842,66 @@ public class ChanjetManager {
|
|
|
|
|
|
|
|
|
|
// 根据销售订单的每个产品的BOM,找到物料编码为6开头的物料,原先的生成生产订单的逻辑不变,再另外生成一张生产订单
|
|
|
|
|
// voList 是订单中的产品列表
|
|
|
|
|
List<ProjectOrderSubDO> subJSDOList = new ArrayList<>(100);
|
|
|
|
|
voList.stream().collect(Collectors.groupingBy(QuerySaleOrderListResDTO::getMaterialId)).forEach((mid, mList) -> {
|
|
|
|
|
MaterialDO materialDO = materialMapper.selectById(mid);
|
|
|
|
|
saveSemiFinishedOrder(materialDO,saveReqVO,mList.stream().mapToInt(QuerySaleOrderListResDTO::getAmount).sum());
|
|
|
|
|
saveSemiFinishedOrder(materialDO,saveReqVO,mList.stream().mapToInt(QuerySaleOrderListResDTO::getAmount).sum(),subJSDOList);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 保存订单产品信息
|
|
|
|
|
if(!CollUtil.isEmpty(subJSDOList)) {
|
|
|
|
|
ProjectOrderDO newProjectOrderDO =BeanUtil.toBean(projectOrderMapper.selectById(saveReqVO.getId()),ProjectOrderDO.class);
|
|
|
|
|
String code = newProjectOrderDO.getCode()+"-挤塑";
|
|
|
|
|
newProjectOrderDO.setId(null)
|
|
|
|
|
.setCode(code)
|
|
|
|
|
.setExternalCode(code)
|
|
|
|
|
.setStatus(ValidStatusEnum.VALID.getCode())
|
|
|
|
|
.setOrderSource(ProjectOrderSourceEnum.INTERFACE.getCode())
|
|
|
|
|
.setOrderStatus(ProjectOrderStatusEnum.SAVE.getCode())
|
|
|
|
|
.setIsUrgency(YesOrNoEnum.N.getCode());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 保存订单信息
|
|
|
|
|
projectOrderMapper.insert(newProjectOrderDO);
|
|
|
|
|
|
|
|
|
|
// 相同物料累计数量
|
|
|
|
|
List<ProjectOrderSubDO> subNewDOList = new ArrayList<>(100);
|
|
|
|
|
subJSDOList.stream().collect(Collectors.groupingBy(ProjectOrderSubDO::getMaterialId)).forEach((mid, mList) -> {
|
|
|
|
|
ProjectOrderSubDO subDO = new ProjectOrderSubDO();
|
|
|
|
|
BeanUtil.copyProperties(mList.get(0), subDO);
|
|
|
|
|
|
|
|
|
|
subDO.setProjectOrderId(newProjectOrderDO.getId());
|
|
|
|
|
subDO.setAmount(mList.stream().mapToInt(ProjectOrderSubDO::getAmount).sum());
|
|
|
|
|
subDO.setOrderAmount(mList.stream().mapToInt(ProjectOrderSubDO::getOrderAmount).sum());
|
|
|
|
|
subNewDOList.add(subDO);
|
|
|
|
|
});
|
|
|
|
|
projectOrderSubMapper.insertBatch(subNewDOList);
|
|
|
|
|
|
|
|
|
|
// 手动记录日志
|
|
|
|
|
operateLogFrameworkService.createOperateLog(request,
|
|
|
|
|
LocalDateTime.now(),
|
|
|
|
|
BusinessTypeEnum.PROJECT_ORDER.name(),
|
|
|
|
|
newProjectOrderDO.getId(),
|
|
|
|
|
OperateTypeEnum.valueOf(OperateTypeEnum.SAVE.name()).getType(),
|
|
|
|
|
"");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@SneakyThrows
|
|
|
|
|
private void saveSemiFinishedOrder(MaterialDO materialDO,ProjectOrderSaveReqVO saveReqVO,Integer orderAmount){
|
|
|
|
|
private void saveSemiFinishedOrder(MaterialDO materialDO,ProjectOrderSaveReqVO saveReqVO,Integer orderAmount,List<ProjectOrderSubDO> subJSDOList){
|
|
|
|
|
if(saveReqVO.getWarehouseId()==null) return;
|
|
|
|
|
// 查询当前物料子件物料信息
|
|
|
|
|
List<BomMaterialVO> bomDataList = queryProcessBom(materialDO.getCode(),saveReqVO.getWarehouseId());
|
|
|
|
|
if(CollUtil.isNotEmpty(bomDataList) && bomDataList.stream().filter(mo->mo.getProjectSubCode()!=null && mo.getProjectSubCode().toString().startsWith("6")).count()>0){
|
|
|
|
|
|
|
|
|
|
List<BomMaterialVO> mat6 = bomDataList.stream().filter(mo->mo.getProjectSubCode()!=null && mo.getProjectSubCode().toString().startsWith("6")).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
ProjectOrderDO newProjectOrderDO =BeanUtil.toBean(projectOrderMapper.selectById(saveReqVO.getId()),ProjectOrderDO.class);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<ProjectOrderSubDO> subDOList = new ArrayList<>(16);
|
|
|
|
|
|
|
|
|
|
mat6.forEach(mo->{
|
|
|
|
|
MaterialDO item = materialMapper.selectOne("code",mo.getProjectSubCode());
|
|
|
|
|
BigDecimal matAmount = new BigDecimal("0");
|
|
|
|
@ -868,142 +911,20 @@ public class ChanjetManager {
|
|
|
|
|
matAmount = mo.getRequiredQuantity().divide(mo.getProduceQuantity()).multiply(new BigDecimal(orderAmount)).subtract(mo.getStockQuantity()).add(item.getInvSafe()==null?new BigDecimal(0):item.getInvSafe());
|
|
|
|
|
}
|
|
|
|
|
if(matAmount.intValue()>0){
|
|
|
|
|
matAmount = mo.getRequiredQuantity().divide(mo.getProduceQuantity()).multiply(new BigDecimal(orderAmount)).add(mo.getStockQuantity()).subtract(item.getInvSafe()==null?new BigDecimal(0):item.getInvSafe());
|
|
|
|
|
ProjectOrderSubDO subDO = new ProjectOrderSubDO();
|
|
|
|
|
subDO.setAmount(matAmount.intValue());
|
|
|
|
|
matAmount = mo.getRequiredQuantity().divide(mo.getProduceQuantity()).multiply(new BigDecimal(orderAmount));
|
|
|
|
|
|
|
|
|
|
subDO.setMaterialId(item.getId())
|
|
|
|
|
// .setAmount(matAmount.intValue())
|
|
|
|
|
.setOrderAmount(matAmount.intValue())
|
|
|
|
|
.setWarehouseId(saveReqVO.getWarehouseId());
|
|
|
|
|
|
|
|
|
|
subDOList.add(subDO);
|
|
|
|
|
subJSDOList.add(subDO);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
// 保存订单产品信息
|
|
|
|
|
if(!CollUtil.isEmpty(subDOList)) {
|
|
|
|
|
|
|
|
|
|
String code = newProjectOrderDO.getCode()+"-挤塑";
|
|
|
|
|
newProjectOrderDO.setId(null)
|
|
|
|
|
.setCode(code)
|
|
|
|
|
.setExternalCode(code)
|
|
|
|
|
.setStatus(ValidStatusEnum.VALID.getCode())
|
|
|
|
|
.setOrderSource(ProjectOrderSourceEnum.INTERFACE.getCode())
|
|
|
|
|
.setOrderStatus(ProjectOrderStatusEnum.SAVE.getCode())
|
|
|
|
|
.setIsUrgency(YesOrNoEnum.N.getCode());
|
|
|
|
|
|
|
|
|
|
// 保存订单信息
|
|
|
|
|
projectOrderMapper.insert(newProjectOrderDO);
|
|
|
|
|
subDOList.stream().forEach(vo->vo.setProjectOrderId(newProjectOrderDO.getId()));
|
|
|
|
|
projectOrderSubMapper.insertBatch(subDOList);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 手动记录日志
|
|
|
|
|
operateLogFrameworkService.createOperateLog(request,
|
|
|
|
|
LocalDateTime.now(),
|
|
|
|
|
BusinessTypeEnum.PROJECT_ORDER.name(),
|
|
|
|
|
newProjectOrderDO.getId(),
|
|
|
|
|
OperateTypeEnum.valueOf(OperateTypeEnum.SAVE.name()).getType(),
|
|
|
|
|
"");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@SneakyThrows
|
|
|
|
|
private void saveSemiFinishedProjectOrder(Long orderId, List<QuerySaleOrderListResDTO> subDOList){
|
|
|
|
|
ProjectOrderDO newProjectOrderDO =BeanUtil.toBean(projectOrderMapper.selectById(orderId),ProjectOrderDO.class);
|
|
|
|
|
newProjectOrderDO.setId(null)
|
|
|
|
|
.setCode(newProjectOrderDO.getCode()+"-1")
|
|
|
|
|
.setStatus(ValidStatusEnum.VALID.getCode())
|
|
|
|
|
.setOrderSource(ProjectOrderSourceEnum.INTERFACE.getCode())
|
|
|
|
|
.setOrderStatus(ProjectOrderStatusEnum.SAVE.getCode())
|
|
|
|
|
.setIsUrgency(YesOrNoEnum.N.getCode());
|
|
|
|
|
|
|
|
|
|
// 保存订单信息
|
|
|
|
|
projectOrderMapper.insert(newProjectOrderDO);
|
|
|
|
|
|
|
|
|
|
List<QuerySaleOrderListResDTO> queryMatList =subDOList.stream().filter(sub ->{ return sub.getMaterialId().toString().startsWith("6");}).collect(Collectors.toList());
|
|
|
|
|
List<String> matCodes = new ArrayList<>();
|
|
|
|
|
queryMatList.forEach(mat->{
|
|
|
|
|
MaterialDO materialDO = materialMapper.selectById(mat.getMaterialId());
|
|
|
|
|
if(materialDO !=null){
|
|
|
|
|
mat.setMaterialCode(materialDO.getCode());
|
|
|
|
|
mat.setInvSafe(materialDO.getInvSafe());
|
|
|
|
|
if(!matCodes.contains(mat.getMaterialCode())){
|
|
|
|
|
matCodes.add(mat.getMaterialCode());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 查询当前物料的实时库存
|
|
|
|
|
List<QueryCurrentStockResVO> stockCurrentDatas = queryStock(matCodes,newProjectOrderDO.getWarehouseId());
|
|
|
|
|
List<ProjectOrderSubDO> insertList = new ArrayList<>(16);
|
|
|
|
|
|
|
|
|
|
for (QuerySaleOrderListResDTO o : queryMatList) {
|
|
|
|
|
Double matAmount = (double) 0;
|
|
|
|
|
if(insertList.stream().filter(uo -> uo.getMaterialCode().equals(o.getMaterialCode())).count()==0
|
|
|
|
|
&& materialMapper.selectById(o.getMaterialId())!=null){
|
|
|
|
|
|
|
|
|
|
ProjectOrderSubDO projectOrderSubDO = new ProjectOrderSubDO();
|
|
|
|
|
projectOrderSubDO.setProjectOrderId(newProjectOrderDO.getId()).setMaterialId(o.getMaterialId());
|
|
|
|
|
|
|
|
|
|
if (!StringUtils.isEmpty(o.getMaterialCode())) {
|
|
|
|
|
// 查询当前物料子件物料信息
|
|
|
|
|
CommonResult<List<QueryBomResVO>> bomDataList =
|
|
|
|
|
chanjetSpi.invokeRetList(QUERY_BOM, new QueryBomReqVO(new QueryBomReqVO.QueryBomDTO(o.getMaterialCode())), QueryBomResVO.class);
|
|
|
|
|
|
|
|
|
|
// 子件生产数量
|
|
|
|
|
AtomicReference<Double> produceQuantity = new AtomicReference<>(0d);
|
|
|
|
|
// 子件需求数量
|
|
|
|
|
AtomicReference<Double> requiredQuantity = new AtomicReference<>(0d);
|
|
|
|
|
bomDataList.getData().get(0).getBOMChildDTOs().forEach(ch->{
|
|
|
|
|
produceQuantity.updateAndGet(v -> v + ch.getProduceQuantity());
|
|
|
|
|
requiredQuantity.updateAndGet(v -> v + ch.getRequiredQuantity());
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 查询当前物料父件物料信息
|
|
|
|
|
QueryBomReqVO queryBomReqVOAsChild = new QueryBomReqVO(new QueryBomReqVO.QueryBomDTO(null,o.getMaterialCode()));
|
|
|
|
|
CommonResult<List<QueryBomResVO>> result =
|
|
|
|
|
chanjetSpi.invokeRetList(QUERY_BOM, queryBomReqVOAsChild,QueryBomResVO.class);
|
|
|
|
|
|
|
|
|
|
AtomicReference<Integer> parantAmount = new AtomicReference<>(0);
|
|
|
|
|
|
|
|
|
|
if(result!= null && result.getData()!=null) {
|
|
|
|
|
subDOList.stream().collect(Collectors.groupingBy(QuerySaleOrderListResDTO::getMaterialId)).forEach((mid, mList) -> {
|
|
|
|
|
if (mid.equals(result.getData().get(0).getID())){
|
|
|
|
|
parantAmount.set(mList.stream().mapToInt(QuerySaleOrderListResDTO::getAmount).sum());
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QueryCurrentStockResVO currentStock =
|
|
|
|
|
stockCurrentDatas.stream().filter(stock->{
|
|
|
|
|
return stock.getInventoryCode().equals(o.getMaterialCode());
|
|
|
|
|
}).collect(Collectors.toList()).get(0);
|
|
|
|
|
|
|
|
|
|
// 该物料的实时库存
|
|
|
|
|
Integer availableQuantity = currentStock==null?0:new Integer(currentStock.getAvailableQuantity());
|
|
|
|
|
|
|
|
|
|
matAmount = (requiredQuantity.get()==0 ?0:produceQuantity.get()/requiredQuantity.get())*parantAmount.get()-availableQuantity+o.getInvSafe().doubleValue();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
projectOrderSubDO.setAmount(matAmount.intValue());
|
|
|
|
|
|
|
|
|
|
insertList.add(projectOrderSubDO);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 保存订单产品信息
|
|
|
|
|
if(!CollUtil.isEmpty(insertList)) {
|
|
|
|
|
projectOrderSubMapper.insertBatch(insertList);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 手动记录日志
|
|
|
|
|
operateLogFrameworkService.createOperateLog(request,
|
|
|
|
|
LocalDateTime.now(),
|
|
|
|
|
BusinessTypeEnum.PROJECT_ORDER.name(),
|
|
|
|
|
newProjectOrderDO.getId(),
|
|
|
|
|
OperateTypeEnum.valueOf(OperateTypeEnum.SAVE.name()).getType(),
|
|
|
|
|
"");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询bom
|
|
|
|
|
*
|
|
|
|
@ -1312,12 +1233,17 @@ public class ChanjetManager {
|
|
|
|
|
WarehouseDO aDo = warehouseMapper.selectById(storage.getWhId());
|
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
|
|
|
|
|
|
|
TaskDispatchDO taskDispatchDO = taskDispatchMapper.selectOne("code",storage.getHeaderNo());
|
|
|
|
|
|
|
|
|
|
WorkshopDO workshopDO =workshopMapper.selectById(taskDispatchDO.getWorkshopId());
|
|
|
|
|
|
|
|
|
|
CreateStockOutDTO dto = new CreateStockOutDTO();
|
|
|
|
|
ArrayList<RDRecordDetail> detailList = new ArrayList<>();
|
|
|
|
|
dto.setExternalCode(storage.getStockNo())
|
|
|
|
|
.setVoucherDate(sdf.format(new Date()))
|
|
|
|
|
.setRDRecordDetails(detailList)
|
|
|
|
|
.setWarehouse(new Warehouse(aDo.getWhNo()))
|
|
|
|
|
.setDepartment(new DepartmentDTO().setCode(workshopDO.getCode()).setName(workshopDO.getName()))
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
matList.forEach(mat -> {
|
|
|
|
|