车车 4 месяцев назад
Родитель
Сommit
9a2df5c9c5

+ 11 - 3
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/app/workdesign/WorkflowAppController.java → yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/android/WorkflowAppController.java

@@ -1,9 +1,10 @@
-package cn.iocoder.yudao.module.iscs.controller.app.workdesign;
+package cn.iocoder.yudao.module.iscs.controller.admin.android;
 
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowwork.vo.MyWorkReqVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowwork.vo.MyWorkRespVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.android.vo.AppHomeVO;
 import cn.iocoder.yudao.module.iscs.service.workdesign.WorkflowWorkService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -17,9 +18,9 @@ import org.springframework.web.bind.annotation.RestController;
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 
 
-@Tag(name = "用户 App - 作业")
+@Tag(name = "系统 adroid - 作业")
 @RestController
-@RequestMapping("/app/iscs/workflow")
+@RequestMapping("/adroid/iscs/workflow")
 @Validated
 public class WorkflowAppController {
 
@@ -34,4 +35,11 @@ public class WorkflowAppController {
         return success(pageResult);
     }
 
+    @GetMapping("/getAppHomeStatistics")
+    @Operation(summary = "我的首页统计")
+    public CommonResult<AppHomeVO> getAppHomeStatistics() {
+        AppHomeVO result = workflowWorkService.getAppHomeStatistics();
+        return success(result);
+    }
+
 }

+ 16 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/android/vo/AppHomeVO.java

@@ -0,0 +1,16 @@
+package cn.iocoder.yudao.module.iscs.controller.admin.android.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "安卓首页统计")
+@Data
+public class AppHomeVO {
+
+    @Schema(description = "进行中")
+    private Integer inProgressCount;
+
+    @Schema(description = "本月完成")
+    private Integer completedCount;
+
+}

+ 9 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/mysql/workdesign/WorkflowWorkMapper.java

@@ -12,6 +12,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.time.LocalDateTime;
+import java.util.List;
+
 /**
  * 作业 Mapper
  *
@@ -45,5 +48,11 @@ public interface WorkflowWorkMapper extends BaseMapperX<WorkflowWorkDO> {
 
     Page<MyWorkRespVO> getAppMyWorkPage(Page page, @Param(value = "vo") MyWorkReqVO vo);
 
+    List<Long> getMyInProgressCount(@Param(value = "loginUserId") Long loginUserId);
+
+    List<Long> getMyCompletedCount(@Param(value = "loginUserId") Long loginUserId,
+                                @Param(value = "startTime") LocalDateTime startTime,
+                                @Param(value = "endTime") LocalDateTime endTime);
+
 
 }

+ 16 - 7
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/workdesign/WorkflowWorkService.java

@@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowwork.vo.
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowworknode.vo.ApprovalNodeReqVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowworknode.vo.StartWorkVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowworknode.vo.WorkflowWorkNodeRespVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.android.vo.AppHomeVO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.workdesign.WorkflowWorkDO;
 import com.baomidou.mybatisplus.extension.service.IService;
 import jakarta.validation.Valid;
@@ -84,13 +85,6 @@ public interface WorkflowWorkService extends IService<WorkflowWorkDO> {
      */
     PageResult<MyWorkRespVO> getMyWorkPage(MyWorkReqVO vo);
 
-    /**
-     * 我的作业分页
-     * @param vo
-     * @return
-     */
-    PageResult<MyWorkRespVO> getAppMyWorkPage(MyWorkReqVO vo);
-
     /**
      * 我的节点详情
      * @param nodeId
@@ -105,4 +99,19 @@ public interface WorkflowWorkService extends IService<WorkflowWorkDO> {
      */
     Boolean updateNodeApproval(ApprovalNodeReqVO vo);
 
+    // --------------------------------------------android-------------------------------------
+
+    /**
+     * 我的作业分页
+     * @param vo
+     * @return
+     */
+    PageResult<MyWorkRespVO> getAppMyWorkPage(MyWorkReqVO vo);
+
+    /**
+     *
+     * @return
+     */
+    AppHomeVO getAppHomeStatistics();
+
 }

+ 36 - 13
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/workdesign/WorkflowWorkServiceImpl.java

@@ -9,11 +9,13 @@ import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowwork.vo.
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowworknode.vo.ApprovalNodeReqVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowworknode.vo.StartWorkVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowworknode.vo.WorkflowWorkNodeRespVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.android.vo.AppHomeVO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.workdesign.WorkflowDesignDO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.workdesign.WorkflowWorkDO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.workdesign.WorkflowWorkNodeDO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.workdesign.WorkflowWorkNodeUserDO;
 import cn.iocoder.yudao.module.iscs.dal.mysql.workdesign.WorkflowWorkMapper;
