Ver código fonte

新增维保工单人员导入

HD_wangm 5 meses atrás
pai
commit
8c8cf58b3d

+ 27 - 0
ygtx-gxt/src/main/java/com/ygtx/gxt/controller/GxtWorkOrderPersonController.java

@@ -1,6 +1,8 @@
 package com.ygtx.gxt.controller;
 
 import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.web.multipart.MultipartFile;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -123,6 +125,31 @@ public class GxtWorkOrderPersonController extends BaseController
         return toAjax(gxtWorkOrderPersonService.deleteGxtWorkOrderPersonByIds(ids));
     }
 
+    /**
+     * 下载人员导入模板
+     */
+    @PostMapping("/importTemplate")
+    public void importTemplate(HttpServletResponse response)
+    {
+        ExcelUtil<GxtWorkOrderPerson> util = new ExcelUtil<GxtWorkOrderPerson>(GxtWorkOrderPerson.class);
+        util.importTemplateExcel(response, "工单人员数据");
+    }
+
+    /**
+     * 导入工单人员数据
+     */
+    @PreAuthorize("@ss.hasPermi('gxt:maintenance:order:import')")
+    @Log(title = "工单人员", businessType = BusinessType.IMPORT)
+    @PostMapping("/importData")
+    public AjaxResult importData(MultipartFile file) throws Exception
+    {
+        ExcelUtil<GxtWorkOrderPerson> util = new ExcelUtil<GxtWorkOrderPerson>(GxtWorkOrderPerson.class);
+        List<GxtWorkOrderPerson> personList = util.importExcel(file.getInputStream());
+        String message = gxtWorkOrderPersonService.importGxtWorkOrderPerson(personList);
+        return success(message);
+    }
+
+
     /**
      * 根据工单ID删除工作组员
      */

+ 34 - 4
ygtx-gxt/src/main/java/com/ygtx/gxt/domain/GxtWorkOrderPerson.java

@@ -21,7 +21,7 @@ public class GxtWorkOrderPerson extends BaseEntity
     private Long id;
 
     /** 用户ID */
-    @Excel(name = "用户ID")
+//    @Excel(name = "用户ID")
     private Long userId;
 
     /** 姓名 */
@@ -29,17 +29,25 @@ public class GxtWorkOrderPerson extends BaseEntity
     private String nickName;
 
     /** 工单ID */
-    @Excel(name = "工单ID")
+//    @Excel(name = "工单ID")
     private Long orderId;
 
     /** 工单编号 */
-    @Excel(name = "工单编号")
+//    @Excel(name = "工单编号")
     private String orderCode;
 
     /** 状态 */
-    @Excel(name = "状态")
+//    @Excel(name = "状态")
     private Integer status;
 
+    /** MIS系统编号 */
+    @Excel(name = "MIS系统编号")
+    private String misNo;
+
+    /** 用户账号 */
+    @Excel(name = "用户账号")
+    private String userName;
+
     public void setId(Long id)
     {
         this.id = id;
@@ -100,6 +108,26 @@ public class GxtWorkOrderPerson extends BaseEntity
         return status;
     }
 
