shiyunteng
2026-09-04 c427840445fefb679a287dbeaba81bd417388aeb
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/BankStatementServiceImpl.java
@@ -6,7 +6,6 @@
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -16,12 +15,10 @@
import com.by4cloud.platformx.business.dto.BankStatementUpdateDTO;
import com.by4cloud.platformx.business.dto.PaymentConfirmAddDTO;
import com.by4cloud.platformx.business.entity.*;
import com.by4cloud.platformx.business.mapper.BankStatementItemMapper;
import com.by4cloud.platformx.business.mapper.BankStatementMapper;
import com.by4cloud.platformx.business.mapper.BusinessCustomerMapper;
import com.by4cloud.platformx.business.mapper.ContractMapper;
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.StatementContractVo;
import com.by4cloud.platformx.common.core.util.R;
import com.by4cloud.platformx.common.security.util.SecurityUtils;
@@ -33,6 +30,7 @@
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@@ -53,12 +51,20 @@
   private final StringRedisTemplate redisTemplate;
   private final RemoteDeptService remoteDeptService;
   private final BankStatementItemMapper bankStatementItemMapper;
   private final ErpRequestRecordMapper erpRequestRecordMapper;
   private final BipViewMapper bipViewMapper;
   @Value("${bip.url}")
   private String url;
   @Value("${bip.flag}")
   private Boolean bipFlag;
   @Value("${dept.sgb}")
   private String sgb;
   @Value("${erp.sgb}")
   private String sgbErp;
   @Override
   public R edit(BankStatementUpdateDTO updateDTO) {
@@ -68,16 +74,8 @@
      }
      BigDecimal toPaidTotal = updateDTO.getContractCollectionList().stream() .map(StatementContractDTO::getToPaidAmount)
            .reduce(BigDecimal.ZERO, BigDecimal::add);
      if (toPaidTotal.compareTo(statement.getTranAmount().subtract(statement.getConfirmAmount()))>0){
         return R.failed("确认收款总额不能超过交易流水金额");
      }
      //bip推送
      if (bipFlag) {
         R r = pushSaveCollection(statement, updateDTO.getContractCollectionList());
         if (!r.isOk()){
            return r;
         }
      if (toPaidTotal.compareTo(statement.getTranAmount().subtract(statement.getConfirmAmount()))!=0){
         return R.failed("确认收款总额必须与交易流水金额一致");
      }
      statement.setConfirmAmount(statement.getConfirmAmount().add(toPaidTotal));
@@ -96,13 +94,86 @@
         addDTO.setBusGuestId(statement.getBusGuestId()+"");
         addDTO.setConfirmTime(statement.getTranDate());
         addDTO.setContractNo(contract.getContractNo());
         addDTO.setInOrOut("1");
         addDTO.setInOrOut(statement.getDcFlag());
         addDTO.setTransationAmount(statementContractDTO.getToPaidAmount());
         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);
            }
         }
      });
      //判断是否内部单位
      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);
         try {
         } catch (Exception e) {
            e.printStackTrace();
         }
      }).start();
   }
   private void saveErpRequestRecord(String ymj,String medthodName, String toJSONString, String result) {
      ErpRequestRecord record = new ErpRequestRecord();
      record.setErpName(ymj);
      record.setMothedName(medthodName);
      record.setRequestParams(toJSONString);
      record.setResponseParams(result);
      erpRequestRecordMapper.insert(record);
   }
   private JSONObject genErpParam(BankStatement statement, Contract contract,BusinessCustomer customer,BankStatementItem item) {
      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());
      req.put("单据头",djt);
      JSONArray array = new JSONArray();
      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());
      array.add(djti);
      req.put("单据头",array);
      return req;
   }
   private R pushSaveCollection(BankStatement statement, List<StatementContractDTO> contractDTOList) {
@@ -118,11 +189,6 @@
      }
      String finalAccessToken = accessToken;
      BusinessCustomer customer = businessCustomerMapper.selectById(statement.getBusGuestId());
      if (ObjUtil.isNull(customer)||StrUtil.isEmpty(customer.getBipCode())){
         log.error("查询客户信息异常");
         return R.failed("查询客户信息异常");
      }
      R<SysDept> r = remoteDeptService.getById(SecurityUtils.getUser().getCompId());
      log.info("查询单位信息:{}",JSONObject.toJSONString(r.getData()));
      if (!r.isOk()){
@@ -130,7 +196,7 @@
         return R.failed("查询单位信息异常");
      }
      SysDept dept = r.getData();
      JSONObject params = genRequestParam(statement,dept,customer,contractDTOList);
      JSONObject params = genRequestParam(statement,dept,contractDTOList);
      log.info("收款单集成 Request:{}", params.toJSONString());
      String result = HttpUtil.post(url + "/yonbip/EFI/collection/saveandsubmit?access_token=" + finalAccessToken, params.toJSONString());
@@ -143,7 +209,9 @@
      return R.ok();
   }
   private JSONObject genRequestParam(BankStatement statement,SysDept dept,BusinessCustomer customer,List<StatementContractDTO> contractDTOList) {
   private JSONObject genRequestParam(BankStatement statement,SysDept dept,List<StatementContractDTO> contractDTOList) {
      Contract contract1 = contractMapper.selectById(contractDTOList.get(0).getId());
      BusinessCustomer customer = businessCustomerMapper.selectById(contract1.getPartyAId());
      JSONObject jsonObject = new JSONObject();
      JSONObject data = new JSONObject();
      data.put("billDate",DateUtil.format(statement.getTranDate(), DatePattern.NORM_DATETIME_FORMAT));
@@ -182,6 +250,7 @@
            .select(Contract::getAmount)
            .leftJoin(Contract.class,Contract::getId,BankStatementItem::getContractId)
            .eq(BankStatementItem::getCompId,SecurityUtils.getUser().getCompId())
            .eq(BankStatementItem::getStatetId,id)
            .orderByDesc(BankStatementItem::getCreateTime);
      return R.ok(bankStatementItemMapper.selectJoinList(StatementContractVo.class, wrapper));
   }
@@ -468,4 +537,22 @@
      jsonObject.put("data",data);
      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;
      }
      return r;
   }
}