Эх сурвалжийг харах

Merge branch 'test-merge' of http://219.151.181.73:3000/zhuwei/bladex into test-merge

lvy 1 өдөр өмнө
parent
commit
8ac4cadc00
34 өөрчлөгдсөн 1131 нэмэгдсэн , 61 устгасан
  1. 1 0
      blade-gateway/src/main/java/org/springblade/gateway/provider/AuthProvider.java
  2. 0 2
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/TaskProgressClient.java
  3. 3 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskProgressVO1.java
  4. 22 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/ProfilerOffsetDTO.java
  5. 22 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/ProfilerOffsetResultDTO.java
  6. 89 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ProfilerData.java
  7. 146 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ProfilerOffset.java
  8. 102 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ProfilerStandardSectionBean.java
  9. 43 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/profiler/ProfilerResult.java
  10. 22 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/profiler/ProfilerSaveDTO.java
  11. 7 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  12. 1 4
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/TaskProgressClientImpl.java
  13. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TaskProgressMapper.java
  14. 18 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TaskProgressMapper.xml
  15. 39 9
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskProgressServiceImpl.java
  16. 2 3
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  17. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/sync/TaskSync.java
  18. 0 1
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVDataServiceImpl.java
  19. 13 3
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java
  20. 100 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ProfilerController.java
  21. 20 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProfilerDataMapper.java
  22. 25 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProfilerDataMapper.xml
  23. 23 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProfilerOffsetMapper.java
  24. 36 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProfilerOffsetMapper.xml
  25. 20 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProfilerStandardSectionBeanMapper.java
  26. 28 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProfilerStandardSectionBeanMapper.xml
  27. 13 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/ProfilerDataService.java
  28. 30 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/ProfilerOffsetService.java
  29. 13 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/ProfilerStandardSectionBeanService.java
  30. 22 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ProfilerDataServiceImpl.java
  31. 206 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ProfilerOffsetServiceImpl.java
  32. 22 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ProfilerStandardSectionBeanServiceImpl.java
  33. 37 32
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/SignPfxFilePreServiceImpl.java
  34. 3 3
      blade-service/blade-system/src/main/java/org/springblade/system/mapper/DictBizMapper.xml

+ 1 - 0
blade-gateway/src/main/java/org/springblade/gateway/provider/AuthProvider.java

@@ -69,6 +69,7 @@ public class AuthProvider {
         DEFAULT_SKIP_URL.add("/getArchiveToken"); //成渝第三方登录获取档案系统tokne
         DEFAULT_SKIP_URL.add("/meeting/**");//DingDing会议接口
         DEFAULT_SKIP_URL.add("/hczc/api/meter/**");//重庆高速计量获取分部分项划分
+        DEFAULT_SKIP_URL.add("/profiler/save");//成渝断面仪新增接口开放
 
     }
 

+ 0 - 2
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/TaskProgressClient.java

