Merge remote-tracking branch 'origin/master'

# Conflicts:
#	doc/sql/mes/increase-260120.sql
develop-QA
liuqingkun 5 months ago
commit 54c20120f0
  1. 28
      blade-ops/blade-job/src/main/java/org/springblade/job/processor/device/IotEquipmentProcessor.java
  2. 15
      blade-ops/blade-job/src/main/java/org/springblade/job/processor/device/IotFeiBaProcessor.java
  3. 26
      blade-ops/blade-job/src/main/java/org/springblade/job/processor/device/IotRecorderProcessor.java
  4. 17
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/constant/FormulaAviatorConst.java
  5. 4
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/constant/FormulaConst.java
  6. 11
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/vo/PlatingVO.java
  7. 42
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/device/feign/IotEquipmentTaskClient.java
  8. 2
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/device/pojo/entity/RecorderEntity.java
  9. 6
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/constant/InspectionTaskConst.java
  10. 5
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/feign/ICycleTestTaskClient.java
  11. 17
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/feign/ILquidTankTaskClient.java
  12. 10
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/CycleTestTask.java
  13. 9
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/InspectionTask.java
  14. 14
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/request/CycleTestSearch.java
  15. 13
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/request/CycleTestTaskSearch.java
  16. 17
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/request/JobExt.java
  17. 5
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/CycleTestTaskVO.java
  18. 36
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/CycleTestVO.java
  19. 6
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/InspectionTaskDetailVO.java
  20. 31
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/LiquidTankReportDetailVO.java
  21. 9
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/LiquidTankReportVO.java
  22. 25
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpMesRbPacturnrecordClient.java
  23. 25
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpMesRbPartoplinkClient.java
  24. 25
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpMesRbPurtosoClient.java
  25. 27
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpMesRbWoClient.java
  26. 64
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/pojo/dto/table/Prtmsg.java
  27. 163
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/pojo/dto/table/Wo.java
  28. 8
      blade-service/blade-desk/pom.xml
  29. 29
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/aviator/config/AviatorConfig.java
  30. 46
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/aviator/func/CustomFunctionRegistry.java
  31. 32
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/aviator/service/AviatorService.java
  32. 60
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/AviatorController.java
  33. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BasicClazzController.java
  34. 3
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/PlatingController.java
  35. 1
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/ProdMarkController.java
  36. 1
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/RelTeamSetUserController.java
  37. 1
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/TeamSetController.java
  38. 1
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/WorkCenterController.java
  39. 1
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/WorkTankController.java
  40. 26
      blade-service/blade-desk/src/main/java/org/springblade/desk/device/controller/EquipmentController.java
  41. 26
      blade-service/blade-desk/src/main/java/org/springblade/desk/device/controller/FeiBaSetController.java
  42. 4
      blade-service/blade-desk/src/main/java/org/springblade/desk/device/controller/MeasurementRecordsController.java
  43. 26
      blade-service/blade-desk/src/main/java/org/springblade/desk/device/controller/RecorderController.java
  44. 39
      blade-service/blade-desk/src/main/java/org/springblade/desk/device/feign/IotEquipmentTaskClientImpl.java
  45. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/device/service/IMeasurementRecordsService.java
  46. 7
      blade-service/blade-desk/src/main/java/org/springblade/desk/device/service/IRecorderService.java
  47. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/device/service/impl/FeiBaSetServiceImpl.java
  48. 256
      blade-service/blade-desk/src/main/java/org/springblade/desk/device/service/impl/IMeasurementRecordsServiceImpl.java
  49. 409
      blade-service/blade-desk/src/main/java/org/springblade/desk/device/service/impl/RecorderServiceImpl.java
  50. 1
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/AuditFileController.java
  51. 32
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/CycleTestController.java
  52. 10
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/CycleTestItemController.java
  53. 9
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/CycleTestTaskController.java
  54. 309
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/LiquidTankReportController.java
  55. 234
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/excel/CycleTestExcel.java
  56. 4
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/excel/CycleTestItemExcel.java
  57. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/excel/CycleTestTaskExcel.java
  58. 5
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/feign/CycleTestTaskClient.java
  59. 18
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/feign/LiquidTankTaskClient.java
  60. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/CycleTestItemMapper.xml
  61. 6
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/CycleTestMapper.java
  62. 76
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/CycleTestMapper.xml
  63. 32
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/CycleTestTaskMapper.xml
  64. 21
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/CycleTestItemService2.java
  65. 45
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/CycleTestService2.java
  66. 29
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/CycleTestTaskService2.java
  67. 5
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/ICycleTestService.java
  68. 1
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/ILiquidTankReportService.java
  69. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/ILiquidTankTaskCopyService.java
  70. 6
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/ILiquidTankTaskService.java
  71. 32
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/IRelTankReportItemService.java
  72. 15
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/CycleTestServiceImpl.java
  73. 6
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/InspectionTaskServiceImpl.java
  74. 15
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/LiquidTankReportServiceImpl.java
  75. 34
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/LiquidTankTaskCopyServiceImpl.java
  76. 18
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/LiquidTankTaskServiceImpl.java
  77. 41
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/util/JobExtUtil.java
  78. 37
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/wrapper/LiquidTankReportDetailWrapper.java
  79. 8
      blade-service/blade-desk/src/main/resources/application-dev.yml
  80. 25
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/feign/ErpDataSearchClient.java
  81. 22
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpMesRbPkMapper.java
  82. 9
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpMesRbPkMapper.xml
  83. 21
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpMesRbSodelreczgMapper.java
  84. 9
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpMesRbSodelreczgMapper.xml
  85. 23
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpMesRbWoMapper.xml
  86. 14
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/IErpMesRbPkService.java
  87. 14
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/IErpMesRbSodelreczgService.java
  88. 27
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/impl/ErpMesRbPkServiceImpl.java
  89. 29
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/impl/ErpMesRbSodelreczgServiceImpl.java
  90. 15
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/impl/ErpMesRbWoServiceImpl.java
  91. 5
      doc/sql/mes/increase-260120.sql

@ -0,0 +1,28 @@
package org.springblade.job.processor.device;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springblade.desk.device.feign.IotEquipmentTaskClient;
import org.springblade.desk.quality.feign.ILquidTankTaskClient;
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;
import tech.powerjob.worker.log.OmsLogger;
/**
* 同步设备数据任务
*/
@Component
@Slf4j
public class IotEquipmentProcessor implements BasicProcessor {
@Resource
private IotEquipmentTaskClient iotEquipmentTaskClient;
@Override
public ProcessResult process(TaskContext context) throws Exception {
iotEquipmentTaskClient.synchronizeEquipmentTask();
return new ProcessResult(true);
}
}