+import cn.iocoder.yudao.module.iscs.utils.MonthTimeUtil;
 import cn.iocoder.yudao.module.iscs.utils.RandomCodeUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -226,19 +228,6 @@ public class WorkflowWorkServiceImpl extends ServiceImpl<WorkflowWorkMapper, Wor
         return respVOPageResult;
     }
 
-    @Override
-    public PageResult<MyWorkRespVO> getAppMyWorkPage(MyWorkReqVO vo) {
-        Long loginUserId = getLoginUserId();
-        vo.setLoginUserId(loginUserId);
-        Page page = new Page<>().setSize(vo.getPageSize()).setCurrent(vo.getPageNo());
-        // 获取和我相关的作业
-        Page<MyWorkRespVO> myWorkPage = workflowWorkMapper.getAppMyWorkPage(page, vo);
-        PageResult<MyWorkRespVO> respVOPageResult = new PageResult<>();
-        respVOPageResult.setList(myWorkPage.getRecords());
-        respVOPageResult.setTotal(myWorkPage.getTotal());
-        return respVOPageResult;
-    }
-
     @Override
     public WorkflowWorkNodeRespVO getMyWorkNodeDetail(Long nodeId) {
         WorkflowWorkNodeDO byId = workflowWorkNodeService.getById(nodeId);
@@ -256,6 +245,7 @@ public class WorkflowWorkServiceImpl extends ServiceImpl<WorkflowWorkMapper, Wor
         Assert.notNull(nodeDO, "审批节点数据丢失了!");
         Assert.isFalse("approved".equals(nodeDO.getApprovalStatus()) || "rejected".equals(nodeDO.getApprovalStatus()), "当前节[" + vo.getNodeId() + "]点已被审批!");
         // 2.开始审批
+        LocalDateTime now = LocalDateTime.now();
         if ("rejected".equals(vo.getApprovalStatus())) {
             // 如果是驳回,则只需要更新node状态
             workflowWorkNodeService.update(Wrappers.<WorkflowWorkNodeDO>lambdaUpdate()
@@ -263,6 +253,7 @@ public class WorkflowWorkServiceImpl extends ServiceImpl<WorkflowWorkMapper, Wor
                     .set(WorkflowWorkNodeDO::getApprovalStatus, vo.getApprovalStatus())
                     .set(WorkflowWorkNodeDO::getApprovalOpinion, vo.getApprovalOpinion())
                     .set(WorkflowWorkNodeDO::getFormData, vo.getFormData())
+                    .set(WorkflowWorkNodeDO::getEndTime, now)
             );
         } else if ("approved".equals(vo.getApprovalStatus())) {
             // 如果是通过,需要更新node状态,开启后面的节点
@@ -271,6 +262,7 @@ public class WorkflowWorkServiceImpl extends ServiceImpl<WorkflowWorkMapper, Wor
                     .set(WorkflowWorkNodeDO::getApprovalStatus, vo.getApprovalStatus())
                     .set(WorkflowWorkNodeDO::getApprovalOpinion, vo.getApprovalOpinion())
                     .set(WorkflowWorkNodeDO::getFormData, vo.getFormData())
+                    .set(WorkflowWorkNodeDO::getEndTime, now)
             );
 
 
@@ -283,6 +275,7 @@ public class WorkflowWorkServiceImpl extends ServiceImpl<WorkflowWorkMapper, Wor
                         .eq(WorkflowWorkNodeDO::getWorkId, nodeDO.getWorkId())
                         .in(WorkflowWorkNodeDO::getUuid, list)
                         .set(WorkflowWorkNodeDO::getApprovalStatus, "unaudited")
+                        .set(WorkflowWorkNodeDO::getStartTime, now)
                 );
             } else {
                 // 如果没有后续节点,看下是否完成整个流程
@@ -303,4 +296,34 @@ public class WorkflowWorkServiceImpl extends ServiceImpl<WorkflowWorkMapper, Wor
         return true;
     }
 
