From 1c518e10a50050d383e714b581c94dea58ec4d67 Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期五, 22 五月 2026 18:01:34 +0800
Subject: [PATCH] fix(approve): 修复审批实例查询条件及流程控制问题

---
 src/main/java/com/ruoyi/staff/dto/StaffOnJobDto.java                                      |    2 
 src/main/resources/mapper/staff/StaffOnJobMapper.xml                                      |   91 ++++++++++++++++++----
 src/main/java/com/ruoyi/staff/mapper/StaffOnJobMapper.java                                |    4 
 src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java                     |   31 +++++++
 src/main/resources/mapper/approve/ApprovalInstanceMapper.xml                              |   10 +
 src/main/java/com/ruoyi/collaborativeApproval/service/impl/EnterpriseNewsServiceImpl.java |   21 +++++
 src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java                             |    2 
 src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java                        |    2 
 src/main/resources/mapper/approve/FinReimbursementMapper.xml                              |    8 +
 src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java             |   11 ++
 src/main/java/com/ruoyi/approve/service/impl/FinReimbursementServiceImpl.java             |   15 ++-
 11 files changed, 163 insertions(+), 34 deletions(-)

diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
index 251ff05..1fb2333 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
@@ -25,6 +25,7 @@
 import com.ruoyi.collaborativeApproval.pojo.EnterpriseNewsScopeDept;
 import com.ruoyi.collaborativeApproval.pojo.EnterpriseNewsScopeUser;
 import com.ruoyi.common.enums.*;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.OrderUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.framework.security.LoginUser;
@@ -159,6 +160,16 @@
         if (approvalInstanceDto == null || approvalInstanceDto.getId() == null) {
             return false;
         }
+        // 鍒ゆ柇鏄惁鏈夋鍦ㄨ繘琛岀殑瀹℃壒浠诲姟锛屾湁鍒欎笉鍏佽淇敼
+        long pendingTaskCount = approvalTaskService.count(
+                Wrappers.<ApprovalTask>lambdaQuery()
+                        .eq(ApprovalTask::getInstanceId, approvalInstanceDto.getId())
+                        .eq(ApprovalTask::getTaskStatus, "PENDING")
+                        .eq(ApprovalTask::getDeleted, 0)
+        );
+        if (pendingTaskCount > 0) {
+            throw new ServiceException("璇ュ鎵瑰崟鏈夋鍦ㄨ繘琛岀殑瀹℃壒浠诲姟锛屼笉鍏佽淇敼");
+        }
         boolean updated = this.updateById(approvalInstanceDto);
         if (!updated) {
             return false;
diff --git a/src/main/java/com/ruoyi/approve/service/impl/FinReimbursementServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/FinReimbursementServiceImpl.java
index a69bb76..1861d83 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/FinReimbursementServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/FinReimbursementServiceImpl.java
@@ -199,7 +199,7 @@
             }
         }
 
-        resetApprovalFlow(existing.getApprovalInstanceId(), reimbursementId);
+        resetApprovalFlow(existing, reimbursementId);
         if (BILL_STATUS_IN_APPROVAL.equals(billStatus)) {
             reimbursement.setApprovalInstanceId(null);
             startApproval(reimbursement, finReimbursementDto);
@@ -498,11 +498,18 @@
         sysNoticeService.simpleNoticeByUser(title, message, approverIds, jumpPath);
     }
 