@@ -13,8 +13,6 @@ public interface TaskProgressClient {
      */
     String API_PREFIX = "/api/business/taskProgress";
 
-    @GetMapping(API_PREFIX + "/addTaskProgress")
-    Boolean addTaskProgress(@RequestParam("projectId") Long projectId, @RequestParam("contractId") Long contractId, @RequestParam("type") Integer type, @RequestParam("size") Integer size, @RequestParam("dataIds") String dataIds);
 
     @GetMapping(API_PREFIX + "/updateTaskProgress")
     Boolean updateTaskProgress(@RequestParam("projectId") Long projectId,@RequestParam("contractId") Long contractId,@RequestParam("type") Integer type,@RequestParam("finishTotal") Integer finishTotal,@RequestParam("dataId") String dataId);

+ 3 - 1
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskProgressVO1.java

@@ -4,6 +4,8 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.math.BigDecimal;
+
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
@@ -13,5 +15,5 @@ public class TaskProgressVO1 {
 
     private Integer totalCount;
 
-    private Double pace;
+    private BigDecimal pace;
 }

+ 22 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/ProfilerOffsetDTO.java

@@ -0,0 +1,22 @@
+package org.springblade.manager.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.manager.entity.ProfilerOffset;
+
+/**
+ * @author LHB
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ProfilerOffsetDTO extends ProfilerOffset {
+    @ApiModelProperty(value = "当前页")
+    private Integer current;
+    @ApiModelProperty(value = "每页显示数量")
+    private Integer size;
+    @ApiModelProperty(value = "开始时间")
+    private String startTime;
+    @ApiModelProperty(value = "结束时间")
+    private String endTime;
+}

+ 22 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/ProfilerOffsetResultDTO.java

@@ -0,0 +1,22 @@
+package org.springblade.manager.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.manager.entity.ProfilerData;
+import org.springblade.manager.entity.ProfilerOffset;
+import org.springblade.manager.entity.ProfilerStandardSectionBean;
+
+import java.util.List;
+
+/**
+ * @author LHB
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ProfilerOffsetResultDTO extends ProfilerOffset {
+    @ApiModelProperty(value = "标准断面")
+    private List<ProfilerStandardSectionBean> sectionBeans;
+    @ApiModelProperty(value = "测量点数组")
+    private List<ProfilerData> data;
+}

+ 89 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ProfilerData.java

@@ -0,0 +1,89 @@
+package org.springblade.manager.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.time.LocalDateTime;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * 断面仪-测量点数组
+ * @author LHB
+ * @TableName q_profiler_data
+ */
+@TableName(value ="q_profiler_data")
+@Data
+public class ProfilerData {
+    /**
+     * 
+     */
+    @TableId(type = IdType.INPUT)
+    @ApiModelProperty("id")
+    private Long id;
+
+    /**
+     * 基础信息id
+     */
+    @ApiModelProperty("基础信息id")
+    private Long offsetId;
+
+    /**
+     * 测点角度
+     */
+    @ApiModelProperty("测点角度")
+    private String angle;
+
+    /**
+     * 超/欠挖值
+     */
+    @ApiModelProperty("超/欠挖值")
+    private String backBreak;
+
+    /**
+     * 距离
+     */
+    @ApiModelProperty("距离")
+    private String dist;
+
+    /**
+     * x坐标
+     */
+    @ApiModelProperty("x坐标")
+    private String x;
+
+    /**
+     * z坐标
+     */
+    @ApiModelProperty("z坐标")
+    private String z;
+
+    /**
+     *  创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    /**
+     *  创建人
+     */
+    private Long createUser;
+
+    /**
+     *  修改时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+    /**
+     *  修改人
+     */
+    private Long updateUser;
+
+}

+ 146 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ProfilerOffset.java

@@ -0,0 +1,146 @@
+package org.springblade.manager.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.time.LocalDateTime;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * 断面仪-基础信息+测量者信息
+ * @author LHB
+ * @TableName q_profiler_offset
+ */
+@TableName(value ="q_profiler_offset")
+@Data
+public class ProfilerOffset {
+    /**
+     * 
+     */
+    @TableId(type = IdType.INPUT)
+    @ApiModelProperty("id")
+    private Long id;
+
+    /**
+     * 断面仪测量设备编码或名称
+     */
+    @ApiModelProperty("断面仪测量设备编码或名称")
+    private String deviceCode;
+
+    /**
+     * 仪器高度(米)
+     */
+    @ApiModelProperty("仪器高度(米)")
+    private String deviceHeight;
+
+    /**
+     * 椭圆半径
+     */
+    @ApiModelProperty("椭圆半径")
+    private String ellipseRadius;
+
+    /**
+     * 斜坡
+     */
+    @ApiModelProperty("斜坡")
+    private String slope;
+
+    /**
+     * x方向偏移量(米)
+     */
+    @ApiModelProperty("x方向偏移量(米)")
+    @TableField(value = "x")
+    private String x0;
+
+    /**
+     * z方向偏移量(米)
+     */
+    @ApiModelProperty("z方向偏移量(米)")
+    @TableField(value = "z")
+    private String z0;
+
+    /**
+     * 隧道名称
+     */
+    @ApiModelProperty("隧道名称")
+    @TableField(value = "info_channel_name")
+    private String channelName;
+
+    /**
+     * 施工单位
+     */
+    @ApiModelProperty("施工单位")
+    @TableField(value = "info_construction_unit")
+    private String constructionUnit;
+
+    /**
+     * 测量时间
+     */
+    @ApiModelProperty("测量时间")
+    @TableField(value = "info_date")
+    private String date;
+
+    /**
+     * 工程名称
+     */
+    @ApiModelProperty("工程名称")
+    @TableField(value = "info_name_of_project")
+    private String nameOfProject;
+
+    /**
+     * 测量者
+     */
+    @ApiModelProperty("测量者")
+    @TableField(value = "info_user_name")
+    private String userName;
+
+    /**
+     * 里程号
+     */
+    @ApiModelProperty("里程号")
+    @TableField(value = "info_mileage_number")
+    private String mileageNumber;
+    /**
+     * 是否超欠挖 (我们这边自己判断的状态)
+     */
+    @ApiModelProperty("是否超欠挖")
+    @TableField(value = "back_break")
+    private String backBreak;
+
+    /**
+     * 文件地址
+     */
+    @ApiModelProperty("文件地址")
+    private String fileUrl;
+
+    /**
+     *  创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    /**
+     *  创建人
+     */
+    private Long createUser;
+
+    /**
+     *  修改时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+    /**
+     *  修改人
+     */
+    private Long updateUser;
+
+}

+ 102 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ProfilerStandardSectionBean.java

@@ -0,0 +1,102 @@
+package org.springblade.manager.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.time.LocalDateTime;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * 断面仪-标准断面
+ * @author LHB
+ * @TableName q_profiler_standard_section_bean
+ */
+@TableName(value ="q_profiler_standard_section_bean")
+@Data
+public class ProfilerStandardSectionBean {
+    /**
+     * 
+     */
+    @TableId(type = IdType.INPUT)
+    @ApiModelProperty("id")
+    private Long id;
+
+    /**
+     * 基础信息id
+     */
+    @ApiModelProperty("基础信息id")
+    private Long offsetId;
+
+    /**
+     * 方向,true为顺时针,false为逆时针 
+     */
+    @ApiModelProperty("方向,true为顺时针,false为逆时针 ")
+    private String direction;
+
+    /**
+     * 终角
+     */
+    @ApiModelProperty("终角")
+    private String endAngle;
+
+    /**
+     * 半径
+     */
+    @ApiModelProperty("半径")
+    private String radius;
+
+    /**
+     * 查询
+     */
+    @ApiModelProperty("查询")
+    @TableField("`select`")
+    private String select;
+
+    /**
+     * 起角(米)
+     */
+    @ApiModelProperty("起角(米)")
+    private String startAngle;
+
+    /**
+     * 圆心x(米)
+     */
+    @ApiModelProperty("圆心x(米)")
+    private String x;
+
+    /**
+     * 圆心z(米)
+     */
+    @ApiModelProperty("圆心z(米)")
+    private String y;
+
+    /**
+     *  创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    /**
+     *  创建人
+     */
+    private Long createUser;
+
+    /**
+     *  修改时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+    /**
+     *  修改人
+     */
+    private Long updateUser;
+}

+ 43 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/profiler/ProfilerResult.java

@@ -0,0 +1,43 @@
+package org.springblade.manager.entity.profiler;
+
+import lombok.Data;
+
+/**
+ * @author LHB
+ */
+@Data
+public class ProfilerResult {
+    private String success;
+    private ProfilerError error;
+    private Object result;
+
+    @Data
+    static class ProfilerError{
+        private String code;
+        private String message;
+        private String details;
+
+        public ProfilerError(String code, String message, String details) {
+            this.code = code;
+            this.message = message;
+            this.details = details;
+        }
+    }
+
+
+    public static ProfilerResult success() {
+        ProfilerResult r = new ProfilerResult();
+        r.setSuccess("true");
+        r.setResult(null);
+        return r;
+    }
+
+
+    public static ProfilerResult error(String code, String message, String details) {
+        ProfilerResult r = new ProfilerResult();
+        r.setSuccess("false");
+        r.setError(new ProfilerError(code, message, details));
+        return r;
+    }
+
+}

+ 22 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/profiler/ProfilerSaveDTO.java

@@ -0,0 +1,22 @@
+package org.springblade.manager.entity.profiler;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author LHB
+ * 第三方推送数据结构
+ */
+@Data
+public class ProfilerSaveDTO {
+    @ApiModelProperty(value = "appKey")
+    private String appKey;
+    @ApiModelProperty(value = "当前时间戳(秒)")
+    private Long timestamp;
+    @ApiModelProperty(value = "签名")
+    private String sign;
+    @ApiModelProperty(value = "编码")
+    private String deviceCode;
+    @ApiModelProperty(value = "JSON数据")
+    private String data;
+}

+ 7 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -5374,10 +5374,15 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		//List<Long> idsList=Func.toLongList(ids);
 		List<ArchivesAuto> archivesAutoList = this.list(new LambdaQueryWrapper<ArchivesAuto>().in(ArchivesAuto::getId, idsList));
 		for (ArchivesAuto auto : archivesAutoList) {
-			if(auto.getOutUrl()==null||auto.getOutUrl().isEmpty()){
+			String sql=" select * from u_archive_file where is_deleted = 0 and archive_id="+auto.getId();
+			List<ArchiveFile> archiveFiles = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ArchiveFile.class));
+			if(archiveFiles.isEmpty()){
+				continue;
+			}
+			String fileUrl=StringUtils.isNotEmpty(archiveFiles.get(0).getPdfFileUrl())?archiveFiles.get(0).getPdfFileUrl():StringUtils.isNotEmpty(archiveFiles.get(0).getFileUrl())?archiveFiles.get(0).getFileUrl():null;
+			if(fileUrl==null){
 				continue;
 			}
-			String fileUrl=auto.getOutUrl().substring(0,auto.getOutUrl().indexOf("@"));
 			String filePath=url+auto.getName()+".pdf";
 			System.out.println("开始保存:"+fileUrl);
 			Boolean b = FileUtils.saveInputStreamByUrl(fileUrl, filePath);

+ 1 - 4
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/TaskProgressClientImpl.java

@@ -14,10 +14,7 @@ public class TaskProgressClientImpl implements TaskProgressClient {
     private final ITaskProgressService taskProgressService;
 
 
-    @Override
-    public Boolean addTaskProgress(Long projectId, Long contractId, Integer type, Integer size,String dataIds) {
-       return taskProgressService.addTaskProgress(projectId, contractId, type, size,dataIds);
-    }
+
 
     @Override
     public Boolean updateTaskProgress(Long projectId, Long contractId, Integer type, Integer finishTotal,String dataId) {

+ 2 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TaskProgressMapper.java

@@ -48,4 +48,6 @@ public interface TaskProgressMapper extends BaseMapper<TaskProgress> {
 	void checkAndUpdateIsFinish(@Param("id") Long id);
 
 	TaskProgressVO selectNewTaskProgress1(@Param("projectId") Long projectId, @Param("contractId") Long contractId, @Param("type") Integer type);
+
+	Integer selectTaskBatchSize(@Param("dataIds") List<Long> dataIds);
 }

+ 18 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TaskProgressMapper.xml

@@ -36,5 +36,23 @@
     <select id="selectNewTaskProgress1" resultType="org.springblade.business.vo.TaskProgressVO">
         select * from m_task_progress where is_deleted = 0 and project_id = #{projectId} and contract_id = #{contractId} and type = #{type}  order by create_time desc limit 1
     </select>
+    <select id="selectTaskBatchSize" resultType="java.lang.Integer">
+        SELECT COUNT(*)
+        FROM (
+        SELECT DISTINCT JSON_UNQUOTE(JSON_EXTRACT(utb.json_data, '$.taskId')) as taskId
+        FROM u_task_batch utb
+        INNER JOIN m_task_progress mtp
+        ON FIND_IN_SET(
+        JSON_UNQUOTE(JSON_EXTRACT(utb.json_data, '$.formDataId')),
+        mtp.data_id
+        ) > 0
+        <if test="dataIds != null and dataIds.size() > 0">
+            WHERE JSON_UNQUOTE(JSON_EXTRACT(utb.json_data, '$.formDataId')) IN
+            <foreach collection="dataIds" item="id" open="(" close=")" separator=",">
+                #{id}
+            </foreach>
+        </if>
+        ) distinct_tasks
+    </select>
 
 </mapper>

+ 39 - 9
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskProgressServiceImpl.java

@@ -24,9 +24,12 @@ import org.springblade.business.mapper.TaskProgressMapper;
 import org.springblade.business.service.ITaskProgressService;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.business.vo.TaskProgressVO1;
+import org.springblade.core.tool.utils.Func;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
@@ -50,21 +53,48 @@ public class TaskProgressServiceImpl extends BaseServiceImpl<TaskProgressMapper,
 		Map<String, TaskProgressVO1> map = new HashMap<>();
 		TaskProgressVO vo1 = baseMapper.selectNewTaskProgress1(projectId, contractId,1);
 		if(vo1!=null){
-			map.put("save-again", new TaskProgressVO1(vo1.getFinishTatol(),vo1.getTaskTotal(),vo1.getTaskTotal() > 0 ?
-					(double) vo1.getFinishTatol() / vo1.getTaskTotal() * 100 :
-					0.00));
+			BigDecimal result = (vo1.getTaskTotal() != null && vo1.getTaskTotal() > 0 && vo1.getFinishTatol() != null) ?
+					new BigDecimal(vo1.getFinishTatol())
+							.divide(new BigDecimal(vo1.getTaskTotal()), 2, RoundingMode.HALF_UP)
+							.multiply(new BigDecimal(100)) :
+					BigDecimal.ZERO;
+			map.put("save-again", new TaskProgressVO1(vo1.getFinishTatol(),vo1.getTaskTotal(),result));
 		}
 		TaskProgressVO vo2 = baseMapper.selectNewTaskProgress1(projectId, contractId,2);
 		if(vo2!=null){
-			map.put("re-sign", new TaskProgressVO1(vo2.getFinishTatol(),vo2.getTaskTotal(),vo2.getTaskTotal() > 0 ?
-					(double) vo2.getFinishTatol() / vo2.getTaskTotal() * 100 :
-					0.00));
+			Integer size=0;
+			if(StringUtils.isNotEmpty(vo2.getDataId())){
+				size=baseMapper.selectTaskBatchSize(Func.toLongList(vo2.getDataId()));
+			}
+			Integer finishTatol=vo2.getTaskTotal()-size;
+			// 使用 BigDecimal 进行精确计算并保留两位小数
+			BigDecimal result = vo2.getTaskTotal() > 0 ?
+					new BigDecimal(finishTatol).divide(new BigDecimal(vo2.getTaskTotal()), 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100)) :
+					BigDecimal.ZERO;
+			result = result.setScale(2, RoundingMode.HALF_UP);
+			map.put("re-sign", new TaskProgressVO1(finishTatol,vo2.getTaskTotal(),result));
+			if(size==0){
+				vo2.setIsDeleted(0);
+				baseMapper.updateById(vo2);
+			}
 		}
 		TaskProgressVO vo3 = baseMapper.selectNewTaskProgress1(projectId, contractId,4);
 		if(vo3!=null){
-			map.put("electronic-sign", new TaskProgressVO1(vo3.getFinishTatol(),vo3.getTaskTotal(),vo3.getTaskTotal() > 0 ?
-					(double) vo3.getFinishTatol() / vo3.getTaskTotal() * 100 :
-					0.00));
+			Integer size=0;
+			if(StringUtils.isNotEmpty(vo3.getDataId())){
+				size=baseMapper.selectTaskBatchSize(Func.toLongList(vo3.getDataId()));
+			}
+			Integer finishTatol=vo3.getTaskTotal()-size;
+			// 使用 BigDecimal 进行精确计算并保留两位小数
+			BigDecimal result = vo3.getTaskTotal() > 0 ?
+					new BigDecimal(finishTatol).divide(new BigDecimal(vo3.getTaskTotal()), 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100)) :
+					BigDecimal.ZERO;
+			result = result.setScale(2, RoundingMode.HALF_UP);
+			map.put("electronic-sign", new TaskProgressVO1(finishTatol,vo3.getTaskTotal(),result));
+			if(size==0){
+				vo3.setIsDeleted(0);
+				baseMapper.updateById(vo3);
+			}
 		}
 		return map;
 	}