+
+    // ------------------------------------android------------------------------------------
+
+    @Override
+    public PageResult<MyWorkRespVO> getAppMyWorkPage(MyWorkReqVO vo) {
+        Long loginUserId = getLoginUserId();
+        Assert.notNull(loginUserId, "请登录!");
+        vo.setLoginUserId(loginUserId);
+        Page page = new Page<>().setSize(vo.getPageSize()).setCurrent(vo.getPageNo());
+        // 获取和我相关的作业
+        Page<MyWorkRespVO> myWorkPage = workflowWorkMapper.getAppMyWorkPage(page, vo);
+        PageResult<MyWorkRespVO> respVOPageResult = new PageResult<>();
+        respVOPageResult.setList(myWorkPage.getRecords());
+        respVOPageResult.setTotal(myWorkPage.getTotal());
+        return respVOPageResult;
+    }
+
+    @Override
+    public AppHomeVO getAppHomeStatistics() {
+        Long loginUserId = getLoginUserId();
+        Assert.notNull(loginUserId, "请登录!");
+        List<Long> myInProgressCount = workflowWorkMapper.getMyInProgressCount(loginUserId);
+        List<Long> myCompletedCount = workflowWorkMapper.getMyCompletedCount(loginUserId, MonthTimeUtil.getMonthStart(), MonthTimeUtil.getMonthEnd());
+        AppHomeVO appHomeVO = new AppHomeVO();
+        appHomeVO.setInProgressCount(myInProgressCount.size());
+        appHomeVO.setCompletedCount(myCompletedCount.size());
+        return appHomeVO;
+    }
+
+
 }

+ 37 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/utils/MonthTimeUtil.java

@@ -0,0 +1,37 @@
+package cn.iocoder.yudao.module.iscs.utils;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAdjusters;
+
+public class MonthTimeUtil {
+    // 定义时间格式化器(固定格式:yyyy-MM-dd HH:mm:ss)
+    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+    /**
+     * 获取本月起始时间(yyyy-MM-dd 00:00:00)
+     * @return LocalDateTime 起始时间对象
+     */
+    public static LocalDateTime getMonthStart() {
+        // 1. 获取当前时间 2. 调整到当月第一天 3. 设置时分秒为00:00:00
+        return LocalDateTime.now()
+                .with(TemporalAdjusters.firstDayOfMonth())
+                .withHour(0)
+                .withMinute(0)
+                .withSecond(0);
+    }
+
+    /**
+     * 获取本月结束时间(yyyy-MM-dd 23:59:59)
+     * @return LocalDateTime 结束时间对象
+     */
+    public static LocalDateTime getMonthEnd() {
+        // 1. 获取当前时间 2. 调整到当月最后一天 3. 设置时分秒为23:59:59
+        return LocalDateTime.now()
+                .with(TemporalAdjusters.lastDayOfMonth())
+                .withHour(23)
+                .withMinute(59)
+                .withSecond(59);
+    }
+
+}

+ 45 - 0
yudao-module-iscs/src/main/resources/mapper/workdesign/WorkflowWorkMapper.xml

@@ -104,4 +104,49 @@
         </where>
         ORDER BY FIELD(approval_status, 'unaudited', 'approved', 'rejected', 'pending'), work_node.update_time DESC
     </select>
+
+    <select id="getMyInProgressCount" resultType="java.lang.Long">
+        SELECT
+        work_node.id
+        FROM
+        isc_workflow_work_node work_node
+        <where>
+            work_node.deleted = b'0'
+            AND work_node.approval_status = "unaudited"
+            AND (
+            -- 条件1:节点自身负责人ID匹配
+            work_node.worker_user_id = #{loginUserId}
+            -- 条件2:关联表中负责人ID匹配
+            OR EXISTS (
+            SELECT 1
+            FROM isc_workflow_work_node_user work_node_user
+            WHERE
+            work_node_user.node_id = work_node.id
+            AND work_node_user.deleted = b'0'
+            AND work_node_user.user_id = #{loginUserId} ) )
+        </where>
+    </select>
+    <select id="getMyCompletedCount" resultType="java.lang.Long">
+        SELECT
+        work_node.id
+        FROM
+        isc_workflow_work_node work_node
+        <where>
+            work_node.deleted = b'0'
+            AND (work_node.approval_status = "approved" OR work_node.approval_status = "rejected")
+            AND work_node.end_time &gt;= #{startTime} AND work_node.end_time &lt;= #{endTime}
+            AND (
+            -- 条件1:节点自身负责人ID匹配
+            work_node.worker_user_id = #{loginUserId}
+            -- 条件2:关联表中负责人ID匹配
+            OR EXISTS (
+            SELECT 1
+            FROM isc_workflow_work_node_user work_node_user
+            WHERE
+            work_node_user.node_id = work_node.id
+            AND work_node_user.deleted = b'0'
+            AND work_node_user.user_id = #{loginUserId} ) )
+        </where>
+
+    </select>
 </mapper>