From b7f7f38d7ead0939d82a8a0fb301b30b72398acc Mon Sep 17 00:00:00 2001
From: WXL <1785969728@qq.com>
Date: 星期四, 07 八月 2025 09:54:22 +0800
Subject: [PATCH] 测试完成
---
src/views/knowledge/drug/index.vue | 1072 +++++++++++++++++++++
src/views/login.vue | 6
src/views/system/group/index.vue | 1343 +++++++++++++++++++++++++++
src/views/knowledge/article/index.vue | 486 +++++++++
4 files changed, 2,893 insertions(+), 14 deletions(-)
diff --git a/src/views/knowledge/article/index.vue b/src/views/knowledge/article/index.vue
new file mode 100644
index 0000000..587ad77
--- /dev/null
+++ b/src/views/knowledge/article/index.vue
@@ -0,0 +1,486 @@
+<template>
+ <div class="ArticleManagement">
+ <el-row :gutter="20">
+ <el-col :span="24" :xs="24">
+ <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+ <el-form-item label="鏂囩珷鏍囬" prop="title">
+ <el-input
+ v-model="queryParams.title"
+ placeholder="璇疯緭鍏ユ枃绔犳爣棰�"
+ clearable
+ style="width: 200px"
+ @keyup.enter.native="handleQuery"
+ />
+ </el-form-item>
+ <el-form-item label="鏂囩珷鍒嗙被" prop="category">
+ <el-select v-model="queryParams.category" placeholder="璇烽�夋嫨鍒嗙被" clearable style="width: 200px">
+ <el-option
+ v-for="item in categoryOptions"
+ :key="item.value"
+ :label="item.label"
+ :value="item.value"
+ />
+ </el-select>
+ </el-form-item>
+ <el-form-item label="鐘舵��" prop="status">
+ <el-select v-model="queryParams.status" placeholder="璇烽�夋嫨鐘舵��" clearable style="width: 200px">
+ <el-option
+ v-for="item in statusOptions"
+ :key="item.value"
+ :label="item.label"
+ :value="item.value"
+ />
+ </el-select>
+ </el-form-item>
+ <el-form-item>
+ <el-button type="primary" icon="el-icon-search" size="medium" @click="handleQuery">鎼滅储</el-button>
+ <el-button icon="el-icon-refresh" size="medium" @click="resetQuery">閲嶇疆</el-button>
+ </el-form-item>
+ </el-form>
+
+ <el-row :gutter="10" class="mb8">
+ <el-col :span="1.5">
+ <el-button
+ type="primary"
+ plain
+ icon="el-icon-plus"
+ size="medium"
+ @click="handleAdd"
+ >鏂板</el-button>
+ </el-col>
+ <el-col :span="1.5">
+ <el-button
+ type="danger"
+ plain
+ icon="el-icon-delete"
+ size="medium"
+ :disabled="multiple"
+ @click="handleDelete"
+ >鍒犻櫎</el-button>
+ </el-col>
+ </el-row>
+
+ <el-table v-loading="loading" :data="filteredArticleList" @selection-change="handleSelectionChange">
+ <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="title" :show-overflow-tooltip="true" />
+ <el-table-column label="鏂囩珷鍒嗙被" align="center" prop="category" width="120">
+ <template slot-scope="scope">
+ <dict-tag :options="categoryOptions" :value="scope.row.category"/>
+ </template>
+ </el-table-column>
+ <el-table-column label="灏侀潰鍥�" align="center" prop="coverImage" width="120">
+ <template slot-scope="scope">
+ <el-image
+ v-if="scope.row.coverImage"
+ style="width: 80px; height: 60px"
+ :src="scope.row.coverImage"
+ :preview-src-list="[scope.row.coverImage]"
+ fit="cover"
+ />
+ <span v-else>鏃犲皝闈�</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="浣滆��" align="center" prop="author" width="120" />
+ <el-table-column label="鍙戝竷鏃堕棿" align="center" prop="publishTime" width="160">
+ <template slot-scope="scope">
+ <span>{{ parseTime(scope.row.publishTime, '{y}-{m}-{d} {h}:{i}') }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="闃呰閲�" align="center" prop="views" width="80" />
+ <el-table-column label="鐘舵��" align="center" prop="status" width="100">
+ <template slot-scope="scope">
+ <dict-tag :options="statusOptions" :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-edit"
+ @click="handleUpdate(scope.row)"
+ >淇敼</el-button>
+ <el-button
+ size="mini"
+ type="text"
+ icon="el-icon-delete"
+ @click="handleDelete(scope.row)"
+ >鍒犻櫎</el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+
+ <pagination
+ v-show="total>0"
+ :total="total"
+ :page.sync="queryParams.pageNum"
+ :limit.sync="queryParams.pageSize"
+ @pagination="getList"
+ />
+ </el-col>
+ </el-row>
+
+ <!-- 娣诲姞鎴栦慨鏀规枃绔犲璇濇 -->
+ <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
+ <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+ <el-row>
+ <el-col :span="24">
+ <el-form-item label="鏂囩珷鏍囬" prop="title">
+ <el-input v-model="form.title" placeholder="璇疯緭鍏ユ枃绔犳爣棰�" />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鏂囩珷鍒嗙被" prop="category">
+ <el-select v-model="form.category" placeholder="璇烽�夋嫨鍒嗙被">
+ <el-option
+ v-for="item in categoryOptions"
+ :key="item.value"
+ :label="item.label"
+ :value="item.value"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鐘舵��" prop="status">
+ <el-radio-group v-model="form.status">
+ <el-radio
+ v-for="dict in statusOptions"
+ :key="dict.value"
+ :label="dict.value"
+ >{{dict.label}}</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ </el-col>
+ <el-col :span="24">
+ <el-form-item label="灏侀潰鍥�">
+ <el-upload
+ class="avatar-uploader"
+ action="#"
+ :show-file-list="false"
+ :on-change="handleCoverChange"
+ :auto-upload="false">
+ <img v-if="form.coverImage" :src="form.coverImage" class="avatar">
+ <i v-else class="el-icon-plus avatar-uploader-icon"></i>
+ </el-upload>
+ </el-form-item>
+ </el-col>
+ <el-col :span="24">
+ <el-form-item label="鏂囩珷鎽樿" prop="summary">
+ <el-input
+ type="textarea"
+ :rows="3"
+ v-model="form.summary"
+ placeholder="璇疯緭鍏ユ枃绔犳憳瑕�"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="24">
+ <el-form-item label="鏂囩珷鍐呭" prop="content">
+ <editor v-model="form.content" :min-height="300"/>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </el-form>
+ <div slot="footer" class="dialog-footer">
+ <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+ <el-button @click="cancel">鍙� 娑�</el-button>
+ </div>
+ </el-dialog>
+ </div>
+</template>
+
+<script>
+import { parseTime } from '@/utils/ruoyi'
+
+export default {
+ name: "ArticleManagement",
+ dicts: ['sys_normal_disable', 'sys_user_sex'],
+ data() {
+ return {
+ // 閬僵灞�
+ loading: false,
+ // 閫変腑鏁扮粍
+ ids: [],
+ // 闈炲崟涓鐢�
+ single: true,
+ // 闈炲涓鐢�
+ multiple: true,
+ // 鏄剧ず鎼滅储鏉′欢
+ showSearch: true,
+ // 鎬绘潯鏁�
+ total: 0,
+ // 鏂囩珷琛ㄦ牸鏁版嵁
+ articleList: [
+ {
+ id: 1,
+ title: "濡備綍鎻愰珮鍓嶇寮�鍙戞晥鐜�",
+ category: "1",
+ coverImage: "https://pic.rmb.bdstatic.com/bjh/news/5e5f1b3e7b1a8a7f8a3d6a7d3a6a7d3a.jpeg",
+ author: "寮犱笁",
+ publishTime: "2023-05-10 09:30:00",
+ views: 1250,
+ status: "1",
+ summary: "鏈枃浠嬬粛浜嗗嚑绉嶆彁楂樺墠绔紑鍙戞晥鐜囩殑鏂规硶鍜屽伐鍏�",
+ content: "<p>鍓嶇寮�鍙戞晥鐜囩殑鎻愬崌瀵逛簬椤圭洰杩涘害鑷冲叧閲嶈...</p>"
+ },
+ {
+ id: 2,
+ title: "Vue3鏂扮壒鎬цВ鏋�",
+ category: "2",
+ coverImage: "https://pic.rmb.bdstatic.com/bjh/news/8e5f1b3e7b1a8a7f8a3d6a7d3a6a7d3a.jpeg",
+ author: "鏉庡洓",
+ publishTime: "2023-05-15 14:20:00",
+ views: 3200,
+ status: "1",
+ summary: "璇︾粏瑙f瀽Vue3鐨勬柊鐗规�у拰浣跨敤鍦烘櫙",
+ content: "<p>Vue3甯︽潵浜嗚澶氫护浜哄叴濂嬬殑鏂扮壒鎬�...</p>"
+ },
+ {
+ id: 3,
+ title: "Element UI浣跨敤鎶�宸�",
+ category: "3",
+ coverImage: "https://pic.rmb.bdstatic.com/bjh/news/9e5f1b3e7b1a8a7f8a3d6a7d3a6a7d3a.jpeg",
+ author: "鐜嬩簲",
+ publishTime: "2023-05-20 10:15:00",
+ views: 890,
+ status: "0",
+ summary: "鍒嗕韩涓�浜汦lement UI鐨勯珮绾т娇鐢ㄦ妧宸�",
+ content: "<p>Element UI浣滀负娴佽鐨刄I妗嗘灦锛屾湁璁稿瀹炵敤鎶�宸�...</p>"
+ },
+ {
+ id: 4,
+ title: "鍓嶇鎬ц兘浼樺寲鎸囧崡",
+ category: "1",
+ coverImage: "https://pic.rmb.bdstatic.com/bjh/news/7e5f1b3e7b1a8a7f8a3d6a7d3a6a7d3a.jpeg",
+ author: "璧靛叚",
+ publishTime: "2023-05-25 16:45:00",
+ views: 4500,
+ status: "1",
+ summary: "鍏ㄩ潰鐨勫墠绔�ц兘浼樺寲鏂规硶鍜屽疄璺�",
+ content: "<p>鎬ц兘浼樺寲鏄墠绔紑鍙戜腑姘告亽鐨勮瘽棰�...</p>"
+ },
+ {
+ id: 5,
+ title: "TypeScript鍏ラ棬鏁欑▼",
+ category: "2",
+ coverImage: "https://pic.rmb.bdstatic.com/bjh/news/6e5f1b3e7b1a8a7f8a3d6a7d3a6a7d3a.jpeg",
+ author: "閽变竷",
+ publishTime: "2023-06-01 11:10:00",
+ views: 2100,
+ status: "1",
+ summary: "浠庨浂寮�濮嬪涔燭ypeScript",
+ content: "<p>TypeScript浣滀负JavaScript鐨勮秴闆嗚秺鏉ヨ秺鍙楁杩�...</p>"
+ }
+ ],
+ // 寮瑰嚭灞傛爣棰�
+ title: "",
+ // 鏄惁鏄剧ず寮瑰嚭灞�
+ open: false,
+ // 鏌ヨ鍙傛暟
+ queryParams: {
+ pageNum: 1,
+ pageSize: 10,
+ title: undefined,
+ category: undefined,
+ status: undefined
+ },
+ // 琛ㄥ崟鍙傛暟
+ form: {},
+ // 琛ㄥ崟鏍¢獙
+ rules: {
+ title: [
+ { required: true, message: "鏂囩珷鏍囬涓嶈兘涓虹┖", trigger: "blur" }
+ ],
+ category: [
+ { required: true, message: "鏂囩珷鍒嗙被涓嶈兘涓虹┖", trigger: "change" }
+ ],
+ status: [
+ { required: true, message: "鐘舵�佷笉鑳戒负绌�", trigger: "change" }
+ ],
+ summary: [
+ { required: true, message: "鏂囩珷鎽樿涓嶈兘涓虹┖", trigger: "blur" }
+ ],
+ content: [
+ { required: true, message: "鏂囩珷鍐呭涓嶈兘涓虹┖", trigger: "blur" }
+ ]
+ },
+ // 鏂囩珷鍒嗙被閫夐」
+ categoryOptions: [
+ { value: "1", label: "鎶�鏈枃绔�" },
+ { value: "2", label: "鏁欑▼鎸囧崡" },
+ { value: "3", label: "缁忛獙鍒嗕韩" },
+ { value: "4", label: "琛屼笟璧勮" }
+ ],
+ // 鐘舵�侀�夐」
+ statusOptions: [
+ { value: "0", label: "鑽夌" },
+ { value: "1", label: "宸插彂甯�" },
+ { value: "2", label: "宸蹭笅鏋�" }
+ ]
+ };
+ },
+ computed: {
+ filteredArticleList() {
+ let list = [...this.articleList];
+ if (this.queryParams.title) {
+ list = list.filter(item =>
+ item.title.includes(this.queryParams.title)
+ );
+ }
+ if (this.queryParams.category) {
+ list = list.filter(item =>
+ item.category === this.queryParams.category
+ );
+ }
+ if (this.queryParams.status) {
+ list = list.filter(item =>
+ item.status === this.queryParams.status
+ );
+ }
+ return list;
+ }
+ },
+ created() {
+ this.total = this.articleList.length;
+ },
+ methods: {
+ // 瑙f瀽鏃堕棿
+ parseTime,
+ /** 鏌ヨ鏂囩珷鍒楄〃 */
+ getList() {
+ this.loading = true;
+ setTimeout(() => {
+ this.loading = false;
+ }, 500);
+ },
+ /** 鎼滅储鎸夐挳鎿嶄綔 */
+ handleQuery() {
+ this.queryParams.pageNum = 1;
+ },
+ /** 閲嶇疆鎸夐挳鎿嶄綔 */
+ resetQuery() {
+ this.resetForm("queryForm");
+ this.handleQuery();
+ },
+ // 澶氶�夋閫変腑鏁版嵁
+ handleSelectionChange(selection) {
+ this.ids = selection.map(item => item.id);
+ this.single = selection.length !== 1;
+ this.multiple = !selection.length;
+ },
+ /** 鏂板鎸夐挳鎿嶄綔 */
+ handleAdd() {
+ this.reset();
+ this.open = true;
+ this.title = "娣诲姞鏂囩珷";
+ },
+ /** 淇敼鎸夐挳鎿嶄綔 */
+ handleUpdate(row) {
+ this.reset();
+ const id = row.id || this.ids;
+ const article = this.articleList.find(item => item.id === id);
+ this.form = Object.assign({}, article);
+ this.open = true;
+ this.title = "淇敼鏂囩珷";
+ },
+ /** 鎻愪氦鎸夐挳 */
+ submitForm() {
+ this.$refs["form"].validate(valid => {
+ if (valid) {
+ if (this.form.id != null) {
+ // 妯℃嫙淇敼鏂囩珷
+ const index = this.articleList.findIndex(item => item.id === this.form.id);
+ if (index !== -1) {
+ this.articleList.splice(index, 1, this.form);
+ }
+ this.$modal.msgSuccess("淇敼鎴愬姛");
+ } else {
+ // 妯℃嫙鏂板鏂囩珷
+ this.form.id = Math.max(...this.articleList.map(item => item.id)) + 1;
+ this.form.publishTime = new Date().toLocaleString();
+ this.form.views = 0;
+ this.articleList.unshift(this.form);
+ this.total = this.articleList.length;
+ this.$modal.msgSuccess("鏂板鎴愬姛");
+ }
+ this.open = false;
+ }
+ });
+ },
+ /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+ handleDelete(row) {
+ const articleIds = row.id || this.ids;
+ this.$modal.confirm('鏄惁纭鍒犻櫎鏂囩珷鏍囬涓�"' + row.title + '"鐨勬暟鎹」锛�').then(() => {
+ // 妯℃嫙鍒犻櫎鏂囩珷
+ this.articleList = this.articleList.filter(item => item.id !== articleIds);
+ this.total = this.articleList.length;
+ this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+ }).catch(() => {});
+ },
+ /** 鍙栨秷鎸夐挳 */
+ cancel() {
+ this.open = false;
+ this.reset();
+ },
+ /** 琛ㄥ崟閲嶇疆 */
+ reset() {
+ this.form = {
+ id: undefined,
+ title: undefined,
+ category: undefined,
+ coverImage: undefined,
+ author: "绠$悊鍛�",
+ publishTime: undefined,
+ views: 0,
+ status: "1",
+ summary: undefined,
+ content: undefined
+ };
+ this.resetForm("form");
+ },
+ // 灏侀潰鍥句笂浼犲鐞�
+ handleCoverChange(file) {
+ const reader = new FileReader();
+ reader.onload = (e) => {
+ this.form.coverImage = e.target.result;
+ };
+ reader.readAsDataURL(file.raw);
+ }
+ }
+};
+</script>
+
+<style lang="scss" scoped>
+.ArticleManagement {
+ padding: 20px;
+}
+
+.avatar-uploader ::v-deep .el-upload {
+ border: 1px dashed #d9d9d9;
+ border-radius: 6px;
+ cursor: pointer;
+ position: relative;
+ overflow: hidden;
+}
+
+.avatar-uploader ::v-deep .el-upload:hover {
+ border-color: #409EFF;
+}
+
+.avatar-uploader-icon {
+ font-size: 28px;
+ color: #8c939d;
+ width: 178px;
+ height: 178px;
+ line-height: 178px;
+ text-align: center;
+}
+
+.avatar {
+ width: 178px;
+ height: 178px;
+ display: block;
+}
+</style>
diff --git a/src/views/knowledge/drug/index.vue b/src/views/knowledge/drug/index.vue
index aa54bde..5e45095 100644
--- a/src/views/knowledge/drug/index.vue
+++ b/src/views/knowledge/drug/index.vue
@@ -1,27 +1,1077 @@
<template>
- <div>
-鑽搧鐭ヨ瘑搴�
+ <div class="DrugKnowledgeManagement">
+ <!-- 宸︿晶鏍� -->
+ <div class="sidecolumn">
+ <div class="sidecolumn-top">
+ <div class="top-wj">鑽搧鍒嗙被</div>
+ <div class="top-tj" @click="dialogFormVisible = true">+娣诲姞</div>
+ </div>
+ <div class="center-ss">
+ <el-input
+ placeholder="璇疯緭鍏ュ唴瀹�"
+ v-model="sidecolumnval"
+ class="input-with-select"
+ size="medium">
+ </el-input>
+ </div>
+
+ <div class="head-container" style="margin-top: 20px">
+ <el-tree
+ :data="deptOptions"
+ :props="defaultProps"
+ :expand-on-click-node="false"
+ :filter-node-method="filterNode"
+ ref="tree"
+ node-key="id"
+ default-expand-all
+ highlight-current
+ @node-click="handleNodeClick">
+ <span class="custom-tree-node" slot-scope="{ node, data }">
+ <span>{{ node.label }}</span>
+ <span v-if="data.id > 0">
+ <el-button
+ type="text"
+ icon="el-icon-delete"
+ circle
+ size="mini"
+ @click="() => remove(node, data)">
+ </el-button>
+ </span>
+ <span v-if="data.id > 0">
+ <el-button
+ type="text"
+ circle
+ size="mini"
+ @click="() => altertag(node, data)">
+ <span class="button-textxg"><i class="el-icon-edit-outline"></i></span>
+ </el-button>
+ </span>
+ </span>
+ </el-tree>
+ </div>
+ </div>
+ <!-- 鍙充晶鏁版嵁 -->
+ <div class="leftvlue">
+ <div class="leftvlue-bg">
+ <el-row :gutter="20">
+ <!--鑽搧鏁版嵁-->
+ <el-col :span="24" :xs="24">
+ <el-form
+ :model="queryParams"
+ ref="queryForm"
+ size="small"
+ :inline="true"
+ v-show="showSearch"
+ label-width="98px">
+ <el-form-item label="鑽搧鍚嶇О" prop="drugName">
+ <el-input
+ v-model="queryParams.drugName"
+ placeholder="璇疯緭鍏�"
+ clearable
+ style="width: 200px"
+ @keyup.enter.native="handleQuery"/>
+ </el-form-item>
+ <el-form-item label="鑽搧鍒嗙被" prop="categoryId">
+ <el-select v-model="queryParams.categoryId" placeholder="璇烽�夋嫨">
+ <el-option
+ v-for="item in drugCategories"
+ :key="item.id"
+ :label="item.categoryName"
+ :value="item.id">
+ </el-option>
+ </el-select>
+ </el-form-item>
+ <el-form-item label="鑽搧绫诲瀷" prop="drugType">
+ <el-select v-model="queryParams.drugType" placeholder="璇烽�夋嫨">
+ <el-option
+ v-for="item in drugTypes"
+ :key="item.value"
+ :label="item.label"
+ :value="item.value">
+ </el-option>
+ </el-select>
+ </el-form-item>
+ <el-form-item label="鏄惁澶勬柟鑽�" prop="isPrescription">
+ <el-select v-model="queryParams.isPrescription" placeholder="璇烽�夋嫨">
+ <el-option
+ v-for="item in prescriptionOptions"
+ :key="item.value"
+ :label="item.label"
+ :value="item.value">
+ </el-option>
+ </el-select>
+ </el-form-item>
+
+ <el-form-item>
+ <el-button
+ type="primary"
+ icon="el-icon-search"
+ size="medium"
+ @click="handleQuery">鎼滅储</el-button>
+ <el-button
+ icon="el-icon-refresh"
+ size="medium"
+ @click="resetQuery">閲嶇疆</el-button>
+ </el-form-item>
+ </el-form>
+
+ <el-row :gutter="10" class="mb8">
+ <el-col :span="1.5">
+ <el-button
+ type="primary"
+ plain
+ icon="el-icon-plus"
+ size="medium"
+ @click="handleAdd">鏂板</el-button>
+ </el-col>
+ <el-col :span="1.5">
+ <el-button
+ type="danger"
+ plain
+ icon="el-icon-delete"
+ size="medium"
+ :disabled="multiple"
+ @click="handleDelete">鍒犻櫎</el-button>
+ </el-col>
+ </el-row>
+
+ <el-table
+ v-loading="loading"
+ :data="filteredDrugList"
+ @selection-change="handleSelectionChange">
+ <el-table-column type="selection" width="50" align="center" />
+ <el-table-column
+ label="鑽搧鍚嶇О"
+ fixed
+ align="center"
+ key="drugName"
+ prop="drugName"
+ :show-overflow-tooltip="true">
+ </el-table-column>
+ <el-table-column
+ label="閫氱敤鍚�"
+ align="center"
+ key="genericName"
+ prop="genericName"
+ :show-overflow-tooltip="true"
+ width="200"/>
+ <el-table-column
+ label="鑽搧鍒嗙被"
+ align="center"
+ key="categoryName"
+ prop="categoryName"
+ :show-overflow-tooltip="true"/>
+ <el-table-column
+ label="鑽搧绫诲瀷"
+ align="center"
+ key="drugType"
+ prop="drugType">
+ <template slot-scope="scope">
+ <dict-tag :options="drugTypes" :value="scope.row.drugType"/>
+ </template>
+ </el-table-column>
+ <el-table-column
+ label="鏄惁澶勬柟鑽�"
+ align="center"
+ key="isPrescription"
+ prop="isPrescription">
+ <template slot-scope="scope">
+ <dict-tag :options="prescriptionOptions" :value="scope.row.isPrescription"/>
+ </template>
+ </el-table-column>
+ <el-table-column
+ label="瑙勬牸"
+ align="center"
+ key="specification"
+ prop="specification"
+ width="120"/>
+ <el-table-column
+ label="鍗曚綅"
+ align="center"
+ key="unit"
+ prop="unit"
+ width="80"/>
+ <el-table-column
+ label="鐢熶骇鍘傚"
+ align="center"
+ key="manufacturer"
+ prop="manufacturer"
+ width="150"/>
+ <el-table-column
+ label="鎵瑰噯鏂囧彿"
+ align="center"
+ key="approvalNumber"
+ prop="approvalNumber"
+ width="150"/>
+ <el-table-column
+ label="鎿嶄綔"
+ fixed="right"
+ align="center"
+ width="200"
+ class-name="small-padding fixed-width">
+ <template slot-scope="scope">
+ <el-button
+ size="medium"
+ type="text"
+ @click="handleUpdate(scope.row)">
+ <span class="button-textxg"><i class="el-icon-edit"></i>淇敼</span>
+ </el-button>
+ <el-button
+ size="medium"
+ type="text"
+ @click="handleDelete(scope.row)">
+ <span class="button-textsc"><i class="el-icon-delete"></i>鍒犻櫎</span>
+ </el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+
+ <pagination
+ v-show="total>0"
+ :total="total"
+ :page.sync="queryParams.pageNum"
+ :limit.sync="queryParams.pageSize"
+ @pagination="getList"/>
+ </el-col>
+ </el-row>
+
+ <!-- 娣诲姞鎴栦慨鏀硅嵂鍝佸璇濇 -->
+ <el-dialog
+ :title="title"
+ :visible.sync="drugOpen"
+ :close-on-click-modal="false"
+ width="900px"
+ append-to-body>
+ <el-form
+ ref="drugForm"
+ :model="drugForm"
+ :rules="rules"
+ label-width="100px">
+ <div class="headline">
+ <div class="basics">鍩虹淇℃伅</div>
+ </div>
+ <el-divider></el-divider>
+ <el-row>
+ <el-col :span="12">
+ <el-form-item label="鑽搧鍚嶇О" prop="drugName">
+ <el-input
+ v-model="drugForm.drugName"
+ placeholder="璇疯緭鍏ヨ嵂鍝佸悕绉�"
+ maxlength="40"/>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="閫氱敤鍚�" prop="genericName">
+ <el-input
+ v-model="drugForm.genericName"
+ placeholder="璇疯緭鍏ヨ嵂鍝侀�氱敤鍚�"
+ maxlength="40"/>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row>
+ <el-col :span="12">
+ <el-form-item label="鑽搧鍒嗙被" prop="categoryId">
+ <el-select
+ style="width: 300px;"
+ v-model="drugForm.categoryId"
+ size="medium"
+ filterable
+ placeholder="璇烽�夋嫨鍒嗙被">
+ <el-option-group
+ v-for="group in deptOptions"
+ :key="group.id"
+ :label="group.categoryName">
+ <el-option
+ v-for="item in group.children"
+ :key="item.id"
+ :label="item.categoryName"
+ :value="item.id">
+ </el-option>
+ </el-option-group>
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鑽搧绫诲瀷" prop="drugType">
+ <el-select v-model="drugForm.drugType" placeholder="璇烽�夋嫨鑽搧绫诲瀷">
+ <el-option
+ v-for="item in drugTypes"
+ :key="item.value"
+ :label="item.label"
+ :value="item.value">
+ </el-option>
+ </el-select>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row>
+ <el-col :span="12">
+ <el-form-item label="鏄惁澶勬柟鑽�" prop="isPrescription">
+ <el-radio-group v-model="drugForm.isPrescription">
+ <el-radio
+ v-for="(item, index) in prescriptionOptions"
+ :label="item.value">{{ item.label }}</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鎵瑰噯鏂囧彿" prop="approvalNumber">
+ <el-input
+ v-model="drugForm.approvalNumber"
+ placeholder="璇疯緭鍏ユ壒鍑嗘枃鍙�"
+ maxlength="40"/>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row>
+ <el-col :span="12">
+ <el-form-item label="瑙勬牸" prop="specification">
+ <el-input
+ v-model="drugForm.specification"
+ placeholder="璇疯緭鍏ヨ嵂鍝佽鏍�"
+ maxlength="40"/>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鍗曚綅" prop="unit">
+ <el-select v-model="drugForm.unit" placeholder="璇烽�夋嫨鍗曚綅">
+ <el-option
+ v-for="item in unitOptions"
+ :key="item.value"
+ :label="item.label"
+ :value="item.value">
+ </el-option>
+ </el-select>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row>
+ <el-col :span="12">
+ <el-form-item label="鐢熶骇鍘傚" prop="manufacturer">
+ <el-input
+ v-model="drugForm.manufacturer"
+ placeholder="璇疯緭鍏ョ敓浜у巶瀹�"
+ maxlength="100"/>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鏉″舰鐮�" prop="barcode">
+ <el-input
+ v-model="drugForm.barcode"
+ placeholder="璇疯緭鍏ユ潯褰㈢爜"
+ maxlength="40"/>
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <div class="headline">
+ <div class="basics">鑽搧鎴愬垎</div>
+ </div>
+ <el-divider></el-divider>
+ <el-form-item prop="ingredients">
+ <el-input
+ type="textarea"
+ :rows="3"
+ placeholder="璇疯緭鍏ヨ嵂鍝佷富瑕佹垚鍒�"
+ v-model="drugForm.ingredients">
+ </el-input>
+ </el-form-item>
+
+ <div class="headline">
+ <div class="basics">鐢ㄦ硶鐢ㄩ噺</div>
+ </div>
+ <el-divider></el-divider>
+ <el-form-item prop="usageDosage">
+ <el-input
+ type="textarea"
+ :rows="3"
+ placeholder="璇疯緭鍏ョ敤娉曠敤閲忚鏄�"
+ v-model="drugForm.usageDosage">
+ </el-input>
+ </el-form-item>
+
+ <div class="headline">
+ <div class="basics">涓嶈壇鍙嶅簲</div>
+ </div>
+ <el-divider></el-divider>
+ <el-form-item prop="adverseReactions">
+ <el-input
+ type="textarea"
+ :rows="3"
+ placeholder="璇疯緭鍏ヤ笉鑹弽搴旇鏄�"
+ v-model="drugForm.adverseReactions">
+ </el-input>
+ </el-form-item>
+
+ <div class="headline">
+ <div class="basics">绂佸繉</div>
+ </div>
+ <el-divider></el-divider>
+ <el-form-item prop="contraindications">
+ <el-input
+ type="textarea"
+ :rows="3"
+ placeholder="璇疯緭鍏ョ蹇岃鏄�"
+ v-model="drugForm.contraindications">
+ </el-input>
+ </el-form-item>
+
+ <div class="headline">
+ <div class="basics">娉ㄦ剰浜嬮」</div>
+ </div>
+ <el-divider></el-divider>
+ <el-form-item prop="precautions">
+ <el-input
+ type="textarea"
+ :rows="3"
+ placeholder="璇疯緭鍏ユ敞鎰忎簨椤�"
+ v-model="drugForm.precautions">
+ </el-input>
+ </el-form-item>
+ </el-form>
+ <div slot="footer" class="dialog-footer">
+ <el-button type="primary" @click="submitForm">淇� 瀛�</el-button>
+ <el-button @click="cancel">鍏� 闂�</el-button>
+ </div>
+ </el-dialog>
+ </div>
+ </div>
+ <!-- 娣诲姞绫诲埆寮规 -->
+ <el-dialog title="鏂板绫诲埆" width="30%" :visible.sync="dialogFormVisible">
+ <div style="text-align: center; margin-bottom: 20px">
+ <el-radio-group v-model="radio">
+ <el-radio-button label="涓诲垎绫�"></el-radio-button>
+ <el-radio-button label="瀛愬垎绫�"></el-radio-button>
+ </el-radio-group>
+ </div>
+ <el-divider></el-divider>
+
+ <el-form :model="classifyform">
+ <el-form-item label="璇烽�夋嫨鑽搧澶х被" v-if="radio == '瀛愬垎绫�'">
+ <el-select v-model="classifyform.pid" placeholder="璇烽�夋嫨">
+ <el-option
+ v-for="item in deptOptions"
+ :key="item.id"
+ :label="item.categoryName"
+ :value="item.id">
+ </el-option>
+ </el-select>
+ </el-form-item>
+ <el-form-item label="璇疯緭鍏ョ被鍒悕绉�">
+ <el-input
+ v-model="classifyform.categoryName"
+ autocomplete="off"></el-input>
+ </el-form-item>
+ </el-form>
+ <div slot="footer" class="dialog-footer">
+ <el-button @click="getDeptTree()">鍙� 娑�</el-button>
+ <el-button type="primary" @click="submitsidecolumn">纭� 瀹�</el-button>
+ </div>
+ </el-dialog>
</div>
</template>
<script>
export default {
- data () {
+ name: "DrugKnowledge",
+ dicts: ["sys_normal_disable", "sys_user_sex"],
+ data() {
return {
-
+ // 閬僵灞�
+ loading: false,
+ // 閫変腑鏁扮粍
+ ids: [],
+ // 闈炲崟涓鐢�
+ single: true,
+ // 闈炲涓鐢�
+ multiple: true,
+ // 鏄剧ず鎼滅储鏉′欢
+ showSearch: true,
+ // 鎬绘潯鏁�
+ total: 0,
+ idds: "",
+ classifyform: { // 娣诲姞杩欎釜瀵硅薄
+ id: undefined,
+ pid: undefined,
+ categoryName: undefined
+ },
+ amendtag: false, //鏄惁淇敼绫诲埆
+ dialogFormVisible: false, //淇敼娣诲姞绫诲埆寮规
+ deleteVisible: false, //鍒嗙被鍒犻櫎寮规
+ deletefenl: "楂樿鍘�", //鍒犻櫎椤�
+ radio: "涓诲垎绫�",
+ // 琛ㄦ牸鏁版嵁
+ drugList: [
+ {
+ id: 1,
+ drugName: "闃胯帿瑗挎灄鑳跺泭",
+ genericName: "闃胯帿瑗挎灄",
+ categoryId: 101,
+ categoryName: "鎶楃敓绱�",
+ drugType: "1",
+ isPrescription: "1",
+ specification: "0.25g脳24绮�",
+ unit: "鐩�",
+ manufacturer: "鍗庡寳鍒惰嵂",
+ approvalNumber: "鍥借嵂鍑嗗瓧H13024176",
+ barcode: "6923450601234",
+ ingredients: "闃胯帿瑗挎灄",
+ usageDosage: "鍙f湇銆傛垚浜轰竴娆�0.5g锛屾瘡6锝�8灏忔椂1娆★紝涓�鏃ュ墏閲忎笉瓒呰繃4g銆�",
+ adverseReactions: "1.鎭跺績銆佸憰鍚愩�佽吂娉诲強鍋囪啘鎬ц偁鐐庣瓑鑳冭偁閬撳弽搴斻��2.鐨柟銆佽嵂鐗╃儹鍜屽摦鍠樼瓑杩囨晱鍙嶅簲銆�",
+ contraindications: "闈掗湁绱犺繃鏁忓強闈掗湁绱犵毊鑲よ瘯楠岄槼鎬ф偅鑰呯鐢ㄣ��",
+ precautions: "1.闈掗湁绱犵被鍙f湇鑽墿鍋跺彲寮曡捣杩囨晱鎬т紤鍏嬶紝灏ゅ瑙佷簬鏈夐潚闇夌礌鎴栧ご瀛㈣弻绱犺繃鏁忓彶鐨勬偅鑰呫��2.浼犳煋鎬у崟鏍哥粏鑳炲澶氱棁鎮h�呭簲鐢ㄦ湰鍝佹槗鍙戠敓鐨柟锛屽簲閬垮厤浣跨敤銆�"
+ },
+ {
+ id: 2,
+ drugName: "鏉胯摑鏍归绮�",
+ genericName: "鏉胯摑鏍�",
+ categoryId: 302,
+ categoryName: "鐗囧墏",
+ drugType: "3",
+ isPrescription: "0",
+ specification: "10g脳20琚�",
+ unit: "鐩�",
+ manufacturer: "鐧戒簯灞卞埗鑽�",
+ approvalNumber: "鍥借嵂鍑嗗瓧Z44023445",
+ barcode: "6923450605678",
+ ingredients: "鏉胯摑鏍�",
+ usageDosage: "寮�姘村啿鏈嶃�備竴娆�5锝�10g锛屼竴鏃�3锝�4娆°��",
+ adverseReactions: "灏氫笉鏄庣‘銆�",
+ contraindications: "灏氫笉鏄庣‘銆�",
+ precautions: "1.蹇岀儫銆侀厭鍙婅緵杈c�佺敓鍐枫�佹补鑵婚鐗┿��2.涓嶅疁鍦ㄦ湇鑽湡闂村悓鏃舵湇鐢ㄦ粙琛ユ�т腑鑽��"
+ },
+ {
+ id: 3,
+ drugName: "澶嶆柟涓瑰弬鐗�",
+ genericName: "澶嶆柟涓瑰弬",
+ categoryId: 303,
+ categoryName: "鑳跺泭",
+ drugType: "3",
+ isPrescription: "0",
+ specification: "60鐗�",
+ unit: "鐡�",
+ manufacturer: "鍚屼粊鍫�",
+ approvalNumber: "鍥借嵂鍑嗗瓧Z11020672",
+ barcode: "6923450609012",
+ ingredients: "涓瑰弬銆佷笁涓冦�佸啺鐗�",
+ usageDosage: "鍙f湇銆備竴娆�3鐗囷紝涓�鏃�3娆°��",
+ adverseReactions: "灏氫笉鏄庣‘銆�",
+ contraindications: "瀛曞绂佺敤銆�",
+ precautions: "1.蹇岄鐢熷喎銆佽緵杈c�佹补鑵婚鐗┿��2.鏈嶈嵂鏈熼棿濡傛湁涓嶉�傦紝搴旂珛鍗冲仠鑽苟灏卞尰銆�"
+ },
+ {
+ id: 4,
+ drugName: "甯冩礇鑺紦閲婅兌鍥�",
+ genericName: "甯冩礇鑺�",
+ categoryId: 102,
+ categoryName: "瑙g儹闀囩棝鑽�",
+ drugType: "1",
+ isPrescription: "0",
+ specification: "0.3g脳20绮�",
+ unit: "鐩�",
+ manufacturer: "涓編鍙插厠",
+ approvalNumber: "鍥借嵂鍑嗗瓧H10900089",
+ barcode: "6923450612345",
+ ingredients: "甯冩礇鑺�",
+ usageDosage: "鍙f湇銆傛垚浜轰竴娆�1绮掞紝涓�鏃�2娆�(鏃╂櫄鍚勪竴娆�)銆�",
+ adverseReactions: "1.灏戞暟鐥呬汉鍙嚭鐜版伓蹇冦�佸憰鍚愩�佽儍鐑х伡鎰熸垨杞诲害娑堝寲涓嶈壇銆佽儍鑲犻亾婧冪枴鍙婂嚭琛�銆佽浆姘ㄩ叾鍗囬珮銆佸ご鐥涖�佸ご鏅曘�佽�抽福銆佽鍔涙ā绯娿�佺簿绁炵揣寮犮�佸棞鐫°�佷笅鑲㈡按鑲挎垨浣撻噸楠ゅ銆�",
+ contraindications: "1.瀵瑰叾浠栭潪鐢句綋鎶楃値鑽繃鏁忚�呯鐢ㄣ��2.瀛曞鍙婂摵涔虫湡濡囧コ绂佺敤銆�3.瀵归樋鍙稿尮鏋楄繃鏁忕殑鍝枠鎮h�呯鐢ㄣ��",
+ precautions: "1.鏈搧涓哄鐥囨不鐤楄嵂锛屼笉瀹滈暱鏈熸垨澶ч噺浣跨敤锛岀敤浜庢鐥涗笉寰楄秴杩�5澶╋紝鐢ㄤ簬瑙g儹涓嶅緱瓒呰繃3澶╋紝濡傜棁鐘朵笉缂撹В锛岃鍜ㄨ鍖诲笀鎴栬嵂甯堛��2.涓嶈兘鍚屾椂鏈嶇敤鍏朵粬鍚湁瑙g儹闀囩棝鑽殑鑽搧(濡傛煇浜涘鏂规姉鎰熷啋鑽�)銆�"
+ },
+ {
+ id: 5,
+ drugName: "鍏懗鍦伴粍涓�",
+ genericName: "鍏懗鍦伴粍",
+ categoryId: 201,
+ categoryName: "琛ョ泭鑽�",
+ drugType: "3",
+ isPrescription: "0",
+ specification: "200涓�",
+ unit: "鐡�",
+ manufacturer: "鍚屼粊鍫�",
+ approvalNumber: "鍥借嵂鍑嗗瓧Z11020061",
+ barcode: "6923450615678",
+ ingredients: "鐔熷湴榛勩�侀厭钀歌倝銆佺墶涓圭毊銆佸北鑽�佽尟鑻撱�佹辰娉�",
+ usageDosage: "鍙f湇銆備竴娆�8涓革紝涓�鏃�3娆°��",
+ adverseReactions: "灏氫笉鏄庣‘銆�",
+ contraindications: "灏氫笉鏄庣‘銆�",
+ precautions: "1.蹇岃緵杈i鐗┿��2.涓嶅疁鍦ㄦ湇鑽湡闂存湇鎰熷啋鑽��3.鏈嶈嵂鏈熼棿鍑虹幇椋熸涓嶆尟锛岃儍鑴樹笉閫傦紝澶т究绋�锛岃吂鐥涚瓑鐥囩姸鏃讹紝搴斿幓鍖婚櫌灏辫瘖銆�"
+ }
+ ],
+ // 寮瑰嚭灞傛爣棰�
+ title: "",
+ // 鏄惁鏄剧ず寮瑰嚭灞�
+ drugOpen: false,
+ // 鏃ユ湡鑼冨洿
+ dateRange: [],
+ // 鑽搧鍒嗙被閫夐」
+ drugCategories: [
+ { id: 101, categoryName: "鎶楃敓绱�" },
+ { id: 102, categoryName: "瑙g儹闀囩棝鑽�" },
+ { id: 103, categoryName: "蹇冭绠¤嵂鐗�" },
+ { id: 201, categoryName: "琛ョ泭鑽�" },
+ { id: 202, categoryName: "娓呯儹鑽�" },
+ { id: 203, categoryName: "绁涙箍鑽�" },
+ { id: 301, categoryName: "涓稿墏" },
+ { id: 302, categoryName: "鐗囧墏" },
+ { id: 303, categoryName: "鑳跺泭" }
+ ],
+ // 娣诲姞銆佷慨鏀瑰弬鏁�
+ drugForm: {},
+ deptOptions: [
+ {
+ id: 1,
+ categoryName: "瑗胯嵂",
+ children: [
+ { id: 101, categoryName: "鎶楃敓绱�" },
+ { id: 102, categoryName: "瑙g儹闀囩棝鑽�" },
+ { id: 103, categoryName: "蹇冭绠¤嵂鐗�" }
+ ]
+ },
+ {
+ id: 2,
+ categoryName: "涓嵂",
+ children: [
+ { id: 201, categoryName: "琛ョ泭鑽�" },
+ { id: 202, categoryName: "娓呯儹鑽�" },
+ { id: 203, categoryName: "绁涙箍鑽�" }
+ ]
+ },
+ {
+ id: 3,
+ categoryName: "涓垚鑽�",
+ children: [
+ { id: 301, categoryName: "涓稿墏" },
+ { id: 302, categoryName: "鐗囧墏" },
+ { id: 303, categoryName: "鑳跺泭" }
+ ]
+ }
+ ],
+ defaultProps: {
+ children: "children",
+ label: "categoryName",
+ },
+ sidecolumnform: {}, //娣诲姞绫诲埆琛ㄥ崟
+ dialogFormVisible: false, //娣诲姞绫诲埆寮规
+ sidecolumnval: "", //绫诲埆鎼滅储
+ // 鏌ヨ鍙傛暟
+ queryParams: {
+ pageNum: 1,
+ pageSize: 10,
+ drugName: undefined,
+ categoryId: undefined,
+ drugType: undefined,
+ isPrescription: undefined
+ },
+ // 鑽搧绫诲瀷閫夐」
+ drugTypes: [
+ { value: "1", label: "瑗胯嵂" },
+ { value: "2", label: "涓嵂" },
+ { value: "3", label: "涓垚鑽�" },
+ { value: "4", label: "鐢熺墿鍒跺搧" },
+ { value: "5", label: "鍏朵粬" }
+ ],
+ // 鏄惁澶勬柟鑽�夐」
+ prescriptionOptions: [
+ { value: "1", label: "澶勬柟鑽�" },
+ { value: "0", label: "闈炲鏂硅嵂" }
+ ],
+ // 鍗曚綅閫夐」
+ unitOptions: [
+ { value: "鐩�", label: "鐩�" },
+ { value: "鐡�", label: "鐡�" },
+ { value: "鏀�", label: "鏀�" },
+ { value: "琚�", label: "琚�" },
+ { value: "鐗�", label: "鐗�" },
+ { value: "绮�", label: "绮�" },
+ { value: "g", label: "鍏�" },
+ { value: "ml", label: "姣崌" }
+ ],
+ // 琛ㄥ崟鏍¢獙
+ rules: {
+ drugName: [
+ { required: true, message: "鑽搧鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }
+ ],
+ genericName: [
+ { required: true, message: "閫氱敤鍚嶄笉鑳戒负绌�", trigger: "blur" }
+ ],
+ categoryId: [
+ { required: true, message: "鑽搧鍒嗙被涓嶈兘涓虹┖", trigger: "blur" }
+ ],
+ drugType: [
+ { required: true, message: "鑽搧绫诲瀷涓嶈兘涓虹┖", trigger: "blur" }
+ ],
+ isPrescription: [
+ { required: true, message: "鏄惁澶勬柟鑽笉鑳戒负绌�", trigger: "blur" }
+ ],
+ specification: [
+ { required: true, message: "瑙勬牸涓嶈兘涓虹┖", trigger: "blur" }
+ ],
+ unit: [
+ { required: true, message: "鍗曚綅涓嶈兘涓虹┖", trigger: "blur" }
+ ],
+ approvalNumber: [
+ { required: true, message: "鎵瑰噯鏂囧彿涓嶈兘涓虹┖", trigger: "blur" }
+ ],
+ manufacturer: [
+ { required: true, message: "鐢熶骇鍘傚涓嶈兘涓虹┖", trigger: "blur" }
+ ]
+ }
+ };
+ },
+ computed: {
+ filteredDrugList() {
+ let list = [...this.drugList];
+ if (this.queryParams.drugName) {
+ list = list.filter(item =>
+ item.drugName.includes(this.queryParams.drugName)
+ );
+ }
+ if (this.queryParams.categoryId) {
+ list = list.filter(item =>
+ item.categoryId == this.queryParams.categoryId
+ );
+ }
+ if (this.queryParams.drugType) {
+ list = list.filter(item =>
+ item.drugType == this.queryParams.drugType
+ );
+ }
+ if (this.queryParams.isPrescription) {
+ list = list.filter(item =>
+ item.isPrescription == this.queryParams.isPrescription
+ );
+ }
+ return list;
}
},
-
- created () {
-
+ watch: {
+ // 鏍规嵁鍚嶇О绛涢�夐儴闂ㄦ爲
+ sidecolumnval(val) {
+ this.$refs.tree.filter(val);
+ }
},
-
+ created() {
+ // 鍒濆鍖栨暟鎹�
+ this.total = this.drugList.length;
+ },
methods: {
+ /** 鏌ヨ鑽搧鍒楄〃 */
+ getList() {
+ this.loading = true;
+ setTimeout(() => {
+ this.loading = false;
+ }, 500);
+ },
+ /** 鏌ヨ鑽搧鍒嗙被鏍戠粨鏋� */
+ getDeptTree() {
+ this.dialogFormVisible = false;
+ },
+ // 绛涢�夎妭鐐�
+ filterNode(value, data) {
+ if (!value) return true;
+ return data.categoryName.indexOf(value) !== -1;
+ },
+ // 娣诲姞绫诲埆鏍�
+ submitsidecolumn() {
+ if (this.classifyform.id) {
+ // 妯℃嫙淇敼鍒嗙被
+ const category = this.findCategory(this.classifyform.id);
+ if (category) {
+ category.categoryName = this.classifyform.categoryName;
+ if (this.classifyform.pid) {
+ category.pid = this.classifyform.pid;
+ }
+ }
+ this.$modal.msgSuccess("淇敼鎴愬姛");
+ this.classifyform = {};
+ this.dialogFormVisible = false;
+ return;
+ }
+ // 妯℃嫙鏂板鍒嗙被
+ const newCategory = {
+ id: Math.max(...this.deptOptions.flatMap(group =>
+ [group.id, ...(group.children || []).map(child => child.id)]
+ )) + 1,
+ categoryName: this.classifyform.categoryName,
+ pid: this.radio === "瀛愬垎绫�" ? this.classifyform.pid : null
+ };
+
+ if (this.radio === "瀛愬垎绫�") {
+ const parent = this.findCategory(this.classifyform.pid);
+ if (parent) {
+ if (!parent.children) parent.children = [];
+ parent.children.push(newCategory);
+ }
+ } else {
+ newCategory.children = [];
+ this.deptOptions.push(newCategory);
+ }
+
+ this.$modal.msgSuccess("鏂板鎴愬姛");
+ this.classifyform = {};
+ this.dialogFormVisible = false;
+ },
+
+ findCategory(id) {
+ for (const group of this.deptOptions) {
+ if (group.id === id) return group;
+ if (group.children) {
+ for (const child of group.children) {
+ if (child.id === id) return child;
+ }
+ }
+ }
+ return null;
+ },
+
+ remove(a, b) {
+ if (b.pid) {
+ this.$modal
+ .confirm('鏄惁纭鍒犻櫎鍒嗙被椤逛负"' + b.categoryName + '"鐨勬暟鎹」锛�')
+ .then(() => {
+ // 妯℃嫙鍒犻櫎瀛愬垎绫�
+ const parent = this.findCategory(b.pid);
+ if (parent && parent.children) {
+ parent.children = parent.children.filter(child => child.id !== b.id);
+ }
+ this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+ })
+ .catch(() => {});
+ } else {
+ this.$modal
+ .confirm(
+ '鏄惁纭鍒犻櫎涓�绾у垎绫�"' +
+ b.categoryName +
+ '"锛熷垹闄ゅ悗鍏朵笅鍒嗙被灏嗗綊绫烩�樻湭鍒嗙被鈥�'
+ )
+ .then(() => {
+ // 妯℃嫙鍒犻櫎涓诲垎绫�
+ this.deptOptions = this.deptOptions.filter(group => group.id !== b.id);
+ this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+ })
+ .catch(() => {});
+ }
+ },
+ altertag(a, b) {
+ this.dialogFormVisible = true;
+ if (!b.pid) {
+ this.radio = "涓诲垎绫�";
+ } else {
+ this.radio = "瀛愬垎绫�";
+ }
+ this.classifyform = JSON.parse(JSON.stringify(b));
+ this.dialogFormVisible = true;
+ },
+ handleNodeClick(data) {
+ this.queryParams.categoryId = data.id;
+ },
+
+ // 鍙栨秷鎸夐挳
+ cancel() {
+ this.drugForm = {};
+ this.drugOpen = false;
+ this.reset();
+ },
+
+ // 琛ㄥ崟閲嶇疆
+ reset() {
+ this.drugForm = {
+ id: undefined,
+ drugName: undefined,
+ genericName: undefined,
+ categoryId: undefined,
+ drugType: undefined,
+ isPrescription: undefined,
+ specification: undefined,
+ unit: undefined,
+ manufacturer: undefined,
+ approvalNumber: undefined,
+ barcode: undefined,
+ ingredients: undefined,
+ usageDosage: undefined,
+ adverseReactions: undefined,
+ contraindications: undefined,
+ precautions: undefined
+ };
+ },
+ /** 鎼滅储鎸夐挳鎿嶄綔 */
+ handleQuery() {
+ this.queryParams.pageNum = 1;
+ },
+ /** 閲嶇疆鎸夐挳鎿嶄綔 */
+ resetQuery() {
+ this.dateRange = [];
+ this.resetForm("queryForm");
+ this.queryParams = {
+ pageNum: 1,
+ pageSize: 10,
+ drugName: undefined,
+ categoryId: undefined,
+ drugType: undefined,
+ isPrescription: undefined
+ };
+ this.$refs.tree.setCurrentKey(null);
+ },
+ // 澶氶�夋閫変腑鏁版嵁
+ handleSelectionChange(selection) {
+ this.ids = selection.map(item => item.id);
+ this.single = selection.length != 1;
+ this.multiple = !selection.length;
+ },
+ /** 鏂板鎸夐挳鎿嶄綔 */
+ handleAdd() {
+ this.reset();
+ this.title = "鏂板鑽搧";
+ this.drugForm = {};
+ this.drugOpen = true;
+ },
+ /** 淇敼鎸夐挳鎿嶄綔 */
+ handleUpdate(row) {
+ this.reset();
+ this.title = "淇敼鑽搧淇℃伅";
+ this.drugForm = Object.assign({}, row);
+ this.drugOpen = true;
+ },
+ /** 鎻愪氦鎸夐挳 */
+ submitForm: function() {
+ this.$refs["drugForm"].validate(valid => {
+ if (valid) {
+ if (this.drugForm.id != undefined) {
+ // 妯℃嫙淇敼鑽搧
+ const index = this.drugList.findIndex(item => item.id === this.drugForm.id);
+ if (index !== -1) {
+ this.drugList.splice(index, 1, this.drugForm);
+ }
+ this.$modal.msgSuccess("淇敼鎴愬姛");
+ } else {
+ // 妯℃嫙鏂板鑽搧
+ this.drugForm.id = Math.max(...this.drugList.map(item => item.id)) + 1;
+ this.drugList.unshift(this.drugForm);
+ this.total = this.drugList.length;
+ this.$modal.msgSuccess("鏂板鎴愬姛");
+ }
+ this.drugOpen = false;
+ }
+ });
+ },
+ /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+ handleDelete(row) {
+ const drugIds = row.id || this.ids;
+ this.$modal
+ .confirm('鏄惁纭鍒犻櫎鑽搧鍚嶇О涓�"' + row.drugName + '"鐨勬暟鎹」锛�')
+ .then(() => {
+ // 妯℃嫙鍒犻櫎鑽搧
+ this.drugList = this.drugList.filter(item => item.id !== drugIds);
+ this.total = this.drugList.length;
+ this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+ })
+ .catch(() => {});
+ }
}
-}
+};
</script>
-<style lang='scss' scoped>
-
+<style lang="scss" scoped>
+.DrugKnowledgeManagement {
+ display: flex;
+}
+.sidecolumn {
+ width: 300px;
+ min-height: 100vh;
+ text-align: center;
+ margin-top: 20px;
+ margin: 20px;
+ padding: 30px;
+ background: #fff;
+ border: 1px solid #dcdfe6;
+ -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+ 0 0 6px 0 rgba(0, 0, 0, 0.04);
+ .sidecolumn-top {
+ display: flex;
+ justify-content: space-between;
+ .top-wj {
+ font-size: 20px;
+ }
+ .top-tj {
+ font-size: 18px;
+ color: rgb(0, 89, 255);
+ cursor: pointer;
+ }
+ }
+ .center-ss {
+ margin-top: 30px;
+ .input-with-select {
+ height: 40px !important;
+ }
+ }
+ .bottom-fl {
+ margin-top: 30px;
+ display: center !important;
+ }
+}
+.headline {
+ display: flex;
+ justify-content: space-between;
+ font-size: 20px;
+ border-left: 4px solid #41a1be;
+ padding-left: 5px;
+ margin: 15px 0;
+}
+.leftvlue {
+ width: 80%;
+ margin-top: 20px;
+ padding: 30px;
+ background: #ffff;
+ border: 1px solid #dcdfe6;
+ -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+ 0 0 6px 0 rgba(0, 0, 0, 0.04);
+}
+::v-deep .el-tree-node__content {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ height: 46px;
+ font-size: 20px;
+ cursor: pointer;
+}
+::v-deep .el-tree {
+ position: relative;
+ cursor: default;
+ border-radius: 5px;
+ background: #eff8fe;
+ color: #606266;
+ border: 1px solid #bbe1fa;
+ -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+ 0 0 6px 0 rgba(0, 0, 0, 0.04);
+}
+::v-deep
+ .el-tree--highlight-current
+ .el-tree-node.is-current
+ > .el-tree-node__content {
+ background-color: #7799fb;
+ color: #fff;
+}
+::v-deep .el-button--mini.is-circle {
+ padding: 7px;
+ margin: 0;
+ color: red;
+}
+.button-text {
+ color: rgb(70, 204, 238);
+}
+.button-textcs {
+ color: rgb(39, 167, 67);
+}
+.button-textxg {
+ color: rgb(35, 81, 233);
+}
+.button-textsc {
+ color: rgb(235, 23, 23);
+}
</style>
diff --git a/src/views/login.vue b/src/views/login.vue
index 0590ecb..ca16496 100644
--- a/src/views/login.vue
+++ b/src/views/login.vue
@@ -136,7 +136,7 @@
smsCode: "",
rememberMe: false,
code: "",
- orgid: "1",
+ orgid: "47255004333112711A1001",
},
options: [
{ value: "1", label: "鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�" },
@@ -296,7 +296,7 @@
const loginData = {
username: this.loginForm.username,
- orgid: "1",
+ orgid: "47255004333112711A1001",
loginType: this.loginMethod
};
@@ -311,7 +311,7 @@
this.$store
.dispatch("Login", loginData)
.then(() => {
- this.$router.push({ path: this.redirect || "/" }).catch(() => {});
+ this.$router.push({ path: this.redirect || "/followvisit/discharge" }).catch(() => {});
})
.catch(() => {
this.loading = false;
diff --git a/src/views/system/group/index.vue b/src/views/system/group/index.vue
new file mode 100644
index 0000000..af86dae
--- /dev/null
+++ b/src/views/system/group/index.vue
@@ -0,0 +1,1343 @@
+<template>
+ <div class="TeamManagement">
+ <!-- 鍥㈤槦绠$悊 -->
+ <el-tabs v-model="activeTab" type="card">
+ <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-item label="鍥㈤槦鍚嶇О" prop="name">
+ <el-input
+ v-model="teamQueryParams.name"
+ placeholder="璇疯緭鍏ュ洟闃熷悕绉�"
+ clearable
+ style="width: 200px"
+ @keyup.enter.native="handleTeamQuery"
+ />
+ </el-form-item>
+ <el-form-item label="鍥㈤槦鐘舵��" prop="status">
+ <el-select v-model="teamQueryParams.status" placeholder="璇烽�夋嫨鐘舵��" clearable style="width: 200px">
+ <el-option
+ v-for="item in teamStatusOptions"
+ :key="item.value"
+ :label="item.label"
+ :value="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-form-item>
+ </el-form>
+
+ <el-row :gutter="10" class="mb8">
+ <el-col :span="1.5">
+ <el-button
+ type="primary"
+ plain
+ icon="el-icon-plus"
+ size="medium"
+ @click="handleTeamAdd"
+ >鏂板鍥㈤槦</el-button>
+ </el-col>
+ </el-row>
+
+ <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">
+ <template slot-scope="scope">
+ <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
+ </template>
+ </el-table-column>
+ <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
+ size="mini"
+ type="text"
+ icon="el-icon-edit"
+ @click="handleTeamUpdate(scope.row)"
+ >缂栬緫</el-button>
+ <el-button
+ size="mini"
+ type="text"
+ icon="el-icon-delete"
+ @click="handleTeamDelete(scope.row)"
+ >鍒犻櫎</el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+
+ <pagination
+ v-show="teamTotal>0"
+ :total="teamTotal"
+ :page.sync="teamQueryParams.pageNum"
+ :limit.sync="teamQueryParams.pageSize"
+ @pagination="getTeamList"
+ />
+ </el-col>
+ </el-row>
+ </el-tab-pane>
+
+ <!-- 浜哄憳鍒嗙粍 -->
+ <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-item label="鎴愬憳濮撳悕" prop="name">
+ <el-input
+ v-model="memberQueryParams.name"
+ placeholder="璇疯緭鍏ユ垚鍛樺鍚�"
+ clearable
+ style="width: 200px"
+ @keyup.enter.native="handleMemberQuery"
+ />
+ </el-form-item>
+ <el-form-item label="鎵�灞炲洟闃�" prop="teamId">
+ <el-select v-model="memberQueryParams.teamId" placeholder="璇烽�夋嫨鍥㈤槦" clearable style="width: 200px">
+ <el-option
+ v-for="item in teamList"
+ :key="item.id"
+ :label="item.name"
+ :value="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-option
+ v-for="item in memberStatusOptions"
+ :key="item.value"
+ :label="item.label"
+ :value="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-form-item>
+ </el-form>
+
+ <el-row :gutter="10" class="mb8">
+ <el-col :span="1.5">
+ <el-button
+ type="primary"
+ plain
+ icon="el-icon-plus"
+ size="medium"
+ @click="handleMemberAdd"
+ >鏂板鎴愬憳</el-button>
+ </el-col>
+ <el-col :span="1.5">
+ <el-button
+ type="danger"
+ plain
+ icon="el-icon-delete"
+ size="medium"
+ :disabled="multiple"
+ @click="handleMemberDelete"
+ >鍒犻櫎</el-button>
+ </el-col>
+ </el-row>
+
+ <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">
+ <template slot-scope="scope">
+ <el-tag :type="scope.row.currentWorkOrder ? '' : 'info'">
+ {{ scope.row.currentWorkOrder || '绌洪棽' }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="鎴愬憳鐘舵��" align="center" prop="status" width="100">
+ <template slot-scope="scope">
+ <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">
+ <template slot-scope="scope">
+ <el-button
+ size="mini"
+ type="text"
+ icon="el-icon-edit"
+ @click="handleMemberUpdate(scope.row)"
+ >缂栬緫</el-button>
+ <el-button
+ size="mini"
+ type="text"
+ icon="el-icon-delete"
+ @click="handleMemberDelete(scope.row)"
+ >鍒犻櫎</el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+
+ <pagination
+ v-show="memberTotal>0"
+ :total="memberTotal"
+ :page.sync="memberQueryParams.pageNum"
+ :limit.sync="memberQueryParams.pageSize"
+ @pagination="getMemberList"
+ />
+ </el-col>
+ </el-row>
+ </el-tab-pane>
+
+ <!-- 宸ュ崟鎸囨淳 -->
+ <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-item label="宸ュ崟缂栧彿" prop="id">
+ <el-input
+ v-model="workOrderQueryParams.id"
+ placeholder="璇疯緭鍏ュ伐鍗曠紪鍙�"
+ clearable
+ style="width: 200px"
+ @keyup.enter.native="handleWorkOrderQuery"
+ />
+ </el-form-item>
+ <el-form-item label="宸ュ崟鐘舵��" prop="status">
+ <el-select v-model="workOrderQueryParams.status" placeholder="璇烽�夋嫨鐘舵��" clearable style="width: 200px">
+ <el-option
+ v-for="item in workOrderStatusOptions"
+ :key="item.value"
+ :label="item.label"
+ :value="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-option
+ v-for="item in memberList"
+ :key="item.id"
+ :label="item.name"
+ :value="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-form-item>
+ </el-form>
+
+ <el-row :gutter="10" class="mb8">
+ <el-col :span="1.5">
+ <el-button
+ type="primary"
+ plain
+ icon="el-icon-plus"
+ size="medium"
+ @click="handleWorkOrderAdd"
+ >鏂板缓宸ュ崟</el-button>
+ </el-col>
+ </el-row>
+
+ <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">
+ <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>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="160">
+ <template slot-scope="scope">
+ <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鎴鏃堕棿" align="center" prop="deadline" width="160">
+ <template slot-scope="scope">
+ <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">
+ <template slot-scope="scope">
+ <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">
+ <template slot-scope="scope">
+ <el-button
+ size="mini"
+ type="text"
+ icon="el-icon-edit"
+ @click="handleWorkOrderUpdate(scope.row)"
+ >缂栬緫</el-button>
+ <el-button
+ size="mini"
+ type="text"
+ icon="el-icon-delete"
+ @click="handleWorkOrderDelete(scope.row)"
+ >鍒犻櫎</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>
+ </template>
+ </el-table-column>
+ </el-table>
+
+ <pagination
+ v-show="workOrderTotal>0"
+ :total="workOrderTotal"
+ :page.sync="workOrderQueryParams.pageNum"
+ :limit.sync="workOrderQueryParams.pageSize"
+ @pagination="getWorkOrderList"
+ />
+ </el-col>
+ </el-row>
+ </el-tab-pane>
+ </el-tabs>
+
+ <!-- 鍥㈤槦璇︽儏瀵硅瘽妗� -->
+ <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="鍥㈤槦鐘舵��">
+ <dict-tag :options="teamStatusOptions" :value="currentTeam.status"/>
+ </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="headline">
+ <div class="basics">鍥㈤槦鎴愬憳</div>
+ </div>
+ <el-divider></el-divider>
+ <el-table :data="currentTeam.members" border style="width: 100%">
+ <el-table-column prop="name" label="鎴愬憳濮撳悕" width="120" />
+ <el-table-column prop="position" label="鑱屼綅" width="120" />
+ <el-table-column prop="phone" label="鑱旂郴鐢佃瘽" width="150" />
+ <el-table-column prop="email" label="閭" width="200" />
+ <el-table-column prop="currentWorkOrder" label="褰撳墠宸ュ崟" width="150">
+ <template slot-scope="scope">
+ <el-tag :type="scope.row.currentWorkOrder ? '' : 'info'">
+ {{ 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"/>
+ </template>
+ </el-table-column>
+ </el-table>
+ </div>
+
+ <div class="team-work-orders" style="margin-top: 20px;">
+ <div class="headline">
+ <div class="basics">鍥㈤槦宸ュ崟</div>
+ </div>
+ <el-divider></el-divider>
+ <el-table :data="teamWorkOrders" border style="width: 100%">
+ <el-table-column prop="id" label="宸ュ崟缂栧彿" width="120" />
+ <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>
+ </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"/>
+ </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>
+ </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>
+ </template>
+ </el-table-column>
+ </el-table>
+ </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-row>
+ <el-col :span="24">
+ <el-form-item label="鍥㈤槦鍚嶇О" prop="name">
+ <el-input v-model="teamForm.name" placeholder="璇疯緭鍏ュ洟闃熷悕绉�" />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鍥㈤槦缁勯暱" prop="leader">
+ <el-select v-model="teamForm.leader" placeholder="璇烽�夋嫨鍥㈤槦缁勯暱">
+ <el-option
+ v-for="item in memberList"
+ :key="item.id"
+ :label="item.name"
+ :value="item.id"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鍥㈤槦鐘舵��" prop="status">
+ <el-radio-group v-model="teamForm.status">
+ <el-radio
+ v-for="dict in teamStatusOptions"
+ :key="dict.value"
+ :label="dict.value"
+ >{{dict.label}}</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ </el-col>
+ <el-col :span="24">
+ <el-form-item label="鍥㈤槦鎴愬憳" prop="members">
+ <el-transfer
+ v-model="teamForm.members"
+ :data="memberOptions"
+ :titles="['鍙�夋垚鍛�', '鍥㈤槦鎴愬憳']"
+ :props="{
+ key: 'id',
+ 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-form-item>
+ </el-col>
+ </el-row>
+ </el-form>
+ <div slot="footer" class="dialog-footer">
+ <el-button type="primary" @click="submitTeamForm">纭� 瀹�</el-button>
+ <el-button @click="cancelTeamForm">鍙� 娑�</el-button>
+ </div>
+ </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-row>
+ <el-col :span="12">
+ <el-form-item label="鎴愬憳濮撳悕" prop="name">
+ <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-option
+ v-for="item in teamList"
+ :key="item.id"
+ :label="item.name"
+ :value="item.id"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鑱屼綅" prop="position">
+ <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-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="閭" prop="email">
+ <el-input v-model="memberForm.email" placeholder="璇疯緭鍏ラ偖绠�" />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鎴愬憳鐘舵��" prop="status">
+ <el-radio-group v-model="memberForm.status">
+ <el-radio
+ v-for="dict in memberStatusOptions"
+ :key="dict.value"
+ :label="dict.value"
+ >{{dict.label}}</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </el-form>
+ <div slot="footer" class="dialog-footer">
+ <el-button type="primary" @click="submitMemberForm">纭� 瀹�</el-button>
+ <el-button @click="cancelMemberForm">鍙� 娑�</el-button>
+ </div>
+ </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-row>
+ <el-col :span="24">
+ <el-form-item label="宸ュ崟鏍囬" prop="title">
+ <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-option
+ v-for="item in priorityOptions"
+ :key="item.value"
+ :label="item.label"
+ :value="item.value"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鎴鏃堕棿" prop="deadline">
+ <el-date-picker
+ v-model="workOrderForm.deadline"
+ type="datetime"
+ placeholder="璇烽�夋嫨鎴鏃堕棿"
+ value-format="yyyy-MM-dd HH:mm:ss"
+ style="width: 100%"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="24">
+ <el-form-item label="宸ュ崟鍐呭" prop="content">
+ <el-input type="textarea" :rows="4" v-model="workOrderForm.content" placeholder="璇疯緭鍏ュ伐鍗曞唴瀹�" />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="宸ュ崟鐘舵��" prop="status">
+ <el-radio-group v-model="workOrderForm.status">
+ <el-radio
+ v-for="dict in workOrderStatusOptions"
+ :key="dict.value"
+ :label="dict.value"
+ >{{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-option
+ v-for="item in memberList"
+ :key="item.id"
+ :label="item.name"
+ :value="item.id"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </el-form>
+ <div slot="footer" class="dialog-footer">
+ <el-button type="primary" @click="submitWorkOrderForm">纭� 瀹�</el-button>
+ <el-button @click="cancelWorkOrderForm">鍙� 娑�</el-button>
+ </div>
+ </el-dialog>
+
+ <!-- 鎸囨淳宸ュ崟瀵硅瘽妗� -->
+ <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-option
+ v-for="item in availableMembers"
+ :key="item.id"
+ :label="item.name"
+ :value="item.id"
+ />
+ </el-select>
+ </el-form-item>
+ <el-form-item label="浼樺厛绾�" prop="priority">
+ <el-select v-model="assignForm.priority" placeholder="璇烽�夋嫨浼樺厛绾�" style="width: 100%">
+ <el-option
+ v-for="item in priorityOptions"
+ :key="item.value"
+ :label="item.label"
+ :value="item.value"
+ />
+ </el-select>
+ </el-form-item>
+ <el-form-item label="鎴鏃堕棿" prop="deadline">
+ <el-date-picker
+ v-model="assignForm.deadline"
+ type="datetime"
+ placeholder="璇烽�夋嫨鎴鏃堕棿"
+ value-format="yyyy-MM-dd HH:mm:ss"
+ style="width: 100%"
+ />
+ </el-form-item>
+ </el-form>
+ <div slot="footer" class="dialog-footer">
+ <el-button type="primary" @click="submitAssign">纭� 瀹�</el-button>
+ <el-button @click="assignDialogVisible = false">鍙� 娑�</el-button>
+ </div>
+ </el-dialog>
+ </div>
+</template>
+
+<script>
+import { parseTime } from '@/utils/ruoyi'
+
+export default {
+ name: "TeamManagement",
+ dicts: ['sys_normal_disable', 'sys_user_sex'],
+ data() {
+ return {
+ // 褰撳墠婵�娲荤殑鏍囩椤�
+ activeTab: 'team',
+ // 鏄剧ず鎼滅储鏉′欢
+ showSearch: true,
+
+ // 鍥㈤槦绠$悊鐩稿叧鏁版嵁
+ teamLoading: false,
+ multiple: false, // 杩欓噷娣诲姞
+ teamList: [
+ {
+ id: 1,
+ 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" }
+ ],
+ createTime: "2023-01-15 09:30:00",
+ status: "1",
+ description: "璐熻矗鍏徃鎵�鏈夊墠绔」鐩殑寮�鍙戝拰缁存姢"
+ },
+ {
+ id: 2,
+ 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" }
+ ],
+ createTime: "2023-01-20 14:20:00",
+ status: "1",
+ description: "璐熻矗鍏徃鎵�鏈夊悗绔湇鍔$殑寮�鍙戝拰缁存姢"
+ },
+ {
+ id: 3,
+ 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" }
+ ],
+ createTime: "2023-02-10 10:15:00",
+ status: "1",
+ description: "璐熻矗鍏徃鎵�鏈夐」鐩殑娴嬭瘯宸ヤ綔"
+ }
+ ],
+ teamQueryParams: {
+ pageNum: 1,
+ pageSize: 10,
+ name: undefined,
+ status: undefined
+ },
+ teamTotal: 3,
+ teamStatusOptions: [
+ { value: "0", label: "绂佺敤" },
+ { value: "1", label: "鍚敤" }
+ ],
+ teamDialogVisible: false,
+ teamDialogTitle: "",
+ currentTeam: {
+ id: undefined,
+ name: undefined,
+ leader: undefined,
+ members: [], // 纭繚鏈夐粯璁ょ┖鏁扮粍
+ createTime: undefined,
+ status: undefined,
+ description: undefined
+ },
+ teamFormVisible: false,
+ teamFormTitle: "",
+ teamForm: {
+ id: undefined,
+ name: undefined,
+ leader: undefined,
+ members: [],
+ status: "1",
+ description: undefined
+ },
+ teamRules: {
+ name: [
+ { required: true, message: "鍥㈤槦鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }
+ ],
+ leader: [
+ { required: true, message: "鍥㈤槦缁勯暱涓嶈兘涓虹┖", trigger: "change" }
+ ],
+ status: [
+ { required: true, message: "鍥㈤槦鐘舵�佷笉鑳戒负绌�", trigger: "change" }
+ ]
+ },
+
+ // 浜哄憳鍒嗙粍鐩稿叧鏁版嵁
+ memberLoading: false,
+ 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" }
+ ],
+ memberQueryParams: {
+ pageNum: 1,
+ pageSize: 10,
+ name: undefined,
+ teamId: undefined,
+ status: undefined
+ },
+ memberTotal: 8,
+ memberStatusOptions: [
+ { value: "0", label: "绂佺敤" },
+ { value: "1", label: "鍚敤" }
+ ],
+ memberFormVisible: false,
+ memberFormTitle: "",
+ memberForm: {
+ id: undefined,
+ name: undefined,
+ teamId: undefined,
+ position: undefined,
+ phone: undefined,
+ email: undefined,
+ status: "1"
+ },
+ memberRules: {
+ name: [
+ { required: true, message: "鎴愬憳濮撳悕涓嶈兘涓虹┖", trigger: "blur" }
+ ],
+ teamId: [
+ { required: true, message: "鎵�灞炲洟闃熶笉鑳戒负绌�", trigger: "change" }
+ ],
+ position: [
+ { required: true, message: "鑱屼綅涓嶈兘涓虹┖", trigger: "blur" }
+ ],
+ phone: [
+ { required: true, message: "鑱旂郴鐢佃瘽涓嶈兘涓虹┖", trigger: "blur" }
+ ],
+ email: [
+ { required: true, message: "閭涓嶈兘涓虹┖", trigger: "blur" },
+ { type: 'email', message: '璇疯緭鍏ユ纭殑閭鍦板潃', trigger: ['blur', 'change'] }
+ ],
+ status: [
+ { required: true, message: "鎴愬憳鐘舵�佷笉鑳戒负绌�", trigger: "change" }
+ ]
+ },
+
+ // 宸ュ崟鎸囨淳鐩稿叧鏁版嵁
+ workOrderLoading: false,
+ 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: "寮�鍙戞暟鎹粺璁℃姤琛ㄥ姛鑳�" }
+ ],
+ workOrderQueryParams: {
+ pageNum: 1,
+ pageSize: 10,
+ id: undefined,
+ status: undefined,
+ assignee: undefined
+ },
+ workOrderTotal: 5,
+ workOrderStatusOptions: [
+ { value: "0", label: "寰呮寚娲�" },
+ { value: "1", label: "杩涜涓�" },
+ { value: "2", label: "宸插畬鎴�" },
+ { value: "3", label: "宸插彇娑�" }
+ ],
+ priorityOptions: [
+ { value: "1", label: "楂�" },
+ { value: "2", label: "涓�" },
+ { value: "3", label: "浣�" }
+ ],
+ workOrderFormVisible: false,
+ workOrderFormTitle: "",
+ workOrderForm: {
+ id: undefined,
+ title: undefined,
+ priority: "2",
+ createTime: undefined,
+ deadline: undefined,
+ assignee: undefined,
+ status: "0",
+ content: undefined
+ },
+ workOrderRules: {
+ title: [
+ { required: true, message: "宸ュ崟鏍囬涓嶈兘涓虹┖", trigger: "blur" }
+ ],
+ priority: [
+ { required: true, message: "浼樺厛绾т笉鑳戒负绌�", trigger: "change" }
+ ],
+ deadline: [
+ { required: true, message: "鎴鏃堕棿涓嶈兘涓虹┖", trigger: "change" }
+ ],
+ content: [
+ { required: true, message: "宸ュ崟鍐呭涓嶈兘涓虹┖", trigger: "blur" }
+ ],
+ status: [
+ { required: true, message: "宸ュ崟鐘舵�佷笉鑳戒负绌�", trigger: "change" }
+ ]
+ },
+
+ // 鎸囨淳宸ュ崟鐩稿叧鏁版嵁
+ assignDialogVisible: false,
+ assignForm: {
+ id: undefined,
+ title: undefined,
+ assignee: undefined,
+ priority: "2",
+ deadline: undefined
+ }
+ };
+ },
+ computed: {
+ // 鍥㈤槦鎴愬憳閫夐」锛堢敤浜庣┛姊锛�
+ memberOptions() {
+ return this.memberList.map(member => ({
+ key: member.id,
+ label: member.name,
+ disabled: member.status === "0"
+ }));
+ },
+ // 杩囨护鍚庣殑鍥㈤槦鍒楄〃
+ filteredTeamList() {
+ let list = [...this.teamList];
+ if (this.teamQueryParams.name) {
+ list = list.filter(item =>
+ item.name.includes(this.teamQueryParams.name)
+ );
+ }
+ if (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 =>
+ item.name.includes(this.memberQueryParams.name)
+ );
+ }
+ if (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
+ );
+ }
+ return list;
+ },
+ // 杩囨护鍚庣殑宸ュ崟鍒楄〃
+ filteredWorkOrderList() {
+ let list = [...this.workOrderList];
+ if (this.workOrderQueryParams.id) {
+ list = list.filter(item =>
+ item.id.includes(this.workOrderQueryParams.id)
+ );
+ }
+ if (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
+ );
+ }
+ return list;
+ },
+ // 鍥㈤槦宸ュ崟锛堢敤浜庡洟闃熻鎯咃級
+ teamWorkOrders() {
+ if (!this.currentTeam.id) return [];
+ 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
+ );
+ }
+ },
+ methods: {
+ // 瑙f瀽鏃堕棿
+ parseTime,
+ /** 鍥㈤槦绠$悊鐩稿叧鏂规硶 */
+ // 鏌ヨ鍥㈤槦鍒楄〃
+ getTeamList() {
+ this.teamLoading = true;
+ setTimeout(() => {
+ this.teamLoading = false;
+ }, 500);
+ },
+ // 鍥㈤槦鎼滅储
+ handleTeamQuery() {
+ this.teamQueryParams.pageNum = 1;
+ },
+ // 閲嶇疆鍥㈤槦鎼滅储
+ resetTeamQuery() {
+ this.resetForm("teamQueryForm");
+ this.handleTeamQuery();
+ },
+ // 鍥㈤槦澶氶��
+ handleTeamSelectionChange(selection) {
+ 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() {
+ this.resetTeamForm();
+ this.teamFormTitle = "鏂板鍥㈤槦";
+ this.teamFormVisible = true;
+ },
+ // 淇敼鍥㈤槦
+ handleTeamUpdate(row) {
+ this.resetTeamForm();
+ 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.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(() => {});
+ },
+ // 鎻愪氦鍥㈤槦琛ㄥ崟
+ submitTeamForm() {
+ this.$refs["teamForm"].validate(valid => {
+ if (valid) {
+ if (this.teamForm.id != null) {
+ // 妯℃嫙淇敼鍥㈤槦
+ 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 =>
+ this.teamForm.members.includes(member.id)
+ );
+
+ this.teamList.splice(index, 1, {
+ ...this.teamForm,
+ 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 =>
+ this.teamForm.members.includes(member.id)
+ );
+
+ this.teamList.unshift({
+ ...this.teamForm,
+ id: newId,
+ leader: leader ? leader.name : '',
+ members: members,
+ createTime: new Date().toLocaleString()
+ });
+ this.teamTotal = this.teamList.length;
+ this.$modal.msgSuccess("鏂板鎴愬姛");
+ }
+ this.teamFormVisible = false;
+ }
+ });
+ },
+ // 閲嶇疆鍥㈤槦琛ㄥ崟
+ resetTeamForm() {
+ this.teamForm = {
+ id: undefined,
+ name: undefined,
+ leader: undefined,
+ members: [],
+ status: "1",
+ description: undefined
+ };
+ this.resetForm("teamForm");
+ },
+ // 鍙栨秷鍥㈤槦琛ㄥ崟
+ cancelTeamForm() {
+ this.teamFormVisible = false;
+ this.resetTeamForm();
+ },
+
+ /** 浜哄憳鍒嗙粍鐩稿叧鏂规硶 */
+ // 鏌ヨ鎴愬憳鍒楄〃
+ getMemberList() {
+ this.memberLoading = true;
+ setTimeout(() => {
+ this.memberLoading = false;
+ }, 500);
+ },
+ // 鎴愬憳鎼滅储
+ handleMemberQuery() {
+ this.memberQueryParams.pageNum = 1;
+ },
+ // 閲嶇疆鎴愬憳鎼滅储
+ resetMemberQuery() {
+ this.resetForm("memberQueryForm");
+ this.handleMemberQuery();
+ },
+ // 鎴愬憳澶氶��
+ handleMemberSelectionChange(selection) {
+ this.ids = selection.map(item => item.id);
+ this.single = selection.length !== 1;
+ this.multiple = !selection.length;
+ },
+ // 鏂板鎴愬憳
+ handleMemberAdd() {
+ this.resetMemberForm();
+ this.memberFormTitle = "鏂板鎴愬憳";
+ this.memberFormVisible = true;
+ },
+ // 淇敼鎴愬憳
+ handleMemberUpdate(row) {
+ this.resetMemberForm();
+ 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(() => {});
+ },
+ // 鎻愪氦鎴愬憳琛ㄥ崟
+ submitMemberForm() {
+ this.$refs["memberForm"].validate(valid => {
+ if (valid) {
+ if (this.memberForm.id != null) {
+ // 妯℃嫙淇敼鎴愬憳
+ 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);
+ this.memberList.splice(index, 1, {
+ ...this.memberForm,
+ 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);
+ this.memberList.unshift({
+ ...this.memberForm,
+ id: newId,
+ teamName: team ? team.name : '',
+ currentWorkOrder: ''
+ });
+ this.memberTotal = this.memberList.length;
+ this.$modal.msgSuccess("鏂板鎴愬姛");
+ }
+ this.memberFormVisible = false;
+ }
+ });
+ },
+ // 閲嶇疆鎴愬憳琛ㄥ崟
+ resetMemberForm() {
+ this.memberForm = {
+ id: undefined,
+ name: undefined,
+ teamId: undefined,
+ position: undefined,
+ phone: undefined,
+ email: undefined,
+ status: "1"
+ };
+ this.resetForm("memberForm");
+ },
+ // 鍙栨秷鎴愬憳琛ㄥ崟
+ cancelMemberForm() {
+ this.memberFormVisible = false;
+ this.resetMemberForm();
+ },
+
+ /** 宸ュ崟鎸囨淳鐩稿叧鏂规硶 */
+ // 鏌ヨ宸ュ崟鍒楄〃
+ getWorkOrderList() {
+ this.workOrderLoading = true;
+ setTimeout(() => {
+ this.workOrderLoading = false;
+ }, 500);
+ },
+ // 宸ュ崟鎼滅储
+ handleWorkOrderQuery() {
+ this.workOrderQueryParams.pageNum = 1;
+ },
+ // 閲嶇疆宸ュ崟鎼滅储
+ resetWorkOrderQuery() {
+ this.resetForm("workOrderQueryForm");
+ this.handleWorkOrderQuery();
+ },
+ // 宸ュ崟澶氶��
+ handleWorkOrderSelectionChange(selection) {
+ this.ids = selection.map(item => item.id);
+ this.single = selection.length !== 1;
+ this.multiple = !selection.length;
+ },
+ // 鏂板宸ュ崟
+ handleWorkOrderAdd() {
+ this.resetWorkOrderForm();
+ this.workOrderFormTitle = "鏂板缓宸ュ崟";
+ this.workOrderFormVisible = true;
+ },
+ // 淇敼宸ュ崟
+ handleWorkOrderUpdate(row) {
+ this.resetWorkOrderForm();
+ 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(() => {});
+ },
+ // 鎸囨淳宸ュ崟
+ handleAssignWorkOrder(row) {
+ this.assignForm = {
+ id: row.id,
+ title: row.title,
+ assignee: undefined,
+ priority: row.priority,
+ deadline: row.deadline
+ };
+ this.assignDialogVisible = true;
+ },
+ // 鎻愪氦宸ュ崟琛ㄥ崟
+ submitWorkOrderForm() {
+ this.$refs["workOrderForm"].validate(valid => {
+ if (valid) {
+ if (this.workOrderForm.id != null) {
+ // 妯℃嫙淇敼宸ュ崟
+ 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);
+ this.workOrderList.splice(index, 1, {
+ ...this.workOrderForm,
+ 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);
+ this.workOrderList.unshift({
+ ...this.workOrderForm,
+ id: newId,
+ assigneeName: assignee ? assignee.name : undefined,
+ createTime: new Date().toLocaleString()
+ });
+ this.workOrderTotal = this.workOrderList.length;
+ this.$modal.msgSuccess("鏂板鎴愬姛");
+ }
+ this.workOrderFormVisible = false;
+ }
+ });
+ },
+ // 閲嶇疆宸ュ崟琛ㄥ崟
+ resetWorkOrderForm() {
+ this.workOrderForm = {
+ id: undefined,
+ title: undefined,
+ priority: "2",
+ createTime: undefined,
+ deadline: undefined,
+ assignee: undefined,
+ status: "0",
+ content: undefined
+ };
+ this.resetForm("workOrderForm");
+ },
+ // 鍙栨秷宸ュ崟琛ㄥ崟
+ cancelWorkOrderForm() {
+ this.workOrderFormVisible = false;
+ this.resetWorkOrderForm();
+ },
+ // 鎻愪氦鎸囨淳
+ submitAssign() {
+ if (!this.assignForm.assignee) {
+ this.$modal.msgError("璇烽�夋嫨澶勭悊浜�");
+ return;
+ }
+
+ // 妯℃嫙鎸囨淳宸ュ崟
+ 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);
+ if (assignee) {
+ // 鏇存柊宸ュ崟鐘舵��
+ this.workOrderList.splice(index, 1, {
+ ...this.workOrderList[index],
+ assignee: this.assignForm.assignee,
+ assigneeName: assignee.name,
+ priority: this.assignForm.priority,
+ deadline: this.assignForm.deadline,
+ status: "1"
+ });
+
+ // 鏇存柊鎴愬憳褰撳墠宸ュ崟
+ 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
+ });
+ }
+
+ this.$modal.msgSuccess("鎸囨淳鎴愬姛");
+ this.assignDialogVisible = false;
+ }
+ }
+ }
+ }
+};
+</script>
+
+<style lang="scss" scoped>
+.TeamManagement {
+ padding: 20px;
+}
+
+.headline {
+ display: flex;
+ justify-content: space-between;
+ font-size: 20px;
+ border-left: 4px solid #41a1be;
+ padding-left: 5px;
+ margin: 15px 0;
+}
+
+.avatar-uploader ::v-deep .el-upload {
+ border: 1px dashed #d9d9d9;
+ border-radius: 6px;
+ cursor: pointer;
+ position: relative;
+ overflow: hidden;
+}
+
+.avatar-uploader ::v-deep .el-upload:hover {
+ border-color: #409EFF;
+}
+
+.avatar-uploader-icon {
+ font-size: 28px;
+ color: #8c939d;
+ width: 178px;
+ height: 178px;
+ line-height: 178px;
+ text-align: center;
+}
+
+.avatar {
+ width: 178px;
+ height: 178px;
+ display: block;
+}
+
+.team-members, .team-work-orders {
+ margin-top: 20px;
+}
+</style>
--
Gitblit v1.9.3