feat:模版合同加备注、水电房屋租赁执行次数改为合同有效期、合同履约列表新增双方履约、开票新增拟开票数量
18个文件已修改
9个文件已添加
890 ■■■■ 已修改文件
platformx-boot/src/main/resources/application-dev.yml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/constant/FlowNameEnum.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/ContracQueryDTO.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/ContractAddDTO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/DelayOutApprovalDTO.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/GenInvoiceInfoDTO.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BusinessCustomer.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/Contract.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ContractDelayOut.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ContractInvoice.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ContractOutBound.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractDetailVo.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractInvoiceOutBoundVo.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractOutBoundInvoiceVo.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractPageVo.java 187 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractController.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/FlowCallBackController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/ContractDelayOutMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/ContractMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ContractDelayOutService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ContractService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractDelayOutServiceImpl.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractInvoiceServiceImpl.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractServiceImpl.java 195 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/OutBoundServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/resources/mapper/ContractDelayOutMapper.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/resources/mapper/ContractMapper.xml 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-boot/src/main/resources/application-dev.yml
@@ -37,11 +37,6 @@
swagger:
  token-url: ${swagger.gateway}/admin/oauth2/token
# 文件上传配置
file:
  local:
    base-path: D:\\Users\\platformx\\Downloads\\img
#bip 配置
bip:
  flag: false
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/constant/FlowNameEnum.java
@@ -13,6 +13,7 @@
public enum FlowNameEnum {
    合同审批("合同审批"),
    排产计划审批("排产计划审批"),
    延期出货审批("延期出货审批"),
    销售挂账审批("销售挂账审批");
    private String name;
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/ContracQueryDTO.java
New file
@@ -0,0 +1,17 @@
package com.by4cloud.platformx.business.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class ContracQueryDTO {
    @Schema(description = "合同名称")
    private String contractName;
    @Schema(description = "甲方名称")
    private String partyA;
    @Schema(description = "状态")
    private String contractStatus;
}
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/ContractAddDTO.java
@@ -141,6 +141,8 @@
    @Schema(description = "开票通知在 个工作日内")
    private BigDecimal invoiceNotice;
    @Schema(description = "合同总价税率")
    private BigDecimal contractTax;
    private List<ContractPaymentScheduleAddDTO> contractPaymentSchedule;
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/DelayOutApprovalDTO.java
New file
@@ -0,0 +1,21 @@
package com.by4cloud.platformx.business.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class DelayOutApprovalDTO {
    @Schema(description = "合同ID")
    private Long contractId;
    @Schema(description = "延期天数")
    private Integer delayDay;
    @Schema(description = "延期单据名称")
    private String delayAttNames;
    @Schema(description = "延期单据路径")
    private String delayAttPaths;
}
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/GenInvoiceInfoDTO.java
@@ -1,5 +1,6 @@
package com.by4cloud.platformx.business.dto;
import com.by4cloud.platformx.business.vo.ContractOutBoundInvoiceVo;
import lombok.Data;
import java.util.List;
@@ -7,6 +8,6 @@
@Data
public class GenInvoiceInfoDTO {
    private List<Long> contractOutBoundIds;
    private List<ContractOutBoundInvoiceVo> outBoundInvoiceList;
}
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BusinessCustomer.java
@@ -73,6 +73,10 @@
   // 煤炭、有色、黑色、电力、其它、氧化铝、化工、水泥、船运
    @Schema(description = "注册资本")
    @Column(columnDefinition = "VARCHAR(128) comment '注册资本'")
    private String registerName;
    @Schema(description = "开户银行")
    @Column(columnDefinition = "VARCHAR(20) comment '开户银行'")
    private String bankName;
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/Contract.java
@@ -247,32 +247,8 @@
    @Column(columnDefinition = "decimal(10,0) comment '开票通知在 个工作日内 一煤机采购合同用'")
    private BigDecimal invoiceNotice;
    /**
     * 临时字段 - 用于接收审批人名称等关联查询结果
     */
    @Transient
    @TableField(exist = false)
    private String approverName;
    /**
     * 标的物
     */
    @Transient
    @TableField(exist = false)
    private List<ContractSubjectMatter> contractSubjectMatterList;
    /**
     * 收款阶段
     */
    @Transient
    @TableField(exist = false)
    private List<ContractPaymentSchedule> contractPaymentScheduleList;
    /**
     * 临时字段 - 合同剩余天数
     */
    @Transient
    @TableField(exist = false)
    private Long remainingDays;
    @Schema(description = "合同总价税率")
    @Column(columnDefinition = "decimal(10,2) comment '开票通知在 个工作日内 一煤机采购合同用'")
    private BigDecimal contractTax;
}
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ContractDelayOut.java
New file
@@ -0,0 +1,49 @@
package com.by4cloud.platformx.business.entity;
import com.by4cloud.platformx.common.data.mybatis.BaseModel;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import lombok.Data;
import org.hibernate.annotations.Table;
import java.util.Date;
/**
 * 2026年6月9日 13:57:15
 * syt
 */
@Data
@Entity//加了才能自动生成表
@Table(appliesTo="contract_delay_out",comment = "合同延期出货")//给表加注释
@jakarta.persistence.Table(name = "contract_delay_out")//数据库创建的表明
public class ContractDelayOut extends BaseModel<ContractDelayOut> {
    @Schema(description = "合同ID")
    @Column(columnDefinition = "bigint comment '合同ID'")
    private Long contractId;
    @Schema(description = "延期天数")
    @Column(columnDefinition = "int comment '延期天数'")
    private Integer delayDay;
    @Schema(description = "延期单据名称")
    @Column(columnDefinition="VARCHAR(256) comment '客商名称'")
    private String delayAttNames;
    @Schema(description = "延期单据路径")
    @Column(columnDefinition="VARCHAR(256) comment '客商名称'")
    private String delayAttPaths;
    @Schema(description = "提交账号")
    @Column(columnDefinition="VARCHAR(64) comment '提交账号'")
    private String applyName;
    @Schema(description = "提交时间")
    @Column(columnDefinition="datetime comment '提交时间'")
    private Date applyTime;
    @Schema(description = "状态")
    @Column(columnDefinition="char comment '0/审核中 1/审核通过 2/审核不通过'")
    private String delayStatus;
}
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ContractInvoice.java
@@ -58,6 +58,10 @@
    @Column(columnDefinition="text comment '合同出库单ID'")
    private String outBoundId;
    @Schema(description = "发票预览参数")
    @Column(columnDefinition="text comment '发票预览参数'")
    private String invoicePreviewParam;
    @Schema(description = "红冲标识")
    @Column(columnDefinition="char comment '红冲标识 1/是 0/否 2/审核中 3/红冲待确认'")
    private String redReversal;
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ContractOutBound.java
@@ -83,6 +83,11 @@
    @Column(columnDefinition = "char default 0 comment '开票状态(0-未开票 1-开票中 2-已开票)'")
    private String invoiceStatus;
    @Schema(description = "已开票数量")
    @Column(columnDefinition="decimal(10,2) comment '已开票数量'")
    private BigDecimal invoiceNum;
