WXL (wul)
5 天以前 5319d5b95497b5b546947ac340c14c71e5b54ca6
src/views/system/group/index.vue
@@ -5,7 +5,14 @@
      <el-tab-pane label="团队管理" name="team">
        <el-row :gutter="20">
          <el-col :span="24" :xs="24">
            <el-form :model="teamQueryParams" ref="teamQueryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
            <el-form
              :model="teamQueryParams"
              ref="teamQueryForm"
              size="small"
              :inline="true"
              v-show="showSearch"
              label-width="68px"
            >
              <el-form-item label="团队名称" prop="name">
                <el-input
                  v-model="teamQueryParams.name"
@@ -16,7 +23,12 @@
                />
              </el-form-item>
              <el-form-item label="团队状态" prop="status">
                <el-select v-model="teamQueryParams.status" placeholder="请选择状态" clearable style="width: 200px">
                <el-select
                  v-model="teamQueryParams.status"
                  placeholder="请选择状态"
                  clearable
                  style="width: 200px"
                >
                  <el-option
                    v-for="item in teamStatusOptions"
                    :key="item.value"
@@ -26,8 +38,19 @@
                </el-select>
              </el-form-item>
              <el-form-item>
                <el-button type="primary" icon="el-icon-search" size="medium" @click="handleTeamQuery">搜索</el-button>
                <el-button icon="el-icon-refresh" size="medium" @click="resetTeamQuery">重置</el-button>
                <el-button
                  type="primary"
                  icon="el-icon-search"
                  size="medium"
                  @click="handleTeamQuery"
                  >搜索</el-button
                >
                <el-button
                  icon="el-icon-refresh"
                  size="medium"
                  @click="resetTeamQuery"
                  >重置</el-button
                >
              </el-form-item>
            </el-form>
@@ -39,56 +62,104 @@
                  icon="el-icon-plus"
                  size="medium"
                  @click="handleTeamAdd"
                >新增团队</el-button>
                  >新增团队</el-button
                >
              </el-col>
            </el-row>
            <el-table v-loading="teamLoading" :data="filteredTeamList" @selection-change="handleTeamSelectionChange">
            <el-table
              v-loading="teamLoading"
              :data="filteredTeamList"
              @selection-change="handleTeamSelectionChange"
            >
              <el-table-column type="selection" width="50" align="center" />
              <el-table-column label="团队ID" align="center" prop="id" width="80" />
              <el-table-column label="团队名称" align="center" prop="name" :show-overflow-tooltip="true" />
              <el-table-column label="团队组长" align="center" prop="leader" width="120" />
              <el-table-column label="团队成员" align="center" prop="memberCount" width="100">
  <template slot-scope="scope">
    <el-tag>{{ (scope.row.members || []).length }}人</el-tag>
  </template>
</el-table-column>
              <el-table-column label="创建时间" align="center" prop="createTime" width="160">
              <el-table-column
                label="团队ID"
                align="center"
                prop="id"
                width="80"
              />
              <el-table-column
                label="团队名称"
                align="center"
                prop="name"
                :show-overflow-tooltip="true"
              />
              <el-table-column
                label="团队组长"
                align="center"
                prop="leader"
                width="120"
              />
              <el-table-column
                label="团队成员"
                align="center"
                prop="memberCount"
                width="100"
              >
                <template slot-scope="scope">
                  <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
                  <el-tag>{{ (scope.row.members || []).length }}人</el-tag>
                </template>
              </el-table-column>
              <el-table-column label="团队状态" align="center" prop="status" width="100">
              <el-table-column
                label="创建时间"
                align="center"
                prop="createTime"
                width="160"
              >
                <template slot-scope="scope">
                  <dict-tag :options="teamStatusOptions" :value="scope.row.status"/>
                  <span>{{
                    parseTime(scope.row.createTime, "{y}-{m}-{d}")
                  }}</span>
                </template>
              </el-table-column>
              <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
              <el-table-column
                label="团队状态"
                align="center"
                prop="status"
                width="100"
              >
                <template slot-scope="scope">
                  <dict-tag
                    :options="teamStatusOptions"
                    :value="scope.row.status"
                  />
                </template>
              </el-table-column>
              <el-table-column
                label="操作"
                align="center"
                class-name="small-padding fixed-width"
                width="180"
              >
                <template slot-scope="scope">
                  <el-button
                    size="mini"
                    type="text"
                    icon="el-icon-view"
                    @click="handleTeamDetail(scope.row)"
                  >详情</el-button>
                    >详情</el-button
                  >
                  <el-button
                    size="mini"
                    type="text"
                    icon="el-icon-edit"
                    @click="handleTeamUpdate(scope.row)"
                  >编辑</el-button>
                    >编辑</el-button
                  >
                  <el-button
                    size="mini"
                    type="text"
                    icon="el-icon-delete"
                    @click="handleTeamDelete(scope.row)"
                  >删除</el-button>
                    >删除</el-button
                  >
                </template>
              </el-table-column>
            </el-table>
            <pagination
              v-show="teamTotal>0"
              v-show="teamTotal > 0"
              :total="teamTotal"
              :page.sync="teamQueryParams.pageNum"
              :limit.sync="teamQueryParams.pageSize"
@@ -102,7 +173,14 @@
      <el-tab-pane label="人员分组" name="member">
        <el-row :gutter="20">
          <el-col :span="24" :xs="24">
            <el-form :model="memberQueryParams" ref="memberQueryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
            <el-form
              :model="memberQueryParams"
              ref="memberQueryForm"
              size="small"
              :inline="true"
              v-show="showSearch"
              label-width="68px"
            >
              <el-form-item label="成员姓名" prop="name">
                <el-input
                  v-model="memberQueryParams.name"
@@ -113,7 +191,12 @@
                />
              </el-form-item>
              <el-form-item label="所属团队" prop="teamId">
                <el-select v-model="memberQueryParams.teamId" placeholder="请选择团队" clearable style="width: 200px">
                <el-select
                  v-model="memberQueryParams.teamId"
                  placeholder="请选择团队"
                  clearable
                  style="width: 200px"
                >
                  <el-option
                    v-for="item in teamList"
                    :key="item.id"
@@ -123,7 +206,12 @@
                </el-select>
              </el-form-item>
              <el-form-item label="成员状态" prop="status">
                <el-select v-model="memberQueryParams.status" placeholder="请选择状态" clearable style="width: 200px">
                <el-select
                  v-model="memberQueryParams.status"
                  placeholder="请选择状态"
                  clearable
                  style="width: 200px"
                >
                  <el-option
                    v-for="item in memberStatusOptions"
                    :key="item.value"
@@ -133,8 +221,19 @@
                </el-select>
              </el-form-item>
              <el-form-item>
                <el-button type="primary" icon="el-icon-search" size="medium" @click="handleMemberQuery">搜索</el-button>
                <el-button icon="el-icon-refresh" size="medium" @click="resetMemberQuery">重置</el-button>
                <el-button
                  type="primary"
                  icon="el-icon-search"
                  size="medium"
                  @click="handleMemberQuery"
                  >搜索</el-button
                >
                <el-button
                  icon="el-icon-refresh"
                  size="medium"
                  @click="resetMemberQuery"
                  >重置</el-button
                >
              </el-form-item>
            </el-form>
@@ -146,7 +245,8 @@
                  icon="el-icon-plus"
                  size="medium"
                  @click="handleMemberAdd"
                >新增成员</el-button>
                  >新增成员</el-button
                >
              </el-col>
              <el-col :span="1.5">
                <el-button
