package com.ruoyi.web.controller.pill;

import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.pill.domain.PillDrug;
import com.ruoyi.pill.service.IPillDrugService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 药品信息Controller
 *
 * @author wuweiqiang
 * @date 2025-05-19
 */
@RestController
@RequestMapping("/pill/drug")
public class PillDrugController extends BaseController
{
    @Autowired
    private IPillDrugService pillDrugService;

    /**
     * 查询药品信息列表
     */
    @PreAuthorize("@ss.hasPermi('pill:drug:list')")
    @GetMapping("/list")
    public TableDataInfo list(PillDrug pillDrug)
    {
        startPage();
        List<PillDrug> list = pillDrugService.selectPillDrugList(pillDrug);
        return getDataTable(list);
    }

    /**
     * 导出药品信息列表
     */
    @PreAuthorize("@ss.hasPermi('pill:drug:export')")
    @Log(title = "药品信息", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, PillDrug pillDrug)
    {
        List<PillDrug> list = pillDrugService.selectPillDrugList(pillDrug);
        ExcelUtil<PillDrug> util = new ExcelUtil<PillDrug>(PillDrug.class);
        util.exportExcel(response, list, "药品信息数据");
    }

    /**
     * 获取药品信息详细信息
     */
    @PreAuthorize("@ss.hasPermi('pill:drug:query')")
    @GetMapping(value = "/{drugId}")
    public AjaxResult getInfo(@PathVariable("drugId") Long drugId)
    {
        return success(pillDrugService.selectPillDrugByDrugId(drugId));
    }

    /**
     * 新增药品信息
     */
    @PreAuthorize("@ss.hasPermi('pill:drug:add')")
    @Log(title = "药品信息", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody PillDrug pillDrug)
    {
        return toAjax(pillDrugService.insertPillDrug(pillDrug));
    }

    /**
     * 修改药品信息
     */
    @PreAuthorize("@ss.hasPermi('pill:drug:edit')")
    @Log(title = "药品信息", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody PillDrug pillDrug)
    {
        return toAjax(pillDrugService.updatePillDrug(pillDrug));
    }

    /**
     * 删除药品信息
     */
    @PreAuthorize("@ss.hasPermi('pill:drug:remove')")
    @Log(title = "药品信息", businessType = BusinessType.DELETE)
   @DeleteMapping("/{drugIds}")
    public AjaxResult remove(@PathVariable Long[] drugIds)
    {
        return toAjax(pillDrugService.deletePillDrugByDrugIds(drugIds));
    }
}


package com.ruoyi.pill.domain;

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;

/**
 * 药品信息对象 pill_drug
 *
 * @author wuweiqiang
 * @date 2025-05-19
 */
public class PillDrug extends BaseEntity
{
    private static final long serialVersionUID = 1L;

    /** 药品ID */
    private Long drugId;

    /** 药品名称 */
    @Excel(name = "药品名称")
    private String drugName;

    /** 药品编码 */
    @Excel(name = "药品编码")
    private String drugCode;

    /** 生产厂家 */
    @Excel(name = "生产厂家")
    private Long factoryId;

    /** 药品类型 */
    @Excel(name = "药品类型")
    private String drugType;

    /** 处方类型 */
    @Excel(name = "处方类型")
    private String prescriptionType;

    /** 单位 */
    private String unit;

    /** 价格 */
    @Excel(name = "价格")
    private Long price;

    /** 库存量 */
    @Excel(name = "库存量")
    private Long num;

    /** 预警值 */
    @Excel(name = "预警值")
    private Long warnValue;

    /** 换算量 */
    @Excel(name = "换算量")
    private Long conversion;

    /** 状态 */
    @Excel(name = "状态")
    private String status;

    public void setDrugId(Long drugId)
    {
        this.drugId = drugId;
    }

    public Long getDrugId()
    {
        return drugId;
    }

    public void setDrugName(String drugName)
    {
        this.drugName = drugName;
    }

    public String getDrugName()
    {
        return drugName;
    }

    public void setDrugCode(String drugCode)
    {
        this.drugCode = drugCode;
    }

    public String getDrugCode()
    {
        return drugCode;
    }

    public void setFactoryId(Long factoryId)
    {
        this.factoryId = factoryId;
    }

    public Long getFactoryId()
    {
        return factoryId;
    }

    public void setDrugType(String drugType)
    {
        this.drugType = drugType;
    }

