浏览代码

轮播图等以及各种优化

pansl 1 年之前
父节点
当前提交
45096d14c2
共有 36 个文件被更改,包括 1222 次插入319 次删除
  1. 26 0
      src/api/pageLayout/channelPage/index.ts
  2. 35 0
      src/api/pageLayout/viewpagerPage/index.ts
  3. 30 28
      src/components/Upload/myUpload.vue
  4. 11 2
      src/router/modules/charge.ts
  5. 9 0
      src/styles/var.scss
  6. 7 5
      src/views/appletManage/iPayment/form/create.vue
  7. 2 2
      src/views/appletManage/iPayment/index.vue
  8. 15 2
      src/views/pageLayout/channelPageManage/form/create.vue
  9. 9 3
      src/views/pageLayout/channelPageManage/form/videoList.vue
  10. 1 1
      src/views/pageLayout/channelPageManage/index.vue
  11. 15 1
      src/views/pageLayout/homePageManage/form/create.vue
  12. 9 3
      src/views/pageLayout/homePageManage/form/videoList.vue
  13. 2 0
      src/views/pageLayout/homePageManage/index.vue
  14. 0 98
      src/views/pageLayout/viewpagerPageManage/form/config.vue
  15. 60 26
      src/views/pageLayout/viewpagerPageManage/form/create.vue
  16. 25 28
      src/views/pageLayout/viewpagerPageManage/form/videoList.vue
  17. 43 19
      src/views/pageLayout/viewpagerPageManage/index.vue
  18. 5 5
      src/views/payBack/juliangAccount/tabs/logList/index.vue
  19. 1 1
      src/views/settleManage/settlementCenter/tabs/rechargeRules/index.vue
  20. 1 2
      src/views/settleManage/settlementCenter/tabs/rechargeSettle/form/create.vue
  21. 1 1
      src/views/settleManage/settlementCenter/tabs/rechargeSettle/index.vue
  22. 57 0
      src/views/videoManage/detail.vue
  23. 6 1
      src/views/videoManage/form/create.vue
  24. 0 0
      src/views/videoManage/videoLibraryList/form/subscribeSet.vue
  25. 0 0
      src/views/videoManage/videoLibraryList/form/uploadVideo.vue
  26. 1 1
      src/views/videoManage/form/videoDL.vue
  27. 44 14
      src/views/videoManage/index.vue
  28. 32 0
      src/views/videoManage/wechatAudit/index.vue
  29. 57 0
      src/views/videoManage/detail.vue
  30. 6 1
      src/views/videoManage/form/create.vue
  31. 0 0
      src/views/videoManage/wechatAudit/tabs/wechatAuditList/form/subscribeSet.vue
  32. 0 0
      src/views/videoManage/wechatAudit/tabs/wechatAuditList/form/uploadVideo.vue
  33. 183 0
      src/views/videoManage/wechatAudit/tabs/wechatAuditList/form/videoSync.vue
  34. 58 75
      src/views/videoManage/index.vue
  35. 86 0
      src/views/videoManage/wechatAudit/tabs/wechatAuditStatus/excelTitle.ts
  36. 385 0
      src/views/videoManage/wechatAudit/tabs/wechatAuditStatus/index.vue

+ 26 - 0
src/api/pageLayout/channelPage/index.ts

@@ -0,0 +1,26 @@
+import http from '@/api/http';
+/**
+ * 首页列表-列表
+ */
+export function operationManageFirstPageList(params?: object) {
+  return http.get('/operationManage/firstPage/list', params);
+}
+
+/**
+ * 首页列表-开启状态
+ */
+export function operationManageFirstPageEnableStatus(params: object) {
+  return http.post('/operationManage/firstPage/enableStatus', params);
+}
+/**
+ * 首页列表-添加
+ */
+export function operationManageFirstPageAdd(params: object) {
+  return http.post(`/operationManage/firstPage/add`, params);
+}
+/**
+ * 首页列表-配置
+ */
+export function operationManageFirstPageSetConfig(params: object) {
+  return http.post(`/operationManage/firstPage/setConfig`, params);
+}

+ 35 - 0
src/api/pageLayout/viewpagerPage/index.ts

@@ -0,0 +1,35 @@
+import http from '@/api/http';
+/**
+ * 轮播图-列表
+ */
+export function operationBannerList(params?: object) {
+  return http.get('/operation/banner/list', params);
+}
+
+/**
+ * 轮播图-编辑状态
+ */
+export function operationBannerEditStatus(
+  id: number | string,
+  params?: object
+) {
+  return http.post(`/operation/banner/editStatus/${id}`, params);
+}
+/**
+ * 轮播图-添加
+ */
+export function operationBannerAdd(params: object) {
+  return http.post(`/operation/banner/add`, params);
+}
+/**
+ * 轮播图-编辑
+ */
+export function operationBannerEdit(id: number | string, params: object) {
+  return http.post(`/operation/banner/edit/${id}`, params);
+}
+/**
+ * 轮播图-删除
+ */
+export function operationBannerDel(id: number | string, params?: object) {
+  return http.post(`/operation/banner/del/${id}`, params);
+}

+ 30 - 28
src/components/Upload/myUpload.vue

@@ -2,8 +2,10 @@
   <div class="upload_wrap">
     <div v-if="waitFileList.length > 0">
       <div class="el-upload-list el-upload-list--picture-card" v-if="listType == 'picture-card' || listType == 'picture'">
-        <div class="el-upload-list__item is-success" v-for="( item, index ) in  waitFileList " :key="index">
-          <el-image style="width:148px;height:148px;" :src="item.url" fit="fill" :lazy="true"></el-image>
+        <div class="el-upload-list__item is-success" style="width:fit-content;height:fit-content;"
+          v-for="( item, index ) in  waitFileList " :key="index">
+          <el-image style="width:fit-content;height:148px; min-width:148px" :src="item.url" fit="cover"
+            :lazy="true"></el-image>
           <div v-if="!props.isDisableUpload" class="el-upload-list__item-actions el-upload-list__item-delete">
             <el-icon class="cursor-pointer" @click="removeFile(item)">
               <DeleteFilled />
@@ -48,7 +50,7 @@
       </div>
       <template #tip v-if="!props.isDisableUpload && isShowTips">
         <div class="el-upload__tip">
-          <span>支持{{ acceptType.replace(",", "/") }};</span>
+          <span>支持{{ acceptType.replaceAll(",", "/") }};</span>
           <span v-if="isLimitSize">
             文件大小不能超过{{ props.maxFileSize }}M;
           </span>
@@ -162,31 +164,31 @@ const handleChange = async (file: any, fileList: any[]) => {
     });
     return false;
   }
-  // else {
-  //   let formData = new FormData();
-  //   formData.append(props.formType, rawFile);
-  //   const loadingInstance = ElLoading.service({
-  //     text: "正在上传",
-  //     background: "rgba(0,0,0,.2)",
-  //   });
-  //   // 上传到服务器上面
-  //   const requestURL: string = props.action;
-  //   http.post(requestURL, formData)
-  //     .then(async (res: any) => {
-  //       if (res.code == 10000) {
-  //         loadingInstance.close();
-  //         waitFileList.value.push({ uid: file.uid, url: res.data })
-  //         emits("fileSuccess", res.data);
-  //       } else {
-  //         loadingInstance.close();
-  //         ElMessage.warning(`文件上传失败`);
-  //       }
-  //     })
-  //     .catch(() => {
-  //       loadingInstance.close();
-  //       // ElMessage.warning(`文件上传失败`);
-  //     });
-  // }
+  else {
+    let formData = new FormData();
+    formData.append(props.formType, rawFile);
+    const loadingInstance = ElLoading.service({
+      text: "正在上传",
+      background: "rgba(0,0,0,.2)",
+    });
+    // 上传到服务器上面
+    const requestURL: string = props.action;
+    http.post(requestURL, formData)
+      .then(async (res: any) => {
+        if (res.code == 10000) {
+          loadingInstance.close();
+          waitFileList.value.push({ uid: file.uid, url: res.data })
+          emits("fileSuccess", res.data);
+        } else {
+          loadingInstance.close();
+          ElMessage.warning(`文件上传失败`);
+        }
+      })
+      .catch(() => {
+        loadingInstance.close();
+        // ElMessage.warning(`文件上传失败`);
+      });
+  }
   return true;
 };
 //限制图片尺寸

+ 11 - 2
src/router/modules/charge.ts

@@ -11,13 +11,22 @@
 //         path: 'index',
 //         name: 'user-account',
 //         meta: { title: '频道管理', icon: 'home' },
-//         component: () => import('@/views/pageLayout/channelPageManage/index.vue')
+//         component: () =>
+//           import('@/views/pageLayout/channelPageManage/index.vue')
 //       },
 //       {
 //         path: 'index2',
 //         name: 'user-account55',
 //         meta: { title: '轮播图管理', icon: 'home' },
-//         component: () => import('@/views/pageLayout/viewpagerPageManage/index.vue')
+//         component: () =>
+//           import('@/views/pageLayout/viewpagerPageManage/index.vue')
+//       },
+//       {
+//         path: 'index3',
+//         name: 'user-account55',
+//         meta: { title: '微信提审', icon: 'home' },
+//         component: () =>
+//           import('@/views/videoManage/wechatAudit/index.vue')
 //       }
 //     ]
 //   }

+ 9 - 0
src/styles/var.scss

@@ -10,3 +10,12 @@
     // -el-page
     --el-page-border-radius: 8px;
 }
+
+@mixin text-ellipsis($max-lines: 1) {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  display: -webkit-box;
+  -webkit-line-clamp: $max-lines;
+  -webkit-box-orient: vertical;
+}
+

+ 7 - 5
src/views/appletManage/iPayment/form/create.vue

@@ -13,18 +13,20 @@
         </el-form-item>
         <el-form-item label="支付方式" prop="pay_type">
           <el-select class="w-full" v-model="formData.pay_type" clearable filterable placeholder="请选择支付方式">
-            <el-option v-for="(item, index) in paymentList" :key="index" :label="item.val" :value="item.key" />
+            <el-option v-for="(item, index) in paymentList" :key="index" :label="item.label" :value="item.value" />
           </el-select>
         </el-form-item>
         <el-form-item label="小程序类型" prop="miniprogram_type">
           <el-select class="w-full" v-model="formData.miniprogram_type" clearable filterable placeholder="请选择小程序类型">
-            <el-option v-for="(item, index) in appletType" :key="index" :label="item.val" :value="item.key" />
+            <el-option v-for="(item, index) in appletType" :key="index" :label="item.label" :value="item.value" />
           </el-select>
         </el-form-item>
-        <el-form-item label="备注" prop="remark">
-          <el-input v-model="formData.remark" clearable type="textarea" autosize rows="5" placeholder="请输入备注" />
-        </el-form-item>
         <el-form-item label="公用支付参数" prop="pay_common_params">
+          <template #label>
+            <div class="flex items-center">
+              <span class="mr-1 text-red-600">*</span>公用支付参数
+            </div>
+          </template>
           <div class="w-full mb-3" v-for="(item, index) in payCommonParamsList" :key="index">
             <el-input style="width:40%;margin-right:6px;" v-model="item.params" clearable placeholder="请输入参数名称" />
             <el-input style="width:40%;margin-right:6px;" v-model="item.value" clearable placeholder="请输入参数值" />

+ 2 - 2
src/views/appletManage/iPayment/index.vue

@@ -14,12 +14,12 @@
           </el-form-item>
           <el-form-item label="支付方式">
             <el-select v-model="query.pay_type" clearable filterable placeholder="请选择支付方式">