@@ -156,50 +256,105 @@
                  size="medium"
                  :disabled="multiple"
                  @click="handleMemberDelete"
                >删除</el-button>
                  >删除</el-button
                >
              </el-col>
            </el-row>
            <el-table v-loading="memberLoading" :data="filteredMemberList" @selection-change="handleMemberSelectionChange">
            <el-table
              v-loading="memberLoading"
              :data="filteredMemberList"
              @selection-change="handleMemberSelectionChange"
            >
              <el-table-column type="selection" width="50" align="center" />
              <el-table-column label="成员ID" align="center" prop="id" width="80" />
              <el-table-column label="成员姓名" align="center" prop="name" :show-overflow-tooltip="true" />
              <el-table-column label="所属团队" align="center" prop="teamName" width="150" />
              <el-table-column label="职位" align="center" prop="position" width="120" />
              <el-table-column label="联系电话" align="center" prop="phone" width="150" />
              <el-table-column label="邮箱" align="center" prop="email" width="200" />
              <el-table-column label="当前工单" align="center" prop="currentWorkOrder" width="120">
              <el-table-column
                label="成员ID"
                align="center"
                prop="id"
                width="80"
              />
              <el-table-column
                label="成员姓名"
                align="center"
                prop="name"
                :show-overflow-tooltip="true"
              />
              <el-table-column
                label="所属团队"
                align="center"
                prop="teamName"
                width="150"
              />
              <el-table-column
                label="职位"
                align="center"
                prop="position"
                width="120"
              />
              <el-table-column
                label="联系电话"
                align="center"
                prop="phone"
                width="150"
              />
              <el-table-column
                label="邮箱"
                align="center"
                prop="email"
                width="200"
              />
              <el-table-column
                label="当前工单"
                align="center"
                prop="currentWorkOrder"
                width="120"
              >
                <template slot-scope="scope">
                  <el-tag :type="scope.row.currentWorkOrder ? '' : 'info'">
                    {{ scope.row.currentWorkOrder || '空闲' }}
                    {{ scope.row.currentWorkOrder || "空闲" }}
                  </el-tag>
                </template>
              </el-table-column>
              <el-table-column label="成员状态" align="center" prop="status" width="100">
              <el-table-column
                label="成员状态"
                align="center"
                prop="status"
                width="100"
              >
                <template slot-scope="scope">
                  <dict-tag :options="memberStatusOptions" :value="scope.row.status"/>
                  <dict-tag
                    :options="memberStatusOptions"
                    :value="scope.row.status"
                  />
                </template>
              </el-table-column>
              <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
              <el-table-column
                label="操作"
                align="center"
                class-name="small-padding fixed-width"
                width="180"
              >
                <template slot-scope="scope">
                  <el-button
                    size="mini"
                    type="text"
                    icon="el-icon-edit"
                    @click="handleMemberUpdate(scope.row)"
                  >编辑</el-button>
                    >编辑</el-button
                  >
                  <el-button
                    size="mini"
                    type="text"
                    icon="el-icon-delete"
                    @click="handleMemberDelete(scope.row)"
                  >删除</el-button>
                    >删除</el-button
                  >
                </template>
              </el-table-column>
            </el-table>
            <pagination
              v-show="memberTotal>0"
              v-show="memberTotal > 0"
              :total="memberTotal"
              :page.sync="memberQueryParams.pageNum"
              :limit.sync="memberQueryParams.pageSize"
@@ -213,7 +368,14 @@
      <el-tab-pane label="工单指派" name="workOrder">
        <el-row :gutter="20">
          <el-col :span="24" :xs="24">
            <el-form :model="workOrderQueryParams" ref="workOrderQueryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
            <el-form
              :model="workOrderQueryParams"
              ref="workOrderQueryForm"
              size="small"
              :inline="true"
              v-show="showSearch"
              label-width="68px"
            >
              <el-form-item label="工单编号" prop="id">
                <el-input
                  v-model="workOrderQueryParams.id"
@@ -224,7 +386,12 @@
                />
              </el-form-item>
              <el-form-item label="工单状态" prop="status">
                <el-select v-model="workOrderQueryParams.status" placeholder="请选择状态" clearable style="width: 200px">
                <el-select
                  v-model="workOrderQueryParams.status"
                  placeholder="请选择状态"
                  clearable
                  style="width: 200px"
                >
                  <el-option
                    v-for="item in workOrderStatusOptions"
                    :key="item.value"
@@ -234,7 +401,12 @@
                </el-select>
              </el-form-item>
              <el-form-item label="处理人" prop="assignee">
                <el-select v-model="workOrderQueryParams.assignee" placeholder="请选择处理人" clearable style="width: 200px">
                <el-select
                  v-model="workOrderQueryParams.assignee"
                  placeholder="请选择处理人"
                  clearable
                  style="width: 200px"
                >
                  <el-option
                    v-for="item in memberList"
                    :key="item.id"
@@ -244,8 +416,19 @@
                </el-select>
              </el-form-item>
              <el-form-item>
                <el-button type="primary" icon="el-icon-search" size="medium" @click="handleWorkOrderQuery">搜索</el-button>
                <el-button icon="el-icon-refresh" size="medium" @click="resetWorkOrderQuery">重置</el-button>
                <el-button
                  type="primary"
                  icon="el-icon-search"
                  size="medium"
                  @click="handleWorkOrderQuery"
                  >搜索</el-button
                >
                <el-button
                  icon="el-icon-refresh"
                  size="medium"
                  @click="resetWorkOrderQuery"
                  >重置</el-button
                >
              </el-form-item>
            </el-form>
@@ -257,64 +440,133 @@
                  icon="el-icon-plus"
                  size="medium"
                  @click="handleWorkOrderAdd"
                >新建工单</el-button>
                  >新建工单</el-button
                >
              </el-col>
            </el-row>
            <el-table v-loading="workOrderLoading" :data="filteredWorkOrderList" @selection-change="handleWorkOrderSelectionChange">
            <el-table
              v-loading="workOrderLoading"
              :data="filteredWorkOrderList"
              @selection-change="handleWorkOrderSelectionChange"
            >
              <el-table-column type="selection" width="50" align="center" />
              <el-table-column label="工单编号" align="center" prop="id" width="120" />
              <el-table-column label="工单标题" align="center" prop="title" :show-overflow-tooltip="true" />
              <el-table-column label="优先级" align="center" prop="priority" width="100">
              <el-table-column
                label="工单编号"
                align="center"
                prop="id"
                width="120"
              />
              <el-table-column
                label="工单标题"
                align="center"
                prop="title"
                :show-overflow-tooltip="true"
              />
              <el-table-column
                label="优先级"
                align="center"
                prop="priority"
                width="100"
              >
                <template slot-scope="scope">
                  <el-tag :type="scope.row.priority === '1' ? 'danger' : scope.row.priority === '2' ? 'warning' : ''">
                    {{ scope.row.priority === '1' ? '高' : scope.row.priority === '2' ? '中' : '低' }}
                  <el-tag
                    :type="
                      scope.row.priority === '1'
                        ? 'danger'
                        : scope.row.priority === '2'
                        ? 'warning'
                        : ''
                    "
                  >
                    {{
                      scope.row.priority === "1"
                        ? "高"
                        : scope.row.priority === "2"
                        ? "中"
                        : "低"
                    }}
                  </el-tag>
                </template>
              </el-table-column>
              <el-table-column label="创建时间" align="center" prop="createTime" width="160">
              <el-table-column
                label="创建时间"
                align="center"
                prop="createTime"
                width="160"
              >
                <template slot-scope="scope">
                  <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
                  <span>{{
                    parseTime(scope.row.createTime, "{y}-{m}-{d}")
                  }}</span>
                </template>
              </el-table-column>
              <el-table-column label="截止时间" align="center" prop="deadline" width="160">
              <el-table-column
                label="截止时间"
                align="center"
                prop="deadline"
                width="160"
              >
                <template slot-scope="scope">
                  <span>{{ parseTime(scope.row.deadline, '{y}-{m}-{d}') }}</span>
                  <span>{{
                    parseTime(scope.row.deadline, "{y}-{m}-{d}")
                  }}</span>
                </template>
              </el-table-column>
              <el-table-column label="处理人" align="center" prop="assigneeName" width="120" />
              <el-table-column label="工单状态" align="center" prop="status" width="120">
              <el-table-column
                label="处理人"
                align="center"
                prop="assigneeName"
                width="120"
              />
              <el-table-column
                label="工单状态"
                align="center"
                prop="status"
                width="120"
              >
                <template slot-scope="scope">
                  <dict-tag :options="workOrderStatusOptions" :value="scope.row.status"/>
                  <dict-tag
                    :options="workOrderStatusOptions"
                    :value="scope.row.status"
                  />
                </template>
              </el-table-column>
              <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
              <el-table-column
                label="操作"
                align="center"
                class-name="small-padding fixed-width"
                width="180"
              >
                <template slot-scope="scope">
                  <el-button
                    size="mini"
                    type="text"
                    icon="el-icon-edit"
                    @click="handleWorkOrderUpdate(scope.row)"
                  >编辑</el-button>
                    >编辑</el-button
                  >
                  <el-button
                    size="mini"
                    type="text"
                    icon="el-icon-delete"
                    @click="handleWorkOrderDelete(scope.row)"
                  >删除</el-button>
                    >删除</el-button
                  >
                  <el-button
                    size="mini"
                    type="text"
                    icon="el-icon-s-promotion"
                    @click="handleAssignWorkOrder(scope.row)"
                    v-if="scope.row.status === '0'"
                  >指派</el-button>
                    >指派</el-button
                  >
                </template>
              </el-table-column>
            </el-table>
            <pagination
              v-show="workOrderTotal>0"
              v-show="workOrderTotal > 0"
              :total="workOrderTotal"
              :page.sync="workOrderQueryParams.pageNum"
              :limit.sync="workOrderQueryParams.pageSize"
