src/main/java/com/ruoyi/basic/excel/SupplierManageExcelDto.java
@@ -1,13 +1,7 @@ package com.ruoyi.basic.excel; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; @Data public class SupplierManageExcelDto { @@ -15,6 +9,9 @@ @Excel(name = "ä¾åºååç§°") private String supplierName; @Excel(name = "ä¾åºåç±»å(1-å¯¹å ¬/2-对ç§)") private Integer supplierType; @Excel(name = "纳ç¨äººè¯å«å·") private String taxpayerIdentificationNum; src/main/java/com/ruoyi/basic/pojo/Customer.java
@@ -1,15 +1,13 @@ package com.ruoyi.basic.pojo; import java.io.Serializable; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Date; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import java.io.Serializable; import java.util.Date; /** * å®¢æ·æ¡£æ¡å¯¹è±¡ customer @@ -50,8 +48,8 @@ @TableField(exist = false) private Date followUpTime; @Excel(name = "客æ·åç±»") private String customerType; @Excel(name = "客æ·åç±»ï¼1-å¯¹å ¬ï¼2-对ç§") private Integer customerType; /** * 纳ç¨äººè¯å«å· src/main/java/com/ruoyi/basic/pojo/SupplierManage.java
@@ -28,6 +28,10 @@ @Excel(name = "å ¬å¸å°å") private String companyAddress; @ApiModelProperty(value = "ä¾åºåç±»å") @Excel(name = "ä¾åºåç±»å(1-å¯¹å ¬/2-对ç§)") private Integer supplierType; @ApiModelProperty(value = "å ¬å¸çµè¯") @Excel(name = "å ¬å¸çµè¯") private String companyPhone; @@ -79,8 +83,4 @@ @ApiModelProperty(value = "ç§æ·ID") @TableField(fill = FieldFill.INSERT) private Long tenantId; @ApiModelProperty(value = "ä¾åºåç±»å") @TableField(value = "supplier_type") private String supplierType; } 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; @@ -24,7 +22,6 @@ 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,7 +32,6 @@ 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.stream.Collectors; @@ -134,12 +130,12 @@ // 2. æå»ºæ¥è¯¢æ¡ä»¶ï¼å¢å¼ºç©ºå¼å®å ¨ï¼ LambdaQueryWrapper<Customer> queryWrapper = new LambdaQueryWrapper<>(); String customerName = customer.getCustomerName(); String customerType = customer.getCustomerType(); Integer customerType = customer.getCustomerType(); if (StringUtils.isNotBlank(customerName)) { queryWrapper.like(Customer::getCustomerName, customerName); } if (StringUtils.isNotBlank(customerType)) { queryWrapper.like(Customer::getCustomerType, customerType); if (customerType != null) { queryWrapper.eq(Customer::getCustomerType, customerType); } // 3. æ§è¡å页æ¥è¯¢ï¼ä¿çåé¡µå æ°æ®ï¼ @@ -150,10 +146,17 @@ .filter(Objects::nonNull) // è¿æ»¤ç©ºå¯¹è±¡ï¼é¿å åç»æä½NPEï¼ .peek(c -> { // å®å ¨è·ååæ®µï¼é¿å null弿¼æ¥ String address = StringUtils.defaultString(c.getCompanyAddress(), ""); String phone = StringUtils.defaultString(c.getCompanyPhone(), ""); c.setAddressPhone(address + "(" + phone + ")"); String address = StringUtils.defaultString(c.getCompanyAddress(), "").trim(); String phone = StringUtils.defaultString(c.getCompanyPhone(), "").trim(); if (StringUtils.isNotEmpty(address) && StringUtils.isNotEmpty(phone)) { c.setAddressPhone(address + "(" + phone + ")"); } else if (StringUtils.isNotEmpty(address)) { c.setAddressPhone(address); } else if (StringUtils.isNotEmpty(phone)) { c.setAddressPhone(phone); } else { c.setAddressPhone(""); } // æ¥è¯¢ææ°çè·è¿è®°å½ CustomerFollowUp followUp = customerFollowUpService.getOne( new LambdaQueryWrapper<CustomerFollowUp>() @@ -263,7 +266,7 @@ @Override public List<Map<String, Object>> customerList(Customer customer) { LambdaQueryWrapper<Customer> queryWrapper = Wrappers.lambdaQuery(); queryWrapper.select(Customer::getId, Customer::getCustomerName, Customer::getTaxpayerIdentificationNumber); queryWrapper.select(Customer::getId, Customer::getCustomerName, Customer::getTaxpayerIdentificationNumber, Customer::getCustomerType); // è·ååå§æ¥è¯¢ç»æ List<Map<String, Object>> result = customerMapper.selectMaps(queryWrapper); src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
@@ -10,7 +10,6 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; @Data @ExcelIgnoreUnannotated @@ -47,7 +46,7 @@ private String unit; //éå®ååå· @Excel(name = "éå®ååå·") // @Excel(name = "éå®ååå·") private String salesContractNo; @JsonFormat(pattern = "yyyy-MM-dd") src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
@@ -2,7 +2,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.aspectj.lang.annotation.Log; @@ -17,7 +16,6 @@ import com.ruoyi.purchase.pojo.PurchaseLedgerTemplate; import com.ruoyi.purchase.pojo.SalesLedgerProductTemplate; import com.ruoyi.purchase.service.IPurchaseLedgerService; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.service.ISalesLedgerProductService; import com.ruoyi.sales.service.ISalesLedgerService; import io.swagger.annotations.Api; @@ -33,11 +31,9 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.math.BigDecimal; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; /** * éè´å°è´¦Controller @@ -128,8 +124,8 @@ @PostMapping("/export") public void export(HttpServletResponse response, PurchaseLedger purchaseLedger) { List<PurchaseLedger> list = purchaseLedgerService.selectPurchaseLedgerList(purchaseLedger); ExcelUtil<PurchaseLedger> util = new ExcelUtil<PurchaseLedger>(PurchaseLedger.class); util.exportExcel(response, list, "ã请填ååè½åç§°ãæ°æ®"); ExcelUtil<PurchaseLedger> util = new ExcelUtil<>(PurchaseLedger.class); util.exportExcel(response, list, "éè´å°è´¦æ°æ®"); } /** @@ -160,8 +156,11 @@ */ @ApiOperation("/æ¥è¯¢éè´æ¨¡æ¿") @GetMapping("/getPurchaseTemplateList") public AjaxResult getPurchaseTemplateList() { List<PurchaseLedgerTemplate> purchaseLedgers = purchaseLedgerTemplateMapper.selectList(null); public AjaxResult getPurchaseTemplateList(@RequestParam(required = false) Integer templateType) { if (templateType == null){ return AjaxResult.success(new ArrayList<>()); } List<PurchaseLedgerTemplate> purchaseLedgers = purchaseLedgerTemplateMapper.selectList(new LambdaQueryWrapper<PurchaseLedgerTemplate>().eq(PurchaseLedgerTemplate::getTemplateType,templateType)); purchaseLedgers.forEach(purchaseLedgerDto1 -> { LambdaQueryWrapper<SalesLedgerProductTemplate> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SalesLedgerProductTemplate::getSalesLedgerId, purchaseLedgerDto1.getId()) src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
@@ -46,6 +46,12 @@ */ @Excel(name = "ä¾åºååç§°") private String supplierName; /** * ä¾åºååç§° */ @Excel(name = "ä¾åºåç±»å") private Integer supplierType; /** * æ¯å¦ç½åå */ @@ -125,7 +131,7 @@ private Boolean hasChildren = false; private Integer Type; private Integer type; private List<SalesLedgerProduct> productData; @@ -184,11 +190,6 @@ @Excel(name = "æªæ¥ç¥¨éé¢(å )") private BigDecimal unReceiptPaymentAmount =BigDecimal.ZERO; @ApiModelProperty("æä»¶ç±»å å 4") @TableField(exist = false) private Integer type; @ApiModelProperty(value = "仿¬¾æ¹å¼") private String paymentMethod; @ApiModelProperty("审æ¹ç¶æ") @@ -197,4 +198,8 @@ private String templateName; @ApiModelProperty(value = "审æ¹äººid") private Integer approverId; @ApiModelProperty("模æ¿ç±»å(1-å¯¹å ¬/2-对ç§)") private Integer templateType; } src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerImportDto.java
@@ -4,6 +4,7 @@ import com.ruoyi.framework.aspectj.lang.annotation.Excel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.Date; @@ -12,6 +13,7 @@ * @date : 2026/1/26 16:01 */ @Data @EqualsAndHashCode(callSuper = true) public class PurchaseLedgerImportDto extends PurchaseLedgerProductImportDto{ @Excel(name = "éè´åå·") @@ -48,6 +50,10 @@ @Excel(name = "å®¡æ ¸äºº(å¤ä¸ªç¨ï¼éå¼)") private String approveUserIds; @ApiModelProperty(value = "å°è´¦åç±»") @Excel(name = "å°è´¦åç±»") private String purchaseType; } src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerProductImportDto.java
@@ -1,7 +1,6 @@ package com.ruoyi.purchase.dto; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import com.ruoyi.sales.dto.SalesLedgerProductImportDto; import lombok.Data; import java.math.BigDecimal; @@ -80,4 +79,10 @@ @Excel(name = "æ¯å¦è´¨æ£", readConverterExp = "0=å¦,1=æ¯") private Integer isChecked; @Excel(name = "åä»·") private BigDecimal unitPrice; @Excel(name = "æ»ä»·") private BigDecimal totalPrice; } src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java
@@ -159,4 +159,9 @@ @ApiModelProperty(value = "审æ¹äººid") private String approveUserIds; @ApiModelProperty(value = "å°è´¦åç±»") @Excel(name = "å°è´¦åç±»(1-å¯¹å ¬/2-对ç§)") @TableField(exist = false) private Integer purchaseType; } src/main/java/com/ruoyi/purchase/pojo/PurchaseLedgerTemplate.java
@@ -4,17 +4,15 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Date; import java.util.List; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import lombok.Setter; import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; import java.util.List; /** * <p> @@ -91,6 +89,9 @@ @ApiModelProperty("模æ¿åç§°") private String templateName; @ApiModelProperty("模æ¿ç±»å(1-å¯¹å ¬/2-对ç§)") private Integer templateType; @TableField(exist = false) private List<SalesLedgerProductTemplate> productList; } src/main/java/com/ruoyi/purchase/pojo/SalesLedgerProductTemplate.java
@@ -3,13 +3,14 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import lombok.Setter; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; /** * <p> @@ -81,4 +82,29 @@ @ApiModelProperty("æ¯å¦æ¨éè´¨æ£") private Boolean isChecked; /** * åä»·ï¼å¯¹ç§ä¸ç¨ï¼ */ @ApiModelProperty(value = "åä»·ï¼å¯¹ç§ä¸ç¨ï¼") private BigDecimal unitPrice; /** * æ»ä»·ï¼å¯¹ç§ä¸ç¨ï¼ */ @ApiModelProperty(value = "æ»ä»·ï¼å¯¹ç§ä¸ç¨ï¼") private BigDecimal totalPrice; /** * è¿è´¹ */ @ApiModelProperty(value = "è¿è´¹") private BigDecimal freight = BigDecimal.ZERO; /** * å«è¿è´¹åä»· */ @ApiModelProperty(value = "å«è¿è´¹åä»·") private BigDecimal priceWithFreight; } src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -1,29 +1,23 @@ package com.ruoyi.purchase.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.pojo.AccountExpense; import com.ruoyi.account.pojo.AccountIncome; import com.ruoyi.account.service.AccountExpenseService; import com.ruoyi.account.service.AccountIncomeService; import com.ruoyi.approve.pojo.ApproveProcess; import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl; import com.ruoyi.approve.vo.ApproveProcessVO; import com.ruoyi.basic.mapper.ProductMapper; import com.ruoyi.basic.mapper.ProductModelMapper; import com.ruoyi.basic.mapper.SupplierManageMapper; import com.ruoyi.basic.pojo.Customer; import com.ruoyi.basic.pojo.Product; import com.ruoyi.basic.pojo.ProductModel; import com.ruoyi.basic.pojo.SupplierManage; import com.ruoyi.common.enums.FileNameType; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.poi.ExcelUtil; @@ -39,19 +33,25 @@ import com.ruoyi.purchase.dto.PurchaseLedgerImportDto; import com.ruoyi.purchase.dto.PurchaseLedgerProductImportDto; import com.ruoyi.purchase.mapper.*; import com.ruoyi.purchase.pojo.*; import com.ruoyi.purchase.pojo.PaymentRegistration; import com.ruoyi.purchase.pojo.ProductRecord; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.purchase.pojo.TicketRegistration; import com.ruoyi.purchase.service.IPurchaseLedgerService; import com.ruoyi.quality.mapper.*; import com.ruoyi.quality.pojo.*; import com.ruoyi.sales.dto.SalesLedgerImportDto; import com.ruoyi.sales.dto.SalesLedgerProductImportDto; import com.ruoyi.sales.mapper.*; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.quality.pojo.QualityInspectParam; import com.ruoyi.quality.pojo.QualityTestStandard; import com.ruoyi.quality.pojo.QualityTestStandardParam; import com.ruoyi.sales.mapper.CommonFileMapper; import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper; import com.ruoyi.sales.mapper.SalesLedgerMapper; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.pojo.CommonFile; import com.ruoyi.sales.pojo.InvoiceRegistrationProduct; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.service.impl.CommonFileServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FilenameUtils; import org.springframework.beans.BeanUtils; @@ -62,8 +62,8 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; import java.math.RoundingMode; import java.nio.file.Files; @@ -159,13 +159,43 @@ if (StringUtils.isNotBlank(purchaseLedger.getPurchaseContractNumber())) { queryWrapper.like(PurchaseLedger::getPurchaseContractNumber, purchaseLedger.getPurchaseContractNumber()); } if(purchaseLedger.getSupplierId()!=null){ if (purchaseLedger.getSupplierId() != null) { queryWrapper.eq(PurchaseLedger::getSupplierId, purchaseLedger.getSupplierId()); } if (purchaseLedger.getApprovalStatus() != null) { queryWrapper.eq(PurchaseLedger::getApprovalStatus, purchaseLedger.getApprovalStatus()); } return purchaseLedgerMapper.selectList(queryWrapper); if (StringUtils.isNotBlank(purchaseLedger.getSupplierName())) { queryWrapper.like(PurchaseLedger::getSupplierName, purchaseLedger.getSupplierName()); } if (StringUtils.isNotBlank(purchaseLedger.getSalesContractNo())) { queryWrapper.like(PurchaseLedger::getSalesContractNo, purchaseLedger.getSalesContractNo()); } if (StringUtils.isNotBlank(purchaseLedger.getProjectName())) { queryWrapper.like(PurchaseLedger::getProjectName, purchaseLedger.getProjectName()); } queryWrapper.orderByDesc(PurchaseLedger::getEntryDate); List<PurchaseLedger> list = purchaseLedgerMapper.selectList(queryWrapper); if (CollectionUtils.isNotEmpty(list)) { Set<Long> supplierIds = list.stream() .map(PurchaseLedger::getSupplierId) .filter(Objects::nonNull) .collect(Collectors.toSet()); if (!supplierIds.isEmpty()) { List<SupplierManage> suppliers = supplierManageMapper.selectBatchIds(supplierIds); Map<Long, Integer> typeMap = suppliers.stream() .collect(Collectors.toMap(SupplierManage::getId, SupplierManage::getSupplierType, (k1, k2) -> k1)); list.forEach(item -> { if (item.getSupplierId() != null) { item.setPurchaseType(typeMap.get(item.getSupplierId())); } }); } } return list; } @Override @@ -176,7 +206,10 @@ //å½å ¥äºº SysUser sysUser = userMapper.selectUserById(purchaseLedgerDto.getRecorderId()); SupplierManage supplierManage = supplierManageMapper.selectById(purchaseLedgerDto.getSupplierId()); SupplierManage supplierManage = null; if (purchaseLedgerDto.getSupplierId() != null) { supplierManage = supplierManageMapper.selectById(purchaseLedgerDto.getSupplierId()); } // DTO转Entity PurchaseLedger purchaseLedger = new PurchaseLedger(); @@ -187,7 +220,7 @@ } purchaseLedger.setSalesContractNo(ObjectUtils.isNotEmpty(salesLedger) ? salesLedger.getSalesContractNo() : ""); purchaseLedger.setSalesLedgerId(ObjectUtils.isNotEmpty(salesLedger) ? salesLedger.getId() : -1); purchaseLedger.setSupplierName(supplierManage.getSupplierName()); purchaseLedger.setSupplierName(supplierManage != null ? supplierManage.getSupplierName() : purchaseLedgerDto.getSupplierName()); purchaseLedger.setRecorderId(purchaseLedgerDto.getRecorderId()); purchaseLedger.setRecorderName(sysUser.getNickName()); purchaseLedger.setPhoneNumber(sysUser.getPhonenumber()); @@ -328,22 +361,29 @@ LocalDateTime localDateTime = entryDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); salesLedgerProduct.setRegisterDate(localDateTime); salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity()); salesLedgerProduct.setFutureTicketsAmount(salesLedgerProduct.getTaxInclusiveTotalPrice()); salesLedgerProduct.setPendingTicketsTotal(salesLedgerProduct.getTaxInclusiveTotalPrice()); if (Integer.valueOf(2).equals(purchaseLedger.getPurchaseType())) { salesLedgerProduct.setFutureTicketsAmount(salesLedgerProduct.getTotalPrice() != null ? salesLedgerProduct.getTotalPrice() : BigDecimal.ZERO); salesLedgerProduct.setPendingTicketsTotal(salesLedgerProduct.getTotalPrice() != null ? salesLedgerProduct.getTotalPrice() : BigDecimal.ZERO); } else { salesLedgerProduct.setFutureTicketsAmount(salesLedgerProduct.getTaxInclusiveTotalPrice()); salesLedgerProduct.setPendingTicketsTotal(salesLedgerProduct.getTaxInclusiveTotalPrice()); } salesLedgerProductMapper.insert(salesLedgerProduct); } } // è®¡ç®æ»å«ç¨éé¢ BigDecimal totalTaxInclusiveAmount = products.stream() .map(SalesLedgerProduct::getTaxInclusiveTotalPrice) // è®¡ç®æ»éé¢ BigDecimal totalAmount = products.stream() .map(p -> Integer.valueOf(2).equals(purchaseLedger.getPurchaseType()) ? (p.getTotalPrice() != null ? p.getTotalPrice() : BigDecimal.ZERO) : (p.getTaxInclusiveTotalPrice() != null ? p.getTaxInclusiveTotalPrice() : BigDecimal.ZERO)) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); // æ´æ°ä¸»è¡¨çæ»éé¢å段 if (salesLedgerId != null) { // ç´æ¥æ´æ°æå®IDçè®°å½çcontractAmountåæ®µä¸ºtotalTaxInclusiveAmount purchaseLedgerMapper.updateContractAmountById(salesLedgerId, totalTaxInclusiveAmount); // ç´æ¥æ´æ°æå®IDçè®°å½çcontractAmountåæ®µä¸ºtotalAmount purchaseLedgerMapper.updateContractAmountById(salesLedgerId, totalAmount); } } @@ -660,14 +700,14 @@ public AjaxResult importData(MultipartFile file) { LoginUser loginUser = SecurityUtils.getLoginUser(); try { InputStream inputStream = file.getInputStream(); byte[] fileBytes = file.getBytes(); ExcelUtil<PurchaseLedgerImportDto> salesLedgerImportDtoExcelUtil = new ExcelUtil<>(PurchaseLedgerImportDto.class); Map<String, List<PurchaseLedgerImportDto>> stringListMap = salesLedgerImportDtoExcelUtil.importExcelMultiSheet(Arrays.asList("éè´å°è´¦æ°æ®", "éè´äº§åæ°æ®"), inputStream, 0); if (CollectionUtils.isEmpty(stringListMap)) return AjaxResult.error("éè´è¡¨æ ¼ä¸ºç©ºï¼"); // ä¸å¡å±åå¹¶ List<PurchaseLedgerImportDto> salesLedgerImportDtoList = stringListMap.get("éè´å°è´¦æ°æ®"); // éè´å°è´¦æ°æ®ä¸è·³è¿æ é¢ List<PurchaseLedgerImportDto> salesLedgerImportDtoList = salesLedgerImportDtoExcelUtil.importExcel("éè´å°è´¦æ°æ®", new ByteArrayInputStream(fileBytes), 0); // éè´äº§åæ°æ®è·³è¿1è¡æ é¢ List<PurchaseLedgerImportDto> salesLedgerProductImportDtoList = salesLedgerImportDtoExcelUtil.importExcel("éè´äº§åæ°æ®", new ByteArrayInputStream(fileBytes), 1); if (CollectionUtils.isEmpty(salesLedgerImportDtoList)) return AjaxResult.error("éè´å°è´¦æ°æ®ä¸ºç©ºï¼"); List<PurchaseLedgerImportDto> salesLedgerProductImportDtoList = stringListMap.get("éè´äº§åæ°æ®"); if (CollectionUtils.isEmpty(salesLedgerProductImportDtoList)) return AjaxResult.error("éè´äº§åæ°æ®ä¸ºç©ºï¼"); // ä¾åºåæ°æ® List<SupplierManage> customers = supplierManageMapper.selectList(new LambdaQueryWrapper<SupplierManage>().in(SupplierManage::getSupplierName, @@ -685,12 +725,19 @@ } PurchaseLedger salesLedger = new PurchaseLedger(); BeanUtils.copyProperties(salesLedgerImportDto, salesLedger); // éè¿ä¾åºååç§°æ¥è¯¢ID salesLedger.setSupplierId(customers.stream() // æ¥è¯¢ä¾åºåæ¡£æ¡å¹¶è®¾ç½®éè´ç±»åï¼å¯¹å ¬1/对ç§2ï¼ SupplierManage matchedSupplier = customers.stream() .filter(customer -> customer.getSupplierName().equals(salesLedger.getSupplierName())) .findFirst() .map(SupplierManage::getId) .orElse(null)); .orElse(null); if (matchedSupplier != null) { salesLedger.setSupplierId(matchedSupplier.getId()); salesLedger.setPurchaseType(matchedSupplier.getSupplierType()); } else { salesLedger.setPurchaseType(1); // é»è®¤å¯¹å ¬ } Long aLong = sysUsers.stream() .filter(sysUser -> sysUser.getNickName().equals(salesLedger.getRecorderName())) .findFirst() @@ -699,15 +746,30 @@ if (aLong == null) throw new RuntimeException("å½å ¥äºº:" + salesLedger.getRecorderName() + ",æ 对åºç¨æ·ï¼"); salesLedger.setRecorderId(aLong); // éè´äº§åæ°æ®ç»å®ï¼éè¿éè´åå·è·å对åºéè´äº§åæ°æ® // éè´äº§åæ°æ®ç»å® List<PurchaseLedgerProductImportDto> salesLedgerProductImportDtos = salesLedgerProductImportDtoList.stream() .filter(salesLedgerProductImportDto -> salesLedgerProductImportDto.getPurchaseContractNumber().equals(salesLedger.getPurchaseContractNumber())) .collect(Collectors.toList()); if (CollectionUtils.isEmpty(salesLedgerProductImportDtos)) throw new RuntimeException("éè´åå·:" + salesLedgerImportDto.getPurchaseContractNumber() + ",æ 对åºäº§åæ°æ®ï¼"); boolean isPrivate = Integer.valueOf(2).equals(salesLedger.getPurchaseType()); // ç»ä¸è®¡ç®ä¸»è¡¨ååéé¢ salesLedger.setContractAmount(salesLedgerProductImportDtos.stream() .map(PurchaseLedgerProductImportDto::getTaxInclusiveTotalPrice) .reduce(BigDecimal.ZERO,BigDecimal::add)); .map(dto -> { if (isPrivate) { if (dto.getTotalPrice() != null) return dto.getTotalPrice(); BigDecimal up = dto.getUnitPrice() != null ? dto.getUnitPrice() : BigDecimal.ZERO; BigDecimal qty = dto.getQuantity() != null ? dto.getQuantity() : BigDecimal.ZERO; return up.multiply(qty); } else { return dto.getTaxInclusiveTotalPrice() != null ? dto.getTaxInclusiveTotalPrice() : BigDecimal.ZERO; } }) .reduce(BigDecimal.ZERO, BigDecimal::add)); // éè¿éå®åå·ç»å®éå® SalesLedger salesLedger1 = salesLedgerMapper.selectOne(new LambdaQueryWrapper<SalesLedger>() .eq(SalesLedger::getSalesContractNo, salesLedger.getSalesContractNo()) @@ -719,8 +781,8 @@ // éè¿æµç§°è·åç¨æ·ID String[] split = salesLedger.getApproveUserIds().split("ï¼"); List<Long> ids = new ArrayList<>(); for (int i = 0; i < split.length; i++) { SysUser sysUser = sysUserMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getNickName, split[i]) for (String s : split) { SysUser sysUser = sysUserMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getNickName, s) .last("LIMIT 1")); if (sysUser != null) { ids.add(sysUser.getUserId()); @@ -736,10 +798,48 @@ BeanUtils.copyProperties(salesLedgerProductImportDto, salesLedgerProduct); salesLedgerProduct.setSalesLedgerId(salesLedger.getId()); salesLedgerProduct.setType(2); // 计ç®ä¸å«ç¨æ»ä»· salesLedgerProduct.setTaxExclusiveTotalPrice(salesLedgerProduct.getTaxInclusiveTotalPrice().divide(new BigDecimal(1).add(salesLedgerProduct.getTaxRate().divide(new BigDecimal(100))), 2, RoundingMode.HALF_UP)); // æªæ¥ç¥¨æ°é salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity()); salesLedgerProduct.setFutureTicketsAmount(salesLedgerProduct.getTaxExclusiveTotalPrice()); if (isPrivate) { // 对ç§éè´é»è¾ if (salesLedgerProduct.getTotalPrice() == null && salesLedgerProduct.getUnitPrice() != null && salesLedgerProduct.getQuantity() != null) { salesLedgerProduct.setTotalPrice(salesLedgerProduct.getUnitPrice().multiply(salesLedgerProduct.getQuantity())); } BigDecimal tp = salesLedgerProduct.getTotalPrice() != null ? salesLedgerProduct.getTotalPrice() : BigDecimal.ZERO; salesLedgerProduct.setTaxInclusiveTotalPrice(tp); salesLedgerProduct.setTaxExclusiveTotalPrice(salesLedgerProduct.getUnitPrice() != null ? salesLedgerProduct.getUnitPrice().multiply(salesLedgerProduct.getQuantity()) : tp); // ç»ä¸éé¢ salesLedgerProduct.setFutureTicketsAmount(tp); salesLedgerProduct.setPendingTicketsTotal(tp); salesLedgerProduct.setTaxRate(null); salesLedgerProduct.setTaxInclusiveUnitPrice(null); salesLedgerProduct.setInvoiceType(null); } else { // å¯¹å ¬éè´é»è¾ // è¡¥å ¨ä¸å«ç¨æ»ä»· if (salesLedgerProduct.getTaxInclusiveTotalPrice() != null && salesLedgerProduct.getTaxRate() != null) { salesLedgerProduct.setTaxExclusiveTotalPrice( salesLedgerProduct.getTaxInclusiveTotalPrice() .divide(new BigDecimal(1).add(salesLedgerProduct.getTaxRate().divide(new BigDecimal(100))), 2, RoundingMode.HALF_UP) ); } // å¯¹å ¬ç»ä¸ä½¿ç¨å«ç¨æ»ä»· BigDecimal titp = salesLedgerProduct.getTaxInclusiveTotalPrice() != null ? salesLedgerProduct.getTaxInclusiveTotalPrice() : BigDecimal.ZERO; salesLedgerProduct.setFutureTicketsAmount(titp); salesLedgerProduct.setPendingTicketsTotal(titp); salesLedgerProduct.setUnitPrice(null); salesLedgerProduct.setTotalPrice(null); } // å¹é 产åç§ç±»åè§æ ¼åå·æ å°ID list.stream() .filter(map -> map.get("productName").equals(salesLedgerProduct.getProductCategory()) && map.get("model").equals(salesLedgerProduct.getSpecificationModel())) .findFirst() @@ -747,13 +847,15 @@ salesLedgerProduct.setProductModelId(Long.parseLong(map.get("modelId").toString())); salesLedgerProduct.setProductId(Long.parseLong(map.get("id").toString())); }); // å¡«å ç»è®°ä¿¡æ¯ salesLedgerProduct.setRegister(loginUser.getNickName()); salesLedgerProduct.setRegisterDate(LocalDateTime.now()); salesLedgerProduct.setApproveStatus(0); salesLedgerProduct.setPendingTicketsTotal(salesLedgerProductImportDto.getTaxInclusiveTotalPrice()); // æ¯å¦è´¨æ£å¤æ salesLedgerProduct.setIsChecked(salesLedgerProductImportDto.getIsChecked() == 1); if(salesLedgerProductImportDto.getIsChecked() == 1){ salesLedgerProduct.setIsChecked(salesLedgerProductImportDto.getIsChecked() != null && salesLedgerProductImportDto.getIsChecked() == 1); if(salesLedgerProduct.getIsChecked()){ addQualityInspect(salesLedger, salesLedgerProduct); } salesLedgerProductMapper.insert(salesLedgerProduct); @@ -764,9 +866,9 @@ return AjaxResult.success("å¯¼å ¥æå"); } catch (Exception e) { e.printStackTrace(); log.error("å¯¼å ¥å¤±è´¥ï¼", e); throw new RuntimeException("å¯¼å ¥æ°æ®è¿ç¨ä¸åçäºé误ï¼" + e.getMessage()); } return AjaxResult.success("å¯¼å ¥å¤±è´¥"); } @Override src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
@@ -58,4 +58,10 @@ @ApiModelProperty(value = "äº¤è´§æ¥æ") private LocalDate deliveryDate; @ApiModelProperty(value = "客æ·åç±»") private String customerType; @ApiModelProperty(value = "å°è´¦åç±»") private Integer salesType; } src/main/java/com/ruoyi/sales/dto/SalesLedgerImportDto.java
@@ -1,17 +1,11 @@ package com.ruoyi.sales.dto; import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import com.ruoyi.sales.pojo.CommonFile; import com.ruoyi.sales.pojo.SalesLedgerProduct; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDate; import java.util.Date; import java.util.List; /** * @author :yys @@ -47,5 +41,7 @@ @Excel(name = "仿¬¾æ¹å¼") private String paymentMethod; @ApiModelProperty(value = "å°è´¦åç±»") @Excel(name = "å°è´¦åç±»") private Integer salesType; } src/main/java/com/ruoyi/sales/dto/SalesLedgerProductImportDto.java
@@ -1,12 +1,9 @@ package com.ruoyi.sales.dto; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import lombok.Data; import java.math.BigDecimal; import java.util.Date; /** * @author :yys @@ -73,6 +70,18 @@ @Excel(name = "æ¯å¦è´¨æ£", readConverterExp = "0=å¦,1=æ¯") private Boolean isChecked; @Excel(name = "åä»·") private BigDecimal unitPrice; @Excel(name = "æ»ä»·") private BigDecimal totalPrice; @Excel(name = "è¿è´¹") private BigDecimal freight = BigDecimal.ZERO; @Excel(name = "å«è¿è´¹åä»·") private BigDecimal priceWithFreight; } src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -1,15 +1,15 @@ package com.ruoyi.sales.pojo; import java.math.BigDecimal; import java.time.LocalDate; import java.util.Date; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDate; import java.util.Date; /** * éå®å°è´¦å¯¹è±¡ sales_ledger @@ -147,5 +147,13 @@ @TableField(exist = false) //æ¯å¦å¯ç¼è¾ private Boolean isEdit; @TableField(exist = false) @ApiModelProperty(value = "客æ·åç±»") private String customerType; @ApiModelProperty(value = "å°è´¦åç±»") @Excel(name = "å°è´¦åç±»") private Integer salesType; } src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -243,4 +243,32 @@ // å¯ç¨æ°é quantity - returnQuality @TableField(exist = false) private BigDecimal availableQuality; /** * åä»·ï¼å¯¹ç§ä¸ç¨ï¼ */ @ApiModelProperty(value = "åä»·ï¼å¯¹ç§ä¸ç¨ï¼") @Excel(name = "åä»·ï¼å¯¹ç§ï¼") private BigDecimal unitPrice; /** * æ»ä»·ï¼å¯¹ç§ä¸ç¨ï¼ */ @ApiModelProperty(value = "æ»ä»·ï¼å¯¹ç§ä¸ç¨ï¼") @Excel(name = "æ»ä»·ï¼å¯¹ç§ï¼") private BigDecimal totalPrice; /** * è¿è´¹ */ @ApiModelProperty(value = "è¿è´¹") @Excel(name = "è¿è´¹") private BigDecimal freight = BigDecimal.ZERO; /** * å«è¿è´¹åä»· */ @ApiModelProperty(value = "å«è¿è´¹åä»·") @Excel(name = "å«è¿è´¹åä»·") private BigDecimal priceWithFreight; } src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -6,8 +6,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.framework.web.domain.R; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.production.dto.ProductStructureDto; @@ -42,7 +42,10 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.function.Function; import java.util.stream.Collectors; @@ -171,10 +174,9 @@ } // å¯è½å±äºå¤ä¸ªä¸»è¡¨ Set<Long> mainIds = deletedProducts.stream() .map(SalesLedgerProduct::getSalesLedgerId) .filter(Objects::nonNull) .collect(Collectors.toSet()); Map<Long, Integer> mainIdTypeMap = deletedProducts.stream() .filter(p -> p.getSalesLedgerId() != null) .collect(Collectors.toMap(SalesLedgerProduct::getSalesLedgerId, SalesLedgerProduct::getType, (existing, replacement) -> existing)); // 2. æ§è¡å é¤æä½ int result = salesLedgerProductMapper.deleteBatchIds(Arrays.asList(ids)); @@ -182,19 +184,44 @@ deleteProductionData(Arrays.asList(ids)); // 3. 对æ¯ä¸ªä¸»è¡¨IDè¿è¡é颿´æ° for (Long salesLedgerId : mainIds) { for (Map.Entry<Long, Integer> entry : mainIdTypeMap.entrySet()) { Long salesLedgerId = entry.getKey(); Integer type = entry.getValue(); LambdaQueryWrapper<SalesLedgerProduct> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerId); wrapper.eq(SalesLedgerProduct::getType, type); List<SalesLedgerProduct> remainingProducts = salesLedgerProductMapper.selectList(wrapper); // è°ç¨éç¨æ¹æ³æ´æ°ä¸»è¡¨éé¢ updateMainContractAmount( salesLedgerId, remainingProducts, SalesLedgerProduct::getTaxInclusiveTotalPrice, salesLedgerMapper, SalesLedger.class ); if (type == 1) { SalesLedger salesLedger = salesLedgerMapper.selectById(salesLedgerId); if (salesLedger != null) { Function<SalesLedgerProduct, BigDecimal> amountGetter = Integer.valueOf(2).equals(salesLedger.getSalesType()) ? p -> p.getTotalPrice() != null ? p.getTotalPrice() : BigDecimal.ZERO : p -> p.getTaxInclusiveTotalPrice() != null ? p.getTaxInclusiveTotalPrice() : BigDecimal.ZERO; updateMainContractAmount( salesLedgerId, remainingProducts, amountGetter, salesLedgerMapper, SalesLedger.class ); } } else { PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(salesLedgerId); if (purchaseLedger != null) { Function<SalesLedgerProduct, BigDecimal> amountGetter = Integer.valueOf(2).equals(purchaseLedger.getPurchaseType()) ? p -> p.getTotalPrice() != null ? p.getTotalPrice() : BigDecimal.ZERO : p -> p.getTaxInclusiveTotalPrice() != null ? p.getTaxInclusiveTotalPrice() : BigDecimal.ZERO; updateMainContractAmount( salesLedgerId, remainingProducts, amountGetter, purchaseLedgerMapper, PurchaseLedger.class ); } } } return result; } @@ -202,21 +229,86 @@ @Override @Transactional(rollbackFor = Exception.class) public int addOrUpdateSalesLedgerProduct(SalesLedgerProduct salesLedgerProduct) { if (salesLedgerProduct.getId() != null) { SalesLedgerProduct dbProduct = salesLedgerProductMapper.selectById(salesLedgerProduct.getId()); if (dbProduct != null) { if (salesLedgerProduct.getSalesLedgerId() == null) { salesLedgerProduct.setSalesLedgerId(dbProduct.getSalesLedgerId()); } if (salesLedgerProduct.getType() == null) { salesLedgerProduct.setType(dbProduct.getType()); } if (salesLedgerProduct.getInvoiceTotal() == null) { salesLedgerProduct.setInvoiceTotal(dbProduct.getInvoiceTotal()); } if (salesLedgerProduct.getTicketsTotal() == null) { salesLedgerProduct.setTicketsTotal(dbProduct.getTicketsTotal()); } if (salesLedgerProduct.getQuantity() == null) { salesLedgerProduct.setQuantity(dbProduct.getQuantity()); } if (salesLedgerProduct.getTotalPrice() == null) { salesLedgerProduct.setTotalPrice(dbProduct.getTotalPrice()); } if (salesLedgerProduct.getTaxInclusiveTotalPrice() == null) { salesLedgerProduct.setTaxInclusiveTotalPrice(dbProduct.getTaxInclusiveTotalPrice()); } if (salesLedgerProduct.getTaxExclusiveTotalPrice() == null) { salesLedgerProduct.setTaxExclusiveTotalPrice(dbProduct.getTaxExclusiveTotalPrice()); } if (salesLedgerProduct.getTaxRate() == null) { salesLedgerProduct.setTaxRate(dbProduct.getTaxRate()); } if (salesLedgerProduct.getUnitPrice() == null) { salesLedgerProduct.setUnitPrice(dbProduct.getUnitPrice()); } if (salesLedgerProduct.getFreight() == null) { salesLedgerProduct.setFreight(dbProduct.getFreight()); } if (salesLedgerProduct.getPriceWithFreight() == null) { salesLedgerProduct.setPriceWithFreight(dbProduct.getPriceWithFreight()); } } } Long salesLedgerId = salesLedgerProduct.getSalesLedgerId(); SalesLedger salesLedger = null; PurchaseLedger purchaseLedger = null; boolean isPrivate = false; if (salesLedgerProduct.getType() != null && salesLedgerProduct.getType().equals(1)) { salesLedger = salesLedgerMapper.selectById(salesLedgerId); if (salesLedger != null && Integer.valueOf(2).equals(salesLedger.getSalesType())) { isPrivate = true; } } else { purchaseLedger = purchaseLedgerMapper.selectById(salesLedgerId); if (purchaseLedger != null && Integer.valueOf(2).equals(purchaseLedger.getPurchaseType())) { isPrivate = true; } } BigDecimal totalPrice = isPrivate ? (salesLedgerProduct.getTotalPrice() != null ? salesLedgerProduct.getTotalPrice() : BigDecimal.ZERO) : (salesLedgerProduct.getTaxInclusiveTotalPrice() != null ? salesLedgerProduct.getTaxInclusiveTotalPrice() : BigDecimal.ZERO); BigDecimal invoiceTotal = salesLedgerProduct.getInvoiceTotal() != null ? salesLedgerProduct.getInvoiceTotal() : BigDecimal.ZERO; BigDecimal ticketsTotal = salesLedgerProduct.getTicketsTotal() != null ? salesLedgerProduct.getTicketsTotal() : BigDecimal.ZERO; // å¾ åæ¬¾ï¼ä»æ¬¾ if(salesLedgerProduct.getType().equals(1)){ salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice().subtract(salesLedgerProduct.getInvoiceTotal())); salesLedgerProduct.setPendingInvoiceTotal(totalPrice.subtract(invoiceTotal)); //æªå¼ç¥¨æ°é+éé¢ salesLedgerProduct.setNoInvoiceNum(salesLedgerProduct.getQuantity()); salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxInclusiveTotalPrice()); salesLedgerProduct.setNoInvoiceAmount(totalPrice); }else{ salesLedgerProduct.setPendingTicketsTotal(salesLedgerProduct.getTaxInclusiveTotalPrice().subtract(salesLedgerProduct.getTicketsTotal())); salesLedgerProduct.setPendingTicketsTotal(totalPrice.subtract(ticketsTotal)); // æªæ¥ç¥¨æ°é+éé¢ salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity()); salesLedgerProduct.setFutureTicketsAmount(salesLedgerProduct.getTaxInclusiveTotalPrice()); salesLedgerProduct.setFutureTicketsAmount(totalPrice); } int result; Long salesLedgerId = salesLedgerProduct.getSalesLedgerId(); if (salesLedgerProduct.getId() == null) { salesLedgerProduct.setRegisterDate(LocalDateTime.now()); result = salesLedgerProductMapper.insert(salesLedgerProduct); @@ -239,12 +331,17 @@ wrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerId) .eq(SalesLedgerProduct::getType, salesLedgerProduct.getType()); List<SalesLedgerProduct> productList = salesLedgerProductMapper.selectList(wrapper); Function<SalesLedgerProduct, BigDecimal> amountGetter = isPrivate ? p -> p.getTotalPrice() != null ? p.getTotalPrice() : BigDecimal.ZERO : p -> p.getTaxInclusiveTotalPrice() != null ? p.getTaxInclusiveTotalPrice() : BigDecimal.ZERO; if (salesLedgerProduct.getType() == 1) { // è°ç¨éç¨æ¹æ³æ´æ°ä¸»è¡¨éé¢ updateMainContractAmount( salesLedgerId, productList, SalesLedgerProduct::getTaxInclusiveTotalPrice, amountGetter, salesLedgerMapper, SalesLedger.class ); @@ -253,7 +350,7 @@ updateMainContractAmount( salesLedgerId, productList, SalesLedgerProduct::getTaxInclusiveTotalPrice, amountGetter, purchaseLedgerMapper, PurchaseLedger.class ); @@ -337,6 +434,9 @@ * å é¤çäº§æ°æ® */ public void deleteProductionData(List<Long> productIds) { if (productIds == null || productIds.isEmpty()){ return; } //æ¹éæ¥è¯¢productOrder List<ProductOrder> productOrders = productOrderMapper.selectList( new LambdaQueryWrapper<ProductOrder>() src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -15,6 +15,7 @@ import com.ruoyi.basic.pojo.Customer; import com.ruoyi.common.enums.FileNameType; import com.ruoyi.common.enums.SaleEnum; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.EnumUtil; @@ -51,8 +52,8 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; import java.math.BigDecimal; import java.math.RoundingMode; @@ -343,14 +344,14 @@ public AjaxResult importData(MultipartFile file) { LoginUser loginUser = SecurityUtils.getLoginUser(); try { InputStream inputStream = file.getInputStream(); byte[] fileBytes = file.getBytes(); ExcelUtil<SalesLedgerImportDto> salesLedgerImportDtoExcelUtil = new ExcelUtil<>(SalesLedgerImportDto.class); Map<String, List<SalesLedgerImportDto>> stringListMap = salesLedgerImportDtoExcelUtil.importExcelMultiSheet(Arrays.asList("éå®å°è´¦æ°æ®", "éå®äº§åæ°æ®"), inputStream, 0); if (CollectionUtils.isEmpty(stringListMap)) return AjaxResult.error("éå®è¡¨æ ¼ä¸ºç©ºï¼"); // ä¸å¡å±åå¹¶ List<SalesLedgerImportDto> salesLedgerImportDtoList = stringListMap.get("éå®å°è´¦æ°æ®"); // éå®å°è´¦æ°æ®ä¸è·³è¿æ é¢ List<SalesLedgerImportDto> salesLedgerImportDtoList = salesLedgerImportDtoExcelUtil.importExcel("éå®å°è´¦æ°æ®", new ByteArrayInputStream(fileBytes), 0); // éå®äº§åæ°æ®è·³è¿1è¡æ é¢ List<SalesLedgerImportDto> salesLedgerProductImportDtoList = salesLedgerImportDtoExcelUtil.importExcel("éå®äº§åæ°æ®", new ByteArrayInputStream(fileBytes), 1); if (CollectionUtils.isEmpty(salesLedgerImportDtoList)) return AjaxResult.error("éå®å°è´¦æ°æ®ä¸ºç©ºï¼"); List<SalesLedgerImportDto> salesLedgerProductImportDtoList = stringListMap.get("éå®äº§åæ°æ®"); if (CollectionUtils.isEmpty(salesLedgerProductImportDtoList)) return AjaxResult.error("éå®äº§åæ°æ®ä¸ºç©ºï¼"); // å®¢æ·æ°æ® List<Customer> customers = customerMapper.selectList(new LambdaQueryWrapper<Customer>().in(Customer::getCustomerName, @@ -376,16 +377,20 @@ BeanUtils.copyProperties(salesLedgerImportDto, salesLedger); salesLedger.setExecutionDate(DateUtils.toLocalDate(salesLedgerImportDto.getExecutionDate())); // éè¿å®¢æ·åç§°æ¥è¯¢å®¢æ·IDï¼å®¢æ·ååå· salesLedger.setCustomerId(customers.stream() // æ¥è¯¢å®¢æ·æ¡£æ¡å¹¶è®¾ç½®éå®ç±»åï¼å¯¹å ¬1/对ç§2ï¼ Customer matchedCustomer = customers.stream() .filter(customer -> customer.getCustomerName().equals(salesLedger.getCustomerName())) .findFirst() .map(Customer::getId) .orElse(null)); salesLedger.setCustomerContractNo(customers.stream() .filter(customer -> customer.getCustomerName().equals(salesLedger.getCustomerName())) .findFirst() .map(Customer::getTaxpayerIdentificationNumber) .orElse(null)); .orElse(null); if (matchedCustomer != null) { salesLedger.setCustomerId(matchedCustomer.getId()); salesLedger.setSalesType(matchedCustomer.getCustomerType()); salesLedger.setCustomerContractNo(matchedCustomer.getTaxpayerIdentificationNumber()); } else { salesLedger.setSalesType(1); } Long aLong = sysUsers.stream() .filter(sysUser -> sysUser.getNickName().equals(salesLedger.getEntryPerson())) .findFirst() @@ -394,14 +399,30 @@ if (aLong == null) throw new RuntimeException("å½å ¥äºº:" + salesLedger.getEntryPerson() + ",æ 对åºç¨æ·ï¼"); salesLedger.setEntryPerson(aLong.toString()); // éå®äº§åæ°æ®ç»å®ï¼éè¿éå®åå·è·å对åºéå®äº§åæ°æ® // éå®äº§åæ°æ®ç»å® List<SalesLedgerProductImportDto> salesLedgerProductImportDtos = salesLedgerProductImportDtoList.stream() .filter(salesLedgerProductImportDto -> salesLedgerProductImportDto.getSalesContractNo().equals(salesLedger.getSalesContractNo())) .collect(Collectors.toList()); if (CollectionUtils.isEmpty(salesLedgerProductImportDtos)) throw new RuntimeException("éå®åå·:" + salesLedgerImportDto.getSalesContractNo() + ",æ 对åºäº§åæ°æ®ï¼"); boolean isPrivate = Integer.valueOf(2).equals(salesLedger.getSalesType()); // ç»ä¸è®¡ç®ååæ»éé¢ salesLedger.setContractAmount(salesLedgerProductImportDtos.stream() .map(SalesLedgerProductImportDto::getTaxInclusiveTotalPrice) .map(dto -> { if (isPrivate) { if (dto.getTotalPrice() != null) return dto.getTotalPrice(); BigDecimal up = dto.getUnitPrice() != null ? dto.getUnitPrice() : BigDecimal.ZERO; BigDecimal fr = dto.getFreight() != null ? dto.getFreight() : BigDecimal.ZERO; BigDecimal qty = dto.getQuantity() != null ? dto.getQuantity() : BigDecimal.ZERO; return up.add(fr).multiply(qty); } else { return dto.getTaxInclusiveTotalPrice() != null ? dto.getTaxInclusiveTotalPrice() : BigDecimal.ZERO; } }) .reduce(BigDecimal.ZERO, BigDecimal::add)); salesLedgerMapper.insert(salesLedger); @@ -411,10 +432,54 @@ BeanUtils.copyProperties(salesLedgerProductImportDto, salesLedgerProduct); salesLedgerProduct.setSalesLedgerId(salesLedger.getId()); salesLedgerProduct.setType(1); // 计ç®ä¸å«ç¨æ»ä»· salesLedgerProduct.setTaxExclusiveTotalPrice(salesLedgerProduct.getTaxInclusiveTotalPrice().divide(new BigDecimal(1).add(salesLedgerProduct.getTaxRate().divide(new BigDecimal(100))), 2, RoundingMode.HALF_UP)); salesLedgerProduct.setNoInvoiceNum(salesLedgerProduct.getQuantity()); salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxExclusiveTotalPrice()); if (isPrivate) { // 对ç§ä¸å¡ if (salesLedgerProduct.getFreight() == null) salesLedgerProduct.setFreight(BigDecimal.ZERO); if (salesLedgerProduct.getUnitPrice() != null && salesLedgerProduct.getQuantity() != null) { if (salesLedgerProduct.getPriceWithFreight() == null) { salesLedgerProduct.setPriceWithFreight(salesLedgerProduct.getUnitPrice().add(salesLedgerProduct.getFreight())); } if (salesLedgerProduct.getTotalPrice() == null) { salesLedgerProduct.setTotalPrice(salesLedgerProduct.getPriceWithFreight().multiply(salesLedgerProduct.getQuantity())); } } BigDecimal tp = salesLedgerProduct.getTotalPrice() != null ? salesLedgerProduct.getTotalPrice() : BigDecimal.ZERO; salesLedgerProduct.setTaxInclusiveTotalPrice(tp); salesLedgerProduct.setTaxExclusiveTotalPrice(salesLedgerProduct.getUnitPrice() != null ? salesLedgerProduct.getUnitPrice().multiply(salesLedgerProduct.getQuantity()) : tp); // 使ç¨å«è¿è´¹æ»ä»· salesLedgerProduct.setNoInvoiceAmount(tp); salesLedgerProduct.setPendingInvoiceTotal(tp); salesLedgerProduct.setTaxRate(null); salesLedgerProduct.setTaxInclusiveUnitPrice(null); salesLedgerProduct.setInvoiceType(null); } else { // å¯¹å ¬ä¸å¡é»è¾ if (salesLedgerProduct.getTaxInclusiveTotalPrice() != null && salesLedgerProduct.getTaxRate() != null) { salesLedgerProduct.setTaxExclusiveTotalPrice( salesLedgerProduct.getTaxInclusiveTotalPrice() .divide(new BigDecimal(1).add(salesLedgerProduct.getTaxRate().divide(new BigDecimal(100))), 2, RoundingMode.HALF_UP) ); } // å¯¹å ¬ä½¿ç¨å«ç¨æ»ä»· BigDecimal titp = salesLedgerProduct.getTaxInclusiveTotalPrice() != null ? salesLedgerProduct.getTaxInclusiveTotalPrice() : BigDecimal.ZERO; salesLedgerProduct.setNoInvoiceAmount(titp); salesLedgerProduct.setPendingInvoiceTotal(titp); salesLedgerProduct.setUnitPrice(null); salesLedgerProduct.setTotalPrice(null); salesLedgerProduct.setFreight(BigDecimal.ZERO); salesLedgerProduct.setPriceWithFreight(null); } // å¹é 产åç§ç±»åè§æ ¼åå·æ å°ID list.stream() .filter(map -> map.get("productName").equals(salesLedgerProduct.getProductCategory()) && map.get("model").equals(salesLedgerProduct.getSpecificationModel())) .findFirst() @@ -422,20 +487,12 @@ salesLedgerProduct.setProductModelId(Long.parseLong(map.get("modelId").toString())); salesLedgerProduct.setProductId(Long.parseLong(map.get("id").toString())); }); // salesLedgerProduct.setProductId(productList.stream() // .filter(product -> product.getProductName().equals(salesLedgerProduct.getProductCategory())) // .findFirst() // .map(Product::getId) // .orElse(null)); // salesLedgerProduct.setProductModelId(productModels.stream() // .filter(productModel -> productModel.getModel().equals(salesLedgerProduct.getSpecificationModel())) // .findFirst() // .map(ProductModel::getId) // .orElse(null)); // å¡«å ç»è®°ä¿¡æ¯ salesLedgerProduct.setRegister(loginUser.getNickName()); salesLedgerProduct.setRegisterDate(LocalDateTime.now()); salesLedgerProduct.setApproveStatus(0); salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProductImportDto.getTaxInclusiveTotalPrice()); salesLedgerProductMapper.insert(salesLedgerProduct); // æ·»å çäº§æ°æ® salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct); @@ -444,9 +501,9 @@ return AjaxResult.success("å¯¼å ¥æå"); } catch (Exception e) { e.printStackTrace(); log.error("å¯¼å ¥å¤±è´¥ï¼", e); throw new RuntimeException("å¯¼å ¥æ°æ®è¿ç¨ä¸åçäºé误ï¼" + e.getMessage()); } return AjaxResult.success("å¯¼å ¥å¤±è´¥"); } @Override @@ -612,16 +669,23 @@ // 4. å¤çåè¡¨æ°æ® List<SalesLedgerProduct> productList = salesLedgerDto.getProductData(); if (productList != null && !productList.isEmpty()) { handleSalesLedgerProducts(salesLedger.getId(), productList, EnumUtil.fromCode(SaleEnum.class, salesLedgerDto.getType())); if (productList == null || productList.isEmpty()){ throw new ServiceException("æ°å¢/ä¿®æ¹å¤±è´¥,éå®äº§åä¸è½ä¸ºç©º"); } handleSalesLedgerProducts(salesLedger.getId(), productList, EnumUtil.fromCode(SaleEnum.class, salesLedgerDto.getType()), salesLedger.getSalesType()); Function<SalesLedgerProduct, BigDecimal> amountGetter = Integer.valueOf(2).equals(salesLedger.getSalesType()) ? p -> p.getTotalPrice() != null ? p.getTotalPrice() : BigDecimal.ZERO : p -> p.getTaxInclusiveTotalPrice() != null ? p.getTaxInclusiveTotalPrice() : BigDecimal.ZERO; updateMainContractAmount( salesLedger.getId(), productList, SalesLedgerProduct::getTaxInclusiveTotalPrice, amountGetter, salesLedgerMapper, SalesLedger.class ); } // 5. è¿ç§»ä¸´æ¶æä»¶å°æ£å¼ç®å½ if (salesLedgerDto.getTempFileIds() != null && !salesLedgerDto.getTempFileIds().isEmpty()) { @@ -712,6 +776,10 @@ @Override public void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, SaleEnum type) { handleSalesLedgerProducts(salesLedgerId, products, type, 1); } public void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, SaleEnum type, Integer salesType) { // æIDåç»ï¼åºåæ°å¢åæ´æ°çè®°å½ Map<Boolean, List<SalesLedgerProduct>> partitionedProducts = products.stream() .peek(p -> p.setSalesLedgerId(salesLedgerId)) @@ -732,11 +800,16 @@ for (SalesLedgerProduct salesLedgerProduct : insertList) { salesLedgerProduct.setType(type.getCode()); salesLedgerProduct.setNoInvoiceNum(salesLedgerProduct.getQuantity()); salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxInclusiveTotalPrice()); salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice()); if (Integer.valueOf(2).equals(salesType)) { salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTotalPrice() != null ? salesLedgerProduct.getTotalPrice() : BigDecimal.ZERO); salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProduct.getTotalPrice() != null ? salesLedgerProduct.getTotalPrice() : BigDecimal.ZERO); } else { salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxInclusiveTotalPrice()); salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice()); } salesLedgerProductMapper.insert(salesLedgerProduct); // æ·»å çäº§æ°æ® salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct); // salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct); } } } src/main/resources/mapper/basic/SupplierManageMapper.xml
@@ -4,7 +4,7 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.basic.mapper.SupplierManageMapper"> <select id="supplierListPage" resultType="com.ruoyi.basic.dto.SupplierManageDto"> <select id="supplierListPage" resultType="com.ruoyi.basic.pojo.SupplierManage"> SELECT T1.id, T1.supplier_name, @@ -41,6 +41,7 @@ SELECT T1.id, T1.supplier_name, T1.supplier_type, T1.taxpayer_identification_num, T1.company_address, T1.company_phone, src/main/resources/mapper/production/ProductionProductMainMapper.xml
@@ -22,8 +22,7 @@ pm.model as productModelName, ppo.quantity, ppo.scrap_qty, pm.unit, sl.sales_contract_no salesContractNo pm.unit from production_product_main ppm left join product_work_order pwo on pwo.id = ppm.work_order_id @@ -33,7 +32,6 @@ left join production_product_output ppo on ppm.id = ppo.product_main_id left join product_model pm on pm.id = ppo.product_model_id left join product p on p.id = pm.product_id left join sales_ledger sl on sl.id = po.sales_ledger_id left join sys_user u on u.user_id = ppm.user_id <where> <if test="c.nickName != null and c.nickName != ''"> src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
@@ -28,6 +28,7 @@ pl.template_name, pl.approve_user_ids, sm.is_white, sm.supplier_type AS supplierType, pl.approval_status, pl.payment_method, pl.remarks @@ -65,8 +66,8 @@ <if test="c.supplierId != null"> AND pl.supplier_id = #{c.supplierId} </if> <if test="c.approvalStatus != null"> AND pl.approval_status = #{c.approvalStatus} <if test="c.supplierType != null"> AND sm.supplier_type = #{c.supplierType} </if> </where> ORDER BY pl.entry_date DESC src/main/resources/mapper/purchase/PurchaseLedgerTemplateMapper.xml
@@ -24,6 +24,7 @@ <result column="payment_method" property="paymentMethod" /> <result column="execution_date" property="executionDate" /> <result column="template_name" property="templateName" /> <result column="template_type" property="templateType" /> </resultMap> </mapper> src/main/resources/mapper/sales/SalesLedgerMapper.xml
@@ -43,7 +43,8 @@ </select> <select id="selectSalesLedgerListPage" resultType="com.ruoyi.sales.pojo.SalesLedger"> SELECT T1.id, SELECT T1.id, T1.sales_contract_no, T1.customer_contract_no, T1.project_name, @@ -56,12 +57,13 @@ 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, T3.customer_type AS customerType, CASE WHEN shipping_status_counts.total_count = 0 THEN false WHEN shipping_status_counts.unshipped_count = 0 THEN true @@ -69,6 +71,7 @@ END AS is_fh FROM sales_ledger T1 LEFT JOIN sys_user T2 ON T1.entry_person = T2.user_id LEFT JOIN customer T3 ON T1.customer_id = T3.id LEFT JOIN ( SELECT sales_ledger_id, COUNT(*) as total_count, @@ -78,25 +81,28 @@ ) 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> <if test="salesLedgerDto.customerType != null and salesLedgerDto.customerType != '' "> AND T3.customer_type = #{salesLedgerDto.customerType} </if> </where> order by T1.entry_date desc ORDER BY T1.entry_date DESC </select> <select id="selectIncomeStats" resultType="com.ruoyi.home.dto.IncomeExpenseAnalysisDto"> src/main/resources/static/²É¹ºÌ¨Õ˵¼ÈëÄ£°å.xlsxBinary files differ
src/main/resources/static/ÏúÊŲ̂Õ˵¼ÈëÄ£°å.xlsxBinary files differ