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