@@ -326,19 +578,37 @@
    </el-tabs>
    <!-- 团队详情对话框 -->
    <el-dialog :title="teamDialogTitle" :visible.sync="teamDialogVisible" width="70%" append-to-body>
    <el-dialog
      :title="teamDialogTitle"
      :visible.sync="teamDialogVisible"
      width="70%"
      append-to-body
    >
      <el-descriptions :column="2" border>
        <el-descriptions-item label="团队ID">{{ currentTeam.id }}</el-descriptions-item>
        <el-descriptions-item label="团队名称">{{ currentTeam.name }}</el-descriptions-item>
        <el-descriptions-item label="团队组长">{{ currentTeam.leader }}</el-descriptions-item>
<el-descriptions-item label="团队成员">{{ (currentTeam.members || []).length }}人</el-descriptions-item>        <el-descriptions-item label="创建时间">{{ parseTime(currentTeam.createTime, '{y}-{m}-{d} {h}:{i}') }}</el-descriptions-item>
        <el-descriptions-item label="团队ID">{{
          currentTeam.id
        }}</el-descriptions-item>
        <el-descriptions-item label="团队名称">{{
          currentTeam.name
        }}</el-descriptions-item>
        <el-descriptions-item label="团队组长">{{
          currentTeam.leader
        }}</el-descriptions-item>
        <el-descriptions-item label="团队成员"
          >{{ (currentTeam.members || []).length }}人</el-descriptions-item
        >
        <el-descriptions-item label="创建时间">{{
          parseTime(currentTeam.createTime, "{y}-{m}-{d} {h}:{i}")
        }}</el-descriptions-item>
        <el-descriptions-item label="团队状态">
          <dict-tag :options="teamStatusOptions" :value="currentTeam.status"/>
          <dict-tag :options="teamStatusOptions" :value="currentTeam.status" />
        </el-descriptions-item>
        <el-descriptions-item label="团队描述" :span="2">{{ currentTeam.description || '无' }}</el-descriptions-item>
        <el-descriptions-item label="团队描述" :span="2">{{
          currentTeam.description || "无"
        }}</el-descriptions-item>
      </el-descriptions>
      <div class="team-members" style="margin-top: 20px;">
      <div class="team-members" style="margin-top: 20px">
        <div class="headline">
          <div class="basics">团队成员</div>
        </div>
@@ -351,19 +621,22 @@
          <el-table-column prop="currentWorkOrder" label="当前工单" width="150">
            <template slot-scope="scope">
              <el-tag :type="scope.row.currentWorkOrder ? '' : 'info'">
                {{ scope.row.currentWorkOrder || '空闲' }}
                {{ scope.row.currentWorkOrder || "空闲" }}
              </el-tag>
            </template>
          </el-table-column>
          <el-table-column prop="status" label="成员状态" width="100">
            <template slot-scope="scope">
              <dict-tag :options="memberStatusOptions" :value="scope.row.status"/>
              <dict-tag
                :options="memberStatusOptions"
                :value="scope.row.status"
              />
            </template>
          </el-table-column>
        </el-table>
      </div>
      <div class="team-work-orders" style="margin-top: 20px;">
      <div class="team-work-orders" style="margin-top: 20px">
        <div class="headline">
          <div class="basics">团队工单</div>
        </div>
@@ -373,38 +646,90 @@
          <el-table-column prop="title" label="工单标题" />
          <el-table-column prop="priority" label="优先级" width="100">
            <template slot-scope="scope">
              <el-tag :type="scope.row.priority === '1' ? 'danger' : scope.row.priority === '2' ? 'warning' : ''">
                {{ scope.row.priority === '1' ? '高' : scope.row.priority === '2' ? '中' : '低' }}
              <el-tag
                :type="
                  scope.row.priority === '1'
                    ? 'danger'
                    : scope.row.priority === '2'
                    ? 'warning'
                    : ''
                "
              >
                {{
                  scope.row.priority === "1"
                    ? "高"
                    : scope.row.priority === "2"
                    ? "中"
                    : "低"
                }}
              </el-tag>
            </template>
          </el-table-column>
          <el-table-column prop="assigneeName" label="处理人" width="120" />
          <el-table-column prop="status" label="工单状态" width="120">
            <template slot-scope="scope">
              <dict-tag :options="workOrderStatusOptions" :value="scope.row.status"/>
              <dict-tag
                :options="workOrderStatusOptions"
                :value="scope.row.status"
              />
            </template>
          </el-table-column>
          <el-table-column prop="createTime" label="创建时间" width="160">
            <template slot-scope="scope">
              <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
              <span>{{ parseTime(scope.row.createTime, "{y}-{m}-{d}") }}</span>
            </template>
          </el-table-column>
          <el-table-column prop="deadline" label="截止时间" width="160">
            <template slot-scope="scope">
              <span>{{ parseTime(scope.row.deadline, '{y}-{m}-{d}') }}</span>
              <span>{{ parseTime(scope.row.deadline, "{y}-{m}-{d}") }}</span>
            </template>
          </el-table-column>
        </el-table>
      </div>
      <!-- 在团队详情对话框的团队成员表格后添加二维码区域 -->
      <div class="team-qrcode" style="margin-top: 20px">
        <div class="headline">
          <div class="basics">团队二维码</div>
        </div>
        <el-divider></el-divider>
        <div class="qrcode-container">
          <vue-qr
            :text="teamQRContent"
            :size="200"
            :margin="10"
            colorDark="#409EFF"
            :logoScale="0.2"
            :logoSrc="logoUrl"
          ></vue-qr>
          <div class="qrcode-actions">
            <el-button size="mini" @click="downloadQRCode"
              >下载二维码</el-button
            >
            <el-button size="mini" type="primary" @click="refreshQRCode"
              >刷新</el-button
            >
          </div>
          <p class="qrcode-tip">扫描二维码查看团队信息(有效期24小时)</p>
        </div>
      </div>
      <div slot="footer" class="dialog-footer">
        <el-button @click="teamDialogVisible = false">关 闭</el-button>
      </div>
    </el-dialog>
    <!-- 新增/编辑团队对话框 -->
    <el-dialog :title="teamFormTitle" :visible.sync="teamFormVisible" width="50%" append-to-body>
      <el-form ref="teamForm" :model="teamForm" :rules="teamRules" label-width="80px">
    <el-dialog
      :title="teamFormTitle"
      :visible.sync="teamFormVisible"
      width="50%"
      append-to-body
    >
      <el-form
        ref="teamForm"
        :model="teamForm"
        :rules="teamRules"
        label-width="80px"
      >
        <el-row>
          <el-col :span="24">
            <el-form-item label="团队名称" prop="name">
@@ -430,7 +755,8 @@
                  v-for="dict in teamStatusOptions"
                  :key="dict.value"
                  :label="dict.value"
                >{{dict.label}}</el-radio>
                  >{{ dict.label }}</el-radio
                >
              </el-radio-group>
            </el-form-item>
          </el-col>
@@ -442,14 +768,19 @@
                :titles="['可选成员', '团队成员']"
                :props="{
                  key: 'id',
                  label: 'name'
                  label: 'name',
                }"
              />
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="团队描述" prop="description">
              <el-input type="textarea" :rows="3" v-model="teamForm.description" placeholder="请输入团队描述" />
              <el-input
                type="textarea"
                :rows="3"
                v-model="teamForm.description"
                placeholder="请输入团队描述"
              />
            </el-form-item>
          </el-col>
        </el-row>
@@ -461,17 +792,33 @@
    </el-dialog>
    <!-- 新增/编辑成员对话框 -->
    <el-dialog :title="memberFormTitle" :visible.sync="memberFormVisible" width="50%" append-to-body>
      <el-form ref="memberForm" :model="memberForm" :rules="memberRules" label-width="80px">
    <el-dialog
      :title="memberFormTitle"
      :visible.sync="memberFormVisible"
      width="50%"
      append-to-body
    >
      <el-form
        ref="memberForm"
        :model="memberForm"
        :rules="memberRules"
        label-width="80px"
      >
        <el-row>
          <el-col :span="12">
            <el-form-item label="成员姓名" prop="name">
              <el-input v-model="memberForm.name" placeholder="请输入成员姓名" />
              <el-input
                v-model="memberForm.name"
                placeholder="请输入成员姓名"
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="所属团队" prop="teamId">
              <el-select v-model="memberForm.teamId" placeholder="请选择所属团队">
              <el-select
                v-model="memberForm.teamId"
                placeholder="请选择所属团队"
              >
                <el-option
                  v-for="item in teamList"
                  :key="item.id"
@@ -483,12 +830,18 @@
          </el-col>
          <el-col :span="12">
            <el-form-item label="职位" prop="position">
              <el-input v-model="memberForm.position" placeholder="请输入职位" />
              <el-input
                v-model="memberForm.position"
                placeholder="请输入职位"
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="联系电话" prop="phone">
              <el-input v-model="memberForm.phone" placeholder="请输入联系电话" />
              <el-input
                v-model="memberForm.phone"
                placeholder="请输入联系电话"
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
@@ -503,7 +856,8 @@
                  v-for="dict in memberStatusOptions"
                  :key="dict.value"
                  :label="dict.value"
                >{{dict.label}}</el-radio>
                  >{{ dict.label }}</el-radio
                >
              </el-radio-group>
            </el-form-item>
          </el-col>
