diff --git a/src/main/java/com/glxp/api/ApiAdminApplication.java b/src/main/java/com/glxp/api/ApiAdminApplication.java index 8311440da..cc2c99fa4 100644 --- a/src/main/java/com/glxp/api/ApiAdminApplication.java +++ b/src/main/java/com/glxp/api/ApiAdminApplication.java @@ -6,10 +6,12 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @ServletComponentScan +@EnableScheduling @MapperScan("com.glxp.api.dao") public class ApiAdminApplication extends SpringBootServletInitializer { diff --git a/src/main/java/com/glxp/api/controller/inv/InvRemindMsgController.java b/src/main/java/com/glxp/api/controller/inv/InvRemindMsgController.java new file mode 100644 index 000000000..a17928b26 --- /dev/null +++ b/src/main/java/com/glxp/api/controller/inv/InvRemindMsgController.java @@ -0,0 +1,50 @@ +package com.glxp.api.controller.inv; + +import com.github.pagehelper.PageInfo; +import com.glxp.api.common.res.BaseResponse; +import com.glxp.api.common.util.ResultVOUtils; +import com.glxp.api.req.inv.FilterInvRemindMsgRequest; +import com.glxp.api.res.inv.InvRemindMsgResponse; +import com.glxp.api.service.inv.InvRemindMsgService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 库存预警消息接口 + */ +@Slf4j +@RestController +public class InvRemindMsgController { + + @Resource + private InvRemindMsgService invRemindMsgService; + + /** + * 查询预警消息列表 + * + * @param filterInvRemindMsgRequest + * @return + */ + @GetMapping("/udiwms/inv/remind/msg/filter") + public BaseResponse filterList(FilterInvRemindMsgRequest filterInvRemindMsgRequest) { + List list = invRemindMsgService.filterList(filterInvRemindMsgRequest); + PageInfo pageInfo = new PageInfo<>(list); + return ResultVOUtils.page(pageInfo); + } + + /** + * 确认预警消息 + * + * @param id + * @return + */ + @GetMapping("/udiwms/inv/remind/msg/confirmMsg") + public BaseResponse confirmMsg(Integer id, String handleMsg) { + return invRemindMsgService.confirmMsg(id, handleMsg); + } + +} diff --git a/src/main/java/com/glxp/api/controller/inv/InvRemindSetController.java b/src/main/java/com/glxp/api/controller/inv/InvRemindSetController.java new file mode 100644 index 000000000..a1f3e0d72 --- /dev/null +++ b/src/main/java/com/glxp/api/controller/inv/InvRemindSetController.java @@ -0,0 +1,82 @@ +package com.glxp.api.controller.inv; + +import cn.hutool.core.util.StrUtil; +import com.github.pagehelper.PageInfo; +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.entity.inv.InvRemindSetEntity; +import com.glxp.api.req.inv.AddInvRemindSetRequest; +import com.glxp.api.req.inv.FilterInvRemindSetRequest; +import com.glxp.api.req.system.DeleteRequest; +import com.glxp.api.res.inv.InvRemindSetResponse; +import com.glxp.api.service.inv.InvRemindSetService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 库存预警设置接口 + */ +@Slf4j +@RestController +public class InvRemindSetController { + + @Resource + private InvRemindSetService invRemindSetService; + + /** + * 查询库存预警设置列表 + * + * @param filterInvRemindSetRequest + * @return + */ + @GetMapping("/udiwms/inv/remind/set/filter") + public BaseResponse filterList(FilterInvRemindSetRequest filterInvRemindSetRequest) { + List list = invRemindSetService.filterList(filterInvRemindSetRequest); + PageInfo pageInfo = new PageInfo<>(list); + return ResultVOUtils.page(pageInfo); + } + + /** + * 添加库存预警设置 + * + * @param addInvRemindSetRequest + * @return + */ + @PostMapping("/udiwms/inv/remind/set/add") + public BaseResponse addInvRemindSet(@RequestBody AddInvRemindSetRequest addInvRemindSetRequest) { + return invRemindSetService.addInvRemindSet(addInvRemindSetRequest); + } + + /** + * 更新库存预警设置 + * + * @param invRemindSetEntity + * @return + */ + @PostMapping("/udiwms/inv/remind/set/update") + public BaseResponse updateInvRemindSet(@RequestBody InvRemindSetEntity invRemindSetEntity) { + return invRemindSetService.updateInvRemindSet(invRemindSetEntity); + } + + /** + * 删除库存预警设置 + * + * @param deleteRequest + * @return + */ + @PostMapping("/udiwms/inv/remind/set/delete") + public BaseResponse delete(@RequestBody DeleteRequest deleteRequest) { + if (null == deleteRequest || StrUtil.isBlank(deleteRequest.getId())) { + return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL); + } + return invRemindSetService.deleteInvRemindSet(Integer.valueOf(deleteRequest.getId())); + } + +} diff --git a/src/main/java/com/glxp/api/dao/inv/InvProductDao.java b/src/main/java/com/glxp/api/dao/inv/InvProductDao.java index 8c1a430ea..09609b79a 100644 --- a/src/main/java/com/glxp/api/dao/inv/InvProductDao.java +++ b/src/main/java/com/glxp/api/dao/inv/InvProductDao.java @@ -55,4 +55,14 @@ public interface InvProductDao extends BaseMapperPlus getCountInvProduct(FilterInvProductRequest filterInvProductRequest); + + /** + * 库存预警查询库存信息 + * + * @param invCode + * @param invSpaceCode + * @param relId + * @return + */ + List selectInvProductInfo(@Param("invCode") String invCode, @Param("invSpaceCode") String invSpaceCode, @Param("relId") String relId); } diff --git a/src/main/java/com/glxp/api/dao/inv/InvRemindMsgDao.java b/src/main/java/com/glxp/api/dao/inv/InvRemindMsgDao.java new file mode 100644 index 000000000..ee3232ff2 --- /dev/null +++ b/src/main/java/com/glxp/api/dao/inv/InvRemindMsgDao.java @@ -0,0 +1,22 @@ +package com.glxp.api.dao.inv; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.glxp.api.entity.inv.InvRemindMsgEntity; +import com.glxp.api.req.inv.FilterInvRemindMsgRequest; +import com.glxp.api.res.inv.InvRemindMsgResponse; + +import java.util.List; + +/** + * 库存预警消息Dao + */ +public interface InvRemindMsgDao extends BaseMapper { + + /** + * 查询库存预警消息列表 + * + * @param filterInvRemindMsgRequest + * @return + */ + List filterList(FilterInvRemindMsgRequest filterInvRemindMsgRequest); +} \ No newline at end of file diff --git a/src/main/java/com/glxp/api/dao/inv/InvRemindSetDao.java b/src/main/java/com/glxp/api/dao/inv/InvRemindSetDao.java new file mode 100644 index 000000000..f06e3d6e8 --- /dev/null +++ b/src/main/java/com/glxp/api/dao/inv/InvRemindSetDao.java @@ -0,0 +1,22 @@ +package com.glxp.api.dao.inv; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.glxp.api.entity.inv.InvRemindSetEntity; +import com.glxp.api.req.inv.FilterInvRemindSetRequest; +import com.glxp.api.res.inv.InvRemindSetResponse; + +import java.util.List; + +/** + * 库存设置Dao + */ +public interface InvRemindSetDao extends BaseMapper { + + /** + * 查询库存设置列表 + * + * @param filterInvRemindSetRequest + * @return + */ + List filterList(FilterInvRemindSetRequest filterInvRemindSetRequest); +} \ No newline at end of file diff --git a/src/main/java/com/glxp/api/entity/inv/InvRemindMsgEntity.java b/src/main/java/com/glxp/api/entity/inv/InvRemindMsgEntity.java new file mode 100644 index 000000000..4d9280fc6 --- /dev/null +++ b/src/main/java/com/glxp/api/entity/inv/InvRemindMsgEntity.java @@ -0,0 +1,134 @@ +package com.glxp.api.entity.inv; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 库存预警消息 + */ +@Data +@TableName(value = "inv_remind_msg") +public class InvRemindMsgEntity { + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 关联主键ID + */ + @TableField(value = "relId") + private String relId; + + /** + * 批次号 + */ + @TableField(value = "batchNo") + private String batchNo; + + /** + * 生产日期 + */ + @TableField(value = "productionDate") + private String productionDate; + + /** + * 失效日期 + */ + @TableField(value = "expireDate") + private String expireDate; + + /** + * 部门 + */ + @TableField(value = "deptCode") + private String deptCode; + + /** + * 仓库号 + */ + @TableField(value = "invCode") + private String invCode; + + /** + * 货位号 + */ + @TableField(value = "invSpaceCode") + private String invSpaceCode; + + /** + * 进数量 + */ + @TableField(value = "inCount") + private Integer inCount; + + /** + * 出数量 + */ + @TableField(value = "outCount") + private Integer outCount; + + /** + * 结余数量 + */ + @TableField(value = "reCount") + private Integer reCount; + + /** + * 消息状态: 1:未确认;2:已确认 + */ + @TableField(value = "`status`") + private Integer status; + + /** + * 消息忽略状态: 0:不忽略;1:忽略7天;2:忽略15天;3:忽略30天 + */ + @TableField(value = "ignoreStatus") + private Integer ignoreStatus; + + /** + * 预警类型:1:库存不足预警;2:库存负数预警;3:库存积压预警;4:库存过期预警;5:库存近效期预警 + */ + @TableField(value = "`type`") + private Integer type; + + /** + * 更新时间 + */ + @TableField(value = "updateTime") + private Date updateTime; + + /** + * 创建时间 + */ + @TableField(value = "createTime") + private Date createTime; + + /** + * 下次提醒时间 + */ + @TableField(value = "nextRemindTime") + private Date nextRemindTime; + + /** + * 备注 + */ + @TableField(value = "remark") + private String remark; + + /** + * 预警消息内容 + */ + @TableField(value = "msg") + private String msg; + + /** + * 处理方式 + */ + @TableField(value = "handleMsg") + private String handleMsg; +} \ No newline at end of file diff --git a/src/main/java/com/glxp/api/entity/inv/InvRemindSetEntity.java b/src/main/java/com/glxp/api/entity/inv/InvRemindSetEntity.java new file mode 100644 index 000000000..2d8a164a1 --- /dev/null +++ b/src/main/java/com/glxp/api/entity/inv/InvRemindSetEntity.java @@ -0,0 +1,166 @@ +package com.glxp.api.entity.inv; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 库存预警设置 + */ +@Data +@TableName(value = "inv_remind_set") +public class InvRemindSetEntity { + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 耗材字典主键 + */ + @TableField(value = "relId") + private String relId; + + /** + * 部门编码 + */ + @TableField(value = "deptCode") + private String deptCode; + + /** + * 仓库编码 + */ + @TableField(value = "invCode") + private String invCode; + + /** + * 货位编码 + */ + @TableField(value = "invSpaceCode") + private String invSpaceCode; + + /** + * 是否开启低库存预警 + */ + @TableField(value = "lowStock") + private Boolean lowStock; + + /** + * 库存低于多少数量时预警 + */ + @TableField(value = "lowStockNum") + private Integer lowStockNum; + + /** + * 是否开启库存负数预警 + */ + @TableField(value = "lackStock") + private Boolean lackStock; + + /** + * 是否开启库存积压预警 + */ + @TableField(value = "overStock") + private Boolean overStock; + + /** + * 库存高于多少数量时预警 + */ + @TableField(value = "overStockNum") + private Integer overStockNum; + + /** + * 是否开启库存产品过期提醒 + */ + @TableField(value = "expireDate") + private Boolean expireDate; + + /** + * 是否开启近效期提醒 + */ + @TableField(value = "recentDate") + private Boolean recentDate; + + /** + * 近效期达到多少天时提醒 + */ + @TableField(value = "recentDateDay") + private Integer recentDateDay; + + /** + * 备注 + */ + @TableField(value = "remark") + private String remark; + + @TableField(value = "`createUser`") + private String createUser; + + @TableField(value = "createTime") + private Date createTime; + + @TableField(value = "updateUser") + private String updateUser; + + @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{" + + ", 产品ID:='" + relId + '\'' + + ", 部门编码:='" + deptCode + '\'' + + ", 仓库编码:='" + invCode + '\'' + + ", 货位编码:='" + invSpaceCode + '\'' + + ", 是否开启低库存预警:=" + lowStock + + ", 库存低于多少数量时预警:=" + lowStockNum + + ", 是否开启库存负数预警:=" + lackStock + + ", 是否开启库存积压预警:=" + overStock + + ", 库存高于多少数量时预警:=" + overStockNum + + ", 是否开启库存产品过期提醒:=" + expireDate + + ", 是否开启近效期提醒:=" + recentDate + + ", 近效期达到多少天时提醒:=" + recentDateDay + + ", 备注:='" + remark + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/glxp/api/req/inv/AddInvRemindSetRequest.java b/src/main/java/com/glxp/api/req/inv/AddInvRemindSetRequest.java new file mode 100644 index 000000000..7759193d6 --- /dev/null +++ b/src/main/java/com/glxp/api/req/inv/AddInvRemindSetRequest.java @@ -0,0 +1,78 @@ +package com.glxp.api.req.inv; + +import lombok.Data; + +/** + * 添加库存预警设置参数 + */ +@Data +public class AddInvRemindSetRequest { + + private Integer id; + + /** + * 耗材字典主键 + */ + private String relId; + + /** + * 部门编码 + */ + private String deptCode; + + /** + * 仓库编码 + */ + private String invCode; + + /** + * 货位编码 + */ + private String invSpaceCode; + + /** + * 是否开启低库存预警 + */ + private Boolean lowStock; + + /** + * 库存低于多少数量时预警 + */ + private Integer lowStockNum; + + /** + * 是否开启库存负数预警 + */ + private Boolean lackStock; + + /** + * 是否开启库存积压预警 + */ + private Boolean overStock; + + /** + * 库存高于多少数量时预警 + */ + private Integer overStockNum; + + /** + * 是否开启库存产品过期提醒 + */ + private Boolean expireDate; + + /** + * 是否开启近效期提醒 + */ + private Boolean recentDate; + + /** + * 近效期达到多少天时提醒 + */ + private Integer recentDateDay; + + /** + * 备注 + */ + private String remark; + +} diff --git a/src/main/java/com/glxp/api/req/inv/FilterInvRemindMsgRequest.java b/src/main/java/com/glxp/api/req/inv/FilterInvRemindMsgRequest.java new file mode 100644 index 000000000..d462fcf02 --- /dev/null +++ b/src/main/java/com/glxp/api/req/inv/FilterInvRemindMsgRequest.java @@ -0,0 +1,42 @@ +package com.glxp.api.req.inv; + +import com.glxp.api.util.page.ListPageRequest; +import lombok.Data; + +/** + * 查询库存预警消息参数 + */ +@Data +public class FilterInvRemindMsgRequest extends ListPageRequest { + + /** + * 耗材字典ID + */ + private String relId; + + /** + * 批次号 + */ + private String batchNo; + + /** + * 仓库编码 + */ + private String invCode; + + /** + * 货位号 + */ + private String invSpaceCode; + + /** + * 消息状态: 1:未确认;2:已确认 + */ + private Integer status; + + /** + * 预警类型:1:库存不足预警;2:库存负数预警;3:库存积压预警;4:库存过期预警;5:库存近效期预警 + */ + private String type; + +} diff --git a/src/main/java/com/glxp/api/req/inv/FilterInvRemindSetRequest.java b/src/main/java/com/glxp/api/req/inv/FilterInvRemindSetRequest.java new file mode 100644 index 000000000..d50a19ba4 --- /dev/null +++ b/src/main/java/com/glxp/api/req/inv/FilterInvRemindSetRequest.java @@ -0,0 +1,27 @@ +package com.glxp.api.req.inv; + +import com.glxp.api.util.page.ListPageRequest; +import lombok.Data; + +/** + * 库存预警设置查询参数 + */ +@Data +public class FilterInvRemindSetRequest extends ListPageRequest { + + /** + * 耗材字典主键 + */ + private String relId; + + /** + * 仓库编码 + */ + private String invCode; + + /** + * 货位编码 + */ + private String invSpaceCode; + +} diff --git a/src/main/java/com/glxp/api/res/inv/InvRemindMsgResponse.java b/src/main/java/com/glxp/api/res/inv/InvRemindMsgResponse.java new file mode 100644 index 000000000..e3785c3ec --- /dev/null +++ b/src/main/java/com/glxp/api/res/inv/InvRemindMsgResponse.java @@ -0,0 +1,115 @@ +package com.glxp.api.res.inv; + +import lombok.Data; + +import java.util.Date; + +/** + * 库存预警消息VO + */ +@Data +public class InvRemindMsgResponse { + + private Integer id; + + /** + * 关联主键ID + */ + private Integer relId; + + /** + * 批次号 + */ + private String batchNo; + + /** + * 生产日期 + */ + private String productionDate; + + /** + * 失效日期 + */ + private String expireDate; + + /** + * 部门 + */ + private String deptCode; + + /** + * 仓库号 + */ + private String invCode; + + /** + * 货位号 + */ + private String invSpaceCode; + + /** + * 进数量 + */ + private Integer inCount; + + /** + * 出数量 + */ + private Integer outCount; + + /** + * 结余数量 + */ + private Integer reCount; + + /** + * 消息状态: 1:未确认;2:已确认 + */ + private Integer status; + + /** + * 预警类型:1:库存不足预警;2:库存负数预警;3:库存积压预警;4:库存过期预警;5:库存近效期预警 + */ + private Integer type; + + /** + * 备注 + */ + private String remark; + + /** + * 产品名称 + */ + private String productName; + + /** + * 仓库名称 + */ + private String invName; + + /** + * 货位名称 + */ + private String invSpaceName; + + /** + * 预警消息内容 + */ + private String msg; + + /** + * 处理方式 + */ + private String handleMsg; + + /** + * 下次提醒时间 + */ + private Date nextRemindTime; + + /** + * 消息忽略状态: 0:不忽略;1:忽略7天;2:忽略15天;3:忽略30天 + */ + private Integer ignoreStatus; + +} diff --git a/src/main/java/com/glxp/api/res/inv/InvRemindSetResponse.java b/src/main/java/com/glxp/api/res/inv/InvRemindSetResponse.java new file mode 100644 index 000000000..252a6b834 --- /dev/null +++ b/src/main/java/com/glxp/api/res/inv/InvRemindSetResponse.java @@ -0,0 +1,93 @@ +package com.glxp.api.res.inv; + +import lombok.Data; + +/** + * 库存设置VO + */ +@Data +public class InvRemindSetResponse { + + private Integer id; + + /** + * 耗材字典主键 + */ + private String relId; + + /** + * 部门编码 + */ + private String deptCode; + + /** + * 仓库编码 + */ + private String invCode; + + /** + * 货位编码 + */ + private String invSpaceCode; + + /** + * 是否开启低库存预警 + */ + private Boolean lowStock; + + /** + * 库存低于多少数量时预警 + */ + private Integer lowStockNum; + + /** + * 是否开启库存负数预警 + */ + private Boolean lackStock; + + /** + * 是否开启库存积压预警 + */ + private Boolean overStock; + + /** + * 库存高于多少数量时预警 + */ + private Integer overStockNum; + + /** + * 是否开启库存产品过期提醒 + */ + private Boolean expireDate; + + /** + * 是否开启近效期提醒 + */ + private Boolean recentDate; + + /** + * 近效期达到多少天时提醒 + */ + private Integer recentDateDay; + + /** + * 备注 + */ + private String remark; + + /** + * 产品名称 + */ + private String productName; + + /** + * 仓库名称 + */ + private String invName; + + /** + * 货位名称 + */ + private String invSpaceName; + +} diff --git a/src/main/java/com/glxp/api/service/inv/InvRemindMsgService.java b/src/main/java/com/glxp/api/service/inv/InvRemindMsgService.java new file mode 100644 index 000000000..9d277a5e8 --- /dev/null +++ b/src/main/java/com/glxp/api/service/inv/InvRemindMsgService.java @@ -0,0 +1,37 @@ +package com.glxp.api.service.inv; + +import com.glxp.api.common.res.BaseResponse; +import com.glxp.api.entity.inv.InvRemindSetEntity; +import com.glxp.api.req.inv.FilterInvRemindMsgRequest; +import com.glxp.api.res.inv.InvRemindMsgResponse; + +import java.util.List; + +/** + * 库存预警消息Servcie + */ +public interface InvRemindMsgService { + + /** + * 查询库存预警消息列表 + * + * @param filterInvRemindMsgRequest + * @return + */ + List filterList(FilterInvRemindMsgRequest filterInvRemindMsgRequest); + + /** + * 确认消息 + * + * @param id + * @return + */ + BaseResponse confirmMsg(Integer id, String handleMsg); + + /** + * 根据库存预警设置生成预警消息 + * + * @param invRemindSetEntity + */ + void createRemindMsg(InvRemindSetEntity invRemindSetEntity); +} diff --git a/src/main/java/com/glxp/api/service/inv/InvRemindSetService.java b/src/main/java/com/glxp/api/service/inv/InvRemindSetService.java new file mode 100644 index 000000000..8f8507732 --- /dev/null +++ b/src/main/java/com/glxp/api/service/inv/InvRemindSetService.java @@ -0,0 +1,48 @@ +package com.glxp.api.service.inv; + +import com.glxp.api.common.res.BaseResponse; +import com.glxp.api.entity.inv.InvRemindSetEntity; +import com.glxp.api.req.inv.AddInvRemindSetRequest; +import com.glxp.api.req.inv.FilterInvRemindSetRequest; +import com.glxp.api.res.inv.InvRemindSetResponse; + +import java.util.List; + +/** + * 库存预警设置Service + */ +public interface InvRemindSetService { + + /** + * 查询库存预警设置列表 + * + * @param filterInvRemindSetRequest + * @return + */ + List filterList(FilterInvRemindSetRequest filterInvRemindSetRequest); + + /** + * 添加库存预警设置 + * + * @param addInvRemindSetRequest + * @return + */ + BaseResponse addInvRemindSet(AddInvRemindSetRequest addInvRemindSetRequest); + + /** + * 更新库存预警设置 + * + * @param invRemindSetEntity + * @return + */ + BaseResponse updateInvRemindSet(InvRemindSetEntity invRemindSetEntity); + + /** + * 根据ID删除库存预警设置 + * + * @param id + * @return + */ + BaseResponse deleteInvRemindSet(Integer id); + +} diff --git a/src/main/java/com/glxp/api/service/inv/impl/InvRemindMsgServiceImpl.java b/src/main/java/com/glxp/api/service/inv/impl/InvRemindMsgServiceImpl.java new file mode 100644 index 000000000..eca566294 --- /dev/null +++ b/src/main/java/com/glxp/api/service/inv/impl/InvRemindMsgServiceImpl.java @@ -0,0 +1,115 @@ +package com.glxp.api.service.inv.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +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.inv.InvProductDao; +import com.glxp.api.dao.inv.InvRemindMsgDao; +import com.glxp.api.entity.inv.InvProductEntity; +import com.glxp.api.entity.inv.InvRemindMsgEntity; +import com.glxp.api.entity.inv.InvRemindSetEntity; +import com.glxp.api.req.inv.FilterInvRemindMsgRequest; +import com.glxp.api.res.inv.InvRemindMsgResponse; +import com.glxp.api.service.inv.InvRemindMsgService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +@Slf4j +@Service +@Transactional(rollbackFor = Exception.class) +public class InvRemindMsgServiceImpl implements InvRemindMsgService { + + @Resource + private InvRemindMsgDao invRemindMsgDao; + @Resource + private InvProductDao invProductDao; + + @Override + public List filterList(FilterInvRemindMsgRequest filterInvRemindMsgRequest) { + if (null == filterInvRemindMsgRequest) { + return Collections.emptyList(); + } + if (null != filterInvRemindMsgRequest.getPage() && null != filterInvRemindMsgRequest.getLimit()) { + PageHelper.offsetPage((filterInvRemindMsgRequest.getPage() - 1) * filterInvRemindMsgRequest.getLimit(), filterInvRemindMsgRequest.getLimit()); + } + return invRemindMsgDao.filterList(filterInvRemindMsgRequest); + } + + @Override + public BaseResponse confirmMsg(Integer id, String handleMsg) { + InvRemindMsgEntity invRemindMsgEntity = invRemindMsgDao.selectById(id); + if (null == invRemindMsgEntity) { + return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, "消息不存在"); + } + invRemindMsgEntity.setStatus(2); //消息状态修改为已确认 + invRemindMsgEntity.setIgnoreStatus(0); //重置成为不忽略 + invRemindMsgEntity.setHandleMsg(handleMsg); //处理方式 + invRemindMsgEntity.setUpdateTime(new Date()); + invRemindMsgDao.updateById(invRemindMsgEntity); + return ResultVOUtils.success("已确认"); + } + + @Override + public void createRemindMsg(InvRemindSetEntity invRemindSetEntity) { + log.info("库存预警设置:{}", invRemindSetEntity.toString()); + //查询库存数量 + List invProductList = invProductDao.selectInvProductInfo(invRemindSetEntity.getInvCode(), invRemindSetEntity.getInvSpaceCode(), invRemindSetEntity.getRelId()); + if (CollUtil.isNotEmpty(invProductList)) { + List invDataList = new CopyOnWriteArrayList<>(invProductList); + + invDataList.parallelStream().forEach(invProductEntity -> { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StrUtil.isNotBlank(invRemindSetEntity.getRelId()), "relId", invRemindSetEntity.getRelId()) + .eq("invCode", invRemindSetEntity.getInvCode()) + .eq(StrUtil.isNotBlank(invRemindSetEntity.getInvSpaceCode()), "invSpaceCode", invRemindSetEntity.getInvSpaceCode()); + InvRemindMsgEntity invRemindMsgEntity = invRemindMsgDao.selectOne(wrapper); + if (null == invRemindMsgEntity) { + invRemindMsgEntity = new InvRemindMsgEntity(); + invRemindMsgEntity.setCreateTime(new Date()); + invRemindMsgEntity.setInvCode(invRemindSetEntity.getInvCode()); + invRemindMsgEntity.setInvSpaceCode(invRemindSetEntity.getInvSpaceCode()); + if (StrUtil.isBlank(invRemindSetEntity.getRelId())) { + //按照产品统计 + invRemindMsgEntity.setRelId(invRemindSetEntity.getRelId()); + } else { + //按仓库统计 + //TODO 待完善 + } + } + + //生成或更新预警消息标识 + boolean flag = false; + + StringBuffer msg = new StringBuffer(); + + //根据库存信息设置,计算或升成库存预警 + if (invRemindSetEntity.getLowStock()) { + //开启低库存预警 + if (invProductEntity.getReCount() < invRemindSetEntity.getLowStockNum()) { + invRemindMsgEntity.setReCount(invRemindMsgEntity.getReCount()); + invRemindMsgEntity.setInCount(invProductEntity.getInCount()); + invRemindMsgEntity.setOutCount(invProductEntity.getOutCount()); + //invRemindMsgEntity.set + msg.append("库存过低,当前库存数量:").append(invProductEntity.getReCount()).append("\n"); + + flag = true; + } + } + }); + } else { + log.info("此仓库或产品库存信息不存在"); + } + } + +} diff --git a/src/main/java/com/glxp/api/service/inv/impl/InvRemindSetServiceImpl.java b/src/main/java/com/glxp/api/service/inv/impl/InvRemindSetServiceImpl.java new file mode 100644 index 000000000..0952aca82 --- /dev/null +++ b/src/main/java/com/glxp/api/service/inv/impl/InvRemindSetServiceImpl.java @@ -0,0 +1,96 @@ +package com.glxp.api.service.inv.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.StrUtil; +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.inv.InvRemindSetDao; +import com.glxp.api.entity.inv.InvRemindSetEntity; +import com.glxp.api.req.inv.AddInvRemindSetRequest; +import com.glxp.api.req.inv.FilterInvRemindSetRequest; +import com.glxp.api.res.inv.InvRemindSetResponse; +import com.glxp.api.service.auth.CustomerService; +import com.glxp.api.service.inv.InvRemindSetService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +@Slf4j +@Service +@Transactional(rollbackFor = Exception.class) +public class InvRemindSetServiceImpl implements InvRemindSetService { + + @Resource + private InvRemindSetDao invRemindSetDao; + @Resource + private CustomerService customerService; + + @Override + public List filterList(FilterInvRemindSetRequest filterInvRemindSetRequest) { + if (null == filterInvRemindSetRequest) { + return Collections.emptyList(); + } + if (null != filterInvRemindSetRequest.getPage() && null != filterInvRemindSetRequest.getLimit()) { + PageHelper.offsetPage((filterInvRemindSetRequest.getPage() - 1) * filterInvRemindSetRequest.getLimit(), filterInvRemindSetRequest.getLimit()); + } + return invRemindSetDao.filterList(filterInvRemindSetRequest); + } + + @Override + public BaseResponse addInvRemindSet(AddInvRemindSetRequest addInvRemindSetRequest) { + if (StrUtil.isBlank(addInvRemindSetRequest.getRelId()) || StrUtil.isBlank(addInvRemindSetRequest.getInvCode())) { + return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, "产品库存信息不完整!"); + } + if (false == addInvRemindSetRequest.getLowStock() && false == addInvRemindSetRequest.getLackStock() && false == addInvRemindSetRequest.getOverStock() && false == addInvRemindSetRequest.getExpireDate() && false == addInvRemindSetRequest.getRecentDate()) { + return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, "预警设置至少开启一项预警!"); + } + InvRemindSetEntity invRemindSetEntity = new InvRemindSetEntity(); + BeanUtil.copyProperties(addInvRemindSetRequest, invRemindSetEntity); + setUpdateInfo(invRemindSetEntity); + invRemindSetDao.insert(invRemindSetEntity); + return ResultVOUtils.success("添加成功"); + } + + @Override + public BaseResponse updateInvRemindSet(InvRemindSetEntity invRemindSetEntity) { + if (false == invRemindSetEntity.getLowStock() && false == invRemindSetEntity.getLackStock() && false == invRemindSetEntity.getOverStock() && false == invRemindSetEntity.getExpireDate() && false == invRemindSetEntity.getRecentDate()) { + return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, "预警设置至少开启一项预警!"); + } + setUpdateInfo(invRemindSetEntity); + invRemindSetDao.updateById(invRemindSetEntity); + return ResultVOUtils.success("更新成功"); + } + + @Override + public BaseResponse deleteInvRemindSet(Integer id) { + if (null == id) { + return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL); + } + invRemindSetDao.deleteById(id); + return ResultVOUtils.success("删除成功"); + } + + /** + * 设置创建更新信息 + * + * @param invRemindSetEntity + */ + private void setUpdateInfo(InvRemindSetEntity invRemindSetEntity) { + Date date = new Date(); + String userId = customerService.getUserIdStr(); + if (null == invRemindSetEntity.getId()) { + invRemindSetEntity.setCreateUser(userId); + invRemindSetEntity.setCreateTime(date); + } + invRemindSetEntity.setUpdateUser(userId); + invRemindSetEntity.setUpdateTime(date); + } + +} diff --git a/src/main/java/com/glxp/api/task/InvRemindMsgTask.java b/src/main/java/com/glxp/api/task/InvRemindMsgTask.java new file mode 100644 index 000000000..dc90292f7 --- /dev/null +++ b/src/main/java/com/glxp/api/task/InvRemindMsgTask.java @@ -0,0 +1,59 @@ +package com.glxp.api.task; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.thread.ThreadUtil; +import com.glxp.api.dao.inv.InvRemindSetDao; +import com.glxp.api.dao.schedule.ScheduledDao; +import com.glxp.api.entity.inv.InvRemindSetEntity; +import com.glxp.api.entity.system.ScheduledEntity; +import com.glxp.api.req.system.ScheduledRequest; +import com.glxp.api.service.inv.InvRemindMsgService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; + +@Slf4j +@Component +public class InvRemindMsgTask implements SchedulingConfigurer { + + @Resource + private ScheduledDao scheduledDao; + @Resource + private InvRemindMsgService invRemindMsgService; + @Resource + private InvRemindSetDao invRemindSetDao; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + taskRegistrar.addTriggerTask(this::process, triggerContext -> { + ScheduledRequest scheduledRequest = new ScheduledRequest(); + scheduledRequest.setCronName("invRemindMsgTask"); + ScheduledEntity scheduled = scheduledDao.findScheduled(scheduledRequest); + if (null == scheduled) { + log.error("库存预警定时任务未配置,请注意!"); + return null; + } + String cron = scheduled.getCron(); + return new CronTrigger(cron).nextExecutionTime(triggerContext); + }); + } + + private void process() { + log.info("开始扫描库存信息,生成库存预警消息"); + List invRemindSetEntities = invRemindSetDao.selectList(null); + if (CollUtil.isNotEmpty(invRemindSetEntities)) { + log.info("库存预警设置条数:{}", invRemindSetEntities.size()); + //开始生成库存信息 + for (InvRemindSetEntity invRemindSetEntity : invRemindSetEntities) { + ThreadUtil.execAsync(ThreadUtil.newThread(() -> invRemindMsgService.createRemindMsg(invRemindSetEntity), "createInvRemindThread")); + } + } else { + log.info("无库存预警设置,结束库存扫描"); + } + } +} diff --git a/src/main/java/com/glxp/api/task/SupplementOrderTask.java b/src/main/java/com/glxp/api/task/SupplementOrderTask.java index 8ec3cb9ff..32051b561 100644 --- a/src/main/java/com/glxp/api/task/SupplementOrderTask.java +++ b/src/main/java/com/glxp/api/task/SupplementOrderTask.java @@ -11,7 +11,6 @@ import com.glxp.api.service.inout.IoAddInoutService; import com.glxp.api.service.inout.IoOrderService; import com.glxp.api.service.system.SystemParamConfigService; import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.config.ScheduledTaskRegistrar; import org.springframework.scheduling.support.CronTrigger; @@ -26,7 +25,6 @@ import java.util.concurrent.atomic.AtomicInteger; */ @Slf4j @Component -@EnableScheduling public class SupplementOrderTask implements SchedulingConfigurer { @Resource diff --git a/src/main/resources/mybatis/mapper/inv/InvRemindMsgDao.xml b/src/main/resources/mybatis/mapper/inv/InvRemindMsgDao.xml new file mode 100644 index 000000000..4fafcdcc3 --- /dev/null +++ b/src/main/resources/mybatis/mapper/inv/InvRemindMsgDao.xml @@ -0,0 +1,47 @@ + + + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/mapper/inv/InvRemindSetDao.xml b/src/main/resources/mybatis/mapper/inv/InvRemindSetDao.xml new file mode 100644 index 000000000..b53724255 --- /dev/null +++ b/src/main/resources/mybatis/mapper/inv/InvRemindSetDao.xml @@ -0,0 +1,38 @@ + + + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/mapper/inv/invProductDao.xml b/src/main/resources/mybatis/mapper/inv/invProductDao.xml index 38719ddf0..6ae393975 100644 --- a/src/main/resources/mybatis/mapper/inv/invProductDao.xml +++ b/src/main/resources/mybatis/mapper/inv/invProductDao.xml @@ -236,4 +236,30 @@ group by inv_product_detail.relId, inv_product_detail.batchNo + +