feat:标的物变更 合同审核流程改为推送合同中心通过后上传盖章签字件 履约进度新增合同补录按钮
11个文件已修改
6个文件已添加
841 ■■■■■ 已修改文件
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/ContractAddDTO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/ContractFinallyDTO.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/ContractSubjectChangeAttDTO.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/ContractSubjectMatterAddDTO.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/SyncContractStatusDTO.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/Contract.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ContractApproval.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractPageVo.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractController.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/ContractApprovalMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ContractService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/BankStatementServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractServiceImpl.java 550 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ProductServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/resources/mapper/ContractApprovalMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/resources/mapper/ContractMapper.xml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/resources/mapper/ContractSubjectMatterChangeMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/ContractAddDTO.java
@@ -254,6 +254,12 @@
    @Schema(description = "简易合同附件名称")
    private String attachmentSimpleName;
    @Schema(description = "付款金额")
    private BigDecimal paidAmount;
    @Schema(description = "开票金额")
    private BigDecimal billingAmout;
    private List<ContractPaymentScheduleAddDTO> contractPaymentSchedule;
    private List<ContractSubjectMatterAddDTO> contractSubjectMatter;
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/ContractFinallyDTO.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 ContractFinallyDTO {
    private String id;
    @Schema(description = "合同签字盖章附件URL")
    private String lastAttachmentUrl;
    @Schema(description = "合同签字盖章名称")
    private String lastAttachmentName;
}
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/ContractSubjectChangeAttDTO.java
New file
@@ -0,0 +1,15 @@
package com.by4cloud.platformx.business.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class ContractSubjectChangeAttDTO {
    private String id;
    private String attachmentUrl;
    private String attachmentName;
}
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/ContractSubjectMatterAddDTO.java
@@ -2,6 +2,7 @@
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;
@@ -58,6 +59,9 @@
    @Schema(description = "计划交付日期")
    private Date plannedDeliveryDate;
    @Schema(description = "已交付数量")
    private BigDecimal deliveredQuantity;
    @Schema(description = "备注")
    private String remarks;
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/SyncContractStatusDTO.java
New file
@@ -0,0 +1,18 @@
package com.by4cloud.platformx.business.dto;
import lombok.Data;
@Data
public class SyncContractStatusDTO {
    private String contractNumber;
    private String status;
    private String returnReason;
    private String returnPerson;
    private String returnDateTime;
}
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/Contract.java
@@ -120,6 +120,14 @@
    @Column(columnDefinition = "VARCHAR(100) comment '合同附件名称'")
    private String attachmentName;
    @Schema(description = "合同附件URL")
    @Column(columnDefinition = "VARCHAR(500) comment '合同附件URL'")
    private String lastAttachmentUrl;
    @Schema(description = "合同附件名称")
    @Column(columnDefinition = "VARCHAR(100) comment '合同附件名称'")
    private String lastAttachmentName;
    @Schema(description = "人员编号")
    @Column(columnDefinition = "VARCHAR(100) comment '人员编号'")
    private String nickName;
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ContractApproval.java
New file
@@ -0,0 +1,44 @@
package com.by4cloud.platformx.business.entity;
import com.by4cloud.platformx.common.data.mybatis.BaseModel;
import com.fasterxml.jackson.annotation.JsonFormat;
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.math.BigDecimal;
import java.util.Date;
/**
 * 2026年4月29日 10:46:07
 * syt
 */
@Data
@Entity//加了才能自动生成表
@Table(appliesTo="contract_approval",comment = "合同审核结果记录")//给表加注释
@jakarta.persistence.Table(name = "contract_approval")//数据库创建的表明
public class ContractApproval extends BaseModel<ContractApproval> {
    @Schema(description = "关联合同ID")
    @Column(columnDefinition = "bigint not null comment '关联合同ID'")
    private Long contractId;
    @Schema(description = "审批意见")
    @Column(columnDefinition = "VARCHAR(64) comment '审批意见'")
    private String returnPerson;
    @Schema(description = "审批人")
    @Column(columnDefinition="VARCHAR(64) comment '审批人'")
    private String returnReason;
    @Schema(description = "审批时间")
    @Column(columnDefinition="datetime comment '审批时间'")
    private Date returnDateTime;
    @Schema(description = "审批结果")
    @Column(columnDefinition = "tinyint(1) comment '1审批通过   2驳回 3废弃'")
    private Integer status;
}
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractPageVo.java
@@ -72,6 +72,12 @@
    @Schema(description = "合同附件URL")
    private String attachmentUrl;
    @Schema(description = "合同附件Name")
    private String attachmentName;
    @Schema(description = "合同附件URL")
    private String lastAttachmentUrl;
    @Schema(description = "备注")
    private String remark;
@@ -191,4 +197,9 @@
    private String beforeChange;
    private String afterChange;
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Schema(description = "变更时间")
    private Date changeTime;
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractController.java
@@ -313,6 +313,17 @@
     * 新增合同-石工泵
     * @return R
     */
    @Operation(summary = "新增历史合同-石工泵" , description = "新增历史合同-石工泵" )
    @PostMapping("/addContractSgbHis")
    @SysLog("新增历史合同-石工泵" )
    public R addContractSgbHis(@RequestBody ContractAddDTO addDTO) {
        return contractService.addContractSgbHis(addDTO);
    }
    /**
     * 新增合同-石工泵
     * @return R
     */
    @Operation(summary = "新增合同-石工泵" , description = "新增合同-石工泵" )
    @PostMapping("/addContractSgb")
    @SysLog("新增合同-石工泵" )
@@ -386,7 +397,7 @@
    /**
     * 合同标的物变更分页
     * @param changeDTO 合同管理
     * @param queryDTO 合同管理
     * @return R
     */
    @Operation(summary = "合同标的物变更分页" , description = "合同标的物变更分页" )