@@ -516,17 +870,33 @@
    </el-dialog>
    <!-- 新增/编辑工单对话框 -->
    <el-dialog :title="workOrderFormTitle" :visible.sync="workOrderFormVisible" width="60%" append-to-body>
      <el-form ref="workOrderForm" :model="workOrderForm" :rules="workOrderRules" label-width="80px">
    <el-dialog
      :title="workOrderFormTitle"
      :visible.sync="workOrderFormVisible"
      width="60%"
      append-to-body
    >
      <el-form
        ref="workOrderForm"
        :model="workOrderForm"
        :rules="workOrderRules"
        label-width="80px"
      >
        <el-row>
          <el-col :span="24">
            <el-form-item label="工单标题" prop="title">
              <el-input v-model="workOrderForm.title" placeholder="请输入工单标题" />
              <el-input
                v-model="workOrderForm.title"
                placeholder="请输入工单标题"
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="优先级" prop="priority">
              <el-select v-model="workOrderForm.priority" placeholder="请选择优先级">
              <el-select
                v-model="workOrderForm.priority"
                placeholder="请选择优先级"
              >
                <el-option
                  v-for="item in priorityOptions"
                  :key="item.value"
@@ -549,7 +919,12 @@
          </el-col>
          <el-col :span="24">
            <el-form-item label="工单内容" prop="content">
              <el-input type="textarea" :rows="4" v-model="workOrderForm.content" placeholder="请输入工单内容" />
              <el-input
                type="textarea"
                :rows="4"
                v-model="workOrderForm.content"
                placeholder="请输入工单内容"
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
@@ -559,13 +934,17 @@
                  v-for="dict in workOrderStatusOptions"
                  :key="dict.value"
                  :label="dict.value"
                >{{dict.label}}</el-radio>
                  >{{ dict.label }}</el-radio
                >
              </el-radio-group>
            </el-form-item>
          </el-col>
          <el-col :span="12" v-if="workOrderForm.status === '1'">
            <el-form-item label="处理人" prop="assignee">
              <el-select v-model="workOrderForm.assignee" placeholder="请选择处理人">
              <el-select
                v-model="workOrderForm.assignee"
                placeholder="请选择处理人"
              >
                <el-option
                  v-for="item in memberList"
                  :key="item.id"
@@ -584,13 +963,22 @@
    </el-dialog>
    <!-- 指派工单对话框 -->
    <el-dialog title="指派工单" :visible.sync="assignDialogVisible" width="40%" append-to-body>
    <el-dialog
      title="指派工单"
      :visible.sync="assignDialogVisible"
      width="40%"
      append-to-body
    >
      <el-form :model="assignForm" label-width="80px">
        <el-form-item label="工单标题">
          <el-input v-model="assignForm.title" disabled />
        </el-form-item>
        <el-form-item label="处理人" prop="assignee">
          <el-select v-model="assignForm.assignee" placeholder="请选择处理人" style="width: 100%">
          <el-select
            v-model="assignForm.assignee"
            placeholder="请选择处理人"
            style="width: 100%"
          >
            <el-option
              v-for="item in availableMembers"
              :key="item.id"
@@ -600,7 +988,11 @@
          </el-select>
        </el-form-item>
        <el-form-item label="优先级" prop="priority">
          <el-select v-model="assignForm.priority" placeholder="请选择优先级" style="width: 100%">
          <el-select
            v-model="assignForm.priority"
            placeholder="请选择优先级"
            style="width: 100%"
          >
            <el-option
              v-for="item in priorityOptions"
              :key="item.value"
