src/main/java/com/ruoyi/account/pojo/AccountExpense.java
@@ -35,7 +35,7 @@ private Long businessId; /** * 业务类型 1-付款 2-还款 * 业务类型 1-付款 2-还款 3-销售退款 */ private Integer businessType; src/main/java/com/ruoyi/procurementrecord/controller/ReturnManagementController.java
@@ -68,11 +68,8 @@ @Transactional(rollbackFor = Exception.class) public AjaxResult del(@RequestBody List<Long> ids) { if (CollectionUtils.isEmpty(ids)) return error("请选择至少一条数据"); returnSaleProductService.remove(new QueryWrapper<ReturnSaleProduct>() .lambda() .in(ReturnSaleProduct::getReturnManagementId, ids)); boolean result = returnManagementService.removeByIds(ids); return result ? success() : error(); int result = returnManagementService.delete(ids); return result > 0 ? success() : error(); } @GetMapping("/getById") src/main/java/com/ruoyi/procurementrecord/service/ReturnManagementService.java
@@ -8,6 +8,7 @@ import com.ruoyi.sales.dto.SalesLedgerDto; import java.math.BigDecimal; import java.util.List; /** * @author :yys @@ -33,4 +34,6 @@ boolean handle(Long returnManagementId); ReturnManagementDto getReturnManagementDtoById(Long returnManagementId); int delete(List<Long> ids); } src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnManagementServiceImpl.java
@@ -1,6 +1,7 @@ package com.ruoyi.procurementrecord.service.impl; 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 com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -13,6 +14,7 @@ import com.ruoyi.procurementrecord.dto.ReturnManagementDto; import com.ruoyi.procurementrecord.dto.ReturnSaleProductDto; import com.ruoyi.procurementrecord.mapper.ReturnManagementMapper; import com.ruoyi.procurementrecord.mapper.ReturnSaleProductMapper; import com.ruoyi.procurementrecord.pojo.ReturnManagement; import com.ruoyi.procurementrecord.pojo.ReturnSaleProduct; import com.ruoyi.procurementrecord.service.ReturnManagementService; @@ -36,6 +38,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.stream.Collectors; /** * @author :yys @@ -51,6 +54,8 @@ @Autowired private ReturnSaleProductService returnSaleProductService; @Autowired private ReturnSaleProductMapper returnSaleProductMapper; @Autowired private ShippingInfoDetailService shippingInfoDetailService; @Autowired private ShippingInfoService shippingInfoService; @@ -64,6 +69,20 @@ @Autowired private AccountExpenseMapper accountExpenseMapper; // 通过发货订单详情ID查询退货数量 public BigDecimal getReturnSaleProductCountByShippingId(List<Long> shippingInfoDetailId) { List<ReturnManagement> returnManagements = returnManagementMapper.selectList(new LambdaQueryWrapper<ReturnManagement>() .in(ReturnManagement::getShippingId, shippingInfoDetailId) .eq(ReturnManagement::getStatus, 1)); if(org.apache.commons.collections4.CollectionUtils.isNotEmpty(returnManagements)){ List<ReturnSaleProduct> returnSaleProducts = returnSaleProductMapper.selectList(new LambdaQueryWrapper<ReturnSaleProduct>() .in(ReturnSaleProduct::getReturnManagementId, returnManagements.stream().map(ReturnManagement::getId).collect(Collectors.toList())) .eq(ReturnSaleProduct::getStatus, 1)); return returnSaleProducts.stream().map(ReturnSaleProduct::getNum).reduce(BigDecimal.ZERO, BigDecimal::add); } return BigDecimal.ZERO; } @Override public IPage<ReturnManagementDto> listPage(Page page, ReturnManagementDto returnManagement) { @@ -116,15 +135,9 @@ List<ReturnSaleProductDto> list = returnSaleProductService.listReturnSaleProduct(returnManagementId); byId.setStatus(1); updateById(byId); // SalesRefundAmountOrderDto salesRefundAmountOrder = new SalesRefundAmountOrderDto(); // salesRefundAmountOrder.setReturnManagementId(returnManagementId); // salesRefundAmountOrder.setStatus(0); // salesRefundAmountOrder.setCreateTime(byId.getCreateTime()); // salesRefundAmountOrder.setCreateUserId(SecurityUtils.getUserId()); BigDecimal bigDecimal = new BigDecimal(0); for (ReturnSaleProductDto returnSaleProduct : list) { bigDecimal = bigDecimal.add(returnSaleProduct.getPrice()); // salesRefundAmountOrder.setRefundedAmount(new BigDecimal(0)); // 是否有质量问题 if (returnSaleProduct.getIsQuality() == 1) { // 有质量问题,入不合格库 @@ -136,10 +149,17 @@ returnSaleProduct.setStatus(1); returnSaleProductService.updateById(returnSaleProduct); } // salesRefundAmountOrder.setRefundAmount(bigDecimal); // salesRefundAmountOrder.setNotRefundedAmount(salesRefundAmountOrder.getRefundedAmount()); // 分批退款 // salesRefundAmountOrderService.addSalesRefundAmountOrderDto(salesRefundAmountOrder); // 修改发货详情为退货 SalesLedgerDto returnManagementDtoByShippingIdId = getReturnManagementDtoByShippingIdId(byId.getShippingId()); for (SalesLedgerProductDto salesLedgerProductDto : returnManagementDtoByShippingIdId.getProductDtoData()) { if(salesLedgerProductDto.getUnQuantity().compareTo(BigDecimal.ZERO) == 0){ ShippingInfoDetail shippingInfoDetail = shippingInfoDetailService.getById(byId.getShippingId()); if(shippingInfoDetail != null){ shippingInfoDetail.setStatus("已退货"); shippingInfoDetailService.updateById(shippingInfoDetail); } } } // 和财务联动,新增支出 AccountExpense accountExpense = new AccountExpense(); accountExpense.setBusinessType(3); @@ -163,5 +183,32 @@ return returnManagementDtoById; } @Override public int delete(List<Long> ids) { List<ReturnSaleProduct> returnSaleProducts = returnSaleProductMapper.selectList(new QueryWrapper<ReturnSaleProduct>() .lambda() .in(ReturnSaleProduct::getReturnManagementId, ids)); if(com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isNotEmpty(returnSaleProducts)){ List<Long> collect = returnSaleProducts .stream() .map(ReturnSaleProduct::getId) .collect(Collectors.toList()); returnSaleProductMapper.deleteBatchIds(collect); // 删除入库记录 for (ReturnSaleProduct returnSaleProduct : returnSaleProducts) { if(returnSaleProduct.getIsQuality() == 1){ stockUtils.deleteStockInRecord(returnSaleProduct.getId(), StockInUnQualifiedRecordTypeEnum.RETURN_UNSTOCK_IN.getCode()); }else{ stockUtils.deleteStockInRecord(returnSaleProduct.getId(), StockInQualifiedRecordTypeEnum.RETURN_HE_IN.getCode()); } } } accountExpenseMapper.delete(new QueryWrapper<AccountExpense>() .lambda() .in(AccountExpense::getBusinessId, ids) .eq(AccountExpense::getBusinessType, 3)); return returnManagementMapper.deleteBatchIds(ids); } } src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
@@ -1,6 +1,7 @@ package com.ruoyi.procurementrecord.utils; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper; import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper; @@ -21,7 +22,9 @@ import java.math.BigDecimal; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Component @RequiredArgsConstructor @@ -99,19 +102,19 @@ //不合格库存删除 public void deleteStockInRecord(Long recordId, String recordType) { StockInRecord one = stockInRecordService.getOne(new QueryWrapper<StockInRecord>() List<StockInRecord> one = stockInRecordService.getBaseMapper().selectList(new QueryWrapper<StockInRecord>() .lambda().eq(StockInRecord::getRecordId, recordId) .eq(StockInRecord::getRecordType, recordType)); if (ObjectUtils.isNotEmpty(one)) { stockInRecordService.batchDelete(Collections.singletonList(one.getId())); if (CollectionUtils.isNotEmpty(one)) { stockInRecordService.batchDelete(one.stream().map(StockInRecord::getId).collect(Collectors.toList())); } } public void deleteStockOutRecord(Long recordId, String recordType) { StockOutRecord one = stockOutRecordService.getOne(new QueryWrapper<StockOutRecord>() List<StockOutRecord> one = stockOutRecordService.getBaseMapper().selectList(new QueryWrapper<StockOutRecord>() .lambda().eq(StockOutRecord::getRecordId, recordId) .eq(StockOutRecord::getRecordType, recordType)); if (ObjectUtils.isNotEmpty(one)) { stockOutRecordService.batchDelete(Collections.singletonList(one.getId())); if (CollectionUtils.isNotEmpty(one)) { stockOutRecordService.batchDelete(one.stream().map(StockOutRecord::getId).collect(Collectors.toList())); } } } src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java
@@ -17,7 +17,7 @@ import java.util.Arrays; import java.util.List; @RequestMapping("productionProductMain") @RequestMapping("/productionProductMain") @RestController @Api(value = "生产报工") public class ProductionProductMainController { src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -76,6 +76,7 @@ // 获取产品合格库存 StockInventoryDto stockInventoryDto = new StockInventoryDto(); stockInventoryDto.setProductModelId(productOrderDto.getProductModelId()); stockInventoryDto.setProductType(1); Page page1 = new Page<>(1,1); IPage<StockInventoryDto> stockInventoryDtoIPage = stockInventoryService.pagestockInventory(page1,stockInventoryDto); if(stockInventoryDtoIPage.getTotal() > 0){ src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
@@ -66,6 +66,12 @@ return AjaxResult.success(shippingInfoService.getShippingInfoByCustomerName(customerName)); } @ApiOperation("详情") @GetMapping("/getById") public AjaxResult getById(Long id) { return AjaxResult.success(shippingInfoService.getDateil(id)); } @GetMapping("/listPage") @ApiOperation("发货信息列表") @@ -95,14 +101,6 @@ req.setStatus("待审核"); boolean save = shippingInfoService.save(req); return save ? AjaxResult.success() : AjaxResult.error(); } @ApiOperation("发货扣库存") @PostMapping("/deductStock") @Transactional(rollbackFor = Exception.class) @Log(title = "发货信息管理", businessType = BusinessType.UPDATE) public AjaxResult deductStock(@RequestBody ShippingInfoDto req) throws IOException { return shippingInfoService.deductStock( req) ? AjaxResult.success() : AjaxResult.error(); } @PostMapping("/update") src/main/java/com/ruoyi/sales/dto/ShippingInfoDto.java
@@ -40,4 +40,9 @@ */ private BigDecimal waitShippingTotal = BigDecimal.ZERO; /** * 退货数量 */ private BigDecimal returnTotal = BigDecimal.ZERO; } src/main/java/com/ruoyi/sales/mapper/ShippingInfoMapper.java
@@ -22,4 +22,6 @@ List<ShippingInfo> getShippingInfoByCustomerName(String customerName); List<SalesLedgerProductDto> getReturnManagementDtoById(@Param("shippingId")Long shippingId); ShippingInfoDto getDateil(@Param("id") Long id); } src/main/java/com/ruoyi/sales/pojo/ShippingInfoDetail.java
@@ -33,6 +33,12 @@ private static final long serialVersionUID = 1L; /** * 退货数量 */ @TableField(exist = false) private BigDecimal returnTotal = BigDecimal.ZERO; @TableField(exist = false) private List<String> tempFileIds; @TableField(exist = false) @@ -90,7 +96,7 @@ @ApiModelProperty("发货类型") private String type; @ApiModelProperty("状态") @ApiModelProperty("状态 已退货") private String status; @ApiModelProperty("发货数量") src/main/java/com/ruoyi/sales/service/ShippingInfoService.java
@@ -28,4 +28,6 @@ List<SalesLedgerProductDto> getReturnManagementDtoById(Long id); Map<String ,BigDecimal> getNumberOfSalesLedgerProduct(Long id); ShippingInfoDto getDateil(Long id); } src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -23,6 +23,9 @@ import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.other.mapper.TempFileMapper; import com.ruoyi.other.pojo.TempFile; import com.ruoyi.procurementrecord.mapper.ReturnManagementMapper; import com.ruoyi.procurementrecord.pojo.ReturnManagement; import com.ruoyi.procurementrecord.service.ReturnManagementService; import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.*; import com.ruoyi.production.service.ProductionProductMainService; @@ -98,6 +101,10 @@ private final CommonFileServiceImpl commonFileService; private final ShippingInfoMapper shippingInfoMapper; private final ReturnManagementMapper returnManagementMapper; private final ReturnManagementService returnManagementService; private final InvoiceLedgerMapper invoiceLedgerMapper; @@ -558,8 +565,17 @@ List<ShippingInfo> shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>() .in(ShippingInfo::getSalesLedgerId, idList)); if (CollectionUtils.isNotEmpty(shippingInfos)) { shippingInfoServiceImpl.delete(shippingInfos.stream().map(ShippingInfo::getId).collect(Collectors.toList())); List<Long> shippingIds = shippingInfos.stream().map(ShippingInfo::getId).collect(Collectors.toList()); shippingInfoServiceImpl.delete(shippingIds); // 删除退货台账记录 List<ReturnManagement> returnManagements = returnManagementMapper.selectList(new LambdaQueryWrapper<ReturnManagement>() .in(ReturnManagement::getShippingId, shippingIds)); if (CollectionUtils.isNotEmpty(returnManagements)) { List<Long> returnIds = returnManagements.stream().map(ReturnManagement::getId).collect(Collectors.toList()); returnManagementService.delete(returnIds); } } // 删除附件表 commonFileService.deleteByBusinessIds(idList, FileNameType.SALE.getValue()); src/main/java/com/ruoyi/sales/service/impl/ShippingInfoDetailServiceImpl.java
@@ -6,6 +6,7 @@ import com.ruoyi.common.enums.FileNameType; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.other.service.impl.TempFileServiceImpl; import com.ruoyi.procurementrecord.service.impl.ReturnManagementServiceImpl; import com.ruoyi.sales.dto.ShippingInfoDto; import com.ruoyi.sales.pojo.ShippingInfo; import com.ruoyi.sales.pojo.ShippingInfoDetail; @@ -48,11 +49,16 @@ @Autowired private CommonFileServiceImpl commonFileService; @Autowired private ReturnManagementServiceImpl returnManagementService; @Override public IPage<ShippingInfoDetail> listPage(Page page, ShippingInfoDetail shippingInfoDetail) { IPage<ShippingInfoDetail> shippingInfoDetailIPage = shippingInfoDetailMapper.listPage(page, shippingInfoDetail); shippingInfoDetailIPage.getRecords().forEach(item ->{ item.setCommonFileList(commonFileService.getFileListByBusinessId(item.getId(), FileNameType.SHIP.getValue())); BigDecimal returnSaleProductCountByShippingId = returnManagementService.getReturnSaleProductCountByShippingId(Collections.singletonList(item.getId())); item.setReturnTotal(returnSaleProductCountByShippingId); }); return shippingInfoDetailIPage; } @@ -76,6 +82,8 @@ }else{ shippingInfo.setStatus("发货中"); } // 扣库存 shippingInfo.setShippingTotal(shippingInfoDetail.getShippingNum()); shippingInfoService.deductStock(shippingInfo); // 迁移文件 if(CollectionUtils.isNotEmpty(shippingInfoDetail.getTempFileIds())){ src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
@@ -13,6 +13,7 @@ import com.ruoyi.procurementrecord.mapper.ReturnSaleProductMapper; import com.ruoyi.procurementrecord.pojo.ReturnManagement; import com.ruoyi.procurementrecord.pojo.ReturnSaleProduct; import com.ruoyi.procurementrecord.service.impl.ReturnManagementServiceImpl; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.sales.dto.SalesLedgerProductDto; import com.ruoyi.sales.dto.ShippingInfoDto; @@ -67,6 +68,9 @@ @Autowired private ReturnSaleProductMapper returnSaleProductMapper; @Autowired private ReturnManagementServiceImpl returnManagementService; @Override public List<SalesLedgerProductDto> getReturnManagementDtoById(Long shippingId) { return shippingInfoMapper.getReturnManagementDtoById(shippingId ); @@ -75,8 +79,6 @@ /** * 获取销售产品单的已发货数量 * @param id * @return */ @Override public Map<String, BigDecimal> getNumberOfSalesLedgerProduct(Long salesLedgerProductId) { @@ -109,6 +111,15 @@ } @Override public ShippingInfoDto getDateil(Long id) { ShippingInfoDto shippingInfoDto = shippingInfoMapper.getDateil(id); if(shippingInfoDto != null){ assembleDetails(shippingInfoDto); } return shippingInfoDto; } @Override public List<ShippingInfo> getShippingInfoByCustomerName(String customerName) { return shippingInfoMapper.getShippingInfoByCustomerName(customerName); } @@ -116,22 +127,35 @@ @Override public IPage<ShippingInfoDto> listPage(Page page, ShippingInfo req) { IPage<ShippingInfoDto> listPage = shippingInfoMapper.listPage(page, req); listPage.getRecords().forEach(item ->{ item.setCommonFileList(commonFileService.getFileListByBusinessId(item.getId(), FileNameType.SHIP.getValue())); List<ShippingInfoDetail> shippingInfoDetails = shippingInfoDetailMapper.selectList(new LambdaQueryWrapper<ShippingInfoDetail>() .eq(ShippingInfoDetail::getShippingInfoId, item.getId())); // 核心优化:层层防护空指针 + 处理空集合场景 item.setShippingSuccessTotal(Optional.ofNullable(shippingInfoDetails) .orElse(Collections.emptyList()) .stream() .filter(Objects::nonNull) .map(ShippingInfoDetail::getShippingNum) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add)); // 用Lambda替代方法引用 item.setWaitShippingTotal(item.getShippingTotal().subtract(item.getShippingSuccessTotal())); }); listPage.getRecords().forEach(this::assembleDetails); return listPage; } /** * 封装详情 * @param item */ public void assembleDetails(ShippingInfoDto item) { item.setCommonFileList(commonFileService.getFileListByBusinessId(item.getId(), FileNameType.SHIP.getValue())); List<ShippingInfoDetail> shippingInfoDetails = shippingInfoDetailMapper.selectList(new LambdaQueryWrapper<ShippingInfoDetail>() .eq(ShippingInfoDetail::getShippingInfoId, item.getId())); // 核心优化:层层防护空指针 + 处理空集合场景 item.setShippingSuccessTotal(Optional.ofNullable(shippingInfoDetails) .orElse(Collections.emptyList()) .stream() .filter(Objects::nonNull) .map(ShippingInfoDetail::getShippingNum) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add)); // 用Lambda替代方法引用 item.setWaitShippingTotal(item.getShippingTotal().subtract(item.getShippingSuccessTotal())); // 查询退货数量 if(CollectionUtils.isNotEmpty(shippingInfoDetails)){ item.setReturnTotal(returnManagementService.getReturnSaleProductCountByShippingId(shippingInfoDetails .stream() .map(ShippingInfoDetail::getId) .collect(Collectors.toList()))); } } @Override @@ -142,7 +166,7 @@ } //扣减库存 SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(byId.getSalesLedgerProductId()); stockUtils.substractStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId()); stockUtils.substractStock(salesLedgerProduct.getProductModelId(), req.getShippingTotal(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId()); byId.setExpressNumber(req.getExpressNumber()); byId.setExpressCompany(req.getExpressCompany()); byId.setStatus(req.getStatus()); src/main/resources/mapper/procurementrecord/ReturnSaleProductMapper.xml
@@ -19,7 +19,7 @@ COALESCE(rs.total_return_num, 0) AS total_return_num FROM return_sale_product rsp LEFT JOIN return_management rm ON rm.id = rsp.return_management_id LEFT JOIN shipping_info si ON si.id = rm.shipping_id LEFT JOIN shipping_info_detail si ON si.id = rm.shipping_id LEFT JOIN sales_ledger_product slp ON si.sales_ledger_product_id = slp.id and slp.type = 1 LEFT JOIN (SELECT return_sale_ledger_product_id, src/main/resources/mapper/sales/ShippingInfoMapper.xml
@@ -32,6 +32,9 @@ <if test="req.shippingCarNumber != null and req.shippingCarNumber != ''"> AND s.shipping_car_number LIKE CONCAT('%',#{req.shippingCarNumber},'%') </if> <if test="req.customerName != null and req.customerName != ''"> AND sl.customer_name LIKE CONCAT('%',#{req.customerName},'%') </if> <if test="req.shippingNo != null and req.shippingNo != ''"> AND s.shipping_no LIKE CONCAT('%',#{req.shippingNo},'%') </if> @@ -60,7 +63,7 @@ select *,sid.id as id from shipping_info_detail sid left join shipping_info si on si.id = sid.shipping_info_id left join sales_ledger sl on si.sales_ledger_id = sl.id where (si.status = '已发货' or si.status = '发货中') and sl.customer_name = #{customerName} where (si.status = '已发货' or si.status = '发货中') and (sid.status is null or sid.status != '已退货') and sl.customer_name = #{customerName} </select> <select id="getReturnManagementDtoById" resultType="com.ruoyi.sales.dto.SalesLedgerProductDto"> SELECT @@ -77,8 +80,12 @@ FROM return_sale_product rsp left join return_management rm on rm.id = rsp.return_management_id left join shipping_info_detail si on si.id = rm.shipping_id WHERE 1=1 GROUP BY return_sale_ledger_product_id <where> <if test="shippingId != null"> si.id = #{shippingId} </if> </where> GROUP BY si.id ) rs ON rs.return_sale_ledger_product_id = slp.id <where> <if test="shippingId != null"> @@ -86,4 +93,29 @@ </if> </where> </select> <select id="getDateil" resultType="com.ruoyi.sales.dto.ShippingInfoDto" parameterType="java.lang.Long"> SELECT s.id, s.sales_ledger_id, s.shipping_date, s.shipping_car_number, s.express_number, s.express_company, s.shipping_no, s.type, s.status, s.create_time, s.update_time, s.create_user, s.update_user, s.tenant_id, sl.sales_contract_no, sl.customer_name, s.shipping_total AS shipping_total, slp.id as salesLedgerProductId FROM shipping_info s LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id LEFT JOIN sales_ledger_product slp ON s.sales_ledger_product_id = slp.id and slp.type = 1 WHERE s.id = #{id} </select> </mapper> src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -72,7 +72,7 @@ <if test="ew.productName != null and ew.productName !=''"> and p.product_name like concat('%',#{ew.productName},'%') </if> <if test="ew.productModelId != null and ew.productModelId !=''"> <if test="ew.productModelId != null"> and pm.id = #{ew.productModelId} </if> </select>