+ 2 - 3
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java

@@ -1972,7 +1972,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                     .in(InformationQuery::getId, newIds));
             List<InformationQuery> list = informationQueryService.list(new LambdaQueryWrapper<>(InformationQuery.class).in(InformationQuery::getId, newIds));
             recordResignLog("save-again", StringUtils.join(newIds, ","), list, dtos, dtos.get(0).getProjectId()+"", dtos.get(0).getContractId()+"", null);
-            taskProgressService.addTaskProgress(dtos.get(0).getProjectId(), dtos.get(0).getContractId(), 1,dtos.size(),null);
+            taskProgressService.addTaskProgress(dtos.get(0).getProjectId(), dtos.get(0).getContractId(), 1,dtos.size(),StringUtils.join(newIds, ","));
         }
         return R.success("操作成功");
     }
@@ -1997,7 +1997,6 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
         //查询任务信息
         List<Task> taskList = jdbcTemplate.query("select * from u_task where id in(" + taskIds + ")", new BeanPropertyRowMapper<>(Task.class));
         if (taskList.size() > 0) {
-            taskProgressService.addTaskProgress(Long.parseLong(projectId), Long.parseLong(contractId), 2,taskList.size(),null);
             //获取任务详情信息Map
             Set<String> processInstanceIds = taskList.stream().map(Task::getProcessInstanceId).collect(Collectors.toSet());
             Map<String, List<TaskParallel>> taskParallelGroupMap = new HashMap<>();
@@ -2012,6 +2011,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             List<String> dataIdList = taskList.stream().map(Task::getFormDataId).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
             //Map<String, String> queryMap = jdbcTemplate.query("select * from u_information_query where id in(" + StringUtils.join(dataIdList, ",") + ")", new BeanPropertyRowMapper<>(InformationQuery.class)).stream().collect(Collectors.toMap(l -> l.getId() + "", l -> l.getWbsId() + ""));
             List<InformationQuery> list = informationQueryService.list(Wrappers.<InformationQuery>lambdaQuery().in(InformationQuery::getId, dataIdList));
+            taskProgressService.addTaskProgress(Long.parseLong(projectId), Long.parseLong(contractId), 2,taskList.size(),StringUtils.join(dataIdList, ","));
             Map<String, String> queryMap=list.stream().collect(Collectors.toMap(l -> l.getId() + "", l -> l.getWbsId() + ""));
             Map<String, String> typeMap = jdbcTemplate.query("select * from u_information_query where id in(" + StringUtils.join(dataIdList, ",") + ")", new BeanPropertyRowMapper<>(InformationQuery.class)).stream().collect(Collectors.toMap(l -> l.getId() + "", l -> l.getClassify() + ""));
 
@@ -2221,7 +2221,6 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                                 .set(TaskParallel::getEVisaContent, "重新保存PDF失败")
                                 .eq(TaskParallel::getProcessInstanceId, task.getProcessInstanceId()));
                     }
