Răsfoiți Sursa

Merge remote-tracking branch 'origin/master' into master

# Conflicts:
#	blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
yangyj 1 an în urmă
părinte
comite
610aa176b7
14 a modificat fișierele cu 510 adăugiri și 1 ștergeri
  1. 24 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/config/BigDecimalSerializer.java
  2. 13 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/IdsDTO.java
  3. 41 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/TaskRepealMessageDTO.java
  4. 26 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/FormPeriodDetail.java
  5. 54 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/TaskRepealMessage.java
  6. 28 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/TaskRepealMessageVO.java
  7. 62 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/MessageBizController.java
  8. 44 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java
  9. 42 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/TaskRepealMessageMapper.java
  10. 38 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/TaskRepealMessageMapper.xml
  11. 44 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/ITaskRepealMessageService.java
  12. 1 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ContractMaterialServiceImpl.java
  13. 3 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/InventoryFormMeterServiceImpl.java
  14. 90 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/TaskRepealMessageServiceImpl.java

+ 24 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/config/BigDecimalSerializer.java

@@ -0,0 +1,24 @@
+package org.springblade.meter.config;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+ 
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+ 
+ 
+public class BigDecimalSerializer extends JsonSerializer<BigDecimal> {
+ 
+    @Override
+    public void serialize(BigDecimal value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
+        if (value != null) {
+            // 保留2位小数,四舍五入
+            BigDecimal number = value.setScale(2, RoundingMode.HALF_UP);
+            jsonGenerator.writeNumber(number);
+        } else {
+            jsonGenerator.writeNumber(value);
+        }
+    }
+}

+ 13 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/IdsDTO.java

@@ -0,0 +1,13 @@
+package org.springblade.meter.dto;
+
+import lombok.Data;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2024/6/18 11:55
+ **/
+@Data
+public class IdsDTO {
+    String ids;
+}

+ 41 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/TaskRepealMessageDTO.java

@@ -0,0 +1,41 @@
+package org.springblade.meter.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+
+/**
+ * @Param   消息提示分页参数封装
+ * @Author wangwl
+ * @Date 2024/6/26 17:23
+ **/
+@Data
+public class TaskRepealMessageDTO {
+    @ApiModelProperty("当前页")
+    private Integer current;
+
+    @ApiModelProperty("每页的数量")
+    private Integer size;
+
+    @ApiModelProperty("合同id")
+    private Long contractId;
+
+    @ApiModelProperty("任务类型")
+    private Integer taskType;
+
+    @ApiModelProperty("消息类型 1未读2已读")
+    private Integer messageType;
+
+    @ApiModelProperty("开始日期")
+    private LocalDate startDate;
+
+    @ApiModelProperty("结束日期")
+    private LocalDate endDate;
+
+    @ApiModelProperty("搜索值")
+    private String searchValue;
+
+    @ApiModelProperty("用户id")
+    private Long userId;
+}

+ 26 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/FormPeriodDetail.java

@@ -17,10 +17,12 @@
 package org.springblade.meter.entity;
 
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.core.mp.base.BaseEntity;
+import org.springblade.meter.config.BigDecimalSerializer;
 
 import java.math.BigDecimal;
 
