From 07dc59b3fef59a443fe392247fde63d8818c71ea Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=A3=B7=E5=8F=B6?=
 <14103883+leaf-phos@user.noreply.gitee.com>
Date: Sat, 9 Nov 2024 18:04:21 +0800
Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/com/ruoyi/common/annotation/Log.java |  8 ++-
 .../com/ruoyi/common/enums/BusinessType.java  |  2 +
 .../ruoyi/framework/aspectj/LogAspect.java    | 50 +++++++++++++++--
 .../ruoyi/system/mapper/SysDeptMapper.java    |  3 +-
 .../ruoyi/system/service/ISysDeptService.java | 13 ++++-
 .../service/impl/SysDeptServiceImpl.java      | 11 ++--
 .../resources/mapper/system/SysDeptMapper.xml |  1 +
 .../report/controller/ReportController.java   | 33 +++++++----
 .../ruoyi/web/yh/report/domain/Report.java    |  2 +
 .../web/yh/report/domain/bo/ReportBO.java     |  4 ++
 .../yh/report/domain/enums/ReportStatus.java  | 21 +++++++
 .../web/yh/report/mapper/ReportMapper.xml     |  8 ++-
 .../web/yh/report/service/ReportService.java  | 10 ++++
 .../service/impl/ReportConverterImpl.java     |  6 ++
 .../service/impl/ReportServiceImpl.java       | 55 +++++++++++++++++--
 .../service/impl/ReportValidatorImpl.java     | 25 ++++++++-
 .../web/yh/reportProd/domain/ReportProd.java  |  4 ++
 .../yh/reportProd/mapper/ReportProdMapper.xml | 32 ++++++++++-
 .../service/impl/ReportProdConverterImpl.java |  4 ++
 .../reportUserProd/domain/ReportUserProd.java |  6 ++
 20 files changed, 265 insertions(+), 33 deletions(-)

diff --git a/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java b/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java
index 1eb8e49..b7c3a0c 100644
--- a/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java
+++ b/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java
@@ -10,7 +10,7 @@ import com.ruoyi.common.enums.OperatorType;
 
 /**
  * 自定义操作日志记录注解
- * 
+ *
  * @author ruoyi
  *
  */
@@ -48,4 +48,10 @@ public @interface Log
      * 排除指定的请求参数
      */
     public String[] excludeParamNames() default {};
+
+    /**
+     * 业务表ID
+     * @return
+     */
+    long bizId() default -1;
 }
diff --git a/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java b/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java
index ffc9c8f..25909b8 100644
--- a/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java
+++ b/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java
@@ -69,4 +69,6 @@ public enum BusinessType
     ENABLE,
     // 取消提交
     CANCEL,
+    // 提交
+    SUBMIT,
 }
diff --git a/common-ruoyi/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java b/common-ruoyi/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java
index 6aaa231..e7bedf5 100644
--- a/common-ruoyi/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java
+++ b/common-ruoyi/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java
@@ -1,5 +1,7 @@
 package com.ruoyi.framework.aspectj;
 
+import java.lang.reflect.Method;
+import java.lang.reflect.Parameter;
 import java.util.Collection;
 import java.util.Map;
 import javax.servlet.http.HttpServletRequest;
@@ -10,6 +12,7 @@ import org.aspectj.lang.annotation.AfterReturning;
 import org.aspectj.lang.annotation.AfterThrowing;
 import org.aspectj.lang.annotation.Aspect;
 import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.reflect.MethodSignature;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.core.NamedThreadLocal;
@@ -33,7 +36,7 @@ import com.ruoyi.system.domain.SysOperLog;
 
 /**
  * 操作日志记录处理
- * 
+ *
  * @author ruoyi
  */
 @Aspect