-                    taskProgressService.updateTaskProgress(Long.parseLong(task.getProjectId()), Long.parseLong(task.getContractId()), 2, 1,null);
                 }
                 //获取当前操作人
                 Long userId = AuthUtil.getUserId(request);

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/sync/TaskSync.java

@@ -68,7 +68,7 @@ public class TaskSync {
         }
         lambda.set(InformationQuery::getUpdateTime, DateTime.now());
         lambda.eq(InformationQuery::getId, dto.getId());
-        taskProgressClient.updateTaskProgress(dto.getProjectId(), dto.getContractId(), 1, 1,null);
+        taskProgressClient.updateTaskProgress(dto.getProjectId(), dto.getContractId(), 1, 1,dto.getId()+"");
         informationQueryService.update(lambda);
         log.info("数据重刷完毕,线程名称:{}", Thread.currentThread().getName());
     }

+ 0 - 1
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVDataServiceImpl.java

@@ -384,7 +384,6 @@ public class EVDataServiceImpl implements EVDataService {
                     this.jdbcTemplate.execute("update u_information_query set status=1 where id=" + taskApp.getFormDataId());
                 }
             }
-            taskProgressClient.updateTaskProgress(Long.parseLong(taskApp.getProjectId()), Long.parseLong(taskApp.getContractId()), 4, 1, taskApp.getFormDataId());
             RedisTemplate.delete("sign-" + taskApp.getFormDataId());
             RedisTemplate.opsForList().rightPush("blade:statistics:information_query_statistics_key", taskApp.getFormDataId());
             Thread.sleep(1000);

+ 13 - 3
blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java

