| 2026-03-27 | gongchunyi | ![]() |
| 2026-03-27 | gongchunyi | ![]() |
| 2026-03-27 | gongchunyi | ![]() |
| 2026-03-27 | gongchunyi | ![]() |
| 2026-03-27 | gongchunyi | ![]() |
| 2026-03-27 | gongchunyi | ![]() |
doc/ºÓÄϺױÚÌìãå¸Ö»¯²£Á§³§.sql
@@ -61,4 +61,27 @@ ALTER TABLE `product-inventory-management-hbtmblc`.`process_route_item` MODIFY COLUMN `product_model_id` bigint NULL DEFAULT 0 COMMENT '产åid' AFTER `route_id`, MODIFY COLUMN `process_id` bigint NULL DEFAULT 0 COMMENT 'å·¥åºid' AFTER `product_model_id`, ADD COLUMN `process_name` varchar(255) NULL COMMENT 'å·¥åºåç§°' AFTER `process_id`; ADD COLUMN `process_name` varchar(255) NULL COMMENT 'å·¥åºåç§°' AFTER `process_id`; -- ---------------------------- -- Table structure for customer_regions -- ---------------------------- DROP TABLE IF EXISTS `customer_regions`; CREATE TABLE `customer_regions` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主é®ID', `parent_id` bigint NULL DEFAULT NULL COMMENT 'ç¶ç±»ID', `regions_name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT 'å°åºåç§°', `tenant_id` bigint NULL DEFAULT NULL COMMENT 'ç§æ·ID', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1; ALTER TABLE `product-inventory-management-hbtmblc`.`customer_regions` COMMENT = '客æ·å°åºè¡¨'; ALTER TABLE `product-inventory-management-hbtmblc`.`customer` ADD COLUMN `regions_id` bigint NULL COMMENT 'å°åºID' AFTER `regions`; src/main/java/com/ruoyi/basic/controller/CustomerController.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.basic.dto.CustomerDto; import com.ruoyi.basic.pojo.Customer; import com.ruoyi.basic.service.ICustomerService; import com.ruoyi.common.utils.poi.ExcelUtil; @@ -9,7 +10,6 @@ import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.AjaxResult; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -33,7 +33,7 @@ * æ¥è¯¢å®¢æ·æ¡£æ¡å表 */ @GetMapping("/list") public IPage<Customer> list(Page<Customer> page, Customer customer) { public IPage<CustomerDto> list(Page<Customer> page, Customer customer) { return customerService.selectCustomerList(page, customer); } @@ -118,10 +118,4 @@ return customerService.customerList(customer); } @GetMapping("/regions") @ApiOperation("è·å客æ·å°åº") public AjaxResult getRegions() { List<String> regionsList = customerService.regionsList(); return AjaxResult.success(regionsList); } } src/main/java/com/ruoyi/basic/controller/CustomerRegionsController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,58 @@ package com.ruoyi.basic.controller; import com.ruoyi.basic.dto.CustomerRegionsTreeDto; import com.ruoyi.basic.pojo.CustomerRegions; import com.ruoyi.basic.service.ICustomerRegionsService; import com.ruoyi.framework.web.domain.AjaxResult; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; /** * <p> * 客æ·å°åºè¡¨ å端æ§å¶å¨ * </p> * * @author deslrey * @since 2026-03-27 */ @RestController @RequestMapping("/customerRegions") public class CustomerRegionsController { @Autowired private ICustomerRegionsService customerRegionsService; @GetMapping("list") @ApiOperation("客æ·å°åº-å表") public AjaxResult customerRegionsList(CustomerRegions customerRegions) { List<CustomerRegionsTreeDto> list = customerRegionsService.customerRegionsList(customerRegions); return AjaxResult.success(list); } @PostMapping("/add") @ApiOperation("客æ·å°åº-æ°å¢") public AjaxResult addCustomerRegions(@RequestBody CustomerRegions customerRegions) { customerRegionsService.addCustomerRegions(customerRegions); return AjaxResult.success(); } @PutMapping("/update") @ApiOperation("客æ·å°åº-æ´æ°") public AjaxResult updateCustomerRegions(@RequestBody CustomerRegions customerRegions) { customerRegionsService.updateCustomerRegions(customerRegions); return AjaxResult.success(); } @DeleteMapping("/{id}") @ApiOperation("客æ·å°åº-å é¤") public AjaxResult delCustomerRegions(@PathVariable Long id) { customerRegionsService.delCustomerRegions(id); return AjaxResult.success(); } } src/main/java/com/ruoyi/basic/dto/CustomerDto.java
@@ -1,6 +1,7 @@ package com.ruoyi.basic.dto; import com.ruoyi.basic.pojo.Customer; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; @@ -21,4 +22,10 @@ private List<CustomerFollowUpDto> followUpList; /** * å°åº */ @ApiModelProperty("å°åº") private String regionsName; } src/main/java/com/ruoyi/basic/dto/CustomerRegionsTreeDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,43 @@ package com.ruoyi.basic.dto; import lombok.Data; import java.util.List; /** * <br> * 客æ·å°åºæ å½¢Dto * </br> * * @author deslrey * @version 1.0 * @since 2026/03/27 11:41 */ @Data public class CustomerRegionsTreeDto { /** * ID */ private Long id; /** * ç¶ç±»ID */ private Long parentId; /** * å°åºåç§° */ private String regionsName; /** * å°åºæ ç¾ */ private String label; /** * åå°åº */ private List<CustomerRegionsTreeDto> children; } src/main/java/com/ruoyi/basic/mapper/CustomerRegionsMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.basic.mapper; import com.ruoyi.basic.pojo.CustomerRegions; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * <p> * 客æ·å°åºè¡¨ Mapper æ¥å£ * </p> * * @author deslrey * @since 2026-03-27 */ public interface CustomerRegionsMapper extends BaseMapper<CustomerRegions> { } src/main/java/com/ruoyi/basic/pojo/Customer.java
@@ -29,6 +29,12 @@ private Long id; /** * å°åºID */ @ApiModelProperty("å°åºID") private Long regionsId; /** * 客æ·åç§° */ @Excel(name = "客æ·åç§°") @@ -117,7 +123,4 @@ @Excel(name = "弿·è¡å·") private String bankCode; @ApiModelProperty("å°åº") @Excel(name = "å°åº") private String regions; } src/main/java/com/ruoyi/basic/pojo/CustomerRegions.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,45 @@ package com.ruoyi.basic.pojo; import com.baomidou.mybatisplus.annotation.*; import java.io.Serializable; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; /** * <p> * 客æ·å°åºè¡¨ * </p> * * @author deslrey * @since 2026-03-27 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("customer_regions") @ApiModel(value = "CustomerRegions对象", description = "客æ·å°åºè¡¨") public class CustomerRegions implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "主é®ID") @TableId(value = "id", type = IdType.AUTO) private Long id; @ApiModelProperty(value = "ç¶ç±»ID") private Long parentId; @ApiModelProperty(value = "å°åºåç§°") private String regionsName; @ApiModelProperty(value = "ç§æ·ID") @TableField(fill = FieldFill.INSERT) private Long tenantId; } src/main/java/com/ruoyi/basic/service/ICustomerRegionsService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,28 @@ package com.ruoyi.basic.service; import com.ruoyi.basic.dto.CustomerRegionsTreeDto; import com.ruoyi.basic.pojo.CustomerRegions; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; /** * <p> * 客æ·å°åºè¡¨ æå¡ç±» * </p> * * @author deslrey * @since 2026-03-27 */ public interface ICustomerRegionsService extends IService<CustomerRegions> { List<CustomerRegionsTreeDto> customerRegionsList(CustomerRegions customerRegions); void addCustomerRegions(CustomerRegions customerRegions); void updateCustomerRegions(CustomerRegions customerRegions); void delCustomerRegions(Long id); List<Long> regionsChildrenIds(Long regionsId); } src/main/java/com/ruoyi/basic/service/ICustomerService.java
@@ -40,7 +40,7 @@ * @param customer å®¢æ·æ¡£æ¡ * @return å®¢æ·æ¡£æ¡éå */ IPage<Customer> selectCustomerList(Page<Customer> page, Customer customer); IPage<CustomerDto> selectCustomerList(Page<Customer> page, Customer customer); /** * æ°å¢å®¢æ·æ¡£æ¡ @@ -78,7 +78,4 @@ List<Customer> selectCustomerLists(Customer customer); AjaxResult importData(MultipartFile file); List<String> regionsList(); } src/main/java/com/ruoyi/basic/service/impl/CustomerRegionsServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,216 @@ package com.ruoyi.basic.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.basic.dto.CustomerRegionsTreeDto; import com.ruoyi.basic.mapper.CustomerMapper; import com.ruoyi.basic.mapper.CustomerRegionsMapper; import com.ruoyi.basic.pojo.Customer; import com.ruoyi.basic.pojo.CustomerRegions; import com.ruoyi.basic.service.ICustomerRegionsService; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * <p> * 客æ·å°åºè¡¨ æå¡å®ç°ç±» * </p> * * @author deslrey * @since 2026-03-27 */ @Service public class CustomerRegionsServiceImpl extends ServiceImpl<CustomerRegionsMapper, CustomerRegions> implements ICustomerRegionsService { @Autowired private CustomerMapper customerMapper; /** * æ¥è¯¢æ å½¢å°åºå表 */ @Override public List<CustomerRegionsTreeDto> customerRegionsList(CustomerRegions customerRegions) { List<CustomerRegions> allRegions = baseMapper.selectList(null); if (allRegions == null || allRegions.isEmpty()) { return new ArrayList<>(); } Map<Long, CustomerRegionsTreeDto> nodeMap = new HashMap<>(); List<CustomerRegionsTreeDto> allDtoList = new ArrayList<>(); for (CustomerRegions region : allRegions) { CustomerRegionsTreeDto dto = new CustomerRegionsTreeDto(); dto.setId(region.getId()); dto.setParentId(region.getParentId()); dto.setRegionsName(region.getRegionsName()); dto.setLabel(region.getRegionsName()); // ç»ä¸ label åæ®µ dto.setChildren(new ArrayList<>()); nodeMap.put(dto.getId(), dto); allDtoList.add(dto); } List<CustomerRegionsTreeDto> treeList = new ArrayList<>(); for (CustomerRegionsTreeDto node : allDtoList) { Long parentId = node.getParentId(); // å¦ææ¯æ ¹èç¹ (parentId 为 0 æ null) æ æ¾ä¸å°ç¶èç¹ï¼åä½ä¸ºé¡¶çº§èç¹ if (parentId == null || parentId == 0 || !nodeMap.containsKey(parentId)) { treeList.add(node); } else { // å¦åå°å ¶æ·»å å°ç¶èç¹ç children ä¸ nodeMap.get(parentId).getChildren().add(node); } } String keyword = customerRegions != null ? customerRegions.getRegionsName() : null; if (StringUtils.isNotEmpty(keyword)) { return filterTree(treeList, keyword); } return treeList; } /** * éå½è¿æ»¤æ èç¹ */ private List<CustomerRegionsTreeDto> filterTree(List<CustomerRegionsTreeDto> list, String keyword) { List<CustomerRegionsTreeDto> filteredList = new ArrayList<>(); for (CustomerRegionsTreeDto node : list) { // éå½å¤çåèç¹ List<CustomerRegionsTreeDto> filteredChildren = filterTree(node.getChildren(), keyword); node.setChildren(filteredChildren); // 妿å½åèç¹åç§°å å«å ³é®åï¼æè åèç¹è¿æ»¤åä¸ä¸ºç©ºï¼åä¿ç该èç¹ if (node.getRegionsName().contains(keyword) || !filteredChildren.isEmpty()) { filteredList.add(node); } } return filteredList; } /** * æ·»å å°åº */ @Override @Transactional(rollbackFor = Exception.class) public void addCustomerRegions(CustomerRegions customerRegions) { validateRegion(customerRegions); checkUnique(customerRegions); if (baseMapper.insert(customerRegions) <= 0) { throw new ServiceException("æ·»å 失败"); } } /** * ä¿®æ¹å°åº */ @Override @Transactional(rollbackFor = Exception.class) public void updateCustomerRegions(CustomerRegions customerRegions) { if (customerRegions.getId() == null) { throw new ServiceException("ä¿®æ¹å¤±è´¥, IDä¸è½ä¸ºç©º"); } validateRegion(customerRegions); if (customerRegions.getId().equals(customerRegions.getParentId())) { throw new ServiceException("ä¿®æ¹å¤±è´¥, ä¸çº§å°åºä¸è½æ¯èªå·±"); } checkUnique(customerRegions); if (baseMapper.updateById(customerRegions) <= 0) { throw new ServiceException("ä¿®æ¹å¤±è´¥"); } } /** * å é¤å°åº */ @Override @Transactional(rollbackFor = Exception.class) public void delCustomerRegions(Long id) { if (id == null) { throw new ServiceException("å é¤å¤±è´¥, IDä¸è½ä¸ºç©º"); } boolean hasChildren = baseMapper.selectCount(new LambdaQueryWrapper<CustomerRegions>() .eq(CustomerRegions::getParentId, id)) > 0; if (hasChildren) { throw new ServiceException("å é¤å¤±è´¥, 该å°åºä¸åå¨åå°åº"); } boolean isUsedByCustomer = customerMapper.selectCount(new LambdaQueryWrapper<Customer>() .eq(Customer::getRegionsId, id)) > 0; if (isUsedByCustomer) { throw new ServiceException("å é¤å¤±è´¥, 该å°åºå·²è¢«å®¢æ·æ¡£æ¡å¼ç¨"); } if (baseMapper.deleteById(id) <= 0) { throw new ServiceException("å é¤å¤±è´¥, æ°æ®ä¸åå¨"); } } /** * æ¥è¯¢å½åå°åºåå ¶ææåéç ID éå */ @Override public List<Long> regionsChildrenIds(Long regionsId) { List<Long> childIds = new ArrayList<>(); if (regionsId == null) { return childIds; } List<CustomerRegions> allRegions = baseMapper.selectList(null); if (allRegions == null || allRegions.isEmpty()) { return childIds; } childIds.add(regionsId); findAllChildren(allRegions, regionsId, childIds); return childIds; } /** * éå½å°åºæ¹æ³ * * @param allRegions ææå°åºå表 * @param parentId å½åç¶çº§ ID * @param result åæ¾ç»æçéå */ private void findAllChildren(List<CustomerRegions> allRegions, Long parentId, List<Long> result) { for (CustomerRegions region : allRegions) { // 夿 parentId æ¯å¦å¹é if (parentId.equals(region.getParentId())) { result.add(region.getId()); // ç»§ç»é彿¥æ¾è¯¥èç¹çåèç¹ findAllChildren(allRegions, region.getId(), result); } } } private void validateRegion(CustomerRegions region) { if (region == null) { throw new ServiceException("æä½å¤±è´¥, æ°æ®ä¸è½ä¸ºç©º"); } if (StringUtils.isEmpty(region.getRegionsName())) { throw new ServiceException("æä½å¤±è´¥, å°åºåç§°ä¸è½ä¸ºç©º"); } if (region.getParentId() == null) { region.setParentId(0L); } } private void checkUnique(CustomerRegions region) { CustomerRegions existing = baseMapper.selectOne(new LambdaQueryWrapper<CustomerRegions>() .eq(CustomerRegions::getRegionsName, region.getRegionsName()) .eq(CustomerRegions::getParentId, region.getParentId()) .ne(region.getId() != null, CustomerRegions::getId, region.getId())); if (existing != null) { throw new ServiceException("该å±çº§ä¸å·²åå¨å为 [" + region.getRegionsName() + "] çå°åº"); } } } src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
@@ -1,8 +1,6 @@ package com.ruoyi.basic.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.LocalDateTimeUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -15,16 +13,13 @@ import com.ruoyi.basic.pojo.Customer; import com.ruoyi.basic.pojo.CustomerFollowUp; import com.ruoyi.basic.pojo.CustomerFollowUpFile; import com.ruoyi.basic.service.CustomerFollowUpFileService; import com.ruoyi.basic.service.CustomerFollowUpService; import com.ruoyi.basic.service.CustomerReturnVisitService; import com.ruoyi.basic.service.ICustomerService; import com.ruoyi.basic.pojo.CustomerRegions; import com.ruoyi.basic.service.*; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.security.LoginUser; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.sales.mapper.SalesLedgerMapper; import com.ruoyi.sales.pojo.SalesLedger; import lombok.AllArgsConstructor; @@ -35,9 +30,10 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.multipart.MultipartFile; import java.time.LocalDate; import java.time.ZoneId; import java.util.*; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; @@ -59,6 +55,8 @@ private CustomerFollowUpFileService customerFollowUpFileService; private CustomerReturnVisitService customerReturnVisitService; private final ICustomerRegionsService customerRegionsService; /** * æ¥è¯¢å®¢æ·æ¡£æ¡ @@ -88,96 +86,112 @@ BeanUtils.copyProperties(customer, dto); // æ¥è¯¢è·è¿è®°å½ List<CustomerFollowUp> followUpList = customerFollowUpService.list( new LambdaQueryWrapper<CustomerFollowUp>() .eq(CustomerFollowUp::getCustomerId, id) .orderByDesc(CustomerFollowUp::getFollowUpTime) ); if (!CollectionUtils.isEmpty(followUpList)) { List<CustomerFollowUpDto> followUpDtoList = followUpList.stream().map(followUp -> { CustomerFollowUpDto followUpDto = new CustomerFollowUpDto(); BeanUtils.copyProperties(followUp, followUpDto); // æ¥è¯¢éä»¶ List<CustomerFollowUpFile> fileList = customerFollowUpFileService.list( new LambdaQueryWrapper<CustomerFollowUpFile>() .eq(CustomerFollowUpFile::getFollowUpId, followUp.getId()) ); followUpDto.setFileList(fileList); return followUpDto; }).collect(Collectors.toList()); dto.setFollowUpList(followUpDtoList); // List<CustomerFollowUp> followUpList = customerFollowUpService.list( // new LambdaQueryWrapper<CustomerFollowUp>() // .eq(CustomerFollowUp::getCustomerId, id) // .orderByDesc(CustomerFollowUp::getFollowUpTime) // ); // // if (!CollectionUtils.isEmpty(followUpList)) { // List<CustomerFollowUpDto> followUpDtoList = followUpList.stream().map(followUp -> { // CustomerFollowUpDto followUpDto = new CustomerFollowUpDto(); // BeanUtils.copyProperties(followUp, followUpDto); // // // æ¥è¯¢éä»¶ // List<CustomerFollowUpFile> fileList = customerFollowUpFileService.list( // new LambdaQueryWrapper<CustomerFollowUpFile>() // .eq(CustomerFollowUpFile::getFollowUpId, followUp.getId()) // ); // followUpDto.setFileList(fileList); // // return followUpDto; // }).collect(Collectors.toList()); // // dto.setFollowUpList(followUpDtoList); // } // å°åºåç§° CustomerRegions customerRegions = customerRegionsService.getById(customer.getRegionsId()); if (customerRegions != null) { dto.setRegionsName(customerRegions.getRegionsName()); } return dto; } /** * æ¥è¯¢å®¢æ·æ¡£æ¡å表 * * @param customer å®¢æ·æ¡£æ¡ * @return å®¢æ·æ¡£æ¡ * @param page å页对象 * @param customer å®¢æ·æ¥è¯¢æ¡ä»¶ * @return å®¢æ·æ¡£æ¡å页å表 */ @Override public IPage<Customer> selectCustomerList(Page<Customer> page, Customer customer) { // 1. å¤ç空å¼åºæ¯ï¼åæ°æ ¡éªï¼ if (page == null) { page = Page.of(1, 10); // é»è®¤ç¬¬1é¡µï¼æ¯é¡µ10æ¡æ°æ® } if (customer == null) { customer = new Customer(); // é¿å 空对象导è´çNPE } public IPage<CustomerDto> selectCustomerList(Page<Customer> page, Customer customer) { if (page == null) page = Page.of(1, 10); if (customer == null) customer = new Customer(); // 2. æå»ºæ¥è¯¢æ¡ä»¶ï¼å¢å¼ºç©ºå¼å®å ¨ï¼ LambdaQueryWrapper<Customer> queryWrapper = new LambdaQueryWrapper<>(); String customerName = customer.getCustomerName(); String customerType = customer.getCustomerType(); Long regionsId = customer.getRegionsId(); if (StringUtils.isNotBlank(customerName)) { queryWrapper.like(Customer::getCustomerName, customerName); } if (StringUtils.isNotBlank(customerType)) { queryWrapper.like(Customer::getCustomerType, customerType); queryWrapper.eq(Customer::getCustomerType, customerType); } // 3. æ§è¡å页æ¥è¯¢ï¼ä¿çåé¡µå æ°æ®ï¼ if (regionsId != null) { // è°ç¨ regionsService è·åå½åå°åºåå ¶ææå代ç ID éå List<Long> allRegionsIds = customerRegionsService.regionsChildrenIds(regionsId); if (!CollectionUtils.isEmpty(allRegionsIds)) { queryWrapper.in(Customer::getRegionsId, allRegionsIds); } else { queryWrapper.eq(Customer::getRegionsId, regionsId); } } IPage<Customer> customerPage = customerMapper.selectPage(page, queryWrapper); // 4. æ°æ®å¤çï¼å¢å¼ºç©ºå¼å®å ¨ & 代ç å¯è¯»æ§ï¼ List<Customer> processedList = customerPage.getRecords().stream() .filter(Objects::nonNull) // è¿æ»¤ç©ºå¯¹è±¡ï¼é¿å åç»æä½NPEï¼ .peek(c -> { // å®å ¨è·ååæ®µï¼é¿å null弿¼æ¥ List<CustomerDto> dtoList = customerPage.getRecords().stream() .filter(Objects::nonNull) .map(c -> { CustomerDto dto = new CustomerDto(); BeanUtils.copyProperties(c, dto); // å°åçµè¯æ¼æ¥ String address = StringUtils.defaultString(c.getCompanyAddress(), ""); String phone = StringUtils.defaultString(c.getCompanyPhone(), ""); c.setAddressPhone(address + "(" + phone + ")"); dto.setAddressPhone(address + "(" + phone + ")"); // å¡«å å°åºåç§° if (c.getRegionsId() != null) { CustomerRegions regions = customerRegionsService.getById(c.getRegionsId()); if (regions != null) { dto.setRegionsName(regions.getRegionsName()); } } // æ¥è¯¢ææ°çè·è¿è®°å½ CustomerFollowUp followUp = customerFollowUpService.getOne( new LambdaQueryWrapper<CustomerFollowUp>() .eq(CustomerFollowUp::getCustomerId, c.getId()) .orderByDesc(CustomerFollowUp::getFollowUpTime) .last("LIMIT 1") ); if (followUp != null) { c.setFollowUpLevel(followUp.getFollowUpLevel()); c.setFollowUpTime( Date.from( followUp.getFollowUpTime().atZone(ZoneId.systemDefault()).toInstant() ) ); } // CustomerFollowUp followUp = customerFollowUpService.getOne( // new LambdaQueryWrapper<CustomerFollowUp>() // .eq(CustomerFollowUp::getCustomerId, c.getId()) // .orderByDesc(CustomerFollowUp::getFollowUpTime) // .last("LIMIT 1") // ); // // if (followUp != null) { // dto.setFollowUpLevel(followUp.getFollowUpLevel()); // dto.setFollowUpTime(Date.from(followUp.getFollowUpTime().atZone(ZoneId.systemDefault()).toInstant())); // } return dto; }) .collect(Collectors.toList()); // 5. æ´æ°åé¡µç»æä¸çæ°æ®ï¼ä¿æå页信æ¯å®æ´ï¼ IPage<Customer> resultPage = new Page<>(customerPage.getCurrent(), customerPage.getSize(), customerPage.getTotal()); resultPage.setRecords(processedList); IPage<CustomerDto> resultPage = new Page<>(customerPage.getCurrent(), customerPage.getSize(), customerPage.getTotal()); resultPage.setRecords(dtoList); return customerPage; // è¿åå å«å页信æ¯çIPage对象 return resultPage; } /** @@ -274,17 +288,6 @@ entry -> underlineToCamel(entry.getKey()), Map.Entry::getValue)) ).collect(Collectors.toList()); } @Override public List<String> regionsList() { return this.baseMapper.selectObjs(new QueryWrapper<Customer>() .select("DISTINCT regions") .isNotNull("regions") .ne("regions", "") ).stream() .map(Object::toString) .collect(Collectors.toList()); } /** src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -11,8 +11,7 @@ import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.framework.web.domain.R; import com.ruoyi.framework.web.page.TableDataInfo; import com.ruoyi.sales.dto.InvoiceLedgerDto; import com.ruoyi.sales.dto.SalesLedgerDto; import com.ruoyi.sales.dto.*; import com.ruoyi.sales.mapper.InvoiceLedgerMapper; import com.ruoyi.sales.mapper.ReceiptPaymentMapper; import com.ruoyi.sales.pojo.ReceiptPayment; @@ -360,4 +359,40 @@ 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); } @GetMapping("/salesOrders/{salesLedgerId}") @ApiOperation("æå°éå®è®¢å") public AjaxResult salesOrders(@PathVariable Long salesLedgerId) { SalesOrdersDto salesOrdersDto = salesLedgerService.salesOrders(salesLedgerId); return AjaxResult.success(salesOrdersDto); } @PostMapping("/salesInvoices") @ApiOperation("æå°éå®åè´§å") public AjaxResult salesInvoices(@RequestBody List<Long> salesLedgerIds) { SalesInvoicesDto dto = salesLedgerService.salesInvoices(salesLedgerIds); return AjaxResult.success(dto); } @GetMapping("/salesLabel/{salesLedgerId}") @ApiOperation("æå°è®¢åæ ç¾") public AjaxResult salesLabel(@PathVariable Long salesLedgerId) { List<SalesLabelDto> list = salesLedgerService.salesLabel(salesLedgerId); return AjaxResult.success(list); } } src/main/java/com/ruoyi/sales/dto/SalesInvoicesDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,102 @@ 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.LocalDateTime; import java.util.List; /** * <br> * æå°éå®åè´§åDto * </br> * * @author deslrey * @version 1.0 * @since 2026/03/27 15:30 */ @Data public class SalesInvoicesDto { @ApiModelProperty("客æ·åç§°") private String customerName; @ApiModelProperty("è系人") private String contactPerson; @ApiModelProperty("èç³»çµè¯") private String contactPhone; @ApiModelProperty("éè´§å°å") private String companyAddress; @ApiModelProperty("åè´§åå·") private String deliveryNo; @ApiModelProperty("对æ¹åå·") private String externalOrderNo; @ApiModelProperty("æ»å计æ°é") private BigDecimal totalQuantity; @ApiModelProperty("æ»å计é¢ç§¯") private BigDecimal totalArea; @ApiModelProperty("å¶åå") private String orderMaker; @ApiModelProperty("å¶åæ¥æ") @JsonFormat(pattern = "yyyy/MM/dd") private LocalDateTime executionDate; @ApiModelProperty("å货订ååç»") private List<InvoiceOrderGroupDto> groups; /** * 订ååç» DTO */ @Data public static class InvoiceOrderGroupDto { @ApiModelProperty("订åç¼å·") private String salesContractNo; @ApiModelProperty("产ååç§°") private String productName; @ApiModelProperty("æç»å表") private List<InvoiceItemDto> items; @ApiModelProperty("å°è®¡æ°é") private BigDecimal groupTotalQuantity; @ApiModelProperty("å°è®¡é¢ç§¯") private BigDecimal groupTotalArea; } /** * åè´§åæç» DTO */ @Data public static class InvoiceItemDto { @ApiModelProperty("楼å±ç¼å·") private String floorCode; @ApiModelProperty("宽*é«") private String widthHeight; @ApiModelProperty("æ°é") private BigDecimal quantity; @ApiModelProperty("é¢ç§¯") private BigDecimal area; @ApiModelProperty("夿³¨") private String remark; @ApiModelProperty("å å·¥è¦æ±") private String processRequirement; } } src/main/java/com/ruoyi/sales/dto/SalesLabelDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,41 @@ package com.ruoyi.sales.dto; /** * <br> * * </br> * * @author deslrey * @version 1.0 * @since 2026/03/27 15:55 */ import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * <br> * é宿 ç¾Dto * </br> * * @author deslrey * @version 1.0 * @since 2026/03/27 15:55 */ @Data public class SalesLabelDto { @ApiModelProperty("客æ·åç§°") private String customerName; @ApiModelProperty("éå®è®¢åç¼å·") private String salesContractNo; @ApiModelProperty("产ååç§°") private String productName; @ApiModelProperty("è§æ ¼(宽*é«=æ°é)") private String specification; @ApiModelProperty("楼å±ç¼å·/å°å") private String floorCode; } 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/SalesOrdersDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,158 @@ 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; /** * <br> * éå®è®¢åæå°Dto * </br> * * @author deslrey * @version 1.0 * @since 2026/03/27 14:36 */ @Data public class SalesOrdersDto { @ApiModelProperty("客æ·åç§°") private String customerName; @ApiModelProperty("项ç®åç§°") private String projectName; @ApiModelProperty("产ååç§°") private String productName; @ApiModelProperty("ä¸å¡å") private String salesman; @ApiModelProperty("å¶åæ¥æ") @JsonFormat(pattern = "yyyy/MM/dd") private LocalDateTime executionDate; @ApiModelProperty("äº¤è´§æ¥æ") @JsonFormat(pattern = "yyyy/MM/dd") private LocalDate deliveryDate; @ApiModelProperty("éè´§å°å") private String companyAddress; @ApiModelProperty("订åç¼å·") private String salesContractNo; @ApiModelProperty("产åæç»") private List<SalesOrderItemDto> items; @ApiModelProperty("å°è®¡æ°é") private BigDecimal subtotalQuantity; @ApiModelProperty("å°è®¡é¢ç§¯") private BigDecimal subtotalArea; @ApiModelProperty("å°è®¡éé¢") private BigDecimal subtotalAmount; @ApiModelProperty("å计æ°é") private BigDecimal totalQuantity; @ApiModelProperty("å计é¢ç§¯") private BigDecimal totalArea; @ApiModelProperty("å计éé¢") private BigDecimal totalAmount; @ApiModelProperty("æ»éé¢") private String totalAmountDisplay; @ApiModelProperty("å å·¥è¦æ±å夿³¨") private String remakes; @ApiModelProperty("å¶åå") private String orderMaker; @ApiModelProperty("å®¡æ ¸å") private String auditor; @ApiModelProperty("æå°äºº") private String printPeople; @ApiModelProperty("å®¡æ ¸æ¥æ") @JsonFormat(pattern = "yyyy/MM/dd") private LocalDateTime auditDate; @ApiModelProperty("å¶åæ¥æ(åºé¨)") @JsonFormat(pattern = "yyyy/MM/dd") private LocalDateTime orderMakerDate; @ApiModelProperty("æå°æ¶é´") @JsonFormat(pattern = "yyyy/MM/dd HH:mm:ss") private LocalDateTime printTime; @ApiModelProperty("å ¬å¸åç§°") private String companyName; @ApiModelProperty("å ¶ä»è´¹ç¨æç»") private List<OtherFeeDto> otherFees; /** * éå®è®¢åæç» DTO */ @Data public static class SalesOrderItemDto { @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 BigDecimal unitPrice; @ApiModelProperty("éé¢") private BigDecimal amount; @ApiModelProperty("夿³¨") private String remark; @ApiModelProperty("å å·¥è¦æ±") private String processRequirement; } /** * å ¶ä»è´¹ç¨ DTO */ @Data public static class OtherFeeDto { @ApiModelProperty("è´¹ç¨åç§°") private String feeName; @ApiModelProperty("åä»·") private BigDecimal unitPrice; @ApiModelProperty("æ°é") private BigDecimal quantity; @ApiModelProperty("éé¢") private BigDecimal amount; } } 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; @@ -33,7 +31,8 @@ int addOrUpdateSalesLedger(SalesLedgerDto salesLedgerDto); List<SalesLedgerProduct> getSalesLedgerProductListByRelateId(@NotNull Long relateId,@NotNull SaleEnum type); List<SalesLedgerProduct> getSalesLedgerProductListByRelateId(@NotNull Long relateId, @NotNull SaleEnum type); List<SalesLedgerProduct> getSalesLedgerProductListByIds(@Nullable List<Long> relateIds, @NotNull SaleEnum type); void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, SaleEnum type); @@ -57,4 +56,14 @@ IPage<SalesLedgerDto> listSalesLedger(SalesLedgerDto salesLedgerDto, Page page); void saleProcessBind(SalesLedgerProcessRoute salesLedgerProcessRoute); SalesProcessCardDto processCard(Long salesLedgerId); SalesLedgerProcessRouteDto salesProcess(Long salesLedgerId); SalesOrdersDto salesOrders(Long salesLedgerId); SalesInvoicesDto salesInvoices(List<Long> salesLedgerIds); List<SalesLabelDto> salesLabel(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; @@ -13,6 +13,8 @@ import com.ruoyi.basic.mapper.ProductMapper; import com.ruoyi.basic.mapper.ProductModelMapper; import com.ruoyi.basic.pojo.Customer; import com.ruoyi.basic.pojo.CustomerRegions; import com.ruoyi.basic.service.ICustomerRegionsService; import com.ruoyi.common.enums.FileNameType; import com.ruoyi.common.enums.SaleEnum; import com.ruoyi.common.exception.ServiceException; @@ -30,7 +32,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; @@ -141,6 +143,8 @@ ; @Autowired private SysUserMapper sysUserMapper; private final ICustomerRegionsService customerRegionsService; @Override public List<SalesLedger> selectSalesLedgerList(SalesLedgerDto salesLedgerDto) { @@ -543,7 +547,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 +558,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 +849,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 +878,490 @@ } } @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; } @Override public SalesOrdersDto salesOrders(Long salesLedgerId) { if (salesLedgerId == null) { throw new ServiceException("æå°éå®è®¢å失败,éå®è®¢åIDä¸è½ä¸ºç©º"); } SalesLedger salesLedger = baseMapper.selectById(salesLedgerId); if (salesLedger == null) { throw new ServiceException("æå°éå®è®¢å失败,éå®è®¢åä¸åå¨"); } SalesOrdersDto dto = new SalesOrdersDto(); dto.setSalesContractNo(salesLedger.getSalesContractNo()); dto.setCustomerName(salesLedger.getCustomerName()); dto.setProjectName(salesLedger.getProjectName()); dto.setSalesman(salesLedger.getSalesman()); dto.setExecutionDate(salesLedger.getExecutionDate() != null ? salesLedger.getExecutionDate().atStartOfDay() : null); dto.setDeliveryDate(salesLedger.getDeliveryDate()); dto.setRemakes(salesLedger.getRemarks()); dto.setCompanyName("鹤å£å¤©æ²é¢åç»çå"); // éè´§å°å if (salesLedger.getCustomerId() != null) { Customer customer = customerMapper.selectById(salesLedger.getCustomerId()); if (customer != null) { StringBuilder address = new StringBuilder(); if (customer.getRegionsId() != null) { CustomerRegions regions = customerRegionsService.getById(customer.getRegionsId()); if (regions != null) { address.append(regions.getRegionsName()); } } if (StringUtils.isNotEmpty(customer.getCompanyAddress())) { address.append(customer.getCompanyAddress()); } dto.setCompanyAddress(address.toString()); } } // å¶åå if (StringUtils.isNotEmpty(salesLedger.getEntryPerson())) { try { SysUser user = sysUserMapper.selectUserById(Long.parseLong(salesLedger.getEntryPerson())); if (user != null) { dto.setOrderMaker(user.getNickName()); } } catch (Exception e) { log.error("è·åå¶ååä¿¡æ¯å¤±è´¥: {}", e.getMessage()); } } // å¶åæ¥æ (åºé¨) dto.setOrderMakerDate(salesLedger.getExecutionDate() != null ? salesLedger.getExecutionDate().atStartOfDay() : null); // æå°ä¿¡æ¯ LoginUser loginUser = SecurityUtils.getLoginUser(); if (loginUser != null && loginUser.getUser() != null) { dto.setPrintPeople(loginUser.getUser().getNickName()); } dto.setPrintTime(LocalDateTime.now()); // æ¥è¯¢äº§åå表 List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList( new LambdaQueryWrapper<SalesLedgerProduct>().eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerId)); if (CollectionUtils.isNotEmpty(products)) { SalesLedgerProduct firstProduct = products.get(0); dto.setProductName(firstProduct.getProductCategory() != null ? firstProduct.getProductCategory() : ""); } List<SalesOrdersDto.SalesOrderItemDto> itemDtos = new ArrayList<>(); BigDecimal subtotalQuantity = BigDecimal.ZERO; BigDecimal subtotalArea = BigDecimal.ZERO; BigDecimal subtotalAmount = BigDecimal.ZERO; for (SalesLedgerProduct p : products) { SalesOrdersDto.SalesOrderItemDto itemDto = new SalesOrdersDto.SalesOrderItemDto(); 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.getSettleTotalArea() != null ? p.getSettleTotalArea() : p.getActualTotalArea(); if (area == null && p.getWidth() != null && p.getHeight() != null && p.getQuantity() != null) { area = p.getWidth().multiply(p.getHeight()).multiply(p.getQuantity()).divide(new BigDecimal(1000000), 2, RoundingMode.HALF_UP); } itemDto.setArea(area); itemDto.setUnitPrice(p.getTaxInclusiveUnitPrice()); itemDto.setAmount(p.getTaxInclusiveTotalPrice()); itemDto.setRemark(p.getRemark()); itemDto.setProcessRequirement(p.getProcessRequirement()); subtotalQuantity = subtotalQuantity.add(p.getQuantity() != null ? p.getQuantity() : BigDecimal.ZERO); subtotalArea = subtotalArea.add(area != null ? area : BigDecimal.ZERO); subtotalAmount = subtotalAmount.add(p.getTaxInclusiveTotalPrice() != null ? p.getTaxInclusiveTotalPrice() : BigDecimal.ZERO); itemDtos.add(itemDto); } dto.setItems(itemDtos); dto.setSubtotalQuantity(subtotalQuantity); dto.setSubtotalArea(subtotalArea.setScale(2, RoundingMode.HALF_UP)); dto.setSubtotalAmount(subtotalAmount); // å¤çå ¶ä»è´¹ç¨ List<Long> productIds = products.stream().map(SalesLedgerProduct::getId).collect(Collectors.toList()); BigDecimal otherFeesTotal = BigDecimal.ZERO; if (CollectionUtils.isNotEmpty(productIds)) { List<SalesLedgerProductProcessBind> binds = salesLedgerProductProcessBindService.list( new LambdaQueryWrapper<SalesLedgerProductProcessBind>().in(SalesLedgerProductProcessBind::getSalesLedgerProductId, productIds)); if (CollectionUtils.isNotEmpty(binds)) { Map<Integer, Integer> processQuantityMap = binds.stream() .collect(Collectors.groupingBy(SalesLedgerProductProcessBind::getSalesLedgerProductProcessId, Collectors.summingInt(b -> b.getQuantity() != null ? b.getQuantity() : 0))); List<Integer> processIds = new ArrayList<>(processQuantityMap.keySet()); List<SalesLedgerProductProcess> processes = salesLedgerProductProcessService.listByIds(processIds); List<SalesOrdersDto.OtherFeeDto> otherFeeDtos = new ArrayList<>(); for (SalesLedgerProductProcess proc : processes) { SalesOrdersDto.OtherFeeDto feeDto = new SalesOrdersDto.OtherFeeDto(); feeDto.setFeeName(proc.getProcessName()); feeDto.setUnitPrice(proc.getUnitPrice()); Integer qty = processQuantityMap.get(proc.getId()); feeDto.setQuantity(new BigDecimal(qty != null ? qty : 0)); BigDecimal amount = proc.getUnitPrice() != null ? proc.getUnitPrice().multiply(feeDto.getQuantity()) : BigDecimal.ZERO; feeDto.setAmount(amount); otherFeeDtos.add(feeDto); otherFeesTotal = otherFeesTotal.add(amount); } dto.setOtherFees(otherFeeDtos); } } dto.setTotalQuantity(subtotalQuantity); dto.setTotalArea(dto.getSubtotalArea()); dto.setTotalAmount(subtotalAmount.add(otherFeesTotal)); dto.setTotalAmountDisplay(dto.getTotalAmount().setScale(2, RoundingMode.HALF_UP).toString() + "å "); return dto; } @Override public SalesInvoicesDto salesInvoices(List<Long> salesLedgerIds) { if (CollectionUtils.isEmpty(salesLedgerIds)) { throw new ServiceException("éå®åè´§åæå°å¤±è´¥,éå®è®¢åä¸è½ä¸ºç©º"); } List<SalesLedger> ledgers = salesLedgerMapper.selectBatchIds(salesLedgerIds); if (CollectionUtils.isEmpty(ledgers)) { throw new ServiceException("éå®åè´§åæå°å¤±è´¥,æªæ¾å°å¯¹åºå°è´¦è®°å½"); } Long customerId = ledgers.get(0).getCustomerId(); for (SalesLedger ledger : ledgers) { if (!Objects.equals(customerId, ledger.getCustomerId())) { throw new ServiceException("éå®åè´§ååå¹¶æå°åªè½æ¯åä¸ä¸ªå®¢æ·"); } } SalesInvoicesDto dto = new SalesInvoicesDto(); Customer customer = customerMapper.selectById(customerId); if (customer != null) { dto.setCustomerName(customer.getCustomerName()); dto.setContactPerson(customer.getContactPerson()); dto.setContactPhone(customer.getContactPhone()); StringBuilder address = new StringBuilder(); if (customer.getRegionsId() != null) { CustomerRegions regions = customerRegionsService.getById(customer.getRegionsId()); if (regions != null) { address.append(regions.getRegionsName()); } } if (StringUtils.isNotEmpty(customer.getCompanyAddress())) { address.append(customer.getCompanyAddress()); } dto.setCompanyAddress(address.toString()); } // åè´§åå· (XF + æ¥æ + åºå) String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyMMdd")); String redisKey = "sales:delivery:seq:" + dateStr; Long seq = redisTemplate.opsForValue().increment(redisKey); if (seq != null && seq == 1) { redisTemplate.expire(redisKey, 48, TimeUnit.HOURS); } dto.setDeliveryNo("XF" + dateStr + String.format("%03d", seq != null ? seq : 1)); // 对æ¹åå· // dto.setExternalOrderNo(ledgers.get(0).getCustomerContractNo()); // æ¥è¯¢ææäº§å List<SalesLedgerProduct> allProducts = salesLedgerProductMapper.selectList( new LambdaQueryWrapper<SalesLedgerProduct>().in(SalesLedgerProduct::getSalesLedgerId, salesLedgerIds)); if (CollectionUtils.isNotEmpty(allProducts)) { Map<Long, SalesLedger> ledgerMap = ledgers.stream() .collect(Collectors.toMap(SalesLedger::getId, Function.identity())); Map<Long, List<SalesLedgerProduct>> groupedData = new LinkedHashMap<>(); for (SalesLedgerProduct p : allProducts) { groupedData.computeIfAbsent(p.getSalesLedgerId(), k -> new ArrayList<>()).add(p); } List<SalesInvoicesDto.InvoiceOrderGroupDto> groups = new ArrayList<>(); BigDecimal totalQty = BigDecimal.ZERO; BigDecimal totalArea = BigDecimal.ZERO; for (Map.Entry<Long, List<SalesLedgerProduct>> ledgerEntry : groupedData.entrySet()) { SalesLedger ledger = ledgerMap.get(ledgerEntry.getKey()); String orderNo = ledger != null ? ledger.getSalesContractNo() : ""; List<SalesLedgerProduct> products = ledgerEntry.getValue(); SalesInvoicesDto.InvoiceOrderGroupDto group = new SalesInvoicesDto.InvoiceOrderGroupDto(); group.setSalesContractNo(orderNo); if (CollectionUtils.isNotEmpty(products)) { group.setProductName(products.get(0).getProductCategory()); } List<SalesInvoicesDto.InvoiceItemDto> itemDtos = new ArrayList<>(); BigDecimal groupQty = BigDecimal.ZERO; BigDecimal groupArea = BigDecimal.ZERO; for (SalesLedgerProduct p : products) { SalesInvoicesDto.InvoiceItemDto item = new SalesInvoicesDto.InvoiceItemDto(); item.setFloorCode(p.getFloorCode()); item.setWidthHeight((p.getWidth() != null ? p.getWidth().stripTrailingZeros().toPlainString() : "0") + " * " + (p.getHeight() != null ? p.getHeight().stripTrailingZeros().toPlainString() : "0")); item.setQuantity(p.getQuantity()); // é¢ç§¯ BigDecimal area = p.getSettleTotalArea() != null ? p.getSettleTotalArea() : p.getActualTotalArea(); if (area == null && p.getWidth() != null && p.getHeight() != null && p.getQuantity() != null) { area = p.getWidth().multiply(p.getHeight()).multiply(p.getQuantity()).divide(new BigDecimal(1000000), 2, RoundingMode.HALF_UP); } item.setArea(area); item.setRemark(p.getRemark()); item.setProcessRequirement(p.getProcessRequirement()); itemDtos.add(item); groupQty = groupQty.add(p.getQuantity() != null ? p.getQuantity() : BigDecimal.ZERO); groupArea = groupArea.add(area != null ? area : BigDecimal.ZERO); } group.setItems(itemDtos); group.setGroupTotalQuantity(groupQty); group.setGroupTotalArea(groupArea.setScale(2, RoundingMode.HALF_UP)); groups.add(group); totalQty = totalQty.add(groupQty); totalArea = totalArea.add(groupArea); } dto.setGroups(groups); dto.setTotalQuantity(totalQty); dto.setTotalArea(totalArea.setScale(2, RoundingMode.HALF_UP)); } LoginUser loginUser = SecurityUtils.getLoginUser(); if (loginUser != null && loginUser.getUser() != null) { dto.setOrderMaker(loginUser.getUser().getNickName()); } dto.setExecutionDate(LocalDateTime.now()); return dto; } @Override public List<SalesLabelDto> salesLabel(Long salesLedgerId) { if (salesLedgerId == null) { throw new ServiceException("æå°æ ç¾å¤±è´¥,æ°æ®ä¸è½ä¸ºç©º"); } SalesLedger salesLedger = baseMapper.selectById(salesLedgerId); if (salesLedger == null) { throw new ServiceException("æå°å¤±è´¥,éå®è®¢åä¸åå¨"); } // æ¥è¯¢äº§åå表 List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList( new LambdaQueryWrapper<SalesLedgerProduct>().eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerId)); // æ¥è¯¢å®¢æ·å°å String fullAddress = ""; if (salesLedger.getCustomerId() != null) { Customer customer = customerMapper.selectById(salesLedger.getCustomerId()); if (customer != null) { StringBuilder addressSb = new StringBuilder(); if (customer.getRegionsId() != null) { CustomerRegions regions = customerRegionsService.getById(customer.getRegionsId()); if (regions != null) { addressSb.append(regions.getRegionsName()); } } if (StringUtils.isNotEmpty(customer.getCompanyAddress())) { addressSb.append(customer.getCompanyAddress()); } fullAddress = addressSb.toString(); } } List<SalesLabelDto> list = new ArrayList<>(); if (CollectionUtils.isNotEmpty(products)) { for (SalesLedgerProduct p : products) { SalesLabelDto dto = new SalesLabelDto(); dto.setCustomerName(salesLedger.getCustomerName()); dto.setSalesContractNo(salesLedger.getSalesContractNo()); dto.setProductName(p.getProductCategory()); // 宽*é«=æ°é String specification = (p.getWidth() != null ? p.getWidth().stripTrailingZeros().toPlainString() : "0") + "*" + (p.getHeight() != null ? p.getHeight().stripTrailingZeros().toPlainString() : "0") + "=" + (p.getQuantity() != null ? p.getQuantity().stripTrailingZeros().toPlainString() : "0"); dto.setSpecification(specification); // 客æ·å°å + 楼å±ç¼å· dto.setFloorCode(fullAddress + (StringUtils.isNotEmpty(p.getFloorCode()) ? " " + p.getFloorCode() : "")); list.add(dto); } } return list; } private int findFirstMissingSequence(List<Integer> sequences) { if (sequences.isEmpty()) { return 1; src/main/resources/mapper/basic/CustomerRegionsMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,13 @@ <?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="com.ruoyi.basic.mapper.CustomerRegionsMapper"> <!-- éç¨æ¥è¯¢æ å°ç»æ --> <resultMap id="BaseResultMap" type="com.ruoyi.basic.pojo.CustomerRegions"> <id column="id" property="id" /> <result column="parent_id" property="parentId" /> <result column="regions_name" property="regionsName" /> <result column="tenant_id" property="tenantId" /> </resultMap> </mapper> 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>