From 64ae4941db1f3db3913d6c71ad5ab630e4a4c3cf Mon Sep 17 00:00:00 2001 From: linfso Date: Thu, 25 Jul 2024 07:29:26 +0800 Subject: [PATCH] md --- .../web/emis/EmisSettleBillController.java | 54 ++- .../emis/EmisSettlePayRecordController.java | 26 +- .../emis/domain/EmisSettleInvoiceRecord.java | 17 +- .../mapper/EmisSettleInvoiceRecordMapper.java | 5 +- .../mapper/EmisSettlePayRecordMapper.java | 5 +- .../erp/emis/mapper/EmisWaybillMapper.java | 3 + .../erp/emis/service/EmisBaseService.java | 1 - .../emis/service/IEmisSettleBillService.java | 4 +- .../IEmisSettleInvoiceRecordService.java | 5 +- .../service/IEmisSettlePayRecordService.java | 5 +- .../impl/EmisSettleBillServiceImpl.java | 37 +- .../EmisSettleInvoiceRecordServiceImpl.java | 72 ++- .../impl/EmisSettlePayRecordServiceImpl.java | 105 ++++- .../service/openbill/OpenBillService.java | 20 + .../service/openbill/hx/HXOrderGoods.java | 27 ++ .../emis/service/openbill/hx/HXOrderInfo.java | 378 ++++++++++++++++ .../erp/emis/service/openbill/hx/HXSdk.java | 421 ++++++++++++++++++ .../service/openbill/hx/OpenServiceDemo.java | 41 ++ .../openbill/hx/OrderReceiveInfoRequest.java | 23 + .../xdadan/erp/emis/utils/WaybillHelper.java | 15 + .../mapper/EmisSettleInvoiceRecordMapper.xml | 20 +- .../mapper/EmisSettleInvoiceRelMapper.xml | 2 +- .../mapper/EmisSettlePayRecordMapper.xml | 12 +- .../mapper/EmisSettlePayRelMapper.xml | 2 +- .../resources/mapper/EmisWaybillMapper.xml | 6 + 25 files changed, 1269 insertions(+), 37 deletions(-) create mode 100644 emis-biz/src/main/java/com/xdadan/erp/emis/service/openbill/OpenBillService.java create mode 100644 emis-biz/src/main/java/com/xdadan/erp/emis/service/openbill/hx/HXOrderGoods.java create mode 100644 emis-biz/src/main/java/com/xdadan/erp/emis/service/openbill/hx/HXOrderInfo.java create mode 100644 emis-biz/src/main/java/com/xdadan/erp/emis/service/openbill/hx/HXSdk.java create mode 100644 emis-biz/src/main/java/com/xdadan/erp/emis/service/openbill/hx/OpenServiceDemo.java create mode 100644 emis-biz/src/main/java/com/xdadan/erp/emis/service/openbill/hx/OrderReceiveInfoRequest.java diff --git a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisSettleBillController.java b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisSettleBillController.java index 80991cfde..4a64a8ac3 100644 --- a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisSettleBillController.java +++ b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisSettleBillController.java @@ -215,6 +215,39 @@ public class EmisSettleBillController extends BaseController } + /** + * 站点确认账单 + */ + @Log(title = "站点确认账单", businessType = BusinessType.UPDATE) + @PostMapping("/confirmSettleBillBySite/{ids}") + public AjaxResult confirmSettleBillBySite(@PathVariable Long[] ids) + { + if(ids!=null && ids.length>0){ + for(int i=0;i0){ + for(int i=0;i selectEmisSettleInvoiceRecordList(EmisSettleInvoiceRecord emisSettleInvoiceRecord); - /** + public List selectInvoiceRecordListBySettleBillNo(String settleBillNo); + + + /** * 检查是否重复 * * @param emisSettleInvoiceRecord diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisSettlePayRecordMapper.java b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisSettlePayRecordMapper.java index 837ce11b3..b75f7f58d 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisSettlePayRecordMapper.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisSettlePayRecordMapper.java @@ -37,7 +37,10 @@ public interface EmisSettlePayRecordMapper extends BaseMapper selectEmisSettlePayRecordList(EmisSettlePayRecord emisSettlePayRecord); - /** + public List selectSettlePayRecordListBySettleBillNo(String settleBillNo); + + + /** * 检查是否重复 * * @param emisSettlePayRecord diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisWaybillMapper.java b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisWaybillMapper.java index 9f52d41af..f81a10c32 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisWaybillMapper.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisWaybillMapper.java @@ -130,6 +130,9 @@ public interface EmisWaybillMapper extends BaseMapper // 更新为签收 public int updateSignStatus(EmisWaybill emisWaybill); + // 更新为已付款 + public int updatePayedStatus(EmisWaybill emisWaybill); + // 删除签收状态 public int updateUnSignStatus(EmisWaybill emisWaybill); diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/EmisBaseService.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/EmisBaseService.java index aa3e973f4..a8c2f7165 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/EmisBaseService.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/EmisBaseService.java @@ -1175,7 +1175,6 @@ public class EmisBaseService { emisSiteSettleRecord.setCustomerCode(dt.getCustomerCode()); addSiteSettleRecord(emisSiteSettleRecord); - // 增加财务中心的收入 // 财务中心 diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisSettleBillService.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisSettleBillService.java index a07de397f..77ccb4e19 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisSettleBillService.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisSettleBillService.java @@ -76,7 +76,7 @@ public interface IEmisSettleBillService * @param ids 需要删除的结算总账单主键集合 * @return 结果 */ - public int deleteEmisSettleBillByIds(Long[] ids); + public int deleteEmisSettleBillByIds(Long[] ids) throws EmisBizError; /** * 删除结算总账单信息 @@ -84,5 +84,5 @@ public interface IEmisSettleBillService * @param id 结算总账单主键 * @return 结果 */ - public int deleteEmisSettleBillById(Long id); + public int deleteEmisSettleBillById(Long id) throws EmisBizError; } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisSettleInvoiceRecordService.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisSettleInvoiceRecordService.java index 1404189eb..52bb873b4 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisSettleInvoiceRecordService.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisSettleInvoiceRecordService.java @@ -11,8 +11,9 @@ package com.xdadan.erp.emis.service; import java.util.List; import com.xdadan.erp.emis.domain.EmisSettleInvoiceRecord; +import com.xdadan.erp.emis.domain.exception.EmisBizError; -/** + /** * @ClassName EmisSettleInvoiceRecordService * @Description 开票记录表 * @author linfso @@ -50,7 +51,7 @@ public interface IEmisSettleInvoiceRecordService * @param emisSettleInvoiceRecord 开票记录表 * @return 结果 */ - public int insertEmisSettleInvoiceRecord(EmisSettleInvoiceRecord emisSettleInvoiceRecord); + public int insertEmisSettleInvoiceRecord(EmisSettleInvoiceRecord emisSettleInvoiceRecord) throws EmisBizError; /** * 修改开票记录表 diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisSettlePayRecordService.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisSettlePayRecordService.java index f19a6d998..e7f88df5a 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisSettlePayRecordService.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisSettlePayRecordService.java @@ -11,8 +11,9 @@ package com.xdadan.erp.emis.service; import java.util.List; import com.xdadan.erp.emis.domain.EmisSettlePayRecord; +import com.xdadan.erp.emis.domain.exception.EmisBizError; -/** + /** * @ClassName EmisSettlePayRecordService * @Description 账单收退款记录 * @author linfso @@ -50,7 +51,7 @@ public interface IEmisSettlePayRecordService * @param emisSettlePayRecord 账单收退款记录 * @return 结果 */ - public int insertEmisSettlePayRecord(EmisSettlePayRecord emisSettlePayRecord); + public int insertEmisSettlePayRecord(EmisSettlePayRecord emisSettlePayRecord) throws EmisBizError; /** * 修改账单收退款记录 diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettleBillServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettleBillServiceImpl.java index 2db6a8fa3..2b8f54e9d 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettleBillServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettleBillServiceImpl.java @@ -97,6 +97,9 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS throw new EmisBizError(EmisBizErrorType.FAIL,"合账失败,未选择子账单"); } + // 生成账单号 + emisSettleBill.setSettleBillNo(WaybillHelper.genSettleBillNo()); + // 计算应收总账单金额 // 检查子账单是否可加入 BigDecimal totalRecMoney = BigDecimal.ZERO; @@ -264,7 +267,7 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS /** * 总账单重算 - * @param emisSettleBill + * @param old * @return * @throws EmisBizError */ @@ -345,9 +348,11 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS * @return 结果 */ @Override - public int deleteEmisSettleBillByIds(Long[] ids) - { - return emisSettleBillMapper.deleteEmisSettleBillByIds(ids); + public int deleteEmisSettleBillByIds(Long[] ids) throws EmisBizError { + for(Long id:ids){ + deleteEmisSettleBillById(id); + } + return 1; } /** @@ -357,8 +362,28 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS * @return 结果 */ @Override - public int deleteEmisSettleBillById(Long id) - { + public int deleteEmisSettleBillById(Long id) throws EmisBizError { + // 获取 + EmisSettleBill bill = selectEmisSettleBillById(id); + if(!"0".equals(bill.getPaymentStatus())){ + throw new EmisBizError(EmisBizErrorType.FAIL,"已收款不允许删除"); + } + + if(!"0".equals(bill.getBlConfirmSite())){ + throw new EmisBizError(EmisBizErrorType.FAIL,"业务已确认不允许删除"); + } + + if(!"0".equals(bill.getOpenBillStatus())){ + throw new EmisBizError(EmisBizErrorType.FAIL,"已开票已确认不允许删除"); + } + + // 清除子账单关联 + List listSubBill=selectSubBillListBySettleBillNo(bill.getSettleBillNo()); + for (EmisSettleSubBill subBllOld:listSubBill) { + subBllOld.setSettleBillNo(bill.getSettleBillNo()); + emisSettleSubBillMapper.removeFromMainSettleBill(subBllOld); + } + return emisSettleBillMapper.deleteEmisSettleBillById(id); } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettleInvoiceRecordServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettleInvoiceRecordServiceImpl.java index 16382007a..1f77628c4 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettleInvoiceRecordServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettleInvoiceRecordServiceImpl.java @@ -10,10 +10,16 @@ package com.xdadan.erp.emis.service.impl; +import java.math.BigDecimal; import java.util.List; + +import com.xdadan.erp.emis.domain.*; +import com.xdadan.erp.emis.domain.enumtype.EmisBizErrorType; +import com.xdadan.erp.emis.domain.exception.EmisBizError; +import com.xdadan.erp.emis.mapper.EmisSettleBillMapper; +import com.xdadan.erp.emis.service.EmisBaseService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.xdadan.erp.emis.domain.EmisSettleInvoiceRecord; import com.xdadan.erp.emis.mapper.EmisSettleInvoiceRecordMapper; import com.xdadan.erp.emis.service.IEmisSettleInvoiceRecordService; @@ -24,11 +30,14 @@ import com.xdadan.erp.emis.service.IEmisSettleInvoiceRecordService; * @date 2024-07-21 13:31:26 */ @Service -public class EmisSettleInvoiceRecordServiceImpl implements IEmisSettleInvoiceRecordService +public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implements IEmisSettleInvoiceRecordService { @Autowired private EmisSettleInvoiceRecordMapper emisSettleInvoiceRecordMapper; + @Autowired + private EmisSettleBillMapper emisSettleBillMapper; + /** * 查询开票记录表 * @@ -73,9 +82,62 @@ public class EmisSettleInvoiceRecordServiceImpl implements IEmisSettleInvoiceRec * @return 结果 */ @Override - public int insertEmisSettleInvoiceRecord(EmisSettleInvoiceRecord emisSettleInvoiceRecord) - { - return emisSettleInvoiceRecordMapper.insertEmisSettleInvoiceRecord(emisSettleInvoiceRecord); + public int insertEmisSettleInvoiceRecord(EmisSettleInvoiceRecord emisSettleInvoiceRecord) throws EmisBizError { + // 判断对应账单是否存在 + EmisSettleBill emisSettleBill=getSettleBillBySettleBillNo(emisSettleInvoiceRecord.getSettleBillNo()); + if(emisSettleBill==null){ + throw new EmisBizError(EmisBizErrorType.FAIL,"账单不存在"); + } + + if(!"1".equals(emisSettleBill.getBlConfirmSite())){ + throw new EmisBizError(EmisBizErrorType.FAIL,"业务账单未确认"); + } + + // 插入发票记录 + emisSettleInvoiceRecordMapper.insertEmisSettleInvoiceRecord(emisSettleInvoiceRecord); + + // 重算账单已开票金额 + reCalcSettleBillInvoiceInfo(emisSettleInvoiceRecord.getSettleBillNo()); + + return 1; + } + + /** + * 重算账单收款金额 + * @param settleBillNo + * @return + */ + private int reCalcSettleBillInvoiceInfo(String settleBillNo){ + + EmisSettleBill oldBill =getSettleBillBySettleBillNo(settleBillNo); + // 获取开票记录 + List invoiceRecordList=emisSettleInvoiceRecordMapper.selectInvoiceRecordListBySettleBillNo(settleBillNo); + // 计算已开票金额 + BigDecimal totalMoney = BigDecimal.ZERO; + + for(EmisSettleInvoiceRecord item:invoiceRecordList){ + totalMoney=totalMoney.add(item.getApplyMoney()); + } + + EmisSettleBill newBill = new EmisSettleBill(); + newBill.setId(oldBill.getId()); + newBill.setOpenBillStatus("1"); + + // 更新账单收款状态 + emisSettleBillMapper.updateEmisSettleBill(newBill); + + // 更新子账单的收款状态 + // 如果全部付款则更新运单的付款状态 +// if(rstDif>=0){ +// List listSubBill=emisSettleSubBillMapper.selectSubBillListBySettleBillNo(settleBillNo); +// for (EmisSettleSubBill subBill:listSubBill) { +// EmisWaybill emisWaybill = new EmisWaybill(); +// emisWaybill.setBillCode(subBill.getBillCode()); +// emisWaybillMapper.updatePayedStatus(emisWaybill); +// } +// } + + return 1; } /** diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettlePayRecordServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettlePayRecordServiceImpl.java index fead2e733..db4541321 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettlePayRecordServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettlePayRecordServiceImpl.java @@ -10,9 +10,19 @@ package com.xdadan.erp.emis.service.impl; +import java.math.BigDecimal; import java.util.List; +import com.xdadan.erp.emis.domain.EmisSettleBill; +import com.xdadan.erp.emis.domain.EmisSettleSubBill; +import com.xdadan.erp.emis.domain.EmisWaybill; +import com.xdadan.erp.emis.domain.enumtype.EmisBizErrorType; +import com.xdadan.erp.emis.domain.exception.EmisBizError; +import com.xdadan.erp.emis.mapper.EmisSettleBillMapper; +import com.xdadan.erp.emis.mapper.EmisSettleSubBillMapper; +import com.xdadan.erp.emis.service.EmisBaseService; import com.xdadan.erp.emis.utils.WaybillHelper; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.xdadan.erp.emis.domain.EmisSettlePayRecord; @@ -26,11 +36,19 @@ import com.xdadan.erp.emis.service.IEmisSettlePayRecordService; * @date 2024-07-21 13:31:24 */ @Service -public class EmisSettlePayRecordServiceImpl implements IEmisSettlePayRecordService +public class EmisSettlePayRecordServiceImpl extends EmisBaseService implements IEmisSettlePayRecordService { @Autowired private EmisSettlePayRecordMapper emisSettlePayRecordMapper; + @Autowired + private EmisSettleBillMapper emisSettleBillMapper; + + @Autowired + private EmisSettleSubBillMapper emisSettleSubBillMapper; + + + /** * 查询账单收退款记录 * @@ -75,11 +93,88 @@ public class EmisSettlePayRecordServiceImpl implements IEmisSettlePayRecordServi * @return 结果 */ @Override - public int insertEmisSettlePayRecord(EmisSettlePayRecord emisSettlePayRecord) - { - String payId= "PM"+WaybillHelper.genPayId(); + public int insertEmisSettlePayRecord(EmisSettlePayRecord emisSettlePayRecord) throws EmisBizError { + + if(StringUtils.isEmpty(emisSettlePayRecord.getSettleBillNo())){ + throw new EmisBizError(EmisBizErrorType.FAIL,"账单编号不能为空"); + } + + // 不重复的 id流水号 + String payId= WaybillHelper.genPayId(); emisSettlePayRecord.setPayId(payId); - return emisSettlePayRecordMapper.insertEmisSettlePayRecord(emisSettlePayRecord); + // 插入数据 + emisSettlePayRecordMapper.insertEmisSettlePayRecord(emisSettlePayRecord); + + // 重新计算账单收款信息 + reCalcSettleBillPayrecordInfo(emisSettlePayRecord.getSettleBillNo()); + + return 1; + } + + + /** + * 重算账单收款金额 + * @param settleBillNo + * @return + */ + private int reCalcSettleBillPayrecordInfo(String settleBillNo){ + + EmisSettleBill oldBill =getSettleBillBySettleBillNo(settleBillNo); + // 获取收款记录 + List payRecordList=emisSettlePayRecordMapper.selectSettlePayRecordListBySettleBillNo(settleBillNo); + // 计算已收款金额 + BigDecimal totalPayMoney = BigDecimal.ZERO; + // 抵扣金额 + + BigDecimal satisfyMoney = BigDecimal.ZERO; + /* allowance_money */ + BigDecimal allowanceMoney = BigDecimal.ZERO; + /* deduction_money */ + BigDecimal deductionMoney = BigDecimal.ZERO; + /* other_money */ + BigDecimal otherMoney = BigDecimal.ZERO; + + for(EmisSettlePayRecord item:payRecordList){ + totalPayMoney=totalPayMoney.add(item.getPayMoney()); + satisfyMoney=satisfyMoney.add(item.getSatisfyMoney()==null?BigDecimal.ZERO:item.getSatisfyMoney()); + allowanceMoney=allowanceMoney.add(item.getAllowanceMoney()==null?BigDecimal.ZERO:item.getAllowanceMoney()); + deductionMoney=deductionMoney.add(item.getDeductionMoney()==null?BigDecimal.ZERO:item.getDeductionMoney()); + otherMoney=otherMoney.add(item.getOtherMoney()==null?BigDecimal.ZERO:item.getOtherMoney()); + } + + EmisSettleBill newBill = new EmisSettleBill(); + newBill.setId(oldBill.getId()); + newBill.setRecedMoney(totalPayMoney); + newBill.setSatisfyMoney(satisfyMoney); + newBill.setAllowanceMoney(allowanceMoney); + newBill.setOtherMoney(otherMoney); + + // 判断收款状态 收款金额 + int rstDif=totalPayMoney.compareTo(oldBill.getRecMoney()); + if( rstDif >= 0 ){ + // 已收款 + newBill.setPaymentStatus("1"); + } + else{ + // 部分收款 + newBill.setPaymentStatus("2"); + } + + // 更新账单收款状态 + emisSettleBillMapper.updateEmisSettleBill(newBill); + + // 更新子账单的收款状态 + // 如果全部付款则更新运单的付款状态 + if(rstDif>=0){ + List listSubBill=emisSettleSubBillMapper.selectSubBillListBySettleBillNo(settleBillNo); + for (EmisSettleSubBill subBill:listSubBill) { + EmisWaybill emisWaybill = new EmisWaybill(); + emisWaybill.setBillCode(subBill.getBillCode()); + emisWaybillMapper.updatePayedStatus(emisWaybill); + } + } + + return 1; } /** diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/openbill/OpenBillService.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/openbill/OpenBillService.java new file mode 100644 index 000000000..f2b35631e --- /dev/null +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/openbill/OpenBillService.java @@ -0,0 +1,20 @@ +package com.xdadan.erp.emis.service.openbill; + + +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONObject; +import com.xdadan.erp.emis.service.openbill.hx.HXOrderInfo; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Service +@Slf4j +public class OpenBillService { + + + + + +} diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/openbill/hx/HXOrderGoods.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/openbill/hx/HXOrderGoods.java new file mode 100644 index 000000000..58349a1a7 --- /dev/null +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/openbill/hx/HXOrderGoods.java @@ -0,0 +1,27 @@ +package com.xdadan.erp.emis.service.openbill.hx; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class HXOrderGoods implements Serializable { + + private String goodsName; + private String goodsCode; + private String specType; + private String unit; + private String price; + private String num; + private String taxRate; + private String withTaxFlag; +//30408020102 +// "goodsName": "测试商品11", +// "goodsCode": "1090511030000000000", +// "specType": "测试规格型号", +// "unit": "个", +// "price": "10", +// "num": "1", +// "taxRate": "0.06", +// "withTaxFlag": "1" +} diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/openbill/hx/HXOrderInfo.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/openbill/hx/HXOrderInfo.java new file mode 100644 index 000000000..2f6b35513 --- /dev/null +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/openbill/hx/HXOrderInfo.java @@ -0,0 +1,378 @@ +package com.xdadan.erp.emis.service.openbill.hx; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 待开订单信息请求参数 + * + * @author yxx + * @date 2022/11/25 + */ +@Data +public class HXOrderInfo implements Serializable { + + private static final long serialVersionUID = -255533932402763341L; + + /** + * 购方代码 + */ + private String buyerCode; + + /** + * 购方名称 + */ + private String buyerName; + + /** + * 购方税号(企业要填,个人可为空;数电专票、二手车销售统一发票时必填) + */ + private String buyerTaxNum; + + /** + * 购方电话(购方地址+电话总共不超100字符;二手车销售统一发票时必填 + */ + private String buyerTel; + + /** + * 购方地址(购方地址+电话总共不超100字符;二手车销售统一发票时必填 + */ + private String buyerAddress; + + /** + * 购方银行 + */ + private String buyerBank; + + /** + * 购方银行账号 + */ + private String buyerBankAccount; + + /** + * 销方代码 + */ + private String salerCode; + + /** + * 销方名称 + */ + private String salerName; + + /** + * 销方税号 + */ + private String salerTaxNum; + + /** + * 销方电话 + */ + private String salerTel; + + /** + * 销方地址 + */ + private String salerAddress; + + /** + * 销方银行 + */ + private String salerBank; + + /** + * 销方银行账号 + */ + private String salerBankAccount; + + /** + * 订单号(每个企业唯一) + */ + private String orderNo; + + /** + * 订单时间(销售日期) + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date orderDate; + + /** + * 冲红时填写的对应原蓝票发票代码(开红票不能为空,不满12位,请左补0) + */ + private String oldInvoiceCode; + + /** + * 冲红时填写的对应原蓝票发票号码(开红票不能为空,不满8位,请左补0) + */ + private String oldInvoiceNum; + + /** + * 冲红时填写的对应原蓝字数电纸票号码 + */ + private String oldDigitalElePaperInvoiceNo; + + /** + * 原蓝票开票时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date oldInvoiceDate; + + /** + * 冲红原因 1:销货退回;2:开票有误;3:服务中止;4:发生销售折让 + */ + private String redReason; + + /** + * 作废原因(数电纸票时需要传(1:销货退回;2:开票有误;3:服务中止;4:其他),默认 2) + */ + private String invalidReason; + /** + * 其他作废原因详情(数电纸票且作废原因选择4-其他时需要传) + */ + private String specificReason; + + /** + * 红字信息表编号/红字确认单编号 + */ + private String billInfoNo; + + /** + * 红字确认单uuid + */ + private String billUuid; + + /** + * 发票备注(冲红时,在备注中注明“对应正数发票代码:XXXXXXXXX号码:YYYYYYYY”文案,其中“X”为发票代码,“Y”为发票号码,可以不填,接口会自动添加该文案;机动车发票蓝票时备注只能为空;数电发票时最长为200字符) + */ + private String remark; + + /** + * 合并发票备注 + */ + private String mergeRemark; + + /** + * 购销方银行信息备注栏展示控制:0 不展示 1:展示购方信息 2:展示销方信息 3:展示购销方信息 + */ + private String showBankAccountType; + + /** + * 订单备注 + */ + private String orderRemark; + + /** + * 复核人 + */ + private String checker; + + /** + * 收款人 + */ + private String payee; + + /** + * 开票人ID(系统用户id) + */ + private Long clerkId; + + /** + * 开票员(数电发票时需要传入和开票登录账号对应的开票员姓名) + */ + private String clerk; + + /** + * 清单标志:Y-清单,N-非清单(默认),电票固定为N + */ + private String listFlag; + + /** + * 清单项目名称:对应发票票面项目名称(listFlag为Y时,必填,默认为“详见销货清单”) + */ + private String listName; + + /** + * 推送方式:-1-不推送, 0-邮箱, 1-手机(默认 ),2-邮箱+手机 + */ + private String pushMode; + + /** + * 交付手机(pushMode为1或2时,此项为 必填) + */ + private String deliverPhone; + + /** + * 交付邮箱(pushMode为0或2时,此项为 必填) + */ + private String deliverEmail; + + /** + * 开票类型:1-蓝票,2-红票(数电发票暂不支持红票) + */ + private String invoiceType; + + /** + * 发票种类:p,普通发票(电票)(默认);c,普通发票(纸票);s,专用发票;e,收购发票(电票);f,收购发票(纸质);r,普通发票(卷式);b,增值税电子专用发票;j,机动车销售统一发票;u,二手车销售统一发票;bs:电子发票(增值税专用发票)-即数电专票,pc:电子发票(普通发票)-即数电普票 + */ + private String invoiceLine; + + /** + * 特定要素代码 + */ + private String specificFactor; + + /** + * 分机号(只能为空或者数字) + */ + private String extensionNumber; + + /** + * 终端号(开票终端号,只能 为空或数字) + */ + private String terminalNumber; + + /** + * 机器编号(12位盘号) + */ + private String machineCode; + + /** + * 是否隐藏编码表版本号 N-否 Y-是(默认N,在企业资质中也配置为是隐藏的时候,并且此字段传Y的时候代开发票 税率显示***) + */ + private String hiddenBmbbbh; + + /** + * 指定开票发票代码(只有票种为:c或f时才有效,满足普票开二联、收购票开五联;nextInvoiceCode、nextInvoiceNum必须同时有值或同时为空) + */ + private String nextInvoiceCode; + + /** + * 指定开票发票号码(只有票种为:c或f时才有效,满足普票开二联、收购票开五联;nextInvoiceCode、nextInvoiceNum必须同时有值或同时为空 + */ + private String nextInvoiceNum; + + /** + * 购买方经办人姓名(数电发票特有字段) + */ + private String buyerManagerName; + + /** + * 经办人证件类型:101-组织机构代码证, 102-营业执照, 103-税务登记证, 199-其他单位证件, 201-居民身份证, 202-军官证, 203-武警警官证, 204-士兵证, 205-军队离退休干部证, 206-残疾人证, 207-残疾军人证(1-8级), 208-外国护照, 210-港澳居民来往内地通行证, 212-中华人民共和国往来港澳通行证, 213-台湾居民来往大陆通行证, 214-大陆居民往来台湾通行证, 215-外国人居留证, 216-外交官证 299-其他个人证件(数电发票特有) + */ + private String managerCardType; + + /** + * 经办人证件号码(数电发票特有字段) + */ + private String managerCardNo; + + /** + * 购买方自然人标志:0-否(默认),1-是;仅在开具数电普票(电子)时使用,如受票 方(发票抬头)为自然人 + * 并要求能将发票归集在个人票夹中展示,需提供姓名及身份证号(自然人纳税人识别号),此参数传入1;如受票方(发票抬头)为个体工 商户 + * 需提供社会统一信用代码或纳税人识别号,此参数传入0 + */ + private String naturalPersonFlag; + + /** + * 附加模版名称(数电发票特有字段,附加模版有值时需要添加附加要素信息列表对象,需要先在电子税局平台维护好模版 + */ + private String additionalElementName; + + /** + * 不含税金额 + */ + private BigDecimal exTaxAmount; + + /** + * 合计税额 + */ + private BigDecimal taxAmount; + + /** + * 价税合计 + */ + private BigDecimal orderAmount; + + /** + * 订单类型:1-销售单,0-退货单 + */ + private String orderType; + + /** + * 销售人id + */ + private Long saleMan; + + /** + * 销售人姓名 + */ + private String saleManName; + + /** + * 发货时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date deliveryTime; + + /** + * 单价含税标志:0-不含税,1-含税 + */ + private String withTaxFlag; + + /** + * 纸质发票票种代码 + */ + private String zpFppzDm; + + /** + * 差额征税类型代码 + */ + private String cezslxDm; + + /** + * 减按征收类型代码 + */ + private String jazslxDm; + + /** + * 差额凭证明细列表 + */ + private String cepzmxList; + + /** + * 特定要素明细列表 + */ + private String tdysmxList; + + /** + * 附加要素明细列表 + */ + private String fjysList; + + /** + * 备用字段1 + */ + private String def01; + + /** + * 备用字段2 + */ + private String def02; + + /** + * 备用字段3 + */ + private String def03; + + // ===========================明细信息 接口接收============================== + /** + * 商品明细信息 + */ + private List detailInfos; + +} + diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/openbill/hx/HXSdk.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/openbill/hx/HXSdk.java new file mode 100644 index 000000000..a4496fa22 --- /dev/null +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/openbill/hx/HXSdk.java @@ -0,0 +1,421 @@ +package com.xdadan.erp.emis.service.openbill.hx; + + +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class HXSdk { + + public static String HX_URLPREFIX="https://csfw.jsaisino.com/csapp/stms-saas-pc/"; + + /** + * 刷新对应税号的token + * @param taxNo + * @return + */ + /** + * 获取 token + * @param appKey + * @param secretKey + * @return + */ + public static String getToken(String appKey,String secretKey) { + // 开放平台对接URL固定前缀 + // 1、通过平台提供的appkey secretKey 获取token + // 2、建议蒋获取到的token塞入本地缓存 并设置有效期 7天 TODO + + String url = HX_URLPREFIX+"/open/service/getToken"; + JSONObject jObjPost = new JSONObject(); + jObjPost.put("appKey",appKey); + jObjPost.put("secretKey",secretKey); + HttpResponse response = HttpUtil.createGet(url).body(jObjPost.toJSONString()).execute(); + String result = response.body(); + + // {"code":"00000","data":"eyJhbGciOiJIUzUxMiJ9.eyJ1c2VySWQiOjE3ODI5NDA0OTc4NzIyMjgzNTMsImFjY291bnQiOiI5MTMyMDEwNE1BRDNMQkRLNEUiLCJ1dWlkIjoiZTljNzE1MjUtNmNlMi00OWI0LTg4M2QtN2MwMDI5ZDg0MDRmIiwicmVtZW1iZXJNZSI6ZmFsc2UsImV4cGlyYXRpb25EYXRlIjoxNzIyNDAwMjY4NzI5LCJjYVRva2VuIjpudWxsLCJ0ZW5hbnRDb2RlIjoiOTEzMjAxMDRNQUQzTEJESzRFIiwib3RoZXJzIjpudWxsLCJzdWIiOiIxNzgyOTQwNDk3ODcyMjI4MzUzIiwiaWF0IjoxNzIxNzk1NDY4LCJleHAiOjE3MjI0MDAyNjh9.2GNaRyRTGNPxUzEECvnwBbDd6AR1fb-GRwJDAouEVf-dm__u0epLKBKRF1GxIFYUh8NjPdhmoRIUwm1b8jFgOA","success":true,"message":"请求成功"} + + + JSONObject jRstObj = JSONObject.parseObject(result); + String token = null; + + if("00000".equals(jRstObj.getString("code"))){ + token =jRstObj.getString("data"); + } + + + return token; + } + + + public static boolean isLoginSuccess(String token){ + + boolean isLoginSuccess=false; + String url = HX_URLPREFIX+"/open/service/isLoginSucceeded"; + HttpResponse response = HttpUtil.createGet(url).header("Authorization", token).body("{}").execute(); + String result = response.body(); +// {"success":true,"code":"00000","message":"请求成功","data":false} + JSONObject jRstObj = JSONObject.parseObject(result); + + if("00000".equals(jRstObj.getString("code"))){ + isLoginSuccess =jRstObj.getBoolean("data"); + } + return isLoginSuccess; + } + + public static boolean firstLogin(String account,String token){ + + String url = HX_URLPREFIX+"/open/service/firstLogin"; + JSONObject jObjPost = new JSONObject(); + jObjPost.put("account",account); + HttpResponse response = HttpUtil.createGet(url).header("Authorization", token).body(jObjPost.toJSONString()).execute(); + String result = response.body(); + JSONObject jRstObj = JSONObject.parseObject(result); + if("00000".equals(jRstObj.getString("code"))){ + return jRstObj.getBoolean("status"); + } + +// status string Y 1 短信验证状态 是否需要手机验证码验证: +// 1 是 +// 0 否 +// mobile string Y 11 + + return false; + } + + public static boolean secondLogin(String account,String smsCode,String token){ + + String url = HX_URLPREFIX+"/open/service/secondLogin"; + JSONObject jObjPost = new JSONObject(); + jObjPost.put("account",account); + jObjPost.put("smsCode",smsCode); + HttpResponse response = HttpUtil.createGet(url).header("Authorization", token).body(jObjPost.toJSONString()).execute(); + String result = response.body(); + JSONObject jRstObj = JSONObject.parseObject(result); + if("00000".equals(jRstObj.getString("code"))){ + return jRstObj.getBoolean("data"); + } +// data string Y true 成功 false :失败 + + return false; + } + + public static boolean getNsrBaseInfo(String account,String smsCode,String token){ + + String url = HX_URLPREFIX+"/open/service/getNsrBaseInfo"; + JSONObject jObjPost = new JSONObject(); + jObjPost.put("account",account); + jObjPost.put("smsCode",smsCode); + HttpResponse response = HttpUtil.createGet(url).header("Authorization", token).body(jObjPost.toJSONString()).execute(); + String result = response.body(); + JSONObject jRstObj = JSONObject.parseObject(result); + if("00000".equals(jRstObj.getString("code"))){ + return jRstObj.getBoolean("data"); + } +// data string Y true 成功 false :失败 + + return false; + } + + /** + * + * @param account + * @return + */ + public static JSONObject etaxAccountStatus(String account,String token){ + + String url = HX_URLPREFIX+"/open/service/etaxAccountStatus"; + JSONObject jObjPost = new JSONObject(); + jObjPost.put("account",account); + HttpResponse response = HttpUtil.createGet(url).header("Authorization", token).body(jObjPost.toJSONString()).execute(); + String result = response.body(); + JSONObject jRstObj = JSONObject.parseObject(result); + return jRstObj; + + /* + 1 account string Y 数电账号 + 2 isLogin boolean Y true:登录成功, + false:登录失败 + 3 isAuth boolean Y true:已认证 + false:未认证 + */ + + } + + + + /** + * 异步开票 + * @param order + * @param token + * @return + */ + public static JSONObject asyncOpenBillReceive(HXOrderInfo order,String token){ + + List orderList = new ArrayList<>(); + orderList.add(order); + + String url = HX_URLPREFIX+"/open/service/orderReceive"; + JSONObject jObjPost = new JSONObject(); + jObjPost.put("orders",orderList); + log.error("==>jObjPost==>{}",jObjPost.toJSONString()); + HttpResponse response = HttpUtil.createPost(url).header("Authorization", token).body(jObjPost.toJSONString()).execute(); + String result = response.body(); + JSONObject jRstObj = JSONObject.parseObject(result); + return jRstObj; + + /* + { + "success": true, + "code": "00000", + "message": "请求成功", + "data": { + "succOrderNum": 1, + "succGoodsNum": 5, + "successDetatils": [ + { + "orderNo": "12321321466587", + "invoiceSerialNum": "12321321466587898" + "qrcodeInvoiceUrl": "https://csfw.jsaisino.com/csapp/stms-saas/login" + } + ] + "failDetails": [ + { + "orderNo": "12321321466587", + "invoiceSerialNum": "12321321466587898" + "qrcodeInvoiceUrl": "https://csfw.jsaisino.com/csapp/stms-saas/login" + } + ] + } + } + + { + "success": false, + "code": "B181099", + "message": "订单信息接收失败,失败原因:订单信息校验失败", + "data": { + "succOrderNum": 0, + "succGoodsNum": 0, + "failDetails": [ + { + "orderNo": "12321321466587", + "failReason": "明细中商品名称不能为空" + } + ] + }, + "exceptionClazz": null, + "exceptionTip": null, + "exceptionPlace": null + } + */ +// return 0; + } + + /** + * 开票查询 + * @param order + * @param token + * @return + */ + public static JSONObject queryInvoiceResult(String orderNo,String token){ + + /* + orderNos Array N 50 订单数组,最大支持200条订单 +invoiceSerialNums Array N 32 开票请求流水号数组,最大支持200条,该值在订单接收接口中返回。开票请求流水号数组与订单数组任选其一,都传值则优先使用开票请求流水号查询开票结果 +isOfferInvoiceDetail String N 1 是否需要提供明细 Y-提供,N-不提供(默认) + */ + List orderNos = new ArrayList<>(); + orderNos.add(orderNo); + + String url = HX_URLPREFIX+"/open/service/queryInvoiceResult"; + JSONObject jObjPost = new JSONObject(); + jObjPost.put("orderNos",orderNos); + log.error("===>queryInvoiceResult==>{}",jObjPost.toJSONString()); + HttpResponse response = HttpUtil.createPost(url).header("Authorization", token).body(jObjPost.toJSONString()).execute(); + String result = response.body(); + JSONObject jRstObj = JSONObject.parseObject(result); + return jRstObj; + + /* + { + "success": true, + "code": "00000", + "message": "请求成功", + "data": { + "succOrderNum": 1, + "succGoodsNum": 5, + "successDetatils": [ + { + "orderNo": "12321321466587", + "invoiceSerialNum": "12321321466587898" + "qrcodeInvoiceUrl": "https://csfw.jsaisino.com/csapp/stms-saas/login" + } + ] + "failDetails": [ + { + "orderNo": "12321321466587", + "invoiceSerialNum": "12321321466587898" + "qrcodeInvoiceUrl": "https://csfw.jsaisino.com/csapp/stms-saas/login" + } + ] + } + } + + { + "success": false, + "code": "B181099", + "message": "订单信息接收失败,失败原因:订单信息校验失败", + "data": { + "succOrderNum": 0, + "succGoodsNum": 0, + "failDetails": [ + { + "orderNo": "12321321466587", + "failReason": "明细中商品名称不能为空" + } + ] + }, + "exceptionClazz": null, + "exceptionTip": null, + "exceptionPlace": null + } + */ +// return 0; + } + + + public static void main1(String[] args) { + + /* + { + "orders":[{ + "orderNo": "19030412532501000363", + "salerTaxNum": "339902999999789113", + "invoiceLine": "c", + "buyerName": "北京分公司", + "buyerTaxNum": "91610131783582683H", + "buyerAddress": "西安市高新区高新四路17号志诚商务C座5层", + "buyerTel": "029-62623805", + "buyerBank": "工行西安高新路支行", + "buyerBankAccount": "3700028719200070864", + "specificFactor": "0", + "deliverPhone": "17705172417", + "deliverEmail": "1392859652@qq.com", + "emailDeliveryFileFormats":"['XML','OFD','PDF']", + "withTaxFlag": "1", + "detailInfos": [{ + "goodsName": "测试商品11", + "goodsCode": "1090511030000000000", + "specType": "测试规格型号", + "unit": "个", + "price": "10", + "num": "1", + "taxRate": "0.06", + "withTaxFlag": "1" + }] + }, + + ], + "autoInvoiceFlag": "Y" + } + + +(2)公司名称:江苏探路者国际物流有限公司 +税号:9132010469040698XG +APP Key:9132010469040698XG +APP Secret:8962fd753b054da88409b18743a6e7c0 + + + */ + + HXOrderInfo order = new HXOrderInfo(); + String token=getToken("9132010469040698XG","8962fd753b054da88409b18743a6e7c0"); + +// 91320104MA258WWMX2 丝路卡航(江苏)物流服务有限公司 4000251756 南京市秦淮区正学路1号南京晨光1865创意产业园F3幢1527号 交通银行股份有限公司南京新街口支行 320899991013001239978 2024-07-24 11:19:25 2024-07-24 11:45:21 + order.setOrderNo("TST2024072400-2"); + order.setBuyerTaxNum("91320104MA258WWMX2"); + order.setBuyerName("丝路卡航(江苏)物流服务有限公司"); + order.setBuyerAddress("南京市秦淮区正学路1号南京晨光1865创意产业园F3幢1527号"); + order.setBuyerTel("4000251756"); + order.setBuyerBank("交通银行股份有限公司南京新街口支行"); + order.setBuyerBankAccount("320899991013001239978"); + order.setSpecificFactor("0"); +// order.setDeliverPhone("123213"); + order.setDeliverEmail("linfso@126.com"); + + order.setWithTaxFlag( "1"); + +// "emailDeliveryFileFormats":"['XML','OFD','PDF']", + + // 蓝票 + order.setInvoiceType("1"); + /* + 发票种类: + pc:普通发票(数电); + bs:专用发票(数电); + ec:数电普票(纸质); + es:数电专票(纸质); + p,普通发票(电票); + b,增值税电子专用发票; + c,普通发票(纸票); + s,专用发票; + r,普通发票(卷式); + j,机动车销售统一发票; + u,二手车销售统一发票; + e,收购发票(电票); + f,收购发票(纸质); + ret,铁路电子客票 + eia,航空运输客票电子行程单 + 扫码开票仅支持数电普和数电专 + */ + order.setInvoiceLine("p"); + + +// 9132010469040698XG 江苏探路者国际物流有限公司 025-85657080 南京市秦淮区正学路1号南京晨光1865创意产业园F3幢1137号 中国工商银行南京市新街口支行 4301010009100803890 2024-07-24 10:37:07 2024-07-24 11:45:39 +// +// order.setSalerTaxNum("91320104MAD3LBDK4E"); +// order.setSalerName("探路供应链(江苏)有限公司"); +// order.setSalerTel("025-85657080"); +// order.setSalerAddress("江苏省南京市秦淮区正学路1号南京晨光1865创意产业园F3幢1128号"); +// order.setSalerBank("招商银行股份有限公司南京新街口支行"); +// order.setSalerBankAccount("125916943510000"); + + order.setSalerTaxNum("9132010469040698XG"); + order.setSalerName("江苏探路者国际物流有限公司"); + order.setSalerTel("025-85657080"); + order.setSalerAddress("南京市秦淮区正学路1号南京晨光1865创意产业园F3幢1137号"); + order.setSalerBank("中国工商银行南京市新街口支行"); + order.setSalerBankAccount("4301010009100803890"); + + List goodsList = new ArrayList<>(); + HXOrderGoods goodsItem = new HXOrderGoods(); + goodsItem.setGoodsCode("30408020102"); + goodsItem.setGoodsName("国际代理运输"); + goodsItem.setNum("1"); + goodsItem.setUnit("次"); + goodsItem.setPrice("1.00"); + goodsItem.setTaxRate("0.0"); + goodsItem.setSpecType("国际代理运输"); + goodsList.add(goodsItem); + order.setDetailInfos(goodsList); + + +// 91320104MAD3LBDK4E 探路供应链(江苏)有限公司 025-85657080 江苏省南京市秦淮区正学路1号南京晨光1865创意产业园F3幢1128号 招商银行股份有限公司南京新街口支行 125916943510000 2024-07-24 11:16:58 2024-07-24 11:45:31 + + JSONObject jRstObj=HXSdk.asyncOpenBillReceive(order,token); + System.out.println(jRstObj.toJSONString()); + + } + + + public static void main(String[] args) { + String token=getToken("9132010469040698XG","8962fd753b054da88409b18743a6e7c0"); + JSONObject jRstObj=HXSdk.queryInvoiceResult("TST2024072400-2",token); + System.out.println(jRstObj.toJSONString()); + + } +} diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/openbill/hx/OpenServiceDemo.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/openbill/hx/OpenServiceDemo.java new file mode 100644 index 000000000..46168f7a7 --- /dev/null +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/openbill/hx/OpenServiceDemo.java @@ -0,0 +1,41 @@ +package com.xdadan.erp.emis.service.openbill.hx; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONObject; + +/** + * 开票平台接口对接demo + * 本demo使用Hutool(5.8.21)提供的HttpUtil工具类实现http请求 + * + * @author yxx + */ +public class OpenServiceDemo { + public static void main(String[] args) { + // 开放平台对接URL固定前缀 + String urlPrefix = "https://csfw.jsaisino.com/csapp/stms-saas-pc/"; + // 1、通过平台提供的appkey secretKey 获取token + String getTokenUrlsuffix = "/open/service/getToken"; +// String getTokenRequest = "{\"appKey\":\"91440400MA4WKU0K8A\",\"secretKey\":\"a12136297be249ee9ca5fd9c862c7ca2\"}"; + String getTokenRequest = "{\"appKey\":\"91320104MAD3LBDK4E\",\"secretKey\":\"cf6e11de453f441bbd35691cda6442e3\"}"; + HttpResponse getTokenResponse = HttpUtil.createGet(urlPrefix + getTokenUrlsuffix).body(getTokenRequest).execute(); + String result = getTokenResponse.body(); + JSONObject jsonObject1 = JSONObject.parseObject(result); + String token = null; + System.out.println(jsonObject1); + if("00000".equals(jsonObject1.getString("code"))){ + token =jsonObject1.getString("data"); + // 2、建议蒋获取到的token塞入本地缓存 并设置有效期 7天 TODO + } + // 3、从缓存中获取token 调用业务接口-示例 + if(StrUtil.isNotEmpty(token)){ + // 获取电局是否登录成功 + String getEtaxLoginStatusUrlsuffix = "/open/service/isLoginSucceeded"; + // 将token塞入请求头中 + HttpResponse getEtaxLoginStatusResponse = HttpUtil.createGet(urlPrefix + getEtaxLoginStatusUrlsuffix).header("Authorization", token).body("{}").execute(); + String getEtaxLoginStatusResult = getEtaxLoginStatusResponse.body(); + System.out.println(getEtaxLoginStatusResult); + } + } +} diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/openbill/hx/OrderReceiveInfoRequest.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/openbill/hx/OrderReceiveInfoRequest.java new file mode 100644 index 000000000..984d6bb3d --- /dev/null +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/openbill/hx/OrderReceiveInfoRequest.java @@ -0,0 +1,23 @@ +package com.xdadan.erp.emis.service.openbill.hx; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @Description 订单接收参数 + * @Author NF_344 xieminmin + * @Date 2022-11-14 + */ +@Data +public class OrderReceiveInfoRequest implements Serializable { + + private static final long serialVersionUID = 3789592267606483751L; + + /** + * 订单信息 + */ + private List orders; + +} diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/utils/WaybillHelper.java b/emis-biz/src/main/java/com/xdadan/erp/emis/utils/WaybillHelper.java index 0119ffa55..16a32c24c 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/utils/WaybillHelper.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/utils/WaybillHelper.java @@ -16,6 +16,8 @@ import lombok.extern.slf4j.Slf4j; import java.math.BigDecimal; import java.text.DecimalFormat; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -24,6 +26,8 @@ public class WaybillHelper { // 5位小数 public static DecimalFormat dfCalc = new DecimalFormat("#.#####"); + public static SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + // 生成客户编号 // public static String genCustomerCode(){ @@ -53,6 +57,17 @@ public class WaybillHelper { return payId.toString(); } + /** + * 生成结算账单号 + * @return + */ + public static String genSettleBillNo(){ + String billId = formatter.format(new Date()); + billId += (int)((Math.random() * 9 + 1) * 100); + return billId; + } + + diff --git a/emis-biz/src/main/resources/mapper/EmisSettleInvoiceRecordMapper.xml b/emis-biz/src/main/resources/mapper/EmisSettleInvoiceRecordMapper.xml index 228826c0a..fce599cd6 100644 --- a/emis-biz/src/main/resources/mapper/EmisSettleInvoiceRecordMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisSettleInvoiceRecordMapper.xml @@ -4,7 +4,7 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + @@ -44,6 +44,18 @@ + + + + + + + + + + + + @@ -105,6 +117,12 @@ order by create_time desc + + + + + +