//    //以下开票相关
//
//    @Schema(description = "结算id")
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractDetailVo.java
@@ -7,6 +7,7 @@
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.List;
@Data
@@ -95,6 +96,63 @@
    @Schema(description = "执行日期后多少天生成应收")
    private Integer execDay;
    @Schema(description = "环境")
    private String environment;
    @Schema(description = "标准")
    private String standard;
    @Schema(description = "质保期 使用月数")
    private BigDecimal useMonth;
    @Schema(description = "质保期 发货后月数")
    private BigDecimal afterShipMonth;
    @Schema(description = "货运方式")
    private String shipMethod;
    @Schema(description = "货运地址")
    private String shipAddress;
    @Schema(description = "包装")
    private String packaging;
    @Schema(description = "维修或换货期限")
    private BigDecimal repairPeriod;
    @Schema(description = "维修或换货 违约金")
    private BigDecimal repairBreachAmount;
    @Schema(description = "货物数量不足 补货天数")
    private BigDecimal goodsShort;
    @Schema(description = "货物数量不足 违约金")
    private BigDecimal goodsShortBreachAmount;
    @Schema(description = "每逾期一日,承担本合同总额 违约金")
    private BigDecimal overdueBreachAmount;
    @Schema(description = "逾期  日以上的,甲方有权解除合同")
    private BigDecimal terminateContract;
    @Schema(description = "双方均可向 人民法院")
    private String court;
    @Schema(description = "本合同附件包括:")
    private String contractAttchment;
    @Schema(description = "合同签订市")
    private String city;
    @Schema(description = "合同签订区")
    private String region;
    @Schema(description = "开票通知在 个工作日内")
    private BigDecimal invoiceNotice;
    @Schema(description = "合同总价税率")
    private BigDecimal contractTax;
    private List<ContractPaymentSchedule> contractPaymentSchedule;
    private List<ContractSubjectMatter> contractSubjectMatter;
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractInvoiceOutBoundVo.java
@@ -21,9 +21,14 @@
    private String materialInternalName;
    @Schema(description = "出库数量")
    @Column(columnDefinition="decimal(10,0) comment '出库数量'")
    private BigDecimal outBoundNum;
    @Schema(description = "开票数量")
    private BigDecimal invoiceNum;
    @Schema(description = "拟开票数量")
    private BigDecimal toInvoiceNum;
    @Schema(description = "单价")
    private BigDecimal unitPrice;
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractOutBoundInvoiceVo.java
New file
@@ -0,0 +1,14 @@
package com.by4cloud.platformx.business.vo;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ContractOutBoundInvoiceVo {
    private String contractOutBoundId;
    private BigDecimal invoiceNum;
}
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractPageVo.java
New file
@@ -0,0 +1,187 @@
package com.by4cloud.platformx.business.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.persistence.Column;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class ContractPageVo {
    private Long id;
    @Schema(description = "合同编号")
    private String contractNo;
    @Schema(description = "合同名称")
    private String contractName;
    @Schema(description = "甲方id")
    private Long partyAId;
    @Schema(description = "甲方名称")
    private String partyA;
    @Schema(description = "乙方id")
    private Long partyBId;
    @Schema(description = "乙方名称")
    private String partyB;
    @Schema(description = "合同金额")
    private BigDecimal amount;
    @Schema(description = "币种(CNY/USD等)")
    private String currency;
    @Schema(description = "合同类型(0-生成式 1-备案式)")
    private Integer contractType;
    @Schema(description = "供应属性 0-成品 1-备件 2-大修 3-其他")
    private Integer supplyAttribute;
    @Schema(description = "合同状态(0-草稿 1-已生效 2-已终止 3-已过期)")
    @Column(columnDefinition = "tinyint(2) default 0 comment '合同状态'")
    private Integer contractStatus;
    @Schema(description = "合同服务属性(0-产品销售 1-无形服务)")
    private Integer contractAttribute;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Schema(description = "签署日期")
    private Date signDate;
    @Schema(description = "签订地点")
    private String signPlace;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Schema(description = "生效日期")
    private Date effectiveDate;
    @Schema(description = "交付周期")
    private Integer deliveryCycle;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Schema(description = "到期日期")
    private Date expirationDate;
    @Schema(description = "合同附件URL")
    private String attachmentUrl;
    @Schema(description = "备注")
    private String remark;
    @Schema(description = "关联父合同id(用于合同变更时指向原合同)")
    private Long parentId;
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
    @Schema(description = "审批时间")
    private Date approveTime;
    @Schema(description = "到货节点ID")
    private Long arrivalScheduleId;
    @Schema(description = "验收节点ID")
    private Long acceptScheduleId;
    @Schema(description = "erp推送标识")
    private String erpPushFlag;
    @Schema(description = "开票状态")
    private String billingStatus;
    @Schema(description = "已开票金额")
    private BigDecimal billingAmout;
    @Schema(description = "下一阶段")
    private String nextScheduleName;
    @Schema(description = "模版ID")
    private Long templateId;
    @Schema(description = "销售模式")
    private String salesModel;
    @Schema(description = "已付款金额")
    private BigDecimal paidAmount;
    @Schema(description = "合同分类")
    private String contractCategory;
    @Schema(description = "执行周期")
    private String execFrequency;
    @Schema(description = "执行次数")
    private Integer execTimes;
    @Schema(description = "执行日期后多少天生成应收")
    private Integer execDay;
    @Schema(description = "环境")
    private String environment;
    @Schema(description = "标准")
    private String standard;
    @Schema(description = "质保期 使用月数")
    private BigDecimal useMonth;
    @Schema(description = "质保期 发货后月数")
    private BigDecimal afterShipMonth;
    @Schema(description = "货运方式")
    private String shipMethod;
    @Schema(description = "货运地址")
    private String shipAddress;
    @Schema(description = "包装")
    private String packaging;
    @Schema(description = "维修或换货期限")
    private BigDecimal repairPeriod;
    @Schema(description = "维修或换货 违约金")
    private BigDecimal repairBreachAmount;
    @Schema(description = "货物数量不足 补货天数")
    private BigDecimal goodsShort;
    @Schema(description = "货物数量不足 违约金")
    private BigDecimal goodsShortBreachAmount;
    @Schema(description = "每逾期一日,承担本合同总额 违约金")
    private BigDecimal overdueBreachAmount;
    @Schema(description = "逾期  日以上的,甲方有权解除合同")
    private BigDecimal terminateContract;
    @Schema(description = "双方均可向 人民法院")
    private String court;
    @Schema(description = "本合同附件包括:")
    private String contractAttchment;
    @Schema(description = "合同签订市")
    private String city;
    @Schema(description = "合同签订区")
    private String region;
    @Schema(description = "开票通知在 个工作日内")
    private BigDecimal invoiceNotice;
    @Schema(description = "合同总价税率")
    private BigDecimal contractTax;
    @Schema(description = "出库金额")
    private BigDecimal outAmount;
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractController.java
@@ -6,8 +6,10 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.by4cloud.platformx.business.dto.ContracQueryDTO;
import com.by4cloud.platformx.business.dto.ContractAddDTO;
import com.by4cloud.platformx.business.dto.ContractUpdateDTO;
import com.by4cloud.platformx.business.dto.DelayOutApprovalDTO;
import com.by4cloud.platformx.business.entity.Contract;
import com.by4cloud.platformx.common.core.util.R;
import com.by4cloud.platformx.common.data.mybatis.BaseModel;
@@ -55,13 +57,13 @@
    @Operation(summary = "分页查询" , description = "分页查询" )
    @GetMapping("/page" )
    @PreAuthorize("@pms.hasPermission('business_contract_view')" )
    public R getContractPage(@ParameterObject Page page, @ParameterObject Contract contract) {
    public R getContractPage(@ParameterObject Page page, @ParameterObject ContracQueryDTO queryDTO) {
        LambdaQueryWrapper<Contract> wrapper = Wrappers.lambdaQuery();
        wrapper.like(StringUtils.isNotBlank(contract.getContractName()),Contract::getContractName,contract.getContractName());
        wrapper.like(StringUtils.isNotBlank(contract.getPartyA()),Contract::getPartyA,contract.getPartyA());
        wrapper.eq(ObjUtil.isNotNull(contract.getContractStatus()),Contract::getContractStatus,contract.getContractStatus());
        wrapper.orderByDesc(BaseModel::getCreateTime);
        return R.ok(contractService.pageByScope(page, wrapper));
//        wrapper.like(StringUtils.isNotBlank(contract.getContractName()),Contract::getContractName,contract.getContractName());
//        wrapper.like(StringUtils.isNotBlank(contract.getPartyA()),Contract::getPartyA,contract.getPartyA());
//        wrapper.eq(ObjUtil.isNotNull(contract.getContractStatus()),Contract::getContractStatus,contract.getContractStatus());
//        wrapper.orderByDesc(Contract::getCreateTime);
        return R.ok(contractService.pageScope(page, queryDTO));
    }
@@ -228,4 +230,14 @@
    public void exportContractYMJCGWord(@PathVariable("id" ) Long id, HttpServletResponse response) {
        contractService.exportContractYMJCGWord(id,response);
    }
    /**
     * 延期出货审批
     */
    @PostMapping("/delayOutApproval")
    public R delayOutApproval(@RequestBody DelayOutApprovalDTO dto) {
        return contractService.delayOutApproval(dto);
    }
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/FlowCallBackController.java
@@ -1,6 +1,9 @@
package com.by4cloud.platformx.business.controller;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.by4cloud.platformx.business.constant.FlowNameEnum;
import com.by4cloud.platformx.business.entity.ContractDelayOut;
import com.by4cloud.platformx.business.service.ContractDelayOutService;
import com.by4cloud.platformx.business.service.ContractInvoiceService;
import com.by4cloud.platformx.business.service.ContractService;
import com.by4cloud.platformx.flow.task.constant.TaskStatusEnum;
@@ -28,6 +31,7 @@
    private final ContractService contractService;
    private final ContractInvoiceService contractInvoiceService;
    private final ContractDelayOutService delayOutService;
    /**
     * 开始节点事件
@@ -70,6 +74,16 @@
                contractInvoiceService.refuseApproval(Long.valueOf(processInstanceParamDto.getParamMap().get("id")+""));
            }
        }
        if (processInstanceParamDto.getFlowName().equals(FlowNameEnum.延期出货审批.getName())) {
            //通过后更新主表状态
            if (processInstanceParamDto.getTaskStatus()== TaskStatusEnum.YJS.getCode()){
                delayOutService.approvalPass(Long.valueOf(processInstanceParamDto.getParamMap().get("contractId")+""));
            }
            //拒绝后回退主表状态
            if (processInstanceParamDto.getTaskStatus()== TaskStatusEnum.JJ.getCode()){
                delayOutService.refuseApproval(Long.valueOf(processInstanceParamDto.getParamMap().get("delayOutService")+""));
            }
        }
    }
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/ContractDelayOutMapper.java
New file
@@ -0,0 +1,11 @@
package com.by4cloud.platformx.business.mapper;
import com.by4cloud.platformx.business.entity.ContractDelayOut;
import com.by4cloud.platformx.common.data.datascope.PlatformxBaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ContractDelayOutMapper extends PlatformxBaseMapper<ContractDelayOut> {
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/ContractMapper.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.by4cloud.platformx.business.dto.AnalysisCommonDTO;
import com.by4cloud.platformx.business.dto.ContracQueryDTO;
import com.by4cloud.platformx.business.dto.CreditSalesQueryDTO;
import com.by4cloud.platformx.business.entity.Contract;
import com.by4cloud.platformx.business.vo.*;
@@ -59,4 +60,6 @@
            ,@Param("compIds")List<Long> compIds,@Param("smjCompId") Long smj,
                                                                         @Param("sgbCompId")Long sgb, @Param("jxcCompId")Long jxc,
                                                                         @Param("tfCompId") Long tfgs,@Param("ymjCompId") Long ymj);
    Page<ContractPageVo> pageScope(Page page,@Param("queryDTO") ContracQueryDTO queryDTO, DataScope comp_id);
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ContractDelayOutService.java
New file
@@ -0,0 +1,7 @@
package com.by4cloud.platformx.business.service;
public interface ContractDelayOutService {
    void approvalPass(Long contractId);
    void refuseApproval(Long contractId);
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ContractService.java
@@ -1,8 +1,11 @@
package com.by4cloud.platformx.business.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.by4cloud.platformx.business.dto.ContracQueryDTO;
import com.by4cloud.platformx.business.dto.ContractAddDTO;
import com.by4cloud.platformx.business.dto.ContractUpdateDTO;
import com.by4cloud.platformx.business.dto.DelayOutApprovalDTO;
import com.by4cloud.platformx.business.entity.Contract;
import com.by4cloud.platformx.business.vo.ContractDetailVo;
import com.by4cloud.platformx.common.core.util.R;
@@ -44,4 +47,8 @@
    void exportContractYMJGKCPMMWord(Long id, HttpServletResponse response);
    void exportContractYMJCGWord(Long id, HttpServletResponse response);
    R delayOutApproval(DelayOutApprovalDTO dto);
    Page pageScope(Page page, ContracQueryDTO queryDTO);
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractDelayOutServiceImpl.java
New file
@@ -0,0 +1,54 @@
package com.by4cloud.platformx.business.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.by4cloud.platformx.business.entity.Contract;
import com.by4cloud.platformx.business.entity.ContractDelayOut;
import com.by4cloud.platformx.business.mapper.ContractDelayOutMapper;
import com.by4cloud.platformx.business.mapper.ContractMapper;
import com.by4cloud.platformx.business.service.ContractDelayOutService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Slf4j
@Service
@RequiredArgsConstructor
public class ContractDelayOutServiceImpl  extends ServiceImpl<ContractDelayOutMapper, ContractDelayOut> implements ContractDelayOutService {
    private final ContractMapper contractMapper;
    @Override
    public void approvalPass(Long contractId) {
        ContractDelayOut delayOut = baseMapper.selectOne(Wrappers.<ContractDelayOut>lambdaQuery().eq(ContractDelayOut::getContractId,contractId)
                .eq(ContractDelayOut::getDelayStatus,"0").last("limit 1"));
        if (ObjUtil.isNull(delayOut)){
            log.error("合同延期发货审批同意后查询审批数据异常");
            return;
        }
        delayOut.setDelayStatus("1");
        baseMapper.updateById(delayOut);
        Contract contract = contractMapper.selectById(contractId);
        if (ObjUtil.isNull(contract)){
            log.error("合同延期发货审批同意后查询合同数据异常");
            return;
        }
        contract.setExpirationDate(DateUtil.offsetDay(contract.getExpirationDate(),delayOut.getDelayDay()));
        contractMapper.updateById(contract);
    }
    @Override
    public void refuseApproval(Long contractId) {
        ContractDelayOut delayOut = baseMapper.selectOne(Wrappers.<ContractDelayOut>lambdaQuery().eq(ContractDelayOut::getContractId,contractId)
                .eq(ContractDelayOut::getDelayStatus,"0").last("limit 1"));
        if (ObjUtil.isNull(delayOut)){
            log.error("合同延期发货审批同意后查询审批数据异常");
            return;
        }
        delayOut.setDelayStatus("2");
        baseMapper.updateById(delayOut);
    }
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractInvoiceServiceImpl.java
@@ -25,10 +25,7 @@
import com.by4cloud.platformx.business.mapper.*;
import com.by4cloud.platformx.business.service.ContractInvoiceService;
import com.by4cloud.platformx.business.service.PaymentConfirmService;
import com.by4cloud.platformx.business.vo.ContractInvoiceOutBoundVo;
import com.by4cloud.platformx.business.vo.ContractOutBoundMergeVo;
import com.by4cloud.platformx.business.vo.GenInvoiceInfoVo;
import com.by4cloud.platformx.business.vo.InvoiceItemVo;
import com.by4cloud.platformx.business.vo.*;
import com.by4cloud.platformx.common.core.util.R;
import com.by4cloud.platformx.common.data.mybatis.BaseModel;
import com.by4cloud.platformx.common.security.util.SecurityUtils;
@@ -88,15 +85,21 @@
                .selectAll(ContractOutBound.class)
                .eq(ContractOutBound::getContractId, contractId);
        List<ContractInvoiceOutBoundVo> invoiceOutBoundVoList = contractOutBoundMapper.selectJoinList(ContractInvoiceOutBoundVo.class, wrapper);
        if (ArrayUtil.isNotEmpty(invoiceOutBoundVoList.toArray())){
            invoiceOutBoundVoList.stream().forEach(contractInvoiceOutBoundVo -> {
                contractInvoiceOutBoundVo.setInvoiceNum(contractInvoiceOutBoundVo.getOutBoundNum().subtract(contractInvoiceOutBoundVo.getInvoiceNum()));
                contractInvoiceOutBoundVo.setToInvoiceNum(contractInvoiceOutBoundVo.getInvoiceNum());
            });
        }
        return R.ok(invoiceOutBoundVoList);
    }
    @Override
    public R genInvoiceInfo(GenInvoiceInfoDTO genInvoiceInfoDTO) {
        if (ArrayUtil.isEmpty(genInvoiceInfoDTO.getContractOutBoundIds())) {
        if (ArrayUtil.isEmpty(genInvoiceInfoDTO.getOutBoundInvoiceList())) {
            return R.failed("请选择开票出库单后再操作");
        }
        ContractOutBound outBound = contractOutBoundMapper.selectById(genInvoiceInfoDTO.getContractOutBoundIds().get(0));
        ContractOutBound outBound = contractOutBoundMapper.selectById(genInvoiceInfoDTO.getOutBoundInvoiceList().get(0).getContractOutBoundId());
        Contract contract = contractMapper.selectById(outBound.getContractId());
        if (ObjUtil.isNull(contract)) {
            return R.failed("合同信息异常,请联系技术人员");
@@ -125,16 +128,18 @@
        List<InvoiceItemVo> invoiceItemVoList = new ArrayList<>();
        List<String> erpCode = new ArrayList<>();
        List<ContractOutBoundMergeVo> mergeOutBounds = new ArrayList<>();
        List<ContractOutBound> outBounds = contractOutBoundMapper.selectList(Wrappers.<ContractOutBound>lambdaQuery()
                .in(ContractOutBound::getId, genInvoiceInfoDTO.getContractOutBoundIds()));
        if (ArrayUtil.isNotEmpty(outBounds.toArray())) {
            outBounds.stream().forEach(contractOutBound -> {
//        List<ContractOutBound> outBounds = contractOutBoundMapper.selectList(Wrappers.<ContractOutBound>lambdaQuery()
//                .in(ContractOutBound::getId, genInvoiceInfoDTO.getOutBoundInvoiceList().stream().map(item->item.getContractOutBoundId()).collect(Collectors.toList())));
        if (ArrayUtil.isNotEmpty(genInvoiceInfoDTO.getOutBoundInvoiceList().toArray())) {
            genInvoiceInfoDTO.getOutBoundInvoiceList().stream().forEach(contractOutBoundInvoiceVo -> {
                ContractOutBound contractOutBound = contractOutBoundMapper.selectById(contractOutBoundInvoiceVo.getContractOutBoundId());
                if (!ArrayUtil.contains(erpCode.toArray(), contractOutBound.getSubjectMatterCode())) {
                    erpCode.add(contractOutBound.getSubjectMatterCode());
                    ContractOutBoundMergeVo mergeVo = new ContractOutBoundMergeVo();
                    mergeVo.setMaterialCode(contractOutBound.getSubjectMatterCode());
                    mergeVo.setMaterialInternalName(contractOutBound.getSubjectMatterName());
                    mergeVo.setQuantity(contractOutBound.getOutBoundNum());
                    mergeVo.setQuantity(contractOutBoundInvoiceVo.getInvoiceNum());
                    Product product = productMapper.selectOne(Wrappers.<Product>lambdaQuery().eq(Product::getErpCode, contractOutBound.getSubjectMatterCode())
                            .eq(Product::getCompId, SecurityUtils.getUser().getCompId()).last("limit 1"));
                    if (ObjUtil.isNotNull(product)) {
@@ -183,10 +188,10 @@
    @Override
    public R toInvoice(GenInvoiceInfoDTO genInvoiceInfoDTO) {
        if (ArrayUtil.isEmpty(genInvoiceInfoDTO.getContractOutBoundIds().toArray())) {
        if (ArrayUtil.isEmpty(genInvoiceInfoDTO.getOutBoundInvoiceList().toArray())) {
            return R.failed("请选择开票出库单后再操作");
        }
        ContractOutBound outBound = contractOutBoundMapper.selectById(genInvoiceInfoDTO.getContractOutBoundIds().get(0));
        ContractOutBound outBound = contractOutBoundMapper.selectById(genInvoiceInfoDTO.getOutBoundInvoiceList().get(0).getContractOutBoundId());
        Contract contract = contractMapper.selectById(outBound.getContractId());
        if (ObjUtil.isNull(contract)) {
            return R.failed("合同信息异常,请联系技术人员");
@@ -198,7 +203,7 @@
        SysDept b = r.getData();
        GenInvoiceInfoVo vo = genInvoiceInfoVo(genInvoiceInfoDTO, contract, b);
        //发票保存
        ContractInvoice invoice = saveContractInvoice(vo, contract, genInvoiceInfoDTO.getContractOutBoundIds(), DateUtil.current() + "");
        ContractInvoice invoice = saveContractInvoice(vo, contract, genInvoiceInfoDTO.getOutBoundInvoiceList(), DateUtil.current() + "");
        //启动流程
        ProcessInstanceParamDto dto = new ProcessInstanceParamDto();
        Map<String, Object> map = BeanUtil.beanToMap(invoice);
@@ -209,9 +214,10 @@
            return R.failed("流程启动失败");
        }
        //更新合同出库单状态
        genInvoiceInfoDTO.getContractOutBoundIds().stream().forEach(outBoundId -> {
            ContractOutBound bound = contractOutBoundMapper.selectById(outBoundId);
        genInvoiceInfoDTO.getOutBoundInvoiceList().stream().forEach(contractOutBoundInvoiceVo -> {
            ContractOutBound bound = contractOutBoundMapper.selectById(contractOutBoundInvoiceVo.getContractOutBoundId());
            bound.setInvoiceStatus("1");
            bound.setInvoiceNum(bound.getInvoiceNum().add(contractOutBoundInvoiceVo.getInvoiceNum()));
            contractOutBoundMapper.updateById(bound);
        });
        return R.ok();
@@ -271,7 +277,7 @@
        return jsonObject;
    }
    private ContractInvoice saveContractInvoice(GenInvoiceInfoVo genInvoiceInfoVo, Contract contract, List<Long> outBoundIds, String serialNo) {
    private ContractInvoice saveContractInvoice(GenInvoiceInfoVo genInvoiceInfoVo, Contract contract, List<ContractOutBoundInvoiceVo> outBoundInvoiceVoList, String serialNo) {
        ContractInvoice invoice = new ContractInvoice();
        invoice.setContractId(contract.getId());
        invoice.setInvoiceCategory("1");
@@ -286,9 +292,10 @@
        invoice.setInvoicePreview(JSONObject.toJSONString(genInvoiceInfoVo));
        invoice.setInvoiceStatus("1");
        invoice.setApprovalStatus("0");
        invoice.setOutBoundId(outBoundIds.stream()
                .map(String::valueOf) // 或者 .map(Object::toString)
        invoice.setOutBoundId(outBoundInvoiceVoList.stream()
                .map(item-> String.valueOf(item.getContractOutBoundId())) // 或者 .map(Object::toString)
                .collect(Collectors.joining(",")));
        invoice.setInvoicePreviewParam(JSONObject.toJSONString(outBoundInvoiceVoList));
        baseMapper.insert(invoice);
        return invoice;
    }
@@ -327,6 +334,7 @@
        invoice.setSerialNo(DateUtil.current() + "");
        invoice.setBlueInvoiceId(invoiceId);
        invoice.setApprovalStatus("0");
        invoice.setInvoicePreviewParam(blueInvoice.getInvoicePreviewParam());
        baseMapper.insert(invoice);
        //启动流程
        ProcessInstanceParamDto dto = new ProcessInstanceParamDto();
@@ -625,12 +633,14 @@
            contractMapper.updateById(contract);
            //更新合同出库单状态
            String[] outBoundIds = blueInvoice.getOutBoundId().split(",");
            Arrays.stream(outBoundIds).forEach(outBoundId -> {
                ContractOutBound bound = contractOutBoundMapper.selectById(outBoundId);
                bound.setInvoiceStatus("0");
                contractOutBoundMapper.updateById(bound);
            });
            List<ContractOutBoundInvoiceVo> outBoundInvoiceVoList = BeanUtil.copyToList(JSONArray.parseArray(blueInvoice.getInvoicePreviewParam()),ContractOutBoundInvoiceVo.class);
            if (ArrayUtil.isNotEmpty(outBoundInvoiceVoList.toArray())){
                outBoundInvoiceVoList.stream().forEach(contractOutBoundInvoiceVo -> {
                    ContractOutBound contractOutBound = contractOutBoundMapper.selectById(contractOutBoundInvoiceVo.getContractOutBoundId());
                    contractOutBound.setInvoiceNum(contractOutBound.getInvoiceNum().subtract(contractOutBoundInvoiceVo.getInvoiceNum()));
                    contractOutBoundMapper.updateById(contractOutBound);
                });
            }
        }
        invoice.setApprovalStatus("1");
        baseMapper.updateById(invoice);
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractServiceImpl.java
@@ -8,19 +8,23 @@
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.by4cloud.platformx.admin.api.entity.SysDept;
import com.by4cloud.platformx.admin.api.feign.RemoteDeptService;
import com.by4cloud.platformx.business.api.feign.RemoteFlowProcessService;
import com.by4cloud.platformx.business.constant.FlowNameEnum;
import com.by4cloud.platformx.business.dto.ContracQueryDTO;
import com.by4cloud.platformx.business.dto.ContractAddDTO;
import com.by4cloud.platformx.business.dto.ContractUpdateDTO;
import com.by4cloud.platformx.business.dto.DelayOutApprovalDTO;
import com.by4cloud.platformx.business.entity.*;
import com.by4cloud.platformx.business.mapper.*;
import com.by4cloud.platformx.business.service.ContractService;
import com.by4cloud.platformx.business.utils.ContractNumberGenerator;
import com.by4cloud.platformx.business.vo.ContractDetailVo;
import com.by4cloud.platformx.common.core.util.R;
import com.by4cloud.platformx.common.data.datascope.DataScope;
import com.by4cloud.platformx.common.security.util.SecurityUtils;
import com.by4cloud.platformx.flow.task.dto.ProcessInstanceParamDto;
import com.deepoove.poi.XWPFTemplate;
@@ -61,9 +65,7 @@
    private final RemoteFlowProcessService remoteFlowProcessService;
    private final ProductMapper productMapper;
    private final RemoteDeptService remoteDeptService;
    @Value("${file.local.base-path}")
    private String basePath;
    private final ContractDelayOutMapper contractDelayOutMapper;
    @Override
    public R add(ContractAddDTO addDTO) {
@@ -74,8 +76,12 @@
        contract.setPaidAmount(new BigDecimal("0"));
        contract.setBillingStatus("0");
        contract.setErpPushFlag("0");
        List<Contract> contracts;
        contracts = baseMapper.selectList(Wrappers.<Contract>lambdaQuery().eq(Contract::getContractNo, contract.getContractNo()));
        if (StrUtil.isNotEmpty(addDTO.getContractCategory()) && (
                StrUtil.equals(addDTO.getContractCategory(), "ymjgkcpmm")||StrUtil.equals(addDTO.getContractCategory(), "ymjgypmm"))) {
            contract.setExpirationDate(DateUtil.offsetDay(contract.getSignDate(),contract.getDeliveryCycle()));
        }
        List<Contract> contracts = baseMapper.selectList(Wrappers.<Contract>lambdaQuery().eq(Contract::getContractNo, contract.getContractNo()));
        while (ArrayUtil.isNotEmpty(contracts.toArray())) {
            contract.setContractNo(ContractNumberGenerator.generateContractNumber());
            contracts = baseMapper.selectList(Wrappers.<Contract>lambdaQuery().eq(Contract::getContractNo, contract.getContractNo()));
@@ -102,6 +108,12 @@
                    record.setBusGuestName(contract.getPartyA());
                    record.setMeterReadTime(new Date());
                    meterReadRecordMapper.insert(record);
                }
                if (StrUtil.isNotEmpty(addDTO.getContractCategory()) && StrUtil.equals(addDTO.getContractCategory(), "ymjcg")
                &&ObjUtil.isNotNull(subjectMatter.getPlannedDeliveryDate())&&ObjUtil.isNotNull(contract.getExpirationDate())
                    &&DateUtil.compare(contract.getExpirationDate(),subjectMatter.getPlannedDeliveryDate())>0) {
                        contract.setExpirationDate(subjectMatter.getPlannedDeliveryDate());
                        baseMapper.updateById(contract);
                }
            });
@@ -144,9 +156,6 @@
        }
        if (StrUtil.isNotEmpty(addDTO.getContractCategory()) && StrUtil.equals(addDTO.getContractCategory(), "water_house")) {
        }
        return R.ok();
    }
@@ -267,58 +276,111 @@
        if (StrUtil.isNotEmpty(contract.getContractCategory()) && StrUtil.equals(contract.getContractCategory(), "water_house")) {
            List<ContractSubjectMatter> subjectMatterList = contractSubjectMatterMapper.selectList(Wrappers.<ContractSubjectMatter>lambdaQuery()
                    .eq(ContractSubjectMatter::getContractId,id));
            if (ArrayUtil.isNotEmpty(subjectMatterList.toArray())) {
                subjectMatterList.stream().forEach(contractSubjectMatter -> {
                    //循环日期
                    Date execDate0 = DateUtil.offsetDay(contract.getSignDate(), contract.getExecDay());
                    for (int i = 0; i < contract.getExecTimes(); i++) {
                        if (StrUtil.equals(contract.getExecFrequency(), "1")) {
                    if (StrUtil.equals(contract.getExecFrequency(), "1")) {
                        Long weeksTrue = DateUtil.betweenWeek(DateUtil.beginOfWeek(contract.getEffectiveDate()),
                                DateUtil.endOfWeek(contract.getExpirationDate()), true);
                        //循环日期
                        Date execDate0 = DateUtil.offsetDay(DateUtil.beginOfWeek(contract.getEffectiveDate()), contract.getExecDay());
                        for (int i = 0; i < weeksTrue.intValue(); i++) {
                            Date execDatei = DateUtil.offsetWeek(execDate0, i);
                            ContractExecDate execDate = new ContractExecDate();
                            execDate.setContractId(contract.getId());
                            execDate.setMatterId(contractSubjectMatter.getId());
                            execDate.setExecDate(execDatei);
                            execDate.setGenFlag("0");
                            contractExecDateMapper.insert(execDate);
                        }
                        if (StrUtil.equals(contract.getExecFrequency(), "2")) {
                            Date execDatei = DateUtil.offsetMonth(execDate0, i );
                            ContractExecDate execDate = new ContractExecDate();
                            execDate.setContractId(contract.getId());
                            execDate.setMatterId(contractSubjectMatter.getId());
                            execDate.setExecDate(execDatei);
                            execDate.setGenFlag("0");
                            contractExecDateMapper.insert(execDate);
                        }
                        if (StrUtil.equals(contract.getExecFrequency(), "3")) {
                            Date execDatei = DateUtil.offsetMonth(execDate0, i * 3);
                            ContractExecDate execDate = new ContractExecDate();
                            execDate.setContractId(contract.getId());
                            execDate.setMatterId(contractSubjectMatter.getId());
                            execDate.setExecDate(execDatei);
                            execDate.setGenFlag("0");
                            contractExecDateMapper.insert(execDate);
                        }
                        if (StrUtil.equals(contract.getExecFrequency(), "4")) {
                            Date execDatei = DateUtil.offsetMonth(execDate0, i * 6);
                            ContractExecDate execDate = new ContractExecDate();
                            execDate.setContractId(contract.getId());
                            execDate.setMatterId(contractSubjectMatter.getId());
                            execDate.setExecDate(execDatei);
                            execDate.setGenFlag("0");
                            contractExecDateMapper.insert(execDate);
                        }
                        if (StrUtil.equals(contract.getExecFrequency(), "5")) {
                            Date execDatei = DateUtil.offsetYear(execDate0, i);
                            ContractExecDate execDate = new ContractExecDate();
                            execDate.setContractId(contract.getId());
                            execDate.setMatterId(contractSubjectMatter.getId());
                            execDate.setExecDate(execDatei);
                            execDate.setGenFlag("0");
                            contractExecDateMapper.insert(execDate);
                            if (DateUtil.isIn(execDatei,contract.getEffectiveDate(),contract.getExpirationDate())) {
                                contractExecDateMapper.insert(execDate);
                            }
                        }
                    }
                    if (StrUtil.equals(contract.getExecFrequency(), "2")) {
                        Long weeksTrue = DateUtil.betweenMonth(DateUtil.beginOfMonth(contract.getEffectiveDate()),
                                DateUtil.endOfMonth(contract.getExpirationDate()), true);
                        //循环日期
                        Date execDate0 = DateUtil.offsetDay(DateUtil.beginOfMonth(contract.getEffectiveDate()), contract.getExecDay());
                        for (int i = 0; i < weeksTrue.intValue(); i++) {
                            Date execDatei = DateUtil.offsetMonth(execDate0, i);
                            ContractExecDate execDate = new ContractExecDate();
                            execDate.setContractId(contract.getId());
                            execDate.setMatterId(contractSubjectMatter.getId());
                            execDate.setExecDate(execDatei);
                            execDate.setGenFlag("0");
                            if (DateUtil.isIn(execDatei,contract.getEffectiveDate(),contract.getExpirationDate())) {
                                contractExecDateMapper.insert(execDate);
                            }
                        }
                    }
                    if (StrUtil.equals(contract.getExecFrequency(), "3")) {
                        Long weeksTrue = DateUtil.betweenMonth(DateUtil.beginOfQuarter(contract.getEffectiveDate()),
                                DateUtil.endOfQuarter(contract.getExpirationDate()), true)/3;
                        //循环日期
                        Date execDate0 = DateUtil.offsetDay(DateUtil.beginOfWeek(contract.getExpirationDate()), contract.getExecDay());
                        for (int i = 0; i < weeksTrue.intValue(); i++) {
                            Date execDatei = DateUtil.offsetMonth(execDate0, i*3);
                            ContractExecDate execDate = new ContractExecDate();
                            execDate.setContractId(contract.getId());
                            execDate.setMatterId(contractSubjectMatter.getId());
                            execDate.setExecDate(execDatei);
                            execDate.setGenFlag("0");
                            if (DateUtil.isIn(execDatei,contract.getEffectiveDate(),contract.getExpirationDate())) {
                                contractExecDateMapper.insert(execDate);
                            }
                        }
                    }
                    if (StrUtil.equals(contract.getExecFrequency(), "4")) {
                        Date startDate = contract.getEffectiveDate();
                        Date endDate = contract.getExpirationDate();
                        Integer startMonth = DateUtil.month(contract.getEffectiveDate());
                        Integer endMonth = DateUtil.month(contract.getExpirationDate());
                        if (1<=startMonth&&startMonth<=6){
                            startDate = DateUtil.beginOfYear(startDate);
                        }
                        if (7<=startMonth&&startMonth<=12){
                            startDate = DateUtil.offsetMonth(DateUtil.beginOfYear(startDate),6);
                        }
                        if (1<=endMonth&&endMonth<=6){
                            endDate = DateUtil.offsetMonth(DateUtil.endOfYear(endDate),-6);
                        }
                        if (7<=endMonth&&endMonth<=12){
                            endDate = DateUtil.endOfYear(endDate);
                        }
                        Long weeksTrue = DateUtil.betweenMonth(startDate,endDate, true)/6;
                        //循环日期
                        Date execDate0 = DateUtil.offsetDay(DateUtil.beginOfWeek(contract.getExpirationDate()), contract.getExecDay());
                        for (int i = 0; i < weeksTrue.intValue(); i++) {
                            Date execDatei = DateUtil.offsetMonth(execDate0, i*6);
                            ContractExecDate execDate = new ContractExecDate();
                            execDate.setContractId(contract.getId());
                            execDate.setMatterId(contractSubjectMatter.getId());
                            execDate.setExecDate(execDatei);
                            execDate.setGenFlag("0");
                            if (DateUtil.isIn(execDatei,contract.getEffectiveDate(),contract.getExpirationDate())) {
                                contractExecDateMapper.insert(execDate);
                            }
                        }
                    }
                    if (StrUtil.equals(contract.getExecFrequency(), "5")) {
                        Long weeksTrue = DateUtil.betweenWeek(DateUtil.beginOfYear(contract.getEffectiveDate()),
                                DateUtil.endOfYear(contract.getExpirationDate()), true);
                        //循环日期
                        Date execDate0 = DateUtil.offsetDay(DateUtil.beginOfYear(contract.getEffectiveDate()), contract.getExecDay());
                        for (int i = 0; i < weeksTrue.intValue(); i++) {
                            Date execDatei = DateUtil.offsetWeek(execDate0, i);
                            ContractExecDate execDate = new ContractExecDate();
                            execDate.setContractId(contract.getId());
                            execDate.setMatterId(contractSubjectMatter.getId());
                            execDate.setExecDate(execDatei);
                            execDate.setGenFlag("0");
                            if (DateUtil.isIn(execDatei,contract.getEffectiveDate(),contract.getExpirationDate())) {
                                contractExecDateMapper.insert(execDate);
                            }
                        }
                    }
                });
            }
        } else {
@@ -972,6 +1034,8 @@
        map.put("court",contract.getCourt());
        map.put("contractAttchment",contract.getContractAttchment());
        map.put("invoiceNotice",contract.getInvoiceNotice());
        map.put("city",contract.getCity());
        map.put("region",contract.getRegion());
        //标的物
        List<Map<String, Object>> items = new ArrayList<>();
@@ -1073,4 +1137,35 @@
            e.printStackTrace();
        }
    }
    @Override
    public R delayOutApproval(DelayOutApprovalDTO dto) {
        Contract contract = baseMapper.selectById(dto.getContractId());
        ContractDelayOut delayOut = BeanUtil.copyProperties(dto,ContractDelayOut.class);
        delayOut.setApplyTime(new Date());
        delayOut.setApplyName(SecurityUtils.getUser().getUsername());
        delayOut.setDelayStatus("0");
        Map<String,Object> map = new HashMap<>();
        map.put("contractId",contract.getId());
        map.put("contractName",contract.getContractName());
        map.put("delayDay",dto.getDelayDay());
        map.put("applyName",SecurityUtils.getUser().getUsername());
        map.put("applyTime",DateUtil.format(delayOut.getApplyTime(),DatePattern.NORM_DATETIME_FORMAT));
        //启动流程
        ProcessInstanceParamDto paramDto = new ProcessInstanceParamDto();
        paramDto.setParamMap(map);
        paramDto.setFlowName(FlowNameEnum.延期出货审批.name());
        R r1 = remoteFlowProcessService.startProcessInstance(paramDto);
        if (r1.getCode() == 1) {
            return R.failed("流程启动失败");
        }
        contractDelayOutMapper.insert(delayOut);
        return R.ok();
    }
    @Override
    public Page pageScope(Page page, ContracQueryDTO queryDTO) {
        return baseMapper.pageScope(page,queryDTO, DataScope.of("comp_id"));
    }
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/OutBoundServiceImpl.java
@@ -53,6 +53,7 @@
                .in(ContractSubjectMatter::getMaterialCode, addDTO.getSubjectMatterList().stream().map(item -> item.getSubjectMatterCode()).collect(Collectors.toList()))
                .exists(Contract.class, contractQuery ->
                        contractQuery.select(ContractSubjectMatter::getId)
                                .eq(Contract::getContractStatus,2)
                                .eq(Contract::getId, ContractSubjectMatter::getContractId)
                                .eq(StrUtil.isNotBlank(addDTO.getBusGuestName()), Contract::getPartyA, addDTO.getBusGuestName())
                                .eq(ObjUtil.isNotNull(addDTO.getBusGuestId()), Contract::getPartyAId, addDTO.getBusGuestId())
@@ -93,7 +94,7 @@
                    if (subjectMatter.getDeliveredQuantity().compareTo(new BigDecimal("0")) > 0) {
                        remainNum = remainNum.subtract(subjectMatter.getRemainingQuantity());
                        //部分交付状态下 全部出库
                        if (remainNum.compareTo(new BigDecimal("0")) >= 0) {
                        if (remainNum.compareTo(new BigDecimal("0")) > 0) {
                            BigDecimal currentOut = subjectMatter.getRemainingQuantity();
                            subjectMatter.setDeliveredQuantity(subjectMatter.getQuantity());
                            subjectMatter.setRemainingQuantity(new BigDecimal("0"));
@@ -121,7 +122,7 @@
                    } else {
                        //未交付状态下
                        remainNum = remainNum.subtract(subjectMatter.getQuantity());
                        if (remainNum.compareTo(new BigDecimal("0")) >= 0) {
                        if (remainNum.compareTo(new BigDecimal("0")) > 0) {
                            subjectMatter.setDeliveredQuantity(subjectMatter.getQuantity());
                            subjectMatter.setRemainingQuantity(new BigDecimal("0"));
                            subjectMatter.setActualDeliveryDate(DateUtil.today());
@@ -385,6 +386,7 @@
        contractOutBound.setOutBoundAttPaths(addDTO.getOutBoundAttPaths());
        contractOutBound.setOutBoundId(outBoundId);
        contractOutBound.setInvoiceStatus("0");
        contractOutBound.setInvoiceNum(new BigDecimal("0"));
        contractOutBoundMapper.insert(contractOutBound);
        if (StrUtil.isEmpty(contract.getContractCategory())){
            if (DateUtil.compare(addDTO.getOutBoundTime(),contract.getExpirationDate())>0){
platformx-business-finance-biz/src/main/resources/mapper/ContractDelayOutMapper.xml
New file
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.by4cloud.platformx.business.mapper.ContractDelayOutMapper">
    <resultMap id="contractOutBoundMap" type="com.by4cloud.platformx.business.entity.ContractDelayOut">
        <id property="id" column="id"/>
        <result property="compId" column="comp_id"/>
        <result property="contractId" column="contract_id"/>
        <result property="delayDay" column="contract_name"/>
        <result property="delayAttNames" column="delay_att_names"/>
        <result property="delayAttPaths" column="delay_att_paths"/>
        <result property="applyName" column="apply_name"/>
        <result property="applyTime" column="apply_time"/>
        <result property="delayStatus" column="delay_status"/>
        <result property="createBy" column="create_by"/>
        <result property="createTime" column="create_time"/>
        <result property="updateBy" column="update_by"/>
        <result property="updateTime" column="update_time"/>
        <result property="delFlag" column="del_flag"/>
    </resultMap>
</mapper>
platformx-business-finance-biz/src/main/resources/mapper/ContractMapper.xml
@@ -1008,4 +1008,83 @@
        b.sales_model
    </select>
    <select id="pageScope" resultType="com.by4cloud.platformx.business.vo.ContractPageVo">
        SELECT
            id,
            contract_no,
            contract_name,
            party_a_id,
            party_a,
            party_b_id,
            party_b,
            amount,
            currency,
            contract_type,
            supply_attribute,
            contract_status,
            contract_attribute,
            sign_date,
            sign_place,
            effective_date,
            delivery_cycle,
            expiration_date,
            attachment_url,
            remark,
            parent_id,
            approve_time,
            arrival_schedule_id,
            accept_schedule_id,
            erp_push_flag,
            billing_status,
            billing_amout,
            next_schedule_name,
            template_id,
            sales_model,
            paid_amount,
            contract_category,
            exec_frequency,
            exec_times,
            exec_day,
            environment,
            standard,
            use_month,
            after_ship_month,
            ship_method,
            ship_address,
            packaging,
            repair_period,
            repair_breach_amount,
            goods_short,
            goods_short_breach_amount,
            overdue_breach_amount,
            terminate_contract,
            court,
            contract_attchment,
            city,
            region,
            invoice_notice,
            contract_tax,
            create_by,
            update_by,
            create_time,
            update_time,
            del_flag,
            comp_id,
            (select sum(delivered_quantity*unit_price) from contract_subject_matter csm where csm.contract_id = c.id) outAmount
            FROM
        contract c
        WHERE
            del_flag = '0'
        <if test="queryDTO.contractName !=null and queryDTO.contractName !=''">
            AND contract_name LIKE CONCAT('%', #{queryDTO.contractName}, '%')
        </if>
        <if test="queryDTO.partyA !=null and queryDTO.partyA !=''">
            AND party_a LIKE CONCAT('%', #{queryDTO.partyA}, '%')
        </if>
        <if test="queryDTO.contractStatus !=null and queryDTO.contractStatus !=''">
            AND contract_status =  #{queryDTO.contractStatus}
        </if>
        ORDER BY
            create_time DESC
    </select>
</mapper>