ouyj преди 4 месеца
родител
ревизия
6b8c717127

+ 47 - 2
ygtx-gxt/src/main/java/com/ygtx/gxt/domain/GxtWorkOrder.java

@@ -202,7 +202,7 @@ public class GxtWorkOrder extends BaseEntity
 //    @Excel(name = "许可人")
     private String permitterName;
 
-    /** 评分状态(to_self-待自评,to_re-待复评,to_confirm-待确认,to_final-待终评,to_archive-待归档,archived-已归档) */
+    /** 评分状态(to_self-待自评,to_re-待复评,to_confirm-待确认,to_final-待终评,to_archive-待归档,archived-已归档,appealing-申诉中) */
     private String scoringStatus;
     
     /** 复评次数 */
@@ -248,7 +248,7 @@ public class GxtWorkOrder extends BaseEntity
     /** 反馈理由 */
     private String feedbackReason;
 
-    /** 确认状态(0-未确认,1-确认,2-已反馈) */
+    /** 确认状态(0-未确认,1-确认,2-已反馈,3-已申诉) */
     private Integer confirmStatus;
 
     /** 外委人员数 */
@@ -267,6 +267,19 @@ public class GxtWorkOrder extends BaseEntity
     @Excel(name = "工作票编号")
     private String workPermitNum;
 
+    /** 申诉人用户ID */
+    private Long appealUserId;
+
+    /** 申诉人姓名 */
+    private String appealUserName;
+
+    /** 申诉时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    private Date appealTime;
+
+    /** 申诉理由 */
+    private String appealReason;
+
     public void setId(Long id)
     {
         this.id = id;
@@ -864,6 +877,38 @@ public class GxtWorkOrder extends BaseEntity
         this.workPermitNum = workPermitNum;
     }
 
