Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions database_migration_add_inventory_threshold.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
-- 药品库存智能预警功能数据库升级脚本
-- 添加最低库存阈值字段

-- 为药品信息表添加最低库存阈值字段
ALTER TABLE `yaopinxinxi` ADD COLUMN `zuidikucunyuzhi` int(11) NULL DEFAULT 0 COMMENT '最低库存阈值' AFTER `kucun`;

-- 更新现有记录,设置默认最低库存阈值为库存的20%(可根据实际需求调整)
UPDATE `yaopinxinxi` SET `zuidikucunyuzhi` = FLOOR(`kucun` * 0.2) WHERE `zuidikucunyuzhi` = 0 AND `kucun` > 0;
18 changes: 18 additions & 0 deletions manage_code/src/views/yaopinxinxi/formModel.vue
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,14 @@
</el-form-item>
</el-col>

<el-col :span="24">
<el-form-item label="最低库存阈值" prop="zuidikucunyuzhi">
<el-input class="list_inp" v-model.number="form.zuidikucunyuzhi" placeholder="最低库存阈值"
type="text"
:readonly="!isAdd||disabledForm.zuidikucunyuzhi?true:false" />
</el-form-item>
</el-col>

<el-col :span="24">
<el-form-item label="新增时间" prop="xinzengshijian">
<el-date-picker
Expand Down Expand Up @@ -118,6 +126,7 @@
youxiaoqi : false,
danjia : false,
kucun : false,
zuidikucunyuzhi : false,
xinzengshijian : false,
beizhu : false,
})
Expand All @@ -143,6 +152,9 @@
{required: true,message: '请输入',trigger: 'blur'},
{ validator: context.$toolUtil.validator.intNumber, trigger: 'blur' },
],
zuidikucunyuzhi: [
{ validator: context.$toolUtil.validator.intNumber, trigger: 'blur' },
],
xinzengshijian: [
],
beizhu: [
Expand All @@ -167,6 +179,7 @@
youxiaoqi: '',
danjia: '',
kucun: '',
zuidikucunyuzhi: '',
xinzengshijian: '',
beizhu: '',
}
Expand Down Expand Up @@ -243,6 +256,11 @@
disabledForm.value.kucun = true;
continue;
}
if(x=='zuidikucunyuzhi'){
form.value.zuidikucunyuzhi = row[x];
disabledForm.value.zuidikucunyuzhi = true;
continue;
}
if(x=='xinzengshijian'){
form.value.xinzengshijian = row[x];
disabledForm.value.xinzengshijian = true;
Expand Down
92 changes: 86 additions & 6 deletions manage_code/src/views/yaopinxinxi/list.vue
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,14 @@
<el-button class="statis_btn" type="warning" @click="echartClick1" v-if="btnAuth('yaopinxinxi','药品库存统计')">
<i class="iconfont icon-bar-chart--line"></i>
药品库存统计
</el-button>
<el-button class="alert_btn" type="danger" @click="showLowStockAlert" v-if="btnAuth('yaopinxinxi','库存预警')">
<i class="iconfont icon-tongzhi"></i>
库存预警
</el-button>
<el-button class="purchase_btn" type="success" @click="showPurchaseSuggestions" v-if="btnAuth('yaopinxinxi','采购建议')">
<i class="iconfont icon-tijiao"></i>
采购建议
</el-button>
</div>
</div>
Expand Down Expand Up @@ -111,6 +119,17 @@
{{scope.row.kucun}}
</template>
</el-table-column>
<el-table-column min-width="140"
:resizable='true'
:sortable='true'
align="left"
header-align="left"
prop="zuidikucunyuzhi"
label="最低库存阈值">
<template #default="scope">
{{scope.row.zuidikucunyuzhi}}
</template>
</el-table-column>
<el-table-column min-width="140"
:resizable='true'
:sortable='true'
Expand Down Expand Up @@ -380,7 +399,7 @@
})
}
import '@/assets/js/echarts-theme'
// 统计图1
//统计图1
const echarts = inject("echarts")
const echartVisible = ref(false)
const echartClick1 = ()=>{
Expand Down Expand Up @@ -439,6 +458,51 @@
})
})
}
//显示低库存预警
const showLowStockAlert = () => {
context.$http({
url: `${tableName}/lowstock`,
method: 'get'
}).then(res=>{
let lowStockList = res.data.data
if(lowStockList.length === 0) {
context.$message.success('当前所有药品库存均在正常范围内')
return
}
let message = '以下药品库存低于阈值:\n\n'
lowStockList.forEach(item => {
message += `药品名称:${item.yaopinmingcheng}\n当前库存:${item.kucun}\n最低阈值:${item.zuidikucunyuzhi}\n\n`
})
context.$alert(message, '低库存详情', {
confirmButtonText: '确定',
type: 'warning'
})
})
}
//显示采购建议
const showPurchaseSuggestions = () => {
context.$http({
url: `${tableName}/purchase/suggestions`,
method: 'get'
}).then(res=>{
let suggestions = res.data.data
if(suggestions.length === 0) {
context.$message.success('当前所有药品库存充足,无需采购')
return
}
let message = '药品采购建议清单:\n\n'
let totalCost = 0
suggestions.forEach(item => {
message += `药品名称:${item.yaopinmingcheng}\n规格:${item.guige}\n当前库存:${item.currentStock}\n最低阈值:${item.threshold}\n建议采购数量:${item.suggestedQuantity}\n预计费用:¥${item.estimatedCost.toFixed(2)}\n\n`
totalCost += item.estimatedCost
})
message += `预计总费用:¥${totalCost.toFixed(2)}`
context.$alert(message, '采购建议详情', {
confirmButtonText: '确定',
type: 'success'
})
})
}
import rukujiluFormModel from '@/views/rukujilu/formModel'
const rukujiluFormModelRef = ref(null)
const rukujiluCrossAddOrUpdateHandler = (row,type,crossOptAudit,crossOptPay,statusColumnName,tips,statusColumnValue) => {
Expand Down Expand Up @@ -473,15 +537,31 @@
}
//初始化
const init = () => {
let urlkucun = 'yaopinxinxi/remind/kucun/1'
urlkucun+=`?remindend=5`
urlkucun+=`&remindstart=0`
context.$http({
url: urlkucun,
url: `${tableName}/lowstock/count`,
method: 'get'
}).then(res=>{
if(res.data.count>0) {
context?.$alert(`库存有${res.data.count}条记录达到预警`)
context.$alert(`库存有${res.data.count}条记录达到预警`, '库存预警提示', {
confirmButtonText: '查看详情',
callback: (action) => {
if (action === 'confirm') {
context.$http({
url: `${tableName}/lowstock`,
method: 'get'
}).then(res=>{
let lowStockList = res.data.data
let message = '以下药品库存低于阈值:\n\n'
lowStockList.forEach(item => {
message += `药品名称:${item.yaopinmingcheng}\n当前库存:${item.kucun}\n最低阈值:${item.zuidikucunyuzhi}\n\n`
})
context.$alert(message, '低库存详情', {
confirmButtonText: '确定'
})
})
}
}
})
}
})
getList()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,15 @@
import com.cl.entity.view.ChukujiluView;

import com.cl.service.ChukujiluService;
import com.cl.service.YaopinxinxiService;
import com.cl.service.TokenService;
import com.cl.utils.PageUtils;
import com.cl.utils.R;
import com.cl.utils.MPUtil;
import com.cl.utils.MapUtils;
import com.cl.utils.CommonUtil;
import com.cl.entity.YaopinxinxiEntity;
import com.baomidou.mybatisplus.mapper.EntityWrapper;

/**
* 出库记录
Expand All @@ -47,6 +50,9 @@
public class ChukujiluController {
@Autowired
private ChukujiluService chukujiluService;

@Autowired
private YaopinxinxiService yaopinxinxiService;



Expand Down Expand Up @@ -139,9 +145,25 @@ public R detail(@PathVariable("id") Long id){
*/
@RequestMapping("/save")
@SysLog("新增出库记录")
@Transactional
public R save(@RequestBody ChukujiluEntity chukujilu, HttpServletRequest request){
//ValidatorUtils.validateEntity(chukujilu);
chukujiluService.insert(chukujilu);

YaopinxinxiEntity drug = yaopinxinxiService.selectOne(new EntityWrapper<YaopinxinxiEntity>()
.eq("yaopinmingcheng", chukujilu.getYaopinmingcheng()));

if (drug != null) {
Integer currentStock = drug.getKucun() != null ? drug.getKucun() : 0;
Integer outboundQuantity = chukujilu.getKucun() != null ? chukujilu.getKucun() : 0;
Integer newStock = currentStock - outboundQuantity;
if (newStock < 0) {
newStock = 0;
}
drug.setKucun(newStock);
yaopinxinxiService.updateById(drug);
}

return R.ok();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,15 @@
import com.cl.entity.view.RukujiluView;

import com.cl.service.RukujiluService;
import com.cl.service.YaopinxinxiService;
import com.cl.service.TokenService;
import com.cl.utils.PageUtils;
import com.cl.utils.R;
import com.cl.utils.MPUtil;
import com.cl.utils.MapUtils;
import com.cl.utils.CommonUtil;
import com.cl.entity.YaopinxinxiEntity;
import com.baomidou.mybatisplus.mapper.EntityWrapper;

/**
* 入库记录
Expand All @@ -47,6 +50,9 @@
public class RukujiluController {
@Autowired
private RukujiluService rukujiluService;

@Autowired
private YaopinxinxiService yaopinxinxiService;



Expand Down Expand Up @@ -139,9 +145,21 @@ public R detail(@PathVariable("id") Long id){
*/
@RequestMapping("/save")
@SysLog("新增入库记录")
@Transactional
public R save(@RequestBody RukujiluEntity rukujilu, HttpServletRequest request){
//ValidatorUtils.validateEntity(rukujilu);
rukujiluService.insert(rukujilu);

YaopinxinxiEntity drug = yaopinxinxiService.selectOne(new EntityWrapper<YaopinxinxiEntity>()
.eq("yaopinmingcheng", rukujilu.getYaopinmingcheng()));

if (drug != null) {
Integer currentStock = drug.getKucun() != null ? drug.getKucun() : 0;
Integer inboundQuantity = rukujilu.getKucun() != null ? rukujilu.getKucun() : 0;
drug.setKucun(currentStock + inboundQuantity);
yaopinxinxiService.updateById(drug);
}

return R.ok();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -381,6 +381,22 @@ public R count(@RequestParam Map<String, Object> params,YaopinxinxiEntity yaopin
return R.ok().put("data", count);
}

@RequestMapping("/lowstock")
public R getLowStockDrugs() {
List<YaopinxinxiEntity> lowStockDrugs = yaopinxinxiService.selectLowStockDrugs();
return R.ok().put("data", lowStockDrugs).put("count", lowStockDrugs.size());
}

@RequestMapping("/lowstock/count")
public R getLowStockCount() {
List<YaopinxinxiEntity> lowStockDrugs = yaopinxinxiService.selectLowStockDrugs();
return R.ok().put("count", lowStockDrugs.size());
}

@RequestMapping("/purchase/suggestions")
public R getPurchaseSuggestions() {
List<Map<String, Object>> suggestions = yaopinxinxiService.generatePurchaseSuggestions();
return R.ok().put("data", suggestions).put("count", suggestions.size());
}

}
18 changes: 18 additions & 0 deletions server_code/src/main/java/com/cl/entity/YaopinxinxiEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,12 @@ public YaopinxinxiEntity(T t) {

private Integer kucun;

/**
* 最低库存阈值
*/

private Integer zuidikucunyuzhi;

/**
* 新增时间
*/
Expand Down Expand Up @@ -193,6 +199,18 @@ public void setKucun(Integer kucun) {
public Integer getKucun() {
return kucun;
}
/**
* 设置:最低库存阈值
*/
public void setZuidikucunyuzhi(Integer zuidikucunyuzhi) {
this.zuidikucunyuzhi = zuidikucunyuzhi;
}
/**
* 获取:最低库存阈值
*/
public Integer getZuidikucunyuzhi() {
return zuidikucunyuzhi;
}
/**
* 设置:新增时间
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ public interface YaopinxinxiService extends IService<YaopinxinxiEntity> {

List<Map<String, Object>> selectGroup(Map<String, Object> params,Wrapper<YaopinxinxiEntity> wrapper);


List<YaopinxinxiEntity> selectLowStockDrugs();

List<Map<String, Object>> generatePurchaseSuggestions();

}

Loading