@@ -628,83 +1020,205 @@
</template>
<script>
import { parseTime } from '@/utils/ruoyi'
import { parseTime } from "@/utils/ruoyi";
import VueQr from "vue-qr";
export default {
  name: "TeamManagement",
  dicts: ['sys_normal_disable', 'sys_user_sex'],
  dicts: ["sys_normal_disable", "sys_user_sex"],
  components: { VueQr },
  data() {
    return {
      // 当前激活的标签页
      activeTab: 'team',
      activeTab: "team",
      // 显示搜索条件
      showSearch: true,
      // 团队管理相关数据
      teamLoading: false,
       multiple: false, // 这里添加
      multiple: false, // 这里添加
      // 替换原有的teamList数据
      teamList: [
        {
          id: 1,
          name: "前端开发团队",
          leader: "张三",
          name: "心血管内科团队",
          leader: "李成白",
          members: [
            { id: 1, name: "张三", position: "前端组长", phone: "13800138001", email: "zhangsan@example.com", currentWorkOrder: "WO20230001", status: "1" },
            { id: 2, name: "李四", position: "高级前端", phone: "13800138002", email: "lisi@example.com", currentWorkOrder: "", status: "1" },
            { id: 3, name: "王五", position: "前端开发", phone: "13800138003", email: "wangwu@example.com", currentWorkOrder: "WO20230002", status: "1" }
            {
              id: 1,
              name: "李成白",
              position: "主任医师",
              phone: "13800138001",
              email: "lichengbai@hospital.com",
              currentWorkOrder: "MED20230001",
              status: "1",
            },
            {
              id: 2,
              name: "刘翊惠",
              position: "副主任医师",
              phone: "13800138002",
              email: "liuyihui@hospital.com",
              currentWorkOrder: "",
              status: "1",
            },
            {
              id: 3,
              name: "张孟涵",
              position: "主治医师",
              phone: "13800138003",
              email: "zhangmenghan@hospital.com",
              currentWorkOrder: "MED20230002",
              status: "1",
            },
            {
              id: 9,
              name: "吴思翰",
              position: "住院医师",
              phone: "13800138009",
              email: "wusihan@hospital.com",
              currentWorkOrder: "",
              status: "1",
            },
          ],
          createTime: "2023-01-15 09:30:00",
          createTime: "2024-01-15 09:30:00",
          status: "1",
          description: "负责公司所有前端项目的开发和维护"
          description: "负责心血管疾病的诊断、治疗和手术,擅长冠心病介入治疗",
        },
        {
          id: 2,
          name: "后端开发团队",
          leader: "赵六",
          name: "肿瘤科治疗团队",
          leader: "陈政倩",
          members: [
            { id: 4, name: "赵六", position: "后端组长", phone: "13800138004", email: "zhaoliu@example.com", currentWorkOrder: "WO20230003", status: "1" },
            { id: 5, name: "钱七", position: "高级后端", phone: "13800138005", email: "qianqi@example.com", currentWorkOrder: "", status: "1" },
            { id: 6, name: "孙八", position: "后端开发", phone: "13800138006", email: "sunba@example.com", currentWorkOrder: "", status: "1" }
            {
              id: 4,
              name: "陈政倩",
              position: "肿瘤科主任",
              phone: "13800138004",
              email: "chenzhengqian@hospital.com",
              currentWorkOrder: "MED20230003",
              status: "1",
            },
            {
              id: 5,
              name: "邓诗涵",
              position: "放疗医师",
              phone: "13800138005",
              email: "dengshihan@hospital.com",
              currentWorkOrder: "",
              status: "1",
            },
            {
              id: 6,
              name: "黄盛玫",
              position: "化疗医师",
              phone: "13800138006",
              email: "huangshengmei@hospital.com",
              currentWorkOrder: "",
              status: "1",
            },
          ],
          createTime: "2023-01-20 14:20:00",
          createTime: "2024-02-10 14:20:00",
          status: "1",
          description: "负责公司所有后端服务的开发和维护"
          description: "专注于肿瘤的综合治疗,包括化疗、放疗和靶向治疗",
        },
        {
          id: 3,
          name: "测试团队",
          leader: "周九",
          name: "儿科诊疗团队",
          leader: "王恩龙",
          members: [
            { id: 7, name: "周九", position: "测试经理", phone: "13800138007", email: "zhoujiu@example.com", currentWorkOrder: "WO20230004", status: "1" },
            { id: 8, name: "吴十", position: "测试工程师", phone: "13800138008", email: "wushi@example.com", currentWorkOrder: "", status: "1" }
            {
              id: 7,
              name: "王恩龙",
              position: "儿科主任",
              phone: "13800138007",
              email: "wagenlong@hospital.com",
              currentWorkOrder: "MED20230004",
              status: "1",
            },
            {
              id: 8,
              name: "朱政廷",
              position: "儿科医师",
              phone: "13800138008",
              email: "zhuzhengting@hospital.com",
              currentWorkOrder: "",
              status: "1",
            },
            {
              id: 10,
              name: "林佩玲",
              position: "儿科护士长",
              phone: "13800138010",
              email: "linpeiling@hospital.com",
              currentWorkOrder: "",
              status: "1",
            },
          ],
          createTime: "2023-02-10 10:15:00",
          createTime: "2024-03-05 10:15:00",
          status: "1",
          description: "负责公司所有项目的测试工作"
        }
          description: "负责儿童常见病、多发病的诊疗和预防保健工作",
        },
        {
          id: 4,
          name: "急诊抢救团队",
          leader: "吴俊伯",
          members: [
            {
              id: 11,
              name: "吴俊伯",
              position: "急诊科主任",
              phone: "13800138011",
              email: "wujunbo@hospital.com",
              currentWorkOrder: "MED20230005",
              status: "1",
            },
            {
              id: 12,
              name: "阮馨学",
              position: "急诊医师",
              phone: "13800138012",
              email: "ruanxinxue@hospital.com",
              currentWorkOrder: "MED20230006",
              status: "1",
            },
            {
              id: 13,
              name: "翁惠珠",
              position: "急诊护士",
              phone: "13800138013",
              email: "wenghuizhu@hospital.com",
              currentWorkOrder: "",
              status: "1",
            },
          ],
          createTime: "2024-03-20 16:45:00",
          status: "1",
          description: "24小时待命,负责急危重症患者的抢救和治疗",
        },
      ],
      teamTotal: 4,
      teamQueryParams: {
        pageNum: 1,
        pageSize: 10,
        name: undefined,
        status: undefined
        status: undefined,
      },
      teamTotal: 3,
      teamStatusOptions: [
        { value: "0", label: "禁用" },
        { value: "1", label: "启用" }
        { value: "1", label: "启用" },
      ],
      teamDialogVisible: false,
      teamDialogTitle: "",
      currentTeam: {
      id: undefined,
      name: undefined,
      leader: undefined,
      members: [],  // 确保有默认空数组
      createTime: undefined,
      status: undefined,
      description: undefined
    },
        id: undefined,
        name: undefined,
        leader: undefined,
        members: [], // 确保有默认空数组
        createTime: undefined,
        status: undefined,
        description: undefined,
      },
      teamFormVisible: false,
      teamFormTitle: "",
      teamForm: {
@@ -713,43 +1227,213 @@
        leader: undefined,
        members: [],
        status: "1",
        description: undefined
        description: undefined,
      },
      teamRules: {
        name: [
          { required: true, message: "团队名称不能为空", trigger: "blur" }
          { required: true, message: "团队名称不能为空", trigger: "blur" },
        ],
        leader: [
          { required: true, message: "团队组长不能为空", trigger: "change" }
          { required: true, message: "团队组长不能为空", trigger: "change" },
        ],
        status: [
          { required: true, message: "团队状态不能为空", trigger: "change" }
        ]
          { required: true, message: "团队状态不能为空", trigger: "change" },
        ],
      },
      // 二维码相关数据
      teamQRContent: "127.0.0.1:8093/wt?p=0BE9L3C2u",
      logoUrl: require("@/assets/logo/logoxh.png"), // 医院logo
      currentQRCodeUrl: "",
      // 人员分组相关数据
      memberLoading: false,
      // 替换原有的memberList数据
      memberList: [
        { id: 1, name: "张三", teamId: 1, teamName: "前端开发团队", position: "前端组长", phone: "13800138001", email: "zhangsan@example.com", currentWorkOrder: "WO20230001", status: "1" },
        { id: 2, name: "李四", teamId: 1, teamName: "前端开发团队", position: "高级前端", phone: "13800138002", email: "lisi@example.com", currentWorkOrder: "", status: "1" },
        { id: 3, name: "王五", teamId: 1, teamName: "前端开发团队", position: "前端开发", phone: "13800138003", email: "wangwu@example.com", currentWorkOrder: "WO20230002", status: "1" },
        { id: 4, name: "赵六", teamId: 2, teamName: "后端开发团队", position: "后端组长", phone: "13800138004", email: "zhaoliu@example.com", currentWorkOrder: "WO20230003", status: "1" },
        { id: 5, name: "钱七", teamId: 2, teamName: "后端开发团队", position: "高级后端", phone: "13800138005", email: "qianqi@example.com", currentWorkOrder: "", status: "1" },
        { id: 6, name: "孙八", teamId: 2, teamName: "后端开发团队", position: "后端开发", phone: "13800138006", email: "sunba@example.com", currentWorkOrder: "", status: "1" },
        { id: 7, name: "周九", teamId: 3, teamName: "测试团队", position: "测试经理", phone: "13800138007", email: "zhoujiu@example.com", currentWorkOrder: "WO20230004", status: "1" },
        { id: 8, name: "吴十", teamId: 3, teamName: "测试团队", position: "测试工程师", phone: "13800138008", email: "wushi@example.com", currentWorkOrder: "", status: "1" }
        // 心血管内科团队成员
        {
          id: 1,
          name: "李成白",
          teamId: 1,
          teamName: "心血管内科团队",
          position: "主任医师",
          phone: "13800138001",
          email: "lichengbai@hospital.com",
          currentWorkOrder: "MED20230001",
          status: "1",
        },
        {
          id: 2,
          name: "刘翊惠",
          teamId: 1,
          teamName: "心血管内科团队",
          position: "副主任医师",
          phone: "13800138002",
          email: "liuyihui@hospital.com",
          currentWorkOrder: "",
          status: "1",
        },
        {
          id: 3,
          name: "张孟涵",
          teamId: 1,
          teamName: "心血管内科团队",
          position: "主治医师",
          phone: "13800138003",
          email: "zhangmenghan@hospital.com",
          currentWorkOrder: "MED20230002",
          status: "1",
        },
        {
          id: 9,
          name: "吴思翰",
          teamId: 1,
          teamName: "心血管内科团队",
          position: "住院医师",
          phone: "13800138009",
          email: "wusihan@hospital.com",
          currentWorkOrder: "",
          status: "1",
        },
        // 肿瘤科治疗团队成员
        {
          id: 4,
          name: "陈政倩",
          teamId: 2,
          teamName: "肿瘤科治疗团队",
          position: "肿瘤科主任",
          phone: "13800138004",
          email: "chenzhengqian@hospital.com",
          currentWorkOrder: "MED20230003",
          status: "1",
        },
        {
          id: 5,
          name: "邓诗涵",
          teamId: 2,
          teamName: "肿瘤科治疗团队",
          position: "放疗医师",
          phone: "13800138005",
          email: "dengshihan@hospital.com",
          currentWorkOrder: "",
          status: "1",
        },
        {
          id: 6,
          name: "黄盛玫",
          teamId: 2,
          teamName: "肿瘤科治疗团队",
          position: "化疗医师",
          phone: "13800138006",
          email: "huangshengmei@hospital.com",
          currentWorkOrder: "",
          status: "1",
        },
        // 儿科诊疗团队成员
        {
          id: 7,
          name: "王恩龙",
          teamId: 3,
          teamName: "儿科诊疗团队",
          position: "儿科主任",
          phone: "13800138007",
          email: "wagenlong@hospital.com",
          currentWorkOrder: "MED20230004",
          status: "1",
        },
        {
          id: 8,
          name: "朱政廷",
          teamId: 3,
          teamName: "儿科诊疗团队",
          position: "儿科医师",
          phone: "13800138008",
          email: "zhuzhengting@hospital.com",
          currentWorkOrder: "",
          status: "1",
        },
        {
          id: 10,
          name: "林佩玲",
          teamId: 3,
          teamName: "儿科诊疗团队",
          position: "儿科护士长",
          phone: "13800138010",
          email: "linpeiling@hospital.com",
          currentWorkOrder: "",
          status: "1",
        },
        // 急诊抢救团队成员
        {
          id: 11,
          name: "吴俊伯",
          teamId: 4,
          teamName: "急诊抢救团队",
          position: "急诊科主任",
          phone: "13800138011",
          email: "wujunbo@hospital.com",
          currentWorkOrder: "MED20230005",
          status: "1",
        },
        {
          id: 12,
          name: "阮馨学",
          teamId: 4,
          teamName: "急诊抢救团队",
          position: "急诊医师",
          phone: "13800138012",
          email: "ruanxinxue@hospital.com",
          currentWorkOrder: "MED20230006",
          status: "1",
        },
        {
          id: 13,
          name: "翁惠珠",
          teamId: 4,
          teamName: "急诊抢救团队",
          position: "急诊护士",
          phone: "13800138013",
          email: "wenghuizhu@hospital.com",
          currentWorkOrder: "",
          status: "1",
        },
        // 其他医疗人员
        {
          id: 14,
          name: "方兆玉",
          teamId: 1,
          teamName: "心血管内科团队",
          position: "心电技师",
          phone: "13800138014",
          email: "fangzhaoyu@hospital.com",
          currentWorkOrder: "",
          status: "1",
        },
        {
          id: 15,
          name: "丁汉臻",
          teamId: 2,
          teamName: "肿瘤科治疗团队",
          position: "病理医师",
          phone: "13800138015",
          email: "dinghanzhen@hospital.com",
          currentWorkOrder: "",
          status: "1",
        },
      ],
      memberTotal: 15,
      memberQueryParams: {
        pageNum: 1,
        pageSize: 10,
        name: undefined,
        teamId: undefined,
        status: undefined
        status: undefined,
      },
      memberTotal: 8,
      memberStatusOptions: [
        { value: "0", label: "禁用" },
        { value: "1", label: "启用" }
        { value: "1", label: "启用" },
      ],
      memberFormVisible: false,
      memberFormTitle: "",
