| | |
| | | <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" |
| | |
| | | /> |
| | | </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" |
| | |
| | | </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> |
| | | |
| | |
| | | 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" |
| | |
| | | <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" |
| | |
| | | /> |
| | | </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" |
| | |
| | | </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" |
| | |
| | | </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> |
| | | |
| | |
| | | icon="el-icon-plus" |
| | | size="medium" |
| | | @click="handleMemberAdd" |
| | | >新增成员</el-button> |
| | | >新增成员</el-button |
| | | > |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | |
| | | 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" |
| | |
| | | <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" |
| | |
| | | /> |
| | | </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" |
| | |
| | | </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" |
| | |
| | | </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> |
| | | |
| | |
| | | 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" |
| | |
| | | </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> |
| | |
| | | <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> |
| | |
| | | <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"> |
| | |
| | | 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> |
| | |
| | | :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> |
| | |
| | | </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" |
| | |
| | | </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"> |
| | |
| | | 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> |
| | |
| | | </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" |
| | |
| | | </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"> |
| | |
| | | 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" |
| | |
| | | </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" |
| | |
| | | </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" |
| | |
| | | </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: { |
| | |
| | | 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: "", |
| | |
| | | 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: "", |
| | |
| | | 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" }, |
| | | ], |
| | | }, |
| | | |
| | | // 指派工单相关数据 |
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | // 团队工单(用于团队详情) |
| | | 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: { |
| | | // 解析时间 |
| | |
| | | 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"); |
| | |
| | | }, |
| | | // 团队多选 |
| | | 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() { |
| | |
| | | // 修改团队 |
| | | 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("新增成功"); |
| | |
| | | leader: undefined, |
| | | members: [], |
| | | status: "1", |
| | | description: undefined |
| | | description: undefined, |
| | | }; |
| | | this.resetForm("teamForm"); |
| | | }, |
| | |
| | | }, |
| | | // 成员多选 |
| | | 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; |
| | | }, |
| | |
| | | // 修改成员 |
| | | 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; |
| | |
| | | // 删除成员 |
| | | 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("新增成功"); |
| | |
| | | position: undefined, |
| | | phone: undefined, |
| | | email: undefined, |
| | | status: "1" |
| | | status: "1", |
| | | }; |
| | | this.resetForm("memberForm"); |
| | | }, |
| | |
| | | }, |
| | | // 工单多选 |
| | | 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; |
| | | }, |
| | |
| | | // 修改工单 |
| | | 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; |
| | |
| | | // 删除工单 |
| | | 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) { |
| | |
| | | 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("新增成功"); |
| | |
| | | deadline: undefined, |
| | | assignee: undefined, |
| | | status: "0", |
| | | content: undefined |
| | | content: undefined, |
| | | }; |
| | | this.resetForm("workOrderForm"); |
| | | }, |
| | |
| | | } |
| | | |
| | | // 模拟指派工单 |
| | | 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, { |
| | |
| | | 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, |
| | | }); |
| | | } |
| | | |
| | |
| | | this.assignDialogVisible = false; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |
| | | |
| | |
| | | } |
| | | |
| | | .avatar-uploader ::v-deep .el-upload:hover { |
| | | border-color: #409EFF; |
| | | border-color: #409eff; |
| | | } |
| | | |
| | | .avatar-uploader-icon { |
| | |
| | | display: block; |
| | | } |
| | | |
| | | .team-members, .team-work-orders { |
| | | .team-members, |
| | | .team-work-orders { |
| | | margin-top: 20px; |
| | | } |
| | | </style> |