+    public void setMisNo(String misNo)
+    {
+        this.misNo = misNo;
+    }
+
+    public String getMisNo()
+    {
+        return misNo;
+    }
+
+    public void setUserName(String userName)
+    {
+        this.userName = userName;
+    }
+
+    public String getUserName()
+    {
+        return userName;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
@@ -109,6 +137,8 @@ public class GxtWorkOrderPerson extends BaseEntity
             .append("orderId", getOrderId())
             .append("orderCode", getOrderCode())
             .append("status", getStatus())
+            .append("misNo", getMisNo())
+            .append("userName", getUserName())
             .append("createBy", getCreateBy())
             .append("createTime", getCreateTime())
             .append("updateBy", getUpdateBy())

+ 8 - 0
ygtx-gxt/src/main/java/com/ygtx/gxt/mapper/GxtWorkOrderMapper.java

@@ -78,4 +78,12 @@ public interface GxtWorkOrderMapper {
      * @return 超时工单集合
      */
     public List<GxtWorkOrder> selectExpiredWorkOrders(@Param("status") String status, @Param("thresholdDate") Date thresholdDate);
+
+    /**
+     * 根据MIS系统编号查询维保工单
+     *
+     * @param misNo MIS系统编号
+     * @return 维保工单
+     */
+    public GxtWorkOrder selectGxtWorkOrderByMisNo(String misNo);
 }

+ 8 - 0
ygtx-gxt/src/main/java/com/ygtx/gxt/service/IGxtWorkOrderPersonService.java

@@ -84,4 +84,12 @@ public interface IGxtWorkOrderPersonService
      * @return 结果
      */
     public int insertBatchGxtWorkOrderPerson(Long orderId, String orderCode, List<GxtWorkOrderPerson> personList);
+
+    /**
+     * 从文件中导入工单人员
+     *
+     * @param personList Excel转换的人员列表
+     * @return 结果
+     */
+    public String importGxtWorkOrderPerson(List<GxtWorkOrderPerson> personList);
 }

+ 79 - 26
ygtx-gxt/src/main/java/com/ygtx/gxt/service/impl/GxtWorkOrderPersonServiceImpl.java

@@ -2,12 +2,19 @@ package com.ygtx.gxt.service.impl;
 
 import java.util.List;
 import java.util.Date;
+
+import com.ygtx.common.exception.ServiceException;
+import com.ygtx.common.utils.SecurityUtils;
+import com.ygtx.gxt.domain.GxtWorkOrder;
+import com.ygtx.gxt.mapper.GxtWorkOrderMapper;
+import com.ygtx.gxt.mapper.GxtWorkOrderPersonMapper;
+import com.ygtx.gxt.service.IGxtWorkOrderPersonService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.ygtx.gxt.domain.GxtWorkOrderPerson;
-import com.ygtx.gxt.mapper.GxtWorkOrderPersonMapper;
-import com.ygtx.gxt.service.IGxtWorkOrderPersonService;
-import com.ygtx.common.utils.SecurityUtils;
+import com.ygtx.common.exception.ServiceException;
+import com.ygtx.common.utils.StringUtils;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * 工单工作组员Service业务层处理
@@ -16,11 +23,13 @@ import com.ygtx.common.utils.SecurityUtils;
  * @date 2025-10-29
  */
 @Service