@@ -395,4 +406,45 @@
    public R subjectChangePage(@ParameterObject Page page, @ParameterObject ContracQueryDTO queryDTO) {
        return R.ok(contractService.subjectChangePage(page,queryDTO));
    }
    /**
     * 合同标的物变更附件
     * @param attDTO 合同管理
     * @return R
     */
    @Operation(summary = "合同标的物变更附件" , description = "合同标的物变更附件" )
    @SysLog("合同标的物变更附件" )
    @PostMapping("/subjectChangeAtt")
    public R subjectChangeAtt(@RequestBody ContractSubjectChangeAttDTO attDTO) {
        return contractService.subjectChangeAtt(attDTO);
    }
    /**
     * 合同标的物变更附件
     * @param dto 合同管理
     * @return R
     */
    @Inner(value = false)
    @SysLog("合同审批结果同步" )
    @PostMapping("/syncContractStatus")
    public R syncContractStatus(@RequestBody SyncContractStatusDTO dto) {
        return contractService.syncContractStatus(dto);
    }
    @PostMapping("/finallyPdf")
    public R finallyPdf(@RequestBody ContractFinallyDTO attDTO) {
        return contractService.finallyPdf(attDTO);
    }
    /**
     * 新增合同-石工泵
     * @return R
     */
    @Operation(summary = "新增历史合同" , description = "新增历史合同" )
    @PostMapping("/addContractHis")
    @SysLog("新增历史合同" )
    public R addContractHis(@RequestBody ContractAddDTO addDTO) {
        return contractService.addContractHis(addDTO);
    }
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/ContractApprovalMapper.java
New file
@@ -0,0 +1,11 @@
package com.by4cloud.platformx.business.mapper;
import com.by4cloud.platformx.common.data.datascope.PlatformxBaseMapper;
import com.by4cloud.platformx.business.entity.ContractApproval;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ContractApprovalMapper extends PlatformxBaseMapper<ContractApproval> {
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ContractService.java
@@ -75,4 +75,14 @@
    R subjectChange(ContractSubjectChangeDTO changeDTO);
    Page subjectChangePage(Page page, ContracQueryDTO queryDTO);
    R subjectChangeAtt(ContractSubjectChangeAttDTO attDTO);
    R syncContractStatus(SyncContractStatusDTO dto);
    R finallyPdf(ContractFinallyDTO attDTO);
    R addContractSgbHis(ContractAddDTO addDTO);
    R addContractHis(ContractAddDTO addDTO);
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/BankStatementServiceImpl.java
@@ -22,6 +22,7 @@
import com.by4cloud.platformx.business.mapper.*;
import com.by4cloud.platformx.business.service.BankStatementService;
import com.by4cloud.platformx.business.service.PaymentConfirmService;
import com.by4cloud.platformx.business.vo.CustInfoVo;
import com.by4cloud.platformx.business.vo.ReceiveBipVo;
import com.by4cloud.platformx.business.vo.ReceiveItemVo;
import com.by4cloud.platformx.business.vo.StatementContractVo;
@@ -120,16 +121,7 @@
            pushCollectionSgb(statement, updateDTO.getContractCollectionList());
        }
//        //判断是否内部单位
//        CustInfoVo custInfoVo = bipViewMapper.selectBaseInfoByCustName(statement.getPayBankAccName());
//        if (ObjUtil.isNull(custInfoVo)){
//            return R.ok();
//        }
//        //bip推送
//        if (bipFlag&&custInfoVo.getCustCode().equals("01")) {
//            return pushSaveCollection(statement, updateDTO.getContractCollectionList());
//        }
//        log.info("内部往来收款单,客户名称:{},客户类型:{},不用保存收款单",custInfoVo.getCustName(),custInfoVo.getCustclass());
        return R.ok();
    }
@@ -140,8 +132,7 @@
//        HttpResponse resp = HttpUtil.createPost(sgbErp + "/apilink/arclose/create?corpsecret=12345678&appserver=appserver1&accountid=888&tradeid="
//                + IdUtil.fastUUID())
//                .header("Content-Type","application/x-www-form-urlencoded")
//                .body(URLEncodeUtil.encode(request.toJSONString(), StandardCharsets.UTF_8))
//                .form("",request.toJSONString())
//                .timeout(30000)
//                // 指定编码格式
//                .charset(StandardCharsets.UTF_8)
@@ -660,6 +651,14 @@
        item.setBipParam(updateDTO.getBipParam());
        bankStatementItemMapper.updateById(item);
        BankStatement statement = baseMapper.selectById(item.getStatetId());
        //判断是否内部单位
        CustInfoVo custInfoVo = bipViewMapper.selectBaseInfoByCustName(statement.getPayBankAccName());
        if (ObjUtil.isNotNull(custInfoVo) && custInfoVo.getCustCode().equals("01")) {
            log.info("内部往来收款单,客户名称:{},客户类型:{},不用保存收款单", custInfoVo.getCustName(), custInfoVo.getCustclass());
            return R.failed("内部往来收款单,不用推送BIP");
        }
        return pushSaveCollection(statement, item);
    }
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractServiceImpl.java
@@ -93,6 +93,7 @@
    private final RemoteDictService remoteDictService;
    private final ContractPaymentScheduleProcessService processService;
    private final ContractSubjectMatterChangeMapper changeMapper;
    private final ContractApprovalMapper contractApprovalMapper;
    @Value("${erp.ymj}")
    private String ymjErp;
