chenhj
4 小时以前 e046347e21a3bb4aa4ae4eb80f54bbfadb652132
Merge branch 'dev_New' of http://114.132.189.42:9002/r/product-inventory-management-after into dev_New
已添加6个文件
已修改52个文件
677 ■■■■ 文件已修改
doc/20260113-product_model.sql 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/20260114_add_dimission_reason_and_remark_to_staff_join_leave_record.sql 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/dto/ProductModelDto.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/enums/StaffJoinLeaveRecordDimissionReason.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/utils/OrderUtils.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/Details.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordOutMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductStructureService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/controller/PaymentRegistrationController.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/mapper/PaymentRegistrationMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/pojo/PaymentRegistration.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/IPaymentRegistrationService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/controller/QualityReportController.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/controller/QualityTestStandardController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/dto/QualityTestStandardBindingDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/pojo/QualityInspect.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/service/QualityReportService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/service/impl/QualityReportServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/ReceiptPaymentController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/CustomerInteractionDto.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/InvoiceLedgerDto.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/SalesLedgerProductDto.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/SalesQuotationDto.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/ReceiptPaymentMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/SalesQuotation.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/ReceiptPaymentService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/ReceiptPaymentServiceImpl.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java 49 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/pojo/StaffJoinLeaveRecord.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/impl/StaffJoinLeaveRecordServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/quality/QualityTestStandardBindingMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/quality/QualityTestStandardMapper.xml 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/quality/QualityTestStandardParamMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/InvoiceLedgerMapper.xml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/ReceiptPaymentMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/SalesLedgerProductMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/SalesQuotationMapper.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/20260113-product_model.sql
@@ -4,3 +4,11 @@
alter table process_route
    add process_route_code varchar(255)  null comment '工艺路线编码';
alter table procurement_record_storage
    add product_model_id bigint null comment '产品规格id';
alter table procurement_record_out
    add product_model_id bigint null comment '产品规格id';
alter table quality_inspect
    add product_model_id bigint null comment '产品规格id';
doc/20260114_add_dimission_reason_and_remark_to_staff_join_leave_record.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
alter table staff_join_leave_record
    add dimission_reason varchar(255) null,
    add dimission_remark text null;
src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -20,7 +20,10 @@
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.project.system.service.ISysNoticeService;
import com.ruoyi.sales.mapper.CommonFileMapper;
import com.ruoyi.sales.mapper.SalesQuotationMapper;
import com.ruoyi.sales.mapper.SalesQuotationProductMapper;
import com.ruoyi.sales.pojo.CommonFile;
import com.ruoyi.sales.pojo.SalesQuotation;
import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
@@ -54,6 +57,9 @@
    private CommonFileMapper fileMapper;
    @Autowired
    private DeviceRepairMapper deviceRepairMapper;
    @Autowired
    private SalesQuotationMapper salesQuotationMapper;
@@ -163,6 +169,22 @@
            }
            deviceRepairMapper.updateById(deviceRepair);
        }
        // é”€å”®æŠ¥ä»·çŠ¶æ€ä¿®æ”¹
        if(approveProcess.getApproveType().equals(6)){
            SalesQuotation salesQuote = salesQuotationMapper.selectOne(new LambdaQueryWrapper<SalesQuotation>()
                    .eq(SalesQuotation::getQuotationNo, approveProcess.getApproveReason())
                    .last("limit 1"));
            // åŒæ„
            if(status.equals(2) && salesQuote != null){
                salesQuote.setStatus("通过");
            }else if(status.equals(3) && salesQuote != null){
                salesQuote.setStatus("拒绝");
            }else if(status.equals(1) && salesQuote != null){
                salesQuote.setStatus("审核中");
            }
            salesQuotationMapper.updateById(salesQuote);
        }
        // ç»‘定附件
        if(!CollectionUtils.isEmpty(approveNode.getTempFileIds()) && approveNode.getApproveNodeStatus() == 1){
            tempFileService.migrateTempFilesToFormal(approveNode.getId(), approveNode.getTempFileIds(), FileNameType.ApproveNode.getValue());
src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
@@ -93,6 +93,7 @@
        approveProcess.setApproveReason(approveProcessVO.getApproveReason());
        approveProcess.setDeviceRepairId(approveProcessVO.getDeviceRepairId());
        approveProcess.setMaintenancePrice(approveProcessVO.getMaintenancePrice());
        approveProcess.setPrice(approveProcessVO.getPrice());
        approveProcess.setApproveOverTime(null);
        approveProcess.setApproveStatus(0);
        approveProcess.setApproveDelete(0);
@@ -180,6 +181,48 @@
    private final ApproveNodeMapper approveNodeMapper;
    // æŠ¥ä»·å®¡æ‰¹ç¼–辑审核人
    public void updateApproveUser(ApproveGetAndUpdateVo approveGetAndUpdateVo){
        LambdaQueryWrapper<ApproveProcess> approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>();
        approveProcessLambdaQueryWrapper.eq(ApproveProcess::getApproveType, approveGetAndUpdateVo.getApproveType())
                .eq(ApproveProcess::getApproveReason, approveGetAndUpdateVo.getApproveReason())
                .last("limit 1");
        ApproveProcess approveProcess = approveProcessMapper.selectOne(approveProcessLambdaQueryWrapper);
        if(approveProcess == null) throw new RuntimeException("请选择审批人");
        String[] split = approveGetAndUpdateVo.getApproveUserIds().split(",");
        if(split.length == 0){
            throw new RuntimeException("请选择审批人");
        }
        List<SysUser> sysUsers = sysUserMapper.selectUserByIds(Arrays.asList(split).stream().map(Long::parseLong).collect(Collectors.toList()));
        if(CollectionUtils.isEmpty(sysUsers)) throw new RuntimeException("请选择审批人");
        //审核中不可以编辑审核人
        if(approveProcess.getApproveStatus() != 1){
            approveProcess.setApproveUserCurrentId(Long.parseLong(split[0]));
            approveProcess.setApproveUserCurrentName(sysUsers.stream().filter(user -> user.getUserId().equals(Long.parseLong(split[0]))).collect(Collectors.toList()).get(0).getNickName());
        }
        if(approveGetAndUpdateVo.getApproveStatus() != null){
            approveProcess.setApproveStatus(approveGetAndUpdateVo.getApproveStatus());
        }
        approveProcess.setApproveUserIds(approveGetAndUpdateVo.getApproveUserIds());
        updateById(approveProcess);
        //修改审批人
        // å…ˆåˆ é™¤ åŽæ–°å¢ž
        LambdaQueryWrapper<ApproveNode> approveNodeLambdaQueryWrapper = new LambdaQueryWrapper<>();
        approveNodeLambdaQueryWrapper.eq(ApproveNode::getApproveProcessId, approveProcess.getApproveId())
                .eq(ApproveNode::getDeleteFlag, 0)
                .eq(ApproveNode::getTenantId, SecurityUtils.getLoginUser().getTenantId())
                .orderByAsc(ApproveNode::getApproveNodeOrder);
        approveNodeMapper.delete(approveNodeLambdaQueryWrapper);
        approveNodeService.initApproveNodes(approveGetAndUpdateVo.getApproveUserIds(),approveProcess.getApproveId(),approveProcess.getTenantId());
        /*消息通知*/
        String id = approveProcess.getApproveUserIds().split(",")[0];
        sysNoticeService.simpleNoticeByUser(approveProcessType(approveProcess.getApproveType()),
                approveProcess.getApproveId()+"流程编号的审批需要您审核!!!!!",
                Arrays.asList(Long.valueOf(id)),
                approveProcess.getApproveDeptId(),
                "/collaborativeApproval/approvalProcess?approveType="+approveProcess.getApproveType()+"&approveId="+approveProcess.getApproveId());
    }
    @Override
    public void updateByApproveId(ApproveGetAndUpdateVo approveGetAndUpdateVo) throws IOException {
src/main/java/com/ruoyi/basic/dto/ProductModelDto.java
@@ -1,8 +1,12 @@
package com.ruoyi.basic.dto;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.production.dto.ProductStructureDto;
import lombok.Data;
import java.util.List;
@Data
public class ProductModelDto extends ProductModel {
    private List<ProductStructureDto> productStructureList;
}
src/main/java/com/ruoyi/common/enums/StaffJoinLeaveRecordDimissionReason.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.ruoyi.common.enums;
import lombok.AllArgsConstructor;
/**
 * é™„件记录类型枚举
 *
 */
@AllArgsConstructor
public enum StaffJoinLeaveRecordDimissionReason {
    StaffJoinLeaveRecordDimissionReasonSalary("salary","薪资待遇"),
    StaffJoinLeaveRecordDimissionReasonCareerDevelopment("career_development","职业发展"),
    StaffJoinLeaveRecordDimissionReasonWorkEnvironment("work_environment","工作环境"),
    StaffJoinLeaveRecordDimissionReasonPersonalReason("personal_reason","个人原因"),
    StaffJoinLeaveRecordDimissionReasonOther("other","其他原因");
    private final String code;
    private final String info;
    public String getCode() {
        return code;
    }
    public String getInfo() {
        return info;
    }
}
src/main/java/com/ruoyi/common/utils/OrderUtils.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.common.utils.uuid.UUID;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.stereotype.Component;
@@ -51,6 +52,6 @@
        // æ‰§è¡ŒæŸ¥è¯¢
        Long aLong = mapper.selectCount(queryWrapper);
        // æ‹¼æŽ¥è®¢å•编号 preFix + æ—¶é—´ï¼ˆyyyyMMdd) + è®¢å•数量(001)
        return preFix + LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE).replaceAll("-", "") + String.format("%03d", (aLong + 1));
        return preFix + LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE).replaceAll("-", "") + String.format("%03d", (aLong + 1)) + "-" + new Date().getTime();
    }
}
src/main/java/com/ruoyi/procurementrecord/dto/Details.java
@@ -10,10 +10,11 @@
 */
