1.3.0后端:

feat(应收款):应收款新增功能
dev
xs 2 weeks ago
parent ce0790af0e
commit 1a57b13eb4

@ -113,4 +113,13 @@ public class ErpContractPaymentMethodController extends BaseController {
return R.ok(list);
}
/**
* ,left join base_payment_stage
*/
@GetMapping("/getErpContractPaymentMethodJoinList")
public R<List<ErpContractPaymentMethodVo>> getErpContractPaymentMethodJoinList(ErpContractPaymentMethodBo bo) {
List<ErpContractPaymentMethodVo> list = erpContractPaymentMethodService.queryJoinList(bo);
return R.ok(list);
}
}

@ -0,0 +1,116 @@
package org.dromara.oa.erp.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.oa.erp.domain.vo.ErpFinAccountInstallmentVo;
import org.dromara.oa.erp.domain.bo.ErpFinAccountInstallmentBo;
import org.dromara.oa.erp.service.IErpFinAccountInstallmentService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
*
* 访:/oa/erp/finAccountInstallment
*
* @author xins
* @date 2026-03-09
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/finAccountInstallment")
public class ErpFinAccountInstallmentController extends BaseController {
private final IErpFinAccountInstallmentService erpFinAccountInstallmentService;
/**
*
*/
@SaCheckPermission("oa/erp:finAccountInstallment:list")
@GetMapping("/list")
public TableDataInfo<ErpFinAccountInstallmentVo> list(ErpFinAccountInstallmentBo bo, PageQuery pageQuery) {
return erpFinAccountInstallmentService.queryPageList(bo, pageQuery);
}
/**
*
*/
@SaCheckPermission("oa/erp:finAccountInstallment:export")
@Log(title = "分款信息", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(ErpFinAccountInstallmentBo bo, HttpServletResponse response) {
List<ErpFinAccountInstallmentVo> list = erpFinAccountInstallmentService.queryList(bo);
ExcelUtil.exportExcel(list, "分款信息", ErpFinAccountInstallmentVo.class, response);
}
/**
*
*
* @param accountInstallmentId
*/
@SaCheckPermission("oa/erp:finAccountInstallment:query")
@GetMapping("/{accountInstallmentId}")
public R<ErpFinAccountInstallmentVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable("accountInstallmentId") Long accountInstallmentId) {
return R.ok(erpFinAccountInstallmentService.queryById(accountInstallmentId));
}
/**
*
*/
@SaCheckPermission("oa/erp:finAccountInstallment:add")
@Log(title = "分款信息", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody ErpFinAccountInstallmentBo bo) {
return toAjax(erpFinAccountInstallmentService.insertByBo(bo));
}
/**
*
*/
@SaCheckPermission("oa/erp:finAccountInstallment:edit")
@Log(title = "分款信息", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody ErpFinAccountInstallmentBo bo) {
return toAjax(erpFinAccountInstallmentService.updateByBo(bo));
}
/**
*
*
* @param accountInstallmentIds
*/
@SaCheckPermission("oa/erp:finAccountInstallment:remove")
@Log(title = "分款信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{accountInstallmentIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable("accountInstallmentIds") Long[] accountInstallmentIds) {
return toAjax(erpFinAccountInstallmentService.deleteWithValidByIds(List.of(accountInstallmentIds), true));
}
/**
*
*/
@GetMapping("/getErpFinAccountInstallmentList")
public R<List<ErpFinAccountInstallmentVo>> getErpFinAccountInstallmentList(ErpFinAccountInstallmentBo bo) {
List<ErpFinAccountInstallmentVo> list = erpFinAccountInstallmentService.queryList(bo);
return R.ok(list);
}
}

@ -0,0 +1,144 @@
package org.dromara.oa.erp.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.oa.erp.domain.ErpFinAccountReceivableStage;
import org.dromara.oa.erp.domain.bo.ErpContractPaymentMethodBo;
import org.dromara.oa.erp.domain.bo.ErpFinAccountReceivableStageBo;
import org.dromara.oa.erp.domain.vo.ErpContractPaymentMethodVo;
import org.dromara.oa.erp.domain.vo.ErpFinAccountReceivableStageVo;
import org.dromara.oa.erp.service.IErpFinAccountReceivableStageService;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.oa.erp.domain.vo.ErpFinAccountReceivableVo;
import org.dromara.oa.erp.domain.bo.ErpFinAccountReceivableBo;
import org.dromara.oa.erp.service.IErpFinAccountReceivableService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
*
* 访:/oa/erp/finAccountReceivable
*
* @author xins
* @date 2026-02-25
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/erp/finAccountReceivable")
public class ErpFinAccountReceivableController extends BaseController {
private final IErpFinAccountReceivableService erpFinAccountReceivableService;
private final IErpFinAccountReceivableStageService erpFinAccountReceivableStageService;
/**
*
*/
@SaCheckPermission("oa/erp:finAccountReceivable:list")
@GetMapping("/list")
public TableDataInfo<ErpFinAccountReceivableVo> list(ErpFinAccountReceivableBo bo, PageQuery pageQuery) {
return erpFinAccountReceivableService.queryPageList(bo, pageQuery);
}
/**
*
*/
@SaCheckPermission("oa/erp:finAccountReceivable:export")
@Log(title = "应收款信息", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(ErpFinAccountReceivableBo bo, HttpServletResponse response) {
List<ErpFinAccountReceivableVo> list = erpFinAccountReceivableService.queryList(bo);
ExcelUtil.exportExcel(list, "应收款信息", ErpFinAccountReceivableVo.class, response);
}
/**
*
*
* @param accountReceivableId
*/
@SaCheckPermission("oa/erp:finAccountReceivable:query")
@GetMapping("/{accountReceivableId}")
public R<ErpFinAccountReceivableVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable("accountReceivableId") Long accountReceivableId) {
return R.ok(erpFinAccountReceivableService.getAccountReceivableWithProjectByReceivableId(accountReceivableId));
}
/**
*
*/
@SaCheckPermission("oa/erp:finAccountReceivable:add")
@Log(title = "应收款信息", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody ErpFinAccountReceivableBo bo) {
return toAjax(erpFinAccountReceivableService.insertByBo(bo));
}
/**
*
*/
@SaCheckPermission("oa/erp:finAccountReceivable:edit")
@Log(title = "应收款信息", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody ErpFinAccountReceivableBo bo) {
return toAjax(erpFinAccountReceivableService.updateByBo(bo));
}
/**
*
*
* @param accountReceivableIds
*/
@SaCheckPermission("oa/erp:finAccountReceivable:remove")
@Log(title = "应收款信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{accountReceivableIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable("accountReceivableIds") Long[] accountReceivableIds) {
return toAjax(erpFinAccountReceivableService.deleteWithValidByIds(List.of(accountReceivableIds), true));
}
/**
*
*/
@GetMapping("/getErpFinAccountReceivableList")
public R<List<ErpFinAccountReceivableVo>> getErpFinAccountReceivableList(ErpFinAccountReceivableBo bo) {
List<ErpFinAccountReceivableVo> list = erpFinAccountReceivableService.queryList(bo);
return R.ok(list);
}
/**
* ,right join erp_fin_account_receivable_stage
*/
@GetMapping("/getErpFinAccountReceivableStageList")
public R<List<ErpFinAccountReceivableStageVo>> getErpFinAccountReceivableStageList(ErpFinAccountReceivableStageBo bo) {
List<ErpFinAccountReceivableStageVo> list = erpFinAccountReceivableStageService.queryList(bo);
return R.ok(list);
}
/**
* ,left join base_payment_stage
*/
@GetMapping("/getErpContractPaymentMethodJoinList")
public R<List<ErpContractPaymentMethodVo>> getErpContractPaymentMethodJoinList(ErpContractPaymentMethodBo bo) {
List<ErpContractPaymentMethodVo> list = erpFinAccountReceivableStageService.queryContractPaymentMethodJoinList(bo);
return R.ok(list);
}
}

@ -127,4 +127,13 @@ public class ErpProjectInfoController extends BaseController {
List<ErpProjectInfoVo> list = erpProjectInfoService.queryList(bo);
return R.ok(list);
}
/**
* ,使
*/
@GetMapping("/getErpProjectInfoJoinList")
public TableDataInfo<ErpProjectInfoVo> getErpProjectInfoJoinList(ErpProjectInfoBo bo, PageQuery pageQuery) {
return erpProjectInfoService.queryJoinPageList(bo, pageQuery);
}
}

@ -84,5 +84,6 @@ public class ErpContractPaymentMethod extends TenantEntity {
@TableLogic
private String delFlag;
@TableField(exist = false)
private String stageName;
}

@ -0,0 +1,93 @@
package org.dromara.oa.erp.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
/**
* erp_fin_account_installment
*
* @author xins
* @date 2026-03-09
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("erp_fin_account_installment")
public class ErpFinAccountInstallment extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@TableId(value = "account_installment_id", type = IdType.AUTO)
private Long accountInstallmentId;
/**
*
*/
private String installmentCode;
/**
* IDcrm_customer_info
*/
private Long customerId;
/**
*
*/
private String customerName;
/**
* (CNY/USD/EUR)CNY
*/
private String currency;
/**
*
*/
private Long paymentAmount;
/**
*
*/
private Date paymentDate;
/**
*
*/
private String remark;
/**
*
*/
private Long dispatchUserId;
/**
*
*/
private Long dispatchDeptId;
/**
*
*/
private Date dispatchDate;
/**
* 0稿 1 2
*/
private String installmentStatus;
/**
*
*/
private Long accountManageId;
}