@@ -129,6 +130,21 @@
    @Value("${dept.ymj}")
    private String ymj;
    @Value("${tmp.smj}")
    private String tempSMJ;
    @Value("${tmp.sgb}")
    private String tempSGB;
    @Value("${tmp.jxc}")
    private String tempJXC;
    @Value("${tmp.tfgs}")
    private String tempTFGS;
    @Value("${tmp.ymj}")
    private String tempYMJ;
    @Override
    public R add(ContractAddDTO addDTO) {
@@ -470,22 +486,83 @@
    @Override
    public R startApproval(Long id) {
        Contract contract = baseMapper.selectById(id);
        //简易合同无法继续后续操作
        if (StrUtil.equals(contract.getContractCategory(), "simple")) {
            return R.failed("请补充标的物和收款阶段后再进行操作!");
        }
        //启动流程
        ProcessInstanceParamDto dto = new ProcessInstanceParamDto();
        Map<String, Object> map = BeanUtil.beanToMap(contract);
        dto.setParamMap(map);
        dto.setFlowName(FlowNameEnum.合同审批.name());
        R r1 = remoteFlowProcessService.startProcessInstance(dto);
        if (r1.getCode() == 1) {
            return R.failed("流程启动失败");
        List<ContractSubjectMatter> subjectMatterList = contractSubjectMatterMapper.selectList(Wrappers.<ContractSubjectMatter>lambdaQuery().
                eq(ContractSubjectMatter::getContractId,contract.getId()));
        //合同中心审核
        JSONObject requestApply = new JSONObject();
        requestApply.put("fd_selectionmethod", "公开招标");
        requestApply.put("fd_isrelated", "是");
        requestApply.put("fd_bizId", contract.getId());
        requestApply.put("fd_remark", contract.getRemark());
        requestApply.put("fd_MainContent", "");
        requestApply.put("fd_settlementType", "00");
        requestApply.put("fd_applyType", "外销");
        if (CollUtil.isNotEmpty(subjectMatterList)) {
            requestApply.put("fd_contractsubject ", subjectMatterList.stream().map(item -> item.getMaterialName()).collect(Collectors.joining(",")));
        }
        requestApply.put("fd_docNumber", contract.getContractNo());
//        requestApply.put("fd_templateId", "19e39bb6c1edadbdb162c434274a8a18");
        if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", smj) || StrUtil.equals(SecurityUtils.getUser().getCompId() + "", smjsc) ||
                StrUtil.equals(SecurityUtils.getUser().getCompId() + "", smjzt)) {
            requestApply.put("fd_templateId", tempSMJ);
        }
        if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", sgb)) {
            requestApply.put("fd_templateId", tempSGB);
        }
        if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", ymj)) {
            requestApply.put("fd_templateId", tempYMJ);
        }
        if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", tfgs)) {
            requestApply.put("fd_templateId", tempTFGS);
        }
        if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", jxc)) {
            requestApply.put("fd_templateId", tempJXC);
        }
        requestApply.put("fd_name", contract.getContractName());
        requestApply.put("fd_signDate", DateUtil.formatDate(contract.getSignDate()));
        requestApply.put("fd_endDate", DateUtil.formatDate(contract.getExpirationDate()));
        requestApply.put("fd_contractCreater", contract.getNickName());
        requestApply.put("fd_currency", "人民币");
        requestApply.put("fd_ContractAmount", contract.getAmount());
        requestApply.put("fd_finAmount", contract.getAmount().divide(new BigDecimal("113"), 2, RoundingMode.HALF_UP)
                .multiply(new BigDecimal("87")));
        requestApply.put("fd_docStatus", "20");
        requestApply.put("fd_taxRates", 13);
        requestApply.put("fd_customerName", contract.getPartyA());
        requestApply.put("fd_systemSource", "非煤销售系统");
        requestApply.put("fd_type", "00");
        log.info("合同中心合同起草接口入参:{}", requestApply.toJSONString());
        String respApply = HttpUtil.post("https://oa.res.jzeg.cn/ekp/api/km-agreement/kmAgreementWebService/addSupplyContractApply", requestApply.toJSONString());
        log.info("合同中心合同起草接口回参:{}", respApply);
        JSONObject applyResp = JSONObject.parseObject(respApply);
        if (!applyResp.getString("code").equals("00")){
            return R.failed("合同中心推送审核失败,原因为:{}",applyResp.getString("msg"));
        }
        //启动流程-系统自带审批流
//        ProcessInstanceParamDto dto = new ProcessInstanceParamDto();
//        Map<String, Object> map = BeanUtil.beanToMap(contract);
//        dto.setParamMap(map);
//        dto.setFlowName(FlowNameEnum.合同审批.name());
//        R r1 = remoteFlowProcessService.startProcessInstance(dto);
//        if (r1.getCode() == 1) {
//            return R.failed("流程启动失败");
//        }
        //工业泵不用审核 直接通过
        if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", sgb)) {
            contract.setContractStatus(2);
            baseMapper.updateById(contract);
            return R.ok();
        }
        contract.setContractStatus(1);
        baseMapper.updateById(contract);
        return R.ok();
@@ -509,7 +586,7 @@
        pushSubCompany(contract,subjectMatterList);
        //合同中心推送
        pusnContractCenter(contract,subjectMatterList);
//        pusnContractCenter(contract,subjectMatterList);
        contract.setNextScheduleName("发货前");
        baseMapper.updateById(contract);
@@ -1631,6 +1708,7 @@
        contract.setPaidAmount(new BigDecimal("0"));
        contract.setBillingStatus("1");
        contract.setErpPushFlag("1");
        contract.setCenterPushFlag("0");
        contract.setBillingAmout(new BigDecimal("0"));
        BusinessCustomer bc = businessCustomerMapper.selectOne(Wrappers.<BusinessCustomer>lambdaQuery().eq(BusinessCustomer::getErpCompanyCode,
@@ -1730,7 +1808,8 @@
        }
        //推送合同中心
        pushCenter(contract.getId());
        return R.ok(contract.getContractNo());
    }
@@ -2277,7 +2356,23 @@
        requestApply.put("fd_applyType", "外销");
        requestApply.put("fd_contractsubject ", subjectMatterList.stream().map(item -> item.getMaterialName()).collect(Collectors.joining(",")));
        requestApply.put("fd_docNumber", contract.getContractNo());
        requestApply.put("fd_templateId", "19e39bb6c1edadbdb162c434274a8a18");
        if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", smj) || StrUtil.equals(SecurityUtils.getUser().getCompId() + "", smjsc) ||
                StrUtil.equals(SecurityUtils.getUser().getCompId() + "", smjzt)) {
            requestApply.put("fd_templateId", tempSMJ);
        }
        if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", sgb)) {
            requestApply.put("fd_templateId", tempSGB);
        }
        if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", ymj)) {
            requestApply.put("fd_templateId", tempYMJ);
        }
        if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", tfgs)) {
            requestApply.put("fd_templateId", tempTFGS);
        }
        if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", jxc)) {
            requestApply.put("fd_templateId", tempJXC);
        }
        requestApply.put("fd_name", contract.getContractName());
        requestApply.put("fd_signDate", DateUtil.formatDate(contract.getSignDate()));
        requestApply.put("fd_endDate", DateUtil.formatDate(contract.getExpirationDate()));