-    private void resetApprovalFlow(Long approvalInstanceId, Long reimbursementId) {
-        if (approvalInstanceId == null) {
+    private void resetApprovalFlow(FinReimbursement existing, Long reimbursementId) {
+        if (existing == null || existing.getApprovalInstanceId() == null) {
             return;
         }
-        approvalInstanceService.delete(Collections.singletonList(approvalInstanceId));
+        Long approvalInstanceId = existing.getApprovalInstanceId();
+        if (!"REJECTED".equals(existing.getBillStatus())) {
+            approvalInstanceService.delete(Collections.singletonList(approvalInstanceId));
+        }
+        clearApprovalBinding(reimbursementId);
+    }
+
+    private void clearApprovalBinding(Long reimbursementId) {
         int rows = finReimbursementMapper.update(
                 null,
                 Wrappers.<FinReimbursement>lambdaUpdate()
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/service/impl/EnterpriseNewsServiceImpl.java b/src/main/java/com/ruoyi/collaborativeApproval/service/impl/EnterpriseNewsServiceImpl.java
index 19b16ad..2d89e2c 100644
--- a/src/main/java/com/ruoyi/collaborativeApproval/service/impl/EnterpriseNewsServiceImpl.java
+++ b/src/main/java/com/ruoyi/collaborativeApproval/service/impl/EnterpriseNewsServiceImpl.java
@@ -9,6 +9,7 @@
 import com.ruoyi.approve.pojo.ApprovalInstance;
 import com.ruoyi.approve.pojo.ApprovalTask;
 import com.ruoyi.approve.pojo.ApprovalTemplate;
+import com.ruoyi.approve.service.ApprovalInstanceService;
 import com.ruoyi.approve.utils.ApproveProcessConfigNodeUtils;
 import com.ruoyi.basic.enums.ApplicationTypeEnum;
 import com.ruoyi.basic.enums.RecordTypeEnum;
@@ -72,6 +73,7 @@
     private final SysDeptMapper sysDeptMapper;
     private final SysUserDeptMapper sysUserDeptMapper;
     private final ApprovalInstanceMapper approvalInstanceMapper;
+    private final ApprovalInstanceService approvalInstanceService;
     private final ApprovalTemplateMapper approvalTemplateMapper;
     private final ApproveProcessConfigNodeUtils approveProcessConfigNodeUtils;
     private final ISysNoticeService sysNoticeService;
@@ -160,6 +162,7 @@
         saveReadScopeRelations(enterpriseNews.getId(), readScope, deptIds, userIds);
         fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.ENTERPRISE_NEWS, enterpriseNews.getId(), enterpriseNewsDto.getStorageBlobDTOs());
         if (STATUS_PENDING.equals(enterpriseNews.getStatus())) {
+            resetEnterpriseNewsApprovalFlow(oldEnterpriseNews);
             startEnterpriseNewsApproval(enterpriseNews, enterpriseNewsDto);
         }
         return true;
@@ -318,6 +321,24 @@
                 .eq(EnterpriseNewsScopeUser::getNewsId, newsId));
     }
 
+    private void resetEnterpriseNewsApprovalFlow(EnterpriseNews oldEnterpriseNews) {
+        if (oldEnterpriseNews == null || !STATUS_DRAFT.equals(oldEnterpriseNews.getStatus())) {
+            return;
+        }
+        List<Long> approvalInstanceIds = approvalInstanceMapper.selectList(new LambdaQueryWrapper<ApprovalInstance>()
+                        .eq(ApprovalInstance::getBusinessId, oldEnterpriseNews.getId())
+                        .eq(ApprovalInstance::getBusinessType, TypeEnums.ENTERPRISE_NEWS_APPROVAL.getCode())
+                        .eq(ApprovalInstance::getDeleted, (byte) 0))
+                .stream()
+                .map(ApprovalInstance::getId)
+                .filter(id -> id != null && id > 0)
+                .collect(Collectors.toList());
+        if (StringUtils.isEmpty(approvalInstanceIds)) {
+            return;
+        }
+        approvalInstanceService.delete(approvalInstanceIds);
+    }
+
     private List<Long> distinctIds(List<Long> ids) {
         if (StringUtils.isEmpty(ids)) {
             return new ArrayList<>();
diff --git a/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java b/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
index ab27019..8eb5334 100644
--- a/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
+++ b/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
@@ -39,7 +39,7 @@
      * @return
      */
     @GetMapping("/listPage")
-    public AjaxResult staffOnJobListPage(Page page, StaffOnJob staffOnJob) {
+    public AjaxResult staffOnJobListPage(Page page, StaffOnJobDto staffOnJob) {
         return AjaxResult.success(staffOnJobService.staffOnJobListPage(page, staffOnJob));
     }
 
diff --git a/src/main/java/com/ruoyi/staff/dto/StaffOnJobDto.java b/src/main/java/com/ruoyi/staff/dto/StaffOnJobDto.java
index 0a2c0ae..69fdbe8 100644
--- a/src/main/java/com/ruoyi/staff/dto/StaffOnJobDto.java
+++ b/src/main/java/com/ruoyi/staff/dto/StaffOnJobDto.java
@@ -25,4 +25,6 @@
     @JsonFormat(pattern = "yyyy-MM-dd")
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     private Date contractEndTime;
+
+    private Long sysDeptId;
 }
diff --git a/src/main/java/com/ruoyi/staff/mapper/StaffOnJobMapper.java b/src/main/java/com/ruoyi/staff/mapper/StaffOnJobMapper.java
index de8a3c0..7cad87f 100644
--- a/src/main/java/com/ruoyi/staff/mapper/StaffOnJobMapper.java
+++ b/src/main/java/com/ruoyi/staff/mapper/StaffOnJobMapper.java
@@ -14,7 +14,7 @@
 @Mapper
 public interface StaffOnJobMapper extends BaseMapper<StaffOnJob> {
 
-    IPage<StaffOnJobDto> staffOnJobListPage(Page page, @Param("staffOnJob") StaffOnJob staffOnJob);
+    IPage<StaffOnJobDto> staffOnJobListPage(Page page, @Param("staffOnJob") StaffOnJobDto staffOnJob);
 
     List<StaffOnJobDto> staffOnJobList(@Param("staffOnJob") StaffOnJob staffOnJob);
 
@@ -42,4 +42,4 @@
      * @return 鍛樺伐鏁版嵁
      */
     StaffOnJob selectStaffByNickName(String staffName);
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java b/src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java
index a859d14..46588d1 100644
--- a/src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java
+++ b/src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java
@@ -14,7 +14,7 @@
 public interface IStaffOnJobService extends IService<StaffOnJob> {
 
 
-    IPage<StaffOnJobDto> staffOnJobListPage(Page page, StaffOnJob staffOnJob);
+    IPage<StaffOnJobDto> staffOnJobListPage(Page page, StaffOnJobDto staffOnJob);
 
      StaffOnJobDto staffOnJobDetail(Long id);
 
diff --git a/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
index 7c11041..1f20da2 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
+++ b/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
@@ -7,6 +7,7 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.dto.WordDateDto;
 import com.ruoyi.project.system.domain.SysDept;
@@ -67,8 +68,9 @@
 
     //鍦ㄨ亴鍛樺伐鍙拌处鍒嗛〉鏌ヨ
     @Override
-    public IPage<StaffOnJobDto> staffOnJobListPage(Page page, StaffOnJob staffOnJob) {
-        return staffOnJobMapper.staffOnJobListPage(page,staffOnJob);
+    public IPage<StaffOnJobDto> staffOnJobListPage(Page page, StaffOnJobDto staffOnJob) {
+        IPage<StaffOnJobDto> staffOnJobDtoIPage = staffOnJobMapper.staffOnJobListPage(page, staffOnJob);
+        return staffOnJobDtoIPage;
     }
 
     //鏂板鍏ヨ亴
@@ -83,6 +85,7 @@
         }
 
         // 鍒涘缓鍏ヨ亴鏁版嵁
+        syncStudyInfoFromEducation(staffOnJobPrams);
         staffOnJobPrams.setContractExpireTime(staffOnJobPrams.getContractEndTime());
         staffOnJobPrams.setStaffState(1);
         staffOnJobMapper.insert(staffOnJobPrams);
@@ -141,6 +144,7 @@
         // 缁戝畾瀛愯〃鏁版嵁
         bingingStaffOnJobExtra(id,staffOnJobParams);
         // 鏇存柊鍛樺伐鏁版嵁
+        syncStudyInfoFromEducation(staffOnJobParams);
         staffOnJobParams.setContractExpireTime(staffOnJobParams.getContractEndTime());
         return staffOnJobMapper.updateById(staffOnJobParams);
     }
@@ -158,6 +162,7 @@
                     .forEach(staff -> staff.setStaffOnJobId(id)); // 璧嬪��
             staffEducationService.saveBatch(staffOnJobPrams.getStaffEducationList());
         }
+
         // 鏂板宸ヤ綔缁忓巻
         if(CollectionUtils.isNotEmpty(staffOnJobPrams.getStaffWorkExperienceList())){
             staffOnJobPrams.getStaffWorkExperienceList().stream()
@@ -174,6 +179,28 @@
         }
     }
 
+    private void syncStudyInfoFromEducation(StaffOnJob staffOnJobPrams) {
+        if (staffOnJobPrams == null || CollectionUtils.isEmpty(staffOnJobPrams.getStaffEducationList())) {
+            if (staffOnJobPrams != null) {
+                staffOnJobPrams.setFirstStudy("/");
+                staffOnJobPrams.setProfession("/");
+            }
+            return;
+        }
+        Optional<StaffEducation> matchedEducation = staffOnJobPrams.getStaffEducationList().stream()
+                .filter(Objects::nonNull)
+                .filter(education -> StringUtils.isNotEmpty(education.getMajor()))
+                .findFirst();
+        if (matchedEducation.isPresent()) {
+            StaffEducation education = matchedEducation.get();
+            staffOnJobPrams.setFirstStudy(education.getEducation());
+            staffOnJobPrams.setProfession(education.getMajor());
+            return;
+        }
+        staffOnJobPrams.setFirstStudy("/");
+        staffOnJobPrams.setProfession("/");
+    }
+
 
     /**
      * 閫氳繃鍛樺伐id鍒犻櫎鏁欒偛缁忓巻锛屽伐浣滅粡鍘嗭紝绱ф�ヨ仈绯讳汉
diff --git a/src/main/resources/mapper/approve/ApprovalInstanceMapper.xml b/src/main/resources/mapper/approve/ApprovalInstanceMapper.xml
index 6b47daa..612f457 100644
--- a/src/main/resources/mapper/approve/ApprovalInstanceMapper.xml
+++ b/src/main/resources/mapper/approve/ApprovalInstanceMapper.xml
@@ -39,14 +39,18 @@
                 and ai. template_id = #{ew.templateId}
             </if>
             <if test="ew.businessType != null ">
-                and ai. business_type = #{ew.businessType}
+                and ai.business_type = #{ew.businessType}
             </if>
-            <if test="ew.createTime != null">
-                and ai.create_time between to_date(#{ew.createTimeStart}) and to_date(#{ew.createTimeEnd})
+            <if test="ew.createTimeStart != null and ew.createTimeEnd != null">
+                and ai.apply_time &gt;= #{ew.createTimeStart}
+                and ai.apply_time &lt;= #{ew.createTimeEnd}
             </if>
             <if test="ew.status != null">
                 and ai.status = #{ew.status}
             </if>
+            <if test="ew.applicantName != null and ew.applicantName !=''">
+                and ai.applicant_name = #{ew.applicantName}
+            </if>
         </where>
         order by ai.id desc
     </select>
diff --git a/src/main/resources/mapper/approve/FinReimbursementMapper.xml b/src/main/resources/mapper/approve/FinReimbursementMapper.xml
index 75ca038..72756c4 100644
--- a/src/main/resources/mapper/approve/FinReimbursementMapper.xml
+++ b/src/main/resources/mapper/approve/FinReimbursementMapper.xml
@@ -48,8 +48,12 @@
             <if test="ew.applicantName != null and ew.applicantName != ''">
                 and applicant_name like concat('%',#{ew.applicantName},'%')
             </if>
-            <if test="ew.createTimeStart != null and ew.createTimeStart !=''">
-                and create_time between to_date(#{ew.createTimeStart}) and to_date(#{ew.createTimeEnd})
+            <if test="ew.applicantCode != null and ew.applicantCode != ''">
+                and applicant_code like concat('%',#{ew.applicantCode},'%')
+            </if>
+            <if test="ew.createTimeStart != null and ew.createTimeStart !='' and ew.createTimeEnd != null and ew.createTimeEnd != ''">
+                and create_time &gt;= #{ew.createTimeStart}
+                and create_time &lt;= #{ew.createTimeEnd}
             </if>
         </where>
     </select>
diff --git a/src/main/resources/mapper/staff/StaffOnJobMapper.xml b/src/main/resources/mapper/staff/StaffOnJobMapper.xml
index a256ff8..2cbd1dc 100644
--- a/src/main/resources/mapper/staff/StaffOnJobMapper.xml
+++ b/src/main/resources/mapper/staff/StaffOnJobMapper.xml
@@ -3,29 +3,82 @@
 <mapper namespace="com.ruoyi.staff.mapper.StaffOnJobMapper">
     <select id="staffOnJobListPage" resultType="com.ruoyi.staff.dto.StaffOnJobDto">
         SELECT
-        staff_on_job.*,
-        sp.post_name as postName,
-        sd.dept_name as deptName,
-        MIN(t1.contract_start_time) as contract_start_time,  -- 鍙栨渶鏃╁悎鍚屽紑濮嬫椂闂�
-        MAX(t1.contract_end_time) as contract_end_time
+        staff_on_job.id,
+        staff_on_job.staff_state,
+        staff_on_job.staff_no,
+        staff_on_job.staff_name,
+        staff_on_job.sex,
+        staff_on_job.native_place,
+        staff_on_job.sys_post_id,
+        staff_on_job.sys_dept_id,
+        staff_on_job.role_id,
+        staff_on_job.adress,
+        staff_on_job.first_study,
+        staff_on_job.profession,
+        staff_on_job.identity_card,
+        staff_on_job.age,
+        staff_on_job.phone,
+        staff_on_job.contract_term,
+        staff_on_job.contract_expire_time,
+        staff_on_job.trial_end_date,
+        staff_on_job.trial_start_date,
+        staff_on_job.sign_date,
+        staff_on_job.salary_select,
+        staff_on_job.pro_salary,
+        staff_on_job.date_select,
+        staff_on_job.remark,
+        staff_on_job.create_time,
+        staff_on_job.create_user,
+        staff_on_job.update_time,
+        staff_on_job.update_user,
+        staff_on_job.tenant_id,
+        staff_on_job.alias,
+        staff_on_job.birth_date,
+        staff_on_job.nation,
+        staff_on_job.marital_status,
+        staff_on_job.pro_term,
+        staff_on_job.positive_date,
+        staff_on_job.basic_salary,
+        staff_on_job.dept_id,
+        sp.post_name AS post_name,
+        sd.dept_name AS dept_name,
+        MIN(t1.contract_start_time) AS contract_start_time,
+        MAX(t1.contract_end_time) AS contract_end_time,
+        (
+        SELECT GROUP_CONCAT(sec.contact_name SEPARATOR ',')
+        FROM staff_emergency_contact sec
+        WHERE sec.staff_on_job_id = staff_on_job.id
+        ) AS emergency_contact,
+        (
+        SELECT GROUP_CONCAT(sec.contact_phone SEPARATOR ',')
+        FROM staff_emergency_contact sec
+        WHERE sec.staff_on_job_id = staff_on_job.id
+        ) AS emergency_contact_phone
         FROM staff_on_job
         LEFT JOIN sys_post sp ON sp.post_id = staff_on_job.sys_post_id
         LEFT JOIN sys_dept sd ON sd.dept_id = staff_on_job.sys_dept_id
-        LEFT JOIN staff_contract as t1 ON t1.staff_on_job_id = staff_on_job.id
-        WHERE 1=1
-        <if test="staffOnJob.staffState != null">
-            AND staff_state = #{staffOnJob.staffState}
-        </if>
-        <if test="staffOnJob.staffName != null and staffOnJob.staffName != '' ">
-            AND staff_name LIKE CONCAT('%',#{staffOnJob.staffName},'%')
-        </if>
-        <if test="staffOnJob.entryDateStart != null and staffOnJob.entryDateStart != '' ">
-            AND contract_expire_time &gt;= DATE_FORMAT(#{staffOnJob.entryDateStart},'%Y-%m-%d')
-        </if>
-        <if test="staffOnJob.entryDateEnd != null and staffOnJob.entryDateEnd != '' ">
-            AND contract_expire_time &lt;= DATE_FORMAT(#{staffOnJob.entryDateEnd},'%Y-%m-%d')
-        </if>
+        LEFT JOIN staff_contract AS t1 ON t1.staff_on_job_id = staff_on_job.id
+        <where>
+            <if test="staffOnJob.staffState != null">
+                AND staff_on_job.staff_state = #{staffOnJob.staffState}
+            </if>
+            <if test="staffOnJob.staffName != null and staffOnJob.staffName != '' ">
+                AND staff_on_job.staff_name LIKE CONCAT('%',#{staffOnJob.staffName},'%')
+            </if>
+            <if test="staffOnJob.entryDateStart != null and staffOnJob.entryDateStart != '' ">
+                AND staff_on_job.contract_expire_time &gt;= DATE_FORMAT(#{staffOnJob.entryDateStart},'%Y-%m-%d')
+            </if>
+            <if test="staffOnJob.entryDateEnd != null and staffOnJob.entryDateEnd != '' ">
+                AND staff_on_job.contract_expire_time &lt;= DATE_FORMAT(#{staffOnJob.entryDateEnd},'%Y-%m-%d')
+            </if>
+            <if test="staffOnJob.sysDeptId != null">
+                AND staff_on_job.sys_dept_id = #{staffOnJob.sysDeptId}
+            </if>
+        </where>
         GROUP BY staff_on_job.id
+        <if test="staffOnJob.contractStartTime != null">
+            HAVING MIN(t1.contract_start_time) = #{staffOnJob.contractStartTime}
+        </if>
     </select>
     <select id="staffOnJobList" resultType="com.ruoyi.staff.dto.StaffOnJobDto">
         SELECT

--
Gitblit v1.9.3