量具计量记录改为从lims定时同步,保存到本地数据库

liweidong
qinyulong 1 month ago
parent ebc6eb5933
commit 8fcee4fe66
  1. 2
      blade-ops/blade-job/src/main/java/org/springblade/job/processor/device/IotEquipmentProcessor.java
  2. 38
      blade-ops/blade-job/src/main/java/org/springblade/job/processor/device/LimsMeaToolProcessor.java
  3. 25
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/device/feign/LimsMeaToolTaskClient.java
  4. 239
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/device/pojo/entity/MeasurementRecordsEntity.java
  5. 21
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/device/pojo/vo/MeasurementRecordsVO.java
  6. 105
      blade-service/blade-desk/src/main/java/org/springblade/desk/device/controller/MeasurementRecordsController.java
  7. 23
      blade-service/blade-desk/src/main/java/org/springblade/desk/device/feign/LimsMeaToolTaskClientImpl.java
  8. 39
      blade-service/blade-desk/src/main/java/org/springblade/desk/device/mapper/MeasurementRecordsMapper.java
  9. 62
      blade-service/blade-desk/src/main/java/org/springblade/desk/device/mapper/MeasurementRecordsMapper.xml
  10. 22
      blade-service/blade-desk/src/main/java/org/springblade/desk/device/service/IMeasurementRecordsService.java
  11. 128
      blade-service/blade-desk/src/main/java/org/springblade/desk/device/service/impl/IMeasurementRecordsServiceImpl.java
  12. 35
      blade-service/blade-desk/src/main/java/org/springblade/desk/device/wrapper/MeasurementRecordsWrapper.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;

@ -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<Void> runFuture = CompletableFuture.runAsync(() -> limsMeaToolTaskClient.syncMeasurementRecordsTask());
runFuture.whenComplete((result, exception) -> {
if (exception != null) {
log.error("同步量具计量记录数据任务失败", exception);
} else {
log.info("同步量具计量记录数据任务完毕");
}
});
return new ProcessResult(true);
}
}

@ -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();
}

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

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

@ -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<IPage<MeasurementRecordsEntity>> page(@RequestParam("cmType") Integer cmType, Query query) {
IPage<MeasurementRecordsEntity> pages = iMeasurementRecordsService.selectMeasurementRecordsPage(Condition.getPage(query), cmType);
@Operation(summary = "详情", description = "传入mesMeasurementRecords")
public R<MeasurementRecordsVO> 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<IPage<MeasurementRecordsVO>> page(MeasurementRecordsVO mesMeasurementRecords, Query query) {
IPage<MeasurementRecordsVO> 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.<MeasurementRecordsEntity>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.<MeasurementRecordsEntity>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<MeasurementRecordsEntity> pages = iMeasurementRecordsService.selectMeasurementRecordsPage(Condition.getPage(query), cmType);
List<MeasurementRecordsEntity> list = pages.getRecords();
public void exportMeasuringUpkeep(MeasurementRecordsVO mesMeasurementRecords, Query query, HttpServletResponse response) {
query.setSize(9999);
IPage<MeasurementRecordsVO> pages = mesMeasurementRecordsService.selectMeasurementRecordsPage(Condition.getPage(query), mesMeasurementRecords);
List<MeasurementRecordsVO> list = pages.getRecords();
List<MeasurementRecordsExcel> 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);
}
}

@ -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<MeasurementRecordsEntity> page = new Page<>(1, 9999);
measurementRecordsService.syncMeasurementRecords(page, 1);
}
}

@ -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<MeasurementRecordsEntity> {
/**
* 自定义分页
*
* @param page 分页参数
* @param mesMeasurementRecords 查询参数
* @return List<MeasurementRecordsVO>
*/
List<MeasurementRecordsVO> selectMeasurementRecordsPage(IPage page, MeasurementRecordsVO mesMeasurementRecords);
/**
* 获取导出数据
*
* @param queryWrapper 查询条件
* @return List<MeasurementRecordsExcel>
*/
List<MeasurementRecordsExcel> exportMeasurementRecords(@Param("ew") Wrapper<MeasurementRecordsEntity> queryWrapper);
}

