agv小车调用

liweidong
liweidong-hj 1 month ago
commit 4f3387aa52
  1. 23
      blade-ops/blade-job/src/main/java/org/springblade/job/processor/logistics/OrderBoxRefinement.java
  2. 4
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/logistics/pojo/dto/AGVCallBackDto.java
  3. 5
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/logistics/pojo/dto/BoxBindingDto.java
  4. 57
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/logistics/pojo/dto/TaskDto.java
  5. 2
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/logistics/pojo/entity/TaskExecuteRecord.java
  6. 25
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/logistics/pojo/vo/TaskVO.java
  7. 2
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/MakeRec.java
  8. 33
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/MesQcProduceRunEntity.java
  9. 4
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/MesRbFilePreserveDetailEntity.java
  10. 2
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/MesRbFilePreserveSlotEntity.java
  11. 9
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/vo/ProduceMonitorFileSlotVO.java
  12. 2
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/vo/ProduceMonitorPlanDataVO.java
  13. 13
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/vo/ProduceMonitorPlanItemVO.java
  14. 2
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/vo/UnBingDeviceVo.java
  15. 2
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/InspectionTask.java
  16. 5
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/controller/AGVDockingController.java
  17. 36
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/controller/OrderBoxController.java
  18. 16
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/mapper/TaskMapper.java
  19. 31
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/mapper/TaskMapper.xml
  20. 4
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/IOrderBoxService.java
  21. 9
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/ITaskExecuteRecordService.java
  22. 5
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/ITaskService.java
  23. 5
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/IVirtualShelvesService.java
  24. 9
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/IOrderBoxServiceImpl.java
  25. 191
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/StorageMonitoringServiceImpl.java
  26. 112
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/TaskExecuteRecordServiceImpl.java
  27. 10
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/TaskServiceImpl.java
  28. 7
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/mapper/MacToolUseMapper.java
  29. 51
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/mapper/MacToolUseMapper.xml
  30. 1
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/mapper/MesQcProduceRunMapper.java
  31. 10
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/mapper/QcProduceRunMapper.xml
  32. 19
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IMacToolUseService.java
  33. 6
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IMesQcProduceRunService.java
  34. 3
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IMesRbFilePreserveDetailService.java
  35. 1
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IMesRbFilePreserveSlotService.java
  36. 9
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IWorkOrderService.java
  37. 51
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/MacToolUseServiceImpl.java
  38. 4
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/MakeRecServiceImpl.java
  39. 9
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/MesQcProduceRunServiceImpl.java
  40. 8
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/MesRbFilePreserveDetailServiceImpl.java
  41. 5
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/MesRbFilePreserveSlotServiceImpl.java
  42. 15
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/PdaSaveServiceImpl.java
  43. 589
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkOrderServiceImpl.java
  44. 3
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/IProReTemplateService.java
  45. 13
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/ProReTemplateServiceImpl.java

@ -0,0 +1,23 @@
package org.springblade.job.processor.logistics;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
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;
/**
* 物流订单绑定模块
*/
@Component
@Data
@Slf4j
public class OrderBoxRefinement implements BasicProcessor {
@Override
public ProcessResult process(TaskContext taskContext) throws Exception {
System.out.println("hello world");
log.info("hello world");
return new ProcessResult(true);
}
}