@@ -760,57 +1444,135 @@
        position: undefined,
        phone: undefined,
        email: undefined,
        status: "1"
        status: "1",
      },
      memberRules: {
        name: [
          { required: true, message: "成员姓名不能为空", trigger: "blur" }
          { required: true, message: "成员姓名不能为空", trigger: "blur" },
        ],
        teamId: [
          { required: true, message: "所属团队不能为空", trigger: "change" }
          { required: true, message: "所属团队不能为空", trigger: "change" },
        ],
        position: [
          { required: true, message: "职位不能为空", trigger: "blur" }
          { required: true, message: "职位不能为空", trigger: "blur" },
        ],
        phone: [
          { required: true, message: "联系电话不能为空", trigger: "blur" }
          { required: true, message: "联系电话不能为空", trigger: "blur" },
        ],
        email: [
          { required: true, message: "邮箱不能为空", trigger: "blur" },
          { type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }
          {
            type: "email",
            message: "请输入正确的邮箱地址",
            trigger: ["blur", "change"],
          },
        ],
        status: [
          { required: true, message: "成员状态不能为空", trigger: "change" }
        ]
          { required: true, message: "成员状态不能为空", trigger: "change" },
        ],
      },
      // 工单指派相关数据
      workOrderLoading: false,
      // 替换原有的workOrderList数据
      workOrderList: [
        { id: "WO20230001", title: "首页改版需求开发", priority: "1", createTime: "2023-03-01 09:30:00", deadline: "2023-03-15 18:00:00", assignee: 1, assigneeName: "张三", status: "1", content: "完成首页改版的所有前端开发工作" },
        { id: "WO20230002", title: "用户中心接口开发", priority: "2", createTime: "2023-03-05 14:20:00", deadline: "2023-03-20 18:00:00", assignee: 3, assigneeName: "王五", status: "1", content: "开发用户中心相关接口" },
        { id: "WO20230003", title: "订单系统性能优化", priority: "1", createTime: "2023-03-10 10:15:00", deadline: "2023-03-25 18:00:00", assignee: 4, assigneeName: "赵六", status: "1", content: "优化订单系统性能,提高响应速度" },
        { id: "WO20230004", title: "支付功能测试", priority: "3", createTime: "2023-03-15 16:45:00", deadline: "2023-03-30 18:00:00", assignee: 7, assigneeName: "周九", status: "1", content: "完成支付功能的全面测试" },
        { id: "WO20230005", title: "数据报表开发", priority: "2", createTime: "2023-03-20 11:10:00", deadline: "2023-04-05 18:00:00", assignee: undefined, assigneeName: undefined, status: "0", content: "开发数据统计报表功能" }
        {
          id: "MED20230001",
          title: "冠心病患者PCI手术安排",
          priority: "1",
          createTime: "2024-11-01 09:30:00",
          deadline: "2024-11-05 18:00:00",
          assignee: 1,
          assigneeName: "李成白",
          status: "1",
          content:
            "为冠心病患者安排经皮冠状动脉介入治疗手术,需要术前评估和准备",
        },
        {
          id: "MED20230002",
          title: "高血压患者药物治疗方案调整",
          priority: "2",
          createTime: "2024-11-03 14:20:00",
          deadline: "2024-11-08 18:00:00",
          assignee: 3,
          assigneeName: "张孟涵",
          status: "1",
          content: "根据患者血压监测结果,调整降压药物组合和剂量",
        },
        {
          id: "MED20230003",
          title: "肺癌患者化疗周期安排",
          priority: "1",
          createTime: "2024-11-05 10:15:00",
          deadline: "2024-11-10 18:00:00",
          assignee: 4,
          assigneeName: "陈政倩",
          status: "1",
          content: "制定肺癌患者新一期化疗方案,包括药物选择和剂量计算",
        },
        {
          id: "MED20230004",
          title: "儿童肺炎患者诊疗方案",
          priority: "2",
          createTime: "2024-11-08 16:45:00",
          deadline: "2024-11-12 18:00:00",
          assignee: 7,
          assigneeName: "王恩龙",
          status: "1",
          content: "为儿童肺炎患者制定个性化治疗方案,包括抗生素选择和雾化治疗",
        },
        {
          id: "MED20230005",
          title: "急诊胸痛患者快速评估",
          priority: "1",
          createTime: "2024-11-10 11:10:00",
          deadline: "2024-11-10 23:00:00",
          assignee: 11,
          assigneeName: "吴俊伯",
          status: "1",
          content: "对急诊胸痛患者进行快速评估,排除急性心肌梗死可能",
        },
        {
          id: "MED20230006",
          title: "外伤患者清创缝合处理",
          priority: "2",
          createTime: "2024-11-12 13:25:00",
          deadline: "2024-11-12 20:00:00",
          assignee: 12,
          assigneeName: "阮馨学",
          status: "1",
          content: "处理急诊外伤患者的伤口清创和缝合工作",
        },
        {
          id: "MED20230007",
          title: "糖尿病患者胰岛素调整",
          priority: "2",
          createTime: "2024-11-15 08:45:00",
          deadline: "2024-11-20 18:00:00",
          assignee: undefined,
          assigneeName: undefined,
          status: "0",
          content: "根据患者血糖监测数据,调整胰岛素用量和注射方案",
        },
      ],
      workOrderTotal: 7,
      workOrderQueryParams: {
        pageNum: 1,
        pageSize: 10,
        id: undefined,
        status: undefined,
        assignee: undefined
        assignee: undefined,
      },
      workOrderTotal: 5,
      workOrderStatusOptions: [
        { value: "0", label: "待指派" },
        { value: "1", label: "进行中" },
        { value: "2", label: "已完成" },
        { value: "3", label: "已取消" }
        { value: "3", label: "已取消" },
      ],
      priorityOptions: [
        { value: "1", label: "高" },
        { value: "2", label: "中" },
        { value: "3", label: "低" }
        { value: "3", label: "低" },
      ],
      workOrderFormVisible: false,
      workOrderFormTitle: "",
@@ -822,24 +1584,24 @@
        deadline: undefined,
        assignee: undefined,
        status: "0",
        content: undefined
        content: undefined,
      },
      workOrderRules: {
        title: [
          { required: true, message: "工单标题不能为空", trigger: "blur" }
          { required: true, message: "工单标题不能为空", trigger: "blur" },
        ],
        priority: [
          { required: true, message: "优先级不能为空", trigger: "change" }
          { required: true, message: "优先级不能为空", trigger: "change" },
        ],
        deadline: [
          { required: true, message: "截止时间不能为空", trigger: "change" }
          { required: true, message: "截止时间不能为空", trigger: "change" },
        ],
        content: [
          { required: true, message: "工单内容不能为空", trigger: "blur" }
          { required: true, message: "工单内容不能为空", trigger: "blur" },
        ],
        status: [
          { required: true, message: "工单状态不能为空", trigger: "change" }
        ]
          { required: true, message: "工单状态不能为空", trigger: "change" },
        ],
      },
      // 指派工单相关数据
