From a5cba9ab040f6f97558046885dce3017f9bab7e9 Mon Sep 17 00:00:00 2001
From: WXL (wul) <wl_5969728@163.com>
Date: 星期二, 11 八月 2026 14:12:29 +0800
Subject: [PATCH] 提交

---
 src/views/knowledge/drug/index.vue |  623 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 610 insertions(+), 13 deletions(-)

diff --git a/src/views/knowledge/drug/index.vue b/src/views/knowledge/drug/index.vue
index aa54bde..b50a5a2 100644
--- a/src/views/knowledge/drug/index.vue
+++ b/src/views/knowledge/drug/index.vue
@@ -1,27 +1,624 @@
 <template>
-  <div>
-鑽搧鐭ヨ瘑搴�
+  <div class="app-container">
+    <!-- ===== 鎼滅储鏍� ===== -->
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="88px"
+    >
+      <el-form-item label="鑽搧鍚嶇О" prop="itemName">
+        <el-input
+          v-model="queryParams.itemName"
+          placeholder="璇疯緭鍏ヨ嵂鍝佸悕绉�"
+          clearable
+          style="width: 200px"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鑽搧缂栫爜" prop="itemCode">
+        <el-input
+          v-model="queryParams.itemCode"
+          placeholder="璇疯緭鍏ヨ嵂鍝佺紪鐮�"
+          clearable
+          style="width: 200px"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鐢熶骇鍘傚" prop="manufacturerName">
+        <el-input
+          v-model="queryParams.manufacturerName"
+          placeholder="璇疯緭鍏ョ敓浜у巶瀹�"
+          clearable
+          style="width: 200px"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鑽搧绫诲瀷" prop="medicationType">
+        <el-input
+          v-model="queryParams.medicationType"
+          placeholder="璇疯緭鍏ヨ嵂鍝佺被鍨�"
+          clearable
+          style="width: 200px"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button
+          type="primary"
+          icon="el-icon-search"
+          size="mini"
+          @click="handleQuery"
+          >鎼滅储</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @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="mini"
+          @click="handleAdd"
+          >鏂板</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          >淇敼</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          >鍒犻櫎</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          >瀵煎嚭</el-button
+        >
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" />
+    </el-row>
+
+    <!-- ===== 琛ㄦ牸 ===== -->
+    <el-table
+      v-loading="loading"
+      :data="drugList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column
+        label="鑽搧缂栫爜"
+        align="center"
+        prop="itemCode"
+        :show-overflow-tooltip="true"
+        width="120"
+      />
+      <el-table-column
+        label="鑽搧鍚嶇О"
+        align="center"
+        prop="itemName"
+        :show-overflow-tooltip="true"
+        min-width="150"
+      />
+      <el-table-column
+        label="閫氱敤鍚�"
+        align="center"
+        prop="medicationCommonName"
+        :show-overflow-tooltip="true"
+        min-width="120"
+      />
+      <el-table-column
+        label="瑙勬牸"
+        align="center"
+        prop="specification"
+        width="120"
+      />
+      <el-table-column
+        label="鍓傚瀷"
+        align="center"
+        prop="doseFormName"
+        width="100"
+      />
+      <el-table-column
+        label="鐢熶骇鍘傚"
+        align="center"
+        prop="manufacturerName"
+        :show-overflow-tooltip="true"
+        min-width="150"
+      />
+      <el-table-column
+        label="鎵瑰噯鏂囧彿"
+        align="center"
+        prop="licenseNumber"
+        width="140"
+      />
+      <el-table-column
+        label="闆跺敭浠�"
+        align="center"
+        prop="retailPrice"
+        width="100"
+      />
+      <el-table-column label="鐘舵��" align="center" prop="status" width="80">
+        <template slot-scope="scope">
+          <el-tag
+            :type="scope.row.status == 1 ? 'success' : 'danger'"
+            size="small"
+          >
+            {{ scope.row.status == 1 ? "鍚敤" : "绂佺敤" }}
+          </el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="鎿嶄綔"
+        align="center"
+        width="160"
+        class-name="small-padding fixed-width"
+      >
+        <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-dialog
+      :title="title"
+      :visible.sync="open"
+      width="700px"
+      append-to-body
+      :close-on-click-modal="false"
+    >
+      <el-form ref="form" :model="form" :rules="rules" label-width="110px">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鑽搧鍚嶇О" prop="itemName">
+              <el-input v-model="form.itemName" placeholder="璇疯緭鍏ヨ嵂鍝佸悕绉�" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鑽搧缂栫爜" prop="itemCode">
+              <el-input v-model="form.itemCode" placeholder="璇疯緭鍏ヨ嵂鍝佺紪鐮�" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鑽搧閫氱敤鍚�" prop="medicationCommonName">
+              <el-input
+                v-model="form.medicationCommonName"
+                placeholder="璇疯緭鍏ヨ嵂鍝侀�氱敤鍚�"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鑽搧璇嗗埆鐮�">
+              <el-input
+                v-model="form.identificationCode"
+                placeholder="璇疯緭鍏ヨ嵂鍝佽瘑鍒爜"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="瑙勬牸" prop="specification">
+              <el-input
+                v-model="form.specification"
+                placeholder="濡� 0.25g*24绮�"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍓傚瀷">
+              <el-input v-model="form.doseFormName" placeholder="濡� 鑳跺泭鍓�" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鐢熶骇鍘傚" prop="manufacturerName">
+              <el-input
+                v-model="form.manufacturerName"
+                placeholder="璇疯緭鍏ョ敓浜у巶瀹�"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎵瑰噯鏂囧彿">
+              <el-input
+                v-model="form.licenseNumber"
+                placeholder="璇疯緭鍏ユ壒鍑嗘枃鍙�"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鑽搧绫诲瀷" prop="medicationType">
+              <el-input v-model="form.medicationType" placeholder="濡� 鎶楃敓绱�" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="闆跺敭浠�">
+              <el-input-number
+                v-model="form.retailPrice"
+                :precision="2"
+                :min="0"
+                style="width: 100%"
+                placeholder="璇疯緭鍏ラ浂鍞环"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="灏忓寘瑁呭崟浣�">
+              <el-input v-model="form.smallPackageUnit" placeholder="濡� 鐩�" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="澶у寘瑁呭崟浣�">
+              <el-input v-model="form.largePackageUnit" placeholder="濡� 绠�" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="澶у皬鍖呰杞崲姣�">
+              <el-input-number
+                v-model="form.smallLargePackageRatio"
+                :min="0"
+                style="width: 100%"
+                placeholder="澶у皬鍖呰杞崲姣�"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鐘舵��" prop="status">
+              <el-select
+                v-model="form.status"
+                placeholder="璇烽�夋嫨鐘舵��"
+                style="width: 100%"
+              >
+                <el-option label="鍚敤" :value="1" />
+                <el-option label="绂佺敤" :value="0" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="榛樿鐢ㄦ硶">
+              <el-input
+                v-model="form.defaultUsageName"
+                placeholder="璇疯緭鍏ラ粯璁ょ敤娉�"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鐗规畩鑽搧">
+              <el-input
+                v-model="form.specialDrugsName"
+                placeholder="璇疯緭鍏ョ壒娈婅嵂鍝佸悕绉�"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <!-- ===== 鍓傞噺鏄庣粏鍒楄〃 ===== -->
+        <el-divider content-position="left">鍓傞噺鏄庣粏</el-divider>
+        <el-button
+          type="primary"
+          size="small"
+          icon="el-icon-plus"
+          @click="addDoseRow"
+          style="margin-bottom: 10px"
+          >娣诲姞鍓傞噺</el-button
+        >
+        <el-table
+          :data="form.doseInfoList"
+          border
+          size="small"
+          style="width: 100%"
+        >
+          <el-table-column label="鍓傞噺" width="100" align="center">
+            <template slot-scope="scope">
+              <el-input-number
+                v-model="scope.row.dose"
+                :min="0"
+                size="small"
+                controls-position="right"
+                style="width: 80px"
+              />
+            </template>
+          </el-table-column>
+          <el-table-column label="灏忓寘瑁呮暟閲�" width="120" align="center">
+            <template slot-scope="scope">
+              <el-input-number
+                v-model="scope.row.doseSmallPackageNum"
+                :min="0"
+                size="small"
+                controls-position="right"
+                style="width: 90px"
+              />
+            </template>
+          </el-table-column>
+          <el-table-column label="鍗曚綅" align="center">
+            <template slot-scope="scope">
+              <el-input
+                v-model="scope.row.doseUnit"
+                size="small"
+                placeholder="濡� 绮�"
+                style="width: 70px"
+              />
+            </template>
+          </el-table-column>
+          <el-table-column label="鍗曚綅绫诲瀷" align="center">
+            <template slot-scope="scope">
+              <el-select
+                v-model="scope.row.doseUnitType"
+                size="small"
+                placeholder="閫夋嫨"
+                style="width: 90px"
+              >
+                <el-option label="涓�" :value="1" />
+                <el-option label="鍏�" :value="2" />
+                <el-option label="姣崌" :value="3" />
+                <el-option label="姣厠" :value="4" />
+              </el-select>
+            </template>
+          </el-table-column>
+          <el-table-column label="鎿嶄綔" width="70" align="center">
+            <template slot-scope="scope">
+              <el-button
+                size="mini"
+                type="danger"
+                icon="el-icon-delete"
+                @click="removeDoseRow(scope.$index)"
+              />
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="cancel">鍙� 娑�</el-button>
+        <el-button type="primary" :loading="submitLoading" @click="submitForm"
+          >纭� 瀹�</el-button
+        >
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import {
+  listMedication,
+  getMedication,
+  addMedication,
+  updateMedication,
+  delMedication,
+  exportMedication,
+} from "@/api/knowledge/drug";
+
 export default {
-  data () {
+  name: "Drug",
+  data() {
     return {
-
-    }
+      loading: false,
+      submitLoading: false,
+      showSearch: true,
+      ids: [],
+      single: true,
+      multiple: true,
+      total: 0,
+      drugList: [],
+      title: "",
+      open: false,
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        itemName: undefined,
+        itemCode: undefined,
+        manufacturerName: undefined,
+        medicationType: undefined,
+      },
+      form: {
+        doseInfoList: [],
+      },
+      rules: {
+        itemName: [
+          { required: true, message: "鑽搧鍚嶇О涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        itemCode: [
+          { required: true, message: "鑽搧缂栫爜涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        medicationCommonName: [
+          { required: true, message: "鑽搧閫氱敤鍚嶄笉鑳戒负绌�", trigger: "blur" },
+        ],
+        manufacturerName: [
+          { required: true, message: "鐢熶骇鍘傚涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        specification: [
+          { required: true, message: "瑙勬牸涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        medicationType: [
+          { required: true, message: "鑽搧绫诲瀷涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        status: [
+          { required: true, message: "鐘舵�佷笉鑳戒负绌�", trigger: "change" },
+        ],
+      },
+    };
   },
-
-  created () {
-
+  created() {
+    this.getList();
   },
-
   methods: {
+    // ===== 鍒楄〃 =====
+    getList() {
+      this.loading = true;
+      listMedication(this.queryParams)
+        .then((res) => {
+          this.drugList = res.rows || [];
+          this.total = res.total || 0;
+          this.loading = false;
+        })
+        .catch(() => {
+          this.loading = false;
+        });
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    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.title = "鏂板鑽搧";
+      this.open = true;
+    },
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids[0];
+      this.title = "淇敼鑽搧";
+      getMedication(id).then((res) => {
+        this.form = res.data || {};
+        this.form.doseInfoList = this.form.doseInfoList || [];
+        this.open = true;
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate((valid) => {
+        if (!valid) return;
+        this.submitLoading = true;
+        const api = this.form.id
+          ? updateMedication(this.form)
+          : addMedication(this.form);
+        api
+          .then((res) => {
+            if (res.code === 200) {
+              this.$modal.msgSuccess(this.form.id ? "淇敼鎴愬姛" : "鏂板鎴愬姛");
+              this.open = false;
+              this.getList();
+            }
+          })
+          .finally(() => {
+            this.submitLoading = false;
+          });
+      });
+    },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { status: 1, doseInfoList: [] };
+      this.resetForm("form");
+    },
+
+    // ===== 鍓傞噺鏄庣粏 =====
+    addDoseRow() {
+      this.form.doseInfoList.push({
+        dose: null,
+        doseSmallPackageNum: null,
+        doseUnit: "",
+        doseUnitType: 1,
+      });
+    },
+    removeDoseRow(index) {
+      this.form.doseInfoList.splice(index, 1);
+    },
+
+    // ===== 鍒犻櫎 =====
+    handleDelete(row) {
+      const ids = row.id ? [row.id] : this.ids;
+      this.$modal
+        .confirm("鏄惁纭鍒犻櫎鎵�閫夎嵂鍝佷俊鎭紵")
+        .then(() => {
+          return delMedication(JSON.stringify(ids));
+        })
+        .then((res) => {
+          if (res.code === 200) {
+            this.getList();
+            this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+          }
+        })
+        .catch(() => {});
+    },
+
+    // ===== 瀵煎嚭 =====
+    handleExport() {
+      this.download(
+        "smartor/medicationitem/export",
+        { ...this.queryParams },
+        `鑽搧淇℃伅_${new Date().getTime()}.xlsx`
+      );
+    },
+  },
+};
 </script>
 
-<style lang='scss' scoped>
-
+<style lang="scss" scoped>
+::v-deep .el-divider__text {
+  font-size: 14px;
+  font-weight: 600;
+}
 </style>

--
Gitblit v1.9.3