-              <el-option v-for="(item, index) in paymentList" :key="index" :label="item.val" :value="item.key" />
+              <el-option v-for="(item, index) in paymentList" :key="index" :label="item.label" :value="item.value" />
             </el-select>
           </el-form-item>
           <el-form-item label="小程序类型">
             <el-select v-model="query.miniprogram_type" clearable filterable placeholder="请选择小程序类型">
-              <el-option v-for="(item, index) in miniprogramTypelist" :key="index" :label="item.val" :value="item.key" />
+              <el-option v-for="(item, index) in miniprogramTypelist" :key="index" :label="item.label" :value="item.value" />
             </el-select>
           </el-form-item>
         </template>

+ 15 - 2
src/views/pageLayout/channelPageManage/form/create.vue

@@ -1,5 +1,11 @@
 <template>
   <el-form :model="formCallback" label-width="120px" ref="form" v-loading="loading" class="pr-4">
+    <el-form-item label="小程序类型" prop="miniprogram_type" :rules="[{ required: true, message: '选择小程序类型' }]"
+      label-width="120px">
+      <el-select v-model="formCallback.miniprogram_type" clearable filterable placeholder="请选择小程序类型">
+        <el-option v-for="(item, index) in miniprogramTypelist" :key="index" :label="item.label" :value="item.value" />
+      </el-select>
+    </el-form-item>
     <el-form-item label="列表名称" prop="type" :rules="[{ required: true, message: '选择列表名称' }]" label-width="120px">
       <el-select v-model="formCallback.type" clearable filterable placeholder="请选择支付方式">
         <el-option v-for="(item, index) in typeList" :key="index" :label="item.name" :value="item.value" />
@@ -23,13 +29,20 @@ import { operationManageFirstPageAdd } from '@/api/pageLayout/homePage/index'
 const emit = defineEmits(['close']);
 const loading = ref(false)
 const form = ref()
+import { optionsCommonParams } from '@/api/common/index'
 const promotion = ref('')
 const formCallback = ref({
   status: 0,
 })
 
 const typeList = ref([{ name: '本周精选', value: 1 }, { name: '优选好剧', value: 2 }])