+    public Long getAppealUserId() {
+        return appealUserId;
+    }
+
+    public void setAppealUserId(Long appealUserId) {
+        this.appealUserId = appealUserId;
+    }
+
+    public String getAppealUserName() {
+        return appealUserName;
+    }
+
+    public void setAppealUserName(String appealUserName) {
+        this.appealUserName = appealUserName;
+    }
+
+    public Date getAppealTime() {
+        return appealTime;
+    }
+
+    public void setAppealTime(Date appealTime) {
+        this.appealTime = appealTime;
+    }
+
+    public String getAppealReason() {
+        return appealReason;
+    }
+
+    public void setAppealReason(String appealReason) {
+        this.appealReason = appealReason;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

+ 1 - 1
ygtx-gxt/src/main/java/com/ygtx/gxt/domain/GxtWorkOrderFlow.java

@@ -28,7 +28,7 @@ public class GxtWorkOrderFlow extends BaseEntity
     @Excel(name = "工单编码")
     private String orderCode;
 
-    /** 操作类型:create-创建,assign-派单,accept-接单,process-处理,pause-暂停,suspend-挂起,restart-重启,approve-审批,complete-完成, ,selfRating-工单自评 ,reviewRating-工单复评,finalRating-工单终评 ,confirmRating-评分确认 ,feedbackRating-评分反馈  */
+    /** 操作类型:create-创建,assign-派单,accept-接单,process-处理,pause-暂停,suspend-挂起,restart-重启,approve-审批,complete-完成, ,selfRating-工单自评 ,reviewRating-工单复评,finalRating-工单终评 ,confirmRating-评分确认 ,feedbackRating-评分反馈,appealRating-评分申诉  */
     @Excel(name = "操作类型", readConverterExp = "create=创建,assign=派单,accept=接单,process=处理,pause=暂停,suspend=挂起,restart=重启,approve=审批,complete=完成")
     private String actionType;
 

+ 168 - 36
ygtx-gxt/src/main/java/com/ygtx/gxt/service/impl/GxtOrderScoreServiceImpl.java

@@ -685,12 +685,17 @@ public class GxtOrderScoreServiceImpl implements IGxtOrderScoreService {
                 order.setItemCompletionFactor(orderScoreInfo.getItemCompletionFactor());
                 order.setModifyReason(orderScoreInfo.getModifyReason());
                 order.setReviewScoreNum(orderScoreInfo.getReviewScoreNum());
-                if(orderScoreInfo.getReviewScoreNum() == 1){
+                /*if(orderScoreInfo.getReviewScoreNum() == 1){
                     order.setScoringStatus("to_confirm");
                 }else if(orderScoreInfo.getReviewScoreNum() == 2){
                     order.setScoringStatus("to_final");
+                }*/
+                if(oldOrder.getRestartTime() != null){
+                    order.setScoringStatus("archived");
+                    order.setWorkOrderStatus("archived");
+                }else{
+                    order.setScoringStatus("to_archive");
                 }
-
                 // 计算复评总分并设置到工单对象
                 if (orderScoreInfo.getScorePersonList() != null) {
                     double totalScore = orderScoreInfo.getScorePersonList().stream()
@@ -709,6 +714,7 @@ public class GxtOrderScoreServiceImpl implements IGxtOrderScoreService {
                         GxtWorkOrderPerson workPerson = new GxtWorkOrderPerson();
                         workPerson.setId(person.getId());
                         workPerson.setReviewScore(person.getReviewScore());
+                        workPerson.setScore(person.getReviewScore() != null ? BigDecimal.valueOf(person.getReviewScore()) : null);
                         personList.add(workPerson);
                     }
                     gxtWorkOrderService.updateWorkOrderPersonList(personList);
@@ -728,7 +734,22 @@ public class GxtOrderScoreServiceImpl implements IGxtOrderScoreService {
                 flow.setActionTime(DateUtils.getNowDate());
                 flow.setActionRemark("提交复评");
                 gxtWorkOrderFlowService.insertGxtWorkOrderFlow(flow);
-
+                if("archived".equals(order.getWorkOrderStatus())){
+                    // 添加归档流程记录
+                    flow = new GxtWorkOrderFlow();
+                    flow.setOrderId(order.getId());
+                    flow.setOrderCode(orderScoreInfo.getWorkOrderProjectNo());
+                    flow.setActionType("archive");
+                    flow.setFromStatus("to_archive");
+                    flow.setToStatus("archived");
+                    flow.setOperatorId(1L); // 系统自动操作,使用系统用户ID
+                    flow.setOperatorName("系统自动");
+                    flow.setActionTime(DateUtils.getNowDate());
+                    flow.setActionRemark("系统自动归档工单");
+                    gxtWorkOrderFlowService.insertGxtWorkOrderFlow(flow);
+                }
+                // 更新月度统计数据
+                updateMonthlyScoreData(orderScoreInfo);
                 return result;
             }
             return 0;
@@ -886,7 +907,7 @@ public class GxtOrderScoreServiceImpl implements IGxtOrderScoreService {
                 }
                 
                 // 更新月度统计数据
-                updateMonthlyScoreData(orderScoreInfo);
+                updateMonthlyScoreDataForFinalEval(orderScoreInfo);
                 
                 return 1;
             }
@@ -1324,8 +1345,31 @@ public class GxtOrderScoreServiceImpl implements IGxtOrderScoreService {
                     }
                 }
             } else if (orderScoreInfo.getOrderType() == 2) {
-                // 维保工单保持不变
-                updateMonthlyScoreData(orderScoreInfo);
+                // 维保工单
+                GxtWorkOrder order = gxtWorkOrderService.selectGxtWorkOrderById(orderScoreInfo.getId());
+                // 获取工单完成时间所在的月份
+                if (order.getCreateTime() != null) {
+                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+                    String monthPeriod = sdf.format(order.getCreateTime());
+
+                    // 获取场站ID
+                    Long deptId = order.getPcsStationPid();
+
+                    // 获取月度统计信息
+                    GxtMonthScore queryScore = new GxtMonthScore();
+                    queryScore.setDeptId(deptId);
+                    queryScore.setMonthPeriod(monthPeriod);
+                    List<GxtMonthScore> scoreList = gxtMonthScoreService.selectGxtMonthScoreList(queryScore);
+                    GxtMonthScore monthScore = null;
+                    if (!scoreList.isEmpty()) {
+                        monthScore = scoreList.get(0);
+                    }
+
+                    if (monthScore != null) {
+                        // 仅更新用户评分统计(基于reviewScore和finalScore的差值)
+                        updateUserScoresForFinalEval(monthScore, order);
+                    }
+                }
             }
         } catch (Exception e) {
             e.printStackTrace();
@@ -1383,7 +1427,60 @@ public class GxtOrderScoreServiceImpl implements IGxtOrderScoreService {
             e.printStackTrace();
         }
     }
