Tang 1 年之前
父节点
当前提交
cd74886182
共有 41 个文件被更改,包括 2543 次插入52 次删除
  1. 2 0
      src/api/api.js
  2. 二进制
      src/assets/images/ContractAmount.png
  3. 二进制
      src/assets/images/NumberOfOrders.png
  4. 二进制
      src/assets/images/NumberOfOrders2.png
  5. 二进制
      src/assets/images/OutstandingPayment.png
  6. 二进制
      src/assets/images/PaymentHasBeenReceived.png
  7. 二进制
      src/assets/images/PendingOrder.png
  8. 二进制
      src/assets/images/PendingRefund.png
  9. 二进制
      src/assets/images/Refunded.png
  10. 0 0
      src/assets/images/cbje.png
  11. 0 0
      src/assets/images/ddrs.png
  12. 0 0
      src/assets/images/dds.png
  13. 0 0
      src/assets/images/htje.png
  14. 0 0
      src/assets/images/sjk.png
  15. 0 0
      src/assets/images/wsk.png
  16. 0 0
      src/assets/images/yk.png
  17. 0 0
      src/assets/images/ysk.png
  18. 0 0
      src/assets/images/ytk.png
  19. 34 22
      src/components/Comon/pictureList.vue
  20. 112 0
      src/newApi/orderInvoice.js
  21. 1 1
      src/store/modules/user.js
  22. 2 2
      src/utils/request.js
  23. 8 8
      src/views/Marketing/activitySystem/instantDeath/dialogInstan.vue
  24. 8 8
      src/views/Marketing/activitySystem/instantDeath/index.vue
  25. 8 0
      src/views/Marketing/order/offlineOrder/batchRecord/firstStep/index.vue
  26. 9 1
      src/views/Marketing/order/offlineOrder/batchRecord/secondStep/index.vue
  27. 1 0
      src/views/Marketing/order/offlineOrder/batchRecord/secondStep/setGoodsList.vue
  28. 1 1
      src/views/Marketing/order/orderList/index.vue
  29. 1 1
      src/views/education/classManageMent/classHours/index.vue
  30. 6 4
      src/views/education/classManageMent/classHoursReview/component/StudyTables.vue
  31. 12 3
      src/views/education/classManageMent/learningHoursRecordList/index.vue
  32. 1 1
      src/views/education/classManageMent/studentMenu/index.vue
  33. 283 0
      src/views/finance/invoiceManage/dialogExamine.vue
  34. 85 0
      src/views/finance/invoiceManage/dialogHandle.vue
  35. 77 0
      src/views/finance/invoiceManage/dialogRemark.vue
  36. 374 0
      src/views/finance/invoiceManage/index.vue
  37. 103 0
      src/views/finance/orderManage/dialogHandleBank.vue
  38. 456 0
      src/views/finance/orderManage/index.vue
  39. 410 0
      src/views/finance/orderManage/orderDetail.vue
  40. 254 0
      src/views/finance/orderManage/publicTransfer.vue
  41. 295 0
      src/views/finance/orderManage/refundFunc.vue

+ 2 - 0
src/api/api.js

@@ -102,6 +102,7 @@ import mock from '../newApi/mock'//模考管理
 import mockSub from '../newApi/mockSub'//预约模考管理
 import systemExam from '../newApi/systemExam'//模考活动列表
 import archives from '../newApi/archives'//档案管理
+import orderInvoice from '../newApi/orderInvoice'//订单发票管理
 
 //分销相关
 
@@ -113,6 +114,7 @@ import check from '../fxApi/check'//分销审核
 
 // 导入对应模块------------------------
 export default {
+    ...orderInvoice,
     ...archives,
     ...poster,
     ...temp,

二进制
src/assets/images/ContractAmount.png


二进制
src/assets/images/NumberOfOrders.png


二进制
src/assets/images/NumberOfOrders2.png


二进制
src/assets/images/OutstandingPayment.png


二进制
src/assets/images/PaymentHasBeenReceived.png


二进制
src/assets/images/PendingOrder.png


二进制
src/assets/images/PendingRefund.png


二进制
src/assets/images/Refunded.png


+ 0 - 0
src/assets/images/成本金额@2x.png → src/assets/images/cbje.png


+ 0 - 0
src/assets/images/订单人数@2x.png → src/assets/images/ddrs.png


+ 0 - 0
src/assets/images/订单数@2x.png → src/assets/images/dds.png


+ 0 - 0
src/assets/images/合同金额@2x.png → src/assets/images/htje.png


+ 0 - 0
src/assets/images/实际款@2x.png → src/assets/images/sjk.png


+ 0 - 0
src/assets/images/未收款@2x.png → src/assets/images/wsk.png


+ 0 - 0
src/assets/images/盈亏@2x.png → src/assets/images/yk.png


+ 0 - 0
src/assets/images/已收款@2x.png → src/assets/images/ysk.png


+ 0 - 0
src/assets/images/已退款@2x.png → src/assets/images/ytk.png


+ 34 - 22
src/components/Comon/pictureList.vue

@@ -1,11 +1,21 @@
 <template>
   <div class="dis_flex_order_li">
-    <div class="list" v-for="(item, index) in list" :key="index">
+    <div class="list" v-for="(item, index) in list" :key="index" @click="backFunc(item)">
       <img :src="backFullSrc(item.img)" alt="" />
       <div class="right">
-        <h4>{{ item.label }}:</h4>
-        <p>
-          {{ item.value || info[item.prop] | formatPrice }}{{ item.ch || "元" }}
+        <h4>
+          {{ item.label }}
+          <span
+            v-if="item.label === '盈亏' && info[item.prop] !== 0"
+            :style="info[item.prop] > 0 ? 'color:rgb(99,93,247)' : 'color:red'"
+            >【{{ info[item.prop] > 0 ? "盈" : "亏" }}】</span
+          >
+        </h4>
+        <p v-if="item.num" :style="{ color: item.color || '#000' }">
+          {{ item.value || info[item.prop] || 0 }}
+        </p>
+        <p v-else :style="{ color: item.color || '#000'  }">
+          ¥{{ (item.value || info[item.prop] || 0) | formatPrice }}
         </p>
       </div>
     </div>
@@ -35,8 +45,11 @@ export default {
   },
 
   methods: {
+    backFunc(item){
+      this.$emit('backFunc',item)
+    },
     backFullSrc(name) {
-      return require(`@/assets/images/${name}@2x.png`);
+      return require(`@/assets/images/${name}.png`);
     },
   },
 };
