1.调整库存预警功能逻辑

master
x_z 2 years ago
parent df0df7d7c1
commit 90dd44579f

@ -1,9 +1,7 @@
package com.glxp.api.dao.basic;
import com.glxp.api.dao.BaseMapperPlus;
import com.glxp.api.dao.inout.IoCodeDao;
import com.glxp.api.entity.basic.UdiRelevanceEntity;
import com.glxp.api.entity.inout.IoCodeEntity;
import com.glxp.api.req.basic.FilterUdiRelRequest;
import com.glxp.api.res.basic.UdiRelevanceResponse;
import org.apache.ibatis.annotations.Mapper;
@ -86,5 +84,13 @@ public interface UdiRelevanceDao extends BaseMapperPlus<UdiRelevanceDao, UdiRele
*/
String selectProductNameByRelId(@Param("relId") Long relId);
/**
*
*
* @param relId
* @return
*/
UdiRelevanceEntity selectRemindParams(@Param("relId") Long relId);
Boolean updateBatchById(@Param("list") List<UdiRelevanceEntity> list);
}

@ -42,6 +42,12 @@ public class InvRemindMsgEntity {
@TableField(value = "expireDate")
private String expireDate;
/**
* ID
*/
@TableField(value = "supId")
private String supId;
/**
*
*/

@ -48,12 +48,6 @@ public class InvRemindSetEntity {
@TableField(value = "lowStock")
private Boolean lowStock;
/**
*
*/
@TableField(value = "lowStockNum")
private Integer lowStockNum;
/**
*
*/
@ -66,12 +60,6 @@ public class InvRemindSetEntity {
@TableField(value = "overStock")
private Boolean overStock;
/**
*
*/
@TableField(value = "overStockNum")
private Integer overStockNum;
/**
*
*/
@ -84,12 +72,6 @@ public class InvRemindSetEntity {
@TableField(value = "recentDate")
private Boolean recentDate;
/**
*
*/
@TableField(value = "recentDateDay")
private Integer recentDateDay;
/**
*
*/
@ -108,43 +90,6 @@ public class InvRemindSetEntity {
@TableField(value = "updateTime")
private Date updateTime;
public static final String COL_ID = "id";
public static final String COL_RELID = "relId";
public static final String COL_DEPTCODE = "deptCode";
public static final String COL_INVCODE = "invCode";
public static final String COL_INVSPACECODE = "invSpaceCode";
public static final String COL_LOWSTOCK = "lowStock";
public static final String COL_LOWSTOCKNUM = "lowStockNum";
public static final String COL_LACKSTOCK = "lackStock";
public static final String COL_OVERSTOCK = "overStock";
public static final String COL_OVERSTOCKNUM = "overStockNum";
public static final String COL_EXPIREDATE = "expireDate";
public static final String COL_RECENTDATE = "recentDate";
public static final String COL_RECENTDATEDAY = "recentDateDay";
public static final String COL_REMARK = "remark";
public static final String COL_CREATEUSER = "createUser";
public static final String COL_CREATETIME = "createTime";
public static final String COL_UPDATEUSER = "updateUser";
public static final String COL_UPDATETIME = "updateTime";
@Override
public String toString() {
return "InvRemindSetEntity{" +
@ -153,13 +98,10 @@ public class InvRemindSetEntity {
", 仓库编码:='" + invCode + '\'' +
", 货位编码:='" + invSpaceCode + '\'' +
", 是否开启低库存预警:=" + lowStock +
", 库存低于多少数量时预警:=" + lowStockNum +
", 是否开启库存负数预警:=" + lackStock +
", 是否开启库存积压预警:=" + overStock +
", 库存高于多少数量时预警:=" + overStockNum +
", 是否开启库存产品过期提醒:=" + expireDate +
", 是否开启近效期提醒:=" + recentDate +
", 近效期达到多少天时提醒:=" + recentDateDay +
", 备注:='" + remark + '\'' +
'}';
}

@ -54,4 +54,9 @@ public class FilterInvRemindMsgRequest extends ListPageRequest {
*/
private Integer ignoreStatus;
/**
* ID
*/
private String supId;
}

@ -112,4 +112,24 @@ public class InvRemindMsgResponse {
*/
private Integer ignoreStatus;
/**
*
*/
private String ggxh;
/**
*
*/
private String supName;
/**
*
*/
private String manufactory;
/**
*
*/
private String zczbhhzbapzbh;
}

@ -90,4 +90,9 @@ public class InvRemindSetResponse {
*/
private String invSpaceName;
/**
*
*/
private String ggxh;
}

@ -1,14 +1,17 @@
package com.glxp.api.service.inv.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.github.pagehelper.PageHelper;
import com.glxp.api.common.enums.ResultEnum;
import com.glxp.api.common.res.BaseResponse;
import com.glxp.api.common.util.ResultVOUtils;
import com.glxp.api.dao.basic.UdiRelevanceDao;
import com.glxp.api.dao.inv.InvProductDao;
import com.glxp.api.dao.inv.InvRemindMsgDao;
import com.glxp.api.entity.basic.UdiRelevanceEntity;
import com.glxp.api.entity.inv.InvProductEntity;
import com.glxp.api.entity.inv.InvRemindMsgEntity;
import com.glxp.api.entity.inv.InvRemindSetEntity;
@ -35,6 +38,8 @@ public class InvRemindMsgServiceImpl implements InvRemindMsgService {
private InvRemindMsgDao invRemindMsgDao;
@Resource
private InvProductDao invProductDao;
@Resource
private UdiRelevanceDao udiRelevanceDao;
@Override
public List<InvRemindMsgResponse> filterList(FilterInvRemindMsgRequest filterInvRemindMsgRequest) {
@ -70,77 +75,94 @@ public class InvRemindMsgServiceImpl implements InvRemindMsgService {
List<InvProductEntity> invDataList = new CopyOnWriteArrayList<>(invProductList);
invDataList.parallelStream().forEach(invProductEntity -> {
//初始化查询预警消息参数
FilterInvRemindMsgRequest invRemindMsgRequest = new FilterInvRemindMsgRequest();
invRemindMsgRequest.setRelId(invProductEntity.getRelIdFk().toString());
invRemindMsgRequest.setBatchNo(invProductEntity.getBatchNo());
invRemindMsgRequest.setDeptCode(invProductEntity.getDeptCode());
invRemindMsgRequest.setInvCode(invProductEntity.getInvCode());
invRemindMsgRequest.setInvSpaceCode(invProductEntity.getInvSpaceCode());
//根据预警设置,添加类型参数
if (invRemindSetEntity.getLowStock()) {
//开启低库存预警
invRemindMsgRequest.setType("1"); //库存不足预警
InvRemindMsgEntity msgEntity = getInvRemindMsgEntity(invRemindMsgRequest, invProductEntity);
//判断是否需要生成/刷新库存预警
if (msgEntity.getNextRemindTime().getTime() >= new Date().getTime() && invProductEntity.getReCount() < invRemindSetEntity.getLowStockNum()) {
//设置预警消息
msgEntity.setMsg(StrUtil.format("库存数量已不足:{},当前库存数量:{} ", invRemindSetEntity.getLowStockNum(), invProductEntity.getReCount()));
saveMsg(msgEntity);
//查询产品在耗材字典中设置的预警参数
UdiRelevanceEntity udiRelevanceEntity = udiRelevanceDao.selectRemindParams(invProductEntity.getRelIdFk());
if (null == udiRelevanceEntity) {
log.info("此库存产品在耗材字典中不存在,无法生成库存数量及近效期相关预警信息");
} else {
//初始化查询预警消息参数
FilterInvRemindMsgRequest invRemindMsgRequest = new FilterInvRemindMsgRequest();
invRemindMsgRequest.setRelId(invProductEntity.getRelIdFk().toString());
invRemindMsgRequest.setBatchNo(invProductEntity.getBatchNo());
invRemindMsgRequest.setDeptCode(invProductEntity.getDeptCode());
invRemindMsgRequest.setInvCode(invProductEntity.getInvCode());
invRemindMsgRequest.setInvSpaceCode(invProductEntity.getInvSpaceCode());
//根据预警设置,添加类型参数
if (invRemindSetEntity.getLowStock() && null != udiRelevanceEntity.getLowStockNum()) {
//开启低库存预警
invRemindMsgRequest.setType("1"); //库存不足预警
InvRemindMsgEntity msgEntity = getInvRemindMsgEntity(invRemindMsgRequest, invProductEntity);
//判断是否需要生成/刷新库存预警
if ((null == msgEntity.getNextRemindTime() || msgEntity.getNextRemindTime().getTime() <= new Date().getTime()) && udiRelevanceEntity.getLowStockNum() > invProductEntity.getReCount()) {
//设置预警消息
msgEntity.setMsg(StrUtil.format("库存数量已不足:{},当前库存数量:{} ", udiRelevanceEntity.getLowStockNum(), invProductEntity.getReCount()));
saveMsg(msgEntity);
}
} else {
String logInfo = invRemindSetEntity.getLowStock() ? "产品 " + invProductEntity.getRelIdFk() + " 未设置低库存预警数量" : "产品 " + invProductEntity.getRelIdFk() + " 未开启低库存预警";
log.info(logInfo);
}
}
if (invRemindSetEntity.getLackStock()) {
//开启负库存预警
invRemindMsgRequest.setType("2");//库存负数预警
InvRemindMsgEntity msgEntity = getInvRemindMsgEntity(invRemindMsgRequest, invProductEntity);
//判断是否需要生成/刷新库存预警
if (msgEntity.getNextRemindTime().getTime() >= new Date().getTime() && invProductEntity.getReCount() < 0) {
//设置预警消息
msgEntity.setMsg(StrUtil.format("库存数量为负,当前库存数量:{}", invProductEntity.getReCount()));
saveMsg(msgEntity);
}
}
if (invRemindSetEntity.getOverStock()) {
//开启库存积压预警
invRemindMsgRequest.setType("3"); //库存积压预警
InvRemindMsgEntity msgEntity = getInvRemindMsgEntity(invRemindMsgRequest, invProductEntity);
//判断是否需要生成/刷新库存预警
if (msgEntity.getNextRemindTime().getTime() > new Date().getTime() && invProductEntity.getReCount() > invRemindSetEntity.getOverStockNum()) {
//设置预警消息
msgEntity.setMsg(StrUtil.format("库存积压,当前库存数量:{}", invProductEntity.getReCount()));
saveMsg(msgEntity);
if (invRemindSetEntity.getLackStock()) {
//开启负库存预警
invRemindMsgRequest.setType("2");//库存负数预警
InvRemindMsgEntity msgEntity = getInvRemindMsgEntity(invRemindMsgRequest, invProductEntity);
//判断是否需要生成/刷新库存预警
if ((null == msgEntity.getNextRemindTime() || msgEntity.getNextRemindTime().getTime() <= new Date().getTime()) && invProductEntity.getReCount() < 0) {
//设置预警消息
msgEntity.setMsg(StrUtil.format("库存数量为负,当前库存数量:{}", invProductEntity.getReCount()));
saveMsg(msgEntity);
}
}
}
if (invRemindSetEntity.getExpireDate()) {
//开启产品过期预警
invRemindMsgRequest.setType("4"); //库存过期预警
InvRemindMsgEntity msgEntity = getInvRemindMsgEntity(invRemindMsgRequest, invProductEntity);
//判断是否需要生成/刷新库存预警
if (msgEntity.getNextRemindTime().getTime() > new Date().getTime() && StrUtil.isNotBlank(invProductEntity.getExpireDate()) && DateUtil.compareExpire(invProductEntity.getExpireDate(), null)) {
//设置预警消息
msgEntity.setMsg(StrUtil.format("产品已过期,产品失效日期:{}", invProductEntity.getExpireDate()));
saveMsg(msgEntity);
if (invRemindSetEntity.getOverStock() && null != udiRelevanceEntity.getOverStockNum()) {
//开启库存积压预警
invRemindMsgRequest.setType("3"); //库存积压预警
InvRemindMsgEntity msgEntity = getInvRemindMsgEntity(invRemindMsgRequest, invProductEntity);
//判断是否需要生成/刷新库存预警
if ((null == msgEntity.getNextRemindTime() || msgEntity.getNextRemindTime().getTime() <= new Date().getTime()) && invProductEntity.getReCount() > udiRelevanceEntity.getOverStockNum()) {
//设置预警消息
msgEntity.setMsg(StrUtil.format("库存积压,当前库存数量:{}", invProductEntity.getReCount()));
saveMsg(msgEntity);
}
} else {
String logInfo = invRemindSetEntity.getOverStock() ? "产品 " + invProductEntity.getRelIdFk() + " 未设置库存积压预警数量" : "产品 " + invProductEntity.getRelIdFk() + " 未开启库存积压预警";
log.info(logInfo);
}
}
if (invRemindSetEntity.getRecentDate()) {
//开启库存近效期预警
invRemindMsgRequest.setType("5"); //库存近效期预警
InvRemindMsgEntity msgEntity = getInvRemindMsgEntity(invRemindMsgRequest, invProductEntity);
//判断是否需要生成/刷新库存预警
if (msgEntity.getNextRemindTime().getTime() > new Date().getTime() && StrUtil.isNotBlank(invProductEntity.getExpireDate())) {
//计算产品记录失效的天数
long recentDay = Long.parseLong(DateUtil.getDate("yyMMdd")) - Long.parseLong(invProductEntity.getExpireDate());
if (invRemindSetEntity.getRecentDateDay() > recentDay) {
if (invRemindSetEntity.getExpireDate()) {
//开启产品过期预警
invRemindMsgRequest.setType("4"); //库存过期预警
InvRemindMsgEntity msgEntity = getInvRemindMsgEntity(invRemindMsgRequest, invProductEntity);
//判断是否需要生成/刷新库存预警
if ((null == msgEntity.getNextRemindTime() || msgEntity.getNextRemindTime().getTime() <= new Date().getTime()) && StrUtil.isNotBlank(invProductEntity.getExpireDate()) && DateUtil.compareExpire(invProductEntity.getExpireDate(), null)) {
//设置预警消息
msgEntity.setMsg(StrUtil.format("库存即将过期,产品失效日期:{}", invProductEntity.getExpireDate()));
msgEntity.setMsg(StrUtil.format("产品已过期,产品失效日期:{}", invProductEntity.getExpireDate()));
saveMsg(msgEntity);
}
}
if (invRemindSetEntity.getRecentDate() && null != udiRelevanceEntity.getRecentDateTime()) {
//开启库存近效期预警
invRemindMsgRequest.setType("5"); //库存近效期预警
InvRemindMsgEntity msgEntity = getInvRemindMsgEntity(invRemindMsgRequest, invProductEntity);
//判断是否需要生成/刷新库存预警
if ((null == msgEntity.getNextRemindTime() || msgEntity.getNextRemindTime().getTime() <= new Date().getTime()) && StrUtil.isNotBlank(invProductEntity.getExpireDate())) {
//当前时间 - 近效期预警时间 > 产品失效日期,则进行预警
DateTime dateTime = cn.hutool.core.date.DateUtil.offsetHour(new Date(), udiRelevanceEntity.getRecentDateTime());
if (Long.parseLong(dateTime.toString("yyMMdd")) > Long.parseLong(invProductEntity.getExpireDate())) {
//设置预警消息
msgEntity.setMsg(StrUtil.format("库存即将过期,产品失效日期:{}", invProductEntity.getExpireDate()));
saveMsg(msgEntity);
}
}
} else {
String logInfo = invRemindSetEntity.getRecentDate() ? "产品 " + invProductEntity.getRelIdFk() + " 未设置近效期预警时间" : "产品 " + invProductEntity.getRelIdFk() + " 未开启近效期预警";
log.info(logInfo);
}
}
});
} else {
@ -206,6 +228,7 @@ public class InvRemindMsgServiceImpl implements InvRemindMsgService {
msgEntity = new InvRemindMsgEntity();
msgEntity.setRelId(invProductEntity.getRelIdFk().toString()); //耗材字典产品ID
msgEntity.setBatchNo(invProductEntity.getBatchNo()); //批次号
msgEntity.setSupId(invProductEntity.getSupId()); //供应商ID
msgEntity.setDeptCode(invProductEntity.getDeptCode()); //部门编码
msgEntity.setInvCode(invProductEntity.getInvCode()); //仓库编码
msgEntity.setInvSpaceCode(invProductEntity.getInvSpaceCode()); //货位号

@ -886,4 +886,10 @@
</foreach>
</update>
<select id="selectRemindParams" resultType="com.glxp.api.entity.basic.UdiRelevanceEntity">
select lowStockNum, overStockNum, recentDateTime
from basic_udirel
where id = #{relId}
</select>
</mapper>

@ -14,11 +14,18 @@
irm.outCount,
irm.reCount,
irm.status,
irm.ignoreStatus,
irm.type,
irm.msg,
irm.handleMsg,
irm.remark,
bp.ggxh,
bp.manufactory,
bp.zczbhhzbapzbh,
bp.cpmctymc productName,
(select `name` from auth_warehouse where `code` = irm.invCode) invName,
(select `name` from auth_space where `code` = irm.invSpaceCode and invCode = irm.invCode) invSpaceName
(select `name` from auth_space where `code` = irm.invSpaceCode and invCode = irm.invCode) invSpaceName,
(select `name` from basic_corp where erpId = irm.supId) supName
from inv_remind_msg irm
left join basic_udirel bu on bu.id = irm.relId
left join basic_products bp on bp.uuid = bu.uuid
@ -38,6 +45,12 @@
<if test="status != null">
AND irm.status = #{status}
</if>
<if test="ignoreStatus != null">
AND irm.ignoreStatus = #{ignoreStatus}
</if>
<if test="ggxh != null and ggxh != ''">
AND bp.ggxh = #{ggxh}
</if>
<if test="type != null and type != ''">
AND type = #{type}
</if>
@ -66,6 +79,9 @@
<if test="type != null and type != ''">
AND type = #{type}
</if>
<if test="supId != null and supId != ''">
AND supId = #{supId}
</if>
</where>
</select>
</mapper>

@ -17,6 +17,7 @@
irs.recentDateDay,
irs.remark,
bp.cpmctymc productName,
bp.ggxh,
(select `name` from auth_warehouse where `code` = irs.invCode) invName,
(select `name` from auth_space where `code` = irs.invSpaceCode and invCode = irs.invCode) invSpaceName
from inv_remind_set irs

@ -266,7 +266,7 @@
</select>
<select id="filterProductNames" resultType="com.glxp.api.res.inv.InvProductResponse">
select ip.relIdFk, bp.cpmctymc
select ip.relIdFk, bp.cpmctymc, bp.ggxh
from inv_product ip
left join inv_product_detail ipd on ip.relIdFk = ipd.relId and ip.invCode = ipd.invCode and
ifnull(ip.batchNo, 'empty') = ifnull(ipd.batchNo, 'empty')

Loading…
Cancel
Save