-
+const miniprogramTypelist = ref([])
+const init = () => {
+  optionsCommonParams().then(res => {
+    console.log(res, 'optionsCommonParams');
+    miniprogramTypelist.value = res.data.miniprogramType
+  })
+}
 // 提交回传配置
 const submitForm = (formEl: FormInstance | undefined) => {
   if (!formEl) return;
@@ -52,7 +65,7 @@ const submitForm = (formEl: FormInstance | undefined) => {
 
 
 onMounted(() => {
-
+  init()
 });
 </script>
 

+ 9 - 3
src/views/pageLayout/channelPageManage/form/videoList.vue

@@ -17,7 +17,7 @@
           <el-input v-model="query.videoName" placeholder="请输入短剧名称" clearable />
         </el-form-item>
         <el-form-item label="状态" prop="updateType">
-          <el-select v-model="query.updateType" filterable clearable remote placeholder="请选择状态">
+          <el-select v-model="query.updateType" filterable clearable placeholder="请选择状态">
             <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
         </el-form-item>
@@ -25,6 +25,11 @@
           <el-cascader v-model="selectType" :options="cooperations" filterable clearable :change-on-select="true"
             @change="handleCascaderChange" />
         </el-form-item>
+        <el-form-item label="微信审核状态" prop="wechatPass">
+          <el-select v-model="query.wechatPass" disabled filterable clearable placeholder="请选择微信审核状态">
+            <el-option v-for="item in wxstatusOptions" :key="item.value" :label="item.label" :value="item.value" />
+          </el-select>
+        </el-form-item>
       </template>
     </Search>
     <div class="table-default">
@@ -123,6 +128,7 @@ const multipleSelection = ref([]);
 const { data, query, search, reset, loading } = useGetList(api);
 const selectType = ref([])
 const statusOptions = ref([{ label: '连载中', value: '1' }, { label: '完结', value: '2' }]);
+const wxstatusOptions = ref([{ label: '未通过', value: 0 }, { label: '已通过', value: 1 }]);
 const cooperations = ref([]);
 const emit = defineEmits(['confirm']);
 const props = defineProps({
@@ -143,7 +149,7 @@ const handleCascaderChange = (val: any) => {
 }
 
 const resetQuery = () => {
-  query.value = Object.assign({ page: query.value.page, limit: query.value.limit, shelfType: 2 });
+  query.value = Object.assign({ page: query.value.page, limit: query.value.limit, shelfType: 2, wechatPass: 1 });
   search()
   selectType.value = []
 }
@@ -225,7 +231,7 @@ const setRowSelected = () => {
 onMounted(() => {
   // 初始化 sortValues 数组长度,保持与 multipleSelection 数组一致
   // sortValues.value = new Array(multipleSelection.value.length);
-  query.value = Object.assign({ page: query.value.page, limit: query.value.limit, shelfType: 2 });
+  query.value = Object.assign({ page: query.value.page, limit: query.value.limit, shelfType: 2, wechatPass: 1 });
   setRowSelected()
   initType()
   search();

+ 1 - 1
src/views/pageLayout/channelPageManage/index.vue

@@ -20,7 +20,7 @@
       </el-table-column>
       <el-table-column label="操作">
         <template #default="scope">
-          <el-button link type="primary" size="default" @click="handleConfigure(scope.row)"
+          <el-button link type="primary" size="small" @click="handleConfigure(scope.row)"
             v-action="'operation.FirstPage.setConfig'">配置</el-button>
         </template>
       </el-table-column>

+ 15 - 1
src/views/pageLayout/homePageManage/form/create.vue

@@ -1,5 +1,11 @@
 <template>
   <el-form :model="formCallback" label-width="120px" ref="form" v-loading="loading" class="pr-4">
+    <el-form-item label="小程序类型" prop="miniprogram_type" :rules="[{ required: true, message: '选择小程序类型' }]"
+      label-width="120px">
+      <el-select v-model="formCallback.miniprogram_type" clearable filterable placeholder="请选择小程序类型">
+        <el-option v-for="(item, index) in miniprogramTypelist" :key="index" :label="item.label" :value="item.value" />
+      </el-select>
+    </el-form-item>
     <el-form-item label="列表名称" prop="type" :rules="[{ required: true, message: '选择列表名称' }]" label-width="120px">
       <el-select v-model="formCallback.type" clearable filterable placeholder="请选择支付方式">
         <el-option v-for="(item, index) in typeList" :key="index" :label="item.name" :value="item.value" />
@@ -19,6 +25,7 @@
 <script lang="ts" setup>
 import { Close } from '@element-plus/icons-vue';
 import { FormInstance } from 'element-plus';
+import { optionsCommonParams } from '@/api/common/index'
 import { operationManageFirstPageAdd } from '@/api/pageLayout/homePage/index'
 const emit = defineEmits(['close']);
 const loading = ref(false)
@@ -27,8 +34,15 @@ const promotion = ref('')
 const formCallback = ref({
   status: 0,
 })
+const miniprogramTypelist = ref([])
 
 const typeList = ref([{ name: '本周精选', value: 1 }, { name: '优选好剧', value: 2 }])
+const init = () => {
+  optionsCommonParams().then(res => {
+    console.log(res, 'optionsCommonParams');
+    miniprogramTypelist.value = res.data.miniprogramType
+  })
+}
 
 // 提交回传配置
 const submitForm = (formEl: FormInstance | undefined) => {
@@ -52,7 +66,7 @@ const submitForm = (formEl: FormInstance | undefined) => {
 
 
 onMounted(() => {
-
+  init()
 });
 </script>
 

+ 9 - 3
src/views/pageLayout/homePageManage/form/videoList.vue

@@ -17,7 +17,7 @@
           <el-input v-model="query.videoName" placeholder="请输入短剧名称" clearable />
         </el-form-item>
         <el-form-item label="状态" prop="updateType">
-          <el-select v-model="query.updateType" filterable clearable remote placeholder="请选择状态">
+          <el-select v-model="query.updateType" filterable clearable placeholder="请选择状态">
             <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
         </el-form-item>
@@ -25,6 +25,11 @@
           <el-cascader v-model="selectType" :options="cooperations" filterable clearable :change-on-select="true"
             @change="handleCascaderChange" />
         </el-form-item>
+        <el-form-item label="微信审核状态" prop="wechatPass">
+          <el-select v-model="query.wechatPass" disabled filterable clearable placeholder="请选择微信审核状态">
+            <el-option v-for="item in wxstatusOptions" :key="item.value" :label="item.label" :value="item.value" />
+          </el-select>
+        </el-form-item>
       </template>
     </Search>
     <div class="table-default">
@@ -123,6 +128,7 @@ const multipleSelection = ref([]);
 const { data, query, search, reset, loading } = useGetList(api);
 const selectType = ref([])
 const statusOptions = ref([{ label: '连载中', value: '1' }, { label: '完结', value: '2' }]);
+const wxstatusOptions = ref([{ label: '未通过', value: 0 }, { label: '已通过', value: 1 }]);
 const cooperations = ref([]);
 const emit = defineEmits(['confirm']);
 const props = defineProps({
@@ -143,7 +149,7 @@ const handleCascaderChange = (val: any) => {
 }
 
 const resetQuery = () => {
-  query.value = Object.assign({ page: query.value.page, limit: query.value.limit, shelfType: 2 });
+  query.value = Object.assign({ page: query.value.page, limit: query.value.limit, shelfType: 2, wechatPass: 1 });
   search()
   selectType.value = []
 }
@@ -225,7 +231,7 @@ const setRowSelected = () => {
 onMounted(() => {
   // 初始化 sortValues 数组长度,保持与 multipleSelection 数组一致
   // sortValues.value = new Array(multipleSelection.value.length);
-  query.value = Object.assign({ page: query.value.page, limit: query.value.limit, shelfType: 2 });
+  query.value = Object.assign({ page: query.value.page, limit: query.value.limit, shelfType: 2, wechatPass: 1 });
   setRowSelected()
   initType()
   search();

+ 2 - 0
src/views/pageLayout/homePageManage/index.vue

@@ -9,6 +9,8 @@
       </el-table-column>
       <el-table-column label="添加时间" prop="created_at">
       </el-table-column>
+      <el-table-column label="小程序类型" prop="miniprogram_type_str">
+      </el-table-column>
       <el-table-column label="状态" v-action="'operation.FirstPage.enableStatus'">
         <template #default="scope">
           <div>

+ 0 - 98
src/views/pageLayout/viewpagerPageManage/form/config.vue

@@ -1,98 +0,0 @@
-<template>
-  <el-form :model="formCallback" label-width="120px" ref="form" v-loading="loading" class="pr-4">
-    <el-form-item label="列表名称" prop="ids" :rules="[{ required: false, message: '巨量账户ID必须填写' }]" label-width="120px">
-      <el-input v-model="props.primary.type_str" disabled size="default" clearable></el-input>
-    </el-form-item>
-    <el-form-item label="短剧" prop="duanjus" :rules="[{ required: true, message: '选择短剧' }]">
-      <div>
-        <div class="flex flex-wrap mb-5" v-if="formCallback.duanjus.length > 0">
-          <div v-for="item in formCallback.duanjus" :key="item.id" class="mt-3 mr-3">
-            <el-input v-model="item.name" disabled placeholder="短剧名称" style="width:300px;" class="input-with-select">
-              <template #prepend>
-                <el-input type="number" min="1" disabled v-model.number="item.sort" placeholder="排序" size="default"
-                  clearable style="width: 115px"></el-input>
-              </template>
-            </el-input>
-          </div>
-        </div>
-        <div>
-          <el-button type="primary" size="default" @click="chooseShort">选择短剧</el-button>
-        </div>
-      </div>
-    </el-form-item>
-    <div class="flex justify-end">
-      <el-button type="primary" @click="submitForm(form)">{{
-        $t('system.confirm')
-      }}</el-button>
-    </div>
-  </el-form>
-  <Dialog v-model="videoVisible" title="选择短剧" width="50%" destroy-on-close>
-    <videoList @confirm="confirm" :primary="formCallback.duanjus"></videoList>
-  </Dialog>
-</template>
-
-<script lang="ts" setup>
-import videoList from './videoList.vue';
-import { Close } from '@element-plus/icons-vue';
-import { FormInstance } from 'element-plus';
-import { operationManageFirstPageSetConfig } from '@/api/pageLayout/homePage/index';
-import { useRouter, useRoute } from 'vue-router'
-const props = defineProps({
-  primary: Object,
-});
-const router = useRouter()
-const route = useRoute()
-const emit = defineEmits(['close']);
-const loading = ref(false)
-const videoVisible = ref(false)
-const promotion = ref('')
-const form = ref()
-const formCallback = ref({
-  duanjus: []
-})
-
-
-const chooseShort = () => {
-  videoVisible.value = true
-}
-
-const confirm = (e) => {
-  formCallback.value.duanjus = e
-  videoVisible.value = false
-}
-// 提交回传配置
-const submitForm = (formEl: FormInstance | undefined) => {
-  console.log(formCallback.value, 'formCallbackformCallback');
-  if (!formEl) return;
-  loading.value = true;
-  formEl
-    .validate(valid => {
-      if (valid) {
-        operationManageFirstPageSetConfig(formCallback.value).then(res => {
-          ElMessage.success(res.message)
-          emit('close')
-        })
-        loading.value = false;
-      } else {
-        loading.value = false;
-      }
-    })
-    .then(() => { });
-}
-
-if (props.primary) {
-  console.log(props.primary, 'props.primaryprops.primary');
-  formCallback.value.id = props.primary.id
-  formCallback.value.duanjus = props.primary.duanjus
-}
-onMounted(() => {
-});
-</script>
-
-<style lang="scss" scoped>
-:deep(.input-with-select .el-input-group__prepend) {
-  background-color: #FFFFFF;
-  padding: 0;
-  border: 1px solid #dcdfe6;
-}
-</style>

+ 60 - 26
src/views/pageLayout/viewpagerPageManage/form/create.vue

@@ -1,28 +1,36 @@
 <template>
   <el-form :model="formCallback" label-width="120px" ref="form" v-loading="loading" class="pr-4">
-    <el-form-item label="轮播图名称" prop="ids" :rules="[{ required: false, message: '巨量账户ID必须填写' }]" label-width="120px">
-      <el-input v-model="formCallback.type_str" disabled size="default" clearable></el-input>
+    <el-form-item label="小程序类型" prop="miniprogram_type" :rules="[{ required: true, message: '选择小程序类型' }]"
+      label-width="120px">
+      <el-select v-model="formCallback.miniprogram_type" clearable filterable placeholder="请选择小程序类型">
+        <el-option v-for="(item, index) in miniprogramTypelist" :key="index" :label="item.label" :value="item.value" />
+      </el-select>
     </el-form-item>
-    <el-form-item label="轮播图名称" prop="ids" :rules="[{ required: false, message: '巨量账户ID必须填写' }]" label-width="120px">
-      <el-input v-model="formCallback.type_str" disabled size="default" clearable></el-input>
+    <el-form-item label="轮播图名称" prop="title" :rules="[{ required: true, message: '轮播图名称必须填写' }]" label-width="120px">
+      <el-input v-model="formCallback.title" size="default" clearable></el-input>
     </el-form-item>
-    <el-form-item label="封面" prop="cover_image">
-      <my-upload acceptType=".png" :isCheckMM="false" :isMultiple="true" @fileRemove="fileRemove"
+    <el-form-item label="排序" prop="sort" :rules="[{ required: true, message: '排序必须填写' }]" label-width="120px">
+      <el-input v-model.number="formCallback.sort" min="1" type="number" size="default" clearable></el-input>
+    </el-form-item>
+    <el-form-item label="封面图" prop="img_url" :rules="[{ required: true, message: '请上传封面图' }]">
+      <my-upload acceptType=".png,.jpg,.jpeg" :isCheckMM="true" :isMultiple="true" @fileRemove="fileRemove"
         @fileSuccess="fileSuccess" :fileList="formCallback.fileList" action="/qiniu/upload/image"></my-upload>
     </el-form-item>
-    <el-form-item label="短剧" prop="duanjus" :rules="[{ required: true, message: '选择短剧' }]">
+    <el-form-item label="链接短剧信息" prop="duanjus" :rules="[{ required: true, message: '选择链接短剧信息' }]">
       <div>
-        <div class="flex flex-wrap mb-5" v-if="formCallback.duanjus.length > 0">
-          <div v-for="item in formCallback.duanjus" :key="item.id" class="mt-3 mr-3">
-            <el-input v-model="item.name" disabled placeholder="短剧名称" style="width:200px;" class="input-with-select">
-            </el-input>
-          </div>
+        <div class="flex flex-wrap mb-5" v-if="formCallback?.duanjus?.name">
+          <el-input v-model="formCallback.duanjus.name" disabled placeholder="短剧名称" style="width:200px;"
+            class="input-with-select">
+          </el-input>
         </div>
         <div>
           <el-button type="primary" size="default" @click="chooseShort">选择短剧</el-button>
         </div>
       </div>
     </el-form-item>
+    <el-form-item label="状态" prop="status" label-width="120px" :rules="[{ required: true, message: '选择状态' }]">
+      <el-switch v-model="formCallback.status" :active-value="1" :inactive-value="0"></el-switch>
+    </el-form-item>
     <div class="flex justify-end">
       <el-button type="primary" @click="submitForm(form)">{{
         $t('system.confirm')
@@ -38,8 +46,12 @@
 import videoList from './videoList.vue';
 import { Close } from '@element-plus/icons-vue';
 import { FormInstance } from 'element-plus';
-import { operationManageFirstPageSetConfig } from '@/api/pageLayout/homePage/index';
+import {
+  operationBannerEdit,
+  operationBannerAdd
+} from '@/api/pageLayout/viewpagerPage/index';
 import { useRouter, useRoute } from 'vue-router'
+import { optionsCommonParams } from '@/api/common/index'
 const props = defineProps({
   primary: Object,
 });
@@ -50,17 +62,22 @@ const loading = ref(false)
 const videoVisible = ref(false)
 const promotion = ref('')
 const form = ref()
-const formCallback = ref({
-  duanjus: []
-})
+const formCallback = ref({})
+const miniprogramTypelist = ref([])
+const init = () => {
+  optionsCommonParams().then(res => {
+    console.log(res, 'optionsCommonParams');
+    miniprogramTypelist.value = res.data.miniprogramType
+  })
+}
 
 const fileSuccess = (e) => {
   console.log(e);
-  formCallback.value.cover_image = e;
+  formCallback.value.img_url = e;
 }
 const fileRemove = (e) => {
   console.log(e);
-  formCallback.value.cover_image = '';
+  formCallback.value.img_url = '';
 }
 const chooseShort = () => {
   videoVisible.value = true
@@ -78,11 +95,26 @@ const submitForm = (formEl: FormInstance | undefined) => {
   formEl
     .validate(valid => {
       if (valid) {
-        operationManageFirstPageSetConfig(formCallback.value).then(res => {
-          ElMessage.success(res.message)
-          emit('close')
-        })
-        loading.value = false;
+        const params = {
+          title: formCallback.value.title,
+          video_id: formCallback.value.duanjus.id,
+          miniprogram_type: formCallback.value.miniprogram_type,
+          sort: formCallback.value.sort,
+          img_url: formCallback.value.img_url,
+          status: formCallback.value.status,
+        }
+        if (props.primary.id) {
+          operationBannerEdit(formCallback.value.id, params).then(res => {
+            ElMessage.success(res.message)
+            emit('close')
+          })
+        } else {
+          operationBannerAdd(params).then(res => {
+            ElMessage.success(res.message)
+            emit('close')
+          })
+          loading.value = false;
+        }
       } else {
         loading.value = false;
       }
@@ -90,12 +122,14 @@ const submitForm = (formEl: FormInstance | undefined) => {
     .then(() => { });
 }
 
-if (props.primary) {
+if (props.primary.id) {
   console.log(props.primary, 'props.primaryprops.primary');
-  formCallback.value.id = props.primary.id
-  formCallback.value.duanjus = props.primary.duanjus
+  formCallback.value = JSON.parse(JSON.stringify(props.primary))
+  formCallback.value.duanjus = props.primary.videoInfo
+  formCallback.value.fileList = [{ uid: props.primary.id, url: props.primary.img_url }]
 }
 onMounted(() => {
+  init()
 });
 </script>
 

+ 25 - 28
src/views/pageLayout/viewpagerPageManage/form/videoList.vue

@@ -1,12 +1,10 @@
 <template>
   <div>
     <div class="flex flex-wrap ml-6">
-      <el-form-item label="所选短剧:" class="font-bold" v-if="multipleSelection.length > 0">
-        <div v-for="(item, index) in multipleSelection" :key="item.id" class="mb-3 mr-3">
-          <el-input v-model="item.name" :disabled="true" placeholder="短剧名称" style="width:300px;"
-            class="input-with-select">
-          </el-input>
-        </div>
+      <el-form-item label="所选短剧:" class="font-bold" v-if="multipleSelection.name">
+        <el-input v-model="multipleSelection.name" :disabled="true" placeholder="短剧名称" style="width:300px;"
+          class="input-with-select">
+        </el-input>
       </el-form-item>
     </div>
     <Search :search="search" :reset="resetQuery">
@@ -15,7 +13,7 @@
           <el-input v-model="query.videoName" placeholder="请输入短剧名称" clearable />
         </el-form-item>
         <el-form-item label="状态" prop="updateType">
-          <el-select v-model="query.updateType" filterable clearable remote placeholder="请选择状态">
+          <el-select v-model="query.updateType" filterable clearable placeholder="请选择状态">
             <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
         </el-form-item>
@@ -23,12 +21,21 @@
           <el-cascader v-model="selectType" :options="cooperations" filterable clearable :change-on-select="true"
             @change="handleCascaderChange" />
         </el-form-item>
+        <el-form-item label="微信审核状态" prop="wechatPass">
+          <el-select v-model="query.wechatPass" disabled filterable clearable placeholder="请选择微信审核状态">
+            <el-option v-for="item in wxstatusOptions" :key="item.value" :label="item.label" :value="item.value" />
+          </el-select>
+        </el-form-item>
       </template>
     </Search>
     <div class="table-default">
-      <el-table :data="tableData" ref="multipleTableRef" class="mt-3" v-loading="loading" row-key="id"
-        @selection-change="handleSelectionChange">
-        <el-table-column type="selection" reserve-selection />
+      <el-table :data="tableData" ref="multipleTableRef" highlight-current-row class="mt-3" v-loading="loading"
+        row-key="id" @current-change="handleCurrentChange">
+        <el-table-column>
+          <template #default="scope">
+            <el-radio class="radio" v-model="selVal" :label="scope.row.id"><span></span></el-radio>
+          </template>
+        </el-table-column>
         <el-table-column prop="id" label="剧号" />
         <el-table-column label="封面" show-overflow-tooltip>
           <template #default="scope">
@@ -117,15 +124,17 @@ import { useOpen } from '@/hook/curd/useOpen';
 import { videoStockVideoCategoryList, videoStockVideoList } from '@/api/video/index'
 const api = 'videoStock/video/list';
 const multipleTableRef = ref()
-const multipleSelection = ref([]);
+const multipleSelection = ref({});
 const { data, query, search, reset, loading } = useGetList(api);
 const selectType = ref([])
 const statusOptions = ref([{ label: '连载中', value: '1' }, { label: '完结', value: '2' }]);
 const cooperations = ref([]);
 const emit = defineEmits(['confirm']);
+const wxstatusOptions = ref([{ label: '未通过', value: 0 }, { label: '已通过', value: 1 }]);
 const props = defineProps({
   primary: Object,
 });
+const selVal = ref("")
 const rowSelectFlag = ref(false)// 禁止toggleRowSelection默认触发handleSelectionChange
 const handleCascaderChange = (val: any) => {
   console.log(val, 'valval');
@@ -157,36 +166,24 @@ const dowload = (e: object) => {
 
 const tableData = computed(() => data.value?.data);
 
-const handleSelectionChange = (val: []) => {
+const handleCurrentChange = (val: any) => {
   if (rowSelectFlag.value) return
   multipleSelection.value = val;
+  selVal.value = val.id
 };
 const confirm = () => {
-  const params = multipleSelection.value.map((el, index) => {
-    return {
-      id: el.id,
-      name: el.name
-    }
-  })
   // 执行提交逻辑
-  emit('confirm', params)
+  emit('confirm', multipleSelection.value)
 }
 
 if (props.primary) {
   // console.log(props.primary, 'props.primaryprops.primary');
-  multipleSelection.value = props.primary || []
+  multipleSelection.value = props.primary || {}
+  selVal.value = props.primary.id
 }
 
-const setRowSelected = () => {
-  rowSelectFlag.value = true
-  Object.keys(multipleSelection.value).forEach(key => {
-    multipleSelection.value[key] && multipleTableRef.value.toggleRowSelection(multipleSelection.value[key], true)
-  })
-  rowSelectFlag.value = false
-}
 onMounted(() => {
   query.value = Object.assign({ page: query.value.page, limit: query.value.limit, shelfType: 2 });
-  setRowSelected()
   initType()
   search();
 });

+ 43 - 19
src/views/pageLayout/viewpagerPageManage/index.vue

@@ -5,41 +5,41 @@
     </div>
     <el-table :data="tableData" class="mt-3" v-loading="loading">
       <el-table-column label="轮播图ID" prop="id"></el-table-column>
-      <el-table-column label="轮播图名称" prop="type_str">
+      <el-table-column label="轮播图名称" prop="title">
       </el-table-column>
-      <el-table-column label="封面" prop="type_str">
+      <el-table-column label="封面" prop="img_url">
         <template #default="scope">
-          <el-image :src="scope.row.img" fit="fill" :lazy="true"></el-image>
+          <el-image :src="scope.row.img_url" fit="fill" :lazy="true"></el-image>
         </template>
       </el-table-column>
-      <el-table-column label="排序" prop="created_at">
+      <el-table-column label="排序" prop="sort">
       </el-table-column>
       <el-table-column label="添加时间" prop="created_at">
       </el-table-column>
+      <el-table-column label="小程序类型" prop="miniprogram_type_text">
+      </el-table-column>
       <el-table-column label="状态" v-action="'operation.FirstPage.enableStatus'">
         <template #default="scope">
           <div>
-            <el-switch v-model="scope.row.status" :disabled="Boolean(scope.row.status)" @change="switchStatus(scope.row)"
-              :active-value="1" :inactive-value="0">
+            <el-switch v-model="scope.row.status" @change="switchStatus(scope.row)" :active-value="1" :inactive-value="0">
             </el-switch>
           </div>
         </template>
       </el-table-column>
       <el-table-column label="操作">
         <template #default="scope">
-          <el-button link type="primary" size="default" @click="handleConfigure(scope.row)"
-            v-action="'operation.FirstPage.setConfig'">配置</el-button>
+          <el-button link type="primary" size="small" @click="handleEdit(scope.row)"
+            v-action="'operation.FirstPage.setConfig'">编辑</el-button>
+          <br />
+          <el-button link type="primary" size="small" @click="handleDel(scope.row)"
+            v-action="'operation.FirstPage.setConfig'">删除</el-button>
         </template>
       </el-table-column>
     </el-table>
     <Paginate />
   </div>
-  <Dialog v-model="configVisible" title="配置" width="50%" destroy-on-close>
-    <config @close="closeType('configVisible')" :primary="currentConfig"></config>
-  </Dialog>
-
   <Dialog v-model="addVisible" title="新增" width="30%" destroy-on-close>
-    <create @close="closeType('addVisible')"></create>
+    <create @close="closeType('addVisible')" :primary="currentConfig"></create>
   </Dialog>
 </template>
 
@@ -49,9 +49,12 @@ import { computed, onMounted, ref } from 'vue';
 import create from './form/create.vue';
 import config from './form/config.vue';
 import { useGetList } from '@/hook/curd/useGetList';
-import { operationManageFirstPageEnableStatus } from '@/api/pageLayout/homePage/index'
+import {
+  operationBannerEditStatus,
+  operationBannerDel
+} from '@/api/pageLayout/viewpagerPage/index';
 
-const api = 'cpManage/cp/manage/cp_list';
+const api = 'operation/banner/list';
 
 const { data, query, search, reset, loading } = useGetList(api, true);
 const tableData = computed(() => data.value?.data);
@@ -72,19 +75,40 @@ const closeType = (type: string) => {
 }
 
 const switchStatus = (data: object) => {
-  operationManageFirstPageEnableStatus({ id: data.id }).then(res => {
+  operationBannerEditStatus(data.id, { status: data.status }).then(res => {
     ElMessage.success(res.message)
-    search()
   })
+  search()
 }
 
+const handleDel = (row: object) => {
+  ElMessageBox.confirm(
+    `确认删除 ${row.title} 吗?`,
+    '提示',
+    {
+      confirmButtonText: '确定',
+      cancelButtonText: '取消',
+      type: 'warning',
+    }
+  )
+    .then(() => {
+      operationBannerDel(row.id).then(res => {
+        ElMessage.success(res.message)
+        search()
+      })
+    })
+    .catch(() => {
+      search()
+    })
+}
 
 const openForm = (data: any) => {
+  currentConfig.value = {}
   addVisible.value = true
 };
-const handleConfigure = (data: object) => {
+const handleEdit = (data: object) => {
   currentConfig.value = data
-  configVisible.value = true
+  addVisible.value = true
 };
 onMounted(() => {
   search();

+ 5 - 5
src/views/payBack/juliangAccount/tabs/logList/index.vue

@@ -18,7 +18,7 @@
         <el-form-item label="广告计划ID" prop="adv_promotion_id">
           <el-input v-model="query.adv_promotion_id" placeholder="请输入广告计划ID" clearable />
         </el-form-item>
-        <el-form-item label="注册时间">
+        <el-form-item label="染色注册时间">
           <el-date-picker unlink-panels clearable @change="userTimeChange" format="YYYY/MM/DD" value-format="YYYY-MM-DD"
             v-model="query.userTime" type="daterange" :shortcuts="shortcuts" range-separator="To" start-placeholder="开始时间"
             end-placeholder="结束时间" />
@@ -46,7 +46,7 @@
         </el-table-column>
         <el-table-column prop="user_ranse_ip" label="注册IP" show-overflow-tooltip min-width="200px">
         </el-table-column>
-        <el-table-column prop="user_ranse_start_at" label="注册时间" show-overflow-tooltip min-width="200px" />
+        <el-table-column prop="user_ranse_start_at" label="染色注册时间" show-overflow-tooltip min-width="200px" />
         <el-table-column prop="order_created_at" label="充值时间" show-overflow-tooltip min-width="200px" />
         <el-table-column prop="order_price" label="充值金额" show-overflow-tooltip min-width="150px">
         </el-table-column>
@@ -211,9 +211,9 @@ const openType = (type: string, data: object) => {
 const tableData = computed(() => data.value?.data);
 
 onMounted(() => {
-  query.value.userTime = [start_date, end_date];
-  query.value.user_ranse_start_at_begin_time = start_date
-  query.value.user_ranse_start_at_end_time = end_date
+  // query.value.userTime = [start_date, end_date];
+  // query.value.user_ranse_start_at_begin_time = start_date
+  // query.value.user_ranse_start_at_end_time = end_date
   query.value.orderTime = [start_date, end_date];
   query.value.order_created_at_begin_time = start_date
   query.value.order_created_at_end_time = end_date

+ 1 - 1
src/views/settleManage/settlementCenter/tabs/rechargeRules/index.vue

@@ -2,7 +2,7 @@
   <div class="withdraw-popup-warn">
     (1):结算功能针对同一账号下的所有小程序<br />
     (2):分成金额=(充值总额-退款)*分成比例<br />
-    (3):申请提现后自动进入审核流程,审核需要1-5个工作日,节假日顺延,审核成功后自动打款<br />
+    (3):申请提现后自动进入审核流程,审核需要t+7个工作日,节假日顺延,审核成功后自动打款<br />
     (4):每日提现一次<br />
     (5):单笔提现金额不少于500<br />
   </div>

+ 1 - 2
src/views/settleManage/settlementCenter/tabs/rechargeSettle/form/create.vue

@@ -1,7 +1,6 @@
 <template>
   <div class="withdraw-popup-warn">
-    提现提示1:工作日14:30点前提现,审核通过之后下一工作日可到账;14:30之后提现将会在下一工作日审核<br />
-    提现提示2:充值收入提现后,请自行到当地税务部门纳税,本平台仅收取10%平台服务费,不承担代扣代缴义务。
+    提现提示:申请提现后自动进入审核流程,审核需要t+7个工作日,节假日顺延,审核成功后自动打款
   </div>
   <el-form :model="formData" label-width="120px" ref="ruleForm" :rules="rules" v-loading="loading" class="pr-4">
     <div class="flex flex-row justify-between">

+ 1 - 1
src/views/settleManage/settlementCenter/tabs/rechargeSettle/index.vue

@@ -23,7 +23,7 @@
             ¥{{ applyData.total_dakuan }}
           </div>
           <div class="text-base">
-            打款
+            累计打款
           </div>
         </el-col>
         <el-col :span="6" class="col">

+ 57 - 0
src/views/videoManage/detail.vue

@@ -1,4 +1,54 @@
 <template>
+  <el-card class="box-card">
+    <template #header>
+      <div class="card-header">
+        <span>简介</span>
+      </div>
+    </template>
+    <div class="flex">
+      <div>
+        <el-image class="mr-2 rounded-sm" :src="props.primary.cover_image" style="width:128px;height:160px;" fit="cover"
+          :lazy="true"></el-image>
+      </div>
+      <div>
+        <div class="flex items-center">
+          <span class="text-lg font-bold text-blue-400">
+            {{ props.primary.name }}
+          </span>
+          <div class="ml-3">
+            剧号:
+            <span class="font-bold">{{ props.primary.id }}</span>
+          </div>
+        </div>
+        <div class="flex items-center mt-2">
+          <span>
+            集数:
+          </span>
+          <div class="flex items-center font-bold">
+            <div v-if="props.primary.update_type == 1">
+              <span class="">
+                {{ props.primary.updated_episode_num }}
+              </span>
+              <span>/</span>
+            </div>
+            <div>
+              <span class="">
+                {{ props.primary.total_episode_num }}
+              </span>
+            </div>
+            <span>
+              【 {{ props.primary.update_type_str }} 】
+            </span>
+          </div>
+        </div>
+        <div class="mt-2">
+          简介:
+          <span class="font-bold note">{{ props.primary.note }}</span>
+        </div>
+      </div>
+    </div>
+  </el-card>
+
   <div class="flex flex-col justify-between w-full sm:flex-row" style="width:100%;">
     <div class="table-default" style="width:100%;">
       <el-table :data="tableData" class="w-full mt-3" style="width:100%;">
@@ -116,4 +166,11 @@ video#my-player.video-js {
   height: 500px;
   background-color: #000;
 }
+
+.note {
+  font-size: 16px;
+  width: fit-content;
+  word-wrap: break-word;
+  word-break: break-all;
+}
 </style>

+ 6 - 1
src/views/videoManage/form/create.vue

@@ -56,9 +56,12 @@
           </el-radio-group>
         </el-form-item>
         <el-form-item label="封面" prop="cover_image">
-          <my-upload acceptType=".png,.jpeg" :isMultiple="true" @fileRemove="fileRemove" @fileSuccess="fileSuccess"
+          <my-upload acceptType=".png,.jpg,.jpeg" :isMultiple="true" @fileRemove="fileRemove" @fileSuccess="fileSuccess"
             :fileList="formData.fileList" action="/qiniu/upload/image"></my-upload>
         </el-form-item>
+        <el-form-item label="简介" prop="note">
+          <el-input v-model="formData.note" placeholder="请输入简介" :rows="3" autosize type="textarea" />
+        </el-form-item>
       </div>
     </div>
     <div class="flex justify-end">
@@ -82,6 +85,7 @@ const categoryList = ref([])
 const formData = ref({ status: 2, miniProgramIds: [] })
 const rules = reactive({
   name: [{ required: true, message: '请输入短剧名称', trigger: 'blur' }],
+  note: [{ required: true, message: '请输入简介', trigger: 'blur' }],
   total_episode_num: [
     {
       required: true,
@@ -198,6 +202,7 @@ const submitForm = (formEl: FormInstance | undefined) => {
           "cp_name": formData.value.cp_name,
           "cp_share_type": formData.value.cp_share_type,
           "cover_image": formData.value.cover_image,
+          "note": formData.value.note
         };
         if (props.primary) {
           api = videoStockVideoUpdate

src/views/videoManage/form/subscribeSet.vue → src/views/videoManage/videoLibraryList/form/subscribeSet.vue


src/views/videoManage/form/uploadVideo.vue → src/views/videoManage/videoLibraryList/form/uploadVideo.vue


+ 1 - 1
src/views/videoManage/form/videoDL.vue

@@ -31,7 +31,7 @@ import { ref } from 'vue'
 import { videoStockEpisodeList } from '@/api/video/index'
 const myVideo = ref()
 const videoChoose = ref([])
-const changeForm = ref({ page: 1, limit: 5 })
+const changeForm = ref({ page: 1, limit: 100 })
 const props = defineProps({
   primary: String | Number,
 });

+ 44 - 14
src/views/videoManage/index.vue

@@ -6,7 +6,7 @@
           <el-input v-model="query.videoName" placeholder="请输入短剧名称" clearable />
         </el-form-item>
         <el-form-item label="状态" prop="updateType">
-          <el-select v-model="query.updateType" filterable clearable remote placeholder="请选择状态">
+          <el-select v-model="query.updateType" filterable clearable placeholder="请选择状态">
             <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
         </el-form-item>
@@ -14,6 +14,11 @@
           <el-cascader v-model="selectType" :options="cooperations" filterable clearable :change-on-select="true"
             @change="handleCascaderChange" />
         </el-form-item>
+        <el-form-item label="微信审核状态" prop="wechatPass">
+          <el-select v-model="query.wechatPass" filterable clearable placeholder="请选择微信审核状态">
+            <el-option v-for="item in wxstatusOptions" :key="item.value" :label="item.label" :value="item.value" />
+          </el-select>
+        </el-form-item>
       </template>
     </Search>
     <div class="table-default">
@@ -38,20 +43,44 @@
             </div>
           </template>
         </el-table-column>
-        <el-table-column label="短剧名称" show-overflow-tooltip min-width="250">
+        <el-table-column label="短剧名称" min-width="250">
           <template #default="scope">
-            <div class="wrapper">
-              <span class="text-lg font-bold text-blue-400 cursor-pointer content"
-                @click="openType('videoDetailVisible', scope.row)">
-                {{ scope.row.name }}
-              </span>
-              <span>
-                【 {{ scope.row.update_type_str }} 】
-              </span>
-            </div>
-            <div class="wrapper">
-              <span class="label">上架时间:</span>
-              <span class="content">{{ scope.row.shelf_at }}</span>
+            <el-tooltip placement="top" v-if="scope.row.wechat_pass">
+              <template #content> 当前短剧已通过微信审核<br /> </template>
+              <div>
+                <div class="wrapper">
+                  <span class="text-lg font-bold text-blue-400 cursor-pointer content"
+                    @click="openType('videoDetailVisible', scope.row)">
+                    {{ scope.row.name }}
+                  </span>
+                  <span>
+                    【 {{ scope.row.update_type_str }} 】
+                  </span>
+                </div>
+                <div class="wrapper">
+                  <span class="label">上架时间:</span>
+                  <span class="content">{{ scope.row.shelf_at }}</span>
+                </div>
+                <div class="ml-2">
+                  <el-image style="width: 20px; height: 20px" class="mt-1" :src="scope.row.wechat_pass_img"
+                    fit="contain" />
+                </div>
+              </div>
+            </el-tooltip>
+            <div v-else>
+              <div class="wrapper">
+                <span class="text-lg font-bold text-blue-400 cursor-pointer content"
+                  @click="openType('videoDetailVisible', scope.row)">
+                  {{ scope.row.name }}
+                </span>
+                <span>
+                  【 {{ scope.row.update_type_str }} 】
+                </span>
+              </div>
+              <div class="wrapper">
+                <span class="label">上架时间:</span>
+                <span class="content">{{ scope.row.shelf_at }}</span>
+              </div>
             </div>
           </template>
         </el-table-column>
@@ -164,6 +193,7 @@ const videoDetailData = ref({})
 const current = ref({})
 const selectType = ref([])
 const statusOptions = ref([{ label: '连载中', value: '1' }, { label: '完结', value: '2' }]);
+const wxstatusOptions = ref([{ label: '未通过', value: 0 }, { label: '已通过', value: 1 }]);
 const cooperations = ref([]);
 const rolesIdentify = ref([]);
 const isShowCreatePromotion = computed(() => JSON.parse(Cache.get('nav_data'))?.advertiser?.miniProgramIds && JSON.parse(Cache.get('nav_data'))?.app)

+ 32 - 0
src/views/videoManage/wechatAudit/index.vue

@@ -0,0 +1,32 @@
+<template>
+  <div>
+    <el-card shadow="always" :body-style="{ padding: '20px' }">
+      <el-tabs v-model="activeName" class="demo-tabs" @tab-change="handChange">
+        <el-tab-pane label="微信提审" name="wechatAudit">
+          <wechatAuditList v-if="activeName == 'wechatAudit'"></wechatAuditList>
+        </el-tab-pane>
+        <el-tab-pane label="审核状态" name="wechatAuditStatus">
+          <wechatAuditStatus v-if="activeName == 'wechatAuditStatus'"></wechatAuditStatus>
+        </el-tab-pane>
+      </el-tabs>
+    </el-card>
+  </div>
+</template>
+
+<script lang="ts" setup>
+import { useRouter, useRoute } from 'vue-router'
+import type { TabsPaneContext } from 'element-plus'
+import wechatAuditList from "./tabs/wechatAuditList/index.vue"
+import wechatAuditStatus from "./tabs/wechatAuditStatus/index.vue"
+const router = useRouter()
+const route = useRoute()
+const handChange = (tab: TabsPaneContext, event: Event) => {
+  activeName.value = tab
+}
+const activeName = ref('wechatAudit')
+onMounted(() => {
+  activeName.value = route.query.tab || 'wechatAudit'
+});
+</script>
+
+<style scoped lang="scss"></style>

+ 57 - 0
src/views/videoManage/detail.vue

@@ -1,4 +1,54 @@
 <template>
+  <el-card class="box-card">
+    <template #header>
+      <div class="card-header">
+        <span>简介</span>
+      </div>
+    </template>
+    <div class="flex">
+      <div>
+        <el-image class="mr-2 rounded-sm" :src="props.primary.cover_image" style="width:128px;height:160px;" fit="cover"
+          :lazy="true"></el-image>
+      </div>
+      <div>
+        <div class="flex items-center">
+          <span class="text-lg font-bold text-blue-400">
+            {{ props.primary.name }}
+          </span>
+          <div class="ml-3">
+            剧号:
+            <span class="font-bold">{{ props.primary.id }}</span>
+          </div>
+        </div>
+        <div class="flex items-center mt-2">
+          <span>
+            集数:
+          </span>
+          <div class="flex items-center font-bold">
+            <div v-if="props.primary.update_type == 1">
+              <span class="">
+                {{ props.primary.updated_episode_num }}
+              </span>
+              <span>/</span>
+            </div>
+            <div>
+              <span class="">
+                {{ props.primary.total_episode_num }}
+              </span>
+            </div>
+            <span>
+              【 {{ props.primary.update_type_str }} 】
+            </span>
+          </div>
+        </div>
+        <div class="mt-2">
+          简介:
+          <span class="font-bold note">{{ props.primary.note }}</span>
+        </div>
+      </div>
+    </div>
+  </el-card>
+
   <div class="flex flex-col justify-between w-full sm:flex-row" style="width:100%;">
     <div class="table-default" style="width:100%;">
       <el-table :data="tableData" class="w-full mt-3" style="width:100%;">
@@ -116,4 +166,11 @@ video#my-player.video-js {
   height: 500px;
   background-color: #000;
 }
+
+.note {
+  font-size: 16px;
+  width: fit-content;
+  word-wrap: break-word;
+  word-break: break-all;
+}
 </style>

+ 6 - 1
src/views/videoManage/form/create.vue

@@ -56,9 +56,12 @@
           </el-radio-group>
         </el-form-item>
         <el-form-item label="封面" prop="cover_image">
-          <my-upload acceptType=".png,.jpeg" :isMultiple="true" @fileRemove="fileRemove" @fileSuccess="fileSuccess"
+          <my-upload acceptType=".png,.jpg,.jpeg" :isMultiple="true" @fileRemove="fileRemove" @fileSuccess="fileSuccess"
             :fileList="formData.fileList" action="/qiniu/upload/image"></my-upload>
         </el-form-item>
+        <el-form-item label="简介" prop="note">
+          <el-input v-model="formData.note" placeholder="请输入简介" :rows="3" autosize type="textarea" />
+        </el-form-item>
       </div>
     </div>
     <div class="flex justify-end">
@@ -82,6 +85,7 @@ const categoryList = ref([])
 const formData = ref({ status: 2, miniProgramIds: [] })
 const rules = reactive({
   name: [{ required: true, message: '请输入短剧名称', trigger: 'blur' }],
+  note: [{ required: true, message: '请输入简介', trigger: 'blur' }],
   total_episode_num: [
     {
       required: true,
@@ -198,6 +202,7 @@ const submitForm = (formEl: FormInstance | undefined) => {
           "cp_name": formData.value.cp_name,
           "cp_share_type": formData.value.cp_share_type,
           "cover_image": formData.value.cover_image,
+          "note": formData.value.note
         };
         if (props.primary) {
           api = videoStockVideoUpdate

src/views/videoManage/form/subscribeSet.vue → src/views/videoManage/wechatAudit/tabs/wechatAuditList/form/subscribeSet.vue


src/views/videoManage/form/uploadVideo.vue → src/views/videoManage/wechatAudit/tabs/wechatAuditList/form/uploadVideo.vue


+ 183 - 0
src/views/videoManage/wechatAudit/tabs/wechatAuditList/form/videoSync.vue

@@ -0,0 +1,183 @@
+<template>
+  <el-alert title="注:如需批量下载,则多选目标集数,点击下载按钮即可" type="warning" show-icon :closable="false" />
+  <div class="wrapper">
+    <!-- :poster="videoImg"视频封面 -->
+    <video id="my-player" style="width:500px;" :key="current.public_video_url" class="video-js" controls autoplay
+      ref="myVideo">
+      <source :src="current.public_video_url" type="video/mp4">
+    </video>
+    <!-- 视频名称列表布局 -->
+    <div class="video-wrapper">
+      <div class="flex items-center justify-between h-10">
+        <div class="w-full text-base font-medium">剧名: <span class="ml-2 text-lg font-bold text-dark-600">{{
+          props.primary.name }}</span> <span v-if="current.series_name">(当前播放{{ current.series_name }})</span></div>
+        <el-button type="primary" size="default" @click="syncVideoChange">同步视频</el-button>
+        <el-popover placement="top" :width="400" trigger="click">
+          <template #reference>
+            <el-button style="margin-right: 16px" @click="viewStatusChange">查看状态</el-button>
+          </template>
+          <div class="flex items-center">
+            <div class="dot-success"></div>
+            <span>同步成功</span>
+          </div>
+          <div class="flex items-center">
+            <div class="dot-lose"></div>
+            <span>同步失败</span>
+          </div>
+          <div class="flex items-center">
+            <div class="dot-ing"></div>
+            <span>同步中</span>
+          </div>
+        </el-popover>
+      </div>
+      <div>
+        <el-checkbox v-model="checkAll" border :indeterminate="isIndeterminate" @change="handleCheckAllChange">
+          全选
+        </el-checkbox>
+      </div>
+      <mytabs :meta="meta" v-if="meta.total" @change="handChange">
+        <template v-slot:content>
+          <el-checkbox-group v-model="videoChoose" size="large" class="flex items-center" v-if="viewStatus">
+            <el-checkbox border class="video-item" @change="videoShow(source)" v-for="(source, index) in videoUrlList"
+              :key="index" :label="source" :style="{ backgroundColor: colorType(source) }">
+              {{ source.series_sequence }}
+            </el-checkbox>
+          </el-checkbox-group>
+          <el-checkbox-group v-model="videoChoose" size="large" class="flex items-center" v-else>
+            <el-checkbox border class="video-item" @change="videoShow(source)" v-for="(source, index) in videoUrlList"
+              :key="index" :label="source">
+              {{ source.series_sequence }}
+            </el-checkbox>
+          </el-checkbox-group>
+        </template>
+      </mytabs>
+    </div>
+  </div>
+</template>
+<script lang="ts" setup>
+import { ref } from 'vue'
+import { videoStockEpisodeList } from '@/api/video/index'
+const myVideo = ref()
+const videoChoose = ref([])
+const changeForm = ref({ page: 1, limit: 100 })
+const props = defineProps({
+  primary: String | Number,
+});
+const checkAll = ref(false)
+const videoUrlList = ref([])
+const viewStatus = ref(false)
+if (props.primary) {
+
+}
+const meta = ref({})
+const colorType = (data: object) => {
+  console.log(data, 'datacolorTypecolorType');
+  const type = data.series_sequence
+  switch (type) {
+    case 1:
+      return '#f18e00'
+    case 2:
+      return '#28c445'
+    case 3:
+      return '#ed0b0b'
+  }
+}
+const current = ref({})
+const videoChooseUrls = ref([])
+// 查看状态
+const viewStatusChange = () => {
+  viewStatus.value = true
+}
+// 同步视频
+const syncVideoChange = () => {
+  viewStatus.value = false
+}
+const initVideoList = (params: object) => {
+  videoStockEpisodeList({ video_id: props.primary.id, ...params }).then(res => {
+    videoUrlList.value = res.data;
+    meta.value = { limit: res.limit, total: res.total }
+  })
+}
+
+const handleCheckAllChange = (val: boolean) => {
+  videoChoose.value = val ? videoUrlList.value : []
+  // isIndeterminate.value = false
+}
+
+const handChange = (e) => {
+  console.log(e, 'handChange');
+  changeForm.value.page = Number(e.page);
+  initVideoList(changeForm.value);
+}
+const videoShow = (source: object) => {
+  console.log(source);
+  current.value = videoChoose.value.find(el => el.public_video_url == source.public_video_url) ?? {}
+  videoChooseUrls.value = videoChoose.value
+  console.log(videoChooseUrls.value, 'videoChooseUrls.value');
+}
+
+onMounted(() => {
+  initVideoList(changeForm.value)
+})
+</script>
+
+
+<style lang="scss" scoped>
+.dot-success,
+.dot-lose,
+.dot-ing {
+  width: 12px;
+  height: 12px;
+  border-radius: 50%;
+  margin-right: 6px;
+}
+
+.dot-success {
+  background-color: #28c445;
+}
+
+.dot-lose {
+  background-color: #ed0b0b;
+}
+
+.dot-ing {
+  background-color: #f18e00;
+}
+
+.wrapper {
+  padding-left: 40px;
+  margin-top: 30px;
+  display: flex;
+  width: 100%;
+}
+
+//播放器样式
+video#my-player.video-js {
+  flex: 1;
+  min-width: 300px;
+  height: 580px;
+  background-color: #000;
+}
+
+.video-wrapper {
+  flex: 2;
+  min-width: 600px;
+  margin-left: 40px;
+
+  .video-item {
+    margin: 6px;
+  }
+
+  :deep(.el-checkbox-group .el-checkbox.is-checked) {
+    background-color: #2566ff;
+  }
+
+  :deep(.el-checkbox.is-bordered.is-checked) {
+    background-color: #2566ff;
+  }
+
+  :deep(.el-checkbox__input.is-checked + .el-checkbox__label) {
+    color: #fff
+  }
+}
+</style>

+ 58 - 75
src/views/videoManage/index.vue

@@ -6,7 +6,7 @@
           <el-input v-model="query.videoName" placeholder="请输入短剧名称" clearable />
         </el-form-item>
         <el-form-item label="状态" prop="updateType">
-          <el-select v-model="query.updateType" filterable clearable remote placeholder="请选择状态">
+          <el-select v-model="query.updateType" filterable clearable placeholder="请选择状态">
             <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
         </el-form-item>
@@ -14,17 +14,35 @@
           <el-cascader v-model="selectType" :options="cooperations" filterable clearable :change-on-select="true"
             @change="handleCascaderChange" />
         </el-form-item>
+        <el-form-item label="微信审核状态" prop="wechatPass">
+          <el-select v-model="query.wechatPass" filterable clearable placeholder="请选择微信审核状态">
+            <el-option v-for="item in wxstatusOptions" :key="item.value" :label="item.label" :value="item.value" />
+          </el-select>
+        </el-form-item>
       </template>
     </Search>
     <div class="table-default">
-      <!-- <div class="set-warpper">
-        <el-button type="primary" @click="mulSet" size="default" v-action="'video.video.mulSet'">批量操作</el-button>
-      </div> -->
+      <div class="set-warpper">
+        <el-button type="primary" @click="mulSet" size="default" v-action="'video.video.mulSet'">批量提审</el-button>
+      </div>
       <Operate :show="open" v-action="'video.video.add'" />
       <el-table :data="tableData" class="mt-3" v-loading="loading" @selection-change="handleSelectionChange">
         <el-table-column type="selection" />
         <el-table-column prop="id" label="剧号" />
-        <el-table-column label="封面" show-overflow-tooltip>
+        <el-table-column label="剧目名称" prop="name" min-width="150">
+        </el-table-column>
+        <el-table-column label="制作方名称" prop="name" min-width="150">
+        </el-table-column>
+        <el-table-column prop="note" label="剧目简介" min-width="250">
+          <template #default="scope">
+            <span class="note-content">
+              {{ scope.row.note }}
+            </span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="category_str" label="编剧姓名" />
+        <el-table-column prop="category_str" label="总集数" />
+        <el-table-column label="剧目海报" show-overflow-tooltip>
           <template #default="scope">
             <div class="flex flex-col items-start justify-center wrapper">
               <el-popover placement="top" :width="200" trigger="click">
@@ -38,58 +56,33 @@
             </div>
           </template>
         </el-table-column>
-        <el-table-column label="短剧名称" show-overflow-tooltip min-width="250">
+        <el-table-column prop="shelf_type_str" label="《广播电视节目制作许可证》" min-width="250">
           <template #default="scope">
-            <div class="wrapper">
-              <span class="text-lg font-bold text-blue-400 cursor-pointer content"
-                @click="openType('videoDetailVisible', scope.row)">
-                {{ scope.row.name }}
-              </span>
-              <span>
-                【 {{ scope.row.update_type_str }} 】
-              </span>
-            </div>
-            <div class="wrapper">
-              <span class="label">上架时间:</span>
-              <span class="content">{{ scope.row.shelf_at }}</span>
+            <div class="flex flex-col items-start justify-center wrapper">
+              <el-popover placement="top" :width="200" trigger="hover">
+                <template #reference>
+                  <el-image :src="scope.row.cover_image" class="cursor-pointer" style="width:48px;height:48px;"
+                    fit="contain" :lazy="true"></el-image>
+                </template>
+                <el-image :src="scope.row.cover_image" style="width:100%;" fit="contain"></el-image>
+              </el-popover>
+              <el-button type="primary" link size="default" @click="dowload(scope.row)">下载</el-button>
             </div>
           </template>
         </el-table-column>
-        <el-table-column prop="total_episode_num" label="集数">
+        <el-table-column prop="shelf_type_str" label="授权材料" min-width="250">
           <template #default="scope">
-            <div class="flex wrapper">
-              <div v-if="scope.row.update_type == 1">
-                <span class="content">
-                  {{ scope.row.updated_episode_num }}
-                </span>
-                <span>/</span>
-              </div>
-              <div>
-                <span class="content">
-                  {{ scope.row.total_episode_num }}
-                </span>
-              </div>
-            </div>
-          </template>
-        </el-table-column>
-        <el-table-column prop="category_str" label="频道" />
-        <el-table-column prop="shelf_type_str" label="上架状态" v-if="!rolesIdentify.includes('company')" />
-        <el-table-column prop="charge_sequence" label="起始集" v-if="!rolesIdentify.includes('company')" />
-        <el-table-column prop="charge_coin" label="定价" v-if="!rolesIdentify.includes('company')">
-          <template #header>
-            <div class="flex items-center">
-              <span>定价</span>
-              <el-tooltip placement="top">
-                <template #content> 定价为所需看剧币<br />1元等于100币 </template>
-                <el-icon>
-                  <InfoFilled />
-                </el-icon>
-              </el-tooltip>
+            <div class="flex flex-col items-start justify-center wrapper">
+              <el-popover placement="top" :width="200" trigger="click">
+                <template #reference>
+                  <el-image :src="scope.row.cover_image" class="cursor-pointer" style="width:48px;height:48px;"
+                    fit="contain" :lazy="true"></el-image>
+                </template>
+                <el-image :src="scope.row.cover_image" style="width:100%;" fit="contain"></el-image>
+              </el-popover>
+              <el-button type="primary" link size="default" @click="dowload(scope.row)">下载</el-button>
             </div>
           </template>
-          <template #default="scope">
-            <span>{{ scope.row.charge_coin }}</span>
-          </template>
         </el-table-column>
         <el-table-column label="操作">
           <template #default="scope">
@@ -99,11 +92,9 @@
               v-action="'video.video.update'">编辑</el-button><br />
             <el-button @click="openType('takeVisible', scope.row)" link type="primary" size="small"
               v-action="'video.video.setChargeConfig'">订阅设置</el-button><br />
-            <el-button link type="primary" size="small" @click="openType('videoDLVisible', scope.row)"
-              v-action="'video.episode.downloadList'">视频下载</el-button>
+            <el-button link type="primary" size="small" @click="openType('videoSyncVisible', scope.row)"
+              v-action="'video.episode.downloadList'">同步视频</el-button>
             <br />
-            <el-button link type="primary" size="small" v-if="isShowCreatePromotion" v-action="'tuiguang.Promotion.add'"
-              @click="openType('videoDetailVisible', scope.row)">生成推广链接</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -113,8 +104,8 @@
     <Dialog v-model="visible" :title="title" destroy-on-close>
       <Create @close="close(search)" :primary="id" :eidapi="addApi" :addapi="addApi" :ismulSet="ismulSet" />
     </Dialog>
-    <Dialog v-model="videoDLVisible" width="80%" title="视频下载" destroy-on-close>
-      <videoDL @close="closeType('videoDLVisible')" :primary="depotsData"></videoDL>
+    <Dialog v-model="videoSyncVisible" width="80%" title="视频下载" destroy-on-close>
+      <videoSync @close="closeType('videoSyncVisible')" :primary="depotsData"></videoSync>
     </Dialog>
     <Dialog v-model="takeVisible" width="50%" title="订阅设置" destroy-on-close>
       <subscribeSet @close="closeType('takeVisible')" :primary="takeData"></subscribeSet>
@@ -122,9 +113,6 @@
     <Dialog v-model="uploadVisible" width="50%" title="上传视频" destroy-on-close>
       <uploadVideo @close="closeType('uploadVisible')" :primary="uploadData"></uploadVideo>
     </Dialog>
-    <Dialog v-action="'video.video.list'" v-model="videoDetailVisible" width="50%" title="短剧详情" destroy-on-close>
-      <videoDetail @close="closeType('videoDetailVisible')" :primary="videoDetailData"></videoDetail>
-    </Dialog>
   </div>
 </template>
 
@@ -133,8 +121,7 @@ import { downloadImage } from '@/utils/index'
 import { InfoFilled } from '@element-plus/icons-vue';
 import { provide } from 'vue'
 import Create from './form/create.vue';
-import videoDL from './form/videoDL.vue';
-import videoDetail from './detail.vue';
+import videoSync from './form/videoSync.vue';
 import subscribeSet from './form/subscribeSet.vue';
 import uploadVideo from './form/uploadVideo.vue';
 import { useGetList } from '@/hook/curd/useGetList';
@@ -153,17 +140,16 @@ const multipleSelection = ref([]);
 const { data, query, search, reset, loading } = useGetList(api);
 const { deleted } = useDestroy();
 const uploadBooksVisible = ref(false)
-const videoDLVisible = ref(false)
+const videoSyncVisible = ref(false)
 const depotsData = ref({})
 const uploadVisible = ref(false)
 const uploadData = ref({})
 const takeVisible = ref(false)
 const takeData = ref({})
-const videoDetailVisible = ref(false)
-const videoDetailData = ref({})
 const current = ref({})
 const selectType = ref([])
 const statusOptions = ref([{ label: '连载中', value: '1' }, { label: '完结', value: '2' }]);
+const wxstatusOptions = ref([{ label: '未通过', value: 0 }, { label: '已通过', value: 1 }]);
 const cooperations = ref([]);
 const rolesIdentify = ref([]);
 const isShowCreatePromotion = computed(() => JSON.parse(Cache.get('nav_data'))?.advertiser?.miniProgramIds && JSON.parse(Cache.get('nav_data'))?.app)
@@ -191,8 +177,8 @@ const resetQuery = () => {
 const openType = (type: string, data: object) => {
   current.value = data;
   switch (type) {
-    case 'videoDLVisible':
-      videoDLVisible.value = true
+    case 'videoSyncVisible':
+      videoSyncVisible.value = true
       depotsData.value = data
       break;
     case 'takeVisible':
@@ -203,10 +189,6 @@ const openType = (type: string, data: object) => {
       uploadVisible.value = true
       uploadData.value = data
       break;
-    case 'videoDetailVisible':
-      videoDetailVisible.value = true
-      videoDetailData.value = data
-      break;
   }
 }
 provide('video', current)
@@ -232,8 +214,8 @@ const handleSelectionChange = (val: []) => {
 const closeType = (type) => {
   console.log(type, 'typetype');
   switch (type) {
-    case 'videoDLVisible':
-      videoDLVisible.value = false
+    case 'videoSyncVisible':
+      videoSyncVisible.value = false
       break;
     case 'takeVisible':
       takeVisible.value = false
@@ -241,9 +223,6 @@ const closeType = (type) => {
     case 'uploadVisible':
       uploadVisible.value = false
       break;
-    case 'videoDetailVisible':
-      videoDetailVisible.value = false
-      break;
   }
   search()
 }
@@ -294,6 +273,10 @@ onMounted(() => {
 </script>
 
 <style scoped lang="scss">
+.note-content {
+  @include text-ellipsis(3);
+}
+
 .table-default {
   .set-warpper {
     height: 60px;

+ 86 - 0
src/views/videoManage/wechatAudit/tabs/wechatAuditStatus/excelTitle.ts

@@ -0,0 +1,86 @@
+// 导出中文/字段
+export const titleObj = {
+  0: {
+    商户名称: 'company_name',
+    商户ID: 'puser_id',
+    优化师: 'username',
+    小程序: 'xcx_name',
+    用户ID: 'uid',
+    订单号: 'trade_no',
+    订单时间: 'order_created_at',
+    染色注册时间: 'ranse_created_at',
+    申退金额: 'refund_price',
+    充值金额: 'order_price',
+    推广名称: 'promotion_name',
+    档位类型: 'tip_text',
+    支付方式: 'pay_name',
+    平台审核: 'pt_verify_status_text',
+    平台审核备注: 'pt_verify_remark',
+    商户审核: 'sh_verify_status_text',
+    商户审核备注: 'sh_verify_remark'
+  },
+  1: {
+    商户名称: 'company_name',
+    商户ID: 'puser_id',
+    优化师: 'username',
+    小程序: 'xcx_name',
+    用户ID: 'uid',
+    订单号: 'trade_no',
+    订单时间: 'order_created_at',
+    染色注册时间: 'ranse_created_at',
+    申退金额: 'refund_price',
+    充值金额: 'order_price',
+    推广名称: 'promotion_name',
+    档位类型: 'tip_text',
+    支付方式: 'pay_name',
+    退款时间: 'pay_at',
+    退款单号: 'refund_no',
+    订单状态: 'status_text'
+  }
+};
+
+export const titlePtObj = {
+	0: {
+	  商户名称: 'company_name',
+	  商户ID: 'puser_id',
+	  优化师: 'username',
+	  小程序: 'xcx_name',
+	  用户ID: 'uid',
+	  订单号: 'trade_no',
+	  订单时间: 'order_created_at',
+	  染色注册时间: 'ranse_created_at',
+	  申退金额: 'refund_price',
+	  充值金额: 'order_price',
+	  推广名称: 'promotion_name',
+	  档位类型: 'tip_text',
+	  支付方式: 'pay_name',
+	  支付名称:"pay_merchant_name",
+	  收款主体:"payee_name",
+	  支付商户号:"pay_appid",
+	  平台审核: 'pt_verify_status_text',
+	  平台审核备注: 'pt_verify_remark',
+	  商户审核: 'sh_verify_status_text',
+	  商户审核备注: 'sh_verify_remark'
+	},
+	1: {
+	  商户名称: 'company_name',
+	  商户ID: 'puser_id',
+	  优化师: 'username',
+	  小程序: 'xcx_name',
+	  用户ID: 'uid',
+	  订单号: 'trade_no',
+	  订单时间: 'order_created_at',
+	  染色注册时间: 'ranse_created_at',
+	  申退金额: 'refund_price',
+	  充值金额: 'order_price',
+	  推广名称: 'promotion_name',
+	  档位类型: 'tip_text',
+	  支付方式: 'pay_name',
+	  支付名称:"pay_merchant_name",
+	  收款主体:"payee_name",
+	  支付商户号:"pay_appid",
+	  退款时间: 'pay_at',
+	  退款单号: 'refund_no',
+	  订单状态: 'status_text'
+	}
+}

+ 385 - 0
src/views/videoManage/wechatAudit/tabs/wechatAuditStatus/index.vue

@@ -0,0 +1,385 @@
+<template>
+  <div>
+    <div class="pl-5">
+      <el-radio-group v-model="query.refund_status" @change="search">
+        <el-radio v-for="item in statusListTop" :label="item.value" :key="item.value">{{ item.name }}</el-radio>
+      </el-radio-group>
+    </div>
+    <div class="flex justify-between">
+      <Search :search="search" :reset="resetQuery">
+        <template v-slot:body>
+          <el-form-item label="订单号" prop="trade_no">
+            <el-input v-model="query.trade_no" placeholder="请输入订单号" clearable />
+          </el-form-item>
+          <el-form-item label="用户ID" prop="uid">
+            <el-input v-model="query.uid" placeholder="请输入用户ID" clearable />
+          </el-form-item>
+          <el-form-item label="充值类型" prop="order_type">
+            <el-select v-model="query.order_type" filterable clearable placeholder="选择充值类型">
+              <el-option v-for="item in channelOrderTypeList" :key="item.value" :label="item.name" :value="item.value" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="推广名称" prop="promotion_id">
+            <el-select v-model="query.promotion_id" filterable remote clearable
+              :remote-method="(query) => { remoteMethod(query, 'channelPromotions') }" placeholder="全部推广名称">
+              <el-option v-for="item in channelPromotions" :key="item.promotion_id" :label="item.name"
+                :value="item.promotion_id" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="小程序" v-if="!query.promotion_id" prop="miniprogram_id">
+            <el-select v-model="query.miniprogram_id" filterable remote
+              :remote-method="(query) => { remoteMethod(query, 'channelMiniprogram') }" clearable placeholder="选择小程序">
+              <el-option v-for="item in channelMiniprogram" :key="item.miniprogram_id" :label="item.name"
+                :value="item.miniprogram_id" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="优化师" v-if="!query.promotion_id && !rolesIdentify.includes('optimizer')" prop="user_id">
+            <el-select v-model="query.user_id" filterable remote clearable
+              :remote-method="(query) => { remoteMethod(query, 'channelPromotionsUsers') }" placeholder="选择优化师">
+              <el-option v-for="item in promotionsUsersList" :key="item.user_id" :label="item.name"
+                :value="item.user_id" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="订单时间">
+            <el-date-picker unlink-panels clearable @change="orderTimeChange" format="YYYY/MM/DD"
+              value-format="YYYY-MM-DD" v-model="query.orderTime" type="daterange" :shortcuts="shortcuts"
+              range-separator="To" start-placeholder="开始时间" end-placeholder="结束时间" />
+          </el-form-item>
+		  <el-form-item label="支付名称" prop="pay_merchant_name"  v-if="rolesIdentify.includes('administrator')">
+		    <el-input v-model="query.pay_merchant_name" placeholder="请输入支付名称" clearable />
+		  </el-form-item>
+		  <el-form-item label="收款主体" prop="payee_name" v-if="rolesIdentify.includes('administrator')">
+		    <el-input v-model="query.payee_name" placeholder="请输入收款主体" clearable />
+		  </el-form-item>
+		  <el-form-item label="支付商户号" prop="pay_appid"  v-if="rolesIdentify.includes('administrator')">
+		    <el-input v-model="query.pay_appid" placeholder="请输入支付商户号" clearable />
+		  </el-form-item>
+        </template>
+        <template v-slot:extra_button>
+          <exportExcel v-if="rolesIdentify.includes('administrator')"  api="orderRefund/order_list" sheet_name="订单列表" :title_obj="titlePtObj[query.refund_status]"
+            :extro_params="{ is_all: true, ...query }">
+          </exportExcel>
+		  <exportExcel v-else="rolesIdentify.includes('administrator')"  api="orderRefund/order_list" sheet_name="订单列表" :title_obj="titleObj[query.refund_status]"
+		    :extro_params="{ is_all: true, ...query }">
+		  </exportExcel>
+		  
+        </template>
+      </Search>
+    </div>
+    <div class="table-default">
+      <el-table :data="tableData" class="mt-3" v-loading="loading">
+        <el-table-column prop="company_name" label="商户名称" min-width="200px"
+          v-if="rolesIdentify.includes('administrator')">
+          <template #default="scope">
+            <div>{{ scope.row.company_name }}</div>
+            <div>ID:{{ scope.row.puser_id }}</div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="username" label="优化师" show-overflow-tooltip min-width="200px"
+          v-if="!rolesIdentify.includes('optimizer')">
+        </el-table-column>
+        <el-table-column prop="xcx_name" show-overflow-tooltip label="小程序" min-width="200px">
+        </el-table-column>
+        <el-table-column prop="uid" label="用户ID" show-overflow-tooltip>
+        </el-table-column>
+        <el-table-column prop="trade_no" label="订单号" show-overflow-tooltip min-width="200px">
+        </el-table-column>
+        <el-table-column prop="order_created_at" label="订单时间" show-overflow-tooltip min-width="200px" />
+        <el-table-column prop="ranse_created_at" label="染色注册时间" show-overflow-tooltip min-width="200px" />
+        <el-table-column prop="refund_price" label="申退金额" show-overflow-tooltip min-width="200px" />
+        <el-table-column prop="order_price" label="充值金额" show-overflow-tooltip>
+        </el-table-column>
+        <el-table-column prop="promotion_name" label="推广名称" show-overflow-tooltip min-width="200px">
+        </el-table-column>
+        <el-table-column prop="tip_text" label="档位类型" show-overflow-tooltip min-width="150px">
+        </el-table-column>
+        <el-table-column prop="pay_name" label="支付方式" show-overflow-tooltip min-width="150px">
+        </el-table-column>
+		<el-table-column prop="pay_merchant_name" label="支付名称" show-overflow-tooltip min-width="150px"  v-if="rolesIdentify.includes('administrator')">
+		</el-table-column>
+		<el-table-column prop="payee_name" label="收款主体" show-overflow-tooltip min-width="150px"  v-if="rolesIdentify.includes('administrator')">
+		</el-table-column>
+		<el-table-column prop="pay_appid" label="支付商户号" show-overflow-tooltip min-width="150px"  v-if="rolesIdentify.includes('administrator')">
+		</el-table-column>
+        <el-table-column prop="pay_at" label="退款时间" v-if="query.refund_status == 1" show-overflow-tooltip
+          min-width="180px">
+        </el-table-column>
+        <el-table-column prop="refund_no" label="退款单号" v-if="query.refund_status == 1" show-overflow-tooltip
+          min-width="150px">
+        </el-table-column>
+        <el-table-column v-if="query.refund_status == 1" prop="status_text" label="订单状态" show-overflow-tooltip
+          min-width="150px">
+          <template #default="scope">
+            <div class="wrapper">
+              <span class="text-lg font-bold content">
+                <el-text class="mx-1" type="info">{{ scope.row.status_text }}</el-text>
+              </span>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column v-if="query.refund_status == 0" prop="pt_verify_status_text" label="平台审核" show-overflow-tooltip
+          min-width="150px">
+          <template #default="scope">
+            <div class="wrapper">
+              <span class="text-lg font-bold content">
+                <el-text class="mx-1" :type="colorType(scope.row)">{{ scope.row.pt_verify_status_text }}</el-text>
+              </span>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column v-if="query.refund_status == 0" prop="pt_verify_remark" label="平台审核备注" show-overflow-tooltip
+          min-width="150px">
+        </el-table-column>
+        <el-table-column v-if="query.refund_status == 0" prop="sh_verify_status_text" label="商户审核" show-overflow-tooltip
+          min-width="150px">
+          <template #default="scope">
+            <div class="wrapper">
+              <span class="text-lg font-bold content">
+                <el-text class="mx-1" :type="colorType(scope.row)">{{ scope.row.sh_verify_status_text }}</el-text>
+              </span>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column v-if="query.refund_status == 0" prop="sh_verify_remark" label="商户审核备注" show-overflow-tooltip
+          min-width="150px">
+        </el-table-column>
+        <el-table-column v-if="query.refund_status == 0" label="操作" fixed="right">
+          <template #default="scope">
+            <el-button link type="primary" size="small" v-action="'orderRefund.RefundOrder.platformVerify'"
+              @click="openType('noapprovedVisible', scope.row, '平台审核')">平台审核</el-button>
+            <br />
+            <el-button link type="primary" size="small" v-action="'orderRefund.RefundOrder.companyVerify'"
+              @click="openType('noapprovedVisible', scope.row, '商户审核')">商户审核</el-button>
+            <br />
+            <el-button :disabled="!scope.row.can_pay" link type="primary" size="small"
+              v-action="'orderRefund.RefundOrder.payToUser'"
+              @click="openType('approvedVisible', scope.row)">确认打款</el-button>
+            <br />
+          </template>
+        </el-table-column>
+      </el-table>
+      <Paginate />
+    </div>
+    <el-dialog width="500px" v-model="noapprovedVisible" :title="titleDialog" destroy-on-close @close="noapprovedClose">
+      <el-form :model="form" label-width="120px">
+        <el-form-item label="审核结果">
+          <el-radio-group v-model="form.status" @change="search">
+            <el-radio v-for="item in statusList" :label="item.value" :key="item.value">{{ item.name }}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注">
+          <el-input v-model="form.remark" :rows="3" type="textarea" placeholder="请输入内容" autocomplete="off" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <span class="dialog-footer">
+          <el-button @click="noapprovedClose">取消</el-button>
+          <el-button type="primary" @click="noapproveChange">
+            确认
+          </el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script lang="ts" setup>
+import { shortcuts } from '@/utils/shortcuts'
+import { useRouter, useRoute } from 'vue-router'
+import { InfoFilled } from '@element-plus/icons-vue';
+import { useGetList } from '@/hook/curd/useGetList';
+import {titleObj,titlePtObj} from "./excelTitle"
+import {
+  channelOrderList,
+  channelMiniprogramUseList,
+  channelPromotionsOptions,
+  channelPromotionsUsers,
+  channelOrderStatus,
+  channelOrderType,
+} from '@/api/orders/index'
+
+import { orderRefundVerifyPt, orderRefundVerifySh, orderRefundPayToUser } from '@/api/orders/index'
+import moment from 'moment';
+const form = ref({ status: 1 })
+const start_date = moment().startOf('month').format('YYYY-MM-DD')
+const end_date = moment().endOf('month').format('YYYY-MM-DD')
+const statusList = ref([
+  { name: '审核通过', value: 1 },
+  { name: '审核不通过', value: 2 },
+])
+const statusListTop = ref([
+  { name: '待审核', value: 0 },
+  { name: '已退款', value: 1 },
+])
+const api = 'orderRefund/order_list';
+const router = useRouter()
+const route = useRoute()
+const approvedVisible = ref(false)
+const noapprovedVisible = ref(false)
+const { data, query, search, reset, loading } = useGetList(api);
+const titleDialog = ref('')
+const current = ref({})
+const promotionsUsersList = ref([])
+const channelMiniprogram = ref([])
+const channelPromotions = ref([])
+const channelOrderStatusList = ref([])
+const channelOrderTypeList = ref([])
+const rolesIdentify = inject('rolesIdentify')
+
+const colorType = (data: object) => {
+  const type = data.pt_verify_status || data.sh_verify_status
+  switch (type) {
+    case 0:
+      return 'warning'
+    case 1:
+      return 'success'
+    case 2:
+      return 'danger'
+  }
+}
+const noapprovedClose = () => {
+  form.value = { status: 1 };
+  noapprovedVisible.value = false;
+}
+
+const noapproveChange = () => {
+  let api;
+  if (titleDialog.value == '平台审核') {
+    api = orderRefundVerifyPt
+  } else if (titleDialog.value == '商户审核') {
+    api = orderRefundVerifySh
+  }
+  api({ refund_id: current.value.id, ...form.value }).then(res => {
+    console.log(res, 'apiapiapiapi');
+    ElMessage.success(res.message)
+    noapprovedVisible.value = false;
+    search()
+  })
+}
+
+const openType = (type: string, data?: object, title?: string) => {
+  current.value = data || {}
+  switch (type) {
+    case 'approvedVisible':
+      ElMessageBox.confirm(
+        '确认打款吗?',
+        '提示',
+        {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning',
+        }
+      )
+        .then(() => {
+          orderRefundPayToUser({ refund_id: current.value.id }).then(res => {
+            ElMessage.success(res.message)
+            search()
+          })
+        })
+        .catch(() => {
+
+        })
+      break;
+    case 'noapprovedVisible':
+      titleDialog.value = title || ''
+      noapprovedVisible.value = true
+      break;
+  }
+}
+
+const orderTimeChange = (e: object) => {
+  console.log(e, 'timeChangetimeChangetimeChange');
+  if (query.value.orderTime) {
+    const timeArr = toRaw(e);
+    query.value.created_at_start = timeArr[0]
+    query.value.created_at_end = timeArr[1]
+  } else {
+    delete query.value.created_at_start
+    delete query.value.created_at_end
+  }
+}
+const remoteMethod = (query: string, type: string,) => {
+  console.log(query, 'queryquery', type);
+  switch (type) {
+    case 'channelPromotionsUsers':
+      initRemoteOption('channelPromotionsUsers', { name: query })
+      break;
+    case 'channelMiniprogram':
+      initRemoteOption('channelMiniprogram', { name: query })
+      break;
+    case 'channelPromotions':
+      initRemoteOption('channelPromotions', { name: query })
+      break;
+  }
+}
+
+const initRemoteOption = (type: string, params?: object) => {
+  switch (type) {
+    case 'channelPromotionsUsers':
+      channelPromotionsUsers({ limit: 30, ...params }).then(res => {
+        promotionsUsersList.value = res.data
+      })
+      break;
+    case 'channelMiniprogram':
+      channelMiniprogramUseList({ limit: 30, ...params }).then(res => {
+        channelMiniprogram.value = res.data
+      })
+      break;
+    case 'channelPromotions':
+      channelPromotionsOptions({ limit: 30, ...params }).then(res => {
+        channelPromotions.value = res.data
+      })
+      break;
+  }
+}
+
+const init = () => {
+  channelOrderStatus().then(res => {
+    console.log(res);
+    channelOrderStatusList.value = res.data
+  })
+  channelOrderType().then(res => {
+    console.log(res);
+    channelOrderTypeList.value = res.data
+  })
+}
+
+const resetQuery = () => {
+  query.value = Object.assign({ page: query.value.page, limit: query.value.limit, refund_status: 0 });
+  search()
+}
+const tableData = computed(() => data.value?.data);
+
+onMounted(() => {
+  console.log(rolesIdentify, 'rolesIdentifyrolesIdentify');
+  initRemoteOption('channelPromotionsUsers')
+  initRemoteOption('channelMiniprogram')
+  initRemoteOption('channelPromotions')
+  init()
+  query.value.refund_status = 0;
+  search();
+});
+</script>
+
+<style scoped lang="scss">
+.table-default {
+  .set-warpper {
+    height: 60px;
+    display: flex;
+    align-items: center;
+    justify-content: flex-end;
+  }
+
+  .wrapper {
+    margin: 8px;
+
+    .label {
+      margin-right: 6px;
+    }
+
+    .content {
+      font-size: 15px;
+    }
+  }
+}
+</style>