@@ -2292,36 +2387,15 @@
        requestApply.put("fd_systemSource", "非煤销售系统");
        requestApply.put("fd_type", "00");
        log.info("合同中心合同起草接口入参:{}", requestApply.toJSONString());
        String respApply = HttpUtil.post("https://oatest.res.jzeg.cn/ekp/api/km-agreement/kmAgreementWebService/addSupplyContractApply", requestApply.toJSONString());
        String respApply = HttpUtil.post("https://oa.res.jzeg.cn/ekp/api/km-agreement/kmAgreementWebService/addSupplyContractApply", requestApply.toJSONString());
        log.info("合同中心合同起草接口回参:{}", respApply);
        JSONObject applyResp = JSONObject.parseObject(respApply);
        if (applyResp.getString("code").equals("00")) {
            JSONObject request = new JSONObject();
            request.put("fd_docNumber", contract.getContractNo());
            request.put("fd_singer", contract.getNickName());
            request.put("fd_signTime", DateUtil.formatDate(contract.getSignDate()));
            request.put("fd_linkPerson", "");
            request.put("fd_linkPhone", "");
            request.put("fd_address", contract.getSignPlace());
            request.put("fd_receivedTime", DateUtil.format(contract.getCreateTime(), DatePattern.NORM_DATETIME_PATTERN));
            request.put("fd_receivedNum", 1);
            request.put("fd_effedate", DateUtil.formatDate(contract.getSignDate()));
            request.put("fd_enddate", DateUtil.formatDate(contract.getExpirationDate()));
            request.put("fd_reviewerNo", contract.getNickName());
            request.put("fd_docStatus", "20");
            request.put("fd_templateId", "19e39bb6c1edadbdb162c434274a8a18");
            request.put("fd_attName", contract.getAttachmentName());
            request.put("fd_attcontent", NetworkFileToBase64.convertNetworkFileToBase64("https://zbjt.res.jzeg.cn/api" + contract.getAttachmentUrl()));
            log.info("合同中心同步合同接口入参:{}", request.toJSONString());
            String resp = HttpUtil.post("https://oatest.res.jzeg.cn/ekp/api/km-agreement/kmAgreementWebService/addContractReview", request.toJSONString());
            log.info("合同中心同步合同接口回参:{}", resp);
            JSONObject respJson = JSONObject.parseObject(resp);
            if (respJson.getString("code").equals("00")) {
                contract.setCenterPushFlag("1");
                baseMapper.updateById(contract);
            }
        }
        return R.ok();
        }
        return R.failed("推送合同中心审核失败,原因为:{}",applyResp.getString("msg"));
    }
    @Override
@@ -2462,6 +2536,10 @@
                        contract.getPaidAmount() : new BigDecimal("0"));
                contract.setBillingAmout(ObjUtil.isNotNull(contract.getBillingAmout()) ?
                        contract.getBillingAmout() : new BigDecimal("0"));
                if (contract.getPaidAmount().compareTo(contract.getAmount())==0&&contract.getBillingAmout().compareTo(contract.getAmount())==0){
                    contract.setContractStatus(3);
                }
                contract.setBillingStatus("1");
                baseMapper.insert(contract);
                BigDecimal remainAmount = ObjUtil.isNotNull(contract.getPaidAmount()) ? contract.getPaidAmount() : new BigDecimal("0");
@@ -2480,25 +2558,25 @@
                                : subjectMatter.getRemainingQuantity().compareTo(new BigDecimal("0")) > 0 ? 1 : 2);
                        subjectMatter.setLineNo(ItemGeneratorUtil.nextId());
                        contractSubjectMatterMapper.insert(subjectMatter);
                        if (subjectMatter.getDeliveredQuantity().compareTo(new BigDecimal("0")) > 0) {
                            //出库单
                            ContractOutBound outBound = new ContractOutBound();
                            outBound.setBusGuestId(contract.getPartyAId());
                            outBound.setBusGuestName(contract.getPartyA());
                            outBound.setContractId(contract.getId());
                            outBound.setContractName(contract.getContractName());
                            outBound.setInvoiceNum(new BigDecimal("0"));
                            outBound.setInvoiceStatus("0");
                            outBound.setOutBoundTime(new Date());
                            outBound.setOutBoundNum(subjectMatter.getDeliveredQuantity());
                            outBound.setSubjectMatterName(subjectMatter.getMaterialInternalName());
                            outBound.setSubjectMatterCode(subjectMatter.getMaterialCode());
                            contractOutBoundMapper.insert(outBound);
                            if (contract.getBillingAmout().compareTo(new BigDecimal("0")) == 0) {
                                contract.setBillingStatus("2");
                                baseMapper.updateById(contract);
                            }
                        }
//                        if (subjectMatter.getDeliveredQuantity().compareTo(new BigDecimal("0")) > 0) {
//                            //出库单
//                            ContractOutBound outBound = new ContractOutBound();
//                            outBound.setBusGuestId(contract.getPartyAId());
//                            outBound.setBusGuestName(contract.getPartyA());
//                            outBound.setContractId(contract.getId());
//                            outBound.setContractName(contract.getContractName());
//                            outBound.setInvoiceNum(new BigDecimal("0"));
//                            outBound.setInvoiceStatus("0");
//                            outBound.setOutBoundTime(new Date());
//                            outBound.setOutBoundNum(subjectMatter.getDeliveredQuantity());
//                            outBound.setSubjectMatterName(subjectMatter.getMaterialInternalName());
//                            outBound.setSubjectMatterCode(subjectMatter.getMaterialCode());
//                            contractOutBoundMapper.insert(outBound);
//                            if (contract.getBillingAmout().compareTo(new BigDecimal("0")) == 0) {
//                                contract.setBillingStatus("2");
//                                baseMapper.updateById(contract);
//                            }
//                        }
                    }
                }
@@ -2513,7 +2591,7 @@
                        schedule.setPaymentRatio(StrUtil.isBlank(resultSchedule.get(j).getPaymentRatio())
                                ? new BigDecimal("0") : new BigDecimal(resultSchedule.get(j).getPaymentRatio()));
                        schedule.setAgreedDays(StrUtil.isBlank(resultSchedule.get(j).getAgreedDays())
                                ? 0 : Integer.valueOf(resultSchedule.get(j).getPaymentRatio()));
                                ? 0 : Integer.valueOf(resultSchedule.get(j).getAgreedDays()));
                        schedule.setPlannedAmount(contract.getAmount().multiply(schedule.getPaymentRatio())
                                .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP));
                        schedule.setPaymentStatus(0);
@@ -2530,24 +2608,24 @@
                            }
                        }
                        contractPaymentScheduleMapper.insert(schedule);
                        if (schedule.getStageName().equals("质保金") && contract.getAmount().subtract(ObjUtil.isNotNull(contract.getPaidAmount()) ?
                                contract.getPaidAmount() : new BigDecimal("0")).compareTo(new BigDecimal("0")) > 0) {
                            PaymentConfirm confirm = new PaymentConfirm();
                            confirm.setBusGuestId(contract.getPartyAId());
                            confirm.setBusGuestName(contract.getPartyA());
                            confirm.setBusinessType("质保金应收");
                            confirm.setConfirmTime(new Date());
                            confirm.setContractId(contract.getId());
                            confirm.setContractName(contract.getContractName());
                            confirm.setContractNo(contract.getContractNo());
                            confirm.setScheduleId(schedule.getId());
                            confirm.setScheduleName(schedule.getStageName());
                            confirm.setTransationAmount(contract.getAmount().subtract(ObjUtil.isNotNull(contract.getPaidAmount()) ?
                                    contract.getPaidAmount() : new BigDecimal("0")));
                            confirm.setReceivableAmount(confirm.getTransationAmount());
                            confirm.setTotalAmount(confirm.getTransationAmount().multiply(new BigDecimal("-1")));
                            paymentConfirmMapper.insert(confirm);
                        }