@@ -54,17 +56,41 @@ public class FormPeriodDetail extends BaseEntity {
     @ApiModelProperty(value = "合同工程清单id")
     private Long contractFormId;
 
+
+    @JsonSerialize(using = BigDecimalSerializer.class)
     private BigDecimal one;
+
+    @JsonSerialize(using = BigDecimalSerializer.class)
     private BigDecimal two;
+
+    @JsonSerialize(using = BigDecimalSerializer.class)
     private BigDecimal three;
+
+    @JsonSerialize(using = BigDecimalSerializer.class)
     private BigDecimal four;
+
+    @JsonSerialize(using = BigDecimalSerializer.class)
     private BigDecimal five;
+
+    @JsonSerialize(using = BigDecimalSerializer.class)
     private BigDecimal six;
+
+    @JsonSerialize(using = BigDecimalSerializer.class)
     private BigDecimal seven;
+
+    @JsonSerialize(using = BigDecimalSerializer.class)
     private BigDecimal eight;
+
+    @JsonSerialize(using = BigDecimalSerializer.class)
     private BigDecimal nine;
+
+    @JsonSerialize(using = BigDecimalSerializer.class)
     private BigDecimal ten;
+
+    @JsonSerialize(using = BigDecimalSerializer.class)
     private BigDecimal eleven;
+
+    @JsonSerialize(using = BigDecimalSerializer.class)
     private BigDecimal twelve;
 
 

+ 54 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/TaskRepealMessage.java

@@ -0,0 +1,54 @@
+package org.springblade.meter.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.time.LocalDate;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2024/6/25 16:46
+ **/
+@Data
+@TableName("s_task_repeal_message")
+@EqualsAndHashCode(callSuper = true)
+public class TaskRepealMessage extends BaseEntity {
+
+    @ApiModelProperty("项目id")
+    private Long projectId;
+
+    @ApiModelProperty("合同id")
+    private Long contractId;
+
+    @ApiModelProperty("用户id")
+    private Long userId;
+
+    @ApiModelProperty("任务id")
+    private Long taskId;
+
+    @ApiModelProperty("任务类型")
+    private Integer meterTaskType;
+
+    @ApiModelProperty("任务名称")
+    private String taskName;
+
+    @ApiModelProperty("任务开始日期")
+    private LocalDate startDate;
+
+    @ApiModelProperty("废除日期")
+    private LocalDate repealDate;
+
+    @ApiModelProperty("流程id")
+    private Long taskFlowId;
+
+    @ApiModelProperty("驳回人")
+    private Long rejectPersonId;
+
+    @ApiModelProperty("驳回理由")
+    private String rejectReason;
+
+}

+ 28 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/TaskRepealMessageVO.java

@@ -0,0 +1,28 @@
+package org.springblade.meter.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.meter.entity.TaskRepealMessage;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2024/6/26 17:16
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class TaskRepealMessageVO extends TaskRepealMessage {
+
+    @ApiModelProperty("任务类型名称")
+    private String meterTaskTypeName;
+
+    @ApiModelProperty("任务流程名称")
+    private String taskFlowName;
+
+    @ApiModelProperty("驳回人名称")
+    private String rejectPersonName;
+
+    @ApiModelProperty("消息状态名称")
+    private String messageStatusName;
+}

+ 62 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/MessageBizController.java

@@ -0,0 +1,62 @@
+package org.springblade.meter.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+import org.springblade.meter.dto.IdsDTO;
+import org.springblade.meter.dto.TaskRepealMessageDTO;
+import org.springblade.meter.service.ITaskRepealMessageService;
+import org.springblade.meter.vo.MeterPeriodVO;
+import org.springblade.meter.vo.TaskRepealMessageVO;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @Param   所有计量消息提醒统一处理
+ * @Author wangwl
+ * @Date 2024/6/25 16:58
+ **/
+@RestController
+@AllArgsConstructor
+@RequestMapping("/messageBiz")
+@Api(value = "消息提醒", tags = "消息提醒接口")
+public class MessageBizController extends BladeController {
+
+    private final ITaskRepealMessageService taskRepealMessageService;
+
+    @GetMapping("/get-unread-message")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "前端轮询获取未读消息数量", notes = "返回数字,0为没有未读消息")
+    public R<Integer> getUnreadMessage(Long contractId) {
+        Integer total = taskRepealMessageService.getUnreadMessage(contractId);
+        return R.data(total);
+    }
+
+    @PostMapping("/repealPage")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "废除通知分页", notes = "传入分页信息和查询条件,返回所有通知")
+    public R<IPage<TaskRepealMessageVO>> repealPage(@RequestBody TaskRepealMessageDTO dto) {
+        IPage<TaskRepealMessageVO> pages  = taskRepealMessageService.repealPage(dto);
+        return R.data(pages);
+    }
+
+    @PostMapping("/batchRead")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "单个查看/批量查看", notes = "传入ids,逗号拼接")
+    public R batchRead(@RequestBody IdsDTO dto) {
+        taskRepealMessageService.batchRead(dto);
+        return R.success("操作成功");
+    }
+
+    @PostMapping("/batchDelete")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "单个删除/批量删除", notes = "传入ids,逗号拼接")
+    public R batchDelete(@RequestBody IdsDTO dto) {
+        taskRepealMessageService.batchDelete(dto);
+        return R.success("操作成功");
+    }
+
+}

+ 44 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java