    public String getDrugType()
    {
        return drugType;
    }

    public void setPrescriptionType(String prescriptionType)
    {
        this.prescriptionType = prescriptionType;
    }

    public String getPrescriptionType()
    {
        return prescriptionType;
    }

    public void setUnit(String unit)
    {
        this.unit = unit;
    }

    public String getUnit()
    {
        return unit;
    }

    public void setPrice(Long price)
    {
        this.price = price;
    }

    public Long getPrice()
    {
        return price;
    }

    public void setNum(Long num)
    {
        this.num = num;
    }

    public Long getNum()
    {
        return num;
    }

    public void setWarnValue(Long warnValue)
    {
        this.warnValue = warnValue;
    }

    public Long getWarnValue()
    {
        return warnValue;
    }

    public void setConversion(Long conversion)
    {
        this.conversion = conversion;
    }

    public Long getConversion()
    {
        return conversion;
    }

    public void setStatus(String status)
    {
        this.status = status;
    }

    public String getStatus()
    {
        return status;
    }

    private PillFactory pillFactory;
    public PillFactory getPillFactory()
    {
        return pillFactory;
    }
    public void setPillFactory(PillFactory pillFactory)
    {
        this.pillFactory = pillFactory;
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("drugId", getDrugId())
            .append("drugName", getDrugName())
            .append("drugCode", getDrugCode())
            .append("factoryId", getFactoryId())
            .append("drugType", getDrugType())
            .append("prescriptionType", getPrescriptionType())
            .append("unit", getUnit())
            .append("price", getPrice())
            .append("num", getNum())
            .append("warnValue", getWarnValue())
            .append("conversion", getConversion())
            .append("status", getStatus())
            .append("createBy", getCreateBy())
            .append("createTime", getCreateTime())
            .append("updateBy", getUpdateBy())
            .append("updateTime", getUpdateTime())
            .append("remark", getRemark())
                .append("pillFactory", getPillFactory())
            .toString();
    }
}

package com.ruoyi.pill.mapper;

import java.util.List;
import com.ruoyi.pill.domain.PillDrug;

/**
 * 药品信息Mapper接口
 * 
 * @author wuweiqiang
 * @date 2025-05-19
 */
public interface PillDrugMapper 
{
    /**
     * 查询药品信息
     * 
     * @param drugId 药品信息主键
     * @return 药品信息
     */
    public PillDrug selectPillDrugByDrugId(Long drugId);

    /**
     * 查询药品信息列表
     * 
     * @param pillDrug 药品信息
     * @return 药品信息集合
     */
    public List<PillDrug> selectPillDrugList(PillDrug pillDrug);

    /**
     * 新增药品信息
     * 
     * @param pillDrug 药品信息
     * @return 结果
     */
    public int insertPillDrug(PillDrug pillDrug);

    /**
     * 修改药品信息
     * 
     * @param pillDrug 药品信息
     * @return 结果
     */
    public int updatePillDrug(PillDrug pillDrug);

    /**
     * 删除药品信息
     * 
     * @param drugId 药品信息主键
     * @return 结果
     */
    public int deletePillDrugByDrugId(Long drugId);

    /**
     * 批量删除药品信息
     * 
     * @param drugIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deletePillDrugByDrugIds(Long[] drugIds);
}
package com.ruoyi.pill.service.impl;

import java.util.List;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.pill.mapper.PillDrugMapper;
import com.ruoyi.pill.domain.PillDrug;
import com.ruoyi.pill.service.IPillDrugService;

/**
 * 药品信息Service业务层处理
 * 
 * @author wuweiqiang
 * @date 2025-05-19
 */
@Service
public class PillDrugServiceImpl implements IPillDrugService 
{
    @Autowired
    private PillDrugMapper pillDrugMapper;

    /**
     * 查询药品信息
     * 
     * @param drugId 药品信息主键
     * @return 药品信息
     */
    @Override
    public PillDrug selectPillDrugByDrugId(Long drugId)
    {
        return pillDrugMapper.selectPillDrugByDrugId(drugId);
    }

    /**
     * 查询药品信息列表
     * 
     * @param pillDrug 药品信息
     * @return 药品信息
     */
    @Override
    public List<PillDrug> selectPillDrugList(PillDrug pillDrug)
    {
        return pillDrugMapper.selectPillDrugList(pillDrug);
    }