@ -0,0 +1,62 @@
<?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.desk.device.mapper.MeasurementRecordsMapper">
<!-- 通用查询映射结果 -->
<resultMap id="mesMeasurementRecordsResultMap"
type="org.springblade.desk.device.pojo.entity.MeasurementRecordsEntity">
<result column="ID" property="id"/>
<result column="TENANT_ID" property="tenantId"/>
<result column="CREATE_USER" property="createUser"/>
<result column="CREATE_TIME" property="createTime"/>
<result column="CREATE_DEPT" property="createDept"/>
<result column="UPDATE_USER" property="updateUser"/>
<result column="UPDATE_TIME" property="updateTime"/>
<result column="STATUS" property="status"/>
<result column="IS_DELETED" property="isDeleted"/>
<result column="MC_NAME" property="mcName"/>
<result column="NORMS" property="norms"/>
<result column="MC_CLASS" property="mcClass"/>
<result column="LABEL_NO" property="labelNo"/>
<result column="STR2" property="str2"/>
<result column="MC_CODE" property="mcCode"/>
<result column="USE_UNIT" property="useUnit"/>
<result column="ACCURACY" property="accuracy"/>
<result column="OEM_CODE" property="oemCode"/>
<result column="MC_OEM" property="mcOem"/>
<result column="ENABLE_DATE" property="enableDate"/>
<result column="WHEN_DCCEPT" property="whenDccept"/>
<result column="MC_TYPE" property="mcType"/>
<result column="TEST_CYCLE" property="testCycle"/>
<result column="DUE_DATE" property="dueDate"/>
<result column="DATE2" property="date2"/>
<result column="BELONG" property="belong"/>
<result column="WHEN_BUY" property="whenBuy"/>
<result column="TEST_DEPT" property="testDept"/>
<result column="TEST_METHOD" property="testMethod"/>
<result column="STR9" property="str9"/>
<result column="STR10" property="str10"/>
<result column="ASSETS_NO" property="assetsNo"/>
<result column="STR6" property="str6"/>
<result column="PURPOSE_CLASS" property="purposeClass"/>
<result column="IS_OVER_STR" property="isOverStr"/>
<result column="CM_TYPE" property="cmType"/>
<result column="CENSORSHIP" property="censorship"/>
<result column="CHECK_STATUS" property="checkStatus"/>
<result column="CHECK_RESULT" property="checkResult"/>
</resultMap>
<select id="selectMeasurementRecordsPage" resultMap="mesMeasurementRecordsResultMap">
select *
from MES_MEASUREMENT_RECORDS
where is_deleted = 0
</select>
<select id="exportMeasurementRecords" resultType="org.springblade.desk.device.pojo.excel.MeasurementRecordsExcel">
SELECT *
FROM MES_MEASUREMENT_RECORDS ${ew.customSqlSegment}
</select>
</mapper>

@ -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<MeasurementRecordsEntity> {
/**
* 自定义分页
*
* @param page 分页参数
* @param cmType 查询参数
* @return IPage<JSONObject>
* @param page 分页参数
* @param mesMeasurementRecords 查询参数
* @return IPage<MeasurementRecordsVO>
*/
IPage<MeasurementRecordsEntity> selectMeasurementRecordsPage(IPage<MeasurementRecordsEntity> page, Integer cmType);
IPage<MeasurementRecordsVO> selectMeasurementRecordsPage(IPage<MeasurementRecordsEntity> page, MeasurementRecordsVO mesMeasurementRecords);
/**
* 同步lims的量具计量记录
*
* @param page
* @param cmType 类型1仪表计量2设备计量
* @return
*/
R syncMeasurementRecords(IPage<MeasurementRecordsEntity> page, Integer cmType);
// /**
// * 导出数据
// *

@ -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<MeasurementRecordsMapper, MeasurementRecordsEntity> 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<MeasurementRecordsEntity> selectMeasurementRecordsPage(IPage<MeasurementRecordsEntity> page, Integer cmType) {
public IPage<MeasurementRecordsVO> selectMeasurementRecordsPage(IPage<MeasurementRecordsEntity> page, MeasurementRecordsVO mesMeasurementRecords) {
// 1. 创建条件构造器
LambdaQueryWrapper<MeasurementRecordsEntity> wrapper = Wrappers.<MeasurementRecordsEntity>lambdaQuery();
// 2. 动态添加条件(核心!)
// 根据实体对象 entity 中字段是否为空,来动态拼接WHERE条件
wrapper.eq(Objects.nonNull(mesMeasurementRecords.getMcCode()), MeasurementRecordsEntity::getMcCode, mesMeasurementRecords.getMcCode());
// 3. 执行分页查询
IPage<MeasurementRecordsEntity> measurementRecordsEntityIPage = baseMapper.selectPage(page, wrapper);
return MeasurementRecordsWrapper.build().pageVO(measurementRecordsEntityIPage);
}
@Override
public R syncMeasurementRecords(IPage<MeasurementRecordsEntity> 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<MeasurementRecordsEntity> entityList1 = new ArrayList<>();
return page.setRecords(List.of()); // 返回空列表而不是null
return R.fail("获取计量记录记录数据接口调用失败");
}
}
@ -79,10 +105,10 @@ public class IMeasurementRecordsServiceImpl implements IMeasurementRecordsServic
/**
* 处理HTTP响应
*/
private IPage<MeasurementRecordsEntity> processResponse(HttpResponse<String> response, IPage<MeasurementRecordsEntity> page) {
private R processResponse(HttpResponse<String> response, IPage<MeasurementRecordsEntity> 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<MeasurementRecordsEntity> list) {
if (CollectionUtils.isEmpty(list)) {
return false;
}
// 分批处理,提高性能
List<List<MeasurementRecordsEntity>> partitions = Lists.partition(list, 1000);
int totalAffected = 0;
for (List<MeasurementRecordsEntity> partition : partitions) {
// 按mcCode分组
Map<String, MeasurementRecordsEntity> codeToEntityMap = partition.stream()
.collect(Collectors.toMap(
MeasurementRecordsEntity::getMcCode,
Function.identity(),
(oldValue, newValue) -> newValue
));
// 1. 查询已存在的记录
List<String> mcCodes = new ArrayList<>(codeToEntityMap.keySet());
List<MeasurementRecordsEntity> existingList = this.lambdaQuery()
.in(MeasurementRecordsEntity::getMcCode, mcCodes)
.list();
// 2. 分离需要新增和更新的记录
Map<String, MeasurementRecordsEntity> existingMap = existingList.stream()
.collect(Collectors.toMap(MeasurementRecordsEntity::getMcCode, Function.identity()));
List<MeasurementRecordsEntity> toInsert = new ArrayList<>();
List<MeasurementRecordsEntity> 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;
}
}

@ -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<MeasurementRecordsEntity, MeasurementRecordsVO> {
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;
}
}
Loading…
Cancel
Save