@@ -3078,14 +3078,14 @@ public class CustomFunction {
         //返回结果
         List<Object> result = new ArrayList<>();
 
-        if (designData != null) {
+        if (designData instanceof List) {
             obj1 = obj2List(designData);
 
         }
-        if (actualData != null) {
+        if (actualData instanceof List) {
             obj2 = obj2List(actualData);
         }
-        if (biasData != null) {
+        if (biasData instanceof List) {
             obj3 = obj2List(biasData);
         }
         //三种数据长度必须一致
@@ -3108,6 +3108,16 @@ public class CustomFunction {
                     result.add(finalObj.get(i));
                 });
             });
+        }else if (obj2.size() > 0 && obj1.size() == 0 && obj3.size() == 0){
+            int sampleSize = obj2.size();
+            //如果样本数量小于5,则获取全部数据
+            if(obj2.size() > 1){
+                // 计算需要抽取的元素数量
+                sampleSize = (int) Math.ceil(obj2.size() * 0.3);
+            }
+            Collections.shuffle(obj2);
+            List<Object> objects = obj2.subList(0, sampleSize);
+            objects.stream().limit(sampleSize).forEach(result::add);
         }
         return result;
     }

+ 100 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ProfilerController.java

@@ -0,0 +1,100 @@
+package org.springblade.manager.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.manager.dto.ProfilerOffsetDTO;
+import org.springblade.manager.dto.ProfilerOffsetResultDTO;
+import org.springblade.manager.entity.ProfilerOffset;
+import org.springblade.manager.entity.profiler.ProfilerResult;
+import org.springblade.manager.entity.profiler.ProfilerSaveDTO;
+import org.springblade.manager.service.ProfilerOffsetService;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * @author LHB
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/profiler")
+@Api(value = "质检-综合管理-断面仪", tags = "质检-综合管理-断面仪")
+public class ProfilerController {
+
+    private final ProfilerOffsetService offsetService;
+
+    /**
+     * 新增接口
+     * 第三方推送数据过来
+     */
+    @PostMapping("/save")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "新增断面仪数据", notes = "")
+    public ProfilerResult add(ProfilerSaveDTO save,
+                              @RequestParam(value = "file", required = false) MultipartFile file) {
+        if (StringUtil.isBlank(save.getAppKey())) {
+            return ProfilerResult.error("1001", "appKey不能为空", "");
+        }
+        if (save.getTimestamp() == null) {
+            return ProfilerResult.error("1002", "timestamp不能为空", "");
+        }
+        if (StringUtil.isBlank(save.getSign())) {
+            return ProfilerResult.error("1003", "sign不能为空", "");
+        }
+        if (StringUtil.isBlank(save.getDeviceCode())) {
+            return ProfilerResult.error("1004", "deviceCode不能为空", "");
+        }
+        if (StringUtil.isBlank(save.getData())) {
+            return ProfilerResult.error("1005", "data不能为空", "");
+        }
+        return offsetService.save(save, file);
+    }
+
+
+    /**
+     * 查询接口
+     */
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "查询接口", notes = "")
+    @PostMapping("/page")
+    public R<Page<ProfilerOffset>> page(ProfilerOffsetDTO offset) {
+        return R.data(offsetService.getPage(offset));
+    }
+
+    /**
+     * 查询详情接口
+     */
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "查询详情接口", notes = "")
+    @GetMapping("/getOne")
+    public R<ProfilerOffsetResultDTO> getOne(Long id) {
+        return R.data(offsetService.getOne(id));
+    }
+
+    /**
+     * 编辑接口
+     */
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "修改接口", notes = "")
+    @PostMapping("/edit")
+    public R<Boolean> edit(@RequestBody ProfilerOffsetResultDTO offset) {
+        return R.status(offsetService.edit(offset));
+    }
+
+    /**
+     * 查询测量人
+     */
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "查询测量人", notes = "")
+    @GetMapping("/getListUserName")
+    public R<List<String>> getListUserName(){
+        return R.data(offsetService.getListUserName());
+    }
+
+}

+ 20 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProfilerDataMapper.java

@@ -0,0 +1,20 @@
+package org.springblade.manager.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.springblade.manager.entity.ProfilerData;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author LHB
+* @description 针对表【q_profiler_data(断面仪-测量点数组)】的数据库操作Mapper
+* @createDate 2025-10-27 15:58:56
+* @Entity org.springblade.manager.entity.QProfilerData
+*/
+@Mapper
+public interface ProfilerDataMapper extends BaseMapper<ProfilerData> {
+
+}
+
+
+
+

+ 25 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProfilerDataMapper.xml

@@ -0,0 +1,25 @@
+<?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.manager.mapper.ProfilerDataMapper">
+
+    <resultMap id="BaseResultMap" type="org.springblade.manager.entity.ProfilerData">
+            <id property="id" column="id" />
+            <result property="offsetId" column="offset_id" />
+            <result property="angle" column="angle" />
+            <result property="backBreak" column="back_break" />
+            <result property="dist" column="dist" />
+            <result property="x" column="x" />
+            <result property="z" column="z" />
+            <result property="createTime" column="create_time" />
+            <result property="createUser" column="create_user" />
+            <result property="updateTime" column="update_time" />
+            <result property="updateUser" column="update_user" />
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,offset_id,angle,back_break,dist,x,
+        z,create_time,create_user,update_time,update_user
+    </sql>
+</mapper>

+ 23 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProfilerOffsetMapper.java

@@ -0,0 +1,23 @@
+package org.springblade.manager.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.springblade.manager.entity.ProfilerOffset;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
+
+/**
+* @author LHB
+* @description 针对表【q_profiler_offset(断面仪-基础信息+测量者信息)】的数据库操作Mapper
+* @createDate 2025-10-27 15:58:56
+* @Entity org.springblade.manager.entity.QProfilerOffset
+*/
+@Mapper
+public interface ProfilerOffsetMapper extends BaseMapper<ProfilerOffset> {
+
+    List<String> getListUserName();
+}
+
+
+
+

+ 36 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProfilerOffsetMapper.xml