@@ -849,30 +1611,44 @@
        title: undefined,
        assignee: undefined,
        priority: "2",
        deadline: undefined
      }
        deadline: undefined,
      },
    };
  },
  // 在watch中添加监控
  watch: {
    teamDialogVisible(newVal) {
      if (newVal) {
        // 对话框显示时重新生成二维码
        this.$nextTick(() => {
          setTimeout(() => {
            this.generateTeamQRContent(this.currentTeam);
          }, 100);
        });
      }
    },
  },
  computed: {
    // 团队成员选项(用于穿梭框)
    memberOptions() {
      return this.memberList.map(member => ({
      return this.memberList.map((member) => ({
        key: member.id,
        label: member.name,
        disabled: member.status === "0"
        disabled: member.status === "0",
      }));
    },
    // 过滤后的团队列表
    filteredTeamList() {
      let list = [...this.teamList];
      if (this.teamQueryParams.name) {
        list = list.filter(item =>
        list = list.filter((item) =>
          item.name.includes(this.teamQueryParams.name)
        );
      }
      if (this.teamQueryParams.status) {
        list = list.filter(item =>
          item.status === this.teamQueryParams.status
        list = list.filter(
          (item) => item.status === this.teamQueryParams.status
        );
      }
      return list;
@@ -881,18 +1657,18 @@
    filteredMemberList() {
      let list = [...this.memberList];
      if (this.memberQueryParams.name) {
        list = list.filter(item =>
        list = list.filter((item) =>
          item.name.includes(this.memberQueryParams.name)
        );
      }
      if (this.memberQueryParams.teamId) {
        list = list.filter(item =>
          item.teamId === this.memberQueryParams.teamId
        list = list.filter(
          (item) => item.teamId === this.memberQueryParams.teamId
        );
      }
      if (this.memberQueryParams.status) {
        list = list.filter(item =>
          item.status === this.memberQueryParams.status
        list = list.filter(
          (item) => item.status === this.memberQueryParams.status
        );
      }
      return list;
@@ -901,18 +1677,18 @@
    filteredWorkOrderList() {
      let list = [...this.workOrderList];
      if (this.workOrderQueryParams.id) {
        list = list.filter(item =>
        list = list.filter((item) =>
          item.id.includes(this.workOrderQueryParams.id)
        );
      }
      if (this.workOrderQueryParams.status) {
        list = list.filter(item =>
          item.status === this.workOrderQueryParams.status
        list = list.filter(
          (item) => item.status === this.workOrderQueryParams.status
        );
      }
      if (this.workOrderQueryParams.assignee) {
        list = list.filter(item =>
          item.assignee === this.workOrderQueryParams.assignee
        list = list.filter(
          (item) => item.assignee === this.workOrderQueryParams.assignee
        );
      }
      return list;
@@ -920,17 +1696,17 @@
    // 团队工单(用于团队详情)
    teamWorkOrders() {
      if (!this.currentTeam.id) return [];
      const teamMemberIds = this.currentTeam.members.map(member => member.id);
      return this.workOrderList.filter(order =>
      const teamMemberIds = this.currentTeam.members.map((member) => member.id);
      return this.workOrderList.filter((order) =>
        teamMemberIds.includes(order.assignee)
      );
    },
    // 可用成员(用于工单指派)
    availableMembers() {
      return this.memberList.filter(member =>
        member.status === "1" && !member.currentWorkOrder
      return this.memberList.filter(
        (member) => member.status === "1" && !member.currentWorkOrder
      );
    }
    },
  },
  methods: {
    // 解析时间
@@ -947,6 +1723,113 @@
    handleTeamQuery() {
      this.teamQueryParams.pageNum = 1;
    },
    // 查看团队详情时生成二维码
    handleTeamDetail(row) {
      this.currentTeam = row;
      this.teamDialogTitle = "团队详情 - " + row.name;
      this.teamDialogVisible = true;
      // 使用nextTick确保DOM渲染完成
      this.$nextTick(() => {
        // 生成临时二维码内容
        this.generateTeamQRContent(row);
      });
    },
    // 生成团队二维码内容
    generateTeamQRContent(team) {
      const timestamp = new Date().getTime();
      const expireTime = timestamp + 24 * 60 * 60 * 1000; // 24小时有效期
      const qrData = {
        teamId: team.id,
        teamName: team.name,
        leader: team.leader,
        memberCount: team.members.length,
        timestamp: timestamp,
        expireTime: expireTime,
        type: "team_info",
      };
      // 确保内容是字符串格式
      this.teamQRContent = "127.0.0.1:8093/wt?p=0BE9L3C2u";
      console.log("生成的二维码内容:", this.teamQRContent);
    },
    // 二维码生成回调
    onQRCodeGenerated(dataURL, id) {
      if (dataURL) {
        this.currentQRCodeUrl = dataURL;
        console.log("二维码生成成功");
      } else {
        console.error("二维码生成失败");
        // 备用方案:使用qrcode.js生成
        this.generateQRCodeWithQRCodeJS();
      }
    },
    // 备用生成方案
    generateQRCodeWithQRCodeJS() {
      const QRCode = require("qrcode");
      if (this.teamQRContent) {
        QRCode.toDataURL(
          this.teamQRContent,
          {
            width: 200,
            height: 200,
            margin: 2,
            color: {
              dark: "#409EFF",
              light: "#FFFFFF",
            },
          },
          (err, url) => {
            if (err) {
              console.error("备用二维码生成失败:", err);
              return;
            }
            this.currentQRCodeUrl = url;
            console.log("备用二维码生成成功");
          }
        );
      }
    },
    // 下载二维码
    downloadQRCode() {
      if (!this.currentQRCodeUrl) {
        this.$message.warning("请先生成二维码");
        return;
      }
      const a = document.createElement("a");
      const event = new MouseEvent("click");
      a.download = `团队二维码_${
        this.currentTeam.name
      }_${new Date().getTime()}.png`;
      a.href = this.currentQRCodeUrl;
      a.dispatchEvent(event);
    },
    // 刷新二维码
    refreshQRCode() {
      this.generateTeamQRContent(this.currentTeam);
      this.$message.success("二维码已刷新");
    },
    // 在工单详情中也可以添加二维码功能
    handleWorkOrderDetail(row) {
      // 生成工单二维码
      const qrData = {
        workOrderId: row.id,
        title: row.title,
        priority: row.priority,
        status: row.status,
        timestamp: new Date().getTime(),
        type: "work_order",
      };
      this.workOrderQRContent = JSON.stringify(qrData);
    },
    // 重置团队搜索
    resetTeamQuery() {
      this.resetForm("teamQueryForm");
@@ -954,15 +1837,9 @@
    },
    // 团队多选
    handleTeamSelectionChange(selection) {
      this.ids = selection.map(item => item.id);
      this.ids = selection.map((item) => item.id);
      this.single = selection.length !== 1;
      this.multiple = !selection.length;
    },
    // 查看团队详情
    handleTeamDetail(row) {
      this.currentTeam = row;
      this.teamDialogTitle = "团队详情 - " + row.name;
      this.teamDialogVisible = true;
    },
    // 新增团队
    handleTeamAdd() {
@@ -973,56 +1850,65 @@
    // 修改团队
    handleTeamUpdate(row) {
      this.resetTeamForm();
      const team = this.teamList.find(item => item.id === row.id);
      const team = this.teamList.find((item) => item.id === row.id);
      this.teamForm = Object.assign({}, team);
      this.teamForm.members = team.members.map(member => member.id);
      this.teamForm.members = team.members.map((member) => member.id);
      this.teamFormTitle = "修改团队";
      this.teamFormVisible = true;
    },
    // 删除团队
    handleTeamDelete(row) {
      const teamIds = row.id || this.ids;
      this.$modal.confirm('是否确认删除团队名称为"' + row.name + '"的数据项?').then(() => {
        // 模拟删除团队
        this.teamList = this.teamList.filter(item => item.id !== teamIds);
        this.teamTotal = this.teamList.length;
        this.$modal.msgSuccess("删除成功");
      }).catch(() => {});
      this.$modal
        .confirm('是否确认删除团队名称为"' + row.name + '"的数据项?')
        .then(() => {
          // 模拟删除团队
          this.teamList = this.teamList.filter((item) => item.id !== teamIds);
          this.teamTotal = this.teamList.length;
          this.$modal.msgSuccess("删除成功");
        })
        .catch(() => {});
    },
    // 提交团队表单
    submitTeamForm() {
      this.$refs["teamForm"].validate(valid => {
      this.$refs["teamForm"].validate((valid) => {
        if (valid) {
          if (this.teamForm.id != null) {
            // 模拟修改团队
            const index = this.teamList.findIndex(item => item.id === this.teamForm.id);
            const index = this.teamList.findIndex(
              (item) => item.id === this.teamForm.id
            );
            if (index !== -1) {
              const leader = this.memberList.find(member => member.id === this.teamForm.leader);
              const members = this.memberList.filter(member =>
              const leader = this.memberList.find(
                (member) => member.id === this.teamForm.leader
              );
              const members = this.memberList.filter((member) =>
                this.teamForm.members.includes(member.id)
              );
              this.teamList.splice(index, 1, {
                ...this.teamForm,
                leader: leader ? leader.name : '',
                members: members
                leader: leader ? leader.name : "",
                members: members,
              });
            }
            this.$modal.msgSuccess("修改成功");
          } else {
            // 模拟新增团队
            const newId = Math.max(...this.teamList.map(item => item.id)) + 1;
            const leader = this.memberList.find(member => member.id === this.teamForm.leader);
            const members = this.memberList.filter(member =>
            const newId = Math.max(...this.teamList.map((item) => item.id)) + 1;
            const leader = this.memberList.find(
              (member) => member.id === this.teamForm.leader
            );
            const members = this.memberList.filter((member) =>
              this.teamForm.members.includes(member.id)
            );
            this.teamList.unshift({
              ...this.teamForm,
              id: newId,
              leader: leader ? leader.name : '',
              leader: leader ? leader.name : "",
              members: members,
              createTime: new Date().toLocaleString()
              createTime: new Date().toLocaleString(),
            });
            this.teamTotal = this.teamList.length;
            this.$modal.msgSuccess("新增成功");
@@ -1039,7 +1925,7 @@
        leader: undefined,
        members: [],
        status: "1",
        description: undefined
        description: undefined,
      };
      this.resetForm("teamForm");
    },
@@ -1068,7 +1954,7 @@
    },
    // 成员多选
    handleMemberSelectionChange(selection) {
      this.ids = selection.map(item => item.id);
      this.ids = selection.map((item) => item.id);
      this.single = selection.length !== 1;
      this.multiple = !selection.length;
    },
@@ -1081,7 +1967,7 @@
    // 修改成员
    handleMemberUpdate(row) {
      this.resetMemberForm();
      const member = this.memberList.find(item => item.id === row.id);
      const member = this.memberList.find((item) => item.id === row.id);
      this.memberForm = Object.assign({}, member);
      this.memberFormTitle = "修改成员";
      this.memberFormVisible = true;
@@ -1089,37 +1975,49 @@
    // 删除成员
    handleMemberDelete(row) {
      const memberIds = row.id || this.ids;
      this.$modal.confirm('是否确认删除成员姓名为"' + row.name + '"的数据项?').then(() => {
        // 模拟删除成员
        this.memberList = this.memberList.filter(item => item.id !== memberIds);
        this.memberTotal = this.memberList.length;
        this.$modal.msgSuccess("删除成功");
      }).catch(() => {});
      this.$modal
        .confirm('是否确认删除成员姓名为"' + row.name + '"的数据项?')
        .then(() => {
          // 模拟删除成员
          this.memberList = this.memberList.filter(
            (item) => item.id !== memberIds
          );
          this.memberTotal = this.memberList.length;
          this.$modal.msgSuccess("删除成功");
        })
        .catch(() => {});
    },
    // 提交成员表单
    submitMemberForm() {
      this.$refs["memberForm"].validate(valid => {
      this.$refs["memberForm"].validate((valid) => {
        if (valid) {
          if (this.memberForm.id != null) {
            // 模拟修改成员
            const index = this.memberList.findIndex(item => item.id === this.memberForm.id);
            const index = this.memberList.findIndex(
              (item) => item.id === this.memberForm.id
            );
            if (index !== -1) {
              const team = this.teamList.find(item => item.id === this.memberForm.teamId);
              const team = this.teamList.find(
                (item) => item.id === this.memberForm.teamId
              );
              this.memberList.splice(index, 1, {
                ...this.memberForm,
                teamName: team ? team.name : ''
                teamName: team ? team.name : "",
              });
            }
            this.$modal.msgSuccess("修改成功");
          } else {
            // 模拟新增成员
            const newId = Math.max(...this.memberList.map(item => item.id)) + 1;
            const team = this.teamList.find(item => item.id === this.memberForm.teamId);
            const newId =
              Math.max(...this.memberList.map((item) => item.id)) + 1;
            const team = this.teamList.find(
              (item) => item.id === this.memberForm.teamId
            );
            this.memberList.unshift({
              ...this.memberForm,
              id: newId,
              teamName: team ? team.name : '',
              currentWorkOrder: ''
              teamName: team ? team.name : "",
              currentWorkOrder: "",
            });
            this.memberTotal = this.memberList.length;
            this.$modal.msgSuccess("新增成功");
@@ -1137,7 +2035,7 @@
        position: undefined,
        phone: undefined,
        email: undefined,
        status: "1"
        status: "1",
      };
      this.resetForm("memberForm");
    },
@@ -1166,7 +2064,7 @@
    },
    // 工单多选
    handleWorkOrderSelectionChange(selection) {
      this.ids = selection.map(item => item.id);
      this.ids = selection.map((item) => item.id);
      this.single = selection.length !== 1;
      this.multiple = !selection.length;
    },
@@ -1179,7 +2077,7 @@
    // 修改工单
    handleWorkOrderUpdate(row) {
      this.resetWorkOrderForm();
      const workOrder = this.workOrderList.find(item => item.id === row.id);
      const workOrder = this.workOrderList.find((item) => item.id === row.id);
      this.workOrderForm = Object.assign({}, workOrder);
      this.workOrderFormTitle = "编辑工单";
      this.workOrderFormVisible = true;
@@ -1187,12 +2085,17 @@
    // 删除工单
    handleWorkOrderDelete(row) {
      const workOrderIds = row.id || this.ids;
      this.$modal.confirm('是否确认删除工单标题为"' + row.title + '"的数据项?').then(() => {
        // 模拟删除工单
        this.workOrderList = this.workOrderList.filter(item => item.id !== workOrderIds);
        this.workOrderTotal = this.workOrderList.length;
        this.$modal.msgSuccess("删除成功");
      }).catch(() => {});
      this.$modal
        .confirm('是否确认删除工单标题为"' + row.title + '"的数据项?')
        .then(() => {
          // 模拟删除工单
          this.workOrderList = this.workOrderList.filter(
            (item) => item.id !== workOrderIds
          );
          this.workOrderTotal = this.workOrderList.length;
          this.$modal.msgSuccess("删除成功");
        })
        .catch(() => {});
    },
    // 指派工单
    handleAssignWorkOrder(row) {
@@ -1201,34 +2104,43 @@
        title: row.title,
        assignee: undefined,
        priority: row.priority,
        deadline: row.deadline
        deadline: row.deadline,
      };
      this.assignDialogVisible = true;
    },
    // 提交工单表单
    submitWorkOrderForm() {
      this.$refs["workOrderForm"].validate(valid => {
      this.$refs["workOrderForm"].validate((valid) => {
        if (valid) {
          if (this.workOrderForm.id != null) {
            // 模拟修改工单
            const index = this.workOrderList.findIndex(item => item.id === this.workOrderForm.id);
            const index = this.workOrderList.findIndex(
              (item) => item.id === this.workOrderForm.id
            );
            if (index !== -1) {
              const assignee = this.memberList.find(member => member.id === this.workOrderForm.assignee);
              const assignee = this.memberList.find(
                (member) => member.id === this.workOrderForm.assignee
              );
              this.workOrderList.splice(index, 1, {
                ...this.workOrderForm,
                assigneeName: assignee ? assignee.name : undefined
                assigneeName: assignee ? assignee.name : undefined,
              });
            }
            this.$modal.msgSuccess("修改成功");
          } else {
            // 模拟新增工单
            const newId = "WO" + new Date().getFullYear() + (Math.floor(Math.random() * 90000) + 10000);
            const assignee = this.memberList.find(member => member.id === this.workOrderForm.assignee);
            const newId =
              "WO" +
              new Date().getFullYear() +
              (Math.floor(Math.random() * 90000) + 10000);
            const assignee = this.memberList.find(
              (member) => member.id === this.workOrderForm.assignee
            );
            this.workOrderList.unshift({
              ...this.workOrderForm,
              id: newId,
              assigneeName: assignee ? assignee.name : undefined,
              createTime: new Date().toLocaleString()
              createTime: new Date().toLocaleString(),
            });
            this.workOrderTotal = this.workOrderList.length;
            this.$modal.msgSuccess("新增成功");
@@ -1247,7 +2159,7 @@
        deadline: undefined,
        assignee: undefined,
        status: "0",
        content: undefined
        content: undefined,
      };
      this.resetForm("workOrderForm");
    },
@@ -1264,9 +2176,13 @@
      }
      // 模拟指派工单
      const index = this.workOrderList.findIndex(item => item.id === this.assignForm.id);
      const index = this.workOrderList.findIndex(
        (item) => item.id === this.assignForm.id
      );
      if (index !== -1) {
        const assignee = this.memberList.find(member => member.id === this.assignForm.assignee);
        const assignee = this.memberList.find(
          (member) => member.id === this.assignForm.assignee
        );
        if (assignee) {
          // 更新工单状态
          this.workOrderList.splice(index, 1, {
@@ -1275,15 +2191,17 @@
            assigneeName: assignee.name,
            priority: this.assignForm.priority,
            deadline: this.assignForm.deadline,
            status: "1"
            status: "1",
          });
          // 更新成员当前工单
          const memberIndex = this.memberList.findIndex(member => member.id === this.assignForm.assignee);
          const memberIndex = this.memberList.findIndex(
            (member) => member.id === this.assignForm.assignee
          );
          if (memberIndex !== -1) {
            this.memberList.splice(memberIndex, 1, {
              ...this.memberList[memberIndex],
              currentWorkOrder: this.assignForm.id
              currentWorkOrder: this.assignForm.id,
            });
          }
@@ -1291,8 +2209,8 @@
          this.assignDialogVisible = false;
        }
      }
    }
  }
    },
  },
};
</script>
@@ -1319,7 +2237,7 @@
}
.avatar-uploader ::v-deep .el-upload:hover {
  border-color: #409EFF;
  border-color: #409eff;
}
.avatar-uploader-icon {
@@ -1337,7 +2255,8 @@
  display: block;
}
.team-members, .team-work-orders {
.team-members,
.team-work-orders {
  margin-top: 20px;
}
</style>