    /**
     * 新增药品信息
     * 
     * @param pillDrug 药品信息
     * @return 结果
     */
    @Override
    public int insertPillDrug(PillDrug pillDrug)
    {
        pillDrug.setCreateTime(DateUtils.getNowDate());
        return pillDrugMapper.insertPillDrug(pillDrug);
    }

    /**
     * 修改药品信息
     * 
     * @param pillDrug 药品信息
     * @return 结果
     */
    @Override
    public int updatePillDrug(PillDrug pillDrug)
    {
        pillDrug.setUpdateTime(DateUtils.getNowDate());
        return pillDrugMapper.updatePillDrug(pillDrug);
    }

    /**
     * 批量删除药品信息
     * 
     * @param drugIds 需要删除的药品信息主键
     * @return 结果
     */
    @Override
    public int deletePillDrugByDrugIds(Long[] drugIds)
    {
        return pillDrugMapper.deletePillDrugByDrugIds(drugIds);
    }

    /**
     * 删除药品信息信息
     * 
     * @param drugId 药品信息主键
     * @return 结果
     */
    @Override
    public int deletePillDrugByDrugId(Long drugId)
    {
        return pillDrugMapper.deletePillDrugByDrugId(drugId);
    }
}

package com.ruoyi.pill.service;

import java.util.List;
import com.ruoyi.pill.domain.PillDrug;

/**
 * 药品信息Service接口
 * 
 * @author wuweiqiang
 * @date 2025-05-19
 */
public interface IPillDrugService 
{
    /**
     * 查询药品信息
     * 
     * @param drugId 药品信息主键
     * @return 药品信息
     */
    public PillDrug selectPillDrugByDrugId(Long drugId);

    /**
     * 查询药品信息列表
     * 
     * @param pillDrug 药品信息
     * @return 药品信息集合
     */
    public List<PillDrug> selectPillDrugList(PillDrug pillDrug);

    /**
     * 新增药品信息
     * 
     * @param pillDrug 药品信息
     * @return 结果
     */
    public int insertPillDrug(PillDrug pillDrug);

    /**
     * 修改药品信息
     * 
     * @param pillDrug 药品信息
     * @return 结果
     */
    public int updatePillDrug(PillDrug pillDrug);

    /**
     * 批量删除药品信息
     * 
     * @param drugIds 需要删除的药品信息主键集合
     * @return 结果
     */
    public int deletePillDrugByDrugIds(Long[] drugIds);

    /**
     * 删除药品信息信息
     * 
     * @param drugId 药品信息主键
     * @return 结果
     */
    public int deletePillDrugByDrugId(Long drugId);
}

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.pill.mapper.PillDrugMapper">

    <resultMap type="PillDrug" id="PillDrugResult">
        <result property="drugId"    column="drug_id"    />
        <result property="drugName"    column="drug_name"    />
        <result property="drugCode"    column="drug_code"    />
        <result property="factoryId"    column="factory_id"    />
        <result property="drugType"    column="drug_type"    />
        <result property="prescriptionType"    column="prescription_type"    />
        <result property="unit"    column="unit"    />
        <result property="price"    column="price"    />
        <result property="num"    column="num"    />
        <result property="warnValue"    column="warn_value"    />
        <result property="conversion"    column="conversion"    />
        <result property="status"    column="status"    />
        <result property="createBy"    column="create_by"    />
        <result property="createTime"    column="create_time"    />
        <result property="updateBy"    column="update_by"    />
        <result property="updateTime"    column="update_time"    />
        <result property="remark"    column="remark"    />
        <association property="pillFactory" javaType="pillFactory"
                     resultMap="com.ruoyi.pill.mapper.PillFactoryMapper.PillFactoryResult"></association>
    </resultMap>

    <sql id="selectPillDrugVo">
        select pd.*,pf.* from pill_drug pd left join pill_factory pf on pd.factory_id =                                                                 pf.factory_id
    </sql>