//                        if (schedule.getStageName().equals("质保金") && contract.getAmount().subtract(ObjUtil.isNotNull(contract.getPaidAmount()) ?
//                                contract.getPaidAmount() : new BigDecimal("0")).compareTo(new BigDecimal("0")) > 0) {
//                            PaymentConfirm confirm = new PaymentConfirm();
//                            confirm.setBusGuestId(contract.getPartyAId());
//                            confirm.setBusGuestName(contract.getPartyA());
//                            confirm.setBusinessType("质保金应收");
//                            confirm.setConfirmTime(new Date());
//                            confirm.setContractId(contract.getId());
//                            confirm.setContractName(contract.getContractName());
//                            confirm.setContractNo(contract.getContractNo());
//                            confirm.setScheduleId(schedule.getId());
//                            confirm.setScheduleName(schedule.getStageName());
//                            confirm.setTransationAmount(contract.getAmount().subtract(ObjUtil.isNotNull(contract.getPaidAmount()) ?
//                                    contract.getPaidAmount() : new BigDecimal("0")));
//                            confirm.setReceivableAmount(confirm.getTransationAmount());
//                            confirm.setTotalAmount(confirm.getTransationAmount().multiply(new BigDecimal("-1")));
//                            paymentConfirmMapper.insert(confirm);
//                        }
                    }
                }
            }