@Data
public class Details {
    private Integer id;  // äº§å“id
    private Integer id;  // å°è´¦äº§å“id
    private BigDecimal inboundQuantity;  // å…¥åº“数量
    private BigDecimal warnNum;  // é¢„警数量(采购入库才有)
    //单价
    private BigDecimal unitPrice;
    private BigDecimal totalPrice;
    private Long productModelId; // åŸºç¡€äº§å“id
}
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java
@@ -24,4 +24,6 @@
     */
    private Integer type;
    private Long productModelId;// åŸºç¡€äº§å“ID
}
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java
@@ -9,6 +9,7 @@
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.util.List;
/**
@@ -41,4 +42,6 @@
    IPage<ProcurementPageDtoCopy> listPageCopyByProduction(Page page, @Param("req") ProcurementPageDto procurementDto);
    IPage<ProcurementPageDtoCopy> listPagePRS(Page page, @Param("req") ProcurementPageDto procurementDto);
    BigDecimal getSumQuantity(@Param("productModelId") Long productModelId);
}
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordOutMapper.java
@@ -7,6 +7,7 @@
import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.util.List;
/**
@@ -26,4 +27,6 @@
    IPage<ProcurementRecordOutPageDto> listPageByProduct(Page page,@Param("req") ProcurementRecordOutPageDto procurementDto);
    IPage<ProcurementRecordOutPageDto> listPageByCustom(Page page,@Param("req") ProcurementRecordOutPageDto procurementDto);
    BigDecimal getSumQuantity(@Param("productModelId") Long productModelId);
}
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
@@ -1,8 +1,6 @@
package com.ruoyi.procurementrecord.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;
@@ -89,4 +87,9 @@
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    /**
     * äº§å“ID
     */
    private Long productModelId;
}
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
@@ -95,4 +95,9 @@
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    /**
     * äº§å“ID
     */
    private Long productModelId;
}
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
@@ -10,7 +10,6 @@
import com.ruoyi.procurementrecord.dto.ProcurementUpdateDto;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
import com.ruoyi.procurementrecord.service.ProcurementRecordOutService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
@@ -22,7 +21,6 @@
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
@@ -80,7 +78,8 @@
                .createUser(Long.valueOf(procurementRecordOutAdd.getUserId()))
                .createBy(sysUser.getNickName())
                .updateUser(Long.valueOf(procurementRecordOutAdd.getUserId()))
                .updateTime(LocalDateTime.now());
                .updateTime(LocalDateTime.now())
                .productModelId(procurementRecordOutAdd.getProductModelId());
        this.save(procurementRecordOut.build());
        return 0;
    }
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -14,8 +14,8 @@
import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
import com.ruoyi.procurementrecord.pojo.CustomStorage;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
import com.ruoyi.procurementrecord.service.ProcurementRecordService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
@@ -29,7 +29,6 @@
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
@@ -772,7 +771,8 @@
                    .createUser(loginUser.getUserId())
                    .updateTime(LocalDateTime.now())
                    .updateUser(loginUser.getUserId())
                    .createBy(procurementDto.getNickName());
                    .createBy(procurementDto.getNickName())
                    .productModelId(detail.getProductModelId());
            this.save(procurementRecordBuilder.build());
            // å…¥åº“成功减掉采购数量
