Merge remote-tracking branch 'origin/master'

develop-QA
wusiyu 3 months ago
commit 4f1c945347
  1. 27
      blade-ops/blade-job/src/main/java/org/springblade/job/processor/erp/SynCloseProdPlanProcessor.java
  2. 27
      blade-ops/blade-job/src/main/java/org/springblade/job/processor/erp/SynGlassCakeProcessor.java
  3. 10
      blade-ops/blade-job/src/main/java/org/springblade/job/processor/erp/SynMesRbWoProcessor.java
  4. 9
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/feign/IApsClient.java
  5. 45
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/feign/IApsOrderClient.java
  6. 2
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/entity/YieldPlan.java
  7. 8
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpMesRbWoClient.java
  8. 14
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpMesRbWoClientFallback.java
  9. 22
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/pojo/dto/table/Rrbwoerptomes.java
  10. 8
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/pojo/dto/table/Wo.java
  11. 9
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/feign/ApsClient.java
  12. 74
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/feign/ApsOrderClient.java
  13. 4
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/controller/RbProduceManageController.java
  14. 9
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IWorkOrderRunService.java
  15. 7
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IWorkOrderService.java
  16. 122
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkOrderRunServiceImpl.java
  17. 96
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkOrderServiceImpl.java
  18. 37
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/feign/ErpMesRbWoClient.java
  19. 14
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpRrbwoerptomesMapper.java
  20. 5
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpRrbwoerptomesMapper.xml
  21. 14
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpWoMapper.java
  22. 5
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpWoMapper.xml
  23. 4
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/IErpMesRbWoService.java
  24. 12
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/IErpRrbwoerptomesService.java
  25. 12
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/IErpWoService.java
  26. 8
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/impl/ErpMesRbPurtosoServiceImpl.java
  27. 98
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/impl/ErpMesRbWoServiceImpl.java
  28. 20
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/impl/ErpRrbwoerptomesServiceImpl.java
  29. 20
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/impl/ErpWoServiceImpl.java

@ -0,0 +1,27 @@
package org.springblade.job.processor.erp;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.erpdata.feign.IErpMesRbWoClient;
import tech.powerjob.worker.core.processor.ProcessResult;
import tech.powerjob.worker.core.processor.TaskContext;
import tech.powerjob.worker.core.processor.sdk.BasicProcessor;
import java.util.concurrent.CompletableFuture;
@RequiredArgsConstructor
@Slf4j
public class SynCloseProdPlanProcessor implements BasicProcessor {
private final IErpMesRbWoClient mesRbWoClient;
@Override
public ProcessResult process(TaskContext taskContext) throws Exception {
log.info("同步关闭生产计划定时任务开始");
CompletableFuture<Void> runFuture = CompletableFuture.runAsync(()-> mesRbWoClient.synCloseProdPlan());
log.info("同步关闭生产计划定时任务结束");
return new ProcessResult(true);
}
}

@ -0,0 +1,27 @@
package org.springblade.job.processor.erp;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.erpdata.feign.IErpMesRbWoClient;
import tech.powerjob.worker.core.processor.ProcessResult;
import tech.powerjob.worker.core.processor.TaskContext;
import tech.powerjob.worker.core.processor.sdk.BasicProcessor;
import java.util.concurrent.CompletableFuture;
@RequiredArgsConstructor
@Slf4j
public class SynGlassCakeProcessor implements BasicProcessor {
private final IErpMesRbWoClient mesRbWoClient;
@Override
public ProcessResult process(TaskContext taskContext) throws Exception {
log.info("同步玻璃饼订单定时任务开始");
CompletableFuture<Void> runFuture = CompletableFuture.runAsync(()-> mesRbWoClient.synGlassCake());
log.info("同步玻璃饼订单定时任务结束");
return new ProcessResult(true);
}
}