@@ -2604,4 +2682,328 @@
    public Page subjectChangePage(Page page, ContracQueryDTO queryDTO) {
        return changeMapper.subjectChangePage(page,queryDTO,DataScope.of("comp_id"));
    }
    @Override
    public R subjectChangeAtt(ContractSubjectChangeAttDTO attDTO) {
        ContractSubjectMatterChange change = changeMapper.selectById(attDTO.getId());
        change.setAttachmentName(attDTO.getAttachmentName());
        change.setAttachmentUrl(attDTO.getAttachmentUrl());
        changeMapper.updateById(change);
        return R.ok();
    }
    @Override
    public R syncContractStatus(SyncContractStatusDTO dto) {
        if (StrUtil.isBlank(dto.getContractNumber())){
            return R.failed("合同编号不能为空");
        }
        if (StrUtil.isBlank(dto.getStatus())){
            return R.failed("审批状态不能为空");
        }
        if (StrUtil.isBlank(dto.getReturnPerson())){
            return R.failed("审批人不能为空");
        }
        if (StrUtil.isBlank(dto.getReturnDateTime())){
            return R.failed("审批时间不能为空");
        }
        Contract contract = baseMapper.selectOne(Wrappers.<Contract>lambdaQuery().eq(Contract::getContractNo,dto.getContractNumber()).last("limit 1"));
        if(ObjUtil.isNull(contract)){
            return R.failed("合同编号不异常");
        }
        if (StrUtil.equals(dto.getStatus(),"1")){
            takeEffect(contract.getId());
        }
        if (!StrUtil.equals(dto.getStatus(),"1")){
            refuseApproval(contract.getId());
        }
        saveContractApproval(contract,dto);
        return R.ok();
    }
    private void saveContractApproval(Contract contract, SyncContractStatusDTO dto) {
        ContractApproval approval = BeanUtil.copyProperties(dto,ContractApproval.class);
        approval.setContractId(contract.getId());
        approval.setReturnDateTime(DateUtil.parseDateTime(dto.getReturnDateTime()));
        approval.setCompId(contract.getCompId());
        contractApprovalMapper.insert(approval);
    }
    @Override
    public R finallyPdf(ContractFinallyDTO attDTO) {
        Contract contract = baseMapper.selectById(attDTO.getId());
        if (ObjUtil.isNull(contract)){
            return R.failed("合同异常");
        }
        if (!StrUtil.equals(contract.getContractStatus()+"","2")){
            return R.failed("合同异常状态");
        }
        JSONObject request = new JSONObject();
        request.put("fd_docNumber", contract.getContractNo());
        request.put("fd_singer", contract.getNickName());
        request.put("fd_signTime", DateUtil.formatDate(contract.getSignDate()));
        request.put("fd_linkPerson", "");
        request.put("fd_linkPhone", "");
        request.put("fd_address", contract.getSignPlace());
        request.put("fd_receivedTime", DateUtil.format(contract.getCreateTime(), DatePattern.NORM_DATETIME_PATTERN));
        request.put("fd_receivedNum", 1);
        request.put("fd_effedate", DateUtil.formatDate(contract.getSignDate()));
        request.put("fd_enddate", DateUtil.formatDate(contract.getExpirationDate()));
        request.put("fd_reviewerNo", contract.getNickName());
        request.put("fd_docStatus", "20");
        if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", smj) || StrUtil.equals(SecurityUtils.getUser().getCompId() + "", smjsc) ||
                StrUtil.equals(SecurityUtils.getUser().getCompId() + "", smjzt)) {
            request.put("fd_templateId", tempSMJ);
        }
        if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", sgb)) {
            request.put("fd_templateId", tempSGB);
        }
        if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", ymj)) {
            request.put("fd_templateId", tempYMJ);
        }
        if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", tfgs)) {
            request.put("fd_templateId", tempTFGS);
        }
        if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", jxc)) {
            request.put("fd_templateId", tempJXC);
        }
        request.put("fd_attName", attDTO.getLastAttachmentName());
        request.put("fd_attcontent", NetworkFileToBase64.convertNetworkFileToBase64("https://zbjt.res.jzeg.cn/api" + attDTO.getLastAttachmentUrl()));
        log.info("合同中心同步合同接口入参:{}", request.toJSONString());
        String resp = HttpUtil.post("https://oa.res.jzeg.cn/ekp/api/km-agreement/kmAgreementWebService/addContractReview", request.toJSONString());
        log.info("合同中心同步合同接口回参:{}", resp);
        JSONObject respJson = JSONObject.parseObject(resp);
        if (respJson.getString("code").equals("00")) {
            contract.setLastAttachmentName(attDTO.getLastAttachmentName());
            contract.setLastAttachmentUrl(attDTO.getLastAttachmentUrl());
            baseMapper.updateById(contract);
            return R.ok();
        }
        return R.failed("合同中心最终盖章登记PDF上传失败,原因为:{}",respJson.getString("msg"));
    }
    @Override
    public R addContractSgbHis(ContractAddDTO addDTO) {
        if (CollUtil.isEmpty(addDTO.getContractSubjectMatter())) {
            return R.failed("请添加标的物");
        }
        if (CollUtil.isEmpty(addDTO.getContractPaymentSchedule())) {
            return R.failed("请添加付款阶段或付款阶段缺少");
        }
        if (!isValidPaymentStages(addDTO.getContractPaymentSchedule())) {
            return R.failed("付款阶段信息异常");
        }
        if (addDTO.getContractPaymentSchedule().stream().map(item -> item.getPaymentRatio()).reduce(BigDecimal.ZERO, BigDecimal::add)
                .compareTo(new BigDecimal("100.00")) != 0) {
            return R.failed("付款阶段比例异常");
        }
        Contract contract = BeanUtil.copyProperties(addDTO, Contract.class);
        contract.setErpContractNo(contract.getContractNo());
        contract.setPartyBId(SecurityUtils.getUser().getCompId());
        contract.setPartyB(SecurityUtils.getUser().getCompName());
        contract.setContractStatus(2);
        contract.setPaidAmount(new BigDecimal("0"));
        contract.setBillingStatus("1");
        contract.setErpPushFlag("1");
        contract.setCenterPushFlag("1");
        contract.setBillingAmout(new BigDecimal("0"));
        BusinessCustomer bc = businessCustomerMapper.selectOne(Wrappers.<BusinessCustomer>lambdaQuery().eq(BusinessCustomer::getErpCompanyCode,
                addDTO.getPartyACode()).last("limit 1"));
        if (ObjUtil.isNull(bc)) {
            return R.failed("erp客户编码不存在");
        }
        contract.setPartyAId(bc.getId());
        contract.setPartyA(bc.getCompanyName());
        if (ObjUtil.isNotNull(addDTO.getDeliveryCycle())) {
            contract.setExpirationDate(DateUtil.offsetDay(addDTO.getSignDate(), addDTO.getDeliveryCycle()));
        }
        if (ObjUtil.isNotNull(contract.getSignDate()) && ObjUtil.isNotNull(contract.getExpirationDate())) {
            Long bd = DateUtil.betweenDay(contract.getExpirationDate(), contract.getSignDate(), true);
            contract.setDeliveryCycle(bd.intValue());
        }
        contract.setContractNo(generateGYBContractNo());
        if (!StrUtil.equals(addDTO.getContractCategory(), "water_house")) {
            // 假设 list 是你的 List<ContractSubjectMatterAddDTO>
            Optional<ContractSubjectMatterAddDTO> maxDateObj = addDTO.getContractSubjectMatter().stream()
                    .filter(item -> item.getPlannedDeliveryDate() != null) // 过滤掉日期为空的项,避免 NullPointerException
                    .max(Comparator.comparing(ContractSubjectMatterAddDTO::getPlannedDeliveryDate));
            if (maxDateObj.isPresent()) {
                contract.setExpirationDate(maxDateObj.get().getPlannedDeliveryDate());
            }
        }
        baseMapper.insert(contract);
        if (CollUtil.isNotEmpty(addDTO.getContractSubjectMatter())) {
            addDTO.getContractSubjectMatter().stream().forEach(contractSubjectMatterAddDTO -> {
                ContractSubjectMatter subjectMatter = BeanUtil.copyProperties(contractSubjectMatterAddDTO, ContractSubjectMatter.class);
                subjectMatter.setContractId(contract.getId());
                subjectMatter.setDeliveredQuantity(new BigDecimal("0"));
                subjectMatter.setDeliveryStatus(0);
                subjectMatter.setTotalAmount(contractSubjectMatterAddDTO.getQuantity().multiply(contractSubjectMatterAddDTO.getUnitPrice()));
                contractSubjectMatterMapper.insert(subjectMatter);
                //水电类必须有初次表号
                if (StrUtil.isNotEmpty(contractSubjectMatterAddDTO.getMeterReadCode()) &&
                        ObjUtil.isNotNull(contractSubjectMatterAddDTO.getMeterReadNum())) {
                    MeterReadRecord record = BeanUtil.copyProperties(contractSubjectMatterAddDTO, MeterReadRecord.class, "id");
                    record.setContractId(contract.getId());
                    record.setMatterId(subjectMatter.getId());
                    record.setContractName(contract.getContractName());
                    record.setBusGuestId(contract.getPartyAId());
                    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);
                }
            });
        }
        if (CollUtil.isNotEmpty(addDTO.getContractPaymentSchedule())) {
            AtomicInteger index = new AtomicInteger(1);
            addDTO.getContractPaymentSchedule().stream().forEach(contractPaymentScheduleAddDTO -> {
                int currentIndex = index.getAndIncrement();
                ContractPaymentSchedule schedule = BeanUtil.copyProperties(contractPaymentScheduleAddDTO, ContractPaymentSchedule.class);
                if (contractPaymentScheduleAddDTO.getStageName().equals("合同签订")) {
                    schedule.setEffectiveEndDate(DateUtil.offsetDay(contract.getSignDate(), contractPaymentScheduleAddDTO.getAgreedDays()));
                }
                if (ObjUtil.isNotNull(schedule.getEffectiveDate())) {
                    if (schedule.getEffectiveDate().before(DateUtil.date())) {
                        schedule.setFulfillmentStatus(1);
                    } else {
                        schedule.setFulfillmentStatus(0);
                    }
                }
                if (contractPaymentScheduleAddDTO.getPaymentRatio().compareTo(new BigDecimal("0")) > 0) {
                    schedule.setPaymentStatus(0);
                } else {
                    schedule.setPaymentStatus(3);
                }
                schedule.setContractId(contract.getId());
                schedule.setContractName(contract.getContractName());
                schedule.setPlannedAmount(contract.getAmount().multiply(schedule.getPaymentRatio().divide(new BigDecimal("100"))));
                schedule.setStageOrder(currentIndex);
                contractPaymentScheduleMapper.insert(schedule);
                if (contractPaymentScheduleAddDTO.getStageName().equals("货到签收")) {
                    contract.setArrivalScheduleId(schedule.getId());
                    baseMapper.updateById(contract);
                }
                if (contractPaymentScheduleAddDTO.getStageName().equals("调试完成或验收")) {
                    contract.setAcceptScheduleId(schedule.getId());
                    baseMapper.updateById(contract);
                }
            });
        }
        return R.ok(contract.getContractNo());
    }
    @Override
    public R addContractHis(ContractAddDTO addDTO) {
        Contract contract = BeanUtil.copyProperties(addDTO, Contract.class);
        contract.setPartyBId(SecurityUtils.getUser().getCompId());
        contract.setPartyB(SecurityUtils.getUser().getCompName());
        if (StrUtil.isEmpty(addDTO.getPartyA())) {
            BusinessCustomer bc = businessCustomerMapper.selectById(addDTO.getPartyAId());
            if (ObjUtil.isNotNull(bc)) {
                contract.setPartyA(bc.getCompanyName());
            }
            if (!StrUtil.equals(SecurityUtils.getUser().getCompId() + "", sgb) && StrUtil.isEmpty(bc.getErpCompanyCode())
                    && StrUtil.isEmpty(bc.getCreditCode())) {
                return R.failed("请完善客户ERP编码或组织机构代码");
            }
        }
        contract.setBillingStatus("1");
        contract.setErpPushFlag("1");
        contract.setCenterPushFlag("1");
        contract.setContractStatus(2);
        contract.setNickName(SecurityUtils.getUser().getNickname());
        contract.setNextScheduleName("发货前");
        if (ObjUtil.isNotNull(addDTO.getDeliveryCycle())) {
            contract.setExpirationDate(DateUtil.offsetDay(addDTO.getSignDate(), addDTO.getDeliveryCycle()));
        }
        if (CollUtil.isEmpty(addDTO.getContractSubjectMatter())) {
            return R.failed("标的物不能为空");
        }
        baseMapper.insert(contract);
        if (CollUtil.isNotEmpty(addDTO.getContractSubjectMatter())) {
            addDTO.getContractSubjectMatter().stream().forEach(contractSubjectMatterAddDTO -> {
                ContractSubjectMatter subjectMatter = BeanUtil.copyProperties(contractSubjectMatterAddDTO, ContractSubjectMatter.class);
                subjectMatter.setContractId(contract.getId());
                subjectMatter.setDeliveredQuantity(ObjUtil.isNull(contractSubjectMatterAddDTO.getDeliveredQuantity())
                        ? new BigDecimal("0") : contractSubjectMatterAddDTO.getDeliveredQuantity());
                subjectMatter.setRemainingQuantity(subjectMatter.getQuantity().subtract(subjectMatter.getDeliveredQuantity()));
                subjectMatter.setDeliveryStatus(subjectMatter.getRemainingQuantity().compareTo(subjectMatter.getQuantity()) == 0 ? 0
                        : subjectMatter.getRemainingQuantity().compareTo(new BigDecimal("0")) > 0 ? 1 : 2);
                subjectMatter.setLineNo(ItemGeneratorUtil.nextId());
                contractSubjectMatterMapper.insert(subjectMatter);
            });
            List<ContractSubjectMatter> subjectMatterList = contractSubjectMatterMapper.selectList(Wrappers.<ContractSubjectMatter>lambdaQuery()
                    .eq(ContractSubjectMatter::getContractId,contract.getId()).ne(ContractSubjectMatter::getDeliveryStatus,2));
            if (CollUtil.isEmpty(subjectMatterList)){
                contract.setNextScheduleName("货到签收");
                baseMapper.updateById(contract);
            }
        }
        BigDecimal remainAmount = ObjUtil.isNotNull(contract.getPaidAmount()) ? contract.getPaidAmount() : new BigDecimal("0");
        if (CollUtil.isNotEmpty(addDTO.getContractPaymentSchedule())) {
            for (int j = 0; j < addDTO.getContractPaymentSchedule().size(); j++) {
                ContractPaymentSchedule schedule = new ContractPaymentSchedule();
                schedule.setStageName(addDTO.getContractPaymentSchedule().get(j).getStageName());
                schedule.setContractId(contract.getId());
                schedule.setPaymentRatio(addDTO.getContractPaymentSchedule().get(j).getPaymentRatio());
                schedule.setAgreedDays(addDTO.getContractPaymentSchedule().get(j).getAgreedDays());
                schedule.setPlannedAmount(contract.getAmount().multiply(schedule.getPaymentRatio())
                        .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP));
                schedule.setPaymentStatus(0);
                schedule.setStageOrder(j + 1);
                if (remainAmount.compareTo(new BigDecimal("0")) > 0 && schedule.getPlannedAmount().compareTo(new BigDecimal("0")) > 0) {
                    remainAmount = remainAmount.subtract(schedule.getPlannedAmount());
                    if (remainAmount.compareTo(new BigDecimal("0")) >= 0) {
                        schedule.setPaymentStatus(2);
                        schedule.setActualAmount(schedule.getPlannedAmount());
                    }
                    if (remainAmount.compareTo(new BigDecimal("0")) < 0) {
                        schedule.setPaymentStatus(1);
                        schedule.setActualAmount(schedule.getPlannedAmount().add(remainAmount));
                    }
                }
                contractPaymentScheduleMapper.insert(schedule);
                if (addDTO.getContractPaymentSchedule().get(j).getStageName().equals("货到签收")) {
                    contract.setArrivalScheduleId(schedule.getId());
                    baseMapper.updateById(contract);
                }
                if (addDTO.getContractPaymentSchedule().get(j).getStageName().equals("调试完成或验收")) {
                    contract.setAcceptScheduleId(schedule.getId());
                    baseMapper.updateById(contract);
                }
                if (addDTO.getContractPaymentSchedule().get(j).getStageName().equals("质保金")) {
                    contract.setWarrantyScheduleId(schedule.getId());
                    baseMapper.updateById(contract);
                }
            }
        }
        if (contract.getPaidAmount().compareTo(contract.getAmount())==0&&contract.getBillingAmout().compareTo(contract.getAmount())==0){
            contract.setContractStatus(3);
            baseMapper.updateById(contract);
        }
        return R.ok();
    }
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ProductServiceImpl.java
@@ -160,7 +160,7 @@
                    product.setErpCode(addDTO.getErpTypeCode());
                    TaxCode taxCode = taxCodeMapper.selectOne(Wrappers.<TaxCode>lambdaQuery().eq(TaxCode::getBm,addDTO.getTaxCode()).last("limit 1"));
                    if (ObjUtil.isNotNull(taxCode)){
                        product.setTaxClass(taxCode.getMc());
                        product.setTaxClass(taxCode.getSphwjc());
                        product.setTaxRate(Double.valueOf(taxCode.getSl().replace("%","")));
                    }
                    baseMapper.insert(product);