@@ -54,6 +57,43 @@ public class LogAspect
     @Before(value = "@annotation(controllerLog)")
     public void boBefore(JoinPoint joinPoint, Log controllerLog)
     {
+//        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+//        Method method = signature.getMethod();
+//
+//        // 获取方法的所有参数
+//        Parameter[] parameters = method.getParameters();
+//        Object[] args = joinPoint.getArgs();
+//
+//        // 获取注解中的 paramName
+//        String paramName = myMethodAnnotation.paramName();
+//
+//        // 查找参数名对应的参数值
+//        for (int i = 0; i < parameters.length; i++) {
+//            Parameter parameter = parameters[i];
+//            if (parameter.getName().equals(paramName.split("\\.")[0])) {
+//                Object paramValue = args[i];
+//
+//                // 如果参数是复杂类型,进一步获取属性值
+//                if (paramName.contains(".")) {
+//                    String[] parts = paramName.split("\\.");
+//                    Object currentObject = paramValue;
+//                    for (int j = 1; j < parts.length; j++) {
+//                        String part = parts[j];
+//                        try {
+//                            Field field = currentObject.getClass().getDeclaredField(part);
+//                            field.setAccessible(true);
+//                            currentObject = field.get(currentObject);
+//                        } catch (NoSuchFieldException | IllegalAccessException e) {
+//                            throw new RuntimeException("Failed to access field " + part, e);
+//                        }
+//                    }
+//                    paramValue = currentObject;
+//                }
+//
+//                System.out.println("Parameter value for " + paramName + ": " + paramValue);
+//            }
+//        }
+
         TIME_THREADLOCAL.set(System.currentTimeMillis());
     }
 
@@ -70,7 +110,7 @@ public class LogAspect
 
     /**
      * 拦截异常操作
-     * 
+     *
      * @param joinPoint 切点
      * @param e 异常
      */
@@ -136,7 +176,7 @@ public class LogAspect
 
     /**
      * 获取注解中对方法的描述信息 用于Controller层注解
-     * 
+     *
      * @param log 日志
      * @param operLog 操作日志
      * @throws Exception
@@ -164,7 +204,7 @@ public class LogAspect
 
     /**
      * 获取请求的参数,放到log中
-     * 
+     *
      * @param operLog 操作日志
      * @throws Exception 异常
      */
@@ -220,7 +260,7 @@ public class LogAspect
 
     /**
      * 判断是否需要过滤的对象。
-     * 
+     *
      * @param o 对象信息。
      * @return 如果是需要过滤的对象,则返回true;否则返回false。
      */
diff --git a/common-ruoyi/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java b/common-ruoyi/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java
index 090d5f4..349ca94 100644
--- a/common-ruoyi/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java
+++ b/common-ruoyi/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java
@@ -34,9 +34,10 @@ public interface SysDeptMapper
      * 根据部门ID查询信息
      *
      * @param deptId 部门ID
+     * @param scope
      * @return 部门信息
      */
-    public SysDept selectDeptById(Long deptId);
+    public SysDept selectDeptById(@Param("deptId") Long deptId, @Param("scope") boolean scope);
 
     /**
      * 根据ID查询所有子部门
diff --git a/common-ruoyi/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java b/common-ruoyi/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java
index 9c33720..b4f8f5f 100644
--- a/common-ruoyi/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java
+++ b/common-ruoyi/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java
@@ -58,7 +58,18 @@ public interface ISysDeptService
      * @param deptId 部门ID
      * @return 部门信息
      */
-    public SysDept selectDeptById(Long deptId);
+    default SysDept selectDeptById(Long deptId) {
+        return selectDeptById(deptId, false);
+    }
+
+    /**
+     * 根据部门ID查询信息
+     *
+     * @param deptId 部门ID
+     * @param scope
+     * @return 部门信息
+     */
+    public SysDept selectDeptById(Long deptId, boolean scope);
 
     /**
      * 根据ID查询所有子部门(正常状态)
diff --git a/common-ruoyi/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/common-ruoyi/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java
index 3092f6a..d46f35c 100644
--- a/common-ruoyi/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java
+++ b/common-ruoyi/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java
@@ -122,12 +122,13 @@ public class SysDeptServiceImpl implements ISysDeptService
      * 根据部门ID查询信息
      *
      * @param deptId 部门ID
+     * @param scope
      * @return 部门信息
      */
     @Override