@@ -22,6 +22,7 @@ import com.itextpdf.text.pdf.PdfCopy;
 import com.itextpdf.text.pdf.PdfReader;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import javassist.bytecode.stackmap.BasicBlock;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import net.logstash.logback.encoder.org.apache.commons.lang3.ObjectUtils;
@@ -66,6 +67,7 @@ import org.springblade.meter.mapper.*;
 import org.springblade.meter.service.IContractMeterPeriodService;
 import org.springblade.meter.service.IInterimPayCertificateService;
 import org.springblade.meter.service.IMaterialStartStatementService;
+import org.springblade.meter.service.ITaskRepealMessageService;
 import org.springblade.meter.service.impl.*;
 import org.springblade.meter.utils.CollectionUtils;
 import org.springblade.meter.utils.FileUtils;
@@ -131,6 +133,7 @@ public class TaskController extends BladeController {
     private final MaterialMeterFormTaskMapper materialMeterFormTaskMapper;
     private final StartPayMeterFormTaskMapper startPayMeterFormTaskMapper;
     private final MeterPeriodMapper meterPeriodMapper;
+    private final ITaskRepealMessageService repealMessageService;
 
     private final WbsTreePrivateClient wbsTreePrivateClient;
     private final ExcelTabClient excelTabClient;
@@ -241,6 +244,11 @@ public class TaskController extends BladeController {
                 if (countMiddleMeterApplies > 0) {
                     throw new ServiceException("当前期数的数据中存在已上报的任务,操作失败");
                 }
+                /*校验计量单金额是否为0*/
+                BigDecimal reduce = middleMeterApplies.stream().map(l -> l.getMeterMoney()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                if (reduce.compareTo(BigDecimal.ZERO) == 0){
+                    throw new ServiceException("上报金额不能为0");
+                }
 
                 /*获取所有中间计量申请下的清单信息*/
                 List<Long> middleMeterAppliesIds = middleMeterApplies.stream().map(MiddleMeterApply::getId).collect(Collectors.toList());
@@ -334,6 +342,12 @@ public class TaskController extends BladeController {
                     throw new ServiceException("当前期数的数据中存在已上报的任务,操作失败");
                 }
 
+                /*校验计量单金额是否为0*/
+                BigDecimal reduce = materialMeterForms.stream().map(l -> l.getMeterMoney()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                if (reduce.compareTo(BigDecimal.ZERO) == 0){
+                    throw new ServiceException("上报金额不能为0");
+                }
+
                 List<Long> materialMeterFormsIds = materialMeterForms.stream().map(MaterialMeterForm::getId).collect(Collectors.toList());
 
                 /*复制材料计量单数据任务VO*/
@@ -399,6 +413,12 @@ public class TaskController extends BladeController {
                     throw new ServiceException("当前期数的数据中存在已上报的任务,操作失败");
                 }
 
+                /*校验计量单金额是否为0*/
+                BigDecimal reduce = startPayMeterForms.stream().map(l -> l.getMeterMoney()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                if (reduce.compareTo(BigDecimal.ZERO) == 0){
+                    throw new ServiceException("上报金额不能为0");
+                }
+
                 List<Long> startPayMeterFormsIds = startPayMeterForms.stream().map(StartPayMeterForm::getId).collect(Collectors.toList());
 
                 /*复制开工预付款计量单数据任务VO*/
@@ -796,6 +816,9 @@ public class TaskController extends BladeController {
             }
             Task task = jdbcTemplate.query("SELECT * FROM u_task WHERE id = " + taskRepealDTO.getTaskId(), new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
             if (task != null) {
+                //先插入任务废除通知,发生异常时会回滚
+                task.setMeterTaskRepealDesc(taskRepealDTO.getMeterTaskRepealDesc());
+                this.buildRepealMessage(task);
                 /*校验当前用户是否为当前轮次审批人*/
                 String processInstanceId = task.getProcessInstanceId();
                 List<TaskParallel> taskParallels = jdbcTemplate.query("SELECT * FROM u_task_parallel WHERE process_instance_id = '" + processInstanceId + "' ORDER BY sort", new BeanPropertyRowMapper<>(TaskParallel.class));
@@ -1003,6 +1026,27 @@ public class TaskController extends BladeController {
         return R.fail("操作失败");
     }
 
+    //创建废除提示信息,目前只通知上报人
+    private void buildRepealMessage(Task task){
+        try {
+            TaskRepealMessage repealMessage = new TaskRepealMessage();
+            repealMessage.setProjectId(Long.valueOf(task.getProjectId()));
+            repealMessage.setContractId(Long.valueOf(task.getContractId()));
+            repealMessage.setUserId(Long.valueOf(task.getReportUser()));
+            repealMessage.setTaskId(task.getId());
+            repealMessage.setTaskName(task.getTaskName());
+            repealMessage.setMeterTaskType(task.getMeterTaskType());
+            repealMessage.setTaskFlowId(task.getFixedFlowId());
+            repealMessage.setStartDate(LocalDate.parse(task.getStartTime()));
+            repealMessage.setRepealDate(LocalDate.now());
+            repealMessage.setRejectPersonId(AuthUtil.getUserId());
+            repealMessage.setRejectReason(task.getMeterTaskRepealDesc());
+            repealMessageService.save(repealMessage);
+        }catch (Exception e){
+            throw new ServiceException("创建废除提示信息时解析错误:"+e.getMessage());
+        }
+    }
+
     /**
      * 分页查询
      */

+ 42 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/TaskRepealMessageMapper.java

@@ -0,0 +1,42 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.meter.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.meter.dto.TaskRepealMessageDTO;
+import org.springblade.meter.entity.AttachmentForm;
+import org.springblade.meter.entity.TaskRepealMessage;
+import org.springblade.meter.vo.TaskRepealMessageVO;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 附件表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2023-11-29
+ */
+public interface TaskRepealMessageMapper extends BaseMapper<TaskRepealMessage> {
+
+
+    IPage<TaskRepealMessageVO> repealPage(IPage<TaskRepealMessageVO> page,@Param("dto") TaskRepealMessageDTO dto);
+
+    void batchReadByIds(@Param("ids") List<Long> ids);
+}

+ 38 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/TaskRepealMessageMapper.xml

@@ -0,0 +1,38 @@
+<?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.meter.mapper.TaskRepealMessageMapper">
+    <update id="batchReadByIds">
+        <foreach item="id" collection="ids" index="index" separator=";">
+            UPDATE s_task_repeal_message
+            <set>
+                status = 2
+            </set>
+            where id = #{id}
+        </foreach>
+    </update>
+
+
+    <select id="repealPage" resultType="org.springblade.meter.vo.TaskRepealMessageVO">
+        select *,
+               if(strm.task_flow_id = 0,'自定义流程',
+                    (select fixed_flow_name from u_fixed_flow uff where uff.id = strm.task_flow_id)) as taskFlowName,
+               (select dict_value from blade_dict where code = 'meter_task_type' and is_deleted = 0 and dict_key = strm.meter_task_type) as meterTaskTypeName,
+               (select name from blade_user bd where bd.id = strm.reject_person_id) as rejectPersonName,
+               (CASE when strm.status = 1 then '未读' when strm.status = 2 then '已读' end ) as messageStatusName
+        from s_task_repeal_message strm
+        where is_deleted = 0 and user_id = #{dto.userId} and contract_id = #{dto.contractId}
+        <if test="dto.taskType != null and dto.taskType != ''">
+            and task_type = #{dto.taskType}
+        </if>
+        <if test="dto.messageType != null and dto.messageType != ''">
+            and status = #{dto.messageType}
+        </if>
+        <if test="dto.searchValue != null and dto.searchValue != ''">
+            and task_name like concat('%',#{dto.searchValue},'%')
+        </if>
+        <if test="dto.startDate != null and dto.startDate != ''">
+            and start_date between #{dto.startDate} and #{dto.endDate}
+        </if>
+
+    </select>
+</mapper>

+ 44 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/service/ITaskRepealMessageService.java

@@ -0,0 +1,44 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.meter.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.core.mp.base.BaseService;
+import org.springblade.meter.dto.IdsDTO;
+import org.springblade.meter.dto.TaskRepealMessageDTO;
+import org.springblade.meter.entity.AttachmentForm;
+import org.springblade.meter.entity.TaskRepealMessage;
+import org.springblade.meter.vo.TaskRepealMessageVO;
+
+import java.util.Set;
+
+/**
+ * 附件表 服务类
+ *
+ * @author BladeX
+ * @since 2023-11-29
+ */
+public interface ITaskRepealMessageService extends BaseService<TaskRepealMessage> {
+
+    Integer getUnreadMessage(Long contractId);
+
+    IPage<TaskRepealMessageVO> repealPage(TaskRepealMessageDTO dto);
+
+    void batchRead(IdsDTO dto);
+
+    void batchDelete(IdsDTO dto);
+}

+ 1 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ContractMaterialServiceImpl.java

@@ -94,7 +94,7 @@ public class ContractMaterialServiceImpl extends BaseServiceImpl<ContractMateria
             throw new ServiceException("请填写材料名称");
         }
         if (contractMaterial.getPrice() == null){
-            throw new ServiceException("请填写材料价格");
+            throw new ServiceException("请填写(基期)单价");
         }
         //校验是否存在当前材料编号和名称
         LambdaQueryWrapper<ContractMaterial> wrapper1 = new LambdaQueryWrapper<>();

+ 3 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/InventoryFormMeterServiceImpl.java

@@ -105,6 +105,9 @@ public class InventoryFormMeterServiceImpl extends BaseServiceImpl<InventoryForm
                 throw new ServiceException("清单["+vo.getFormName()+"]已经变更或计量,请刷新页面");
             }
             //校验比例是否在范围之内
+            if (upPayRatio == null && vo.getUpPayRatio() != null){
+                throw new ServiceException("计量单元没设置支付比例,分解清单则不能设置支付比例");
+            }
             if (vo.getUpPayRatio() != null){
                 if (vo.getUpPayRatio().compareTo(BigDecimal.ZERO) < 0 || vo.getUpPayRatio().compareTo(new BigDecimal("100")) > 0) {
                     throw new ServiceException("请检查支付比例是否在规定范围");

+ 90 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/TaskRepealMessageServiceImpl.java

@@ -0,0 +1,90 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.meter.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.commons.lang.StringUtils;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.meter.dto.IdsDTO;
+import org.springblade.meter.dto.TaskRepealMessageDTO;
+import org.springblade.meter.entity.AttachmentForm;
+import org.springblade.meter.entity.TaskRepealMessage;
+import org.springblade.meter.mapper.AttachmentFormMapper;
+import org.springblade.meter.mapper.TaskRepealMessageMapper;
+import org.springblade.meter.service.IAttachmentFormService;
+import org.springblade.meter.service.ITaskRepealMessageService;
+import org.springblade.meter.vo.MeterPeriodVO;
+import org.springblade.meter.vo.TaskRepealMessageVO;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 附件表 服务实现类
+ *
+ * @author BladeX
+ * @since 2023-11-29
+ */
+@Service
+public class TaskRepealMessageServiceImpl extends BaseServiceImpl<TaskRepealMessageMapper, TaskRepealMessage> implements ITaskRepealMessageService {
+
+
+    @Override
+    public Integer getUnreadMessage(Long contractId) {
+        Long userId = AuthUtil.getUserId();
+        long count = this.count(new LambdaQueryWrapper<TaskRepealMessage>()
+                .eq(TaskRepealMessage::getContractId, contractId)
+                .eq(TaskRepealMessage::getUserId, userId)
+                //1为未读,2为已读
+                .eq(TaskRepealMessage::getStatus, 1));
+        return Math.toIntExact(count);
+    }
+
+    @Override
+    public IPage<TaskRepealMessageVO> repealPage(TaskRepealMessageDTO dto) {
+        dto.setUserId(AuthUtil.getUserId());
+        IPage<TaskRepealMessageVO> page = new Page<>(dto.getCurrent(),dto.getSize());
+        page = baseMapper.repealPage(page,dto);
+        return page;
+    }
+
+    @Override
+    public void batchRead(IdsDTO dto) {
+        String ids = dto.getIds();
+        if (StringUtils.isBlank(ids)){
+            throw new ServiceException("请选择一条通知");
+        }
+        List<Long> list = Func.toLongList(ids);
+        baseMapper.batchReadByIds(list);
+    }
+
+    @Override
+    public void batchDelete(IdsDTO dto) {
+        String ids = dto.getIds();
+        if (StringUtils.isBlank(ids)){
+            throw new ServiceException("请选择一条通知");
+        }
+        List<Long> list = Func.toLongList(ids);
+        this.removeBatchByIds(list);
+    }
+}