liweidong
liweidong-hj 4 days ago
commit 71d0e4d36e
  1. 35
      blade-ops/blade-job/src/main/java/org/springblade/job/processor/oem/OemOrderOutProcessor.java
  2. 26
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/feign/IWorkOrderRunOutClient.java
  3. 3
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/WorkOrderRun.java
  4. 11
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpMesRbWoClient.java
  5. 5
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpMesRbWoClientFallback.java
  6. 72
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/IYieldOrderCraftService.java
  7. 1433
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderCraftServiceImpl.java
  8. 27
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/feign/WorkOrderRunOutClient.java
  9. 6
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/PdaLoadServiceImpl.java
  10. 143
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkOrderRunServiceImpl.java
  11. 4
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkOrderServiceImpl.java
  12. 5
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/feign/ErpMesRbWoClient.java
  13. 8
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpMesRbWoMapper.java
  14. 4
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpMesRbWoMapper.xml
  15. 8
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/IErpMesRbWoService.java
  16. 2
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/impl/ErpDataWmsServiceImpl.java
  17. 5
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/impl/ErpMesRbWoServiceImpl.java
  18. 22
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java
  19. 2
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGlassCakeOutMapper.java
  20. 2
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGlassCakeOutMapper.xml
  21. 1
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGraphiteMoldOutMapper.xml
  22. 216
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGraphiteMoldOutServiceImpl.java

@ -0,0 +1,35 @@
package org.springblade.job.processor.oem;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springblade.desk.produce.feign.IWorkOrderRunOutClient;
import org.springframework.stereotype.Component;
import tech.powerjob.worker.core.processor.ProcessResult;
import tech.powerjob.worker.core.processor.TaskContext;
import tech.powerjob.worker.core.processor.sdk.BasicProcessor;
/**
* 外协订单下达ERP定时任务
*
* @author zangzhipeng
*/
@Component
@Slf4j
public class OemOrderOutProcessor implements BasicProcessor {
@Resource
private IWorkOrderRunOutClient workOrderRunOutClient;
@Override
public ProcessResult process(TaskContext context) throws Exception {
log.info("外协订单下达ERP定时任务开始");
try {
workOrderRunOutClient.oemOrderOut();
log.info("外协订单下达ERP定时任务执行完毕");
return new ProcessResult(true);
} catch (Exception e) {
log.error("外协订单下达ERP定时任务执行失败", e);
return new ProcessResult(false, e.getMessage());
}
}
}

@ -0,0 +1,26 @@
package org.springblade.desk.produce.feign;
import org.springblade.core.launch.constant.AppConstant;
import org.springblade.core.tool.api.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
/**
* 外协订单下达ERP定时任务 Feign接口
*
* @author zangzhipeng
*/
@FeignClient(
value = AppConstant.APPLICATION_DESK_NAME
)
public interface IWorkOrderRunOutClient {
String API_PREFIX = "/feign/client/workOrderRunOut";
String OEM_ORDER_OUT = API_PREFIX + "/oemOrderOut";
/**
* 外协订单下达ERP定时任务调用
*/
@GetMapping(OEM_ORDER_OUT)
R oemOrderOut();
}

