src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.math.LongMath; import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.web.controller.BaseController; @@ -14,6 +15,7 @@ import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage; import com.ruoyi.procurementrecord.service.ProcurementRecordOutService; import com.ruoyi.procurementrecord.service.ProcurementRecordService; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.sales.mapper.ShipmentApprovalMapper; import com.ruoyi.sales.mapper.ShippingInfoMapper; import com.ruoyi.sales.pojo.SalesLedgerProduct; @@ -47,9 +49,7 @@ @Autowired private ISalesLedgerProductService salesLedgerProductService; @Autowired private ProcurementRecordOutService procurementRecordOutService; @Autowired private ProcurementRecordService procurementRecordStorageService; private StockUtils stockUtils; @GetMapping("/listPage") @ApiOperation("发货审批列表") @@ -99,18 +99,9 @@ // throw new ServiceException("采购记录不存在,审批回滚"); // } // 生成出库记录 ProcurementRecordOutAdd procurementRecordOutAdd = new ProcurementRecordOutAdd(); // procurementRecordOutAdd.setId(procurementRecordStorage.getId()); procurementRecordOutAdd.setId(0); procurementRecordOutAdd.setProductModelId(salesLedgerProduct.getProductModelId()); procurementRecordOutAdd.setSalesLedgerProductId((long) Math.toIntExact(salesLedgerProduct.getId())); procurementRecordOutAdd.setType(2); procurementRecordOutAdd.setUserId(Math.toIntExact(getUserId())); procurementRecordOutAdd.setQuantity(salesLedgerProduct.getQuantity().toPlainString()); procurementRecordOutAdd.setTime(LocalDate.now().toString()); procurementRecordOutService.stockout(procurementRecordOutAdd); //出库 stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId()); } return AjaxResult.success(); src/main/java/com/ruoyi/stock/controller/StockInRecordController.java
@@ -6,7 +6,6 @@ import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.stock.dto.StockInRecordDto; import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.service.StockInRecordService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
@@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.compensationperformance.pojo.CompensationPerformance; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.domain.R; @@ -93,4 +92,16 @@ public R stockInAndOutRecord(StockInventoryDto stockInventoryDto,Page page) { return R.ok(stockInventoryService.stockInAndOutRecord(stockInventoryDto,page)); } @PostMapping("/frozenStock") @ApiOperation("冻结库存") public R frozenStock(@RequestBody StockInventoryDto stockInventoryDto) { return R.ok(stockInventoryService.frozenStock(stockInventoryDto)); } @PostMapping("/thawStock") @ApiOperation("解冻库存") public R thawStock(@RequestBody StockInventoryDto stockInventoryDto) { return R.ok(stockInventoryService.thawStock(stockInventoryDto)); } } src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java
@@ -5,9 +5,7 @@ import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.stock.dto.StockInRecordDto; import com.ruoyi.stock.dto.StockOutRecordDto; import com.ruoyi.stock.pojo.StockOutRecord; import com.ruoyi.stock.service.StockOutRecordService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java
@@ -2,9 +2,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockUnQualifiedRecordTypeEnum; import com.ruoyi.framework.web.domain.R; import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.dto.StockUninventoryDto; import com.ruoyi.stock.service.StockUninventoryService; import io.swagger.annotations.ApiOperation; @@ -57,4 +57,17 @@ stockUninventoryService.exportStockUninventory(response,stockUninventoryDto); } @PostMapping("/frozenStock") @ApiOperation("冻结库存") public R frozenStock(@RequestBody StockInventoryDto stockInventoryDto) { return R.ok(stockUninventoryService.frozenStock(stockInventoryDto)); } @PostMapping("/thawStock") @ApiOperation("解冻库存") public R thawStock(@RequestBody StockInventoryDto stockInventoryDto) { return R.ok(stockUninventoryService.thawStock(stockInventoryDto)); } } src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java
@@ -1,6 +1,5 @@ package com.ruoyi.stock.dto; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import com.ruoyi.stock.pojo.StockInRecord; import lombok.Data; src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
@@ -37,4 +37,6 @@ private BigDecimal totalStockIn; private BigDecimal totalStockOut; private BigDecimal currentStock; private String unLockedQuantity; } src/main/java/com/ruoyi/stock/dto/StockUninventoryDto.java
@@ -3,6 +3,8 @@ import com.ruoyi.stock.pojo.StockUninventory; import lombok.Data; import java.math.BigDecimal; @Data public class StockUninventoryDto extends StockUninventory { private String productName; @@ -15,4 +17,6 @@ //入库类型对应的id private Long recordId; private BigDecimal unLockedQuantity; } src/main/java/com/ruoyi/stock/execl/StockInventoryExportData.java
@@ -1,14 +1,9 @@ package com.ruoyi.stock.execl; import com.alibaba.excel.annotation.ExcelProperty; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; @Data public class StockInventoryExportData { src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
@@ -1,12 +1,12 @@ package com.ruoyi.stock.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.stock.dto.StockInRecordDto; import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.execl.StockInventoryExportData; import com.ruoyi.stock.pojo.StockInventory; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; src/main/java/com/ruoyi/stock/mapper/StockUninventoryMapper.java
@@ -1,11 +1,11 @@ package com.ruoyi.stock.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.stock.dto.StockUninventoryDto; import com.ruoyi.stock.execl.StockInventoryExportData; import com.ruoyi.stock.pojo.StockUninventory; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; src/main/java/com/ruoyi/stock/pojo/StockInventory.java
@@ -3,19 +3,17 @@ import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import lombok.Setter; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.lang.Nullable; import javax.validation.constraints.NotBlank; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; /** * <p> @@ -61,7 +59,7 @@ private BigDecimal lockedQuantity; @ApiModelProperty("预警数量") private Integer warnNum; private BigDecimal warnNum; @ApiModelProperty("备注") private String remark; src/main/java/com/ruoyi/stock/pojo/StockUninventory.java
@@ -3,13 +3,16 @@ import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import lombok.Setter; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; /** * <p> @@ -37,11 +40,15 @@ private BigDecimal qualitity; @TableField(fill = FieldFill.INSERT) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime createTime; @ApiModelProperty("更新时间") @TableField(fill = FieldFill.INSERT_UPDATE) private Integer updateTime; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime updateTime; @ApiModelProperty("版本号") private Integer version; @@ -49,4 +56,7 @@ @ApiModelProperty("备注") private String remark; @ApiModelProperty("被订单锁定数量") private BigDecimal lockedQuantity; } src/main/java/com/ruoyi/stock/service/StockInventoryService.java
@@ -2,15 +2,14 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.framework.web.domain.R; import com.ruoyi.stock.dto.StockInRecordDto; import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.pojo.StockInventory; import com.baomidou.mybatisplus.extension.service.IService; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.util.List; /** * <p> @@ -36,4 +35,7 @@ IPage<StockInventoryDto> stockInAndOutRecord(StockInventoryDto stockInventoryDto,Page page); Boolean frozenStock(StockInventoryDto stockInventoryDto); Boolean thawStock(StockInventoryDto stockInventoryDto); } src/main/java/com/ruoyi/stock/service/StockUninventoryService.java
@@ -2,9 +2,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.dto.StockUninventoryDto; import com.ruoyi.stock.pojo.StockUninventory; import com.baomidou.mybatisplus.extension.service.IService; import javax.servlet.http.HttpServletResponse; @@ -25,4 +26,8 @@ Integer subtractStockUninventory(StockUninventoryDto stockUninventoryDto); void exportStockUninventory(HttpServletResponse response, StockUninventoryDto stockUninventoryDto); Boolean frozenStock(StockInventoryDto stockInventoryDto); Boolean thawStock(StockInventoryDto stockInventoryDto); } src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -11,12 +11,10 @@ import com.ruoyi.common.utils.OrderUtils; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.staff.pojo.StaffOnJob; import com.ruoyi.stock.dto.StockInRecordDto; import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.dto.StockUninventoryDto; import com.ruoyi.stock.execl.StockInRecordExportData; import com.ruoyi.stock.execl.StockInventoryExportData; import com.ruoyi.stock.mapper.StockInRecordMapper; import com.ruoyi.stock.mapper.StockInventoryMapper; import com.ruoyi.stock.mapper.StockUninventoryMapper; @@ -25,7 +23,6 @@ import com.ruoyi.stock.pojo.StockUninventory; import com.ruoyi.stock.service.StockInRecordService; import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.web.domain.R; @@ -13,11 +14,10 @@ import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.dto.StockOutRecordDto; import com.ruoyi.stock.execl.StockInventoryExportData; import com.ruoyi.stock.pojo.StockInventory; import com.ruoyi.stock.mapper.StockInventoryMapper; import com.ruoyi.stock.pojo.StockInventory; import com.ruoyi.stock.service.StockInRecordService; import com.ruoyi.stock.service.StockInventoryService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.stock.service.StockOutRecordService; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; @@ -70,6 +70,7 @@ newStockInventory.setQualitity(stockInventoryDto.getQualitity()); newStockInventory.setVersion(1); newStockInventory.setRemark(stockInventoryDto.getRemark()); newStockInventory.setWarnNum(stockInventoryDto.getWarnNum()); stockInventoryMapper.insert(newStockInventory); }else { stockInventoryMapper.updateAddStockInventory(stockInventoryDto); @@ -90,6 +91,9 @@ stockOutRecordDto.setType("0"); stockOutRecordService.add(stockOutRecordDto); StockInventory oldStockInventory = stockInventoryMapper.selectOne(new QueryWrapper<StockInventory>().lambda().eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId())); if (stockInventoryDto.getQualitity().compareTo( oldStockInventory.getQualitity().subtract(oldStockInventory.getLockedQuantity()))>0) { throw new RuntimeException("库存不足无法出库"); } if (ObjectUtils.isEmpty(oldStockInventory)) { throw new RuntimeException("产品库存不存在"); }else { @@ -167,4 +171,28 @@ public IPage<StockInventoryDto> stockInAndOutRecord(StockInventoryDto stockInventoryDto, Page page) { return stockInventoryMapper.stockInAndOutRecord(stockInventoryDto,page); } @Override public Boolean frozenStock(StockInventoryDto stockInventoryDto) { StockInventory stockInventory = stockInventoryMapper.selectById(stockInventoryDto.getId()); if (stockInventory.getQualitity().compareTo(stockInventoryDto.getLockedQuantity())<0) { throw new RuntimeException("冻结数量不能超过库存数量"); } if (ObjectUtils.isEmpty(stockInventory.getLockedQuantity())) { stockInventory.setLockedQuantity(stockInventoryDto.getLockedQuantity()); }else { stockInventory.setLockedQuantity(stockInventory.getLockedQuantity().add(stockInventoryDto.getLockedQuantity())); } return this.updateById(stockInventory); } @Override public Boolean thawStock(StockInventoryDto stockInventoryDto) { StockInventory stockInventory = stockInventoryMapper.selectById(stockInventoryDto.getId()); if (stockInventory.getLockedQuantity().compareTo(stockInventoryDto.getLockedQuantity())<0) { throw new RuntimeException("解冻数量不能超过冻结数量"); } stockInventory.setLockedQuantity(stockInventory.getLockedQuantity().subtract(stockInventoryDto.getLockedQuantity())); return this.updateById(stockInventory); } } src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
@@ -14,7 +14,6 @@ import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.dto.StockOutRecordDto; import com.ruoyi.stock.dto.StockUninventoryDto; import com.ruoyi.stock.execl.StockInRecordExportData; import com.ruoyi.stock.execl.StockOutRecordExportData; import com.ruoyi.stock.mapper.StockInventoryMapper; import com.ruoyi.stock.mapper.StockOutRecordMapper; @@ -25,7 +24,6 @@ import com.ruoyi.stock.pojo.StockUninventory; import com.ruoyi.stock.service.StockOutRecordService; import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletResponse; src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java
@@ -4,18 +4,18 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.stock.dto.StockInRecordDto; import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.dto.StockOutRecordDto; import com.ruoyi.stock.dto.StockUninventoryDto; import com.ruoyi.stock.execl.StockInventoryExportData; import com.ruoyi.stock.pojo.StockInventory; import com.ruoyi.stock.pojo.StockUninventory; import com.ruoyi.stock.mapper.StockUninventoryMapper; import com.ruoyi.stock.pojo.StockUninventory; import com.ruoyi.stock.service.StockInRecordService; import com.ruoyi.stock.service.StockOutRecordService; import com.ruoyi.stock.service.StockUninventoryService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -98,4 +98,28 @@ ExcelUtil<StockInventoryExportData> util = new ExcelUtil<>(StockInventoryExportData.class); util.exportExcel(response,list, "不合格库存信息"); } @Override public Boolean frozenStock(StockInventoryDto stockInventoryDto) { StockUninventory stockUninventory = stockUninventoryMapper.selectById(stockInventoryDto.getId()); if (stockUninventory.getQualitity().compareTo(stockInventoryDto.getLockedQuantity())<0) { throw new RuntimeException("冻结数量不能超过库存数量"); } if (ObjectUtils.isEmpty(stockUninventory.getLockedQuantity())) { stockUninventory.setLockedQuantity(stockInventoryDto.getLockedQuantity()); }else { stockUninventory.setLockedQuantity(stockUninventory.getLockedQuantity().add(stockInventoryDto.getLockedQuantity())); } return this.updateById(stockUninventory); } @Override public Boolean thawStock(StockInventoryDto stockInventoryDto) { StockUninventory stockUninventory = stockUninventoryMapper.selectById(stockInventoryDto.getId()); if (stockUninventory.getLockedQuantity().compareTo(stockInventoryDto.getLockedQuantity())<0) { throw new RuntimeException("解冻数量不能超过冻结数量"); } stockUninventory.setLockedQuantity(stockUninventory.getLockedQuantity().subtract(stockInventoryDto.getLockedQuantity())); return this.updateById(stockUninventory); } } src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -4,14 +4,14 @@ <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.ruoyi.stock.pojo.StockInventory"> <result column="id" property="id" /> <result column="product_model_id" property="productModelId" /> <result column="qualitity" property="qualitity" /> <result column="create_time" property="createTime" /> <result column="update_time" property="updateTime" /> <result column="version" property="version" /> <result column="locked_quantity" property="lockedQuantity" /> <result column="warn_num" property="warnNum" /> <result column="id" property="id"/> <result column="product_model_id" property="productModelId"/> <result column="qualitity" property="qualitity"/> <result column="create_time" property="createTime"/> <result column="update_time" property="updateTime"/> <result column="version" property="version"/> <result column="locked_quantity" property="lockedQuantity"/> <result column="warn_num" property="warnNum"/> </resultMap> <update id="updateAddStockInventory"> update stock_inventory @@ -19,11 +19,14 @@ <if test="ew.qualitity != null"> qualitity = qualitity + #{ew.qualitity}, </if> <if test="ew.version != null"> version = version + 1, <if test="ew.version != null"> version = version + 1, </if> <if test="ew.remark != null and ew.remark !=''"> remark = #{ew.remark}, </if> <if test="ew.warnNum != null and ew.warnNum !=''"> warn_num = #{ew.warnNum}, </if> update_time = now() </set> @@ -46,13 +49,21 @@ where product_model_id = #{ew.productModelId} and qualitity >= #{ew.qualitity} </update> <select id="pagestockInventory" resultType="com.ruoyi.stock.dto.StockInventoryDto"> select si.*, pm.model, pm.unit, p.product_name select si.id, si.qualitity, COALESCE(si.locked_quantity, 0) as locked_quantity, si.product_model_id, si.create_time, si.update_time, COALESCE(si.warn_num, 0) as warn_num, si.version, (si.qualitity - COALESCE(si.locked_quantity, 0)) as un_locked_quantity, pm.model, pm.unit, p.product_name from stock_inventory si left join product_model pm on si.product_model_id = pm.id left join product p on pm.product_id = p.id left join product_model pm on si.product_model_id = pm.id left join product p on pm.product_id = p.id where 1 = 1 <if test="ew.productName != null and ew.productName !=''"> and p.product_name like concat('%',#{ew.productName},'%') src/main/resources/mapper/stock/StockUninventoryMapper.xml
@@ -44,13 +44,21 @@ where product_model_id = #{ew.productModelId} </update> <select id="pageStockUninventory" resultType="com.ruoyi.stock.dto.StockUninventoryDto"> select su.*, pm.model, pm.unit, p.product_name select su.id, su.qualitity, COALESCE(su.locked_quantity, 0) as locked_quantity, su.product_model_id, su.create_time, su.update_time, su.version, su.update_time, (su.qualitity - COALESCE(su.locked_quantity, 0)) as un_locked_quantity, pm.model, pm.unit, p.product_name from stock_uninventory su left join product_model pm on su.product_model_id = pm.id left join product p on pm.product_id = p.id left join product_model pm on su.product_model_id = pm.id left join product p on pm.product_id = p.id where 1 = 1 <if test="ew.productName != null and ew.productName !=''"> and p.product_name like concat('%',#{ew.productName},'%')