@@ -0,0 +1,36 @@
+<?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.manager.mapper.ProfilerOffsetMapper">
+
+    <resultMap id="BaseResultMap" type="org.springblade.manager.entity.ProfilerOffset">
+            <id property="id" column="id" />
+            <result property="deviceCode" column="device_code" />
+            <result property="deviceHeight" column="device_height" />
+            <result property="ellipseRadius" column="ellipse_radius" />
+            <result property="slope" column="slope" />
+            <result property="x" column="x" />
+            <result property="z" column="z" />
+            <result property="infoChannelName" column="info_channel_name" />
+            <result property="infoConstructionUnit" column="info_construction_unit" />
+            <result property="infoDate" column="info_date" />
+            <result property="infoNameOfProject" column="info_name_of_project" />
+            <result property="infoUserName" column="info_user_name" />
+            <result property="infoMileageNumber" column="info_mileage_number" />
+            <result property="fileUrl" column="file_url" />
+            <result property="createTime" column="create_time" />
+            <result property="createUser" column="create_user" />
+            <result property="updateTime" column="update_time" />
+            <result property="updateUser" column="update_user" />
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,device_code,device_height,ellipse_radius,slope,x,z,
+        info_channel_name,info_construction_unit,info_date,info_name_of_project,info_user_name,
+        info_mileage_number,file_url,create_time,create_user,update_time,update_user
+    </sql>
+    <select id="getListUserName" resultType="java.lang.String">
+        select info_user_name from q_profiler_offset group by info_user_name
+    </select>
+</mapper>

+ 20 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProfilerStandardSectionBeanMapper.java

@@ -0,0 +1,20 @@
+package org.springblade.manager.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.springblade.manager.entity.ProfilerStandardSectionBean;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author LHB
+* @description 针对表【q_profiler_standard_section_bean(断面仪-标准断面)】的数据库操作Mapper
+* @createDate 2025-10-27 15:58:56
+* @Entity org.springblade.manager.entity.QProfilerStandardSectionBean
+*/
+@Mapper
+public interface ProfilerStandardSectionBeanMapper extends BaseMapper<ProfilerStandardSectionBean> {
+
+}
+
+
+
+

+ 28 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProfilerStandardSectionBeanMapper.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.manager.mapper.ProfilerStandardSectionBeanMapper">
+
+    <resultMap id="BaseResultMap" type="org.springblade.manager.entity.ProfilerStandardSectionBean">
+            <id property="id" column="id" />
+            <result property="offsetId" column="offset_id" />
+            <result property="direction" column="direction" />
+            <result property="endAngle" column="end_angle" />
+            <result property="radius" column="radius" />
+            <result property="select" column="select" />
+            <result property="startAngle" column="start_angle" />
+            <result property="x" column="x" />
+            <result property="y" column="y" />
+            <result property="createTime" column="create_time" />
+            <result property="createUser" column="create_user" />
+            <result property="updateTime" column="update_time" />
+            <result property="updateUser" column="update_user" />
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,offset_id,direction,end_angle,radius,select,
+        start_angle,x,y,create_time,create_user,
+        update_time,update_user
+    </sql>
+</mapper>

+ 13 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/ProfilerDataService.java

@@ -0,0 +1,13 @@
+package org.springblade.manager.service;
+
+import org.springblade.manager.entity.ProfilerData;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author LHB
+* @description 针对表【q_profiler_data(断面仪-测量点数组)】的数据库操作Service
+* @createDate 2025-10-27 15:58:56
+*/
+public interface ProfilerDataService extends IService<ProfilerData> {
+
+}

+ 30 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/ProfilerOffsetService.java

@@ -0,0 +1,30 @@
+package org.springblade.manager.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springblade.manager.dto.ProfilerOffsetDTO;
+import org.springblade.manager.dto.ProfilerOffsetResultDTO;
+import org.springblade.manager.entity.ProfilerOffset;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.manager.entity.profiler.ProfilerResult;
+import org.springblade.manager.entity.profiler.ProfilerSaveDTO;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+* @author LHB
+* @description 针对表【q_profiler_offset(断面仪-基础信息+测量者信息)】的数据库操作Service
+* @createDate 2025-10-27 15:58:56
+*/
+public interface ProfilerOffsetService extends IService<ProfilerOffset> {
+
+    ProfilerResult save(ProfilerSaveDTO save, MultipartFile file);
+
+    ProfilerOffsetResultDTO getOne(Long id);
+
+    boolean edit(ProfilerOffsetResultDTO offset);
+
+    Page<ProfilerOffset> getPage(ProfilerOffsetDTO offset);
+
+    List<String> getListUserName();
+}

+ 13 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/ProfilerStandardSectionBeanService.java

@@ -0,0 +1,13 @@
+package org.springblade.manager.service;
+
+import org.springblade.manager.entity.ProfilerStandardSectionBean;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author LHB
+* @description 针对表【q_profiler_standard_section_bean(断面仪-标准断面)】的数据库操作Service
+* @createDate 2025-10-27 15:58:56
+*/
+public interface ProfilerStandardSectionBeanService extends IService<ProfilerStandardSectionBean> {
+
+}

+ 22 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ProfilerDataServiceImpl.java

@@ -0,0 +1,22 @@
+package org.springblade.manager.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.manager.entity.ProfilerData;
+import org.springblade.manager.service.ProfilerDataService;
+import org.springblade.manager.mapper.ProfilerDataMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author LHB
+* @description 针对表【q_profiler_data(断面仪-测量点数组)】的数据库操作Service实现
+* @createDate 2025-10-27 15:58:56
+*/
+@Service
+public class ProfilerDataServiceImpl extends ServiceImpl<ProfilerDataMapper, ProfilerData>
+    implements ProfilerDataService {
+
+}
+
+
+
+

+ 206 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ProfilerOffsetServiceImpl.java