@@ -50,35 +63,34 @@ export default {
   & > .list {
     user-select: none;
     cursor: pointer;
-    transition: all 0.3s;
-    box-shadow: 0px 0px 4px 1px rgba(0, 0, 0, 0.2);
-    &:hover {
-      transform: scale(1.04);
-    }
-    width: 136px;
-    height: 44px;
-    border-radius: 6px;
+    background-color: rgb(243, 249, 255);
+    padding: 4px;
+    width: 170px;
+    height: 60px;
+    border-radius: 3px;
     display: flex;
     align-items: center;
     flex-shrink: 0;
     margin-right: 10px;
-    margin-bottom: 10px;
+    margin-bottom: 15px;
     & > img {
-      margin-left: 2px;
-      width: 40px;
-      height: 40px;
+      margin-left: 10px;
+      width: 36px;
+      height: 36px;
     }
     & > .right {
+      padding-top: 4px;
       flex: 1;
       padding-left: 4px;
       & > h4 {
-        color: #000;
-        margin: 0;
-        font-size: 12px;
+        color: #7f7f7f;
+        margin: 0px 0px 4px 0px;
+        font-size: 14px;
       }
       & > p {
-        font-size: 12px;
-        color: red;
+        font-weight: bold;
+        font-size: 14px;
+        color: #333;
         margin: 0;
       }
     }

+ 112 - 0
src/newApi/orderInvoice.js

@@ -0,0 +1,112 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    //企业订单发票审核
+    orderinvoicecompanycheck(data) {
+        return request({
+            url: '/order/invoice/company/check',
+            method: 'post',
+            data
+        })
+    },
+    //企业订单发票批量处理
+    orderinvoicecompanybatchhandle(data) {
+        return request({
+            url: '/order/invoice/company/batch/handle',
+            method: 'post',
+            data
+        })
+    },
+    //查询企业订单发票列表
+    orderinvoicecompanylist(data) {
+        return request({
+            url: '/order/invoice/company/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //查询企业订单发票统计
+    orderinvoicecompanystatistics(data) {
+        return request({
+            url: '/order/invoice/company/statistics',
+            method: 'get',
+            params: data
+        })
+    },
+    
+    //查询企业订单发票详情
+    orderinvoicecompanydetail(data) {
+        return request({
+            url: '/order/invoice/company/detail/'+data,
+            method: 'get'
+        })
+    },
+
+
+    
+    //经办录单审核
+    orderhandlecheck(data) {
+        return request({
+            url: '/order/handle/check',
+            method: 'post',
+            data
+        })
+    },
+    //经办录单退款审核
+    orderhandlerefundcheck(data) {
+        return request({
+            url: '/order/handle/refund/check',
+            method: 'post',
+            data
+        })
+    },
+    //查询经办录单详情
+    orderhandledetail(data) {
+        return request({
+            url: '/order/handle/detail',
+            method: 'get',
+            params: data
+        })
+    },
+    //查询经办录单商品列表
+    orderhandlegoodsList(data) {
+        return request({
+            url: '/order/handle/goodsList',
+            method: 'get',
+            params: data
+        })
+    },
+    //查询经办录单列表
+    orderhandlelist(data) {
+        return request({
+            url: '/order/handle/list',
+            method: 'get',
+            params: data,
+            isProce:true
+        })
+    },
+    //查询经办录单统计
+    orderhandlestatistics(data) {
+        return request({
+            url: '/order/handle/statistics',
+            method: 'get',
+            params: data,
+            isProce:true
+        })
+    },
+    //获取经办订单收款信息
+    orderhandleBank(data) {
+        return request({
+            url: '/order/handleBank',
+            method: 'get',
+            params: data
+        })
+    },
+    //修改经办订单收款信息
+    orderedithandleBank(data) {
+        return request({
+            url: '/order/edit/handleBank',
+            method: 'post',
+            data
+        })
+    },
+}

+ 1 - 1
src/store/modules/user.js

@@ -68,7 +68,7 @@ const user = {
       func()
       this.state.downLoadlistInterval = setInterval(() => {
         func()
-      }, 5000);
+      }, 30000);
     },
     oldLogin({ commit }, queryData) {
       return new Promise(resolve => {

+ 2 - 2
src/utils/request.js

@@ -8,8 +8,8 @@ import { paramMate } from "@/utils/common";
 
 axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
 // 创建axios实例
-export const baseURL = process.env.VUE_APP_BASE_API
-// export const baseURL = 'http://192.168.1.7:5030/'
+// export const baseURL = process.env.VUE_APP_BASE_API
+export const baseURL = 'http://192.168.1.24:5030/'
 export const BASE_IMG_URL = process.env.VUE_APP_IMG_API
 const service = axios.create({
   // axios中请求配置有baseURL选项,表示请求URL公共部分

+ 8 - 8
src/views/Marketing/activitySystem/instantDeath/dialogInstan.vue

@@ -87,46 +87,46 @@ export default {
         {
           label: "总订单",
           prop: "unPayMoneyTotal",
-          img: "盈亏",
+          img: "yk",
           ch: " ",
         },
         {
           label: "总金额",
           prop: "unPayMoneyTotal",
-          img: "合同金额",
+          img: "htje",
         },
         {
           label: "待支付订单",
           prop: "unPayMoneyTotal",
-          img: "盈亏",
+          img: "yk",
           ch: " ",
         },
         {
           label: "待支付金额",
           prop: "unPayMoneyTotal",
-          img: "合同金额",
+          img: "htje",
         },
         {
           label: "已支付订单",
           prop: "unPayMoneyTotal",
-          img: "盈亏",
+          img: "yk",
           ch: " ",
         },
         {
           label: "已支付金额",
           prop: "unDeductMoneyTotal",
-          img: "合同金额",
+          img: "htje",
         },
         {
           label: "秒杀人数",
           prop: "deductMoneyTotal",
-          img: "合同金额",
+          img: "htje",
           ch: " ",
         },
         {
           label: "支付人数",
           prop: "payMoneyTotal",
-          img: "合同金额",
+          img: "htje",
           ch: " ",
         },
       ],

+ 8 - 8
src/views/Marketing/activitySystem/instantDeath/index.vue

@@ -82,46 +82,46 @@ export default {
         {
           label: "总订单",
           prop: "unPayMoneyTotal",
-          img: "盈亏",
+          img: "yk",
           ch: " ",
         },
         {
           label: "总金额",
           prop: "unPayMoneyTotal",
-          img: "合同金额",
+          img: "htje",
         },
         {
           label: "待支付订单",
           prop: "unPayMoneyTotal",
-          img: "盈亏",
+          img: "yk",
           ch: " ",
         },
         {
           label: "待支付金额",
           prop: "unPayMoneyTotal",
-          img: "合同金额",
+          img: "htje",
         },
         {
           label: "已支付订单",
           prop: "unPayMoneyTotal",
-          img: "盈亏",
+          img: "yk",
           ch: " ",
         },
         {
           label: "已支付金额",
           prop: "unDeductMoneyTotal",
-          img: "合同金额",
+          img: "htje",
         },
         {
           label: "秒杀人数",
           prop: "deductMoneyTotal",
-          img: "合同金额",
+          img: "htje",
           ch: " ",
         },
         {
           label: "支付人数",
           prop: "payMoneyTotal",
-          img: "合同金额",
+          img: "htje",
           ch: " ",
         },
       ],

+ 8 - 0
src/views/Marketing/order/offlineOrder/batchRecord/firstStep/index.vue

@@ -108,6 +108,8 @@
                 ></span
               >
             </div>
+            <el-date-picker v-else-if="item.scope === 'year'" v-model="scope.row[item.prop]" type="year" placeholder="选择年" value-format="yyyy" style="width: 100px;">
+            </el-date-picker>
             <div v-else-if="item.scope === 'sex'">
               {{
                 scope.row[item.prop] == 1
@@ -190,6 +192,11 @@ export default {
           prop: "subjectIds",
           scope: "sujectList",
         },
+        {
+          label: "年份",
+          prop: "year",
+          scope: "year",
+        },
         {
           label: "所在公司",
           prop: "companyName",
@@ -273,6 +280,7 @@ export default {
         topData: this.topData,
         tableData: this.tableData,
       };
+      console.log(obj,'obj')
       this.$parent.changePage("second", obj);
     },
     /**

+ 9 - 1
src/views/Marketing/order/offlineOrder/batchRecord/secondStep/index.vue

@@ -611,7 +611,15 @@ export default {
                     });
                     var datas = ary.map((items) => {
                       if (obj.topData.type.indexOf(items.goodsType) !== -1) {
-                        items.checked = true;
+                        if(item.year){
+                          if(items.year == item.year){
+                            items.checked = true;
+                          }else{
+                            items.checked = false;
+                          }
+                        }else{
+                          items.checked = true;
+                        }
                       } else {
                         items.checked = false;
                       }

+ 1 - 0
src/views/Marketing/order/offlineOrder/batchRecord/secondStep/setGoodsList.vue

@@ -152,6 +152,7 @@ export default {
           let copyData = Object.assign({ ...copyDs, ...row });
           copyData.goodsRealPrice = row.standPrice;
           copyData.goodsReceived = row.standPrice;
+          copyData.year = row.year;
           copyData.subjectId = this.active.split("-").map(Number)[0];
           copyData.checked = true;
           if (this.$parent.toData.templateStatus == 1) {

+ 1 - 1
src/views/Marketing/order/orderList/index.vue

@@ -307,7 +307,7 @@ export default {
         {
           label: "订单来源",
           prop: "orderFrom",
-          hidden: true,
+          hidden: false,
           scope: "isOptions",
           width: "130px",
           options: [

+ 1 - 1
src/views/education/classManageMent/classHours/index.vue

@@ -357,7 +357,7 @@ export default {
       let arr = this.$refs.tableList.allCheckData.map((item) => {
         return {
           userId: item.userId,
-          gradeId: this.$route.query.id,
+          gradeId: item.gradeId,
         };
       });
       this.$api.editGradeUsereditpushPeriod(arr).then((res) => {

+ 6 - 4
src/views/education/classManageMent/classHoursReview/component/StudyTables.vue

@@ -443,8 +443,10 @@ export default {
         });
     },
     goReview() {
-      this.$router.push({
-        name: "ListOfhoursToBeReviewed",
+      this.$store.dispatch("tagsView/delView", this.$route).then((res) => {
+        this.$router.push({
+          name: "ListOfhoursToBeReviewed",
+        });
       });
     },
     scrollFunc() {
@@ -453,7 +455,7 @@ export default {
           .top <= 83
           ? true
           : false;
-          console.log(this.userData.examPending,'fixed')
+      console.log(this.userData.examPending, "fixed");
     },
   },
 
@@ -487,7 +489,7 @@ export default {
       return this.sidebar.opened ? "226px" : "60px";
     },
   },
-  mounted(){
+  mounted() {
     // window.addEventListener("scroll", this.scrollFunc,false);
   },
 };

+ 12 - 3
src/views/education/classManageMent/learningHoursRecordList/index.vue

@@ -18,6 +18,9 @@
       :navText="navText"
       :loading="loading"
     >
+      <template slot="studyJD" slot-scope="props">
+        {{ props.scope.row.stuAllNum }} / {{ props.scope.row.secAllNum }}
+      </template>
       <template slot="btn" slot-scope="props">
         <el-button type="text" @click="activeHoursRecord(props.scope.row)"
           >学习记录</el-button
@@ -190,7 +193,7 @@ export default {
           Diszing: true,
         },
         {
-          prop:"idCard",
+          prop: "idCard",
           placeholder: "身份证",
         },
         {
@@ -241,6 +244,12 @@ export default {
           prop: "classHours",
           hidden: true,
         },
+        {
+          label: "学习进度",
+          hidden: true,
+          scope: "slot",
+          slotName: "studyJD",
+        },
         {
           label: "所在班级",
           prop: "className",
@@ -490,7 +499,7 @@ export default {
               className: v.className,
               goodsId: v.goodsId,
               goodsName: v.goodsName,
-              orderGoodsId:v.orderGoodsId,
+              orderGoodsId: v.orderGoodsId,
               keyId: `${v.userId}-${v.goodsId}-${v.gradeId}-${v.orderGoodsId}`,
             };
             this.checkSession(data)
@@ -663,4 +672,4 @@ export default {
     margin: 5px 0px;
   }
 }
-</style>
+</style>

+ 1 - 1
src/views/education/classManageMent/studentMenu/index.vue

@@ -920,7 +920,7 @@ export default {
         return {
           orderGoodsId:item.orderGoodsId,
           userId: item.userId,
-          gradeId: this.$route.query.id,
+          gradeId: item.gradeId,
         };
       });
       this.$api.editGradeUsereditpushInfo(arr).then((res) => {

+ 283 - 0
src/views/finance/invoiceManage/dialogExamine.vue

@@ -0,0 +1,283 @@
+<template>
+  <div class="">
+    <BaseDialog
+      width="1000px"
+      :isShow.sync="isShow"
+      title="审核"
+      :isShowFooter="false"
+    >
+      <div>
+        <h2 class="h_top">
+          订单详情
+          <el-button type="text" style="margin-left: 20px">查看</el-button>
+        </h2>
+        <div class="li_box">
+          订单编号:<span>LD24010818000464500334</span>商品类型:<span>课程</span>教育类型:<span>考前培训</span>培训项目:<span
+            >施工现场专业人员</span
+          ><br />订购人数:<span>3 位</span>订购数量:<span>4 个</span
+          >下单金额:<span>¥2,000.00</span>退款金额:<span>¥1,000.00</span>实际金额:<span
+            >¥1,000.00</span
+          >
+        </div>
+      </div>
+      <div>
+        <h2 class="h_top">申请信息</h2>
+        <div class="li_box">
+          申请时间:<span>{{
+            $methodsTools.onlyForma(invoiceInfo.applyTime)
+          }}</span
+          ><br />发票类型:<span>{{
+            invoiceInfo.type == 1
+              ? "普通发票"
+              : invoiceInfo.type == 2
+              ? "增值税专用发票"
+              : ""
+          }}</span
+          >发票主体:<span>{{
+            invoiceInfo.subject == 1
+              ? "个人"
+              : invoiceInfo.subject == 2
+              ? "企业"
+              : ""
+          }}</span
+          >企业全称:<span>{{ invoiceInfo.invoiceTitle }}</span
+          >纳税人号:<span>{{ invoiceInfo.taxRegistryNumber }}</span
+          ><br />开票备注:<span>{{ invoiceInfo.openRemark }}</span
+          >收票邮箱:<span>{{ invoiceInfo.email }}</span
+          >收票姓名:<span>{{ invoiceInfo.consignee }}</span
+          >收票电话:<span>{{ invoiceInfo.collectionTelephone }}</span
+          >收票地址:<span>{{ invoiceInfo.shippingAddress }}</span>
+        </div>
+      </div>
+      <div>
+        <h2 class="h_top">开票信息</h2>
+        <div class="li_box">
+          <p style="margin-top: 0px">
+            本次申请开票金额:<span
+              style="color: red; font-weight: bold; font-size: 16px"
+              >¥{{ invoiceInfo.amount | formatPrice }}</span
+            >
+          </p>
+          <el-upload
+            ref="uploadFile"
+            class="upload-demo"
+            action="#"
+            :http-request="uploadFile"
+            :file-list="fileList"
+            list-type="picture-card"
+            multiple
+          >
+            <div slot="default">
+              <el-button type="text" style="line-height: 22px"
+                >+上传发票<br /><span style="color: #999"
+                  >支持PNG/JPG</span
+                ></el-button
+              >
+            </div>
+            <!-- <i slot="default" class="el-icon-plus"></i> -->
+            <div slot="file" slot-scope="{ file }">
+              <img
+                class="el-upload-list__item-thumbnail"
+                :src="file.url"
+                alt=""
+              />
+              <span class="el-upload-list__item-actions">
+                <span
+                  class="el-upload-list__item-preview"
+                  @click="handlePictureCardPreview(file)"
+                >
+                  <i class="el-icon-zoom-in"></i>
+                </span>
+                <span
+                  v-if="!disabled"
+                  class="el-upload-list__item-delete"
+                  @click="beforeRemove(file)"
+                >
+                  <i class="el-icon-delete"></i>
+                </span>
+              </span>
+            </div>
+          </el-upload>
+        </div>
+      </div>
+      <div>
+        <h2 class="h_top">收票方式</h2>
+        <div class="li_box">
+          <el-checkbox-group :value="checkList">
+            <el-checkbox label="1">在线下载</el-checkbox>
+            <el-checkbox label="2">邮件接收</el-checkbox>
+            <el-checkbox label="3">纸质快递</el-checkbox>
+          </el-checkbox-group>
+          <el-input
+            style="margin-top: 14px"
+            :rows="4"
+            type="textarea"
+            v-model="handleRemark"
+            placeholder="请输入备注"
+          ></el-input>
+        </div>
+      </div>
+      <el-divider></el-divider>
+      <div>
+        <el-button size="small" type="primary" @click="submit"
+          >审核通过</el-button
+        >
+        <el-button size="small" type="warning" @click="close"
+          >审核不通过</el-button
+        >
+      </div>
+    </BaseDialog>
+    <el-dialog :visible.sync="dialogVisible">
+      <img width="100%" :src="dialogImageUrl" alt="" />
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      dialogImageUrl: "",
+      dialogVisible: false,
+      isShow: false,
+      invoiceInfo: {},
+      fileList: [],
+      checkList: [],
+      handleRemark: "",
+    };
+  },
+
+  mounted() {},
+
+  methods: {
+    openBoxs(row) {
+      this.invoiceInfo = {};
+      this.fileList = [];
+      this.checkList = [];
+      this.handleRemark = "";
+      this.isShow = true;
+      this.$api.orderinvoicecompanydetail(row.invoiceId).then((res) => {
+        this.invoiceInfo = res.data || {};
+        this.checkList = res.data.invoiceMode.split(",");
+        this.handleRemark = res.data.handleRemark || "";
+      });
+    },
+    handlePictureCardPreview(file) {
+      this.dialogImageUrl = file.url;
+      this.dialogVisible = true;
+    },
+    uploadFile(fileObj) {
+      let file = fileObj.file;
+      var type = file.name.toLowerCase().split(".").splice(-1);
+      let typeList = ["jpg", "png"];
+      if (!typeList.includes(type[0])) {
+        this.$message.error("上传格式需为:.jpg/.png");
+        const idx = this.$refs.uploadFile.uploadFiles.findIndex(
+          (item) => item.uid === file.uid
+        );
+        this.$refs.uploadFile.uploadFiles.splice(idx, 1);
+        return;
+      }
+      if (file.size > 0.3 * 1024 * 1024) {
+        this.$message.error("图片不得大于300kb");
+        const idx = this.$refs.uploadFile.uploadFiles.findIndex(
+          (item) => item.uid === file.uid
+        );
+        this.$refs.uploadFile.uploadFiles.splice(idx, 1);
+        return;
+      }
+      this.$upload
+        .upload(file, 2)
+        .then((res) => {
+          this.fileList.push({
+            name: file.name,
+            uid: file.uid, //带上上传前的uid作为标识
+            url: this.$methodsTools.splitImgHost(res),
+            deletable: true,
+            imageFit: "contain",
+            previewSize: 80,
+            baseUrl: res,
+          });
+        })
+        .catch(() => {
+          this.$message.error("上传失败");
+          const idx = this.$refs.uploadFile.uploadFiles.findIndex(
+            (item) => item.uid === file.uid
+          );
+          this.$refs.uploadFile.uploadFiles.splice(idx, 1);
+        });
+    },
+    beforeRemove(file) {
+      this.fileList = this.fileList.filter((i) => i.uid != file.uid);
+    },
+    close() {
+      this.$prompt("输入不通过原因", "确定审核不通过吗?", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        inputPattern: /^.{1,10000}$/,
+        inputErrorMessage: "请输入不通过原因",
+      })
+        .then(({ value }) => {
+          let formData = {
+            checkReason: value,
+            checkResult: 2,
+            invoiceId: this.invoiceInfo.invoiceId,
+          };
+          this.$api.orderinvoicecompanycheck(formData).then((res) => {
+            this.$message.success("操作成功");
+            this.isShow = false;
+            this.$parent.search();
+          });
+        })
+        .catch(() => {});
+    },
+    submit() {
+      if (this.fileList.length == 0) {
+        this.$message.error("请上传发票");
+        return;
+      }
+      this.$confirm("确定审核通过吗", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          let imgList = this.fileList.map((i) => i.baseUrl).join();
+          let formData = {
+            checkResult: 1,
+            handleRemark: this.handleRemark,
+            invoiceId: this.invoiceInfo.invoiceId,
+            invoiceUrlList: imgList,
+          };
+          this.$api.orderinvoicecompanycheck(formData).then((res) => {
+            this.$message.success("审核成功");
+            this.isShow = false;
+            this.$parent.search();
+          });
+        })
+        .catch(() => {});
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+/deep/ .el-dialog__body {
+  padding: 8px 20px !important;
+}
+.h_top {
+  color: #000;
+  font-weight: bold;
+  font-size: 14px;
+}
+.li_box {
+  padding: 20px;
+  background-color: #f9fafb;
+  line-height: 28px;
+  border-radius: 8px;
+  & > span {
+    color: #000;
+    margin-right: 28px;
+  }
+}
+</style>

+ 85 - 0
src/views/finance/invoiceManage/dialogHandle.vue

@@ -0,0 +1,85 @@
+<template>
+  <div class="">
+    <BaseDialog
+      width="600px"
+      :isShow.sync="isShow"
+      title="处理备注"
+      @close="close"
+      @submit="submit"
+    >
+      <el-checkbox-group :value="checkList">
+        <el-checkbox label="1">在线下载</el-checkbox>
+        <el-checkbox label="2">邮件接收</el-checkbox>
+        <el-checkbox label="3">纸质快递</el-checkbox>
+      </el-checkbox-group>
+      <el-input
+        style="margin-top: 14px"
+        :rows="4"
+        type="textarea"
+        v-model="handleRemark"
+        placeholder="请输入备注"
+      ></el-input>
+    </BaseDialog>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    dialogVisible: {
+      type: Boolean,
+      default: false,
+    },
+    info: {
+      type: Object,
+      default: () => {
+        return {};
+      },
+    },
+  },
+  data() {
+    return {
+      handleRemark: "",
+      checkList: [],
+    };
+  },
+
+  mounted() {},
+
+  methods: {
+    init() {
+      var obj = JSON.parse(JSON.stringify(this.info));
+      this.checkList = obj.invoiceMode.split(",");
+      this.handleRemark = obj.handleRemark || "";
+    },
+    close() {},
+    submit() {
+      this.$api
+        .orderinvoicecompanybatchhandle({
+          invoiceIds: [this.info.invoiceId],
+          handleRemark: this.handleRemark,
+        })
+        .then((res) => {
+          this.$message.success("操作成功");
+          this.$parent.search();
+          this.isShow = false;
+        });
+    },
+  },
+  computed: {
+    isShow: {
+      get() {
+        if (this.dialogVisible) {
+          this.init();
+        }
+        return this.dialogVisible;
+      },
+      set(val) {
+        this.$emit("update:dialogVisible", false);
+      },
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped></style>

+ 77 - 0
src/views/finance/invoiceManage/dialogRemark.vue

@@ -0,0 +1,77 @@
+<template>
+  <div class="">
+    <BaseDialog
+      width="600px"
+      :isShow.sync="isShow"
+      title="备注"
+      @close="close"
+      @submit="submit"
+    >
+      <el-input
+        :rows="8"
+        type="textarea"
+        v-model="remark"
+        placeholder="请输入备注"
+      ></el-input>
+    </BaseDialog>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    dialogVisible: {
+      type: Boolean,
+      default: false,
+    },
+    info: {
+      type: Object,
+      default: () => {
+        return {};
+      },
+    },
+  },
+  data() {
+    return {
+      remark: "",
+    };
+  },
+
+  mounted() {},
+
+  methods: {
+    init() {
+      var obj = JSON.parse(JSON.stringify(this.info));
+      this.remark = obj.remark || "";
+    },
+    close() {},
+    submit() {
+      this.$api
+        .orderinvoicecompanybatchhandle({
+          invoiceIds: [this.info.invoiceId],
+          remark: this.remark,
+        })
+        .then((res) => {
+          this.$message.success("操作成功");
+          this.$parent.search();
+          this.isShow = false;
+        });
+    },
+  },
+  computed: {
+    isShow: {
+      get() {
+        if (this.dialogVisible) {
+          this.init();
+        }
+        return this.dialogVisible;
+      },
+      set(val) {
+        this.$emit("update:dialogVisible", false);
+      },
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped></style>

+ 374 - 0
src/views/finance/invoiceManage/index.vue

@@ -0,0 +1,374 @@
+<template>
+  <div id="invoiceManage">
+    <search-box-new
+      ref="searchBox"
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="search(2)"
+      :remarkStatus="true"
+    />
+    <picture-list
+      ref="pictureList"
+      :info="info"
+      :list="showTabList"
+      @backFunc="pictureFunc"
+    ></picture-list>
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+    >
+      <template slot="customize">
+        <el-button type="primary">批量冲红</el-button>
+      </template>
+      <template slot="applyFor" slot-scope="props">
+        <p>
+          申请时间:{{ $methodsTools.onlyForma(props.scope.row.applyTime) }}
+        </p>
+        <p>
+          开票时间:{{ $methodsTools.onlyForma(props.scope.row.invoiceTime) }}
+        </p>
+        <p>订单编号:{{ props.scope.row.orderSn }}</p>
+        <p>申请金额:{{ props.scope.row.invoicePrice | formatPrice }}</p>
+      </template>
+      <template slot="invoice" slot-scope="props">
+        <p>
+          发票类型:{{
+            props.scope.row.type == 1
+              ? "普通发票"
+              : props.scope.row.type == 2
+              ? "增值税专用发票"
+              : ""
+          }}
+        </p>
+        <p>
+          发票主体:{{
+            props.scope.row.subject == 1
+              ? "个人"
+              : props.scope.row.subject == 2
+              ? "企业"
+              : ""
+          }}
+        </p>
+        <p>企业全称:{{ props.scope.row.invoiceTitle }}</p>
+        <p>纳税人号:{{ props.scope.row.taxRegistryNumber }}</p>
+        <p>开票备注:{{ props.scope.row.openRemark }}</p>
+      </template>
+      <template slot="invoice1" slot-scope="props">
+        <p>收票邮箱:{{ props.scope.row.email }}</p>
+        <p>收票姓名:{{ props.scope.row.consignee }}</p>
+        <p>收票电话:{{ props.scope.row.collectionTelephone }}</p>
+        <p>收票地址:{{ props.scope.row.shippingAddress }}</p>
+      </template>
+      <template slot="invoice2" slot-scope="props">
+        <p v-if="props.scope.row.invoiceMode.includes(1)">在线下载</p>
+        <p v-if="props.scope.row.invoiceMode.includes(2)">邮件接收</p>
+        <p v-if="props.scope.row.invoiceMode.includes(3)">纸质快递</p>
+      </template>
+      <template slot="btn" slot-scope="props">
+        <el-button type="text" @click="examineFunc(props.scope.row)" >审核</el-button>
+        <el-button type="text" @click="handleFunc(props.scope.row)"  :disabled="!(props.scope.row.invoiceStatus == 1 || props.scope.row.invoiceStatus == 2)"
+          >处理</el-button
+        >
+        <el-button
+          type="text"
+          @click="blush([props.scope.row.invoiceId])"
+          :disabled="props.scope.row.washStatus == 2 || props.scope.row.invoiceStatus == 1"
+          >冲红</el-button
+        >
+        <el-button type="text" @click="remarkFunc(props.scope.row)"
+          >备注</el-button
+        >
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+    <dialogRemark :dialogVisible.sync="dialogVisible" :info="activeInfo" />
+    <dialogHandle :dialogVisible.sync="dialogHandle" :info="activeInfo" />
+    <dialog-examine ref="dialogExamine" />
+  </div>
+</template>
+
+<script>
+import dialogRemark from "./dialogRemark.vue";
+import dialogHandle from "./dialogHandle.vue";
+import dialogExamine from "./dialogExamine.vue"
+import pictureList from "@/components/Comon/pictureList.vue";
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+export default {
+  name: "",
+  components: {
+    searchBoxNew,
+    tableList,
+    pagination,
+    pictureList,
+    dialogRemark,
+    dialogHandle,
+    dialogExamine
+  },
+  data() {
+    return {
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "申请列表",
+        index: 0,
+        ch: "条",
+        num: true,
+        choice: true,
+        addHide: true,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      info: {},
+      dialogVisible: false,
+      dialogHandle: false,
+      showTabList: [
+        {
+          label: "申请金额",
+          img: "ContractAmount",
+          prop: "applyMoney",
+        },
+        {
+          label: "已审金额",
+          img: "PaymentHasBeenReceived",
+          prop: "checkMoney",
+        },
+        {
+          label: "待审金额",
+          img: "OutstandingPayment",
+          prop: "unCheckMoney",
+        },
+        {
+          label: "申请数量",
+          img: "NumberOfOrders2",
+          prop: "applyNum",
+          num: true,
+        },
+        {
+          label: "待审发票",
+          img: "PendingOrder",
+          prop: "unApplyNum",
+          num: true,
+          color: "#ff7a38",
+        },
+      ],
+      //搜索
+      formList: [
+        {
+          prop: "goodsType",
+          placeholder: "商品类型",
+          scope: "select",
+          options: [
+            { label: "课程", value: 1 },
+            { label: "题库", value: 2 },
+          ],
+        },
+        {
+          prop: "educationTypeId",
+          placeholder: "教育类型",
+          scope: "educationType",
+        },
+        {
+          prop: "businessId",
+          placeholder: "业务层次",
+          scope: "businessLevel",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "invoiceStatus",
+          placeholder: "发票状态",
+          scope: "select",
+          options: [
+            { label: "已开票", value: 2 },
+            { label: "待审核", value: 1 },
+            { label: "不通过", value: 3 },
+          ],
+        },
+        {
+          prop: "washStatus",
+          placeholder: "冲红状态",
+          scope: "select",
+          options: [
+            { label: "待冲红", value: 1 },
+            { label: "已冲红", value: 2 },
+          ],
+        },
+        {
+          prop: "invoiceMode",
+          placeholder: "收票方式",
+          scope: "select",
+          options: [
+            { label: "在线下载", value: 1 },
+            { label: "邮件接收", value: 2 },
+            { label: "纸质快递", value: 3 },
+          ],
+        },
+        {
+          prop: "keyword",
+          placeholder: "输入订单编号/姓名/身份证号",
+        },
+      ],
+      formData: {
+        pageSize: 10,
+        pageNum: 1,
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "发票状态",
+          prop: "invoiceStatus",
+          hidden: true,
+          scope: "isOptions",
+          options: [
+            { label: "已开票", value: 2 },
+            { label: "待审核", value: 1 },
+            { label: "不通过", value: 3 },
+          ],
+        },
+        {
+          label: "申请",
+          hidden: true,
+          scope: "slot",
+          slotName: "applyFor",
+          dontCenter: true,
+        },
+        {
+          label: "开票信息",
+          hidden: true,
+          scope: "slot",
+          slotName: "invoice",
+          dontCenter: true,
+        },
+        {
+          label: "收票信息",
+          hidden: true,
+          scope: "slot",
+          slotName: "invoice1",
+          dontCenter: true,
+        },
+        {
+          label: "冲红状态",
+          prop: "washStatus",
+          hidden: true,
+          scope: "isOptions",
+          options: [
+            { label: "待冲红", value: 1 },
+            { label: "已冲红", value: 2 },
+          ],
+        },
+        {
+          label: "收票方式",
+          hidden: true,
+          scope: "slot",
+          slotName: "invoice2",
+        },
+        {
+          label: "处理备注",
+          prop: "handleRemark",
+          hidden: true,
+        },
+        {
+          label: "备注",
+          prop: "remark",
+          hidden: true,
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+      activeInfo: {},
+    };
+  },
+  mounted() {
+    this.search();
+  },
+  methods: {
+    pictureFunc(item) {
+      if (item.prop == "unApplyNum") {
+        this.formData.invoiceStatus = 1;
+        this.search();
+      }
+    },
+    examineFunc(row){
+      this.$refs.dialogExamine.openBoxs(row)
+    },
+    remarkFunc(row) {
+      this.dialogVisible = true;
+      this.activeInfo = row;
+    },
+    handleFunc(row) {
+      this.dialogHandle = true;
+      this.activeInfo = row;
+    },
+    blush(ary) {
+      this.$confirm("确定已冲红吗?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          this.$api
+            .orderinvoicecompanybatchhandle({
+              invoiceIds: ary,
+              washStatus: 2,
+            })
+            .then((res) => {
+              this.$message.success("操作成功");
+              this.search();
+            });
+        })
+        .catch(() => {});
+    },
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          pageSize: 10,
+          pageNum: 1,
+        };
+      }
+      this.$api
+        .orderinvoicecompanylist(this.formData)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+      let obj = JSON.parse(JSON.stringify(this.formData));
+      delete obj.pageNum;
+      delete obj.pageSize;
+      this.$api.orderinvoicecompanystatistics(obj).then((res) => {
+        console.log(res, "res");
+        this.info = res.data || {};
+      });
+    },
+    handleSizeChange(v) {
+      this.formData.pageSize = v;
+      this.formData.pageNum = 1;
+      this.search();
+    },
+    handleCurrentChange(v) {
+      this.formData.pageNum = v;
+      this.search();
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 103 - 0
src/views/finance/orderManage/dialogHandleBank.vue

@@ -0,0 +1,103 @@
+<template>
+  <div class="">
+    <BaseDialog
+      width="600px"
+      :isShow.sync="isShow"
+      title="收款信息"
+      confirmName="保存"
+      @close="close"
+      @submit="submit"
+    >
+      <el-form
+        :model="ruleForm"
+        :rules="rules"
+        ref="ruleForm"
+        label-width="100px"
+        class="demo-ruleForm"
+      >
+        <el-form-item label="企业全称" prop="recCompanyName">
+          <el-input
+            placeholder="请输入企业全称"
+            v-model="ruleForm.recCompanyName"
+          ></el-input> </el-form-item
+        ><el-form-item label="开户银行" prop="recCompanyBank">
+          <el-input
+            placeholder="请输入开户银行"
+            v-model="ruleForm.recCompanyBank"
+          ></el-input> </el-form-item
+        ><el-form-item label="银行账户" prop="recCompanyAccount">
+          <el-input
+            placeholder="请输入银行账户"
+            v-model="ruleForm.recCompanyAccount"
+          ></el-input> </el-form-item
+      ></el-form>
+    </BaseDialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      isShow: false,
+      ruleForm: {
+        recCompanyName: "",
+        recCompanyBank: "",
+        recCompanyAccount: "",
+      },
+      rules: {
+        recCompanyName: [
+          { required: true, message: "请输入企业全称", trigger: "blur" },
+        ],
+        recCompanyBank: [
+          { required: true, message: "请输入开户银行", trigger: "blur" },
+        ],
+        recCompanyAccount: [
+          { required: true, message: "请输入银行账户", trigger: "blur" },
+        ],
+      },
+    };
+  },
+
+  mounted() {},
+
+  methods: {
+    openBoxs() {
+      this.isShow = true;
+      this.ruleForm = {
+        recCompanyName: "",
+        recCompanyBank: "",
+        recCompanyAccount: "",
+      };
+      this.$api.orderhandleBank().then((res) => {
+        if (res.data) {
+          this.ruleForm = {
+            recCompanyName: res.data.recCompanyName,
+            recCompanyBank: res.data.recCompanyBank,
+            recCompanyAccount: res.data.recCompanyAccount,
+          };
+        }
+      });
+    },
+    close() {
+      this.$refs.ruleForm.clearValidate();
+    },
+    submit() {
+      this.$refs["ruleForm"].validate((valid) => {
+        if (valid) {
+          this.$api.orderedithandleBank(this.ruleForm).
+            then((res) => {
+              this.$message.success("保存成功");
+              this.isShow = false;
+            });
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped></style>

+ 456 - 0
src/views/finance/orderManage/index.vue

@@ -0,0 +1,456 @@
+<template>
+  <div id="orderManage">
+    <search-box-new
+      ref="searchBox"
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="search(2)"
+      :remarkStatus="true"
+    />
+    <picture-list
+      ref="pictureList"
+      :info="info"
+      :list="showTabList"
+      @backFunc="pictureFunc"
+    ></picture-list>
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+    >
+      <template slot="customize">
+        <el-button type="primary" @click="collection">收款信息</el-button>
+      </template>
+      <template slot="applyFor" slot-scope="props">
+        <p>
+          创建时间:{{ $methodsTools.onlyForma(props.scope.row.createTime) }}
+        </p>
+        <p>通过时间:{{ $methodsTools.onlyForma(props.scope.row.overTime) }}</p>
+        <p>订单编号:{{ props.scope.row.handleOrderSn }}</p>
+      </template>
+      <template slot="invoice" slot-scope="props">
+        <p>
+          商品类型:{{
+            props.scope.row.goodsType == 1
+              ? "课程"
+              : props.scope.row.goodsType == 2
+              ? "题库"
+              : "-"
+          }}
+        </p>
+        <p>教育类型:{{ props.scope.row.educationName }}</p>
+        <p>
+          培训项目:{{
+            props.scope.row.projectName + " - " + props.scope.row.businessName
+          }}
+        </p>
+        <p>订购人数:{{ props.scope.row.userNum || 0 }}位</p>
+        <p>订购数量:{{ props.scope.row.goodsNum || 0 }}个</p>
+      </template>
+      <template slot="invoice1" slot-scope="props">
+        <p>下单金额:¥{{ props.scope.row.orderPrice | formatPrice }}</p>
+        <p>退款金额:¥{{ props.scope.row.goodsRefund | formatPrice }}</p>
+        <p>实际金额:¥{{ props.scope.row.payPrice | formatPrice }}</p>
+      </template>
+      <template slot="invoice2" slot-scope="props">
+        <el-button
+          v-if="
+            (props.scope.row.payStatus == 1 ||
+              props.scope.row.payStatus == 2 ||
+              props.scope.row.payStatus == -2) &&
+            props.scope.row.payType == 2
+          "
+          type="text"
+          @click="seeZZ(props.scope.row.handleOrderSn)"
+          >查看</el-button
+        >
+      </template>
+      <template slot="invoice3" slot-scope="props">
+        <span v-if="props.scope.row.invoiceStatus == 1">待审核</span>
+        <span v-if="props.scope.row.invoiceStatus == 2">已开票</span>
+        <span v-if="props.scope.row.invoiceStatus == 3">不通过</span>
+        <span v-if="props.scope.row.invoiceUrl"
+          >({{ props.scope.row.invoiceUrl.split(",").length }}张)
+        </span>
+        <div v-if="props.scope.row.invoiceUrl">
+          <el-button
+            type="text"
+            @click="downinvoice(props.scope.row.invoiceUrl.split(','))"
+            >下载</el-button
+          >
+        </div>
+      </template>
+      <template slot="btn" slot-scope="props">
+        <el-button type="text" @click="orderDetail(props.scope.row)"
+          >查看详情</el-button
+        ><el-button
+          type="text"
+          @click="orderSH(props.scope.row)"
+          :disabled="props.scope.row.payStatus !== 2"
+          >订单审核</el-button
+        ><el-button
+          type="text"
+          :disabled="props.scope.row.refundStatus !== 0"
+          @click="refundFunc(props.scope.row)"
+          >退款审核</el-button
+        >
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+    <public-transfer ref="publicTransfer" />
+    <dialogHandleBank ref="dialogHandleBank" />
+    <orderDetail ref="orderDetail" />
+    <refundFunc ref="refundFunc" />
+  </div>
+</template>
+
+<script>
+import publicTransfer from "./publicTransfer.vue";
+import dialogHandleBank from "./dialogHandleBank.vue";
+import orderDetail from "./orderDetail.vue";
+import refundFunc from "./refundFunc.vue";
+import pictureList from "@/components/Comon/pictureList.vue";
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+export default {
+  name: "",
+  components: {
+    searchBoxNew,
+    tableList,
+    pagination,
+    pictureList,
+    dialogHandleBank,
+    orderDetail,
+    refundFunc,
+    publicTransfer,
+  },
+  data() {
+    return {
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "订单列表",
+        index: 0,
+        ch: "条",
+        num: true,
+        choice: false,
+        addHide: true,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      info: {},
+      showTabList: [
+        {
+          label: "下单金额",
+          img: "ContractAmount",
+          prop: "orderPrice",
+        },
+        {
+          label: "退款金额",
+          img: "Refunded",
+          prop: "refundPrice",
+        },
+        {
+          label: "实际金额",
+          img: "PaymentHasBeenReceived",
+          prop: "payPrice",
+        },
+        {
+          label: "订单数量",
+          img: "NumberOfOrders2",
+          prop: "orderNum",
+          num: true,
+        },
+        {
+          label: "订单人数",
+          img: "NumberOfOrders",
+          prop: "orderUserNum",
+          num: true,
+        },
+        {
+          label: "待审订单",
+          img: "PendingOrder",
+          prop: "unCheckOrderNum",
+          num: true,
+          color: "#ff7a38",
+        },
+        {
+          label: "待审退款",
+          img: "PendingRefund",
+          prop: "unRefundNum",
+          num: true,
+          color: "#ff7a38",
+        },
+      ],
+      //搜索
+      formList: [
+        {
+          prop: "goodsType",
+          placeholder: "商品类型",
+          scope: "select",
+          options: [
+            { label: "课程", value: 1 },
+            { label: "题库", value: 2 },
+          ],
+        },
+        {
+          prop: "educationTypeId",
+          placeholder: "教育类型",
+          scope: "educationType",
+        },
+        {
+          prop: "businessId",
+          placeholder: "业务层次",
+          scope: "businessLevel",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "payStatus",
+          placeholder: "订单状态",
+          scope: "select",
+          options: [
+            { label: "待支付", value: 0 },
+            { label: "已支付", value: 1 },
+            { label: "已关闭", value: -1 },
+            { label: "审核中", value: 2 },
+            { label: "不通过", value: -2 },
+          ],
+        },
+        {
+          prop: "refundStatus",
+          placeholder: "退款状态",
+          scope: "select",
+          options: [
+            { label: "待审核", value: 0 },
+            { label: "已退款", value: 1 },
+            { label: "不通过", value: 2 },
+          ],
+        },
+        {
+          prop: "invoiceStatus",
+          placeholder: "发票状态",
+          scope: "select",
+          options: [
+            { label: "待审核", value: 1 },
+            { label: "已开票", value: 2 },
+            { label: "不通过", value: 3 },
+          ],
+        },
+        {
+          prop1: "startTime",
+          prop2: "endTime",
+          placeholder1: "通过开始时间",
+          placeholder2: "通过结束时间",
+          scope: "moreDataPicker",
+          Diszing: true,
+        },
+        {
+          prop: "searchKey",
+          placeholder: "输入姓名/身份证号/商品名称",
+        },
+      ],
+      formData: {
+        pageSize: 10,
+        pageNum: 1,
+        payStatus: "",
+        refundStatus: "",
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "订单状态",
+          prop: "payStatus",
+          hidden: true,
+          scope: "isOptions",
+          options: [
+            { label: "待支付", value: 0 },
+            { label: "已支付", value: 1 },
+            { label: "已关闭", value: -1 },
+            { label: "审核中", value: 2 },
+            { label: "不通过", value: -2 },
+          ],
+        },
+        {
+          label: "订单信息",
+          hidden: true,
+          scope: "slot",
+          slotName: "applyFor",
+          dontCenter: true,
+        },
+        {
+          label: "商品信息",
+          hidden: true,
+          scope: "slot",
+          slotName: "invoice",
+          dontCenter: true,
+        },
+        {
+          label: "订单金额",
+          hidden: true,
+          scope: "slot",
+          slotName: "invoice1",
+          dontCenter: true,
+        },
+        {
+          label: "支付方式",
+          prop: "payType",
+          hidden: true,
+          scope: "isOptions",
+          options: [
+            { label: "微信支付", value: 1 },
+            { label: "对公转账", value: 2 },
+          ],
+        },
+        {
+          label: "转账凭证",
+          hidden: true,
+          scope: "slot",
+          slotName: "invoice2",
+        },
+        {
+          label: "发票状态",
+          hidden: true,
+          scope: "slot",
+          slotName: "invoice3",
+        },
+        {
+          label: "退款状态",
+          prop: "refundStatus",
+          hidden: true,
+          scope: "isOptions",
+          options: [
+            { label: "待审核", value: 0 },
+            { label: "已退款", value: 1 },
+            { label: "不通过", value: 2 },
+          ],
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+    };
+  },
+  mounted() {
+    this.search();
+  },
+  methods: {
+    pictureFunc(item) {
+      if (item.prop == "unCheckOrderNum") {
+        this.formData.payStatus = 2;
+        this.search();
+      }
+      if (item.prop == "unRefundNum") {
+        this.formData.refundStatus = 0;
+        this.search();
+      }
+    },
+    seeZZ(sn) {
+      this.$refs.publicTransfer.openBoxs(sn);
+    },
+    collection() {
+      this.$refs.dialogHandleBank.openBoxs();
+    },
+    //退款审核
+    refundFunc(row) {
+      this.$refs.refundFunc.openBoxs(row.handleOrderSn);
+    },
+    orderSH(row) {
+      this.$refs.orderDetail.openBoxs(row.handleOrderSn, true);
+    },
+    //查看详情
+    orderDetail(row) {
+      this.$refs.orderDetail.openBoxs(row.handleOrderSn);
+    },
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          pageSize: 10,
+          pageNum: 1,
+          payStatus: "",
+          refundStatus: "",
+        };
+      }
+      this.$api
+        .orderhandlelist(this.formData)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+      let obj = JSON.parse(JSON.stringify(this.formData));
+      delete obj.pageNum;
+      delete obj.pageSize;
+      this.$api.orderhandlestatistics(obj).then((res) => {
+        this.info = res.data || {};
+      });
+    },
+    handleSizeChange(v) {
+      this.formData.pageSize = v;
+      this.formData.pageNum = 1;
+      this.search();
+    },
+    handleCurrentChange(v) {
+      this.formData.pageNum = v;
+      this.search();
+    },
+    downinvoice(ary) {
+      for (let i = 0; i < ary.length; i++) {
+        this.download(this.$methodsTools.splitImgHost(ary[i]));
+      }
+    },
+    //下载
+    download(url, fileName = "") {
+      let xhr = new XMLHttpRequest();
+      xhr.open("get", url, true);
+      xhr.setRequestHeader("Content-Type", `application/pdf`);
+      xhr.responseType = "blob";
+      let that = this;
+      xhr.onload = function () {
+        if (this.status == 200) {
+          //接受二进制文件流
+          var blob = this.response;
+          that.downloadExportFile(blob, fileName);
+        }
+      };
+      xhr.send();
+    },
+
+    downloadExportFile(blob, tagFileName) {
+      let downloadElement = document.createElement("a");
+      let href = "";
+      if (typeof blob == "string") {
+        downloadElement.target = "_blank";
+      } else {
+        href = window.URL.createObjectURL(blob); //创建下载的链接
+      }
+      downloadElement.href = href;
+      downloadElement.download = tagFileName;
+      //下载后文件名
+      document.body.appendChild(downloadElement);
+      downloadElement.click(); //点击下载
+      document.body.removeChild(downloadElement); //下载完成移除元素
+      if (typeof blob != "string") {
+        window.URL.revokeObjectURL(href); //释放掉blob对象
+      }
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 410 - 0
src/views/finance/orderManage/orderDetail.vue

@@ -0,0 +1,410 @@
+<template>
+  <div id="">
+    <el-dialog
+      :visible.sync="visible"
+      width="1200px"
+      :show-close="false"
+      :close-on-click-modal="false"
+      :append-to-body="true"
+      @closed="close"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">详情</div>
+        <div class="rightBoxs">
+          <img
+            src="@/assets/images/Close@2x.png"
+            alt=""
+            @click="visible = false"
+          />
+        </div>
+      </div>
+
+      <div class="top_box">
+        <div>
+          订单编号:<span style="margin-right: 14px; color: #007aff">{{
+            orderInfo.handleOrderSn
+          }}</span
+          >订单状态:<span style="margin-right: 14px; color: #007aff">{{
+            getPayStatus(orderInfo.payStatus)
+          }}</span>
+        </div>
+        <div>
+          <el-button
+            v-if="shStatus"
+            size="small"
+            type="primary"
+            @click="submit(1)"
+            >审核通过</el-button
+          >
+          <el-button
+            v-if="shStatus"
+            size="small"
+            type="warning"
+            @click="submit(2)"
+            >审核不通过</el-button
+          >
+        </div>
+      </div>
+      <el-main v-loading="loading" style="padding: 20px 0px">
+        <el-descriptions class="margin-top" :column="3" border>
+          <el-descriptions-item label="创建时间">
+            {{ $methodsTools.onlyForma(orderInfo.createTime) }}
+          </el-descriptions-item>
+          <el-descriptions-item label="通过时间">
+            {{ $methodsTools.onlyForma(orderInfo.payTime) }}
+          </el-descriptions-item>
+          <el-descriptions-item label="商品类型">
+            {{
+              orderInfo.goodsType == 1
+                ? "课程"
+                : orderInfo.goodsType == 2
+                ? "题库"
+                : ""
+            }}
+          </el-descriptions-item>
+          <el-descriptions-item label="教育类型">
+            {{ orderInfo.educationName }}
+          </el-descriptions-item>
+          <el-descriptions-item label="培训项目">
+            {{ orderInfo.projectName + " - " + orderInfo.businessName }}
+          </el-descriptions-item>
+          <el-descriptions-item label="订购人数">
+            {{ orderInfo.userNum || 0 }}位
+          </el-descriptions-item>
+          <el-descriptions-item label="订购数量">
+            {{ orderInfo.goodsNum || 0 }}个
+          </el-descriptions-item>
+          <el-descriptions-item label="下单金额">
+            ¥{{ orderInfo.orderPrice | formatPrice }}
+          </el-descriptions-item>
+          <el-descriptions-item label="退款金额">
+            ¥{{ orderInfo.goodsRefund | formatPrice }}
+          </el-descriptions-item>
+          <el-descriptions-item label="实际金额">
+            ¥{{ orderInfo.payPrice | formatPrice }}
+          </el-descriptions-item>
+          <el-descriptions-item label="支付方式">
+            {{ orderInfo.payType == 1 ? "微信" : "对公转账" }}
+          </el-descriptions-item>
+          <el-descriptions-item label="转账凭证">
+            <el-button
+              type="text"
+              v-if="
+                (orderInfo.payStatus == 1 ||
+                orderInfo.payStatus == 2 ||
+                orderInfo.payStatus == -2) && orderInfo.payType == 2
+              "
+              @click="openZZ(orderInfo.handleOrderSn)"
+              >查看</el-button
+            >
+          </el-descriptions-item>
+          <el-descriptions-item label="发票状态">
+            {{ showInvoice(orderInfo.invoiceStatus) }}
+            <span v-if="orderInfo.invoiceUrl"
+              >({{ orderInfo.invoiceUrl.split(",").length }}张)<el-button
+                type="text"
+                @click="downinvoice(orderInfo.invoiceUrl.split(','))"
+                >下载</el-button
+              >
+            </span>
+          </el-descriptions-item>
+          <el-descriptions-item label="下单备注">
+            {{ orderInfo.companyRemark }}
+          </el-descriptions-item>
+          <el-descriptions-item label="审核意见">
+            {{ orderInfo.checkReason }}
+          </el-descriptions-item>
+        </el-descriptions>
+      </el-main>
+      <el-divider></el-divider>
+      <el-main style="padding: 20px 0px">
+        <el-table
+          max-height="400px"
+          ref="table"
+          size="small"
+          :data="tableData"
+          style="width: 100%"
+          border
+          :header-cell-style="{
+            'background-color': '#eee',
+            color: '#333',
+            fontSize: '14px',
+          }"
+        >
+          <el-table-column align="center" type="index" width="50" label="序号">
+          </el-table-column>
+          <el-table-column
+            align="center"
+            v-for="(item, index) in tableSet"
+            :key="index"
+            :label="item.label"
+            :prop="item.prop"
+          >
+            <template slot-scope="scope">
+              <span v-if="item.scope == 'progress'">
+                {{ scope.row.stuAllNum + scope.row.recordNum }} /
+                {{ scope.row.secAllNum + scope.row.examNum }}
+              </span>
+              <div v-else-if="item.scope == 'isOptions'">
+                <span v-for="(items, indexs) in item.options" :key="indexs"
+                  ><span v-if="items.value == scope.row[item.prop]">{{
+                    items.label
+                  }}</span></span
+                >
+              </div>
+              <span v-else-if="item.scope == 'price'">
+                ¥{{ scope.row[item.prop] | formatPrice }}
+              </span>
+              <span v-else>{{ scope.row[item.prop] }}</span>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-main>
+    </el-dialog>
+    <public-transfer ref="publicTransfer" />
+  </div>
+</template>
+
+<script>
+import publicTransfer from "./publicTransfer.vue";
+export default {
+  components: { publicTransfer },
+  data() {
+    return {
+      loading: false,
+      visible: false,
+      shStatus: false,
+      orderInfo: {},
+      tableData: [],
+      tableSet: [
+        { label: "姓名", prop: "realname" },
+        { label: "年份", prop: "year" },
+        { label: "科目", prop: "subjectNames" },
+        { label: "商品", prop: "goodsName" },
+        { label: "金额", prop: "goodsRealPrice", scope: "price" },
+        { label: "学习进度", scope: "progress" },
+        {
+          label: "退款状态",
+          prop: "refundStatus",
+          scope: "isOptions",
+          options: [
+            { label: "待审核", value: 0 },
+            { label: "已退款", value: 1 },
+            { label: "不通过", value: 2 },
+          ],
+        },
+        { label: "退款原因", prop: "refundReason" },
+        { label: "审核意见", prop: "periodReason" },
+      ],
+    };
+  },
+  methods: {
+    openBoxs(sn, shStatus = false) {
+      this.shStatus = shStatus;
+      this.orderInfo = {};
+      this.tableData = [];
+      this.visible = true;
+      this.loading = true;
+      this.$api
+        .orderhandledetail({ handleOrderSn: sn })
+        .then((res) => {
+          this.orderInfo = res.data;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+      this.$api.orderhandlegoodsList({ handleOrderSn: sn }).then((res) => {
+        this.tableData = res.rows || [];
+      });
+    },
+    close() {
+      this.loading = false;
+    },
+    openZZ(sn) {
+      this.$refs.publicTransfer.openBoxs(sn);
+    },
+    showInvoice(i) {
+      var str = "";
+      switch (i) {
+        case 1:
+          str = "待审核";
+          break;
+        case 2:
+          str = "已开票";
+          break;
+        case 3:
+          str = "不通过";
+          break;
+        default:
+          break;
+      }
+      return str;
+    },
+    downinvoice(ary) {
+      for (let i = 0; i < ary.length; i++) {
+        this.download(this.$tools.splitImgHost(ary[i]));
+      }
+    },
+    //下载
+    download(url, fileName = "") {
+      let xhr = new XMLHttpRequest();
+      xhr.open("get", url, true);
+      xhr.setRequestHeader("Content-Type", `application/pdf`);
+      xhr.responseType = "blob";
+      let that = this;
+      xhr.onload = function () {
+        if (this.status == 200) {
+          //接受二进制文件流
+          var blob = this.response;
+          that.downloadExportFile(blob, fileName);
+        }
+      };
+      xhr.send();
+    },
+
+    downloadExportFile(blob, tagFileName) {
+      let downloadElement = document.createElement("a");
+      let href = "";
+      if (typeof blob == "string") {
+        downloadElement.target = "_blank";
+      } else {
+        href = window.URL.createObjectURL(blob); //创建下载的链接
+      }
+      downloadElement.href = href;
+      downloadElement.download = tagFileName;
+      //下载后文件名
+      document.body.appendChild(downloadElement);
+      downloadElement.click(); //点击下载
+      document.body.removeChild(downloadElement); //下载完成移除元素
+      if (typeof blob != "string") {
+        window.URL.revokeObjectURL(href); //释放掉blob对象
+      }
+    },
+    submit(int) {
+      if (int == 1) {
+        this.$confirm("确定审核通过吗?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        })
+          .then(() => {
+            this.$api
+              .orderhandlecheck({
+                orderHandleSn: this.orderInfo.handleOrderSn,
+                checkResult: 1,
+              })
+              .then((res) => {
+                this.$message.success("操作成功");
+                this.visible = false;
+                this.$parent.search();
+              });
+          })
+          .catch(() => {});
+      }
+      if (int == 2) {
+        this.$prompt("输入不通过原因", "确定审核不通过吗?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          inputPattern: /^.{1,10000}$/,
+          inputErrorMessage: "请输入不通过原因",
+        })
+          .then(({ value }) => {
+            this.$api
+              .orderhandlecheck({
+                orderHandleSn: this.orderInfo.handleOrderSn,
+                checkResult: 2,
+                checkReason: value,
+              })
+              .then((res) => {
+                this.$message.success("操作成功");
+                this.visible = false;
+                this.$parent.search();
+              });
+          })
+          .catch(() => {});
+      }
+    },
+    getPayStatus(i) {
+      var str = "";
+      switch (i) {
+        case 0:
+          str = "待支付";
+          break;
+        case 1:
+          str = "已支付";
+          break;
+        case -1:
+          str = "已关闭";
+          break;
+        case 2:
+          str = "审核中";
+          break;
+        case -2:
+          str = "不通过";
+          break;
+        default:
+          break;
+      }
+      return str;
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+/deep/ .el-divider--horizontal {
+  margin: 14px 0px;
+}
+/deep/ .el-dialog {
+  margin-top: 3vh !important;
+  border-radius: 8px !important;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+/deep/.el-button {
+  border-radius: 8px;
+}
+.top_box {
+  font-size: 14px;
+  color: #333;
+  margin: 0px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+</style>

+ 254 - 0
src/views/finance/orderManage/publicTransfer.vue

@@ -0,0 +1,254 @@
+<template>
+  <div id="">
+    <el-dialog
+      :visible.sync="visible"
+      width="1000px"
+      :show-close="false"
+      :close-on-click-modal="false"
+      :append-to-body="true"
+      @closed="close"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">对公转账</div>
+        <div class="rightBoxs">
+          <img
+            src="@/assets/images/Close@2x.png"
+            alt=""
+            @click="visible = false"
+          />
+        </div>
+      </div>
+      <div class="box">
+        <div class="box_l">
+          <h2>第一步:对公转账</h2>
+          <el-main>
+            <h2>汇款信息</h2>
+            <p><span>企业全称:</span> {{ orderInfo.recCompanyName }}</p>
+            <p><span>开户银行:</span> {{ orderInfo.recCompanyBank }}</p>
+            <p><span>银行账户:</span> {{ orderInfo.recCompanyAccount }}</p>
+            <p>
+              <span>转账备注:</span>
+              {{
+                orderInfo.recCompanyAccount &&
+                orderInfo.recCompanyAccount.slice(0, 6)
+              }}(打款时请备注此信息)
+            </p>
+            <p>
+              <span>转账金额:</span
+              ><i style="font-style: normal; color: red; font-weight: bold">
+                ¥{{ orderInfo.payPrice | formatPrice }}</i
+              >
+            </p>
+            <el-button size="mini" style="margin-top: 24px" @click="copy"
+              >复制汇款信息</el-button
+            >
+          </el-main>
+        </div>
+        <div class="box_r">
+          <h2>第二步:填写公司信息及上传付款回执</h2>
+          <el-form
+            :disabled="!changeStatus"
+            size="small"
+            label-position="top"
+            :model="ruleForm"
+            ref="ruleForm"
+            label-width="100px"
+            class="demo-ruleForm"
+          >
+            <el-form-item label="企业全称" prop="companyName">
+              <el-input v-model="ruleForm.companyName"></el-input>
+            </el-form-item>
+            <el-form-item label="联系电话" prop="companyTel">
+              <el-input v-model="ruleForm.companyTel"></el-input>
+            </el-form-item>
+            <el-form-item label="备注" prop="companyRemark">
+              <el-input v-model="ruleForm.companyRemark"></el-input>
+            </el-form-item>
+            <el-form-item label="请上传转账凭证" prop="companyPayImg">
+              <el-image
+                v-if="ruleForm.companyPayImg"
+                style="width: 100px; height: 100px"
+                :src="ruleForm.companyPayImg"
+                :preview-src-list="[ruleForm.companyPayImg]"
+              >
+              </el-image></el-form-item
+          ></el-form>
+        </div>
+      </div>
+      <p v-if="orderInfo.payStatus == -2">
+        <span style="font-size: 14px; color: #2f4378">审核意见:</span>
+        <span style="color: red">{{ orderInfo.checkReason }}</span>
+      </p></el-dialog
+    >
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      handleOrderSn: "",
+      visible: false,
+      ruleForm: {
+        companyName: "",
+        companyTel: "",
+        companyPayImg: "",
+        companyPayImg: "",
+      },
+      orderInfo: {},
+      changeStatus: false,
+    };
+  },
+  methods: {
+    openBoxs(sn) {
+      this.handleOrderSn = sn;
+      this.ruleForm = {
+        companyName: "",
+        companyTel: "",
+        companyRemark: "",
+        companyPayImg: "",
+      };
+      this.visible = true;
+      this.getOrderData();
+    },
+    getOrderData() {
+      this.$api
+        .orderhandledetail({ handleOrderSn: this.handleOrderSn })
+        .then((res) => {
+          this.orderInfo = res.data;
+          this.ruleForm = {
+            companyName: res.data.companyName,
+            companyTel: res.data.companyTel,
+            companyRemark: res.data.companyRemark,
+            companyPayImg: res.data.companyPayImg,
+          };
+        });
+    },
+    close() {},
+    copy() {
+      let func = (text) => {
+        var textArea = document.createElement("textarea");
+        textArea.value = text;
+        document.body.appendChild(textArea);
+        textArea.select();
+        document.execCommand("copy");
+        document.body.removeChild(textArea);
+      };
+      func(
+        `企业全称:${this.orderInfo.recCompanyName},开户银行:${
+          this.orderInfo.recCompanyBank
+        },银行账号:${this.orderInfo.recCompanyAccount},转账备注:${
+          this.orderInfo.recCompanyAccount &&
+          this.orderInfo.recCompanyAccount.slice(0, 6)
+        }(打款时请备注此信息),转账金额:¥${this.orderInfo.payPrice?.toLocaleString(
+          "zh-CN",
+          (undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })
+        )}`
+      );
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.box {
+  display: flex;
+  justify-content: space-around;
+  .box_l {
+    & > h2 {
+      font-size: 16px;
+      color: #333;
+      font-weight: 400;
+      margin-bottom: 40px;
+    }
+    .el-main {
+      background-color: #f9fafb;
+      padding: 40px;
+      & > h2 {
+        font-size: 16px;
+        color: #333;
+        margin-bottom: 16px;
+      }
+      & > p {
+        margin-bottom: 14px;
+        color: #000;
+        & > span {
+          color: #7f7f7f;
+        }
+      }
+    }
+    width: 40%;
+  }
+  .box_r {
+    h2 {
+      font-size: 16px;
+      color: #333;
+      font-weight: 400;
+      margin-bottom: 40px;
+    }
+    width: 40%;
+  }
+}
+/deep/ .el-dialog {
+  border-radius: 8px !important;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+/deep/.el-button {
+  border-radius: 8px;
+}
+/deep/ .el-form--label-top {
+  padding: 0px;
+}
+.label_img {
+  user-select: none;
+  cursor: pointer;
+  width: 100%;
+  height: 80px;
+  display: inline-block;
+  line-height: 38px;
+  text-align: center;
+  border: 1px dashed #999;
+  border-radius: 8px;
+  font-size: 32px;
+  transition: all 0.2s;
+  &:hover {
+    border-color: #007aff;
+  }
+}
+</style>

+ 295 - 0
src/views/finance/orderManage/refundFunc.vue

@@ -0,0 +1,295 @@
+<template>
+  <div id="">
+    <el-dialog
+      :visible.sync="visible"
+      width="1200px"
+      :show-close="false"
+      :close-on-click-modal="false"
+      :append-to-body="true"
+      @closed="close"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">退款审核</div>
+        <div class="rightBoxs">
+          <img
+            src="@/assets/images/Close@2x.png"
+            alt=""
+            @click="visible = false"
+          />
+        </div>
+      </div>
+      <div class="top">
+        商品类型:<span>{{
+          orderInfo.goodsType == 1
+            ? "课程"
+            : orderInfo.goodsType == 2
+            ? "题库"
+            : ""
+        }}</span
+        >教育类型:<span>{{ orderInfo.educationName }}</span
+        >培训项目:<span>{{
+          orderInfo.projectName + " - " + orderInfo.businessName
+        }}</span>
+      </div>
+      <el-table
+        max-height="600px"
+        ref="table"
+        size="small"
+        :data="tableData"
+        style="width: 100%"
+        border
+        :header-cell-style="{
+          'background-color': '#eee',
+          color: '#333',
+          fontSize: '14px',
+        }"
+      >
+        <el-table-column align="center" type="index" width="50" label="序号">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          v-for="(item, index) in tableSet"
+          :key="index"
+          :label="item.label"
+          :prop="item.prop"
+        >
+          <template slot-scope="scope">
+            <span v-if="item.scope == 'progress'">
+              {{ scope.row.stuAllNum + scope.row.recordNum }} /
+              {{ scope.row.secAllNum + scope.row.examNum }}
+            </span>
+            <span v-else-if="item.scope == 'price'">
+              ¥{{ scope.row[item.prop] | formatPrice }}
+            </span>
+            <span v-else>{{ scope.row[item.prop] }}</span>
+          </template>
+        </el-table-column>
+      </el-table>
+      <p>
+        <label for="">退款原因:</label
+        ><span>{{ orderInfo.refundApplyReason || "--" }}</span>
+      </p>
+      <div class="fot_box">
+        <el-button type="text" @click="orderDetail">订单详情</el-button>
+        <p>订单金额:¥{{ orderInfo.orderPrice | formatPrice }}</p>
+        <p>已退金额:¥{{ orderInfo.goodsRefund | formatPrice }}</p>
+        <p>实际金额:¥{{ orderInfo.payPrice | formatPrice }}</p>
+        <p>本次关闭学员:{{ tableData.length || 0 }}个</p>
+        <p style="font-weight: bold">
+          本次退款金额:<strong style="color: red"
+            >¥{{ getPrice(tableData) | formatPrice }}</strong
+          >
+        </p>
+      </div>
+
+      <el-form
+        label-position="top"
+        :model="orderInfo"
+        ref="formData"
+        label-width="100px"
+        class="demo-ruleForm"
+      >
+        <el-form-item label="收款信息:" prop="payee">
+          <el-input
+            readonly
+            v-model="orderInfo.payee"
+            placeholder="输入企业全称"
+          ></el-input> </el-form-item
+        ><el-form-item prop="payeeBank" v-if="orderInfo.payType == 2">
+          <el-input
+            readonly
+            v-model="orderInfo.payeeBank"
+            placeholder="输入开户银行"
+          ></el-input> </el-form-item
+        ><el-form-item prop="payeeBankAccount" v-if="orderInfo.payType == 2">
+          <el-input
+            readonly
+            v-model="orderInfo.payeeBankAccount"
+            placeholder="输入银行账号"
+          ></el-input> </el-form-item
+      ></el-form>
+      <p>
+        <label for="">备注:</label
+        ><span style="color: #aaa"
+          >建议先支付退款再审核通过,通过将自动减少订单实际金额,同时本页面无法二次打开。</span
+        >
+      </p>
+      <div slot="footer" class="dialog-footer" style="justify-content:flex-start;">
+        <el-button @click="submitForm(1)" type="primary">审核通过</el-button>
+        <el-button @click="submitForm(2)" type="warning">审核不通过</el-button>
+      </div>
+    </el-dialog>
+    <order-detail ref="orderDetail" />
+  </div>
+</template>
+
+<script>
+import orderDetail from "./orderDetail.vue";
+export default {
+  components: { orderDetail },
+  data() {
+    return {
+      visible: false,
+      orderInfo: {},
+      tableData: [],
+      tableSet: [
+        { label: "姓名", prop: "realname" },
+        { label: "年份", prop: "year" },
+        { label: "科目", prop: "subjectNames" },
+        { label: "商品", prop: "goodsName" },
+        { label: "金额", prop: "goodsRealPrice", scope: "price" },
+        { label: "学习进度", scope: "progress" },
+      ],
+      formData: {},
+    };
+  },
+  computed: {
+    getPrice: function () {
+      return function (ary) {
+        if (ary && ary.length > 0) {
+          let sum = 0;
+          ary.forEach((i) => {
+            sum += i.goodsRealPrice;
+          });
+          return sum;
+        } else {
+          return 0;
+        }
+      };
+    },
+  },
+  methods: {
+    orderDetail() {
+      this.$refs.orderDetail.openBoxs(this.orderInfo.handleOrderSn);
+    },
+    openBoxs(sn) {
+      this.formData = {};
+      this.orderInfo = {};
+      this.tableData = [];
+      this.visible = true;
+      this.$api.orderhandledetail({ handleOrderSn: sn }).then((res) => {
+        if (res.data.payType == 1) {
+          this.formData.payee = "原路退回";
+        } else {
+        }
+        this.orderInfo = res.data;
+      });
+      this.$api
+        .orderhandlegoodsList({ handleOrderSn: sn, refundStatus: 0 })
+        .then((res) => {
+          this.tableData = res.rows || [];
+        });
+    },
+    submitForm(int) {
+      if (int == 1) {
+        this.$confirm("确定审核通过吗?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        })
+          .then(() => {
+            this.$api
+              .orderhandlerefundcheck({
+                orderHandleSn: this.orderInfo.handleOrderSn,
+                checkResult: 1,
+              })
+              .then((res) => {
+                this.$message.success("操作成功");
+                this.visible = false;
+                this.$parent.search();
+              });
+          })
+          .catch(() => {});
+      }
+      if (int == 2) {
+        this.$prompt("输入不通过原因", "确定审核不通过吗?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          inputPattern: /^.{1,10000}$/,
+          inputErrorMessage: "请输入不通过原因",
+        })
+          .then(({ value }) => {
+            this.$api
+              .orderhandlerefundcheck({
+                orderHandleSn: this.orderInfo.handleOrderSn,
+                checkResult: 2,
+                checkReason: value,
+              })
+              .then((res) => {
+                this.$message.success("操作成功");
+                this.visible = false;
+                this.$parent.search();
+              });
+          })
+          .catch(() => {});
+      }
+    },
+    close() {},
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+/deep/ .el-divider--horizontal {
+  margin: 14px 0px;
+}
+/deep/ .el-dialog {
+  margin-top: 3vh !important;
+  border-radius: 8px !important;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+/deep/.el-button {
+  border-radius: 8px;
+}
+.top {
+  margin-bottom: 14px;
+  span {
+    font-weight: bold;
+    margin-right: 14px;
+  }
+}
+.fot_box {
+  p {
+    margin-bottom: 8px;
+  }
+}
+/deep/ .el-form-item__label {
+  font-weight: bold;
+}
+</style>