@ -26,7 +26,7 @@ public class WorkOrderRun extends BaseEntity {
private static final long serialVersionUID = 1L;
public WorkOrderRun(Long woId, String woCode, Short runType, Long outTeam, Long inTeam, Long outCustomer,
Long inCustomer, String memo, Long approvalMan, String systemData, String collaborate) {
Long inCustomer, String memo, Long approvalMan, String systemData, String collaborate, Short oemStatus) {
this.woId = woId;
this.woCode = woCode;
this.runType = runType;
@ -39,6 +39,7 @@ public class WorkOrderRun extends BaseEntity {
this.systemData = systemData;
this.collaborate = collaborate;
this.runStatus = RUN_STATUS_ISSUED;
this.oemStatus = oemStatus;
}
public WorkOrderRun() {

@ -8,6 +8,7 @@ import org.springblade.erpdata.pojo.dto.view.MesRbWo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
@ -35,6 +36,7 @@ public interface IErpMesRbWoClient {
String SYN_OUTSOURCING = API_PREFIX + "/synOutsourcing";
String SYN_CRAFT = API_PREFIX + "/synCraft";
String SYN_SUPPORTING_FACILITIES = API_PREFIX + "/synSupportingFacilities";
String GET_DEMAND_DATE = API_PREFIX + "/getDemandDateByWono";
/**
* 查询烧结配套信息
@ -73,4 +75,13 @@ public interface IErpMesRbWoClient {
R<Void> synCraft();
@GetMapping(SYN_SUPPORTING_FACILITIES)
R<Void> synSupportingFacilities();
/**
* 根据工作订单号查询ERP需求日期
*
* @param wono 工作订单号
* @return 需求日期字符串
*/
@GetMapping(GET_DEMAND_DATE)
R<String> getDemandDateByWono(@RequestParam(required = true) String wono);
}

@ -75,4 +75,9 @@ public class IErpMesRbWoClientFallback implements IErpMesRbWoClient {
public R<Void> synSupportingFacilities() {
return R.fail("获取数据失败");
}
@Override
public R<String> getDemandDateByWono(String wono) {
return R.fail("获取数据失败");
}
}

@ -15,39 +15,41 @@ import java.util.List;
*/
public interface IYieldOrderCraftService extends BaseService<YieldOrderCraft> {
/**
* 自定义分页
*
* @param page
* @param entity
* @return
*/
IPage<YieldOrderCraft> selectPage(IPage<YieldOrderCraft> page, YieldOrderCraft entity);
/**
* 根据生产订单ID查询工艺列表
*
* @param yoId
* @return
*/
List<YieldOrderCraft> listByYoId(Long yoId);
/**
* 根据生产订单ID删除工艺列表
*
* @param yoId
* @return
*/
int deleteByYoId(Long yoId);
/**
* 查找订单各工序的加工单位
*
* @param yieldOrderCraftList 订单工艺列表
* @param yieldOrder 生产订单
* @param factor null 整体 true : 转厂内 false转厂外
* @param rxlSpace 需要特殊分派true:需要 false不需要null不需要
* @throws BusinessException
*/
void automaticDispatch(List<YieldOrderCraft> yieldOrderCraftList, YieldOrder yieldOrder, Boolean factor, Boolean rxlSpace) throws Exception;
/**
* 自定义分页
*
* @param page
* @param entity
* @return
*/
IPage<YieldOrderCraft> selectPage(IPage<YieldOrderCraft> page, YieldOrderCraft entity);
/**
* 根据生产订单ID查询工艺列表
*
* @param yoId
* @return
*/
List<YieldOrderCraft> listByYoId(Long yoId);
/**
* 根据生产订单ID删除工艺列表
*
* @param yoId
* @return
*/
int deleteByYoId(Long yoId);
/**
* 查找订单各工序的加工单位
*
* @param yieldOrderCraftList 订单工艺列表
* @param yieldOrder 生产订单
* @param factor null 整体 true : 转厂内 false转厂外
* @param rxlSpace 需要特殊分派true:需要 false不需要null不需要
* @throws BusinessException
*/
void automaticDispatch(List<YieldOrderCraft> yieldOrderCraftList, YieldOrder yieldOrder, Boolean factor, Boolean rxlSpace) throws Exception;
List<YieldOrderCraft> listByYoIdAndNo(Long id, String orders);
}

@ -0,0 +1,27 @@
package org.springblade.desk.produce.feign;
import io.swagger.v3.oas.annotations.Hidden;
import lombok.RequiredArgsConstructor;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springblade.desk.produce.service.IWorkOrderRunService;
import org.springframework.web.bind.annotation.RestController;
/**
* 外协订单下达ERP Feign实现
*
* @author zangzhipeng
*/
@NonDS
@Hidden
@RestController
@RequiredArgsConstructor
public class WorkOrderRunOutClient implements IWorkOrderRunOutClient {
private final IWorkOrderRunService workOrderRunService;
@Override
public R oemOrderOut() {
return workOrderRunService.oemOrderOut();
}
}

@ -441,10 +441,8 @@ public class PdaLoadServiceImpl extends BaseServiceImpl<WorkPlanMapper, WorkPlan
}
}
}
// 不合格生成生产处置单
if (InspectionTask.CHECK_RESULT_NO.equals(inspectionTask.getCheckResult())) {
inspectionTaskService.addRsSheet(inspectionTask.getId());
}
// 刷新状态和数量
inspectionTaskService.refreshStatusAndQty(inspectionTask.getId());
// 保存镀后检验数据
// if (save) {
// WorkPlanItemVO workPlanItemVO = saveProCheckDTO.getWorkPlanItemVO();

