package com.ruoyi.production.service.impl;
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.ruoyi.production.dto.ProcessRouteAnticlockwiseDto;
|
import com.ruoyi.production.dto.ProcessRouteDto;
|
import com.ruoyi.production.mapper.ProcessRouteItemMapper;
|
import com.ruoyi.production.mapper.ProcessRouteMapper;
|
import com.ruoyi.production.mapper.ProductOrderMapper;
|
import com.ruoyi.production.pojo.*;
|
import com.ruoyi.production.service.*;
|
import lombok.AllArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.math.BigDecimal;
|
import java.time.LocalDate;
|
import java.time.format.DateTimeFormatter;
|
import java.util.ArrayList;
|
import java.util.List;
|
|
@Service
|
@AllArgsConstructor
|
@Slf4j
|
public class ProcessRouteServiceImpl extends ServiceImpl<ProcessRouteMapper, ProcessRoute> implements ProcessRouteService {
|
|
@Autowired
|
private ProcessRouteMapper processRouteMapper;
|
|
@Autowired
|
private ProcessRouteItemMapper processRouteItemMapper;
|
|
@Autowired
|
private ProductOrderMapper productOrderMapper;
|
@Autowired
|
private ProductStructureService productStructureService;
|
@Autowired
|
private ProcessRouteItemService processRouteItemService;
|
@Autowired
|
private ProductWorkOrderService productWorkOrderService;
|
@Autowired
|
private ProductBomService productBomService;
|
@Autowired
|
private ProductProcessRouteService productProcessRouteService;
|
@Autowired
|
private ProductProcessRouteItemService productProcessRouteItemService;
|
@Autowired
|
private ProductOrderService productOrderService;
|
@Autowired
|
private ProductProcessService productProcessService;
|
|
@Override
|
public IPage<ProcessRouteDto> pageProcessRouteDto(Page<ProcessRouteDto> page, ProcessRouteDto processRouteDto) {
|
|
return processRouteMapper.pageProcessRouteDto(page, processRouteDto);
|
}
|
|
@Override
|
public Integer saveProcessRoute(ProcessRoute processRoute) {
|
this.save(processRoute);
|
String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
|
String idStr = String.format("%06d", processRoute.getId());
|
String newProductCode = "GYLX" + dateStr + idStr;
|
// 更新数据库中的productCode
|
processRoute.setProcessRouteCode(newProductCode);
|
return processRouteMapper.updateById(processRoute);
|
}
|
|
@Override
|
public int batchDelete(List<Long> ids) {
|
//先判断是否已经引用了
|
List<ProductOrder> productOrders = productOrderMapper.selectList(Wrappers.<ProductOrder>lambdaQuery().in(ProductOrder::getRouteId, ids));
|
if (productOrders.size() > 0) {
|
throw new RuntimeException("该工艺路线生产已引用,不能删除");
|
}
|
//删除工艺路线详情
|
processRouteItemMapper.delete(Wrappers.<ProcessRouteItem>lambdaQuery().in(ProcessRouteItem::getRouteId, ids));
|
return processRouteMapper.deleteBatchIds(ids);
|
}
|
|
|
/**
|
* 工艺路线反向新增 新增了bom bom子表 工艺路线 工艺路线子表 生产工艺路线主表 生产工艺路线子表 工单表
|
*
|
* @param processRouteAnticlockwiseDtos 工艺子表
|
* @param productModelId 成品规格型号id
|
* @param productOrderId 生产订单id
|
* @return
|
*/
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public Long processRouteAnticlockwise(List<ProcessRouteAnticlockwiseDto> processRouteAnticlockwiseDtos, Long productModelId, Long productOrderId) {
|
ProductOrder byId = productOrderService.getById(productOrderId);
|
// 1. 新增BOM
|
ProductBom productBom = createProductBom(productModelId);
|
|
// 2. 新增BOM子表
|
List<ProductStructure> productStructures = buildProductStructures(processRouteAnticlockwiseDtos, productBom.getId());
|
productStructureService.saveBatch(productStructures);
|
|
// 3. 新增工艺路线
|
ProcessRoute processRoute = createProcessRoute(productModelId, productBom.getId());
|
|
// 4. 新增工艺路线子表
|
List<ProcessRouteItem> processRouteItems = buildProcessRouteItems(processRouteAnticlockwiseDtos, processRoute.getId(), productModelId);
|
processRouteItemService.saveBatch(processRouteItems);
|
|
// 5. 新增生产工艺路线
|
ProductProcessRoute productProcessRoute = createProductProcessRoute(productModelId, productOrderId, productBom.getId(), processRoute.getProcessRouteCode());
|
|
// 6. 新增生产工艺路线子表
|
buildProductProcessRouteItems(processRouteAnticlockwiseDtos, productProcessRoute.getId(), productModelId, productOrderId);
|
return processRoute.getId();
|
}
|
|
/**
|
* 创建产品BOM
|
*/
|
private ProductBom createProductBom(Long productModelId) {
|
ProductBom productBom = new ProductBom();
|
productBom.setProductModelId(productModelId);
|
productBom.setVersion("1.0.0");
|
productBomService.save(productBom);
|
|
productBom.setBomNo("BM." + String.format("%05d", productBom.getId()));
|
productBomService.updateById(productBom);
|
|
return productBom;
|
}
|
|
/**
|
* 构建产品结构列表
|
*/
|
private List<ProductStructure> buildProductStructures(List<ProcessRouteAnticlockwiseDto> dtos, Integer bomId) {
|
List<ProductStructure> structures = new ArrayList<>(dtos.size());
|
for (ProcessRouteAnticlockwiseDto dto : dtos) {
|
ProductStructure structure = new ProductStructure();
|
structure.setProductModelId(dto.getProductModelId());
|
structure.setProcessId(dto.getProcessId());
|
structure.setUnitQuantity(new BigDecimal(1));
|
structure.setProcessRouteOpenNum(dto.getProcessRouteOpenNum());
|
structure.setProcessRouteNum(dto.getProcessRouteNum());
|
structure.setProcessRouteAddNum(dto.getProcessRouteAddNum());
|
structure.setProcessRouteRequire(dto.getProcessRouteRequire());
|
structure.setBomId(bomId);
|
structure.setProcessRouteName(dto.getProcessRouteName());
|
structures.add(structure);
|
}
|
return structures;
|
}
|
|
/**
|
* 创建工艺路线
|
*/
|
private ProcessRoute createProcessRoute(Long productModelId, Integer bomId) {
|
ProcessRoute processRoute = new ProcessRoute();
|
processRoute.setProductModelId(productModelId);
|
processRoute.setBomId(bomId);
|
processRoute.setDescription("");
|
this.save(processRoute);
|
|
processRoute.setProcessRouteCode("GYLX." + String.format("%09d", processRoute.getId()));
|
this.updateById(processRoute);
|
|
return processRoute;
|
}
|
|
/**
|
* 构建工艺路线子项列表
|
*/
|
private List<ProcessRouteItem> buildProcessRouteItems(List<ProcessRouteAnticlockwiseDto> dtos, Long routeId, Long productModelId) {
|
List<ProcessRouteItem> items = new ArrayList<>(dtos.size());
|
Integer num = 0;
|
for (ProcessRouteAnticlockwiseDto dto : dtos) {
|
ProcessRouteItem item = new ProcessRouteItem();
|
item.setRouteId(routeId);
|
item.setProcessId(dto.getProcessId());
|
item.setProductModelId(productModelId);
|
item.setProcessRouteName(dto.getProcessRouteName());
|
item.setProcessRouteOpenNum(dto.getProcessRouteOpenNum());
|
item.setProcessRouteNum(dto.getProcessRouteNum());
|
item.setProcessRouteAddNum(dto.getProcessRouteAddNum());
|
item.setProcessRouteRequire(dto.getProcessRouteRequire());
|
item.setDragSort(num++);
|
items.add(item);
|
}
|
return items;
|
}
|
|
/**
|
* 创建生产工艺路线
|
*/
|
private ProductProcessRoute createProductProcessRoute(Long productModelId, Long productOrderId, Integer bomId, String processRouteCode) {
|
ProductProcessRoute productProcessRoute = new ProductProcessRoute();
|
productProcessRoute.setProductModelId(productModelId);
|
productProcessRoute.setProductOrderId(productOrderId);
|
productProcessRoute.setBomId(bomId);
|
productProcessRoute.setProcessRouteCode(processRouteCode);
|
productProcessRouteService.save(productProcessRoute);
|
|
return productProcessRoute;
|
}
|
|
/**
|
* 构建生产工艺路线子项列表
|
*/
|
private void buildProductProcessRouteItems(List<ProcessRouteAnticlockwiseDto> dtos, Long productRouteId, Long productModelId, Long productOrderId) {
|
ProductOrder byId = productOrderService.getById(productOrderId);
|
Integer num = 0;
|
for (ProcessRouteAnticlockwiseDto dto : dtos) {
|
ProductProcessRouteItem item = new ProductProcessRouteItem();
|
item.setProductRouteId(productRouteId);
|
item.setProcessId(dto.getProcessId());
|
if (num >= dtos.size() - 1) {
|
item.setProductModelId(productModelId);
|
} else {
|
item.setProductModelId(dto.getProductModelId());
|
}
|
item.setProcessRouteName(dto.getProcessRouteName());
|
item.setProcessRouteOpenNum(dto.getProcessRouteOpenNum());
|
item.setProcessRouteNum(dto.getProcessRouteNum());
|
item.setProcessRouteAddNum(dto.getProcessRouteAddNum());
|
item.setProcessRouteRequire(dto.getProcessRouteRequire());
|
item.setDragSort(num++);
|
item.setIsQuality(dto.getProductProcess().getIsQuality() != null && dto.getProductProcess().getIsQuality());
|
item.setUuid(dto.getUuid());
|
productProcessRouteItemService.save(item);
|
ProductProcess productProcess = productProcessService.getById(item.getProcessId());
|
//同步新增生产工单
|
ProductWorkOrder productWorkOrder = new ProductWorkOrder();
|
productWorkOrder.setProductProcessRouteItemId(item.getId());
|
productWorkOrder.setProductOrderId(productOrderId);
|
productWorkOrder.setPlanQuantity(new BigDecimal(dto.getProcessRouteNum()));
|
productWorkOrder.setDeviceId(dto.getDeviceId());
|
productWorkOrder.setUserIds(dto.getUserIds());
|
productWorkOrder.setUserNames(dto.getUserNames());
|
productWorkOrder.setWorkOrderNo(productWorkOrderService.generateProductWorkOrder(productProcess.getName(), byId.getNpsNo()));
|
productWorkOrder.setStatus(1);
|
productWorkOrderService.save(productWorkOrder);
|
}
|
}
|
}
|