Bladeren bron

Merge remote-tracking branch 'origin/dev' into dev

zuypeng 2 jaren geleden
bovenliggende
commit
d4ed3169e8

+ 6 - 0
README.md

@@ -21,4 +21,10 @@ mvn clean package -DskipTests
 ```
 cd  ./charge-java/miniapp
 mvn clean package -DskipTests
+```
+
+
+### docker启动脚本
+```
+docker run  -u 1001 --name jenkins -d -p 8099:8080 -p 50099:50000 -v /home/kym/jenkins1:/var/jenkins_home  jenkins/jenkins:jdk17-preview
 ```

+ 74 - 79
admin-web/src/views/admin/invoice/dialog.vue

@@ -23,72 +23,63 @@
         <el-form-item label="微信发票申请id" prop="applyId">
           <el-input
               v-model.trim="state.ruleForm.applyId"
-              placeholder="微信发票申请id"
-              clearable
+              placeholder="微信发票申请"
+              readonly
               class="wd200">
           </el-input>
         </el-form-item>
-        <el-form-item label="用户id" prop="userId">
+        <el-form-item label="开票日期" prop="fapiaoTime">
           <el-input
-              v-model.trim="state.ruleForm.userId"
-              placeholder="用户id"
-              clearable
+              v-model.trim="state.ruleForm.fapiaoTime"
+              readonly
               class="wd200">
           </el-input>
         </el-form-item>
-        <el-form-item label="发票抬头填写人的openid" prop="openid">
+<!--        <el-form-item label="用户id" prop="userId">
           <el-input
-              v-model.trim="state.ruleForm.openid"
-              placeholder="发票抬头填写人的openid"
-              clearable
-              class="wd200">
-          </el-input>
-        </el-form-item>
-        <el-form-item label="发票关联订单详情" prop="orderDetails">
-          <el-input
-              v-model.trim="state.ruleForm.orderDetails"
-              placeholder="发票关联订单详情"
-              clearable
+              v-model.trim="state.ruleForm.userId"
+              placeholder="用户id"
+              readonly
               class="wd200">
           </el-input>
-        </el-form-item>
+        </el-form-item>-->
         <el-form-item label="累积充电量(度)" prop="totalPower">
           <el-input
-              v-model.trim="state.ruleForm.totalPower"
+              v-model.trim="state.detail.totalPower"
               placeholder="累积充电量(度)"
-              clearable
+              readonly
               class="wd200">
           </el-input>
         </el-form-item>
-        <el-form-item label="累积总金额()" prop="totalMoney">
+        <el-form-item label="累积总金额()" prop="totalMoney">
           <el-input
-              v-model.trim="state.ruleForm.totalMoney"
-              placeholder="累积总金额()"
-              clearable
+              :model-value="u.fmt.fmtMoney(state.detail.totalMoney)"
+              placeholder="累积总金额()"
+              readonly
               class="wd200">
           </el-input>
         </el-form-item>
-        <el-form-item label="累积电费()" prop="elecMoney">
+        <el-form-item label="累积电费()" prop="elecMoney">
           <el-input
-              v-model.trim="state.ruleForm.elecMoney"
-              placeholder="累积电费()"
-              clearable
+              :model-value="u.fmt.fmtMoney(state.detail.elecMoney)"
+              placeholder="累积电费()"
+              readonly
               class="wd200">
           </el-input>
         </el-form-item>
-        <el-form-item label="累积服务费()" prop="serviceMoney">
+        <el-form-item label="累积服务费()" prop="serviceMoney">
           <el-input
-              v-model.trim="state.ruleForm.serviceMoney"
-              placeholder="累积服务费()"
-              clearable
+              :model-value="u.fmt.fmtMoney(state.detail.serviceMoney)"
+              placeholder="累积服务费()"
+              readonly
               class="wd200">
           </el-input>
         </el-form-item>
-        <el-form-item label="服务费优惠金额()" prop="serviceMoneyDiscount">
+        <el-form-item label="服务费优惠金额()" prop="serviceMoneyDiscount">
           <el-input
-              v-model.trim="state.ruleForm.serviceMoneyDiscount"
-              placeholder="服务费优惠金额()"
-              clearable
+              :model-value="u.fmt.fmtMoney(state.detail.serviceMoneyDiscount)"
+              placeholder="服务费优惠金额()"
+              readonly
               class="wd200">
           </el-input>
         </el-form-item>
