src/main/java/com/ruoyi/basic/controller/CustomerController.java
@@ -8,7 +8,6 @@ import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; @@ -91,8 +90,19 @@ * å é¤å®¢æ·æ¡£æ¡ */ @Log(title = "å®¢æ·æ¡£æ¡", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public AjaxResult remove(@PathVariable Long[] ids) { @DeleteMapping("/delCustomer") public AjaxResult remove(@RequestBody Long[] ids) { if (ids == null || ids.length == 0) { return AjaxResult.error("è¯·ä¼ å ¥è¦å é¤çID"); } return toAjax(customerService.deleteCustomerByIds(ids)); } /** * æ¥è¯¢å®¢æ· */ @GetMapping("/customerList") public List customerList(Customer customer) { return customerService.customerList(customer); } } src/main/java/com/ruoyi/basic/pojo/Customer.java
@@ -79,4 +79,7 @@ @TableField(exist = false) private Long[] ids; @TableField(exist = false) private String addressPhone; } src/main/java/com/ruoyi/basic/service/ICustomerService.java
@@ -53,4 +53,11 @@ int deleteCustomerByIds(Long[] ids); List<Customer> selectCustomerListByIds(Long[] ids); /** * æ¥è¯¢å®¢æ·ä¿¡æ¯ * * @return ç»æ */ List customerList(Customer customer); } src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
@@ -2,12 +2,14 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.basic.mapper.CustomerMapper; import com.ruoyi.basic.pojo.Customer; import com.ruoyi.basic.service.ICustomerService; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.security.LoginUser; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -15,6 +17,7 @@ import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; /** @@ -49,11 +52,17 @@ @Override public List<Customer> selectCustomerList(Customer customer) { LambdaQueryWrapper<Customer> queryWrapper = new LambdaQueryWrapper<>(); if (customer.getCustomerName() != null && !customer.getCustomerName().isEmpty()) { if (StringUtils.isNotBlank(customer.getCustomerName())) { queryWrapper.eq(Customer::getCustomerName, customer.getCustomerName()); } List<Customer> customerList = customerMapper.selectList(queryWrapper); return customerList; // ä½¿ç¨ Stream ä¿®æ¹æ¯ä¸ª Customer ç addressPhone åæ®µ return customerList.stream().peek(c -> c.setAddressPhone(c.getCompanyAddress() + "( " + c.getCompanyPhone() + " )") ).collect(Collectors.toList()); } /** @@ -102,4 +111,11 @@ queryWrapper.in(Customer::getId, Arrays.asList(ids)); return customerMapper.selectList(queryWrapper); } @Override public List customerList(Customer customer) { LambdaQueryWrapper<Customer> queryWrapper = Wrappers.lambdaQuery(); queryWrapper.select(Customer::getId, Customer::getCustomerName); return customerMapper.selectMaps(queryWrapper); } } src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -4,13 +4,12 @@ import javax.servlet.http.HttpServletResponse; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.sales.dto.SalesLedgerDto; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.service.ISalesLedgerService; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; @@ -47,6 +46,17 @@ } /** * æ¥è¯¢éå®å°è´¦å产åç¶åå表 */ @GetMapping("/getSalesLedgerWithProducts") public TableDataInfo getSalesLedgerWithProducts() { startPage(); List<SalesLedgerDto> list = salesLedgerService.getSalesLedgerWithProducts(); return getDataTable(list); } /** * 导åºéå®å°è´¦å表 */ @Log(title = "éå®å°è´¦", businessType = BusinessType.EXPORT) @@ -68,32 +78,25 @@ } /** * æ°å¢éå®å°è´¦ * æ°å¢ä¿®æ¹éå®å°è´¦ */ @Log(title = "éå®å°è´¦", businessType = BusinessType.INSERT) @PostMapping ("/insertSalesLedger") @PostMapping ("/addOrUpdateSalesLedger") public AjaxResult add(@RequestBody SalesLedger salesLedger) { return toAjax(salesLedgerService.insertSalesLedger(salesLedger)); } /** * ä¿®æ¹éå®å°è´¦ */ @Log(title = "éå®å°è´¦", businessType = BusinessType.UPDATE) @PostMapping ("/updateSalesLedger") public AjaxResult edit(@RequestBody SalesLedger salesLedger) { return toAjax(salesLedgerService.updateSalesLedger(salesLedger)); return toAjax(salesLedgerService.addOrUpdateSalesLedger(salesLedger)); } /** * å é¤éå®å°è´¦ */ @Log(title = "éå®å°è´¦", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public AjaxResult remove(@PathVariable Long[] ids) @DeleteMapping("/delLedger") public AjaxResult remove(@RequestBody Long[] ids) { if (ids == null || ids.length == 0) { return AjaxResult.error("è¯·ä¼ å ¥è¦å é¤çID"); } return toAjax(salesLedgerService.deleteSalesLedgerByIds(ids)); } } src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,91 @@ package com.ruoyi.sales.controller; import javax.servlet.http.HttpServletResponse; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.service.ISalesLedgerProductService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.framework.web.page.TableDataInfo; import java.util.List; /** * 产åä¿¡æ¯Controller * * @author ruoyi * @date 2025-05-08 */ @RestController @RequestMapping("/sales/product") public class SalesLedgerProductController extends BaseController { @Autowired private ISalesLedgerProductService salesLedgerProductService; /** * æ¥è¯¢äº§åä¿¡æ¯å表 */ @GetMapping("/list") public TableDataInfo list(SalesLedgerProduct salesLedgerProduct) { startPage(); List<SalesLedgerProduct> list = salesLedgerProductService.selectSalesLedgerProductList(salesLedgerProduct); return getDataTable(list); } /** * 导åºäº§åä¿¡æ¯å表 */ @Log(title = "产åä¿¡æ¯", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, SalesLedgerProduct salesLedgerProduct) { List<SalesLedgerProduct> list = salesLedgerProductService.selectSalesLedgerProductList(salesLedgerProduct); ExcelUtil<SalesLedgerProduct> util = new ExcelUtil<SalesLedgerProduct>(SalesLedgerProduct.class); util.exportExcel(response, list, "产åä¿¡æ¯æ°æ®"); } /** * è·å产åä¿¡æ¯è¯¦ç»ä¿¡æ¯ */ @GetMapping(value = "/{id}") public AjaxResult getInfo(@PathVariable("id") Long id) { return success(salesLedgerProductService.selectSalesLedgerProductById(id)); } /** * æ°å¢ä¿®æ¹äº§åä¿¡æ¯ */ @Log(title = "产åä¿¡æ¯", businessType = BusinessType.INSERT) @PostMapping ("/addOrUpdateSalesLedgerProduct") public AjaxResult add(@RequestBody SalesLedgerProduct salesLedgerProduct) { return toAjax(salesLedgerProductService.addOrUpdateSalesLedgerProduct(salesLedgerProduct)); } /** * å é¤äº§åä¿¡æ¯ */ @Log(title = "产åä¿¡æ¯", businessType = BusinessType.DELETE) @DeleteMapping("/delProduct") public AjaxResult remove(@RequestBody Long[] ids) { if (ids == null || ids.length == 0) { return AjaxResult.error("è¯·ä¼ å ¥è¦å é¤çID"); } return toAjax(salesLedgerProductService.deleteSalesLedgerProductByIds(ids)); } } src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
@@ -1,4 +1,26 @@ package com.ruoyi.sales.dto; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.sales.pojo.SalesLedgerProduct; import lombok.Data; import java.util.Date; import java.util.List; @Data public class SalesLedgerDto { private Long id; private String salesContractNo; private String customerContractNo; private String projectName; @JsonFormat(pattern = "yyyy-MM-dd") private Date entryDate; private String salesman; private Long customerId; private String customerName; private String entryPerson; private String remarks; private String attachmentMaterials; private Boolean hasChildren = false; private List<SalesLedgerProduct> children; } src/main/java/com/ruoyi/sales/dto/SalesLedgerProductDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,4 @@ package com.ruoyi.sales.dto; public class SalesLedgerProductDTO { } src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,13 @@ package com.ruoyi.sales.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.sales.pojo.SalesLedgerProduct; /** * 产åä¿¡æ¯Mapperæ¥å£ * * @author ruoyi * @date 2025-05-08 */ public interface SalesLedgerProductMapper extends BaseMapper<SalesLedgerProduct> { } src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -2,10 +2,8 @@ import java.util.Date; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import lombok.Data; @@ -60,6 +58,11 @@ /** * 客æ·åç§° */ private Long customerId; /** * 客æ·åç§° */ @Excel(name = "客æ·åç§°") private String customerName; @@ -81,5 +84,8 @@ @Excel(name = "éä»¶ææï¼å卿件åçç¸å ³ä¿¡æ¯") private String attachmentMaterials; @TableField(fill = FieldFill.INSERT) private Long tenantId; } src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,87 @@ package com.ruoyi.sales.pojo; import java.math.BigDecimal; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import lombok.Data; /** * 产åä¿¡æ¯å¯¹è±¡ sales_ledger_product * * @author ruoyi * @date 2025-05-08 */ @TableName("sales_ledger_product") @Data public class SalesLedgerProduct { private static final long serialVersionUID = 1L; /** * 产åä¿¡æ¯ä¸»é® */ @TableId(value = "id", type = IdType.AUTO) private Long id; /** * å ³èéå®å°è´¦ä¸»è¡¨ä¸»é® */ @Excel(name = "å ³èéå®å°è´¦ä¸»è¡¨ä¸»é®") private Long salesLedgerId; /** * 产å大类 */ @Excel(name = "产å大类") private String productCategory; /** * è§æ ¼åå· */ @Excel(name = "è§æ ¼åå·") private String specificationModel; /** * åä½ */ @Excel(name = "åä½") private String unit; /** * æ°é */ @Excel(name = "æ°é") private BigDecimal quantity; /** * ç¨ç */ @Excel(name = "ç¨ç") private BigDecimal taxRate; /** * å«ç¨åä»· */ @Excel(name = "å«ç¨åä»·") private BigDecimal taxInclusiveUnitPrice; /** * å«ç¨æ»ä»· */ @Excel(name = "å«ç¨æ»ä»·") private BigDecimal taxInclusiveTotalPrice; /** * ä¸å«ç¨æ»ä»· */ @Excel(name = "ä¸å«ç¨æ»ä»·") private BigDecimal taxExclusiveTotalPrice; /** * å票类å */ @Excel(name = "å票类å") private String invoiceType; } src/main/java/com/ruoyi/sales/service/ISalesLedgerProductService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,23 @@ package com.ruoyi.sales.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.sales.pojo.SalesLedgerProduct; import java.util.List; /** * 产åä¿¡æ¯Serviceæ¥å£ * * @author ruoyi * @date 2025-05-08 */ public interface ISalesLedgerProductService extends IService<SalesLedgerProduct> { SalesLedgerProduct selectSalesLedgerProductById(Long id); List<SalesLedgerProduct> selectSalesLedgerProductList(SalesLedgerProduct salesLedgerProduct); int deleteSalesLedgerProductByIds(Long[] ids); int addOrUpdateSalesLedgerProduct(SalesLedgerProduct salesLedgerProduct); } src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
@@ -3,6 +3,7 @@ import java.util.List; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.sales.dto.SalesLedgerDto; import com.ruoyi.sales.pojo.SalesLedger; /** @@ -19,7 +20,7 @@ int deleteSalesLedgerByIds(Long[] ids); int insertSalesLedger(SalesLedger salesLedger); int addOrUpdateSalesLedger(SalesLedger salesLedger); int updateSalesLedger(SalesLedger salesLedger); List<SalesLedgerDto> getSalesLedgerWithProducts(); } src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,50 @@ package com.ruoyi.sales.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.service.ISalesLedgerProductService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Arrays; import java.util.List; /** * 产åä¿¡æ¯Serviceä¸å¡å±å¤ç * * @author ruoyi * @date 2025-05-08 */ @Service public class SalesLedgerProductServiceImpl extends ServiceImpl<SalesLedgerProductMapper, SalesLedgerProduct> implements ISalesLedgerProductService { @Autowired private SalesLedgerProductMapper salesLedgerProductMapper; @Override public SalesLedgerProduct selectSalesLedgerProductById(Long id) { return salesLedgerProductMapper.selectById(id); } @Override public List<SalesLedgerProduct> selectSalesLedgerProductList(SalesLedgerProduct salesLedgerProduct) { LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId,salesLedgerProduct.getSalesLedgerId()); return salesLedgerProductMapper.selectList(queryWrapper); } @Override public int deleteSalesLedgerProductByIds(Long[] ids) { return salesLedgerProductMapper.deleteBatchIds(Arrays.asList(ids)); } @Override public int addOrUpdateSalesLedgerProduct(SalesLedgerProduct salesLedgerProduct) { if (salesLedgerProduct.getId() == null){ return salesLedgerProductMapper.insert(salesLedgerProduct); }else { return salesLedgerProductMapper.updateById(salesLedgerProduct); } } } src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -2,14 +2,23 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.basic.mapper.CustomerMapper; import com.ruoyi.basic.pojo.Customer; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.sales.dto.SalesLedgerDto; import com.ruoyi.sales.mapper.SalesLedgerMapper; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.service.ISalesLedgerService; import org.springframework.beans.factory.annotation.Autowired; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * éå®å°è´¦Serviceä¸å¡å±å¤ç @@ -18,13 +27,38 @@ * @date 2025-05-08 */ @Service @AllArgsConstructor public class SalesLedgerServiceImpl extends ServiceImpl<SalesLedgerMapper, SalesLedger> implements ISalesLedgerService { @Autowired private SalesLedgerMapper salesLedgerMapper; private CustomerMapper customerMapper; private SalesLedgerProductMapper salesLedgerProductMapper; @Override public List<SalesLedger> selectSalesLedgerList(SalesLedger salesLedger) { return salesLedgerMapper.selectList(new LambdaQueryWrapper<>()); } public List<SalesLedgerDto> getSalesLedgerWithProducts() { List<SalesLedger> ledgers = salesLedgerMapper.selectList(new LambdaQueryWrapper<>()); List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<>()); Map<Long, List<SalesLedgerProduct>> productMap = products.stream() .collect(Collectors.groupingBy(SalesLedgerProduct::getSalesLedgerId)); return ledgers.stream().map(ledger -> { SalesLedgerDto dto = new SalesLedgerDto(); org.springframework.beans.BeanUtils.copyProperties(ledger, dto); List<SalesLedgerProduct> ledgerProducts = productMap.getOrDefault(ledger.getId(), Collections.emptyList()); if (!ledgerProducts.isEmpty()) { dto.setHasChildren(true); dto.setChildren(ledgerProducts); } return dto; }).collect(Collectors.toList()); } @Override @@ -37,13 +71,23 @@ return salesLedgerMapper.deleteBatchIds(Arrays.asList(ids)); } @Override public int insertSalesLedger(SalesLedger salesLedger) { return salesLedgerMapper.insert(salesLedger); public int addOrUpdateSalesLedger(SalesLedger salesLedger) { LambdaQueryWrapper<Customer> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Customer::getId, salesLedger.getCustomerId()); Customer customer = customerMapper.selectOne(queryWrapper); if (customer == null) { throw new BaseException("æªæ¥è¯¢å°å¯¹åºç Customer ä¿¡æ¯"); } salesLedger.setCustomerName(customer.getCustomerName()); salesLedger.setTenantId(customer.getTenantId()); return saveOrUpdates(salesLedger); } @Override public int updateSalesLedger(SalesLedger salesLedger) { return salesLedgerMapper.updateById(salesLedger); private int saveOrUpdates(SalesLedger salesLedger) { if (salesLedger.getId() == null) { return salesLedgerMapper.insert(salesLedger); } else { return salesLedgerMapper.updateById(salesLedger); } } }