@ -3,6 +3,7 @@ package org.springblade.desk.produce.service.impl;
import com.alibaba.excel.util.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
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.OemCraftAbilityEntity;
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.pojo.entity.BsProcessSetEntity;
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.IWorkOrderService;
import org.springblade.erpdata.feign.IErpDataOemClient;
import org.springblade.erpdata.feign.IErpMesRbWoClient;
import org.springblade.system.cache.DictCache;
import org.springblade.system.cache.UserCache;
import org.springblade.system.pojo.entity.User;
@ -102,6 +105,8 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper,
private final IErpDataOemClient erpDataOemClient;
private final IErpMesRbWoClient erpMesRbWoClient;
@Resource
@Lazy
private void setPostHandleService(IPlateAroundService plateAroundService) {
@ -167,8 +172,9 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper,
workOrderRun.getCreateTime(), new Date(), oemTakeBack.getDeliverKey(),
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 {
yieldOrderCraftService.automaticDispatch(yieldOrderCrafts, yieldOrder, Boolean.TRUE, null);
} catch (Exception e) {
@ -336,7 +342,7 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper,
if (!wpList.isEmpty()) {
//判断工序是否存在外协商,如果存在不进行二次分派
WorkPlan workPlan = workPlanMapper.selectById(wprList.get(0).getWpId());
if (workPlan.getOcId() == null || workPlan.getOcId() < 1 ) {
if (workPlan.getOcId() == null || workPlan.getOcId() < 1) {
//自动分派
yieldOrderCraftService.automaticDispatch(yieldOrderCrafts, yo, Boolean.FALSE, null);
}
@ -388,7 +394,7 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper,
workOrderService.maintainOrder(wo, oa.getPlanner(), oa.getDispatcher(), workOrderRun, true);
}
Date date = DateUtil.plusDays(wo.getSendDownTime(), days);
wo.setPlanEndDate(DateUtil.format(date,DateUtil.PATTERN_DATETIME));
wo.setPlanEndDate(DateUtil.format(date, DateUtil.PATTERN_DATETIME));
//如果当前工序已经报工完成,运行记录的转出供应商取下道工序的加工外协商,反之取当前
if (wp.getStatus().equals(WorkPlan.STATUS_WORK_OK)) {
@ -403,52 +409,6 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper,
//更新车间订单主责任单位
workOrderService.updateHostWorkUnit(wo);
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 {
//转厂内业务
WorkPlan nextWorkPlan;
@ -549,7 +509,7 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper,
//加工周期(热表)+
int days = ProcessCycleEnum.BC_TYPE_CYCLE_HEAT.getValue();
Date date = DateUtil.plusDays(wo.getSendDownTime(), days);
wo.setPlanEndDate(DateUtil.format(date,DateUtil.PATTERN_DATETIME));
wo.setPlanEndDate(DateUtil.format(date, DateUtil.PATTERN_DATETIME));
// 转厂内审批通过,清除是否外协和外协商
wo.setOem("0");
wo.setOcId(null);
@ -619,8 +579,7 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper,
if (workPlan.getStatus() == 3) {
// 更新下一道工序
if (workPlan.getNextWpId() != null) {
WorkPlan nextPlan = new WorkPlan();
nextPlan.setId(workPlan.getNextWpId());
WorkPlan nextPlan = workPlanMapper.selectById(workPlan.getNextWpId());
nextPlan.setFactStartTime(date);
nextPlan.setStatus(WorkPlan.STATUS_START);
nextPlan.setWxNo(wxCode);
@ -628,23 +587,19 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper,
}
// 更新当前工序为完成
WorkPlan currentPlan = new WorkPlan();
currentPlan.setId(workPlan.getId());
currentPlan.setFactEndTime(date);
currentPlan.setStatus(WorkPlan.STATUS_COMPLETE);
currentPlan.setWxNo(wxCode);
workPlanMapper.updateById(currentPlan);
workPlan.setFactEndTime(date);
workPlan.setStatus(WorkPlan.STATUS_COMPLETE);
workPlan.setWxNo(wxCode);
workPlanMapper.updateById(workPlan);
// 更新订单当前工序
workOrder.setWpId(workPlan.getNextWpId());
} else {
// 更新当前工序为进行中
WorkPlan currentPlan = new WorkPlan();
currentPlan.setId(workPlan.getId());
currentPlan.setFactStartTime(date);
currentPlan.setStatus(WorkPlan.STATUS_START);
currentPlan.setWxNo(wxCode);
workPlanMapper.updateById(currentPlan);
workPlan.setFactStartTime(date);
workPlan.setStatus(WorkPlan.STATUS_START);
workPlan.setWxNo(wxCode);
workPlanMapper.updateById(workPlan);
}
workOrder.setOemOut(String.valueOf(1));
@ -684,7 +639,7 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper,
}
// 首道工序 → 生产订单状态设为加工中
if (wp.getFrontWpId() == null) {
yo.setStatus(5);
yo.setStatus(YieldOrderEnum.STATUS_PROCESSING.getCode());
yieldOrderMapper.updateById(yo);
}
@ -737,6 +692,13 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper,
if (yo.getDemandDate() != null) {
demandDateStr = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
.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(
yo.getPartCode(), yo.getProductIdent(), demandDateStr, wo.getMakeQty(),
@ -787,6 +749,28 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper,
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)
@Override
public R changeOemManufacturer(Long worId, Long ocId) {
@ -924,7 +908,7 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper,
throw new ServiceException("车间订单已交接,无法再次收回");
}
workOrder.setWpId(deliverablePlan.getId());
workOrder.setRunStatus(3); // 加工中
workOrder.setRunStatus(WorkOrder.RUN_STATUS_RECEIVE); // 加工中
workOrder.setMakeQty(workOrder.getMakeQty() - scrapQty - testQty);
workOrder.setScrapQty(workOrder.getScrapQty() + scrapQty);
workOrder.setTestQty(workOrder.getTestQty() + testQty);
@ -944,22 +928,17 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper,
WorkOrderRun workOrderRun, WorkOrder workOrder,
Date startTime, Date endTime) {
// 将本次外协的全部工序报工完成
List<WorkPlanRun> wprList = workPlanRunMapper.selectList(
new LambdaQueryWrapper<WorkPlanRun>()
.eq(WorkPlanRun::getWorId, workOrderRun.getId()));
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) {
wp.setStatus(WorkPlan.STATUS_WORK_OK);
wp.setFactStartTime(startTime);
wp.setFactEndTime(endTime);
wp.setWorkQty(workOrder.getMakeQty());
wp.setQualifiedQty(workOrder.getMakeQty());
}
workPlanMapper.updateById(oemPlans);
List<WorkPlan> oemPlans = workPlanMapper.selectList(Wrappers.lambdaQuery(WorkPlan.class).eq(WorkPlan::getOem, "1")
.eq(WorkPlan::getWoId, deliverablePlan.getWoId()).lt(WorkPlan::getStatus, WorkPlan.STATUS_WORK_OK)
.lt(WorkPlan::getOrders, deliverablePlan.getOrders()));
for (WorkPlan wp : oemPlans) {
wp.setStatus(WorkPlan.STATUS_COMPLETE);
wp.setFactStartTime(startTime);
wp.setFactEndTime(endTime);
wp.setWorkQty(workOrder.getMakeQty());
wp.setQualifiedQty(workOrder.getMakeQty());
}
workPlanMapper.updateById(oemPlans);
}
/**

@ -2936,7 +2936,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
//产生外协生产进度记录信息
WorkOrderRun wr = new WorkOrderRun(workOrder.getId(), workOrder.getWoCode(), WorkOrderRun.RUN_TYPE_1,
null, null, null, prWorkPlan.getOcId(), "分派默认(厂外)",
null, "1", workOrder.getCollaborate());
null, "1", "0", WorkOrderRun.OEM_STATUS_IN);
workOrderRunService.save(wr);
//更改订单调度员和计划员
OemCraftAbilityEntity oa = oemCraftAbilityService.findBsOemAbility(prWorkPlan.getOcId(), prWorkPlan.getCaId());
@ -2949,7 +2949,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
//产生车间运行记录信息
WorkOrderRun wr = new WorkOrderRun(workOrder.getId(), workOrder.getWoCode(), WorkOrderRun.RUN_TYPE_2,
null, prWorkPlan.getMakeTeam(), null, null, "分派默认(厂内)",
null, "1", workOrder.getCollaborate());
null, "1", "0", null);
workOrderRunService.save(wr);
//更改订单调度员和计划员

@ -107,4 +107,9 @@ public class ErpMesRbWoClient implements IErpMesRbWoClient {
log.info("同步配套订单定时任务结束");
return R.success();
}
@Override
public R<String> getDemandDateByWono(String wono) {
return R.data(erpMesRbWoService.getDemandDateByWono(wono));
}
}

@ -20,4 +20,12 @@ public interface ErpMesRbWoMapper extends Mapper {
List<MesRbWo> getYieldPlanErpList(String newlevdateMax);
String getNewlevdateMax(String selectTime);
/**
* 根据工作订单号查询需求日期
*
* @param wono 工作订单号
* @return 需求日期字符串
*/
String getDemandDateByWono(String wono);
}

@ -43,4 +43,8 @@
a.wopordat >= TO_DATE(#{selectTime}, 'YYYY-MM-DD HH24:MI:SS')
</where>
</select>
<select id="getDemandDateByWono" resultType="java.lang.String">
SELECT MAX(a.woreqdat) FROM dba_mgr.v_mes_rb_wo a WHERE a.wono = #{wono}
</select>
</mapper>

@ -56,4 +56,12 @@ public interface IErpMesRbWoService {
* 同步配套数据
*/
void synSupportingFacilities();
/**
* 根据工作订单号查询ERP需求日期
*
* @param wono 工作订单号
* @return 需求日期字符串查不到返回null
*/
String getDemandDateByWono(String wono);
}

@ -325,7 +325,7 @@ public class ErpDataWmsServiceImpl implements IErpDataWmsService {
Map<String, Object> inParams = new HashMap<>();
inParams.put("v_prtno", goodsCode == null ? "" : goodsCode);
inParams.put("v_prtdesc", goodsName == null ? "" : goodsName);
inParams.put("v_desno", null);
inParams.put("v_desno", "");
// 执行存储过程
Map<String, Object> resultMap = jdbcCall.execute(inParams);

@ -817,6 +817,11 @@ public class ErpMesRbWoServiceImpl implements IErpMesRbWoService {
// apsOrderClient.saveOrderList(yieldOrderList);
}
@Override
public String getDemandDateByWono(String wono) {
return mesRbWoMapper.getDemandDateByWono(wono);
}
private YieldOrder updateYieldType(YieldOrder yieldOrder,String pritno,String firseq){
//从零件表中查询零件信息
DsPartEntity part=apsOrderClient.getDsCraftListByCode(pritno);

@ -2174,27 +2174,27 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
int x = partCz.size();
int y = partBlb.size();
if (sumOfQuota <= 5) {
result = (5.5 * sumOfQuota + 20) / 60 + 0.8;
result = (6.2 * sumOfQuota + 20) / 60 + 0.8;
}
if (sumOfQuota <= 20 && sumOfQuota > 5) {
result = (5.8 * sumOfQuota + 20) / 60 + 0.8;
result = (6.2 * sumOfQuota + 20) / 60 + 0.8;
if (y > 2) {
result = 1.5 * result;
}
if (hb) {
result = result + 0.5 * sumOfQuota / 60 + 0.2;
result = result + 1 * sumOfQuota / 60 + 0.2;
}
if (x > 3) {
result = 1.2 * result + 3;
}
}
if (sumOfQuota <= 30 && sumOfQuota > 20) {
result = (6 * sumOfQuota + 20) / 60 + 0.8;
result = (6.5 * sumOfQuota + 20) / 60 + 0.8;
if (y > 2) {
result = 1.6 * result;
}
if (hb) {
result = result + (1 * sumOfQuota) / 60 + 0.2;
result = result + (1.3 * sumOfQuota) / 60 + 0.2;
}
if (x > 3) {
result = 1.5 * result + 5;
@ -2206,7 +2206,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
result = 1.8 * result;
}
if (hb) {
result = result + (2 * sumOfQuota) / 60 + 0.3;
result = result + (2 * sumOfQuota) / 60 + 1;
}
if (x > 3) {
result = 1.8 * result + 6;
@ -2215,10 +2215,10 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
if (sumOfQuota <= 80 && sumOfQuota > 50) {
result = (6.4 * sumOfQuota + 25) / 60 + 1.5;
if (y > 2) {
result = 2 * result;
result = 2.1 * result;
}
if (hb) {
result = result + (3 * sumOfQuota) / 60 + 0.5;
result = result + (3 * sumOfQuota) / 60 + 1.5;
}
if (x > 3) {
result = 2.2 * result + 9;
@ -2227,10 +2227,10 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
if (sumOfQuota <= 100 && sumOfQuota > 80) {
result = (6.5 * sumOfQuota + 25) / 60 + 1.8;
if (y > 2) {
result = 2 * result;
result = 2.1 * result;
}
if (hb) {
result = result + (3.5 * sumOfQuota) / 60 + 0.7;
result = result + (3.5 * sumOfQuota) / 60 + 2;
}
if (x > 3) {
result = 2.5 * result + 12;
@ -2242,7 +2242,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
result = 2 * result;
}
if (hb) {
result = result + (4 * sumOfQuota) / 60 + 1;
result = result + (4 * sumOfQuota) / 60 + 3;
}
if (x > 3) {
result = 2.5 * result + 15;

@ -55,6 +55,6 @@ public interface StGlassCakeOutMapper extends BaseMapper<StGlassCakeOut> {
List<YieldOrder> getYieldOrderList(Long id, String yieldType);
DsPartRelationEntity getPartQuota(String partCode, String goodsCode);
DsPartRelationEntity getPartQuota(String partCode, String subCode);
}

@ -41,7 +41,7 @@
gco.part_name, gco.batch_code, gco.card_no, gco.quantity, gco.require_qty,
gco.stove_pi_no, gco.out_qty, gco.cur_status, gco.est_use_time, gco.out_time,
gco.out_users, gco.out_code,
gco.memo, gco.picker,
gco.memo, gco.picker, gco.pre_out_qty,
-- 物料表字段(根据实际ST_GOODS字段调整,无则删对应行)
g.goods_code,
g.id AS goodsId,

@ -35,6 +35,7 @@
gmo.sir_id, gmo.yo_code, gmo.pi_no,
gmo.card_no, gmo.need_quantity, gmo.outed_quantity,
gmo.cur_status, gmo.out_time, gmo.out_user, gmo.out_code, gmo.picker,
gmo.parent_out_code, gmo.complete_quantity,
-- 物料表字段
g.goods_code,
g.id AS goodsId,

@ -1,6 +1,5 @@
package org.springblade.wms.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
@ -22,8 +21,6 @@ import org.springblade.wms.mapper.StGraphiteMoldOutMapper;
import org.springblade.wms.mapper.StRealtimeStockMapper;
import org.springblade.wms.mapper.StStockInoutRecordMapper;
import org.springblade.wms.pojo.dto.StGraphiteMoldOutDTO;
import org.springblade.wms.pojo.dto.StockOccupyTempDTO;
import org.springblade.wms.pojo.dto.SubItemStockDTO;
import org.springblade.wms.pojo.entity.*;
import org.springblade.wms.pojo.vo.StGraphiteMoldOutVO;
import org.springblade.wms.service.*;
@ -105,83 +102,36 @@ public class StGraphiteMoldOutServiceImpl extends BaseServiceImpl<StGraphiteMold
}
}
List<SubItemStockDTO> sourceSubStockList = new ArrayList<>();
for (DsPartEntity bom : allChildPartList) {
SubItemStockDTO item = new SubItemStockDTO();
item.setSubGoodsCode(bom.getPartCode());
// 单套子件耗用数量
DsPartRelationEntity dsPartRelation = stGlassCakeOutMapper.getPartQuota(faYieldOrder.getPartCode(), item.getSubGoodsCode());
item.setSingleUseQty(dsPartRelation.getQuota());
int maxCanMakeSet = (int) Math.floor(totalNeedSetInt);
for (DsPartEntity sub : allChildPartList) {
String subCode = sub.getPartCode();
DsPartRelationEntity dsPartRelation = stGlassCakeOutMapper.getPartQuota(faYieldOrder.getPartCode(), subCode);
double singleUse = dsPartRelation.getQuota();
// 查询该子件所有可用库存
List<StRealtimeStock> stockAll = stRealtimeStockMapper.selectMaxUsableStockByMoldAttr(item.getSubGoodsCode());
item.setStockList(stockAll);
// 实时剩余可用总库存(动态变化,逐套消耗)
double usableTotal = 0D;
if (CollUtil.isNotEmpty(stockAll)) {
usableTotal = stockAll.stream()
.mapToDouble(s -> s.getQuantity() - Optional.ofNullable(s.getOccupyQuantity()).orElse(0D))
.sum();
List<StRealtimeStock> stockList = stRealtimeStockMapper.selectMaxUsableStockByMoldAttr(subCode);
if (stockList == null || stockList.isEmpty()) {
maxCanMakeSet = 0;
break;
}
item.setRemainUsable(usableTotal);
sourceSubStockList.add(item);
}
// 存放最终要生成的出库明细、占用、锁库数据
List<StockOccupyTempDTO> needOccupyList = new ArrayList<>();
// 成功齐套的套数
int successSet = 0;
// 2、逐套循环校验,能齐一套算一套
for (; successSet < totalNeedSetInt; ) {
boolean oneSetAllOk = true;
// 本套需要占用的临时数据
List<StockOccupyTempDTO> tempOccupy = new ArrayList<>();
for (SubItemStockDTO sub : sourceSubStockList) {
double needPerSet = sub.getSingleUseQty();
// 当前子件剩余可用不足单套用量 → 本套不齐套,跳出
if (sub.getRemainUsable() < needPerSet - 0.001) {
oneSetAllOk = false;
break;
}
// 从子件库存里扣对应数量,优先耗前面批次库存
double surplusNeed = needPerSet;
List<StRealtimeStock> stockList = sub.getStockList();
for (StRealtimeStock stock : stockList) {
if (surplusNeed <= 0.001) break;
double occ = Optional.ofNullable(stock.getOccupyQuantity()).orElse(0D);
double usable = stock.getQuantity() - occ;
if (usable <= 0) continue;
double takeQty = Math.min(usable, surplusNeed);
// 暂存本次占用信息,齐套成功才真正落库
StockOccupyTempDTO temp = new StockOccupyTempDTO();
temp.setStock(stock);
temp.setTakeQty(takeQty);
temp.setSubGoodsCode(sub.getSubGoodsCode());
tempOccupy.add(temp);
surplusNeed -= takeQty;
}
// 子件总可用扣减本套耗用
sub.setRemainUsable(sub.getRemainUsable() - needPerSet);
}
// 总可用库存
double totalUsable = stockList.stream()
.mapToDouble(s -> s.getQuantity() - Optional.ofNullable(s.getOccupyQuantity()).orElse(0D))
.filter(v -> v > 0)
.sum();
if (oneSetAllOk) {
// 本套齐套,临时占用转正,加入最终列表
needOccupyList.addAll(tempOccupy);
successSet++;
} else {
// 任意子件不齐套,终止整套循环,不再尝试后续套数
break;
}
// 当前子件最多可做套数
int subCanMake = (int) Math.floor(totalUsable / singleUse);
maxCanMakeSet = Math.min(maxCanMakeSet, subCanMake);
}
if (CollUtil.isEmpty(needOccupyList)) {
log.info("父件{}无任何可齐套库存,需求{}套,生成0套预出库", partOne.getPartCode(), totalNeedSet);
// 无可齐套套数,直接返回
if (maxCanMakeSet <= 0) {
log.info("父件【{}】无可用齐套库存,需求{}套,生成0套预出库", faYieldOrder.getPartCode(), totalNeedSetInt);
return Collections.emptyList();
}
log.info("父件【{}】最终可齐套套数:{} 套", faYieldOrder.getPartCode(), maxCanMakeSet);
List<StGraphiteMoldOut> preOutStockList = new ArrayList<>();
@ -195,59 +145,77 @@ public class StGraphiteMoldOutServiceImpl extends BaseServiceImpl<StGraphiteMold
}
int childNum = 1;
// 3、遍历占用明细:更新库存占用、新增锁库、生成预出库单据
for (StockOccupyTempDTO temp : needOccupyList) {
lastNum++;
StRealtimeStock maxStock = temp.getStock();
Double takeQty = temp.getTakeQty();
StGraphiteMoldOut preOutStock = new StGraphiteMoldOut();
preOutStock.setYoCode(faYieldOrder.getYoCode());
preOutStock.setCardNo(dto.getCardNo());
String parentOutCode = datePrefix + StrUtil.padPre(String.valueOf(lastNum), 4, '0');
preOutStock.setParentOutCode(parentOutCode);
String outCode = parentOutCode + "-" + childNum;
preOutStock.setOutCode(outCode);
childNum++;
// 遍历每个子件
for (DsPartEntity subItem : allChildPartList) {
String subCode = subItem.getPartCode();
DsPartRelationEntity dsPartRelation = stGlassCakeOutMapper.getPartQuota(faYieldOrder.getPartCode(), subCode);
double singleUse = dsPartRelation.getQuota();
double totalNeed = singleUse * maxCanMakeSet; // 子件总需求数量
// 查询该子件所有可用库存
List<StRealtimeStock> stockList = stRealtimeStockMapper.selectMaxUsableStockByMoldAttr(subCode);
double remainNeed = totalNeed;
// 遍历库存,一个不够用下一个,自动生成多条出库
for (StRealtimeStock maxStock : stockList) {
if (remainNeed <= 0.001) {
break;
}
double occupyQty = Optional.ofNullable(maxStock.getOccupyQuantity()).orElse(0D);
double usableQty = maxStock.getQuantity() - occupyQty;
if (usableQty <= 0) {
continue;
}
// 本次实际扣减数量
double actualTake = Math.min(usableQty, remainNeed);
StGraphiteMoldOut preOutStock = new StGraphiteMoldOut();
preOutStock.setYoCode(faYieldOrder.getYoCode());
preOutStock.setCardNo(dto.getCardNo());
String parentOutCode = datePrefix + StrUtil.padPre(String.valueOf(lastNum), 4, '0');
preOutStock.setParentOutCode(parentOutCode);
String outCode = parentOutCode + "-" + childNum;
preOutStock.setOutCode(outCode);
childNum++;
// preOutStock.setOutCode(stStockInoutRecordService.generateCode());
SubItemStockDTO currSub = sourceSubStockList.stream()
.filter(s -> s.getSubGoodsCode().equals(temp.getSubGoodsCode()))
.findFirst().get();
preOutStock.setNeedQuantity(currSub.getSingleUseQty() * totalNeedSet);
preOutStock.setCompleteQuantity(takeQty);
preOutStock.setGoodsId(maxStock.getGoodsId());
StGoods stGoods = stGoodsService.getById(maxStock.getGoodsId());
preOutStock.setGoodsName(stGoods.getGoodsName());
preOutStock.setGoodsCode(stGoods.getGoodsCode());
preOutStock.setSlId(maxStock.getSlId());
StStorageLocation location = stStorageLocationService.getById(maxStock.getSlId());
preOutStock.setLocation(location.getLocation());
preOutStock.setShId(maxStock.getShId());
StStorehouse storehouse = stStorehouseService.getById(maxStock.getShId());
preOutStock.setShName(storehouse.getShName());
preOutStock.setRlsId(maxStock.getId());
preOutStock.setPiNo(maxStock.getPiNo());
preOutStock.setCurStatus(0L);
preOutStock.setCreateTime(now);
preOutStock.setUpdateTime(now);
preOutStockList.add(preOutStock);
System.out.println("石墨模子件[编码:" + preOutStock.getGoodsCode() + "]库存充足,已构建预出库信息,库存ID:" + maxStock.getId());
// 更新实时库存占用数量
double oldOccupy = Optional.ofNullable(maxStock.getOccupyQuantity()).orElse(0D);
maxStock.setOccupyQuantity(oldOccupy + takeQty);
stRealtimeStockService.updateById(maxStock);
StRealtimeStockLock lock = new StRealtimeStockLock();
lock.setId(IdUtil.getSnowflake().nextId());
lock.setRlsId(maxStock.getId());
lock.setWoNo(preOutStock.getCardNo());
lock.setOccupyQuantity(takeQty);
lock.setStatus(0);
stRealtimeStockMapper.insertStockLock(lock);
preOutStock.setNeedQuantity(singleUse * totalNeedSet);
preOutStock.setCompleteQuantity(totalNeed);
preOutStock.setGoodsId(maxStock.getGoodsId());
StGoods stGoods = stGoodsService.getById(maxStock.getGoodsId());
preOutStock.setGoodsName(stGoods.getGoodsName());
preOutStock.setGoodsCode(stGoods.getGoodsCode());
preOutStock.setSlId(maxStock.getSlId());
StStorageLocation location = stStorageLocationService.getById(maxStock.getSlId());
preOutStock.setLocation(location.getLocation());
preOutStock.setShId(maxStock.getShId());
StStorehouse storehouse = stStorehouseService.getById(maxStock.getShId());
preOutStock.setShName(storehouse.getShName());
preOutStock.setRlsId(maxStock.getId());
preOutStock.setPiNo(maxStock.getPiNo());
preOutStock.setCurStatus(0L);
preOutStock.setCreateTime(now);
preOutStock.setUpdateTime(now);
preOutStockList.add(preOutStock);
System.out.println("石墨模子件[编码:" + preOutStock.getGoodsCode() + "]库存充足,已构建预出库信息,库存ID:" + maxStock.getId());
// 更新实时库存占用数量
maxStock.setOccupyQuantity(occupyQty + actualTake);
stRealtimeStockService.updateById(maxStock);
StRealtimeStockLock lock = new StRealtimeStockLock();
lock.setId(IdUtil.getSnowflake().nextId());
lock.setRlsId(maxStock.getId());
lock.setWoNo(preOutStock.getCardNo());
lock.setOccupyQuantity(actualTake);
lock.setStatus(0);
stRealtimeStockMapper.insertStockLock(lock);
remainNeed -= actualTake;
}
}
System.out.println("石墨模子件预出库全部完成!");

Loading…
Cancel
Save