//            LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductLambdaQueryWrapper = new LambdaQueryWrapper<>();
src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.procurementrecord.utils;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
@Component
@RequiredArgsConstructor
public class StockUtils {
    private final ProcurementRecordOutMapper procurementRecordOutMapper;
    private final ProcurementRecordMapper procurementRecordMapper;
    // èŽ·å–å•†å“å‰©ä½™åº“å­˜
    public  BigDecimal getStockQuantity(Long productModelId) {
        // å…¥åº“数量
        BigDecimal sumQuantity = procurementRecordMapper.getSumQuantity(productModelId);
        // å‡ºåº“数量
        BigDecimal outQuantity = procurementRecordOutMapper.getSumQuantity(productModelId);
        return outQuantity.compareTo(sumQuantity) > 0 ? BigDecimal.ZERO : sumQuantity.subtract(outQuantity);
    }
}
src/main/java/com/ruoyi/production/service/ProductStructureService.java
@@ -1,6 +1,7 @@
package com.ruoyi.production.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.basic.dto.ProductModelDto;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.pojo.ProductStructure;
@@ -9,7 +10,7 @@
public interface ProductStructureService extends IService<ProductStructure> {
    List<ProductStructureDto> listByproductModelId(Long productId);
    ProductModelDto listByproductModelId(Long productId);
    Boolean addProductStructureDto(ProductStructureDto productStructureDto);
src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java
@@ -2,15 +2,22 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.dto.ProductModelDto;
import com.ruoyi.basic.mapper.ProductMapper;
import com.ruoyi.basic.mapper.ProductModelMapper;
import com.ruoyi.basic.pojo.Product;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.mapper.ProductStructureMapper;
import com.ruoyi.production.pojo.ProductStructure;
import com.ruoyi.production.service.ProductStructureService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
@Service
@@ -20,10 +27,21 @@
    @Autowired
    private  ProductStructureMapper productStructureMapper;
    @Autowired
    private ProductModelMapper productModelMapper;
    @Autowired
    private ProductMapper productMapper;
    @Override
    public List<ProductStructureDto> listByproductModelId(Long productModelId) {
        return productStructureMapper.listByproductModelId( productModelId);
    public ProductModelDto listByproductModelId(Long productModelId) {
        ProductModel productModel = productModelMapper.selectById(productModelId);
        Product product = productMapper.selectById(productModel.getProductId());
        ProductModelDto productModelDto = new ProductModelDto();
        BeanUtils.copyProperties(productModel,productModelDto);
        productModelDto.setProductName(product.getProductName());
        List<ProductStructureDto> productStructureDtos = productStructureMapper.listByproductModelId(productModelId);
        productModelDto.setProductStructureList(productStructureDtos);
        return productModelDto;
    }
    @Override
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -13,6 +13,7 @@
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.procurementrecord.utils.StockUtils;
import com.ruoyi.production.controller.ProductWorkOrderController;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.dto.ProductionProductMainDto;
@@ -76,6 +77,8 @@
    private ProductOrderMapper productOrderMapper;
    private SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper;
    private StockUtils stockUtils;
    @Override
@@ -169,6 +172,7 @@
            qualityInspect.setInspectState(0);
            qualityInspect.setInspectType(inspectType);
            qualityInspect.setProductMainId(productionProductMain.getId());
            qualityInspect.setProductModelId(productModel.getId());
            qualityInspectMapper.insert(qualityInspect);
            List<QualityTestStandardParam> qualityTestStandardParams = qualityTestStandardParamMapper.selectListByProductId(product.getId());
@@ -186,6 +190,12 @@
        if (productModel != null) {
            List<ProductStructureDto> productStructureDtos = productStructureMapper.listByproductModelId(productModel.getId());
            for (ProductStructureDto productStructureDto : productStructureDtos) {
                ProductModel productModel1 = productModelMapper.selectById(productStructureDto.getProductModelId());
                BigDecimal stockQuantity = stockUtils.getStockQuantity(productModel1.getId());
                if (!(stockQuantity.compareTo(BigDecimal.ZERO) > 0)) {
                    throw new RuntimeException("库存不足");
                }
                ProductionProductInput productionProductInput = new ProductionProductInput();
                productionProductInput.setProductModelId(productStructureDto.getProductModelId());
                productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity()));
src/main/java/com/ruoyi/purchase/controller/PaymentRegistrationController.java
@@ -120,6 +120,22 @@
    }
    /**
     * ä¾›åº”商往来分页接口
     */
    @GetMapping("/supplierNameListPage")
    public AjaxResult supplierNameListPage(PaymentLedgerDto paymentLedgerDto, Page page){
        return success(paymentRegistrationService.supplierNameListPage(page,paymentLedgerDto));
    }
    /**
     * ä¾›åº”商往来分页接口
     */
    @GetMapping("/supplierNameListPageDetails")
    public AjaxResult supplierNameListPageDetails(PaymentLedgerDto paymentLedgerDto){
        return success(paymentRegistrationService.supplierNameListPageDetails(paymentLedgerDto));
    }
    /**
     * èŽ·å–æœ¬æœˆåº”ä»˜ä¿¡æ¯
     */
    @GetMapping(value = "/paymentMonthList")
src/main/java/com/ruoyi/purchase/mapper/PaymentRegistrationMapper.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.purchase.dto.PaymentHistoryRecordVo;
import com.ruoyi.purchase.dto.PaymentLedgerDto;
import com.ruoyi.purchase.dto.PaymentRegistrationDto;
import com.ruoyi.purchase.pojo.PaymentRegistration;
import org.apache.ibatis.annotations.Param;
@@ -62,4 +63,8 @@
     * @return ä»˜æ¬¾ç™»è®°é›†åˆ
     */
    IPage<PaymentRegistrationDto> paymentHistoryListPage(Page page, @Param("params") PaymentRegistrationDto paymentRegistrationDto);
    IPage<PaymentRegistrationDto> supplierNameListPage(Page page,@Param("req") PaymentLedgerDto paymentLedgerDto);
    List<PaymentRegistrationDto> supplierNameListPageDetails(@Param("req") PaymentLedgerDto paymentLedgerDto);
}
src/main/java/com/ruoyi/purchase/pojo/PaymentRegistration.java
@@ -39,7 +39,7 @@
    /**
     * é‡‡è´­è®¢å•产品id
     */
    private Long saleLedgerProductId;
    private Long salesLedgerProductId;
    /**
     * ä¾›åº”商id
@@ -71,7 +71,6 @@
    /**
     * ç™»è®°äºº
     */
    @TableField(fill = FieldFill.INSERT)
    private Long registrantId;
    // ç§Ÿæˆ·id