-    
+
+    /**
+     * 更新用户评分统计(终评专用版本,基于reviewScore和finalScore的差值)- 维保工单版本
+     * @param monthScore 月度统计信息
+     * @param order 工单对象
+     */
+    private void updateUserScoresForFinalEval(GxtMonthScore monthScore, GxtWorkOrder order) {
+        try {
+            // 获取参与该工单的所有人员(当前数据库中的最新数据)
+            List<GxtWorkOrderPerson> orderPersons = gxtWorkOrderService.selectWorkOrderPersonListByOrderId(order.getId());
+
+            // 获取现有的用户评分统计列表
+            GxtUserScore queryUserScore = new GxtUserScore();
+            queryUserScore.setMonthScoreId(monthScore.getId());
+            List<GxtUserScore> userScores = gxtUserScoreService.selectGxtUserScoreList(queryUserScore);
+
+            if (userScores != null && !orderPersons.isEmpty()) {
+                // 遍历工单中的每个人员
+                for (GxtWorkOrderPerson orderPerson : orderPersons) {
+                    // 计算差值:finalScore - reviewScore
+                    Double reviewScore = orderPerson.getReviewScore() != null ? orderPerson.getReviewScore() : 0.0;
+                    Double finalScore = orderPerson.getFinalScore() != null ? orderPerson.getFinalScore() : 0.0;
+                    BigDecimal scoreDiff = new BigDecimal(String.valueOf(finalScore - reviewScore));
+
+                    // 在月度统计中查找该用户
+                    for (GxtUserScore userScore : userScores) {
+                        // 使用userName进行匹配
+                        if (orderPerson.getNickName() != null && orderPerson.getNickName().equals(userScore.getUserName())) {
+                            // 更新用户得分(加上差值)
+                            BigDecimal currentMaintenanceTotalScore = (userScore.getMaintenanceTotalScore() != null) ?
+                                    userScore.getMaintenanceTotalScore() : BigDecimal.ZERO;
+
+                            userScore.setMaintenanceTotalScore(currentMaintenanceTotalScore.add(scoreDiff));
+
+                            // 更新最终评分
+                            BigDecimal repairTotalScore = (userScore.getRepairTotalScore() != null) ?
+                                    userScore.getRepairTotalScore() : BigDecimal.ZERO;
+
+                            BigDecimal finalScoreTotal = repairTotalScore.add(currentMaintenanceTotalScore).add(scoreDiff);
+                            userScore.setFinalScore(finalScoreTotal);
+                            userScore.setUpdateBy(SecurityUtils.getUsername());
+                            userScore.setUpdateTime(new Date());
+                            // 更新用户评分统计
+                            gxtUserScoreService.updateGxtUserScore(userScore);
+                            break;
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
     /**
      * 保存确认信息
      *
@@ -1547,35 +1644,70 @@ public class GxtOrderScoreServiceImpl implements IGxtOrderScoreService {
     @Transactional
     public int appeal(OrderScoreInfo orderScoreInfo) {
         try {
-            GxtRepairOrder order = gxtRepairOrderService.selectGxtRepairOrderById(orderScoreInfo.getId());
-
-            // 更新工单状态为申诉中
-            GxtRepairOrder updateOrder = new GxtRepairOrder();
-            updateOrder.setId(orderScoreInfo.getId());
-            updateOrder.setConfirmStatus(3); // 使用confirmStatus字段标记为已申诉(值为3)
-            updateOrder.setAppealReason(orderScoreInfo.getAppealReason());
-            updateOrder.setScoringStatus("appealing"); // 申诉中状态
-            updateOrder.setAppealUserId(SecurityUtils.getUserId());
-            updateOrder.setAppealUserName(SecurityUtils.getLoginUser().getUser().getNickName());
-            updateOrder.setAppealTime(DateUtils.getNowDate());
-            int result = gxtRepairOrderService.updateGxtRepairOrderForScore(updateOrder);
-
-            // 添加工单流转记录
-            GxtRepairOrderFlow flow = new GxtRepairOrderFlow();
-            flow.setOrderId(orderScoreInfo.getId());
-            flow.setOrderCode(order.getWorkOrderProjectNo());
-            flow.setActionType("appealRating");
-            flow.setFromStatus(order.getWorkOrderStatus());
-            flow.setToStatus(order.getWorkOrderStatus());
-            flow.setFromScoreStatus(order.getScoringStatus());
-            flow.setToScoreStatus("appealing");
-            flow.setOperatorId(SecurityUtils.getUserId());
-            flow.setOperatorName(SecurityUtils.getLoginUser().getUser().getNickName());
-            flow.setActionTime(DateUtils.getNowDate());
-            flow.setActionRemark("发起申诉:" + orderScoreInfo.getAppealReason());
-            repairOrderFlowService.insertGxtRepairOrderFlow(flow);
-
-            return result;
+            if (orderScoreInfo.getOrderType() == 1) {
+                // 维修工单申诉
+                GxtRepairOrder order = gxtRepairOrderService.selectGxtRepairOrderById(orderScoreInfo.getId());
+
+                // 更新工单状态为申诉中
+                GxtRepairOrder updateOrder = new GxtRepairOrder();
+                updateOrder.setId(orderScoreInfo.getId());
+                updateOrder.setConfirmStatus(3); // 使用confirmStatus字段标记为已申诉(值为3)
+                updateOrder.setAppealReason(orderScoreInfo.getAppealReason());
+                updateOrder.setScoringStatus("appealing"); // 申诉中状态
+                updateOrder.setAppealUserId(SecurityUtils.getUserId());
+                updateOrder.setAppealUserName(SecurityUtils.getLoginUser().getUser().getNickName());
+                updateOrder.setAppealTime(DateUtils.getNowDate());
+                int result = gxtRepairOrderService.updateGxtRepairOrderForScore(updateOrder);
+
+                // 添加工单流转记录
+                GxtRepairOrderFlow flow = new GxtRepairOrderFlow();
+                flow.setOrderId(orderScoreInfo.getId());
+                flow.setOrderCode(order.getWorkOrderProjectNo());
+                flow.setActionType("appealRating");
+                flow.setFromStatus(order.getWorkOrderStatus());
+                flow.setToStatus(order.getWorkOrderStatus());
+                flow.setFromScoreStatus(order.getScoringStatus());
+                flow.setToScoreStatus("appealing");
+                flow.setOperatorId(SecurityUtils.getUserId());
+                flow.setOperatorName(SecurityUtils.getLoginUser().getUser().getNickName());
+                flow.setActionTime(DateUtils.getNowDate());
+                flow.setActionRemark("发起申诉:" + orderScoreInfo.getAppealReason());
+                repairOrderFlowService.insertGxtRepairOrderFlow(flow);
+
+                return result;
+            } else if (orderScoreInfo.getOrderType() == 2) {
+                // 维保工单申诉
+                GxtWorkOrder order = gxtWorkOrderService.selectGxtWorkOrderById(orderScoreInfo.getId());
+
+                // 更新工单状态为申诉中
+                GxtWorkOrder updateOrder = new GxtWorkOrder();
+                updateOrder.setId(orderScoreInfo.getId());
+                updateOrder.setConfirmStatus(3); // 使用confirmStatus字段标记为已申诉(值为3)
+                updateOrder.setAppealReason(orderScoreInfo.getAppealReason());
+                updateOrder.setScoringStatus("appealing"); // 申诉中状态
+                updateOrder.setAppealUserId(SecurityUtils.getUserId());
+                updateOrder.setAppealUserName(SecurityUtils.getLoginUser().getUser().getNickName());
+                updateOrder.setAppealTime(DateUtils.getNowDate());
+                int result = gxtWorkOrderService.updateGxtWorkOrderForScore(updateOrder);
+
+                // 添加工单流转记录
+                GxtWorkOrderFlow flow = new GxtWorkOrderFlow();
+                flow.setOrderId(orderScoreInfo.getId());
+                flow.setOrderCode(order.getWorkOrderProjectNo());
+                flow.setActionType("appealRating");
+                flow.setFromStatus(order.getWorkOrderStatus());
+                flow.setToStatus(order.getWorkOrderStatus());
+                flow.setFromScoreStatus(order.getScoringStatus());
+                flow.setToScoreStatus("appealing");
+                flow.setOperatorId(SecurityUtils.getUserId());
+                flow.setOperatorName(SecurityUtils.getLoginUser().getUser().getNickName());
+                flow.setActionTime(DateUtils.getNowDate());
+                flow.setActionRemark("发起申诉:" + orderScoreInfo.getAppealReason());
+                gxtWorkOrderFlowService.insertGxtWorkOrderFlow(flow);
+
+                return result;
+            }
+            return 0;
         } catch (Exception e) {
             throw new RuntimeException("发起申诉失败:" + e.getMessage(), e);
         }

+ 22 - 1
ygtx-gxt/src/main/resources/mapper/gxt/GxtWorkOrderMapper.xml

@@ -74,6 +74,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="infoEntry"    column="info_entry"    />
         <result property="lostPower"    column="lost_power"    />
         <result property="workPermitNum"    column="work_permit_num"    />
+        <result property="appealUserId"    column="appeal_user_id"    />
+        <result property="appealUserName"    column="appeal_user_name"    />
+        <result property="appealTime"    column="appeal_time"    />
+        <result property="appealReason"    column="appeal_reason"    />
     </resultMap>
 
     <resultMap type="GxtOrderData" id="GxtOrderDataResult">
@@ -112,7 +116,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                content, real_content, fault_code, fault_desc, order_type, priority_type, score, review_content, issuer_name,
                permitter_name, scoring_status, t.create_by, t.create_time, t.update_by, t.update_time, t.remark, t.attachment_urls,
                item_completion_factor, item_completion_factor_sum, review_score_num, final_coefficient, is_deferred, invalid_reason, feedback_reason, confirm_status,
-               wwry_num, wlry_num, info_entry, lost_power, work_permit_num
+               wwry_num, wlry_num, info_entry, lost_power, work_permit_num, appeal_user_id, appeal_user_name, appeal_time, appeal_reason
         from gxt_work_order t
          left join sys_user u on u.user_name = t.create_by
          left join sys_dept d on u.dept_id = d.dept_id
@@ -242,6 +246,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="infoEntry != null and infoEntry != ''">info_entry,</if>
             <if test="lostPower != null">lost_power,</if>
             <if test="workPermitNum != null and workPermitNum != ''">work_permit_num,</if>
+            <if test="appealUserId != null">appeal_user_id,</if>
+            <if test="appealUserName != null and appealUserName != ''">appeal_user_name,</if>
+            <if test="appealTime != null">appeal_time,</if>
+            <if test="appealReason != null and appealReason != ''">appeal_reason,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="workOrderProjectNo != null and workOrderProjectNo != ''">#{workOrderProjectNo},</if>
@@ -310,6 +318,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="infoEntry != null and infoEntry != ''">#{infoEntry},</if>
             <if test="lostPower != null">#{lostPower},</if>
             <if test="workPermitNum != null and workPermitNum != ''">#{workPermitNum},</if>
+            <if test="appealUserId != null">#{appealUserId},</if>
+            <if test="appealUserName != null and appealUserName != ''">#{appealUserName},</if>
+            <if test="appealTime != null">#{appealTime},</if>
+            <if test="appealReason != null and appealReason != ''">#{appealReason},</if>
          </trim>
     </insert>
 
@@ -402,6 +414,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="infoEntry != null and infoEntry != ''">info_entry = #{infoEntry},</if>
             <if test="lostPower != null">lost_power = #{lostPower},</if>
             <if test="workPermitNum != null and workPermitNum != ''">work_permit_num = #{workPermitNum},</if>
+            <if test="appealUserId != null">appeal_user_id = #{appealUserId},</if>
+            <if test="appealUserName != null and appealUserName != ''">appeal_user_name = #{appealUserName},</if>
+            <if test="appealTime != null">appeal_time = #{appealTime},</if>
+            <if test="appealReason != null and appealReason != ''">appeal_reason = #{appealReason},</if>
         </trim>
         where id = #{id}
     </update>
@@ -509,6 +525,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             t1.update_by,
             t1.update_time,
             t1.remark,
+            t1.work_permit_num,
+            t1.appeal_user_id,
+            t1.appeal_user_name,
+            t1.appeal_time,
+            t1.appeal_reason,
             t2.id as person_id,
             t2.user_id as person_user_id,
             t2.nick_name as person_nick_name,

+ 23 - 18
ygtx-ui/src/views/gxt/orderScore/index.vue

@@ -596,6 +596,7 @@
     <!-- 终评对话框 -->
     <el-dialog :title="finalEvaluationForm.orderType === 1 ? '维修工单终评' : '维保工单终评'" v-model="finalEvaluationDialogVisible" width="800px" append-to-body>
       <el-form ref="finalEvaluationRef" :model="finalEvaluationForm" :rules="finalEvaluationRules" label-width="120px" label-position="top">
+<!--
         <template v-if="finalEvaluationForm.orderType === 2" >
           <el-row :gutter="20">
             <el-col :span="8">
@@ -674,7 +675,7 @@
               </el-form-item>
             </el-col>
           </el-row>
-          <!-- 维保工单保持原有样式 -->
+          &lt;!&ndash; 维保工单保持原有样式 &ndash;&gt;
           <el-form-item label="得分明细">
             <el-table :data="finalEvaluationForm.scorePersonList" border style="width: 100%;">
               <el-table-column label="检修员" align="center" prop="nickName"  style="width: 50%;">
@@ -704,6 +705,7 @@
             </el-table>
           </el-form-item>
         </template>
+-->
 
 <!--        <el-form-item v-if="finalEvaluationForm.orderType === 1 && finalEvaluationForm.feedbackReason" label="反馈理由" prop="feedbackReason">
           <el-input
@@ -713,8 +715,8 @@
               disabled
           />
         </el-form-item>-->
-        <!-- 维修工单终评界面添加标签页 -->
-        <el-tabs v-if="finalEvaluationForm.orderType === 1" v-model="activeFinalEvalTab">
+        <!-- 工单终评界面添加标签页 -->
+        <el-tabs v-model="activeFinalEvalTab">
           <el-tab-pane label="终评信息" name="evaluation">
             <el-row :gutter="20">
               <el-col :span="8">
@@ -1058,8 +1060,9 @@
         
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="发生时间">
-              <el-input v-model="appealForm.occurTime" disabled />
+            <el-form-item :label="appealForm.orderType === 1 ? '发生时间' : '创建时间'">
+              <el-input v-if="appealForm.orderType === 1" v-model="appealForm.occurTime" disabled />
+              <el-input v-else v-model="appealForm.createTime" disabled />
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -1268,17 +1271,16 @@ function getDictLabel(dictOptions, value) {
 
 // 判断是否可以选择并发起申诉
 const canAppeal = computed(() => {
-  // 只有当选择了且仅选择了一个维修工单,并且该工单状态为"待归档"或"已归档"时才允许发起申诉
+  // 只有当选择了且仅选择了一个工单,并且该工单状态为"待归档"或"已归档"时才允许发起申诉
   if (ids.value.length !== 1) return false;
   
   const selectedOrder = orderScoreList.value.find(item => item.id === ids.value[0]);
   if (!selectedOrder) return false;
   
-  // 只有维修工单(orderType=1)才能发起申诉
-  if (selectedOrder.orderType !== 1) return false;
-  
+  // 维修工单和维保工单都可以发起申诉
   // 只有待归档(to_archive)或已归档(archived)状态才能发起申诉
-  return selectedOrder.scoringStatus === 'to_archive' || selectedOrder.scoringStatus === 'archived';
+  return (selectedOrder.orderType === 1 || selectedOrder.orderType === 2) && 
+         (selectedOrder.scoringStatus === 'to_archive' || selectedOrder.scoringStatus === 'archived');
 });
 
 onMounted(() => {
@@ -2015,9 +2017,9 @@ function handleAppeal() {
     return;
   }
   
-  // 检查是否为维修工单
-  if (selectedOrder.orderType !== 1) {
-    proxy.$modal.msgError("只有维修工单才能发起申诉");
+  // 检查工单类型是否为维修工单或维保工单
+  if (selectedOrder.orderType !== 1 && selectedOrder.orderType !== 2) {
+    proxy.$modal.msgError("只有维修工单或维保工单才能发起申诉");
     return;
   }
   
@@ -2029,8 +2031,8 @@ function handleAppeal() {
   
   // 检查申诉时效性(本月工单或上月工单延期5天)
   const now = new Date();
-  //const orderEndDate = new Date(selectedOrder.realEndTime);
-  const orderEndDate = new Date(selectedOrder.occurTime);
+  // 维修工单使用 occurTime,维保工单使用 createTime
+  const orderEndDate = new Date(selectedOrder.orderType === 1 ? selectedOrder.occurTime : selectedOrder.createTime);
 
   // 当前月份和年份
   const currentYear = now.getFullYear();
@@ -2090,14 +2092,17 @@ function handleAppeal() {
       workOrderProjectNo: selectedOrder.workOrderProjectNo,
       pcsDeviceName: selectedOrder.pcsDeviceName,
       pcsStationName: selectedOrder.pcsStationName,
-      occurTime: proxy.parseTime(selectedOrder.realEndTime, '{y}-{m}-{d} {h}:{i}'),
+      occurTime: selectedOrder.orderType === 1 ? 
+        proxy.parseTime(selectedOrder.occurTime, '{y}-{m}-{d} {h}:{i}') : 
+        undefined,
+      createTime: selectedOrder.orderType === 2 ? 
+        proxy.parseTime(selectedOrder.createTime, '{y}-{m}-{d} {h}:{i}') : 
+        undefined,
       originalScore: getReviewerScore(data),
       appealReason: '',
       wwryNum: data.wwryNum,
       wlryNum: data.wlryNum,
     };
-    
-    // 显示申诉对话框
     appealDialogVisible.value = true;
   });
 }