| src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/sales/dto/SalesLedgerProcessRouteDto.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/sales/dto/SalesProcessCardDto.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/sales/pojo/SalesLedgerProcessRoute.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/resources/mapper/sales/SalesLedgerMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -13,6 +13,8 @@ import com.ruoyi.framework.web.page.TableDataInfo; import com.ruoyi.sales.dto.InvoiceLedgerDto; import com.ruoyi.sales.dto.SalesLedgerDto; import com.ruoyi.sales.dto.SalesLedgerProcessRouteDto; import com.ruoyi.sales.dto.SalesProcessCardDto; import com.ruoyi.sales.mapper.InvoiceLedgerMapper; import com.ruoyi.sales.mapper.ReceiptPaymentMapper; import com.ruoyi.sales.pojo.ReceiptPayment; @@ -360,4 +362,19 @@ public R getSalesLedgerWithProductsLoss(Long salesLedgerId) { return R.ok(salesLedgerService.getSalesLedgerWithProductsLoss(salesLedgerId)); } @ApiOperation("è·åéå®è®¢åç»å®çå·¥èºè·¯çº¿") @GetMapping("/salesProcess/{salesLedgerId}") public AjaxResult salesProcess(@PathVariable Long salesLedgerId) { SalesLedgerProcessRouteDto dto = salesLedgerService.salesProcess(salesLedgerId); return AjaxResult.success(dto); } @GetMapping("/processCard/{salesLedgerId}") @ApiOperation("æå°ç产æµç¨å¡") public AjaxResult processCard(@PathVariable Long salesLedgerId) { SalesProcessCardDto dto = salesLedgerService.processCard(salesLedgerId); return AjaxResult.success(dto); } } src/main/java/com/ruoyi/sales/dto/SalesLedgerProcessRouteDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,32 @@ package com.ruoyi.sales.dto; import com.ruoyi.sales.pojo.SalesLedgerProcessRoute; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.List; /** * <br> * éå®è®¢åç»å®çå·¥èºè·¯çº¿Dto * </br> * * @author deslrey * @version 1.0 * @since 2026/03/27 9:54 */ @Data @EqualsAndHashCode(callSuper = false) public class SalesLedgerProcessRouteDto extends SalesLedgerProcessRoute { @ApiModelProperty("å·¥èºè·¯çº¿ID") private Long routeId; @ApiModelProperty(value = "路线åç§°") private String routeName; @ApiModelProperty("éå®è®¢åç»å®çå·¥èºè·¯çº¿") List<SalesLedgerProcessRoute> list; } src/main/java/com/ruoyi/sales/dto/SalesProcessCardDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,106 @@ package com.ruoyi.sales.dto; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; /** * éå®è®¢åæµç¨å¡ DTO * æ´åäºå°è´¦ä¿¡æ¯ã产åå表以åç»å®çå·¥èºè·¯çº¿ * * @author deslrey * @version 1.0 * @since 2026/03/26 */ @Data public class SalesProcessCardDto { @ApiModelProperty("订åç¼å·") private String salesContractNo; @ApiModelProperty("客æ·åç§°") private String customerName; @ApiModelProperty("äº¤è´§æ¥æ") @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate deliveryDate; @ApiModelProperty("å·¥èºè·¯çº¿æ»è§") private String processPathDisplay; @ApiModelProperty("订åå å·¥è¦æ±") private String orderProcessRequirement; @ApiModelProperty("该ç»å®çå·¥èºè·¯çº¿èç¹") private List<ProcessNodeDto> routeNodes; @ApiModelProperty("æµç¨å¡è¡æç»") private List<ProcessCardItemDto> items; // åºé¨ä¿¡æ¯ @ApiModelProperty("æ»å计æ°é") private BigDecimal totalQuantity; @ApiModelProperty("æ»å计é¢ç§¯") private BigDecimal totalArea; @ApiModelProperty("å¶åå") private String register; @ApiModelProperty("å¶åæ¥æ") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime registerDate; /** * å é¨ç±»ï¼å¯¹åºäº§åè¡¨æ ¼è¡ */ @Data public static class ProcessCardItemDto { @ApiModelProperty("楼å±ç¼å·") private String floorCode; @ApiModelProperty("产åæè¿°") private String productDescription; @ApiModelProperty("宽(å¼§é¿)") private BigDecimal width; @ApiModelProperty("é«") private BigDecimal height; @ApiModelProperty("æ°é") private BigDecimal quantity; @ApiModelProperty("é¢ç§¯(ã¡)") private BigDecimal area; @ApiModelProperty("æç»å å·¥è¦æ±") private String processRequirement; @ApiModelProperty("é¢å¤å å·¥æç»") private List<String> extraProcesses; } /** * å é¨ç±»ï¼å¯¹åº SalesLedgerProcessRoute çèç¹ä¿¡æ¯ */ @Data public static class ProcessNodeDto { @ApiModelProperty("å·¥èºèç¹ID") private Long processRouteItemId; @ApiModelProperty("å·¥èºèç¹åç§°") private String processRouteItemName; @ApiModelProperty("æåºå·") private Integer dragSort; @ApiModelProperty("夿³¨") private String remark; } } src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java
@@ -10,6 +10,7 @@ import com.ruoyi.sales.dto.SalesTrendDto; import com.ruoyi.sales.dto.StatisticsTableDto; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.pojo.SalesLedgerProcessRoute; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; @@ -85,4 +86,7 @@ List<SalesTrendDto> statisticsTable(@Param("statisticsTableDto")StatisticsTableDto statisticsTableDto); IPage<SalesLedgerDto> listSalesLedgerAndShipped(Page page, @Param("ew") SalesLedgerDto salesLedgerDto); List<SalesLedgerProcessRoute> selectSalesProcess(Long salesLedgerId); } src/main/java/com/ruoyi/sales/pojo/SalesLedgerProcessRoute.java
@@ -55,5 +55,8 @@ @TableField(fill = FieldFill.INSERT) private Long tenantId; @TableField(exist = false) @ApiModelProperty(value = "å·¥åºåç§°") private String processName; } src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
@@ -6,9 +6,7 @@ import com.ruoyi.aftersalesservice.pojo.AfterSalesService; import com.ruoyi.common.enums.SaleEnum; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.sales.dto.LossProductModelDto; import com.ruoyi.sales.dto.MonthlyAmountDto; import com.ruoyi.sales.dto.SalesLedgerDto; import com.ruoyi.sales.dto.*; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.pojo.SalesLedgerProcessRoute; import com.ruoyi.sales.pojo.SalesLedgerProduct; @@ -57,4 +55,8 @@ IPage<SalesLedgerDto> listSalesLedger(SalesLedgerDto salesLedgerDto, Page page); void saleProcessBind(SalesLedgerProcessRoute salesLedgerProcessRoute); SalesProcessCardDto processCard(Long salesLedgerId); SalesLedgerProcessRouteDto salesProcess(Long salesLedgerId); } src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -30,7 +30,7 @@ import com.ruoyi.production.pojo.ProcessRoute; import com.ruoyi.production.pojo.ProcessRouteItem; import com.ruoyi.production.service.ProductionProductMainService; import com.ruoyi.project.system.domain.SysDept; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysDeptMapper; import com.ruoyi.project.system.mapper.SysUserMapper; @@ -543,7 +543,7 @@ throw new ServiceException("ç»å®å¤±è´¥,å·¥èºè·¯çº¿ä¸åå¨"); } // æ¸ é¤å·²ç»å®çæ°æ® salesLedgerProcessRouteService.remove(new LambdaQueryWrapper<SalesLedgerProcessRoute>().eq(SalesLedgerProcessRoute::getSalesLedgerId, salesLedger.getId()).eq(SalesLedgerProcessRoute::getProcessRouteId, processRoute.getId())); salesLedgerProcessRouteService.remove(new LambdaQueryWrapper<SalesLedgerProcessRoute>().eq(SalesLedgerProcessRoute::getSalesLedgerId, salesLedger.getId())); // å°æ°æ®è¿ç§»å°sales_ledger_process_route List<ProcessRouteItem> routeItems = processRouteItemMapper.selectList(new LambdaQueryWrapper<ProcessRouteItem>().eq(ProcessRouteItem::getRouteId, processRoute.getId())); @@ -554,6 +554,7 @@ ledgerProcessRoute.setProcessRouteId(processRoute.getId()); ledgerProcessRoute.setSalesLedgerId(salesLedger.getId()); ledgerProcessRoute.setProcessRouteItemId(routeItem.getId()); ledgerProcessRoute.setDragSort(routeItem.getDragSort()); salesLedgerProcessRouteList.add(ledgerProcessRoute); } salesLedgerProcessRouteService.saveBatch(salesLedgerProcessRouteList); @@ -844,19 +845,20 @@ } } if (!redisTemplate.hasKey(lockKey)) { if (Boolean.FALSE.equals(redisTemplate.hasKey(lockKey))) { throw new RuntimeException("è·åååç¼å·çæé失败ï¼è¶ æ¶"); } // 2. æ¥è¯¢å½å¤©/å ¬å¸å·²åå¨çåºåå·ï¼ä¸åé»è¾ä¸è´ï¼ Long tenantId = SecurityUtils.getLoginUser().getTenantId(); if (null != tenantId) { //è·åå ¬å¸ç¼å· SysDept sysDept = sysDeptMapper.selectDeptById(tenantId.longValue()); if (!ObjectUtils.isEmpty(sysDept)) { datePart = (StringUtils.isEmpty(sysDept.getDeptNick()) ? "" : sysDept.getDeptNick()) + datePart; } } // Long tenantId = SecurityUtils.getLoginUser().getTenantId(); // if (null != tenantId) { // //è·åå ¬å¸ç¼å· // SysDept sysDept = sysDeptMapper.selectDeptById(tenantId); // if (!ObjectUtils.isEmpty(sysDept)) { // datePart = (StringUtils.isEmpty(sysDept.getDeptNick()) ? "" : sysDept.getDeptNick()) + datePart; // } // } datePart = "D" + datePart; List<Integer> existingSequences = salesLedgerMapper.selectSequencesByDate(datePart); int nextSequence = findFirstMissingSequence(existingSequences); @@ -872,6 +874,163 @@ } } @Override public SalesLedgerProcessRouteDto salesProcess(Long salesLedgerId) { SalesLedgerProcessRouteDto dto = new SalesLedgerProcessRouteDto(); List<SalesLedgerProcessRoute> list = baseMapper.selectSalesProcess(salesLedgerId); if (CollectionUtils.isNotEmpty(list)) { Long processRouteId = list.get(0).getProcessRouteId(); ProcessRoute processRoute = processRouteMapper.selectById(processRouteId); if (processRoute != null) { dto.setRouteId(processRoute.getId()); dto.setRouteName(processRoute.getProcessRouteName()); } } else { // è¦æ¯listæ¥è¯¢ä¸ºç©ºçè¯ï¼å°±æ¥è¯¢é»è®¤çå·¥èºè·¯çº¿è¿å ProcessRoute defaultRoute = processRouteMapper.selectOne(new LambdaQueryWrapper<ProcessRoute>().eq(ProcessRoute::getIsDefault, 1).last("limit 1")); if (defaultRoute != null) { dto.setRouteId(defaultRoute.getId()); dto.setRouteName(defaultRoute.getProcessRouteName()); List<ProcessRouteItem> routeItems = processRouteItemMapper.selectList(new LambdaQueryWrapper<ProcessRouteItem>().eq(ProcessRouteItem::getRouteId, defaultRoute.getId()).orderByAsc(ProcessRouteItem::getDragSort)); list = routeItems.stream().map(item -> { SalesLedgerProcessRoute salesLedgerProcessRoute = new SalesLedgerProcessRoute(); salesLedgerProcessRoute.setProcessRouteId(defaultRoute.getId()); salesLedgerProcessRoute.setSalesLedgerId(salesLedgerId); salesLedgerProcessRoute.setProcessRouteItemId(item.getId()); salesLedgerProcessRoute.setProcessName(item.getProcessName()); salesLedgerProcessRoute.setDragSort(item.getDragSort()); return salesLedgerProcessRoute; }).collect(Collectors.toList()); } } dto.setList(list); return dto; } @Override public SalesProcessCardDto processCard(Long salesLedgerId) { if (salesLedgerId == null) { throw new ServiceException("æµç¨å¡æå°å¤±è´¥,æå°éå®è®¢åä¸è½ä¸ºç©º"); } // æ¥è¯¢éå®è®¢å SalesLedger salesLedger = baseMapper.selectById(salesLedgerId); if (salesLedger == null) { throw new ServiceException("æµç¨å¡æå°å¤±è´¥,éå®è®¢åä¸åå¨"); } SalesProcessCardDto dto = new SalesProcessCardDto(); dto.setSalesContractNo(salesLedger.getSalesContractNo()); dto.setCustomerName(salesLedger.getCustomerName()); dto.setDeliveryDate(salesLedger.getDeliveryDate()); dto.setRegister(SecurityUtils.getLoginUser().getUser().getNickName()); dto.setRegisterDate(LocalDateTime.now()); dto.setOrderProcessRequirement(salesLedger.getRemarks()); // æ¥è¯¢äº§åå表 List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList( new LambdaQueryWrapper<SalesLedgerProduct>().eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerId)); BigDecimal totalQuantity = BigDecimal.ZERO; BigDecimal totalArea = BigDecimal.ZERO; List<SalesProcessCardDto.ProcessCardItemDto> itemDtos = new ArrayList<>(); for (SalesLedgerProduct p : products) { SalesProcessCardDto.ProcessCardItemDto itemDto = new SalesProcessCardDto.ProcessCardItemDto(); itemDto.setFloorCode(p.getFloorCode()); // ç»è£ 产åæè¿°ï¼å¤§ç±» + (è§æ ¼) String desc = (p.getProductCategory() != null ? p.getProductCategory() : "") + (StringUtils.isNotBlank(p.getSpecificationModel()) ? " " + p.getSpecificationModel() : ""); itemDto.setProductDescription(desc.trim()); itemDto.setWidth(p.getWidth()); itemDto.setHeight(p.getHeight()); itemDto.setQuantity(p.getQuantity()); // é¢ç§¯è®¡ç®(平米) BigDecimal area = p.getActualPieceArea() != null ? p.getActualPieceArea() : p.getSettlePieceArea(); if (area == null && p.getWidth() != null && p.getHeight() != null) { area = p.getWidth().multiply(p.getHeight()).divide(new BigDecimal(1000000), 2, RoundingMode.HALF_UP); } itemDto.setArea(area); itemDto.setProcessRequirement(p.getProcessRequirement()); BigDecimal qty = p.getQuantity() != null ? p.getQuantity() : BigDecimal.ZERO; totalQuantity = totalQuantity.add(qty); if (area != null) { totalArea = totalArea.add(area.multiply(qty)); } itemDtos.add(itemDto); } dto.setItems(itemDtos); dto.setTotalQuantity(totalQuantity); dto.setTotalArea(totalArea.setScale(2, RoundingMode.HALF_UP)); // å·¥èºè·¯çº¿ List<SalesLedgerProcessRoute> salesLedgerProcessRoutes = salesLedgerProcessRouteService.list( new LambdaQueryWrapper<SalesLedgerProcessRoute>() .eq(SalesLedgerProcessRoute::getSalesLedgerId, salesLedgerId) .orderByAsc(SalesLedgerProcessRoute::getDragSort)); List<SalesProcessCardDto.ProcessNodeDto> nodeDtos = new ArrayList<>(); if (CollectionUtils.isEmpty(salesLedgerProcessRoutes)) { // æ èªå®ä¹è·¯çº¿ï¼åé»è®¤è·¯çº¿ ProcessRoute defaultRoute = processRouteMapper.selectOne( new LambdaQueryWrapper<ProcessRoute>().eq(ProcessRoute::getIsDefault, 1).last("LIMIT 1")); if (defaultRoute != null) { List<ProcessRouteItem> routeItems = processRouteItemMapper.selectList( new LambdaQueryWrapper<ProcessRouteItem>() .eq(ProcessRouteItem::getRouteId, defaultRoute.getId()) .orderByAsc(ProcessRouteItem::getDragSort)); for (ProcessRouteItem i : routeItems) { SalesProcessCardDto.ProcessNodeDto node = new SalesProcessCardDto.ProcessNodeDto(); node.setProcessRouteItemId(i.getId()); node.setProcessRouteItemName(i.getProcessName()); node.setDragSort(i.getDragSort()); nodeDtos.add(node); } } } else { // 使ç¨èªå®ä¹è·¯çº¿ç»å®çèç¹ List<Long> itemIds = salesLedgerProcessRoutes.stream() .map(SalesLedgerProcessRoute::getProcessRouteItemId) .collect(Collectors.toList()); List<ProcessRouteItem> rawItems = processRouteItemMapper.selectBatchIds(itemIds); Map<Long, ProcessRouteItem> itemMap = rawItems.stream() .collect(Collectors.toMap(ProcessRouteItem::getId, i -> i, (a, b) -> a)); for (SalesLedgerProcessRoute r : salesLedgerProcessRoutes) { ProcessRouteItem pi = itemMap.get(r.getProcessRouteItemId()); if (pi != null) { SalesProcessCardDto.ProcessNodeDto node = new SalesProcessCardDto.ProcessNodeDto(); node.setProcessRouteItemId(pi.getId()); node.setProcessRouteItemName(pi.getProcessName()); node.setDragSort(r.getDragSort() != null ? r.getDragSort() : pi.getDragSort()); node.setRemark(r.getRemark()); nodeDtos.add(node); } } } if (!nodeDtos.isEmpty()) { // dragSort è¿è¡ååºæåº nodeDtos.sort(Comparator.comparing( SalesProcessCardDto.ProcessNodeDto::getDragSort, Comparator.nullsLast(Comparator.naturalOrder()) )); // éæ°çææåºåçè·¯å¾åç§°å表 List<String> sortedPathNames = nodeDtos.stream() .map(SalesProcessCardDto.ProcessNodeDto::getProcessRouteItemName) .collect(Collectors.toList()); // æ¼æ¥å符串 dto.setProcessPathDisplay(String.join(" -> ", sortedPathNames)); // 设置顶å±èç¹çå·¥èºè·¯çº¿ dto.setRouteNodes(nodeDtos); } return dto; } private int findFirstMissingSequence(List<Integer> sequences) { if (sequences.isEmpty()) { return 1; src/main/resources/mapper/sales/SalesLedgerMapper.xml
@@ -5,12 +5,12 @@ <mapper namespace="com.ruoyi.sales.mapper.SalesLedgerMapper"> <select id="selectSequencesByDate" resultType="java.lang.Integer"> SELECT CAST(SUBSTR(sales_contract_no,LENGTH(#{datePart})+1 , 3) AS SIGNED) SELECT CAST(SUBSTR(sales_contract_no, LENGTH(#{datePart}) + 1, 3) AS SIGNED) FROM sales_ledger WHERE sales_contract_no LIKE CONCAT('%',#{datePart},'%') WHERE sales_contract_no LIKE CONCAT('%', #{datePart}, '%') </select> <select id="getSalesNo" resultType="com.ruoyi.sales.pojo.SalesLedger"> </select> <select id="selectSalesLedgerList" resultType="com.ruoyi.sales.pojo.SalesLedger"> @@ -56,9 +56,9 @@ T1.attachment_materials, T1.tenant_id, T1.contract_amount, T1.contract_amount as noInvoiceAmountTotal, T1.contract_amount as noInvoiceAmountTotal, T1.execution_date, T2.nick_name AS entry_person_name, T2.nick_name AS entry_person_name, T1.payment_method, T1.delivery_date, DATEDIFF(T1.delivery_date, CURDATE()) AS delivery_days_diff, @@ -78,25 +78,25 @@ ) shipping_status_counts ON T1.id = shipping_status_counts.sales_ledger_id <where> <if test="salesLedgerDto.customerName != null and salesLedgerDto.customerName != '' "> AND T1.customer_name LIKE CONCAT('%',#{salesLedgerDto.customerName},'%') AND T1.customer_name LIKE CONCAT('%',#{salesLedgerDto.customerName},'%') </if> <if test="salesLedgerDto.customerContractNo != null and salesLedgerDto.customerContractNo !='' "> AND T1.customer_contract_no LIKE CONCAT('%',#{salesLedgerDto.customerContractNo},'%') AND T1.customer_contract_no LIKE CONCAT('%',#{salesLedgerDto.customerContractNo},'%') </if> <if test="salesLedgerDto.salesContractNo != null and salesLedgerDto.salesContractNo != '' "> AND T1.sales_contract_no LIKE CONCAT('%',#{salesLedgerDto.salesContractNo},'%') AND T1.sales_contract_no LIKE CONCAT('%',#{salesLedgerDto.salesContractNo},'%') </if> <if test="salesLedgerDto.projectName != null and salesLedgerDto.projectName != '' "> AND T1.project_name LIKE CONCAT('%',#{salesLedgerDto.projectName},'%') </if> <if test="salesLedgerDto.entryDateStart != null and salesLedgerDto.entryDateStart != '' "> AND T1.entry_date >= DATE_FORMAT(#{salesLedgerDto.entryDateStart},'%Y-%m-%d') AND T1.entry_date >= DATE_FORMAT(#{salesLedgerDto.entryDateStart},'%Y-%m-%d') </if> <if test="salesLedgerDto.entryDateEnd != null and salesLedgerDto.entryDateEnd != '' "> AND T1.entry_date <= DATE_FORMAT(#{salesLedgerDto.entryDateEnd},'%Y-%m-%d') AND T1.entry_date <= DATE_FORMAT(#{salesLedgerDto.entryDateEnd},'%Y-%m-%d') </if> </where> order by T1.entry_date desc order by T1.entry_date desc </select> <select id="selectIncomeStats" resultType="com.ruoyi.home.dto.IncomeExpenseAnalysisDto"> @@ -117,10 +117,26 @@ left join sales_ledger_product slp on sl.id = slp.sales_ledger_id left join shipping_info si on slp.id = si.sales_ledger_product_id where si.status = 'å·²åè´§' <if test="ew.customerName != null and ew.customerName != '' "> <if test="ew.customerName != null and ew.customerName != '' "> and sl.customer_name like concat('%',#{ew.customerName},'%') </if> </if> order by sl.execution_date desc </select> <select id="selectSalesProcess" resultType="com.ruoyi.sales.pojo.SalesLedgerProcessRoute" parameterType="java.lang.Long"> select slpr.*, pri.process_name as processName from sales_ledger_process_route slpr left join process_route_item pri on pri.id = slpr.process_route_item_id <where> <if test="salesLedgerId != null"> AND slpr.sales_ledger_id = #{salesLedgerId} </if> <if test="salesLedgerId == null"> AND 1 = 2 </if> </where> </select> </mapper>