src/main/java/com/ruoyi/purchase/service/IPaymentRegistrationService.java
@@ -99,4 +99,8 @@
    Boolean delete(Long[] ids);
    int delPaymentRegistration(Long ids);
    IPage<PaymentRegistrationDto> supplierNameListPage(Page page, PaymentLedgerDto paymentLedgerDto);
    List<PaymentRegistrationDto> supplierNameListPageDetails(PaymentLedgerDto paymentLedgerDto);
}
src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java
@@ -98,6 +98,7 @@
     */
    @Override
    public int insertPaymentRegistration(List<PaymentRegistration> paymentRegistrationList) {
        Long userId = SecurityUtils.getLoginUser().getUser().getUserId();
        for (PaymentRegistration paymentRegistration : paymentRegistrationList) {
            PaymentRegistration byId = paymentRegistration;
            if (!ObjectUtils.isEmpty(paymentRegistration.getId())){
@@ -106,15 +107,16 @@
            PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(paymentRegistration.getPurchaseLedgerId());
            if(null==purchaseLedger) throw new RuntimeException("未找到采购单");
            // å·²å›žæ¬¾é‡‘额
            SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(paymentRegistration.getSaleLedgerProductId());
            SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(paymentRegistration.getSalesLedgerProductId());
            if(null==salesLedgerProduct) throw new RuntimeException("未找到采购单产品");
            if (salesLedgerProduct.getPendingInvoiceTotal().compareTo(paymentRegistration.getCurrentPaymentAmount())<0){
            if (salesLedgerProduct.getPendingTicketsTotal().compareTo(paymentRegistration.getCurrentPaymentAmount())<0){
                throw new RuntimeException("本次回款金额不能大于待回款金额");
            }
            paymentRegistration.setCreateTime(DateUtils.getNowDate());
            paymentRegistration.setUpdateTime(DateUtils.getNowDate());
            salesLedgerProduct.setInvoiceTotal(salesLedgerProduct.getInvoiceTotal().add(paymentRegistration.getCurrentPaymentAmount()));
            salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice().subtract(salesLedgerProduct.getInvoiceTotal()));
            paymentRegistration.setRegistrantId(userId);
            salesLedgerProduct.setTicketsTotal(salesLedgerProduct.getTicketsTotal().add(paymentRegistration.getCurrentPaymentAmount()));
            salesLedgerProduct.setPendingTicketsTotal(salesLedgerProduct.getTaxInclusiveTotalPrice().subtract(salesLedgerProduct.getTicketsTotal()));
            paymentRegistrationMapper.insert(paymentRegistration);
            salesLedgerProductMapper.updateById(salesLedgerProduct);
        }
@@ -456,6 +458,16 @@
        return paymentRegistrationMapper.deleteById(id);
    }
    @Override
    public IPage<PaymentRegistrationDto> supplierNameListPage(Page page, PaymentLedgerDto paymentLedgerDto) {
        return paymentRegistrationMapper.supplierNameListPage(page, paymentLedgerDto);
    }
    @Override
    public List<PaymentRegistrationDto> supplierNameListPageDetails(PaymentLedgerDto paymentLedgerDto) {
        return paymentRegistrationMapper.supplierNameListPageDetails(paymentLedgerDto);
    }
    // æ‰¹é‡æŸ¥è¯¢é‡‡è´­å°è´¦ï¼ˆå½“月)
    private Map<Long, List<PurchaseLedger>> batchQueryPurchaseLedgers(List<Long> supplierIds, LocalDate startDate, LocalDate endDate) {
        LambdaQueryWrapper<PurchaseLedger> query = new LambdaQueryWrapper<>();
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -242,6 +242,7 @@
            qualityInspect.setProductId(saleProduct.getId());
            qualityInspect.setProductName(saleProduct.getProductCategory());
            qualityInspect.setModel(saleProduct.getSpecificationModel());
            qualityInspect.setProductModelId(saleProduct.getProductModelId());
            qualityInspect.setUnit(saleProduct.getUnit());
            qualityInspect.setQuantity(saleProduct.getQuantity());
            qualityInspectMapper.insert(qualityInspect);
src/main/java/com/ruoyi/quality/controller/QualityReportController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.ruoyi.quality.controller;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.quality.pojo.QualityTestStandardParam;
import com.ruoyi.quality.service.QualityReportService;
import com.ruoyi.quality.service.QualityTestStandardParamService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * <p>
 * è´¨é‡ç®¡ç†çš„æŠ¥è¡¨ç®¡ç† å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-14 03:39:49
 */
@RestController
@RequestMapping("/qualityReport")
public class QualityReportController {
    @Autowired
    private QualityReportService qualityReportService;
}
src/main/java/com/ruoyi/quality/controller/QualityTestStandardController.java
@@ -80,4 +80,14 @@
        return AjaxResult.success(qualityTestStandardService.copyParam(qualityTestStandard));
    }
    /**
     * æ£€æµ‹æ ‡å‡†æ‰¹é‡å®¡æ ¸
     * @param qualityTestStandards
     * @return
     */
    @PostMapping("/qualityTestStandardAudit")
    public AjaxResult qualityTestStandardAudit(@RequestBody List<QualityTestStandard> qualityTestStandards) {
        return AjaxResult.success(qualityTestStandardService.updateBatchById(qualityTestStandards));
    }
}
src/main/java/com/ruoyi/quality/dto/QualityTestStandardBindingDto.java
@@ -8,4 +8,6 @@
public class QualityTestStandardBindingDto {
    private String productName;
    private Long qualityTestStandardBindingId;
}
src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
@@ -144,6 +144,8 @@
     * æŠ¥å·¥id
     */
    private Long productMainId;
    private Long productModelId;
    //不合格现象
    private String defectivePhenomena;
src/main/java/com/ruoyi/quality/service/QualityReportService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.quality.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.quality.pojo.QualityTestStandardParam;
/**
 * <p>
 * è´¨é‡ç®¡ç†çš„æŠ¥è¡¨ç®¡ç† æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-13 03:39:49
 */