@@ -174,7 +174,7 @@
                product.setErpCode(addDTO.getErpCode());
                TaxCode taxCode = taxCodeMapper.selectOne(Wrappers.<TaxCode>lambdaQuery().eq(TaxCode::getBm,addDTO.getTaxCode()).last("limit 1"));
                if (ObjUtil.isNotNull(taxCode)){
                    product.setTaxClass(taxCode.getMc());
                    product.setTaxClass(taxCode.getSphwjc());
                    product.setTaxRate(Double.valueOf(taxCode.getSl().replace("%","")));
                }
                baseMapper.insert(product);
@@ -299,6 +299,11 @@
                        productClass.setErpCode(product.getString("itemClassName"));
                        productClass.setParentId(0L);
                        productClass.setCompId(2089995177814495234L);
                        TaxCode taxCode = taxCodeMapper.selectOne(Wrappers.<TaxCode>lambdaQuery().eq(TaxCode::getBm,product.getString("tfTaxClass")).last("limit 1"));
                        if (ObjUtil.isNotNull(taxCode)){
                            productClass.setTaxClass(taxCode.getSphwjc());
                            productClass.setTaxRate(Double.valueOf(taxCode.getSl().replace("%","")));
                        }
                        baseMapper.insert(productClass);
                        log.info("产品分类:{}新增成功",product.getString("itemClassName"));
                    }
