Просмотр исходного кода

对接计费系统开票申请

lzm 3 лет назад
Родитель
Сommit
fe7db127a0
22 измененных файлов с 817 добавлено и 102 удалено
  1. 2 1
      sp-admin/sa-view/tb-fee-statistics/tb-fee-details-list.html
  2. 198 0
      sp-admin/sa-view/tb-invoice-info/online-invioce.html
  3. 4 3
      sp-admin/sa-view/tb-invoice-info/tb-invoice-info-list.html
  4. 1 1
      sp-admin/sa-view/tb-invoice-order/tb-invoice-order-list.html
  5. 51 0
      sp-server/src/main/java/com/pj/api/invoice/api/InvoiceApplyController.java
  6. 3 2
      sp-server/src/main/java/com/pj/api/invoice/bo/InvoiceApply.java
  7. 26 0
      sp-server/src/main/java/com/pj/api/invoice/bo/InvoiceApplyCallBack.java
  8. 110 0
      sp-server/src/main/java/com/pj/api/invoice/bo/InvoiceApplyCallBackSub.java
  9. 2 1
      sp-server/src/main/java/com/pj/api/invoice/bo/InvoiceApplySub.java
  10. 3 2
      sp-server/src/main/java/com/pj/api/invoice/bo/InvoiceApplySubDetail.java
  11. 60 0
      sp-server/src/main/java/com/pj/api/invoice/bo/invoiceDetail.java
  12. 22 0
      sp-server/src/main/java/com/pj/api/invoice/bo/testbb.java
  13. 183 47
      sp-server/src/main/java/com/pj/api/invoice/service/InvoiceApplyService.java
  14. 40 0
      sp-server/src/main/java/com/pj/current/config/InvoiceConfig.java
  15. 27 0
      sp-server/src/main/java/com/pj/project/tb_invoice_details/TbInvoiceDetails.java
  16. 12 5
      sp-server/src/main/java/com/pj/project/tb_invoice_details/TbInvoiceDetailsController.java
  17. 1 1
      sp-server/src/main/java/com/pj/project/tb_invoice_details/TbInvoiceDetailsMapper.java
  18. 50 7
      sp-server/src/main/java/com/pj/project/tb_invoice_details/TbInvoiceDetailsService.java
  19. 0 26
      sp-server/src/main/java/com/pj/project/tb_invoice_details/tesss.java
  20. 5 0
      sp-server/src/main/java/com/pj/project/tb_invoice_info/TbInvoiceInfo.java
  21. 8 6
      sp-server/src/main/java/com/pj/project/tb_invoice_info/TbInvoiceInfoService.java
  22. 9 0
      sp-server/src/main/resources/application-dev.yml

+ 2 - 1
sp-admin/sa-view/tb-fee-statistics/tb-fee-details-list.html

@@ -170,6 +170,7 @@
 					<sa-td name="主体名称" prop="entityName" ></sa-td>
 					<sa-td name="生成时间" prop="createTime" width="150px" ></sa-td>
 					<sa-td name="付款时间" prop="payTime"  width="150px" ></sa-td>
+					<sa-td name="更新时间" prop="updateTime"  width="150px" ></sa-td>
 					<sa-td name="备注" prop="remark" ></sa-td>
 					<sa-td name="开单员" prop="kaiDanPerson" width="80px" ></sa-td>
 					<sa-td name="复核员" prop="diaoDuPerson" width="80px" ></sa-td>