@ -0,0 +1,72 @@
package org.dromara.oa.erp.domain;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
import java.math.BigDecimal;
/**
* erp_fin_account_installment_detail
*
* @author xins
* @date 2026-03-09
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("erp_fin_account_installment_detail")
public class ErpFinAccountInstallmentDetail extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@TableId(value = "installment_detail_id", type = IdType.AUTO)
private Long installmentDetailId;
/**
* ID
*/
private Long accountInstallmentId;
/**
* ID
*/
private Long projectId;
/**
*
*/
private String projectCode;
/**
*
*/
private String projectName;
/**
* IDerp_contract_info
*/
private Long contractId;
/**
* IDbase_payment_stage
*/
private Long paymentStageId;
/**
*
*/
private BigDecimal detailAmount;
/**
*
*/
private String remark;
}

@ -0,0 +1,169 @@
package org.dromara.oa.erp.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
import java.util.List;
/**
* erp_fin_account_receivable
*
* @author xins
* @date 2026-02-25
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("erp_fin_account_receivable")
public class ErpFinAccountReceivable extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@TableId(value = "account_receivable_id", type = IdType.AUTO)
private Long accountReceivableId;
/**
*
*/
private String invoiceCode;
/**
* ID
*/
private Long projectId;
/**
*
*/
private String projectCategory;
/**
*
*/
private String projectType;
/**
* ID
*/
private Long contractId;
/**
*
*/
private String generalContractor;
/**
*
*/
private String customerAbbreviation;
/**
*
*/
private String contractParties;
/**
* WBS.
*/
private String wbsElement;
/**
*
*/
private String lineItem;
/**
*
*/
private String finProjectStatus;
/**
*
*/
private Date settlementMonth;
/**
*
*/
private BigDecimal income;
/**
*
*/
private BigDecimal backToBackRatio;
/**
*
*/
private String currency;
/**
* 线
*/
private BigDecimal invoiceAmount;
/**
*
*/
private BigDecimal totalPrice;
/**
*
*/
private BigDecimal totalPriceHighway;
/**
* -
*/
private BigDecimal totalPriceOri;
/**
*
*/
private BigDecimal exchangeRate;
/**
*
*/
private Date repaymentPlan;
/**
*
*/
private Date originalPlan;
/**
*
*/
private String mesnacOrderNo;
/**
*
*/
private String mesnacProjectCode;
/**
*
*/
private String remark;
@TableField(exist = false)
private List<ErpFinAccountReceivableStage> finAccountReceivableStageList;
@TableField(exist = false)
private String projectCode;
@TableField(exist = false)
private String projectName;
}

@ -0,0 +1,93 @@
package org.dromara.oa.erp.domain;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
/**
* erp_fin_account_receivable_stage
*
* @author xins
* @date 2026-02-24
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("erp_fin_account_receivable_stage")
public class ErpFinAccountReceivableStage extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@TableId(value = "receivable_stage_id", type = IdType.AUTO)
private Long receivableStageId;
/**
* ID
*/
private Long accountReceivableId;
/**
* ID
*/
private Long contractId;
/**
* ID
*/
private Long paymentStageId;
/**
*
*/
private String stageName;
/**
*
*/
private Double paymentAmount;
/**
*
*/
private Double paymentPercentage;
/**
*
*/
private Double paymentDeadline;
/**
*
*/
private String paymentDescription;
/**
*
*/
private Date stageRequiredDate;
/**
*
*/
private Date stageRealDate;
/**
*
*/
private Date settlementDate;
/**
*
*/
private Long warrantyPeriod;
}

@ -0,0 +1,94 @@
package org.dromara.oa.erp.domain.bo;
import org.dromara.oa.erp.domain.ErpFinAccountInstallment;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* erp_fin_account_installment
*
* @author xins
* @date 2026-03-09
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = ErpFinAccountInstallment.class, reverseConvertGenerate = false)
public class ErpFinAccountInstallmentBo extends BaseEntity {
/**
* ID
*/
@NotNull(message = "分款ID不能为空", groups = { EditGroup.class })
private Long accountInstallmentId;
/**
*
*/
private String installmentCode;
/**
* IDcrm_customer_info
*/
private Long customerId;
/**
*
*/
private String customerName;
/**
* (CNY/USD/EUR)CNY
*/
@NotBlank(message = "货币类型(CNY/USD/EUR)默认CNY不能为空", groups = { AddGroup.class, EditGroup.class })
private String currency;
/**
*
*/
private Long paymentAmount;
/**
*
*/
private Date paymentDate;
/**
*
*/
private String remark;
/**
*
*/
private Long dispatchUserId;
/**
*
*/
private Long dispatchDeptId;
/**
*
*/
private Date dispatchDate;
/**
* 0稿 1 2
*/
@NotBlank(message = "分款状态0草稿 1已发出 2分款完成不能为空", groups = { AddGroup.class, EditGroup.class })
private String installmentStatus;
/**
*
*/
private Long accountManageId;
}

@ -0,0 +1,74 @@
package org.dromara.oa.erp.domain.bo;
import org.dromara.oa.erp.domain.ErpFinAccountInstallmentDetail;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
/**
* erp_fin_account_installment_detail
*
* @author xins
* @date 2026-03-09
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = ErpFinAccountInstallmentDetail.class, reverseConvertGenerate = false)
public class ErpFinAccountInstallmentDetailBo extends BaseEntity {
/**
* ID
*/
@NotNull(message = "分款明细ID不能为空", groups = { EditGroup.class })
private Long installmentDetailId;
/**
* ID
*/
@NotNull(message = "分款ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long accountInstallmentId;
/**
* ID
*/
private Long projectId;
/**
*
*/
private String projectCode;
/**
*
*/
private String projectName;
/**
* IDerp_contract_info
*/
@NotNull(message = "合同ID关联erp_contract_info不能为空", groups = { AddGroup.class, EditGroup.class })
private Long contractId;
/**
* IDbase_payment_stage
*/
private Long paymentStageId;
/**
*
*/
private BigDecimal detailAmount;
/**
*
*/
private String remark;
}

@ -0,0 +1,168 @@
package org.dromara.oa.erp.domain.bo;
import org.dromara.oa.erp.domain.ErpFinAccountReceivable;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.dromara.oa.erp.domain.ErpFinAccountReceivableStage;
/**
* erp_fin_account_receivable
*
* @author xins
* @date 2026-02-25
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = ErpFinAccountReceivable.class, reverseConvertGenerate = false)
public class ErpFinAccountReceivableBo extends BaseEntity {
/**
* ID
*/
@NotNull(message = "应收款ID不能为空", groups = { EditGroup.class })
private Long accountReceivableId;
/**
*
*/
private String invoiceCode;
/**
* ID
*/
@NotNull(message = "项目ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long projectId;
/**
*
*/
private String projectCategory;
/**
*
*/
private String projectType;
/**
* ID
*/
private Long contractId;
/**
*
*/
private String generalContractor;
/**
*
*/
private String customerAbbreviation;
/**
*
*/
private String contractParties;
/**
* WBS.
*/
private String wbsElement;
/**
*
*/
private String lineItem;
/**
*
*/
private String finProjectStatus;
/**
*
*/
private Date settlementMonth;
/**
*
*/
private BigDecimal income;
/**
*
*/
private BigDecimal backToBackRatio;
/**
*
*/
private String currency;
/**
* 线
*/
private BigDecimal invoiceAmount;
/**
*
*/
private BigDecimal totalPrice;
/**
*
*/
private BigDecimal totalPriceHighway;
/**
* -
*/
private BigDecimal totalPriceOri;
/**
*
*/
private BigDecimal exchangeRate;
/**
*
*/
private Date repaymentPlan;
/**
*
*/
private Date originalPlan;
/**
*
*/
private String mesnacOrderNo;
/**
*
*/
private String mesnacProjectCode;
/**
*
*/
private String remark;
private List<ErpFinAccountReceivableStage> finAccountReceivableStageList;
private String projectCode;
private String projectName;
}

@ -0,0 +1,94 @@
package org.dromara.oa.erp.domain.bo;
import org.dromara.oa.erp.domain.ErpFinAccountReceivableStage;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* erp_fin_account_receivable_stage
*
* @author xins
* @date 2026-02-24
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = ErpFinAccountReceivableStage.class, reverseConvertGenerate = false)
public class ErpFinAccountReceivableStageBo extends BaseEntity {
/**
* ID
*/
@NotNull(message = "应收款节点信息ID不能为空", groups = { EditGroup.class })
private Long receivableStageId;
/**
* ID
*/
private Long accountReceivableId;
/**
* ID
*/
private Long contractId;
/**
* ID
*/
private Long paymentStageId;
/**
*
*/
private String stageName;
/**
*
*/
private Double paymentAmount;
/**
*
*/
private Double paymentPercentage;
/**
*
*/
private Double paymentDeadline;
/**
*
*/
private String paymentDescription;
/**
*
*/
private Date stageRequiredDate;
/**
*
*/
private Date stageRealDate;
/**
*
*/
private Date settlementDate;
/**
*
*/
private Long warrantyPeriod;
}