    <select id="selectPillDrugList" parameterType="PillDrug" resultMap="PillDrugResult">
        <include refid="selectPillDrugVo"/>
        <where>
            <if test="drugName != null and drugName != ''">
                and pd.drug_name like concat('%', #{drugName}, '%')
            </if>
            <if test="factoryId != null ">
                and pd.factory_id like concat('%', #{factoryId}, '%')
            </if>
            <if test="pillFactory != null and pillFactory.factoryName != null and pillFactory.factoryName != ''">
                and pf.factory_name like concat('%', #{pillFactory.factoryName}, '%')
            </if>
            <if test="drugType != null and drugType != ''">
                and pd.drug_type = #{drugType}
            </if>
            <if test="prescriptionType != null and prescriptionType != ''">
                and pd.prescription_type = #{prescriptionType}
            </if>
            <if test="status != null and status != ''">
                and pd.status = #{status}
            </if>
        </where>
    </select>

    <select id="selectPillDrugByDrugId" parameterType="Long" resultMap="PillDrugResult">
        <include refid="selectPillDrugVo"/>
        where pd.drug_id = #{drugId}
    </select>

    <insert id="insertPillDrug" parameterType="PillDrug" useGeneratedKeys="true" keyProperty="drugId">
        insert into pill_drug
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="drugName != null and drugName != ''">drug_name,</if>
            <if test="drugCode != null">drug_code,</if>
            <if test="factoryId != null">factory_id,</if>
            <if test="drugType != null and drugType != ''">drug_type,</if>
            <if test="prescriptionType != null">prescription_type,</if>
            <if test="unit != null">unit,</if>
            <if test="price != null">price,</if>
            <if test="num != null">num,</if>
            <if test="warnValue != null">warn_value,</if>
            <if test="conversion != null">conversion,</if>
            <if test="status != null">status,</if>
            <if test="createBy != null">create_by,</if>
            <if test="createTime != null">create_time,</if>
            <if test="updateBy != null">update_by,</if>
            <if test="updateTime != null">update_time,</if>
            <if test="remark != null">remark,</if>
         </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="drugName != null and drugName != ''">#{drugName},</if>
            <if test="drugCode != null">#{drugCode},</if>
            <if test="factoryId != null">#{factoryId},</if>
            <if test="drugType != null and drugType != ''">#{drugType},</if>
            <if test="prescriptionType != null">#{prescriptionType},</if>
            <if test="unit != null">#{unit},</if>
            <if test="price != null">#{price},</if>
            <if test="num != null">#{num},</if>
            <if test="warnValue != null">#{warnValue},</if>
            <if test="conversion != null">#{conversion},</if>
            <if test="status != null">#{status},</if>
            <if test="createBy != null">#{createBy},</if>
            <if test="createTime != null">#{createTime},</if>
            <if test="updateBy != null">#{updateBy},</if>
            <if test="updateTime != null">#{updateTime},</if>
            <if test="remark != null">#{remark},</if>
         </trim>
    </insert>

    <update id="updatePillDrug" parameterType="PillDrug">
        update pill_drug
        <trim prefix="SET" suffixOverrides=",">
            <if test="drugName != null and drugName != ''">drug_name = #{drugName},</if>
            <if test="drugCode != null">drug_code = #{drugCode},</if>
            <if test="factoryId != null">factory_id = #{factoryId},</if>
            <if test="drugType != null and drugType != ''">drug_type = #{drugType},</if>
            <if test="prescriptionType != null">prescription_type = #{prescriptionType},</if>
            <if test="unit != null">unit = #{unit},</if>
            <if test="price != null">price = #{price},</if>
            <if test="num != null">num = #{num},</if>
            <if test="warnValue != null">warn_value = #{warnValue},</if>
            <if test="conversion != null">conversion = #{conversion},</if>
            <if test="status != null">status = #{status},</if>
            <if test="createBy != null">create_by = #{createBy},</if>
            <if test="createTime != null">create_time = #{createTime},</if>
            <if test="updateBy != null">update_by = #{updateBy},</if>
            <if test="updateTime != null">update_time = #{updateTime},</if>
            <if test="remark != null">remark = #{remark},</if>
        </trim>
        where drug_id = #{drugId}
    </update>

    <delete id="deletePillDrugByDrugId" parameterType="Long">
        delete from pill_drug where drug_id = #{drugId}
    </delete>

    <delete id="deletePillDrugByDrugIds" parameterType="String">
        delete from pill_drug where drug_id in
        <foreach item="drugId" collection="array" open="(" separator="," close=")">
            #{drugId}
        </foreach>
    </delete>
</mapper>

import request from '@/utils/request'

// 查询药品信息列表
export function listDrug(query) {
  return request({
    url: '/pill/drug/list',
    method: 'get',
    params: query
  })
}

// 查询药品信息详细
export function getDrug(drugId) {
  return request({
    url: '/pill/drug/' + drugId,
    method: 'get'
  })
}

// 新增药品信息
export function addDrug(data) {
  return request({
    url: '/pill/drug',
    method: 'post',
    data: data
  })
}

// 修改药品信息
export function updateDrug(data) {
  return request({
    url: '/pill/drug',
    method: 'put',
    data: data
  })
}

// 删除药品信息
export function delDrug(drugId) {
  return request({
    url: '/pill/drug/' + drugId,
    method: 'delete'
  })
}

<template>
  <div class="app-container">
    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
      <el-form-item label="药品名称" prop="drugName">
        <el-input
          v-model="queryParams.drugName"
          placeholder="请输入药品名称"
          clearable
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <el-form-item label="生产厂家" >
        <el-input
          v-model="queryParams['pillFactory.factoryName']"
          placeholder="请输入生产厂家"
          clearable
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <el-form-item label="药品类型" prop="drugType">
        <el-select v-model="queryParams.drugType" placeholder="请选择药品类型" clearable>
          <el-option
            v-for="dict in dict.type.pill_drug_ft"
            :key="dict.value"
            :label="dict.label"
            :value="dict.value"
          />
        </el-select>
      </el-form-item>
      <el-form-item label="处方类型" prop="prescriptionType">
        <el-select v-model="queryParams.prescriptionType" placeholder="请选择处方类型" clearable>
          <el-option
            v-for="dict in dict.type.pill_drug_pt"
            :key="dict.value"
            :label="dict.label"
            :value="dict.value"
          />
        </el-select>
      </el-form-item>
      <el-form-item label="状态" prop="status">
        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
          <el-option
            v-for="dict in dict.type.sys_normal_disable"
            :key="dict.value"
            :label="dict.label"
            :value="dict.value"
          />
        </el-select>
      </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"
          v-hasPermi="['pill:drug:add']"
        >新增</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="success"
          plain
          icon="el-icon-edit"
          size="mini"
          :disabled="single"
          @click="handleUpdate"
          v-hasPermi="['pill:drug:edit']"
        >修改</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="danger"
          plain
          icon="el-icon-delete"
          size="mini"
          :disabled="multiple"
          @click="handleDelete"
          v-hasPermi="['pill:drug:remove']"
        >删除</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="warning"
          plain
          icon="el-icon-download"
          size="mini"
          @click="handleExport"
          v-hasPermi="['pill:drug:export']"
        >导出</el-button>
      </el-col>
      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
    </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="药品ID" align="center" prop="drugId" width="80"/>
      <el-table-column label="药品名称" align="center" prop="drugName" min-width="150"/>
      <el-table-column label="药品编码" align="center" prop="drugCode" />
      <el-table-column label="生产厂家" align="center" prop="pillFactory.factoryName" min-width="200"/>
      <el-table-column label="厂家编码" align="center" prop="pillFactory.factoryCode" />
      <el-table-column label="药品类型" align="center" prop="drugType">
        <template slot-scope="scope">
          <dict-tag :options="dict.type.pill_drug_ft" :value="scope.row.drugType"/>
        </template>
      </el-table-column>
      <el-table-column label="处方类型" align="center" prop="prescriptionType">
        <template slot-scope="scope">
          <dict-tag :options="dict.type.pill_drug_pt" :value="scope.row.prescriptionType"/>
        </template>
      </el-table-column>
      <el-table-column label="价格" align="center" prop="price" />
      <el-table-column label="库存量" align="center" prop="num" />
      <el-table-column label="预警值" align="center" prop="warnValue" />
      <el-table-column label="换算量" align="center" prop="conversion" />
      <el-table-column label="状态" align="center" prop="status">
        <template slot-scope="scope">
          <dict-tag :options="dict.type.sys_normal_disable" :value="scope.row.status"/>
        </template>
      </el-table-column>
      <el-table-column label="备注" align="center" prop="remark" />
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
        <template slot-scope="scope">
          <el-button
            size="mini"
            type="text"
            icon="el-icon-edit"
            @click="handleUpdate(scope.row)"
            v-hasPermi="['pill:drug:edit']"
          >修改</el-button>
          <el-button
            size="mini"
            type="text"
            icon="el-icon-delete"
            @click="handleDelete(scope.row)"
            v-hasPermi="['pill:drug:remove']"
          >删除</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="500px" append-to-body>
      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
        <el-form-item label="药品名称" prop="drugName">
          <el-input v-model="form.drugName" placeholder="请输入药品名称" />
        </el-form-item>
        <el-form-item label="药品编码" prop="drugCode">
          <el-input v-model="form.drugCode" placeholder="请输入药品编码" />
        </el-form-item>

        <el-form-item label="生产厂家" prop="factoryId">
<!--          TODO 1.生产厂家下拉框-->
          <el-select v-model="form.factoryId" placeholder="请选择生产厂家">
            <el-option
              v-for="item in factoryList"
              :key="item.factoryId"
              :label="item.factoryName"
              :value="item.factoryId"
            ></el-option>
          </el-select>

        </el-form-item>
        <el-form-item label="药品类型" prop="drugType">
          <el-select v-model="form.drugType" placeholder="请选择药品类型">
            <el-option
              v-for="dict in dict.type.pill_drug_ft"
              :key="dict.value"
              :label="dict.label"
              :value="dict.value"
            ></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="处方类型" prop="prescriptionType">
          <el-select v-model="form.prescriptionType" placeholder="请选择处方类型">
            <el-option
              v-for="dict in dict.type.pill_drug_pt"
              :key="dict.value"
              :label="dict.label"
              :value="dict.value"
            ></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="价格" prop="price">
          <el-input v-model="form.price" placeholder="请输入价格" />
        </el-form-item>
        <el-form-item label="库存量" prop="num">
          <el-input v-model="form.num" placeholder="请输入库存量" />
        </el-form-item>
        <el-form-item label="预警值" prop="warnValue">
          <el-input v-model="form.warnValue" placeholder="请输入预警值" />
        </el-form-item>
        <el-form-item label="状态" prop="status">
          <el-radio-group v-model="form.status">
            <el-radio
              v-for="dict in dict.type.sys_normal_disable"
              :key="dict.value"
              :label="dict.value"
            >{{dict.label}}</el-radio>
          </el-radio-group>
        </el-form-item>
        <el-form-item label="备注" prop="remark">
          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
        </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>
</template>

<script>
import { listDrug, getDrug, delDrug, addDrug, updateDrug } from "@/api/pill/drug"
import {listFactory} from "@/api/pill/factory";
export default {
  name: "Drug",
  dicts: ['pill_drug_pt', 'pill_drug_ft', 'sys_normal_disable'],
  data() {
    return {
      // 遮罩层
      loading: true,
      // 选中数组
      ids: [],
      // 非单个禁用
      single: true,
      // 非多个禁用
      multiple: true,
      // 显示搜索条件
      showSearch: true,
      // 总条数
      total: 0,
      // 药品信息表格数据
      drugList: [],
      //  TODO 2.生产厂家列表
      factoryList: [],
      // 弹出层标题
      title: "",
      // 是否显示弹出层
      open: false,
      // 查询参数
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        drugName: null,
        factoryId: null,
        drugType: null,
        prescriptionType: null,
        status: null,
        'pillFactory.factoryName': null,
      },
      // 表单参数
      form: {},
      // 表单校验
      rules: {
        drugName: [
          { required: true, message: "药品名称不能为空", trigger: "blur" }
        ],
        factoryId: [
          { required: true, message: "生产厂家不能为空", trigger: "blur" }
        ],
        drugType: [
          { required: true, message: "药品类型不能为空", trigger: "change" }
        ],
      }
    }
  },
  created() {
    this.getList()
    this.getFactoryList();
  },

  methods: {
    /** 查询药品信息列表 */
    getFactoryList(){
      listFactory().then(response => {
        this.factoryList = response.rows;
      });
    },
    /**TODO 3.查询参加信息列表 */
    getList() {
      this.loading = true
      listDrug(this.queryParams).then(response => {
        this.drugList = response.rows
        this.total = response.total
        this.loading = false
      })
    },
    // 取消按钮
    cancel() {
      this.open = false
      this.reset()
    },
    // 表单重置
    reset() {
      this.form = {
        drugId: null,
        drugName: null,
        drugCode: null,
        factoryId: null,
        drugType: null,
        prescriptionType: null,
        unit: null,
        price: null,
        num: null,
        warnValue: null,
        conversion: null,
        status: null,
        createBy: null,
        createTime: null,
        updateBy: null,
        updateTime: null,
        remark: null
      }
      this.resetForm("form")
    },
    /** 搜索按钮操作 */
    handleQuery() {
      this.queryParams.pageNum = 1
      this.getList()
    },
    /** 重置按钮操作 */
    resetQuery() {
      this.resetForm("queryForm")
      this.handleQuery()
    },
    // 多选框选中数据
    handleSelectionChange(selection) {
      this.ids = selection.map(item => item.drugId)
      this.single = selection.length!==1
      this.multiple = !selection.length
    },
    /** 新增按钮操作 */
    handleAdd() {
      this.reset()
      this.open = true
      this.title = "添加药品信息"
    },
    /** 修改按钮操作 */
    handleUpdate(row) {
      this.reset()
      const drugId = row.drugId || this.ids
      getDrug(drugId).then(response => {
        this.form = response.data
        this.open = true
        this.title = "修改药品信息"
      })
    },
    /** 提交按钮 */
    submitForm() {
      this.$refs["form"].validate(valid => {
        if (valid) {
          if (this.form.drugId != null) {
            updateDrug(this.form).then(response => {
              this.$modal.msgSuccess("修改成功")
              this.open = false
              this.getList()
            })
          } else {
            addDrug(this.form).then(response => {
              this.$modal.msgSuccess("新增成功")
              this.open = false
              this.getList()
            })
          }
        }
      })
    },
    /** 删除按钮操作 */
    handleDelete(row) {
      const drugIds = row.drugId || this.ids
      this.$modal.confirm('是否确认删除药品信息编号为"' + drugIds + '"的数据项？').then(function() {
        return delDrug(drugIds)
      }).then(() => {
        this.getList()
        this.$modal.msgSuccess("删除成功")
      }).catch(() => {})
    },
    /** 导出按钮操作 */
    handleExport() {
      this.download('pill/drug/export', {
        ...this.queryParams
      }, `drug_${new Date().getTime()}.xlsx`)
    }
  }
}
</script>

/*
Navicat MySQL Data Transfer

Source Server         : test
Source Server Version : 50717
Source Host           : localhost:3306
Source Database       : storage1

Target Server Type    : MYSQL
Target Server Version : 50717
File Encoding         : 65001

Date: 2022-09-25 17:33:23
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for pill_drug
-- ----------------------------
DROP TABLE IF EXISTS `pill_drug`;
CREATE TABLE `pill_drug` (
  `drug_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '药品ID',
  `drug_name` varchar(50) DEFAULT NULL COMMENT '药品名称',
  `drug_code` varchar(50) DEFAULT NULL COMMENT '药品编码',
  `factory_id` bigint(20) DEFAULT NULL COMMENT '生产厂家',
  `drug_type` char(1) DEFAULT NULL COMMENT '药品类型',
  `prescription_type` char(1) DEFAULT NULL COMMENT '处方类型',
  `unit` varchar(10) DEFAULT NULL COMMENT '单位',
  `price` int(10) DEFAULT NULL COMMENT '价格',
  `num` int(10) DEFAULT NULL COMMENT '库存量',
  `warn_value` int(10) DEFAULT NULL COMMENT '预警值',
  `conversion` int(10) DEFAULT NULL COMMENT '换算量',
  `status` char(1) DEFAULT NULL COMMENT '状态',
  `create_by` varchar(50) DEFAULT NULL COMMENT '创建者',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(50) DEFAULT NULL COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`drug_id`)
) ENGINE=InnoDB AUTO_INCREMENT=103 DEFAULT CHARSET=utf8 COMMENT='药品信息';

-- ----------------------------
-- Records of pill_drug
-- ----------------------------
INSERT INTO `pill_drug` VALUES ('101', '十全大补丸', 'dbw0001', '101', '0', '0', '瓶', '200', '100', '50', '1', '0', 'admin', '2022-08-27 16:03:29', null, null, null);
INSERT INTO `pill_drug` VALUES ('102', '阿莫西林', 'zcy0002', '102', '1', '1', '盒', '15', '300', '50', '1', '0', 'admin', '2022-09-15 16:03:29', null, null, null);

根据以上代码，帮我实现一个药品售出功能模块，点击售出，药品售出的时候，药品库存减少；点击退货，药品被退回来，库存增加，功能模块可以查询药名，显示药名，价格，库存。和pill_drug多表连接，模仿上面的代码，给我完整药品售出功能模块代码，不要省略