@ -1,12 +1,16 @@
package org.springblade.job.processor.quality;
package org.springblade.job.processor.erp;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.erpdata.feign.IErpMesRbWoClient;
import tech.powerjob.worker.core.processor.ProcessResult;
import tech.powerjob.worker.core.processor.TaskContext;
import tech.powerjob.worker.core.processor.sdk.BasicProcessor;
import java.util.concurrent.CompletableFuture;
@RequiredArgsConstructor
@Slf4j
public class SynMesRbWoProcessor implements BasicProcessor {
private final IErpMesRbWoClient mesRbWoClient;
@ -15,7 +19,9 @@ public class SynMesRbWoProcessor implements BasicProcessor {
@Override
public ProcessResult process(TaskContext taskContext) throws Exception {
mesRbWoClient.synMesRbWo();
log.info("同步生产订单定时任务开始");
CompletableFuture<Void> runFuture = CompletableFuture.runAsync(()-> mesRbWoClient.synMesRbWo());
log.info("同步生产订单定时任务结束");
return new ProcessResult(true);
}
}

@ -1,12 +1,8 @@
package org.springblade.desk.order.feign;
import org.springblade.core.launch.constant.AppConstant;
import org.springblade.desk.order.pojo.entity.YieldPlan;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import java.util.List;
/**
* 排产相关定时任务接口声明
@ -21,7 +17,7 @@ public interface IApsClient {
String API_PREFIX = "/feign/aps/";
String SYNC_ORDER_FROM_OLD_MES = API_PREFIX + "/syncOrderFromOldMes";
String SYNC_PLAN_FROM_SAVE = API_PREFIX + "/syncPlanSave";
/**
* 从旧mes平台同步生产订单
@ -30,6 +26,5 @@ public interface IApsClient {
*/
@GetMapping(SYNC_ORDER_FROM_OLD_MES)
Boolean syncOrderFromOldMes();
@PostMapping(SYNC_PLAN_FROM_SAVE)
void saveList(List<YieldPlan> yieldOrderList);
}

@ -0,0 +1,45 @@
package org.springblade.desk.order.feign;
import org.springblade.core.launch.constant.AppConstant;
import org.springblade.desk.dashboard.pojo.entity.DsCraftEntity;
import org.springblade.desk.dashboard.pojo.entity.DsPartEntity;
import org.springblade.desk.order.pojo.entity.YieldPlan;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import java.util.List;
/**
* 排产相关定时任务接口声明
*
* @author lqk
*/
@FeignClient(
value = AppConstant.APPLICATION_DESK_NAME
)
public interface IApsOrderClient {
String API_PREFIX = "/feign/aps/order";
String SYNC_PLAN_FROM_SAVE = API_PREFIX + "/syncPlanSave";
String GET_CRAFT_LIST = API_PREFIX + "/getDsCraftList";
String GET_PLAN_LIST = API_PREFIX + "/getPlanList";
String GET_PART_LIST = API_PREFIX + "/getPartList";
String UPDATE_BY_ID = API_PREFIX + "/updateById";
String CLOSE_PLAN_LIST = API_PREFIX + "/getClosePlanList";
@PostMapping(SYNC_PLAN_FROM_SAVE)
void saveList(List<YieldPlan> yieldOrderList);
@GetMapping(GET_CRAFT_LIST)
List<DsCraftEntity> getDsCraftList();
@GetMapping(GET_PLAN_LIST)
List<YieldPlan> getPlanList();
@GetMapping(GET_PART_LIST)
List<DsPartEntity> getPartList(List<String> partCodeList);
@GetMapping(UPDATE_BY_ID)
void updateById(YieldPlan yieldPlan);
@GetMapping(CLOSE_PLAN_LIST)
List<YieldPlan> getClosePlanList();
}

@ -80,7 +80,7 @@ public class YieldPlan extends BaseEntity {
* 面积
*/
@TableField(value = "YP_AREA")
private BigDecimal ypArea;
private Double ypArea;
/**
* 需求交期

@ -35,5 +35,11 @@ public interface IErpMesRbWoClient {
/**
* 同步生产计划数据
*/
void synMesRbWo();
R<Void> synMesRbWo();
/**
* 同步玻璃饼订单
*/
R<Void> synGlassCake();
R<Void>synCloseProdPlan();
}

@ -21,7 +21,17 @@ public class IErpMesRbWoClientFallback implements IErpMesRbWoClient {
}
@Override
public void synMesRbWo() {
R.fail("获取数据失败");
public R<Void> synMesRbWo() {
return R.fail("获取数据失败");
}
@Override
public R<Void> synGlassCake() {
return R.fail("获取数据失败");
}
@Override
public R<Void> synCloseProdPlan() {
return R.fail("获取数据失败");
}
}