-    public SysDept selectDeptById(Long deptId)
+    public SysDept selectDeptById(Long deptId, boolean scope)
     {
-        return deptMapper.selectDeptById(deptId);
+        return deptMapper.selectDeptById(deptId, scope);
     }
 
     /**
@@ -215,7 +216,7 @@ public class SysDeptServiceImpl implements ISysDeptService
     @Override
     public int insertDept(SysDept dept)
     {
-        SysDept info = deptMapper.selectDeptById(dept.getParentId());
+        SysDept info = deptMapper.selectDeptById(dept.getParentId(), false);
         // 如果父节点不为正常状态,则不允许新增子节点
         if (!UserConstants.DEPT_NORMAL.equals(info.getStatus()))
         {
@@ -234,8 +235,8 @@ public class SysDeptServiceImpl implements ISysDeptService
     @Override
     public int updateDept(SysDept dept)
     {
-        SysDept newParentDept = deptMapper.selectDeptById(dept.getParentId());
-        SysDept oldDept = deptMapper.selectDeptById(dept.getDeptId());
+        SysDept newParentDept = deptMapper.selectDeptById(dept.getParentId(), false);
+        SysDept oldDept = deptMapper.selectDeptById(dept.getDeptId(), false);
         if (StringUtils.isNotNull(newParentDept) && StringUtils.isNotNull(oldDept))
         {
             String newAncestors = newParentDept.getAncestors() + "," + newParentDept.getDeptId();
diff --git a/common-ruoyi/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml b/common-ruoyi/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml
index 73d55af..2a615e3 100644
--- a/common-ruoyi/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml
+++ b/common-ruoyi/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml
@@ -69,6 +69,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 			(select dept_name from sys_dept where dept_id = d.parent_id) parent_name
 		from sys_dept d
 		where d.dept_id = #{deptId}
+			${@com.ruoyi.framework.util.DataScopeUtil@dataScope("d", null, scope)}
 	</select>
 
     <select id="checkDeptExistUser" parameterType="Long" resultType="int">
diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/controller/ReportController.java b/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/controller/ReportController.java
index f5d73df..eb5388d 100644
--- a/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/controller/ReportController.java
+++ b/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/controller/ReportController.java
@@ -12,14 +12,7 @@ import com.ruoyi.web.yh.report.service.ReportConverter;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
@@ -81,11 +74,15 @@ public class ReportController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('yh:report:query')")
     @GetMapping(value = "/{reportId}")
-    public AjaxResult getInfo(@PathVariable("reportId") Long reportId)
-    {
+    public AjaxResult getInfo(@PathVariable("reportId") Long reportId,
+                              @RequestParam(required = false, defaultValue = "true") Boolean needProductList,
+                              @RequestParam(required = false, defaultValue = "true") Boolean needUserProd
+    ) {
         ReportVO report = reportService.selectReportByReportId(reportId);
         List<ReportVO> list = Collections.singletonList(report);
-        reportAssembler.assembleProductList(list, true);  // 拼接产量明细
+        if (needProductList) {
+            reportAssembler.assembleProductList(list, needUserProd);  // 拼接产量明细
+        }
         return success(report);
     }
 
@@ -129,4 +126,18 @@ public class ReportController extends BaseController
     public AjaxResult verify(@RequestBody @Validated ReportVerifyDTO dto) {
         return toAjax(reportService.verify(dto, getUserId()));
     }
+
+    @PreAuthorize("@ss.hasPermi('yh:report:cancel')")
+    @Log(title = "车间报表取消提交", businessType = BusinessType.CANCEL)
+    @PutMapping("/{reportId}/cancel")
+    public AjaxResult cancel(@PathVariable Long reportId) {
+        return toAjax(reportService.cancel(reportId));
+    }
+
+    @PreAuthorize("@ss.hasPermi('yh:report:submit')")
+    @Log(title = "车间报表提交", businessType = BusinessType.SUBMIT)
+    @PutMapping("/{reportId}/submit")
+    public AjaxResult submit(@PathVariable Long reportId) {
+        return toAjax(reportService.submit(reportId));
+    }
 }
diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/domain/Report.java b/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/domain/Report.java
index 3a54f50..e430bfd 100644
--- a/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/domain/Report.java
+++ b/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/domain/Report.java
@@ -13,6 +13,7 @@ import com.ruoyi.common.annotation.Excel;
 import com.ruoyi.common.core.domain.BaseEntity;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import javax.validation.constraints.Min;
 import javax.validation.constraints.NotNull;
 
 /**
@@ -71,5 +72,6 @@ public class Report extends BaseEntity
     @Excel(name = "总金额", readConverterExp = "元=")
     @ApiModelProperty("总金额")
     @NotNull(message = "总金额不能为空")
+    @Min(value = 0, message = "总金额必须大于0")
     private BigDecimal totalAmount;
 }
diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/domain/bo/ReportBO.java b/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/domain/bo/ReportBO.java
index a6b495c..4ba1b5d 100644
--- a/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/domain/bo/ReportBO.java
+++ b/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/domain/bo/ReportBO.java
@@ -1,5 +1,6 @@
 package com.ruoyi.web.yh.report.domain.bo;
 
+import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.web.yh.report.domain.Report;
 import com.ruoyi.web.yh.reportProd.domain.ReportProd;
@@ -17,6 +18,9 @@ import java.util.List;
 @Data
 public class ReportBO extends Report {
 
+    // 部门信息
+    private SysDept dept;
+
     // 产量列表
     private List<ReportProdBO> productList;
 }
diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/domain/enums/ReportStatus.java b/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/domain/enums/ReportStatus.java
index 42e8603..67a1237 100644
--- a/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/domain/enums/ReportStatus.java
+++ b/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/domain/enums/ReportStatus.java
@@ -3,6 +3,7 @@ package com.ruoyi.web.yh.report.domain.enums;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 
+import java.nio.charset.Charset;
 import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -34,4 +35,24 @@ public enum ReportStatus {
         return asList(WAIT_VERIFY);
     }
 
+    /**
+     * 允许取消审核的状态
+     */
+    public static List<String> canCancel() {
+        return asList(WAIT_VERIFY);
+    }
+
+    /**
+     * 允许提交的状态
+     */
+    public static List<String> canSubmit() {
+        return asList(WAIT_SUBMIT);
+    }
+
+    /**
+     * 允许修改的状态
+     */
+    public static List<String> canEdit() {
+        return asList(WAIT_SUBMIT, REJECT);
+    }
 }
diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/mapper/ReportMapper.xml b/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/mapper/ReportMapper.xml
index 3d01722..e623ef1 100644
--- a/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/mapper/ReportMapper.xml
+++ b/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/mapper/ReportMapper.xml
@@ -42,6 +42,12 @@
         <if test="query.updateId != null "> and br.update_id = #{query.updateId}</if>
         <if test="query.updateBy != null  and query.updateBy != ''"> and br.update_by like concat('%', #{query.updateBy}, '%')</if>
         <if test="query.remark != null  and query.remark != ''"> and br.remark like concat('%', #{query.remark}, '%')</if>
+        <if test="query.statusList != null and query.statusList.size() > 0">
+            and br.status in
+            <foreach collection="query.statusList" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
         ${query.params.dataScope}
     </sql>
 
@@ -104,7 +110,7 @@
     </update>
 
     <update id="updateByQuery">
-        update bst_report
+        update bst_report br
         <trim prefix="SET" suffixOverrides=",">
             <include refid="updateColumns"/>
         </trim>
diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/service/ReportService.java b/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/service/ReportService.java
index 130a28d..0dbd7c1 100644
--- a/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/service/ReportService.java
+++ b/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/service/ReportService.java
@@ -81,4 +81,14 @@ public interface ReportService
      * @param verifyId 审核人ID
      */
     int verify(ReportVerifyDTO dto, Long verifyId);
+
+    /**
+     * 取消提交
+     */
+    int cancel(Long reportId);
+
+    /**
+     * 提交
+     */
+    int submit(Long reportId);
 }
diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/service/impl/ReportConverterImpl.java b/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/service/impl/ReportConverterImpl.java
index 600d15d..12b4070 100644
--- a/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/service/impl/ReportConverterImpl.java
+++ b/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/service/impl/ReportConverterImpl.java
@@ -2,6 +2,7 @@ package com.ruoyi.web.yh.report.service.impl;
 
 import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.system.service.ISysDeptService;
 import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.web.yh.price.domain.PriceQuery;
 import com.ruoyi.web.yh.price.service.PriceService;
@@ -37,6 +38,9 @@ public class ReportConverterImpl implements ReportConverter {
     @Autowired
     private ReportProdConverter reportProdConverter;
 
+    @Autowired
+    private ISysDeptService deptService;
+
     @Override
     public ReportBO toBoByCreate(ReportVO vo) {
         if (vo == null) {
@@ -65,6 +69,7 @@ public class ReportConverterImpl implements ReportConverter {
 
         // 组装数据
         bo.setProductList(productList);
+        bo.setDept(deptService.selectDeptById(bo.getDeptId(), true));
         return bo;
     }
 
@@ -97,6 +102,7 @@ public class ReportConverterImpl implements ReportConverter {
 
         // 组装数据
         bo.setProductList(productList);
+        bo.setDept(deptService.selectDeptById(bo.getDeptId(), true));
         return bo;
     }
 }
diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/service/impl/ReportServiceImpl.java b/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/service/impl/ReportServiceImpl.java
index e46254e..c3bb809 100644
--- a/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/service/impl/ReportServiceImpl.java
+++ b/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/service/impl/ReportServiceImpl.java
@@ -99,14 +99,19 @@ public class ReportServiceImpl implements ReportService
     /**
      * 修改报表
      *
-     * @param report 报表
+     * @param data 报表
      * @return 结果
      */
     @Override
-    public int updateReport(Report report)
-    {
-        report.setUpdateTime(DateUtils.getNowDate());
-        return reportMapper.updateReport(report);
+    public int updateReport(Report data) {
+        if (data.getReportId() == null) {
+            return 0;
+        }
+        data.setUpdateTime(DateUtils.getNowDate());
+        ReportQuery query = new ReportQuery();
+        query.setReportId(data.getReportId());
+        query.setStatusList(ReportStatus.canEdit());
+        return this.updateByQuery(data, query);
     }
 
     /**
@@ -265,6 +270,46 @@ public class ReportServiceImpl implements ReportService
         return result == null ? 0 : result;
     }
 
+    @Override
+    public int cancel(Long reportId) {
+        ReportVO old = this.selectReportByReportId(reportId);
+        ServiceUtil.assertion(old == null || old.getReportId() == null, "待取消的报表不存在");
+        ServiceUtil.assertion(!ReportStatus.canCancel().contains(old.getStatus()), "报表当前状态不允许取消,请刷新后重试");
+
+        Report data = new Report();
+        data.setStatus(ReportStatus.WAIT_SUBMIT.getStatus());
+        ReportQuery query = new ReportQuery();
+        query.setReportId(reportId);
+        query.setStatusList(ReportStatus.canCancel());
+        Integer result = transactionTemplate.execute(status -> {
+            int update = this.updateByQuery(data, query);
+            ServiceUtil.assertion(update != 1, "取消失败,当前报表状态已发生变化,请刷新后重试");
+            return update;
+        });
+
+        return result == null ? 0 : result;
+    }
+
+    @Override
+    public int submit(Long reportId) {
+        ReportVO old = this.selectReportByReportId(reportId);
+        ServiceUtil.assertion(old == null || old.getReportId() == null, "待提交的报表不存在");
+        ServiceUtil.assertion(!ReportStatus.canSubmit().contains(old.getStatus()), "报表当前状态不允许提交,请刷新后重试");
+
+        Report data = new Report();
+        data.setStatus(ReportStatus.WAIT_VERIFY.getStatus());
+        ReportQuery query = new ReportQuery();
+        query.setReportId(reportId);
+        query.setStatusList(ReportStatus.canSubmit());
+        Integer result = transactionTemplate.execute(status -> {
+            int update = this.updateByQuery(data, query);
+            ServiceUtil.assertion(update != 1, "提交失败,当前报表状态已发生变化,请刷新后重试");
+            return update;
+        });
+
+        return result == null ? 0 : result;
+    }
+
     private int updateByQuery(Report data, ReportQuery query) {
         return reportMapper.updateByQuery(data, query);
     }
diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/service/impl/ReportValidatorImpl.java b/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/service/impl/ReportValidatorImpl.java
index 1b39f71..00ce602 100644
--- a/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/service/impl/ReportValidatorImpl.java
+++ b/ruoyi-web/src/main/java/com/ruoyi/web/yh/report/service/impl/ReportValidatorImpl.java
@@ -1,8 +1,12 @@
 package com.ruoyi.web.yh.report.service.impl;
 
 import com.ruoyi.common.utils.ServiceUtil;
+import com.ruoyi.web.yh.report.domain.ReportVO;
 import com.ruoyi.web.yh.report.domain.bo.ReportBO;
+import com.ruoyi.web.yh.report.domain.enums.ReportStatus;
+import com.ruoyi.web.yh.report.service.ReportService;
 import com.ruoyi.web.yh.report.service.ReportValidator;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 /**
@@ -11,9 +15,28 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class ReportValidatorImpl implements ReportValidator {
+
+    @Autowired
+    private ReportService reportService;
+
     @Override
     public void checkPreEdit(ReportBO bo) {
-        ServiceUtil.assertion(bo == null, "参数错误");
+        ServiceUtil.assertion(bo == null || bo.getReportId() == null, "参数错误");
+
+        ReportVO old = reportService.selectReportByReportId(bo.getReportId());
+        ServiceUtil.assertion(old == null || old.getReportId() == null, "待更新的报表不存在");
+        ServiceUtil.assertion(!ReportStatus.canEdit().contains(old.getStatus()), "报表当前状态不允许更新,请刷新后重试");
+
+        // TODO 业务表校验
+        // TODO 部门是否当前用户可选
+
+        // TODO 工序是否当前用户可选
+
+        // TODO 工序是否当前部门的工序
+
+        // TODO 员工是否当前用户可选
+
+        // TODO 员工是否当前部门的员工
 
     }
 }
diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/yh/reportProd/domain/ReportProd.java b/ruoyi-web/src/main/java/com/ruoyi/web/yh/reportProd/domain/ReportProd.java
index 3de36b4..657c7bd 100644
--- a/ruoyi-web/src/main/java/com/ruoyi/web/yh/reportProd/domain/ReportProd.java
+++ b/ruoyi-web/src/main/java/com/ruoyi/web/yh/reportProd/domain/ReportProd.java
@@ -14,6 +14,7 @@ import com.ruoyi.common.core.domain.BaseEntity;
 import javax.validation.constraints.Min;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
 
 /**
  * 报表产量对象 bst_report_prod
@@ -94,4 +95,7 @@ public class ReportProd extends BaseEntity
     @NotBlank(message = "工序类型不允许为空")
     @DictValid(type = DictType.PRICE_TYPE, message = "非法的工序类型")
     private String priceType;
+
+    @Size(max = 200, message = "备注长度不允许超过200个字符")
+    private String remark;
 }
diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/yh/reportProd/mapper/ReportProdMapper.xml b/ruoyi-web/src/main/java/com/ruoyi/web/yh/reportProd/mapper/ReportProdMapper.xml
index 9433f9e..395d103 100644
--- a/ruoyi-web/src/main/java/com/ruoyi/web/yh/reportProd/mapper/ReportProdMapper.xml
+++ b/ruoyi-web/src/main/java/com/ruoyi/web/yh/reportProd/mapper/ReportProdMapper.xml
@@ -24,7 +24,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             brp.price_classify,
             brp.price_quantity,
             brp.deleted,
-            brp.price_type
+            brp.price_type,
+            brp.remark
         from bst_report_prod brp
     </sql>
 
@@ -39,6 +40,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="query.priceSpec != null  and query.priceSpec != ''"> and brp.price_spec like concat('%', #{query.priceSpec}, '%')</if>
         <if test="query.priceUnit != null  and query.priceUnit != ''"> and brp.price_unit = #{query.priceUnit}</if>
         <if test="query.priceClassify != null  and query.priceClassify != ''"> and brp.price_classify like concat('%', #{query.priceClassify}, '%')</if>
+        <if test="query.remark != null  and query.remark != ''"> and brp.remark like concat('%', #{query.remark}, '%')</if>
         <if test="query.priceType != null  and query.priceType != ''"> and price_type = #{query.priceType}</if>
         <if test="query.deleted == null">and brp.deleted = false</if>
         <if test="query.deleted != null">and brp.deleted = #{deleted}</if>
@@ -81,6 +83,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="priceClassify != null">price_classify,</if>
             <if test="priceQuantity != null">price_quantity,</if>
             <if test="priceType != null and priceType != ''">price_type,</if>
+            <if test="remark != null and remark != ''">remark,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="reportId != null">#{reportId},</if>
@@ -98,6 +101,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="priceClassify != null">#{priceClassify},</if>
             <if test="priceQuantity != null">#{priceQuantity},</if>
             <if test="priceType != null and priceType != ''">#{priceType},</if>
+            <if test="remark != null and remark != ''">#{remark},</if>
          </trim>
     </insert>
 
@@ -117,7 +121,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             price_unit,
             price_classify,
             price_quantity,
-            price_type
+            price_type,
+            remark
         )
         values
         <foreach collection="list" item="i" separator=",">
@@ -152,6 +157,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 <if test="i.priceQuantity == null">default,</if>
                 <if test="i.priceType != null">#{i.priceType},</if>
                 <if test="i.priceType == null">default,</if>
+                <if test="i.remark != null">#{i.remark},</if>
+                <if test="i.remark == null">default,</if>
             </trim>
         </foreach>
     </insert>
@@ -180,6 +187,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="data.priceClassify != null">price_classify = #{data.priceClassify},</if>
         <if test="data.priceQuantity != null">price_quantity = #{data.priceQuantity},</if>
         <if test="data.priceType != null and data.priceType != ''">price_type = #{data.priceType},</if>
+        <if test="data.remark != null and data.remark != ''">remark = #{data.remark},</if>
     </sql>
 
     <update id="batchUpdate">
@@ -315,6 +323,26 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                     </otherwise>
                 </choose>
             </foreach>
+            <foreach open="price_type = CASE id" collection="list" item="item" close="END,">
+                <choose>
+                    <when test="item.priceType != null">
+                        WHEN #{item.id} THEN #{item.priceType}
+                    </when>
+                    <otherwise>
+                        WHEN #{item.id} THEN `price_type`
+                    </otherwise>
+                </choose>
+            </foreach>
+            <foreach open="remark = CASE id" collection="list" item="item" close="END,">
+                <choose>
+                    <when test="item.remark != null">
+                        WHEN #{item.id} THEN #{item.remark}
+                    </when>
+                    <otherwise>
+                        WHEN #{item.id} THEN `remark`
+                    </otherwise>
+                </choose>
+            </foreach>
         </trim>
         where id in
         <foreach item="item" collection="list" open="(" separator="," close=")">
diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/yh/reportProd/service/impl/ReportProdConverterImpl.java b/ruoyi-web/src/main/java/com/ruoyi/web/yh/reportProd/service/impl/ReportProdConverterImpl.java
index 536ee70..ee79b22 100644
--- a/ruoyi-web/src/main/java/com/ruoyi/web/yh/reportProd/service/impl/ReportProdConverterImpl.java
+++ b/ruoyi-web/src/main/java/com/ruoyi/web/yh/reportProd/service/impl/ReportProdConverterImpl.java
@@ -42,6 +42,8 @@ public class ReportProdConverterImpl implements ReportProdConverter {
         bo.setPriceUnit(vo.getPriceUnit());
         bo.setPriceClassify(vo.getPriceClassify());
         bo.setPriceQuantity(vo.getPriceQuantity());
+        bo.setPriceType(vo.getPriceType());
+        bo.setRemark(vo.getRemark());
 
         // 用户产量明细
         List<ReportUserProdBO> userProdList = new ArrayList<>();
@@ -77,6 +79,8 @@ public class ReportProdConverterImpl implements ReportProdConverter {
         bo.setPriceUnit(vo.getPriceUnit());
         bo.setPriceClassify(vo.getPriceClassify());
         bo.setPriceQuantity(vo.getPriceQuantity());
+        bo.setPriceType(vo.getPriceType());
+        bo.setRemark(vo.getRemark());
 
         // 用户产量明细
         List<ReportUserProdBO> userProdList = new ArrayList<>();
diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/yh/reportUserProd/domain/ReportUserProd.java b/ruoyi-web/src/main/java/com/ruoyi/web/yh/reportUserProd/domain/ReportUserProd.java
index e697097..48b70aa 100644
--- a/ruoyi-web/src/main/java/com/ruoyi/web/yh/reportUserProd/domain/ReportUserProd.java
+++ b/ruoyi-web/src/main/java/com/ruoyi/web/yh/reportUserProd/domain/ReportUserProd.java
@@ -8,6 +8,9 @@ import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ruoyi.common.annotation.Excel;
 import com.ruoyi.common.core.domain.BaseEntity;
 
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+
 /**
  * 员工产量对象 bst_report_user_prod
  *
@@ -27,10 +30,13 @@ public class ReportUserProd extends BaseEntity
 
     @Excel(name = "员工ID")
     @ApiModelProperty("员工ID")
+    @NotNull(message = "员工不允许为空")
     private Long userId;
 
     @Excel(name = "产量")
     @ApiModelProperty("产量")
+    @NotNull(message = "产量不允许为空")
+    @Min(value = 0, message = "产量不允许小于0")
     private BigDecimal num;
 
 }