@ -2,6 +2,7 @@ package org.dromara.oa.erp.domain.vo;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.TableField;
import org.dromara.oa.erp.domain.ErpContractPaymentMethod;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
@ -102,5 +103,11 @@ public class ErpContractPaymentMethodVo implements Serializable {
@ExcelDictFormat(readConverterExp = "1=是,0=否")
private String activeFlag;
private String stageName;
/**
*
*/
private BigDecimal receivedAmount;
}

@ -0,0 +1,87 @@
package org.dromara.oa.erp.domain.vo;
import org.dromara.oa.erp.domain.ErpFinAccountInstallmentDetail;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* erp_fin_account_installment_detail
*
* @author xins
* @date 2026-03-09
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = ErpFinAccountInstallmentDetail.class)
public class ErpFinAccountInstallmentDetailVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@ExcelProperty(value = "分款明细ID")
private Long installmentDetailId;
/**
* ID
*/
@ExcelProperty(value = "分款ID")
private Long accountInstallmentId;
/**
* ID
*/
@ExcelProperty(value = "项目ID")
private Long projectId;
/**
*
*/
@ExcelProperty(value = "冗余,项目号")
private String projectCode;
/**
*
*/
@ExcelProperty(value = "冗余,项目名称")
private String projectName;
/**
* IDerp_contract_info
*/
@ExcelProperty(value = "合同ID关联erp_contract_info")
private Long contractId;
/**
* IDbase_payment_stage
*/
@ExcelProperty(value = "阶段ID关联base_payment_stage")
private Long paymentStageId;
/**
*
*/
@ExcelProperty(value = "分款明细金额")
private BigDecimal detailAmount;
/**
*
*/
@ExcelProperty(value = "备注")
private String remark;
}

@ -0,0 +1,113 @@
package org.dromara.oa.erp.domain.vo;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.dromara.oa.erp.domain.ErpFinAccountInstallment;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* erp_fin_account_installment
*
* @author xins
* @date 2026-03-09
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = ErpFinAccountInstallment.class)
public class ErpFinAccountInstallmentVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@ExcelProperty(value = "分款ID")
private Long accountInstallmentId;
/**
*
*/
@ExcelProperty(value = "分款编号")
private String installmentCode;
/**
* IDcrm_customer_info
*/
@ExcelProperty(value = "客户ID关联crm_customer_info")
private Long customerId;
/**
*
*/
@ExcelProperty(value = "客户名称,冗余")
private String customerName;
/**
* (CNY/USD/EUR)CNY
*/
@ExcelProperty(value = "货币类型(CNY/USD/EUR)默认CNY")
private String currency;
/**
*
*/
@ExcelProperty(value = "回款金额")
private Long paymentAmount;
/**
*
*/
@ExcelProperty(value = "回款日期")
private Date paymentDate;
/**
*
*/
@ExcelProperty(value = "备注")
private String remark;
/**
*
*/
@ExcelProperty(value = "发出人员")
private Long dispatchUserId;
/**
*
*/
@ExcelProperty(value = "发出部门")
private Long dispatchDeptId;
/**
*
*/
@ExcelProperty(value = "发出日期")
private Date dispatchDate;
/**
* 0稿 1 2
*/
@ExcelProperty(value = "分款状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "0=草稿,1=已发出,2=分款完成")
private String installmentStatus;
/**
*
*/
@ExcelProperty(value = "客户经理")
private Long accountManageId;
}

@ -0,0 +1,116 @@
package org.dromara.oa.erp.domain.vo;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.dromara.oa.erp.domain.ErpFinAccountReceivableStage;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* erp_fin_account_receivable_stage
*
* @author xins
* @date 2026-02-24
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = ErpFinAccountReceivableStage.class)
public class ErpFinAccountReceivableStageVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@ExcelProperty(value = "应收款节点信息ID")
private Long receivableStageId;
/**
* ID
*/
@ExcelProperty(value = "应收款ID")
private Long accountReceivableId;
/**
* ID
*/
private Long contractId;
/**
* ID
*/
@ExcelProperty(value = "阶段ID")
private Long paymentStageId;
/**
*
*/
@ExcelProperty(value = "阶段名称,冗余")
private String stageName;
/**
*
*/
@ExcelProperty(value = "阶段金额,公式计算")
private Double paymentAmount;
/**
*
*/
@ExcelProperty(value = "阶段比例,冗余")
private Double paymentPercentage;
/**
*
*/
@ExcelProperty(value = "阶段账期,冗余")
private Double paymentDeadline;
/**
*
*/
@ExcelProperty(value = "阶段付款条款,冗余")
private String paymentDescription;
/**
*
*/
@ExcelProperty(value = "阶段要求日期,冗余")
private Date stageRequiredDate;
/**
*
*/
@ExcelProperty(value = "阶段实际执行日期")
private Date stageRealDate;
/**
*
*/
@ExcelProperty(value = "无日期的按结算日期,先自填")
private Date settlementDate;
/**
*
*/
@ExcelProperty(value = "质保期", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "天=")
private Long warrantyPeriod;
/**
*
*/
private BigDecimal receivedAmount;
}

@ -0,0 +1,194 @@
package org.dromara.oa.erp.domain.vo;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.dromara.oa.erp.domain.ErpFinAccountReceivable;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* erp_fin_account_receivable
*
* @author xins
* @date 2026-02-25
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = ErpFinAccountReceivable.class)
public class ErpFinAccountReceivableVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@ExcelProperty(value = "应收款ID")
private Long accountReceivableId;
/**
*
*/
@ExcelProperty(value = "集团应收模板编号")
private String invoiceCode;
/**
* ID
*/
@ExcelProperty(value = "项目ID")
private Long projectId;
/**
*
*/
@ExcelProperty(value = "项目大类,自填")
private String projectCategory;
/**
*
*/
@ExcelProperty(value = "项目小类,自填")
private String projectType;
/**
* ID
*/
@ExcelProperty(value = "合同ID")
private Long contractId;
/**
*
*/
@ExcelProperty(value = "总包,自填")
private String generalContractor;
/**
*
*/
@ExcelProperty(value = "客户简称,自填")
private String customerAbbreviation;
/**
*
*/
@ExcelProperty(value = "合同签订方,自填")
private String contractParties;
/**
* WBS.
*/
@ExcelProperty(value = "WBS.元素,自填")
private String wbsElement;
/**
*
*/
@ExcelProperty(value = "行项目,自填")
private String lineItem;
/**
*
*/
@ExcelProperty(value = "项目状态,自填")
private String finProjectStatus;
/**
*
*/
@ExcelProperty(value = "结算月份,自填")
private Date settlementMonth;
/**
*
*/
@ExcelProperty(value = "收入,自填")
private BigDecimal income;
/**
*
*/
@ExcelProperty(value = "背靠背比例,自填")
private BigDecimal backToBackRatio;
/**
*
*/
@ExcelProperty(value = "币种,自填")
private String currency;
/**
* 线
*/
@ExcelProperty(value = "开票金额,开票流程上线后可自动取数")
private BigDecimal invoiceAmount;
/**
*
*/
@ExcelProperty(value = "合同金额", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "主=")
private BigDecimal totalPrice;
/**
*
*/
@ExcelProperty(value = "合同金额", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "海=威")
private BigDecimal totalPriceHighway;
/**
* -
*/
@ExcelProperty(value = "合同金额-原币", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "海=威")
private BigDecimal totalPriceOri;
/**
*
*/
@ExcelProperty(value = "汇率,合同台账")
private BigDecimal exchangeRate;
/**
*
*/
private Date repaymentPlan;
/**
*
*/
private Date originalPlan;
/**
*
*/
private String mesnacOrderNo;
/**
*
*/
private String mesnacProjectCode;
/**
*
*/
private String remark;
private String projectCode;
private String projectName;
private ErpProjectInfoVo erpProjectInfoVo;
}

@ -1,6 +1,7 @@
package org.dromara.oa.erp.domain.vo;
import java.math.BigDecimal;
import org.dromara.oa.erp.domain.ErpProjectInfo;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
@ -14,7 +15,6 @@ import java.io.Serializable;
import java.util.Date;
/**
* erp_project_info
*
@ -228,4 +228,26 @@ public class ErpProjectInfoVo implements Serializable {
@ExcelProperty(value = "合同跟进人名称")
private String contractUserName;
private Date contractDate;//签订日期
private String externalContractCode;//外部合同号
private String internalContractCode;//内部合同号
private Long warrantyPeriod;//质保期
private String customerName;//客户名称
private String contractingEntity;//签订主体
private String customerManager;//客户经理
private String orderContractCode;//订单号
private String projectContractCode;//项目号
private BigDecimal totalPrice;//合同总价
}

@ -0,0 +1,40 @@
package org.dromara.oa.erp.mapper;
import java.util.List;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.dromara.oa.erp.domain.ErpFinAccountInstallmentDetail;
import org.dromara.oa.erp.domain.vo.ErpFinAccountInstallmentDetailVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* Mapper
*
* @author xins
* @date 2026-03-09
*/
@InterceptorIgnore(tenantLine = "true")
public interface ErpFinAccountInstallmentDetailMapper extends BaseMapperPlus<ErpFinAccountInstallmentDetail, ErpFinAccountInstallmentDetailVo> {
/**
*
*
* @param page
* @param queryWrapper
* @return
*/
public Page<ErpFinAccountInstallmentDetailVo> selectCustomErpFinAccountInstallmentDetailVoList(@Param("page") Page<ErpFinAccountInstallmentDetailVo> page, @Param(Constants.WRAPPER) MPJLambdaWrapper<ErpFinAccountInstallmentDetail> queryWrapper);
/**
*
*
* @param queryWrapper
* @return
*/
public List<ErpFinAccountInstallmentDetailVo> selectCustomErpFinAccountInstallmentDetailVoList(@Param(Constants.WRAPPER) MPJLambdaWrapper<ErpFinAccountInstallmentDetail> queryWrapper);
}

