feat:工业泵收款推送 bip收款单与收款确认分离  开票前校验产品是否维护税收分类信息
12个文件已修改
4个文件已添加
553 ■■■■■ 已修改文件
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/BankStatementUpdateDTO.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/BipQueryDTO.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BankStatement.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BankStatementItem.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/BankStatementItemPageVo.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/HomeInvoiceVo.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/InvoiceItemVo.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ReceiveBipVo.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ReceiveItemVo.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/BankStatementController.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/BankStatementMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/BankStatementService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/BankStatementServiceImpl.java 255 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractInvoiceServiceImpl.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractServiceImpl.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/resources/mapper/BankStatementMapper.xml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/BankStatementUpdateDTO.java
@@ -8,7 +8,9 @@
@Data
public class BankStatementUpdateDTO {
    private Long id;
    private String id;
    private String bipParam;
    private List<StatementContractDTO> contractCollectionList;
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/BipQueryDTO.java
New file
@@ -0,0 +1,14 @@
package com.by4cloud.platformx.business.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class BipQueryDTO {
    @Schema(description = "收款银行账户户名")
    private String receiveBankAccName;
    @Schema(description = "付款银行账户户名")
    private String payBankAccName;
}
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BankStatement.java
@@ -84,4 +84,16 @@
    @Column(columnDefinition="char comment '借贷标识:1借;2贷'")
    private String dcFlag;
    @Schema(description = "子公司推送参数")
    @Column(columnDefinition="text comment '子公司推送参数'")
    private String pushParam;
    @Schema(description = "子公司推送标识")
    @Column(columnDefinition="tinyint(1) default 0 comment '子公司推送标识 1/已推送 0/未推送'")
    private Integer pushFlag;
    @Schema(description = "子公司推送成功后单据号")
    @Column(columnDefinition="varchar(64) comment '子公司推送成功后单据号'")
    private String pushVouchNo;
}
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BankStatementItem.java
@@ -38,7 +38,16 @@
    @Column(columnDefinition = "decimal(10,2) comment '合同确认金额'")
    private BigDecimal confirmAmount;
    @Schema(description = "推送标识")
    @Column(columnDefinition="char default '0' comment '推送标识 0/未推 1/已推'")
    private String pushFlag;
    @Schema(description = "bip推送标识")
    @Column(columnDefinition="char comment 'bip推送标识 1/已推送 0/未推送'")
    private String bipPush;
    @Schema(description = "bip推送成功后返回数据ID")
    @Column(columnDefinition="bigint comment 'bip推送成功后返回数据ID'")
    private Long bipId;
    @Schema(description = "bip推送参数")
    @Column(columnDefinition="text comment '子公司推送参数'")
    private String bipParam;
}
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/BankStatementItemPageVo.java
New file
@@ -0,0 +1,45 @@
package com.by4cloud.platformx.business.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class BankStatementItemPageVo {
    private Long id;
    @Schema(description = "收款银行账户账号")
    private String receiveBankAccAcc;
    @Schema(description = "收款银行账户户名")
    private String receiveBankAccName;
    @Schema(description = "付款银行账户")
    private String payBankNo;
    @Schema(description = "付款银行账户户名")
    private String payBankAccName;
    @Schema(description = "交易流水")
    private String bankSeqNo;
    @Schema(description = "合同ID")
    private Long contractId;
    @Schema(description = "合同确认金额")
    private BigDecimal confirmAmount;
    @Schema(description = "bip推送标识")
    private String bipPush;
    @Schema(description = "bip推送成功后返回数据ID")
    private Long bipId;
    @Schema(description = "bip推送参数")
    private String bipParam;
    private String remark;
}
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/HomeInvoiceVo.java
@@ -38,4 +38,6 @@
    private String redReversal;
    private String approvalStatus;
    private String bipPush;
}
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/InvoiceItemVo.java
@@ -54,4 +54,6 @@
    private String zyys;
    private String bkfl;
    private String zy;
}
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ReceiveBipVo.java
New file
@@ -0,0 +1,41 @@
package com.by4cloud.platformx.business.vo;
import lombok.Data;
import java.util.List;
@Data
public class ReceiveBipVo {
    private String id;
    private String djrq;
    private String kpzz;
    private String ywzz;
    private String bm;
    private String ywy;
    private String djfx;
    private String jylx;
    private String wldxlx;
    private String kh;
    private String bz;
    private String fjzs;
    private String pzzdr;
    private String sfzy;
    private String hsdy;
    private String sfnbwl;
    private String sfjyjs;
    private String zy;
    private List<ReceiveItemVo> itemList;
}
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ReceiveItemVo.java
New file
@@ -0,0 +1,25 @@
package com.by4cloud.platformx.business.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ReceiveItemVo {
    @Schema(description = "金额含税")
    private BigDecimal confirmAmount;
    private String jjsx;
    private String hsjylx;
    private String kxmx;
    private String cpwlfl;
    private String hsdy;
    private String zy;
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/BankStatementController.java
@@ -7,6 +7,7 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.by4cloud.platformx.business.dto.BankStatementUpdateDTO;
import com.by4cloud.platformx.business.dto.BipQueryDTO;
import com.by4cloud.platformx.business.entity.BankStatement;
import com.by4cloud.platformx.common.core.util.R;
import com.by4cloud.platformx.common.log.annotation.SysLog;
@@ -176,15 +177,26 @@
        return bankStatementService.backAll(id);
    }
    /**
     * 通过id推送bip
     * @param itemId id
     * 生成收款单预信息并推送
     * @param updateDTO
     * @return R
     */
    @Operation(summary = "通过id删除银行流水历史确认" , description = "通过id删除银行流水历史确认" )
    @GetMapping("/pushBip/{itemId}" )
    public R pushBip(@PathVariable("itemId" ) Long itemId) {
        return bankStatementService.pushBip(itemId);
    @Operation(summary = "生成收款单预信息并推送" , description = "生成收款单预信息并推送" )
    @PostMapping("/saveAndPush" )
    public R saveAndPush(@RequestBody BankStatementUpdateDTO updateDTO) {
        return bankStatementService.saveAndPush(updateDTO);
    }
    /**
     * 分页查询
     * @param page 分页对象
     * @param queryDTO 银行流水
     * @return
     */
    @Operation(summary = "分页查询" , description = "分页查询" )
    @GetMapping("/pageBip" )
    public R pageBip(@ParameterObject Page page, @ParameterObject BipQueryDTO queryDTO) {
        return R.ok(bankStatementService.pageBip(page, queryDTO));
    }
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/BankStatementMapper.java
@@ -1,11 +1,17 @@
package com.by4cloud.platformx.business.mapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.by4cloud.platformx.business.dto.BipQueryDTO;
import com.by4cloud.platformx.business.vo.BankStatementItemPageVo;
import com.by4cloud.platformx.common.data.datascope.DataScope;
import com.by4cloud.platformx.common.data.datascope.PlatformxBaseMapper;
import com.by4cloud.platformx.business.entity.BankStatement;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface BankStatementMapper extends PlatformxBaseMapper<BankStatement> {
    Page<BankStatementItemPageVo> pageBip(Page page, @Param("queryDTO") BipQueryDTO queryDTO, DataScope comp_id);
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/BankStatementService.java
@@ -1,6 +1,8 @@
package com.by4cloud.platformx.business.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.by4cloud.platformx.business.dto.BankStatementUpdateDTO;
import com.by4cloud.platformx.business.dto.BipQueryDTO;
import com.by4cloud.platformx.business.entity.BankStatement;
import com.by4cloud.platformx.common.core.util.R;
import com.by4cloud.platformx.common.data.mybatis.IIService;
@@ -19,5 +21,7 @@
    R backHis(Long id);
    R pushBip(Long itemId);
    Page pageBip(Page page, BipQueryDTO queryDTO);
    R saveAndPush(BankStatementUpdateDTO updateDTO);
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/BankStatementServiceImpl.java
@@ -1,37 +1,47 @@
package com.by4cloud.platformx.business.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
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.dto.BankStatementUpdateDTO;
import com.by4cloud.platformx.business.dto.BipQueryDTO;
import com.by4cloud.platformx.business.dto.PaymentConfirmAddDTO;
import com.by4cloud.platformx.business.entity.*;
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;
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.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
@@ -82,14 +92,18 @@
        baseMapper.updateById(statement);
        updateDTO.getContractCollectionList().stream().forEach(statementContractDTO -> {
            Contract contract = contractMapper.selectById(statementContractDTO.getId());
            R<SysDept> r = remoteDeptService.getById(SecurityUtils.getUser().getCompId());
            SysDept b = r.getData();
            BusinessCustomer customer = businessCustomerMapper.selectById(contract.getPartyAId());
            BankStatementItem item = new BankStatementItem();
            item.setStatetId(statement.getId());
            item.setBankSeqNo(statement.getBankSeqNo());
            item.setConfirmAmount(statementContractDTO.getToPaidAmount());
            item.setContractId(statementContractDTO.getId());
            ReceiveBipVo bipVo = tranBipVo(statement, item, b, customer);
            item.setBipParam(JSONObject.toJSONString(bipVo));
            bankStatementItemMapper.insert(item);
            Contract contract = contractMapper.selectById(statementContractDTO.getId());
            PaymentConfirmAddDTO addDTO = new PaymentConfirmAddDTO();
            addDTO.setBusGuestId(statement.getBusGuestId()+"");
            addDTO.setConfirmTime(statement.getTranDate());
@@ -99,51 +113,71 @@
            addDTO.setBankSeqNo(statement.getBankSeqNo());
            paymentConfirmService.add(addDTO);
        });
            //石工泵主动推送系统
            if ((StrUtil.equals(SecurityUtils.getUser().getCompId() + "", sgb)) && StrUtil.isNotEmpty(sgbErp)) {
                BusinessCustomer customer = businessCustomerMapper.selectById(contract.getPartyAId());
                if (ObjUtil.isNotNull(customer)) {
                    pushCollection(statement, contract,customer,item);
                }
            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());
//        //判断是否内部单位
//        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();
    }
    private void pushCollection(BankStatement statement,Contract contract,BusinessCustomer customer,BankStatementItem item) {
        new Thread(() -> {
            JSONObject request = genErpParam(statement,contract,customer,item);
            String resp = "";
            String reqPath = "";
            log.info("工业泵收款/退款:{},入参:{}",statement.getDcFlag(),request.toJSONString());
            if (statement.getDcFlag().equals("1")){
                reqPath = sgbErp + "/arpclose/create";
            }
            if (statement.getDcFlag().equals("2")){
                reqPath = sgbErp+"/arpclose/create";
            }
            resp = HttpUtil.post(reqPath,request.toJSONString());
            saveErpRequestRecord("sgb",reqPath,request.toJSONString(),resp);
            log.info("工业泵收款/退款回参:{}",resp);
    private void pushCollectionSgb(BankStatement statement, List<StatementContractDTO> contractCollectionList) {
        JSONObject request = genErpParam(statement, contractCollectionList);
        statement.setPushParam(request.toJSONString());
        log.info("工业泵收款地址:{}", sgbErp + "/apilink/arclose/create?corpsecret=12345678&appserver=appserver1&accountid=888&tradeid=" + IdUtil.fastUUID());
            try {
            } catch (Exception e) {
//        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))
//                .timeout(30000)
//                // 指定编码格式
//                .charset(StandardCharsets.UTF_8)
//                .execute();
            log.info("工业泵收款入参:{}", "=" +request.toJSONString());
            OkHttpClient client = new OkHttpClient().newBuilder()
                    .build();
            MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
            RequestBody body = RequestBody.create(mediaType, "=" + request.toJSONString());
            Request req = new Request.Builder()
                    .url(sgbErp + "/apilink/arclose/create?corpsecret=12345678&appserver=appserver1&accountid=888&tradeid=" + IdUtil.fastUUID())
                    .method("POST", body)
                    .addHeader("Content-Type", "application/x-www-form-urlencoded")
                    .build();
            String result = "";
            try (Response response = client.newCall(req).execute()){
                if (response.isSuccessful()) {
                    // 仅调用一次string(),结果存入变量复用,后续所有逻辑直接读取该变量
                    result = response.body().string();
                    // 业务逻辑直接使用result,禁止再次调用response.body().string()
                }
            log.info("工业泵收款回参:{}", result);
            saveErpRequestRecord("sgb", "/apilink/arclose/create", request.toJSONString(), result);
            JSONObject respJson = JSONObject.parseObject(result);
            if (respJson.containsKey("errcode") && respJson.getString("errcode").equals("0")) {
                statement.setPushFlag(1);
                statement.setPushVouchNo(respJson.getString("code"));
                baseMapper.updateById(statement);
                return;
            }
            log.error("工业泵收款推送失败:{}", response.body().string());
        } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();
    }
    private void saveErpRequestRecord(String ymj,String medthodName, String toJSONString, String result) {
@@ -155,28 +189,51 @@
        erpRequestRecordMapper.insert(record);
    }
    private JSONObject genErpParam(BankStatement statement, Contract contract,BusinessCustomer customer,BankStatementItem item) {
    private JSONObject genErpParam(BankStatement statement, List<StatementContractDTO> contractCollectionList) {
        JSONObject req = new JSONObject();
        JSONObject djt = new JSONObject();
        djt.put("iAmt",item.getConfirmAmount());
        djt.put("iAmt_f",item.getConfirmAmount());
        djt.put("cCusVen",customer.getErpCompanyCode());
        djt.put("cexch_name","人民币");
        djt.put("iAmount",item.getConfirmAmount());
        Map<String, Object> djt = new LinkedHashMap<>();
        Contract contract = contractMapper.selectById(contractCollectionList.get(0).getId());
        BusinessCustomer customer = businessCustomerMapper.selectById(contract.getPartyAId());
        djt.put("dVouchDate", DateUtil.formatDate(statement.getTranDate()));//单据日期
        if (ObjUtil.isNotNull(customer)) {
            djt.put("cDwCode", customer.getErpCompanyCode());//单位编码
        }
        djt.put("cexch_name", "人民币");//单位编码
        djt.put("cOperator", "10123");//录入人编码
        djt.put("cSSCode", "01");//录入人编码
        djt.put("iAmount", statement.getConfirmAmount());//人民币金额
        djt.put("cBankAccount", statement.getReceiveBankAccAcc());//本方银行账号
        djt.put("cBank", statement.getPayBankAccName());//本方银行账号
        djt.put("cContractType", "161");
        if (CollUtil.size(contractCollectionList)==1) {
            Contract contractHeader = contractMapper.selectById(contractCollectionList.get(0).getId());
            djt.put("cContractID", contractHeader.getErpContractNo());
        }
        req.put("单据头",djt);
        JSONObject line = new JSONObject();
        JSONArray array = new JSONArray();
        contractCollectionList.stream().forEach(statementContractDTO -> {
        JSONObject djti = new JSONObject();
        djti.put("cVouchID",statement.getBankSeqNo());
        djti.put("dVouchDate",DateUtil.formatDate(statement.getTranDate()));
        djti.put("cDwCode",customer.getErpCompanyCode());
        djti.put("cexch_name","人民币");
        djti.put("iAmount",item.getConfirmAmount());
            djti.put("cCusVen", customer.getErpCompanyCode());//往来单位编码
            djti.put("iAmt_f", statementContractDTO.getToPaidAmount());//本行本币金额
            djti.put("iAmt", statementContractDTO.getToPaidAmount());//本行本币金额
            djti.put("cPersonCode", "00164");//业务员编码
            djti.put("cConID", contract.getErpContractNo());//合同编码
            djti.put("款项类型", "应收款");
            djti.put("cConType","镇江市");
        array.add(djti);
        req.put("单据头",array);
        });
        line.put("行", array);
        req.put("单据体", line);
        JSONObject apicontext = new JSONObject();
        apicontext.put("username", "");
        req.put("apicontext", apicontext);
        return req;
    }
    private R pushSaveCollection(BankStatement statement, List<StatementContractDTO> contractDTOList) {
    private R pushSaveCollection(BankStatement statement, BankStatementItem bankStatementItem) {
        String accessToken = "";
        if (redisTemplate.hasKey("BIP_TOKEN")) {
            accessToken = (String) redisTemplate.opsForValue().get("BIP_TOKEN");
@@ -196,7 +253,7 @@
            return R.failed("查询单位信息异常");
        }
        SysDept dept = r.getData();
        JSONObject params = genRequestParam(statement,dept,contractDTOList);
        JSONObject params = genRequestParam(statement, dept, bankStatementItem);
        log.info("收款单集成 Request:{}", params.toJSONString());
        String result = HttpUtil.post(url + "/yonbip/EFI/collection/saveandsubmit?access_token=" + finalAccessToken, params.toJSONString());
@@ -206,12 +263,16 @@
        if (!resultJson.getString("code").equals("200")) {
            return R.failed(resultJson.getString("message"));
        }
        bankStatementItem.setBipPush("1");
        bankStatementItem.setBipId(resultJson.getJSONObject("data").getLong("id"));
        bankStatementItemMapper.updateById(bankStatementItem);
        return R.ok();
    }
    private JSONObject genRequestParam(BankStatement statement,SysDept dept,List<StatementContractDTO> contractDTOList) {
        Contract contract1 = contractMapper.selectById(contractDTOList.get(0).getId());
        BusinessCustomer customer = businessCustomerMapper.selectById(contract1.getPartyAId());
    private JSONObject genRequestParam(BankStatement statement, SysDept dept, BankStatementItem statementItem) {
        Contract contract = contractMapper.selectById(statementItem.getContractId());
        BusinessCustomer customer = businessCustomerMapper.selectById(contract.getPartyAId());
        ReceiveBipVo bipVo = BeanUtil.copyProperties(JSONObject.parseObject(statementItem.getBipParam()), ReceiveBipVo.class);
        JSONObject jsonObject = new JSONObject();
        JSONObject data = new JSONObject();
        data.put("billDate",DateUtil.format(statement.getTranDate(), DatePattern.NORM_DATETIME_FORMAT));
@@ -227,16 +288,37 @@
        data.put("srcBillNo",statement.getBankSeqNo());
        data.put("_status","Insert");
        JSONArray bodyItem = new JSONArray();
        for (StatementContractDTO statementContractDTO:contractDTOList) {
            Contract contract = contractMapper.selectById(statementContractDTO.getId());
            JSONObject item = new JSONObject();
            item.put("oriTaxIncludedAmount", statementContractDTO.getToPaidAmount());
        item.put("oriTaxIncludedAmount", statementItem.getConfirmAmount());
            item.put("contractNo", contract.getContractNo());
            item.put("quickTypeCode", "1");
            item.put("_status", "Insert");
        item.put("expenseItemCode", bipVo.getItemList().get(0).getJjsx());//经济事项
        item.put("remarks", bipVo.getItemList().get(0).getZy());//摘要
        JSONObject freeChId = new JSONObject();
        freeChId.put("GX08", bipVo.getItemList().get(0).getHsdy());//核算单元
        freeChId.put("YSYF14", "1");//款项类型 1 预收款 2 应收款
        freeChId.put("JT04", bipVo.getItemList().get(0).getHsjylx());//核算交易类型 0101 集团外部 01020301 三级分子公司间 01020302 三级分公司与子子公司之间
        freeChId.put("JT06", bipVo.getItemList().get(0).getKxmx());//款项明细
        freeChId.put("JT12", bipVo.getItemList().get(0).getCpwlfl());//产品物料分类
        item.put("freeChId", freeChId);
            bodyItem.add(item);
        }
        data.put("bodyItem",bodyItem);
        JSONObject datafreeChId = new JSONObject();
        datafreeChId.put("YSYF_SFZY", bipVo.getSfzy());//是否主营
        datafreeChId.put("fk_038", bipVo.getPzzdr());//凭证制单人
        datafreeChId.put("YSYF_08", bipVo.getSfnbwl());//是否内部往来
        datafreeChId.put("YSYF24", bipVo.getSfjyjs());//是否简易计税
        datafreeChId.put("fk_002", bipVo.getFjzs());//附件1
        datafreeChId.put("GX08", bipVo.getHsdy());//核算单元
        datafreeChId.put("TzMY042", contract.getExpirationDate());//预计回款日期
        data.put("freeChId", datafreeChId);
        data.put("remarks", bipVo.getZy());//摘要
        jsonObject.put("data",data);
        return  jsonObject;
    }
@@ -538,21 +620,46 @@
        return  jsonObject;
    }
    @Override
    public R pushBip(Long itemId) {
        BankStatementItem item = bankStatementItemMapper.selectById(itemId);
        BankStatement statement = baseMapper.selectById(item.getStatetId());
        List<StatementContractDTO> statementContractDTOList = new ArrayList<>();
        StatementContractDTO contractDTO = new StatementContractDTO();
        contractDTO.setId(item.getContractId());
        contractDTO.setToPaidAmount(item.getConfirmAmount());
        statementContractDTOList.add(contractDTO);
        R r = pushSaveCollection(statement,statementContractDTOList);
        if (r.isOk()){
            item.setPushFlag("1");
            bankStatementItemMapper.updateById(item);
            return r;
    private ReceiveBipVo tranBipVo(BankStatement statement, BankStatementItem bankStatementItem, SysDept b, BusinessCustomer customer) {
        ReceiveBipVo bipVo = new ReceiveBipVo();
        bipVo.setDjrq(DateUtil.formatDate(statement.getTranDate()));
        bipVo.setKpzz(b.getBipCode());
        bipVo.setYwzz(b.getBipCode());
        R<SysDept> rDept = remoteDeptService.getById(SecurityUtils.getUser().getDeptId());
        if (rDept.isOk()) {
            bipVo.setBm(rDept.getData().getOrgCode());
            bipVo.setHsdy(rDept.getData().getOrgCode());
        }
        return r;
        bipVo.setYwy(SecurityUtils.getUser().getNickname());
        bipVo.setPzzdr(SecurityUtils.getUser().getNickname());
        bipVo.setJylx("ZBYXGLXT");
        bipVo.setWldxlx("1");
        bipVo.setKh(customer.getCreditCode());
        bipVo.setBz("CNY");
        bipVo.setFjzs("0");
        bipVo.setSfzy("1");
        bipVo.setSfnbwl("1");
        bipVo.setSfjyjs("0");
        bipVo.setDjfx("1");
        List<ReceiveItemVo> list = new ArrayList<>();
        ReceiveItemVo itemVo = new ReceiveItemVo();
        itemVo.setConfirmAmount(bankStatementItem.getConfirmAmount());
        list.add(itemVo);
        bipVo.setItemList(list);
        return bipVo;
    }
    @Override
    public Page pageBip(Page page, BipQueryDTO queryDTO) {
        return baseMapper.pageBip(page, queryDTO, DataScope.of("comp_id"));
    }
    @Override
    public R saveAndPush(BankStatementUpdateDTO updateDTO) {
        BankStatementItem item = bankStatementItemMapper.selectById(updateDTO.getId());
        item.setBipParam(updateDTO.getBipParam());
        bankStatementItemMapper.updateById(item);
        BankStatement statement = baseMapper.selectById(item.getStatetId());
        return pushSaveCollection(statement, item);
    }
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractInvoiceServiceImpl.java
@@ -229,6 +229,24 @@
                if (ObjUtil.isNotNull(subjectMatter)) {
                    advanceAmount = advanceAmount.add(contractOutBoundInvoiceVo.getInvoiceNum().multiply(subjectMatter.getUnitPrice()));
                }
                List<String> smjList = new ArrayList<>();
                smjList.add(smj);
                smjList.add(smjsc);
                smjList.add(smjzt);
                if (("" + SecurityUtils.getUser().getCompId()).equals(smj) || ("" + SecurityUtils.getUser().getCompId()).equals(smjsc) ||
                        ("" + SecurityUtils.getUser().getCompId()).equals(smjzt)) {
                    Product product = productMapper.selectOne(Wrappers.<Product>lambdaQuery().eq(Product::getErpCode, subjectMatter.getMaterialCode())
                            .in(Product::getCompId, smjList).last("limit 1"));
                    if (ObjUtil.isNull(product) || StrUtil.isBlank(product.getTaxClass()) || StrUtil.isBlank(product.getTaxCode())) {
                        return R.failed("请在产品信息中补充税收分类信息");
                    }
                } else {
                    Product product = productMapper.selectOne(Wrappers.<Product>lambdaQuery().eq(Product::getErpCode, subjectMatter.getMaterialCode())
                            .eq(Product::getCompId, SecurityUtils.getUser().getCompId()).last("limit 1"));
                    if (ObjUtil.isNull(product) || StrUtil.isBlank(product.getTaxClass()) || StrUtil.isBlank(product.getTaxCode())) {
                        return R.failed("请在产品信息中补充税收分类信息");
                    }
                }
            }
            log.info("advanceAmount:{}", advanceAmount);
            log.info("schedule.getPlannedAmount:{}", schedule.getPlannedAmount());
@@ -260,6 +278,28 @@
        BusinessCustomer customer = businessCustomerMapper.selectById(contract.getPartyAId());
        if (ObjUtil.isNull(customer)) {
            return R.failed("获取购方单位异常");
        }
        for (ContractOutBoundInvoiceVo contractOutBoundInvoiceVo : genInvoiceInfoDTO.getOutBoundInvoiceList()) {
            ContractOutBound contractOutBound = contractOutBoundMapper.selectById(contractOutBoundInvoiceVo.getContractOutBoundId());
            List<String> smjList = new ArrayList<>();
            smjList.add(smj);
            smjList.add(smjsc);
            smjList.add(smjzt);
            if (("" + SecurityUtils.getUser().getCompId()).equals(smj) || ("" + SecurityUtils.getUser().getCompId()).equals(smjsc) ||
                    ("" + SecurityUtils.getUser().getCompId()).equals(smjzt)) {
                Product product = productMapper.selectOne(Wrappers.<Product>lambdaQuery().eq(Product::getErpCode, contractOutBound.getSubjectMatterCode())
                        .in(Product::getCompId, smjList).last("limit 1"));
                if (ObjUtil.isNull(product) || StrUtil.isBlank(product.getTaxClass()) || StrUtil.isBlank(product.getTaxCode())) {
                    return R.failed("请在产品信息中补充税收分类信息");
                }
            } else {
                Product product = productMapper.selectOne(Wrappers.<Product>lambdaQuery().eq(Product::getErpCode, contractOutBound.getSubjectMatterCode())
                        .eq(Product::getCompId, SecurityUtils.getUser().getCompId()).last("limit 1"));
                if (ObjUtil.isNull(product) || StrUtil.isBlank(product.getTaxClass()) || StrUtil.isBlank(product.getTaxCode())) {
                    return R.failed("请在产品信息中补充税收分类信息");
                }
            }
        }
        //机动车开票
        if (StrUtil.equals(genInvoiceInfoDTO.getInvoiceType(), "4")) {
@@ -300,7 +340,28 @@
        if (ObjUtil.isNull(customer)) {
            return R.failed("获取购方单位异常");
        }
        for (ContractOutBoundInvoiceVo contractOutBoundInvoiceVo : mergeInvoiceDTO.getOutBoundInvoiceList()) {
            ContractOutBound contractOutBound = contractOutBoundMapper.selectById(contractOutBoundInvoiceVo.getContractOutBoundId());
            List<String> smjList = new ArrayList<>();
            smjList.add(smj);
            smjList.add(smjsc);
            smjList.add(smjzt);
            if (("" + SecurityUtils.getUser().getCompId()).equals(smj) || ("" + SecurityUtils.getUser().getCompId()).equals(smjsc) ||
                    ("" + SecurityUtils.getUser().getCompId()).equals(smjzt)) {
                Product product = productMapper.selectOne(Wrappers.<Product>lambdaQuery().eq(Product::getErpCode, contractOutBound.getSubjectMatterCode())
                        .in(Product::getCompId, smjList).last("limit 1"));
                if (ObjUtil.isNull(product) || StrUtil.isBlank(product.getTaxClass()) || StrUtil.isBlank(product.getTaxCode())) {
                    return R.failed("请在产品信息中补充税收分类信息");
                }
            } else {
                Product product = productMapper.selectOne(Wrappers.<Product>lambdaQuery().eq(Product::getErpCode, contractOutBound.getSubjectMatterCode())
                        .eq(Product::getCompId, SecurityUtils.getUser().getCompId()).last("limit 1"));
                if (ObjUtil.isNull(product) || StrUtil.isBlank(product.getTaxClass()) || StrUtil.isBlank(product.getTaxCode())) {
                    return R.failed("请在产品信息中补充税收分类信息");
                }
            }
        }
        GenInvoiceInfoVo vo = genMergeInvoiceVo(mergeInvoiceDTO, customer, b);
        vo = transBipVo(vo, b, customer);
        return R.ok(vo);
@@ -1422,15 +1483,18 @@
            item.put("taxRate", invoiceItemVo.getTaxRate());
            item.put("oriTaxAmount", invoiceItemVo.getPriceTax());
            item.put("oriTaxIncludedAmount", invoiceItemVo.getPriceAndTax());
            item.put("remarks", invoiceItemVo.getZy());//摘要
            item.put("_status", "Insert");
            JSONObject freeChId = new JSONObject();
            freeChId.put("GX08", invoiceItemVo.getHsdy());//核算单元
            freeChId.put("YSYF14", "2");//款项类型 1 预收款 2 应收款
            freeChId.put("YSYF31", invoiceItemVo.getSfjs());//是否计税
            freeChId.put("JT04", invoiceItemVo.getHsjylx());//核算交易类型 0101 集团外部 01020301 三级分子公司间 01020302 三级分公司与子子公司之间
            freeChId.put("JT06", invoiceItemVo.getKxmx());//款项明细
            freeChId.put("JT32", invoiceItemVo.getZyys());//作业要素
            freeChId.put("zzbkfl", invoiceItemVo.getBkfl());//板块分类
            freeChId.put("JT12", invoiceItemVo.getCpwlfl());//产品物料分类
            item.put("freeChId", freeChId);
            bodyItem.add(item);
        }
@@ -2160,7 +2224,7 @@
                baseMapper.updateById(contractInvoice);
                return R.ok();
            }
            return R.failed(resultJson, "应收发票集成失败");
            return R.failed(result);
        }
        //红票
        if (StrUtil.equals(contractInvoice.getInvoiceCategory(), "2")) {
@@ -2179,7 +2243,7 @@
                baseMapper.updateById(contractInvoice);
                return R.ok();
            }
            return R.failed(resultJson, "应收发票删除失败");
            return R.failed(result);
        }
        return R.ok();
    }
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractServiceImpl.java
@@ -708,9 +708,7 @@
                if (StrUtil.equals(contract.getPartyBId() + "", tfgs) && StrUtil.isNotEmpty(tfgsErp)) {
                    //通方公司通过系统录入
                }
                if (StrUtil.equals(contract.getPartyBId() + "", sgb) && StrUtil.isNotEmpty(sgbErp)) {
                    //石工泵主动推送系统
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
platformx-business-finance-biz/src/main/resources/mapper/BankStatementMapper.xml
@@ -22,4 +22,32 @@
        <result property="updateTime" column="update_time"/>
        <result property="delFlag" column="del_flag"/>
  </resultMap>
    <select id="pageBip" resultType="com.by4cloud.platformx.business.vo.BankStatementItemPageVo">
        SELECT
            bsi.id,
            bsi.confirm_amount,
            bsi.bip_id,
            bsi.bip_param,
            bsi.bip_push,
            bs.pay_bank_acc_name,
            bs.pay_bank_no,
            bs.receive_bank_acc_acc,
            bs.receive_bank_acc_name,
            bs.bank_seq_no ,
            bs.remark ,
            bsi.comp_id
        FROM
            bank_statement_item bsi
                LEFT JOIN bank_statement bs ON bs.id = bsi.statet_id
        where
            bsi.del_flag='0'
        and bs.del_flag='0'
        <if test="queryDTO.payBankAccName!=null and queryDTO.payBankAccName != ''">
            and pay_bank_acc_name like  CONCAT('%', #{queryDTO.payBankAccName}, '%')
        </if>
        <if test="queryDTO.receiveBankAccName!=null and queryDTO.receiveBankAccName != ''">
            and receive_bank_acc_name like  CONCAT('%', #{queryDTO.receiveBankAccName}, '%')
        </if>
        order by bsi.create_time desc
    </select>
</mapper>