diff --git a/ant-design-vue-jeecg/src/views/system/inventory/InventoryLevelAlarmList.vue b/ant-design-vue-jeecg/src/views/system/inventory/InventoryLevelAlarmList.vue new file mode 100644 index 0000000..2905e81 --- /dev/null +++ b/ant-design-vue-jeecg/src/views/system/inventory/InventoryLevelAlarmList.vue @@ -0,0 +1,327 @@ +<template> + <a-card :bordered="false"> + <!-- 查询区域 --> + <div class="table-page-search-wrapper"> + <a-form layout="inline" @keyup.enter.native="searchQuery"> + <a-row :gutter="24"> + <a-col :xl="6" :lg="7" :md="8" :sm="24"> + <a-form-item label="物料编码"> + <a-input placeholder="请输入物料编码" v-model="queryParam.materialCode"></a-input> + </a-form-item> + </a-col> + <a-col :xl="6" :lg="7" :md="8" :sm="24"> + <a-form-item label="物料名称"> + <a-input placeholder="请输入物料名称" v-model="queryParam.materialName"></a-input> + </a-form-item> + </a-col> + <a-col :xl='6' :lg='7' :md='8' :sm='24'> + <a-form-item label='预警状态'> + <a-select show-search placeholder='请选择预警状态' option-filter-prop='children' v-model='queryParam.alarmStatus'> + <a-select-option v-for='item in alarmStatusList' :key='item.name' :value='item.code'> + {{ item.name }} + </a-select-option> + </a-select> + </a-form-item> + </a-col> + <a-col :xl="6" :lg="7" :md="8" :sm="24"> + <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons"> + <a-button id="search" type="primary" @click="searchQuery" icon="search">查询</a-button> + <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button> + </span> + </a-col> + </a-row> + </a-form> + </div> + <!-- 查询区域-END --> + + <!-- 操作按钮区域 --> + <div class="table-operator" style="display: none"> + <a-button type="primary" icon="download" @click="handleExportXls('inventory_level_alarm')">导出</a-button> + </div> + + <!-- table区域-begin --> + <div> + <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;"> + <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a + style="font-weight: 600">{{ selectedRowKeys.length }}</a>项 + <a style="margin-left: 24px" @click="onClearSelected">清空</a> + </div> + + <a-table + ref="table" + size="middle" + :scroll="{x:true}" + bordered + rowKey="id" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + :loading="loading" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" + class="j-table-force-nowrap" + @change="handleTableChange"> + + <span slot="min" slot-scope="text, record"> + <a-tag :key="record" :color="minColor(record)"> + {{ minStatus(record) }} + </a-tag> + </span> + + <span slot="max" slot-scope="text, record"> + <a-tag :key="record" :color="maxColor(record)"> + {{ maxStatus(record) }} + </a-tag> + </span> + + <span slot="qtySum" slot-scope="text, record"> + <a-tag :key="record" :color="qtySumColor(record)"> + {{ qtySumStatus(record) }} + </a-tag> + </span> + + <span slot="upper" slot-scope="text, record"> + <a-tag :key="record" :color="upperColor(record)"> + {{ record.upper }} + </a-tag> + </span> + + <span slot="lower" slot-scope="text, record"> + <a-tag :key="record" :color="lowerColor(record)"> + {{ record.lower }} + </a-tag> + </span> + + <template slot="htmlSlot" slot-scope="text"> + <div v-html="text"></div> + </template> + <template slot="imgSlot" slot-scope="text"> + <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span> + <img v-else :src="getImgView(text)" height="25px" alt="" + style="max-width:80px;font-size: 12px;font-style: italic;"/> + </template> + <template slot="fileSlot" slot-scope="text"> + <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span> + <a-button + v-else + :ghost="true" + type="primary" + icon="download" + size="small" + @click="downloadFile(text)"> + 下载 + </a-button> + </template> + + </a-table> + </div> + </a-card> +</template> + +<script> + +import '@/assets/less/TableExpand.less' +import {mixinDevice} from '@/utils/mixin' +import {JeecgListMixin} from '@/mixins/JeecgListMixin' + +export default { + name: 'InventoryLevelAlarmList', + mixins: [JeecgListMixin, mixinDevice], + components: {}, + queryParam: { + materialName2:"" + }, + data() { + return { + description: '库存水位预警', + // alarmStatusList:['所有', '无预警', '有预警', '上限预警', '下限预警'], + alarmStatusList:[ + {'name':'所有', 'code':'all'}, + {'name':'无预警', 'code':'noAlarm'}, + {'name':'有预警', 'code':'isAlarm'}, + {'name':'上限预警', 'code':'upperAlarm'}, + {'name':'下限预警', 'code':'lowerAlarm'}], + // 表头 + columns: [ + { + title: '#', + dataIndex: '', + key: 'rowIndex', + width: 60, + align: "center", + customRender: function (t, r, index) { + return parseInt(index) + 1; + } + }, + { + title: '物料编码', + align: "center", + dataIndex: 'materialCode' + }, + { + title: '物料名称', + align: "center", + dataIndex: 'materialName' + }, + { + title: '最小值', + align: "center", + dataIndex: 'min', + scopedSlots: {customRender: 'min'} + }, + { + title: '下限预警值', + align: "center", + dataIndex: 'lower', + scopedSlots: {customRender: 'lower'} + }, + { + title: '库存数量', + align: "center", + dataIndex: 'qtySum', + scopedSlots: {customRender: 'qtySum'} + }, + { + title: '上限预警值', + align: "center", + dataIndex: 'upper', + scopedSlots: {customRender: 'upper'} + }, + { + title: '最大值', + align: "center", + dataIndex: 'max', + scopedSlots: {customRender: 'max'} + }, + { + title: '物料规格', + align: "center", + dataIndex: 'materialSpec' + }, + { + title: '物料单位', + align: "center", + dataIndex: 'materialUnit' + }, + { + title: '仓库编码', + align: "center", + dataIndex: 'warehouseCode' + }, + { + title: '货主编码', + align: "center", + dataIndex: 'companyCode' + }, + { + title: '备注', + align: "center", + dataIndex: 'remark' + }, + ], + url: { + list: "/inventory/inventoryLevel/list", + exportXlsUrl: "/inventory/inventoryLevel/exportXls", + }, + dictOptions: {}, + superFieldList: [], + } + }, + created() { + this.getSuperFieldList(); + }, + computed: { + importExcelUrl: function () { + return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`; + }, + }, + methods: { + initDictConfig() { + }, + qtySumStatus(record) { + if(record.qtySum <= record.lower){ + return record.qtySum + " 🠋" + } + if(record.qtySum >= record.upper){ + return record.qtySum + " 🠉" + } + return record.qtySum; + }, + qtySumColor(record) { + if(record.qtySum > record.upper || record.qtySum < record.lower){ + return 'red'; + } + return ''; + }, + + lowerColor(record) { + if(record.qtySum <= record.lower){ + return 'blue'; + } + return ''; + }, + + upperColor(record) { + if(record.qtySum >= record.upper){ + return 'blue'; + } + return ''; + }, + + maxColor(record) { + if(record.qtySum >= record.max){ + return 'blue'; + } + return ''; + }, + + minColor(record) { + if(record.qtySum <= record.min){ + return 'blue'; + } + return ''; + }, + + minStatus(record) { + if(record.min <= 0){ + return '' + } + return record.min; + }, + + maxStatus(record) { + if(record.max <= 0){ + return ''; + } + return record.max; + }, + getSuperFieldList() { + let fieldList = []; + fieldList.push({type: 'string', value: 'alarmType', text: '预警类别代码'}) + fieldList.push({type: 'string', value: 'warehouseCode', text: '仓库编码'}) + fieldList.push({type: 'string', value: 'companyCode', text: '货主编码'}) + fieldList.push({type: 'string', value: 'materialCode', text: '物料编码'}) + fieldList.push({type: 'string', value: 'materialName', text: '物料名称'}) + fieldList.push({type: 'string', value: 'materialSpec', text: '物料规格'}) + fieldList.push({type: 'string', value: 'materialUnit', text: '物料单位'}) + fieldList.push({type: 'int', value: 'qtysum', text: 'qtysum'}) + fieldList.push({type: 'int', value: 'inlower', text: 'inlower'}) + fieldList.push({type: 'int', value: 'inupper', text: 'inupper'}) + fieldList.push({type: 'int', value: 'inmin', text: 'inmin'}) + fieldList.push({type: 'int', value: 'inmax', text: 'inmax'}) + fieldList.push({type: 'int', value: 'needalarm', text: 'needalarm'}) + fieldList.push({type: 'int', value: 'max', text: '最大'}) + fieldList.push({type: 'int', value: 'min', text: '最小'}) + fieldList.push({type: 'int', value: 'upper', text: '上限预警值'}) + fieldList.push({type: 'int', value: 'lower', text: '下限预警值'}) + fieldList.push({type: 'string', value: 'remark', text: '备注'}) + fieldList.push({type: 'string', value: 'userdef1', text: '备用字段1'}) + fieldList.push({type: 'string', value: 'userdef2', text: '备用字段2'}) + fieldList.push({type: 'string', value: 'userdef3', text: '备用字段3'}) + this.superFieldList = fieldList + } + } +} +</script> +<style scoped> +@import '~@assets/less/common.less'; +</style> \ No newline at end of file diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/materialWarning/service/IMaterialWarningService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/materialWarning/service/IMaterialWarningService.java index 21bef47..f9470a7 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/materialWarning/service/IMaterialWarningService.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/materialWarning/service/IMaterialWarningService.java @@ -1,11 +1,8 @@ package org.jeecg.modules.wms.config.materialWarning.service; import com.baomidou.mybatisplus.extension.service.IService; -import org.jeecg.modules.wms.config.materialWarning.entity.MaterialLevelAlarm; import org.jeecg.modules.wms.config.materialWarning.entity.MaterialWarning; -import java.util.List; - /** * @Description: 物料预警 * @Author: jeecg-boot @@ -14,5 +11,4 @@ import java.util.List; */ public interface IMaterialWarningService extends IService<MaterialWarning> { - List<MaterialLevelAlarm> getLevelAlarm(String materialCode); } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/materialWarning/service/impl/MaterialWarningServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/materialWarning/service/impl/MaterialWarningServiceImpl.java index 0d11055..e80884a 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/materialWarning/service/impl/MaterialWarningServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/materialWarning/service/impl/MaterialWarningServiceImpl.java @@ -1,24 +1,11 @@ package org.jeecg.modules.wms.config.materialWarning.service.impl; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import org.jeecg.modules.wms.config.materialWarning.entity.MaterialLevelAlarm; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.jeecg.modules.wms.config.materialWarning.entity.MaterialWarning; import org.jeecg.modules.wms.config.materialWarning.mapper.MaterialWarningMapper; import org.jeecg.modules.wms.config.materialWarning.service.IMaterialWarningService; -import org.jeecg.modules.wms.inventory.inventoryHeader.entity.InventoryDetail; -import org.jeecg.modules.wms.inventory.inventoryHeader.service.impl.InventoryDetailServiceImpl; -import org.jeecg.utils.StringUtils; -import org.jeecg.utils.constant.QuantityConstant; import org.springframework.stereotype.Service; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; - -import javax.annotation.Resource; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - /** * @Description: 物料预警 * @Author: jeecg-boot @@ -28,26 +15,4 @@ import java.util.stream.Collectors; @Service public class MaterialWarningServiceImpl extends ServiceImpl<MaterialWarningMapper, MaterialWarning> implements IMaterialWarningService { - @Resource - InventoryDetailServiceImpl inventoryDetailService; - - @Override - public List<MaterialLevelAlarm> getLevelAlarm(String materialCode) { - LambdaQueryWrapper<MaterialWarning> query = new LambdaQueryWrapper<>(); - query.eq(StringUtils.isNotEmpty(materialCode), MaterialWarning::getMaterialCode, materialCode); - List<MaterialWarning> warningList = list(query); - - List<MaterialLevelAlarm> alarmList = new ArrayList<>(); - warningList.forEach(w -> { - InventoryDetail d = new InventoryDetail(); - d.setMaterialCode(w.getMaterialCode()); - d.setCompanyCode(w.getCompanyCode()); - d.setWarehouseCode(w.getWarehouseCode()); - d.setInventoryStatus(QuantityConstant.QUALITY_GOOD); - BigDecimal sum = inventoryDetailService.getInventorySumQty(d); - alarmList.add(new MaterialLevelAlarm(w, sum)); - }); - - return alarmList.stream().filter(MaterialLevelAlarm::needAlarm).collect(Collectors.toList()); - } } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryLevel/controller/InventoryLevelAlarmController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryLevel/controller/InventoryLevelAlarmController.java new file mode 100644 index 0000000..f0c5fb5 --- /dev/null +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryLevel/controller/InventoryLevelAlarmController.java @@ -0,0 +1,97 @@ +package org.jeecg.modules.wms.inventory.inventoryLevel.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.base.controller.JeecgController; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.modules.oss.entity.OSSFile; +import org.jeecg.modules.wms.config.materialWarning.entity.MaterialWarning; +import org.jeecg.modules.wms.config.materialWarning.service.IMaterialWarningService; +import org.jeecg.modules.wms.inventory.inventoryLevel.entity.InventoryLevelAlarm; +import org.jeecg.modules.wms.inventory.inventoryLevel.service.IInventoryLevelAlarmService; +import org.jeecg.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Description: inventory_level_alarm + * @Author: jeecg-boot + * @Date: 2023-10-30 + * @Version: V1.0 + */ +@Api(tags="inventory_level_alarm") +@RestController +@RequestMapping("/inventory/inventoryLevel") +@Slf4j +public class InventoryLevelAlarmController extends JeecgController<InventoryLevelAlarm, IInventoryLevelAlarmService> { + @Autowired + private IInventoryLevelAlarmService iInventoryLevelAlarmService; + + @Autowired + private IMaterialWarningService iMaterialWarningService; + + /** + * 分页列表查询 + * + * @param inventoryLevelAlarm + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "inventory_level_alarm-分页列表查询") + @ApiOperation(value="inventory_level_alarm-分页列表查询", notes="inventory_level_alarm-分页列表查询") + @GetMapping(value = "/list") + public Result<IPage<InventoryLevelAlarm>> queryPageList(String materialCode, String materialName, String alarmStatus, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + + Page<InventoryLevelAlarm> page = new Page<>(pageNo, pageSize); + IPage<InventoryLevelAlarm> pageList = iInventoryLevelAlarmService.queryLevelAlarm(page, materialCode, materialName, alarmStatus); + //对list分页处理 + return Result.OK(pageList); + } + + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "inventory_level_alarm-通过id查询") + @ApiOperation(value="inventory_level_alarm-通过id查询", notes="inventory_level_alarm-通过id查询") + @GetMapping(value = "/queryById") + public Result<InventoryLevelAlarm> queryById(@RequestParam(name="id",required=true) String id) { + InventoryLevelAlarm inventoryLevelAlarm = iInventoryLevelAlarmService.getById(id); + if(inventoryLevelAlarm ==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(inventoryLevelAlarm); + } + + /** + * 导出excel + * + * @param request + * @param inventoryLevelAlarm + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, InventoryLevelAlarm inventoryLevelAlarm) { + return super.exportXls(request, inventoryLevelAlarm, InventoryLevelAlarm.class, "inventory_level_alarm"); + } + + +} diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/materialWarning/entity/MaterialLevelAlarm.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryLevel/entity/InventoryLevelAlarm.java index a22ae14..3304b98 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/materialWarning/entity/MaterialLevelAlarm.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryLevel/entity/InventoryLevelAlarm.java @@ -1,61 +1,59 @@ -package org.jeecg.modules.wms.config.materialWarning.entity; +package org.jeecg.modules.wms.inventory.inventoryLevel.entity; import lombok.Data; +import org.jeecg.modules.wms.config.materialWarning.entity.MaterialWarning; import java.math.BigDecimal; @Data -public class MaterialLevelAlarm extends MaterialWarning { +public class InventoryLevelAlarm extends MaterialWarning { private int qtySum; - //小于等于下线预警 - private boolean inLower; - //小于等于上线预警 - private boolean inUpper; - //小于等于最小值 - private boolean inMin; - //大于等于最大值 - private boolean inMax; + public InventoryLevelAlarm(){ + + } /** - * 构造预警数据 + * 判断是否低于下限 **/ - public MaterialLevelAlarm(MaterialWarning warning, BigDecimal qtySum) { - org.springframework.beans.BeanUtils.copyProperties(warning, this); - this.qtySum = qtySum.intValue(); - if (getLower() > 0) { - inLower = this.qtySum <= getLower(); - } - if (getUpper() > 0) { - inUpper = this.qtySum >= getUpper(); - } + public boolean inLower() { + return this.qtySum <= getLower(); + } - if (getMin() > 0) { - inMin = this.qtySum <= getMin(); - } + /** + * 判断是否高于上限 + **/ + public boolean inUpper(){ + return this.qtySum >= getUpper(); + } - if (getMax() > 0) { - inMax = this.qtySum >= getMax(); - } + /** 判断是否低于最小值 **/ + public boolean inMin(){ + return this.qtySum <= getMin(); + } + + /** 判断是否高于最大值 **/ + public boolean inMax(){ + return this.qtySum >= getMax(); } /** * 判断是否有预警 **/ public Boolean needAlarm() { - return inLower || inUpper || inMin || inMax; + return inLower() || inUpper() || inMin() || inMax(); } @Override public String toString() { String str = "<ul>"; - if (inLower) { + if (inLower()) { str = str + "<li><b>" + getMaterialName() + "</b> " + getMaterialCode() + " 库存数 <b>" + getQtySum() + "</b> 低于下限预警值<b> " + getLower() + "</b></li>"; - } else if (inUpper) { + } else if (inUpper()) { str = str + "<li><b>" + getMaterialName() + "</b> " + getMaterialCode() + " 库存数 <b>" + getQtySum() + "</b> 高于上限预警值<b> " + getUpper() + "</b></li>"; - } else if (inMin) { + } else if (inMin()) { str = str + "<li><b>" + getMaterialName() + "</b> " + getMaterialCode() + " 库存数 <b>" + getQtySum() + "</b> 低于最低值<b> " + getMin() + "</b></li>"; - } else if (inMax) { + } else if (inMax()) { str = str + "<li><b>" + getMaterialName() + "</b> " + getMaterialCode() + " 库存数 <b>" + getQtySum() + "</b> 超过最高值<b> " + getMax() + "</b></li>"; } return str + "</ul>"; diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryLevel/mapper/InventoryLevelAlarmMapper.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryLevel/mapper/InventoryLevelAlarmMapper.java new file mode 100644 index 0000000..d0feada --- /dev/null +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryLevel/mapper/InventoryLevelAlarmMapper.java @@ -0,0 +1,25 @@ +package org.jeecg.modules.wms.inventory.inventoryLevel.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.wms.inventory.inventoryLevel.entity.InventoryLevelAlarm; + +import java.util.List; + +/** + * @Description: material_level_alarm + * @Author: jeecg-boot + * @Date: 2023-10-30 + * @Version: V1.0 + */ +public interface InventoryLevelAlarmMapper extends BaseMapper<InventoryLevelAlarm> { + IPage<InventoryLevelAlarm> queryLevelAlarm(IPage<InventoryLevelAlarm> page, + @Param("materialCode") String materialCode, + @Param("materialName") String materialName, + @Param("alarmStatus") String alarmStatus); + + List<InventoryLevelAlarm> queryLevelAlarm(@Param("materialCode") String materialCode, + @Param("materialName") String materialName, + @Param("alarmStatus") String alarmStatus); +} diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryLevel/mapper/xml/InventoryLevelAlarmMapper.xml b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryLevel/mapper/xml/InventoryLevelAlarmMapper.xml new file mode 100644 index 0000000..4e5ea2f --- /dev/null +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryLevel/mapper/xml/InventoryLevelAlarmMapper.xml @@ -0,0 +1,38 @@ +<?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="org.jeecg.modules.wms.inventory.inventoryLevel.mapper.InventoryLevelAlarmMapper"> + + <select id="queryLevelAlarm" + resultType="org.jeecg.modules.wms.inventory.inventoryLevel.entity.InventoryLevelAlarm"> + select t.* from ( + SELECT w.*, sum(qty) as qtySum FROM inventory_detail i inner join material_warning w + on i.material_code = w.material_code + WHERE i.inventory_status='good' and i.material_code IN ( SELECT material_code FROM material_warning + <where> + <if test="materialCode != null and materialCode != ''"> + and material_code = #{materialCode} + </if> + <if test="materialName != null and materialName != ''"> + <bind name="materialNameLike" value="'%'+materialName+'%'"/> + and material_name like #{materialNameLike} + </if> + </where> + ) + group by material_code + ) t + <where> + <if test="alarmStatus != null and alarmStatus == 'noAlarm'"> + and qtySum between lower and upper + </if> + <if test="alarmStatus != null and alarmStatus == 'isAlarm'"> + and qtySum <= lower or qtySum >= upper + </if> + <if test="alarmStatus != null and alarmStatus == 'lowerAlarm'"> + and qtySum <= lower + </if> + <if test="alarmStatus != null and alarmStatus == 'upperAlarm'"> + and qtySum >= upper + </if> + </where> + </select> +</mapper> \ No newline at end of file diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryLevel/service/IInventoryLevelAlarmService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryLevel/service/IInventoryLevelAlarmService.java new file mode 100644 index 0000000..fd4b3fd --- /dev/null +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryLevel/service/IInventoryLevelAlarmService.java @@ -0,0 +1,21 @@ +package org.jeecg.modules.wms.inventory.inventoryLevel.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import org.jeecg.modules.wms.config.materialWarning.entity.MaterialWarning; +import org.jeecg.modules.wms.inventory.inventoryLevel.entity.InventoryLevelAlarm; + +import java.util.List; + +/** + * @Description: inventory_level_alarm + * @Author: jeecg-boot + * @Date: 2023-10-30 + * @Version: V1.0 + */ +public interface IInventoryLevelAlarmService extends IService<InventoryLevelAlarm> { + List<InventoryLevelAlarm> getLevelAlarm(String materialCode); + + IPage<InventoryLevelAlarm> queryLevelAlarm(IPage<InventoryLevelAlarm> page, String materialCode, String materialName, String alarmStatus); + +} diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryLevel/service/impl/InventoryLevelAlarmServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryLevel/service/impl/InventoryLevelAlarmServiceImpl.java new file mode 100644 index 0000000..63ec826 --- /dev/null +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryLevel/service/impl/InventoryLevelAlarmServiceImpl.java @@ -0,0 +1,54 @@ +package org.jeecg.modules.wms.inventory.inventoryLevel.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.jeecg.modules.wms.config.materialWarning.entity.MaterialWarning; +import org.jeecg.modules.wms.config.materialWarning.service.impl.MaterialWarningServiceImpl; +import org.jeecg.modules.wms.inventory.inventoryHeader.entity.InventoryDetail; +import org.jeecg.modules.wms.inventory.inventoryHeader.service.impl.InventoryDetailServiceImpl; +import org.jeecg.modules.wms.inventory.inventoryLevel.entity.InventoryLevelAlarm; +import org.jeecg.modules.wms.inventory.inventoryLevel.mapper.InventoryLevelAlarmMapper; +import org.jeecg.modules.wms.inventory.inventoryLevel.service.IInventoryLevelAlarmService; +import org.jeecg.utils.StringUtils; +import org.jeecg.utils.constant.QuantityConstant; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Description: inventory_level_alarm + * @Author: jeecg-boot + * @Date: 2023-10-30 + * @Version: V1.0 + */ +@Service +public class InventoryLevelAlarmServiceImpl extends ServiceImpl<InventoryLevelAlarmMapper, InventoryLevelAlarm> implements IInventoryLevelAlarmService { + + @Resource + InventoryDetailServiceImpl inventoryDetailService; + + @Resource + MaterialWarningServiceImpl materialWarningService; + + @Resource + InventoryLevelAlarmMapper inventoryLevelAlarmMapper; + + @Override + public List<InventoryLevelAlarm> getLevelAlarm(String materialCode) { + List<InventoryLevelAlarm> alarmList = inventoryLevelAlarmMapper.queryLevelAlarm(materialCode,null,"isAlarm"); + + return alarmList; + } + + + @Override + public IPage<InventoryLevelAlarm> queryLevelAlarm(IPage<InventoryLevelAlarm> page, String materialCode, String materialName, String alarmStatus) { + return inventoryLevelAlarmMapper.queryLevelAlarm(page, materialCode, materialName, alarmStatus); + } +} diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/MaterialLevelAlarmTask.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/InventoryLevelAlarmTask.java index 031af70..0dd8c5a 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/MaterialLevelAlarmTask.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/InventoryLevelAlarmTask.java @@ -11,14 +11,12 @@ import org.jeecg.modules.system.entity.SysUser; import org.jeecg.modules.system.service.impl.SysAnnouncementServiceImpl; import org.jeecg.modules.system.service.impl.SysRoleServiceImpl; import org.jeecg.modules.system.service.impl.SysUserServiceImpl; -import org.jeecg.modules.wms.config.materialWarning.entity.MaterialLevelAlarm; -import org.jeecg.modules.wms.config.materialWarning.service.impl.MaterialWarningServiceImpl; +import org.jeecg.modules.wms.inventory.inventoryLevel.entity.InventoryLevelAlarm; +import org.jeecg.modules.wms.inventory.inventoryLevel.service.impl.InventoryLevelAlarmServiceImpl; import org.quartz.*; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; -import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -31,7 +29,7 @@ import java.util.stream.Collectors; @Slf4j @PersistJobDataAfterExecution @DisallowConcurrentExecution -public class MaterialLevelAlarmTask implements Job { +public class InventoryLevelAlarmTask implements Job { private String parameter; @Resource @@ -43,14 +41,14 @@ public class MaterialLevelAlarmTask implements Job { @Resource private SysRoleServiceImpl sysRoleService; - @Autowired + @Resource private SqlSession sqlSession; - @Autowired + @Resource private SysAnnouncementServiceImpl sysAnnouncementService; - @Autowired - private MaterialWarningServiceImpl materialWarningService; + @Resource + private InventoryLevelAlarmServiceImpl inventoryLevelAlarmService; public void setParameter(String parameter) { this.parameter = parameter; @@ -60,13 +58,15 @@ public class MaterialLevelAlarmTask implements Job { public void execute(JobExecutionContext context) throws JobExecutionException { log.info(StrUtil.format("定时任务 MaterialLevelAlarmTask 参数:{},执行时间:{}", this.parameter, DateUtils.getTimestamp())); - List<MaterialLevelAlarm> alarmList = materialWarningService.getLevelAlarm(null); + List<InventoryLevelAlarm> alarmList = inventoryLevelAlarmService.getLevelAlarm(null); if (CollectionUtils.isEmpty(alarmList)) { return; } - List<String> list = alarmList.stream().map(MaterialLevelAlarm::toString).collect(Collectors.toList()); + List<String> list = alarmList.stream().map(InventoryLevelAlarm::toString).collect(Collectors.toList()); String msg = String.join("\n", list); + msg = msg + "<a href='/wms/#/system/inventory/inventoryLevel'>库存水位详情</a> " + + "<a href='/wms/#/system/config/MaterialWarningList'>预警配置</a>"; List<SysUser> userList; try { @@ -75,7 +75,7 @@ public class MaterialLevelAlarmTask implements Job { if (userList.size() == 0) { userList = null; } - sysAnnouncementService.quickAnnouncementToUser(userList, "物料水位预警", msg, DateUtil.offsetDay(new Date(), 1), "H"); + sysAnnouncementService.quickAnnouncementToUser(userList, "库存水位预警", msg, DateUtil.offsetDay(new Date(), 1), "H"); } catch (Exception e) { log.error("获取预警通知用户出错", e); }