|
|
|
@ -3,6 +3,7 @@ package org.springblade.desk.produce.service.impl; |
|
|
|
import com.alibaba.excel.util.StringUtils; |
|
|
|
import com.alibaba.excel.util.StringUtils; |
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage; |
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage; |
|
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
|
|
|
import jakarta.annotation.Resource; |
|
|
|
import jakarta.annotation.Resource; |
|
|
|
import lombok.RequiredArgsConstructor; |
|
|
|
import lombok.RequiredArgsConstructor; |
|
|
|
import net.sourceforge.barbecue.Barcode; |
|
|
|
import net.sourceforge.barbecue.Barcode; |
|
|
|
@ -24,6 +25,7 @@ import org.springblade.desk.basic.mapper.TeamSetMapper; |
|
|
|
import org.springblade.desk.basic.pojo.entity.Oem; |
|
|
|
import org.springblade.desk.basic.pojo.entity.Oem; |
|
|
|
import org.springblade.desk.basic.pojo.entity.OemCraftAbilityEntity; |
|
|
|
import org.springblade.desk.basic.pojo.entity.OemCraftAbilityEntity; |
|
|
|
import org.springblade.desk.basic.pojo.entity.TeamSet; |
|
|
|
import org.springblade.desk.basic.pojo.entity.TeamSet; |
|
|
|
|
|
|
|
import org.springblade.desk.basic.pojo.entity.WorkCenter; |
|
|
|
import org.springblade.desk.dashboard.mapper.BsProcessSetMapper; |
|
|
|
import org.springblade.desk.dashboard.mapper.BsProcessSetMapper; |
|
|
|
import org.springblade.desk.dashboard.pojo.entity.BsProcessSetEntity; |
|
|
|
import org.springblade.desk.dashboard.pojo.entity.BsProcessSetEntity; |
|
|
|
import org.springblade.desk.oem.pojo.request.*; |
|
|
|
import org.springblade.desk.oem.pojo.request.*; |
|
|
|
@ -43,6 +45,7 @@ import org.springblade.desk.produce.service.IPlateAroundService; |
|
|
|
import org.springblade.desk.produce.service.IWorkOrderRunService; |
|
|
|
import org.springblade.desk.produce.service.IWorkOrderRunService; |
|
|
|
import org.springblade.desk.produce.service.IWorkOrderService; |
|
|
|
import org.springblade.desk.produce.service.IWorkOrderService; |
|
|
|
import org.springblade.erpdata.feign.IErpDataOemClient; |
|
|
|
import org.springblade.erpdata.feign.IErpDataOemClient; |
|
|
|
|
|
|
|
import org.springblade.erpdata.feign.IErpMesRbWoClient; |
|
|
|
import org.springblade.system.cache.DictCache; |
|
|
|
import org.springblade.system.cache.DictCache; |
|
|
|
import org.springblade.system.cache.UserCache; |
|
|
|
import org.springblade.system.cache.UserCache; |
|
|
|
import org.springblade.system.pojo.entity.User; |
|
|
|
import org.springblade.system.pojo.entity.User; |
|
|
|
@ -102,6 +105,8 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper, |
|
|
|
|
|
|
|
|
|
|
|
private final IErpDataOemClient erpDataOemClient; |
|
|
|
private final IErpDataOemClient erpDataOemClient; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final IErpMesRbWoClient erpMesRbWoClient; |
|
|
|
|
|
|
|
|
|
|
|
@Resource |
|
|
|
@Resource |
|
|
|
@Lazy |
|
|
|
@Lazy |
|
|
|
private void setPostHandleService(IPlateAroundService plateAroundService) { |
|
|
|
private void setPostHandleService(IPlateAroundService plateAroundService) { |
|
|
|
@ -167,8 +172,9 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper, |
|
|
|
workOrderRun.getCreateTime(), new Date(), oemTakeBack.getDeliverKey(), |
|
|
|
workOrderRun.getCreateTime(), new Date(), oemTakeBack.getDeliverKey(), |
|
|
|
scrapQty, testQty); |
|
|
|
scrapQty, testQty); |
|
|
|
|
|
|
|
|
|
|
|
// 调用转厂内自动分派逻辑
|
|
|
|
// 调用转厂内自动分派逻辑,只查询外协工序之后的工序
|
|
|
|
List<YieldOrderCraft> yieldOrderCrafts = yieldOrderCraftService.listByYoId(yieldOrder.getId()); |
|
|
|
List<YieldOrderCraft> yieldOrderCrafts = yieldOrderCraftService.listByYoIdAndNo(yieldOrder.getId(), deliverablePlan.getOrders()); |
|
|
|
|
|
|
|
// List<YieldOrderCraft> yieldOrderCrafts = yieldOrderCraftService.listByYoId(yieldOrder.getId(), deliverablePlan.getOrders());
|
|
|
|
try { |
|
|
|
try { |
|
|
|
yieldOrderCraftService.automaticDispatch(yieldOrderCrafts, yieldOrder, Boolean.TRUE, null); |
|
|
|
yieldOrderCraftService.automaticDispatch(yieldOrderCrafts, yieldOrder, Boolean.TRUE, null); |
|
|
|
} catch (Exception e) { |
|
|
|
} catch (Exception e) { |
|
|
|
@ -403,52 +409,6 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper, |
|
|
|
//更新车间订单主责任单位
|
|
|
|
//更新车间订单主责任单位
|
|
|
|
workOrderService.updateHostWorkUnit(wo); |
|
|
|
workOrderService.updateHostWorkUnit(wo); |
|
|
|
workPlanMapper.updateById(wpList); |
|
|
|
workPlanMapper.updateById(wpList); |
|
|
|
|
|
|
|
|
|
|
|
// 调用外协接收
|
|
|
|
|
|
|
|
String wxWoCode = null; |
|
|
|
|
|
|
|
Oem oem = oemMapper.selectById(workOrderRun.getInCustomer()); |
|
|
|
|
|
|
|
User planner = UserCache.getUser(wo.getPlanner()); |
|
|
|
|
|
|
|
if (workOrderRun.getCollaborate() != null && workOrderRun.getCollaborate().equalsIgnoreCase("1")) { |
|
|
|
|
|
|
|
List<BsProcessSetEntity> processSets = processSetMapper.selectByIds(wpList.stream().filter(workPlan -> oem.getId().equals(workPlan.getOcId())).map(WorkPlan::getPpsId).collect(Collectors.toList())); |
|
|
|
|
|
|
|
String ppsName = processSets.stream().map(BsProcessSetEntity::getName).collect(Collectors.joining(",")); |
|
|
|
|
|
|
|
// 获取wpList最大的计划结束时间
|
|
|
|
|
|
|
|
LocalDateTime maxPlanEndTime = wpList.stream().map(WorkPlan::getPlanEndTime).max(LocalDateTime::compareTo).orElse(null); |
|
|
|
|
|
|
|
if (maxPlanEndTime == null) { |
|
|
|
|
|
|
|
maxPlanEndTime = LocalDateTime.now(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
wxWoCode = erpDataOemClient.fullOrderOutsourcing(yo.getPartCode(), yo.getProductIdent(), wo.getBatchNo(), oem != null ? oem.getCode() : "", ppsName, yo.getYoCode(), |
|
|
|
|
|
|
|
planner != null ? planner.getName() : "", maxPlanEndTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")), wo.getMakeQty(), "").getData(); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
User user = UserCache.getUser(workOrderRun.getCreateUser()); |
|
|
|
|
|
|
|
User dispatcher = UserCache.getUser(wo.getDispatcher()); |
|
|
|
|
|
|
|
String roamNo = null; |
|
|
|
|
|
|
|
String craftNo = null; |
|
|
|
|
|
|
|
Long craftId = yo.getCraftId(); |
|
|
|
|
|
|
|
// 返工单号
|
|
|
|
|
|
|
|
if (craftId != null && wo.getReworkCode() == null) { |
|
|
|
|
|
|
|
Map<String, String> craftInfo = baseMapper.selectRoamAndCraftNoByCraftId(craftId); |
|
|
|
|
|
|
|
roamNo = craftInfo.get("ROAMNO"); |
|
|
|
|
|
|
|
craftNo = craftInfo.get("CRAFTNO"); |
|
|
|
|
|
|
|
if (roamNo == null) { |
|
|
|
|
|
|
|
craftInfo = baseMapper.selectRoamAndCraftNoByPartCode(yo.getPartCode()); |
|
|
|
|
|
|
|
roamNo = craftInfo.get("ROAMNO"); |
|
|
|
|
|
|
|
craftNo = craftInfo.get("CRAFTNO"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} else if (StringUtils.isNotBlank(wo.getReworkCode())) { |
|
|
|
|
|
|
|
roamNo = wo.getReworkCode(); |
|
|
|
|
|
|
|
craftNo = "返修"; |
|
|
|
|
|
|
|
craftId = Long.valueOf(wo.getReworkNo()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
String format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault()).format(yo.getDemandDate().toInstant()); |
|
|
|
|
|
|
|
wxWoCode = erpDataOemClient.collaborativeOutsourcing(yo.getPartCode(), yo.getProductIdent(), format, wo.getMakeQty(), yo.getUseDeptCode(), yo.getUseDept(), |
|
|
|
|
|
|
|
wo.getBatchNo(), oem != null ? oem.getCode() : "", yo.getPlate(), yo.getYpCode(), yo.getYoCode(), user != null ? user.getName() : "", |
|
|
|
|
|
|
|
planner != null ? planner.getName() : "", dispatcher != null ? dispatcher.getName() : "", roamNo, craftNo, craftId).getData(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// 赋值wx号,erp返回
|
|
|
|
|
|
|
|
workOrderRun.setWoCode(wxWoCode); |
|
|
|
|
|
|
|
if (StringUtils.isNotBlank(wxWoCode)) { |
|
|
|
|
|
|
|
updateWorkPlanAndOrderStatus(wo, wxWoCode); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} else { |
|
|
|
} else { |
|
|
|
//转厂内业务
|
|
|
|
//转厂内业务
|
|
|
|
WorkPlan nextWorkPlan; |
|
|
|
WorkPlan nextWorkPlan; |
|
|
|
@ -619,8 +579,7 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper, |
|
|
|
if (workPlan.getStatus() == 3) { |
|
|
|
if (workPlan.getStatus() == 3) { |
|
|
|
// 更新下一道工序
|
|
|
|
// 更新下一道工序
|
|
|
|
if (workPlan.getNextWpId() != null) { |
|
|
|
if (workPlan.getNextWpId() != null) { |
|
|
|
WorkPlan nextPlan = new WorkPlan(); |
|
|
|
WorkPlan nextPlan = workPlanMapper.selectById(workPlan.getNextWpId()); |
|
|
|
nextPlan.setId(workPlan.getNextWpId()); |
|
|
|
|
|
|
|
nextPlan.setFactStartTime(date); |
|
|
|
nextPlan.setFactStartTime(date); |
|
|
|
nextPlan.setStatus(WorkPlan.STATUS_START); |
|
|
|
nextPlan.setStatus(WorkPlan.STATUS_START); |
|
|
|
nextPlan.setWxNo(wxCode); |
|
|
|
nextPlan.setWxNo(wxCode); |
|
|
|
@ -628,23 +587,19 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper, |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 更新当前工序为完成
|
|
|
|
// 更新当前工序为完成
|
|
|
|
WorkPlan currentPlan = new WorkPlan(); |
|
|
|
workPlan.setFactEndTime(date); |
|
|
|
currentPlan.setId(workPlan.getId()); |
|
|
|
workPlan.setStatus(WorkPlan.STATUS_COMPLETE); |
|
|
|
currentPlan.setFactEndTime(date); |
|
|
|
workPlan.setWxNo(wxCode); |
|
|
|
currentPlan.setStatus(WorkPlan.STATUS_COMPLETE); |
|
|
|
workPlanMapper.updateById(workPlan); |
|
|
|
currentPlan.setWxNo(wxCode); |
|
|
|
|
|
|
|
workPlanMapper.updateById(currentPlan); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 更新订单当前工序
|
|
|
|
// 更新订单当前工序
|
|
|
|
workOrder.setWpId(workPlan.getNextWpId()); |
|
|
|
workOrder.setWpId(workPlan.getNextWpId()); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
// 更新当前工序为进行中
|
|
|
|
// 更新当前工序为进行中
|
|
|
|
WorkPlan currentPlan = new WorkPlan(); |
|
|
|
workPlan.setFactStartTime(date); |
|
|
|
currentPlan.setId(workPlan.getId()); |
|
|
|
workPlan.setStatus(WorkPlan.STATUS_START); |
|
|
|
currentPlan.setFactStartTime(date); |
|
|
|
workPlan.setWxNo(wxCode); |
|
|
|
currentPlan.setStatus(WorkPlan.STATUS_START); |
|
|
|
workPlanMapper.updateById(workPlan); |
|
|
|
currentPlan.setWxNo(wxCode); |
|
|
|
|
|
|
|
workPlanMapper.updateById(currentPlan); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
workOrder.setOemOut(String.valueOf(1)); |
|
|
|
workOrder.setOemOut(String.valueOf(1)); |
|
|
|
@ -684,7 +639,7 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper, |
|
|
|
} |
|
|
|
} |
|
|
|
// 首道工序 → 生产订单状态设为加工中
|
|
|
|
// 首道工序 → 生产订单状态设为加工中
|
|
|
|
if (wp.getFrontWpId() == null) { |
|
|
|
if (wp.getFrontWpId() == null) { |
|
|
|
yo.setStatus(5); |
|
|
|
yo.setStatus(YieldOrderEnum.STATUS_PROCESSING.getCode()); |
|
|
|
yieldOrderMapper.updateById(yo); |
|
|
|
yieldOrderMapper.updateById(yo); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -737,6 +692,13 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper, |
|
|
|
if (yo.getDemandDate() != null) { |
|
|
|
if (yo.getDemandDate() != null) { |
|
|
|
demandDateStr = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") |
|
|
|
demandDateStr = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") |
|
|
|
.withZone(ZoneId.systemDefault()).format(yo.getDemandDate().toInstant()); |
|
|
|
.withZone(ZoneId.systemDefault()).format(yo.getDemandDate().toInstant()); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
// 需求日期为空时从ERP视图查询,查不到默认当天+10天
|
|
|
|
|
|
|
|
Date demandDate = fetchDemandDateFromErp(yo.getYpCode()); |
|
|
|
|
|
|
|
yo.setDemandDate(demandDate); |
|
|
|
|
|
|
|
yieldOrderMapper.updateById(yo); |
|
|
|
|
|
|
|
demandDateStr = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") |
|
|
|
|
|
|
|
.withZone(ZoneId.systemDefault()).format(demandDate.toInstant()); |
|
|
|
} |
|
|
|
} |
|
|
|
wxWoCode = erpDataOemClient.collaborativeOutsourcing( |
|
|
|
wxWoCode = erpDataOemClient.collaborativeOutsourcing( |
|
|
|
yo.getPartCode(), yo.getProductIdent(), demandDateStr, wo.getMakeQty(), |
|
|
|
yo.getPartCode(), yo.getProductIdent(), demandDateStr, wo.getMakeQty(), |
|
|
|
@ -787,6 +749,28 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper, |
|
|
|
return R.success("外协订单下达完成"); |
|
|
|
return R.success("外协订单下达完成"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* 从ERP视图查询需求日期,查不到则返回当前日期+10天 |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param ypCode ERP工作订单号 |
|
|
|
|
|
|
|
* @return 需求日期 |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
private Date fetchDemandDateFromErp(String ypCode) { |
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
R<String> result = erpMesRbWoClient.getDemandDateByWono(ypCode); |
|
|
|
|
|
|
|
if (result.isSuccess() && StringUtils.isNotBlank(result.getData())) { |
|
|
|
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
|
|
|
|
|
|
|
return sdf.parse(result.getData()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
|
|
|
log.warn("从ERP查询需求日期失败,ypCode={},使用默认值"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// 默认当前日期+10天
|
|
|
|
|
|
|
|
Calendar cal = Calendar.getInstance(); |
|
|
|
|
|
|
|
cal.add(Calendar.DAY_OF_MONTH, 10); |
|
|
|
|
|
|
|
return cal.getTime(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Transactional(rollbackFor = Exception.class) |
|
|
|
@Transactional(rollbackFor = Exception.class) |
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public R changeOemManufacturer(Long worId, Long ocId) { |
|
|
|
public R changeOemManufacturer(Long worId, Long ocId) { |
|
|
|
@ -924,7 +908,7 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper, |
|
|
|
throw new ServiceException("车间订单已交接,无法再次收回"); |
|
|
|
throw new ServiceException("车间订单已交接,无法再次收回"); |
|
|
|
} |
|
|
|
} |
|
|
|
workOrder.setWpId(deliverablePlan.getId()); |
|
|
|
workOrder.setWpId(deliverablePlan.getId()); |
|
|
|
workOrder.setRunStatus(3); // 加工中
|
|
|
|
workOrder.setRunStatus(WorkOrder.RUN_STATUS_RECEIVE); // 加工中
|
|
|
|
workOrder.setMakeQty(workOrder.getMakeQty() - scrapQty - testQty); |
|
|
|
workOrder.setMakeQty(workOrder.getMakeQty() - scrapQty - testQty); |
|
|
|
workOrder.setScrapQty(workOrder.getScrapQty() + scrapQty); |
|
|
|
workOrder.setScrapQty(workOrder.getScrapQty() + scrapQty); |
|
|
|
workOrder.setTestQty(workOrder.getTestQty() + testQty); |
|
|
|
workOrder.setTestQty(workOrder.getTestQty() + testQty); |
|
|
|
@ -944,15 +928,11 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper, |
|
|
|
WorkOrderRun workOrderRun, WorkOrder workOrder, |
|
|
|
WorkOrderRun workOrderRun, WorkOrder workOrder, |
|
|
|
Date startTime, Date endTime) { |
|
|
|
Date startTime, Date endTime) { |
|
|
|
// 将本次外协的全部工序报工完成
|
|
|
|
// 将本次外协的全部工序报工完成
|
|
|
|
List<WorkPlanRun> wprList = workPlanRunMapper.selectList( |
|
|
|
List<WorkPlan> oemPlans = workPlanMapper.selectList(Wrappers.lambdaQuery(WorkPlan.class).eq(WorkPlan::getOem, "1") |
|
|
|
new LambdaQueryWrapper<WorkPlanRun>() |
|
|
|
.eq(WorkPlan::getWoId, deliverablePlan.getWoId()).lt(WorkPlan::getStatus, WorkPlan.STATUS_WORK_OK) |
|
|
|
.eq(WorkPlanRun::getWorId, workOrderRun.getId())); |
|
|
|
.lt(WorkPlan::getOrders, deliverablePlan.getOrders())); |
|
|
|
if (!wprList.isEmpty()) { |
|
|
|
|
|
|
|
List<Long> wpIds = wprList.stream().map(WorkPlanRun::getWpId).collect(Collectors.toList()); |
|
|
|
|
|
|
|
List<WorkPlan> oemPlans = workPlanMapper.selectList( |
|
|
|
|
|
|
|
new LambdaQueryWrapper<WorkPlan>().in(WorkPlan::getId, wpIds)); |
|
|
|
|
|
|
|
for (WorkPlan wp : oemPlans) { |
|
|
|
for (WorkPlan wp : oemPlans) { |
|
|
|
wp.setStatus(WorkPlan.STATUS_WORK_OK); |
|
|
|
wp.setStatus(WorkPlan.STATUS_COMPLETE); |
|
|
|
wp.setFactStartTime(startTime); |
|
|
|
wp.setFactStartTime(startTime); |
|
|
|
wp.setFactEndTime(endTime); |
|
|
|
wp.setFactEndTime(endTime); |
|
|
|
wp.setWorkQty(workOrder.getMakeQty()); |
|
|
|
wp.setWorkQty(workOrder.getMakeQty()); |
|
|
|
@ -960,7 +940,6 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper, |
|
|
|
} |
|
|
|
} |
|
|
|
workPlanMapper.updateById(oemPlans); |
|
|
|
workPlanMapper.updateById(oemPlans); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* 更新运行记录状态 |
|
|
|
* 更新运行记录状态 |
|
|
|
|