src/main/java/com/ruoyi/CodeGenerator.java
@@ -19,11 +19,11 @@ // æ¼ç¤ºä¾åï¼æ§è¡ main æ¹æ³æ§å¶å°è¾å ¥æ¨¡å表åå车èªå¨çæå¯¹åºé¡¹ç®ç®å½ä¸ public class CodeGenerator { public static String database_url = "jdbc:mysql://127.0.0.1:3306/product-inventory-management"; public static String database_url = "jdbc:mysql://127.0.0.1:3306/product-inventory-management-new"; public static String database_username = "root"; public static String database_password= "123456"; public static String author = "è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸"; public static String model = "quality"; // 模å public static String model = "account"; // 模å public static String setParent = "com.ruoyi."+ model; // å è·¯å¾ public static String tablePrefix = ""; // è®¾ç½®è¿æ»¤è¡¨åç¼ public static void main(String[] args) { src/main/java/com/ruoyi/account/controller/BorrowInfoController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,84 @@ package com.ruoyi.account.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.account.pojo.BorrowInfo; import com.ruoyi.account.service.BorrowInfoService; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.domain.AjaxResult; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.util.List; /** * <p> * 忬¾ä¿¡æ¯è¡¨ å端æ§å¶å¨ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-01-15 02:57:29 */ @Api(tags = "忬¾ä¿¡æ¯è¡¨") @RestController @RequestMapping("/borrowInfo") public class BorrowInfoController { @Autowired private BorrowInfoService borrowInfoService; @GetMapping("/listPage") @ApiOperation("å页æ¥è¯¢") public AjaxResult listPage(Page page, BorrowInfo borrowInfo) { return borrowInfoService.listPage(page,borrowInfo); } /** * æ°å¢ */ @PostMapping("/add") @Transactional(rollbackFor = Exception.class) @Log(title = "æ°å¢å款信æ¯", businessType = BusinessType.INSERT) public AjaxResult add(@RequestBody BorrowInfo borrowInfo) { return borrowInfoService.add(borrowInfo); } /** * ä¿®æ¹ */ @PostMapping("/update") @Transactional(rollbackFor = Exception.class) @Log(title = "ä¿®æ¹å款信æ¯", businessType = BusinessType.UPDATE) public AjaxResult updateBorrowInfo(@RequestBody BorrowInfo borrowInfo) { return borrowInfoService.updateBorrowInfo(borrowInfo); } /** * å é¤ */ @DeleteMapping("/delete") @Transactional(rollbackFor = Exception.class) @Log(title = "å é¤å款信æ¯", businessType = BusinessType.DELETE) public AjaxResult delete(@RequestBody List<Long> ids) { return borrowInfoService.delete(ids); } /** * å¯¼åº */ @PostMapping("/export") @ApiOperation(value = "导åºå款信æ¯") public void export(HttpServletResponse response, BorrowInfo borrowInfo) { List<BorrowInfo> list = borrowInfoService.list(); ExcelUtil<BorrowInfo> util = new ExcelUtil<>(BorrowInfo.class); util.exportExcel(response,list, "忬¾ä¿¡æ¯æ°æ®"); } } src/main/java/com/ruoyi/account/mapper/BorrowInfoMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.account.mapper; import com.ruoyi.account.pojo.BorrowInfo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; /** * <p> * 忬¾ä¿¡æ¯è¡¨ Mapper æ¥å£ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-01-15 02:57:29 */ @Mapper public interface BorrowInfoMapper extends BaseMapper<BorrowInfo> { } src/main/java/com/ruoyi/account/pojo/AccountIncome.java
@@ -30,6 +30,16 @@ private Long id; /** * ä¸å¡id */ private Long businessId; /** * ä¸å¡ç±»å 1-忬¾ 2-忬¾ */ private Integer businessType; /** * æ¶å ¥æ¥æ */ @JsonFormat(pattern = "yyyy-MM-dd") src/main/java/com/ruoyi/account/pojo/BorrowInfo.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,93 @@ package com.ruoyi.account.pojo; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; 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 com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.dto.DateQueryDto; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import lombok.Setter; import org.springframework.format.annotation.DateTimeFormat; /** * <p> * 忬¾ä¿¡æ¯è¡¨ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-01-15 02:57:29 */ @Getter @Setter @TableName("borrow_info") @ApiModel(value = "BorrowInfo对象", description = "忬¾ä¿¡æ¯è¡¨") public class BorrowInfo extends DateQueryDto implements Serializable{ private static final long serialVersionUID = 1L; @ApiModelProperty("忬¾è®°å½ä¸»é®ID") @TableId(value = "id", type = IdType.AUTO) private Long id; @ApiModelProperty("忬¾äººå§å") @Excel(name = "忬¾äººå§å") private String borrowerName; @ApiModelProperty("忬¾éé¢ï¼å ï¼") @Excel(name = "忬¾éé¢ï¼å ï¼") private BigDecimal borrowAmount; @ApiModelProperty("忬¾å©çï¼å¦ï¼5.85 代表5.85%ï¼") @Excel(name = "忬¾å©ç") private BigDecimal interestRate; @ApiModelProperty("忬¾æ¥æ") @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") @Excel(name = "忬¾æ¥æ", width = 30, dateFormat = "yyyy-MM-dd") private LocalDate borrowDate; @ApiModelProperty("å®é è¿æ¬¾æ¥æï¼è¿æ¬¾åå¡«å ï¼") @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") @Excel(name = "å®é è¿æ¬¾æ¥æ", width = 30, dateFormat = "yyyy-MM-dd") private LocalDate repayDate; @ApiModelProperty("忬¾ç¶æï¼1=å¾ è¿æ¬¾ï¼2=å·²è¿æ¬¾") @Excel(name = "忬¾ç¶æ", readConverterExp = "1=å¾ è¿æ¬¾,2=å·²è¿æ¬¾") private Integer status; @ApiModelProperty("夿³¨ï¼å款说æï¼") @Excel(name = "夿³¨") private String remark; @ApiModelProperty("å建æ¶é´") @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @ApiModelProperty("å建è ID") @TableField(fill = FieldFill.INSERT) private Integer createUser; @ApiModelProperty("ä¿®æ¹æ¶é´") @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; @ApiModelProperty("ä¿®æ¹è ID") @TableField(fill = FieldFill.INSERT_UPDATE) private Integer updateUser; @ApiModelProperty("ç§æ·id") @TableField(fill = FieldFill.INSERT) private Long tenantId; } src/main/java/com/ruoyi/account/service/BorrowInfoService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,27 @@ package com.ruoyi.account.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.account.pojo.BorrowInfo; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.framework.web.domain.AjaxResult; import java.util.List; /** * <p> * 忬¾ä¿¡æ¯è¡¨ æå¡ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-01-15 02:57:29 */ public interface BorrowInfoService extends IService<BorrowInfo> { AjaxResult listPage(Page page, BorrowInfo borrowInfo); AjaxResult add(BorrowInfo borrowInfo); AjaxResult updateBorrowInfo(BorrowInfo borrowInfo); AjaxResult delete(List<Long> ids); } src/main/java/com/ruoyi/account/service/impl/BorrowInfoServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,132 @@ package com.ruoyi.account.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.account.pojo.AccountExpense; import com.ruoyi.account.pojo.AccountIncome; import com.ruoyi.account.pojo.BorrowInfo; import com.ruoyi.account.mapper.BorrowInfoMapper; import com.ruoyi.account.service.AccountExpenseService; import com.ruoyi.account.service.AccountIncomeService; import com.ruoyi.account.service.BorrowInfoService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.sales.service.ReceiptPaymentService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * <p> * 忬¾ä¿¡æ¯è¡¨ æå¡å®ç°ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-01-15 02:57:29 */ @Service @Slf4j public class BorrowInfoServiceImpl extends ServiceImpl<BorrowInfoMapper, BorrowInfo> implements BorrowInfoService { @Autowired private BorrowInfoMapper borrowInfoMapper; @Autowired private AccountIncomeService accountIncomeService; @Autowired private AccountExpenseService accountExpenseService; @Override public AjaxResult listPage(Page page, BorrowInfo borrowInfo) { LambdaQueryWrapper<BorrowInfo> borrowInfoLambdaQueryWrapper = new LambdaQueryWrapper<>(); if(borrowInfo != null){ if(StringUtils.isNotEmpty(borrowInfo.getEntryDateStart()) && StringUtils.isNotEmpty(borrowInfo.getEntryDateEnd())){ borrowInfoLambdaQueryWrapper.ge(BorrowInfo::getBorrowDate, borrowInfo.getEntryDateStart()); borrowInfoLambdaQueryWrapper.le(BorrowInfo::getBorrowDate, borrowInfo.getEntryDateEnd()); } if(borrowInfo.getStatus() != null){ borrowInfoLambdaQueryWrapper.eq(BorrowInfo::getStatus, borrowInfo.getStatus()); } if(StringUtils.isNotEmpty(borrowInfo.getBorrowerName())){ borrowInfoLambdaQueryWrapper.like(BorrowInfo::getBorrowerName, borrowInfo.getBorrowerName()); } } return AjaxResult.success(borrowInfoMapper.selectPage(page, borrowInfoLambdaQueryWrapper)); } @Override public AjaxResult add(BorrowInfo borrowInfo) { int insert = borrowInfoMapper.insert(borrowInfo); if(insert > 0){ // æ·»å æåï¼è¿å ¥æ¶å ¥ç®¡ç AccountIncome accountIncome = new AccountIncome(); accountIncome.setBusinessId(borrowInfo.getId()); accountIncome.setBusinessType(2); accountIncome.setIncomeDate(DateUtils.toDate(borrowInfo.getBorrowDate())); accountIncome.setIncomeType("2"); accountIncome.setIncomeMoney(borrowInfo.getBorrowAmount()); accountIncome.setIncomeDescribed("忬¾"); accountIncome.setIncomeMethod("3"); accountIncome.setInputTime(DateUtils.getNowDate()); accountIncome.setInputUser(borrowInfo.getBorrowerName()); accountIncomeService.save(accountIncome); return AjaxResult.success("æ·»å æå"); } return AjaxResult.success("æ·»å 失败"); } @Override public AjaxResult updateBorrowInfo(BorrowInfo borrowInfo) { int update = borrowInfoMapper.updateById(borrowInfo); if(update > 0){ // ä¿®æ¹æåï¼ä¿®æ¹æ¶å ¥ç®¡ç AccountIncome one = accountIncomeService.getOne(new LambdaQueryWrapper<AccountIncome>() .eq(AccountIncome::getBusinessId, borrowInfo.getId()) .eq(AccountIncome::getBusinessType, 2) .last("limit 1")); if(one != null){ one.setIncomeMoney(borrowInfo.getBorrowAmount()); accountIncomeService.updateById(one); } // æ¯å¦ä¸ºè¿æ¬¾ if(borrowInfo.getStatus() != null && borrowInfo.getStatus() == 2){ // æ°å¢æ¯åºè®°å½ AccountExpense accountExpense = new AccountExpense(); accountExpense.setBusinessId(borrowInfo.getId()); accountExpense.setBusinessType(2); accountExpense.setExpenseDate(DateUtils.toDate(borrowInfo.getRepayDate())); accountExpense.setExpenseType("4"); accountExpense.setExpenseMoney(borrowInfo.getBorrowAmount()); accountExpense.setExpenseDescribed("è¿æ¬¾"); accountExpense.setExpenseMethod("3"); accountExpense.setInputTime(DateUtils.getNowDate()); accountExpense.setInputUser(borrowInfo.getBorrowerName()); accountExpenseService.save(accountExpense); } return AjaxResult.success("ä¿®æ¹æå"); } return AjaxResult.success("ä¿®æ¹å¤±è´¥"); } @Override public AjaxResult delete(List<Long> ids) { int delete = borrowInfoMapper.deleteBatchIds(ids); if(delete > 0){ // å 餿åï¼å 餿¶å ¥ç®¡ç accountIncomeService.remove(new LambdaQueryWrapper<AccountIncome>() .in(AccountIncome::getBusinessId, ids) .eq(AccountIncome::getBusinessType, 2)); // å 餿¯åºç®¡ç accountExpenseService.remove(new LambdaQueryWrapper<AccountExpense>() .in(AccountExpense::getBusinessId, ids) .eq(AccountExpense::getBusinessType, 2)); return AjaxResult.success("å 餿å"); } return AjaxResult.success("å é¤å¤±è´¥"); } } src/main/java/com/ruoyi/framework/security/service/SysLoginService.java
@@ -270,13 +270,13 @@ LoginUser loginUser = (LoginUser) authentication.getPrincipal(); recordLoginInfo(loginUser.getUserId()); // æ´æ°ç¨æ·ä¿¡æ¯ï¼ä¿®æ¹å½åéä¸å ¬å¸ SysUser user = loginUser.getUser(); if(factoryId != null){ user.setTenantId(factoryId); }else{ user.setTenantId(tokenService.getDeptIdsByUserId(user.getUserId())[0]); } sysUserMapper.updateUser(user); // SysUser user = loginUser.getUser(); // if(factoryId != null){ // user.setTenantId(factoryId); // }else{ // user.setTenantId(tokenService.getDeptIdsByUserId(user.getUserId())[0]); // } // sysUserMapper.updateUser(user); // çætoken return tokenService.createToken(loginUser); } src/main/java/com/ruoyi/purchase/controller/ProcurementBusinessSummaryController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,32 @@ package com.ruoyi.purchase.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.purchase.dto.ProcurementBusinessSummaryDto; import com.ruoyi.purchase.service.impl.ProcurementBusinessSummaryServiceImpl; import io.swagger.annotations.Api; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @author :yys * @date : 2026/1/15 13:29 */ @Api(tags = "éè´ä¸å¡æ±æ»") @RestController @RequestMapping("/procurementBusinessSummary") public class ProcurementBusinessSummaryController extends BaseController { @Autowired private ProcurementBusinessSummaryServiceImpl procurementBusinessSummaryService; @GetMapping("/listPage") public AjaxResult listPage(Page page, ProcurementBusinessSummaryDto procurementBusinessSummaryDto) { return procurementBusinessSummaryService.listPage(page, procurementBusinessSummaryDto); } } src/main/java/com/ruoyi/purchase/dto/ProcurementBusinessSummaryDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,76 @@ package com.ruoyi.purchase.dto; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.basic.dto.ProductDto; import com.ruoyi.basic.dto.ProductModelDto; import com.ruoyi.basic.pojo.Product; import com.ruoyi.basic.pojo.ProductModel; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.sales.pojo.SalesLedgerProduct; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.util.Date; /** * @author :yys * @date : 2026/1/15 13:34 */ @Data @ApiModel public class ProcurementBusinessSummaryDto { private String productCategory; /** * è§æ ¼åå· */ private String specificationModel; @ApiModelProperty(value = "å¼å§æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") private Date entryDateStart; @ApiModelProperty(value = "ç»ææ¶é´") @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") private Date entryDateEnd; /** * éè´æ°é */ private BigDecimal purchaseNum; /** * éè´éé¢ */ private BigDecimal purchaseAmount; /** * éè´æ¬¡æ° */ private Integer purchaseTimes; /** * å¹³ååä»· */ private BigDecimal averagePrice; /** * ä¾åºååç§° */ private String supplierName; /** * å½å ¥æ¥æ */ @JsonFormat(pattern = "yyyy-MM-dd") private Date entryDate; } src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java
@@ -6,6 +6,9 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.mapper.AccountExpenseMapper; import com.ruoyi.account.pojo.AccountExpense; import com.ruoyi.account.service.AccountExpenseService; import com.ruoyi.basic.mapper.SupplierManageMapper; import com.ruoyi.basic.pojo.SupplierManage; import com.ruoyi.common.utils.DateUtils; @@ -60,6 +63,8 @@ private ProductRecordMapper productRecordMapper; private AccountExpenseService accountExpenseService; /** * æ¥è¯¢ä»æ¬¾ç»è®° * @@ -98,7 +103,7 @@ */ @Override public int insertPaymentRegistration(List<PaymentRegistration> paymentRegistrationList) { Long userId = SecurityUtils.getLoginUser().getUser().getUserId(); LoginUser userId = SecurityUtils.getLoginUser(); for (PaymentRegistration paymentRegistration : paymentRegistrationList) { PaymentRegistration byId = paymentRegistration; if (!ObjectUtils.isEmpty(paymentRegistration.getId())){ @@ -114,11 +119,24 @@ } paymentRegistration.setCreateTime(DateUtils.getNowDate()); paymentRegistration.setUpdateTime(DateUtils.getNowDate()); paymentRegistration.setRegistrantId(userId); paymentRegistration.setRegistrantId(userId.getUserId()); salesLedgerProduct.setTicketsTotal(salesLedgerProduct.getTicketsTotal().add(paymentRegistration.getCurrentPaymentAmount())); salesLedgerProduct.setPendingTicketsTotal(salesLedgerProduct.getTaxInclusiveTotalPrice().subtract(salesLedgerProduct.getTicketsTotal())); paymentRegistrationMapper.insert(paymentRegistration); salesLedgerProductMapper.updateById(salesLedgerProduct); // 2. å¤çè´¦æ·æ¶å ¥ AccountExpense accountExpense = new AccountExpense(); accountExpense.setExpenseDate(purchaseLedger.getEntryDate()); accountExpense.setExpenseType("0"); accountExpense.setSupplierName(purchaseLedger.getSupplierName()); accountExpense.setExpenseMoney(paymentRegistration.getCurrentPaymentAmount()); accountExpense.setExpenseDescribed("仿¬¾æ¯åº"); accountExpense.setExpenseMethod("0"); accountExpense.setBusinessId(paymentRegistration.getId()); accountExpense.setBusinessType(1); accountExpense.setInputTime(new Date()); accountExpense.setInputUser(userId.getNickName()); accountExpenseService.save(accountExpense); } return 1; src/main/java/com/ruoyi/purchase/service/impl/ProcurementBusinessSummaryServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,26 @@ package com.ruoyi.purchase.service.impl; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.purchase.dto.ProcurementBusinessSummaryDto; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.pojo.SalesLedgerProduct; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @author :yys * @date : 2026/1/15 13:30 */ @Service @Slf4j public class ProcurementBusinessSummaryServiceImpl { @Autowired private SalesLedgerProductMapper salesLedgerProductMapper; public AjaxResult listPage(Page page, ProcurementBusinessSummaryDto procurementBusinessSummaryDto) { return AjaxResult.success(salesLedgerProductMapper.procurementBusinessSummaryListPage(page, procurementBusinessSummaryDto)); } } src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -191,41 +191,11 @@ purchaseLedger.setRecorderId(purchaseLedgerDto.getRecorderId()); purchaseLedger.setRecorderName(sysUser.getNickName()); purchaseLedger.setPhoneNumber(sysUser.getPhonenumber()); // 2. å¤çè´¦æ·æ¶å ¥ AccountExpense accountExpense = new AccountExpense(); accountExpense.setExpenseDate(purchaseLedger.getEntryDate()); accountExpense.setExpenseType("0"); accountExpense.setSupplierName(purchaseLedger.getSupplierName()); accountExpense.setExpenseMoney(purchaseLedger.getContractAmount()); accountExpense.setExpenseDescribed("éè´ååï¼" + purchaseLedger.getPurchaseContractNumber()); accountExpense.setExpenseMethod("0"); accountExpense.setInvoiceNumber(purchaseLedger.getPurchaseContractNumber()); accountExpense.setInputTime(new Date()); accountExpense.setInputUser(loginUser.getNickName()); // 3. æ°å¢ææ´æ°ä¸»è¡¨ if (purchaseLedger.getId() == null) { purchaseLedgerMapper.insert(purchaseLedger); // accountIncomeService.save(accountIncome); accountExpenseService.save(accountExpense); } else { purchaseLedgerMapper.updateById(purchaseLedger); PurchaseLedger purchaseLedgerDB = purchaseLedgerMapper.selectById(purchaseLedger.getId()); List<AccountExpense> accountExpenseDBs = accountExpenseService.getByInvoiceNumberList(purchaseLedger.getPurchaseContractNumber()); if (!CollectionUtils.isEmpty(accountExpenseDBs)) { accountExpenseDBs.forEach(accountExpenseDB ->{ accountExpenseDB.setExpenseDate(purchaseLedgerDB.getEntryDate()); accountExpenseDB.setExpenseType("0"); accountExpenseDB.setSupplierName(purchaseLedgerDB.getSupplierName()); accountExpenseDB.setExpenseMoney(purchaseLedgerDB.getContractAmount()); accountExpenseDB.setExpenseDescribed("éè´ååï¼" + purchaseLedgerDB.getPurchaseContractNumber()); accountExpenseDB.setExpenseMethod("0"); accountExpenseDB.setInvoiceNumber(purchaseLedgerDB.getPurchaseContractNumber()); accountExpenseService.updateById(accountExpenseDB); }); } } // 4. å¤çåè¡¨æ°æ® src/main/java/com/ruoyi/sales/controller/MetricStatisticsController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,38 @@ package com.ruoyi.sales.controller; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.sales.dto.StatisticsTableDto; import com.ruoyi.sales.service.impl.MetricStatisticsServiceImpl; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @author :yys * @date : 2026/1/15 9:39 */ @Api(tags = "ææ ç»è®¡") @RestController @RequestMapping("/metricStatistics") public class MetricStatisticsController extends BaseController { @Autowired private MetricStatisticsServiceImpl metricStatisticsService; @ApiOperation("头鍿»è®¡") @GetMapping("/total") public AjaxResult total() { return metricStatisticsService.total(); } @ApiOperation("ç»è®¡è¡¨") @GetMapping("/statisticsTable") public AjaxResult statisticsTable(StatisticsTableDto statisticsTableDto) { return metricStatisticsService.statisticsTable(statisticsTableDto); } } src/main/java/com/ruoyi/sales/dto/SalesTrendDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,19 @@ package com.ruoyi.sales.dto; import lombok.Data; import java.math.BigDecimal; /** * @author :yys * @date : 2026/1/15 10:34 */ @Data public class SalesTrendDto { private String month; // æä»½ï¼å¦2024-12ï¼ private Integer orderCount; // è®¢åæ° private BigDecimal salesAmount; // éå®é¢ private BigDecimal shipRate; } src/main/java/com/ruoyi/sales/dto/StatisticsTableDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,31 @@ package com.ruoyi.sales.dto; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.dto.DateQueryDto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; /** * @author :yys * @date : 2026/1/15 10:18 */ @Data @ApiModel public class StatisticsTableDto{ private String customerName; private String productCategory; @ApiModelProperty(value = "å¼å§æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd") private Date entryDateStart; @ApiModelProperty(value = "ç»ææ¶é´") @JsonFormat(pattern = "yyyy-MM-dd") private Date entryDateEnd; } src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java
@@ -6,8 +6,11 @@ import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.sales.dto.SalesLedgerDto; import com.ruoyi.sales.dto.SalesTrendDto; import com.ruoyi.sales.dto.StatisticsTableDto; import com.ruoyi.sales.pojo.SalesLedger; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.math.BigDecimal; import java.util.List; @@ -45,4 +48,33 @@ * @return */ IPage<SalesLedger> selectSalesLedgerListPage(Page page, @Param("salesLedgerDto") SalesLedgerDto salesLedgerDto); /** * ææä»½ç»è®¡è®¢åæ°ãéå®é¢ï¼æ¯æäº§å大类ã客æ·åç§°çéï¼ * @param statisticsTableDto ç»è®¡æ¥è¯¢åæ°DTO * @return éå®è¶å¿ç»è®¡ç»æ */ @Select("<script>" + "SELECT " + "DATE_FORMAT(sl.entry_date, '%Y-%m') AS month, " + "COUNT(DISTINCT sl.id) AS order_count, " + // æ»è®¢åæ° "SUM(slp.tax_inclusive_total_price) AS sales_amount, " + // éå®é¢ // åè´§ç = åè´§è®¢åæ° * 100 / æ»è®¢åæ°ï¼ä¿ç2ä½å°æ°ï¼é¿å é¤0æ¥éï¼ "ROUND(IF(COUNT(DISTINCT sl.id) = 0, 0, " + "SUM(CASE WHEN slp.approve_status = 2 THEN 1 ELSE 0 END) / COUNT(DISTINCT sl.id) * 100), 2) AS ship_rate " + "FROM sales_ledger sl " + "LEFT JOIN sales_ledger_product slp ON sl.id = slp.sales_ledger_id " + "WHERE sl.entry_date BETWEEN #{statisticsTableDto.entryDateStart} AND #{statisticsTableDto.entryDateEnd} " + // 产å大类çé "<if test='statisticsTableDto.productCategory != null and statisticsTableDto.productCategory != \"\"'>" + "AND slp.product_category = #{statisticsTableDto.productCategory} " + "</if>" + // 客æ·åç§°çé "<if test='statisticsTableDto.customerName != null and statisticsTableDto.customerName != \"\"'>" + "AND sl.customer_name = #{statisticsTableDto.customerName} " + "</if>" + "GROUP BY DATE_FORMAT(sl.entry_date, '%Y-%m') " + "ORDER BY month" + "</script>") List<SalesTrendDto> statisticsTable(@Param("statisticsTableDto")StatisticsTableDto statisticsTableDto); } src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java
@@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.config.MyBaseMapper; import com.ruoyi.purchase.dto.ProcurementBusinessSummaryDto; import com.ruoyi.sales.dto.SalesLedgerProductDto; import com.ruoyi.sales.pojo.SalesLedgerProduct; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ IPage<SalesLedgerProductDto> listPage(Page page, @Param("req") SalesLedgerProductDto salesLedgerProduct); IPage<SalesLedgerProductDto> listPagePurchaseLedger(Page page,@Param("req") SalesLedgerProductDto salesLedgerProduct); IPage<ProcurementBusinessSummaryDto> procurementBusinessSummaryListPage(Page page,@Param("req") ProcurementBusinessSummaryDto procurementBusinessSummaryDto); } src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -207,7 +207,7 @@ * å货审æ¹ç¶æ */ // @TableField(exist = false) @ApiModelProperty(value = "审æ¹ç¶æï¼0æªç产,1å·²ç产,2å¾ å®¡æ ¸(å®¡æ ¸ä¸),3å®¡æ ¸å®æ,4å®¡æ ¸å¤±è´¥") @ApiModelProperty(value = "审æ¹ç¶æï¼0æªç产,1å·²ç产,2å·²åè´§") private Integer approveStatus; @ApiModelProperty(value = "å¾ åæ¬¾æ»éé¢") src/main/java/com/ruoyi/sales/service/impl/MetricStatisticsServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,73 @@ package com.ruoyi.sales.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.sales.dto.SalesTrendDto; import com.ruoyi.sales.dto.StatisticsTableDto; 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 lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; /** * @author :yys * @date : 2026/1/15 9:41 */ @Service @Slf4j public class MetricStatisticsServiceImpl { @Autowired private SalesLedgerMapper salesLedgerMapper; @Autowired private SalesLedgerProductMapper salesLedgerProductMapper; public AjaxResult total() { List<SalesLedger> salesLedgers = salesLedgerMapper.selectList(null); if(CollectionUtils.isEmpty(salesLedgers)) return AjaxResult.success(salesLedgers); Map<String, Object> map = new HashMap<>(); // éå®é¢ map.put("contractAmountTotal", salesLedgers.stream().map(SalesLedger::getContractAmount).reduce(BigDecimal.ZERO, BigDecimal::add)); // è®¢åæ°é map.put("total", new BigDecimal(salesLedgers.size())); // åè´§ç List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>() .eq(SalesLedgerProduct::getType, 1)); map.put("shipRate", "0%"); if(CollectionUtils.isEmpty(salesLedgerProducts)) return AjaxResult.success(map); // åè´§æ°é long count = salesLedgerProducts.stream() .filter(salesLedgerProduct -> salesLedgerProduct.getApproveStatus().equals(2)) .count(); map.put("shipRate", String.format("%.2f", count * 100.0 / salesLedgerProducts.size()) + "%"); return AjaxResult.success(map); } public AjaxResult statisticsTable(StatisticsTableDto statisticsTableDto) { Map<String, Object> map = new HashMap<>(); if (statisticsTableDto.getEntryDateStart() == null || statisticsTableDto.getEntryDateEnd() == null) { Calendar calendar = Calendar.getInstance(); // ç»ææ¶é´é»è®¤æ¯å½åæ¶é´ statisticsTableDto.setEntryDateEnd(new Date()); // å¼å§æ¶é´é»è®¤æ¯6个æå calendar.add(Calendar.MONTH, -6); statisticsTableDto.setEntryDateStart(calendar.getTime()); } List<SalesTrendDto> salesTrendDtos = salesLedgerMapper.statisticsTable(statisticsTableDto); if(CollectionUtils.isEmpty(salesTrendDtos)) return AjaxResult.success(map); map.put("dateList", salesTrendDtos.stream().map(SalesTrendDto::getMonth).collect(Collectors.toList())); map.put("orderCountList", salesTrendDtos.stream().map(SalesTrendDto::getOrderCount).collect(Collectors.toList())); map.put("salesAmountList", salesTrendDtos.stream().map(SalesTrendDto::getSalesAmount).collect(Collectors.toList())); map.put("shippingRateList", salesTrendDtos.stream().map(SalesTrendDto::getShipRate).collect(Collectors.toList())); return AjaxResult.success(map); } } src/main/resources/mapper/account/BorrowInfoMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ <?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.account.mapper.BorrowInfoMapper"> <!-- éç¨æ¥è¯¢æ å°ç»æ --> <resultMap id="BaseResultMap" type="com.ruoyi.account.pojo.BorrowInfo"> <id column="id" property="id" /> <result column="borrower_name" property="borrowerName" /> <result column="borrow_amount" property="borrowAmount" /> <result column="interest_rate" property="interestRate" /> <result column="borrow_date" property="borrowDate" /> <result column="repay_date" property="repayDate" /> <result column="status" property="status" /> <result column="remark" property="remark" /> <result column="create_time" property="createTime" /> <result column="create_user" property="createUser" /> <result column="update_time" property="updateTime" /> <result column="update_user" property="updateUser" /> <result column="tenant_id" property="tenantId" /> </resultMap> </mapper> src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -96,4 +96,34 @@ </where> order by slp.register_date desc </select> <select id="procurementBusinessSummaryListPage" resultType="com.ruoyi.purchase.dto.ProcurementBusinessSummaryDto"> SELECT slp.product_category AS productCategory, slp.specification_model AS specificationModel, sl.supplier_name AS supplierName, SUM(slp.quantity) AS purchaseNum, SUM(slp.tax_inclusive_total_price) AS purchaseAmount, COUNT(DISTINCT slp.sales_ledger_id) AS purchaseTimes, <!-- å¹³ååä»· = æ»éè´éé¢/æ»éè´æ°éï¼ä¿ç2ä½å°æ°ï¼é¿å é¤0 --> ROUND(IF(SUM(slp.quantity) = 0, 0, SUM(slp.tax_inclusive_total_price) / SUM(slp.quantity)), 2) AS averagePrice, <!-- 该产åå¤§ç±»ä¸æåä¸ä¸ªå½å ¥æ¥æï¼åå°è´¦ä¸»è¡¨çentry_dateï¼ --> MAX(sl.entry_date) AS entryDate FROM sales_ledger_product slp <!-- å ³èå°è´¦ä¸»è¡¨ï¼è·åå½å ¥æ¥æentry_date --> LEFT JOIN purchase_ledger sl ON slp.sales_ledger_id = sl.id WHERE slp.type = 2 <!-- åºå®çéï¼éè´å°è´¦ï¼type=2ï¼ --> <!-- éè´æ¥æçéï¼å¯éæ¡ä»¶ --> <if test="req.entryDateStart != null and req.entryDateEnd != null"> AND sl.entry_date BETWEEN #{req.entryDateStart} AND #{req.entryDateEnd} <!-- æ¶é´èå´ï¼éç©ºææ --> </if> <!-- 产å大类çéï¼å¯éæ¡ä»¶ --> <if test="req.productCategory != null and req.productCategory != ''"> AND slp.product_category = #{req.productCategory} </if> <!-- æäº§å大类åç»èå --> GROUP BY slp.product_category <!-- æäº§å大类æåº --> ORDER BY slp.product_category </select> </mapper> src/main/resources/mapper/system/SysUserMapper.xml
@@ -190,7 +190,6 @@ <insert id="insertUser" parameterType="com.ruoyi.project.system.domain.SysUser" useGeneratedKeys="true" keyProperty="userId"> insert into sys_user( <if test="userId != null and userId != 0">user_id,</if> <if test="deptId != null and deptId != 0">dept_id,</if> <if test="userName != null and userName != ''">user_name,</if> <if test="nickName != null and nickName != ''">nick_name,</if> <if test="email != null and email != ''">email,</if> @@ -205,7 +204,6 @@ create_time )values( <if test="userId != null and userId != ''">#{userId},</if> <if test="deptId != null and deptId != ''">#{deptId},</if> <if test="userName != null and userName != ''">#{userName},</if> <if test="nickName != null and nickName != ''">#{nickName},</if> <if test="email != null and email != ''">#{email},</if>