@ -0,0 +1,37 @@
package org.dromara.oa.erp.mapper;
import java.util.List;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.dromara.oa.erp.domain.ErpFinAccountInstallment;
import org.dromara.oa.erp.domain.vo.ErpFinAccountInstallmentVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* Mapper
*
* @author xins
* @date 2026-03-09
*/
public interface ErpFinAccountInstallmentMapper extends BaseMapperPlus<ErpFinAccountInstallment, ErpFinAccountInstallmentVo> {
/**
*
*
* @param page
* @param queryWrapper
* @return
*/
public Page<ErpFinAccountInstallmentVo> selectCustomErpFinAccountInstallmentVoList(@Param("page") Page<ErpFinAccountInstallmentVo> page, @Param(Constants.WRAPPER) MPJLambdaWrapper<ErpFinAccountInstallment> queryWrapper);
/**
*
*
* @param queryWrapper
* @return
*/
public List<ErpFinAccountInstallmentVo> selectCustomErpFinAccountInstallmentVoList(@Param(Constants.WRAPPER) MPJLambdaWrapper<ErpFinAccountInstallment> queryWrapper);
}

@ -0,0 +1,37 @@
package org.dromara.oa.erp.mapper;
import java.util.List;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.dromara.oa.erp.domain.ErpFinAccountReceivable;
import org.dromara.oa.erp.domain.vo.ErpFinAccountReceivableVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* Mapper
*
* @author xins
* @date 2026-02-25
*/
public interface ErpFinAccountReceivableMapper extends BaseMapperPlus<ErpFinAccountReceivable, ErpFinAccountReceivableVo> {
/**
*
*
* @param page
* @param queryWrapper
* @return
*/
public Page<ErpFinAccountReceivableVo> selectCustomErpFinAccountReceivableVoList(@Param("page") Page<ErpFinAccountReceivableVo> page, @Param(Constants.WRAPPER) MPJLambdaWrapper<ErpFinAccountReceivable> queryWrapper);
/**
*
*
* @param queryWrapper
* @return
*/
public List<ErpFinAccountReceivableVo> selectCustomErpFinAccountReceivableVoList(@Param(Constants.WRAPPER) MPJLambdaWrapper<ErpFinAccountReceivable> queryWrapper);
}

@ -0,0 +1,40 @@
package org.dromara.oa.erp.mapper;
import java.util.List;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.dromara.oa.erp.domain.ErpFinAccountReceivableStage;
import org.dromara.oa.erp.domain.vo.ErpFinAccountReceivableStageVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* Mapper
*
* @author xins
* @date 2026-02-24
*/
@InterceptorIgnore(tenantLine = "true")
public interface ErpFinAccountReceivableStageMapper extends BaseMapperPlus<ErpFinAccountReceivableStage, ErpFinAccountReceivableStageVo> {
/**
*
*
* @param page
* @param queryWrapper
* @return
*/
public Page<ErpFinAccountReceivableStageVo> selectCustomErpFinAccountReceivableStageVoList(@Param("page") Page<ErpFinAccountReceivableStageVo> page, @Param(Constants.WRAPPER) MPJLambdaWrapper<ErpFinAccountReceivableStage> queryWrapper);
/**
*
*
* @param queryWrapper
* @return
*/
public List<ErpFinAccountReceivableStageVo> selectCustomErpFinAccountReceivableStageVoList(@Param(Constants.WRAPPER) MPJLambdaWrapper<ErpFinAccountReceivableStage> queryWrapper);
}

@ -52,4 +52,32 @@ public interface ErpProjectInfoMapper extends BaseMapperPlus<ErpProjectInfo, Erp
*/
public List<ErpProjectInfoVo> selectCustomErpProjectInfoVoList(@Param(Constants.WRAPPER) MPJLambdaWrapper<ErpProjectInfo> queryWrapper, Boolean single);
/**
*
*
* @param page
* @param queryWrapper
* @return
*/
@DataPermission({
@DataColumn(key = "deptName", value = "t.dept_id"),
@DataColumn(key = "userName", value = "t.create_by")
})
public Page<ErpProjectInfoVo> selectErpProjectInfoVoJoinList(@Param("page") Page<ErpProjectInfoVo> page, @Param(Constants.WRAPPER) MPJLambdaWrapper<ErpProjectInfo> queryWrapper);
/**
* 使
*
* @param queryWrapper
* @return
*/
@DataPermission({
@DataColumn(key = "deptName", value = "t.dept_id"),
@DataColumn(key = "userName", value = "t.create_by")
})
public List<ErpProjectInfoVo> selectErpProjectInfoVoJoinList(@Param(Constants.WRAPPER) MPJLambdaWrapper<ErpProjectInfo> queryWrapper);
}

@ -66,4 +66,12 @@ public interface IErpContractPaymentMethodService {
* @return
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* ,left join base_payment_stage
*
* @param bo
* @return
*/
public List<ErpContractPaymentMethodVo> queryJoinList(ErpContractPaymentMethodBo bo);
}