public interface QualityReportService  {
}
src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -1,6 +1,7 @@
package com.ruoyi.quality.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
@@ -16,6 +17,7 @@
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.procurementrecord.dto.Details;
import com.ruoyi.procurementrecord.dto.ProcurementAddDto;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
import com.ruoyi.procurementrecord.service.ProcurementRecordService;
import com.ruoyi.quality.dto.QualityInspectDto;
import com.ruoyi.quality.mapper.QualityInspectMapper;
@@ -43,7 +45,9 @@
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -119,16 +123,45 @@
                ArrayList<Details> detailss = new ArrayList<>();
                Details details = new Details();
                details.setId(Math.toIntExact(qualityInspect.getProductId()));
                details.setId(Math.toIntExact(salesLedgerProduct.getId()));
                details.setInboundQuantity(qualityInspect.getQuantity());
                details.setWarnNum(salesLedgerProduct.getWarnNum());
                details.setUnitPrice(salesLedgerProduct.getTaxInclusiveUnitPrice());
                details.setTotalPrice(salesLedgerProduct.getTaxInclusiveTotalPrice());
                details.setProductModelId(qualityInspect.getProductModelId());
                detailss.add( details);
                procurementRecordOutAdd.setDetails(detailss);
                procurementRecordService.add(procurementRecordOutAdd);
            }
        }else if (qualityInspect.getInspectType() == 1) {
            //查询UnitPrice/TotalPrice
            ProcurementAddDto procurementRecordOutAdd = new ProcurementAddDto();
            procurementRecordOutAdd.setType(2);
            procurementRecordOutAdd.setTypeName("生产入库");
            procurementRecordOutAdd.setNickName(loginUser.getNickName());
            List<Details> details = new ArrayList<>();
            Details details1 = new Details();
            details1.setInboundQuantity(qualityInspect.getQuantity());
            details1.setProductModelId(qualityInspect.getProductModelId());
            procurementRecordOutAdd.setDetails(details);
            ProcurementRecordStorage.ProcurementRecordStorageBuilder procurementRecordBuilder = ProcurementRecordStorage.builder()
                    .salesLedgerProductId(details1.getId())
                    .inboundBatches( "生产半成品入库")
                    .inboundNum(details1.getInboundQuantity())
                    .type(2)
                    .warnNum(new BigDecimal(0))
                    .unitPrice(new BigDecimal(0))
                    .totalPrice(new BigDecimal(0))
                    .createTime(LocalDateTime.now())
                    .createUser(loginUser.getUserId())
                    .updateTime(LocalDateTime.now())
                    .updateUser(loginUser.getUserId())
                    .createBy(procurementRecordOutAdd.getNickName())
                    .productModelId(details1.getProductModelId());
            procurementRecordService.save(procurementRecordBuilder.build());
        }else if (qualityInspect.getInspectType() == 2) {
            //查询UnitPrice/TotalPrice
@@ -140,9 +173,10 @@
            List<Details> details = new ArrayList<>();
            Details details1 = new Details();
            details1.setInboundQuantity(qualityInspect.getQuantity());
            details1.setId(Math.toIntExact(salesLedgerProduct.getId()));
            details1.setId(Math.toIntExact(salesLedgerProduct.getProductId()));
            details1.setUnitPrice(salesLedgerProduct.getTaxInclusiveUnitPrice());
            details1.setTotalPrice(salesLedgerProduct.getTaxInclusiveTotalPrice());
            details1.setProductModelId(salesLedgerProduct.getProductModelId());
            details.add(details1);
            procurementRecordOutAdd.setDetails(details);
            procurementRecordService.add(procurementRecordOutAdd);
src/main/java/com/ruoyi/quality/service/impl/QualityReportServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.quality.service.impl;
import com.ruoyi.quality.service.QualityReportService;
import org.springframework.stereotype.Service;
@Service
public class QualityReportServiceImpl implements QualityReportService {
}
src/main/java/com/ruoyi/sales/controller/ReceiptPaymentController.java
@@ -10,6 +10,7 @@
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.purchase.dto.InvoicePurchaseDto;
import com.ruoyi.sales.dto.InvoiceLedgerDto;
import com.ruoyi.sales.dto.ReceiptPaymentDto;
import com.ruoyi.sales.dto.ReceiptPaymentRecordDto;
import com.ruoyi.sales.dto.SalesLedgerDto;
@@ -71,7 +72,7 @@
     * @return
     */
    @GetMapping("/customerInteractions")
    public AjaxResult customerInteractions (ReceiptPaymentDto receiptPaymentDto) {
    public AjaxResult customerInteractions (InvoiceLedgerDto receiptPaymentDto) {
        return AjaxResult.success(receiptPaymentService.customerInteractions(receiptPaymentDto));
    }
src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
@@ -77,7 +77,7 @@
            IPage<ProcurementPageDtoCopy> result = procurementRecordService.listPageCopyByProduction(new Page<>(1,-1), procurementDto);
            if(result.getRecords().size()>0) {
                ProcurementPageDtoCopy procurementDtoCopy = result.getRecords().get(0);
                if (item.getQuantity().compareTo(procurementDtoCopy.getInboundNum0()) >= 0) {
                if (item.getQuantity().compareTo(procurementDtoCopy.getInboundNum0()) >= 0 && item.getApproveStatus() == 0) {
                    item.setApproveStatus(1);
                    salesLedgerProductService.addOrUpdateSalesLedgerProduct(item);
                }
src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java
@@ -1,13 +1,16 @@
package com.ruoyi.sales.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.aftersalesservice.dto.AfterSalesServiceDto;
import com.ruoyi.aftersalesservice.pojo.AfterSalesService;
import com.ruoyi.common.utils.StringUtils;
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 com.ruoyi.sales.dto.SalesQuotationDto;
import com.ruoyi.sales.pojo.SalesQuotation;
import com.ruoyi.sales.service.SalesQuotationService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
@@ -29,6 +32,7 @@
        return AjaxResult.success(salesQuotationService.listPage(page, salesQuotationDto));
    }
    @PostMapping("/export")
    public void export(HttpServletResponse response) {
        Page page = new Page(-1,-1);
src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
@@ -9,7 +9,9 @@
import com.ruoyi.procurementrecord.dto.ProcurementAddDto;
import com.ruoyi.procurementrecord.dto.ProcurementRecordOutAdd;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
import com.ruoyi.procurementrecord.service.ProcurementRecordOutService;
import com.ruoyi.procurementrecord.service.ProcurementRecordService;
import com.ruoyi.sales.mapper.ShipmentApprovalMapper;
import com.ruoyi.sales.mapper.ShippingInfoMapper;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
@@ -26,6 +28,7 @@
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@@ -43,6 +46,8 @@
    private ISalesLedgerProductService salesLedgerProductService;
    @Autowired
    private ProcurementRecordOutService procurementRecordOutService;
    @Autowired
    private ProcurementRecordService procurementRecordStorageService;
    @GetMapping("/listPage")
    @ApiOperation("发货审批列表")
@@ -66,15 +71,22 @@
            SalesLedgerProduct salesLedgerProduct = salesLedgerProductService.getById(shipmentApproval.getSalesLedgerProductId());
            salesLedgerProduct.setApproveStatus(req.getApproveStatus());
            salesLedgerProductService.updateById(salesLedgerProduct);
            if(req.getApproveStatus()==3){
                ProcurementRecordStorage procurementRecordStorage = procurementRecordStorageService.getOne(new LambdaQueryWrapper<ProcurementRecordStorage>()
                        .eq(ProcurementRecordStorage::getSalesLedgerProductId, req.getSalesLedgerProductId()));
                if(procurementRecordStorage==null){
                    return AjaxResult.error("采购记录不存在");
                }
                //发货审批通过,生产该订单出库记录
                ProcurementRecordOutAdd procurementRecordOutAdd = new ProcurementRecordOutAdd();
                procurementRecordOutAdd.setId(procurementRecordStorage.getId());
                procurementRecordOutAdd.setSalesLedgerProductId(Math.toIntExact(salesLedgerProduct.getId()));
                procurementRecordOutAdd.setType(2);
                procurementRecordOutAdd.setUserId(Math.toIntExact(getUserId()));
                procurementRecordOutAdd.setQuantity(String.valueOf(salesLedgerProduct.getQuantity()));
                //获取当前时间
                LocalDateTime now = LocalDateTime.now();
                LocalDate now = LocalDate.now();
                procurementRecordOutAdd.setTime(now.toString());
                procurementRecordOutService.stockout(procurementRecordOutAdd);
            }
src/main/java/com/ruoyi/sales/dto/CustomerInteractionDto.java
@@ -17,6 +17,12 @@
    /** åº”收金额 */
    private BigDecimal unReceiptAmount;
    /** é”€å”®åˆåŒå· */
    private String salesContractNo;
    /** é‡‡è´­åˆåŒå· */
    private String purchaseContractNo;
    /** å‘生日期 */
    private LocalDate happenTime;
src/main/java/com/ruoyi/sales/dto/InvoiceLedgerDto.java
@@ -1,11 +1,14 @@
package com.ruoyi.sales.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.vo.FileVo;
import com.ruoyi.sales.pojo.InvoiceLedger;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
import java.util.List;
@Data
@@ -19,6 +22,9 @@
    @ApiModelProperty(value = "客户名称")
    private String customerName;
    @ApiModelProperty(value = "客户ID")
    private Integer customerId;
    @ApiModelProperty(value = "客户合同号")
    private String customerContractNo;
@@ -31,6 +37,10 @@
    @ApiModelProperty(value = "回款金额")
    private BigDecimal receiptPaymentAmount;
    @ApiModelProperty(value = "回款日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date receiptPaymentDate;
    @ApiModelProperty(value = "未回款金额")
    private BigDecimal unReceiptPaymentAmount;
src/main/java/com/ruoyi/sales/dto/SalesLedgerProductDto.java
@@ -50,4 +50,9 @@
    @Excel(name = "供应商名称")
    private String supplierName;
    /**
     * ä¾›åº”商id
     */
    private Long supplierId;
}
src/main/java/com/ruoyi/sales/dto/SalesQuotationDto.java
@@ -11,4 +11,10 @@
public class SalesQuotationDto extends SalesQuotation {
    @ApiModelProperty(value = "报价商品")
    private List<SalesQuotationProduct> products;
    /**
     * å®¡æ‰¹äººid列表
     */
    // å®¡æ‰¹äºº
    private String approveUserIds;
}
src/main/java/com/ruoyi/sales/mapper/ReceiptPaymentMapper.java
@@ -61,6 +61,13 @@
    List<CustomerInteractionDto> customerInteractions (ReceiptPaymentDto receiptPaymentDto);
    /**
     * å®¢æˆ·å›žæ¬¾è®°å½•查询
     * @param invoiceLedgerDto
     * @return
     */
    List<InvoiceLedgerDto> invoiceLedgerSalesAccount(@Param("invoiceLedgerDto") InvoiceLedgerDto invoiceLedgerDto);
    /**
     * æŸ¥è¯¢å›žæ¬¾è®°å½•不分页
     */
    List<ReceiptPaymentDto> receiptPaymentHistoryListNoPage( @Param("params") ReceiptPaymentDto receiptPaymentDto);
src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -214,11 +214,11 @@
    private BigDecimal pendingInvoiceTotal;
    @ApiModelProperty(value = "回款总金额")
    private BigDecimal invoiceTotal;
    private BigDecimal invoiceTotal = BigDecimal.ZERO;
    @ApiModelProperty(value = "待付款总金额")
    private BigDecimal pendingTicketsTotal;
    @ApiModelProperty(value = "付款总金额")
    private BigDecimal ticketsTotal;
    private BigDecimal ticketsTotal = BigDecimal.ZERO;
}
src/main/java/com/ruoyi/sales/pojo/SalesQuotation.java
@@ -7,6 +7,7 @@
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
@@ -43,7 +44,7 @@
    private String status;
    @ApiModelProperty(value = "报价总金额")
    @Excel(name = "报价金额")
    private Double totalAmount;
    private BigDecimal totalAmount;
    @ApiModelProperty(value = "备注")
    private String remark;
src/main/java/com/ruoyi/sales/service/ReceiptPaymentService.java
@@ -84,7 +84,7 @@
     * @param receiptPaymentDto
     * @return
     */
    List<CustomerInteractionDto> customerInteractions (ReceiptPaymentDto receiptPaymentDto);
    List<InvoiceLedgerDto> customerInteractions (InvoiceLedgerDto receiptPaymentDto);
    /**
     * æŸ¥è¯¢å›žæ¬¾è®°å½•分页
src/main/java/com/ruoyi/sales/service/impl/ReceiptPaymentServiceImpl.java
@@ -256,59 +256,8 @@
     * @return
     */
    @Override
    public List<CustomerInteractionDto> customerInteractions(ReceiptPaymentDto receiptPaymentDto) {
        ArrayList<CustomerInteractionDto> result = new ArrayList<>();
        List<CustomerInteractionDto> customerInteractionDtos = receiptPaymentMapper.customerInteractions(receiptPaymentDto);
        if(CollectionUtils.isEmpty(customerInteractionDtos)){
            return result;
        }
        // åº”收总金额金额计算
        BigDecimal amountTotal = BigDecimal.ZERO;
        Map<LocalDate, List<CustomerInteractionDto>> dateListMap = customerInteractionDtos.stream().collect(
                Collectors.groupingBy(
                        CustomerInteractionDto::getHappenTime,
                        LinkedHashMap::new,
                        Collectors.toList()
                )
        );
        for (LocalDate localDate : dateListMap.keySet()) {
            BigDecimal currentReceiptAmount = BigDecimal.ZERO;
            BigDecimal invoiceAmount = BigDecimal.ZERO;
            BigDecimal currentDateTotal = BigDecimal.ZERO;
            List<CustomerInteractionDto> customerInteractionDtoList = dateListMap.get(localDate);
            // è®¡ç®—当天收款数
            currentReceiptAmount = customerInteractionDtoList.stream()
                    .filter(item ->item.getType() == 0)
                    .map(CustomerInteractionDto::getReceiptAmount)
                    .reduce(BigDecimal.ZERO,BigDecimal::add);
            // è®¡ç®—当天开票数
            invoiceAmount = customerInteractionDtoList.stream()
                    .filter(item ->item.getType() == 1)
                    .map(CustomerInteractionDto::getInvoiceAmount)
                    .reduce(BigDecimal.ZERO,BigDecimal::add);
            // è®¡ç®—当日汇总
            currentDateTotal = currentDateTotal.add(invoiceAmount).subtract(currentReceiptAmount);
            CustomerInteractionDto customerInteractionDto = new CustomerInteractionDto();
            customerInteractionDto.setHappenTime(localDate);
            customerInteractionDto.setInvoiceAmount(invoiceAmount);
            customerInteractionDto.setReceiptAmount(currentReceiptAmount);
            amountTotal = customerInteractionDto.getInvoiceAmount().subtract(customerInteractionDto.getReceiptAmount());
            customerInteractionDto.setUnReceiptAmount(amountTotal);
            result.add(customerInteractionDto);
        }
        ArrayList<CustomerInteractionDto> newResult = new ArrayList<>();
        for (int i = 0; i < result.size(); i++) {
            CustomerInteractionDto customerInteractionDto = result.get(i);
            if (i == 0) {
                customerInteractionDto.setUnReceiptAmount(customerInteractionDto.getInvoiceAmount().subtract(customerInteractionDto.getReceiptAmount()));
            }else {
                CustomerInteractionDto customerInteractionDto1 = result.get(i-1);
                customerInteractionDto.setUnReceiptAmount(customerInteractionDto1.getUnReceiptAmount()
                        .add(customerInteractionDto.getInvoiceAmount()).subtract(customerInteractionDto.getReceiptAmount()));
            }
            newResult.add(customerInteractionDto);
        }
        return newResult;
    public List<InvoiceLedgerDto> customerInteractions(InvoiceLedgerDto receiptPaymentDto) {
        return receiptPaymentMapper.invoiceLedgerSalesAccount(receiptPaymentDto);
    }
    /**
src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java
@@ -6,7 +6,16 @@
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.approve.pojo.ApproveProcess;
import com.ruoyi.approve.service.IApproveProcessService;
import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl;
import com.ruoyi.approve.vo.ApproveGetAndUpdateVo;
import com.ruoyi.approve.vo.ApproveProcessVO;
import com.ruoyi.common.utils.OrderUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.uuid.UUID;
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.sales.dto.SalesQuotationDto;
import com.ruoyi.sales.mapper.SalesQuotationMapper;
import com.ruoyi.sales.mapper.SalesQuotationProductMapper;
@@ -19,6 +28,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.util.List;
import java.util.stream.Collectors;
@@ -31,6 +41,9 @@
    private SalesQuotationProductMapper salesQuotationProductMapper;
    @Autowired
    private SalesQuotationProductService salesQuotationProductService;
    @Autowired
    private ApproveProcessServiceImpl approveProcessService;
    @Override
    public IPage<SalesQuotationDto> listPage(Page page, SalesQuotationDto salesQuotationDto) {
        IPage<SalesQuotationDto> salesQuotationDtoIPage = salesQuotationMapper.listPage(page, salesQuotationDto);
@@ -46,29 +59,49 @@
    @Override
    public boolean add(SalesQuotationDto salesQuotationDto) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        SalesQuotation salesQuotation = new SalesQuotation();
        BeanUtils.copyProperties(salesQuotationDto, salesQuotation);
        String quotationNo = salesQuotation.getQuotationNo();
        String quotationNo = OrderUtils.countTodayByCreateTime(salesQuotationMapper, "QT");
        salesQuotation.setQuotationNo(quotationNo);
        salesQuotation.setStatus("待审批");
        salesQuotationMapper.insert(salesQuotation);
//        if(salesQuotationMapper.insert(salesQuotation)!=1){
//            return false;
//        }
        if(CollectionUtils.isEmpty(salesQuotationDto.getProducts())){
            return true;
        }
        List<SalesQuotationProduct> products = salesQuotationDto.getProducts().stream().map(product -> {
            SalesQuotationProduct salesQuotationProduct = new SalesQuotationProduct();
            BeanUtils.copyProperties(product, salesQuotationProduct);
            salesQuotationProduct.setSalesQuotationId(salesQuotationMapper.selectOne(new LambdaQueryWrapper<SalesQuotation>().eq(SalesQuotation::getQuotationNo, quotationNo)).getId());
            salesQuotationProduct.setSalesQuotationId(salesQuotation.getId());
            return salesQuotationProduct;
        }).collect(Collectors.toList());
        salesQuotationProductService.saveBatch(products);
        // æŠ¥ä»·å®¡æ‰¹
        ApproveProcessVO approveProcessVO = new ApproveProcessVO();
        approveProcessVO.setApproveType(6);
        approveProcessVO.setApproveDeptId(loginUser.getTenantId());
        approveProcessVO.setApproveReason(quotationNo);
        approveProcessVO.setApproveUserIds(salesQuotationDto.getApproveUserIds());
        approveProcessVO.setApproveUser(loginUser.getUserId());
        approveProcessVO.setApproveTime(LocalDate.now().toString());
        approveProcessVO.setPrice(salesQuotationDto.getTotalAmount());
        try {
            approveProcessService.addApprove(approveProcessVO);
        }catch (Exception e){
            log.error("SalesQuotationServiceImpl error:{}", e);
            throw new RuntimeException("审批失败");
        }
        return true;
    }
    @Override
    public boolean edit(SalesQuotationDto salesQuotationDto) {
        SalesQuotation salesQuotation = new SalesQuotation();
        BeanUtils.copyProperties(salesQuotationDto, salesQuotation);
        ApproveGetAndUpdateVo vo = new ApproveGetAndUpdateVo();
        if("拒绝".equals(salesQuotationDto.getStatus())){
            vo.setApproveStatus(0);
            salesQuotation.setStatus("待审批");
        }
        if(salesQuotationMapper.updateById(salesQuotation)!=1){
            return false;
        }
@@ -82,7 +115,13 @@
            salesQuotationProduct.setSalesQuotationId(salesQuotation.getId());
            return salesQuotationProduct;
        }).collect(Collectors.toList());
        salesQuotationProductService.saveBatch(products);
        // ä¿®æ”¹æŠ¥ä»·å®¡æ‰¹
        vo.setApproveUserIds(salesQuotationDto.getApproveUserIds());
        vo.setApproveType(6);
        vo.setApproveReason(salesQuotationDto.getQuotationNo());
        approveProcessService.updateApproveUser(vo);
        return true;
    }
    @Override
src/main/java/com/ruoyi/staff/pojo/StaffJoinLeaveRecord.java
@@ -188,6 +188,18 @@
    @Excel(name = "备注(福利待遇)")
    private String remark;
    /**
     * ç¦»èŒåŽŸå› 
     */
    @Excel(name = "离职原因",readConverterExp = "salary=薪资待遇,career_development=职业发展,work_environment=工作环境,personal_reason=个人原因,other=其他")
    private String dimissionReason;
    /**
     * ç¦»èŒå¤‡æ³¨
     */
    @Excel(name = "离职备注")
    private String dimissionRemark;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
src/main/java/com/ruoyi/staff/service/impl/StaffJoinLeaveRecordServiceImpl.java
@@ -24,6 +24,8 @@
import java.util.*;
import java.util.function.Function;
import static com.ruoyi.common.enums.StaffJoinLeaveRecordDimissionReason.StaffJoinLeaveRecordDimissionReasonOther;
@Service
@AllArgsConstructor
@Transactional(rollbackFor = Exception.class)
@@ -77,6 +79,12 @@
                staffOnJobMapper.updateById(staffOnJob);
            }else {
                throw new BaseException("没有找到"+staffJoinLeaveRecord.getStaffNo()+"编号的员工,无法新增离职!!!");
            }
            if (staffJoinLeaveRecord.getDimissionReason()==null){
                throw new BaseException("离职原因不能为空!!!");
            }
            if (!StaffJoinLeaveRecordDimissionReasonOther.getCode().equals(staffJoinLeaveRecord.getDimissionReason())){
                staffJoinLeaveRecord.setDimissionRemark("");
            }
        }
        return staffJoinLeaveRecordMapper.insert(staffJoinLeaveRecord);
@@ -168,6 +176,12 @@
        }else {
            /*离职*/
            //离职的编辑不会影响在职表
            if (staffJoinLeaveRecord.getDimissionReason()==null){
                throw new BaseException("离职原因不能为空!!!");
            }
            if (!StaffJoinLeaveRecordDimissionReasonOther.getCode().equals(staffJoinLeaveRecord.getDimissionReason())){
                staffJoinLeaveRecord.setDimissionRemark("");
            }
        }
        return staffJoinLeaveRecordMapper.updateById(staffJoinLeaveRecord);
    }
src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
@@ -353,4 +353,9 @@
              </if>
          </where>
    </select>
    <select id="getSumQuantity" resultType="BigDecimal">
        select COALESCE(sum(inbound_num), 0)
        from procurement_record_storage
        where product_model_id = #{productModelId}
    </select>
</mapper>
src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml
@@ -169,4 +169,11 @@
        </where>
        order by t1.create_time desc
    </select>
    <select id="getSumQuantity" resultType="BigDecimal">
        select COALESCE(sum(inbound_num), 0)
        from procurement_record_out
        where type = 1
          and product_model_id = #{productModelId}
    </select>
</mapper>
src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml
@@ -183,5 +183,40 @@
        </where>
        ORDER BY T1.payment_date,T1.create_time DESC
    </select>
    <select id="supplierNameListPage" resultType="com.ruoyi.purchase.dto.PaymentRegistrationDto">
        SELECT
        T1.supplier_id,
        T1.supplier_name,
        SUM(contract_amount) AS invoiceAmount,
        IFNULL( SUM(T2.current_payment_amount) , 0 ) AS paymentAmount,
        IFNULL((IFNULL(SUM(contract_amount),0)  - IFNULL(SUM(T2.current_payment_amount),0)),0) AS payableAmount
        FROM purchase_ledger T1
        LEFT JOIN payment_registration T2 ON T1.id = T2.sales_ledger_id
        <where>
            <if test="req.supplierName != null and req.supplierName != '' ">
                T1.supplier_name LIKE CONCAT ('%',#{req.supplierName},'%')
            </if>
        </where>
        GROUP BY T1.supplier_name
    </select>
    <select id="supplierNameListPageDetails" resultType="com.ruoyi.purchase.dto.PaymentRegistrationDto">
        SELECT
        T1.supplier_id,
        T1.supplier_name,
        SUM(contract_amount) AS invoiceAmount,
        IFNULL( SUM(T2.current_payment_amount) , 0 ) AS paymentAmount,
        IFNULL((IFNULL(SUM(contract_amount),0)  - IFNULL(SUM(T2.current_payment_amount),0)),0) AS payableAmount,
        T1.purchase_contract_number,
        T2.payment_date
        FROM purchase_ledger T1
        LEFT JOIN payment_registration T2 ON T1.id = T2.sales_ledger_id
        <where>
            T1.supplier_id = #{req.supplierId}
            <if test="req.supplierName != null and req.supplierName != '' ">
                T1.supplier_name LIKE CONCAT ('%',#{req.supplierName},'%')
            </if>
        </where>
        GROUP BY  T1.purchase_contract_number,T2.payment_date
    </select>
</mapper>
src/main/resources/mapper/quality/QualityTestStandardBindingMapper.xml
@@ -14,7 +14,8 @@
        <result column="tenant_id" property="tenantId"/>
    </resultMap>
    <select id="listBinding" resultType="com.ruoyi.quality.dto.QualityTestStandardBindingDto">
        select *
        select t2.product_name,
               t1.id qualityTestStandardBindingId
        from quality_test_standard_binding t1
                 left join product t2 on t1.product_id = t2.id
        where t1.test_standard_id = #{testStandardId}
src/main/resources/mapper/quality/QualityTestStandardMapper.xml
@@ -7,17 +7,17 @@
        FROM quality_test_standard
        where
        1=1
        <if test="qualityTestStandard.standardNo != null and qualityTestStandard.standardNo != '' ">
            AND standard_no like concat('%',#{qualityTestStandard.standardNo},'%')
        <if test="c.standardNo != null and c.standardNo != '' ">
            AND standard_no like concat('%',#{c.standardNo},'%')
        </if>
        <if test="qualityTestStandard.standardName != null and qualityTestStandard.standardName != '' ">
            AND standard_name like concat('%',#{qualityTestStandard.standardName},'%')
        <if test="c.standardName != null and c.standardName != '' ">
            AND standard_name like concat('%',#{c.standardName},'%')
        </if>
        <if test="qualityTestStandard.state != null and qualityTestStandard.state != '' ">
            AND state = #{qualityTestStandard.state}
        <if test="c.state != null and c.state != '' ">
            AND state = #{c.state}
        </if>
        <if test="qualityTestStandard.inspectType != null and qualityTestStandard.inspectType != '' ">
            AND inspect_type = #{qualityTestStandard.inspectType}
        <if test="c.inspectType != null and c.inspectType != '' ">
            AND inspect_type = #{c.inspectType}
        </if>
    </select>
</mapper>
src/main/resources/mapper/quality/QualityTestStandardParamMapper.xml
@@ -21,7 +21,7 @@
        select t1.* from quality_test_standard_param t1
        left join quality_test_standard t2 on t1.test_standard_id = t2.id
        left join quality_test_standard_binding t3 on t2.id = t3.test_standard_id
        where product_id = #{productId}
        where t3.product_id = #{productId}
    </select>
</mapper>
src/main/resources/mapper/sales/InvoiceLedgerMapper.xml
@@ -111,22 +111,19 @@
    <select id="invoiceLedgerSalesAccount" resultType="com.ruoyi.sales.dto.InvoiceLedgerDto">
        SELECT
            T4.id,T4.customer_name ,
            SUM(invoice_total) AS invoice_total,
            IFNULL( SUM(T5.receipt_payment_amount) , 0 ) AS receipt_payment_amount,
            IFNULL((IFNULL(SUM(invoice_total),0)  - IFNULL(SUM(T5.receipt_payment_amount),0)),0) AS unReceipt_payment_amount
        FROM
            invoice_ledger T1
                LEFT JOIN invoice_registration_product T2 ON T1.invoice_registration_product_id = T2.id
                LEFT JOIN sales_ledger T3 ON T3.id = T2.sales_ledger_id
                LEFT JOIN customer T4 ON T4.id = T3.customer_id
                LEFT JOIN ( SELECT invoice_ledger_id, SUM( receipt_payment_amount ) AS receipt_payment_amount FROM receipt_payment GROUP BY invoice_ledger_id ) T5 ON T5.invoice_ledger_id = T1.id
            T1.customer_id as id,
            T1.customer_name,
            SUM(contract_amount) AS invoice_total,
            IFNULL( SUM(T2.receipt_payment_amount) , 0 ) AS receipt_payment_amount,
            IFNULL((IFNULL(SUM(contract_amount),0)  - IFNULL(SUM(T2.receipt_payment_amount),0)),0) AS unReceipt_payment_amount
        FROM sales_ledger T1
        LEFT JOIN receipt_payment T2 ON T1.id = T2.sales_ledger_id
        <where>
            <if test="invoiceLedgerDto.searchText != null and invoiceLedgerDto.searchText != '' ">
                T4.customer_name LIKE CONCAT ('%',#{invoiceLedgerDto.searchText},'%')
                T1.customer_name LIKE CONCAT ('%',#{invoiceLedgerDto.searchText},'%')
            </if>
        </where>
        GROUP BY T4.id,T4.customer_name
        GROUP BY T1.customer_name
    </select>
    <select id="invoiceLedgerProductInfo" resultType="com.ruoyi.sales.dto.InvoiceRegistrationProductDto">
src/main/resources/mapper/sales/ReceiptPaymentMapper.xml
@@ -432,5 +432,22 @@
        </where>
    </select>
    <select id="invoiceLedgerSalesAccount" resultType="com.ruoyi.sales.dto.InvoiceLedgerDto">
        SELECT
        T1.sales_contract_no,
        SUM(contract_amount) AS invoice_total,
        IFNULL( SUM(T2.receipt_payment_amount) , 0 ) AS receipt_payment_amount,
        IFNULL((IFNULL(SUM(contract_amount),0)  - IFNULL(SUM(T2.receipt_payment_amount),0)),0) AS unReceipt_payment_amount,
        T2.receipt_payment_date
        FROM sales_ledger T1
        LEFT JOIN receipt_payment T2 ON T1.id = T2.sales_ledger_id
        <where>
            T1.customer_id = #{invoiceLedgerDto.customerId}
            <if test="invoiceLedgerDto.searchText != null and invoiceLedgerDto.searchText != '' ">
                T1.customer_name LIKE CONCAT ('%',#{invoiceLedgerDto.searchText},'%')
            </if>
        </where>
        GROUP BY T1.sales_contract_no,T2.receipt_payment_date
    </select>
</mapper>
src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -11,7 +11,7 @@
        t3.shipping_date
        FROM
        sales_ledger_product T1
        left join shipping_info t3 on T1.id = t3.sales_ledger_id
        left join shipping_info t3 on T1.id = t3.sales_ledger_product_id
        <where>
            1=1
            <if test="salesLedgerProduct.salesLedgerId != null and salesLedgerProduct.salesLedgerId != '' ">
@@ -68,6 +68,7 @@
        select slp.*,
        sl.project_name,
        sl.supplier_name,
        sl.supplier_id,
        sl.sales_contract_no,
        sl.purchase_contract_number
        from sales_ledger_product slp
src/main/resources/mapper/sales/SalesQuotationMapper.xml
@@ -4,16 +4,19 @@
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.sales.mapper.SalesQuotationMapper">
    <select id="listPage" resultType="com.ruoyi.sales.dto.SalesQuotationDto">
        SELECT * FROM sales_quotation
        SELECT t1.*,
               t2.approve_user_ids
        FROM sales_quotation t1
        LEFT JOIN approve_process t2 ON t1.quotation_no = t2.approve_reason and t2.approve_type = 6
        WHERE 1=1
        <if test="salesQuotationDto.quotationNo != null and salesQuotationDto.quotationNo != '' ">
            AND quotation_no LIKE CONCAT('%',#{salesQuotationDto.quotationNo},'%')
            AND t1.quotation_no LIKE CONCAT('%',#{salesQuotationDto.quotationNo},'%')
        </if>
        <if test="salesQuotationDto.customer != null and salesQuotationDto.customer != '' ">
            AND customer = #{salesQuotationDto.customer}
            AND t1.customer = #{salesQuotationDto.customer}
        </if>
        <if test="salesQuotationDto.status != null and salesQuotationDto.status != '' ">
            AND status = #{salesQuotationDto.status}
            AND t1.status = #{salesQuotationDto.status}
        </if>
    </select>
</mapper>