@@ -96,7 +87,7 @@
           <el-input
               v-model.trim="state.ruleForm.email"
               placeholder="接收发票邮箱"
-              clearable
+              readonly
               class="wd200">
           </el-input>
         </el-form-item>
@@ -104,98 +95,88 @@
           <el-input
               v-model.trim="state.ruleForm.phone"
               placeholder="电话"
-              clearable
+              readonly
               class="wd200">
           </el-input>
         </el-form-item>
-        <el-form-item label="发票类型:INDIVIDUAL-个人 ORGANIZATION-企业" prop="invoiceType">
-          <el-input
-              v-model.trim="state.ruleForm.invoiceType"
-              placeholder="发票类型:INDIVIDUAL-个人 ORGANIZATION-企业"
-              clearable
-              class="wd200">
-          </el-input>
+        <el-form-item label="发票类型" prop="invoiceType">
+          <ext-d-label   class="wd200"  type="Invoice.type" :model-value="state.ruleForm.buyerInformation.type"></ext-d-label>
         </el-form-item>
         <el-form-item label="发票抬头名称" prop="invoiceTitle">
           <el-input
-              v-model.trim="state.ruleForm.invoiceTitle"
+              v-model.trim="state.ruleForm.buyerInformation.name"
               placeholder="发票抬头名称"
-              clearable
+              readonly
               class="wd200">
           </el-input>
         </el-form-item>
         <el-form-item label="公司税号" prop="taxId">
           <el-input
-              v-model.trim="state.ruleForm.taxId"
+              v-model.trim="state.ruleForm.buyerInformation.taxpayer_id"
               placeholder="公司税号"
-              clearable
+              readonly
               class="wd200">
           </el-input>
         </el-form-item>
         <el-form-item label="公司地址" prop="address">
           <el-input
-              v-model.trim="state.ruleForm.address"
+              v-model.trim="state.ruleForm.buyerInformation.address"
               placeholder="公司地址"
-              clearable
+              readonly
               class="wd200">
           </el-input>
         </el-form-item>
         <el-form-item label="开户银行" prop="bankName">
           <el-input
-              v-model.trim="state.ruleForm.bankName"
+              v-model.trim="state.ruleForm.buyerInformation.bank_name"
               placeholder="开户银行"
-              clearable
+              readonly
               class="wd200">
           </el-input>
         </el-form-item>
         <el-form-item label="银行账户" prop="bankAccount">
           <el-input
-              v-model.trim="state.ruleForm.bankAccount"
+              v-model.trim="state.ruleForm.buyerInformation.bank_account"
               placeholder="银行账户"
-              clearable
+              readonly
               class="wd200">
           </el-input>
         </el-form-item>
         <el-form-item label="发票金额(单位:分)" prop="invoiceAmount">
           <el-input
-              v-model.trim="state.ruleForm.invoiceAmount"
+              :model-value="u.fmt.fmtMoney(state.ruleForm.totalAmount)"
               placeholder="发票金额(单位:分)"
-              clearable
+              readonly
               class="wd200">
           </el-input>
         </el-form-item>
-        <el-form-item label="税额详情信息" prop="taxInfo">
+        <el-form-item label="税额" prop="taxInfo">
           <el-input
-              v-model.trim="state.ruleForm.taxInfo"
-              placeholder="税额详情信息"
-              clearable
+              :model-value="u.fmt.fmtMoney(state.ruleForm.taxAmount)"
+              placeholder="税额"
+              readonly
               class="wd200">
           </el-input>
         </el-form-item>
         <el-form-item label="开票人" prop="biller">
           <el-input
-              v-model.trim="state.ruleForm.biller"
+              v-model.trim="state.ruleForm.sellerInformation.name"
               placeholder="开票人"
-              clearable
+              readonly
               class="wd200">
           </el-input>
         </el-form-item>
-        <el-form-item label="发票状态:0-待开票 1-已开票 2-已作废" prop="status">
-          <el-input
-              v-model.trim="state.ruleForm.status"
-              placeholder="发票状态:0-待开票 1-已开票 2-已作废"
-              clearable
-              class="wd200">
-          </el-input>
+        <el-form-item label="发票状态" prop="status">
+          <ext-d-label    class="wd200" type="Invoice.status" :model-value="state.ruleForm.status"> </ext-d-label>
         </el-form-item>