@ -0,0 +1,69 @@
package org.dromara.oa.erp.service;
import org.dromara.oa.erp.domain.ErpFinAccountInstallment;
import org.dromara.oa.erp.domain.vo.ErpFinAccountInstallmentVo;
import org.dromara.oa.erp.domain.bo.ErpFinAccountInstallmentBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* Service
*
* @author xins
* @date 2026-03-09
*/
public interface IErpFinAccountInstallmentService {
/**
*
*
* @param accountInstallmentId
* @return
*/
ErpFinAccountInstallmentVo queryById(Long accountInstallmentId);
/**
*
*
* @param bo
* @param pageQuery
* @return
*/
TableDataInfo<ErpFinAccountInstallmentVo> queryPageList(ErpFinAccountInstallmentBo bo, PageQuery pageQuery);
/**
*
*
* @param bo
* @return
*/
List<ErpFinAccountInstallmentVo> queryList(ErpFinAccountInstallmentBo bo);
/**
*
*
* @param bo
* @return
*/
Boolean insertByBo(ErpFinAccountInstallmentBo bo);
/**
*
*
* @param bo
* @return
*/
Boolean updateByBo(ErpFinAccountInstallmentBo bo);
/**
*
*
* @param ids
* @param isValid
* @return
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

@ -0,0 +1,85 @@
package org.dromara.oa.erp.service;
import org.dromara.oa.erp.domain.ErpFinAccountReceivable;
import org.dromara.oa.erp.domain.vo.ErpFinAccountReceivableVo;
import org.dromara.oa.erp.domain.bo.ErpFinAccountReceivableBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.oa.erp.domain.vo.ErpProjectInfoVo;
import java.util.Collection;
import java.util.List;
/**
* Service
*
* @author xins
* @date 2026-02-25
*/
public interface IErpFinAccountReceivableService {
/**
*
*
* @param accountReceivableId
* @return
*/
ErpFinAccountReceivableVo queryById(Long accountReceivableId);
/**
*
*
* @param bo
* @param pageQuery
* @return
*/
TableDataInfo<ErpFinAccountReceivableVo> queryPageList(ErpFinAccountReceivableBo bo, PageQuery pageQuery);
/**
*
*
* @param bo
* @return
*/
List<ErpFinAccountReceivableVo> queryList(ErpFinAccountReceivableBo bo);
/**
*
*
* @param bo
* @return
*/
Boolean insertByBo(ErpFinAccountReceivableBo bo);
/**
*
*
* @param bo
* @return
*/
Boolean updateByBo(ErpFinAccountReceivableBo bo);
/**
*
*
* @param ids
* @param isValid
* @return
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
*
*
* @param bo
* @return
*/
public List<ErpFinAccountReceivableVo> queryJoinList(ErpFinAccountReceivableBo bo);
/**
*
* @param accountReceivableId
* @return ErpProjectInfoVo
*/
public ErpFinAccountReceivableVo getAccountReceivableWithProjectByReceivableId(Long accountReceivableId);
}

@ -0,0 +1,80 @@
package org.dromara.oa.erp.service;
import org.dromara.oa.erp.domain.ErpFinAccountReceivableStage;
import org.dromara.oa.erp.domain.bo.ErpContractPaymentMethodBo;
import org.dromara.oa.erp.domain.vo.ErpContractPaymentMethodVo;
import org.dromara.oa.erp.domain.vo.ErpFinAccountReceivableStageVo;
import org.dromara.oa.erp.domain.bo.ErpFinAccountReceivableStageBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* Service
*
* @author xins
* @date 2026-02-24
*/
public interface IErpFinAccountReceivableStageService {
/**
*
*
* @param receivableStageId
* @return
*/
ErpFinAccountReceivableStageVo queryById(Long receivableStageId);
/**
*
*
* @param bo
* @param pageQuery
* @return
*/
TableDataInfo<ErpFinAccountReceivableStageVo> queryPageList(ErpFinAccountReceivableStageBo bo, PageQuery pageQuery);
/**
*
*
* @param bo
* @return
*/
List<ErpFinAccountReceivableStageVo> queryList(ErpFinAccountReceivableStageBo bo);
/**
*
*
* @param bo
* @return
*/
Boolean insertByBo(ErpFinAccountReceivableStageBo bo);
/**
*
*
* @param bo
* @return
*/
Boolean updateByBo(ErpFinAccountReceivableStageBo bo);
/**
*
*
* @param ids
* @param isValid
* @return
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* ,left join base_payment_stage
*
* @param bo
* @return
*/
public List<ErpContractPaymentMethodVo> queryContractPaymentMethodJoinList(ErpContractPaymentMethodBo bo);
}

@ -82,4 +82,14 @@ public interface IErpProjectInfoService {
* @return
*/
public TableDataInfo<ErpProjectInfoVo> queryPageList4Select(ErpProjectInfoBo bo, PageQuery pageQuery);
/**
* ,使
*
* @param bo
* @param pageQuery
* @return
*/
public TableDataInfo<ErpProjectInfoVo> queryJoinPageList(ErpProjectInfoBo bo, PageQuery pageQuery);
}

@ -9,6 +9,8 @@ import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.oa.base.domain.BaseMaterialInfo;
import org.dromara.oa.base.domain.BasePaymentStage;
import org.springframework.stereotype.Service;
import org.dromara.oa.erp.domain.bo.ErpContractPaymentMethodBo;
import org.dromara.oa.erp.domain.vo.ErpContractPaymentMethodVo;
@ -138,4 +140,41 @@ public class ErpContractPaymentMethodServiceImpl implements IErpContractPaymentM
}
return baseMapper.deleteByIds(ids) > 0;
}
/**
* ,left join base_payment_stage
*
* @param bo
* @return
*/
@Override
public List<ErpContractPaymentMethodVo> queryJoinList(ErpContractPaymentMethodBo bo) {
MPJLambdaWrapper<ErpContractPaymentMethod> lqw = buildJoinQueryWrapper(bo);
List<ErpContractPaymentMethodVo> list = baseMapper.selectVoList(lqw);
return list;
}
private MPJLambdaWrapper<ErpContractPaymentMethod> buildJoinQueryWrapper(ErpContractPaymentMethodBo bo) {
Map<String, Object> params = bo.getParams();
MPJLambdaWrapper<ErpContractPaymentMethod> lqw = JoinWrappers.lambda(ErpContractPaymentMethod.class)
.selectAll(ErpContractPaymentMethod.class)
.select(BasePaymentStage::getStageName)
.leftJoin(BasePaymentStage.class,BasePaymentStage::getPaymentStageId,ErpContractPaymentMethod::getPaymentStageId)
.eq(ErpContractPaymentMethod::getDelFlag, "0")
.eq(bo.getContractId() != null, ErpContractPaymentMethod::getContractId, bo.getContractId())
.eq(bo.getSortOrder() != null, ErpContractPaymentMethod::getSortOrder, bo.getSortOrder())
.eq(bo.getPaymentStageId() != null, ErpContractPaymentMethod::getPaymentStageId, bo.getPaymentStageId())
.eq(bo.getPaymentDeadline() != null, ErpContractPaymentMethod::getPaymentDeadline, bo.getPaymentDeadline())
.eq(bo.getPaymentPercentage() != null, ErpContractPaymentMethod::getPaymentPercentage, bo.getPaymentPercentage())
.eq(bo.getInvoicePercentage() != null, ErpContractPaymentMethod::getInvoicePercentage, bo.getInvoicePercentage())
.eq(bo.getPaymentAmount() != null, ErpContractPaymentMethod::getPaymentAmount, bo.getPaymentAmount())
.eq(StringUtils.isNotBlank(bo.getPaymentDescription()), ErpContractPaymentMethod::getPaymentDescription, bo.getPaymentDescription())
.eq(StringUtils.isNotBlank(bo.getActiveFlag()), ErpContractPaymentMethod::getActiveFlag, bo.getActiveFlag())
.orderByAsc(ErpContractPaymentMethod::getSortOrder);
;
return lqw;
}
}