@ -1,6 +1,13 @@
package org.springblade.erpdata.pojo.dto.table;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.mp.base.BaseEntity;
import java.util.Date;
/**
* 对应ERP中表 t_rbwoerptomes
@ -9,13 +16,18 @@ import lombok.Data;
* @date 2026-01-16 17:32
*/
@Data
public class Rrbwoerptomes {
@TableName("t_rbwoerptomes")
public class Rrbwoerptomes extends BaseEntity {
private String wono; //工作订单号
@TableField(value = "WONO")
private String woNo; //工作订单号
private String process_line_desc; //工艺路线明细
@TableField(value = "PROCESS_LINE_DESC")
private String processLineDesc; //工艺路线明细
private String readtime; //读取时间
@TableField(value = "READTIME")
private Date readTime; //读取时间
private String read_content; //读取内容
@TableField(value = "READ_CONTENT")
private String readContent; //读取内容
}

@ -1,6 +1,9 @@
package org.springblade.erpdata.pojo.dto.table;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.springblade.core.mp.base.BaseEntity;
/**
* 对应ERP中表 t_wo
@ -9,8 +12,10 @@ import lombok.Data;
* @date 2026-01-16 17:32
*/
@Data
public class Wo {
@TableName("t_wo")
public class Wo extends BaseEntity {
@TableField(value = "WONO")
private String wono; //工作订单
private String splcode; //批次号
@ -151,7 +156,6 @@ public class Wo {
private String wochkqty; //抽检数
private String id; //新系统同步id
private String dataflag; //新老系统数据标识: 0-老系统,1-新系统

@ -25,9 +25,12 @@
*/
package org.springblade.desk.order.feign;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.v3.oas.annotations.Hidden;
import lombok.RequiredArgsConstructor;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.desk.dashboard.pojo.entity.DsCraftEntity;
import org.springblade.desk.dashboard.service.IDsCraftService;
import org.springblade.desk.order.pojo.entity.YieldPlan;
import org.springblade.desk.order.service.IYieldOrderService;
import org.springblade.desk.order.service.IYieldPlanService;
@ -50,7 +53,6 @@ public class ApsClient implements IApsClient {
private final IYieldOrderService yieldOrderService;
private final IYieldPlanService yieldPlanService;
@Override
@GetMapping(SYNC_ORDER_FROM_OLD_MES)
@ -64,9 +66,4 @@ public class ApsClient implements IApsClient {
return Boolean.TRUE;
}
@Override
@PostMapping(SYNC_PLAN_FROM_SAVE)
public void saveList(List<YieldPlan> yieldPlanList) {
yieldPlanService.saveOrUpdateBatch(yieldPlanList);
}
}

@ -0,0 +1,74 @@
package org.springblade.desk.order.feign;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.v3.oas.annotations.Hidden;
import lombok.RequiredArgsConstructor;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.desk.dashboard.pojo.entity.DsCraftEntity;
import org.springblade.desk.dashboard.pojo.entity.DsPartEntity;
import org.springblade.desk.dashboard.service.IDsCraftService;
import org.springblade.desk.dashboard.service.IDsPartService;
import org.springblade.desk.order.pojo.entity.YieldPlan;
import org.springblade.desk.order.service.IYieldOrderService;
import org.springblade.desk.order.service.IYieldPlanService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* Feign 排产相关定时任务接口
*
* @author Chill
*/
@NonDS
@Hidden()
@RestController
@RequiredArgsConstructor
public class ApsOrderClient implements IApsOrderClient {
private final IYieldPlanService yieldPlanService;
private final IDsCraftService dsCraftService;
private final IDsPartService dsPartService;
@Override
@PostMapping(SYNC_PLAN_FROM_SAVE)
public void saveList(List<YieldPlan> yieldPlanList) {
yieldPlanService.saveOrUpdateBatch(yieldPlanList);
}
@Override
public List<DsCraftEntity> getDsCraftList() {
return dsCraftService.list();
}
@Override
public List<YieldPlan> getPlanList() {
return yieldPlanService.list(new QueryWrapper<YieldPlan>().lambda()
.eq(YieldPlan::getIsDeleted, 0).eq(YieldPlan::getPlanType, 12002)
.eq(YieldPlan::getGenerateGlassCake, 0));
}
@Override
public List<DsPartEntity> getPartList(List<String> partCodeList) {
return dsPartService.list(new QueryWrapper<DsPartEntity>().lambda()
.in(DsPartEntity::getPartCode, partCodeList)
.like(DsPartEntity::getPartName, "玻璃"));
}
@Override
public void updateById(YieldPlan yieldPlan) {
yieldPlanService.updateById(yieldPlan);
}
@Override
public List<YieldPlan> getClosePlanList() {
return yieldPlanService.list(new QueryWrapper<YieldPlan>().lambda()
.lt(YieldPlan::getStatus, "10015")
.orderByAsc(YieldPlan::getCheckCloseTime)
.last("limit 1000"));
}
}

@ -31,8 +31,6 @@ public class RbProduceManageController extends BladeController {
private final IWorkOrderService workOrderService;
private final IWorkOrderRunService workOrderRunService;
@GetMapping("/page")
@ApiOperationSupport(order = 1)
@Operation(summary = "车间订单列表分页", description = "传入WorkOrderVO")
@ -76,7 +74,7 @@ public class RbProduceManageController extends BladeController {
@ApiOperationSupport(order = 6)
@Operation(summary = "获取转外协所需数据", description = "传入produceManageDTO")
public R listProProcess(@RequestBody ListProProcessDTO listProProcessDTO) {
return R.data(workOrderRunService.listProProcess(listProProcessDTO));
return R.data(workOrderService.listProProcess(listProProcessDTO));
}
@PostMapping(value = "/transferBill")

@ -1,11 +1,7 @@
package org.springblade.desk.produce.service;
import org.springblade.core.mp.base.BaseService;
import org.springblade.desk.produce.pojo.dto.ListProProcessDTO;
import org.springblade.desk.produce.pojo.entity.WorkOrderRun;
import org.springblade.desk.produce.pojo.entity.WorkPlanRun;
import java.util.List;
/**
* 车间订单运行记录表 服务类
@ -14,9 +10,4 @@ import java.util.List;
*/
public interface IWorkOrderRunService extends BaseService<WorkOrderRun> {
/**
* <p>方法名: listProProcess </p>
* <p>方法描述: 转单加载组装数据 </p>
*/
List<WorkPlanRun> listProProcess(ListProProcessDTO listProProcessDTO);
}

@ -2,6 +2,7 @@ package org.springblade.desk.produce.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseService;
import org.springblade.desk.produce.pojo.dto.ListProProcessDTO;
import org.springblade.desk.produce.pojo.dto.WorkOrderDTO;
import org.springblade.desk.produce.pojo.entity.WorkOrder;
import org.springblade.desk.produce.pojo.entity.WorkOrderRun;
@ -36,4 +37,10 @@ public interface IWorkOrderService extends BaseService<WorkOrder> {
boolean updateStatus(List<Long> idArr, Integer status, Long userId, String memo);
boolean transferBill(List<WorkOrderRun> workOrderRuns, List<WorkPlanRun> workPlanRuns);
/**
* <p>方法名: listProProcess </p>
* <p>方法描述: 转单加载组装数据 </p>
*/
List<WorkPlanRun> listProProcess(ListProProcessDTO listProProcessDTO);
}

@ -1,29 +1,11 @@
package org.springblade.desk.produce.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.desk.dashboard.pojo.entity.BsProcessSetEntity;
import org.springblade.desk.dashboard.service.IBsProcessSetService;
import org.springblade.desk.produce.mapper.WorkOrderRunMapper;
import org.springblade.desk.produce.pojo.dto.ListProProcessDTO;
import org.springblade.desk.produce.pojo.entity.WorkOrderRun;
import org.springblade.desk.produce.pojo.entity.WorkPlan;
import org.springblade.desk.produce.pojo.entity.WorkPlanRun;
import org.springblade.desk.produce.service.IWorkOrderRunService;
import org.springblade.desk.produce.service.IWorkPlanService;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.time.Instant;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import static com.alibaba.fastjson2.util.DateUtils.DEFAULT_ZONE_ID;
/**
* 车间订单运行记录表 服务实现类
@ -34,108 +16,4 @@ import static com.alibaba.fastjson2.util.DateUtils.DEFAULT_ZONE_ID;
@RequiredArgsConstructor
public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper, WorkOrderRun> implements IWorkOrderRunService {
private final IWorkPlanService prWorkPlanService;
private final IBsProcessSetService bsProcessSetService;
@Override
public List<WorkPlanRun> listProProcess(ListProProcessDTO listProProcessDTO) {
List<Long> woIds = listProProcessDTO.getWoIds();
Integer runType = listProProcessDTO.getRunType();
if (CollectionUtils.isEmpty(woIds) || runType == null) {
return null;
}
Long curWoId = woIds.get(0);
List<WorkPlan> wpList = prWorkPlanService.list(Wrappers.lambdaQuery(WorkPlan.class).eq(WorkPlan::getWoId, curWoId));
List<WorkPlanRun> wprList = new ArrayList<>(wpList.size());
// 拿出第一个单子对应的可以派外协的工序
String proName = "";
for (WorkPlan wp : wpList) {
WorkPlanRun wpr = new WorkPlanRun();
//验证
if (!this.checkWp(wp, runType)) {
continue;
}
//转厂内时所有工序自动标记
if (WorkOrderRun.RUN_TYPE_2.equals(runType)) {
wpr.setHandle(Boolean.TRUE);
} else {
wpr.setHandle(Boolean.FALSE);
}
//组装工序号和工序id,用于批量验证是否一致
if (StringUtils.isBlank(proName)) {
proName = wp.getOrders() + "_" + wp.getPpsId();
} else {
proName = proName + "," + wp.getOrders() + "_" + wp.getPpsId();
}
wpr.setCaId(wp.getCaId());
wpr.setStartTime(localDateTimeToDate(wp.getStartTime()));
wpr.setEndTime(localDateTimeToDate(wp.getEndTime()));
wpr.setWpId(wp.getWoId());
wprList.add(wpr);
}
//如果是批量操作
if (woIds.size() > 1) {
//从集合里面提出首单id
woIds.remove(curWoId);
//验证其他车间订单是否满足条件
for (Long aLong : woIds) {
wpList = prWorkPlanService.list(Wrappers.lambdaQuery(WorkPlan.class).eq(WorkPlan::getWoId, aLong));
// 拿出其他单子可以派外协的工序与第一条做对比
String otherProName = "";
for (WorkPlan wp : wpList) {
//验证
if (!this.checkWp(wp, runType)) {
continue;
}
//组装工序号和工序id,用于批量验证是否一致
if (StringUtils.isBlank(otherProName)) {
otherProName = wp.getOrders() + "_" + wp.getPpsId();
} else {
otherProName = otherProName + "," + wp.getOrders() + "_" + wp.getPpsId();
}
}
if (!proName.equals(otherProName)) {
throw new ServiceException("请选择相同的可转出的工序进行操作!!!");
}
}
}
return wprList;
}
private boolean checkWp(WorkPlan wp, Integer runType) {
//不分派工序不能操作
BsProcessSetEntity processSet = bsProcessSetService.getById(wp.getPpsId());
if (processSet == null) {
return false;
}
if ("1".equals(processSet.getIsDispatch())) {
return false;
}
//如果是转厂内,则非厂外的工序跳过
if (WorkOrderRun.RUN_TYPE_2.equals(runType) && "0".equals(wp.getOem())) {
return false;
}
return true;
}
/**
* LocalDateTime Date
* @param localDateTime
* @return
*/
private Date localDateTimeToDate(LocalDateTime localDateTime) {
// 空值校验,避免空指针异常
if (localDateTime == null) {
return null;
}
// 1. LocalDateTime + 时区 → ZonedDateTime → Instant
Instant instant = localDateTime.atZone(DEFAULT_ZONE_ID).toInstant();
// 2. Instant → Date
return Date.from(instant);
}
}

@ -8,13 +8,13 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.desk.dashboard.pojo.entity.BsProcessSetEntity;
import org.springblade.desk.dashboard.service.IBsProcessSetService;
import org.springblade.desk.order.pojo.entity.YieldOrder;
import org.springblade.desk.order.pojo.enums.YieldOrderEnum;
import org.springblade.desk.order.service.IYieldOrderService;
import org.springblade.desk.produce.mapper.WorkOrderMapper;
import org.springblade.desk.produce.pojo.dto.ListProProcessDTO;
import org.springblade.desk.produce.pojo.dto.WorkOrderDTO;
import org.springblade.desk.produce.pojo.entity.*;
import org.springblade.desk.produce.pojo.vo.BatchPrepareVO;
@ -27,10 +27,15 @@ import org.springblade.desk.quality.service.IPlanTestService;
import org.springblade.desk.quality.service.IWorkPlanItemService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.rmi.ServerException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.util.*;
import static com.alibaba.fastjson2.util.DateUtils.DEFAULT_ZONE_ID;
/**
* 车间订单表 服务实现类
*
@ -202,7 +207,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
WorkPlanRun wpr;
for (WorkPlan wp : wpList) {
//验证
if (!this.checkWp(wp, workOrderRun.getRunType())) {
if (!this.checkWp(wp, Integer.valueOf(workOrderRun.getRunType()))) {
continue;
}
//获取到通用的工序信息
@ -255,7 +260,76 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
return true;
}
private boolean checkWp(WorkPlan wp, Short runType) {
@Override
public List<WorkPlanRun> listProProcess(ListProProcessDTO listProProcessDTO) {
List<Long> woIds = listProProcessDTO.getWoIds();
Integer runType = listProProcessDTO.getRunType();
if (CollectionUtils.isEmpty(woIds) || runType == null) {
return null;
}
Long curWoId = woIds.get(0);
List<WorkPlan> wpList = workPlanService.list(Wrappers.lambdaQuery(WorkPlan.class).eq(WorkPlan::getWoId, curWoId));
List<WorkPlanRun> wprList = new ArrayList<>(wpList.size());
// 拿出第一个单子对应的可以派外协的工序
String proName = "";
for (WorkPlan wp : wpList) {
WorkPlanRun wpr = new WorkPlanRun();
//验证
if (!this.checkWp(wp, runType)) {
continue;
}
//转厂内时所有工序自动标记
if (WorkOrderRun.RUN_TYPE_2.equals(runType)) {
wpr.setHandle(Boolean.TRUE);
} else {
wpr.setHandle(Boolean.FALSE);
}
//组装工序号和工序id,用于批量验证是否一致
if (StringUtils.isBlank(proName)) {
proName = wp.getOrders() + "_" + wp.getPpsId();
} else {
proName = proName + "," + wp.getOrders() + "_" + wp.getPpsId();
}
wpr.setCaId(wp.getCaId());
wpr.setStartTime(localDateTimeToDate(wp.getStartTime()));
wpr.setEndTime(localDateTimeToDate(wp.getEndTime()));
wpr.setWpId(wp.getWoId());
wprList.add(wpr);
}
//如果是批量操作
if (woIds.size() > 1) {
//从集合里面提出首单id
woIds.remove(curWoId);
//验证其他车间订单是否满足条件
for (Long aLong : woIds) {
wpList = workPlanService.list(Wrappers.lambdaQuery(WorkPlan.class).eq(WorkPlan::getWoId, aLong));
// 拿出其他单子可以派外协的工序与第一条做对比
String otherProName = "";
for (WorkPlan wp : wpList) {
//验证
if (!this.checkWp(wp, runType)) {
continue;
}
//组装工序号和工序id,用于批量验证是否一致
if (StringUtils.isBlank(otherProName)) {
otherProName = wp.getOrders() + "_" + wp.getPpsId();
} else {
otherProName = otherProName + "," + wp.getOrders() + "_" + wp.getPpsId();
}
}
if (!proName.equals(otherProName)) {
throw new ServiceException("请选择相同的可转出的工序进行操作!!!");
}
}
}
return wprList;
}
private boolean checkWp(WorkPlan wp, Integer runType) {
//不分派工序不能操作
BsProcessSetEntity processSet = bsProcessSetService.getById(wp.getPpsId());
if (processSet == null) {
@ -271,6 +345,22 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
return true;
}
/**
* LocalDateTime Date
* @param localDateTime
* @return
*/
private Date localDateTimeToDate(LocalDateTime localDateTime) {
// 空值校验,避免空指针异常
if (localDateTime == null) {
return null;
}
// 1. LocalDateTime + 时区 → ZonedDateTime → Instant
Instant instant = localDateTime.atZone(DEFAULT_ZONE_ID).toInstant();
// 2. Instant → Date
return Date.from(instant);
}
private void updateStatusFun(WorkOrder workOrder, Integer runStatus, Long userId) {
workOrder.setRunStatus(runStatus);
if (WorkOrder.RUN_STATUS_VOIDED.equals(runStatus)) {

@ -22,16 +22,29 @@ import java.util.List;
@AllArgsConstructor
public class ErpMesRbWoClient implements IErpMesRbWoClient {
private final IErpMesRbWoService erpMesRbWoService;
@Override
public R<List<MesRbWo>> getList(MesRbWo entity) {
return R.data(erpMesRbWoService.getList(entity));
}
@Override
public void synMesRbWo() {
erpMesRbWoService.synMesRbWo();
}
private final IErpMesRbWoService erpMesRbWoService;
@Override
public R<List<MesRbWo>> getList(MesRbWo entity) {
return R.data(erpMesRbWoService.getList(entity));
}
@Override
public R<Void> synMesRbWo() {
erpMesRbWoService.synMesRbWo();
return R.success();
}
@Override
public R<Void> synGlassCake() {
erpMesRbWoService.synGlassCake();
return R.success();
}
@Override
public R<Void> synCloseProdPlan() {
erpMesRbWoService.synCloseProdPlan();
return R.success();
}
}

@ -0,0 +1,14 @@
package org.springblade.erpdata.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springblade.erpdata.pojo.dto.table.Rrbwoerptomes;
/**
* Mapper 接口
*
* @author lqk
*/
public interface ErpRrbwoerptomesMapper extends BaseMapper<Rrbwoerptomes> {
}

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace = "org.springblade.erpdata.mapper.ErpRrbwoerptomesMapper">
</mapper>

@ -0,0 +1,14 @@
package org.springblade.erpdata.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springblade.erpdata.pojo.dto.table.Wo;
/**
* Mapper 接口
*
* @author lqk
*/
public interface ErpWoMapper extends BaseMapper<Wo> {
}

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace = "org.springblade.erpdata.mapper.ErpWoMapper">
</mapper>

@ -22,4 +22,8 @@ public interface IErpMesRbWoService {
* 同步生产计划数据
*/
void synMesRbWo();
void synGlassCake();
void synCloseProdPlan();
}

@ -0,0 +1,12 @@
package org.springblade.erpdata.service;
import org.springblade.core.mp.base.BaseService;
import org.springblade.erpdata.pojo.dto.table.Rrbwoerptomes;
/**
* ERP数据查询service
*
* @author lqk
*/
public interface IErpRrbwoerptomesService extends BaseService<Rrbwoerptomes> {
}

@ -0,0 +1,12 @@
package org.springblade.erpdata.service;
import org.springblade.core.mp.base.BaseService;
import org.springblade.erpdata.pojo.dto.table.Wo;
/**
* ERP数据查询service
*
* @author lqk
*/
public interface IErpWoService extends BaseService<Wo> {
}

@ -3,18 +3,10 @@ package org.springblade.erpdata.service.impl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.desk.order.feign.IApsClient;
import org.springblade.desk.order.pojo.entity.YieldPlan;
import org.springblade.erpdata.mapper.ErpMesRbPurtosoMapper;
import org.springblade.erpdata.mapper.ErpMesRbWoMapper;
import org.springblade.erpdata.pojo.dto.view.MesRbWo;
import org.springblade.erpdata.service.IErpMesRbPurtosoService;
import org.springblade.erpdata.service.IErpMesRbWoService;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* @author lqk
* @date 2025-11-26 9:39

@ -1,16 +1,24 @@
package org.springblade.erpdata.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.desk.order.feign.IApsClient;
import org.springblade.desk.dashboard.pojo.entity.DsCraftEntity;
import org.springblade.desk.dashboard.pojo.entity.DsPartEntity;
import org.springblade.desk.order.feign.IApsOrderClient;
import org.springblade.desk.order.pojo.entity.YieldPlan;
import org.springblade.desk.order.pojo.enums.YieldPlanEnum;
import org.springblade.erpdata.mapper.ErpMesRbWoMapper;
import org.springblade.erpdata.pojo.dto.table.Rrbwoerptomes;
import org.springblade.erpdata.pojo.dto.table.Wo;
import org.springblade.erpdata.pojo.dto.view.MesRbWo;
import org.springblade.erpdata.service.IErpMesRbWoService;
import org.springblade.erpdata.service.IErpRrbwoerptomesService;
import org.springblade.erpdata.service.IErpWoService;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
@ -24,7 +32,11 @@ public class ErpMesRbWoServiceImpl implements IErpMesRbWoService {
private final ErpMesRbWoMapper mesRbWoMapper;
private final IApsClient apsClient;
private final IApsOrderClient apsOrderClient;
private final IErpRrbwoerptomesService rbwoerptomesService;
private final IErpWoService woService;
@Override
@ -44,27 +56,97 @@ public class ErpMesRbWoServiceImpl implements IErpMesRbWoService {
* INTO v_product_type, v_part_name, v_po_area, v_craft_way, v_config_no
* FROM ds_part a WHERE a.part_code = v_prtno;
*/
List<DsPartEntity> dsPartList=new ArrayList<>();//todo 获取零件信息
List<String> partCodeList=dsPartList.stream().map(x->x.getPartCode()).toList();
List<YieldPlan> yieldPlanList=new ArrayList<>();
//若零件不为空, 验证零件是否存在二级零件工艺
List<DsCraftEntity> dsCraftList= apsOrderClient.getDsCraftList();
List<Long> partIdList=dsCraftList.stream().map(x->x.getPartId()).toList();
final Long[] partId = {0L};
List<Rrbwoerptomes> rbwoerptomesList=new ArrayList<>();
mesRbWoList.forEach(mesRbWo -> {
YieldPlan yieldPlan=new YieldPlan();
//b1. 根据零件号从`DS_PART`表中查询零件信息
dsPartList.forEach(dsPart -> {
if(dsPartList!=null&&dsPart.getPartCode().equals(mesRbWo.getPrtno())){
yieldPlan.setProductType(dsPart.getProductType());
yieldPlan.setPartName(dsPart.getPartName());
yieldPlan.setYpArea(dsPart.getArea());
yieldPlan.setPrimaryCraft(dsPart.getCraftWay());
partId[0] =dsPart.getId();
}
});
yieldPlan.setPlanType(12001L);//赋值默认值12001
if(mesRbWo.getProcesslinedesc().contains("封接")
||"LX08-05-028,LX08-05-030,LX08-05-031".contains(mesRbWo.getProcessline())){
yieldPlan.setPlanType(12002L);
yieldPlan.setPlate("烧结电镀");
}
//b3. 状态字段赋值,新mes中对应字段(status)
yieldPlan.setStatus(YieldPlanEnum.STATUS_DISPATCHED.getCode());
yieldPlan.setRoamNo("");
//1. 若零件为空
if(!partCodeList.contains(mesRbWo.getPrtno())){
yieldPlan.setStatus(YieldPlanEnum.STATUS_NO_CRAFT.getCode());
yieldPlan.setRoamNo("无零件信息!!");
}else {//2. 若零件不为空, 验证零件是否存在二级零件工艺
if(partId==null||partId[0]==null||(partId!=null&&partId[0]!=null&&!partIdList.contains(partId[0]))){
yieldPlan.setStatus(YieldPlanEnum.STATUS_NO_CRAFT.getCode());
yieldPlan.setRoamNo("无二级工艺信息!!");
}
}
yieldPlan.setYpCode(mesRbWo.getWono());
yieldPlan.setPartCode(mesRbWo.getPrtno());
yieldPlan.setProductType(mesRbWo.getPrtlotno());
yieldPlan.setPartName(mesRbWo.getPlndept());
yieldPlan.setPlate(mesRbWo.getKdofplat());
yieldPlan.setProductIdent(mesRbWo.getWoreqdat());
yieldPlan.setYpQty(Long.valueOf(mesRbWo.getWototqty()));
yieldPlan.setYpArea(new BigDecimal(mesRbWo.getPrtmdept()));
yieldPlan.setYpQty(Long.valueOf(mesRbWo.getWototqty()));
yieldPlan.setDemandDate(mesRbWo.getWopordat());
yieldPlanList.add(yieldPlan);
//插入记录表
Rrbwoerptomes rbwoerptomes=new Rrbwoerptomes();
rbwoerptomes.setWoNo(mesRbWo.getWono());
rbwoerptomes.setProcessLineDesc(mesRbWo.getProcesslinedesc());
rbwoerptomes.setReadTime(new Date());
rbwoerptomes.setReadContent(mesRbWo.getProcessline());
rbwoerptomesList.add(rbwoerptomes);
});
apsOrderClient.saveList(yieldPlanList);
rbwoerptomesService.saveOrUpdateBatch(rbwoerptomesList);
}
@Override
public void synGlassCake() {
List<YieldPlan> yieldPlanList=apsOrderClient.getPlanList();
List<String> partCodeList=yieldPlanList.stream().map(x->x.getPartCode()).toList();
//b1. 查询该计划的零件是否是玻璃相关的零件列表(sub_cursor)
List<DsPartEntity> dsPartList=apsOrderClient.getPartList(partCodeList);// 获取零件信息
List<String> partList=dsPartList.stream().map(x->x.getPartCode()).toList();
yieldPlanList.forEach(yieldPlan -> {
if(!partList.contains(yieldPlan.getPartCode())){
yieldPlan.setGenerateGlassCake(1);
yieldPlan.setId(yieldPlan.getId());
apsOrderClient.updateById(yieldPlan);
}
});
}
/**
* 同步关闭计划
*/
@Override
public void synCloseProdPlan() {
List<YieldPlan> yieldPlanList=apsOrderClient.getClosePlanList();
yieldPlanList.forEach(yieldPlan -> {
Wo wo=woService.getOne(new QueryWrapper<Wo>()
.eq("WONO",yieldPlan.getYpCode()));
if(wo!=null){
yieldPlan.setCheckCloseTime(new Date());
apsOrderClient.updateById(yieldPlan);
}else {
yieldPlan.setStatus(YieldPlanEnum.STATUS_COMPLETED.getCode());
yieldPlan.setCheckCloseTime(new Date());
apsOrderClient.updateById(yieldPlan);
}
});
apsClient.saveList(yieldPlanList);
}
}

@ -0,0 +1,20 @@
package org.springblade.erpdata.service.impl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.erpdata.mapper.ErpRrbwoerptomesMapper;
import org.springblade.erpdata.pojo.dto.table.Rrbwoerptomes;
import org.springblade.erpdata.service.IErpRrbwoerptomesService;
import org.springframework.stereotype.Service;
/**
* @author lqk
* @date 2025-11-26 9:39
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class ErpRrbwoerptomesServiceImpl extends BaseServiceImpl<ErpRrbwoerptomesMapper, Rrbwoerptomes> implements IErpRrbwoerptomesService {
}

@ -0,0 +1,20 @@
package org.springblade.erpdata.service.impl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.erpdata.mapper.ErpWoMapper;
import org.springblade.erpdata.pojo.dto.table.Wo;
import org.springblade.erpdata.service.IErpWoService;
import org.springframework.stereotype.Service;
/**
* @author lqk
* @date 2025-11-26 9:39
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class ErpWoServiceImpl extends BaseServiceImpl<ErpWoMapper, Wo> implements IErpWoService {
}
Loading…
Cancel
Save