-public class GxtWorkOrderPersonServiceImpl implements IGxtWorkOrderPersonService 
-{
+public class GxtWorkOrderPersonServiceImpl implements IGxtWorkOrderPersonService {
     @Autowired
     private GxtWorkOrderPersonMapper gxtWorkOrderPersonMapper;
 
+    @Autowired
+    private GxtWorkOrderMapper gxtWorkOrderMapper;
+
     /**
      * 查询工单工作组员
      *
@@ -28,8 +37,7 @@ public class GxtWorkOrderPersonServiceImpl implements IGxtWorkOrderPersonService
      * @return 工单工作组员
      */
     @Override
-    public GxtWorkOrderPerson selectGxtWorkOrderPersonById(Long id)
-    {
+    public GxtWorkOrderPerson selectGxtWorkOrderPersonById(Long id) {
         return gxtWorkOrderPersonMapper.selectGxtWorkOrderPersonById(id);
     }
 
@@ -40,8 +48,7 @@ public class GxtWorkOrderPersonServiceImpl implements IGxtWorkOrderPersonService
      * @return 工单工作组员
      */
     @Override
-    public List<GxtWorkOrderPerson> selectGxtWorkOrderPersonList(GxtWorkOrderPerson gxtWorkOrderPerson)
-    {
+    public List<GxtWorkOrderPerson> selectGxtWorkOrderPersonList(GxtWorkOrderPerson gxtWorkOrderPerson) {
         return gxtWorkOrderPersonMapper.selectGxtWorkOrderPersonList(gxtWorkOrderPerson);
     }
 
@@ -52,8 +59,7 @@ public class GxtWorkOrderPersonServiceImpl implements IGxtWorkOrderPersonService
      * @return 结果
      */
     @Override
-    public int insertGxtWorkOrderPerson(GxtWorkOrderPerson gxtWorkOrderPerson)
-    {
+    public int insertGxtWorkOrderPerson(GxtWorkOrderPerson gxtWorkOrderPerson) {
         gxtWorkOrderPerson.setCreateTime(new Date());
         gxtWorkOrderPerson.setCreateBy(SecurityUtils.getUsername());
         return gxtWorkOrderPersonMapper.insertGxtWorkOrderPerson(gxtWorkOrderPerson);
@@ -66,8 +72,7 @@ public class GxtWorkOrderPersonServiceImpl implements IGxtWorkOrderPersonService
      * @return 结果
      */
     @Override
-    public int updateGxtWorkOrderPerson(GxtWorkOrderPerson gxtWorkOrderPerson)
-    {
+    public int updateGxtWorkOrderPerson(GxtWorkOrderPerson gxtWorkOrderPerson) {
         gxtWorkOrderPerson.setUpdateTime(new Date());
         gxtWorkOrderPerson.setUpdateBy(SecurityUtils.getUsername());
         return gxtWorkOrderPersonMapper.updateGxtWorkOrderPerson(gxtWorkOrderPerson);
@@ -80,8 +85,7 @@ public class GxtWorkOrderPersonServiceImpl implements IGxtWorkOrderPersonService
      * @return 结果
      */
     @Override
-    public int deleteGxtWorkOrderPersonById(Long id)
-    {
+    public int deleteGxtWorkOrderPersonById(Long id) {
         return gxtWorkOrderPersonMapper.deleteGxtWorkOrderPersonById(id);
     }
 
@@ -92,8 +96,7 @@ public class GxtWorkOrderPersonServiceImpl implements IGxtWorkOrderPersonService
      * @return 结果
      */
     @Override
-    public int deleteGxtWorkOrderPersonByIds(Long[] ids)
-    {
+    public int deleteGxtWorkOrderPersonByIds(Long[] ids) {
         return gxtWorkOrderPersonMapper.deleteGxtWorkOrderPersonByIds(ids);
     }
 
@@ -104,8 +107,7 @@ public class GxtWorkOrderPersonServiceImpl implements IGxtWorkOrderPersonService
      * @return 工作组员集合
      */
     @Override
-    public List<GxtWorkOrderPerson> selectGxtWorkOrderPersonByOrderId(Long orderId)
-    {
+    public List<GxtWorkOrderPerson> selectGxtWorkOrderPersonByOrderId(Long orderId) {
         return gxtWorkOrderPersonMapper.selectGxtWorkOrderPersonByOrderId(orderId);
     }
 
@@ -116,26 +118,24 @@ public class GxtWorkOrderPersonServiceImpl implements IGxtWorkOrderPersonService
      * @return 结果
      */
     @Override
-    public int deleteGxtWorkOrderPersonByOrderId(Long orderId)
-    {
+    public int deleteGxtWorkOrderPersonByOrderId(Long orderId) {
         return gxtWorkOrderPersonMapper.deleteGxtWorkOrderPersonByOrderId(orderId);
     }
 
     /**
      * 批量添加工作组员
      *
-     * @param orderId 工单ID
-     * @param orderCode 工单编码
+     * @param orderId    工单ID
+     * @param orderCode  工单编码
      * @param personList 工作组员列表
      * @return 结果
      */
     @Override
-    public int insertBatchGxtWorkOrderPerson(Long orderId, String orderCode, List<GxtWorkOrderPerson> personList)
-    {
+    public int insertBatchGxtWorkOrderPerson(Long orderId, String orderCode, List<GxtWorkOrderPerson> personList) {
         if (personList == null || personList.isEmpty()) {
             return 0;
         }
-        
+
         int count = 0;
         for (GxtWorkOrderPerson person : personList) {
             person.setOrderId(orderId);
@@ -144,4 +144,57 @@ public class GxtWorkOrderPersonServiceImpl implements IGxtWorkOrderPersonService
         }
         return count;
     }
+
+    /**
+     * 从文件中导入工单人员
+     *
+     * @param personList Excel转换的人员列表
+     * @return 结果
+     */
+    @Override
+    @Transactional
+    public String importGxtWorkOrderPerson(List<GxtWorkOrderPerson> personList) {
+        if (StringUtils.isNull(personList) || personList.size() == 0) {
+            throw new ServiceException("导入工单人员数据不能为空!");
+        }
+        int successNum = 0;
+        int failureNum = 0;
+        int row = 1;
+        StringBuilder successMsg = new StringBuilder();
+        StringBuilder failureMsg = new StringBuilder();
+
+        for (GxtWorkOrderPerson person : personList) {
+            try {
+                row++;
+                if (StringUtils.isEmpty(person.getMisNo())) {
+                    throw new ServiceException("第" + row + "行MIS系统编号不能为空!");
+                }
+
+                // 根据MIS系统编号查询工单
+                GxtWorkOrder workOrder = gxtWorkOrderMapper.selectGxtWorkOrderByMisNo(person.getMisNo());
+                if (workOrder == null) {
+                    throw new ServiceException("第" + row + "行工单不存在或MIS编号错误!");
+                }
+
+                // 为该人员设置工单信息
+                person.setOrderId(workOrder.getId());
+                person.setOrderCode(workOrder.getWorkOrderProjectNo());
+
+                // 插入人员记录
+                insertGxtWorkOrderPerson(person);
+                successNum++;
+            } catch (Exception e) {
+                failureNum++;
+                String msg = "<br/>" + failureNum + "、人员导入失败: ";
+                failureMsg.append(msg + e.getMessage());
+            }
+        }
+        if (failureNum > 0) {
+            failureMsg.insert(0, "导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
+            throw new ServiceException(failureMsg.toString());
+        } else {
+            successMsg.insert(0, "数据已全部导入成功!共 " + successNum + " 条");
+        }
+        return successMsg.toString();
+    }
 }

+ 3 - 2
ygtx-gxt/src/main/java/com/ygtx/gxt/service/impl/GxtWorkOrderServiceImpl.java

@@ -1274,13 +1274,14 @@ public class GxtWorkOrderServiceImpl implements IGxtWorkOrderService
         String dateStr = DateUtils.dateTime(DateUtils.getNowDate()).substring(0, 10).replace("-", ""); // YYYYMMDD
         do {
             int randomNum = (int)(Math.random() * 900); // 生成0-999之间的随机数
-            workOrderProjectNo = "WB" + dateStr + randomNum;
+            String formattedNum = String.format("%03d", randomNum);
+            workOrderProjectNo = "WB" + dateStr + formattedNum;
             existingOrder = gxtWorkOrderMapper.selectGxtWorkOrderByCode(workOrderProjectNo);
             retryCount++;
         } while (existingOrder != null && retryCount < maxRetries);
 
         if (existingOrder != null) {
-            throw new ServiceException("无法生成孤立的工单编码,请稍后重试");
+            throw new ServiceException("无法生成工单编码,请稍后重试");
         }
         return workOrderProjectNo;
     }

+ 2 - 1
ygtx-gxt/src/main/java/com/ygtx/gxt/task/GxtWorkOrderScheduledTask.java

@@ -32,7 +32,8 @@ public class GxtWorkOrderScheduledTask
      * 将待归档状态超过3天的工单自动更新为已归档
      * 执行频率:每天凌晨2点执行一次
      */
-    @Scheduled(cron = "0 0 2 * * *")
+//    @Scheduled(cron = "0 0 2 * * *")
+    @Scheduled(cron = "*/30 * * * * *")
     @Transactional
     public void archiveExpiredWorkOrders()
     {

+ 10 - 5
ygtx-gxt/src/main/resources/mapper/gxt/GxtWorkOrderMapper.xml

@@ -287,11 +287,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <!-- 查询会超时的工单(待归档且超时3天) -->
     <select id="selectExpiredWorkOrders" parameterType="GxtWorkOrder" resultMap="GxtWorkOrderResult">
-        select <include refid="selectGxtWorkOrderVo"/>
-        from gxt_work_order
+        <include refid="selectGxtWorkOrderVo"/>
         where work_order_status = #{status}
-        and update_time &lt; #{thresholdDate}
-        and del_flag = 0
-        order by update_time asc
+        and t.update_time &lt; #{thresholdDate}
+        order by t.update_time asc
+    </select>
+
+    <!-- 根据MIS系统编号查询维保工单 -->
+    <select id="selectGxtWorkOrderByMisNo" parameterType="String" resultMap="GxtWorkOrderResult">
+        <include refid="selectGxtWorkOrderVo"/>
+        where mis_no = #{misNo}
+        limit 1
     </select>
 </mapper>

+ 10 - 1
ygtx-gxt/src/main/resources/mapper/gxt/GxtWorkOrderPersonMapper.xml

@@ -11,6 +11,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="orderId"    column="order_id"    />
         <result property="orderCode"    column="order_code"    />
         <result property="status"    column="status"    />
+        <result property="misNo"    column="mis_no"    />
+        <result property="userName"    column="user_name"    />
         <result property="createBy"    column="create_by"    />
         <result property="createTime"    column="create_time"    />
         <result property="updateBy"    column="update_by"    />
@@ -19,7 +21,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 
     <sql id="selectGxtWorkOrderPersonVo">
-        select id, user_id, nick_name, order_id, order_code, status, create_by, create_time, update_by, update_time, remark
+        select id, user_id, nick_name, order_id, order_code, status, mis_no, user_name, create_by, create_time, update_by, update_time, remark
         from gxt_work_order_person
     </sql>
 
@@ -31,6 +33,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="orderId != null"> and order_id = #{orderId}</if>
             <if test="orderCode != null  and orderCode != ''"> and order_code like concat('%', #{orderCode}, '%')</if>
             <if test="status != null"> and status = #{status}</if>
+            <if test="misNo != null  and misNo != ''"> and mis_no like concat('%', #{misNo}, '%')</if>
         </where>
         order by create_time desc
     </select>
@@ -54,6 +57,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="orderId != null">order_id,</if>
             <if test="orderCode != null">order_code,</if>
             <if test="status != null">status,</if>
+            <if test="misNo != null">mis_no,</if>
+            <if test="userName != null">user_name,</if>
             <if test="createBy != null">create_by,</if>
             <if test="createTime != null">create_time,</if>
             <if test="updateBy != null">update_by,</if>
@@ -66,6 +71,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="orderId != null">#{orderId},</if>
             <if test="orderCode != null">#{orderCode},</if>
             <if test="status != null">#{status},</if>
+            <if test="misNo != null">#{misNo},</if>
+            <if test="userName != null">#{userName},</if>
             <if test="createBy != null">#{createBy},</if>
             <if test="createTime != null">#{createTime},</if>
             <if test="updateBy != null">#{updateBy},</if>
@@ -82,6 +89,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="orderId != null">order_id = #{orderId},</if>
             <if test="orderCode != null">order_code = #{orderCode},</if>
             <if test="status != null">status = #{status},</if>
+            <if test="misNo != null">mis_no = #{misNo},</if>
+            <if test="userName != null">user_name = #{userName},</if>
             <if test="createBy != null">create_by = #{createBy},</if>
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="updateBy != null">update_by = #{updateBy},</if>

+ 18 - 0
ygtx-ui/src/api/gxt/gxtOrder.js

@@ -200,6 +200,24 @@ export function importGxtOrder(data) {
   })
 }
 
+// 导入工单人员数据
+export function importGxtWorkOrderPersonFromExcel(data) {
+  return request({
+    url: '/gxt/workOrderPerson/importData',
+    method: 'post',
+    data: data
+  })
+}
+
+// 导入工单人员数据(根据MIS编号)
+export function importGxtWorkOrderPerson(data) {
+  return request({
+    url: '/gxt/workOrderPerson/import',
+    method: 'post',
+    data: data
+  })
+}
+
 // 下载维保工单导入模板
 export function importTemplate() {
   return request({

+ 193 - 54
ygtx-ui/src/views/gxt/gxtOrder/index.vue

@@ -29,12 +29,52 @@
         </el-select>
       </el-form-item>
       <el-form-item label="维保中心" prop="gxtCenter" label-position="top">
-        <el-input
+        <el-select
             v-model="queryParams.gxtCenter"
-            placeholder="请输入维保中心"
+            placeholder="请选择维保中心"
             clearable
-            @keyup.enter="handleQuery"
-        />
+            @change="handleMaintenanceCenterChange"
+        >
+          <el-option
+              v-for="item in maintenanceCenterOptions"
+              :key="item.deptId"
+              :label="item.deptName"
+              :value="item.deptName">
+          </el-option>
+        </el-select>
+      </el-form-item>
+<!--      <el-form-item label="维保中心" prop="gxtCenter" label-position="top">-->
+<!--        <el-input-->
+<!--            v-model="queryParams.gxtCenter"-->
+<!--            placeholder="请输入维保中心"-->
+<!--            clearable-->
+<!--            @keyup.enter="handleQuery"-->
+<!--        />-->
+<!--      </el-form-item>-->
+      <el-form-item label="场站" prop="pcsStationName" label-position="top">
+        <el-select
+            v-model="queryParams.pcsStationName"
+            placeholder="请选择场站"
+            clearable
+            :disabled="!queryParams.gxtCenter"
+        >
+          <el-option
+              v-for="item in stationOptions"
+              :key="item.deptId"
+              :label="item.deptName"
+              :value="item.deptName">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="工单状态" prop="workOrderStatus" label-position="top">
+        <el-select v-model="queryParams.workOrderStatus" placeholder="请选择工单状态" clearable>
+          <el-option
+              v-for="dict in gxt_work_order_status"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+          />
+        </el-select>
       </el-form-item>
     </el-form>
     <div style="float: right;">
@@ -65,9 +105,17 @@
         <el-button
           type="info"
           icon="Upload"
-          @click="handleImport"
+          @click="handleImport('order')"
           v-hasPermi="['gxt:maintenance:order:import']"
-        >导入</el-button>
+        >工单导入</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="info"
+            icon="Upload"
+            @click="handleImport('person')"
+            v-hasPermi="['gxt:maintenance:order:import']"
+        >工单人员导入</el-button>
       </el-col>
 <!--      <el-col :span="1.5">-->
 <!--        <el-button-->
@@ -1143,6 +1191,26 @@
         </div>
       </template>
     </el-dialog>
+
+    <!-- 工单人员导入对话框 -->
+    <el-dialog :title="personUpload.title" v-model="personUpload.open" width="400px" append-to-body>
+      <el-upload ref="personUploadRef" :limit="1" accept=".xlsx, .xls" :headers="personUpload.headers" :action="personUpload.url" :disabled="personUpload.isUploading" :on-progress="handlePersonFileUploadProgress" :on-success="handlePersonFileSuccess" :on-change="handlePersonFileChange" :on-remove="handlePersonFileRemove" :auto-upload="false" drag>
+        <el-icon class="el-icon--upload"><upload-filled /></el-icon>
+        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+        <template #tip>
+          <div class="el-upload__tip text-center">
+            <span>仅允许导入xls、xlsx格式文件。</span>
+            <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="importPersonTemplate">下载模板</el-link>
+          </div>
+        </template>
+      </el-upload>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitPersonFileForm">确 定</el-button>
+          <el-button @click="personUpload.open = false">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
@@ -1171,11 +1239,14 @@ import {
   approveWorkOrder,
   uploadAttachments,
   importGxtOrder,
+  importGxtWorkOrderPerson,
+  importGxtWorkOrderPersonFromExcel,
   // importTemplate
 } from "@/api/gxt/gxtOrder"
 import { listUser } from "@/api/system/user"
 import {getToken} from "@/utils/auth.js";
 import {getRepairOrder} from "@/api/gxt/repairOrder.js";
+import {listMaintenanceCenters, listStationsByMaintenanceCenter} from "@/api/gxt/equipment.js";
 
 const { proxy } = getCurrentInstance()
 const {
@@ -1216,6 +1287,9 @@ const restartDialogVisible = ref(false)
 const userList = ref([])
 const flowList = ref([])
 const detailData = ref({})
+// 维保中心和场站选项
+const maintenanceCenterOptions = ref([])
+const stationOptions = ref([])
 // 在 data 部分添加
 const fileUploadRef = ref(null)
 
@@ -1234,6 +1308,21 @@ const upload = reactive({
   url: import.meta.env.VITE_APP_BASE_API + "/gxt/order/importData"
 })
 
+const personUpload = reactive({
+  // 是否显示弹出层(人员导入)
+  open: false,
+  // 弹出层标题(人员导入)
+  title: "",
+  // 是否禁用上传
+  isUploading: false,
+  // 选中的文件
+  selectedFile: null,
+  // 设置上传的请求头部
+  headers: { Authorization: "Bearer " + getToken() },
+  // 上传的地址
+  url: import.meta.env.VITE_APP_BASE_API + "/gxt/workOrderPerson/importData"
+})
+
 const data = reactive({
   form: {},
   queryParams: {
@@ -1423,6 +1512,32 @@ const data = reactive({
 const { queryParams, form, rules, assignForm, assignRules, suspendForm, suspendRules, pauseForm, pauseRules, startForm,
   resumeForm, completeForm, finishForm, rateForm, rateRules, approveForm, approveRules, acceptForm, acceptRules, finishRules, restartForm, restartRules } = toRefs(data)
 
+onMounted(() => {
+  getList()
+  getMaintenanceCenterAndStationList()
+  // getGetMisDataConfig() // 获取配置参数
+  window.addEventListener('resize', handleResize)
+})
+
+function getMaintenanceCenterAndStationList() {
+  listMaintenanceCenters().then(response => {
+    maintenanceCenterOptions.value = response.data.map(item => {
+      return { deptName: item, deptId: item };
+    });
+
+    // 如果已选择维保中心,则筛选出该维保中心下的场站
+    if (queryParams.value.maintenanceCenter) {
+      listStationsByMaintenanceCenter(queryParams.value.maintenanceCenter).then(res => {
+        stationOptions.value = res.data.map(item => {
+          return { deptName: item, deptId: item };
+        });
+      });
+    } else {
+      // 如果未选择维保中心,则清空场站选项
+      stationOptions.value = [];
+    }
+  });
+}
 /** 查询维保工单列表 */
 function getList() {
   loading.value = true
@@ -1905,50 +2020,6 @@ function submitPause() {
   })
 }
 
-/** 流转记录 */
-function handleFlow(row) {
-  getWorkOrderFlow(row.id).then(response => {
-    flowList.value = response.data
-    flowDialogVisible.value = true
-  })
-}
-
-/** 处理文件选择 */
-function handleFileSelect(files) {
-  // const files = event.target.files
-  debugger
-  if (files && files.length > 0) {
-    for (let i = 0; i < files.length; i++) {
-      finishForm.value.attachments.push({
-        fileName: files[i].name,
-        filePath: files[i].url,
-      })
-    }
-  }
-  // 清空 input 以便重新上传相同文件
-  // event.target.value = ''
-}
-
-/** 获取文件类型图标 */
-function getFileIconClass(fileName) {
-  if (!fileName) return 'fa-file-o'
-  const extension = fileName.split('.').pop().toLowerCase()
-  const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp']
-  const videoExtensions = ['mp4', 'avi', 'mov', 'mkv', 'flv', 'wmv']
-
-  if (imageExtensions.includes(extension)) {
-    return 'fa-file-image-o'
-  } else if (videoExtensions.includes(extension)) {
-    return 'fa-file-video-o'
-  }
-  return 'fa-file-o'
-}
-
-/** 删除文件 */
-function removeFile(index) {
-  finishForm.value.attachments.splice(index, 1)
-}
-
 /** 审批挂起申请 */
 function handleApprove(row) {
   getGxtOrder(row.id).then(response => {
@@ -2040,10 +2111,16 @@ const handleFileUploadProgress = (event, file, fileList) => {
 }
 
 /** 片段导入按點操作 */
-function handleImport() {
-  upload.title = "工单导入"
-  upload.open = true
-  upload.selectedFile = null
+function handleImport(type) {
+  if (type === 'person') {
+    personUpload.title = "人员导入"
+    personUpload.open = true
+    personUpload.selectedFile = null
+  } else {
+    upload.title = "工单导入"
+    upload.open = true
+    upload.selectedFile = null
+  }
 }
 
 /** 清理模板操作 */
@@ -2052,6 +2129,12 @@ function importTemplate() {
   }, `gxtOrder_template_${new Date().getTime()}.xlsx`)
 }
 
+/** 清理模板操作 */
+function importPersonTemplate() {
+  proxy.download("gxt/workOrderPerson/importTemplate", {
+  }, `gxtOrderPerson_template_${new Date().getTime()}.xlsx`)
+}
+
 /**文件上传中处理 */
 const handleFileChange = (file, fileList) => {
   upload.selectedFile = file
@@ -2081,6 +2164,40 @@ function submitFileForm() {
   proxy.$refs["uploadRef"].submit()
 }
 
+/** 人员文件上传中处理 */
+const handlePersonFileUploadProgress = (event, file, fileList) => {
+  personUpload.isUploading = true
+}
+
+/** 人员文件选择处理 */
+const handlePersonFileChange = (file, fileList) => {
+  personUpload.selectedFile = file
+}
+
+/** 人员文件删除处理 */
+const handlePersonFileRemove = (file, fileList) => {
+  personUpload.selectedFile = null
+}
+
+/** 人员文件上传成功处理 */
+const handlePersonFileSuccess = (response, file, fileList) => {
+  personUpload.open = false
+  personUpload.isUploading = false
+  proxy.$refs["personUploadRef"].handleRemove(file)
+  proxy.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true })
+  getList()
+}
+
+/** 提交人员文件 */
+function submitPersonFileForm() {
+  const file = personUpload.selectedFile
+  if (!file || file.length === 0 || !file.name.toLowerCase().endsWith('.xls') && !file.name.toLowerCase().endsWith('.xlsx')) {
+    proxy.$modal.msgError("请选择后缀为 \"xls\"或\"xlsx\"的文件。")
+    return
+  }
+  proxy.$refs["personUploadRef"].submit()
+}
+
 /** 导出按點操作 */
 function handleExport() {
   proxy.download('gxt/order/export', {
@@ -2088,6 +2205,28 @@ function handleExport() {
   }, `gxtOrder_${new Date().getTime()}.xlsx`)
 }
 
+function handleMaintenanceCenterChange(selectedCenter) {
+  // 清空场站选择
+  queryParams.value.station = null;
+
+  // 如果选择了维保中心,则加载对应的场站
+  if (selectedCenter) {
+    listStationsByMaintenanceCenter(selectedCenter).then(response => {
+      stationOptions.value = response.data.map(item => {
+        return { deptName: item, deptId: item };
+      });
+    });
+  } else {
+    // 如果未选择维保中心,则清空场站选项
+    stationOptions.value = [];
+  }
+}
+
+// 监听窗口大小变化
+function handleResize() {
+  tableHeight.value = window.innerHeight - 300
+}
+
 getList()
 </script>
 <style scoped>