@ -0,0 +1,142 @@
package org.dromara.oa.erp.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.dromara.oa.erp.domain.bo.ErpFinAccountInstallmentBo;
import org.dromara.oa.erp.domain.vo.ErpFinAccountInstallmentVo;
import org.dromara.oa.erp.domain.ErpFinAccountInstallment;
import org.dromara.oa.erp.mapper.ErpFinAccountInstallmentMapper;
import org.dromara.oa.erp.service.IErpFinAccountInstallmentService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* Service
*
* @author xins
* @date 2026-03-09
*/
@RequiredArgsConstructor
@Service
public class ErpFinAccountInstallmentServiceImpl implements IErpFinAccountInstallmentService {
private final ErpFinAccountInstallmentMapper baseMapper;
/**
*
*
* @param accountInstallmentId
* @return
*/
@Override
public ErpFinAccountInstallmentVo queryById(Long accountInstallmentId){
return baseMapper.selectVoById(accountInstallmentId);
}
/**
*
*
* @param bo
* @param pageQuery
* @return
*/
@Override
public TableDataInfo<ErpFinAccountInstallmentVo> queryPageList(ErpFinAccountInstallmentBo bo, PageQuery pageQuery) {
MPJLambdaWrapper<ErpFinAccountInstallment> lqw = buildQueryWrapper(bo);
Page<ErpFinAccountInstallmentVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
*
*
* @param bo
* @return
*/
@Override
public List<ErpFinAccountInstallmentVo> queryList(ErpFinAccountInstallmentBo bo) {
MPJLambdaWrapper<ErpFinAccountInstallment> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private MPJLambdaWrapper<ErpFinAccountInstallment> buildQueryWrapper(ErpFinAccountInstallmentBo bo) {
Map<String, Object> params = bo.getParams();
MPJLambdaWrapper<ErpFinAccountInstallment> lqw = JoinWrappers.lambda(ErpFinAccountInstallment.class)
.selectAll(ErpFinAccountInstallment.class)
.eq(StringUtils.isNotBlank(bo.getInstallmentCode()), ErpFinAccountInstallment::getInstallmentCode, bo.getInstallmentCode())
.eq(bo.getCustomerId() != null, ErpFinAccountInstallment::getCustomerId, bo.getCustomerId())
.like(StringUtils.isNotBlank(bo.getCustomerName()), ErpFinAccountInstallment::getCustomerName, bo.getCustomerName())
.eq(StringUtils.isNotBlank(bo.getCurrency()), ErpFinAccountInstallment::getCurrency, bo.getCurrency())
.eq(bo.getPaymentAmount() != null, ErpFinAccountInstallment::getPaymentAmount, bo.getPaymentAmount())
.eq(bo.getPaymentDate() != null, ErpFinAccountInstallment::getPaymentDate, bo.getPaymentDate())
.eq(bo.getDispatchUserId() != null, ErpFinAccountInstallment::getDispatchUserId, bo.getDispatchUserId())
.eq(bo.getDispatchDeptId() != null, ErpFinAccountInstallment::getDispatchDeptId, bo.getDispatchDeptId())
.eq(bo.getDispatchDate() != null, ErpFinAccountInstallment::getDispatchDate, bo.getDispatchDate())
.eq(StringUtils.isNotBlank(bo.getInstallmentStatus()), ErpFinAccountInstallment::getInstallmentStatus, bo.getInstallmentStatus())
.eq(bo.getAccountManageId() != null, ErpFinAccountInstallment::getAccountManageId, bo.getAccountManageId())
;
return lqw;
}
/**
*
*
* @param bo
* @return
*/
@Override
public Boolean insertByBo(ErpFinAccountInstallmentBo bo) {
ErpFinAccountInstallment add = MapstructUtils.convert(bo, ErpFinAccountInstallment.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setAccountInstallmentId(add.getAccountInstallmentId());
}
return flag;
}
/**
*
*
* @param bo
* @return
*/
@Override
public Boolean updateByBo(ErpFinAccountInstallmentBo bo) {
ErpFinAccountInstallment update = MapstructUtils.convert(bo, ErpFinAccountInstallment.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
*
*/
private void validEntityBeforeSave(ErpFinAccountInstallment entity){
//TODO 做一些数据校验,如唯一约束
}
/**
*
*
* @param ids
* @param isValid
* @return
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}

@ -0,0 +1,250 @@
package org.dromara.oa.erp.service.impl;
import com.alibaba.fastjson.JSONObject;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.oa.erp.constant.ProjectCategoryConstant;
import org.dromara.oa.erp.domain.ErpFinAccountReceivableStage;
import org.dromara.oa.erp.domain.ErpProjectInfo;
import org.dromara.oa.erp.domain.bo.ErpProjectInfoBo;
import org.dromara.oa.erp.domain.vo.ErpProjectInfoVo;
import org.dromara.oa.erp.mapper.ErpFinAccountReceivableStageMapper;
import org.dromara.oa.erp.mapper.ErpProjectInfoMapper;
import org.springframework.stereotype.Service;
import org.dromara.oa.erp.domain.bo.ErpFinAccountReceivableBo;
import org.dromara.oa.erp.domain.vo.ErpFinAccountReceivableVo;
import org.dromara.oa.erp.domain.ErpFinAccountReceivable;
import org.dromara.oa.erp.mapper.ErpFinAccountReceivableMapper;
import org.dromara.oa.erp.service.IErpFinAccountReceivableService;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* Service
*
* @author xins
* @date 2026-02-25
*/
@RequiredArgsConstructor
@Service
public class ErpFinAccountReceivableServiceImpl implements IErpFinAccountReceivableService {
private final ErpFinAccountReceivableMapper baseMapper;
private final ErpFinAccountReceivableStageMapper stageMapper;
private final ErpProjectInfoMapper erpProjectInfoMapper;
/**
*
*
* @param accountReceivableId
* @return
*/
@Override
public ErpFinAccountReceivableVo queryById(Long accountReceivableId) {
return baseMapper.selectVoById(accountReceivableId);
}
/**
*
*
* @param bo
* @param pageQuery
* @return
*/
@Override
public TableDataInfo<ErpFinAccountReceivableVo> queryPageList(ErpFinAccountReceivableBo bo, PageQuery pageQuery) {
MPJLambdaWrapper<ErpFinAccountReceivable> lqw = buildJoinQueryWrapper(bo);
Page<ErpFinAccountReceivableVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
*
*
* @param bo
* @return
*/
@Override
public List<ErpFinAccountReceivableVo> queryList(ErpFinAccountReceivableBo bo) {
MPJLambdaWrapper<ErpFinAccountReceivable> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private MPJLambdaWrapper<ErpFinAccountReceivable> buildQueryWrapper(ErpFinAccountReceivableBo bo) {
Map<String, Object> params = bo.getParams();
MPJLambdaWrapper<ErpFinAccountReceivable> lqw = JoinWrappers.lambda(ErpFinAccountReceivable.class)
.selectAll(ErpFinAccountReceivable.class)
.eq(StringUtils.isNotBlank(bo.getInvoiceCode()), ErpFinAccountReceivable::getInvoiceCode, bo.getInvoiceCode())
.eq(bo.getProjectId() != null, ErpFinAccountReceivable::getProjectId, bo.getProjectId())
.eq(bo.getProjectCategory() != null, ErpFinAccountReceivable::getProjectCategory, bo.getProjectCategory())
.eq(StringUtils.isNotBlank(bo.getProjectType()), ErpFinAccountReceivable::getProjectType, bo.getProjectType())
.eq(bo.getContractId() != null, ErpFinAccountReceivable::getContractId, bo.getContractId())
.eq(StringUtils.isNotBlank(bo.getGeneralContractor()), ErpFinAccountReceivable::getGeneralContractor, bo.getGeneralContractor())
.eq(StringUtils.isNotBlank(bo.getCustomerAbbreviation()), ErpFinAccountReceivable::getCustomerAbbreviation, bo.getCustomerAbbreviation())
.eq(StringUtils.isNotBlank(bo.getContractParties()), ErpFinAccountReceivable::getContractParties, bo.getContractParties())
.eq(StringUtils.isNotBlank(bo.getWbsElement()), ErpFinAccountReceivable::getWbsElement, bo.getWbsElement())
.eq(StringUtils.isNotBlank(bo.getLineItem()), ErpFinAccountReceivable::getLineItem, bo.getLineItem())
.eq(StringUtils.isNotBlank(bo.getFinProjectStatus()), ErpFinAccountReceivable::getFinProjectStatus, bo.getFinProjectStatus())
.eq(bo.getSettlementMonth() != null, ErpFinAccountReceivable::getSettlementMonth, bo.getSettlementMonth())
.eq(bo.getIncome() != null, ErpFinAccountReceivable::getIncome, bo.getIncome())
.eq(bo.getBackToBackRatio() != null, ErpFinAccountReceivable::getBackToBackRatio, bo.getBackToBackRatio())
.eq(StringUtils.isNotBlank(bo.getCurrency()), ErpFinAccountReceivable::getCurrency, bo.getCurrency())
.eq(bo.getInvoiceAmount() != null, ErpFinAccountReceivable::getInvoiceAmount, bo.getInvoiceAmount())
.eq(bo.getTotalPrice() != null, ErpFinAccountReceivable::getTotalPrice, bo.getTotalPrice())
.eq(bo.getTotalPriceHighway() != null, ErpFinAccountReceivable::getTotalPriceHighway, bo.getTotalPriceHighway())
.eq(bo.getTotalPriceOri() != null, ErpFinAccountReceivable::getTotalPriceOri, bo.getTotalPriceOri())
.eq(bo.getExchangeRate() != null, ErpFinAccountReceivable::getExchangeRate, bo.getExchangeRate());
return lqw;
}
/**
*
*
* @param bo
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertByBo(ErpFinAccountReceivableBo bo) {
ErpFinAccountReceivable add = MapstructUtils.convert(bo, ErpFinAccountReceivable.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
List<ErpFinAccountReceivableStage> stageList = bo.getFinAccountReceivableStageList();
stageList.forEach(stage -> {
stage.setAccountReceivableId(add.getAccountReceivableId());
});
stageMapper.insertBatch(stageList);
bo.setAccountReceivableId(add.getAccountReceivableId());
}
return flag;
}
/**
*
*
* @param bo
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateByBo(ErpFinAccountReceivableBo bo) {
ErpFinAccountReceivable update = MapstructUtils.convert(bo, ErpFinAccountReceivable.class);
validEntityBeforeSave(update);
List<ErpFinAccountReceivableStage> stageList = bo.getFinAccountReceivableStageList();
stageMapper.insertOrUpdateBatch(stageList);
return baseMapper.updateById(update) > 0;
}
/**
*
*/
private void validEntityBeforeSave(ErpFinAccountReceivable entity) {
//TODO 做一些数据校验,如唯一约束
}
/**
*
*
* @param ids
* @param isValid
* @return
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
/**
*
*
* @param bo
* @return
*/
@Override
public List<ErpFinAccountReceivableVo> queryJoinList(ErpFinAccountReceivableBo bo) {
MPJLambdaWrapper<ErpFinAccountReceivable> lqw = buildJoinQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private MPJLambdaWrapper<ErpFinAccountReceivable> buildJoinQueryWrapper(ErpFinAccountReceivableBo bo) {
Map<String, Object> params = bo.getParams();
MPJLambdaWrapper<ErpFinAccountReceivable> lqw = JoinWrappers.lambda(ErpFinAccountReceivable.class)
.selectAll(ErpFinAccountReceivable.class)
.select(ErpProjectInfo::getProjectCode)
.select(ErpProjectInfo::getProjectName)
.leftJoin(ErpProjectInfo.class, ErpProjectInfo::getProjectId, ErpFinAccountReceivable::getProjectId)
.eq(StringUtils.isNotBlank(bo.getInvoiceCode()), ErpFinAccountReceivable::getInvoiceCode, bo.getInvoiceCode())
.eq(bo.getProjectId() != null, ErpFinAccountReceivable::getProjectId, bo.getProjectId())
.eq(bo.getProjectCategory() != null, ErpFinAccountReceivable::getProjectCategory, bo.getProjectCategory())
.eq(StringUtils.isNotBlank(bo.getProjectType()), ErpFinAccountReceivable::getProjectType, bo.getProjectType())
.eq(bo.getContractId() != null, ErpFinAccountReceivable::getContractId, bo.getContractId())
.eq(StringUtils.isNotBlank(bo.getGeneralContractor()), ErpFinAccountReceivable::getGeneralContractor, bo.getGeneralContractor())
.eq(StringUtils.isNotBlank(bo.getCustomerAbbreviation()), ErpFinAccountReceivable::getCustomerAbbreviation, bo.getCustomerAbbreviation())
.eq(StringUtils.isNotBlank(bo.getContractParties()), ErpFinAccountReceivable::getContractParties, bo.getContractParties())
.eq(StringUtils.isNotBlank(bo.getWbsElement()), ErpFinAccountReceivable::getWbsElement, bo.getWbsElement())
.eq(StringUtils.isNotBlank(bo.getLineItem()), ErpFinAccountReceivable::getLineItem, bo.getLineItem())
.eq(StringUtils.isNotBlank(bo.getFinProjectStatus()), ErpFinAccountReceivable::getFinProjectStatus, bo.getFinProjectStatus())
.eq(bo.getSettlementMonth() != null, ErpFinAccountReceivable::getSettlementMonth, bo.getSettlementMonth())
.eq(bo.getIncome() != null, ErpFinAccountReceivable::getIncome, bo.getIncome())
.eq(bo.getBackToBackRatio() != null, ErpFinAccountReceivable::getBackToBackRatio, bo.getBackToBackRatio())
.eq(StringUtils.isNotBlank(bo.getCurrency()), ErpFinAccountReceivable::getCurrency, bo.getCurrency())
.eq(bo.getInvoiceAmount() != null, ErpFinAccountReceivable::getInvoiceAmount, bo.getInvoiceAmount())
.eq(bo.getTotalPrice() != null, ErpFinAccountReceivable::getTotalPrice, bo.getTotalPrice())
.eq(bo.getTotalPriceHighway() != null, ErpFinAccountReceivable::getTotalPriceHighway, bo.getTotalPriceHighway())
.eq(bo.getTotalPriceOri() != null, ErpFinAccountReceivable::getTotalPriceOri, bo.getTotalPriceOri())
.eq(bo.getExchangeRate() != null, ErpFinAccountReceivable::getExchangeRate, bo.getExchangeRate());
return lqw;
}
/**
*
* @param accountReceivableId
* @return ErpProjectInfoVo
*/
@Override
public ErpFinAccountReceivableVo getAccountReceivableWithProjectByReceivableId(Long accountReceivableId) {
ErpFinAccountReceivableVo erpFinAccountReceivableVo = this.queryById(accountReceivableId);
ErpProjectInfoVo erpProjectInfoVo = this.queryJoinProjectByProjectId(erpFinAccountReceivableVo.getProjectId());
erpFinAccountReceivableVo.setErpProjectInfoVo(erpProjectInfoVo);
return erpFinAccountReceivableVo;
}
/**
* ID,使
*
* @param projectId ID
* @return
*/
private ErpProjectInfoVo queryJoinProjectByProjectId(Long projectId) {
ErpProjectInfoVo erpProjectInfoVo = new ErpProjectInfoVo();
MPJLambdaWrapper<ErpProjectInfo> lqw = JoinWrappers.lambda(ErpProjectInfo.class)
.selectAll(ErpProjectInfo.class)
.eq(projectId != null, ErpProjectInfo::getProjectId, projectId);
List<ErpProjectInfoVo> erpProjectInfoVoList = erpProjectInfoMapper.selectErpProjectInfoVoJoinList(lqw);
if (erpProjectInfoVoList != null && !erpProjectInfoVoList.isEmpty()) {
erpProjectInfoVo = erpProjectInfoVoList.get(0);
}
return erpProjectInfoVo;
}
}

@ -0,0 +1,226 @@
package org.dromara.oa.erp.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.oa.base.domain.BasePaymentStage;
import org.dromara.oa.erp.domain.ErpContractPaymentMethod;
import org.dromara.oa.erp.domain.ErpFinAccountInstallmentDetail;
import org.dromara.oa.erp.domain.bo.ErpContractPaymentMethodBo;
import org.dromara.oa.erp.domain.bo.ErpFinAccountInstallmentDetailBo;
import org.dromara.oa.erp.domain.vo.ErpContractPaymentMethodVo;
import org.dromara.oa.erp.domain.vo.ErpFinAccountInstallmentDetailVo;
import org.dromara.oa.erp.mapper.ErpContractPaymentMethodMapper;
import org.dromara.oa.erp.mapper.ErpFinAccountInstallmentDetailMapper;
import org.springframework.stereotype.Service;
import org.dromara.oa.erp.domain.bo.ErpFinAccountReceivableStageBo;
import org.dromara.oa.erp.domain.vo.ErpFinAccountReceivableStageVo;
import org.dromara.oa.erp.domain.ErpFinAccountReceivableStage;
import org.dromara.oa.erp.mapper.ErpFinAccountReceivableStageMapper;
import org.dromara.oa.erp.service.IErpFinAccountReceivableStageService;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.stream.Collectors;
/**
* Service
*
* @author xins
* @date 2026-02-24
*/
@RequiredArgsConstructor
@Service
public class ErpFinAccountReceivableStageServiceImpl implements IErpFinAccountReceivableStageService {
private final ErpFinAccountReceivableStageMapper baseMapper;
private final ErpContractPaymentMethodMapper erpContractPaymentMethodMapper;
private final ErpFinAccountInstallmentDetailMapper erpFinAccountInstallmentDetailMapper;
/**
*
*
* @param receivableStageId
* @return
*/
@Override
public ErpFinAccountReceivableStageVo queryById(Long receivableStageId) {
return baseMapper.selectVoById(receivableStageId);
}
/**
*
*
* @param bo
* @param pageQuery
* @return
*/
@Override
public TableDataInfo<ErpFinAccountReceivableStageVo> queryPageList(ErpFinAccountReceivableStageBo bo, PageQuery pageQuery) {
MPJLambdaWrapper<ErpFinAccountReceivableStage> lqw = buildQueryWrapper(bo);
Page<ErpFinAccountReceivableStageVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
*
*
* @param bo
* @return
*/
@Override
public List<ErpFinAccountReceivableStageVo> queryList(ErpFinAccountReceivableStageBo bo) {
MPJLambdaWrapper<ErpFinAccountReceivableStage> lqw = buildQueryWrapper(bo);
List<ErpFinAccountReceivableStageVo> finAccountReceivableStageVos = baseMapper.selectVoList(lqw);
Map<Long,BigDecimal> finAccountInstallmentDetailMap = getErpFinAccountInstallmentDetailMap(bo.getContractId());
// 假设map的key是paymentStageIdvalue是detailAmount总和
List<ErpFinAccountReceivableStageVo> result = finAccountReceivableStageVos.stream()
.map(vo -> {
// 根据paymentStageId从map中获取对应的金额
BigDecimal amount = finAccountInstallmentDetailMap.get(vo.getPaymentStageId());
vo.setReceivedAmount(amount != null ? amount : BigDecimal.ZERO); // 假设Vo中有setPaidAmount方法
return vo;
})
.collect(Collectors.toList());
return result;
}
private MPJLambdaWrapper<ErpFinAccountReceivableStage> buildQueryWrapper(ErpFinAccountReceivableStageBo bo) {
Map<String, Object> params = bo.getParams();
MPJLambdaWrapper<ErpFinAccountReceivableStage> lqw = JoinWrappers.lambda(ErpFinAccountReceivableStage.class)
.selectAll(ErpFinAccountReceivableStage.class)
.eq(bo.getAccountReceivableId() != null, ErpFinAccountReceivableStage::getAccountReceivableId, bo.getAccountReceivableId())
.eq(bo.getPaymentStageId() != null, ErpFinAccountReceivableStage::getPaymentStageId, bo.getPaymentStageId())
.like(StringUtils.isNotBlank(bo.getStageName()), ErpFinAccountReceivableStage::getStageName, bo.getStageName())
.eq(bo.getPaymentAmount() != null, ErpFinAccountReceivableStage::getPaymentAmount, bo.getPaymentAmount())
.eq(bo.getPaymentDeadline() != null, ErpFinAccountReceivableStage::getPaymentDeadline, bo.getPaymentDeadline())
.eq(StringUtils.isNotBlank(bo.getPaymentDescription()), ErpFinAccountReceivableStage::getPaymentDescription, bo.getPaymentDescription())
.eq(bo.getStageRequiredDate() != null, ErpFinAccountReceivableStage::getStageRequiredDate, bo.getStageRequiredDate())
.eq(bo.getStageRealDate() != null, ErpFinAccountReceivableStage::getStageRealDate, bo.getStageRealDate())
.eq(bo.getSettlementDate() != null, ErpFinAccountReceivableStage::getSettlementDate, bo.getSettlementDate())
.eq(bo.getWarrantyPeriod() != null, ErpFinAccountReceivableStage::getWarrantyPeriod, bo.getWarrantyPeriod());
return lqw;
}
/**
*
*
* @param bo
* @return
*/
@Override
public Boolean insertByBo(ErpFinAccountReceivableStageBo bo) {
ErpFinAccountReceivableStage add = MapstructUtils.convert(bo, ErpFinAccountReceivableStage.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setReceivableStageId(add.getReceivableStageId());
}
return flag;
}
/**
*
*
* @param bo
* @return
*/
@Override
public Boolean updateByBo(ErpFinAccountReceivableStageBo bo) {
ErpFinAccountReceivableStage update = MapstructUtils.convert(bo, ErpFinAccountReceivableStage.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
*
*/
private void validEntityBeforeSave(ErpFinAccountReceivableStage entity) {
//TODO 做一些数据校验,如唯一约束
}
/**
*
*
* @param ids
* @param isValid
* @return
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
/**
* ,left join base_payment_stage
*
* @param bo
* @return
*/
@Override
public List<ErpContractPaymentMethodVo> queryContractPaymentMethodJoinList(ErpContractPaymentMethodBo bo) {
MPJLambdaWrapper<ErpContractPaymentMethod> lqw = JoinWrappers.lambda(ErpContractPaymentMethod.class)
.selectAll(ErpContractPaymentMethod.class)
.select(BasePaymentStage::getStageName)
.leftJoin(BasePaymentStage.class, BasePaymentStage::getPaymentStageId, ErpContractPaymentMethod::getPaymentStageId)
.eq(ErpContractPaymentMethod::getDelFlag, "0")
.eq(bo.getContractId() != null, ErpContractPaymentMethod::getContractId, bo.getContractId())
.orderByAsc(ErpContractPaymentMethod::getSortOrder);
List<ErpContractPaymentMethodVo> erpContractPaymentMethodVos = erpContractPaymentMethodMapper.selectVoList(lqw);
Map<Long,BigDecimal> finAccountInstallmentDetailMap = getErpFinAccountInstallmentDetailMap(bo.getContractId());
// 假设map的key是paymentStageIdvalue是detailAmount总和
List<ErpContractPaymentMethodVo> result = erpContractPaymentMethodVos.stream()
.map(vo -> {
// 根据paymentStageId从map中获取对应的金额
BigDecimal amount = finAccountInstallmentDetailMap.get(vo.getPaymentStageId());
vo.setReceivedAmount(amount != null ? amount : BigDecimal.ZERO); // 假设Vo中有setPaidAmount方法
return vo;
})
.collect(Collectors.toList());
return result;
}
private Map<Long,BigDecimal> getErpFinAccountInstallmentDetailMap(Long contractId) {
ErpFinAccountInstallmentDetailBo bo = new ErpFinAccountInstallmentDetailBo();
MPJLambdaWrapper<ErpFinAccountInstallmentDetail> lqw = JoinWrappers.lambda(ErpFinAccountInstallmentDetail.class)
.selectAll(ErpFinAccountInstallmentDetail.class)
.eq(contractId != null, ErpFinAccountInstallmentDetail::getContractId, contractId);
List<ErpFinAccountInstallmentDetailVo> erpFinAccountInstallmentDetailVos = erpFinAccountInstallmentDetailMapper.selectVoList(lqw);
Map<Long, BigDecimal> stageAmountMap = erpFinAccountInstallmentDetailVos.stream()
.filter(vo -> vo.getPaymentStageId() != null) // 过滤paymentStageId为null的记录
.collect(Collectors.groupingBy(
ErpFinAccountInstallmentDetailVo::getPaymentStageId,
Collectors.reducing(
BigDecimal.ZERO,
vo -> vo.getDetailAmount() != null ? vo.getDetailAmount() : BigDecimal.ZERO,
BigDecimal::add
)
));
return stageAmountMap;
}
}

@ -39,6 +39,7 @@ import java.util.Collection;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import org.springframework.transaction.annotation.Transactional;
/**
@ -68,8 +69,8 @@ public class ErpProjectInfoServiceImpl implements IErpProjectInfoService {
@Override
public ErpProjectInfoVo queryById(Long projectId) {
MPJLambdaWrapper<ErpProjectInfo> lqw = JoinWrappers.lambda(ErpProjectInfo.class)
.eq(ErpProjectInfo::getProjectId, projectId)
.eq("t.del_flag", "0");
.eq(ErpProjectInfo::getProjectId, projectId)
.eq("t.del_flag", "0");
List<ErpProjectInfoVo> list = baseMapper.selectCustomErpProjectInfoVoList(lqw, true);
return !list.isEmpty() ? list.get(0) : null;
}
@ -177,13 +178,13 @@ public class ErpProjectInfoServiceImpl implements IErpProjectInfoService {
MPJLambdaWrapper<ErpProjectContracts> lqwRecord = JoinWrappers.lambda(ErpProjectContracts.class);
lqwRecord.eq(ErpProjectContracts::getProjectId, bo.getProjectId());
List<ErpProjectContracts> projectContractsOldList = projectContractsMapper.selectList(lqwRecord);
if (projectContractsList != null && !projectContractsList.isEmpty()) {
// 获取原有关联合同的ID集合
Set<Long> oldProjectContractsIds = projectContractsOldList.stream()
.map(ErpProjectContracts::getProjectContractsId)
.collect(Collectors.toSet());
.map(ErpProjectContracts::getProjectContractsId)
.collect(Collectors.toSet());
// 保存新的关联合同列表
for (ErpProjectContractsBo projectContractsBo : projectContractsList) {
projectContractsBo.setProjectId(bo.getProjectId());
@ -198,13 +199,13 @@ public class ErpProjectInfoServiceImpl implements IErpProjectInfoService {
}
// 删除不在新列表中的关联合同
Set<Long> existingProjectContractsIds = projectContractsList.stream()
.map(ErpProjectContractsBo::getProjectContractsId)
.filter(Objects::nonNull)
.filter(oldProjectContractsIds::contains) // 只处理真实ID在原列表中存在
.collect(Collectors.toSet());
.map(ErpProjectContractsBo::getProjectContractsId)
.filter(Objects::nonNull)
.filter(oldProjectContractsIds::contains) // 只处理真实ID在原列表中存在
.collect(Collectors.toSet());
List<ErpProjectContracts> filterProjectContracts = projectContractsOldList.stream()
.filter(contract -> !existingProjectContractsIds.contains(contract.getProjectContractsId()))
.toList();
.filter(contract -> !existingProjectContractsIds.contains(contract.getProjectContractsId()))
.toList();
for (ErpProjectContracts filterProjectContract : filterProjectContracts) {
projectContractsMapper.deleteById(filterProjectContract.getProjectContractsId());
}
@ -338,4 +339,20 @@ public class ErpProjectInfoServiceImpl implements IErpProjectInfoService {
return wrapper;
}
/**
* ,使
*
* @param bo
* @param pageQuery
* @return
*/
@Override
public TableDataInfo<ErpProjectInfoVo> queryJoinPageList(ErpProjectInfoBo bo, PageQuery pageQuery) {
MPJLambdaWrapper<ErpProjectInfo> lqw = buildQueryWrapper(bo);
Page<ErpProjectInfoVo> result = baseMapper.selectErpProjectInfoVoJoinList(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
}

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.oa.erp.mapper.ErpFinAccountInstallmentMapper">
<resultMap type="org.dromara.oa.erp.domain.vo.ErpFinAccountInstallmentVo" id="ErpFinAccountInstallmentResult">
</resultMap>
<select id="selectCustomErpFinAccountInstallmentVoList" resultMap="ErpFinAccountInstallmentResult">
select account_installment_id, tenant_id, installment_code, customer_id, customer_name, currency, payment_amount, payment_date, remark, dispatch_user_id, dispatch_dept_id, dispatch_date, installment_status, account_manage_id, create_dept, create_by, create_time, update_by, update_time from erp_fin_account_installment t
${ew.getCustomSqlSegment}
</select>
</mapper>

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.oa.erp.mapper.ErpFinAccountReceivableMapper">
<resultMap type="org.dromara.oa.erp.domain.vo.ErpFinAccountReceivableVo" id="ErpFinAccountReceivableResult">
</resultMap>
<select id="selectCustomErpFinAccountReceivableVoList" resultMap="ErpFinAccountReceivableResult">
select account_receivable_id, tenant_id, invoice_code, project_id, project_category, project_type, contract_id, general_contractor, customer_abbreviation, contract_parties, wbs_element, line_item, fin_project_status, settlement_month, income, back_to_back_ratio, currency, invoice_amount, total_price, total_price_highway, total_price_ori, exchange_rate, remark, create_dept, create_by, create_time, update_by, update_time from erp_fin_account_receivable t
${ew.getCustomSqlSegment}
</select>
</mapper>

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.oa.erp.mapper.ErpFinAccountReceivableStageMapper">
<resultMap type="org.dromara.oa.erp.domain.vo.ErpFinAccountReceivableStageVo" id="ErpFinAccountReceivableStageResult">
</resultMap>
<select id="selectCustomErpFinAccountReceivableStageVoList" resultMap="ErpFinAccountReceivableStageResult">
select receivable_stage_id, account_receivable_id, payment_stage_id, stage_name, stage_amount, payment_percentage, payment_deadline, payment_description, stage_required_date, stage_real_date, settlement_date, warranty_period, create_dept, create_by, create_time, update_by, update_time from erp_fin_account_receivable_stage t
${ew.getCustomSqlSegment}
</select>
</mapper>

@ -58,4 +58,41 @@
${ew.getCustomSqlSegment}
</select>
<select id="selectErpProjectInfoVoJoinList" resultMap="ErpProjectInfoResult">
select t.project_id,
t.tenant_id,
t.contract_flag,
t.project_code,
t.contract_id,
c.contract_date,
c.external_contract_code,
c.internal_contract_code,
c.warranty_period,
cui.customer_name,
cui1.customer_name as contractingEntity,
t.business_direction,
d.dept_name,
u2.nick_name customerManager,
c.order_contract_code,
c.project_contract_code,
t.project_name,
t.project_status,
c.total_price,
t.payment_method,
c.contract_code,
c.contract_name
from erp_project_info t
left join sys_user u1 on u1.user_id = t.manager_id
left join erp_contract_info c on t.contract_id = c.contract_id
left join crm_customer_info cui on c.one_customer_id = cui.customer_id
left join crm_customer_info cui1 on c.two_customer_id = cui1.customer_id
left join sys_dept d on d.dept_id = c.contract_dept_id
left join sys_user u2 on u2.user_id = c.contract_manager_id
${ew.getCustomSqlSegment}
</select>
</mapper>

Loading…
Cancel
Save