-        <el-form-item label="备注" prop="remark">
+<!--        <el-form-item label="备注" prop="remark">
           <el-input
               v-model.trim="state.ruleForm.remark"
               placeholder="备注"
-              clearable
+              readonly
               class="wd200">
           </el-input>
-        </el-form-item>
+        </el-form-item>-->
       </el-form>
 
       <template #footer>
@@ -213,6 +194,7 @@ import {defineAsyncComponent, reactive, onMounted, ref} from 'vue';
 import {Msg} from "/@/utils/message";
 import {$body, $get} from "/@/utils/request";
 import u from '/@/utils/u'
+import ExtDLabel from "/@/components/form/ExtDLabel.vue";
 
 
 // 定义子组件向父组件传值/事件
@@ -221,7 +203,15 @@ const formRef = ref();
 //定义初始变量,重置使用
 const initState = () => ({
   ruleForm: {
-    id: 0
+    id: 0,
+    buyerInformation:{},
+    blueFapiao:{},
+    cardInformation:{},
+    extraInformationd:{},
+    sellerInformation:{},
+  },
+  detail:{
+    orderDetails:{}
   },
   btnLoading: false,
   dialog: {
@@ -242,8 +232,9 @@ const open = (action: string = 'add', row: any) => {
   state.dialog.title = u.dialog.actions[action].title + "『发票记录表』"
   state.dialog.submitTxt = u.dialog.actions[action].btn + "『发票记录表』"
   state.dialog.isShowDialog = true;
+  state.detail = row;
   if (action !== 'add') {
-    loadData(row.id);
+    loadData(row.applyId);
   } else {
     state.ruleForm = Object.assign(state.ruleForm, row);
   }
@@ -282,9 +273,13 @@ const handleFormChange = (formData: any) => {
 }
 
 // 初始化表格数据
-const loadData = (id: number) => {
-  $get(`invoice/detail/${id}`).then((res: any) => {
-    state.ruleForm = res;
+const loadData = (applyId: String) => {
+  $get(`finance/listInvoiceDetail`, {applyId}).then((res: any) => {
+    if (res.list && res.list.length > 0) {
+      state.ruleForm = res.list[0];
+      console.log(state.ruleForm)
+      console.log(state.detail)
+    }
   })
 }
 

+ 17 - 3
admin-web/src/views/admin/invoice/index.vue

@@ -91,6 +91,11 @@
           <SvgIcon name="ele-Search"/>
           查询
         </el-button>
+
+        <el-button class="ml10" plain size="default" type="warning" @click="handleDownloadExcel">
+          <SvgIcon name="ele-Download"/>
+          下载
+        </el-button>
       </el-form>
 
       <el-table
@@ -169,8 +174,9 @@
             </template>
             <template v-else-if="field.prop==='action'">
               <el-button v-if="row.status===0" v-auth="'invoice.modify'" size="small" plain type="warning" @click="handleInvice(row)">开票</el-button>
-              <el-button v-if="row.status===0" v-auth="'invoice.modify'" size="small" plain type="danger" @click="handleCancelInvoice(row)">取消</el-button>
-              <el-button v-if="row.status===1" v-auth="'invoice.modify'" size="small" plain type="success" @click="previewInvoice(row)">查看</el-button>
+              <el-button v-if="row.status===0" v-auth="'invoice.modify'" size="small" plain type="danger" @click="handleCancelInvoice(row)">取消开票</el-button>
+              <el-button v-if="row.status===1" v-auth="'invoice.modify'" size="small" plain type="success" @click="previewInvoice(row)">下载</el-button>
+              <el-button   size="small" plain type="success" @click="handleInfo(row)">详情</el-button>
             </template>
             <template v-else>
               <div>{{ row[field.prop] }}</div>
@@ -256,7 +262,7 @@ const state = reactive({
       {label: '创建时间', prop: 'createTime', sortable: 'custom', resizable: true, width: 170},
       {label: '更新时间', prop: 'updateTime', sortable: 'custom', resizable: true, width: 170},
       {
-        label: '操作', prop: 'action', width: 180, align: 'center', fixed: 'right',
+        label: '操作', prop: 'action', width: 240, align: 'center', fixed: 'right',
       }
     ],
   },
@@ -324,6 +330,14 @@ const handleInvice = (row: any) => {
 
 }
 
+const handleDownloadExcel = () => {
+
+}
+
+const handleInfo = (row:any) => {
+  invoiceDialogRef.value.open('view', row);
+}
+
 
 const previewInvoice =   (row: any) => {
   $get(`/finance/downloadInvoice/${row.id}`).then((res: any) => {

+ 71 - 1
admin/src/main/java/com/kym/admin/controller/FinanceController.java

@@ -1,15 +1,34 @@
 package com.kym.admin.controller;
 
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.poi.excel.ExcelUtil;
+import cn.hutool.poi.excel.ExcelWriter;
 import com.kym.common.R;
 import com.kym.common.annotation.SysLog;
 import com.kym.entity.admin.queryParams.CommonQueryParam;
 import com.kym.entity.admin.queryParams.InvoiceDetailQueryParam;
 import com.kym.entity.admin.queryParams.InvoiceQueryParam;
+import com.kym.entity.common.PageBean;
+import com.kym.entity.miniapp.vo.InvoiceVo;
 import com.kym.service.admin.InvoiceDetailService;
 import com.kym.service.miniapp.InvoiceService;
 import com.kym.service.miniapp.RefundLogService;
 import com.kym.service.wechat.WxPayService;
-import org.springframework.web.bind.annotation.*;
+import jakarta.servlet.ServletOutputStream;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+
 
 /**
  * @author skyline
@@ -103,4 +122,55 @@ public class FinanceController {
     R<?> listInvoiceDetail(@ModelAttribute InvoiceDetailQueryParam params) {
         return R.success(invoiceDetailService.listInvoiceDetail(params));
     }
+
+
+    /**
+     * 导出发票列表
+     *
+     * @param params
+     * @return 导出发票列表
+     */
+    @PostMapping("/export/invoiceList")
+    void exportInvoiceList(@RequestBody InvoiceQueryParam params, HttpServletRequest request, HttpServletResponse response) {
+        params.setPageSize(Integer.MAX_VALUE);
+        PageBean<InvoiceVo> pageBean = invoiceService.listInvoice(params);
+        List<InvoiceVo> list = pageBean.getList();
+        ExcelWriter writer = ExcelUtil.getWriter();
+//设置要导出到的sheet
+        writer.setSheet("列表");
+//自定义excel标题和列名
+        writer.addHeaderAlias("mobilePhone", "用户手机号");
+        writer.addHeaderAlias("invoiceTitle", "发票抬头");
+        writer.addHeaderAlias("taxId", "公司税号");
+        writer.addHeaderAlias("email", "接收发票邮箱");
+        writer.addHeaderAlias("invoiceType", "发票类型");
+        writer.addHeaderAlias("address", "公司地址");
+        writer.addHeaderAlias("telephone", "购买方电话");
+        writer.addHeaderAlias("bankName", "开户银行");
+        writer.addHeaderAlias("bankAccount", "银行账户");
+        writer.addHeaderAlias("biller", "开票人");
+        writer.addHeaderAlias("invoiceAmount", "发票金额");
+        writer.addHeaderAlias("totalPower", "累积充电量");
+        writer.addHeaderAlias("totalMoney", "累积总金额");
+        writer.addHeaderAlias("elecMoney", "累积电费");
+        writer.addHeaderAlias("serviceMoney", "累积服务费");
+        writer.addHeaderAlias("serviceMoneyDiscount", "服务费优惠金额");
+        writer.addHeaderAlias("status", "发票状态");
+//一次性写出内容,使用默认样式,强制输出标题
+        writer.write(list, true);
+        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
+        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("发票列表", StandardCharsets.UTF_8) + ".xlsx");
+        //将excel文件信息写入输出流,返回给调用者
+        ServletOutputStream excelOut = null;
+        try {
+            excelOut = response.getOutputStream();
+            writer.flush(excelOut, true);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            writer.close();
+        }
+        IoUtil.close(excelOut);
+    }
+
 }

+ 1 - 1
admin/src/main/resources/application-dev.yml

@@ -94,7 +94,7 @@ spring:
     redis:
       port: 6380
       host: 121.40.98.15
-      password: kuaiyuman
+      password: kuaiyuman@3rt
       database: 0
       lettuce:
         pool: