liding
5 天以前 dce840653b78fc05a732c5c89773c74e15dbed09
采购管理系统模块优化
已修改12个文件
已添加8个文件
599 ■■■■■ 文件已修改
src/main/java/com/ruoyi/basic/controller/SupplierManageController.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/dto/SupplierArchiveDetailVo.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/dto/SupplierArchiveSaveDto.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/dto/SupplierManageDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/mapper/SupplierCooperationRecordMapper.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/mapper/SupplierProductMapper.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/mapper/SupplierQualificationMapper.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/pojo/SupplierCooperationRecord.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/pojo/SupplierManage.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/pojo/SupplierProduct.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/pojo/SupplierQualification.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/ISupplierService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/enums/FileNameType.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/pojo/TicketRegistration.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/basic/SupplierManageMapper.xml 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/controller/SupplierManageController.java
@@ -2,10 +2,13 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.dto.SupplierManageDto;
import com.ruoyi.basic.dto.SupplierArchiveSaveDto;
import com.ruoyi.basic.pojo.SupplierCooperationRecord;
import com.ruoyi.basic.pojo.Customer;
import com.ruoyi.basic.pojo.SupplierManage;
import com.ruoyi.basic.service.ISupplierService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
@@ -13,12 +16,16 @@
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@RestController
@RequestMapping("/system/supplier")
@Api(tags = "供应商档案")
public class SupplierManageController {
    @Autowired
@@ -30,6 +37,7 @@
     * @return
     */
    @PostMapping("/add")
    @ApiOperation("新增供应商")
    public AjaxResult add(@RequestBody SupplierManage supplierManage) {
        supplierService.saveSupplier(supplierManage);
        return AjaxResult.success();
@@ -41,6 +49,7 @@
     * @return
     */
    @DeleteMapping("/del")
    @ApiOperation("删除供应商")
    public AjaxResult delSupplier(@RequestBody List<Integer> ids) {
        if(CollectionUtils.isEmpty(ids)){
            return AjaxResult.error("请选择至少一条数据");
@@ -55,6 +64,7 @@
     * @return
     */
    @GetMapping("/{id}")
    @ApiOperation("供应商详情")
    public AjaxResult supplierDetail(@PathVariable("id") Integer id) {
        return AjaxResult.success(supplierService.supplierDetail(id));
    }
@@ -65,6 +75,7 @@
     * @return
     */
    @PostMapping("/update")
    @ApiOperation("修改供应商")
    public AjaxResult update(@RequestBody SupplierManage supplierManage) {
        supplierService.supplierUpdate(supplierManage);
        return AjaxResult.success();
@@ -77,6 +88,7 @@
     * @return
     */
    @GetMapping("/listPage")
    @ApiOperation("供应商分页查询")
    public AjaxResult supplierListPage(Page page, SupplierManageDto supplierManageDto) {
        return AjaxResult.success(supplierService.supplierListPage(page, supplierManageDto));
    }
@@ -117,7 +129,30 @@
     * @return
     */
    @GetMapping("/getOptions")
    @ApiOperation("供应商选项")
    public AjaxResult getOptions() {
        return AjaxResult.success(supplierService.list());
        return AjaxResult.success(supplierService.lambdaQuery().eq(SupplierManage::getCooperationStatus,1)
                .eq(SupplierManage::getDeleteFlag,0)
                .eq(SupplierManage::getTenantId, SecurityUtils.getLoginUser().getTenantId()).list());
    }
    @GetMapping("/{id}/archive")
    @ApiOperation("供应商完整档案")
    public AjaxResult archive(@PathVariable Integer id) {
        return AjaxResult.success(supplierService.supplierArchiveDetail(id));
    }
    @PostMapping("/archive/save")
    @ApiOperation("保存供应商完整档案")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult saveArchive(@RequestBody SupplierArchiveSaveDto archive) {
        return AjaxResult.success(supplierService.saveArchive(archive));
    }
    @PostMapping("/{id}/cooperation")
    @ApiOperation("新增供应商合作记录")
    public AjaxResult addCooperation(@PathVariable Integer id, @RequestBody SupplierCooperationRecord record) {
        supplierService.addCooperationRecord(id, record);
        return AjaxResult.success();
    }
}
src/main/java/com/ruoyi/basic/dto/SupplierArchiveDetailVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.basic.dto;
import com.ruoyi.basic.pojo.SupplierCooperationRecord;
import com.ruoyi.basic.pojo.SupplierManage;
import com.ruoyi.basic.pojo.SupplierProduct;
import com.ruoyi.basic.pojo.SupplierQualification;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
public class SupplierArchiveDetailVo {
    @ApiModelProperty("供应商主档") private SupplierManage supplier;
    @ApiModelProperty("资质证明列表") private List<SupplierQualification> qualifications;
    @ApiModelProperty("供应产品列表") private List<SupplierProduct> products;
    @ApiModelProperty("合作评价列表") private List<SupplierCooperationRecord> cooperationRecords;
    @ApiModelProperty("采购合同数量") private Long purchaseCount;
    @ApiModelProperty("采购总额") private BigDecimal purchaseAmount;
    @ApiModelProperty("已来票金额") private BigDecimal invoicedAmount;
}
src/main/java/com/ruoyi/basic/dto/SupplierArchiveSaveDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.basic.dto;
import com.ruoyi.basic.pojo.SupplierManage;
import com.ruoyi.basic.pojo.SupplierProduct;
import com.ruoyi.basic.pojo.SupplierQualification;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class SupplierArchiveSaveDto {
    @ApiModelProperty("供应商主档") private SupplierManage supplier;
    @ApiModelProperty("资质证明列表") private List<SupplierQualification> qualifications;
    @ApiModelProperty("供应产品列表") private List<SupplierProduct> products;
}
src/main/java/com/ruoyi/basic/dto/SupplierManageDto.java
@@ -9,4 +9,7 @@
    @ApiModelProperty(value = "维护人员名称")
    private String maintainUserName;
    @ApiModelProperty(value = "供应产品搜索关键字")
    private String productKeyword;
}
src/main/java/com/ruoyi/basic/mapper/SupplierCooperationRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,4 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.basic.pojo.SupplierCooperationRecord;
public interface SupplierCooperationRecordMapper extends BaseMapper<SupplierCooperationRecord> { }
src/main/java/com/ruoyi/basic/mapper/SupplierProductMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,4 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.basic.pojo.SupplierProduct;
public interface SupplierProductMapper extends BaseMapper<SupplierProduct> { }
src/main/java/com/ruoyi/basic/mapper/SupplierQualificationMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,4 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.basic.pojo.SupplierQualification;
public interface SupplierQualificationMapper extends BaseMapper<SupplierQualification> { }
src/main/java/com/ruoyi/basic/pojo/SupplierCooperationRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
@TableName("supplier_cooperation_record")
public class SupplierCooperationRecord {
    @TableId(type = IdType.AUTO) @ApiModelProperty("主键ID") private Long id;
    @ApiModelProperty("供应商ID") private Long supplierId;
    @JsonFormat(pattern="yyyy-MM-dd") @ApiModelProperty("合作日期") private LocalDate cooperationDate;
    @ApiModelProperty("合作类型") private String cooperationType;
    @ApiModelProperty("关联业务ID") private Long businessId;
    @ApiModelProperty("关联业务编号") private String businessNo;
    @ApiModelProperty("涉及金额") private BigDecimal amount;
    @ApiModelProperty("评价结果") private String result;
    @ApiModelProperty("评分") private BigDecimal rating;
    @ApiModelProperty("合作记录内容") private String description;
    @ApiModelProperty("租户ID") private Long tenantId;
    @ApiModelProperty("创建用户ID") private Long createUser;
    @ApiModelProperty("更新用户ID") private Long updateUser;
    @ApiModelProperty("创建时间") private LocalDateTime createTime;
    @ApiModelProperty("更新时间") private LocalDateTime updateTime;
    @ApiModelProperty("删除标志") private Integer deleteFlag;
}
src/main/java/com/ruoyi/basic/pojo/SupplierManage.java
@@ -14,8 +14,47 @@
public class SupplierManage {
    @TableId(value = "id", type = IdType.AUTO)
    @ApiModelProperty(value = "供应商ID")
    private Integer id;
    @ApiModelProperty(value = "供应商编码")
    private String supplierCode;
    @ApiModelProperty(value = "供应商简称")
    private String supplierShortName;
    @ApiModelProperty(value = "供应商分类")
    private String supplierCategory;
    @ApiModelProperty(value = "供应商等级")
    private String supplierLevel;
    @ApiModelProperty(value = "合作状态:0停用,1合作中,2暂停")
    private Integer cooperationStatus;
    @ApiModelProperty(value = "首次合作日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate cooperationStartDate;
    @ApiModelProperty(value = "资质状态:0待完善,1有效,2即将到期,3已过期")
    private Integer qualificationStatus;
    @ApiModelProperty(value = "最近资质到期日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate qualificationExpiryDate;
    @ApiModelProperty(value = "供应产品摘要")
    private String suppliedProductsSummary;
    @ApiModelProperty(value = "合作历史摘要")
    private String cooperationHistorySummary;
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "删除标志:0正常,1删除")
    private Integer deleteFlag;
    @ApiModelProperty(value = "供应商名称")
    @Excel(name = "供应商名称")
    private String supplierName;
src/main/java/com/ruoyi/basic/pojo/SupplierProduct.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@TableName("supplier_product")
public class SupplierProduct {
    @TableId(type = IdType.AUTO) @ApiModelProperty("主键ID") private Long id;
    @ApiModelProperty("供应商ID") private Long supplierId;
    @ApiModelProperty("产品名称") private String productName;
    @ApiModelProperty("产品分类") private String productCategory;
    @ApiModelProperty("规格型号") private String specificationModel;
    @ApiModelProperty("品牌") private String brand;
    @ApiModelProperty("单位") private String unit;
    @ApiModelProperty("最小起订量") private BigDecimal minOrderQuantity;
    @ApiModelProperty("供货周期(天)") private Integer leadTimeDays;
    @ApiModelProperty("参考单价") private BigDecimal referencePrice;
    @ApiModelProperty("币种") private String currency;
    @ApiModelProperty("状态:0停供,1供应中") private Integer status;
    @ApiModelProperty("备注") private String remark;
    @ApiModelProperty("租户ID") private Long tenantId;
    @ApiModelProperty("创建用户ID") private Long createUser;
    @ApiModelProperty("更新用户ID") private Long updateUser;
    @ApiModelProperty("创建时间") private LocalDateTime createTime;
    @ApiModelProperty("更新时间") private LocalDateTime updateTime;
    @ApiModelProperty("删除标志") private Integer deleteFlag;
}
src/main/java/com/ruoyi/basic/pojo/SupplierQualification.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
@TableName("supplier_qualification")
public class SupplierQualification {
    @TableId(type = IdType.AUTO) @ApiModelProperty("主键ID") private Long id;
    @ApiModelProperty("供应商ID") private Long supplierId;
    @ApiModelProperty("资质名称") private String qualificationName;
    @ApiModelProperty("资质类型") private String qualificationType;
    @ApiModelProperty("证书编号") private String certificateNo;
    @ApiModelProperty("发证机构") private String issuingAuthority;
    @JsonFormat(pattern="yyyy-MM-dd") @ApiModelProperty("发证日期") private LocalDate issueDate;
    @JsonFormat(pattern="yyyy-MM-dd") @ApiModelProperty("到期日期") private LocalDate expiryDate;
    @ApiModelProperty("是否长期有效:0否,1是") private Integer longTermValid;
    @ApiModelProperty("状态:0待审核,1有效,2过期,3作废") private Integer status;
    @ApiModelProperty("备注") private String remark;
    @ApiModelProperty("租户ID") private Long tenantId;
    @ApiModelProperty("创建用户ID") private Long createUser;
    @ApiModelProperty("更新用户ID") private Long updateUser;
    @ApiModelProperty("创建时间") private LocalDateTime createTime;
    @ApiModelProperty("更新时间") private LocalDateTime updateTime;
    @ApiModelProperty("删除标志") private Integer deleteFlag;
}
src/main/java/com/ruoyi/basic/service/ISupplierService.java
@@ -4,6 +4,9 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.basic.dto.SupplierManageDto;
import com.ruoyi.basic.dto.SupplierArchiveDetailVo;
import com.ruoyi.basic.dto.SupplierArchiveSaveDto;
import com.ruoyi.basic.pojo.SupplierCooperationRecord;
import com.ruoyi.basic.pojo.SupplierManage;
import com.ruoyi.framework.web.domain.AjaxResult;
import org.springframework.web.multipart.MultipartFile;
@@ -57,4 +60,10 @@
    void supplierExport(HttpServletResponse response, SupplierManageDto supplierManageDto);
    Boolean importData(MultipartFile file);
    SupplierArchiveDetailVo supplierArchiveDetail(Integer id);
    Integer saveArchive(SupplierArchiveSaveDto archive);
    void addCooperationRecord(Integer supplierId, SupplierCooperationRecord record);
}
src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java
@@ -6,8 +6,16 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.dto.SupplierManageDto;
import com.ruoyi.basic.dto.SupplierArchiveDetailVo;
import com.ruoyi.basic.dto.SupplierArchiveSaveDto;
import com.ruoyi.basic.excel.SupplierManageExcelDto;
import com.ruoyi.basic.mapper.SupplierManageMapper;
import com.ruoyi.basic.mapper.SupplierQualificationMapper;
import com.ruoyi.basic.mapper.SupplierProductMapper;
import com.ruoyi.basic.mapper.SupplierCooperationRecordMapper;
import com.ruoyi.basic.pojo.SupplierQualification;
import com.ruoyi.basic.pojo.SupplierProduct;
import com.ruoyi.basic.pojo.SupplierCooperationRecord;
import com.ruoyi.basic.pojo.Customer;
import com.ruoyi.basic.pojo.SupplierManage;
import com.ruoyi.basic.service.ISupplierService;
@@ -16,13 +24,19 @@
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
import com.ruoyi.purchase.pojo.PurchaseLedger;
import com.ruoyi.purchase.mapper.TicketRegistrationMapper;
import com.ruoyi.purchase.pojo.TicketRegistration;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.math.BigDecimal;
import java.util.stream.Collectors;
import java.util.ArrayList;
import java.util.List;
@@ -33,6 +47,10 @@
    private SupplierManageMapper supplierMapper;
    @Autowired
    private PurchaseLedgerMapper purchaseLedgerMapper;
    @Autowired private TicketRegistrationMapper ticketRegistrationMapper;
    @Autowired private SupplierQualificationMapper qualificationMapper;
    @Autowired private SupplierProductMapper productMapper;
    @Autowired private SupplierCooperationRecordMapper cooperationMapper;
    /**
     * ä¾›åº”商新增
@@ -41,12 +59,24 @@
     */
    @Override
    public void saveSupplier(SupplierManage supplierManage) {
        Long tenantId = SecurityUtils.getLoginUser().getTenantId();
        LambdaQueryWrapper<SupplierManage> supplierManageLambdaQueryWrapper = new LambdaQueryWrapper<>();
        supplierManageLambdaQueryWrapper.eq(SupplierManage::getSupplierName,supplierManage.getSupplierName());
        supplierManageLambdaQueryWrapper.eq(SupplierManage::getSupplierName,supplierManage.getSupplierName())
                .eq(SupplierManage::getTenantId, tenantId).eq(SupplierManage::getDeleteFlag, 0);
        if (supplierMapper.selectCount(supplierManageLambdaQueryWrapper) > 0) {
            throw new RuntimeException("供应商已存在");
        }
        supplierManage.setTenantId(tenantId);
        supplierManage.setDeleteFlag(0);
        supplierManage.setCooperationStatus(supplierManage.getCooperationStatus() == null ? 1 : supplierManage.getCooperationStatus());
        supplierManage.setQualificationStatus(supplierManage.getQualificationStatus() == null ? 0 : supplierManage.getQualificationStatus());
        supplierManage.setMaintainUserId(SecurityUtils.getUserId().intValue());
        supplierManage.setMaintainTime(LocalDate.now());
        supplierMapper.insert(supplierManage);
        if (supplierManage.getSupplierCode() == null || supplierManage.getSupplierCode().trim().isEmpty()) {
            supplierManage.setSupplierCode(String.format("SUP%06d", supplierManage.getId()));
            supplierMapper.updateById(supplierManage);
        }
    }
    /**
@@ -56,14 +86,18 @@
     */
    @Override
    public int delSupplier(List<Integer> ids) {
        List<PurchaseLedger> purchaseLedgers = purchaseLedgerMapper.selectList(new QueryWrapper<PurchaseLedger>().lambda().in(PurchaseLedger::getSupplierId, ids));
        Long tenantId=SecurityUtils.getLoginUser().getTenantId();
        List<PurchaseLedger> purchaseLedgers = purchaseLedgerMapper.selectList(new QueryWrapper<PurchaseLedger>().lambda()
                .in(PurchaseLedger::getSupplierId, ids).eq(PurchaseLedger::getTenantId,tenantId));
        if (purchaseLedgers.size() > 0) {
            throw new RuntimeException("供应商已存在采购合同");
        }
        LambdaQueryWrapper<SupplierManage> delWrapper = new LambdaQueryWrapper<>();
        delWrapper.in(SupplierManage::getId, ids);
        return supplierMapper.delete(delWrapper);
        int count=0;
        for(Integer id:ids){
            SupplierManage supplier=supplierDetail(id);
            if(supplier!=null){ supplier.setDeleteFlag(1); supplier.setCooperationStatus(0); count+=supplierMapper.updateById(supplier); }
        }
        return count;
    }
    /**
@@ -73,7 +107,9 @@
     */
    @Override
    public SupplierManage supplierDetail(Integer id) {
        return supplierMapper.selectById(id);
        return supplierMapper.selectOne(new LambdaQueryWrapper<SupplierManage>().eq(SupplierManage::getId,id)
                .eq(SupplierManage::getTenantId, SecurityUtils.getLoginUser().getTenantId())
                .eq(SupplierManage::getDeleteFlag,0));
    }
    /**
@@ -83,7 +119,11 @@
     */
    @Override
    public int supplierUpdate(SupplierManage supplierManage) {
        return supplierMapper.updateById(supplierManage);
        SupplierManage current = supplierDetail(supplierManage.getId());
        if (current == null) throw new RuntimeException("供应商不存在");
        supplierManage.setTenantId(current.getTenantId());
        return supplierMapper.update(supplierManage, new LambdaQueryWrapper<SupplierManage>()
                .eq(SupplierManage::getId, supplierManage.getId()).eq(SupplierManage::getTenantId,current.getTenantId()));
    }
    /**
@@ -94,6 +134,7 @@
     */
    @Override
    public IPage<SupplierManage> supplierListPage(Page page, SupplierManageDto supplierManageDto) {
        supplierManageDto.setTenantId(SecurityUtils.getLoginUser().getTenantId());
        return supplierMapper.supplierListPage(page,supplierManageDto);
    }
@@ -104,6 +145,7 @@
     */
    @Override
    public void supplierExport(HttpServletResponse response, SupplierManageDto supplierManageDto) {
        supplierManageDto.setTenantId(SecurityUtils.getLoginUser().getTenantId());
        List<SupplierManageExcelDto> supplierManageList = supplierMapper.supplierExportList(supplierManageDto);
        ExcelUtil<SupplierManageExcelDto> util = new ExcelUtil<SupplierManageExcelDto>(SupplierManageExcelDto.class);
        util.exportExcel(response, supplierManageList, "供应商导出");
@@ -133,4 +175,75 @@
        }
        return false;
    }
    @Override
    public SupplierArchiveDetailVo supplierArchiveDetail(Integer id) {
        SupplierManage supplier = supplierDetail(id);
        if (supplier == null) throw new RuntimeException("供应商不存在");
        long supplierId = id.longValue();
        long tenantId = supplier.getTenantId();
        SupplierArchiveDetailVo result = new SupplierArchiveDetailVo();
        result.setSupplier(supplier);
        result.setQualifications(qualificationMapper.selectList(new LambdaQueryWrapper<SupplierQualification>()
                .eq(SupplierQualification::getSupplierId,supplierId).eq(SupplierQualification::getTenantId,tenantId)
                .eq(SupplierQualification::getDeleteFlag,0).orderByAsc(SupplierQualification::getExpiryDate)));
        result.setProducts(productMapper.selectList(new LambdaQueryWrapper<SupplierProduct>()
                .eq(SupplierProduct::getSupplierId,supplierId).eq(SupplierProduct::getTenantId,tenantId)
                .eq(SupplierProduct::getDeleteFlag,0)));
        result.setCooperationRecords(cooperationMapper.selectList(new LambdaQueryWrapper<SupplierCooperationRecord>()
                .eq(SupplierCooperationRecord::getSupplierId,supplierId).eq(SupplierCooperationRecord::getTenantId,tenantId)
                .eq(SupplierCooperationRecord::getDeleteFlag,0).orderByDesc(SupplierCooperationRecord::getCooperationDate)));
        List<PurchaseLedger> purchases = purchaseLedgerMapper.selectList(new LambdaQueryWrapper<PurchaseLedger>()
                .eq(PurchaseLedger::getSupplierId,supplierId).eq(PurchaseLedger::getTenantId,tenantId));
        result.setPurchaseCount((long)purchases.size());
        result.setPurchaseAmount(purchases.stream().map(PurchaseLedger::getContractAmount).filter(java.util.Objects::nonNull)
                .reduce(BigDecimal.ZERO, BigDecimal::add));
        result.setInvoicedAmount(ticketRegistrationMapper.selectList(new LambdaQueryWrapper<TicketRegistration>()
                .eq(TicketRegistration::getSupplierId,supplierId).eq(TicketRegistration::getTenantId,tenantId)
                .eq(TicketRegistration::getDeleteFlag,0)).stream().map(TicketRegistration::getInvoiceAmount)
                .filter(java.util.Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
        return result;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Integer saveArchive(SupplierArchiveSaveDto archive) {
        if (archive == null || archive.getSupplier() == null) throw new RuntimeException("供应商信息不能为空");
        SupplierManage supplier = archive.getSupplier();
        if (supplier.getId() == null) saveSupplier(supplier); else supplierUpdate(supplier);
        long tenantId = SecurityUtils.getLoginUser().getTenantId();
        long userId = SecurityUtils.getUserId();
        long supplierId = supplier.getId().longValue();
        qualificationMapper.delete(new LambdaQueryWrapper<SupplierQualification>().eq(SupplierQualification::getSupplierId,supplierId).eq(SupplierQualification::getTenantId,tenantId));
        productMapper.delete(new LambdaQueryWrapper<SupplierProduct>().eq(SupplierProduct::getSupplierId,supplierId).eq(SupplierProduct::getTenantId,tenantId));
        LocalDate nearest = null;
        if (archive.getQualifications() != null) for (SupplierQualification item : archive.getQualifications()) {
            item.setId(null); item.setSupplierId(supplierId); item.setTenantId(tenantId); item.setCreateUser(userId);
            item.setCreateTime(LocalDateTime.now()); item.setUpdateTime(LocalDateTime.now()); item.setDeleteFlag(0);
            item.setStatus(item.getStatus() == null ? 1 : item.getStatus()); qualificationMapper.insert(item);
            if (item.getExpiryDate()!=null && (nearest==null || item.getExpiryDate().isBefore(nearest))) nearest=item.getExpiryDate();
        }
        if (archive.getProducts() != null) for (SupplierProduct item : archive.getProducts()) {
            if (item.getProductName()==null || item.getProductName().trim().isEmpty()) continue;
            item.setId(null); item.setSupplierId(supplierId); item.setTenantId(tenantId); item.setCreateUser(userId);
            item.setCreateTime(LocalDateTime.now()); item.setUpdateTime(LocalDateTime.now()); item.setDeleteFlag(0);
            item.setStatus(item.getStatus()==null?1:item.getStatus()); item.setCurrency(item.getCurrency()==null?"CNY":item.getCurrency()); productMapper.insert(item);
        }
        supplier.setQualificationExpiryDate(nearest);
        supplier.setQualificationStatus(nearest==null?0:(nearest.isBefore(LocalDate.now())?3:(nearest.isBefore(LocalDate.now().plusDays(31))?2:1)));
        if (archive.getProducts()!=null) supplier.setSuppliedProductsSummary(archive.getProducts().stream().map(SupplierProduct::getProductName)
                .filter(java.util.Objects::nonNull).limit(5).collect(Collectors.joining("、")));
        supplierUpdate(supplier);
        return supplier.getId();
    }
    @Override
    public void addCooperationRecord(Integer supplierId, SupplierCooperationRecord record) {
        SupplierManage supplier = supplierDetail(supplierId);
        if (supplier == null) throw new RuntimeException("供应商不存在");
        record.setId(null); record.setSupplierId(supplierId.longValue()); record.setTenantId(supplier.getTenantId());
        record.setCreateUser(SecurityUtils.getUserId()); record.setUpdateUser(SecurityUtils.getUserId());
        record.setCreateTime(LocalDateTime.now()); record.setUpdateTime(LocalDateTime.now()); record.setDeleteFlag(0);
        cooperationMapper.insert(record);
    }
}
src/main/java/com/ruoyi/common/enums/FileNameType.java
@@ -11,7 +11,8 @@
    MEASURING(5),  //计量器具台账
    MEASURINGRecord(6),//计量器具台账记录
    ApproveNode(7),  //协同审批节点审核
    ApproveProcess(8);  //协同审批主数据
    ApproveProcess(8),  //协同审批主数据
    SUPPLIER_QUALIFICATION(9); //供应商资质附件
    private final int value;
src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
@@ -16,6 +16,8 @@
@Data
public class PurchaseLedgerDto {
    @ApiModelProperty(value = "租户ID")
    private Long tenantId;
    private String entryDateStart;
    private String entryDateEnd;
src/main/java/com/ruoyi/purchase/pojo/TicketRegistration.java
@@ -25,8 +25,48 @@
     * ä¸»é”®ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    @ApiModelProperty(value = "来票登记ID")
    private Long id;
    @ApiModelProperty(value = "供应商ID")
    private Long supplierId;
    @ApiModelProperty(value = "发票代码")
    private String invoiceCode;
    @ApiModelProperty(value = "发票类型")
    private String invoiceType;
    @ApiModelProperty(value = "税率")
    private BigDecimal taxRate;
    @ApiModelProperty(value = "税额")
    private BigDecimal taxAmount;
    @ApiModelProperty(value = "币种")
    private String currency;
    @ApiModelProperty(value = "发票状态:0草稿,1已登记,2红冲,3作废")
    private Integer invoiceStatus;
    @ApiModelProperty(value = "核验状态:0未核验,1通过,2异常")
    private Integer verificationStatus;
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "创建用户ID")
    private Long createUser;
    @ApiModelProperty(value = "更新用户ID")
    private Long updateUser;
    @ApiModelProperty(value = "更新时间")
    private Date updateTime;
    @ApiModelProperty(value = "删除标志:0正常,1删除")
    private Integer deleteFlag;
    /**
     * çŠ¶æ€
     */
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -472,8 +472,7 @@
    @Override
    public IPage<PurchaseLedgerDto> selectPurchaseLedgerListPage(IPage ipage, PurchaseLedgerDto purchaseLedger) {
        Long userId = SecurityUtils.getUserId();
        purchaseLedger.setRecorderId(userId);
        purchaseLedger.setTenantId(SecurityUtils.getLoginUser().getTenantId());
        IPage<PurchaseLedgerDto> purchaseLedgerDtoIPage = purchaseLedgerMapper.selectPurchaseLedgerListPage(ipage, purchaseLedger);
        purchaseLedgerDtoIPage.getRecords().forEach(purchaseLedgerDto -> {
            List<CommonFile> commonFiles = commonFileMapper.selectList(new LambdaQueryWrapper<CommonFile>().eq(CommonFile::getCommonId, purchaseLedgerDto.getId()).eq(CommonFile::getType, FileNameType.PURCHASELEDGER.getValue()));
src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java
@@ -42,6 +42,7 @@
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@@ -91,6 +92,8 @@
    @Override
    public List<TicketRegistration> selectTicketRegistrationList(TicketRegistration ticketRegistration) {
        LambdaQueryWrapper<TicketRegistration> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(TicketRegistration::getTenantId,SecurityUtils.getLoginUser().getTenantId())
                .eq(TicketRegistration::getDeleteFlag,0);
        if (StringUtils.isNotBlank(ticketRegistration.getPurchaseContractNumber())) {
            queryWrapper.like(TicketRegistration::getPurchaseContractNumber, ticketRegistration.getPurchaseContractNumber())
                    .like(TicketRegistration::getSupplierName, ticketRegistration.getSupplierName())
@@ -122,11 +125,39 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int addOrUpdateRegistration(TicketRegistrationDto ticketRegistrationDto) throws IOException {
        Long tenantId = SecurityUtils.getLoginUser().getTenantId();
        Long userId = SecurityUtils.getUserId();
        if (ticketRegistrationDto.getPurchaseLedgerId() == null) throw new BaseException("请选择采购单");
        if (StringUtils.isBlank(ticketRegistrationDto.getInvoiceNumber())) throw new BaseException("发票号码不能为空");
        if (ticketRegistrationDto.getIssueDate() == null) throw new BaseException("开票日期不能为空");
        if (ticketRegistrationDto.getInvoiceAmount() == null || ticketRegistrationDto.getInvoiceAmount().compareTo(BigDecimal.ZERO) <= 0) {
            throw new BaseException("发票金额必须大于0");
        }
        // 1. æŸ¥è¯¢é‡‡è´­å°è´¦è®°å½•
        PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(ticketRegistrationDto.getPurchaseLedgerId());
        PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectOne(new LambdaQueryWrapper<PurchaseLedger>()
                .eq(PurchaseLedger::getId,ticketRegistrationDto.getPurchaseLedgerId())
                .eq(PurchaseLedger::getTenantId,tenantId));
        if (purchaseLedger == null) {
            // å¤„理采购台账不存在的情况,例如抛出异常或返回错误
            throw new IllegalArgumentException("采购台账记录不存在,ID: " + ticketRegistrationDto.getPurchaseLedgerId());
        }
        LambdaQueryWrapper<TicketRegistration> duplicate = new LambdaQueryWrapper<TicketRegistration>()
                .eq(TicketRegistration::getTenantId, tenantId)
                .eq(TicketRegistration::getInvoiceNumber, ticketRegistrationDto.getInvoiceNumber())
                .eq(TicketRegistration::getDeleteFlag, 0);
        if (ticketRegistrationDto.getId() != null) duplicate.ne(TicketRegistration::getId, ticketRegistrationDto.getId());
        if (ticketRegistrationMapper.selectCount(duplicate) > 0) throw new BaseException("该发票号码已登记");
        BigDecimal registered = ticketRegistrationMapper.selectList(new LambdaQueryWrapper<TicketRegistration>()
                .eq(TicketRegistration::getTenantId,tenantId)
                .eq(TicketRegistration::getPurchaseLedgerId,purchaseLedger.getId())
                .eq(TicketRegistration::getDeleteFlag,0)
                .ne(ticketRegistrationDto.getId()!=null,TicketRegistration::getId,ticketRegistrationDto.getId()))
                .stream().map(TicketRegistration::getInvoiceAmount).filter(java.util.Objects::nonNull)
                .reduce(BigDecimal.ZERO,BigDecimal::add);
        if (purchaseLedger.getContractAmount()!=null && registered.add(ticketRegistrationDto.getInvoiceAmount()).compareTo(purchaseLedger.getContractAmount())>0) {
            throw new BaseException("来票金额超过采购单剩余可登记金额:" + purchaseLedger.getContractAmount().subtract(registered));
        }
@@ -135,11 +166,23 @@
        TicketRegistration ticketRegistration = new TicketRegistration();
        BeanUtils.copyProperties(ticketRegistrationDto, ticketRegistration);
        ticketRegistration.setPurchaseContractNumber(purchaseLedger.getPurchaseContractNumber());
        ticketRegistration.setTenantId(purchaseLedger.getTenantId());
        ticketRegistration.setTenantId(tenantId);
        ticketRegistration.setSupplierId(purchaseLedger.getSupplierId());
        ticketRegistration.setSupplierName(purchaseLedger.getSupplierName());
        ticketRegistration.setIssueDate(ticketRegistrationDto.getIssueDate());
        ticketRegistration.setContractAmount(purchaseLedger.getContractAmount());
        ticketRegistration.setSalesLedgerId(purchaseLedger.getSalesLedgerId());
        ticketRegistration.setEnterDate(ticketRegistrationDto.getEnterDate());
        ticketRegistration.setCurrency(StringUtils.isBlank(ticketRegistration.getCurrency()) ? "CNY" : ticketRegistration.getCurrency());
        ticketRegistration.setInvoiceStatus(ticketRegistration.getInvoiceStatus()==null?1:ticketRegistration.getInvoiceStatus());
        ticketRegistration.setVerificationStatus(ticketRegistration.getVerificationStatus()==null?0:ticketRegistration.getVerificationStatus());
        ticketRegistration.setDeleteFlag(0);
        ticketRegistration.setUpdateUser(userId);
        ticketRegistration.setUpdateTime(DateUtils.getNowDate());
        if (ticketRegistration.getTaxAmount()==null && ticketRegistration.getTaxRate()!=null) {
            BigDecimal rate=ticketRegistration.getTaxRate().compareTo(BigDecimal.ONE)>0?ticketRegistration.getTaxRate().divide(new BigDecimal("100"),6,RoundingMode.HALF_UP):ticketRegistration.getTaxRate();
            ticketRegistration.setTaxAmount(ticketRegistration.getInvoiceAmount().multiply(rate).divide(BigDecimal.ONE.add(rate),2,RoundingMode.HALF_UP));
        }
        // 4. å¤„理子表数据
        List<SalesLedgerProduct> productData = ticketRegistrationDto.getProductData();
@@ -148,7 +191,15 @@
        }
        // 5. æ‰§è¡Œæ’入或更新操作
        int rowsAffected = ticketRegistrationMapper.insert(ticketRegistration);
        int rowsAffected;
        if (ticketRegistration.getId()==null) {
            ticketRegistration.setCreateUser(userId);
            rowsAffected=ticketRegistrationMapper.insert(ticketRegistration);
        } else {
            rowsAffected=ticketRegistrationMapper.update(ticketRegistration,new LambdaQueryWrapper<TicketRegistration>()
                    .eq(TicketRegistration::getId,ticketRegistration.getId()).eq(TicketRegistration::getTenantId,tenantId));
            productRecordMapper.delete(new LambdaQueryWrapper<ProductRecord>().eq(ProductRecord::getTicketRegistrationId,ticketRegistration.getId()).eq(ProductRecord::getTenantId,tenantId));
        }
        // 6. å¢žåŠ é‡‡è´­å°è´¦äº§å“å¼€ç¥¨è®°å½•
        List<SalesLedgerProduct> salesLedgerProducts = ticketRegistrationDto.getProductData();
@@ -166,6 +217,7 @@
                    productRecord.setSaleLedgerProjectId(salesLedgerProduct.getId());
                    productRecord.setId(null);
                    productRecord.setType("2");
                    productRecord.setTenantId(tenantId);
                     insert = productRecordMapper.insert(productRecord);
                }
                if (insert <= 0) {
@@ -241,7 +293,7 @@
                fileRecord.setName(originalFilename);
                fileRecord.setUrl(formalFilePath.toString());
                fileRecord.setCreateTime(LocalDateTime.now());
                fileRecord.setType(4);
                fileRecord.setType(FileNameType.INVOICE.getValue());
                commonFileMapper.insert(fileRecord);
                log.info("文件迁移成功: {} -> {}", tempFile.getTempPath(), formalFilePath);
@@ -255,59 +307,36 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int delRegistration(Long[] ids) {
        // åˆ é™¤é‡‡è´­å°è´¦äº§å“å¼€ç¥¨è®°å½•对象
        Long tenantId=SecurityUtils.getLoginUser().getTenantId();
        LambdaQueryWrapper<ProductRecord> productRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        productRecordLambdaQueryWrapper.in(ProductRecord::getId, Arrays.asList(ids));
        productRecordLambdaQueryWrapper.in(ProductRecord::getTicketRegistrationId, Arrays.asList(ids)).eq(ProductRecord::getTenantId,tenantId);
        List<ProductRecord> productRecords = productRecordMapper.selectList(productRecordLambdaQueryWrapper);
        if(CollectionUtils.isEmpty(productRecords)){
            return 0;
        }
        LambdaQueryWrapper<TicketRegistration> ticketRegistrationLambdaQueryWrapper = new LambdaQueryWrapper<>();
        ticketRegistrationLambdaQueryWrapper.in(TicketRegistration::getId, productRecords.stream().map(ProductRecord::getTicketRegistrationId).collect(Collectors.toList()));
        List<TicketRegistration> ticketRegistrations = ticketRegistrationMapper.selectList(ticketRegistrationLambdaQueryWrapper);
        // ä¿®æ”¹äº§å“ä¿¡æ¯
        for (ProductRecord productRecord : productRecords) {
            BigDecimal subtract = ticketRegistrations.get(0).getInvoiceAmount().subtract(productRecords.get(0).getTicketsAmount());
            // å°äºŽç­‰äºŽ0删除 ï¼Œå¤§äºŽ0修改
            if(subtract.compareTo(BigDecimal.ZERO) <= 0){
                ticketRegistrationMapper.deleteById(ticketRegistrations.get(0));
                // åˆ é™¤ä»˜æ¬¾æµæ°´
                paymentRegistrationMapper.delete(new LambdaQueryWrapper<PaymentRegistration>().eq(PaymentRegistration::getTicketRegistrationId, ticketRegistrations.get(0).getId()));
            }else if(subtract.compareTo(BigDecimal.ZERO) > 0){
                ticketRegistrations.get(0).setInvoiceAmount(subtract);
                ticketRegistrationMapper.updateById(ticketRegistrations.get(0));
            }
            LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductLambdaQueryWrapper = new LambdaQueryWrapper<>();
            salesLedgerProductLambdaQueryWrapper.eq(SalesLedgerProduct::getId, productRecord.getSaleLedgerProjectId())
                    .eq(SalesLedgerProduct::getType, 2);
            List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(salesLedgerProductLambdaQueryWrapper);
            if(!CollectionUtils.isEmpty(salesLedgerProducts)){
                for (SalesLedgerProduct salesLedgerProduct : salesLedgerProducts) {
                    salesLedgerProduct.setFutureTickets(salesLedgerProduct.getFutureTickets().add(productRecord.getTicketsNum()));
                    salesLedgerProduct.setFutureTicketsAmount(salesLedgerProduct.getFutureTicketsAmount().add(productRecord.getTicketsAmount()));
                    salesLedgerProduct.setTicketsAmount(salesLedgerProduct.getTaxInclusiveTotalPrice().subtract(productRecord.getFutureTicketsAmount()));
                    salesLedgerProduct.setTicketsNum(salesLedgerProduct.getQuantity().subtract(productRecord.getFutureTickets()));
                    salesLedgerProductMapper.updateById(salesLedgerProduct);
                }
            SalesLedgerProduct product=salesLedgerProductMapper.selectById(productRecord.getSaleLedgerProjectId());
            if(product!=null){
                product.setTicketsNum(nvl(product.getTicketsNum()).subtract(nvl(productRecord.getTicketsNum())).max(BigDecimal.ZERO));
                product.setTicketsAmount(nvl(product.getTicketsAmount()).subtract(nvl(productRecord.getTicketsAmount())).max(BigDecimal.ZERO));
                product.setFutureTickets(nvl(product.getFutureTickets()).add(nvl(productRecord.getTicketsNum())));
                product.setFutureTicketsAmount(nvl(product.getFutureTicketsAmount()).add(nvl(productRecord.getTicketsAmount())));
                salesLedgerProductMapper.updateById(product);
            }
        }
        // åˆ é™¤é‡‡è´­å°è´¦äº§å“å¼€ç¥¨è®°å½•
        productRecordMapper.delete(productRecordLambdaQueryWrapper);
        return 1;
        paymentRegistrationMapper.delete(new LambdaQueryWrapper<PaymentRegistration>().in(PaymentRegistration::getTicketRegistrationId,Arrays.asList(ids)));
        return ticketRegistrationMapper.delete(new LambdaQueryWrapper<TicketRegistration>().in(TicketRegistration::getId,Arrays.asList(ids)).eq(TicketRegistration::getTenantId,tenantId));
    }
    @Override
    public TicketRegistrationDto getRegistrationById(TicketRegistrationDto ticketRegistrationDto) {
        TicketRegistration ticketRegistration = ticketRegistrationMapper.selectById(ticketRegistrationDto.getId());
        TicketRegistration ticketRegistration = ticketRegistrationMapper.selectOne(new LambdaQueryWrapper<TicketRegistration>()
                .eq(TicketRegistration::getId,ticketRegistrationDto.getId()).eq(TicketRegistration::getTenantId,SecurityUtils.getLoginUser().getTenantId()));
        if (ticketRegistration == null) throw new BaseException("来票登记不存在");
        LambdaQueryWrapper<PurchaseLedger> purchaseQueryWrapper = new LambdaQueryWrapper<>();
        purchaseQueryWrapper.eq(PurchaseLedger::getId, ticketRegistration.getPurchaseLedgerId());
        PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectOne(purchaseQueryWrapper);
        if (ticketRegistration == null) {
            throw new BaseException("采购台账不存在");
        }
        if (purchaseLedger == null) throw new BaseException("采购台账不存在");
        // åˆ›å»ºå¹¶å¡«å……DTO
        TicketRegistrationDto resultDto = new TicketRegistrationDto();
        BeanUtils.copyProperties(ticketRegistration, resultDto);
@@ -325,7 +354,9 @@
    public List getTicketNo(TicketRegistrationDto ticketRegistrationDto) {
        LambdaQueryWrapper<TicketRegistration> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.select(TicketRegistration::getId, TicketRegistration::getInvoiceNumber, TicketRegistration::getInvoiceAmount)
                .eq(TicketRegistration::getPurchaseLedgerId, ticketRegistrationDto.getId());
                .eq(TicketRegistration::getPurchaseLedgerId, ticketRegistrationDto.getId())
                .eq(TicketRegistration::getTenantId,SecurityUtils.getLoginUser().getTenantId())
                .eq(TicketRegistration::getDeleteFlag,0);
        List<Map<String, Object>> result = ticketRegistrationMapper.selectMaps(queryWrapper);
        // å°†ä¸‹åˆ’线命名转换为驼峰命名
        return result.stream().map(map -> map.entrySet().stream()
@@ -349,7 +380,8 @@
        if (!ObjectUtils.isEmpty(ticketRegistration.getIssueDateStart()) && !ObjectUtils.isEmpty(ticketRegistration.getIssueDateEnd())) {
            queryWrapper.between(TicketRegistration::getIssueDate, LocalDate.parse(ticketRegistration.getIssueDateStart(), DateTimeFormatter.ofPattern("yyyy-MM-dd")), LocalDate.parse(ticketRegistration.getIssueDateEnd(), DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        }
        queryWrapper.eq(TicketRegistration::getIssUerId, SecurityUtils.getUserId());
        queryWrapper.eq(TicketRegistration::getTenantId, SecurityUtils.getLoginUser().getTenantId())
                .eq(TicketRegistration::getDeleteFlag,0);
        IPage<TicketRegistration> ticketRegistrationIPage = ticketRegistrationMapper.selectPage(page, queryWrapper);
        // è®¡ç®—已付款金额
        if (CollectionUtils.isNotEmpty(ticketRegistrationIPage.getRecords())) {
@@ -385,7 +417,9 @@
    @Override
    public PurchaseLedgerDto getPuargeById(Long id) {
        PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(id);
        PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectOne(new LambdaQueryWrapper<PurchaseLedger>()
                .eq(PurchaseLedger::getId,id).eq(PurchaseLedger::getTenantId,SecurityUtils.getLoginUser().getTenantId()));
        if(purchaseLedger==null) throw new BaseException("采购台账不存在");
        PurchaseLedgerDto purchaseLedgerDto = new PurchaseLedgerDto();
        BeanUtils.copyProperties(purchaseLedger, purchaseLedgerDto);
        SalesLedgerProduct salesLedgerProduct = new SalesLedgerProduct();
@@ -455,6 +489,8 @@
        }
    }
    private BigDecimal nvl(BigDecimal value) { return value == null ? BigDecimal.ZERO : value; }
    /**
     * ä¸‹åˆ’线命名转驼峰命名
     */
src/main/resources/mapper/basic/SupplierManageMapper.xml
@@ -6,58 +6,48 @@
    <select id="supplierListPage" resultType="com.ruoyi.basic.dto.SupplierManageDto">
        SELECT
        T1.id,
        T1.supplier_name,
        T1.taxpayer_identification_num,
        T1.company_address,
        T1.company_phone,
        T1.bank_account_name,
        T1.bank_account_num,
        T1.contact_user_name,
        T1.contact_user_phone,
        T1.maintain_user_id,
        T1.maintain_time,
        T1.create_time,
        T1.create_user,
        T1.update_time,
        T1.update_user,
        T1.tenant_id,
        T1.*,
        T2.nick_name AS maintainUserName
        FROM supplier_manage T1
        LEFT JOIN sys_user T2 ON T1.maintain_user_id = T2.user_id
        <where>
            T1.tenant_id = #{supplierManageDto.tenantId}
            AND T1.delete_flag = 0
            <if test="supplierManageDto.supplierName != null and supplierManageDto.supplierName != '' ">
                AND T1.supplier_name LIKE CONCAT('%',#{supplierManageDto.supplierName},'%')
            </if>
            <if test="supplierManageDto.supplierCode != null and supplierManageDto.supplierCode != ''">
                AND T1.supplier_code LIKE CONCAT('%',#{supplierManageDto.supplierCode},'%')
            </if>
            <if test="supplierManageDto.productKeyword != null and supplierManageDto.productKeyword != ''">
                AND EXISTS (SELECT 1 FROM supplier_product SP WHERE SP.supplier_id=T1.id AND SP.tenant_id=T1.tenant_id AND SP.delete_flag=0 AND SP.product_name LIKE CONCAT('%',#{supplierManageDto.productKeyword},'%'))
            </if>
            <if test="supplierManageDto.supplierLevel != null and supplierManageDto.supplierLevel != ''">
                AND T1.supplier_level = #{supplierManageDto.supplierLevel}
            </if>
            <if test="supplierManageDto.cooperationStatus != null">
                AND T1.cooperation_status = #{supplierManageDto.cooperationStatus}
            </if>
            <if test="supplierManageDto.qualificationStatus != null">
                AND T1.qualification_status = #{supplierManageDto.qualificationStatus}
            </if>
        </where>
        ORDER BY T1.id DESC
    </select>
    <select id="supplierExportList" resultType="com.ruoyi.basic.excel.SupplierManageExcelDto">
        SELECT
        T1.id,
        T1.supplier_name,
        T1.taxpayer_identification_num,
        T1.company_address,
        T1.company_phone,
        T1.bank_account_name,
        T1.bank_account_num,
        T1.contact_user_name,
        T1.contact_user_phone,
        T1.maintain_user_id,
        T1.maintain_time,
        T1.create_time,
        T1.create_user,
        T1.update_time,
        T1.update_user,
        T1.tenant_id,
        T1.*,
        T2.nick_name AS maintainUserName
        FROM supplier_manage T1
        LEFT JOIN sys_user T2 ON T1.maintain_user_id = T2.user_id
        <where>
            T1.tenant_id = #{supplierManageDto.tenantId}
            AND T1.delete_flag = 0
            <if test="supplierManageDto.supplierName != null and supplierManageDto.supplierName != '' ">
                AND T1.supplier_name LIKE CONCAT('%',#{supplierManageDto.supplierName},'%')
            </if>
        </where>
    </select>
</mapper>
</mapper>
src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
@@ -26,6 +26,9 @@
        left join product_record pr on pl.id = pr.purchase_ledger_id
        <where>
            1 = 1
            <if test="c.tenantId != null">
                AND pl.tenant_id = #{c.tenantId}
            </if>
            <if test="c.purchaseContractNumber != null and c.purchaseContractNumber != ''">
               and pl.purchase_contract_number like concat('%',#{c.purchaseContractNumber},'%')
            </if>
@@ -73,4 +76,4 @@
        WHERE
            T4.id = #{id}
    </select>
</mapper>
</mapper>