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; + } + + +}