@@ -318,6 +323,11 @@
                        productNew.setProductType(product.getString("grade"));
                        productNew.setCompId(2089995177814495234L);
                        productNew.setParentId(productClass.getId());
                        TaxCode taxCode = taxCodeMapper.selectOne(Wrappers.<TaxCode>lambdaQuery().eq(TaxCode::getBm,product.getString("tfTaxClass")).last("limit 1"));
                        if (ObjUtil.isNotNull(taxCode)){
                            productClass.setTaxClass(taxCode.getSphwjc());
                            productClass.setTaxRate(Double.valueOf(taxCode.getSl().replace("%","")));
                        }
                        baseMapper.insert(productNew);
                        log.info("产品:{}新增成功",product.getString("itemNo"));
                        return;
platformx-business-finance-biz/src/main/resources/mapper/ContractApprovalMapper.xml
New file
@@ -0,0 +1,20 @@
<?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.ContractApprovalMapper">
  <resultMap id="contractApprovalMap" type="com.by4cloud.platformx.business.entity.ContractApproval">
        <id property="id" column="id"/>
        <result property="compId" column="comp_id"/>
        <result property="contractId" column="contract_id"/>
        <result property="returnDateTime" column="return_date_time"/>
        <result property="returnPerson" column="return_person"/>
        <result property="returnReason" column="return_reason"/>
        <result property="status" column="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
@@ -173,6 +173,33 @@
        UNION ALL
        SELECT
        '石煤机公司' AS party_b_name,
        SUM(CASE WHEN MONTH(sign_date) = 1 THEN amount ELSE 0 END) AS m01,
        SUM(CASE WHEN MONTH(sign_date) = 2 THEN amount ELSE 0 END) AS m02,
        SUM(CASE WHEN MONTH(sign_date) = 3 THEN amount ELSE 0 END) AS m03,
        SUM(CASE WHEN MONTH(sign_date) = 4 THEN amount ELSE 0 END) AS m04,
        SUM(CASE WHEN MONTH(sign_date) = 5 THEN amount ELSE 0 END) AS m05,
        SUM(CASE WHEN MONTH(sign_date) = 6 THEN amount ELSE 0 END) AS m06,
        SUM(CASE WHEN MONTH(sign_date) = 7 THEN amount ELSE 0 END) AS m07,
        SUM(CASE WHEN MONTH(sign_date) = 8 THEN amount ELSE 0 END) AS m08,
        SUM(CASE WHEN MONTH(sign_date) = 9 THEN amount ELSE 0 END) AS m09,
        SUM(CASE WHEN MONTH(sign_date) = 10 THEN amount ELSE 0 END) AS m10,
        SUM(CASE WHEN MONTH(sign_date) = 11 THEN amount ELSE 0 END) AS m11,
        SUM(CASE WHEN MONTH(sign_date) = 12 THEN amount ELSE 0 END) AS m12,
        SUM(amount) AS total_amt
        FROM contract
        WHERE
        del_flag = '0'
        AND amount IS NOT NULL
        AND sign_date IS NOT NULL
        AND YEAR(sign_date) = #{queryDTO.year}
        AND    party_b_id IN (2089995177814495234,2089996921978040321,2089997578009128962)
        GROUP BY party_b_id, party_b
        UNION ALL
        SELECT
            '总计' AS party_b_name,
            SUM(CASE WHEN MONTH(sign_date) = 1 THEN amount ELSE 0 END),
            SUM(CASE WHEN MONTH(sign_date) = 2 THEN amount ELSE 0 END),
@@ -1095,6 +1122,7 @@
            c.warranty_schedule_id,
            c.comp_id,
            c.center_push_flag,
            c.last_attachment_url,
            (select sum(delivered_quantity*unit_price) from contract_subject_matter csm where csm.contract_id = c.id) outAmount
            FROM
        contract c,
platformx-business-finance-biz/src/main/resources/mapper/ContractSubjectMatterChangeMapper.xml
@@ -19,7 +19,7 @@
  </resultMap>
    <select id="subjectChangePage" resultType="com.by4cloud.platformx.business.vo.ContractPageVo">
        SELECT
            c.id,
            csmc.id,
            c.contract_no,
            c.contract_name,
            c.party_a_id,
@@ -36,7 +36,6 @@
            c.effective_date,
            c.delivery_cycle,
            c.expiration_date,
            c.attachment_url,
            c.remark,
            c.parent_id,
            c.approve_time,
@@ -54,7 +53,10 @@
            c.comp_id,
            c.center_push_flag,
            csmc.before_change,
            csmc.after_change
            csmc.after_change,
            csmc.attachment_name,
            csmc.attachment_url,
            csmc.create_time changeTime
        FROM
            contract_subject_matter_change csmc
        left join