|
|
@@ -47,7 +47,9 @@ import java.util.concurrent.atomic.AtomicReference;
|
|
|
import java.util.function.Function;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exceptionCustomMsg;
|
|
|
import static cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO.PACKAGE_ID_SYSTEM;
|
|
|
+import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.COMMON_ERROR;
|
|
|
import static org.aspectj.bridge.MessageUtil.fail;
|
|
|
|
|
|
/**
|
|
|
@@ -476,11 +478,11 @@ public class KingdeeApiImpl implements KingdeeApi {
|
|
|
ElderlyInfoDO elderlyInfoDO = elderlyInfoMapper.selectById(expenseOrderDO.getElderId());
|
|
|
if (null == elderlyInfoDO) continue;
|
|
|
Long tenantId = expenseOrderDO.getTenantId();
|
|
|
- if(tenantId == null){
|
|
|
+ if (tenantId == null) {
|
|
|
msg.append(elderlyInfoDO.getElderName()).append(",").append(expenseOrderDO.getBillingMonth()).append("账单不存在机构id<br/>");
|
|
|
continue;
|
|
|
}
|
|
|
- if(expenseOrderDO.getIsPushKingdeeReceiveBill()){
|
|
|
+ if (expenseOrderDO.getIsPushKingdeeReceiveBill()) {
|
|
|
msg.append(elderlyInfoDO.getElderName()).append(",").append(expenseOrderDO.getBillingMonth()).append("账单已经推送过金蝶收款单<br/>");
|
|
|
continue;
|
|
|
}
|
|
|
@@ -488,134 +490,185 @@ public class KingdeeApiImpl implements KingdeeApi {
|
|
|
if (StringUtil.isEmptyORNull(elderlyInfoDO.getKingdeeCustomerNumber())) continue;
|
|
|
TenantDO tenantDO = tenantMapper.selectById(expenseOrderDO.getTenantId());
|
|
|
String kingedeeCustomerId = elderlyInfoDO.getKingdeeCustomerNumber();
|
|
|
- String FBillNo = "BILL" + expenseOrderDO.getBillOrderNumber();
|
|
|
+ String baseBillNo = "BILL" + expenseOrderDO.getBillOrderNumber();
|
|
|
String kingedeeTenantId = tenantDO.getKingdeeOrgid();
|
|
|
- // 应收单默认货币
|
|
|
- AtomicReference<String> FMAINBOOKSTDCURRID = new AtomicReference<>("PRE001");
|
|
|
- String fid = "";
|
|
|
- List<ReceiveBillSaveEntryDTO> freceivebillentryList = new ArrayList<>();
|
|
|
- // 费用类型
|
|
|
- // 床位费 C0001
|
|
|
- // 膳食费 CI048
|
|
|
- // 护理费 CI050
|
|
|
- // 长护险 CI051
|
|
|
- // 服务费 CI049
|
|
|
- // 其他 CI046
|
|
|
- // 风险预备金 CI002
|
|
|
- String FSETTLETYPEID = "JSFS04_SYS";
|
|
|
- String FPURPOSEID = "SFKYT01_SYS";
|
|
|
+ String currency = "PRE001";
|
|
|
+
|
|
|
List<EnterpriseBankInfoDO> openAccountList = enterpriseBankInfoMapper.selectList(new LambdaQueryWrapperX<EnterpriseBankInfoDO>()
|
|
|
.eq(EnterpriseBankInfoDO::getTenantId, tenantId));
|
|
|
String FACCOUNTID = "";
|
|
|
- if (null != openAccountList && openAccountList.size() > 0) {
|
|
|
- FACCOUNTID = openAccountList.get(0).getAccountName();
|
|
|
- } else {
|
|
|
- FACCOUNTID = "398460100100153498";
|
|
|
+ if (null != openAccountList && !openAccountList.isEmpty()) {
|
|
|
+ FACCOUNTID = openAccountList.get(0).getBankAccount();
|
|
|
}
|
|
|
-// BigDecimal payAmount = expenseOrderDO.getPayableAmount();
|
|
|
+ if (StringUtils.isBlank(FACCOUNTID)) {
|
|
|
+ throw exceptionCustomMsg(COMMON_ERROR, "不存在银行账户,请联系管理员处理");
|
|
|
+ }
|
|
|
+
|
|
|
+ BigDecimal normalAmount = BigDecimal.ZERO;
|
|
|
+ BigDecimal facilityAmount = BigDecimal.ZERO;
|
|
|
+ BigDecimal depositAmount = BigDecimal.ZERO;
|
|
|
+
|
|
|
List<ExpenseOrderItemDO> expenseOrderItemList = orderItemMapper.selectList(new LambdaQueryWrapperX<ExpenseOrderItemDO>()
|
|
|
.eq(ExpenseOrderItemDO::getExpenseOrderId, expenseOrderDO.getId())
|
|
|
.eq(ExpenseOrderItemDO::getPayStatus, BooleanEnum.TRUE.getValue()));
|
|
|
+
|
|
|
for (ExpenseOrderItemDO expenseOrderItemDO : expenseOrderItemList) {
|
|
|
- if(expenseOrderItemDO.getTotalAmount().compareTo(BigDecimal.ZERO) == 0){
|
|
|
+ if (expenseOrderItemDO.getTotalAmount().compareTo(BigDecimal.ZERO) == 0) {
|
|
|
continue;
|
|
|
}
|
|
|
- if(BusinessConstants.LONG_TERM_CARE_INSURANCE.equals(expenseOrderItemDO.getExpenseSource())){
|
|
|
+ if (BusinessConstants.LONG_TERM_CARE_INSURANCE.equals(expenseOrderItemDO.getExpenseSource())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ String itemName = StringUtils.defaultString(expenseOrderItemDO.getItemName());
|
|
|
+ if (itemName.contains("设施费")) {
|
|
|
+ facilityAmount = facilityAmount.add(expenseOrderItemDO.getTotalAmount());
|
|
|
continue;
|
|
|
}
|
|
|
String FCOSTID = getFCOSTID(expenseOrderItemDO);
|
|
|
- if(StringUtils.isBlank(FCOSTID)){
|
|
|
+ if ("CI002".equals(FCOSTID)
|
|
|
+ || itemName.contains("风险金")
|
|
|
+ || itemName.contains("预备金")
|
|
|
+ || itemName.contains("保证金")
|
|
|
+ || itemName.contains("押金")) {
|
|
|
+ depositAmount = depositAmount.add(expenseOrderItemDO.getTotalAmount());
|
|
|
continue;
|
|
|
}
|
|
|
- ReceiveBillSaveEntryDTO freceivebillentry = ReceiveBillSaveEntryDTO.builder()
|
|
|
- .FSETTLETYPEID(KingdeeNumberDTO.builder().FNUMBER(FSETTLETYPEID).build())
|
|
|
- .FPURPOSEID(KingdeeNumberDTO.builder().FNUMBER(FPURPOSEID).build())
|
|
|
- .FRECTOTALAMOUNTFOR(expenseOrderItemDO.getTotalAmount())
|
|
|
- .FRECAMOUNTFOR_E(expenseOrderItemDO.getTotalAmount())
|
|
|
- .FRECNOTAXAMOUNTFOR(expenseOrderItemDO.getTotalAmount())
|
|
|
- .FSETTLEDISTAMOUNTFOR(new BigDecimal(0.0))
|
|
|
- .FHANDLINGCHARGEFOR(new BigDecimal(0.0))
|
|
|
- .FOVERUNDERAMOUNTFOR(new BigDecimal(0.0))
|
|
|
- .FACCOUNTID(KingdeeNumberDTO.builder().FNUMBER(FACCOUNTID).build())
|
|
|
- .FOPPOSITEBANKACCOUNT("")
|
|
|
- .FOPPOSITEBANKNAME("")
|
|
|
- .FPrice(expenseOrderItemDO.getActualPrice())
|
|
|
- .FQty(expenseOrderItemDO.getCount())
|
|
|
- .FPOSTDATE(payTimeStr)
|
|
|
- .FRECNOTAXAMOUNTFOR(expenseOrderItemDO.getTotalAmount())
|
|
|
- .FRECNOTAXAMOUNT(expenseOrderItemDO.getTotalAmount())
|
|
|
- .FWRITTENOFFTAXAMOUNTFOR(expenseOrderItemDO.getTotalAmount())
|
|
|
- .FWRITTENOFFTAXAMOUNT(expenseOrderItemDO.getTotalAmount())
|
|
|
- .FCOSTID(KingdeeNumberDTO.builder().FNUMBER(FCOSTID).build())
|
|
|
- .FCOMMENT("")
|
|
|
- .build();
|
|
|
- freceivebillentryList.add(freceivebillentry);
|
|
|
+ normalAmount = normalAmount.add(expenseOrderItemDO.getTotalAmount());
|
|
|
}
|
|
|
- ReceiveBillSaveModelDTO saveModelDTO = ReceiveBillSaveModelDTO.builder()
|
|
|
- .FID(fid)
|
|
|
- .FBillNo(FBillNo)
|
|
|
- .FBillTypeID(KingdeeNumberDTO.builder().FNUMBER("SKDLX01_SYS").build())
|
|
|
- .FPAYORGID(KingdeeNumberDTO.builder().FNUMBER(kingedeeTenantId).build())
|
|
|
- .FDATE(payTimeStr)
|
|
|
- .FCONTACTUNITTYPE("BD_Customer")
|
|
|
- .FCONTACTUNIT(KingdeeNumberDTO.builder().FNUMBER(kingedeeCustomerId).build())
|
|
|
- .FPAYUNITTYPE("BD_Customer")
|
|
|
- .FPAYUNIT(KingdeeNumberDTO.builder().FNUMBER(kingedeeCustomerId).build())
|
|
|
- .FCURRENCYID(KingdeeNumberDTO.builder().FNUMBER(FMAINBOOKSTDCURRID.get()).build())
|
|
|
- .FEXCHANGERATE(new BigDecimal("1.0"))
|
|
|
- .FSETTLECUR(KingdeeNumberDTO.builder().FNUMBER(FMAINBOOKSTDCURRID.get()).build())
|
|
|
- .FSETTLERATE(new BigDecimal("1.0"))
|
|
|
- .FISINIT(Boolean.FALSE.toString())
|
|
|
- .FISCARRYRATE(Boolean.FALSE.toString())
|
|
|
- .FDOCUMENTSTATUS("Z")
|
|
|
- .FBUSINESSTYPE("1")
|
|
|
- .FCancelStatus("A")
|
|
|
- .FSETTLEMAINBOOKID(KingdeeNumberDTO.builder().FNUMBER(FMAINBOOKSTDCURRID.get()).build())
|
|
|
- .FRECEIVEBILLENTRY(freceivebillentryList)
|
|
|
- .FBUSINESSTYPE("FY")
|
|
|
- .build();
|
|
|
- ReceiveBillSaveDTO saveDTO = ReceiveBillSaveDTO.builder()
|
|
|
- .IsDeleteEntry(Boolean.TRUE.toString())
|
|
|
- .IsVerifyBaseDataField(Boolean.FALSE.toString())
|
|
|
- .IsEntryBatchFill(Boolean.TRUE.toString())
|
|
|
- .ValidateFlag(Boolean.TRUE.toString())
|
|
|
- .NumberSearch(Boolean.TRUE.toString())
|
|
|
- .IsAutoAdjustField(Boolean.FALSE.toString())
|
|
|
- .InterationFlags("")
|
|
|
- .IgnoreInterationFlag("")
|
|
|
- .IsControlPrecision(Boolean.FALSE.toString())
|
|
|
- .ValidateRepeatJson(Boolean.FALSE.toString())
|
|
|
- .model(saveModelDTO)
|
|
|
- .build();
|
|
|
- Gson gson = new Gson();
|
|
|
- // 将ReceivableSaveDTO转换成json字符串
|
|
|
- String json = gson.toJson(saveDTO);
|
|
|
- System.out.println("json = " + json);
|
|
|
+
|
|
|
+ boolean needPushNormal = normalAmount.compareTo(BigDecimal.ZERO) != 0;
|
|
|
+ boolean needPushFacility = facilityAmount.compareTo(BigDecimal.ZERO) != 0;
|
|
|
+ boolean needPushDeposit = depositAmount.compareTo(BigDecimal.ZERO) != 0;
|
|
|
+ if (!needPushNormal && !needPushFacility && !needPushDeposit) {
|
|
|
+ msg.append(elderlyInfoDO.getElderName()).append(",").append(expenseOrderDO.getBillingMonth()).append("账单无可推送收款明细<br/>");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ boolean allSuccess = true;
|
|
|
try {
|
|
|
- String billId = arReceivebillSave(getK3CloudApi(tenantId), json, expenseOrderDO.getBillOrderNumber(), elderId,tenantId);
|
|
|
+ if (needPushNormal) {
|
|
|
+ List<ReceiveBillSaveEntryDTO> normalEntryList = Collections.singletonList(
|
|
|
+ buildReceiveBillEntry(FACCOUNTID, payTimeStr, normalAmount, "CI001", "SFKYT01_SYS", "长者生活费")
|
|
|
+ );
|
|
|
+ String billId = pushReceiveBill(tenantId, elderId, expenseOrderDO.getBillOrderNumber(), baseBillNo,
|
|
|
+ kingedeeTenantId, kingedeeCustomerId, payTimeStr, currency, normalEntryList);
|
|
|
+ if (StringUtils.isBlank(billId)) {
|
|
|
+ allSuccess = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (needPushFacility) {
|
|
|
+ List<ReceiveBillSaveEntryDTO> facilityEntryList = Collections.singletonList(
|
|
|
+ buildReceiveBillEntry(FACCOUNTID, payTimeStr, facilityAmount, "CI005", "SFKYT02_SYS", "设施费")
|
|
|
+ );
|
|
|
+ String billId = pushReceiveBill(tenantId, elderId, expenseOrderDO.getBillOrderNumber() + "-SSF", baseBillNo + "-SSF",
|
|
|
+ kingedeeTenantId, kingedeeCustomerId, payTimeStr, currency, facilityEntryList);
|
|
|
+ if (StringUtils.isBlank(billId)) {
|
|
|
+ allSuccess = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (needPushDeposit) {
|
|
|
+ List<ReceiveBillSaveEntryDTO> depositEntryList = Collections.singletonList(
|
|
|
+ buildReceiveBillEntry(FACCOUNTID, payTimeStr, depositAmount, "CI002", "SFKYT41_SYS", "押金")
|
|
|
+ );
|
|
|
+ String billId = pushReceiveBill(tenantId, elderId, expenseOrderDO.getBillOrderNumber() + "-YJ", baseBillNo + "-YJ",
|
|
|
+ kingedeeTenantId, kingedeeCustomerId, payTimeStr, currency, depositEntryList);
|
|
|
+ if (StringUtils.isBlank(billId)) {
|
|
|
+ allSuccess = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
msg.append(elderlyInfoDO.getElderName()).append(",").append(expenseOrderDO.getBillingMonth()).append("账单推送金蝶收款单");
|
|
|
- if(StringUtils.isBlank(billId)){
|
|
|
+ if (!allSuccess) {
|
|
|
msg.append("失败。<br/>");
|
|
|
- }else {
|
|
|
+ } else {
|
|
|
msg.append("成功。<br/>");
|
|
|
expenseOrderDO.setIsPushKingdeeReceiveBill(Boolean.TRUE);
|
|
|
successSet.add(expenseOrderDO);
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
- // 把异常前的成功记录更新为已推送
|
|
|
- if(successSet.size() > 0){
|
|
|
+ if (successSet.size() > 0) {
|
|
|
orderMapper.updateBatch(successSet);
|
|
|
}
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
}
|
|
|
- // 把异常前的成功记录更新为已推送
|
|
|
- if(successSet.size() > 0){
|
|
|
+ if (successSet.size() > 0) {
|
|
|
orderMapper.updateBatch(successSet);
|
|
|
}
|
|
|
return msg.toString();
|
|
|
}
|
|
|
|
|
|
+ private ReceiveBillSaveEntryDTO buildReceiveBillEntry(String accountId, String payTimeStr, BigDecimal amount,
|
|
|
+ String costId, String purposeId, String comment) {
|
|
|
+ return ReceiveBillSaveEntryDTO.builder()
|
|
|
+ .FSETTLETYPEID(KingdeeNumberDTO.builder().FNUMBER("JSFS04_SYS").build())
|
|
|
+ .FPURPOSEID(KingdeeNumberDTO.builder().FNUMBER(purposeId).build())
|
|
|
+ .FRECTOTALAMOUNTFOR(amount)
|
|
|
+ .FRECAMOUNTFOR_E(amount)
|
|
|
+ .FRECNOTAXAMOUNTFOR(amount)
|
|
|
+ .FSETTLEDISTAMOUNTFOR(BigDecimal.ZERO)
|
|
|
+ .FHANDLINGCHARGEFOR(BigDecimal.ZERO)
|
|
|
+ .FOVERUNDERAMOUNTFOR(BigDecimal.ZERO)
|
|
|
+ .FACCOUNTID(KingdeeNumberDTO.builder().FNUMBER(accountId).build())
|
|
|
+ .FOPPOSITEBANKACCOUNT("")
|
|
|
+ .FOPPOSITEBANKNAME("")
|
|
|
+ .FPrice(amount)
|
|
|
+ .FQty(1)
|
|
|
+ .FPOSTDATE(payTimeStr)
|
|
|
+ .FRECNOTAXAMOUNT(amount)
|
|
|
+ .FWRITTENOFFTAXAMOUNTFOR(amount)
|
|
|
+ .FWRITTENOFFTAXAMOUNT(amount)
|
|
|
+ .FCOSTID(KingdeeNumberDTO.builder().FNUMBER(costId).build())
|
|
|
+ .FCOMMENT(comment)
|
|
|
+ .build();
|
|
|
+ }
|
|
|
+
|
|
|
+ private String pushReceiveBill(Long tenantId, Long elderId, String recordBillNo, String kdBillNo,
|
|
|
+ String kingedeeTenantId, String kingedeeCustomerId, String payTimeStr,
|
|
|
+ String currency, List<ReceiveBillSaveEntryDTO> entryList) throws Exception {
|
|
|
+ ReceiveBillSaveModelDTO saveModelDTO = ReceiveBillSaveModelDTO.builder()
|
|
|
+ .FID("")
|
|
|
+ .FBillNo(kdBillNo)
|
|
|
+ .FBillTypeID(KingdeeNumberDTO.builder().FNUMBER("SKDLX01_SYS").build())
|
|
|
+ .FPAYORGID(KingdeeNumberDTO.builder().FNUMBER(kingedeeTenantId).build())
|
|
|
+ .FDATE(payTimeStr)
|
|
|
+ .FCONTACTUNITTYPE("BD_Customer")
|
|
|
+ .FCONTACTUNIT(KingdeeNumberDTO.builder().FNUMBER(kingedeeCustomerId).build())
|
|
|
+ .FPAYUNITTYPE("BD_Customer")
|
|
|
+ .FPAYUNIT(KingdeeNumberDTO.builder().FNUMBER(kingedeeCustomerId).build())
|
|
|
+ .FCURRENCYID(KingdeeNumberDTO.builder().FNUMBER(currency).build())
|
|
|
+ .FEXCHANGERATE(new BigDecimal("1.0"))
|
|
|
+ .FSETTLECUR(KingdeeNumberDTO.builder().FNUMBER(currency).build())
|
|
|
+ .FSETTLERATE(new BigDecimal("1.0"))
|
|
|
+ .FISINIT(Boolean.FALSE.toString())
|
|
|
+ .FISCARRYRATE(Boolean.FALSE.toString())
|
|
|
+ .FDOCUMENTSTATUS("Z")
|
|
|
+ .FBUSINESSTYPE("FY")
|
|
|
+ .FCancelStatus("A")
|
|
|
+ .FSETTLEMAINBOOKID(KingdeeNumberDTO.builder().FNUMBER(currency).build())
|
|
|
+ .FRECEIVEBILLENTRY(entryList)
|
|
|
+ .build();
|
|
|
+ ReceiveBillSaveDTO saveDTO = ReceiveBillSaveDTO.builder()
|
|
|
+ .IsDeleteEntry(Boolean.TRUE.toString())
|
|
|
+ .IsVerifyBaseDataField(Boolean.FALSE.toString())
|
|
|
+ .IsEntryBatchFill(Boolean.TRUE.toString())
|
|
|
+ .ValidateFlag(Boolean.TRUE.toString())
|
|
|
+ .NumberSearch(Boolean.TRUE.toString())
|
|
|
+ .IsAutoAdjustField(Boolean.FALSE.toString())
|
|
|
+ .InterationFlags("")
|
|
|
+ .IgnoreInterationFlag("")
|
|
|
+ .IsControlPrecision(Boolean.FALSE.toString())
|
|
|
+ .ValidateRepeatJson(Boolean.FALSE.toString())
|
|
|
+ .model(saveModelDTO)
|
|
|
+ .build();
|
|
|
+ Gson gson = new Gson();
|
|
|
+ String json = gson.toJson(saveDTO);
|
|
|
+ System.out.println("json = " + json);
|
|
|
+ return arReceivebillSave(getK3CloudApi(tenantId), json, recordBillNo, elderId, tenantId);
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public K3CloudApi getK3CloudApi(Long tenantId) {
|
|
|
SocialTypeEnum environment = SocialTypeEnum.KINGDEE_PRODUCT;
|