From 8fcee4fe66b161b31eba9c50e3c3121c7df7023b Mon Sep 17 00:00:00 2001 From: qinyulong Date: Mon, 9 Mar 2026 15:39:42 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E9=87=8F=E5=85=B7=E8=AE=A1=E9=87=8F?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E6=94=B9=E4=B8=BA=E4=BB=8Elims=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E5=90=8C=E6=AD=A5=EF=BC=8C=E4=BF=9D=E5=AD=98=E5=88=B0?= =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E6=95=B0=E6=8D=AE=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../device/IotEquipmentProcessor.java | 2 - .../device/LimsMeaToolProcessor.java | 38 +++ .../device/feign/LimsMeaToolTaskClient.java | 25 ++ .../pojo/entity/MeasurementRecordsEntity.java | 239 +++++++++++------- .../device/pojo/vo/MeasurementRecordsVO.java | 21 ++ .../MeasurementRecordsController.java | 105 ++++++-- .../feign/LimsMeaToolTaskClientImpl.java | 23 ++ .../mapper/MeasurementRecordsMapper.java | 39 +++ .../mapper/MeasurementRecordsMapper.xml | 62 +++++ .../service/IMeasurementRecordsService.java | 22 +- .../impl/IMeasurementRecordsServiceImpl.java | 128 +++++++++- .../wrapper/MeasurementRecordsWrapper.java | 35 +++ 12 files changed, 596 insertions(+), 143 deletions(-) create mode 100644 blade-ops/blade-job/src/main/java/org/springblade/job/processor/device/LimsMeaToolProcessor.java create mode 100644 blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/device/feign/LimsMeaToolTaskClient.java create mode 100644 blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/device/pojo/vo/MeasurementRecordsVO.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/device/feign/LimsMeaToolTaskClientImpl.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/device/mapper/MeasurementRecordsMapper.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/device/mapper/MeasurementRecordsMapper.xml create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/device/wrapper/MeasurementRecordsWrapper.java diff --git a/blade-ops/blade-job/src/main/java/org/springblade/job/processor/device/IotEquipmentProcessor.java b/blade-ops/blade-job/src/main/java/org/springblade/job/processor/device/IotEquipmentProcessor.java index 08af9303..3317232a 100644 --- a/blade-ops/blade-job/src/main/java/org/springblade/job/processor/device/IotEquipmentProcessor.java +++ b/blade-ops/blade-job/src/main/java/org/springblade/job/processor/device/IotEquipmentProcessor.java @@ -4,12 +4,10 @@ import jakarta.annotation.Resource; import lombok.Data; 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; import java.util.concurrent.CompletableFuture; diff --git a/blade-ops/blade-job/src/main/java/org/springblade/job/processor/device/LimsMeaToolProcessor.java b/blade-ops/blade-job/src/main/java/org/springblade/job/processor/device/LimsMeaToolProcessor.java new file mode 100644 index 00000000..7374c86e --- /dev/null +++ b/blade-ops/blade-job/src/main/java/org/springblade/job/processor/device/LimsMeaToolProcessor.java @@ -0,0 +1,38 @@ +package org.springblade.job.processor.device; + +import jakarta.annotation.Resource; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springblade.desk.device.feign.LimsMeaToolTaskClient; +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 java.util.concurrent.CompletableFuture; + +/** + * 同步量具计量记录数据任务 + */ +@Data +@Component +@Slf4j +public class LimsMeaToolProcessor implements BasicProcessor { + + @Resource + private LimsMeaToolTaskClient limsMeaToolTaskClient; + + @Override + public ProcessResult process(TaskContext context) throws Exception { + log.info("同步量具计量记录数据任务开始"); + CompletableFuture runFuture = CompletableFuture.runAsync(() -> limsMeaToolTaskClient.syncMeasurementRecordsTask()); + runFuture.whenComplete((result, exception) -> { + if (exception != null) { + log.error("同步量具计量记录数据任务失败", exception); + } else { + log.info("同步量具计量记录数据任务完毕"); + } + }); + return new ProcessResult(true); + } +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/device/feign/LimsMeaToolTaskClient.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/device/feign/LimsMeaToolTaskClient.java new file mode 100644 index 00000000..0295ea73 --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/device/feign/LimsMeaToolTaskClient.java @@ -0,0 +1,25 @@ +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 +) +/** + * 同步Lims量具相关信息 + */ +public interface LimsMeaToolTaskClient { + + String API_PREFIX = "/feign/device/lims-task"; + + String SYNC_MEASUREMENT_RECORDS_TASK = API_PREFIX + "/sync-measurement-records-task"; + + + /** + * 同步量具数据 + */ + @GetMapping(SYNC_MEASUREMENT_RECORDS_TASK) + void syncMeasurementRecordsTask(); +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/device/pojo/entity/MeasurementRecordsEntity.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/device/pojo/entity/MeasurementRecordsEntity.java index 7c17d09f..8e76c5b7 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/device/pojo/entity/MeasurementRecordsEntity.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/device/pojo/entity/MeasurementRecordsEntity.java @@ -1,140 +1,183 @@ package org.springblade.desk.device.pojo.entity; -import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import lombok.Data; +import io.swagger.v3.oas.annotations.media.Schema; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.math.BigDecimal; +import java.util.Date; import lombok.EqualsAndHashCode; import org.springblade.core.mp.base.BaseEntity; +import org.springblade.core.tenant.mp.TenantEntity; -import java.util.Date; +import java.io.Serial; /** - * 计量记录 实体类 + * 量具计量记录 实体类 * * @author qyl - * @since 2026年1月4日 + * @since 2026-03-03 */ @Data -@Schema(description = "计量记录对象") +@TableName("MES_MEASUREMENT_RECORDS") +@Schema(description = "MeasurementRecords对象") @EqualsAndHashCode(callSuper = true) public class MeasurementRecordsEntity extends BaseEntity { - @Schema(name = "名称(设备名称)") - //@Column(name = "MC_NAME") - private String mcName; - @Schema(name = "规格") - //@Column(name = "NORMS") - private String norms; + @Serial + private static final long serialVersionUID = 1L; - @Schema(name = "类别(管理类别)") - //@Column(name = "MC_CLASS") + /** + * 名称(设备名称) + */ + @Schema(description = "名称(设备名称)") + private String mcName; + /** + * 规格 + */ + @Schema(description = "规格") + private String norms; + /** + * 类别(管理类别) + */ + @Schema(description = "类别(管理类别)") private String mcClass; - - @Schema(name = "计量类型") - //@Column(name = "LABEL_NO") + /** + * 计量类型 + */ + @Schema(description = "计量类型") private String labelNo; - - @Schema(name = "计量子类型") - //@Column(name = "STR2") + /** + * 计量子类型 + */ + @Schema(description = "计量子类型") private String str2; - - @Schema(name = "编号(测量设备编码)") - //@Column(name = "MC_CODE") + /** + * 编号(测量设备编码) + */ + @Schema(description = "编号(测量设备编码)") + @NotNull(message = "编号不能为空") private String mcCode; - - @Schema(name = "使用单位(试用部门)") - //@Column(name = "USE_UNIT") + /** + * 使用单位(试用部门) + */ + @Schema(description = "使用单位(试用部门)") private String useUnit; - - @Schema(name = "精度(精度等级)") - //@Column(name = "ACCURACY") + /** + * 精度(精度等级) + */ + @Schema(description = "精度(精度等级)") private String accuracy; - - @Schema(name = "出厂编号") - //@Column(name = "OEM_CODE") + /** + * 出厂编号 + */ + @Schema(description = "出厂编号") private String oemCode; - - @Schema(name = "生产厂家(制造厂商)") - //@Column(name = "MC_OEM") + /** + * 生产厂家(制造厂商) + */ + @Schema(description = "生产厂家(制造厂商)") private String mcOem; - - @Schema(name = "启用日期") - //@Column(name = "ENABLE_DATE") + /** + * 启用日期 + */ + @Schema(description = "启用日期") private Date enableDate; - - @Schema(name = "检定日期") - //@Column(name = "WHEN_DCCEPT") + /** + * 检定日期 + */ + @Schema(description = "检定日期") private String whenDccept; - - @Schema(name = "型号(型号)") - //@Column(name = "MC_TYPE") + /** + * 型号(型号) + */ + @Schema(description = "型号(型号)") private String mcType; - - @Schema(name = "检定周期(检定周期)") - //@Column(name = "TEST_CYCLE") + /** + * 检定周期(检定周期) + */ + @Schema(description = "检定周期(检定周期)") private Integer testCycle; - - @Schema(name = "到期日期(有效日期)") - //@Column(name = "DUE_DATE") + /** + * 到期日期(有效日期) + */ + @Schema(description = "到期日期(有效日期)") private Date dueDate; - - @Schema(name = "报废日期") - //@Column(name = "DATE2") + /** + * 报废日期 + */ + @Schema(description = "报废日期") private Date date2; - - @Schema(name = "状态") - //@Column(name = "BELONG") + /** + * 状态 + */ + @Schema(description = "状态") private String belong; - - @Schema(name = "停用日期") - //@Column(name = "WHEN_BUY") + /** + * 停用日期 + */ + @Schema(description = "停用日期") private Date whenBuy; - - @Schema(name = "检定部门") - //@Column(name = "TEST_DEPT") + /** + * 检定部门 + */ + @Schema(description = "检定部门") private String testDept; - - @Schema(name = "检定/校验方法(检定校准方法)") - //@Column(name = "TEST_METHOD") + /** + * 检定/校验方法(检定校准方法) + */ + @Schema(description = "检定/校验方法(检定校准方法)") private String testMethod; - - @Schema(name = "备注") - //@Column(name = "STR9") + /** + * 备注 + */ + @Schema(description = "备注") private String str9; - - @Schema(name = "备注2") - //@Column(name = "STR10") + /** + * 备注2 + */ + @Schema(description = "备注2") private String str10; - - @Schema(name = "使用人工号") - //@Column(name = "ASSETS_NO") + /** + * 使用人工号 + */ + @Schema(description = "使用人工号") private String assetsNo; - - @Schema(name = "责任人") - //@Column(name = "STR6") + /** + * 责任人 + */ + @Schema(description = "责任人") private String str6; - - @Schema(name = "用途分类") - //@Column(name = "PURPOSE_CLASS") + /** + * 用途分类 + */ + @Schema(description = "用途分类") private String purposeClass; - - @Schema(name = "超期情况") - //@Column(name = "IS_OVER_STR") + /** + * 超期情况 + */ + @Schema(description = "超期情况") private String isOverStr; + /** + * 类型1、仪表计量;2、设备计量 + */ + @Schema(description = "类型1、仪表计量;2、设备计量") + private Integer cmType; + /** + * 是否送检1:是,0:否 + */ + @Schema(description = "是否送检1:是,0:否") + private String censorship; + /** + * 检验状态1:在检,0:未检 + */ + @Schema(description = "检验状态1:在检,0:未检") + private String checkStatus; + /** + * 检验结果1:合格,0:不合格 + */ + @Schema(description = "检验结果1:合格,0:不合格") + private String checkResult; - @Schema(name = "类型", title = "1、仪表计量;2、设备计量") - //@Column(name = "CM_TYPE") - private Short cmType; - - @Schema(name = "是否送检", title = "1:是,0:否") - //@Column(name = "CENSORSHIP") - private Boolean censorship; - - @Schema(name = "检验状态", title = "1:在检,0:未检") - //@Column(name = "CHECK_STATUS") - private Boolean checkStatus; - - @Schema(name = "检验结果", title = "1:合格,0:不合格") - //@Column(name = "CHECK_RESULT") - private Boolean checkResult; } diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/device/pojo/vo/MeasurementRecordsVO.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/device/pojo/vo/MeasurementRecordsVO.java new file mode 100644 index 00000000..3ee06c2c --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/device/pojo/vo/MeasurementRecordsVO.java @@ -0,0 +1,21 @@ +package org.springblade.desk.device.pojo.vo; + +import org.springblade.desk.device.pojo.entity.MeasurementRecordsEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 量具计量记录 视图实体类 + * + * @author qyl + * @since 2026-03-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class MeasurementRecordsVO extends MeasurementRecordsEntity { + @Serial + private static final long serialVersionUID = 1L; + +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/device/controller/MeasurementRecordsController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/device/controller/MeasurementRecordsController.java index a454800c..5e3dca19 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/device/controller/MeasurementRecordsController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/device/controller/MeasurementRecordsController.java @@ -1,10 +1,14 @@ package org.springblade.desk.device.controller; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; import lombok.AllArgsConstructor; import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.excel.util.ExcelUtil; @@ -12,15 +16,14 @@ 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.DateUtil; +import org.springblade.core.tool.utils.Func; import org.springblade.desk.device.pojo.entity.MeasurementRecordsEntity; import org.springblade.desk.device.pojo.excel.MeasurementRecordsExcel; +import org.springblade.desk.device.pojo.vo.MeasurementRecordsVO; import org.springblade.desk.device.service.IMeasurementRecordsService; +import org.springblade.desk.device.wrapper.MeasurementRecordsWrapper; import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.List; @@ -37,43 +40,97 @@ import java.util.List; @RequestMapping("/measurementRecords") @Tag(name = "计量记录", description = "计量记录接口") public class MeasurementRecordsController extends BladeController { - @Autowired - IMeasurementRecordsService iMeasurementRecordsService; + + private final IMeasurementRecordsService mesMeasurementRecordsService; /** - * 计量记录 自定义分页 - * - * @param cmType 1、仪表计量;2、设备计量 - * @param query - * @return + * 量具计量记录 详情 */ - @GetMapping("/page") + @GetMapping("/detail") @ApiOperationSupport(order = 1) - @Operation(summary = "分页", description = "") - public R> page(@RequestParam("cmType") Integer cmType, Query query) { - IPage pages = iMeasurementRecordsService.selectMeasurementRecordsPage(Condition.getPage(query), cmType); + @Operation(summary = "详情", description = "传入mesMeasurementRecords") + public R detail(MeasurementRecordsEntity mesMeasurementRecords) { + MeasurementRecordsEntity detail = mesMeasurementRecordsService.getOne(Condition.getQueryWrapper(mesMeasurementRecords)); + return R.data(MeasurementRecordsWrapper.build().entityVO(detail)); + } + + /** + * 量具计量记录 自定义分页 + */ + @GetMapping("/page") + @ApiOperationSupport(order = 3) + @Operation(summary = "分页", description = "传入mesMeasurementRecords") + public R> page(MeasurementRecordsVO mesMeasurementRecords, Query query) { + IPage pages = mesMeasurementRecordsService.selectMeasurementRecordsPage(Condition.getPage(query), mesMeasurementRecords); return R.data(pages); } + /** + * 量具计量记录 新增 + */ + @PostMapping("/save") + @ApiOperationSupport(order = 4) + @Operation(summary = "新增", description = "传入mesMeasurementRecords") + public R save(@Valid @RequestBody MeasurementRecordsEntity mesMeasurementRecords) { + MeasurementRecordsEntity one = mesMeasurementRecordsService.getOne(Wrappers.lambdaQuery().eq(MeasurementRecordsEntity::getMcCode, mesMeasurementRecords.getMcCode())); + if (one != null) { + return R.fail("量具已存在"); + } + return R.status(mesMeasurementRecordsService.save(mesMeasurementRecords)); + } + + /** + * 量具计量记录 修改 + */ + @PostMapping("/update") + @ApiOperationSupport(order = 5) + @Operation(summary = "修改", description = "传入mesMeasurementRecords") + public R update(@Valid @RequestBody MeasurementRecordsEntity mesMeasurementRecords) { + MeasurementRecordsEntity one = mesMeasurementRecordsService.getOne(Wrappers.lambdaQuery().eq(MeasurementRecordsEntity::getMcCode, mesMeasurementRecords.getMcCode())); + if (one != null && !one.getId().equals(mesMeasurementRecords.getId())) { + return R.fail("量具已存在"); + } + return R.status(mesMeasurementRecordsService.updateById(mesMeasurementRecords)); + } + + /** + * 量具计量记录 新增或修改 + */ +// @PostMapping("/submit") +// @ApiOperationSupport(order = 6) +// @Operation(summary = "新增或修改", description = "传入mesMeasurementRecords") +// public R submit(@Valid @RequestBody MeasurementRecordsEntity mesMeasurementRecords) { +// return R.status(mesMeasurementRecordsService.saveOrUpdate(mesMeasurementRecords)); +// } + + /** + * 量具计量记录 删除 + */ + @PostMapping("/remove") + @ApiOperationSupport(order = 7) + @Operation(summary = "逻辑删除", description = "传入ids") + public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) { + return R.status(mesMeasurementRecordsService.deleteLogic(Func.toLongList(ids))); + } + /** * 导出数据 */ -// @IsAdmin @GetMapping("/export-measurementRecords") - @ApiOperationSupport(order = 2) + @ApiOperationSupport(order = 11) @Operation(summary = "导出数据", description = "") - public void exportMeasuringUpkeep(@RequestParam("cmType") Integer cmType, Query query, HttpServletResponse response) { - query.setSize(99999); - IPage pages = iMeasurementRecordsService.selectMeasurementRecordsPage(Condition.getPage(query), cmType); - List list = pages.getRecords(); + public void exportMeasuringUpkeep(MeasurementRecordsVO mesMeasurementRecords, Query query, HttpServletResponse response) { + query.setSize(9999); + IPage pages = mesMeasurementRecordsService.selectMeasurementRecordsPage(Condition.getPage(query), mesMeasurementRecords); + List list = pages.getRecords(); List excels = new ArrayList<>(); - for (MeasurementRecordsEntity measurementRecordsEntity : list) { + for (MeasurementRecordsVO measurementRecordsEntity : list) { MeasurementRecordsExcel excel = new MeasurementRecordsExcel(); BeanUtils.copyProperties(measurementRecordsEntity, excel); excels.add(excel); } - ExcelUtil.export(response, "量具保养数据" + DateUtil.time(), "计量记录", excels, MeasurementRecordsExcel.class); + ExcelUtil.export(response, "仪表计量记录数据" + DateUtil.time(), "仪表计量记录数据", excels, MeasurementRecordsExcel.class); } } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/device/feign/LimsMeaToolTaskClientImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/device/feign/LimsMeaToolTaskClientImpl.java new file mode 100644 index 00000000..47bad4c9 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/device/feign/LimsMeaToolTaskClientImpl.java @@ -0,0 +1,23 @@ +package org.springblade.desk.device.feign; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.v3.oas.annotations.Hidden; +import jakarta.annotation.Resource; +import org.springblade.desk.device.pojo.entity.MeasurementRecordsEntity; +import org.springblade.desk.device.service.IMeasurementRecordsService; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Hidden +public class LimsMeaToolTaskClientImpl implements LimsMeaToolTaskClient { + + @Resource + private IMeasurementRecordsService measurementRecordsService; + + @Override + public void syncMeasurementRecordsTask() { + IPage page = new Page<>(1, 9999); + measurementRecordsService.syncMeasurementRecords(page, 1); + } +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/device/mapper/MeasurementRecordsMapper.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/device/mapper/MeasurementRecordsMapper.java new file mode 100644 index 00000000..318fab78 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/device/mapper/MeasurementRecordsMapper.java @@ -0,0 +1,39 @@ +package org.springblade.desk.device.mapper; + +import org.springblade.desk.device.pojo.entity.MeasurementRecordsEntity; +import org.springblade.desk.device.pojo.excel.MeasurementRecordsExcel; +import org.springblade.desk.device.pojo.vo.MeasurementRecordsVO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 量具计量记录 Mapper 接口 + * + * @author qyl + * @since 2026-03-03 + */ +public interface MeasurementRecordsMapper extends BaseMapper { + + /** + * 自定义分页 + * + * @param page 分页参数 + * @param mesMeasurementRecords 查询参数 + * @return List + */ + List selectMeasurementRecordsPage(IPage page, MeasurementRecordsVO mesMeasurementRecords); + + + /** + * 获取导出数据 + * + * @param queryWrapper 查询条件 + * @return List + */ + List exportMeasurementRecords(@Param("ew") Wrapper queryWrapper); + +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/device/mapper/MeasurementRecordsMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/device/mapper/MeasurementRecordsMapper.xml new file mode 100644 index 00000000..f601ed6a --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/device/mapper/MeasurementRecordsMapper.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/device/service/IMeasurementRecordsService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/device/service/IMeasurementRecordsService.java index 9d805131..797477e2 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/device/service/IMeasurementRecordsService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/device/service/IMeasurementRecordsService.java @@ -2,8 +2,11 @@ package org.springblade.desk.device.service; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springblade.core.mp.base.BaseService; +import org.springblade.core.tool.api.R; import org.springblade.desk.device.pojo.entity.MeasurementRecordsEntity; import org.springblade.desk.device.pojo.request.MeasuringUsageQuery; +import org.springblade.desk.device.pojo.vo.MeasurementRecordsVO; /** * 计量记录 服务类 @@ -12,17 +15,24 @@ import org.springblade.desk.device.pojo.request.MeasuringUsageQuery; * @since 2026年1月4日 */ -public interface IMeasurementRecordsService { +public interface IMeasurementRecordsService extends BaseService { /** * 自定义分页 * - * @param page 分页参数 - * @param cmType 查询参数 - * @return IPage + * @param page 分页参数 + * @param mesMeasurementRecords 查询参数 + * @return IPage */ - IPage selectMeasurementRecordsPage(IPage page, Integer cmType); - + IPage selectMeasurementRecordsPage(IPage page, MeasurementRecordsVO mesMeasurementRecords); + /** + * 同步lims的量具计量记录 + * + * @param page + * @param cmType 类型1、仪表计量;2、设备计量 + * @return + */ + R syncMeasurementRecords(IPage page, Integer cmType); // /** // * 导出数据 // * diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/device/service/impl/IMeasurementRecordsServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/device/service/impl/IMeasurementRecordsServiceImpl.java index a0fac77a..ce719600 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/device/service/impl/IMeasurementRecordsServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/device/service/impl/IMeasurementRecordsServiceImpl.java @@ -2,27 +2,39 @@ 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.alibaba.nacos.shaded.com.google.common.collect.Lists; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import jodd.util.StringUtil; import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.tool.api.R; +import org.springblade.desk.device.mapper.MeasurementRecordsMapper; +import org.springblade.desk.device.pojo.entity.FeiBaSetEntity; import org.springblade.desk.device.pojo.entity.MeasurementRecordsEntity; import org.springblade.desk.device.pojo.request.MeasuringUsageQuery; +import org.springblade.desk.device.pojo.vo.MeasurementRecordsVO; import org.springblade.desk.device.service.IMeasurementRecordsService; import org.springblade.desk.device.service.IMeasuringUsageService; +import org.springblade.desk.device.wrapper.MeasurementRecordsWrapper; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.net.URI; 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; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; @Slf4j @Service -public class IMeasurementRecordsServiceImpl implements IMeasurementRecordsService { +public class IMeasurementRecordsServiceImpl extends BaseServiceImpl implements IMeasurementRecordsService { // 使用JDK 17内置的HttpClient(线程安全,可复用) private final HttpClient httpClient = HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(30)) @@ -33,7 +45,22 @@ public class IMeasurementRecordsServiceImpl implements IMeasurementRecordsServic private String limsUrl; @Override - public IPage selectMeasurementRecordsPage(IPage page, Integer cmType) { + public IPage selectMeasurementRecordsPage(IPage page, MeasurementRecordsVO mesMeasurementRecords) { + // 1. 创建条件构造器 + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + + // 2. 动态添加条件(核心!) + // 根据实体对象 entity 中字段是否为空,来动态拼接WHERE条件 + wrapper.eq(Objects.nonNull(mesMeasurementRecords.getMcCode()), MeasurementRecordsEntity::getMcCode, mesMeasurementRecords.getMcCode()); + + // 3. 执行分页查询 + IPage measurementRecordsEntityIPage = baseMapper.selectPage(page, wrapper); + + return MeasurementRecordsWrapper.build().pageVO(measurementRecordsEntityIPage); + } + + @Override + public R syncMeasurementRecords(IPage page, Integer cmType) { // 构建请求体JSON JSONObject requestBody = buildRequestBody(page, cmType); @@ -56,8 +83,7 @@ public class IMeasurementRecordsServiceImpl implements IMeasurementRecordsServic } catch (Exception e) { log.error("获取计量记录记录数据接口调用失败: {}", e.getMessage(), e); - List entityList1 = new ArrayList<>(); - return page.setRecords(List.of()); // 返回空列表而不是null + return R.fail("获取计量记录记录数据接口调用失败"); } } @@ -79,10 +105,10 @@ public class IMeasurementRecordsServiceImpl implements IMeasurementRecordsServic /** * 处理HTTP响应 */ - private IPage processResponse(HttpResponse response, IPage page) { + private R processResponse(HttpResponse response, IPage page) { if (response.statusCode() != 200) { log.error("HTTP请求失败,状态码: {}", response.statusCode()); - throw new RuntimeException("HTTP请求失败,状态码: " + response.statusCode()); + return R.fail("HTTP请求失败,状态码: " + response.statusCode()); } /*String responseBody = "{\n" + @@ -300,7 +326,7 @@ public class IMeasurementRecordsServiceImpl implements IMeasurementRecordsServic String responseBody = response.body(); if (responseBody == null || responseBody.trim().isEmpty()) { log.error("响应体为空"); - return page.setRecords(List.of()); + return R.fail("响应体为空"); } try { @@ -342,19 +368,95 @@ public class IMeasurementRecordsServiceImpl implements IMeasurementRecordsServic measurementRecordsEntity.setIsOverStr(jsonObj.getString("isOverStr")); list.add(measurementRecordsEntity); } - return page.setRecords(list != null ? list : List.of()); + return R.status(saveOrUpdateBatchByMcCode(list)); } } else { String errorMsg = result != null ? result.getString("message") : "未知错误"; log.error("接口返回错误: {}", errorMsg); - throw new RuntimeException("接口返回错误: " + errorMsg); + R.fail("接口返回错误: " + errorMsg); } } catch (Exception e) { log.error("响应数据解析失败: {}", e.getMessage(), e); - throw new RuntimeException("响应数据解析失败: " + e.getMessage(), e); + R.fail("响应数据解析失败: " + e.getMessage()); + } + + return R.fail("处理失败"); + } + + /** + * 批量增改 + * + * @param list + * @return + */ + public boolean saveOrUpdateBatchByMcCode(List list) { + if (CollectionUtils.isEmpty(list)) { + return false; + } + // 分批处理,提高性能 + List> partitions = Lists.partition(list, 1000); + int totalAffected = 0; + + for (List partition : partitions) { + // 按mcCode分组 + Map codeToEntityMap = partition.stream() + .collect(Collectors.toMap( + MeasurementRecordsEntity::getMcCode, + Function.identity(), + (oldValue, newValue) -> newValue + )); + + // 1. 查询已存在的记录 + List mcCodes = new ArrayList<>(codeToEntityMap.keySet()); + List existingList = this.lambdaQuery() + .in(MeasurementRecordsEntity::getMcCode, mcCodes) + .list(); + + // 2. 分离需要新增和更新的记录 + Map existingMap = existingList.stream() + .collect(Collectors.toMap(MeasurementRecordsEntity::getMcCode, Function.identity())); + + List toInsert = new ArrayList<>(); + List toUpdate = new ArrayList<>(); + + Date now = new Date(); + + for (MeasurementRecordsEntity entity : partition) { + MeasurementRecordsEntity existingEntity = existingMap.get(entity.getMcCode()); + + if (existingEntity != null) { + // 更新记录 + entity.setId(existingEntity.getId()); + entity.setUpdateTime(now); + // 保持创建信息不变 + entity.setCreateTime(existingEntity.getCreateTime()); + toUpdate.add(entity); + } else { + // 新增记录 + entity.setCreateTime(now); + entity.setUpdateTime(now); + toInsert.add(entity); + } + } + + // 3. 批量操作 + if (!toInsert.isEmpty()) { + boolean insertSuccess = this.saveBatch(toInsert); + if (insertSuccess) { + totalAffected += toInsert.size(); + } + } + + if (!toUpdate.isEmpty()) { + boolean updateSuccess = this.updateBatchById(toUpdate); + if (updateSuccess) { + totalAffected += toUpdate.size(); + } + } } - return page.setRecords(List.of()); + log.info("批量增改处理完成,共处理 {} 条记录", totalAffected); + return totalAffected > 0; } } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/device/wrapper/MeasurementRecordsWrapper.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/device/wrapper/MeasurementRecordsWrapper.java new file mode 100644 index 00000000..53f5e770 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/device/wrapper/MeasurementRecordsWrapper.java @@ -0,0 +1,35 @@ +package org.springblade.desk.device.wrapper; + +import org.springblade.core.mp.support.BaseEntityWrapper; +import org.springblade.core.tool.utils.BeanUtil; +import org.springblade.desk.device.pojo.entity.MeasurementRecordsEntity; +import org.springblade.desk.device.pojo.vo.MeasurementRecordsVO; + +import java.util.Objects; + +/** + * 量具计量记录 包装类,返回视图层所需的字段 + * + * @author qyl + * @since 2026-03-03 + */ +public class MeasurementRecordsWrapper extends BaseEntityWrapper { + + public static MeasurementRecordsWrapper build() { + return new MeasurementRecordsWrapper(); + } + + @Override + public MeasurementRecordsVO entityVO(MeasurementRecordsEntity mesMeasurementRecords) { + MeasurementRecordsVO mesMeasurementRecordsVO = Objects.requireNonNull(BeanUtil.copyProperties(mesMeasurementRecords, MeasurementRecordsVO.class)); + + //User createUser = UserCache.getUser(mesMeasurementRecords.getCreateUser()); + //User updateUser = UserCache.getUser(mesMeasurementRecords.getUpdateUser()); + //mesMeasurementRecordsVO.setCreateUserName(createUser.getName()); + //mesMeasurementRecordsVO.setUpdateUserName(updateUser.getName()); + + return mesMeasurementRecordsVO; + } + + +} From 56c548de8192d049c7106df5c86185538c65b722 Mon Sep 17 00:00:00 2001 From: liweidong-hj Date: Mon, 9 Mar 2026 16:33:55 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E7=8A=B6=E6=80=81=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/LauncherConstant.java | 4 +- .../desk/logistics/pojo/entity/Task.java | 74 +-------- .../desk/logistics/constant/AgvConstant.java | 13 ++ .../controller/PipelineController.java | 19 +++ .../desk/logistics/mapper/StationMapper.java | 2 +- .../desk/logistics/mapper/StationMapper.xml | 4 +- .../logistics/service/IStationService.java | 4 +- .../desk/logistics/service/ITaskService.java | 3 +- .../service/impl/IOrderBoxServiceImpl.java | 15 +- .../impl/IPipelineOrderBoxServiceImpl.java | 16 +- .../service/impl/PipelineServiceImpl.java | 10 +- .../service/impl/StationServiceImpl.java | 4 +- .../impl/StorageMonitoringServiceImpl.java | 2 +- .../impl/TaskExecuteRecordServiceImpl.java | 8 +- .../service/impl/TaskServiceImpl.java | 3 +- .../desk/logistics/utils/AgvTaskTypeUtil.java | 151 ++++++++---------- 16 files changed, 139 insertions(+), 193 deletions(-) diff --git a/blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java b/blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java index 5368793c..2f1548cd 100644 --- a/blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java +++ b/blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java @@ -31,8 +31,8 @@ public interface LauncherConstant { /** * nacos dev 地址 */ - String NACOS_DEV_ADDR = "192.168.249.27:8848"; -// String NACOS_DEV_ADDR = "192.168.0.3:8848"; +// String NACOS_DEV_ADDR = "192.168.249.27:8848"; + String NACOS_DEV_ADDR = "127.0.0.1:8848"; /** * nacos prod 地址 diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/logistics/pojo/entity/Task.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/logistics/pojo/entity/Task.java index d5fb3ca9..2588443e 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/logistics/pojo/entity/Task.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/logistics/pojo/entity/Task.java @@ -26,12 +26,7 @@ public class Task extends BaseEntity { /** * 起点位置 */ - public static final Integer STATUS_START = 0; - - /** - * 输送线起点 - */ - public static final Integer STATUS_CONVEYOR_START = 1; + public static final Integer STATUS_START = 1; /** * 退回(超重) @@ -39,39 +34,20 @@ public class Task extends BaseEntity { public static final Integer STATUS_RETURNED = 2; /** - * 输送线末尾 + * 输送线末尾(配送中) */ public static final Integer STATUS_CONVEYOR_END = 3; - /** - * 站点 - */ - public static final Integer STATUS_STATION = 4; - - /** - * 库位 - */ - public static final Integer STATUS_LOCATION = 5; - - /** - * 等待 - */ - public static final Integer STATUS_WAITING = 6; /** - * 站点接收 - */ - public static final Integer STATUS_STATION_RECEIVE = 7; - - /** - * 回库 + * 结束 */ - public static final Integer STATUS_BACK_TO_STORAGE = 8; + public static final Integer STATUS_FINISHED = 4; /** - * 结束 + * 失败 */ - public static final Integer STATUS_FINISHED = 9; + public static final Integer STATUS_FAILING = 5; /** * ID主键 @@ -125,42 +101,4 @@ public class Task extends BaseEntity { @Schema(description = "备注") private String remark; - /** - * 获取状态描述 - * @return 状态描述 - */ - public String getStatusDesc() { - return getStatusDesc(this.taskStatus); - } - - /** - * 根据状态值获取状态描述 - * @param status 状态值 - * @return 状态描述 - */ - public static String getStatusDesc(Integer status) { - if (STATUS_RETURNED.equals(status)) { - return "退回(超重)"; - } else if (STATUS_STATION.equals(status)) { - return "站点"; - } else if (STATUS_LOCATION.equals(status)) { - return "库位"; - } else if (STATUS_WAITING.equals(status)) { - return "等待"; - } else if (STATUS_BACK_TO_STORAGE.equals(status)) { - return "回库"; - } else if (STATUS_FINISHED.equals(status)) { - return "结束"; - }else if (STATUS_START.equals(status)) { - return "起点位置"; - }else if (STATUS_CONVEYOR_START.equals(status)) { - return "输送线起点"; - }else if (STATUS_CONVEYOR_END.equals(status)) { - return "输送线末尾"; - }else if (STATUS_STATION_RECEIVE.equals(status)) { - return "站点接收"; - } else { - return "未知状态"; - } - } } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/constant/AgvConstant.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/constant/AgvConstant.java index 24bbfe86..17e64eed 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/constant/AgvConstant.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/constant/AgvConstant.java @@ -16,4 +16,17 @@ public interface AgvConstant { */ public static final String EQUIPMENT_TYPE_CTU = "05"; + + /** + * 任务模板:CTU + */ + public static final String CTU_TASK_TYP = "QM1"; + + /** + * 容器类型:CTU + */ + public static final String CTU_CTNR_TYP = "1"; + + + } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/controller/PipelineController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/controller/PipelineController.java index 376a7259..fc63157e 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/controller/PipelineController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/controller/PipelineController.java @@ -35,7 +35,9 @@ import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.tool.api.R; import org.springblade.desk.basic.util.StatusCountMap; +import org.springblade.desk.logistics.pojo.entity.Station; import org.springblade.desk.logistics.service.IPipelineService; +import org.springblade.desk.logistics.utils.AgvTaskTypeUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -145,6 +147,8 @@ public class PipelineController extends BladeController { return R.data(isPassed); } + @Autowired + AgvTaskTypeUtil agvTaskTypeUtil; /** * 接收空物料箱到输送线通知 @@ -162,6 +166,21 @@ public class PipelineController extends BladeController { } + /** + * 接收空物料箱到输送线通知 + */ + @GetMapping("/test") + @ApiOperationSupport(order = 4) + @Operation(summary = "接收物料箱", description = "传入箱条码") + public R test(@RequestParam String test1,@RequestParam String test2) { + + String taskType = agvTaskTypeUtil.getTaskTypeByPositions(test1,test2); + + return R.data(true); + } + + + diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/mapper/StationMapper.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/mapper/StationMapper.java index 8f552ecf..77fbe263 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/mapper/StationMapper.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/mapper/StationMapper.java @@ -11,5 +11,5 @@ public interface StationMapper extends BaseMapper { List selectByWcId(@Param("wcId") Long wcId); - Station selectByStationPosition(@Param("StationPosition") String freeStationCode); + Station selectByStationCode(@Param("StationCode") String StationCode); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/mapper/StationMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/mapper/StationMapper.xml index 7339a211..ed95183e 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/mapper/StationMapper.xml +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/mapper/StationMapper.xml @@ -10,8 +10,8 @@ from LM_STATION where IS_DELETED = 0 and WC_ID = #{wcId} - select id, station_name, station_code, station_status, status, create_user, create_time, create_dept, update_user, update_time, is_deleted, remark, station_position, wc_id - from LM_STATION where IS_DELETED = 0 and STATION_POSITION = #{StationPosition} + from LM_STATION where IS_DELETED = 0 and STATION_CODE = #{StationCode} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/IStationService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/IStationService.java index 5a406418..31894efe 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/IStationService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/IStationService.java @@ -48,8 +48,8 @@ public interface IStationService extends BaseService { /** * 根据站点编码 查询站点信息 - * @param freeStationCode + * @param stationCode * @return */ - Station getByStationPosition(String freeStationCode); + Station getByStationCode(String stationCode); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/ITaskService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/ITaskService.java index 285765c0..020fa7ac 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/ITaskService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/ITaskService.java @@ -45,9 +45,8 @@ public interface ITaskService extends BaseService { * 保存输送线称重数据 * @param boxBarcode 箱条码 * @param actualWeight 输送线重量 - * @param statusReturned 任务状态 */ - void savePipelineWeigh(String boxBarcode, BigDecimal actualWeight, Integer statusReturned); + void savePipelineWeigh(String boxBarcode, BigDecimal actualWeight); /** * 获取输送箱信息 diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/IOrderBoxServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/IOrderBoxServiceImpl.java index 5982708d..abd934ff 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/IOrderBoxServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/IOrderBoxServiceImpl.java @@ -70,13 +70,10 @@ public class IOrderBoxServiceImpl implements IOrderBoxService { static { // 初始化运行中任务状态 RUNNING_STATUSES.add(Task.STATUS_START); // 任务启动 - RUNNING_STATUSES.add(Task.STATUS_CONVEYOR_START); // 输送机启动 - RUNNING_STATUSES.add(Task.STATUS_CONVEYOR_END); // 输送机结束 - RUNNING_STATUSES.add(Task.STATUS_STATION); // 站点状态 - RUNNING_STATUSES.add(Task.STATUS_LOCATION); // 库位状态 - RUNNING_STATUSES.add(Task.STATUS_WAITING); // 等待状态 - RUNNING_STATUSES.add(Task.STATUS_STATION_RECEIVE);// 站点接收 - RUNNING_STATUSES.add(Task.STATUS_BACK_TO_STORAGE);// 返库状态 + RUNNING_STATUSES.add(Task.STATUS_RETURNED); // 退回 + RUNNING_STATUSES.add(Task.STATUS_CONVEYOR_END); // 配送 + RUNNING_STATUSES.add(Task.STATUS_FINISHED); // 结束 + RUNNING_STATUSES.add(Task.STATUS_FAILING); // 失败 } public IOrderBoxServiceImpl(IYieldOrderService iYieldOrderService, ITaskService iTaskService, IOrderBindService iOrderBindService, IStationService iStationService, ILocationService iLocationService, AgvTaskTypeUtil agvTaskTypeUtil, IBsWorkCenterService bsWorkCenterService, ITaskExecuteRecordService iTaskExecuteRecordService) { @@ -324,7 +321,7 @@ public class IOrderBoxServiceImpl implements IOrderBoxService { try { // 2. 获取AGV任务类型并调用调度接口 - String taskType = agvTaskTypeUtil.getTaskType(Integer.valueOf(targetStation.getStationPosition()), true); + String taskType = agvTaskTypeUtil.getTaskTypeByPositions(stationCode,DROPOFF_CONVEYOR_LINE); boolean agvResult = iTaskExecuteRecordService.genAgvSchedulingTask( taskType, stationCode, DROPOFF_CONVEYOR_LINE, EQUIPMENT_TYPE_AGV, taskList.get(0) ); @@ -358,7 +355,7 @@ public class IOrderBoxServiceImpl implements IOrderBoxService { try { // 3. 获取AGV任务类型并调用调度接口 - String taskType = agvTaskTypeUtil.getTaskType(Integer.valueOf(targetStation.getStationPosition()), false); + String taskType = agvTaskTypeUtil.getTaskTypeByPositions(sourceStationCode,endStation.getStationCode()); boolean agvResult = iTaskExecuteRecordService.genAgvSchedulingTask( taskType, sourceStationCode, endStation.getStationCode(), EQUIPMENT_TYPE_AGV, taskList.get(0) ); diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/IPipelineOrderBoxServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/IPipelineOrderBoxServiceImpl.java index 925c8d59..2eed85ef 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/IPipelineOrderBoxServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/IPipelineOrderBoxServiceImpl.java @@ -46,15 +46,13 @@ public class IPipelineOrderBoxServiceImpl implements IPipelineOrderBoxService { private static final Set RUNNING_STATUSES = new HashSet<>(); static { - // 初始化运行中任务状态 - RUNNING_STATUSES.add(Task.STATUS_START); // 任务启动 - RUNNING_STATUSES.add(Task.STATUS_CONVEYOR_START); // 输送机启动 - RUNNING_STATUSES.add(Task.STATUS_CONVEYOR_END); // 输送机结束 - RUNNING_STATUSES.add(Task.STATUS_STATION); // 站点状态 - RUNNING_STATUSES.add(Task.STATUS_LOCATION); // 库位状态 - RUNNING_STATUSES.add(Task.STATUS_WAITING); // 等待状态 - RUNNING_STATUSES.add(Task.STATUS_STATION_RECEIVE);// 站点接收 - RUNNING_STATUSES.add(Task.STATUS_BACK_TO_STORAGE);// 返库状态 +// // 初始化运行中任务状态 +// RUNNING_STATUSES.add(Task.STATUS_START); // 任务启动 +// RUNNING_STATUSES.add(Task.STATUS_CONVEYOR_END); // 输送机结束 +// RUNNING_STATUSES.add(Task.STATUS_LOCATION); // 库位状态 +// RUNNING_STATUSES.add(Task.STATUS_WAITING); // 等待状态 +// RUNNING_STATUSES.add(Task.STATUS_STATION_RECEIVE);// 站点接收 +// RUNNING_STATUSES.add(Task.STATUS_BACK_TO_STORAGE);// 返库状态 } public IPipelineOrderBoxServiceImpl(ITaskService iTaskService, IStationService iStationService, ILocationService iLocationService, IOrderBindService iOrderBindService) { diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/PipelineServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/PipelineServiceImpl.java index b1405d39..99791218 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/PipelineServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/PipelineServiceImpl.java @@ -78,7 +78,7 @@ public class PipelineServiceImpl implements IPipelineService { // 1. 判断是否超重 if (WeighData.RETURN_STATUS_RETURNED.equals(returnStatus)) { // 2. 保存称重数据 - taskService.savePipelineWeigh(boxBarcode,actualWeight, Task.STATUS_RETURNED); + taskService.savePipelineWeigh(boxBarcode,actualWeight); // 3.超重处理,解绑 R ret = iPipelineOrderBoxService.boxOrderUnbind(boxBarcode); @@ -89,7 +89,7 @@ public class PipelineServiceImpl implements IPipelineService { return false; } else { // 2. 保存称重数据 - taskService.savePipelineWeigh(boxBarcode,actualWeight, Task.STATUS_CONVEYOR_START); + taskService.savePipelineWeigh(boxBarcode,actualWeight); log.info("物料箱[{}]重量校验通过", boxBarcode); return true; } @@ -152,8 +152,7 @@ public class PipelineServiceImpl implements IPipelineService { log.info("站点有预占,将物料箱送往指定站点:{}", station.getStationCode()); - String stationPosition = station.getStationPosition(); - String taskType = agvTaskTypeUtil.getTaskType(Integer.parseInt(stationPosition)); + String taskType = agvTaskTypeUtil.getTaskTypeByPositions(Station.PICKUP_CONVEYOR_LINE,station.getStationCode()); // 入库记录 Task task = taskService.getBoxBarcode(boxBarcode); @@ -178,8 +177,7 @@ public class PipelineServiceImpl implements IPipelineService { if (null != station) { log.info("找到空闲站点:{},将物料箱送往该站点", station.getStationCode()); - String stationPosition = station.getStationPosition(); - String taskType = agvTaskTypeUtil.getTaskType(Integer.parseInt(stationPosition)); + String taskType = agvTaskTypeUtil.getTaskTypeByPositions(Station.PICKUP_CONVEYOR_LINE,station.getStationCode()); boolean agvSchedulingTask = iTaskExecuteRecordService.genAgvSchedulingTask (taskType, Station.PICKUP_CONVEYOR_LINE, station.getStationCode(), AgvConstant.EQUIPMENT_TYPE_AGV, task); diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/StationServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/StationServiceImpl.java index 64b09a3e..7255c314 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/StationServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/StationServiceImpl.java @@ -54,7 +54,7 @@ public class StationServiceImpl extends BaseServiceImpl } @Override - public Station getByStationPosition(String freeStationCode) { - return stationMapper.selectByStationPosition(freeStationCode); + public Station getByStationCode(String stationCode) { + return stationMapper.selectByStationCode(stationCode); } } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/StorageMonitoringServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/StorageMonitoringServiceImpl.java index bc60b5d1..cde986ae 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/StorageMonitoringServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/StorageMonitoringServiceImpl.java @@ -182,7 +182,7 @@ public class StorageMonitoringServiceImpl implements IStorageMonitoringService { String locationCode = locationList.get(0).getLocationCode(); //调用ctu - AgvSchedulingTaskVO ctuSchedulingTask = taskExecuteRecordService.genCtuSchedulingTask("QM1", "1", firstTask.getBoxBarcode(), location.getLocationCode(), + AgvSchedulingTaskVO ctuSchedulingTask = taskExecuteRecordService.genCtuSchedulingTask(AgvConstant.CTU_TASK_TYP, AgvConstant.CTU_CTNR_TYP, firstTask.getBoxBarcode(), location.getLocationCode(), locationCode, AgvConstant.EQUIPMENT_TYPE_CTU); //调用成功 添加任务 diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/TaskExecuteRecordServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/TaskExecuteRecordServiceImpl.java index a41f037c..8752e271 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/TaskExecuteRecordServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/TaskExecuteRecordServiceImpl.java @@ -292,7 +292,7 @@ public class TaskExecuteRecordServiceImpl extends BaseServiceImpl implement TaskMapper taskMapper; @Override - public void savePipelineWeigh(String boxBarcode, BigDecimal actualWeight, Integer statusReturned) { + public void savePipelineWeigh(String boxBarcode, BigDecimal actualWeight) { // 1.查询物料箱 筛选状态 Task task = taskMapper.selectByBoxBarcode(boxBarcode); // 2.更新重量以及任务状态 task.setMachineWeight(actualWeight); - task.setTaskStatus(statusReturned); taskMapper.updateById(task); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/utils/AgvTaskTypeUtil.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/utils/AgvTaskTypeUtil.java index 6ca253d3..1a086972 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/utils/AgvTaskTypeUtil.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/utils/AgvTaskTypeUtil.java @@ -1,4 +1,7 @@ package org.springblade.desk.logistics.utils; +import org.springblade.desk.logistics.pojo.entity.Station; +import org.springblade.desk.logistics.service.IStationService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import lombok.extern.slf4j.Slf4j; @@ -9,103 +12,85 @@ import lombok.extern.slf4j.Slf4j; @Service public class AgvTaskTypeUtil { + @Autowired + IStationService stationService; + + /** - * 获取AGV任务类型 - * @param floor 楼层 (1:一层, 3:三层) - * @param isRecycle 是否回收 (true:空箱回收, false:正常任务) - * @return 任务类型 (QM3, QM5, QM6, QM7) + * 根据起点和终点获取AGV任务类型 + * @param startPosition 起点位置编码 (1001/1002/站点code) + * @param endPosition 终点位置编码 (1001/1002/站点code) + * @return 任务类型 (QM, QM3, QM5, QM6, QM7) */ - public String getTaskType(Integer floor, Boolean isRecycle) { + public String getTaskTypeByPositions(String startPosition, String endPosition) { // 参数校验 - if (floor == null) { - log.error("楼层参数不能为空"); - throw new IllegalArgumentException("楼层参数不能为空"); + if (startPosition == null || endPosition == null) { + log.error("起点或终点位置不能为空"); + throw new IllegalArgumentException("起点和终点位置不能为空"); } - // 默认isRecycle为false - isRecycle = isRecycle != null ? isRecycle : false; - - String taskType; + // 判断起点和终点的类型及楼层 + boolean isStartConveyorStart = "1002".equals(startPosition); + boolean isStartConveyorEnd = "1001".equals(startPosition); + boolean isEndConveyorStart = "1002".equals(endPosition); + boolean isEndConveyorEnd = "1001".equals(endPosition); - switch (floor) { - case 1: - // 一层 - if (isRecycle) { - // 一层空箱回收 -> QM6 (同楼层放货放到输送线上) - taskType = "QM6"; - log.info("一层空箱回收任务,使用QM6"); - } else { - // 一层正常任务 -> QM7 (输送线取货放到普通梳齿架站点) - taskType = "QM7"; - log.info("一层正常任务,使用QM7"); - } - break; + // 获取站点楼层(如果不是站点,返回null) + Integer startFloor = null; + Integer endFloor = null; - case 3: - // 三层 - if (isRecycle) { - // 三层空箱回收 -> QM5 (三楼站点取货放到三楼电梯接驳位到一层) - taskType = "QM5"; - log.info("三层空箱回收任务,使用QM5"); - } else { - // 三层正常任务 -> QM3 (输送线取货-电梯跨楼层) - taskType = "QM3"; - log.info("三层正常任务,使用QM3"); - } - break; + if (!isStartConveyorStart && !isStartConveyorEnd) { + // 起点是站点,查询楼层 + Station startStation = stationService.getByStationCode(startPosition); + if (startStation == null) { + log.error("未找到起点站点信息,站点编码:{}", startPosition); + throw new IllegalArgumentException("无效的起点站点编码:" + startPosition); + } + startFloor = Integer.parseInt(startStation.getStationPosition()); + } - default: - log.error("不支持的楼层:{}", floor); - throw new IllegalArgumentException("不支持的楼层:" + floor); + if (!isEndConveyorStart && !isEndConveyorEnd) { + // 终点是站点,查询楼层 + Station endStation = stationService.getByStationCode(endPosition); + if (endStation == null) { + log.error("未找到终点站点信息,站点编码:{}", endPosition); + throw new IllegalArgumentException("无效的终点站点编码:" + endPosition); + } + endFloor = Integer.parseInt(endStation.getStationPosition()); } - return taskType; - } + // 场景1: 站点 <-----> 站点 -> QM + if (startFloor != null && endFloor != null) { + log.info("站点到站点任务,使用QM"); + return "QM"; + } - /** - * 获取AGV任务类型(简化版,只传楼层) - * @param floor 楼层 - * @return 任务类型 - */ - public String getTaskType(Integer floor) { - return getTaskType(floor, false); - } + // 场景2: 输送线起点(1002) ---> 站点(一层) -> QM7 + if (isStartConveyorStart && endFloor != null && endFloor == 1) { + log.info("输送线起点到一层站点任务,使用QM7"); + return "QM7"; + } - /** - * 判断是否为跨楼层任务 - * @param taskType 任务类型 - * @return true:跨楼层 false:同楼层 - */ - public boolean isCrossFloor(String taskType) { - return "QM3".equals(taskType) || "QM5".equals(taskType); - } + // 场景3: 站点(一层) ----> 输送线终点(1001) -> QM6 + if (startFloor != null && startFloor == 1 && isEndConveyorEnd) { + log.info("一层站点到输送线终点任务,使用QM6"); + return "QM6"; + } - /** - * 判断是否为回收任务 - * @param taskType 任务类型 - * @return true:回收任务 false:正常任务 - */ - public boolean isRecycleTask(String taskType) { - return "QM5".equals(taskType) || "QM6".equals(taskType); - } + // 场景4: 输送线起点(1002) ---> 站点(二层) -> QM3 + if (isStartConveyorStart && endFloor != null && endFloor == 2) { + log.info("输送线起点到二层站点任务,使用QM3"); + return "QM3"; + } - /** - * 获取任务描述 - * @param taskType 任务类型 - * @return 任务描述 - */ - public String getTaskDescription(String taskType) { - switch (taskType) { - case "QM3": - return "输送线取货-电梯跨楼层(小车不做电梯),货物放电梯接驳位,三楼小车接货后放到目标站点"; - case "QM5": - return "三楼站点取货放到三楼电梯接驳位到一层后,一楼小车取电梯内货物放到输送线(空箱回收)"; - case "QM6": - return "同楼层放货放到输送线上(不跨楼层)"; - case "QM7": - return "输送线取货放到普通梳齿架站点(不跨电梯仅同楼层)"; - default: - return "未知任务类型"; + // 场景5: 站点(二层) ----> 输送线终点(1001) -> QM5 + if (startFloor != null && startFloor == 2 && isEndConveyorEnd) { + log.info("二层站点到输送线终点任务,使用QM5"); + return "QM5"; } + + // 其他情况,记录日志并抛出异常 + log.error("无法确定任务类型,起点:{},终点:{}", startPosition, endPosition); + throw new IllegalArgumentException("无法确定任务类型,请检查起点和终点位置的组合"); } }