package com.whyc.service;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.whyc.config.EnumWorksheetType;
|
import com.whyc.mapper.ProductBomApprovingMapper;
|
import com.whyc.mapper.WorksheetLinkMapper;
|
import com.whyc.pojo.*;
|
import com.whyc.util.CommonUtil;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.util.FileCopyUtils;
|
|
import javax.annotation.Resource;
|
import java.io.File;
|
import java.io.IOException;
|
import java.util.*;
|
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.stream.Collectors;
|
|
@Service
|
public class WorksheetLinkService {
|
|
@Resource
|
private WorksheetMainService mainService;
|
|
@Resource
|
private WorksheetLinkMapper linkMapper;
|
|
@Autowired
|
private ProductBomApprovingMapper approvingMapper;
|
|
@Autowired
|
private ProductBomService bomService;
|
|
@Autowired
|
private ProductBomHistoryService historyService;
|
|
@Autowired
|
private ComponentProductHistoryService cphService;
|
|
@Autowired
|
private ComponentProductApprovingService cpAService;
|
|
@Autowired
|
private ComponentApprovingService cAService;
|
|
@Autowired
|
private ComponentService cService;
|
|
@Transactional
|
public void audit(WorksheetLink link) {
|
link.setDealTime(new Date());
|
//更新节点信息
|
linkMapper.updateById(link);
|
if(link.getLinkStatus() == 2){ //驳回
|
//查看是否为散装件审批,是则需要更新散装件审批表中的状态为完结
|
if(mainService.getInfoById(link.getMainId()).getType().equals(EnumWorksheetType.Component.getType())){
|
cAService.endType(link.getMainId());
|
}
|
//项目经理驳回,驳回即终止
|
mainService.updateEndStatusById(link.getMainId(),"经理驳回,驳回原因:"+link.getDealReason(),0);
|
//项目经理驳回前,还曾经过总经理,则需要增加总经理驳回原因
|
if(link.getParentId()!=0) {
|
QueryWrapper<WorksheetLink> query = Wrappers.query();
|
query.eq("id", link.getParentId());
|
WorksheetLink parentLink = linkMapper.selectOne(query);
|
//这个是无效的,用户跟角色对比,不管,下面代码永不生效
|
if (parentLink.getDealUserId() == 1003) {
|
mainService.updateEndStatusById(link.getMainId(),
|
"经理驳回,驳回原因:" + link.getDealReason() + ";总经理驳回,驳回原因:" + parentLink.getDealReason(),
|
0);
|
}
|
}
|
}else{
|
//进入下一节点,总经理审批
|
WorksheetLink link2 = new WorksheetLink();
|
link2.setMainId(link.getMainId());
|
link2.setParentId(link.getId());
|
link2.setDealUserId(link.getNextUser());
|
link2.setDealType(2);
|
link2.setDealDesc("工单被经理审核通过,信息:"+link.getDealReason());
|
link2.setLinkStatus(0);
|
link2.setEnableArchive(1);
|
link2.setRejectVersion(link.getRejectVersion());
|
linkMapper.insert(link2);
|
//更新主表状态
|
mainService.updateStatusById(link.getMainId(),2);
|
}
|
}
|
|
@Transactional
|
public void approve(WorksheetLink link) {
|
//根据节点,查询主表类型
|
Integer type = mainService.getInfoById(link.getMainId()).getType();
|
link.setDealTime(new Date());
|
//更新节点信息
|
linkMapper.updateById(link);
|
if(link.getLinkStatus() == 2){ //驳回
|
if(link.getParentId()!=0) {
|
//查询对应的项目经理
|
Long createUserId = linkMapper.selectById(link.getParentId()).getDealUserId();
|
WorksheetLink link2 = new WorksheetLink();
|
link2.setMainId(link.getMainId());
|
link2.setParentId(link.getId());
|
link2.setDealUserId(createUserId);
|
link2.setDealType(0);
|
link2.setDealDesc("工单被总经理驳回,驳回信息:" + link.getDealReason());
|
link2.setLinkStatus(0);
|
link2.setEnableArchive(0);
|
link2.setRejectVersion(link.getRejectVersion());
|
linkMapper.insert(link2);
|
//更新主表状态
|
mainService.updateStatusById(link.getMainId(), 1);
|
}else{
|
//说明是项目经理提交的,驳回即终止
|
mainService.updateEndStatusById(link.getMainId(),"总经理驳回,驳回原因:"+link.getDealReason(),0);
|
}
|
}else {
|
//审批通过,更新主表状态
|
mainService.updateEndStatusById(link.getMainId(), "完结", 5);
|
if (type.intValue() == EnumWorksheetType.ProductBom.getType()) { //产品审批
|
//将产品文件复制至正式路径
|
QueryWrapper<ProductBomApproving> query = Wrappers.query();
|
query.eq("main_id", link.getMainId());
|
List<ProductBomApproving> approvingList = approvingMapper.selectList(query);
|
|
//增加->增加部件(增加记录,同时所有eVersion+1)
|
//修改->修改部件图纸,修改部件非图纸(增加记录,同时修改非原部件的所有eVersion+1)
|
//删除? TODO 需要约定逻辑
|
|
//查询部件最新的版本号
|
ProductBom product = bomService.getProduct(approvingList.get(0).getParentModel());
|
int currentVersion = -1;
|
if (product != null) {
|
currentVersion = product.getVersion();
|
}
|
Integer nextVersion = currentVersion + 1;
|
//更新到product_bom_history,增加进去的需要sVersion和eVersion一致
|
//增加所有部件,排查出相关的原部件,非也是更新
|
List<ProductBomHistory> currentHistoryList = historyService.getListByParentModel(approvingList.get(0).getParentModel(), currentVersion);
|
List<String> currentSubNameList = currentHistoryList.stream().map(ProductBomHistory::getSubName).collect(Collectors.toList());
|
|
List<ProductBomHistory> newHistoryList = new LinkedList<>();
|
approvingList.forEach(approvingBom -> {
|
if (currentSubNameList.contains(approvingBom.getSubName())) {
|
approvingBom.setVersion(1);
|
} else {
|
approvingBom.setVersion(0);
|
}
|
//转化为productBomHistory
|
ProductBomHistory his = new ProductBomHistory();
|
his.setCategory(approvingBom.getCategory());
|
his.setCreateDate(approvingBom.getCreateDate());
|
his.setDwgUrl(approvingBom.getDwgUrl());
|
his.setEVersion(nextVersion);
|
his.setFileUrl(approvingBom.getFileUrl());
|
his.setMaterial(approvingBom.getMaterial());
|
his.setNotes(approvingBom.getNotes());
|
his.setParentCode(approvingBom.getParentCode());
|
his.setParentModel(approvingBom.getParentModel());
|
his.setParentName(approvingBom.getParentName());
|
his.setParentVersion(approvingBom.getParentVersion());
|
his.setPictureUrl(approvingBom.getPictureUrl());
|
his.setProducer(approvingBom.getProducer());
|
his.setQuantity(approvingBom.getQuantity());
|
his.setSubCode(approvingBom.getSubCode());
|
his.setSubModel(approvingBom.getSubModel());
|
his.setSubName(approvingBom.getSubName());
|
his.setSurfaceDetail(approvingBom.getSurfaceDetail());
|
his.setSVersion(nextVersion);
|
his.setThickness(approvingBom.getThickness());
|
his.setType(approvingBom.getType());
|
his.setUnit(approvingBom.getUnit());
|
his.setUpUserId(approvingBom.getUpUserId());
|
|
newHistoryList.add(his);
|
});
|
//本次审核中子件被修改的子件集合
|
List<String> approvingUpdateSubNameList = approvingList.stream().filter(approvingBom -> approvingBom.getVersion() == 1).map(ProductBomApproving::getSubName).collect(Collectors.toList());
|
|
historyService.addBatch(newHistoryList);
|
/*更新产品的当前版本,更新到最新的版本*/
|
//当前版本的所有bom的eVersion更新,排除被修改的子件
|
List<ProductBomHistory> newVersionCurrentHistoryList = currentHistoryList.stream()
|
.filter(currentHistory -> !approvingUpdateSubNameList.contains(currentHistory.getSubName()))
|
.collect(Collectors.toList());
|
newVersionCurrentHistoryList.forEach(history -> {
|
history.setEVersion(nextVersion);
|
});
|
if (newVersionCurrentHistoryList.size() != 0) {
|
historyService.updateVersionBatch(newVersionCurrentHistoryList);
|
}
|
//更新散件表当前版本,更新eVersion
|
List<ComponentProductHistory> cphList = cphService.getListByParentModel(approvingList.get(0).getParentModel(),currentVersion);
|
if(cphList.size()!=0){cphService.updateVersionBatch(cphList);}
|
|
/*更新到product_bom*/
|
//查询新的版本
|
List<ProductBomHistory> newBomList = historyService.getListByParentModel(approvingList.get(0).getParentModel(), nextVersion);
|
bomService.updateNewBom(newBomList);
|
|
/*String projectDir = CommonUtil.getProjectDir();
|
FileUtil.copyDir()*/
|
|
|
/*将产品bom表的url修正,更新到正式表*/
|
//审批完后,将本次的bom带url的全部复制到正式文件夹中
|
List<ProductBomApproving> fileBomApprovingList = approvingList.stream()
|
.filter(productBomApproving ->
|
productBomApproving.getPictureUrl() != null || productBomApproving.getDwgUrl() != null
|
).collect(Collectors.toList());
|
String projectDir = CommonUtil.getProjectDir();
|
fileBomApprovingList.forEach(fileBom -> {
|
try {
|
String pictureUrl = fileBom.getPictureUrl();
|
String dwgUrl = fileBom.getDwgUrl();
|
if (pictureUrl != null) {
|
String newPictureUrl = "doc_file" + File.separator + "product" + File.separator + fileBom.getParentModel() + File.separator + pictureUrl.substring(pictureUrl.lastIndexOf(File.separator) + 1);
|
File newPictureDir = new File(projectDir + File.separator + "doc_file" + File.separator + "product" + File.separator + fileBom.getParentModel());
|
if (!newPictureDir.exists()) {
|
newPictureDir.mkdirs();
|
}
|
FileCopyUtils.copy(new File(projectDir + File.separator + pictureUrl),
|
new File(projectDir + File.separator + newPictureUrl));
|
fileBom.setPictureUrl(newPictureUrl);
|
}
|
if (dwgUrl != null) {
|
String newDwgUrl = "doc_file" + File.separator + "product" + File.separator + fileBom.getParentModel() + File.separator + dwgUrl.substring(dwgUrl.lastIndexOf(File.separator) + 1);
|
File newDwgDir = new File(projectDir + File.separator + "doc_file" + File.separator + "product" + File.separator + fileBom.getParentModel());
|
if (!newDwgDir.exists()) {
|
newDwgDir.mkdirs();
|
}
|
FileCopyUtils.copy(new File(projectDir + File.separator + dwgUrl),
|
new File(projectDir + File.separator + newDwgUrl));
|
fileBom.setDwgUrl(newDwgUrl);
|
}
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
});
|
//更新正式bom的对应url
|
bomService.updateUrl(fileBomApprovingList);
|
}
|
else if(type.intValue() == EnumWorksheetType.Component.getType()){ //散装件
|
//将散装件从审批表中转移到正式表
|
List<Component> componentList = new LinkedList<>();
|
List<ComponentApproving> approvingList = cAService.getListByMainId(link.getMainId());
|
approvingList.forEach(approve->{
|
Component component = new Component();
|
component.setCategory(approve.getCategory());
|
component.setSubCode(approve.getSubCode());
|
component.setSubName(approve.getSubName());
|
component.setSubModel(approve.getSubModel());
|
component.setUnit(approve.getUnit());
|
component.setQuantity(approve.getQuantity());
|
component.setProducer(approve.getProducer());
|
component.setNotes(approve.getNotes());
|
component.setCreateDate(new Date());
|
component.setStatus(1);
|
componentList.add(component);
|
});
|
cService.insertBatch(componentList);
|
//更新散装件审批子表中type为完结
|
cAService.endType(link.getMainId());
|
}
|
else if(type.intValue() == EnumWorksheetType.ComponentProduct.getType()){ //更新散装件-产品关系
|
//查找到对应的散装件-产品关系数据
|
List<ComponentProductApproving> cpAList = cpAService.getListByMainId(link.getMainId());
|
//查询部件最新的版本号
|
ProductBom product = bomService.getProduct(cpAList.get(0).getParentModel());
|
int currentVersion = -1;
|
if (product != null) {
|
currentVersion = product.getVersion();
|
}
|
Integer nextVersion = currentVersion + 1;
|
//关联/接触关联,更新版本
|
//替换,更新版本,同时bom表历史中对应的subName 版本号不变(排除更新)
|
Map<Integer, List<ComponentProductApproving>> linkTypeMap = cpAList.stream().collect(Collectors.groupingBy(ComponentProductApproving::getLinkType));
|
List<ComponentProductApproving> addedList = new LinkedList<>();
|
List<ComponentProductApproving> replacedList = new LinkedList<>();
|
List<ComponentProductApproving> removedList = new LinkedList<>();
|
linkTypeMap.forEach((linkType,list)->{
|
if(linkType == 1){
|
addedList.addAll(list);
|
}else if(linkType == 2){
|
replacedList.addAll(list);
|
}else{
|
removedList.addAll(list);
|
}
|
});
|
List<ComponentProductHistory> newHistoryList = new LinkedList<>();
|
//查询最新版本生效的相关散装件
|
List<ComponentProductHistory> nowHistoryList = cphService.getListByParentModel(cpAList.get(0).getParentModel(), currentVersion);
|
//查询历史中最新版本生效的bom
|
List<ProductBomHistory> nowBomHistoryList = historyService.getListByParentModel(cpAList.get(0).getParentModel(), currentVersion);
|
|
/*
|
对于关联的,判断当前版本中是否存在替换关系,存在,则直接下个版本插入关联;
|
同时,其他当前版本的相关散装件-产品记录更新版本,排除存在的替换关系
|
*/
|
|
/*
|
对于替换的,判断当前版本中是否存在关联关系,存在,直接下个版本替换,记录插入;
|
同时,当前版本的相关散装件-产品记录更新版本,排除存在的关联关系;
|
同时,bom表更新到下个版本时,排除被替换件
|
*/
|
|
//对于解除关联的,当前版本的相关散装件-产品记录更新版本,排除解除关联的记录
|
//处理思路:先解除关联,再替换,再关联
|
if(removedList.size()!=0){
|
removedList.forEach(remove -> {
|
/*nowHistoryList.forEach(nowHistory -> {
|
if (remove.getComponentId().intValue() == nowHistory.getComponentId()) {
|
nowHistoryList.remove(nowHistory);
|
}
|
});*/
|
Iterator<ComponentProductHistory> iterator = nowHistoryList.iterator();
|
while (iterator.hasNext()){
|
ComponentProductHistory next = iterator.next();
|
if(remove.getComponentId().intValue() == next.getComponentId()
|
&&remove.getSubName().equals(next.getSubName())
|
){
|
iterator.remove();
|
break;
|
}
|
}
|
});
|
}
|
|
//处理替换
|
if(replacedList.size()!=0){
|
replacedList.forEach(replace -> {
|
//当前生效的散装件-产品列表
|
/*nowHistoryList.forEach(nowHistory -> {
|
if (replace.getComponentId().intValue() == nowHistory.getComponentId()) {
|
nowHistoryList.remove(nowHistory);
|
}
|
});*/
|
if(nowHistoryList.size()!=0) {
|
Iterator<ComponentProductHistory> iterator = nowHistoryList.iterator();
|
while (iterator.hasNext()) {
|
ComponentProductHistory next = iterator.next();
|
if (replace.getComponentId().intValue() == next.getComponentId()
|
&& replace.getSubName().equals(next.getSubName())
|
) {
|
iterator.remove();
|
break;
|
}
|
}
|
}
|
//下个版本新增替换的散装件-产品列表
|
ComponentProductHistory newHistory = new ComponentProductHistory();
|
newHistory.setComponentId(replace.getComponentId());
|
newHistory.setParentModel(replace.getParentModel());
|
newHistory.setSubName(replace.getSubName());
|
newHistory.setCreateTime(new Date());
|
newHistory.setLinkType(2);
|
newHistory.setSVersion(nextVersion);
|
newHistory.setEVersion(nextVersion);
|
newHistoryList.add(newHistory);
|
//当前生效的bom列表
|
/*nowBomHistoryList.forEach(nowBomHistory->{
|
if(replace.getSubName().equals(nowBomHistory.getSubName())){
|
nowBomHistoryList.remove(nowBomHistory);
|
}
|
});*/
|
Iterator<ProductBomHistory> iterator1 = nowBomHistoryList.iterator();
|
while (iterator1.hasNext()){
|
if(replace.getSubName().equals(iterator1.next().getSubName())){
|
iterator1.remove();
|
break;
|
}
|
}
|
});
|
}
|
|
//处理关联
|
addedList.forEach(add -> {
|
/*nowHistoryList.forEach(nowHistory -> {
|
if (add.getComponentId().intValue() == nowHistory.getComponentId()) {
|
nowHistoryList.remove(nowHistory);
|
}
|
});*/
|
if(nowHistoryList.size()!=0) {
|
Iterator<ComponentProductHistory> iterator = nowHistoryList.iterator();
|
while (iterator.hasNext()) {
|
ComponentProductHistory next = iterator.next();
|
if (add.getComponentId().intValue() == next.getComponentId()
|
&& add.getSubName().equals(next.getSubName())
|
) {
|
iterator.remove();
|
break;
|
}
|
}
|
}
|
|
ComponentProductHistory newHistory = new ComponentProductHistory();
|
newHistory.setComponentId(add.getComponentId());
|
newHistory.setParentModel(add.getParentModel());
|
newHistory.setSubName(add.getSubName());
|
newHistory.setCreateTime(new Date());
|
newHistory.setLinkType(1);
|
newHistory.setSVersion(nextVersion);
|
newHistory.setEVersion(nextVersion);
|
newHistoryList.add(newHistory);
|
|
});
|
|
//处理完成,进行表单数据更新,分为nowHistoryList,newHistoryList,nowBomHistoryList
|
//nowHistoryList.forEach(nowHis->nowHis.setEVersion(nextVersion));
|
if(newHistoryList.size()!=0){newHistoryList.forEach(newHis->{newHis.setEVersion(nextVersion);newHis.setSVersion(nextVersion);});}
|
if(nowBomHistoryList.size()!=0){nowBomHistoryList.forEach(nowBomHis->nowBomHis.setEVersion(nextVersion));}
|
|
if(nowHistoryList.size()!=0){cphService.updateVersionBatch(nowHistoryList);}
|
if(newHistoryList.size()!=0){cphService.insertBatch(newHistoryList);}
|
if(nowBomHistoryList.size()!=0){historyService.updateVersionBatch(nowBomHistoryList);}
|
//更新ProductBom
|
List<ProductBomHistory> newBomList = historyService.getListByParentModel(cpAList.get(0).getParentModel(), nextVersion);
|
bomService.updateNewBom(newBomList);
|
}
|
}
|
}
|
|
/**
|
* 获取节点信息(包含main表)列表
|
* @param id
|
* @return
|
*/
|
public List<WorksheetLink> getInfoList(Long id) {
|
return linkMapper.getInfoList(id);
|
}
|
|
/**
|
*
|
* @param userId 总经理对应的userId
|
* @param statusExp 0:未审批,1:已审批(包含状态值1,2)
|
* @return
|
*/
|
public List<WorksheetMain> getInfoList2(Long userId, int statusExp) {
|
return linkMapper.getInfoList2(userId,statusExp);
|
}
|
|
/**
|
*
|
* @param userId 总经理对应的userId
|
* @param statusExp 0:未审批,1:已审批(包含状态值1,2)
|
* @return
|
*/
|
public List<WorksheetMain> getInfoList3(Long userId, int statusExp) {
|
return linkMapper.getInfoList3(userId,statusExp);
|
}
|
|
public DocUser getApprovingUser(Integer mainId) {
|
return linkMapper.getApprovingUser(mainId);
|
}
|
}
|