@@ -281,7 +282,7 @@
 				},
 				methods: {
 					getSumRol(param){
-						console.log("执行了getSumRol")
+
 						const columns = param.columns;
 						const sums = [];
 						columns.forEach((column, index) => {

+ 198 - 0
sp-admin/sa-view/tb-invoice-info/online-invioce.html

@@ -0,0 +1,198 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>线上开票确认</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    <meta name="viewport"
+          content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"/>
+    <!-- 所有的 css js 资源 -->
+    <link rel="stylesheet" href="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+    <link rel="stylesheet" href="../../static/sa.css">
+    <script src="../../static/kj/vue.min.js"></script>
+    <script src="../../static/kj/element-ui/index.js"></script>
+    <script src="../../static/kj/httpVueLoader.js"></script>
+    <script src="../../static/kj/jquery.min.js"></script>
+    <script src="../../static/kj/layer/layer.js"></script>
+    <script src="../../static/sa.js"></script>
+    <style type="text/css">
+        .c-panel .c-label {
+            width: 8em;
+        }
+    </style>
+</head>
+<body>
+<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+    <!-- ------- 内容部分 ------- -->
+    <div class="s-body">
+        <div class="c-panel">
+            <el-form>
+                <el-row>
+                    <el-collapse value='1'>
+                        <el-collapse-item name="1">
+                            <div slot="title">
+                                基础信息
+                            </div>
+                            <div>
+                                <el-row>
+                                    <el-col span="12">
+                                        <sa-info name="开票总额" br>{{m.totalMoney}}元</sa-info>
+                                        <sa-info name="主体名称" br>{{m.entityName}}</sa-info>
+                                        <sa-info name="税号" br>{{m.taxIdNo}}</sa-info>
+
+                                    </el-col>
+                                    <el-col span="12">
+                                        <sa-info name="开户银行" br>{{m.bank}}</sa-info>
+                                        <sa-info name="银行账号" br>{{m.bankNo}}</sa-info>
+                                        <sa-info name="地址" br>{{m.address}}</sa-info>
+                                        <sa-info name="电话" br>{{m.phone}}</sa-info>
+                                        <sa-info name="邮箱" br>{{m.email}}</sa-info>
+                                    </el-col>
+                                </el-row>
+                            </div>
+                        </el-collapse-item>
+                    </el-collapse>
+                </el-row>
+                <el-row>
+                    <el-collapse value='1'>
+                        <el-collapse-item name="1">
+                            <div slot="title">
+                                实际开票
+                            </div>
+                            <el-table :data="invioceDetails" style="width: 100%">
+                                <el-table-column type="index" width="50" label="序号"></el-table-column>
+                                <el-table-column label="单据编号" prop="id"></el-table-column>
+                                <el-table-column label="金额(元)" prop="money"></el-table-column>
+                                <el-table-column label="发票号" prop="invoiceNo"></el-table-column>
+                                <el-table-column label="发票代码" prop="invoiceCode"></el-table-column>
+                                <el-table-column label="操作"  width="240px">
+                                    <template slot-scope="s">
+                                        <el-button class="c-btn" type="success"  @click="showFee(s.row.id)">费用详情</el-button>
+                                    </template>
+                                </el-table-column>
+                            </el-table>
+
+                        </el-collapse-item>
+                    </el-collapse>
+                </el-row>
+
+            </el-form>
+        </div>
+    </div>
+    <!-- ------- 底部按钮 ------- -->
+    <div class="s-foot">
+        <el-button v-if="m.isApply!=1&&m.isApply!=2&&comfirmButton==0&&m.status==0&&currentCustomerId==1" type="success" @click="comfirmFn">确定开票</el-button>
+        <el-button @click="sa.closeCurrIframe()">取消</el-button>
+    </div>
+    <el-dialog title="费用明细" :visible.sync="showFeeDate.visible" width="90%">
+        <el-table :data="feeDetails" style="width: 100%">
+            <el-table-column label="业务类型" prop="itemTypeName" ></el-table-column>
+            <el-table-column label="数量" prop="num" ></el-table-column>
+            <el-table-column label="单价(元)" prop="unitPrice" ></el-table-column>
+            <el-table-column label="总价(元)" prop="itemPrice" ></el-table-column>
+            <el-table-column label="税率(%)" >
+                <template slot-scope="s">
+                    <span>{{s.row.taxRate * 100}}</span>
+                </template>
+            </el-table-column>
+            <el-table-column label="税款(元)" >
+                <template slot-scope="s">
+                    <span>{{Number(s.row.taxPrice).toFixed(2)}}</span>
+                </template>
+            </el-table-column>
+            <el-table-column label="不含税金额(元)" >
+                <template slot-scope="s">
+                    <span>{{Number(s.row.noTaxPrice).toFixed(2)}}</span>
+                </template>
+            </el-table-column>
+
+        </el-table>
+        <span slot="footer" class="dialog-footer">
+					<el-button @click="showFeeDate.visible = false">关闭</el-button>
+				</span>
+    </el-dialog>
+    <el-dialog title="请填写开票人" :visible.sync="drawerDate.visible" width="38%">
+        <div class="c-item">
+            <label class="c-label">开票人:</label>
+            <el-input type="text" v-model="drawerDate.form.drawer"></el-input>
+        </div>
+        <span slot="footer" class="dialog-footer">
+            <el-button @click="drawerDate.visible = false">取 消</el-button>
+            <el-button type="primary" @click="comfirm">确 定</el-button>
+        </span>
+    </el-dialog>
+</div>
+<script>
+    var app = new Vue({
+        components: {
+            "sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+        },
+        el: '.vue-box',
+        data: {
+            infoId: sa.p('id', 0),	// 获取数据ID
+            m: null,
+            invioceDetails: [],
+            feeDetails:[],
+            showFeeDate: {
+                visible: false,
+            },
+            comfirmButton: 0,
+            drawerDate: {
+                visible: false,
+                form: {
+                    infoId: sa.p('id', 0),
+                    drawer:"",
+                }
+            },
+            currentCustomerId: '1',
+        },
+        methods: {
+            getCustomer() {
+                sa.ajax('/TbCostomer/getCurrentCustomerId', function(resp) {
+                    this.currentCustomerId = resp.data;
+                }.bind(this));
+            },
+            showFee(id){
+                sa.ajax('/TbInvoiceDetails/groupFeeDetails?id=' + id, function (res) {
+                    this.feeDetails = res.data;
+                    this.showFeeDate.visible = true;
+                }.bind(this))
+            },
+            comfirmFn() {
+                this.drawerDate.visible = true;
+            },
+            comfirm() {
+                sa.checkNull(this.drawerDate.form.drawer, '输入 [开票人]');
+                sa.ajax('/InvoiceApply/applyInvoice', this.drawerDate.form, function () {
+                    this.drawerDate.visible = false;
+                    this.comfirmButton = 1;
+                    sa.alert('开票成功', this.close);
+                }.bind(this))
+            },
+            close(){
+                parent.app.f5();
+                sa.closeCurrIframe();
+            },
+            getInfo() {
+                sa.ajax('/TbInvoiceInfo/getById?id=' + this.infoId, function(res) {
+                    this.m = res.data;
+                    if(res.data == null) {
+                        sa.alert('未能查找到 id=' + this.infoId + " 开票信息数据");
+                    }
+                }.bind(this))
+            },
+            getDetails() {
+                sa.ajax('/TbInvoiceDetails/onlineInvoice?infoId=' + this.infoId, function (res) {
+                    this.invioceDetails = res.data;
+                }.bind(this))
+            }
+        },
+        mounted: function () {
+            this.getCustomer();
+            this.getInfo();
+            this.getDetails();
+        }
+    })
+
+</script>
+</body>
+</html>

+ 4 - 3
sp-admin/sa-view/tb-invoice-info/tb-invoice-info-list.html

@@ -70,7 +70,8 @@
 <!--					<sa-td name="邮箱" prop="email" ></sa-td>-->
 					<el-table-column label="操作"  width="240px">
 						<template slot-scope="s">
-							<el-button v-if="s.row.status==0 && currentCustomerId==1" class="c-btn" type="primary"  @click="onlineFn(s.row.id)">线上开票</el-button>
+							<el-button v-if="currentCustomerId==1&&s.row.status==0" class="c-btn" type="primary"  @click="onlineFn(s.row)">线上开票</el-button>
+							<el-button v-if="s.row.status==1" class="c-btn" type="primary"  @click="onlineFn(s.row)">发票详情</el-button>
 							<el-button v-if="s.row.status==0 && currentCustomerId==1" class="c-btn" type="primary"  @click="completeFn(s.row.id)">完成开票</el-button>
 							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看</el-button>
 							<el-button v-if="s.row.status==0" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
@@ -142,8 +143,8 @@
 					},
 				},
 				methods: {
-					onlineFn(id){
-						sa.showIframe('线上开票', 'online-invioce.html?id=' + id, '800px', '75%');
+					onlineFn(data){
+						sa.showIframe('线上开票', 'online-invioce.html?id=' + data.id, '1000px', '90%');
 					},
 					completeFn(id){
 						this.completeDate.visible = true;

+ 1 - 1
sp-admin/sa-view/tb-invoice-order/tb-invoice-order-list.html

@@ -46,7 +46,7 @@
 					</div>
 					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
 					<el-button size="mini" type="info" @click="sa.f5()">刷新</el-button>
-					<br />
+					<br /><br />
 				</el-form>
 				<!-- ------------- 快捷按钮 ------------- -->
 				<el-form ref="form" :model='p' @submit.native.prevent>

+ 51 - 0
sp-server/src/main/java/com/pj/api/invoice/api/InvoiceApplyController.java

@@ -0,0 +1,51 @@
+package com.pj.api.invoice.api;
+
+import cn.hutool.core.codec.Base64;
+import cn.hutool.core.util.XmlUtil;
+import cn.hutool.json.JSONUtil;
+import cn.hutool.log.StaticLog;
+import com.pj.api.invoice.bo.InvoiceApplyCallBack;
+import com.pj.api.invoice.service.InvoiceApplyService;
+import com.pj.utils.sg.AjaxJson;
+import com.pj.utils.so.SoMap;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+
+ * @Auther: lzm
+ * @Date: 2022/08/11/2:59
+ * @Description:
+ */
+@RequestMapping("InvoiceApply")
+@RestController
+@Slf4j
+public class InvoiceApplyController {
+
+    @Resource
+    InvoiceApplyService invoiceApplyService;
+
+    @RequestMapping("applyInvoice")
+    public AjaxJson applyInvoice(){
+        SoMap so = SoMap.getRequestSoMap();
+        String infoId = so.getString("infoId");
+        String drawer = so.getString("drawer");
+        invoiceApplyService.applyInvoice(infoId, drawer);
+        return AjaxJson.getSuccess();
+    }
+
+    @RequestMapping(value = "applyCallBack")
+    public Map<String, Object> applyCallBack(@RequestBody InvoiceApplyCallBack bo){
+        String sub = Base64.decodeStr(bo.getData());
+        log.info("计费系统开票申请回调:{}", JSONUtil.toJsonStr(bo));
+        log.info("回调明细:{}", sub);
+        Map<String, Object> result = invoiceApplyService.callBack(sub);
+        return result;
+    }
+
+}

+ 3 - 2
sp-server/src/main/java/com/pj/api/invoice/bo/InvoiceApply.java

@@ -3,6 +3,7 @@ package com.pj.api.invoice.bo;
 import lombok.Data;
 import lombok.experimental.Accessors;
 
+import java.io.Serializable;
 import java.util.List;
 
 /**
@@ -12,7 +13,7 @@ import java.util.List;
  */
 @Data
 @Accessors(chain = true)
-public class InvoiceApply {
+public class InvoiceApply implements Serializable {
     /**时间戳*/
     private String requestId;
     /**对接不同系统来源 编码,用于区分不 同系统的回调接口*/
@@ -21,7 +22,7 @@ public class InvoiceApply {
     private String interfaceCode;
 
     /**需要把data的值加 密成字符串,默认 为base64*/
-    private List<InvoiceApplySub> data;
+    private String data;
 
 
 

+ 26 - 0
sp-server/src/main/java/com/pj/api/invoice/bo/InvoiceApplyCallBack.java

@@ -0,0 +1,26 @@
+package com.pj.api.invoice.bo;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * Created with IntelliJ IDEA.
+ *
+ * @Auther: lzm
+ * @Date: 2022/08/10/15:15
+ * @Description:
+ */
+@Data
+@Accessors(chain = true)
+
+public class InvoiceApplyCallBack implements Serializable {
+
+    /**接口业务编码*/
+    private String interfaceCode;
+
+    /**需要把data的ase64解密*/
+    private String data;
+
+}

+ 110 - 0
sp-server/src/main/java/com/pj/api/invoice/bo/InvoiceApplyCallBackSub.java

@@ -0,0 +1,110 @@
+package com.pj.api.invoice.bo;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * Created with IntelliJ IDEA.
+ *
+ * @Auther: lzm
+ * @Date: 2022/08/11/2:37
+ * @Description:
+ */
+@Data
+@Accessors(chain = true)
+public class InvoiceApplyCallBackSub implements Serializable {
+
+    /**单据编号*/
+    private String billNo;
+    /**批次号*/
+    private String batch;
+    /**作废原因*/
+    private String abolishReason;
+    /**购买方地址和电 话*/
+    private String buyerAddressAndTel;
+    /**购买方银行和账号*/
+    private String buyerBankAndAccount;
+    /**购买方名称*/
+    private String buyerName;
+    /**是 购买方性质*/
+    private Integer buyerProperty;
+    /**电子发票收票手机 号*/
+    private String buyerRecipientPhone;
+    /**购买方税号*/
+    private String buyerTaxpayerId;
+    /**作废人*/
+    private String canceler;
+    /**设备编号*/
+    private String deduction;
+    /**开票人*/
+    private String drawer;
+    /**收款人*/
+    private String payee;
+    /**复核人*/
+    private String reviewer;
+    /**价税合计*/
+    private String includeTaxAmount;
+    /**合计税额*/
+    private BigDecimal totalAmount;
+    /**含税标识,0-不含税,1-含 税*/
+    private Integer includeTaxFlag;
+    /**清单标志,0-非清单发票, 1-清单发票*/
+    private Integer inventoryMark;
+    /**发票代码*/
+    private String invoiceCode;
+    /**发票号码*/
+    private String invoiceNum;
+    /**发票状态 0-正常 2-待开 3- 红冲 6-作废*/
+    private String invoiceStatus;
+    /**开票日期*/
+    private String invoiceDate;
+
+    /**发票明细*/
+    private List<com.pj.api.invoice.bo.invoiceDetail> invoiceDetail;
+
+    /**PDF板式文件下载地址*/
+    private String invoiceFileUrl;
+    /**PDF转图片预览地址*/
+    private String invoiceImageUrl;
+    /**开票类型,0蓝票,1红票 【长度:1】*/
+    private String invoiceProperty;
+    /**发票种类*/
+    private String invoiceType;
+
+    /**发票种类*/
+    private String originalInvoiceCode;
+    /**发票种类*/
+    private String originalInvoiceNumber;
+    /**发票种类*/
+    private String printFlag;
+    /**发票种类*/
+    private String redInfoBillNo;
+    /**发票种类*/
+    private String remark;
+
+    private String sellerAddressAndTel;
+
+    private String sellerBankAndAccount;
+
+    private String sellerName;
+
+    private String sellerTaxpayerId;
+
+    private String serialNo;
+
+    private String systemSource;
+
+    private String taxedType;
+
+    private String terminalNo;
+
+
+
+
+
+
+}

+ 2 - 1
sp-server/src/main/java/com/pj/api/invoice/bo/InvoiceApplySub.java

@@ -3,6 +3,7 @@ package com.pj.api.invoice.bo;
 import lombok.Data;
 import lombok.experimental.Accessors;
 
+import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.List;
 
@@ -11,7 +12,7 @@ import java.util.List;
  */
 @Data
 @Accessors(chain = true)
-public class InvoiceApplySub {
+public class InvoiceApplySub implements Serializable {
 
     /**单据编号*/
     private String billNo;

+ 3 - 2
sp-server/src/main/java/com/pj/api/invoice/bo/InvoiceApplySubDetail.java

@@ -3,6 +3,7 @@ package com.pj.api.invoice.bo;
 import lombok.Data;
 import lombok.experimental.Accessors;
 
+import java.io.Serializable;
 import java.math.BigDecimal;
 
 /**
@@ -14,7 +15,7 @@ import java.math.BigDecimal;
  */
 @Data
 @Accessors(chain = true)
-public class InvoiceApplySubDetail {
+public class InvoiceApplySubDetail implements Serializable {
 
     /**明细金额*/
     private BigDecimal amount;
@@ -35,7 +36,7 @@ public class InvoiceApplySubDetail {
     /**是否享受优惠*/
     private String privilegeFlag;
     /**数量*/
-    private String quantity;
+    private Integer quantity;
     /**税收分类编码*/
     private String revenueCode;
     /**规格型号*/

+ 60 - 0
sp-server/src/main/java/com/pj/api/invoice/bo/invoiceDetail.java

@@ -0,0 +1,60 @@
+package com.pj.api.invoice.bo;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * Created with IntelliJ IDEA.
+ *
+ * @Auther: lzm
+ * @Date: 2022/08/11/2:51
+ * @Description:
+ */
+@Data
+@Accessors(chain = true)
+public class invoiceDetail implements Serializable {
+
+    /**明细金额*/
+    private BigDecimal amount;
+    /**业务系统明细id,用于反写 回原业务系统明细*/
+    private String billSourceId;
+
+    /**商品名称*/
+    private String goodsName;
+    /** 明细含税金额*/
+    private BigDecimal includeTaxAmount;
+    /** 明细含税单价*/
+    private BigDecimal includeTaxPrice;
+
+    /**行性质,0整单折 扣,2正常商品行*/
+    private Integer lineProperty;
+
+    /**享受优惠内容*/
+    private String privilegeContent;
+    /**是否享受优惠*/
+    private String privilegeFlag;
+    /**数量*/
+    private Integer quantity;
+    /**税收分类编码*/
+    private String revenueCode;
+    /**税收分类名称*/
+    private String revenueName;
+    /**明细序号*/
+    private String seq;
+    /**规格型号*/
+    private String specification;
+    /**税额*/
+    private BigDecimal taxAmount;
+    /**税率*/
+    private BigDecimal taxRate;
+
+    /**计量单位*/
+    private String units;
+    /**零税率标识*/
+    private String zeroTaxRateFlag;
+
+
+}

Разница между файлами не показана из-за своего большого размера
+ 22 - 0
sp-server/src/main/java/com/pj/api/invoice/bo/testbb.java


+ 183 - 47
sp-server/src/main/java/com/pj/api/invoice/service/InvoiceApplyService.java

@@ -1,32 +1,47 @@
 package com.pj.api.invoice.service;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.codec.Base64;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.lang.Snowflake;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSON;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
-import com.alibaba.fastjson.JSONObject;
 import com.pj.api.invoice.bo.InvoiceApply;
+import com.pj.api.invoice.bo.InvoiceApplyCallBackSub;
 import com.pj.api.invoice.bo.InvoiceApplySub;
 import com.pj.api.invoice.bo.InvoiceApplySubDetail;
 import com.pj.api.invoice.utils.InvoiceUtils;
 import com.pj.api.wx.bo.Attach;
 import com.pj.api.wx.bo.PriceBO;
+import com.pj.current.config.InvoiceConfig;
 import com.pj.project.tb_fee_details.TbFeeDetails;
 import com.pj.project.tb_fee_details.TbFeeDetailsService;
+import com.pj.project.tb_fee_statistics.TbFeeStatistics;
 import com.pj.project.tb_invoice_details.TbInvoiceDetails;
 import com.pj.project.tb_invoice_details.TbInvoiceDetailsService;
 import com.pj.project.tb_invoice_info.TbInvoiceInfo;
 import com.pj.project.tb_invoice_info.TbInvoiceInfoService;
+import com.pj.project.tb_invoice_info.dto.FeeDeatilsGroup;
 import com.pj.project.tb_invoice_order.TbInvoiceOrder;
 import com.pj.project.tb_invoice_order.TbInvoiceOrderService;
 import com.pj.project.tb_order.TbOrder;
 import com.pj.project.tb_order.TbOrderService;
+import com.pj.project4sp.global.BusinessException;
+import com.pj.utils.so.SoMap;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.stream.Collectors;
 
 
 /**
@@ -42,92 +57,213 @@ import java.util.*;
 public class InvoiceApplyService {
 
     @Resource
+    TbInvoiceDetailsService tbInvoiceDetailsService;
+    @Resource
     TbInvoiceInfoService tbInvoiceInfoService;
     @Resource
     TbInvoiceOrderService tbInvoiceOrderService;
     @Resource
     TbFeeDetailsService tbFeeDetailsService;
     @Resource
-    TbOrderService tbOrderService;
+    InvoiceConfig invoiceConfig;
+
+
+    private static final String appid = "5644763";
+    private static final String appsecret = "F382196D16B98BC6F4A461Ced7505953";
+    private static final String applyUrl = "http://117.141.148.233:8765/monolithic/uni/invoice/invoiceBillPush";
+    private static final String applyAction = "billPus";
+    private static final String businessTaxRateCode = "3040408000000000000";
+    private static final String carTaxRateCode = "3040502020200000000";
+    private static final String sellerTaxpayerId = "915003006188392540";
+    private static final String sellerName = "金蝶软件(中国)有限公司";
 
-    public static final String appid = "5644763 ";
-    public static final String appsecret = "F382196D16B98BC6F4A461Ced7505953";
-    public static final String applyUrl = "http://117.141.148.233:8765/monolithic/uni/invoice/invoiceBillPush";
-    public static final String applyAction = "billPus";
-    public static final String businessTaxRateCode = "3040408000000000000";
-    public static final String carTaxRateCode = "3040502020200000000";
+    public void applyInvoice(String infoId, String drawer){
+        String code = this.preApply(infoId, drawer);
+        if(!StrUtil.equals("SUCCESS", code)) {
+            throw new BusinessException("开票申请推送失败!");
+        }
+//        TbInvoiceInfo info = tbInvoiceInfoService.getById(infoId);
+//        if(info.getIsApply() == 0){
+//            info.setIsApply(1);
+//            tbInvoiceInfoService.updateById(info);
+//        }
+//        List<TbInvoiceDetails> invoiceDetails = tbInvoiceDetailsService.findByInfoId(infoId);
+//        for (TbInvoiceDetails invoiceDetail : invoiceDetails) {
+//            if(invoiceDetail.getIsApply() == 0){
+//                invoiceDetail.setIsApply(1);
+//            }
+//        }
+//        tbInvoiceDetailsService.updateBatchById(invoiceDetails);
+    }
 
-    public void preApply(TbInvoiceDetails invoiceDetail) throws Exception{
+
+    public String preApply(String infoId, String drawer){
         Date now = new Date();
         Map<String, String> param = new HashMap<>();
-        param.put("action",applyAction);
-        param.put("appid", appid);
+        param.put("action",invoiceConfig.getApplyAction());
+        param.put("appid", invoiceConfig.getAppId());
         param.put("timestamp", InvoiceUtils.date2StrByInt(now, "yyyyMMddHHmmssFFF"));
         param.put("transid", InvoiceUtils.genTransId());
-        String sign = InvoiceUtils.createSign(InvoiceUtils.getSortedMap(param), appsecret);
+        String sign = InvoiceUtils.createSign(InvoiceUtils.getSortedMap(param), invoiceConfig.getAppSecret());
         param.put("sign", sign);
         //拼装请求url
-        String url = InvoiceUtils.getUrl(applyUrl, param);
+        String url = InvoiceUtils.getUrl(invoiceConfig.getApplyUrl(), param);
+
+        TbInvoiceInfo info = tbInvoiceInfoService.getById(infoId);
+        List<TbInvoiceDetails> invoiceDetails = tbInvoiceDetailsService.findByInfoId(infoId);
 
-        TbInvoiceInfo info = tbInvoiceInfoService.getById(invoiceDetail.getInfoId());
-        List<TbInvoiceOrder> orders = tbInvoiceOrderService.findByDetailId(invoiceDetail.getId());
 
         //开始组装接口参数
         InvoiceApply invoiceApply = new InvoiceApply();
         invoiceApply.setRequestId(now.getTime()+"")
-                .setBusinessSystemCode("ali_test")
+                .setBusinessSystemCode("SW_TEST")
                 .setInterfaceCode("BILL.PUSH");
         List<InvoiceApplySub> applys = new ArrayList<>();
-        for (TbInvoiceOrder order : orders) {
+        for (TbInvoiceDetails invoiceDetail : invoiceDetails) {
             InvoiceApplySub apply = new InvoiceApplySub();
-            apply.setBillNo(order.getId()).setPayType("微信支付").setTransactionId(order.getTransactionId())
+            apply.setBillNo(invoiceDetail.getId()).setPayType("微信支付")
                     .setBillDate(DateUtil.format(now, "yyyy-MM-dd"))
-                    .setTotalAmount(order.getBillMoney())
+                    .setTotalAmount(invoiceDetail.getMoney()).setIncludeTaxFlag(1)
                     .setAutoInvoice(1).setAutoMerge(1)
                     .setInvoiceType("007")
                     .setBuyerName(info.getEntityName()).setBuyerTaxpayerId(info.getTaxIdNo())
                     .setBuyerRecipientMail(info.getEmail())
                     .setBuyerProperty(0)
-                    .setSellerTaxpayerId("91450103MA5NA8UF74")
-                    .setIncludeTaxFlag(1)
+                    .setBuyerBankAndAccount(info.getBank()+info.getBankNo())
+                    .setTextField1(info.getCustomerName())
+                    .setSellerName(invoiceConfig.getSellerName())
+                    .setSellerTaxpayerId(invoiceConfig.getSellerTaxpayerId())
+
                     .setTaxationStyle(0)
-                    .setDrawer("开票人");
+                    .setDrawer(drawer);
+
+            //将所有开票订单的收费明细放在一个集合中,并对其分组
+            List<TbInvoiceOrder> orders = tbInvoiceOrderService.findByDetailId(invoiceDetail.getId());
+            List<FeeDeatilsGroup> feeDetailsGroupList = grouping(orders);
+
             List<InvoiceApplySubDetail> applyDetails = new ArrayList<>();
-            List<TbFeeDetails> feeDetails = tbFeeDetailsService.findBusinessFeeByTransactionId(order.getTransactionId());
-            for (TbFeeDetails feeDetail : feeDetails) {
+            Snowflake snowflake = IdUtil.getSnowflake(1, 1);
+            for (FeeDeatilsGroup group : feeDetailsGroupList) {
+                String detailId =  snowflake.nextIdStr();
                 InvoiceApplySubDetail applyDetail = new InvoiceApplySubDetail();
-                applyDetail.setAmount(feeDetail.getItemPrice())
-                .setDetailId(feeDetail.getId())
-                .setGoodsName(feeDetail.getItemTypeName())
-                .setLineProperty(2)
-                .setPrice(feeDetail.getUnitPrice())
-                .setTaxRate(feeDetail.getTaxRate().toString())
-                .setRevenueCode(businessTaxRateCode);
-                applyDetails.add(applyDetail);
-            }
-            TbOrder tbOrder = tbOrderService.findByTransactionId(order.getTransactionId());
-            String attachStr = tbOrder.getAttach();
-            Attach attach = JSONUtil.toBean(attachStr, Attach.class);
-            List<PriceBO> cars = JSONUtil.toList(attach.getC(), PriceBO.class);
-            BigDecimal carAmount = new BigDecimal(0);
-            if(cars.size()>0){
-                for (PriceBO car : cars) {
-                    carAmount = carAmount.add(car.getP());
+                applyDetail.setAmount(group.getItemPrice())
+                        .setDetailId(detailId)
+                        .setGoodsName(group.getItemTypeName())
+                        .setLineProperty(2)
+                        .setQuantity(group.getNum())
+                        .setPrice(group.getUnitPrice())
+                        .setTaxRate(group.getTaxRate().toString());
+                if(StrUtil.equals("0.09", applyDetail.getTaxRate())){
+                    applyDetail.setRevenueCode(invoiceConfig.getCarTaxRateCode());
+                }else{
+                    applyDetail.setRevenueCode(invoiceConfig.getBusinessTaxRateCode());
                 }
+                applyDetails.add(applyDetail);
             }
-            InvoiceApplySubDetail carApplyDetail = new InvoiceApplySubDetail();
-            carApplyDetail.setAmount(carAmount).setGoodsName("停车费")
-                    .setTaxRate("0.09").setLineProperty(2).setRevenueCode(carTaxRateCode);
-            applyDetails.add(carApplyDetail);
             apply.setBillDetail(applyDetails);
             applys.add(apply);
         }
-        invoiceApply.setData(applys);
+
+        log.info("invoice apply url:" + url);
+
+        String applysJson = JSONUtil.toJsonStr(applys);
+        log.info("invoice apply data:" + applysJson);
+
+        String applysBase64 = Base64.encode(applysJson);
+        invoiceApply.setData(applysBase64);
+
         String paramStr = JSONUtil.toJsonStr(invoiceApply);
         log.info("invoice apply paramStr:" + paramStr);
-//        JSONObject result = InvoiceUtils.httppost(url, JSONObject.parseObject(paramStr));
+
         String result = HttpUtil.createPost(url).header("Content-Type", "application/json").body(paramStr).execute().body();
         log.info("invoice apply result:" + result);
+        JSONObject jsonResult = JSONUtil.parseObj(result);
+        if( StrUtil.equals("0", jsonResult.getStr("code"))){
+            return "SUCCESS";
+        }else {
+            return "FAIl";
+        }
+    }
+
+
+    private List<FeeDeatilsGroup> grouping(List<TbInvoiceOrder> invoiceOrderList){
+        List<TbFeeDetails> feeDetailsList = new ArrayList<>();
+        for (TbInvoiceOrder invoiceOrder : invoiceOrderList) {
+            List<TbFeeDetails> detailsList = tbFeeDetailsService.findByTransactionId(invoiceOrder.getTransactionId());
+            feeDetailsList.addAll(detailsList);
+        }
+        List<FeeDeatilsGroup> list = new ArrayList<>();
+        for (TbFeeDetails detail : feeDetailsList) {
+            FeeDeatilsGroup group = new FeeDeatilsGroup();
+        BeanUtil.copyProperties(detail, group);
+        String hash = (detail.getItemTypeName() + detail.getUnitPrice()).hashCode() + "";
+        group.setGroupHash(hash);
+        list.add(group);
+    }
+        Map<String, List<FeeDeatilsGroup>> collect = list.stream()
+                .collect(Collectors.groupingBy(FeeDeatilsGroup::getGroupHash));
+        List<FeeDeatilsGroup> completeGroups = new ArrayList<>();
+        for (String key : collect.keySet()) {
+            List<FeeDeatilsGroup> partGroups = collect.get(key);
+            FeeDeatilsGroup realGroup = new FeeDeatilsGroup();
+            realGroup.setItemTypeName(partGroups.get(0).getItemTypeName())
+                    .setUnitPrice(partGroups.get(0).getUnitPrice())
+                    .setTaxRate(partGroups.get(0).getTaxRate());
+            for (FeeDeatilsGroup partGroup : partGroups) {
+                realGroup.setItemPrice(realGroup.getItemPrice().add(partGroup.getItemPrice()))
+                        .setNoTaxPrice(realGroup.getNoTaxPrice().add(partGroup.getNoTaxPrice()))
+                        .setTaxPrice(realGroup.getTaxPrice().add(partGroup.getTaxPrice()))
+                        .setNum(realGroup.getNum() + partGroup.getNum());
+            }
+            completeGroups.add(realGroup);
+        }
+        return completeGroups;
+    }
+
+
+    public synchronized Map<String, Object>  callBack(String sub) {
+        log.info("进入开票回调:");
+        Map<String, Object> map = new LinkedHashMap<>();
+
+        JSONObject jsonObject = JSONUtil.parseObj(sub);
+        InvoiceApplyCallBackSub callBackSub = JSONUtil.toBean(jsonObject, InvoiceApplyCallBackSub.class);
+
+        TbInvoiceDetails invoiceDetail = tbInvoiceDetailsService.getById(callBackSub.getBillNo());
+        if(invoiceDetail == null){
+            log.info("开票信息子记录{}不存在:", callBackSub.getBillNo());
+            map.put("code", 500);
+            map.put("message", "失败,开票信息数据异常");
+            return map;
+        }
+        if(invoiceDetail.getIsApply() == 2){
+            log.info("重复回调,开票信息子记录{}已开票成功:", callBackSub.getBillNo());
+        }else{
+            invoiceDetail.setIsApply(2).setInvoiceNo(callBackSub.getInvoiceNum()).setInvoiceCode(callBackSub.getInvoiceCode())
+                .setFileUrl(callBackSub.getInvoiceFileUrl()).setImageUrl(callBackSub.getInvoiceImageUrl());
+            tbInvoiceDetailsService.updateById(invoiceDetail);
+            TbInvoiceInfo info = tbInvoiceInfoService.getById(invoiceDetail.getInfoId());
+//            List<TbInvoiceDetails> infoAllDetails = tbInvoiceDetailsService.findByInfoId(info.getId());
+//            String newInvoiceNo = "";
+//            for (TbInvoiceDetails detail : infoAllDetails) {
+//                newInvoiceNo = StrUtil.isEmpty(newInvoiceNo) ?
+//                        detail.getInvoiceNo() : newInvoiceNo+","+detail.getInvoiceNo();
+//            }
+            info.setIsApply(2);
+            tbInvoiceInfoService.updateById(info);
+            String oldInvoiceNo = info.getInvoiceNo();
+            String newInvoiceNo = StrUtil.isEmpty(oldInvoiceNo) ?
+                    callBackSub.getInvoiceNum() : oldInvoiceNo+","+callBackSub.getInvoiceNum();
+
+            SoMap so = new SoMap();
+            so.put("id", info.getId());
+            so.put("invoiceTime", DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
+            so.put("invoiceNo", newInvoiceNo);
+            tbInvoiceInfoService.complete(so);
+
+        }
+        map.put("code", 200);
+        map.put("message", "成功");
+        return map;
     }
 
 }

+ 40 - 0
sp-server/src/main/java/com/pj/current/config/InvoiceConfig.java

@@ -0,0 +1,40 @@
+package com.pj.current.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * Created with IntelliJ IDEA.
+ *
+ * @Auther: lzm
+ * @Date: 2022/08/13/17:27
+ * @Description:
+ */
+@ConfigurationProperties(prefix = "invoice-config")
+@Component
+@Data
+public class InvoiceConfig {
+
+    private String appId;
+    private String appSecret;
+    private String applyUrl;
+    private String applyAction;
+    /**
+     * 业务税率编码
+     * */
+    private String businessTaxRateCode;
+    /**
+     * 停车税率编码
+     * */
+    private String carTaxRateCode;
+    /**
+     * 销售方税号
+     * */
+    private String sellerTaxpayerId;
+    /**
+     * 销售方名称
+     * */
+    private String sellerName;
+
+}

+ 27 - 0
sp-server/src/main/java/com/pj/project/tb_invoice_details/TbInvoiceDetails.java

@@ -56,6 +56,33 @@ public class TbInvoiceDetails implements Serializable {
 	 */
     private String entityName;
 
+    /**
+     * 发票号
+     */
+    private String invoiceNo;
+
+    /**
+     * 发票代码
+     */
+    private String invoiceCode;
+
+    /**
+     * 是否推送(0=未推送, 1=推送中, 2=推送且已回调)
+     */
+    private Integer isApply;
+
+    /**
+     * PDF板式文件下载地址
+     */
+    private String fileUrl;
+
+    /**
+     * PDF板式文件下载地址
+     */
+    private String imageUrl;
+
+
+
 
 
 

+ 12 - 5
sp-server/src/main/java/com/pj/project/tb_invoice_details/TbInvoiceDetailsController.java

@@ -2,6 +2,7 @@ package com.pj.project.tb_invoice_details;
 
 import java.util.List;
 
+import com.pj.project.tb_invoice_info.dto.FeeDeatilsGroup;
 import com.pj.utils.so.SoMap;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
@@ -37,7 +38,7 @@ public class TbInvoiceDetailsController {
 
 	/** 删 */  
 	@RequestMapping("delete")
-	public AjaxJson delete(Long id){
+	public AjaxJson delete(String id){
 		int line = tbInvoiceDetailsService.delete(id);
 		return AjaxJson.getByLine(line);
 	}
@@ -82,10 +83,16 @@ public class TbInvoiceDetailsController {
         return AjaxJson.getSuccessData(list);
     }
 
-    @RequestMapping("applyInvoice")
-    public AjaxJson applyInvoice(String infoId) throws Exception{
-        tbInvoiceDetailsService.applyInvoice(infoId);
-	    return AjaxJson.getSuccess();
+//    @RequestMapping("applyInvoice")
+//    public AjaxJson applyInvoice(String infoId){
+//        tbInvoiceDetailsService.applyInvoice(infoId);
+//	    return AjaxJson.getSuccess();
+//    }
+
+    @RequestMapping("groupFeeDetails")
+    public AjaxJson groupFeeDetails(String id){
+        List<FeeDeatilsGroup> feeDeatilsGroups =  tbInvoiceDetailsService.groupFeeDetails(id);
+        return AjaxJson.getSuccessData(feeDeatilsGroups);
     }
 	
 	// ------------------------- 前端接口 -------------------------

+ 1 - 1
sp-server/src/main/java/com/pj/project/tb_invoice_details/TbInvoiceDetailsMapper.java

@@ -29,7 +29,7 @@ public interface TbInvoiceDetailsMapper extends BaseMapper<TbInvoiceDetails> {
 	 * @param id 要删除的数据id  
 	 * @return 受影响行数 
 	 */
-	int delete(Long id);	 
+	int delete(String id);
 
 	/** 
 	 * 改  

+ 50 - 7
sp-server/src/main/java/com/pj/project/tb_invoice_details/TbInvoiceDetailsService.java

@@ -2,18 +2,25 @@ package com.pj.project.tb_invoice_details;
 
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.stream.Collectors;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.lang.Snowflake;
 import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.pj.api.invoice.service.InvoiceApplyService;
+import com.pj.project.tb_fee_details.TbFeeDetails;
+import com.pj.project.tb_fee_details.TbFeeDetailsService;
 import com.pj.project.tb_invoice_info.TbInvoiceInfo;
 import com.pj.project.tb_invoice_info.TbInvoiceInfoService;
+import com.pj.project.tb_invoice_info.dto.FeeDeatilsGroup;
 import com.pj.project.tb_invoice_order.TbInvoiceOrder;
 import com.pj.project.tb_invoice_order.TbInvoiceOrderService;
+import com.pj.project4sp.global.BusinessException;
 import com.pj.utils.so.SoMap;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -40,6 +47,8 @@ public class TbInvoiceDetailsService extends ServiceImpl<TbInvoiceDetailsMapper,
     TbInvoiceOrderService tbInvoiceOrderService;
     @Resource
     InvoiceApplyService invoiceApplyService;
+    @Resource
+    TbFeeDetailsService tbFeeDetailsService;
 
     private static final BigDecimal max_invoice_money = new BigDecimal(9999);
 
@@ -49,7 +58,7 @@ public class TbInvoiceDetailsService extends ServiceImpl<TbInvoiceDetailsMapper,
 	}
 
 	/** 删 */
-	int delete(Long id){
+	public int delete(String id){
 		return tbInvoiceDetailsMapper.delete(id);
 	}
 
@@ -107,7 +116,7 @@ public class TbInvoiceDetailsService extends ServiceImpl<TbInvoiceDetailsMapper,
                 money = money.add(order.getBillMoney());
             }
             TbInvoiceDetails invoiceDetail = new TbInvoiceDetails();
-            invoiceDetail.setNo(key).setEntityName(info.getEntityName()).setInfoId(infoId).setMoney(money);
+            invoiceDetail.setNo(key).setEntityName(info.getEntityName()).setInfoId(infoId).setMoney(money).setIsApply(0);
             this.save(invoiceDetail);
             for (TbInvoiceOrder order : thisOrders) {
                 order.setDetailId(invoiceDetail.getId());
@@ -119,11 +128,45 @@ public class TbInvoiceDetailsService extends ServiceImpl<TbInvoiceDetailsMapper,
     }
 
 
-    public void applyInvoice(String infoId) throws Exception{
-        List<TbInvoiceDetails> list = this.findByInfoId(infoId);
-        for (TbInvoiceDetails invoiceDetail : list) {
-            invoiceApplyService.preApply(invoiceDetail);
-        }
 
+
+    public List<FeeDeatilsGroup> groupFeeDetails(String id) {
+        List<TbInvoiceOrder> orders = tbInvoiceOrderService.findByDetailId(id);
+        List<FeeDeatilsGroup> feeDetailsGroupList = grouping(orders);
+        return  feeDetailsGroupList;
+    }
+
+    private List<FeeDeatilsGroup> grouping(List<TbInvoiceOrder> invoiceOrderList){
+        List<TbFeeDetails> feeDetailsList = new ArrayList<>();
+        for (TbInvoiceOrder invoiceOrder : invoiceOrderList) {
+            List<TbFeeDetails> detailsList = tbFeeDetailsService.findByTransactionId(invoiceOrder.getTransactionId());
+            feeDetailsList.addAll(detailsList);
+        }
+        List<FeeDeatilsGroup> list = new ArrayList<>();
+        for (TbFeeDetails detail : feeDetailsList) {
+            FeeDeatilsGroup group = new FeeDeatilsGroup();
+            BeanUtil.copyProperties(detail, group);
+            String hash = (detail.getItemTypeName() + detail.getUnitPrice()).hashCode() + "";
+            group.setGroupHash(hash);
+            list.add(group);
+        }
+        Map<String, List<FeeDeatilsGroup>> collect = list.stream()
+                .collect(Collectors.groupingBy(FeeDeatilsGroup::getGroupHash));
+        List<FeeDeatilsGroup> completeGroups = new ArrayList<>();
+        for (String key : collect.keySet()) {
+            List<FeeDeatilsGroup> partGroups = collect.get(key);
+            FeeDeatilsGroup realGroup = new FeeDeatilsGroup();
+            realGroup.setItemTypeName(partGroups.get(0).getItemTypeName())
+                    .setUnitPrice(partGroups.get(0).getUnitPrice())
+                    .setTaxRate(partGroups.get(0).getTaxRate());
+            for (FeeDeatilsGroup partGroup : partGroups) {
+                realGroup.setItemPrice(realGroup.getItemPrice().add(partGroup.getItemPrice()))
+                        .setNoTaxPrice(realGroup.getNoTaxPrice().add(partGroup.getNoTaxPrice()))
+                        .setTaxPrice(realGroup.getTaxPrice().add(partGroup.getTaxPrice()))
+                        .setNum(realGroup.getNum() + partGroup.getNum());
+            }
+            completeGroups.add(realGroup);
+        }
+        return completeGroups;
     }
 }

+ 0 - 26
sp-server/src/main/java/com/pj/project/tb_invoice_details/tesss.java

@@ -1,26 +0,0 @@
-package com.pj.project.tb_invoice_details;
-
-import cn.hutool.core.date.DateUtil;
-
-import java.util.Date;
-
-/**
- * Created with IntelliJ IDEA.
- *
- * @Auther: lzm
- * @Date: 2022/08/08/15:33
- * @Description:
- */
-public class tesss {
-
-    public static void main(String[] args) {
-        String date = DateUtil.format(new Date(), "yyyyMMddHHmmss");
-        System.out.println(date);
-        int ran = (int) ((Math.random() * 9 + 1) * 100000);
-        System.out.println( ran);
-        String no = date +  ran;
-        System.out.println(no);
-
-    }
-
-}

+ 5 - 0
sp-server/src/main/java/com/pj/project/tb_invoice_info/TbInvoiceInfo.java

@@ -130,6 +130,11 @@ public class TbInvoiceInfo implements Serializable {
      */
     private String email;
 
+    /**
+     * 是否推送(0=未申请,1=已申请,2=已开票) ,这里指是否调用计费系统的申请开票接口
+     */
+    private Integer isApply;
+
 
     @TableField(exist = false)
     private List<TbFeeDetails> feeDetails = new ArrayList<>();

+ 8 - 6
sp-server/src/main/java/com/pj/project/tb_invoice_info/TbInvoiceInfoService.java

@@ -22,6 +22,8 @@ import com.pj.project.tb_entity.TbEntity;
 import com.pj.project.tb_entity.TbEntityService;
 import com.pj.project.tb_fee_details.TbFeeDetails;
 import com.pj.project.tb_fee_details.TbFeeDetailsService;
+import com.pj.project.tb_invoice_details.TbInvoiceDetails;
+import com.pj.project.tb_invoice_details.TbInvoiceDetailsService;
 import com.pj.project.tb_invoice_info.dto.FeeDeatilsGroup;
 import com.pj.project.tb_invoice_order.TbInvoiceOrder;
 import com.pj.project.tb_invoice_order.TbInvoiceOrderService;
@@ -55,11 +57,7 @@ public class TbInvoiceInfoService extends ServiceImpl<TbInvoiceInfoMapper, TbInv
     @Resource
     TbFeeDetailsService tbFeeDetailsService;
     @Resource
-    SpAdminService spAdminService;
-    @Resource
-    WxService wxService;
-    @Resource
-    WxConfig wxConfig;
+    TbInvoiceDetailsService tbInvoiceDetailsService;
 
 
 	/** 增 */
@@ -71,9 +69,13 @@ public class TbInvoiceInfoService extends ServiceImpl<TbInvoiceInfoMapper, TbInv
 	int delete(Long id){
         List<TbInvoiceOrder> iOrderList = tbInvoiceOrderService.findByInfoId(id + "");
         for (TbInvoiceOrder order : iOrderList) {
-            order.setInfoId("").setInfoNo("").setStatus(0);
+            order.setInfoId("").setInfoNo("").setStatus(0).setDetailId("");
         }
         tbInvoiceOrderService.updateBatchById(iOrderList);
+        List<TbInvoiceDetails> iDetailList = tbInvoiceDetailsService.findByInfoId(id + "");
+        for (TbInvoiceDetails detail : iDetailList) {
+            tbInvoiceDetailsService.delete(detail.getId());
+        }
         return tbInvoiceInfoMapper.delete(id);
 	}
 

+ 9 - 0
sp-server/src/main/resources/application-dev.yml

@@ -88,3 +88,12 @@ jh-config:
 ocr-config:
     bash: /opt/ocrpic/tesseract.sh
     analysis: /opt/ocrpic/ocrtxt/PIC_NAME.txt
+invoice-config:
+    app-id: 5644763
+    app-secret: F382196D16B98BC6F4A461Ced7505953
+    apply-url: http://117.141.148.233:8765/monolithic/uni/invoice/invoiceBillPush
+    apply-action: billPus
+    business-tax-rate-code: 3040408000000000000
+    car-tax-rate-code: 3040502020200000000
+    seller-taxpayer-id: 915003006188392540
+    seller-name: 金蝶软件(中国)有限公司

Некоторые файлы не были показаны из-за большого количества измененных файлов