@@ -0,0 +1,206 @@
+package org.springblade.manager.service.impl;
+
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.alibaba.nacos.common.utils.MD5Utils;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.oss.model.BladeFile;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.CollectionUtil;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.manager.dto.ProfilerOffsetDTO;
+import org.springblade.manager.dto.ProfilerOffsetResultDTO;
+import org.springblade.manager.entity.ProfilerData;
+import org.springblade.manager.entity.ProfilerOffset;
+import org.springblade.manager.entity.ProfilerStandardSectionBean;
+import org.springblade.manager.entity.profiler.ProfilerResult;
+import org.springblade.manager.entity.profiler.ProfilerSaveDTO;
+import org.springblade.manager.service.ProfilerDataService;
+import org.springblade.manager.service.ProfilerOffsetService;
+import org.springblade.manager.mapper.ProfilerOffsetMapper;
+import org.springblade.manager.service.ProfilerStandardSectionBeanService;
+import org.springblade.resource.feign.NewIOSSClient;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.time.Instant;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author LHB
+ * @description 针对表【q_profiler_offset(断面仪-基础信息+测量者信息)】的数据库操作Service实现
+ * @createDate 2025-10-27 15:58:56
+ */
+@Service
+public class ProfilerOffsetServiceImpl extends ServiceImpl<ProfilerOffsetMapper, ProfilerOffset>
+        implements ProfilerOffsetService {
+
+    //第三方的appKey 固定值
+    private final static String APP_KEY = "QDM123";
+    //第三方密钥
+    private final static String APP_SECRET = "MDc1YWI4OTMtY2M0NC00NDViLTlkZmUtYzAzZTVmZTUxMmE1";
+    // 时间戳有效期(秒),防止重放攻击 // 30分钟
+    private static final long TIMESTAMP_EXPIRE = 1800;
+    @Resource
+    private NewIOSSClient newIOSSClient;
+    @Resource
+    private ProfilerDataService dataService;
+    @Resource
+    private ProfilerStandardSectionBeanService beanService;
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public ProfilerResult save(ProfilerSaveDTO save, MultipartFile file) {
+        if (!save.getAppKey().equals(APP_KEY)) {
+            return ProfilerResult.error("10006", "appKey错误", "");
+        }
+        String s = MD5Utils.md5Hex(APP_KEY +  APP_SECRET + save.getTimestamp(),  "UTF-8");
+        if (!s.equals(save.getSign())) {
+            return ProfilerResult.error("10007", "sign错误", "");
+        }
+        if(!isValidTimestamp(save.getTimestamp())){
+            return ProfilerResult.error("10008","签名验证失败:timeTicks的时间和当前时间必须小于30分钟","");
+        }
+
+        //主键id
+        Long id = SnowFlakeUtil.getId();
+        //断面仪测量设备编码或名称
+        String deviceCode = save.getDeviceCode();
+        //字符串转json
+        JSONObject jsonObject = null;
+        try {
+            jsonObject = JSONUtil.parseObj(save.getData());
+        } catch (Exception e) {
+            return ProfilerResult.error("10009","data参数格式错误","");
+        }
+        //获取基础信息 + 测量者信息
+        ProfilerOffset offset = jsonObject.getBean("offset", ProfilerOffset.class);
+        if(offset == null){
+            offset = new ProfilerOffset();
+        }
+        offset.setId(id);
+        offset.setDeviceCode(deviceCode);
+        ProfilerOffset info = jsonObject.getBean("info", ProfilerOffset.class);
+        //把测量者信息赋值给基础信息对象
+        if(info != null){
+            offset.setChannelName(info.getChannelName());
+            offset.setConstructionUnit(info.getConstructionUnit());
+            offset.setDate(info.getDate());
+            offset.setNameOfProject(info.getNameOfProject());
+            offset.setUserName(info.getUserName());
+            offset.setMileageNumber(info.getMileageNumber());
+        }
+        //获取标准断面数据
+        JSONObject mStandardSectionDataBeanList = jsonObject.getJSONObject("standardSectionBean");
+        List<ProfilerStandardSectionBean> standardSectionBean = null;
+        if(mStandardSectionDataBeanList != null){
+            standardSectionBean = mStandardSectionDataBeanList.getBeanList("mStandardSectionDataBeanList", ProfilerStandardSectionBean.class);
+            if(standardSectionBean != null){
+                standardSectionBean.forEach(f ->{
+                    f.setId(SnowFlakeUtil.getId());
+                    f.setOffsetId(id);
+                });
+            }
+        }
+        //获取测量数据
+        List<ProfilerData> data = jsonObject.getBeanList("data", ProfilerData.class);
+        if(data != null){
+            data.forEach(f -> {
+                f.setId(SnowFlakeUtil.getId());
+                f.setOffsetId(id);
+            });
+        }
+        //上传文件
+        if (file != null && !file.isEmpty() && file.getSize() > 0) {
+            //获取文件名称后缀
+            BladeFile bladeFile = this.newIOSSClient.uploadFileByInputStream(file);
+            offset.setFileUrl(bladeFile.getLink());
+        }
+        //保存数据
+        baseMapper.insert(offset);
+        if(CollectionUtil.isNotEmpty(standardSectionBean)){
+            beanService.saveBatch(standardSectionBean);
+        }
+        if(CollectionUtil.isNotEmpty(data)){
+            dataService.saveBatch(data);
+        }
+        return ProfilerResult.success();
+    }
+
+    /**
+     * 验证时间戳有效性
+     *
+     * @param timestamp 时间戳字符串
+     * @return 是否有效
+     */
+    private static boolean isValidTimestamp(Long timestamp) {
+        try {
+            long currentTs = Instant.now().getEpochSecond();
+            // 检查时间戳是否在有效期内(前后5分钟)
+            return Math.abs(currentTs - timestamp) <= TIMESTAMP_EXPIRE;
+        } catch (NumberFormatException e) {
+            return false;
+        }
+    }
+
+    @Override
+    public ProfilerOffsetResultDTO getOne(Long id) {
+        ProfilerOffset byId = this.getById(id);
+        if(byId != null){
+            ProfilerOffsetResultDTO resultDTO = BeanUtil.copyProperties(byId, ProfilerOffsetResultDTO.class);
+            if(resultDTO != null){
+                List<ProfilerStandardSectionBean> list = beanService.list(Wrappers.<ProfilerStandardSectionBean>lambdaQuery().eq(ProfilerStandardSectionBean::getOffsetId, id));
+                List<ProfilerData> list1 = dataService.list(Wrappers.<ProfilerData>lambdaQuery().eq(ProfilerData::getOffsetId, id));
+                resultDTO.setSectionBeans(list);
+                resultDTO.setData(list1);
+            }
+            return resultDTO;
+        }
+        return null;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean edit(ProfilerOffsetResultDTO offset) {
+        ProfilerOffset qProfilerOffset = BeanUtil.copyProperties(offset, ProfilerOffset.class);
+        boolean update = this.updateById(qProfilerOffset);
+
+        List<ProfilerStandardSectionBean> sectionBeans = offset.getSectionBeans();
+        if(CollectionUtil.isNotEmpty(sectionBeans)){
+            beanService.updateBatchById(sectionBeans);
+        }
+        List<ProfilerData> data = offset.getData();
+        if(CollectionUtil.isNotEmpty(data)){
+            dataService.updateBatchById(data);
+        }
+        return update;
+    }
+
+    @Override
+    public Page<ProfilerOffset> getPage(ProfilerOffsetDTO offset) {
+        QueryWrapper<ProfilerOffset> qProfilerOffsetQueryWrapper = new QueryWrapper<>();
+        qProfilerOffsetQueryWrapper.lambda()
+                .eq(StringUtil.isNotBlank(offset.getUserName()), ProfilerOffset::getUserName, offset.getUserName())
+                .eq(StringUtil.isNotBlank(offset.getBackBreak()), ProfilerOffset::getBackBreak, offset.getBackBreak())
+                .ge(StringUtil.isNotBlank(offset.getStartTime()), ProfilerOffset::getDate, offset.getStartTime())
+                .le(StringUtil.isNotBlank(offset.getEndTime()), ProfilerOffset::getDate, offset.getEndTime());
+        return baseMapper.selectPage(new Page<>(offset.getCurrent(), offset.getSize()),qProfilerOffsetQueryWrapper);
+    }
+
+    @Override
+    public List<String> getListUserName() {
+        return baseMapper.getListUserName();
+    }
+}
+
+
+
+

+ 22 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ProfilerStandardSectionBeanServiceImpl.java

@@ -0,0 +1,22 @@
+package org.springblade.manager.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.manager.entity.ProfilerStandardSectionBean;
+import org.springblade.manager.service.ProfilerStandardSectionBeanService;
+import org.springblade.manager.mapper.ProfilerStandardSectionBeanMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author LHB
+* @description 针对表【q_profiler_standard_section_bean(断面仪-标准断面)】的数据库操作Service实现
+* @createDate 2025-10-27 15:58:56
+*/
+@Service
+public class ProfilerStandardSectionBeanServiceImpl extends ServiceImpl<ProfilerStandardSectionBeanMapper, ProfilerStandardSectionBean>
+    implements ProfilerStandardSectionBeanService {
+
+}
+
+
+
+

+ 37 - 32
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/SignPfxFilePreServiceImpl.java

@@ -128,40 +128,45 @@ public class SignPfxFilePreServiceImpl implements ISignPfxFilePreService {
             String htmlString = IoUtil.readToString(inputStreamByUrl);
             Document doc = Jsoup.parse(htmlString);
             Element table = doc.select("table").first();
-            Elements dqids = table.getElementsByAttribute("dqid");
-            for (Element element : dqids) {
-                String dqid = element.attr("dqid");
-                Elements x11 = element.getElementsByAttribute("x1");
-                if (x11 != null && x11.size() >= 1) {
-                    Element element1 = x11.get(x11.size() - 1);
-                    int x1 = Func.toInt(element1.attr("x1"));
-                    int y1 = Func.toInt(element1.attr("y1"));
-                    Row row = sheet.getRow(y1 - 1);
-                    if (row != null) {
-                        Cell cell = row.getCell(x1 - 1);
-                        if (cell != null || ObjectUtils.isNotEmpty(cell)) {
-                            short fontIndex = cell.getCellStyle().getFontIndex();
-                            Font oldfontAt = workbook.getFontAt(fontIndex);
-                            Font redFont = workbook.createFont();
-                            redFont.setColor(IndexedColors.WHITE.getIndex()); //设置字体颜色
-                            redFont.setFontHeightInPoints(Short.valueOf("1"));//设置字体大小
-                            redFont.setFontName(oldfontAt.getFontName());//设置字体
-                            String CellValue = cell.getStringCellValue().trim();
+            Elements dqids = null;
+            if (table != null) {
+                dqids = table.getElementsByAttribute("dqid");
+            }
+            if (dqids != null) {
+                for (Element element : dqids) {
+                    String dqid = element.attr("dqid");
+                    Elements x11 = element.getElementsByAttribute("x1");
+                    if (x11 != null && x11.size() >= 1) {
+                        Element element1 = x11.get(x11.size() - 1);
+                        int x1 = Func.toInt(element1.attr("x1"));
+                        int y1 = Func.toInt(element1.attr("y1"));
+                        Row row = sheet.getRow(y1 - 1);
+                        if (row != null) {
+                            Cell cell = row.getCell(x1 - 1);
+                            if (cell != null || ObjectUtils.isNotEmpty(cell)) {
+                                short fontIndex = cell.getCellStyle().getFontIndex();
+                                Font oldfontAt = workbook.getFontAt(fontIndex);
+                                Font redFont = workbook.createFont();
+                                redFont.setColor(IndexedColors.WHITE.getIndex()); //设置字体颜色
+                                redFont.setFontHeightInPoints(Short.valueOf("1"));//设置字体大小
+                                redFont.setFontName(oldfontAt.getFontName());//设置字体
+                                String CellValue = cell.getStringCellValue().trim();
 
-                            CellStyle newStyle = workbook.createCellStyle(); //创建单元格样式
-                            newStyle.cloneStyleFrom(cell.getCellStyle());
-                            newStyle.setFont(redFont);
-                            newStyle.setShrinkToFit(true);
-                            cell.setCellStyle(newStyle);
-                            if(dqid.contains("||")){
-                                String[] split = dqid.split("\\|\\|");
-                                for (String singleDqid : split) {
-                                    cell.setCellValue(singleDqid);
-                                    sign.add(singleDqid);
+                                CellStyle newStyle = workbook.createCellStyle(); //创建单元格样式
+                                newStyle.cloneStyleFrom(cell.getCellStyle());
+                                newStyle.setFont(redFont);
+                                newStyle.setShrinkToFit(true);
+                                cell.setCellStyle(newStyle);
+                                if(dqid.contains("||")){
+                                    String[] split = dqid.split("\\|\\|");
+                                    for (String singleDqid : split) {
+                                        cell.setCellValue(singleDqid);
+                                        sign.add(singleDqid);
+                                    }
+                                }else {
+                                    cell.setCellValue(dqid);
+                                    sign.add(dqid);
                                 }
-                            }else {
-                                cell.setCellValue(dqid);
-                                sign.add(dqid);
                             }
                         }
                     }

+ 3 - 3
blade-service/blade-system/src/main/java/org/springblade/system/mapper/DictBizMapper.xml

@@ -40,9 +40,9 @@
         <if test="notRoot != null and notRoot != ''">
             and parent_id > 0
         </if>
-        <if test="tenantId != null and tenantId != ''">
-            and tenant_id = #{tenantId}
-        </if>
+<!--        <if test="tenantId != null and tenantId != ''">-->
+<!--            and tenant_id = #{tenantId}-->
+<!--        </if>-->
         and is_sealed = 0 and is_deleted = 0
         order by sort
     </select>