@ -1,25 +1,26 @@
package org.springblade.job.processor.quality;
package org.springblade.job.processor.device;
import jakarta.annotation.Resource;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springblade.desk.quality.feign.ICycleTestTaskClient;
import org.springblade.desk.device.feign.IotEquipmentTaskClient;
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 CycleTestTaskGenOneTimeProcessor implements BasicProcessor {
public class IotFeiBaProcessor implements BasicProcessor {
@Resource
private ICycleTestTaskClient client;
private IotEquipmentTaskClient iotEquipmentTaskClient;
@Override
public ProcessResult process(TaskContext context) throws Exception {
client.generateOneTime();
iotEquipmentTaskClient.synchronizeFeibaTask();
return new ProcessResult(true);
}
}

@ -0,0 +1,26 @@
package org.springblade.job.processor.device;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springblade.desk.device.feign.IotEquipmentTaskClient;
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
@Slf4j
public class IotRecorderProcessor implements BasicProcessor {
@Resource
private IotEquipmentTaskClient iotEquipmentTaskClient;
@Override
public ProcessResult process(TaskContext context) throws Exception {
iotEquipmentTaskClient.synchronizeRecorderTask();
return new ProcessResult(true);
}
}

@ -0,0 +1,17 @@
package org.springblade.desk.basic.constant;
public interface FormulaAviatorConst {
/**
* 添加点
*/
String ADD = "add";
/**
* 测量值
*/
String TEST = "test";
/**
* 体积
*/
String VOL = "vol";
}

@ -5,9 +5,9 @@ public interface FormulaConst {
/**
*
*/
final Integer TYPE_1 = 1;
Integer TYPE_1 = 1;
/**
*
*/
final Integer TYPE_2 = 2;
Integer TYPE_2 = 2;
}

@ -3,6 +3,7 @@
*/
package org.springblade.desk.basic.pojo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.desk.basic.pojo.entity.Plating;
@ -21,4 +22,14 @@ public class PlatingVO extends Plating {
@Serial
private static final long serialVersionUID = 1L;
/**
* [镀种分类]Name
*/
@Schema(description = "[镀种分类]Name")
private Long bcName;
/**
* [镀种小类]Name
*/
@Schema(description = "[镀种小类]Name")
private Long subClassName;
}

@ -0,0 +1,42 @@
package org.springblade.desk.device.feign;
import org.springblade.core.launch.constant.AppConstant;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(
value = AppConstant.APPLICATION_DESK_NAME
)
/**
* 同步IOT设备相关信息
*/
public interface IotEquipmentTaskClient {
String API_PREFIX = "/feign/device/iot-task";
String SYNCHRONIZE_EQUIPMENT_TASK = API_PREFIX + "/synchronize-equipment-task";
String SYNCHRONIZE_FEIBA_TASK = API_PREFIX + "/synchronize-feiba-task";
String SYNCHRONIZE_RECORDER_TASK = API_PREFIX + "/synchronize-recorder-task";
/**
* 同步设备数据
*/
@GetMapping(SYNCHRONIZE_EQUIPMENT_TASK)
void synchronizeEquipmentTask();
/**
* 同步飞靶数据
*/
@GetMapping(SYNCHRONIZE_FEIBA_TASK)
void synchronizeFeibaTask();
/**
* 同步记录仪记录数据
*/
@GetMapping(SYNCHRONIZE_RECORDER_TASK)
void synchronizeRecorderTask();
}

@ -31,7 +31,7 @@ public class RecorderEntity extends BaseEntity {
* 记录仪
*/
@Schema(description = "记录仪")
private BigDecimal recorder;
private String recorder;
/**
* 记录时间
*/

@ -6,7 +6,6 @@ public interface InspectionTaskConst {
* 热表
*/
Integer FROM_TYPE_RB = 1;
/**
* 烧结
*/
@ -28,4 +27,9 @@ public interface InspectionTaskConst {
* NA
*/
Integer CHECK_RESULT_NA = 3;
/**
* 烧结包装防护
*/
String PROCESS_NAME_SJBZFH = "烧结包装防护";
}

@ -13,8 +13,6 @@ public interface ICycleTestTaskClient {
String GENERATE_AUTO = API_PREFIX + "/generate-auto";
String GENERATE_ONE_TIME = API_PREFIX + "/generate-one-time";
String CHECK_REMIND = API_PREFIX + "/check-redmind";
String CHECK_OUT = API_PREFIX + "/check-out";
@ -22,9 +20,6 @@ public interface ICycleTestTaskClient {
@GetMapping(GENERATE_AUTO)
void generateAuto();
@GetMapping(GENERATE_ONE_TIME)
void generateOneTime();
@GetMapping(CHECK_REMIND)
void checkRemind();

@ -13,13 +13,18 @@ public interface ILquidTankTaskClient {
String API_PREFIX = "/feign/client/qa/lquid-tank-task";
String GENERATE = API_PREFIX + "/generate";
String GENERATE_AUTO = API_PREFIX + "/generate-auto";
String TIMEOUT = API_PREFIX + "/timeout";
String CHECK_REMIND = API_PREFIX + "/check-redmind";
@GetMapping(GENERATE)
public List generate();
String CHECK_OUT = API_PREFIX + "/check-out";
@GetMapping(TIMEOUT)
public List timeout();
@GetMapping(GENERATE_AUTO)
void generateAuto();
@GetMapping(CHECK_REMIND)
void checkRemind();
@GetMapping(CHECK_OUT)
void checkOut();
}

@ -309,4 +309,14 @@ public class CycleTestTask extends BaseEntity {
*/
@Schema(description = "超期原因")
private String reasonForOut;
/**
* 临期天数
*/
@Schema(description = "临期天数")
private Integer dayToPlanedFinish;
/**
* 超期天数
*/
@Schema(description = "超期天数")
private Integer dayToOut;
}

@ -167,6 +167,10 @@ public class InspectionTask extends BaseEntity {
* 接收日期
*/
public static final String COL_RECEIVE_DATE = "RECEIVE_DATE";
/**
* [工序]名称
*/
public static final String COL_PROCESS_NAME = "PROCESS_NAME";
/**
* [检验任务]编码
@ -343,4 +347,9 @@ public class InspectionTask extends BaseEntity {
*/
@Schema(description = "接收日期")
private LocalDateTime receiveDate;
/**
* 工序名称
*/
@Schema(description = "工序名称")
private String processName;
}

@ -0,0 +1,14 @@
package org.springblade.desk.quality.pojo.request;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springblade.desk.quality.pojo.entity.CycleTest;
import org.springblade.desk.quality.pojo.vo.CycleTestVO;
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class CycleTestSearch extends CycleTestVO {
}

@ -30,7 +30,6 @@ public class CycleTestTaskSearch extends CycleTestTask {
private Date createTimeEnd;
@Schema(description = "状态数组")
private List<Integer> statusList;
/**
* [周期试验项目]名称
*/
@ -63,6 +62,18 @@ public class CycleTestTaskSearch extends CycleTestTask {
@JsonDeserialize(using = LocalDateTimeEndOfDayDeserializer.class)
@Schema(description = "一次性任务生成日期-结束")
private LocalDateTime oneTimeGenDateEnd;
/**
* 一次性任务生成日期-开始
*/
@JsonDeserialize(using = DateBeginOfDayDeserializer.class)
@Schema(description = "生成日期-开始")
private Date genDatetimeStart;
/**
* 一次性任务生成日期-结束
*/
@JsonDeserialize(using = DateEndOfDayDeserializer.class)
@Schema(description = "生成日期-结束")
private Date genDatetimeEnd;
/**
* 下发时间-开始
*/

@ -2,17 +2,28 @@ package org.springblade.desk.quality.pojo.request;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Data
@EqualsAndHashCode
@ToString
public class JobExt {
/**
*
*/
public static final Integer WEEK = 1;
/**
*
*/
public static final Integer MONTH = 2;
/**
*
*/
public static final Integer YEAR = 3;
/**
* 自定义CRON
*/
public static final Integer CUSTOM = 4;
/**

@ -3,10 +3,12 @@
*/
package org.springblade.desk.quality.pojo.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.desk.quality.pojo.entity.CycleTestTask;
import org.springblade.desk.util.json.serializer.IntegerAllToStringSerializer;
import java.io.Serial;
import java.time.LocalDateTime;
@ -61,8 +63,9 @@ public class CycleTestTaskVO extends CycleTestTask {
/**
* 临期天数
*/
@JsonSerialize(using = IntegerAllToStringSerializer.class)
@Schema(description = "临期天数")
private String countDayToPlanedFinish;
private Integer countDayToPlanedFinish;
/**
* 填报[附件]附件地址
*/

@ -6,6 +6,7 @@ package org.springblade.desk.quality.pojo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springblade.desk.quality.pojo.entity.CycleTest;
import java.io.Serial;
@ -18,61 +19,34 @@ import java.io.Serial;
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class CycleTestVO extends CycleTest {
@Serial
private static final long serialVersionUID = 1L;
/**
* [周期试验项目]名称
*/
@Schema(description = "[周期试验项目]名称")
private String cycleTestItemName;
/**
* [周期试验项目]试验条件
*/
@Schema(description = "[周期试验项目]试验条件")
private String cycleTestItemCondition;
/**
* [周期试验标准]id
*/
@Schema(description = "[周期试验标准]id")
private Long cycleTestStandardId;
/**
* [周期试验标准]名称
*/
@Schema(description = "[周期试验标准]名称")
private String cycleTestStandardName;
/**
* [周期试验标准][附件]id
*/
@Schema(description = "[周期试验标准][附件]id")
private Long cycleTestStandardAttachId;
/**
* 工艺员[用户]姓名
*/
@Schema(description = "工艺员[用户]姓名")
private String processUserName;
/**
* 试验技术员[用户]姓名
*/
@Schema(description = "试验技术员[用户]姓名")
private String testUserName;
/**
* 更新[用户]姓名
*/
@Schema(description = "更新[用户]姓名")
private String updateUserName;
/**
* 试验件类型 名称
*/
@Schema(description = "试验件类型 名称")
private String testTypeName;
/**
* [周期试验标准]
*/
@Schema(description = "standard")
@Schema(description = "[周期试验标准]")
private CycleTestStandardVO standard;
@Schema(description = "[镀种]多个名称")
private String plateNames;
@Schema(description = "试验周期")
private String jobExtShowText;
}

@ -28,12 +28,6 @@ public class InspectionTaskDetailVO extends InspectionTask {
@Serial
private static final long serialVersionUID = 1L;
/**
* todo:
*/
@Schema(description = "工序名称")
private String processName = "工序名称A";
private InspectionTaskListVO orderInfo;
private List<RemindMsg> remindMsgList;

@ -0,0 +1,31 @@
/**
* Author: Tom Shuo
*/
package org.springblade.desk.quality.pojo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.desk.quality.pojo.entity.LiquidTankReport;
import org.springblade.desk.quality.pojo.entity.LiquidTankTaskCopy;
import java.io.Serial;
import java.util.List;
/**
* [槽液报告] 视图实体类
*
* @author Tom Shuo
* @since 2025-12-18
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class LiquidTankReportDetailVO extends LiquidTankReport {
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "维护人")
private String updateUserRealName;
@Schema(description = "复制槽液任务列表")
private List<LiquidTankTaskCopyVO> copyList;
}

@ -9,6 +9,7 @@ import lombok.EqualsAndHashCode;
import org.springblade.desk.quality.pojo.entity.LiquidTankReport;
import java.io.Serial;
import java.util.List;
/**
* [槽液报告] 视图实体类
@ -19,9 +20,9 @@ import java.io.Serial;
@Data
@EqualsAndHashCode(callSuper = true)
public class LiquidTankReportVO extends LiquidTankReport {
@Serial
private static final long serialVersionUID = 1L;
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "维护人")
private String updateUserRealName;
@Schema(description = "维护人")
private String updateUserRealName;
}

@ -1,28 +1,3 @@
/**
* 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.erpdata.feign;

@ -1,28 +1,3 @@
/**
* 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.erpdata.feign;

@ -1,28 +1,3 @@
/**
* 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.erpdata.feign;

@ -1,35 +1,8 @@
/**
* 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.erpdata.feign;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.launch.constant.AppConstant;
import org.springblade.core.tool.api.R;
import org.springblade.erpdata.pojo.dto.AllocationDTO;
import org.springblade.erpdata.pojo.dto.view.MesRbWo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;

@ -1,11 +1,75 @@
package org.springblade.erpdata.pojo.dto.table;
import lombok.Data;
/**
* 对应ERP中表 t_prtmsg
*
* @author lqk
* @date 2026-01-16 17:32
*/
@Data
public class Prtmsg {
private String prtarea; //面积
private String prtsize; //尺寸
private String prtmeterial; //材料
private String remark; //备注
private String hangflag; //是否挂件0--否,1--是
private String thofpla; //插针面积
private String kdofplat; //镀种
private String filecode; //文件号
private String excsttdate; //下发日期
private String excenddate; //有效截至日期
private String rigidity; //有效日期
private String dorules; //标记要求
private String cfmflag; //审核标记 0 未审核,1已审核
private String cmsign; //标记要求
private String cfmname; //审核人
private String cfmdate; //审核日期
private String chgname; //更改人
private String chgdate; //更改时间
private String zlxx; //质量信息
private String seqrunhr; //工时
private String mtntype; //维护类型:1-正常,2-虚拟零件
private String height; //厚度
private String sdnumber; //色带
private String sbnumber; //色标
private String ispaint; //是否油漆0,否,1,是
private String jtnumber; //箭头
private String mtlspcf; //规格
private String istrialkey; //是否试键位:0,否;1,是
private String iscs; //是否吹沙:0,否;1,是
private String seqrunhrsj; //烧结装配工时
private String isyz; //是否印字:0,否;1,是
}

@ -1,10 +1,173 @@
package org.springblade.erpdata.pojo.dto.table;
import lombok.Data;
/**
* 对应ERP中表 t_wo
*
* @author lqk
* @date 2026-01-16 17:32
*/
@Data
public class Wo {
private String wono; //工作订单
private String splcode; //批次号
private String plnsign; //计划标记
private String qstsign; //实际质量等级
private String invadjcode; //入库单号
private String prtmdept; //主制车间号
private String prtudept; //使用车间号
private String prtno; //物料号
private String pkno; //配料单号
private String woreqdat; //wo需求日期
private String wopordat; //wo下达日期
private String woporqty; //wo需求数量
private String wototqty; //累计完成数量
private String pkflag; //生成配料单标志: ''0'' ''配料 , ''1''未配料
private String wosttdat; //wo实际开工日期
private String worelstat; //wo下达状态: ''0'' 未下达 ''1'' 已正常下达
private String woexcstat; //wo执行状态 ''0'' 执行中,''1''正常完成,''2''欠交完成,''3''超量完成,''4''未执行,''5''脱期完成
private String woclsdat; //wo关闭日期
private String wodueqty; //wo交付数量
private String woboqty; //毛需求数量
private String prtltstat; //提前期状态码: ''0''未检查提前期,''1''满足,''2''不满足
private String sprtstat; //子件可用状态码, ''0''未检查,''1''满足,''2''不满足
private String wotosoil; //车间生成订单so标志: ''0'' 未生成,''1''已生成
private String woenddat; //wo实际完工日期
private String mono; //制造订单号
private String wotopur; //wo生成采购需求计划标记 ''0'' 未生成,''1'' 已生成
private String wotoschdl; //wo生成工序作业单标记 ''0'' 未生成,''1''已生成
private String schdrelstat; //工序作业单下达标记 ''0'' 未下达,''1'' 已下达
private String schdrelname; //工序作业单下达标记
private String schdreldate; //工序作业单下达日期
private String itemno; //项目代码
private String prtlotno; //等级
private String prt_mask; //外协分派标记,0未分派1未分完2已分完
private String invstat; //入库状态 ''0''未入库 ''1''已入库(市场使用)2a毛坯状态1不需要毛坯
private String prtwkccode; //工作中心代码
private String assino; //工作定单满足计算标记,0-未计算,1-已计算
private String remark; //备注
private String mtltmrk; //型号
private String planner; //计划员码
private String chksign; //审核标记 ''0''未审核,''1'' 正式,‘2’临时,‘3’待定,‘4’无图,‘5’有存档工艺,无需晒图 ,‘6’有存档工艺,需晒图 。‘7’需要输入erp信息 ,‘8’生产计划有误 ,‘9’有正式需下临时,不晒图
private String chkman; //审核人
private String chkdate; //审核日期
private String woclsman; //工作订单完工人
private String chqty; //累计领取数
private String prtreqflag; //物料需求上报状态
private String wopowerstatus; //外协计划能力平衡:0未平衡,1正常下达,2超量未下达,3超量下达
private String powerremark; //外协能力平衡结果
private String lackreason; //清欠原因分析,0-尚待确定,1-技术问题,2-报废返修,3-物资采购,4-成件采购,5-生产组织
private String planbedat; //预计开工日期:在下达工作订单时计算,约定‘1111’年份未不满足开工条件
private String planendat; //预计完工日期:在工序作业单生成时计算
private String plndept; //计划部门
private String usedept; //使用部门
private String woaddqty; //加工余量
private String woplanner; //调度员
private String plnarea; //计划加工厂区(0--未定义 1--新区 2--本部)
private String wxduedat; //外协加工实际完成日期
private String plntype; //计划类型
private String shplnflag; //送货计划标记
private String ycckflag; //异常审核标记1、无需审核2、需要审核未审核3、需要审核已审核
private String ycckman; //异常审核人
private String ycckdat; //异常审核日期
private String shdate; //送货时间
private String cfmflag; //机加分厂团队确认标识 0--未确认 1--已确认
private String pkfxflag; //配套分批放行标识 0-未放行 1-放行
private String wxplanner; //外协计划员
private String wxrecdat; //''生产订单接收日期''
private String cancelqty; //返修报废/取消执行数
private String cfmdate; //机加分厂记录工作订单分派日期
private String etlid; //guid,etl使用的唯一性索引列
private String wochkqty; //抽检数
private String id; //新系统同步id
private String dataflag; //新老系统数据标识: 0-老系统,1-新系统
private String specreq; //特殊要求
private String wostopstat; //暂停标记:1-暂停,,2-冻结
private String wostopdat; //暂停日期
private String wocleanremark; //计划清理备注
private String wocleanmtnman; //计划清理备注维护人
private String wocleanmtndate; //计划清理备注维护时间
private String cuscode; //客户代码
private String prtmdeptbranch; //主制车间号对应二级中心
}

@ -110,6 +110,14 @@
<groupId>org.springblade</groupId>
<artifactId>blade-scheduling-api</artifactId>
</dependency>
<!-- Source: https://mvnrepository.com/artifact/com.googlecode.aviator/aviator -->
<!-- SpringBoot 3 + JDK 17 项目必须使用Aviator 5.3.0 及以上版本,低版本存在兼容性和功能限制 -->
<!-- Aviator表达式引擎核心依赖 -->
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>5.4.3</version>
</dependency>
</dependencies>
<build>

@ -0,0 +1,29 @@
package org.springblade.desk.basic.aviator.config;
import com.googlecode.aviator.AviatorEvaluator;
import com.googlecode.aviator.AviatorEvaluatorInstance;
import com.googlecode.aviator.Options;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AviatorConfig {
@Bean
public AviatorEvaluatorInstance aviatorEvaluatorInstance() {
AviatorEvaluatorInstance instance = AviatorEvaluator.newInstance();
// 核心配置项
instance.setOption(Options.USE_USER_ENV_AS_TOP_ENV_DIRECTLY, true); // 环境变量透传
// instance.setOption(Options.MAX_CACHE_SIZE, 2000); // 表达式缓存大小
instance.setOption(Options.TRACE_EVAL, false); // 生产环境关闭追踪
// JDK17+ 优化配置
instance.setOption(Options.OPTIMIZE_LEVEL, AviatorEvaluator.EVAL); // 优化级别
// 开启表达式缓存,提升性能
instance.setCachedExpressionByDefault(true);
// 注册自定义函数(如有)
// instance.addFunction(new YourCustomFunction());
return instance;
}
}

@ -0,0 +1,46 @@
package org.springblade.desk.basic.aviator.func;
import com.googlecode.aviator.AviatorEvaluatorInstance;
import com.googlecode.aviator.runtime.function.AbstractFunction;
import com.googlecode.aviator.runtime.type.AviatorObject;
import com.googlecode.aviator.runtime.type.AviatorString;
import jakarta.annotation.Resource;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
@Data
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
@ToString(callSuper = false)
@Slf4j
public class CustomFunctionRegistry implements InitializingBean {
@Resource
private AviatorEvaluatorInstance aviatorEvaluator;
@Override
public void afterPropertiesSet() throws Exception {
// 注册自定义函数
// 此时 aviatorEvaluator 已被注入
aviatorEvaluator.addFunction(new AbstractFunction() {
@Override
public String getName() {
return "myCustomFunc";
}
@Override
public AviatorObject call(Map<String, Object> env, AviatorObject arg1) {
String value = (String) arg1.getValue(env);
return new AviatorString("自定义结果: " + value);
}
});
}
}

@ -0,0 +1,32 @@
package org.springblade.desk.basic.aviator.service;
import com.googlecode.aviator.AviatorEvaluatorInstance;
import jakarta.annotation.Resource;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service
@Data
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
@ToString(callSuper = false)
@Slf4j
public class AviatorService {
@Resource
private AviatorEvaluatorInstance aviatorEvaluator;
public Object evaluateExpression(String expression, Map<String, Object> variables) {
try {
return aviatorEvaluator.execute(expression, variables);
} catch (Exception e) {
throw new RuntimeException("表达式执行失败: " + e.getMessage(), e);
}
}
}

@ -0,0 +1,60 @@
package org.springblade.desk.basic.controller;
import com.googlecode.aviator.AviatorEvaluatorInstance;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j;
import org.springblade.desk.basic.aviator.service.AviatorService;
import org.springblade.desk.basic.constant.BAModuleConst;
import org.springframework.web.bind.annotation.*;
import java.util.Collections;
import java.util.Map;
@RestController
@RequestMapping(BAModuleConst.CONTROLLER_PREFIX + "/Aviator")
@Data
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
@Slf4j
@Tag(name = "Aviator", description = "Aviator接口")
public class AviatorController {
@Resource
private AviatorService aviatorService;
@Resource
private AviatorEvaluatorInstance aviatorEvaluator;
/**
* {
* "expression": "a + b * (c - d)",
* "variables": {
* "a": 5,
* "b": 2,
* "c": 10,
* "d": 3
* }
* }
*
* @param request
* @return
*/
@PostMapping("/evaluate")
public Object evaluate(@RequestBody Map<String, Object> request) {
String expression = (String) request.get("expression");
Map<String, Object> variables = (Map<String, Object>) request.get("variables");
return aviatorService.evaluateExpression(expression, variables);
}
@GetMapping("/customFunc")
public Object customFunc() {
// 直接使用注册的自定义函数
return aviatorEvaluator.execute(
"myCustomFunc('Hello')",
Collections.emptyMap()
);
}
}

@ -18,6 +18,7 @@ import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j;
import org.springblade.common.constant.CommonConstant;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.excel.util.ExcelUtil;
import org.springblade.core.mp.support.Condition;
@ -116,6 +117,7 @@ public class BasicClazzController extends BladeController {
public R<List<BasicClazzVO>> listForSelectPlatingAssort() {
LambdaQueryWrapper<BasicClazz> qw = Wrappers.lambdaQuery();
qw.eq(BasicClazz::getBizType, BasicClazzConst.TYPE_PLATING_ASSORT);
qw.eq(BasicClazz::getIsDeleted, CommonConstant.DELETE_FALSE);
List<BasicClazz> list = service.list(qw);
List<BasicClazzVO> listVO = BasicClazzWrapper.build().listVO(list);
return R.data(listVO);

@ -35,7 +35,6 @@ import org.springblade.desk.basic.pojo.vo.PlatingVO;
import org.springblade.desk.basic.service.IPlatingService;
import org.springblade.desk.basic.util.ExcelExtUtil;
import org.springblade.desk.basic.wrapper.PlatingWrapper;
import org.springblade.desk.quality.pojo.entity.ReviewDuty;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@ -46,7 +45,7 @@ import java.util.stream.Collectors;
/**
* [镀种] 控制器
*
* mes v1: bs_plating
* @author Tom Shuo
* @since 2026-01-05
*/

@ -41,6 +41,7 @@ import java.util.stream.Collectors;
/**
* [生产标识] 控制器
* mes v1:
*
* @author Tom Shuo
* @since 2025-12-22

@ -41,6 +41,7 @@ import java.util.stream.Collectors;
/**
* [班组用户关联] 控制器
* mes v1: 二期新加
*
* @author Tom Shuo
* @since 2026-01-13

@ -40,6 +40,7 @@ import java.util.Map;
/**
* [班组] 控制器
* mes v1: bs_team_set
*
* @author Tom Shuo
* @since 2025-12-16
*/

@ -40,6 +40,7 @@ import java.util.Map;
/**
* [作业中心] 控制器
* mes v1: bs_work_center
*
* @author Tom Shuo
* @since 2025-12-16
*/

@ -40,6 +40,7 @@ import java.util.Map;
/**
* [作业槽] 控制器
* mes v1:
*
* @author Tom Shuo
* @since 2025-12-16
*/

@ -186,18 +186,18 @@ public class EquipmentController extends BladeController {
ExcelUtil.export(response, "设备信息表数据" + DateUtil.time(), "设备信息表数据表", list, EquipmentExcel.class);
}
@PostConstruct // 项目启动后立即执行一次
public void init() {
regularlyUpdated();
}
/**
* 同步IOT设备数据
* TODO 以后需要交由PowerJob服务统一管理
*/
@Scheduled(cron = "0 0 0/23 * * ?") // 每23小时执行一次
public void regularlyUpdated() {
equipmentService.regularlyUpdated();
}
// @PostConstruct // 项目启动后立即执行一次
// public void init() {
// regularlyUpdated();
// }
//
// /**
// * 同步IOT设备数据
// * TODO 以后需要交由PowerJob服务统一管理
// */
// @Scheduled(cron = "0 0 0/23 * * ?") // 每23小时执行一次
// public void regularlyUpdated() {
// equipmentService.regularlyUpdated();
// }
}

@ -149,17 +149,17 @@ public class FeiBaSetController extends BladeController {
ExcelUtil.export(response, "飞靶设置数据" + DateUtil.time(), "飞靶设置数据表", list, FeiBaSetExcel.class);
}
@PostConstruct // 项目启动后立即执行一次
public void init() {
regularlyUpdated();
}
/**
* 同步IOT飞靶数据
* TODO 以后需要交由PowerJob服务统一管理
*/
@Scheduled(cron = "0 0 0/23 * * ?") // 每23小时执行一次
public void regularlyUpdated() {
feiBaSetService.regularlyUpdated();
}
// @PostConstruct // 项目启动后立即执行一次
// public void init() {
// regularlyUpdated();
// }
//
// /**
// * 同步IOT飞靶数据
// * TODO 以后需要交由PowerJob服务统一管理
// */
// @Scheduled(cron = "0 0 0/23 * * ?") // 每23小时执行一次
// public void regularlyUpdated() {
// feiBaSetService.regularlyUpdated();
// }
}

@ -45,8 +45,8 @@ public class MeasurementRecordsController extends BladeController {
@GetMapping("/page")
@ApiOperationSupport(order = 3)
@Operation(summary = "分页", description = "")
public R<IPage<JSONObject>> page(@RequestParam("cmType") Integer cmType, Query query) {
IPage<JSONObject> pages = iMeasurementRecordsService.selectMeasurementRecordsPage(Condition.getPage(query), cmType);
public R<IPage<MeasurementRecordsEntity>> page(@RequestParam("cmType") Integer cmType, Query query) {
IPage<MeasurementRecordsEntity> pages = iMeasurementRecordsService.selectMeasurementRecordsPage(Condition.getPage(query), cmType);
return R.data(pages);
}

@ -1,9 +1,13 @@
package org.springblade.desk.device.controller;
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 io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import jakarta.annotation.PostConstruct;
import lombok.AllArgsConstructor;
import jakarta.validation.Valid;
@ -16,6 +20,7 @@ import org.springblade.core.tool.utils.Func;
import org.springblade.desk.device.pojo.excel.RecorderExcel;
import org.springblade.desk.device.pojo.request.RecorderQuery;
import org.springblade.desk.device.pojo.vo.LoadRecorderVO;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -64,9 +69,12 @@ public class RecorderController extends BladeController {
@GetMapping("/page")
@ApiOperationSupport(order = 3)
@Operation(summary = "分页", description = "传入recorder")
@Parameters({
@Parameter(name = "recorder", description = "记录仪编码", in = ParameterIn.QUERY, schema = @Schema(type = "string")),
})
public R<IPage<RecorderVO>> page(RecorderVO recorder, Query query) {
IPage<RecorderVO> pages = recorderService.selectRecorderPage(Condition.getPage(query), recorder);
return R.data(pages);
IPage<RecorderEntity> pages = recorderService.selectRecorderPage(Condition.getPage(query), recorder);
return R.data(RecorderWrapper.build().pageVO(pages));
}
/**
@ -137,4 +145,18 @@ public class RecorderController extends BladeController {
ExcelUtil.export(response, "记录仪记录数据" + DateUtil.time(), "记录仪记录数据表", list, RecorderExcel.class);
}
// @PostConstruct // 项目启动后立即执行一次
// public void init() {
// regularlyUpdated();
// }
//
// /**
// * 同步记录仪数据
// * TODO 以后需要交由PowerJob服务统一管理
// */
// @Scheduled(cron = "0 0 0/23 * * ?") // 每23小时执行一次
// public void regularlyUpdated() {
// recorderService.regularlyUpdated();
// }
}

@ -0,0 +1,39 @@
package org.springblade.desk.device.feign;
import io.swagger.v3.oas.annotations.Hidden;
import jakarta.annotation.Resource;
import org.springblade.desk.device.service.IEquipmentService;
import org.springblade.desk.device.service.IFeiBaSetService;
import org.springblade.desk.device.service.IRecorderService;
import org.springblade.desk.quality.feign.IIotThicknessClient;
import org.springblade.desk.quality.service.IotThicknessService2;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Hidden
public class IotEquipmentTaskClientImpl implements IotEquipmentTaskClient {
@Resource
private IEquipmentService equipmentService;
@Resource
private IFeiBaSetService feiBaSetService;
@Resource
private IRecorderService recorderService;
@Override
public void synchronizeEquipmentTask() {
equipmentService.regularlyUpdated();
}
@Override
public void synchronizeFeibaTask() {
feiBaSetService.regularlyUpdated();
}
@Override
public void synchronizeRecorderTask() {
recorderService.regularlyUpdated();
}
}

@ -20,7 +20,7 @@ public interface IMeasurementRecordsService {
* @param cmType 查询参数
* @return IPage<JSONObject>
*/
IPage<JSONObject> selectMeasurementRecordsPage(IPage<JSONObject> page, Integer cmType);
IPage<MeasurementRecordsEntity> selectMeasurementRecordsPage(IPage<MeasurementRecordsEntity> page, Integer cmType);
// /**

@ -25,7 +25,7 @@ public interface IRecorderService extends BaseService<RecorderEntity> {
* @param recorder 查询参数
* @return IPage<RecorderVO>
*/
IPage<RecorderVO> selectRecorderPage(IPage<RecorderVO> page, RecorderVO recorder);
IPage<RecorderEntity> selectRecorderPage(IPage<RecorderEntity> page, RecorderVO recorder);
/**
@ -43,4 +43,9 @@ public interface IRecorderService extends BaseService<RecorderEntity> {
* @return
*/
LoadRecorderVO loadCalRecorder(RecorderQuery recorderQuery);
/**
* 同步记录仪数据
*/
void regularlyUpdated();
}

@ -104,7 +104,7 @@ public class FeiBaSetServiceImpl extends BaseServiceImpl<FeiBaSetMapper, FeiBaSe
JSONObject result = JSONObject.parseObject(responseBody);
log.debug("同步飞靶数据: {}", result.toJSONString());
if (result != null && result.getInteger("code").equals(0)) {
List<JSONObject> jsonList = JSONArray.parseArray(result.getJSONArray("result").toJSONString(), JSONObject.class);
List<JSONObject> jsonList = JSONArray.parseArray(result.getJSONArray("data").toJSONString(), JSONObject.class);
if (jsonList != null && jsonList.size() > 0) {
//接口返回飞靶code即为本系统code
Map<String, JSONObject> equCodeObjectMap = jsonList.stream().collect(Collectors.toMap(

@ -17,6 +17,7 @@ import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@ -32,7 +33,7 @@ public class IMeasurementRecordsServiceImpl implements IMeasurementRecordsServic
private String limsUrl;
@Override
public IPage<JSONObject> selectMeasurementRecordsPage(IPage<JSONObject> page, Integer cmType) {
public IPage<MeasurementRecordsEntity> selectMeasurementRecordsPage(IPage<MeasurementRecordsEntity> page, Integer cmType) {
// 构建请求体JSON
JSONObject requestBody = buildRequestBody(page, cmType);
@ -55,6 +56,7 @@ public class IMeasurementRecordsServiceImpl implements IMeasurementRecordsServic
} catch (Exception e) {
log.error("获取计量记录记录数据接口调用失败: {}", e.getMessage(), e);
List<MeasurementRecordsEntity> entityList1 = new ArrayList<>();
return page.setRecords(List.of()); // 返回空列表而不是null
}
}
@ -62,7 +64,7 @@ public class IMeasurementRecordsServiceImpl implements IMeasurementRecordsServic
/**
* 构建请求体
*/
private JSONObject buildRequestBody(IPage<JSONObject> page, Integer cmType) {
private JSONObject buildRequestBody(IPage<MeasurementRecordsEntity> page, Integer cmType) {
JSONObject requestBody = new JSONObject();
requestBody.put("currPage", page.getCurrent());
requestBody.put("pageSize", page.getSize());
@ -77,12 +79,224 @@ public class IMeasurementRecordsServiceImpl implements IMeasurementRecordsServic
/**
* 处理HTTP响应
*/
private IPage<JSONObject> processResponse(HttpResponse<String> response, IPage<JSONObject> page) {
private IPage<MeasurementRecordsEntity> processResponse(HttpResponse<String> response, IPage<MeasurementRecordsEntity> page) {
if (response.statusCode() != 200) {
log.error("HTTP请求失败,状态码: {}", response.statusCode());
throw new RuntimeException("HTTP请求失败,状态码: " + response.statusCode());
}
/*String responseBody = "{\n" +
" \"success\": true,\n" +
" \"rows\": [\n" +
" {\n" +
" \"alarmState\": 1,\n" +
" \"assetsCode\": \"LS321295\",\n" +
" \"belong\": \"在用\",\n" +
" \"createdBy\": \"1397884728111006697\",\n" +
" \"createdByName\": \"超级管理员\",\n" +
" \"describe\": \"\",\n" +
" \"deviceName\": \"钢直尺\",\n" +
" \"deviceNameNo\": \"钢直尺 null\",\n" +
" \"deviceSource\": \"市计量所\",\n" +
" \"deviceWhere\": \"\",\n" +
" \"guaranteePeriod\": 0,\n" +
" \"id\": \"20542\",\n" +
" \"isOverDue\": \"4\",\n" +
" \"labId\": \"2\",\n" +
" \"labelNo\": \"长度\",\n" +
" \"model\": \"0-50cm\",\n" +
" \"needDoPage\": false,\n" +
" \"objectCheckState\": 0,\n" +
" \"objectState\": 0,\n" +
" \"serialNo\": \"\",\n" +
" \"startPage\": 1,\n" +
" \"state\": 1,\n" +
" \"str1\": \"1\",\n" +
" \"str10\": \"一次性检定合格\",\n" +
" \"str2\": \"钢直尺\",\n" +
" \"str20\": \"长度外检\",\n" +
" \"str5\": \"\",\n" +
" \"str6\": \"\",\n" +
" \"str7\": \"\",\n" +
" \"str8\": \"JJG1钢直尺检定规程\",\n" +
" \"str9\": \"\",\n" +
" \"unit\": \"C\",\n" +
" \"verificationCycle\": 1,\n" +
" \"verifyState\": 0,\n" +
" \"whenAccept\": 1464105600000,\n" +
" \"workGuideNo\": \"热表分厂\",\n" +
" \"total\": \"3809\",\n" +
" \"isOverStr\": \"正常\"\n" +
" },\n" +
" {\n" +
" \"alarmState\": 1,\n" +
" \"assetsCode\": \"LS321294\",\n" +
" \"belong\": \"在用\",\n" +
" \"createdBy\": \"1397884728111006697\",\n" +
" \"createdByName\": \"超级管理员\",\n" +
" \"describe\": \"\",\n" +
" \"deviceName\": \"钢直尺\",\n" +
" \"deviceNameNo\": \"钢直尺 null\",\n" +
" \"deviceSource\": \"市计量所\",\n" +
" \"deviceWhere\": \"\",\n" +
" \"guaranteePeriod\": 0,\n" +
" \"id\": \"20606\",\n" +
" \"isOverDue\": \"4\",\n" +
" \"labId\": \"2\",\n" +
" \"labelNo\": \"长度\",\n" +
" \"model\": \"0-30cm\",\n" +
" \"needDoPage\": false,\n" +
" \"objectCheckState\": 0,\n" +
" \"objectState\": 0,\n" +
" \"serialNo\": \"\",\n" +
" \"startPage\": 1,\n" +
" \"state\": 1,\n" +
" \"str1\": \"1\",\n" +
" \"str10\": \"一次性检定合格\",\n" +
" \"str2\": \"钢直尺\",\n" +
" \"str20\": \"长度外检\",\n" +
" \"str5\": \"\",\n" +
" \"str6\": \"\",\n" +
" \"str7\": \"\",\n" +
" \"str8\": \"JJG1钢直尺检定规程\",\n" +
" \"str9\": \"\",\n" +
" \"unit\": \"C\",\n" +
" \"verificationCycle\": 1,\n" +
" \"verifyState\": 0,\n" +
" \"whenAccept\": 1464105600000,\n" +
" \"workGuideNo\": \"热表分厂\",\n" +
" \"total\": \"3809\",\n" +
" \"isOverStr\": \"正常\"\n" +
" },\n" +
" {\n" +
" \"alarmState\": 1,\n" +
" \"assetsCode\": \"LS321296\",\n" +
" \"belong\": \"在用\",\n" +
" \"createdBy\": \"1397884728111006697\",\n" +
" \"createdByName\": \"超级管理员\",\n" +
" \"describe\": \"\",\n" +
" \"deviceName\": \"钢直尺\",\n" +
" \"deviceNameNo\": \"钢直尺 null\",\n" +
" \"deviceSource\": \"市计量所\",\n" +
" \"deviceWhere\": \"\",\n" +
" \"guaranteePeriod\": 0,\n" +
" \"id\": \"22798\",\n" +
" \"isOverDue\": \"4\",\n" +
" \"labId\": \"2\",\n" +
" \"labelNo\": \"长度\",\n" +
" \"model\": \"0-50cm\",\n" +
" \"needDoPage\": false,\n" +
" \"objectCheckState\": 0,\n" +
" \"objectState\": 0,\n" +
" \"serialNo\": \"\",\n" +
" \"startPage\": 1,\n" +
" \"state\": 1,\n" +
" \"str1\": \"1\",\n" +
" \"str10\": \"一次性检定合格\",\n" +
" \"str2\": \"钢直尺\",\n" +
" \"str20\": \"长度外检\",\n" +
" \"str5\": \"\",\n" +
" \"str6\": \"\",\n" +
" \"str7\": \"\",\n" +
" \"str8\": \"\",\n" +
" \"str9\": \"\",\n" +
" \"unit\": \"C\",\n" +
" \"verificationCycle\": 1,\n" +
" \"verifyState\": 0,\n" +
" \"whenAccept\": 1464105600000,\n" +
" \"workGuideNo\": \"热表分厂\",\n" +
" \"total\": \"3809\",\n" +
" \"isOverStr\": \"正常\"\n" +
" },\n" +
" {\n" +
" \"alarmState\": 1,\n" +
" \"assetsCode\": \"LS321296\",\n" +
" \"belong\": \"在用\",\n" +
" \"createdBy\": \"1397884728111006697\",\n" +
" \"createdByName\": \"超级管理员\",\n" +
" \"describe\": \"\",\n" +
" \"deviceName\": \"钢直尺\",\n" +
" \"deviceNameNo\": \"钢直尺 null\",\n" +
" \"deviceSource\": \"市计量所\",\n" +
" \"deviceWhere\": \"\",\n" +
" \"guaranteePeriod\": 0,\n" +
" \"id\": \"23798\",\n" +
" \"isOverDue\": \"4\",\n" +
" \"labId\": \"2\",\n" +
" \"labelNo\": \"长度\",\n" +
" \"model\": \"0-50cm\",\n" +
" \"needDoPage\": false,\n" +
" \"objectCheckState\": 0,\n" +
" \"objectState\": 0,\n" +
" \"serialNo\": \"\",\n" +
" \"startPage\": 1,\n" +
" \"state\": 1,\n" +
" \"str1\": \"1\",\n" +
" \"str10\": \"一次性检定合格\",\n" +
" \"str2\": \"钢直尺\",\n" +
" \"str20\": \"长度外检\",\n" +
" \"str5\": \"\",\n" +
" \"str6\": \"\",\n" +
" \"str7\": \"\",\n" +
" \"str8\": \"\",\n" +
" \"str9\": \"\",\n" +
" \"unit\": \"C\",\n" +
" \"verificationCycle\": 1,\n" +
" \"verifyState\": 0,\n" +
" \"whenAccept\": 1464105600000,\n" +
" \"workGuideNo\": \"热表分厂\",\n" +
" \"total\": \"3809\",\n" +
" \"isOverStr\": \"正常\"\n" +
" },{\n" +
" \"alarmState\": 1,\n" +
" \"assetsCode\": \"YQ202512057\",\n" +
" \"belong\": \"在用\",\n" +
" \"createdBy\": \"1413079875727655913\",\n" +
" \"createdByName\": \"张曼\",\n" +
" \"date1\": 1795708800000,\n" +
" \"describe\": \"±5%\",\n" +
" \"deviceName\": \"磁导率测试仪\",\n" +
" \"deviceNameNo\": \"磁导率测试仪 null\",\n" +
" \"deviceSource\": \"FOERSTER\",\n" +
" \"deviceWhere\": \"FOERSTER\",\n" +
" \"guaranteePeriod\": 12,\n" +
" \"id\": \"1527021013731116009\",\n" +
" \"isOverDue\": \"0\",\n" +
" \"labId\": \"2\",\n" +
" \"labelNo\": \"电学\",\n" +
" \"model\": \"MAGNETOSCOP1.070\",\n" +
" \"modifiedBy\": \"1413079875727655913\",\n" +
" \"modifiedByName\": \"张曼\",\n" +
" \"needDoPage\": false,\n" +
" \"objectCheckState\": 0,\n" +
" \"objectState\": 0,\n" +
" \"serialNo\": \"17175\",\n" +
" \"startPage\": 1,\n" +
" \"state\": 1,\n" +
" \"str1\": \"1\",\n" +
" \"str12\": \"1413079875727655913,1413079965921969129\",\n" +
" \"str13\": \"张曼,高佳璇\",\n" +
" \"str2\": \"磁导率测试仪\",\n" +
" \"str20\": \"电学\",\n" +
" \"str5\": \"1.068/1.069\",\n" +
" \"str6\": \"\",\n" +
" \"str8\": \"厂家检测报告\",\n" +
" \"unit\": \"B\",\n" +
" \"verificationCycle\": 1,\n" +
" \"verifyState\": 0,\n" +
" \"whenAccept\": 1764259200000,\n" +
" \"whenCreated\": 1768448919000,\n" +
" \"whenModified\": 1768448919000,\n" +
" \"whenUse\": 1764259200000,\n" +
" \"workGuideNo\": \"热表分厂\",\n" +
" \"total\": \"3809\",\n" +
" \"isOverStr\": \"正常\"\n" +
" }\n" +
" ],\n" +
" \"total\": \"3809\",\n" +
" \"recordsTotal\": \"3809\",\n" +
" \"recordsFiltered\": \"3809\"\n" +
"}";*/
String responseBody = response.body();
if (responseBody == null || responseBody.trim().isEmpty()) {
log.error("响应体为空");
@ -92,11 +306,43 @@ public class IMeasurementRecordsServiceImpl implements IMeasurementRecordsServic
try {
JSONObject result = JSONObject.parseObject(responseBody);
if (result != null && result.getBoolean("success")) {
JSONObject data = result.getJSONObject("data");
JSONArray data = result.getJSONArray("rows");
if (data != null) {
List<JSONObject> records = JSONArray.parseArray(data.toJSONString(), JSONObject.class);
log.info("成功获取{}条计量记录记录", records != null ? records.size() : 0);
return page.setRecords(records != null ? records : List.of());
MeasurementRecordsEntity measurementRecordsEntity;
List<MeasurementRecordsEntity> list = new ArrayList<>();
for (JSONObject jsonObj : records) {
measurementRecordsEntity = new MeasurementRecordsEntity();
measurementRecordsEntity.setMcName(jsonObj.getString("deviceName"));
measurementRecordsEntity.setNorms(jsonObj.getString("model"));
measurementRecordsEntity.setMcClass(jsonObj.getString("unit"));
measurementRecordsEntity.setLabelNo(jsonObj.getString("labelNo"));
measurementRecordsEntity.setStr2(jsonObj.getString("str2"));
measurementRecordsEntity.setMcCode(jsonObj.getString("assetsCode"));
measurementRecordsEntity.setUseUnit(jsonObj.getString("workGuideNo"));
measurementRecordsEntity.setAccuracy(jsonObj.getString("describe"));
measurementRecordsEntity.setOemCode(jsonObj.getString("serialNo"));
measurementRecordsEntity.setMcOem(jsonObj.getString("deviceWhere"));
measurementRecordsEntity.setEnableDate(jsonObj.getDate("whenUse"));
measurementRecordsEntity.setWhenDccept(jsonObj.getString("whenDccept"));
measurementRecordsEntity.setMcType(jsonObj.getString("str5"));
measurementRecordsEntity.setTestCycle(jsonObj.getInteger("guaranteePeriod"));
measurementRecordsEntity.setDueDate(jsonObj.getDate("date1"));
measurementRecordsEntity.setDate2(jsonObj.getDate("date2"));
measurementRecordsEntity.setBelong(jsonObj.getString("belong"));
measurementRecordsEntity.setWhenBuy(jsonObj.getDate("whenBuy"));
measurementRecordsEntity.setTestDept(jsonObj.getString("deviceSource"));
measurementRecordsEntity.setTestMethod(jsonObj.getString("str8"));
measurementRecordsEntity.setStr9(jsonObj.getString("str9"));
measurementRecordsEntity.setStr10(jsonObj.getString("str10"));
measurementRecordsEntity.setAssetsNo(jsonObj.getString("assetsNo"));
measurementRecordsEntity.setStr6(jsonObj.getString("str6"));
measurementRecordsEntity.setPurposeClass(jsonObj.getString("str7"));
measurementRecordsEntity.setIsOverStr(jsonObj.getString("isOverStr"));
list.add(measurementRecordsEntity);
}
return page.setRecords(list != null ? list : List.of());
}
} else {
String errorMsg = result != null ? result.getString("message") : "未知错误";

@ -2,9 +2,14 @@ package org.springblade.desk.device.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.common.utils.CollectionUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.extern.slf4j.Slf4j;
import jakarta.annotation.Resource;
import org.springblade.desk.device.mapper.EquipmentMapper;
import org.springblade.desk.device.pojo.entity.EquipmentEntity;
import org.springblade.desk.device.pojo.entity.RecorderCompareEntity;
import org.springblade.desk.device.pojo.entity.RecorderEntity;
import org.springblade.desk.device.pojo.excel.RecorderExcel;
@ -15,12 +20,20 @@ import org.springblade.desk.device.pojo.vo.RecorderVO;
import org.springblade.desk.device.mapper.RecorderMapper;
import org.springblade.desk.device.service.IRecorderCompareService;
import org.springblade.desk.device.service.IRecorderService;
import org.springblade.desk.jobtransfer.pojo.entity.PostHandleEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseServiceImpl;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
@ -30,15 +43,40 @@ import java.util.stream.Collectors;
* @author qyl
* @since 2026-01-06
*/
@Slf4j
@Service
public class RecorderServiceImpl extends BaseServiceImpl<RecorderMapper, RecorderEntity> implements IRecorderService {
@Autowired
private IRecorderCompareService iRecorderCompareService;
@Resource
private EquipmentMapper equipmentMapper;
@Value("${request.iotNew.url}")
private String iotNewUrl;
@Value("${request.iot.orgId}")
private String orgId;
@Value("${request.iot.systemId}")
private String systemId;
// 使用JDK 17内置的HttpClient(线程安全,可复用)
private final HttpClient httpClient = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(30))
.version(HttpClient.Version.HTTP_2)
.build();
@Override
public IPage<RecorderVO> selectRecorderPage(IPage<RecorderVO> page, RecorderVO recorder) {
return page.setRecords(baseMapper.selectRecorderPage(page, recorder));
public IPage<RecorderEntity> selectRecorderPage(IPage<RecorderEntity> page, RecorderVO recorder) {
// 1. 创建条件构造器
LambdaQueryWrapper<RecorderEntity> wrapper = Wrappers.<RecorderEntity>lambdaQuery();
// 2. 动态添加条件(核心!)
// 根据实体对象 entity 中字段是否为空,来动态拼接WHERE条件
wrapper.eq(Objects.nonNull(recorder.getRecorder()), RecorderEntity::getRecorder, recorder.getRecorder());
return baseMapper.selectPage(page, wrapper);
}
@ -137,4 +175,371 @@ public class RecorderServiceImpl extends BaseServiceImpl<RecorderMapper, Recorde
return loadRecorderVO;
}
/**
* 定期更新记录仪数据的方法
* 该方法会查询所有非产线设备并同步其记录仪数据到系统数据库
* 同步时间范围根据设备最后记录时间动态计算确保数据连续性
*/
@Override
public void regularlyUpdated() {
// 查询全部非产线设备
List<EquipmentEntity> equipmentEntities = getNonProductionEquipment();
if (equipmentEntities.isEmpty()) {
log.error("同步记录仪数据失败,当前系统无非产线设备");
return;
}
// 批量处理设备数据,使用并行流提高处理效率(根据设备数量决定是否启用)
equipmentEntities.stream()
.filter(equipment -> processEquipmentData(equipment))
.collect(Collectors.toList());
}
/**
* 获取非产线设备列表
*/
private List<EquipmentEntity> getNonProductionEquipment() {
LambdaQueryWrapper<EquipmentEntity> equiWrapper = new LambdaQueryWrapper<>();
equiWrapper.ne(EquipmentEntity::getCategorys, "产线设备");
return equipmentMapper.selectList(equiWrapper);
}
/**
* 处理单个设备的数据同步
*
* @return 处理成功返回true失败返回false
*/
private boolean processEquipmentData(EquipmentEntity equipmentEntity) {
try {
// 获取设备对应的记录仪信息
RecorderEntity recorderEntity = getRecorderEntity(equipmentEntity.getDeviceCode());
if (recorderEntity == null) {
log.warn("设备 {} 无对应的记录仪信息,跳过处理", equipmentEntity.getDeviceCode());
return false;
}
// 检查记录时间有效性(跳过未来时间的异常记录)
if (isFutureRecord(recorderEntity.getRecordDate())) {
log.debug("记录仪 {} 记录时间为未来时间,跳过处理", equipmentEntity.getDeviceCode());
return false;
}
// 计算时间范围
TimeRange timeRange = calculateTimeRange(recorderEntity);
if (timeRange == null) {
return false;
}
// 调用同步接口获取记录仪数据
JSONArray dataArray = doPost(equipmentEntity.getDeviceCode(),
timeRange.getStartTime(), timeRange.getStopTime());
// 处理同步结果
return processSyncResult(dataArray, equipmentEntity, recorderEntity);
} catch (Exception e) {
log.error("处理记录仪 {} 数据时发生异常", equipmentEntity.getDeviceCode(), e);
return false;
}
}
/**
* 获取记录仪实体
*/
private RecorderEntity getRecorderEntity(String deviceCode) {
return this.getOne(new LambdaQueryWrapper<RecorderEntity>()
.eq(RecorderEntity::getRecorder, deviceCode));
}
/**
* 检查记录时间是否为未来时间
*/
private boolean isFutureRecord(Date recordDate) {
return recordDate.getTime() > System.currentTimeMillis();
}
/**
* 计算数据同步的时间范围
*/
private TimeRange calculateTimeRange(RecorderEntity recorderEntity) {
// 计算基准时间点:当前时间前推8分钟(用于时间比较)
long baselineTime = OffsetDateTime.now().minusMinutes(8).toInstant().toEpochMilli();
Instant recordInstant = recorderEntity.getRecordDate().toInstant();
// 设置默认查询时间范围:当前时间前推6分钟到前推5分钟
String startTime = OffsetDateTime.now().minusMinutes(6)
.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
String stopTime = OffsetDateTime.now().minusMinutes(5)
.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
// 判断记录时间是否在基准时间之前或相等
if (recordInstant.isBefore(Instant.ofEpochMilli(baselineTime)) ||
recordInstant.equals(Instant.ofEpochMilli(baselineTime))) {
// 设置基于记录时间的开始时间
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
startTime = recordInstant.atZone(ZoneId.systemDefault()).format(formatter);
// 如果记录时间超过当前时间10分钟,设置基于记录时间的结束时间
if (recordInstant.plusSeconds(60 * 10).isBefore(Instant.ofEpochMilli(baselineTime))) {
stopTime = recordInstant.plusSeconds(120).atZone(ZoneId.systemDefault()).format(formatter);
}
}
return new TimeRange(startTime, stopTime);
}
/**
* 处理同步返回的数据
*/
private boolean processSyncResult(JSONArray dataArray, EquipmentEntity equipment,
RecorderEntity existingRecorder) {
if (dataArray != null && !dataArray.isEmpty()) {
return processSuccessfulSync(dataArray, equipment);
} else {
return createFallbackRecord(equipment, existingRecorder);
}
}
/**
* 处理有数据的同步结果
*/
private boolean processSuccessfulSync(JSONArray dataArray, EquipmentEntity equipment) {
// 获取最新的一条记录
JSONObject lastRecord = dataArray.getJSONObject(dataArray.size() - 1);
String deviceId = lastRecord.getString("deivceId");
String value = lastRecord.getString("value");
Date recordTime = lastRecord.getDate("timestamp");
// 检查记录是否已存在(去重判断)
if (isDuplicateRecord(equipment.getDeviceCode(), recordTime)) {
// log.debug("设备 {} 记录已存在,跳过保存", equipment.getDeviceCode());
return true;
}
// 创建新记录并保存
return saveNewRecord(deviceId, value, recordTime);
}
/**
* 检查重复记录
*/
private boolean isDuplicateRecord(String deviceCode, Date recordTime) {
return this.exists(new LambdaQueryWrapper<RecorderEntity>()
.eq(RecorderEntity::getRecorder, deviceCode)
.eq(RecorderEntity::getRecordDate, recordTime));
}
/**
* 保存新记录
*/
private boolean saveNewRecord(String deviceId, String value, Date recordTime) {
try {
RecorderEntity recorder = new RecorderEntity();
recorder.setRecorder(deviceId);
recorder.setRecordDate(recordTime);
recorder.setMemo(value);
return this.save(recorder);
} catch (Exception e) {
log.error("保存记录仪 {} 记录失败", deviceId, e);
return false;
}
}
/**
* 创建无数据时的回退记录
*/
private boolean createFallbackRecord(EquipmentEntity equipment, RecorderEntity existingRecorder) {
try {
RecorderEntity recorder = new RecorderEntity();
recorder.setRecorder(equipment.getDeviceCode());
recorder.setMemo("");
// 设置记录时间:有历史记录则基于最后记录时间,否则基于当前时间
Date newRecordDate = calculateFallbackDate(existingRecorder);
recorder.setRecordDate(newRecordDate);
return this.save(recorder);
} catch (Exception e) {
log.error("创建回退记录失败,记录仪:{}", equipment.getDeviceCode(), e);
return false;
}
}
/**
* 计算回退记录的日期
*/
private Date calculateFallbackDate(RecorderEntity existingRecorder) {
LocalDateTime baseTime;
if (existingRecorder != null && existingRecorder.getId() != null) {
// 有历史记录:在最后记录时间基础上增加2分钟
baseTime = existingRecorder.getRecordDate().toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime()
.plusMinutes(2);
} else {
// 无历史记录:当前时间前推5分钟
baseTime = LocalDateTime.now().minusMinutes(5);
}
return Date.from(baseTime.atZone(ZoneId.systemDefault()).toInstant());
}
/**
* 时间范围封装类
*/
private static class TimeRange {
private final String startTime;
private final String stopTime;
public TimeRange(String startTime, String stopTime) {
this.startTime = startTime;
this.stopTime = stopTime;
}
public String getStartTime() {
return startTime;
}
public String getStopTime() {
return stopTime;
}
}
/*public void regularlyUpdated() {
//查询全部非产线设备
LambdaQueryWrapper<EquipmentEntity> equiWrapper = new LambdaQueryWrapper<>();
equiWrapper.ne(EquipmentEntity::getCategorys,"产线设备");
List<EquipmentEntity> equipmentEntities = equipmentMapper.selectList(equiWrapper);
if(null == equipmentEntities || equipmentEntities.size() < 1){
log.error("同步记录仪数据失败,当前系统无非产线设备");
return;
}
String startTime;
String stopTime;
for (EquipmentEntity equipmentEntity : equipmentEntities) {
// 获取当前时间并减去8分钟,然后转换为时间戳
long time = OffsetDateTime.now().minusMinutes(8).toInstant().toEpochMilli();
// 获取当前时间并减去6分钟,然后格式化为字符串
startTime = OffsetDateTime.now().minusMinutes(6)
.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME); // 使用ISO格式,包含时区信息
// 获取当前时间并减去5分钟,然后格式化为字符串
stopTime = OffsetDateTime.now().minusMinutes(5)
.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
RecorderEntity recorderEntity = this.getOne(new LambdaQueryWrapper<RecorderEntity>().eq(RecorderEntity::getRecorder, equipmentEntity.getDeviceCode()));
if (recorderEntity == null) return;
Date recordDate = recorderEntity.getRecordDate();
if (recordDate.getTime() > new Date().getTime()) continue;
if (recorderEntity != null && recorderEntity.getId() != null) {
if (recordDate != null) {
Instant recordInstant = recordDate.toInstant();
if (recordInstant.isBefore(Instant.ofEpochMilli(time)) || recordInstant.equals(Instant.ofEpochMilli(time))) {
// 格式化开始时间
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 根据需求调整格式
startTime = recordInstant.atZone(ZoneId.systemDefault()).format(formatter);
// 判断是否超过当前时间10分钟
if (recordInstant.plusSeconds(60 * 10).isBefore(Instant.ofEpochMilli(time))) {
// 在 recordDate 基础上加2分钟作为结束时间
stopTime = recordInstant.plusSeconds(120).atZone(ZoneId.systemDefault()).format(formatter);
}
}
}
}
//同步接口调用
JSONArray array = doPost(equipmentEntity.getDeviceCode(), startTime, stopTime);
//处理返回数据
RecorderEntity recorder = null;
if (array != null && array.size() > 0) {
JSONObject obj = null;
String deivceId = "", value = "";
Date recTime = null;
obj = array.getJSONObject(array.size() - 1);
deivceId = obj.getString("deivceId");
value = obj.getString("value");
recTime = obj.getDate("timestamp");
RecorderEntity getOneRecorder = this.getOne(new LambdaQueryWrapper<RecorderEntity>().eq(RecorderEntity::getRecorder, equipmentEntity.getDeviceCode())
.eq(RecorderEntity::getRecordDate,recTime));
if (getOneRecorder != null && getOneRecorder.getId() != null) continue;
//去重 增加唯一标识
recorder = new RecorderEntity();
recorder.setRecorder(deivceId);
recorder.setRecordDate(recTime);
recorder.setMemo(value);
this.save(recorder);
} else {
recorder = new RecorderEntity();
recorder.setRecorder(equipmentEntity.getDeviceCode());
if (recorderEntity != null && recorderEntity.getId() != null) {
// 将 Date 转换为 LocalDateTime 进行操作
LocalDateTime newRecordDate = recordDate.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime()
.plusMinutes(2); // 增加2分钟
recorder.setRecordDate(Date.from(newRecordDate.atZone(ZoneId.systemDefault()).toInstant()));
} else {
// 当前时间减去5分钟
LocalDateTime newRecordDate = LocalDateTime.now().minusMinutes(5);
recorder.setRecordDate(Date.from(newRecordDate.atZone(ZoneId.systemDefault()).toInstant()));
}
recorder.setMemo("");
this.save(recorder);
}
}
}*/
/**
* 从IOT同步数据
*
* @param deviceCode
* @param startTime
* @param stopTime
* @return
*/
private JSONArray doPost(String deviceCode, String startTime, String stopTime) {
log.debug("开始同步记录仪数据");
JSONArray retuArray = null;
// 构建请求体JSON
JSONObject requestBody = buildRequestBody(deviceCode, startTime, stopTime);
// 创建HTTP请求
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(iotNewUrl + "/deviceForZhgd/deviceDataHistory"))
.header("Content-Type", "application/json")
.header("Accept", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(requestBody.toJSONString()))
.timeout(Duration.ofSeconds(60))
.build();
try {
// 发送同步请求
HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
// 处理响应
String responseBody = response.body();
JSONObject result = JSONObject.parseObject(responseBody);
log.debug("同步记录仪数据: {}", result.toJSONString());
if (result != null && result.getInteger("code").equals(0)) {
retuArray = result.getJSONArray("result");
}
} catch (Exception e) {
log.error("同步记录仪数据接口调用失败: {}", e.getMessage(), e);
}
return retuArray;
}
/**
* 构建请求体
*/
private JSONObject buildRequestBody(String deviceCode, String startTime, String stopTime) {
JSONObject requestBody = new JSONObject();
requestBody.put("orgId", orgId);
requestBody.put("systemId", systemId);
requestBody.put("startTime", startTime);
requestBody.put("deviceId", deviceCode);
requestBody.put("endTime", stopTime);
requestBody.put("category", "");
log.debug("同步记录仪数据请求参数: {}", requestBody.toJSONString());
return requestBody;
}
}

@ -84,7 +84,6 @@ public class AuditFileController extends BladeController {
Query query) {
// QueryWrapper<AuditFile> qw = Condition.getQueryWrapper(map, AuditFile.class);
AuditFileSearch search = BeanUtil.toBeanIgnoreError(map, AuditFileSearch.class);
log.info("search = " + search);
IPage<AuditFile> pages = service.listSearch(Condition.getPage(query), search);
IPage<AuditFileVO> pagesVO = AuditFileWrapper.build().pageVO(pages);
pagesVO.getRecords()

@ -3,6 +3,7 @@
*/
package org.springblade.desk.quality.controller;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
@ -27,8 +28,10 @@ import org.springblade.core.tool.utils.Func;
import org.springblade.desk.basic.util.ExcelExtUtil;
import org.springblade.desk.quality.constant.QAModuleConst;
import org.springblade.desk.quality.excel.CycleTestExcel;
import org.springblade.desk.quality.pojo.entity.AuditFile;
import org.springblade.desk.quality.pojo.entity.CycleTest;
import org.springblade.desk.quality.pojo.request.CycleTestBatUpdateCycle;
import org.springblade.desk.quality.pojo.request.CycleTestSearch;
import org.springblade.desk.quality.pojo.request.CycleTestSubmit;
import org.springblade.desk.quality.pojo.vo.CycleTestVO;
import org.springblade.desk.quality.service.CycleTestService2;
@ -41,6 +44,7 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* [周期试验] 控制器
@ -49,11 +53,11 @@ import java.util.Map;
* @since 2025-11-17
*/
@RestController
@RequestMapping(QAModuleConst.CONTROLLER_PREFIX + "/CycleTest")
@Data
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Slf4j
@RequestMapping(QAModuleConst.CONTROLLER_PREFIX + "/CycleTest")
@Tag(name = "[QA][周期试验]", description = "[周期试验]接口")
public class CycleTestController extends BladeController {
@ -81,9 +85,17 @@ public class CycleTestController extends BladeController {
@GetMapping("/list")
@ApiOperationSupport(order = 2)
@Operation(summary = "list分页", description = "传入cycleTest")
public R<IPage<CycleTestVO>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> cycleTest,
public R<IPage<CycleTestVO>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> map,
Query query) {
return service2.list(cycleTest, query);
// 填充bean
CycleTestSearch search = BeanUtil.toBeanIgnoreError(map, CycleTestSearch.class);
log.info("search = " + search);
IPage<CycleTestVO> pagesVO = service.listSearch(Condition.getPage(query), search);
pagesVO.getRecords()
.stream()
.peek(service2::setVOValue)
.collect(Collectors.toList());
return R.data(pagesVO);
}
/**
@ -186,16 +198,22 @@ public class CycleTestController extends BladeController {
@GetMapping("/export-excel")
@ApiOperationSupport(order = 8)
@Operation(summary = "导出数据", description = "传入cycleTest")
public void exportCycleTest(@Parameter(hidden = true) @RequestParam Map<String, Object> cycleTest,
public void exportCycleTest(@Parameter(hidden = true) @RequestParam Map<String, Object> map,
BladeUser bladeUser, HttpServletResponse response) {
QueryWrapper<CycleTest> queryWrapper = Condition.getQueryWrapper(cycleTest, CycleTest.class);
// QueryWrapper<CycleTest> queryWrapper = Condition.getQueryWrapper(cycleTest, CycleTest.class);
//if (!AuthUtil.isAdministrator()) {
// queryWrapper.lambda().eq(CycleTest::getTenantId, bladeUser.getTenantId());
//}
//queryWrapper.lambda().eq(CycleTestEntity::getIsDeleted, BladeConstant.DB_NOT_DELETED);
List<CycleTestExcel> list = service.exportCycleTest(queryWrapper);
CycleTestSearch search = BeanUtil.toBeanIgnoreError(map, CycleTestSearch.class);
log.info("search = " + search);
List<CycleTestVO> listVO = service.listSearchWithoutPage(search);
listVO.stream()
.peek(service2::setVOValue)
.collect(Collectors.toList());
List<CycleTestExcel> listExcel = BeanUtil.copyToList(listVO, CycleTestExcel.class);
ExcelUtil.export(response, "[周期试验]数据" + DateUtil.time(),
"[周期试验]数据表", list, CycleTestExcel.class);
"[周期试验]数据表", listExcel, CycleTestExcel.class);
}
@PostMapping("/update-process-user-bat")

@ -3,6 +3,7 @@
*/
package org.springblade.desk.quality.controller;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
@ -80,8 +81,7 @@ public class CycleTestItemController extends BladeController {
@ApiOperationSupport(order = 2)
@Operation(summary = "list分页", description = "传入cycleTestItem")
public R<IPage<CycleTestItemVO>> list(
@Parameter(hidden = true) @RequestParam Map<String, Object> cycleTestItem,
Query query) {
@Parameter(hidden = true) @RequestParam Map<String, Object> cycleTestItem, Query query) {
return service2.list(cycleTestItem, query);
}
@ -151,9 +151,11 @@ public class CycleTestItemController extends BladeController {
// queryWrapper.lambda().eq(CycleTestItem::getTenantId, bladeUser.getTenantId());
//}
//queryWrapper.lambda().eq(CycleTestItemEntity::getIsDeleted, BladeConstant.DB_NOT_DELETED);
List<CycleTestItemExcel> list = service.exportCycleTestItem(queryWrapper);
List<CycleTestItemVO> listVO = service2.listWithoutPage(cycleTestItem);
List<CycleTestItemExcel> listExcel = BeanUtil.copyToList(listVO, CycleTestItemExcel.class);
ExcelUtil.export(response, "[周期试验项目]数据" + DateUtil.time(),
"[周期试验项目]数据表", list,
"[周期试验项目]数据表", listExcel,
CycleTestItemExcel.class);
}

@ -168,9 +168,8 @@ public class CycleTestTaskController extends BladeController {
//}
//queryWrapper.lambda().eq(CycleTestTaskEntity::getIsDeleted, BladeConstant.DB_NOT_DELETED);
List<CycleTestTaskVO> list = service.listSearchWithoutPage(search);
// todo:excel格式
// excel 导出字段
List<CycleTestTaskExcel> listExcel = BeanUtil.copyToList(list, CycleTestTaskExcel.class);
ExcelUtil.export(response, "[周期试验任务]数据" + DateUtil.time(),
"[周期试验任务]数据表", listExcel, CycleTestTaskExcel.class);
@ -219,10 +218,10 @@ public class CycleTestTaskController extends BladeController {
return service.fill(id, isDone, testDate, testAttachId, reasonForNo, reasonForOut);
}
@GetMapping("/testAuto")
@GetMapping("/generateAuto")
@ApiOperationSupport(order = 12)
@Operation(summary = "testAuto", description = "")
public R testAuto() {
@Operation(summary = "generateAuto", description = "")
public R generateAuto() {
service.generateAuto();
return R.success();
}

@ -28,8 +28,11 @@ import org.springblade.desk.basic.util.ExcelExtUtil;
import org.springblade.desk.quality.constant.QAModuleConst;
import org.springblade.desk.quality.excel.LiquidTankReportExcel;
import org.springblade.desk.quality.pojo.entity.LiquidTankReport;
import org.springblade.desk.quality.pojo.vo.LiquidTankReportDetailVO;
import org.springblade.desk.quality.pojo.vo.LiquidTankReportVO;
import org.springblade.desk.quality.service.ILiquidTankReportService;
import org.springblade.desk.quality.service.ILiquidTankTaskCopyService;
import org.springblade.desk.quality.wrapper.LiquidTankReportDetailWrapper;
import org.springblade.desk.quality.wrapper.LiquidTankReportWrapper;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@ -54,179 +57,183 @@ import java.util.Map;
public class LiquidTankReportController extends BladeController {
@Resource
private ILiquidTankReportService service;
/**
* [槽液报告] 详情
*/
@GetMapping("/detail")
@ApiOperationSupport(order = 10)
@Operation(summary = "详情", description = "传入LiquidTankReport Obj")
public R<LiquidTankReportVO> detail(LiquidTankReport liquidTankReport) {
QueryWrapper<LiquidTankReport> qw = Condition.getQueryWrapper(liquidTankReport);
LiquidTankReport detail = service.getOne(qw);
LiquidTankReportVO detailVO = LiquidTankReportWrapper.build().entityVO(detail);
return R.data(detailVO);
}
/**
* [槽液报告] list分页
*/
@GetMapping("/list")
@ApiOperationSupport(order = 20)
@Operation(summary = "list分页", description = "传入LiquidTankReport Obj")
public R<IPage<LiquidTankReportVO>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> liquidTankReport,
Query query) {
private ILiquidTankReportService service;
@Resource
private ILiquidTankTaskCopyService liquidTankTaskCopyService;
/**
* [槽液报告] 详情
*/
@GetMapping("/detail")
@ApiOperationSupport(order = 10)
@Operation(summary = "详情", description = "传入LiquidTankReport Obj")
public R<LiquidTankReportDetailVO> detail(LiquidTankReport liquidTankReport) {
QueryWrapper<LiquidTankReport> qw = Condition.getQueryWrapper(liquidTankReport);
LiquidTankReport detail = service.getOne(qw);
LiquidTankReportDetailVO detailVO = LiquidTankReportDetailWrapper.build().entityVO(detail);
// 直接查询明细列表
detailVO.setCopyList(liquidTankTaskCopyService.getListByLiquidTankReportId(detailVO.getId()));
return R.data(detailVO);
}
/**
* [槽液报告] list分页
*/
@GetMapping("/list")
@ApiOperationSupport(order = 20)
@Operation(summary = "list分页", description = "传入LiquidTankReport Obj")
public R<IPage<LiquidTankReportVO>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> liquidTankReport,
Query query) {
QueryWrapper<LiquidTankReport> qw = Condition.getQueryWrapper(liquidTankReport, LiquidTankReport.class);
IPage<LiquidTankReport> pages = service.page(Condition.getPage(query), qw);
IPage<LiquidTankReportVO> pagesVO = LiquidTankReportWrapper.build().pageVO(pages);
return R.data(pagesVO);
}
/**
* [槽液报告] page分页
*/
@GetMapping("/page")
@ApiOperationSupport(order = 21)
@Operation(summary = "page分页", description = "传入LiquidTankReport Obj")
public R<IPage<LiquidTankReportVO>> page(LiquidTankReportVO liquidTankReport, Query query) {
IPage<LiquidTankReportVO> pagesVO = service.selectLiquidTankReportPage(
Condition.getPage(query), liquidTankReport
);
return R.data(pagesVO);
}
/**
IPage<LiquidTankReport> pages = service.page(Condition.getPage(query), qw);
IPage<LiquidTankReportVO> pagesVO = LiquidTankReportWrapper.build().pageVO(pages);
return R.data(pagesVO);
}
/**
* [槽液报告] page分页
*/
@GetMapping("/page")
@ApiOperationSupport(order = 21)
@Operation(summary = "page分页", description = "传入LiquidTankReport Obj")
public R<IPage<LiquidTankReportVO>> page(LiquidTankReportVO liquidTankReport, Query query) {
IPage<LiquidTankReportVO> pagesVO = service.selectLiquidTankReportPage(
Condition.getPage(query), liquidTankReport
);
return R.data(pagesVO);
}
/**
* [槽液报告] list下拉选择
*/
@GetMapping("/listForSelect")
@ApiOperationSupport(order = 22)
@Operation(summary = "list下拉选择", description = "")
@Operation(summary = "list下拉选择", description = "")
public R<List<LiquidTankReportVO>> listForSelect() {
List<LiquidTankReport> list = service.list();
List<LiquidTankReportVO> listVO = LiquidTankReportWrapper.build().listVO(list);
return R.data(listVO);
List<LiquidTankReport> list = service.list();
List<LiquidTankReportVO> listVO = LiquidTankReportWrapper.build().listVO(list);
return R.data(listVO);
}
/**
* [槽液报告] 新增一条
*/
@PostMapping("/save")
@ApiOperationSupport(order = 30)
@Operation(summary = "新增一条", description = "传入LiquidTankReport Obj")
public R save(@Valid @RequestBody LiquidTankReport addOne) {
addOne.setId(null);
return R.status(service.save(addOne));
}
/**
* [槽液报告] 新增一条
*/
@PostMapping("/save")
@ApiOperationSupport(order = 30)
@Operation(summary = "新增一条", description = "传入LiquidTankReport Obj")
public R save(@Valid @RequestBody LiquidTankReport addOne) {
addOne.setId(null);
return R.status(service.save(addOne));
}
/**
/**
* [槽液报告] 新增批量
*/
@PostMapping("/saveBat")
@ApiOperationSupport(order = 31)
@Operation(summary = "新增批量", description = "传入LiquidTankReport List")
public R saveBat(@Valid @RequestBody List<LiquidTankReport> addList) {
addList.forEach(one -> {
one.setId(null);
});
return R.status(service.saveBatch(addList));
}
/**
* [槽液报告] 修改一条
*/
@PostMapping("/update")
@ApiOperationSupport(order = 40)
@Operation(summary = "修改一条", description = "传入LiquidTankReport Obj")
public R update(@Valid @RequestBody LiquidTankReport updateOne) {
return R.status(service.updateById(updateOne));
}
@PostMapping("/saveBat")
@ApiOperationSupport(order = 31)
@Operation(summary = "新增批量", description = "传入LiquidTankReport List")
public R saveBat(@Valid @RequestBody List<LiquidTankReport> addList) {
addList.forEach(one -> {
one.setId(null);
});
return R.status(service.saveBatch(addList));
}
/**
* [槽液报告] 修改一条
*/
@PostMapping("/update")
@ApiOperationSupport(order = 40)
@Operation(summary = "修改一条", description = "传入LiquidTankReport Obj")
public R update(@Valid @RequestBody LiquidTankReport updateOne) {
return R.status(service.updateById(updateOne));
}
/**
* [槽液报告] 修改批量
*/
@PostMapping("/updateBat")
@ApiOperationSupport(order = 41)
@Operation(summary = "修改批量", description = "传入LiquidTankReport List")
@Operation(summary = "修改批量", description = "传入LiquidTankReport List")
public R updateBat(@Valid @RequestBody List<LiquidTankReport> updateList) {
return R.status(service.updateBatchById(updateList));
}
/**
* [槽液报告] 新增或修改一条
*/
@PostMapping("/submit")
@ApiOperationSupport(order = 50)
@Operation(summary = "新增或修改一条", description = "传入LiquidTankReport Obj")
public R submit(@Valid @RequestBody LiquidTankReport mergeOne) {
return R.status(service.saveOrUpdate(mergeOne));
}
/**
/**
* [槽液报告] 新增或修改一条
*/
@PostMapping("/submit")
@ApiOperationSupport(order = 50)
@Operation(summary = "新增或修改一条", description = "传入LiquidTankReport Obj")
public R submit(@Valid @RequestBody LiquidTankReport mergeOne) {
return R.status(service.saveOrUpdate(mergeOne));
}
/**
* [槽液报告] 新增或修改批量
*/
@PostMapping("/submitBat")
@ApiOperationSupport(order = 51)
@Operation(summary = "新增或修改批量", description = "传入LiquidTankReport List")
public R submitBat(@Valid @RequestBody List<LiquidTankReport> mergeList) {
return R.status(service.saveOrUpdateBatch(mergeList));
}
/**
* [槽液报告] 逻辑删除
*/
@PostMapping("/remove")
@ApiOperationSupport(order = 61)
@Operation(summary = "逻辑删除", description = "传入ids")
public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) {
return R.status(service.deleteLogic(Func.toLongList(ids)));
}
/**
* [槽液报告] 导出Excel
*/
@GetMapping("/exportExcel")
@ApiOperationSupport(order = 70)
@Operation(summary = "导出Excel", description = "传入LiquidTankReport")
public void exportExcel(@Parameter(hidden = true) @RequestParam Map<String, Object> liquidTankReport,
BladeUser bladeUser, HttpServletResponse response) {
QueryWrapper<LiquidTankReport> qw = Condition.getQueryWrapper(liquidTankReport, LiquidTankReport.class);
//if (!AuthUtil.isAdministrator()) {
// queryWrapper.lambda().eq(LiquidTankReport::getTenantId, bladeUser.getTenantId());
//}
//queryWrapper.lambda().eq(LiquidTankReportEntity::getIsDeleted, BladeConstant.DB_NOT_DELETED);
List<LiquidTankReportExcel> list = service.exportLiquidTankReport(qw);
ExcelUtil.export(response, "[槽液报告]数据" + DateUtil.time(),
"[槽液报告]数据表", list, LiquidTankReportExcel.class);
}
/**
@PostMapping("/submitBat")
@ApiOperationSupport(order = 51)
@Operation(summary = "新增或修改批量", description = "传入LiquidTankReport List")
public R submitBat(@Valid @RequestBody List<LiquidTankReport> mergeList) {
return R.status(service.saveOrUpdateBatch(mergeList));
}
/**
* [槽液报告] 逻辑删除
*/
@PostMapping("/remove")
@ApiOperationSupport(order = 61)
@Operation(summary = "逻辑删除", description = "传入ids")
public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) {
return R.status(service.deleteLogic(Func.toLongList(ids)));
}
/**
* [槽液报告] 导出Excel
*/
@GetMapping("/exportExcel")
@ApiOperationSupport(order = 70)
@Operation(summary = "导出Excel", description = "传入LiquidTankReport")
public void exportExcel(@Parameter(hidden = true) @RequestParam Map<String, Object> liquidTankReport,
BladeUser bladeUser, HttpServletResponse response) {
QueryWrapper<LiquidTankReport> qw = Condition.getQueryWrapper(liquidTankReport, LiquidTankReport.class);
//if (!AuthUtil.isAdministrator()) {
// queryWrapper.lambda().eq(LiquidTankReport::getTenantId, bladeUser.getTenantId());
//}
//queryWrapper.lambda().eq(LiquidTankReportEntity::getIsDeleted, BladeConstant.DB_NOT_DELETED);
List<LiquidTankReportExcel> list = service.exportLiquidTankReport(qw);
ExcelUtil.export(response, "[槽液报告]数据" + DateUtil.time(),
"[槽液报告]数据表", list, LiquidTankReportExcel.class);
}
/**
* [槽液报告] 下载Excel模板
*/
@GetMapping("/downloadExcelTemplate")
@ApiOperationSupport(order = 71)
@Operation(summary = "下载Excel模板", description = "")
public ResponseEntity<org.springframework.core.io.Resource> downloadExcelTemplate() {
return ExcelExtUtil.downloadXlsTemplate(
"Excel/QA/ImportTemplate-CycleTestItem.xls",
"导入模版-周期试验项目.xls");
}
/**
* [槽液报告] 导入Excel
*/
@PostMapping("/importExcel")
@ApiOperationSupport(order = 72)
@Operation(summary = "导入Excel", description = "MultipartFile")
public R importExcel(@RequestParam("file") MultipartFile file) {
R checkR = ExcelExtUtil.importExcelCheck(file);
if (checkR != null) {
return checkR;
}
List<LiquidTankReport> importList = ExcelUtil.read(
file, 0, 1, LiquidTankReport.class
);
return R.status(service.saveBatch(importList));
}
@GetMapping("/downloadExcelTemplate")
@ApiOperationSupport(order = 71)
@Operation(summary = "下载Excel模板", description = "")
public ResponseEntity<org.springframework.core.io.Resource> downloadExcelTemplate() {
return ExcelExtUtil.downloadXlsTemplate(
"Excel/QA/ImportTemplate-CycleTestItem.xls",
"导入模版-周期试验项目.xls");
}
/**
* [槽液报告] 导入Excel
*/
@PostMapping("/importExcel")
@ApiOperationSupport(order = 72)
@Operation(summary = "导入Excel", description = "MultipartFile")
public R importExcel(@RequestParam("file") MultipartFile file) {
R checkR = ExcelExtUtil.importExcelCheck(file);
if (checkR != null) {
return checkR;
}
List<LiquidTankReport> importList = ExcelUtil.read(
file, 0, 1, LiquidTankReport.class
);
return R.status(service.saveBatch(importList));
}
}

@ -8,12 +8,14 @@ import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
/**
@ -28,193 +30,49 @@ import java.time.LocalDateTime;
@ContentRowHeight(18)
public class CycleTestExcel implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Serial
private static final long serialVersionUID = 1L;
/**
* [周期试验]编码
*/
@ColumnWidth(20)
@ExcelProperty("[周期试验]编码")
private String code;
/**
* [周期试验]类型
*/
@ColumnWidth(20)
@ExcelProperty("[周期试验]类型")
private Long cycleTestType;
/**
* 名称
*/
@ColumnWidth(20)
@ExcelProperty("名称")
private String name;
/**
* [班组]id
*/
@ColumnWidth(20)
@ExcelProperty("[班组]id")
private BigDecimal teamId;
/**
* [供应商]id
*/
@ColumnWidth(20)
@ExcelProperty("[供应商]id")
private BigDecimal supplierId;
/**
* [周期试验项目]id
*/
@ColumnWidth(20)
@ExcelProperty("[周期试验项目]id")
private BigDecimal cycleTestItemId;
/**
* 试验件类型-[1]:零件;[2]:试片;
*/
@ColumnWidth(20)
@ExcelProperty("试验件类型-[1]:零件;[2]:试片;")
private BigDecimal testType;
/**
* 工艺员[用户]id
*/
@ColumnWidth(20)
@ExcelProperty("工艺员[用户]id")
private BigDecimal processUserId;
/**
* 试验技术员[用户]id
*/
@ColumnWidth(20)
@ExcelProperty("试验技术员[用户]id")
private BigDecimal testUserId;
/**
* [镀种]id
*/
@ColumnWidth(20)
@ExcelProperty("[镀种]id")
private BigDecimal plateId;
/**
* 生成任务说明
*/
@ColumnWidth(20)
@ExcelProperty("生成任务说明")
private String descGenTask;
/**
* 临期提醒说明
*/
@ColumnWidth(20)
@ExcelProperty("临期提醒说明")
private String descRemind;
/**
* 提醒文本
*/
@ColumnWidth(20)
@ExcelProperty("提醒文本")
private String remindText;
/**
* 排序
*/
@ColumnWidth(20)
@ExcelProperty("排序")
private Long sort;
/**
* 备注
*/
@ColumnWidth(20)
@ExcelProperty("备注")
private String remark;
/**
* 上次试验日期
*/
@ColumnWidth(20)
@ExcelProperty("上次试验日期")
private LocalDateTime lastTestDate;
/**
* 生成任务JobId
*/
@ColumnWidth(20)
@ExcelProperty("生成任务JobId")
private String jobIdsGenTask;
/**
* 临期提醒JobId
*/
@ColumnWidth(20)
@ExcelProperty("临期提醒JobId")
private String jobIdsRemind;
/**
* 试验时长()
*/
@ColumnWidth(20)
@ExcelProperty("试验时长(天)")
private Long testDuration;
/**
* 提前下发()
*/
@ColumnWidth(20)
@ExcelProperty("提前下发(天)")
private Long genBefore;
/**
* 临期提醒()
*/
@ColumnWidth(20)
@ExcelProperty("临期提醒(天)")
private Long remind;
/**
* 定时类型-[1]:WEEK;[2]:MONTH;[3]:YEAR;[4]:CUSTOM;
*/
@ColumnWidth(20)
@ExcelProperty("定时类型-[1]:WEEK;[2]:MONTH;[3]:YEAR;[4]:CUSTOM;")
private Long jobType;
/**
* 定时WEEK值
*/
@ColumnWidth(20)
@ExcelProperty("定时WEEK值")
private String jobTypeWeekValue;
/**
* 定时MONTH值
*/
@ColumnWidth(20)
@ExcelProperty("定时MONTH值")
private String jobTypeMonthValue;
/**
* 定时YEAR值
*/
@ColumnWidth(20)
@ExcelProperty("定时YEAR值")
private String jobTypeYearValue;
/**
* 定时CUSTOM值
*/
@ColumnWidth(20)
@ExcelProperty("定时CUSTOM值")
private String jobTypeCustomValue;
/**
* 生成任务 json config
*/
@ColumnWidth(20)
@ExcelProperty("生成任务 json config")
private String jsonConfigGenTask;
/**
* 临期提醒 json config
*/
@ColumnWidth(20)
@ExcelProperty("临期提醒 json config")
private String jsonConfigRemind;
/**
* 是否顺延-[1]:;[0]:;
*/
@ColumnWidth(20)
@ExcelProperty("是否顺延-[1]:是;[0]:否;")
private Long isPutOff;
/**
* 最小试验数量
*/
@ColumnWidth(20)
@ExcelProperty("最小试验数量")
private Long minDoTestCount;
/**
* 试验件材料
*/
@ColumnWidth(20)
@ExcelProperty("试验件材料")
private String testMat;
@Schema(description = "[镀种]多个名称")
@ColumnWidth(20)
@ExcelProperty("镀种")
private String plateNames;
@Schema(description = "[周期试验项目]名称")
@ColumnWidth(20)
@ExcelProperty("试验项目")
private String cycleTestItemName;
@Schema(description = "[周期试验项目]试验条件")
@ColumnWidth(20)
@ExcelProperty("试验条件")
private String cycleTestItemCondition;
@Schema(description = "[周期试验标准]名称")
@ColumnWidth(20)
@ExcelProperty("试验标准")
private String cycleTestStandardName;
@Schema(description = "试验件类型 名称")
@ColumnWidth(20)
@ExcelProperty("试验件")
private String testTypeName;
@Schema(description = "试验件材料")
@ColumnWidth(20)
@ExcelProperty("试验件材料")
private String testMat;
@Schema(description = "试验周期")
@ColumnWidth(20)
@ExcelProperty("试验周期")
private String jobExtShowText;
@Schema(description = "最小试验数量")
@ColumnWidth(20)
@ExcelProperty("最小试验数量")
private Integer minDoTestCount;
@Schema(description = "提前下发天数")
@ColumnWidth(20)
@ExcelProperty("提前下发天数")
private Integer genBefore;
@ColumnWidth(20)
@ExcelProperty("超期提醒天数")
private Integer remind;
@ColumnWidth(20)
@ExcelProperty("更新时间")
private Date updateTime;
}

@ -45,6 +45,6 @@ public class CycleTestItemExcel implements Serializable {
* 试验标准
*/
@ColumnWidth(20)
@ExcelProperty("试验标准")
private String standard;
@ExcelProperty("执行标准")
private String cycleTestStandardName;
}

@ -76,7 +76,7 @@ public class CycleTestTaskExcel implements Serializable {
*/
@Schema(description = "工艺员[用户]姓名")
@ColumnWidth(20)
@ExcelProperty("状态")
@ExcelProperty("工艺员")
private String processUserName;
/**
* 任务生成时间

@ -17,11 +17,6 @@ public class CycleTestTaskClient implements ICycleTestTaskClient {
service.generateAuto();
}
@Override
public void generateOneTime() {
service.generateOneTime();
}
@Override
public void checkRemind() {
service.checkRemind();

@ -3,6 +3,9 @@ package org.springblade.desk.quality.feign;
import io.swagger.v3.oas.annotations.Hidden;
import jakarta.annotation.Resource;
import org.springblade.desk.quality.pojo.entity.LiquidTankTask;
import org.springblade.desk.quality.service.ILiquidTankService;
import org.springblade.desk.quality.service.ILiquidTankTaskService;
import org.springblade.desk.quality.service.LiquidTankService2;
import org.springblade.desk.quality.service.LiquidTankTaskService222;
import org.springframework.web.bind.annotation.RestController;
@ -13,16 +16,21 @@ import java.util.List;
public class LiquidTankTaskClient implements ILquidTankTaskClient {
@Resource
private LiquidTankTaskService222 service;
private ILiquidTankTaskService service;
@Override
public List<LiquidTankTask> generate() {
return null;// todo:
public void generateAuto() {
service.generateAuto();
}
@Override
public List<LiquidTankTask> timeout() {
return service.timeout();
public void checkRemind() {
service.checkRemind();
}
@Override
public void checkOut() {
service.checkOut();
}
}

@ -18,7 +18,7 @@
<select id="selectCycleTestItemPage" resultMap="cycleTestItemResultMap">
SELECT *
FROM QA_CYCLE_TEST_ITEM
WHERE is_deleted = 0
WHERE IS_DELETED = 0
<if test="q.name != null and q.name != ''">
AND NAME LIKE '%' || #{q.name} || '%'
</if>

@ -9,7 +9,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import org.springblade.desk.quality.excel.CycleTestExcel;
import org.springblade.desk.quality.pojo.entity.CycleTest;
import org.springblade.desk.quality.pojo.request.CycleTestSearch;
import org.springblade.desk.quality.pojo.vo.CycleTestVO;
import org.springblade.desk.quality.pojo.vo.InspectionTaskListVO;
import java.util.List;
@ -37,4 +39,8 @@ public interface CycleTestMapper extends BaseMapper<CycleTest> {
* @return List<CycleTestExcel>
*/
List<CycleTestExcel> exportCycleTest(@Param("ew") Wrapper<CycleTest> queryWrapper);
List<CycleTestVO> listSearch(IPage<CycleTestVO> page, @Param("q") CycleTestSearch q);
List<CycleTestVO> listSearchWithoutPage(@Param("q") CycleTestSearch q);
}

@ -42,7 +42,7 @@
<select id="selectCycleTestPage" resultMap="cycleTestResultMap">
SELECT *
FROM QA_CYCLE_TEST
WHERE is_deleted = 0
WHERE IS_DELETED = 0
<if test="q.cycleTestItemId != null and q.cycleTestItemId != 0">
AND CYCLE_TEST_ITEM_ID = #{q.cycleTestItemId}
</if>
@ -54,4 +54,78 @@
SELECT *
FROM QA_CYCLE_TEST ${ew.customSqlSegment}
</select>
<select id="listSearch"
resultType="org.springblade.desk.quality.pojo.vo.CycleTestVO">
SELECT t.*
FROM QA_CYCLE_TEST t
-- 用户 bl_user
LEFT JOIN BLADE_USER bl_user on t.PROCESS_USER_ID = bl_user.ID
-- 试验项目 item
LEFT JOIN QA_CYCLE_TEST_ITEM item ON t.CYCLE_TEST_ITEM_ID = item.ID
-- 试验标准 std
LEFT JOIN QA_CYCLE_TEST_STANDARD std ON item.CYCLE_TEST_STANDARD_ID = std.ID
WHERE (
t.IS_DELETED = 0
)
<if test="q.cycleTestItemId != null">
AND t.CYCLE_TEST_ITEM_ID = #{q.cycleTestItemId}
</if>
<if test="q.plateId != null and q.plateId != ''">
AND ',' || t.PLATE_IDS || ',' LIKE '%,' || #{q.plateId} || ',%'
</if>
<if test="q.testType != null and q.testType != 0">
AND t.TEST_TYPE = #{q.testType}
</if>
<if test="q.cycleTestItemCondition != null and q.cycleTestItemCondition != ''">
AND item.CONDITION LIKE '%' || #{q.cycleTestItemCondition} || '%'
</if>
<if test="q.cycleTestStandardName != null and q.cycleTestStandardName != ''">
AND std.NAME LIKE '%' || #{q.cycleTestStandardName} || '%'
</if>
<if test="q.processUserId != null">
AND t.PROCESS_USER_ID = #{q.processUserId}
</if>
<if test="q.jobType != null">
AND t.JOB_TYPE = #{q.jobType}
</if>
ORDER BY t.ID DESC
</select>
<select id="listSearchWithoutPage"
resultType="org.springblade.desk.quality.pojo.vo.CycleTestVO">
SELECT t.*
FROM QA_CYCLE_TEST t
-- 用户 bl_user
LEFT JOIN BLADE_USER bl_user on t.PROCESS_USER_ID = bl_user.ID
-- 试验项目 item
LEFT JOIN QA_CYCLE_TEST_ITEM item ON t.CYCLE_TEST_ITEM_ID = item.ID
-- 试验标准 std
LEFT JOIN QA_CYCLE_TEST_STANDARD std ON item.CYCLE_TEST_STANDARD_ID = std.ID
WHERE (
t.IS_DELETED = 0
)
<if test="q.cycleTestItemId != null">
AND t.CYCLE_TEST_ITEM_ID = #{q.cycleTestItemId}
</if>
<if test="q.plateId != null and q.plateId != ''">
AND ',' || t.PLATE_IDS || ',' LIKE '%,' || #{q.plateId} || ',%'
</if>
<if test="q.testType != null and q.testType != 0">
AND t.TEST_TYPE = #{q.testType}
</if>
<if test="q.cycleTestItemCondition != null and q.cycleTestItemCondition != ''">
AND item.CONDITION LIKE '%' || #{q.cycleTestItemCondition} || '%'
</if>
<if test="q.cycleTestStandardName != null and q.cycleTestStandardName != ''">
AND std.NAME LIKE '%' || #{q.cycleTestStandardName} || '%'
</if>
<if test="q.processUserId != null">
AND t.PROCESS_USER_ID = #{q.processUserId}
</if>
<if test="q.jobType != null">
AND t.JOB_TYPE = #{q.jobType}
</if>
ORDER BY t.ID DESC
</select>
</mapper>

@ -37,6 +37,8 @@
<result column="FLAG_APPROACH" property="flagApproach"/>
<result column="FLAG_OUT" property="flagOut"/>
<result column="REASON_FOR_OUT" property="reasonForOut"/>
<result column="DAY_TO_PLANED_FINISH" property="dayToPlanedFinish"/>
<result column="DAY_TO_OUT" property="dayToOut"/>
</resultMap>
<select id="selectCycleTestTaskPage" resultMap="cycleTestTaskResultMap">
@ -103,12 +105,21 @@
<if test="q.createTimeEnd != null">
AND t.CREATE_TIME &lt;= #{q.createTimeEnd}
</if>
<if test="q.genDatetimeStart != null">
AND t.CREATE_TIME &gt;= #{q.genDatetimeStart}
</if>
<if test="q.genDatetimeEnd != null">
AND t.CREATE_TIME &lt;= #{q.genDatetimeEnd}
</if>
<if test="q.testType != null">
AND t.TEST_TYPE = #{q.testType}
</if>
<if test="q.code != null and q.code != ''">
AND t.CODE LIKE '%' || #{q.code} || '%'
</if>
<if test="q.cycleTestItemId != null">
AND item.ID = #{q.cycleTestItemId}
</if>
<if test="q.cycleTestItemName != null and q.cycleTestItemName != ''">
AND item.NAME LIKE '%' || #{q.cycleTestItemName} || '%'
</if>
@ -145,6 +156,12 @@
<if test="q.finishDateEnd != null">
AND t.FINISH_DATE &lt;= #{q.finishDateEnd}
</if>
<if test="q.dayToPlanedFinish != null">
AND t.DAY_TO_PLANED_FINISH = #{q.dayToPlanedFinish}
</if>
<if test="q.dayToOut != null">
AND t.DAY_TO_OUT = #{q.dayToOut}
</if>
ORDER BY t.STATUS ASC,t.CREATE_TIME ASC
</select>
@ -187,12 +204,21 @@
<if test="q.createTimeEnd != null">
AND t.CREATE_TIME &lt;= #{q.createTimeEnd}
</if>
<if test="q.genDatetimeStart != null">
AND t.CREATE_TIME &gt;= #{q.genDatetimeStart}
</if>
<if test="q.genDatetimeEnd != null">
AND t.CREATE_TIME &lt;= #{q.genDatetimeEnd}
</if>
<if test="q.testType != null">
AND t.TEST_TYPE = #{q.testType}
</if>
<if test="q.code != null and q.code != ''">
AND t.CODE LIKE '%' || #{q.code} || '%'
</if>
<if test="q.cycleTestItemId != null">
AND item.ID = #{q.cycleTestItemId}
</if>
<if test="q.cycleTestItemName != null and q.cycleTestItemName != ''">
AND item.NAME LIKE '%' || #{q.cycleTestItemName} || '%'
</if>
@ -229,6 +255,12 @@
<if test="q.finishDateEnd != null">
AND t.FINISH_DATE &lt;= #{q.finishDateEnd}
</if>
<if test="q.dayToPlanedFinish != null">
AND t.DAY_TO_PLANED_FINISH = #{q.dayToPlanedFinish}
</if>
<if test="q.dayToOut != null">
AND t.DAY_TO_OUT = #{q.dayToOut}
</if>
ORDER BY t.STATUS ASC,t.CREATE_TIME ASC
</select>
</mapper>

@ -47,9 +47,7 @@ public class CycleTestItemService2 {
* @param query
* @return
*/
public R<IPage<CycleTestItemVO>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> map,
Query query) {
public R<IPage<CycleTestItemVO>> list(Map<String, Object> map, Query query) {
QueryWrapper<CycleTestItem> qw = Condition.getQueryWrapper(map, CycleTestItem.class);
qw.orderByDesc(BaseCol.ID);
IPage<CycleTestItem> pages = service.page(Condition.getPage(query), qw);
@ -61,6 +59,23 @@ public class CycleTestItemService2 {
return R.data(pagesVO);
}
/**
* list 不分页
*
* @param map
* @return
*/
public List<CycleTestItemVO> listWithoutPage(Map<String, Object> map) {
QueryWrapper<CycleTestItem> qw = Condition.getQueryWrapper(map, CycleTestItem.class);
qw.orderByDesc(BaseCol.ID);
List<CycleTestItem> pages = service.list(qw);
List<CycleTestItemVO> pagesVO = CycleTestItemWrapper.build().listVO(pages);
pagesVO.stream()
.peek(this::setVOValue)
.collect(Collectors.toList());
return pagesVO;
}
/**
* search
*

@ -1,5 +1,6 @@
package org.springblade.desk.quality.service;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.v3.oas.annotations.Parameter;
@ -19,9 +20,11 @@ import org.springblade.desk.quality.pojo.entity.CycleTest;
import org.springblade.desk.quality.pojo.entity.CycleTestItem;
import org.springblade.desk.quality.pojo.entity.CycleTestStandard;
import org.springblade.desk.quality.pojo.request.CycleTestBatUpdateCycle;
import org.springblade.desk.quality.pojo.request.CycleTestSearch;
import org.springblade.desk.quality.pojo.request.JobExt;
import org.springblade.desk.quality.pojo.vo.CycleTestVO;
import org.springblade.desk.quality.pojo.vo.CycleTestStandardVO;
import org.springblade.desk.quality.util.JobExtUtil;
import org.springblade.desk.quality.wrapper.CycleTestStandardWrapper;
import org.springblade.desk.quality.wrapper.CycleTestWrapper;
import org.springblade.resource.feign.IAttachClient;
@ -128,20 +131,18 @@ public class CycleTestService2 {
}
/**
* list
* list 不分页
*
* @param cycleTest
* @param query
* @return
*/
public R<IPage<CycleTestVO>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> cycleTest,
Query query) {
IPage<CycleTest> pages = service.page(Condition.getPage(query),
Condition.getQueryWrapper(cycleTest, CycleTest.class).orderByAsc(BaseCol.ID)
);
IPage<CycleTestVO> pagesVO = CycleTestWrapper.build().pageVO(pages);
pagesVO.getRecords().stream().peek(this::setVOValue).collect(Collectors.toList());
return R.data(pagesVO);
public List<CycleTestVO> listWithoutPage(Map<String, Object> cycleTest) {
QueryWrapper<CycleTest> qw = Condition.getQueryWrapper(cycleTest, CycleTest.class);
qw.orderByAsc(BaseCol.ID);
List<CycleTest> pages = service.list(qw);
List<CycleTestVO> pagesVO = CycleTestWrapper.build().listVO(pages);
pagesVO.stream().peek(this::setVOValue).collect(Collectors.toList());
return pagesVO;
}
/**
@ -194,16 +195,22 @@ public class CycleTestService2 {
{
StringBuilder names = new StringBuilder();
List<Long> idList = Func.toLongList(vo.getPlateIds());
idList.forEach(id -> {
names.append(platingService.getById(id).getPlating());
names.append(",");
});
String namesF = names.toString();
if (StringUtils.isNotBlank(namesF) && StringUtils.endsWith(namesF, ",")) {
// 去掉结尾,
StringUtils.removeEnd(namesF, ",");
// 循环拼接
for (int i = 0; i < idList.size(); i++) {
names.append(platingService.getById(idList.get(i)).getPlating());
if (i != idList.size() - 1) { // 去掉结尾,
names.append(",");
}
}
vo.setPlateNames(names.toString());
}
//
{
if (vo.getJobType() != null && vo.getJobType() != 0) {
JobExt je = new JobExt();
BeanUtil.copyProperties(vo, je);
vo.setJobExtShowText(JobExtUtil.getShowText(je));
}
vo.setPlateNames(namesF);
}
}
}

@ -278,10 +278,6 @@ public class CycleTestTaskService2 {
return true;
}
public void generateOneTime() {
List<CycleTest> ctList = cycleTestService.list();
}
/**
* 手动生成
*
@ -472,15 +468,10 @@ public class CycleTestTaskService2 {
.toInstant();
return mapper.selectCount(
new LambdaQueryWrapper<CycleTestTask>()
.between(CycleTestTask::getCreateTime,
Date.from(leftInstant), Date.from(rightInstant))
.between(CycleTestTask::getCreateTime, Date.from(leftInstant), Date.from(rightInstant))
);
}
private LocalDate issueDate(CycleTestTask t) {
return null;
}
/**
* 任务计划结束日期/超期日期
*
@ -514,7 +505,7 @@ public class CycleTestTaskService2 {
}
/**
* 临期天数
* 计算临期天数
* 临期天数 0时红色
* 临期天数 0~7 橙色
* 临期天数 >= 7时黄色
@ -526,18 +517,18 @@ public class CycleTestTaskService2 {
* @param id
* @return
*/
public String getCountDayToOut(Long id) {
public Integer getCountDayToOut(Long id) {
CycleTestTask task = service.getById(id);
if (Objects.equals(task.getStatus(), CycleTestTaskConst.S_PENDING_ACCEPT) ||
Objects.equals(task.getStatus(), CycleTestTaskConst.S_PENDING_TEST)) {
LocalDate outLD = getOutDate(id);
if (outLD == null) {
return "";
return 0;
}
long daysDiff = ChronoUnit.DAYS.between(LocalDate.now(), outLD);
return "" + (int) daysDiff;
return (int) daysDiff;
}
return "";
return 0;
}
/**
@ -563,9 +554,12 @@ public class CycleTestTaskService2 {
if (todayLD.isEqual(remindLD) || (todayLD.isAfter(remindLD) && todayLD.isBefore(outLD))) {
task.setFlagOut(BaseValue.NO);
task.setFlagApproach(BaseValue.YES);
// 更新状态
service.updateById(task);
// todo:消息中心 进行临期提醒
}
// 设置临期天数
task.setDayToPlanedFinish(getCountDayToOut(task.getId()));
// 更新状态
service.updateById(task);
}
}
@ -591,6 +585,7 @@ public class CycleTestTaskService2 {
if (todayLD.isEqual(outLD) || todayLD.isAfter(outLD)) {
task.setFlagOut(BaseValue.YES);
task.setFlagApproach(BaseValue.NO);
// todo:消息中心 进行超期提醒
// 更新状态
service.updateById(task);
}

@ -10,6 +10,7 @@ import org.springblade.core.tool.api.R;
import org.springblade.desk.quality.excel.CycleTestExcel;
import org.springblade.desk.quality.excel.CycleTestExcelImport;
import org.springblade.desk.quality.pojo.entity.CycleTest;
import org.springblade.desk.quality.pojo.request.CycleTestSearch;
import org.springblade.desk.quality.pojo.request.CycleTestSubmit;
import org.springblade.desk.quality.pojo.vo.CycleTestVO;
import org.springframework.web.multipart.MultipartFile;
@ -41,6 +42,10 @@ public interface ICycleTestService extends BaseService<CycleTest> {
*/
List<CycleTestExcel> exportCycleTest(Wrapper<CycleTest> queryWrapper);
IPage<CycleTestVO> listSearch(IPage<CycleTestVO> page, CycleTestSearch search);
List<CycleTestVO> listSearchWithoutPage(CycleTestSearch search);
/**
* VO
*

@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseService;
import org.springblade.desk.quality.excel.LiquidTankReportExcel;
import org.springblade.desk.quality.pojo.entity.LiquidTankReport;
import org.springblade.desk.quality.pojo.vo.LiquidTankReportDetailVO;
import org.springblade.desk.quality.pojo.vo.LiquidTankReportVO;
import java.util.List;

@ -45,4 +45,6 @@ public interface ILiquidTankTaskCopyService extends BaseService<LiquidTankTaskCo
R generateReport(@Valid @RequestBody List<LiquidTankTaskCopy> list);
R generateWave(@Valid @RequestBody List<LiquidTankTaskCopy> list);
List<LiquidTankTaskCopyVO> getListByLiquidTankReportId(Long liquidTankReportId);
}

@ -66,4 +66,10 @@ public interface ILiquidTankTaskService extends BaseService<LiquidTankTask> {
R finishFail(Long id, String finishReason);
void setVOValue(LiquidTankTaskVO vo);
void generateAuto();
void checkRemind();
void checkOut();
}

@ -19,20 +19,22 @@ import java.util.List;
* @since 2025-12-18
*/
public interface IRelTankReportItemService extends BaseService<RelTankReportItem> {
/**
* 自定义分页
*
* @param page 分页参数
* @param relTankReportItem 查询参数
* @return IPage<RelTankReportItemVO>
*/
IPage<RelTankReportItemVO> selectRelTankReportItemPage(IPage<RelTankReportItemVO> page, RelTankReportItemVO relTankReportItem);
/**
* 导出数据
*
* @param queryWrapper 查询条件
* @return List<RelTankReportItemExcel>
*/
List<RelTankReportItemExcel> exportRelTankReportItem(Wrapper<RelTankReportItem> queryWrapper);
/**
* 自定义分页
*
* @param page 分页参数
* @param relTankReportItem 查询参数
* @return IPage<RelTankReportItemVO>
*/
IPage<RelTankReportItemVO> selectRelTankReportItemPage(IPage<RelTankReportItemVO> page,
RelTankReportItemVO relTankReportItem);
/**
* 导出数据
*
* @param queryWrapper 查询条件
* @return List<RelTankReportItemExcel>
*/
List<RelTankReportItemExcel> exportRelTankReportItem(Wrapper<RelTankReportItem> queryWrapper);
}

@ -14,6 +14,8 @@ import lombok.EqualsAndHashCode;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springblade.desk.basic.config.RoleConfig;
@ -23,6 +25,7 @@ import org.springblade.desk.quality.excel.listener.in.CycleTestListener;
import org.springblade.desk.quality.mapper.CycleTestMapper;
import org.springblade.desk.quality.pojo.entity.CycleTest;
import org.springblade.desk.quality.pojo.entity.CycleTestItem;
import org.springblade.desk.quality.pojo.request.CycleTestSearch;
import org.springblade.desk.quality.pojo.request.CycleTestSubmit;
import org.springblade.desk.quality.pojo.vo.CycleTestVO;
import org.springblade.desk.quality.service.ICycleTestItemService;
@ -35,6 +38,8 @@ import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* [周期试验] 服务实现类
@ -73,6 +78,16 @@ public class CycleTestServiceImpl extends BaseServiceImpl<CycleTestMapper, Cycle
return cycleTestList;
}
@Override
public IPage<CycleTestVO> listSearch(IPage<CycleTestVO> page, CycleTestSearch search) {
return page.setRecords(baseMapper.listSearch(page, search));
}
@Override
public List<CycleTestVO> listSearchWithoutPage(CycleTestSearch search) {
return baseMapper.listSearchWithoutPage(search);
}
@Override
public void setVOValue(CycleTestVO vo) {

@ -169,6 +169,12 @@ public class InspectionTaskServiceImpl extends BaseServiceImpl<InspectionTaskMap
// 新建 InspectionTask
InspectionTask task = new InspectionTask();
task.setId(null);
//
if (Objects.equals(fromType, InspectionTaskConst.FROM_TYPE_RB)) {
task.setProcessName(InspectionTaskConst.PROCESS_NAME_SJBZFH);
} else {
task.setProcessName("测试工序2000");
}
task.setStatus(InspectionTaskConst.CHECK_RESULT_TODO);
// todo: fake data
task.setWoId(2002227460172464129L);

@ -11,12 +11,17 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.desk.basic.util.IdUtil;
import org.springblade.desk.quality.excel.LiquidTankReportExcel;
import org.springblade.desk.quality.mapper.LiquidTankReportMapper;
import org.springblade.desk.quality.pojo.entity.LiquidTankReport;
import org.springblade.desk.quality.pojo.vo.LiquidTankReportDetailVO;
import org.springblade.desk.quality.pojo.vo.LiquidTankReportVO;
import org.springblade.desk.quality.service.ILiquidTankReportService;
import org.springblade.desk.quality.service.ILiquidTankTaskCopyService;
import org.springblade.desk.quality.service.IRelTankReportItemService;
import org.springblade.system.feign.IUserClient;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import java.util.List;
@ -32,7 +37,11 @@ import java.util.List;
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Slf4j
public class LiquidTankReportServiceImpl extends BaseServiceImpl<LiquidTankReportMapper, LiquidTankReport> implements ILiquidTankReportService {
public class LiquidTankReportServiceImpl extends BaseServiceImpl<LiquidTankReportMapper, LiquidTankReport>
implements ILiquidTankReportService {
@Resource
private IRelTankReportItemService relTankReportItemService;
@Resource
private IUserClient userClient;
@ -53,6 +62,8 @@ public class LiquidTankReportServiceImpl extends BaseServiceImpl<LiquidTankRepor
@Override
public void setVOValue(LiquidTankReportVO vo) {
vo.setUpdateUserRealName(userClient.userInfo(vo.getUpdateUser()).getData().getUser().getRealName());
if (IdUtil.isValid(vo.getUpdateUser())) {
vo.setUpdateUserRealName(userClient.userInfo(vo.getUpdateUser()).getData().getUser().getRealName());
}
}
}

@ -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;
@ -22,9 +24,11 @@ import org.springblade.desk.quality.pojo.vo.LiquidTankTaskCopyVO;
import org.springblade.desk.quality.pojo.vo.LiquidTankTaskVO;
import org.springblade.desk.quality.service.*;
import org.springblade.desk.quality.util.CodeUtil;
import org.springblade.desk.quality.wrapper.LiquidTankTaskCopyWrapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
@ -41,6 +45,9 @@ import java.util.List;
public class LiquidTankTaskCopyServiceImpl extends BaseServiceImpl<LiquidTankTaskCopyMapper, LiquidTankTaskCopy>
implements ILiquidTankTaskCopyService {
@Resource
private IWorkCenterService workCenterService;
@Resource
private ILiquidTankReportService reportService;
@Resource
@ -53,8 +60,7 @@ public class LiquidTankTaskCopyServiceImpl extends BaseServiceImpl<LiquidTankTas
private IRelTankReportItemService relReportItemService;
@Resource
private IRelTankWaveItemService relTankWaveItemService;
@Resource
private IWorkCenterService workCenterService;
@Override
public IPage<LiquidTankTaskCopyVO> selectLiquidTankTaskCopyPage(IPage<LiquidTankTaskCopyVO> page, LiquidTankTaskCopyVO liquidTankTaskCopy) {
@ -86,7 +92,7 @@ public class LiquidTankTaskCopyServiceImpl extends BaseServiceImpl<LiquidTankTas
}
WorkCenter wc = workCenterService.getById(list.get(0).getWorkCenterId());
if (wc == null) {
return R.fail("WorkCenter错误");
return R.fail("作业中心错误");
}
// 保存copy任务list数据
updateBatchById(list);
@ -103,7 +109,7 @@ public class LiquidTankTaskCopyServiceImpl extends BaseServiceImpl<LiquidTankTas
// 保存关联关系
relReportItemService.save(item);
}
return R.success();
return R.success("生成报告成功");
}
@Transactional
@ -114,7 +120,7 @@ public class LiquidTankTaskCopyServiceImpl extends BaseServiceImpl<LiquidTankTas
}
WorkCenter wc = workCenterService.getById(list.get(0).getWorkCenterId());
if (wc == null) {
return R.fail("WorkCenter错误");
return R.fail("作业中心错误");
}
// 保存copy任务list数据
updateBatchById(list);
@ -129,6 +135,22 @@ public class LiquidTankTaskCopyServiceImpl extends BaseServiceImpl<LiquidTankTas
// 保存关联关系
relTankWaveItemService.save(item);
}
return R.success();
return R.success("生成曲线成功");
}
@Override
public List<LiquidTankTaskCopyVO> getListByLiquidTankReportId(Long liquidTankReportId) {
LambdaQueryWrapper<RelTankReportItem> qw = Wrappers.lambdaQuery();
qw.eq(RelTankReportItem::getLiquidTankReportId, liquidTankReportId);
List<RelTankReportItem> relList = relReportItemService.list(qw);
List<LiquidTankTaskCopyVO> copyList = new ArrayList<>();
for (RelTankReportItem relOne : relList) {
Long taskId = relOne.getLiquidTankTaskId();
LiquidTankTaskCopy copy = getById(taskId);
LiquidTankTaskCopyVO copyVO = LiquidTankTaskCopyWrapper.build().entityVO(copy);
setVOValue(copyVO);
copyList.add(copyVO);
}
return copyList;
}
}

@ -293,17 +293,18 @@ public class LiquidTankTaskServiceImpl extends BaseServiceImpl<LiquidTankTaskMap
}
/**
* todo:
* 定时运行:每天00:00
* 周期性自动生成槽液任务
*
* @return 所有生成的任务
*/
public List<LiquidTankTask> generateAuto() {
public void generateAuto() {
log.info("========generate========start");
// 如果是节假日,则跳过生成。
// 如果是节假日,则跳过生成。 todo:
if (false) {
log.info("节假日,则跳过生成。");
return null;
return;
}
// 查询所有启用的槽液。
List<LiquidTank> tankList = liquidTankService.list(
@ -327,7 +328,16 @@ public class LiquidTankTaskServiceImpl extends BaseServiceImpl<LiquidTankTaskMap
rList.add(task);
}
log.info("========generate========end");
return rList;
}
@Override
public void checkRemind() {
// todo:
}
@Override
public void checkOut() {
// todo:
}
/**

@ -2,6 +2,7 @@ package org.springblade.desk.quality.util;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springblade.core.tool.utils.Func;
import org.springblade.desk.quality.pojo.request.JobExt;
import java.time.*;
@ -244,6 +245,46 @@ public class JobExtUtil {
return dow == DayOfWeek.MONDAY;
}
/**
* JobExt 对象语义化界面表达
*
* @param je
* @return
*/
public static String getShowText(JobExt je) {
if (je == null) {
return "";
}
Integer type = je.getJobType();
if (type == null || type == 0) {
return "无效的类型";
}
StringBuilder sb = new StringBuilder();
if (type.equals(WEEK)) {
if (StringUtils.isBlank(je.getJobTypeWeekValue())) {
return "";
}
List<Integer> list = Func.toIntList(je.getJobTypeWeekValue());
sb.append(list.size());
sb.append("次/周");
} else if (type.equals(MONTH)) {
if (StringUtils.isBlank(je.getJobTypeMonthValue())) {
return "";
}
List<String> list = Func.toStrList(je.getJobTypeMonthValue());
sb.append(list.size());
sb.append("次/月");
} else if (type.equals(YEAR)) {
if (StringUtils.isBlank(je.getJobTypeYearValue())) {
return "";
}
List<String> list = Func.toStrList(je.getJobTypeYearValue());
sb.append(list.size());
sb.append("次/年");
}
return sb.toString();
}
/**
* 测试执行
*

@ -0,0 +1,37 @@
/**
* Author: Tom Shuo
*/
package org.springblade.desk.quality.wrapper;
import org.springblade.core.mp.support.BaseEntityWrapper;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.desk.quality.pojo.entity.LiquidTankReport;
import org.springblade.desk.quality.pojo.vo.LiquidTankReportDetailVO;
import org.springblade.desk.quality.pojo.vo.LiquidTankReportVO;
import java.util.Objects;
/**
* [槽液报告] 包装类,返回视图层所需的字段
*
* @author Tom Shuo
* @since 2025-12-18
*/
public class LiquidTankReportDetailWrapper extends BaseEntityWrapper<LiquidTankReport, LiquidTankReportDetailVO> {
public static LiquidTankReportDetailWrapper build() {
return new LiquidTankReportDetailWrapper();
}
@Override
public LiquidTankReportDetailVO entityVO(LiquidTankReport liquidTankReport) {
LiquidTankReportDetailVO VO = Objects.requireNonNull(BeanUtil.copyProperties(liquidTankReport, LiquidTankReportDetailVO.class));
//User createUser = UserCache.getUser(liquidTankReport.getCreateUser());
//User updateUser = UserCache.getUser(liquidTankReport.getUpdateUser());
//liquidTankReportVO.setCreateUserName(createUser.getName());
//liquidTankReportVO.setUpdateUserName(updateUser.getName());
return VO;
}
}

@ -45,17 +45,17 @@ request:
orgId: 16
#业务系统id
systemId: 344123
url: http://192.168.169.32:80720
url: "http://192.168.169.32:80720"
iotNew:
url: http://192.168.169.23:8072
url: "http://192.168.169.23:8072"
#量具使用记录
measuringTool:
url: "192.168.191.11:8888"
url: "http://192.168.191.11:8888"
#计量记录
lims:
url: "http://192.168.169.50:30000"
#飞拔信息接口请求地址
equ:
url: http://192.168.169.69
url: "http://192.168.169.69"
logging:
config: classpath:logback.xml

@ -1,28 +1,3 @@
/**
* 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.erpdata.feign;

@ -0,0 +1,22 @@
package org.springblade.erpdata.mapper;
import com.baomidou.mybatisplus.core.mapper.Mapper;
import org.springblade.erpdata.pojo.dto.view.MesRbPk;
import org.springblade.erpdata.pojo.dto.view.MesRbSodelreczg;
import java.util.List;
/**
* Mapper 接口
*
* @author lqk
*/
public interface ErpMesRbPkMapper extends Mapper {
/**
* 从ERP视图中获取要同步的推进计划转工单
*
* @return
*/
List<MesRbPk> getMesRbPkErpList();
}

@ -0,0 +1,9 @@
<?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.ErpMesRbPkMapper">
<select id = "getMesRbPkErpList" resultType = "org.springblade.erpdata.pojo.dto.view.MesRbPk">
SELECT * FROM v_mes_rb_pk WHERE is_deleted = 0
</select>
</mapper>

@ -0,0 +1,21 @@
package org.springblade.erpdata.mapper;
import com.baomidou.mybatisplus.core.mapper.Mapper;
import org.springblade.erpdata.pojo.dto.view.MesRbSodelreczg;
import java.util.List;
/**
* Mapper 接口
*
* @author lqk
*/
public interface ErpMesRbSodelreczgMapper extends Mapper {
/**
* 从ERP视图中获取要同步的推进计划转工单
*
* @return
*/
List<MesRbSodelreczg> getMesRbSodelreczgErpList();
}

@ -0,0 +1,9 @@
<?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.ErpMesRbSodelreczgMapper">
<select id = "getMesRbSodelreczgErpList" resultType = "org.springblade.erpdata.pojo.dto.view.MesRbSodelreczg">
SELECT * FROM v_mes_rb_sodelreczg WHERE is_deleted = 0
</select>
</mapper>

@ -1,9 +1,28 @@
<?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.ErpMesRbWoMapper">
<!-- 周新昊 20240719 计划游标新增条件工艺路线不应为烧结子件的路线
AND a.processline NOT IN (SELECT KEY FROM t_listelement WHERE listname = 'SJZJPROCESSLINE') -->
<select id = "getYieldPlanErpList" resultType = "org.springblade.erpdata.pojo.dto.view.MesRbWo">
SELECT * FROM v_mes_rb_wo WHERE is_deleted = 0
SELECT DISTINCT rownum,
a.wono,
a.prtno,
a.prtlotno,
a.plndept,
a.woporqty,
a.woreqdat,
a.plannerdesc,
a.wopordat,
a.remark,
a.wototqty,
a.prtmdept,
a.processline,
a.warctlrdesc,
a.kdofplat,
a.processlinedesc,
a.prodline
FROM v_mes_rb_wo
WHERE rownum <![CDATA[ <= ]]> 2000
</select>
</mapper>

@ -0,0 +1,14 @@
package org.springblade.erpdata.service;
/**
* ERP数据查询service
*
* @author lqk
*/
public interface IErpMesRbPkService {
/**
* 同步数据
*/
void synMesRbPk();
}

@ -0,0 +1,14 @@
package org.springblade.erpdata.service;
/**
* ERP数据查询service
*
* @author lqk
*/
public interface IErpMesRbSodelreczgService {
/**
* 同步数据
*/
void synMesRbSodelreczg();
}

@ -0,0 +1,27 @@
package org.springblade.erpdata.service.impl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.desk.order.feign.IApsClient;
import org.springblade.erpdata.mapper.ErpMesRbPkMapper;
import org.springblade.erpdata.service.IErpMesRbPkService;
import org.springframework.stereotype.Service;
/**
* @author lqk
* @date 2025-11-26 9:39
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class ErpMesRbPkServiceImpl implements IErpMesRbPkService {
private final ErpMesRbPkMapper mesRbPkMapper;
private final IApsClient apsClient;
@Override
public void synMesRbPk() {
}
}

@ -0,0 +1,29 @@
package org.springblade.erpdata.service.impl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.desk.order.feign.IApsClient;
import org.springblade.erpdata.mapper.ErpMesRbSodelrecwxMapper;
import org.springblade.erpdata.mapper.ErpMesRbSodelreczgMapper;
import org.springblade.erpdata.service.IErpMesRbSodelrecwxService;
import org.springblade.erpdata.service.IErpMesRbSodelreczgService;
import org.springframework.stereotype.Service;
/**
* @author lqk
* @date 2025-11-26 9:39
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class ErpMesRbSodelreczgServiceImpl implements IErpMesRbSodelreczgService {
private final ErpMesRbSodelreczgMapper mesRbSodelreczgMapper;
private final IApsClient apsClient;
@Override
public void synMesRbSodelreczg() {
}
}

@ -35,9 +35,24 @@ public class ErpMesRbWoServiceImpl implements IErpMesRbWoService {
@Override
public void synMesRbWo() {
List<MesRbWo> mesRbWoList=mesRbWoMapper.getYieldPlanErpList();
/**
* 有多个实体类
* b1. 根据零件号从`DS_PART`表中查询零件信息
*
* ```sql
* SELECT a.product_type, a.part_name, a.area, a.craft_way, a.config_no
* 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<YieldPlan> yieldPlanList=new ArrayList<>();
mesRbWoList.forEach(mesRbWo -> {
YieldPlan yieldPlan=new YieldPlan();
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("烧结电镀");
}
yieldPlan.setYpCode(mesRbWo.getWono());
yieldPlan.setPartCode(mesRbWo.getPrtno());
yieldPlan.setProductType(mesRbWo.getPrtlotno());

@ -235,3 +235,8 @@ ALTER TABLE mes_yield_plan
ADD check_totqty_time DATE NULL;
COMMENT ON COLUMN mes_yield_plan.check_totqty_time IS '验证完工数时间';
ALTER TABLE MES_RECORDER
MODIFY (RECORDER NVARCHAR2(255));
--varchar不允许修改为clob类型
ALTER TABLE MES_RECORDER DROP COLUMN MEMO;
ALTER TABLE MES_RECORDER ADD (MEMO CLOB);

Loading…
Cancel
Save