@ -1,11 +1,11 @@
package org.springblade.desk.logistics.pojo.entity;
package org.springblade.desk.logistics.pojo.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@Schema(description = "箱绑定接收")
public class AGVCallBack {
public class AGVCallBackDto {
/**
* 请求编号每个请求都要一个唯一
* 编号 同一个请求重复提交 使

@ -1,14 +1,13 @@
package org.springblade.desk.logistics.pojo.entity;
package org.springblade.desk.logistics.pojo.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.ArrayList;
@Data
@Schema(description = "箱绑定接收表")
public class BoxBinding {
public class BoxBindingDto {
private String boxBarcode;
private ArrayList<Long> orderIdList;
private Long wcId;

@ -0,0 +1,57 @@
package org.springblade.desk.logistics.pojo.dto;
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.io.Serial;
import java.math.BigDecimal;
import java.util.Date;
/**
* 物流任务实体类
*
* @author: liweidong
* @create: 2026-03-03
*/
@Data
@Schema(description = "物流任务对象")
public class TaskDto extends BaseEntity {
/**
* 箱条码
*/
@Schema(description = "箱条码")
private String boxBarcode;
/**
* 站点ID
*/
@Schema(description = "站点ID")
private Long stationId;
/**
* 作业中心ID
*/
@Schema(description = "作业中心ID")
private Long wcId;
/**
* 当前状态 0:退回(超重) 1:站点 2:库位 3:等待 4:回库 5:结束
*/
@Schema(description = "当前状态 0:退回(超重) 1:站点 2:库位 3:等待 4:回库 5:结束")
private Integer taskStatus;
/**
* 开始时间
*/
@Schema(description = "开始时间")
private Date startTime;
/**
* 结束时间
*/
@Schema(description = "结束时间")
private Date endTime;
}

@ -35,7 +35,7 @@ public class TaskExecuteRecord extends BaseEntity {
public static final String STATUS_START = "start";
/**
* 状态常量走出储位
* 状态常量结束
*/
public static final String STATUS_END = "end";

@ -0,0 +1,25 @@
package org.springblade.desk.logistics.pojo.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.desk.device.pojo.entity.EquipmentEntity;
import org.springblade.desk.logistics.pojo.entity.Task;
import java.io.Serial;
@Data
@EqualsAndHashCode(callSuper = true)
public class TaskVO extends Task {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/**
* 状态名称
*/
// String statusName;
}

@ -35,7 +35,7 @@ public class MakeRec extends BaseEntity {
private Double workQty = 0d;
@Schema(description = "报废数量")
private Integer scrapQty = 0;
private Double scrapQty = 0d;
@Schema(description = "色标数量")
private Double flagQty = 0d;

@ -75,12 +75,12 @@ public class MesQcProduceRunEntity extends BaseEntity {
* 入槽时间
*/
@Schema(description = "入槽时间")
private Date inDate;
private String inDate;
/**
* 出槽时间
*/
@Schema(description = "出槽时间")
private Date outDate;
private String outDate;
/**
* 生产状态
*/
@ -160,7 +160,7 @@ public class MesQcProduceRunEntity extends BaseEntity {
* 软起时间
*/
@Schema(description = "软起时间")
private Date softWorkTime;
private String softWorkTime;
/**
* 电压
*/
@ -207,13 +207,28 @@ public class MesQcProduceRunEntity extends BaseEntity {
@Schema(description = "参数7")
private String dataSeven;
@TableField(exist = false)
private Date dataThirteen;
@Schema(description = "参数值8")
private String dataEight;
@TableField(exist = false)
private Date dataTwelve;
@Schema(description = "参数值9")
private String dataNine;
@TableField(exist = false)
private Date dataFourteen;
@Schema(description = "参数值10")
private String dataTen;
@Schema(description = "参数值11、露点")
private String dataEleven;
@Schema(description = "参数值12、存储保温结束")
private String dataTwelve;
@Schema(description = "参数值13、存储保温开始")
private String dataThirteen;
@Schema(description = "参数值14、真空度")
private String dataFourteen;
@Schema(description = "初始电压")
private String startVol;
}

@ -49,12 +49,12 @@ public class MesRbFilePreserveDetailEntity extends BaseEntity {
* 时间
*/
@Schema(description = "时间")
private Date rfpdTime;
private String rfpdTime;
/**
* 是否合格
*/
@Schema(description = "是否合格")
private BigDecimal qualified;
private String qualified;
/**
* 参数名称
*/

@ -49,7 +49,7 @@ public class MesRbFilePreserveSlotEntity extends BaseEntity {
* 模板类型
*/
@Schema(description = "模板类型")
private String rfpsType;
private Short rfpsType;
/**
* 维护时间
*/

@ -15,6 +15,15 @@ import java.util.List;
@Data
public class ProduceMonitorFileSlotVO {
@Schema(description = "模板类型")
private Short rfpsType;
@Schema(description = "插入序号")
private String insertIndex;
@Schema(description = "槽号序号")
private String slotIndex;
@Schema(description = "槽位/工步")
private String slotName;

@ -40,7 +40,7 @@ public class ProduceMonitorPlanDataVO {
private List<ProduceMonitorFileSlotVO> dsRbFilePreserveSlotList;
@Schema(description = "检验记录")
private List<ProduceMonitorWorkCheckVO> prWorkCheck;
private ProduceMonitorWorkCheckVO prWorkCheck;
@Schema(description = "转试记录")
private List<PlanTest> trialItemList;

@ -3,6 +3,7 @@ package org.springblade.desk.produce.pojo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.Date;
/**
@ -15,16 +16,16 @@ import java.util.Date;
public class ProduceMonitorPlanItemVO {
@Schema(description = "项目编号")
private String trialNo;
private String itemCode;
@Schema(description = "项目名称")
private String trialItem;
private String itemName;
@Schema(description = "标准")
private String trialStandard;
private String standardName;
@Schema(description = "测试值")
private String scrapQty;
private String checkValue;
@Schema(description = "试验数量")
private Double testQty = 0d;
@ -36,12 +37,12 @@ public class ProduceMonitorPlanItemVO {
private Double checkQty = 0d;
@Schema(description = "检验结果")
private String checkValue;
private String checkResult;
@Schema(description = "检验人")
private String checkMan;
@Schema(description = "检验时间")
private Date checkDate;
private LocalDateTime checkDate;
}

@ -18,7 +18,7 @@ public class UnBingDeviceVo {
private String fiveData;
private String sixData;
private String sevenData;
private Date dataFourteen;
private String dataFourteen;
private String tempSlot;
}

@ -329,7 +329,7 @@ public class InspectionTask extends BaseEntity {
* 返工数
*/
@Schema(description = "返工数")
private Long reworkQty;
private Double reworkQty;
/**
* [作业计划]id
*/

@ -5,7 +5,8 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import org.springblade.core.tool.api.R;
import org.springblade.desk.logistics.pojo.entity.AGVCallBack;
import org.springblade.desk.logistics.pojo.dto.AGVCallBackDto;
import org.springblade.desk.logistics.service.IOrderBoxService;
import org.springblade.desk.logistics.service.ITaskExecuteRecordService;
import org.springframework.web.bind.annotation.PostMapping;
@ -34,7 +35,7 @@ public class AGVDockingController {
summary = "agv小车回调接口",
description = "AGV小车回调接口"
)
public R agvCallback(@RequestBody AGVCallBack agvCallBack ){
public R agvCallback(@RequestBody AGVCallBackDto agvCallBack ){
// 1.参数合法性校验
if (agvCallBack == null || agvCallBack.getTaskCode().trim().isEmpty()) {
return R.fail("任务单号不能为空");

@ -1,22 +1,31 @@
package org.springblade.desk.logistics.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.desk.dashboard.pojo.entity.BsWorkCenterEntity;
import org.springblade.desk.dashboard.service.IBsWorkCenterService;
import org.springblade.desk.dashboard.wrapper.BsWorkCenterWrapper;
import org.springblade.desk.logistics.pojo.entity.BoxBinding;
import org.springblade.desk.device.pojo.entity.EquipmentEntity;
import org.springblade.desk.device.pojo.vo.EquipmentVO;
import org.springblade.desk.logistics.pojo.dto.BoxBindingDto;
import org.springblade.desk.logistics.pojo.dto.TaskDto;
import org.springblade.desk.logistics.pojo.vo.TaskVO;
import org.springblade.desk.logistics.service.IOrderBoxService;
import org.springblade.desk.logistics.service.ITaskService;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.List;
/**
* 订单箱子 控制器
@ -31,6 +40,7 @@ import java.util.List;
public class OrderBoxController extends BladeController {
private final IOrderBoxService iOrderBoxService;
private final IBsWorkCenterService bsWorkCenterService;
private final ITaskService taskService;
@PostMapping("/getWeighing")
@ -70,7 +80,7 @@ public class OrderBoxController extends BladeController {
summary = "绑定箱条码和订单",
description = "绑定箱条码和订单信息内容"
)
public R boxBinding(@RequestBody BoxBinding boxBinding){
public R boxBinding(@RequestBody BoxBindingDto boxBinding){
// 1.参数合法性校验
if (boxBinding == null || boxBinding.getBoxBarcode().trim().isEmpty()) {
return R.fail("箱条码不能为空");
@ -81,6 +91,24 @@ public class OrderBoxController extends BladeController {
return iOrderBoxService.boxBinding(boxBinding);
}
/**
* 任务表 自定义分页
*/
@GetMapping("/page")
@ApiOperationSupport(order = 4)
@Operation(summary = "分页", description = "")
@Parameters({
@Parameter(name = "boxBarcode", description = "箱条码", in = ParameterIn.QUERY, schema = @Schema(type = "String")),
@Parameter(name = "stationId", description = "站点ID", in = ParameterIn.QUERY, schema = @Schema(type = "Long")),
@Parameter(name = "wcId", description = "作业中心ID", in = ParameterIn.QUERY, schema = @Schema(type = "Long")),
@Parameter(name = "taskStatus", description = "当前状态 0:退回(超重) 1:站点 2:库位 3:等待 4:回库 5:结束", in = ParameterIn.QUERY, schema = @Schema(type = "Integer")),
@Parameter(name = "startTime", description = "开始时间", in = ParameterIn.QUERY, schema = @Schema(type = "Date")),
@Parameter(name = "endTime", description = "结束时间", in = ParameterIn.QUERY, schema = @Schema(type = "Date"))
})
public R<IPage<TaskVO>> page(@Parameter(hidden = true) TaskDto taskDto, Query query) {
IPage<TaskVO> pages = taskService.selectPage(Condition.getPage(query), taskDto);
return R.data(pages);
}
}

@ -1,10 +1,26 @@
package org.springblade.desk.logistics.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import org.springblade.desk.device.pojo.entity.EquipmentEntity;
import org.springblade.desk.device.pojo.vo.EquipmentVO;
import org.springblade.desk.logistics.pojo.dto.TaskDto;
import org.springblade.desk.logistics.pojo.entity.Task;
import org.springblade.desk.logistics.pojo.entity.WeighData;
import org.springblade.desk.logistics.pojo.vo.TaskVO;
import java.util.List;
public interface TaskMapper extends BaseMapper<Task> {
Task selectByBoxBarcode(@Param("boxBarcode") String boxBarcode);
/**
* 自定义分页
*
* @param page 分页参数
* @param taskDto 查询参数
* @return List<EquipmentVO>
*/
List<TaskVO> selectEquipmentPage(IPage page, TaskDto taskDto);
}

@ -12,4 +12,35 @@
AND BOX_BARCODE = #{boxBarcode}
AND TASK_STATUS NOT IN (2, 9);
</select>
<select id="selectEquipmentPage" resultType="org.springblade.desk.logistics.pojo.vo.TaskVO">
SELECT *
FROM LM_TASK l
WHERE IS_DELETED = 0
<!-- 修复原代码拼写错误:boxBarcodede → boxBarcode -->
<if test="taskDto.boxBarcode != null and taskDto.boxBarcode != ''">
AND l.BOX_BARCODE LIKE CONCAT('%', #{taskDto.boxBarcode}, '%')
</if>
<!-- wcId 判断 -->
<if test="taskDto.wcId != null and taskDto.wcId != ''">
AND l.WC_ID = #{taskDto.wcId}
</if>
<!-- 站点 判断 -->
<if test="taskDto.stationId != null and taskDto.stationId != ''">
AND l.STATION_ID = #{taskDto.stationId}
</if>
<!-- 状态判断 -->
<if test="taskDto.taskStatus != null and taskDto.taskStatus != ''">
AND l.TASK_STATUS = #{taskDto.taskStatus}
</if>
<!-- 新增:开始时间判断(CREATE_TIME >= 开始时间) -->
<if test="taskDto.startTime != null">
AND l.CREATE_TIME &gt;= #{taskDto.startTime}
</if>
<!-- 新增:结束时间判断(CREATE_TIME <= 结束时间) -->
<if test="taskDto.endTime != null">
AND l.CREATE_TIME &lt;= #{taskDto.endTime}
</if>
ORDER BY l.CREATE_TIME DESC
</select>
</mapper>

@ -1,7 +1,7 @@
package org.springblade.desk.logistics.service;
import org.springblade.core.tool.api.R;
import org.springblade.desk.logistics.pojo.entity.BoxBinding;
import org.springblade.desk.logistics.pojo.dto.BoxBindingDto;
import java.math.BigDecimal;
@ -35,7 +35,7 @@ public interface IOrderBoxService {
* - 成功R.success()携带绑定成功的提示或绑定记录数
* - 失败R.fail()携带失败原因如箱条码不存在订单已绑定唯一约束冲突等
*/
R boxBinding(BoxBinding boxBinding);
R boxBinding(BoxBindingDto boxBinding);
/**
* 箱条码与订单解绑

@ -27,8 +27,8 @@ package org.springblade.desk.logistics.service;
import org.springblade.core.mp.base.BaseService;
import org.springblade.core.tool.api.R;
import org.springblade.desk.logistics.pojo.entity.AGVCallBack;
import org.springblade.desk.logistics.pojo.entity.OrderBind;
import org.springblade.desk.logistics.pojo.dto.AGVCallBackDto;
import org.springblade.desk.logistics.pojo.entity.TaskExecuteRecord;
import org.springblade.desk.logistics.pojo.vo.AgvSchedulingTaskVO;
@ -40,7 +40,7 @@ import org.springblade.desk.logistics.pojo.vo.AgvSchedulingTaskVO;
*/
public interface ITaskExecuteRecordService extends BaseService<TaskExecuteRecord> {
R agvCallback(AGVCallBack agvCallBack);
R agvCallback(AGVCallBackDto agvCallBack);
/**
* 虚拟货架与起点站点信息进行绑定接口
@ -60,7 +60,4 @@ public interface ITaskExecuteRecordService extends BaseService<TaskExecuteRecord
*/
AgvSchedulingTaskVO genAgvSchedulingTask(String taskTyp, String startPos, String endPos, String type);
}

@ -25,8 +25,11 @@
*/
package org.springblade.desk.logistics.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseService;
import org.springblade.desk.logistics.pojo.dto.TaskDto;
import org.springblade.desk.logistics.pojo.entity.Task;
import org.springblade.desk.logistics.pojo.vo.TaskVO;
import java.math.BigDecimal;
@ -52,4 +55,6 @@ public interface ITaskService extends BaseService<Task> {
* @return
*/
Task getBoxBarcode(String boxBarcode);
IPage<TaskVO> selectPage(IPage<TaskVO> page, TaskDto taskDto);
}

@ -26,13 +26,8 @@
package org.springblade.desk.logistics.service;
import org.springblade.core.mp.base.BaseService;
import org.springblade.core.tool.api.R;
import org.springblade.desk.logistics.pojo.entity.AGVCallBack;
import org.springblade.desk.logistics.pojo.entity.TaskExecuteRecord;
import org.springblade.desk.logistics.pojo.entity.VirtualShelves;
import java.util.List;
/**
* 虚拟货架 服务类
*

@ -5,11 +5,11 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.desk.logistics.pojo.dto.BoxBindingDto;
import org.springblade.desk.logistics.pojo.entity.*;
import org.springblade.desk.logistics.service.*;
import org.springblade.desk.order.pojo.entity.YieldOrder;
import org.springblade.desk.order.service.IYieldOrderService;
import org.springblade.system.pojo.entity.AuthClient;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@ -19,7 +19,6 @@ import java.util.stream.Collectors;
import static org.springblade.desk.logistics.pojo.entity.OrderBind.STATUS_UNBINDED;
import static org.springblade.desk.logistics.pojo.entity.Station.STATUS_OCCUPIED;
import static org.springblade.desk.logistics.pojo.entity.Task.STATUS_FINISHED;
/**
* 订单箱业务实现类
@ -120,7 +119,7 @@ public class IOrderBoxServiceImpl implements IOrderBoxService {
* - 失败R.fail()携带具体失败原因如参数为空订单已绑定重量超限等
*/
@Override
public R boxBinding(BoxBinding boxBinding) {
public R boxBinding(BoxBindingDto boxBinding) {
log.info("接收到箱绑定实际参数:{}", boxBinding);
// 1. 入参非空校验(基础防护)
@ -309,12 +308,12 @@ public class IOrderBoxServiceImpl implements IOrderBoxService {
}
// 2. 站点无可用则查询可用库位(状态为占用的库位)
List<Location> locationList = iLocationService.list(new LambdaQueryWrapper<Location>().eq(Location::getLocationStatus, Location.STATUS_OCCUPIED));
List<Location> locationList = iLocationService.list(new LambdaQueryWrapper<Location>().eq(Location::getLocationStatus, Location.STATUS_FREE));
if (!CollectionUtils.isEmpty(locationList)) {
task.setLocationId(locationList.get(0).getId()); // 分配第一个可用库位
// 更新库位状态为空闲(锁定库位)
Location location = locationList.get(0);
location.setLocationStatus(Location.STATUS_FREE);
location.setLocationStatus(Location.STATUS_OCCUPIED);
iLocationService.updateById(location);
return R.data(task);
}

@ -1,50 +1,185 @@
package org.springblade.desk.logistics.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springblade.desk.logistics.pojo.entity.Location;
import org.springblade.desk.logistics.pojo.entity.Station;
import org.springblade.desk.logistics.pojo.entity.Task;
import org.springblade.desk.logistics.service.ILocationService;
import org.springblade.desk.logistics.service.IStationService;
import org.springblade.desk.logistics.service.IStorageMonitoringService;
import org.springblade.desk.logistics.service.ITaskService;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.util.HashSet;
import java.util.Set;
import java.util.List;
@Service
/**
* 仓储监控服务实现类
* <p>
* 核心业务
* 1. 定时每5秒扫描系统中所有空闲状态的站点
* 2. 为每个空闲站点匹配最早创建的待库位任务
* 3. 更新任务关联库位为空闲状态并绑定站点与任务关系
* 4. 触发AGV小车移动指令待实现
* <p>
* 设计思路
* - 采用定时任务自动巡检减少人工干预
* - 按任务创建时间升序匹配保证任务执行的公平性
* - 增加多层空值防护和状态校验避免无效数据库操作
*
* @author 可补充作者信息
* @date 2026-03-05
* @version 1.0
*/
@Service // Spring业务层注解,将类注册为Spring Bean
@Slf4j // Lombok日志注解,自动生成log对象,无需手动创建Logger
public class StorageMonitoringServiceImpl implements IStorageMonitoringService {
private static final Set<Integer> RUNNING_STATUSES = new HashSet<>();
static {
// 初始化运行中任务状态
RUNNING_STATUSES.add(Task.STATUS_START); // 任务启动
RUNNING_STATUSES.add(Task.STATUS_CONVEYOR_START); // 输送机启动
RUNNING_STATUSES.add(Task.STATUS_CONVEYOR_END); // 输送机结束
RUNNING_STATUSES.add(Task.STATUS_STATION); // 站点状态
RUNNING_STATUSES.add(Task.STATUS_LOCATION); // 库位状态
RUNNING_STATUSES.add(Task.STATUS_WAITING); // 等待状态
RUNNING_STATUSES.add(Task.STATUS_STATION_RECEIVE);// 站点接收
RUNNING_STATUSES.add(Task.STATUS_BACK_TO_STORAGE);// 返库状态
}
/**
* 任务服务处理箱绑定任务的创建状态更新删除等
* 任务业务服务提供任务的CRUD状态查询条件筛选等操作
*/
private final ITaskService iTaskService;
private final ITaskService taskService;
/**
* 站点服务处理站点状态占用/空闲管理
* 站点业务服务提供站点状态管理站点信息查询等操作
*/
private final IStationService iStationService;
private final IStationService stationService;
/**
* 库位服务处理库位状态占用/空闲管理
* 库位业务服务提供库位状态更新库位信息查询等操作
*/
private final ILocationService iLocationService;
public StorageMonitoringServiceImpl(ITaskService iTaskService, IStationService iStationService, ILocationService iLocationService) {
this.iTaskService = iTaskService;
this.iStationService = iStationService;
this.iLocationService = iLocationService;
private final ILocationService locationService;
/**
* 构造器注入依赖Spring官方推荐方式
* <p>
* 优势
* 1. 强制依赖注入避免NPE空指针异常
* 2. 便于单元测试时模拟依赖
* 3. 符合依赖倒置原则降低耦合
*
* @param taskService 任务服务BeanSpring自动注入
* @param stationService 站点服务BeanSpring自动注入
* @param locationService 库位服务BeanSpring自动注入
*/
public StorageMonitoringServiceImpl(ITaskService taskService, IStationService stationService, ILocationService locationService) {
this.taskService = taskService;
this.stationService = stationService;
this.locationService = locationService;
}
@Override
/**
* 仓储空闲站点监控核心方法定时执行
* <p>
* 执行频率每5秒执行一次
* 核心流程
* 1. 拉取全量空闲状态的站点列表
* 2. 遍历每个空闲站点匹配对应工位的待库位任务
* 3. 对首个任务关联的库位执行置为空闲操作
* 4. 绑定任务与站点关系更新站点预占用状态
* 5. 触发AGV小车移动指令待实现
* <p>
* 异常防护
* - 空集合直接返回避免循环空指针
* - 库位ID/任务/库位信息空值校验跳过异常数据
* - 状态未变化时跳过更新减少数据库IO
*/
@Scheduled(cron = "*/5 * * * * ?") // Spring定时任务注解,cron表达式控制执行频率
@Override // 实现IStorageMonitoringService接口的抽象方法
public void monitoringStation() {
// ========== 步骤1:查询所有空闲状态的站点 ==========
List<Station> stationList = stationService.list(
new LambdaQueryWrapper<Station>()
.eq(Station::getStationStatus, Station.STATUS_FREE) // 筛选条件:站点状态为空闲
);
// 日志打印空闲站点数量,便于监控和问题排查
log.info("【仓储监控】定时任务执行 - 查询到空闲站点数量:{}", stationList == null ? 0 : stationList.size());
// 空值防护:无空闲站点时直接返回,避免后续无效操作
if (stationList == null || stationList.isEmpty()) {
log.warn("【仓储监控】定时任务执行 - 未查询到空闲站点,任务提前结束");
return;
}
// ========== 步骤2:遍历空闲站点处理关联任务 ==========
int processedCount = 0; // 统计成功处理的站点数量
for (Station station : stationList) {
// 打印当前处理的站点信息,便于定位单站点异常
log.info("【仓储监控】开始处理站点 - 站点ID:{},工位ID:{}", station.getId(), station.getWcId());
try {
// ========== 步骤2.1:查询对应工位的待库位任务(按创建时间升序) ==========
List<Task> taskList = taskService.list(
new LambdaQueryWrapper<Task>()
.eq(Task::getTaskStatus, Task.STATUS_LOCATION) // 任务状态:待库位
.eq(Task::getWcId, station.getWcId()) // 匹配当前站点的工位ID
.orderByAsc(Task::getCreateTime) // 按创建时间升序,优先处理最早创建的任务
);
// 无待处理任务时跳过当前站点
if (taskList == null || taskList.isEmpty()) {
log.info("【仓储监控】站点ID:{} - 未查询到待库位任务,跳过处理", station.getId());
continue;
}
// ========== 步骤2.2:获取首个任务并校验关联库位ID ==========
Task firstTask = taskList.get(0); // 取最早创建的待库位任务
Long locationId = firstTask.getLocationId(); // 获取任务关联的库位ID
log.info("【仓储监控】站点ID:{} - 匹配到首个待库位任务,任务ID:{},关联库位ID:{}",
station.getId(), firstTask.getId(), locationId);
// 空值防护:库位ID为空时跳过,避免后续查询异常
if (locationId == null) {
log.error("【仓储监控】任务ID:{} - 关联库位ID为空,跳过当前站点处理", firstTask.getId());
continue;
}
// ========== 步骤2.3:查询库位信息并更新状态为空闲 ==========
Location location = locationService.getById(locationId); // 根据库位ID查询库位信息
// 库位不存在时跳过
if (location == null) {
log.error("【仓储监控】库位ID:{} - 库位信息不存在,跳过当前站点处理", locationId);
continue;
}
// 状态校验:库位已为空闲时跳过更新,减少数据库操作
if (Location.STATUS_FREE.equals(location.getLocationStatus())) {
log.info("【仓储监控】库位ID:{} - 已为空闲状态,无需更新", locationId);
} else {
// 更新库位状态为空闲
location.setLocationStatus(Location.STATUS_FREE);
boolean updateResult = locationService.updateById(location);
if (updateResult) {
log.info("【仓储监控】库位ID:{} - 状态更新为空闲成功", locationId);
} else {
log.error("【仓储监控】库位ID:{} - 状态更新为空闲失败,跳过后续操作", locationId);
continue; // 更新失败时不触发AGV指令
}
}
// ========== 步骤2.4:绑定任务与站点关系,更新站点预占用状态 ==========
firstTask.setStationId(station.getId()); // 任务绑定当前站点ID
taskService.updateById(firstTask); // 保存任务关联关系
station.setStationStatus(Station.PRE_STATUS_OCCUPIED); // 站点置为预占用状态
stationService.updateById(station); // 保存站点状态
// ========== 步骤2.5:触发AGV小车移动指令(待实现) ==========
log.info("【仓储监控】站点ID:{} - 准备调用AGV接口,任务ID:{},库位ID:{}",
station.getId(), firstTask.getId(), locationId);
// todo: 调用AGV接口传递任务ID和站点ID,触发小车移动
// agvService.dispatchAgv(firstTask.getId(), station.getId());
processedCount++; // 成功处理计数+1
} catch (Exception e) {
// 单个站点处理异常不影响其他站点,记录异常日志便于排查
log.error("【仓储监控】站点ID:{} - 处理过程中发生异常,跳过当前站点", station.getId(), e);
continue;
}
}
// ========== 任务结束:打印处理结果 ==========
log.info("【仓储监控】定时任务执行完成 - 总计扫描空闲站点:{},成功处理:{}", stationList.size(), processedCount);
}
}
}

@ -1,28 +1,4 @@
/**
* BladeX Commercial License Agreement
* Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
* <p>
* Use of this software is governed by the Commercial License Agreement
* obtained after purchasing a license from BladeX.
* <p>
* 1. This software is for development use only under a valid license
* from BladeX.
* <p>
* 2. Redistribution of this software's source code to any third party
* without a commercial license is strictly prohibited.
* <p>
* 3. Licensees may copyright their own code but cannot use segments
* from this software for such purposes. Copyright of this software
* remains with BladeX.
* <p>
* Using this software signifies agreement to this License, and the software
* must not be used for illegal purposes.
* <p>
* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
* not liable for any claims arising from secondary or illegal development.
* <p>
* Author: Chill Zhuang (bladejava@qq.com)
*/
package org.springblade.desk.logistics.service.impl;
import cn.hutool.core.util.IdUtil;
@ -33,24 +9,26 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.tool.api.R;
import org.springblade.desk.logistics.mapper.OrderBindMapper;
import org.springblade.desk.logistics.mapper.TaskExecuteRecordMapper;
import org.springblade.desk.logistics.pojo.entity.AGVCallBack;
import org.springblade.desk.logistics.pojo.entity.OrderBind;
import org.springblade.desk.logistics.pojo.dto.AGVCallBackDto;
import org.springblade.desk.logistics.pojo.entity.TaskExecuteRecord;
import org.springblade.desk.logistics.pojo.vo.AgvSchedulingTaskVO;
import org.springblade.desk.logistics.service.IOrderBindService;
import org.springblade.desk.logistics.service.ITaskExecuteRecordService;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 物流小车对接实体类 服务实现类
* 物流AGV小车任务执行记录服务实现类
* <p>
* 核心功能
* 1. 处理AGV小车执行任务后的回调通知
* 2. 更新任务执行记录的状态起始/结束位置等关键信息
* 3. 任务完成时触发后续的业务接口调用东哥接口
*
* @author BladeX
* @since 2025-11-12
@ -59,27 +37,88 @@ import java.util.Map;
@Slf4j
public class TaskExecuteRecordServiceImpl extends BaseServiceImpl<TaskExecuteRecordMapper, TaskExecuteRecord> implements ITaskExecuteRecordService {
/**
* AGV小车任务状态回调接口
* <p>
* 处理逻辑
* 1. 接收AGV小车的回调参数记录日志并校验任务单号是否存在
* 2. 清理回调方法名的空格更新任务执行记录的方法字段
* 3. 根据不同的任务状态启动/出仓/结束更新对应的位置信息
* 4. 保存更新后的任务记录失败则返回错误结果
* 5. 任务结束时触发东哥接口调用待实现
*
* @param agvCallBack AGV小车回调参数实体包含任务单号执行方法当前位置等信息
* @return R<?> 统一返回结果
* - 成功R.success()
* - 失败R.fail(错误信息)
*/
@Override
public R agvCallback(AGVCallBack agvCallBack) {
log.info("agv小车接口调用参数入参:{}",agvCallBack);
List<TaskExecuteRecord> list = list(new LambdaQueryWrapper<TaskExecuteRecord>().eq(TaskExecuteRecord::getId, agvCallBack.getTaskCode()).orderByDesc(TaskExecuteRecord::getCreateTime));
if (list==null||list.size()==0) {
public R agvCallback(AGVCallBackDto agvCallBack) {
// 记录AGV回调入参,便于问题排查
log.info("agv小车接口调用参数入参:{}", agvCallBack);
// 1. 根据任务单号查询最新的任务执行记录(按创建时间降序,取第一条)
List<TaskExecuteRecord> list = list(
new LambdaQueryWrapper<TaskExecuteRecord>()
.eq(TaskExecuteRecord::getId, agvCallBack.getTaskCode())
.orderByDesc(TaskExecuteRecord::getCreateTime)
);
// 校验:未查询到任务记录,返回失败
if (list == null || list.isEmpty()) {
log.warn("AGV回调失败:未查询到任务单号为{}的执行记录", agvCallBack.getTaskCode());
return R.fail("未查询到该任务单号");
}
// 取最新的任务执行记录
TaskExecuteRecord taskExecuteRecord = list.get(0);
// 2. 清理方法名中的空格(避免因空格导致状态判断错误)
String method = agvCallBack.getMethod().replaceAll(" ", "");
taskExecuteRecord.setMethod(method);
if (!updateById(taskExecuteRecord)) {
// 3. 根据不同的任务状态更新对应的位置信息
switch (method) {
// 任务启动/出仓状态:更新起始位置
case TaskExecuteRecord.STATUS_START:
case TaskExecuteRecord.STATUS_OUTBIN:
taskExecuteRecord.setStartPos(agvCallBack.getCurrentPositionCode());
log.info("任务单号{}:更新起始位置为{},状态为{}",
agvCallBack.getTaskCode(), agvCallBack.getCurrentPositionCode(), method);
break;
// 任务结束状态:更新结束位置
case TaskExecuteRecord.STATUS_END:
taskExecuteRecord.setEndPos(agvCallBack.getCurrentPositionCode());
log.info("任务单号{}:更新结束位置为{},状态为{}",
agvCallBack.getTaskCode(), agvCallBack.getCurrentPositionCode(), method);
break;
// 其他状态:暂不处理位置信息
default:
log.info("任务单号{}:状态{}无需更新位置信息", agvCallBack.getTaskCode(), method);
break;
}
// 4. 保存更新后的任务记录
boolean updateResult = updateById(taskExecuteRecord);
if (!updateResult) {
log.error("AGV回调失败:任务单号{}的执行记录更新保存失败", agvCallBack.getTaskCode());
return R.fail("保存该任务单号失败");
}
// 5. 任务结束状态:触发后续的东哥接口调用(待实现)
if (method.equals(TaskExecuteRecord.STATUS_END)) {
log.info("任务单号{}已完成,准备调用东哥接口", agvCallBack.getTaskCode());
//todo: 调用东哥接口
// eastBrotherService.notifyTaskComplete(agvCallBack.getTaskCode());
}
// 回调处理成功
log.info("AGV回调成功:任务单号{}的执行记录已更新,状态为{}", agvCallBack.getTaskCode(), method);
return R.success();
}
@Override
public boolean boundVirtualShelves(String virtualShelvesCode, String stationCode) {
String url = "http://172.22.252.10:8181/rcms/services/rest/hikRpcService/bindPodAndBerth";
@ -197,3 +236,4 @@ public class TaskExecuteRecordServiceImpl extends BaseServiceImpl<TaskExecuteRec
}

@ -25,16 +25,20 @@
*/
package org.springblade.desk.logistics.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.extern.slf4j.Slf4j;
import org.checkerframework.checker.units.qual.A;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.desk.logistics.mapper.TaskMapper;
import org.springblade.desk.logistics.pojo.dto.TaskDto;
import org.springblade.desk.logistics.pojo.entity.Task;
import org.springblade.desk.logistics.pojo.vo.TaskVO;
import org.springblade.desk.logistics.service.ITaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
/**
* 物流任务 服务类
@ -63,4 +67,10 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
public Task getBoxBarcode(String boxBarcode) {
return taskMapper.selectByBoxBarcode(boxBarcode);
}
@Override
public IPage<TaskVO> selectPage(IPage<TaskVO> page, TaskDto taskDto) {
List<TaskVO> taskVOList = taskMapper.selectEquipmentPage(page, taskDto);
return page.setRecords(taskVOList);
}
}

@ -3,8 +3,11 @@ package org.springblade.desk.produce.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.desk.produce.pojo.entity.MacToolUse;
import org.springblade.desk.produce.pojo.entity.MesQcProduceRunEntity;
import org.springblade.desk.produce.pojo.vo.ProduceMonitorSlotListVO;
import java.util.List;
import java.util.Map;
/**
* 设备工装使用记录 Mapper 接口
@ -15,4 +18,8 @@ public interface MacToolUseMapper extends BaseMapper<MacToolUse> {
MacToolUse getTcDataByWoId(Long woId);
List<MacToolUse> queryMacToolUse(IPage<MacToolUse> page, MacToolUse macToolUse);
List<ProduceMonitorSlotListVO> listSlotInfo(Long id, int isGr, int isCx);
MesQcProduceRunEntity getBoxInfoByWpIdMtnCode(Long id);
}

@ -34,5 +34,56 @@
<select id="queryMacToolUse" resultMap="mesMakeRecResultMap">
select * from MES_MAKE_REC where is_deleted = 0
</select>
<select id="listSlotInfo" resultType="org.springblade.desk.produce.pojo.vo.ProduceMonitorSlotListVO">
SELECT
a.PART_CODE, a.BATCH_NO, a.WORK_QTY, a.area, a.sumArea, a.MTN_CODE, a.PRODUCT_IDENT, a.wo_code, a.material,
a.yield_type
FROM
(
SELECT
d.PART_CODE, c.BATCH_NO, b.WORK_QTY, b.WORK_QTY * d.YP_AREA AS area, sum(b.WORK_QTY * d.YP_AREA) OVER() AS
sumArea,
a.MTN_CODE, d.PRODUCT_IDENT, c.wo_code, f.material, d.yield_type
FROM
MES_MAC_TOOL_USE a
INNER JOIN MES_work_plan b ON a.WP_ID = b.ID
INNER JOIN MES_WORK_ORDER c ON b.WO_ID = c.ID
INNER JOIN MES_YIELD_ORDER d ON c.YO_ID = d.ID
INNER JOIN ds_part f ON d.part_code = f.part_code
WHERE
a.MTN_CODE IN ( SELECT a.MTN_CODE FROM MES_MAC_TOOL_USE a LEFT JOIN MES_EQUIPMENT_CARD b ON a.EQUIPMENT_CARD =
b.ID WHERE a.WP_ID = #{id}
<if test="isCx == 1">AND b.CATEGORYS = '产线设备'</if>
<if test="isGr == 0">) AND a.mtu_index = '2' AND a.BS_FEI_BA_SET IS NOT NULL</if>
<if test="isGr == 1">) AND a.mtu_index = '1' AND b.pps_id = 417</if>
) a
GROUP BY a.PART_CODE, a.BATCH_NO, a.WORK_QTY, a.area, a.sumArea, a.MTN_CODE, a.PRODUCT_IDENT, a.wo_code,
a.material, a.yield_type
</select>
<select id="getBoxInfoByWpIdMtnCode" resultType="org.springblade.desk.produce.pojo.entity.MesQcProduceRunEntity">
SELECT
min(c.IN_DATE) AS inDate,
max(c.OUT_DATE) AS outDate,
'Max:' || max(c.TEMP_SLOT)|| '/' || 'Min:' || min(c.temp_slot) AS tempSlot,
max(c.DEVICE_ID) AS deviceId
FROM
MES_QC_PRODUCE_RUN c
WHERE
c.mtn_code IN
(
SELECT
a.mtn_code
FROM
MES_MAC_TOOL_USE a
LEFT JOIN MES_EQUIPMENT_CARD b ON
a.EQUIPMENT_CARD = b.ID
WHERE
b.CATEGORYS = '烘箱设备'
AND a.WP_ID = #{id})
AND c.work_slot = '烘箱'
ORDER BY
c.IN_DATE DESC
</select>
</mapper>

@ -27,4 +27,5 @@ public interface MesQcProduceRunMapper extends BaseMapper<MesQcProduceRunEntity>
List<MesQcProduceRunVO> selectMesQcProduceRunPage(IPage page, MesQcProduceRunVO mesQcProduceRun);
List<MesQcProduceRunEntity> listPrByWpIdIndex(Long id, int i, int i1);
}

@ -49,7 +49,15 @@
<select id="selectMesQcProduceRunPage" resultMap="mesQcProduceRunResultMap">
select * from MES_QC_PRODUCE_RUN where is_deleted = 0
</select>
<select id="listPrByWpIdIndex" resultType="org.springblade.desk.produce.pojo.entity.MesQcProduceRunEntity">
SELECT * FROM MES_QC_PRODUCE_RUN
WHERE is_deleted = 0 AND mtn_Code IN (
SELECT a.mtn_Code FROM mes_mac_tool_use a WHERE a.wp_id = #{id} AND a.mtu_index = #{i})
<if test="i1 == 1">
AND work_slot != '烘箱'
</if>
ORDER BY mtn_code, id
</select>
</mapper>

@ -3,6 +3,9 @@ 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.entity.MacToolUse;
import org.springblade.desk.produce.pojo.entity.MesQcProduceRunEntity;
import org.springblade.desk.produce.pojo.entity.WorkPlan;
import org.springblade.desk.produce.pojo.vo.ProduceMonitorSlotListVO;
import java.util.List;
@ -31,4 +34,20 @@ public interface IMacToolUseService extends BaseService<MacToolUse> {
IPage<MacToolUse> queryMacToolUse(IPage<MacToolUse> page, MacToolUse macToolUse);
MacToolUse getTcDataByWoId(Long woId);
/**
* 获取工位信息
*
* @param workPlan
* @return
*/
List<ProduceMonitorSlotListVO> listSlotInfo(WorkPlan workPlan);
List<MacToolUse> getDataByWpIdAndIndexList(Long id, String number);
MesQcProduceRunEntity getBoxInfoByWpIdMtnCode(Long id);
MacToolUse getDataByWpIdAndIndex(Long id, String number);
MacToolUse getHangNumIsNull(Long id);
}

@ -5,6 +5,8 @@ import org.springblade.core.mp.base.BaseService;
import org.springblade.desk.produce.pojo.entity.MesQcProduceRunEntity;
import org.springblade.desk.produce.pojo.vo.MesQcProduceRunVO;
import java.util.List;
/**
* 生产追溯 服务类
*
@ -29,4 +31,8 @@ public interface IMesQcProduceRunService extends BaseService<MesQcProduceRunEnti
* @return
*/
boolean getDataByWpIdAndSlot(Long id, String operate);
List<MesQcProduceRunEntity> listPrByWpIdIndexAndMtnCode(List<String> list, String mtnCode);
List<MesQcProduceRunEntity> listPrByWpIdIndex(Long id, int i, Boolean aTrue);
}

@ -5,6 +5,8 @@ import org.springblade.core.mp.base.BaseService;
import org.springblade.desk.produce.pojo.entity.MesRbFilePreserveDetailEntity;
import org.springblade.desk.produce.pojo.vo.MesRbFilePreserveDetailVO;
import java.util.List;
/**
* 热表电子档案维护-明细 服务类
*
@ -21,4 +23,5 @@ public interface IMesRbFilePreserveDetailService extends BaseService<MesRbFilePr
*/
IPage<MesRbFilePreserveDetailVO> selectMesRbFilePreserveDetailPage(IPage<MesRbFilePreserveDetailVO> page, MesRbFilePreserveDetailVO mesRbFilePreserveDetail);
List<MesRbFilePreserveDetailEntity> getByRfpsId(Long id);
}

@ -24,4 +24,5 @@ public interface IMesRbFilePreserveSlotService extends BaseService<MesRbFilePres
*/
IPage<MesRbFilePreserveSlotVO> selectMesRbFilePreserveSlotPage(IPage<MesRbFilePreserveSlotVO> page, MesRbFilePreserveSlotVO mesRbFilePreserveSlot);
List<MesRbFilePreserveSlotEntity> getByRfpId(Long aLong);
}

@ -8,6 +8,7 @@ import org.springblade.desk.produce.pojo.dto.QueryByReadStatusDTO;
import org.springblade.desk.produce.pojo.dto.WorkOrderDTO;
import org.springblade.desk.produce.pojo.entity.WorkOrder;
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.pojo.vo.BatchPrepareVO;
import org.springblade.desk.produce.pojo.vo.QueryByReadStatusVO;
@ -165,4 +166,12 @@ public interface IWorkOrderService extends BaseService<WorkOrder> {
* @param wpId 工单id
*/
ProduceMonitorPlanDataVO getPlanDetail(Long wpId);
/**
* <p>方法名: getProcessByWp </p>
* <p>方法描述: 组装生产追溯数据 </p>
*
* @param workPlan 工单计划
*/
void getProcessByWp(ProduceMonitorPlanDataVO planDataVO, WorkPlan workPlan);
}

@ -1,21 +1,25 @@
package org.springblade.desk.produce.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
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.device.pojo.entity.RackSetEntity;
import org.springblade.desk.device.service.IRackSetService;
import org.springblade.desk.produce.mapper.MacToolUseMapper;
import org.springblade.desk.produce.pojo.entity.MacToolUse;
import org.springblade.desk.produce.pojo.entity.MesQcProduceRunEntity;
import org.springblade.desk.produce.pojo.entity.WorkPlan;
import org.springblade.desk.produce.pojo.vo.ProduceMonitorSlotListVO;
import org.springblade.desk.produce.service.IMacToolUseService;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.*;
import static com.fasterxml.jackson.databind.type.LogicalType.DateTime;
@ -30,6 +34,8 @@ import static com.fasterxml.jackson.databind.type.LogicalType.DateTime;
public class MacToolUseServiceImpl extends BaseServiceImpl<MacToolUseMapper, MacToolUse> implements IMacToolUseService {
private final IRackSetService rackSetService;
private final IBsProcessSetService bsProcessSetService;
@Override
public String nextCode(int i) {
// 编码模式
@ -84,6 +90,43 @@ public class MacToolUseServiceImpl extends BaseServiceImpl<MacToolUseMapper, Mac
return baseMapper.getTcDataByWoId(woId);
}
@Override
public List<ProduceMonitorSlotListVO> listSlotInfo(WorkPlan workPlan) {
BsProcessSetEntity processSet = bsProcessSetService.getById(workPlan.getPpsId());
if ("固溶".equals(processSet.getName())) {
return baseMapper.listSlotInfo(workPlan.getId(), 1, 0);
}
List<ProduceMonitorSlotListVO> slotListVos = baseMapper.listSlotInfo(workPlan.getId(), 0, 1);
if (CollectionUtils.isEmpty(slotListVos)) {
slotListVos = baseMapper.listSlotInfo(workPlan.getId(), 0, 0);
}
return slotListVos;
}
@Override
public List<MacToolUse> getDataByWpIdAndIndexList(Long id, String number) {
return this.list(Wrappers.lambdaQuery(MacToolUse.class).eq(MacToolUse::getWpId, id).eq(MacToolUse::getMtuIndex, number));
}
@Override
public MesQcProduceRunEntity getBoxInfoByWpIdMtnCode(Long id) {
MesQcProduceRunEntity qcProduceRun = baseMapper.getBoxInfoByWpIdMtnCode(id);
qcProduceRun.setWorkSlot("烘干");
return qcProduceRun;
}
@Override
public MacToolUse getDataByWpIdAndIndex(Long id, String number) {
List<MacToolUse> macToolUses = this.list(Wrappers.lambdaQuery(MacToolUse.class).eq(MacToolUse::getWpId, id).eq(MacToolUse::getMtuIndex, number).orderByDesc(MacToolUse::getId));
return CollectionUtils.isNotEmpty(macToolUses) ? macToolUses.get(0) : null;
}
@Override
public MacToolUse getHangNumIsNull(Long id) {
List<MacToolUse> macToolUses = this.list(Wrappers.lambdaQuery(MacToolUse.class).eq(MacToolUse::getWpId, id).isNotNull(MacToolUse::getHangNum));
return CollectionUtils.isNotEmpty(macToolUses) ? macToolUses.get(0) : null;
}
public static final int time2Integer(Date d) {
Calendar cal = Calendar.getInstance();
cal.setTime(d);

@ -1,5 +1,6 @@
package org.springblade.desk.produce.service.impl;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import jodd.bean.BeanUtil;
@ -217,8 +218,7 @@ public class MakeRecServiceImpl extends BaseServiceImpl<MakeRecMapper, MakeRec>
MesQcProduceRunEntity qcProduceRun = new MesQcProduceRunEntity();
qcProduceRun.setMtnCode(code);
qcProduceRun.setWorkSlot("热处理自检");
qcProduceRun.setInDate(new Date());
qcProduceRun.setInDate(DateUtil.now());
qcProduceRun.setDataOne(makeRecDTO.getResource());
qcProduceRun.setDataTwo(makeRecDTO.getNum());
qcProduceRun.setDataThree(makeRecDTO.getThickness());

@ -35,5 +35,14 @@ public class MesQcProduceRunServiceImpl extends BaseServiceImpl<MesQcProduceRunM
return false;
}
@Override
public List<MesQcProduceRunEntity> listPrByWpIdIndexAndMtnCode(List<String> list, String mtnCode) {
return this.list(Wrappers.lambdaQuery(MesQcProduceRunEntity.class).eq(MesQcProduceRunEntity::getMtnCode, mtnCode).in(MesQcProduceRunEntity::getMtnCode, list));
}
@Override
public List<MesQcProduceRunEntity> listPrByWpIdIndex(Long id, int i, Boolean aTrue) {
return baseMapper.listPrByWpIdIndex(id, i, aTrue ? 1 : 0);
}
}

@ -1,6 +1,7 @@
package org.springblade.desk.produce.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.desk.produce.mapper.MesRbFilePreserveDetailMapper;
import org.springblade.desk.produce.pojo.entity.MesRbFilePreserveDetailEntity;
@ -8,6 +9,8 @@ import org.springblade.desk.produce.pojo.vo.MesRbFilePreserveDetailVO;
import org.springblade.desk.produce.service.IMesRbFilePreserveDetailService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 热表电子档案维护-明细 服务实现类
*
@ -22,5 +25,10 @@ public class MesRbFilePreserveDetailServiceImpl extends BaseServiceImpl<MesRbFil
return page.setRecords(baseMapper.selectMesRbFilePreserveDetailPage(page, mesRbFilePreserveDetail));
}
@Override
public List<MesRbFilePreserveDetailEntity> getByRfpsId(Long id) {
return this.list(Wrappers.lambdaQuery(MesRbFilePreserveDetailEntity.class).eq(MesRbFilePreserveDetailEntity::getRfpsId, id).orderByAsc(MesRbFilePreserveDetailEntity::getDetailIndex));
}
}

@ -1,5 +1,6 @@
package org.springblade.desk.produce.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springblade.desk.produce.mapper.MesRbFilePreserveSlotMapper;
import org.springblade.desk.produce.pojo.entity.MesRbFilePreserveSlotEntity;
import org.springblade.desk.produce.pojo.vo.MesRbFilePreserveSlotVO;
@ -24,6 +25,10 @@ public class MesRbFilePreserveSlotServiceImpl extends BaseServiceImpl<MesRbFileP
return page.setRecords(baseMapper.selectMesRbFilePreserveSlotPage(page, mesRbFilePreserveSlot));
}
@Override
public List<MesRbFilePreserveSlotEntity> getByRfpId(Long aLong) {
return this.list(Wrappers.lambdaQuery(MesRbFilePreserveSlotEntity.class).eq(MesRbFilePreserveSlotEntity::getRfpId, aLong));
}
}

@ -1,5 +1,6 @@
package org.springblade.desk.produce.service.impl;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.BeanUtils;
@ -37,7 +38,9 @@ import org.springblade.desk.quality.service.IWorkPlanItemService;
import org.springblade.scheduling.pojo.entity.ProcessSetEntity;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@ -271,7 +274,7 @@ public class PdaSaveServiceImpl extends BaseServiceImpl<WorkPlanMapper, WorkPlan
qcProduceRun = new MesQcProduceRunEntity();
qcProduceRun.setMtnCode(code);
qcProduceRun.setDeviceId(equipmentCard != null ? equipmentCard.getDeviceCode() : "");
qcProduceRun.setInDate(new Date());
qcProduceRun.setInDate(new Date().toString());
qcProduceRun.setCreateMan(String.valueOf(AuthUtil.getUser().getUserId()));
qcProduceRun.setCreateTime(nowDate);
// 操作的步骤
@ -319,8 +322,9 @@ public class PdaSaveServiceImpl extends BaseServiceImpl<WorkPlanMapper, WorkPlan
@Override
public void unBind(UnBingVo unBingVo) {
if (StringUtils.isBlank(unBingVo.getRsCode()) && StringUtils.isBlank(unBingVo.getFsCode()) && StringUtils.isBlank(unBingVo.getDeviceCode()))
if (StringUtils.isBlank(unBingVo.getRsCode()) && StringUtils.isBlank(unBingVo.getFsCode()) && StringUtils.isBlank(unBingVo.getDeviceCode())) {
return;
}
// 查询挂具
RackSetEntity bsRackSet = rackSetService.getOne(Wrappers.<RackSetEntity>lambdaQuery().eq(RackSetEntity::getRsCode, unBingVo.getRsCode()));
// 查询飞靶
@ -364,7 +368,6 @@ public class PdaSaveServiceImpl extends BaseServiceImpl<WorkPlanMapper, WorkPlan
@Override
public void sjDeviceUnBind(UnBingDeviceVo unBingDeviceVo) {
for (PrMacTooUseSpec prMacTooUseSpec : unBingDeviceVo.getList()) {
MacToolUse prMacToolUse = macToolUseService.getById(Long.valueOf(prMacTooUseSpec.getMtuId()));
@ -380,12 +383,12 @@ public class PdaSaveServiceImpl extends BaseServiceImpl<WorkPlanMapper, WorkPlan
}
if (qcProduceRuns != null && qcProduceRuns.size() > 0) {
for (MesQcProduceRunEntity qcProduceRun : qcProduceRuns) {
qcProduceRun.setOutDate(new Date());
qcProduceRun.setOutDate(DateUtil.now());
if (unBingDeviceVo.getOneData() != null) {
qcProduceRun.setDataThirteen(new Date()); // 保温开始时间
qcProduceRun.setDataThirteen(DateUtil.now()); // 保温开始时间
}
if (unBingDeviceVo.getThreeData() != null) {
qcProduceRun.setDataTwelve(new Date()); // 保温结束时间
qcProduceRun.setDataTwelve(DateUtil.now()); // 保温结束时间
}
qcProduceRun.setTempSlot(unBingDeviceVo.getTempSlot()); // 退火温度
qcProduceRun.setDataFourteen(unBingDeviceVo.getDataFourteen()); // 退火温度

@ -21,9 +21,17 @@ import org.springblade.core.tool.utils.StringUtil;
import org.springblade.desk.basic.constant.FlowConst;
import org.springblade.desk.basic.service.IProcessAbilityService;
import org.springblade.desk.dashboard.pojo.entity.BsProcessSetEntity;
import org.springblade.desk.dashboard.pojo.entity.BsTeamSetEntity;
import org.springblade.desk.dashboard.pojo.entity.DsPartEntity;
import org.springblade.desk.dashboard.service.IBsProcessSetService;
import org.springblade.desk.dashboard.service.IBsTeamSetService;
import org.springblade.desk.dashboard.service.IDsPartService;
import org.springblade.desk.device.pojo.entity.EquipmentEntity;
import org.springblade.desk.device.pojo.entity.FeiBaSetEntity;
import org.springblade.desk.device.pojo.entity.RackSetEntity;
import org.springblade.desk.device.service.IEquipmentService;
import org.springblade.desk.device.service.IFeiBaSetService;
import org.springblade.desk.device.service.IRackSetService;
import org.springblade.desk.order.mapper.YieldOrderMapper;
import org.springblade.desk.order.pojo.entity.YieldOrder;
import org.springblade.desk.order.pojo.enums.YieldOrderEnum;
@ -41,8 +49,11 @@ import org.springblade.desk.produce.pojo.vo.*;
import org.springblade.desk.produce.service.*;
import org.springblade.desk.quality.pojo.entity.InspectionTask;
import org.springblade.desk.quality.pojo.entity.PlanTest;
import org.springblade.desk.quality.pojo.entity.ProReTemplate;
import org.springblade.desk.quality.pojo.entity.WorkPlanItem;
import org.springblade.desk.quality.service.IInspectionTaskService;
import org.springblade.desk.quality.service.IPlanTestService;
import org.springblade.desk.quality.service.IProReTemplateService;
import org.springblade.desk.quality.service.IWorkPlanItemService;
import org.springblade.scheduling.pojo.entity.WorkOrderEntity;
import org.springblade.erpdata.feign.IErpDataProduceClient;
@ -60,6 +71,7 @@ import java.io.ByteArrayOutputStream;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
@ -106,6 +118,24 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
private final YieldOrderMapper yieldOrderMapper;
private final IEquipmentService equipmentService;
private final IFeiBaSetService feiBaSetService;
private final IRackSetService rackSetService;
private final IInspectionTaskService inspectionTaskService;
private final IBsTeamSetService teamSetService;
private final IMesRbFilePreserveSlotService mesRbFilePreserveSlotService;
private final IMesQcProduceRunService qcProduceRunService;
private final IProReTemplateService proReTemplateService;
private final IMesRbFilePreserveDetailService mesRbFilePreserveDetailService;
@Override
public IPage<WorkOrderVO> selectWorkOrderPage(IPage<WorkOrderVO> page, WorkOrderDTO workOrder) {
return page.setRecords(baseMapper.selectWorkOrderPage(page, workOrder));
@ -119,8 +149,8 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
batchPrepareVO.setId(woId);
batchPrepareVO.setYieldOrder(yieldOrder);
batchPrepareVO.setWoCode(this.nextCode(yieldOrder.getYpCode()));
batchPrepareVO.setCardNo(this.nextCardNo(yieldOrder.getYpCode(),workOrder.getCardNo()));
batchPrepareVO.setBatchNo(this.nextBatchNo(yieldOrder.getYpCode(),workOrder.getBatchNo()));
batchPrepareVO.setCardNo(this.nextCardNo(yieldOrder.getYpCode(), workOrder.getCardNo()));
batchPrepareVO.setBatchNo(this.nextBatchNo(yieldOrder.getYpCode(), workOrder.getBatchNo()));
if (workOrder.getMesCardNo() != null) {
batchPrepareVO.setMesCardNo(this.nextMesCardNo(workOrder.getMesCardNo()));
}
@ -164,7 +194,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
List<WorkPlan> wpList = new ArrayList<>(oldList.size());
for (WorkPlan oldWp : oldList) {
WorkPlan wp = new WorkPlan();
BeanUtil.copyProperties(oldWp,wp);
BeanUtil.copyProperties(oldWp, wp);
wp.setId(null);
@ -303,7 +333,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
PlateAround pa = plateAroundMapper.selectOne(Wrappers.lambdaQuery(PlateAround.class).eq(PlateAround::getWpId, wp.getId()).eq(PlateAround::getPaType, PlateAround.BEFORE_PLAT_IN));
if (pa == null) {
//下序外协,当前工序需要镀前入库
throw new ServiceException("未找到工序【"+wp.getPpsId()+"】镀前入库记录,无法转单!");
throw new ServiceException("未找到工序【" + wp.getPpsId() + "】镀前入库记录,无法转单!");
}
}
}
@ -686,6 +716,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
/**
* LocalDateTime Date
*
* @param localDateTime
* @return
*/
@ -834,9 +865,9 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
private String randSn(int randNum) {
StringBuilder t = new StringBuilder();
for(int i = 0; i < randNum; ++i) {
for (int i = 0; i < randNum; ++i) {
double dblRnd = Math.random() * 10.0;
int intRnd = (int)dblRnd;
int intRnd = (int) dblRnd;
t.append(intRnd);
}
return t.toString();
@ -1182,12 +1213,554 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
@Override
public ProduceMonitorPlanDataVO getPlanDetail(Long wpId) {
return null;
ProduceMonitorPlanDataVO planDataVO = new ProduceMonitorPlanDataVO();
// 工序信息
WorkPlan workPlan = workPlanService.getById(wpId);
BeanUtils.copyProperties(workPlan, planDataVO);
// 加工记录
List<MakeRec> makeRecs = makeRecService.list(Wrappers.lambdaQuery(MakeRec.class).eq(MakeRec::getWpId, wpId));
if (CollectionUtils.isNotEmpty(makeRecs)) {
List<ProduceMonitorMakeRecVO> makeRecVos = new ArrayList<>();
for (MakeRec makeRec : makeRecs) {
ProduceMonitorMakeRecVO makeRecVO = new ProduceMonitorMakeRecVO();
BeanUtils.copyProperties(makeRec, makeRecVO);
makeRecVO.setWorker(UserCache.getUser(makeRec.getWorker()) != null ? UserCache.getUser(makeRec.getWorker()).getRealName() : "");
makeRecVos.add(makeRecVO);
}
planDataVO.setMrList(makeRecVos);
}
this.getProcessByWp(planDataVO, workPlan);
// 设备使用详情
List<MacToolUse> macToolUses = macToolUseService.list(Wrappers.lambdaQuery(MacToolUse.class).eq(MacToolUse::getWpId, workPlan.getId()).eq(MacToolUse::getMtuIndex, "2").orderBy(true, true, MacToolUse::getMtnCode));
if (CollectionUtils.isNotEmpty(macToolUses)) {
List<ProduceMonitorMtuListVO> mtuList = new ArrayList<>();
// 设备信息
List<EquipmentEntity> equipmentEntities = equipmentService.listByIds(macToolUses.stream().map(MacToolUse::getEquipmentCard).toList());
Map<Long, EquipmentEntity> equipmentEntityMap = equipmentEntities.stream().collect(Collectors.toMap(EquipmentEntity::getId, eq -> eq));
// 飞靶信息
List<FeiBaSetEntity> feiBaSetEntities = feiBaSetService.listByIds(macToolUses.stream().map(MacToolUse::getBsFeiBaSet).toList());
Map<Long, FeiBaSetEntity> feiBaSetEntityMap = feiBaSetEntities.stream().collect(Collectors.toMap(FeiBaSetEntity::getId, fb -> fb));
// 挂具信息
List<RackSetEntity> rackSetEntities = rackSetService.listByIds(macToolUses.stream().map(MacToolUse::getBsRackSet).toList());
Map<Long, RackSetEntity> rackSetEntityMap = rackSetEntities.stream().collect(Collectors.toMap(RackSetEntity::getId, rack -> rack));
for (MacToolUse macToolUse : macToolUses) {
ProduceMonitorMtuListVO mtuListVO = new ProduceMonitorMtuListVO();
mtuListVO.setHangNum(macToolUse.getHangNum());
mtuListVO.setRsCode(rackSetEntityMap.get(macToolUse.getBsRackSet()) != null ? rackSetEntityMap.get(macToolUse.getBsRackSet()).getRsCode() : "");
mtuListVO.setFsCode(feiBaSetEntityMap.get(macToolUse.getBsFeiBaSet()) != null ? feiBaSetEntityMap.get(macToolUse.getBsFeiBaSet()).getFsCode() : "");
mtuListVO.setDeviceCode(equipmentEntityMap.get(macToolUse.getEquipmentCard()) != null ? equipmentEntityMap.get(macToolUse.getEquipmentCard()).getDeviceName() : "");
mtuList.add(mtuListVO);
}
planDataVO.setMtuList(mtuList);
}
// 检验记录
InspectionTask prWorkCheckByWpId = inspectionTaskService.getPrWorkCheckByWpId(wpId);
ProduceMonitorWorkCheckVO workCheckVO = new ProduceMonitorWorkCheckVO();
BeanUtils.copyProperties(prWorkCheckByWpId, workCheckVO);
planDataVO.setPrWorkCheck(workCheckVO);
// 转试记录
List<PlanTest> planTests = planTestService.list(Wrappers.lambdaQuery(PlanTest.class).eq(PlanTest::getWpId, wpId));
if (CollectionUtils.isNotEmpty(planTests)) {
planDataVO.setTrialItemList(planTests);
}
// 检验项目
List<WorkPlanItem> workPlanItems = workPlanItemService.list(Wrappers.lambdaQuery(WorkPlanItem.class).eq(WorkPlanItem::getWpId, wpId));
if (CollectionUtils.isNotEmpty(workPlanItems)) {
List<ProduceMonitorPlanItemVO> itemVos = new ArrayList<>();
for (WorkPlanItem workPlanItem : workPlanItems) {
ProduceMonitorPlanItemVO itemVO = new ProduceMonitorPlanItemVO();
BeanUtils.copyProperties(workPlanItem, itemVO);
itemVO.setCheckMan(UserCache.getUser(workPlanItem.getCheckUserId()) != null ? UserCache.getUser(workPlanItem.getCheckUserId()).getRealName() : "");
itemVos.add(itemVO);
}
planDataVO.setItemList(itemVos);
}
return planDataVO;
}
@Override
public void getProcessByWp(ProduceMonitorPlanDataVO planDataVO, WorkPlan workPlan) {
List<MesQcProduceRunEntity> qcProduceRunsList;
if (WorkPlan.PRINT_TYPE_PROCESS.equals(workPlan.getPrintType())) {
// 同槽信息
planDataVO.setSlotList(macToolUseService.listSlotInfo(workPlan));
// 过程质量记录
List<ProduceMonitorFileSlotVO> dsRbFilePreserveSlotList = new ArrayList<>();
BsTeamSetEntity bsTeamSet = teamSetService.getById(workPlan.getMakeTeam());
if (bsTeamSet != null) {
MacToolUse prMacToolUse;
List<MesRbFilePreserveSlotEntity> preserveSlotList;
MesQcProduceRunEntity boxInfo;
// 根据电子档案维护组装数据(上线前) 分槽
List<MacToolUse> dataByWpIdAndIndexList = macToolUseService.getDataByWpIdAndIndexList(workPlan.getId(), "1");
if (CollectionUtils.isNotEmpty(dataByWpIdAndIndexList)) {
for (MacToolUse prMacToolUseItem : dataByWpIdAndIndexList) {
if (prMacToolUseItem != null && prMacToolUseItem.getId() != null) {
// 获取模板数据
preserveSlotList = mesRbFilePreserveSlotService.getByRfpId(Long.valueOf(prMacToolUseItem.getRfpId()));
qcProduceRunsList = qcProduceRunService.listPrByWpIdIndexAndMtnCode(dataByWpIdAndIndexList.stream().map(MacToolUse::getMtnCode).toList(), prMacToolUseItem.getMtnCode());
// 烘箱信息(从设备,工装使用记录获取)
boxInfo = macToolUseService.getBoxInfoByWpIdMtnCode(workPlan.getId());
if (boxInfo.getInDate() != null) {
qcProduceRunsList.add(boxInfo);
}
if (qcProduceRunsList != null && !qcProduceRunsList.isEmpty()) {
// 2025-07-23 线上迁移修改删除了日志打印
// cdl 20250218 修改分槽同一槽号连续出现
this.setRbFilePreserveData(preserveSlotList, qcProduceRunsList, workPlan, dsRbFilePreserveSlotList, prMacToolUseItem);
}
}
}
}
// 根据电子档案维护组装数据(自动)
prMacToolUse = macToolUseService.getDataByWpIdAndIndex(workPlan.getId(), "2");
if (prMacToolUse != null && prMacToolUse.getId() != null) {
// 获取模板数据
List<ProReTemplate> dsRbFilePreserveList;
BsProcessSetEntity processSet = bsProcessSetService.getById(workPlan.getPpsId());
if (workPlan.getPpsId() != null && ("喷砂".equals(processSet.getName()) || "涂色标".equals(processSet.getName()))) {
dsRbFilePreserveList = proReTemplateService.getDataByWcIdAndPpsId(null, workPlan.getPpsId(), Boolean.TRUE);
} else {
dsRbFilePreserveList = proReTemplateService.getDataByWcIdAndPpsId(bsTeamSet.getWcId(), workPlan.getPpsId(), Boolean.TRUE);
}
if (dsRbFilePreserveList != null && !dsRbFilePreserveList.isEmpty()) {
preserveSlotList = mesRbFilePreserveSlotService.getByRfpId(dsRbFilePreserveList.get(0).getId());
qcProduceRunsList = qcProduceRunService.listPrByWpIdIndex(workPlan.getId(), 2, Boolean.TRUE);
// 烘箱信息(从设备,工装使用记录获取)
boxInfo = macToolUseService.getBoxInfoByWpIdMtnCode(workPlan.getId());
if (qcProduceRunsList != null && !qcProduceRunsList.isEmpty() && boxInfo.getInDate() != null) {
qcProduceRunsList.add(boxInfo);
}
if (qcProduceRunsList != null && !qcProduceRunsList.isEmpty()) {
// cdl 20250218 修改分槽同一槽号连续出现
this.setRbFilePreserveData(preserveSlotList, qcProduceRunsList, workPlan, dsRbFilePreserveSlotList, prMacToolUse);
}
}
// 获取额外面积数据
// BsAdditionalMess dataByMtuCode = bsAdditionalMessDao.getDataByOneData(prMacToolUse.getMtnCode(), BsAdditionalMess.TYPE_ONE);
// workPlan.setBsAdditionalMess(dataByMtuCode);
}
// 根据电子档案维护组装数据(线下)
//zxh 20250117 解决单工序绑定两个手动记录只显示一个问题
List<MacToolUse> prMacToolUseList = macToolUseService.getDataByWpIdAndIndexList(workPlan.getId(), "3");
if (prMacToolUseList != null && !prMacToolUseList.isEmpty()) {
for (MacToolUse prMacToolUseSd : prMacToolUseList) {
if (prMacToolUseSd != null && prMacToolUseSd.getId() != null) {
// 获取模板数据
preserveSlotList = mesRbFilePreserveSlotService.getByRfpId(Long.valueOf(prMacToolUseSd.getRfpId()));
qcProduceRunsList = qcProduceRunService.listPrByWpIdIndexAndMtnCode(prMacToolUseList.stream().map(MacToolUse::getMtnCode).toList(), prMacToolUseSd.getMtnCode());
// 烘箱信息(从设备,工装使用记录获取)
boxInfo = macToolUseService.getBoxInfoByWpIdMtnCode(workPlan.getId());
if (boxInfo.getInDate() != null) {
qcProduceRunsList.add(boxInfo);
}
if (qcProduceRunsList != null && !qcProduceRunsList.isEmpty()) {
// cdl 20250218 修改分槽同一槽号连续出现
this.setRbFilePreserveData(preserveSlotList, qcProduceRunsList, workPlan, dsRbFilePreserveSlotList, prMacToolUseSd);
}
}
}
}
}
planDataVO.setDsRbFilePreserveSlotList(dsRbFilePreserveSlotList);
}
}
private void setRbFilePreserveData(List<MesRbFilePreserveSlotEntity> preserveSlotList, List<MesQcProduceRunEntity> qcProduceRunsList, WorkPlan workPlan, List<ProduceMonitorFileSlotVO> dsRbFilePreserveSlotList, MacToolUse prMacToolUse) {
List<MesRbFilePreserveDetailEntity> dsRbFilePreserveDetailList = null;
ProduceMonitorFileSlotVO newDsRbFilePreserveSlot = null;
MesRbFilePreserveDetailEntity newDsRbFilePreserveDetail = null;
Map<String, MesRbFilePreserveSlotEntity> preserveSlotMap = preserveSlotList.stream().collect(Collectors.toMap(MesRbFilePreserveSlotEntity::getSlotName, java.util.function.Function.identity()));
List<ProduceMonitorFileSlotVO> temporaryList = new ArrayList<>();
for (MesQcProduceRunEntity qcProduceRun : qcProduceRunsList) {
// 根据维护的电子档案的槽号找寻对应生产追溯的的数据
if (StringUtils.isBlank(qcProduceRun.getWorkSlot())) {
continue;
}
MesRbFilePreserveSlotEntity dsRbFilePreserveSlot = preserveSlotMap.get(qcProduceRun.getWorkSlot().trim());
if ("水膜连续性检查".equals(qcProduceRun.getWorkSlot().trim())) {
qcProduceRun.setQualified("1");
}
// cdl 20250218 修改分槽同一槽号连续出现
this.setTemplateData(dsRbFilePreserveSlot, qcProduceRun, newDsRbFilePreserveSlot, dsRbFilePreserveDetailList,
newDsRbFilePreserveDetail, workPlan, temporaryList, prMacToolUse);
}
// 判断是不是自动线并且有水墨连续性
MacToolUse macToolUse = macToolUseService.getHangNumIsNull(workPlan.getId());
if (macToolUse != null && macToolUse.getId() != null) {
List<MesRbFilePreserveSlotEntity> smSlotList = preserveSlotList.stream().filter(i -> i.getSlotName().contains("水膜连续性")).toList();
for (MesRbFilePreserveSlotEntity dsRbFilePreserveSlot : smSlotList) {
if (dsRbFilePreserveSlot.getSlotName().contains("水膜连续性")) {
MesQcProduceRunEntity qcProduceRun = new MesQcProduceRunEntity();
qcProduceRun.setQualified("1");
// cdl 20250218 修改分槽同一槽号连续出现
this.setTemplateData(dsRbFilePreserveSlot, qcProduceRun, newDsRbFilePreserveSlot, dsRbFilePreserveDetailList,
newDsRbFilePreserveDetail, workPlan, temporaryList, prMacToolUse);
}
}
}
dsRbFilePreserveSlotList.addAll(temporaryList.stream().sorted(Comparator.comparing(ProduceMonitorFileSlotVO::getSlotIndex)).toList());
}
private void setTemplateData(MesRbFilePreserveSlotEntity dsRbFilePreserveSlot, MesQcProduceRunEntity qcProduceRun, ProduceMonitorFileSlotVO newDsRbFilePreserveSlot, List<MesRbFilePreserveDetailEntity> dsRbFilePreserveDetailList, MesRbFilePreserveDetailEntity newDsRbFilePreserveDetail, WorkPlan workPlan, List<ProduceMonitorFileSlotVO> temporaryList, MacToolUse prMacToolUse) {
if (dsRbFilePreserveSlot != null && dsRbFilePreserveSlot.getId() != null) {
// Date转String
// 装入槽子对应的信息
newDsRbFilePreserveSlot = new ProduceMonitorFileSlotVO();
newDsRbFilePreserveSlot.setRfpsType(dsRbFilePreserveSlot.getRfpsType());
newDsRbFilePreserveSlot.setInsertIndex(dsRbFilePreserveSlot.getInsertIndex());
newDsRbFilePreserveSlot.setSlotName(dsRbFilePreserveSlot.getSlotName());
newDsRbFilePreserveSlot.setSlotIndex(dsRbFilePreserveSlot.getSlotIndex());
List<MesRbFilePreserveDetailEntity> preserveDetailList = mesRbFilePreserveDetailService.getByRfpsId(dsRbFilePreserveSlot.getId());
if (!preserveDetailList.isEmpty()) {
dsRbFilePreserveDetailList = new ArrayList<>();
for (int i = 0; i < preserveDetailList.size(); i++) {
MesRbFilePreserveDetailEntity dsRbFilePreserveDetail = preserveDetailList.get(i);
Short rfpsType = 0;
if (dsRbFilePreserveDetail != null && dsRbFilePreserveDetail.getRfpsId() != null) {
rfpsType = mesRbFilePreserveSlotService.getById(dsRbFilePreserveDetail.getRfpsId()).getRfpsType();
}
newDsRbFilePreserveDetail = new MesRbFilePreserveDetailEntity();
newDsRbFilePreserveDetail.setDetailName(dsRbFilePreserveDetail.getDetailName());
newDsRbFilePreserveDetail.setDetailIndex(dsRbFilePreserveDetail.getDetailIndex());
// 工艺要求
newDsRbFilePreserveDetail.setAsk(dsRbFilePreserveDetail.getAsk());
newDsRbFilePreserveDetail.setParamName(dsRbFilePreserveDetail.getParamName());
if (i == 0) {
newDsRbFilePreserveDetail.setRfpdTime(qcProduceRun.getInDate());
} else if (i == 1) {
newDsRbFilePreserveDetail.setRfpdTime(qcProduceRun.getOutDate());
}
if (rfpsType == 1) { // 模板一
if (i == 0) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataOne());
} else if (i == 1) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataTwo());
}
} else if (rfpsType == 2) { // 模板二
if (i == 2) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataOne());
}
} else if (rfpsType == 3) { // 模板三
if (i == 2) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataOne());
} else if (i == 3) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataTwo());
}
} else if (rfpsType == 4) { // 模板四
if (i == 0) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataOne());
} else if (i == 1) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataTwo());
} else if (i == 2) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataThree());
}
} else if (rfpsType == 5 || rfpsType == 22) { // 模板五
if (i == 0) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataOne());
} else if (i == 1) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataTwo());
} else if (i == 2) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataThree());
} else if (i == 3) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataFour());
} else if (i == 4) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataFive());
}
} else if (rfpsType == 6) { // 模板六
if (i == 0) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataOne());
} else if (i == 1) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataTwo());
} else if (i == 2) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataThree());
} else if (i == 3) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataFour());
} else if (i == 4) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataFive());
} else if (i == 5) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataSix());
}
} else if (rfpsType == 7) { // 模板七
if (i == 0) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataOne());
}
} else if (rfpsType == 8) { // 模板八
if (i == 0) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataOne());
} else if (i == 1) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataTwo());
}
} else if (rfpsType == 9) { // 模板九
if (i == 2) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataOne());
} else if (i == 3) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataTwo());
} else if (i == 4) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataThree());
}
} else if (rfpsType == 10) { // 模板十
if (i == 0) {
newDsRbFilePreserveDetail.setQualified(qcProduceRun.getQualified());
}
} else if (rfpsType == 11) { // 模板十一
if (i == 2) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataOne());
} else if (i == 3) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataTwo());
}
} else if (rfpsType == 12) { // 模板十二
if (i == 0) {
newDsRbFilePreserveDetail.setRfpdTime(qcProduceRun.getDataOne());
} else if (i == 1) {
newDsRbFilePreserveDetail.setRfpdTime(qcProduceRun.getDataTwo());
} else if (i == 2) {
newDsRbFilePreserveDetail.setRfpdTime(qcProduceRun.getDataThree());
}
} else if (rfpsType == 13) { // 模板十三
if (i == 0) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataOne());
} else if (i == 1) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataTwo());
} else if (i == 2) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataThree());
} else if (i == 3) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataFour());
} else if (i == 4) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataFive());
} else if (i == 5) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataSix());
} else if (i == 6) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataSeven());
} else if (i == 7) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataEight());
} else if (i == 8) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataNine());
} else if (i == 9) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataTen());
}
} else if (rfpsType == 14) { // 模板十四
if (i == 2) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataOne());
} else if (i == 3) {
newDsRbFilePreserveDetail.setRfpdTime(qcProduceRun.getDataTwo());
} else if (i == 4) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataThree());
} else if (i == 5) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataFour());
} else if (i == 6) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataFive());
} else if (i == 7) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataSix());
} else if (i == 8) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataSeven());
} else if (i == 9) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataEight());
} else if (i == 10) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataNine());
} else if (i == 11) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataTen());
}
} else if (rfpsType == 15) { // 模板十五
if (i == 2) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataOne());
} else if (i == 3) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataTwo());
} else if (i == 4) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataThree());
} else if (i == 5) {
newDsRbFilePreserveDetail.setRfpdTime(qcProduceRun.getDataFour());
} else if (i == 6) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataFive());
} else if (i == 7) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataSix());
} else if (i == 8) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataSeven());
} else if (i == 9) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataEight());
} else if (i == 10) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataNine());
} else if (i == 11) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataTen());
} else if (i == 12) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataEleven());
} else if (i == 13) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataTwelve());
}
} else if (rfpsType == 16) { // 模板十六
if (i == 2) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataOne());
} else if (i == 3) {
newDsRbFilePreserveDetail.setRfpdTime(qcProduceRun.getDataTwo());
} else if (i == 4) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataThree());
} else if (i == 5) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataFour());
} else if (i == 6) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataFive());
} else if (i == 7) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataSix());
} else if (i == 8) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataSeven());
} else if (i == 9) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataEight());
} else if (i == 10) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataNine());
} else if (i == 11) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataTen());
} else if (i == 12) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataEleven());
} else if (i == 13) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataTwelve());
} else if (i == 14) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataThirteen());
} else if (i == 15) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataFourteen());
}
} else if (rfpsType == 17) { // 模板十七
if (i == 2) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataOne());
} else if (i == 3) {
newDsRbFilePreserveDetail.setRfpdTime(qcProduceRun.getDataTwo());
} else if (i == 4) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataThree());
} else if (i == 5) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataFour());
} else if (i == 6) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataFive());
} else if (i == 7) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataSix());
}
} else if (rfpsType == 18) { // 模板十八
if (i == 0) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataOne());
}
} else if (rfpsType == 19) { // 模板十九 //zxh 20250519 新增模板19和模板20
if (i == 0) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataOne());
} else if (i == 1) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataTwo());
} else if (i == 2) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataThree());
} else if (i == 3) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataFour());
} else if (i == 4) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataFive());
} else if (i == 5) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataSix());
} else if (i == 6) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataSeven());
} else if (i == 7) {
newDsRbFilePreserveDetail.setRfpdTime(qcProduceRun.getDataEight());
} else if (i == 8) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataNine());
} else if (i == 9) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataTen());
} else if (i == 10) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataEleven());
} else if (i == 11) {
newDsRbFilePreserveDetail.setRfpdTime(qcProduceRun.getDataTwelve());
}
} else if (rfpsType == 20) { // 模板二十
if (i == 0) {
newDsRbFilePreserveDetail.setRfpdTime(qcProduceRun.getInDate());
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getInDate());
} else if (i == 1) {
newDsRbFilePreserveDetail.setRfpdTime(qcProduceRun.getInDate());
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getInDate());
} else if (i == 2) {
newDsRbFilePreserveDetail.setRfpdTime(qcProduceRun.getOutDate());
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getOutDate());
} else if (i == 3) {
newDsRbFilePreserveDetail.setRfpdTime(qcProduceRun.getOutDate());
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getOutDate());
} else if (i == 4) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataFive());
} else if (i == 5) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataSix());
} else if (i == 6) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataSeven());
} else if (i == 7) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataEight());
}
} else if (rfpsType == 21) { // 模板十三
if (i == 0) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataOne());
} else if (i == 1) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataTwo());
} else if (i == 2) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataThree());
} else if (i == 3) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataFour());
} else if (i == 4) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataFive());
} else if (i == 5) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataSix());
} else if (i == 6) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataSeven());
} else if (i == 7) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataEight());
} else if (i == 8) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getDataNine());
}
}
String detailName = dsRbFilePreserveDetail.getDetailName();
if (detailName != null) {
if (detailName.contains("温度")) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getTempSlot());
} else if (detailName.contains("电导率")) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getEleRate());
} else if (detailName.contains("电流") && !(detailName.contains("壳体") || detailName.contains("插针"))) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getEleStream());
} else if (detailName.contains("链速")) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getVSpeed());
} else if (detailName.contains("镍离子")) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getNiValue());
} else if (detailName.contains("pH值")) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getPhValue());
}
//zxh 20250604 新增软起时间和工作电压
else if (detailName.contains("软起时间")) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getSoftWorkTime());
} else if (detailName.contains("工作电压")) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getVoltage());
} else if (detailName.contains("初始电压")) {
newDsRbFilePreserveDetail.setParamValue(qcProduceRun.getStartVol());
}
}
dsRbFilePreserveDetailList.add(newDsRbFilePreserveDetail);
}
newDsRbFilePreserveSlot.setChildrenList(dsRbFilePreserveDetailList);
}
temporaryList.add(newDsRbFilePreserveSlot);
}
}
public String prefix(String stringToFix, String fixChar, int targetLen) {
int len = stringToFix.length();
for(int i = 0; i < targetLen - len; i += fixChar.length()) {
for (int i = 0; i < targetLen - len; i += fixChar.length()) {
stringToFix = fixChar + stringToFix;
}
return stringToFix;

@ -11,6 +11,7 @@ import org.springblade.desk.quality.excel.ProReTemplateExcel;
import org.springblade.desk.quality.pojo.entity.ProReTemplate;
import org.springblade.desk.quality.pojo.vo.ProReTemplateVO;
import java.math.BigDecimal;
import java.util.List;
/**
@ -51,4 +52,6 @@ public interface IProReTemplateService extends EnBaseService<ProReTemplate> {
R upgradeVer(Long id);
R removeFromDetail(Long tankId);
List<ProReTemplate> getDataByWcIdAndPpsId(BigDecimal wcId, Long ppsId, Boolean aTrue);
}

@ -5,7 +5,9 @@ package org.springblade.desk.quality.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
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.AllArgsConstructor;
import lombok.Data;
@ -29,6 +31,7 @@ import org.springblade.system.feign.ISysClient;
import org.springblade.system.feign.IUserClient;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*;
/**
@ -132,4 +135,14 @@ public class ProReTemplateServiceImpl extends EnBaseServiceImpl<ProReTemplateMap
public R removeFromDetail(Long tankId) {
return R.status(tankService.removeById(tankId));
}
@Override
public List<ProReTemplate> getDataByWcIdAndPpsId(BigDecimal wcId, Long ppsId, Boolean aTrue) {
LambdaQueryWrapper<ProReTemplate> queryWrapper = Wrappers.lambdaQuery(ProReTemplate.class);
queryWrapper.eq(wcId != null, ProReTemplate::getWcId, wcId);
queryWrapper.eq(ProReTemplate::getPpsId, ppsId);
queryWrapper.eq(ProReTemplate::getLine, aTrue ? "0" : "1");
queryWrapper.eq(ProReTemplate::getStatus, 2);
return this.list(queryWrapper);
}
}

Loading…
Cancel
Save