Explorar el Código

添加加油券

wenjie hace 10 meses
padre
commit
b8c5278dd2
Se han modificado 46 ficheros con 5940 adiciones y 313 borrados
  1. BIN
      dist.zip
  2. 4 1
      package.json
  3. 135 0
      src/api/activity.js
  4. 10 1
      src/api/common.js
  5. 10 0
      src/api/coupon.js
  6. 67 0
      src/api/equity.js
  7. 37 1
      src/api/goods.js
  8. 38 0
      src/api/marketing.js
  9. 16 7
      src/api/order.js
  10. 166 14
      src/router/index.js
  11. 4 4
      src/utils/config.js
  12. 220 0
      src/vendor/Export2Excel.js
  13. 17 13
      src/views/merchantManage/index.vue
  14. 592 0
      src/views/operationManage/activityManage/addActivity.vue
  15. 376 0
      src/views/operationManage/activityManage/dataList.vue
  16. 348 0
      src/views/operationManage/activityManage/index.vue
  17. 20 4
      src/views/operationManage/advertisingManage/addAdv.vue
  18. 30 0
      src/views/operationManage/advertisingManage/index.vue
  19. 6 0
      src/views/operationManage/appMenuManage/addMenu.vue
  20. 9 9
      src/views/operationManage/appMenuManage/index.vue
  21. 87 5
      src/views/operationManage/comboManage/editCombo.vue
  22. 57 4
      src/views/operationManage/comboManage/index.vue
  23. 52 11
      src/views/operationManage/couponManage/discountCoupon.vue
  24. 824 0
      src/views/operationManage/couponManage/fullDiscountCoupon.vue
  25. 26 12
      src/views/operationManage/couponManage/index.vue
  26. 98 10
      src/views/operationManage/couponManage/refuelCoupon.vue
  27. 470 0
      src/views/operationManage/equitiesManage/addEquities.vue
  28. 291 0
      src/views/operationManage/equitiesManage/index.vue
  29. 56 49
      src/views/operationManage/financeManage/withdraw.vue
  30. 41 2
      src/views/operationManage/goodsManage/goodsDetail.vue
  31. 33 4
      src/views/operationManage/goodsManage/index.vue
  32. 261 0
      src/views/operationManage/goodsManage/labelList.vue
  33. 1 0
      src/views/operationManage/goodsType/addGoodsType.vue
  34. 293 0
      src/views/operationManage/marketingManage/index.vue
  35. 49 27
      src/views/operationManage/orderManage/index.vue
  36. 152 37
      src/views/operationManage/orderManage/list.vue
  37. 183 66
      src/views/operationManage/orderManage/orderDetail.vue
  38. 29 21
      src/views/operationManage/orderManage/payDetail.vue
  39. 41 5
      src/views/operationManage/shopManage/shopAdd.vue
  40. 442 0
      src/views/operationManage/templateManage/addTemplate.vue
  41. 198 0
      src/views/operationManage/templateManage/index.vue
  42. 6 0
      src/views/studyManage/questionBankManage/editQuestions.vue
  43. 1 1
      src/views/studyManage/tabManage/index.vue
  44. 5 4
      src/views/updatePassword/index.vue
  45. 37 1
      src/views/userManage/memberManage/index.vue
  46. 102 0
      yarn.lock

BIN
dist.zip


+ 4 - 1
package.json

@@ -24,13 +24,16 @@
     "crypto-js": "^4.2.0",
     "echarts": "^5.4.2",
     "element-ui": "2.15.13",
+    "file-saver": "^2.0.5",
     "js-cookie": "2.2.0",
     "normalize.css": "7.0.0",
     "nprogress": "0.2.0",
     "path-to-regexp": "2.4.0",
     "vue": "2.6.14",
     "vue-router": "3.0.6",
-    "vuex": "3.1.0"
+    "vuex": "3.1.0",
+    "xlsx": "^0.16.0"
+
   },
   "devDependencies": {
     "@vue/cli-plugin-babel": "4.4.4",

+ 135 - 0
src/api/activity.js

@@ -0,0 +1,135 @@
+/*
+ * @Author: wenjie 1454560336@qq.com
+ * @Date: 2024-04-03 14:45:20
+ * @LastEditors: wenjie 1454560336@qq.com
+ * @LastEditTime: 2024-04-11 10:22:39
+ * @FilePath: \merchant\src\api\activity.js
+ * @Description: 
+ * 
+ * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. 
+ */
+import request from '@/utils/request'
+
+// 活动列表
+export function activityList(params) {
+  return request({
+    url: '/zswl-cloud-shop/activitySignup/search',
+    method: 'get',
+    params
+  })
+}
+
+// 活动详情
+export function activityDetail(params) {
+    return request({
+        url: '/zswl-cloud-shop/activitySignup/detail',
+        method: 'get',
+        params
+    })
+}
+
+// 活动停止
+export function activityStop(params) {
+    return request({
+        url: '/zswl-cloud-shop/activitySignup/stop',
+        method: 'get',
+        params
+    })
+}
+
+// 活动删除
+export function activityDel(params) {
+    return request({
+        url: '/zswl-cloud-shop/activitySignup/del',
+        method: 'get',
+        params
+    })
+}
+
+// 活动添加编辑
+export function activityAddOrUpdate(data) {
+    return request({
+        url: '/zswl-cloud-shop/activitySignup/addOrUpdate',
+        method: 'post',
+        data
+    })
+}
+
+// 活动报名数据
+export function getSignUpData(params) {
+    return request({
+        url: '/zswl-cloud-shop/activitySignupOrder/get',
+        method: 'get',
+        params
+    })
+}
+
+// 模板列表
+export function dataTemplate(params) {
+    return request({
+        url: '/zswl-cloud-shop/dataTemplate/search',
+        method: 'get',
+        params
+    })
+}
+
+// 模板操作
+export function operate(params) {
+    return request({
+        url: '/zswl-cloud-shop/dataTemplate/operate',
+        method: 'get',
+        params
+    })
+}
+
+
+// 模板详情
+export function dataTemplateDetail(params) {
+    return request({
+        url: '/zswl-cloud-shop/dataTemplate/detail',
+        method: 'get',
+        params
+    })
+}
+// 模板添加编辑
+export function dataTemplateAddOrUpdate(data) {
+    return request({
+        url: '/zswl-cloud-shop/dataTemplate/addOrUpdate',
+        method: 'post',
+        data
+    })
+}
+
+// 模板下拉选择
+export function getDataTemplate(params) {
+    return request({
+        url: '/zswl-cloud-shop/dataTemplate/get',
+        method: 'get',
+        params
+    })
+}
+
+// 获取商户下的已完成签约列表
+export function finishComplexList(data) {
+    return request({
+      url: '/paymentserver/signature/finishComplexList',
+      method: 'post',
+      data
+    })
+  }
+
+// 活动退款
+export function refund(data) {
+    return request({
+        url: `/paymentserver/activity/refund/${data.orderNo}/${data.id}`,
+        data
+    })
+}
+
+// 活动核销
+export function verification(data) {
+    return request({
+        url: `/paymentserver/activity/verification/${data.orderNo}/${data.id}`,
+        data
+    })
+}

+ 10 - 1
src/api/common.js

@@ -2,7 +2,7 @@
  * @Author: wj 1454560336@qq.com
  * @Date: 2023-11-16 15:14:42
  * @LastEditors: wenjie 1454560336@qq.com
- * @LastEditTime: 2024-04-18 16:41:40
+ * @LastEditTime: 2024-07-19 10:04:19
  * @FilePath: \admin-manage\src\api\common.js
  * @Description: 
  * 
@@ -47,6 +47,15 @@ export function addOrUpdate(data) {
     })
 }
 
+// 删除套餐
+export function delMeal(params) {
+  return request({
+    url: '/zswl-cloud-shop/setMeal/del',
+    method: 'get',
+    params
+  })
+}
+
 // 启用、禁用
 export function operate(params) {
     return request({

+ 10 - 0
src/api/coupon.js

@@ -53,3 +53,13 @@ export function stop(params) {
     params
   })
 }
+
+
+// 根据优惠券id查询商品列表
+export function getGoodsInfoByCoupon(params) {
+  return request({
+    url: '/zswl-cloud-shop/couponInfo/getGoodsInfoByCoupon',
+    method: 'get',
+    params
+  })
+}

+ 67 - 0
src/api/equity.js

@@ -0,0 +1,67 @@
+/*
+ * @Author: wenjie 1454560336@qq.com
+ * @Date: 2024-07-12 14:03:08
+ * @LastEditors: wenjie 1454560336@qq.com
+ * @LastEditTime: 2024-07-15 14:01:41
+ * @FilePath: \admin-manage\src\api\equity.js
+ * @Description: 
+ * 
+ * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. 
+ */
+import request from '@/utils/request'
+
+// 权益列表
+export function equityList(params) {
+  return request({
+    url: '/zswl-cloud-shop/equityInfo/search',
+    method: 'get',
+    params
+  })
+}
+
+
+// 添加编辑
+export function editEquity(data) {
+    return request({
+      url: '/zswl-cloud-shop/equityInfo/saveOrUpdate',
+      method: 'post',
+      data
+    })
+  }
+
+// 删除权益
+export function delEquity(params) {
+    return request({
+      url: '/zswl-cloud-shop/equityInfo/del',
+      method: 'get',
+      params
+    })
+  }
+
+
+// 启用禁用权益
+export function enableEquity(params) {
+    return request({
+        url: '/zswl-cloud-shop/equityInfo/enable',
+        method: 'get',
+        params
+    })
+}
+
+// 显示不显示
+export function showEquity(params) {
+  return request({
+      url: '/zswl-cloud-shop/equityInfo/show',
+      method: 'get',
+      params
+  })
+}
+
+// 查看权益
+export function getEquity(params) {
+    return request({
+        url: '/zswl-cloud-shop/equityInfo/get',
+        method: 'get',
+        params
+    })
+}

+ 37 - 1
src/api/goods.js

@@ -2,7 +2,7 @@
  * @Author: wj 1454560336@qq.com
  * @Date: 2023-11-09 11:35:30
  * @LastEditors: wenjie 1454560336@qq.com
- * @LastEditTime: 2024-03-20 16:43:38
+ * @LastEditTime: 2024-07-19 14:40:04
  * @FilePath: \admin-manage\src\api\goods.js
  * @Description: 
  * 
@@ -163,3 +163,39 @@ export function getData(params) {
   })
 }
 
+
+// 获取商品标签列表
+export function getLabelList(params) {
+  return request({
+    url: '/zswl-cloud-shop/labelInfo/search',
+    method: 'get',
+    params
+  })
+}
+
+// 获取商品标签详情
+export function getLabelDetail(params) {
+  return request({
+    url: '/zswl-cloud-shop/labelInfo/get',
+    method: 'get',
+    params
+  })
+}
+
+// 获取商品标签详情
+export function delLabel(params) {
+  return request({
+    url: '/zswl-cloud-shop/labelInfo/del',
+    method: 'get',
+    params
+  })
+}
+
+// 获取商品标签详情
+export function addOrUpdateLabel(data) {
+  return request({
+    url: '/zswl-cloud-shop/labelInfo/addOrUpdate',
+    method: 'post',
+    data
+  })
+}

+ 38 - 0
src/api/marketing.js

@@ -0,0 +1,38 @@
+/*
+ * @Author: wenjie 1454560336@qq.com
+ * @Date: 2024-08-06 17:40:38
+ * @LastEditors: wenjie 1454560336@qq.com
+ * @LastEditTime: 2024-08-06 17:52:00
+ * @FilePath: \admin-manage\src\api\marketing.js
+ * @Description: 
+ * 
+ * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. 
+ */
+import request from '@/utils/request'
+
+// 活动列表
+export function activityXiaojuList(params) {
+  return request({
+    url: '/zswl-cloud-shop/activityXiaoju/search',
+    method: 'get',
+    params
+  })
+}
+
+// 添加编辑活动
+export function addOrUpdateActivityXiaoju(data) {
+    return request({
+        url: '/zswl-cloud-shop/activityXiaoju/addOrUpdate',
+        method: 'post',
+        data
+    })
+}
+
+// 删除活动
+export function delActivityXiaoju(params) {
+    return request({
+        url: '/zswl-cloud-shop/activityXiaoju/del',
+        method: 'get',
+        params
+    })
+}

+ 16 - 7
src/api/order.js

@@ -2,7 +2,7 @@
  * @Author: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git
  * @Date: 2023-08-15 17:33:37
  * @LastEditors: wenjie 1454560336@qq.com
- * @LastEditTime: 2024-05-16 09:20:29
+ * @LastEditTime: 2024-06-27 11:26:38
  * @FilePath: \admin-manage\src\api\order.js
  * @Description: 
  * 
@@ -12,7 +12,7 @@
 import request from '@/utils/request'
 
 // 平台订单
-export function getList(data) {
+export function getOrderList(data) {
   return request({
     url: '/springbatchservice/order/platform/search',
     method: 'post',
@@ -36,6 +36,15 @@ export function transfer(params) {
   })
 }
 
+// // 退款审核
+// export function auditRefund(data) {
+//   return request({
+//     url: '/springbatchservice/pay/platformRefund',
+//     method: 'post',
+//     data
+//   })
+// }
+
 // 退款审核
 export function auditRefund(data) {
   return request({
@@ -58,7 +67,7 @@ export function getCouponLog(params) {
 // 提现列表
 export function withdrawList(data) {
   return request({
-    url: '/springbatchservice/pay/account/withdrawals/list',
+    url: '/springbatchservice/pay/account/withdrawals/platform/list',
     method: 'post',
     data
   })
@@ -66,11 +75,11 @@ export function withdrawList(data) {
 
 
 // 提现
-export function withdrawals(params) {
+export function withdrawals(data) {
   return request({
-    url: '/springbatchservice/pay/account/withdrawals',
-    method: 'get',
-    params
+    url: '/springbatchservice/pay/account/withdrawalsPlatform',
+    method: 'post',
+    data
   })
 }
 

+ 166 - 14
src/router/index.js

@@ -2,7 +2,7 @@
  * @Author: wenjie 1454560336@qq.com
  * @Date: 2024-03-05 11:36:07
  * @LastEditors: wenjie 1454560336@qq.com
- * @LastEditTime: 2024-05-22 15:29:51
+ * @LastEditTime: 2024-08-06 15:28:49
  * @FilePath: \admin-manage\src\router\index.js
  * @Description: 
  * 
@@ -360,6 +360,16 @@ export let constantRoutes = [{
               activeMenu: '/operationManage/goodsManage/index'
             },
           },
+          {
+            id: 1,
+            path: '/operationManage/goodsManage/labelList',
+            name: '/operationManage/goodsManage/labelList',
+            component: () => import('@/views/operationManage/goodsManage/labelList.vue'),
+            meta: {
+              title: '标签列表',
+              icon: ''
+            },
+          },
         ]
       },
       // {
@@ -461,6 +471,27 @@ export let constantRoutes = [{
         
        ]
       },
+      {
+        id: 0,
+        path: '/operationManage/marketingManage/index',
+        component: operationLayout,
+        meta: {
+          title: '营销管理',
+          icon: ''
+        },
+        alwaysShow: true,
+        children: [{
+          id: 1,
+          path: '/operationManage/marketingManage/index',
+          name: '/operationManage/marketingManage/index',
+          component: () => import('@/views/operationManage/marketingManage/index.vue'),
+          meta: {
+            title: '小桔活动',
+            icon: ''
+          },
+        }, 
+      ]
+      },
       {
         id: 0,
         path: '/operationManage/comboManage/index',
@@ -480,29 +511,55 @@ export let constantRoutes = [{
               icon: ''
             },
           },
+          // {
+          //   id: 1,
+          //   path: '/operationManage/comboManage/addCombo',
+          //   name: '/operationManage/comboManage/addCombo',
+          //   component: () => import('@/views/operationManage/comboManage/addCombo.vue'),
+          //   meta: {
+          //     title: '添加套餐',
+          //     icon: ''
+          //   },
+          // },
           {
             id: 1,
-            path: '/operationManage/comboManage/addCombo',
-            name: '/operationManage/comboManage/addCombo',
-            component: () => import('@/views/operationManage/comboManage/addCombo.vue'),
+            path: '/operationManage/comboManage/editCombo',
+            name: '/operationManage/comboManage/editCombo',
+            hidden:true,
+            component: () => import('@/views/operationManage/comboManage/editCombo.vue'),
             meta: {
-              title: '添加套餐',
+              title: '编辑套餐',
               icon: ''
             },
           },
           {
             id: 1,
-            path: '/operationManage/comboManage/editCombo',
-            name: '/operationManage/comboManage/editCombo',
+            path: '/operationManage/equitiesManage/index',
+            name: '/operationManage/equitiesManage/index',
+            component: () => import('@/views/operationManage/equitiesManage/index.vue'),
             hidden:true,
-            component: () => import('@/views/operationManage/comboManage/editCombo.vue'),
             meta: {
-              title: '编辑套餐',
-              icon: ''
+              title: '权益列表',
+              icon: '',
+              activeMenu: '/operationManage/comboManage/index'
+            },
+          },
+          {
+            id: 1,
+            path: '/operationManage/equitiesManage/addEquities',
+            name: '/operationManage/equitiesManage/addEquities',
+            hidden:true,
+            component: () => import('@/views/operationManage/equitiesManage/addEquities.vue'),
+            meta: {
+              title: '添加权益',
+              icon: '',
+              activeMenu: '/operationManage/comboManage/index'
+
             },
           },
         ]
       },
+      
       {
         id: 0,
         path: '/operationManage/financeManage/index',
@@ -532,7 +589,6 @@ export let constantRoutes = [{
             icon: ''
           },
         }, 
-        
       ]
       },
       // {
@@ -711,14 +767,28 @@ export let constantRoutes = [{
               icon: ''
             },
           },
+          {
+            id: 1,
+            path: '/operationManage/couponManage/fullDiscountCoupon',
+            name: '/operationManage/couponManage/fullDiscountCoupon',
+            component: () => import('@/views/operationManage/couponManage/fullDiscountCoupon.vue'),
+            hidden:true,
+            meta: {
+              title: '满减优惠券',
+              icon: '',
+              activeMenu: '/operationManage/couponManage/index'
+            },
+          },
           {
             id: 1,
             path: '/operationManage/couponManage/discountCoupon',
             name: '/operationManage/couponManage/discountCoupon',
             component: () => import('@/views/operationManage/couponManage/discountCoupon.vue'),
+            hidden:true,
             meta: {
-              title: '满减优惠券',
-              icon: ''
+              title: '折扣优惠券',
+              icon: '',
+              activeMenu: '/operationManage/couponManage/index'
             },
           },
           {
@@ -726,14 +796,95 @@ export let constantRoutes = [{
             path: '/operationManage/couponManage/refuelCoupon',
             name: '/operationManage/couponManage/refuelCoupon',
             component: () => import('@/views/operationManage/couponManage/refuelCoupon.vue'),
+            hidden:true,
             meta: {
               title: '加油优惠券',
-              icon: ''
+              icon: '',
+              activeMenu: '/operationManage/couponManage/index'
+
             },
           },
           
         ]
       },
+      {
+        id: 0,
+        path: '/operationManage/activityManage/index',
+        component: operationLayout,
+        meta: {
+          title: '活动管理',
+          icon: ''
+        },
+        alwaysShow: true,
+        children: [{
+            id: 1,
+            path: '/operationManage/activityManage/index',
+            name: '/operationManage/activityManage/index',
+            component: () => import('@/views/operationManage/activityManage/index.vue'),
+            meta: {
+              title: '活动列表',
+              icon: ''
+            },
+          },
+          {
+            id: 1,
+            path: '/operationManage/activityManage/addActivity',
+            name: '/operationManage/activityManage/addActivity',
+            hidden:true,
+            component: () => import('@/views/operationManage/activityManage/addActivity.vue'),
+            meta: {
+              title: '添加活动',
+              icon: '',
+              activeMenu: '/operationManage/activityManage/index'
+            },
+          },
+          {
+            id: 1,
+            path: '/operationManage/activityManage/dataList',
+            name: '/operationManage/activityManage/dataList',
+            hidden:true,
+            component: () => import('@/views/operationManage/activityManage/dataList.vue'),
+            meta: {
+              title: '报名详情',
+              icon: '',
+              activeMenu: '/operationManage/activityManage/index'
+            },
+          },
+        ]
+      },
+      {
+        id: 0,
+        path: '/operationManage/templateManage/index',
+        component: operationLayout,
+        meta: {
+          title: '数据采集模板',
+          icon: ''
+        },
+        alwaysShow: true,
+        children: [{
+            id: 1,
+            path: '/operationManage/templateManage/index',
+            name: '/operationManage/templateManage/index',
+            component: () => import('@/views/operationManage/templateManage/index.vue'),
+            meta: {
+              title: '模板列表',
+              icon: ''
+            },
+          },
+          {
+            id: 1,
+            path: '/operationManage/templateManage/addTemplate',
+            name: '/operationManage/templateManage/addTemplate',
+            hidden:true,
+            component: () => import('@/views/operationManage/templateManage/addTemplate.vue'),
+            meta: {
+              title: '添加模板',
+              icon: '',
+              activeMenu: '/operationManage/templateManage/index'
+            },
+          },
+        ]
+      },
       
       // {
       //   id: 0,
@@ -1038,6 +1189,7 @@ export let constantRoutes = [{
         },
         {
           id: 1,
+          hidden:true,
           path: '/merchantManage/addUser',
           name: '/merchantManage/addUser',
           component: () => import('@/views/merchantManage/addUser.vue'),

+ 4 - 4
src/utils/config.js

@@ -2,15 +2,15 @@
  * @Author: wj 1454560336@qq.com
  * @Date: 2024-01-05 16:08:18
  * @LastEditors: wenjie 1454560336@qq.com
- * @LastEditTime: 2024-05-20 15:49:43
+ * @LastEditTime: 2024-08-08 19:23:45
  * @FilePath: \admin-manage\src\utils\config.js
  * @Description: 124234
  * 
  * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. 
  */
-// const BASE_URL = 'https://api.zonelife.cn/';
-const BASE_URL = 'https://api.dev.zonelife.cn/';
-http://192.168.110.226:9002
+const BASE_URL = 'https://api.zonelife.cn/';
+// const BASE_URL = 'https://api.dev.zonelife.cn/';
+// http://192.168.110.226:9002
 
 
 exports.BASE_URL = BASE_URL;

+ 220 - 0
src/vendor/Export2Excel.js

@@ -0,0 +1,220 @@
+/* eslint-disable */
+import { saveAs } from 'file-saver'
+import XLSX from 'xlsx'
+
+function generateArray(table) {
+  var out = [];
+  var rows = table.querySelectorAll('tr');
+  var ranges = [];
+  for (var R = 0; R < rows.length; ++R) {
+    var outRow = [];
+    var row = rows[R];
+    var columns = row.querySelectorAll('td');
+    for (var C = 0; C < columns.length; ++C) {
+      var cell = columns[C];
+      var colspan = cell.getAttribute('colspan');
+      var rowspan = cell.getAttribute('rowspan');
+      var cellValue = cell.innerText;
+      if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue;
+
+      //Skip ranges
+      ranges.forEach(function (range) {
+        if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {
+          for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
+        }
+      });
+
+      //Handle Row Span
+      if (rowspan || colspan) {
+        rowspan = rowspan || 1;
+        colspan = colspan || 1;
+        ranges.push({
+          s: {
+            r: R,
+            c: outRow.length
+          },
+          e: {
+            r: R + rowspan - 1,
+            c: outRow.length + colspan - 1
+          }
+        });
+      };
+
+      //Handle Value
+      outRow.push(cellValue !== "" ? cellValue : null);
+
+      //Handle Colspan
+      if (colspan)
+        for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
+    }
+    out.push(outRow);
+  }
+  return [out, ranges];
+};
+
+function datenum(v, date1904) {
+  if (date1904) v += 1462;
+  var epoch = Date.parse(v);
+  return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
+}
+
+function sheet_from_array_of_arrays(data, opts) {
+  var ws = {};
+  var range = {
+    s: {
+      c: 10000000,
+      r: 10000000
+    },
+    e: {
+      c: 0,
+      r: 0
+    }
+  };
+  for (var R = 0; R != data.length; ++R) {
+    for (var C = 0; C != data[R].length; ++C) {
+      if (range.s.r > R) range.s.r = R;
+      if (range.s.c > C) range.s.c = C;
+      if (range.e.r < R) range.e.r = R;
+      if (range.e.c < C) range.e.c = C;
+      var cell = {
+        v: data[R][C]
+      };
+      if (cell.v == null) continue;
+      var cell_ref = XLSX.utils.encode_cell({
+        c: C,
+        r: R
+      });
+
+      if (typeof cell.v === 'number') cell.t = 'n';
+      else if (typeof cell.v === 'boolean') cell.t = 'b';
+      else if (cell.v instanceof Date) {
+        cell.t = 'n';
+        cell.z = XLSX.SSF._table[14];
+        cell.v = datenum(cell.v);
+      } else cell.t = 's';
+
+      ws[cell_ref] = cell;
+    }
+  }
+  if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
+  return ws;
+}
+
+function Workbook() {
+  if (!(this instanceof Workbook)) return new Workbook();
+  this.SheetNames = [];
+  this.Sheets = {};
+}
+
+function s2ab(s) {
+  var buf = new ArrayBuffer(s.length);
+  var view = new Uint8Array(buf);
+  for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
+  return buf;
+}
+
+export function export_table_to_excel(id) {
+  var theTable = document.getElementById(id);
+  var oo = generateArray(theTable);
+  var ranges = oo[1];
+
+  /* original data */
+  var data = oo[0];
+  var ws_name = "SheetJS";
+
+  var wb = new Workbook(),
+    ws = sheet_from_array_of_arrays(data);
+
+  /* add ranges to worksheet */
+  // ws['!cols'] = ['apple', 'banan'];
+  ws['!merges'] = ranges;
+
+  /* add worksheet to workbook */
+  wb.SheetNames.push(ws_name);
+  wb.Sheets[ws_name] = ws;
+
+  var wbout = XLSX.write(wb, {
+    bookType: 'xlsx',
+    bookSST: false,
+    type: 'binary'
+  });
+
+  saveAs(new Blob([s2ab(wbout)], {
+    type: "application/octet-stream"
+  }), "test.xlsx")
+}
+
+export function export_json_to_excel({
+  multiHeader = [],
+  header,
+  data,
+  filename,
+  merges = [],
+  autoWidth = true,
+  bookType = 'xlsx'
+} = {}) {
+  /* original data */
+  filename = filename || 'excel-list'
+  data = [...data]
+  data.unshift(header);
+
+  for (let i = multiHeader.length - 1; i > -1; i--) {
+    data.unshift(multiHeader[i])
+  }
+
+  var ws_name = "SheetJS";
+  var wb = new Workbook(),
+    ws = sheet_from_array_of_arrays(data);
+
+  if (merges.length > 0) {
+    if (!ws['!merges']) ws['!merges'] = [];
+    merges.forEach(item => {
+      ws['!merges'].push(XLSX.utils.decode_range(item))
+    })
+  }
+
+  if (autoWidth) {
+    /*设置worksheet每列的最大宽度*/
+    const colWidth = data.map(row => row.map(val => {
+      /*先判断是否为null/undefined*/
+      if (val == null) {
+        return {
+          'wch': 10
+        };
+      }
+      /*再判断是否为中文*/
+      else if (val.toString().charCodeAt(0) > 255) {
+        return {
+          'wch': val.toString().length * 2
+        };
+      } else {
+        return {
+          'wch': val.toString().length
+        };
+      }
+    }))
+    /*以第一行为初始值*/
+    let result = colWidth[0];
+    for (let i = 1; i < colWidth.length; i++) {
+      for (let j = 0; j < colWidth[i].length; j++) {
+        if (result[j]['wch'] < colWidth[i][j]['wch']) {
+          result[j]['wch'] = colWidth[i][j]['wch'];
+        }
+      }
+    }
+    ws['!cols'] = result;
+  }
+
+  /* add worksheet to workbook */
+  wb.SheetNames.push(ws_name);
+  wb.Sheets[ws_name] = ws;
+
+  var wbout = XLSX.write(wb, {
+    bookType: bookType,
+    bookSST: false,
+    type: 'binary'
+  });
+  saveAs(new Blob([s2ab(wbout)], {
+    type: "application/octet-stream"
+  }), `${filename}.${bookType}`);
+}

+ 17 - 13
src/views/merchantManage/index.vue

@@ -251,19 +251,23 @@ export default {
       return arr
     },
     filterShopName(val){
-      let list = val.split(",")
-      let arr = []
-       list.map(item=>{
-        if(item == '89852017372911Y中数'){
-          arr.push('慧研学惠生活')
-        }else if(item == '89852017372912Y贵大'){
-          arr.push('印象贵大')
-        }else if(!arr.length){
-          arr.push('无')
-        }
-       })
-       arr = arr.join()
-      return arr
+      if(val){
+        let list = val.split(",")
+        let arr = []
+         list.map(item=>{
+          if(item == '89852017372911Y中数'){
+            arr.push('慧研学惠生活')
+          }else if(item == '89852017372912Y贵大'){
+            arr.push('印象贵大')
+          }else if(!arr.length){
+            arr.push('无')
+          }
+         })
+         arr = arr.join()
+        return arr
+      }else{
+          return '无'
+      }
     },
     
   },

+ 592 - 0
src/views/operationManage/activityManage/addActivity.vue

@@ -0,0 +1,592 @@
+
+<template>
+  <div class="addActivity app-container">
+    <el-form
+      :model="setQuery"
+      ref="setQuery"
+      :rules="rules"
+      v-loading="loading"
+      label-width="170px"
+      :disabled="mode == 'detail'"
+    >
+          <el-form-item label="活动名称:" prop="activityName">
+            <el-input
+              v-model="setQuery.activityName"
+              class="item-width-300"
+            ></el-input>
+          </el-form-item>
+
+          <el-form-item label="活动时间:" prop="activityEndTime">
+             <el-date-picker
+            v-model="date"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            class="item-width-350"
+            type="datetimerange"
+            :default-time="['00:00:00', '23:59:00']"
+            range-separator="至"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期">
+            </el-date-picker>
+          </el-form-item>
+          <el-form-item label="活动类型:">
+            <el-radio-group v-model="setQuery.activityType">
+                <el-radio :label="1">海报</el-radio>
+                <el-radio :label="2">报名</el-radio>
+            </el-radio-group>
+          </el-form-item>
+
+
+          <template v-if="setQuery.activityType == 2">
+            <el-form-item label="活动地址:" prop="address">
+              <el-input
+                v-model="setQuery.address"
+                class="item-width-300"
+                maxlength="100"
+                show-word-limit
+              ></el-input>
+            </el-form-item>
+
+            <el-form-item label="活动报名:">
+              <el-checkbox :true-label="1" :false-label="2" v-model="setQuery.activityEnable"></el-checkbox>
+            </el-form-item>
+            <template v-if="setQuery.activityEnable == 1">
+              <el-form-item label="报名次数限制:" prop="limited">
+                <el-radio-group v-model="limited">
+                    <el-radio :label="1">每人报名次数不限</el-radio>
+                    <el-radio :label="2">每人最多报名</el-radio>
+                </el-radio-group>
+                    <el-input
+                    v-if="limited == 2"
+                    type="number"
+                    v-model.number="setQuery.limited"
+                    class="item-width-150 ml10"
+                    >
+                    <template slot="append">人</template>
+                    </el-input>
+              </el-form-item>
+
+              <el-form-item label="报名时间:" prop="signupEndTime">
+                <el-date-picker
+                v-model="date1"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                class="item-width-350"
+                type="datetimerange"
+                :default-time="['00:00:00', '23:59:00']"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期">
+                </el-date-picker>
+              </el-form-item>
+              <el-form-item label="付费报名:" prop="price">
+                <el-checkbox :true-label="1" :false-label="2" v-model="setQuery.payEnable">开启付费</el-checkbox>
+                <el-input
+                    v-if="setQuery.payEnable == 1"
+                    type="number"
+                    v-model="setQuery.price"
+                    class="item-width-150 ml10"
+                    >
+                    <template slot="append">元</template>
+                    </el-input>
+              </el-form-item>
+
+              <el-form-item v-if="setQuery.payEnable == 1" label="收款方:" prop="authAccount">
+                <el-select
+                  v-model="setQuery.authAccount"
+                  class="item-width-300"
+                  placeholder="请选择收款方"
+                  :disabled="mode == 'edit'&&status == '进行中'"
+                >
+                  <el-option
+                    v-for="item in authOptions"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="采集信息模板:" prop="dataCollectId">
+                <el-select
+                  v-model="setQuery.dataCollectId"
+                  class="item-width-300"
+                  placeholder="请选择采集信息模板"
+                  :disabled="mode == 'edit'&&status == '进行中'"
+                >
+                  <el-option
+                    v-for="item in options1"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+            </template>
+
+           
+          </template>
+          <el-form-item  label="活动封面:" prop="activityCover">
+            <Upload
+              width="100px"
+              height="100px"
+              id="activityCover"
+              type="activityCover"
+              :imgUrl="setQuery.activityCover"
+              @uploadEnd="uploadEnd"
+              :disabled="mode == 'detail'"
+            ></Upload>
+          </el-form-item>
+
+          <el-form-item v-if="setQuery.activityType == 2" label="活动主图:" prop="activityMain">
+            <Upload
+              width="100px"
+              height="100px"
+              type="activityMain"
+              id="activityMain"
+              :imgUrl="setQuery.activityMain"
+              @uploadEnd="uploadEnd"
+              :disabled="mode == 'detail'"
+            ></Upload>
+          </el-form-item>
+
+
+          <el-form-item label="活动详情:" prop="activityDetail">
+            <div style="border: 1px solid #ccc; width: 500px">
+              <Toolbar
+                style="border-bottom: 1px solid #ccc"
+                :editor="editor"
+                :defaultConfig="toolbarConfig"
+                :mode="editorMode"
+              />
+              <Editor
+                style="height: 500px; overflow-y: hidden"
+                v-model="setQuery.activityDetail"
+                :defaultConfig="editorConfig"
+                :mode="editorMode"
+                @onCreated="onCreated"
+              />
+            </div>
+          </el-form-item>
+
+    </el-form>
+
+    <div class="btn-group" v-if="mode != 'detail'">
+      <el-button>取 消</el-button>
+      <el-button type="primary" :loading="loading" @click="save"
+        >确 定</el-button
+      >
+    </div>
+  </div>
+</template>
+
+<script>
+import {activityDetail,activityAddOrUpdate,getDataTemplate,finishComplexList} from '@/api/activity'
+import { allFinish } from '@/api/user'
+import Upload from "@/components/Upload";
+import Vue from "vue";
+import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
+import OSS from "ali-oss";
+import { requestUploadImg, finishUploadImg } from "@/api/common";
+export default Vue.extend({
+  components: {
+    Upload,
+    Editor,
+    Toolbar,
+  },
+  data() {
+    
+    return {
+      status:'',
+      date:'',
+      date1:'',
+      editor: null,
+      editorMode: "default", // or 'simple'
+      toolbarConfig: {},
+      editorConfig: {
+        placeholder: "请输入内容...",
+        MENU_CONF: {
+          uploadImage: {
+            // 自定义上传
+            customUpload(file, insertFn) {
+              // file 即选中的文件
+              requestUploadImg({
+                fineName: file.name,
+                operate: "OTHER",
+              }).then((res) => {
+                if (res.state == "Success") {
+                  const client = new OSS({
+                    // yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
+                    region: res.content.endPoint.split(".")[0],
+                    // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
+                    accessKeyId: res.content.token.accessKeyId,
+                    accessKeySecret: res.content.token.accessKeySecret,
+                    // 填写Bucket名称。
+                    bucket: res.content.bucket,
+                    stsToken: res.content.token.securityToken,
+                  });
+
+                  client
+                    .multipartUpload(res.content.paths[0].join("/"), file)
+                    .then((r) => {
+                      // 上传完成
+                      finishUploadImg([{ path: res.content.paths[0] }]).then(
+                        (msg) => {
+                          if (msg.state == "Success") {
+                            let url =
+                              "http://" +
+                              res.content.bucket +
+                              "." +
+                              res.content.endPoint +
+                              "/" +
+                              res.content.paths[0].join("/");
+                            insertFn(url, "", "");
+                          }
+                        }
+                      );
+                    })
+                    .catch((err) => {
+                      console.log(err); //上传失败之后
+                    });
+                }
+              });
+            },
+          },
+        },
+      },
+      mode: "add",
+      loading: false,
+      limited:1,
+      setQuery: {
+        shopId: 0,
+        activityType:1,
+        "activityCover": "",
+        "activityMain":"",
+        "activityDetail": "",
+        "activityEnable": 1,
+        "activityEndTime": "",
+        "activityName": "",
+        "activityStartTime": "",
+        "authAccount": "",
+        "dataCollectId": '',
+        "limited": 0,
+        "payEnable": 1,
+        "price": 0,
+        "signupEndTime": "",
+        "signupStartTime": ""
+      },
+      
+      authOptions:[],
+      options: [],
+      options1:[],
+      pickerOptions: {
+        shortcuts: [
+          {
+            text: "最近一周",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 6);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+          {
+            text: "最近一个月",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+          {
+            text: "最近三个月",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+        ],
+      },
+    };
+  },
+  computed: {
+    rules() {
+      if(this.setQuery.activityType == 1){
+        return  {
+          activityName: [
+            { required: true, message: "请输入活动名称", trigger: "blur" },
+          ],
+          activityEndTime: [
+            { required: true, message: "请选择活动时间", trigger: "change" },
+          ],
+           activityDetail: [
+            { required: true, message: "请输入活动详情", trigger: "blur" },
+          ],
+           activityCover: [
+            { required: true, message: "请上传活动封面", trigger: "change" },
+          ],
+  
+        }
+      }else{
+
+        return  {
+          activityName: [
+            { required: true, message: "请输入活动名称", trigger: "blur" },
+          ],
+          activityEndTime: [
+            { required: true, message: "请选择活动时间", trigger: "change" },
+          ],
+           signupEndTime: [
+            { required: true, message: "请选择报名时间", trigger: "change" },
+          ],
+          //  limited: [
+          //   { required: true, message: "请输入报名人数", trigger: "blur" },
+          //   { type:'number',min:1, message: "报名人数不能小于1", trigger: "blur" },
+  
+          // ],
+          price:[
+            { required: true, message: "请输入报名费用", trigger: "blur" },
+             { validator: this.validatePrice, trigger: 'blur' }
+          ],
+           authAccount: [
+            { required: true, message: "请选择收款账户", trigger: "change" },
+          ],
+           dataCollectId: [
+            { required: true, message: "请选择信息模板", trigger: "change" },
+          ],
+          activityCover: [
+            { required: true, message: "请上传活动封面", trigger: "change" },
+          ],
+          activityMain: [
+            { required: true, message: "请上传活动主图", trigger: "change" },
+          ],
+           activityDetail: [
+            { required: true, message: "请输入活动详情", trigger: "blur" },
+          ],
+  
+        }
+      }
+    }
+  },
+  watch: {
+    date(val){
+      if(val){
+        this.setQuery.activityStartTime = val[0]
+        this.setQuery.activityEndTime = val[1]
+      }else{
+        this.setQuery.activityStartTime = ''
+        this.setQuery.activityEndTime = ''
+      }
+    },
+    date1(val){
+      if(val){
+        this.setQuery.signupStartTime = val[0]
+        this.setQuery.signupEndTime = val[1]
+      }else{
+        this.setQuery.signupStartTime = ''
+        this.setQuery.signupEndTime = ''
+      }
+    },
+    limited(val){
+      if(val == 1){
+        this.setQuery.limited = 0
+        this.rules.limited = [
+
+        ]
+      }else{
+        this.setQuery.limited = 1
+         this.rules.limited = [
+          { required: true, message: "请输入报名人数", trigger: "blur" },
+          { type:'number',min:1, message: "报名人数不能小于1", trigger: "blur" },
+
+        ]
+      }
+    },
+    'setQuery.payEnable'(val){
+      if(val == 1){
+        this.rules.price = [
+          { required: true, message: "请输入报名费用", trigger: "blur" },
+           { validator: this.validatePrice, trigger: 'blur' }
+        ]
+      }else if(val == 2){
+        delete this.rules.price
+        this.$nextTick(()=>{
+          this.$refs.setQuery.clearValidate('price')
+        })
+      }
+    },
+    "setQuery.activityEnable"(val){
+      if(val == 2){//不需要报名
+        this.setQuery.authAccount = ''
+        this.setQuery.dataCollectId = ''
+        this.setQuery.payEnable = 1
+        this.limited = 1
+        this.date1 = ''
+      }
+    }
+  },
+  methods: {
+    validatePrice  (rule, value, callback) {
+      if(value<0.01||value>999999){
+        callback(new Error('价格只支持0.01~999999'));
+      }else{
+        callback()
+      }
+    },
+    onCreated(editor) {
+      this.editor = Object.seal(editor); // 一定要用 Object.seal() ,否则会报错
+      if (this.mode == "detail") {
+        this.editor.disable();
+      }
+    },
+    uploadEnd(val) {
+      console.log(val);
+      this.setQuery[val.type] = val.url;
+    },
+
+    save() {
+      this.$refs.setQuery.validate((v) => {
+        if (v) {
+          this.loading = true;
+          if(this.setQuery.activityType == 1){
+            this.setQuery.activityEnable = 2
+          }
+          activityAddOrUpdate(this.setQuery).then((res) => {
+            this.loading = false;
+            if (res.state == "Success") {
+              this.$notify({
+                title: "成功",
+                message: "操作成功",
+                type: "success",
+              });
+              this.$router.push("/operationManage/activityManage/index");
+            }else{
+              this.loading = false;
+            }
+          });
+        }else{
+          this.$message.error('请检查是否有必填项未填');
+        }
+      });
+    },
+
+    // 详情
+    get() {
+      this.loading = true;
+      let id = this.$route.query.id
+      activityDetail({id}).then((res) => {
+        this.loading = false;
+        if (res.state == "Success") {
+          this.setQuery = res.content;
+          this.setQuery.id = id
+          this.date = [this.setQuery.activityStartTime+':00',this.setQuery.activityEndTime+':00']
+          this.date1 = [this.setQuery.signupStartTime+':00',this.setQuery.signupEndTime+':00']
+          if(this.setQuery.limited){
+            this.limited = 2
+          }else{
+            this.limited = 1
+
+          }
+        }
+      });
+    },
+    // 获取模板
+    getDataTemplate(){
+      getDataTemplate({shopId:0}).then(res=>{
+        if (res.state == "Success") {
+          this.options1 = []
+          for (const key in res.content) {
+            if (Object.hasOwnProperty.call(res.content, key)) {
+              this.options1.push({
+                label:res.content[key],
+                value:Number(key)
+              })
+            }
+          }
+        }
+      })
+    },
+     // 获取当前主体下面的已签约银联账号
+    finishComplexList(){
+      finishComplexList({
+        "accesseId": "",
+        "epId": '657c35e3cae1326607ea9ed2'
+      }).then(res=>{
+         if(res.state == 'Success'){
+          let list = []
+          res.content.map(item=>{
+              list.push({
+                value:item.accesser_user_id,
+                label:item.externalName
+              })
+          })
+          this.authOptions = list
+        }
+      })
+    },
+    // 获取所有的已认证银联号
+    allFinish() {
+      allFinish().then((res) => {
+        if (res.state == "Success") {
+          this.authOptions = []
+          res.content.map(item=>{
+            this.authOptions.push({
+              label:item.shop_name||item.accesser_user_id,
+              value:item.accesser_user_id,
+            })
+          })
+        }
+      });
+    }
+  },
+  created() {
+    this.getDataTemplate()
+    this.allFinish()
+    this.mode = this.$route.query.mode || "add";
+    this.status = this.$route.query.status
+    if (this.$route.query.id) {
+        this.get();
+    }
+  },
+})
+</script>
+<style src="@wangeditor/editor/dist/css/style.css"></style>
+
+<style lang="scss" >
+@import "@/styles/element-variables";
+.addActivity {
+  padding-bottom: 40px;
+  .item {
+    display: flex;
+    align-items: flex-start;
+    margin-bottom: 10px;
+    .ml20{
+      margin-left: 20px !important;
+    }
+    .mb20{
+      margin-bottom: 20px;
+    }
+    .textarea textarea{
+      height: 40px;
+    }
+    .icon {
+      font-size: 18px;
+      font-weight: bold;
+      margin-left: 10px;
+      cursor: pointer;
+      margin-top: 10px;
+    }
+    .box {
+    }
+  }
+  .btn-group {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+
+
+}
+</style>

+ 376 - 0
src/views/operationManage/activityManage/dataList.vue

@@ -0,0 +1,376 @@
+
+<template>
+  <div class="dataList app-container">
+
+    <div class="title-box">
+        <div class="title">{{info.activityName}}</div>
+
+        <div class="data-box">
+            <div class="value">活动时间:{{info.activityStartTime}} 至 {{info.activityEndTime}}</div>
+            <div class="value">报名时间:{{info.signupStartTime}} 至 {{info.signupEndTime}}</div>
+            <div class="value">报名费用:{{info.price}}元</div>
+        </div>
+    </div>
+  
+    <div class="export-box">
+         <el-button
+            type="primary"
+            size="small"
+            :disabled="total == 0"
+            @click="handleExport"
+            :loading="downloadLoading"
+        >
+            导出数据
+        </el-button>
+    </div>
+    <el-table
+      :data="tableData"
+      tooltip-effect="dark"
+      border
+      v-loading="loading"
+      style="width: 100%"
+    >
+    <template v-for="(item,index) in tableData[0]">
+      <el-table-column
+        v-if="index != 'ID'"
+        :key="index"
+        align="center"
+        :label="index"
+        :prop="index"
+        show-overflow-tooltip
+      >
+      </el-table-column>
+    </template>
+      <!-- <el-table-column
+        align="center"
+        label="性别"
+        prop="orderNo"
+        show-overflow-tooltip
+      >
+      </el-table-column>
+      <el-table-column
+        align="center"
+        label="手机号"
+        prop="orderNo"
+        show-overflow-tooltip
+      >
+      </el-table-column>
+       <el-table-column
+        align="center"
+        label="报名时间"
+        prop="orderNo"
+        show-overflow-tooltip
+      >
+      </el-table-column>
+       <el-table-column
+        align="center"
+        label="订单编号"
+        prop="orderNo"
+        show-overflow-tooltip
+      >
+      </el-table-column>
+       <el-table-column
+        align="center"
+        label="支付金额(元)"
+        prop="orderNo"
+        show-overflow-tooltip
+      >
+      </el-table-column>
+       <el-table-column
+        align="center"
+        label="状态"
+        prop="orderNo"
+        show-overflow-tooltip
+      >
+      </el-table-column>
+       <el-table-column
+        align="center"
+        label="操作员"
+        prop="orderNo"
+        show-overflow-tooltip
+      >
+      </el-table-column> -->
+      
+       <el-table-column prop="address" align="center" label="操作">
+        <template slot-scope="scope">
+          <el-button type="text" size="small" v-if="scope.row.状态 == '待核销'" @click="handleAudit(scope.row)">核销</el-button>
+          <el-button type="text" size="small" v-if="scope.row.状态 == '申请退款'" @click="handleRefund(scope.row)">退款</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="page-box">
+      <el-pagination
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+        background
+        :current-page="query.currentPage"
+        :page-sizes="[10, 20, 30, 40]"
+        :page-size="query.pageSize"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="total"
+      >
+      </el-pagination>
+    </div>
+  </div>
+</template>
+  
+  <script>
+  import {debounce} from '@/utils/index'
+  import {activityDetail,getSignUpData,refund,verification} from '@/api/activity'
+
+  import {timeFormat} from '@/utils/index'
+export default {
+  name: "dataList",
+  data() {
+    return {
+      tableData: [],
+      loading: false,
+      downloadLoading: false,
+      list:[],
+      info:{},
+      query: {
+        "activityId": '',
+        "currentPage": 1,
+        "pageSize": 10,
+      },
+      title: "",
+      total: 0,
+    };
+  },
+  methods: {
+    filterType(val) {
+       if(!val){
+          return "无"
+      }
+      else if(val == 'APPLY_REFUND'){
+          return "申请退款"
+      }else if(val == 'CLOSE'){
+          return "关闭订单"
+        
+      }else if(val == 'REFUNDED'){
+          return "已退款"
+        
+      }else if(val == 'REFUSAL_REFUND'){
+          return "拒绝退款"
+        
+      }else if(val == 'APPLY_REFUNDING'){
+          return "退款中"
+        
+      }else if(val == 'USED'){
+          return "已使用"
+        
+      }else if(val == 'WAIT_PAYMENT'){
+          return "待付款"
+        
+      }else if(val == 'WAIT_USE'){
+          return "待核销"
+      }
+    },
+    handleAdd(){
+        this.$router.push({
+            path:'/operationManage/dataList/addActivity',
+            query:{
+            mode:'add',
+            }
+        })
+    },
+    handleExport() {
+      this.downloadLoading = true
+      let query = JSON.parse(JSON.stringify(this.query))
+      query.currentPage = 1
+      query.pageSize = this.total
+       getSignUpData(query).then(res=>{
+        this.loading = false
+        if(res.state == 'Success'){
+          this.list = []
+          res.content.records.map(item=>{
+            if(item.data.length){
+
+              let obj = {}
+              // obj.ID = item.data[0].serviceId
+              obj.订单号 = item.data[0].orderNo
+  
+              item.data.map(i=>{
+                if(i.content.length>1){
+                  obj[i.dataName] = i.content.join(',')
+  
+                }else{
+                  obj[i.dataName] = i.content
+                }
+              })
+              obj.报名时间 = item.data[0].signupTime
+              obj['支付金额(元)'] = this.info.price
+              obj.状态 = this.filterType(item.data[0].status) 
+              this.list.push(obj)
+            }
+          })
+          this.Export()
+        }
+      })
+      
+    },
+    Export(){
+      import('@/vendor/Export2Excel').then(excel => {
+        const tHeader = []
+        for (const key in this.list[0]) {
+          if (Object.hasOwnProperty.call(this.list[0], key)) {
+            tHeader.push(key)
+          }
+        }
+        const multiHeader = [[`活动时间:${this.info.activityStartTime} 至 ${this.info.activityEndTime}`,`报名时间:${this.info.signupStartTime} 至 ${this.info.signupEndTime}`,`报名费用:${this.info.price}元`]]
+        tHeader.map((item,index)=>{
+          if(!multiHeader[0][index]){
+            multiHeader[0][index] = ''
+          }
+        })
+        const data = this.formatJson(tHeader, this.list)
+        // console.log(data);
+        // let data = [[1,2,3,4,5]]
+        excel.export_json_to_excel({
+          multiHeader,
+          header: tHeader,
+          data,
+          filename: this.info.activityName,
+          // autoWidth: false,
+          bookType: 'xlsx'
+        })
+        this.downloadLoading = false
+      })
+    },
+    formatJson(filterVal, jsonData) {
+      return jsonData.map(v => filterVal.map(j => {
+        if (j === 'timestamp') {
+          return parseTime(v[j])
+        } else {
+          return v[j]
+        }
+      }))
+    },
+    timeFormat(val){
+      return timeFormat(val)
+    },
+    handleRefund(row){
+      console.log(row);
+       this.$confirm(`此操作将退款给用户, 是否继续?`, "提示", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning",
+        }).then(() => {
+          refund({orderNo:row.订单号,id:row.ID}).then(res=>{
+            if(res.state == 'Success'){
+               this.$notify({
+                title: "成功",
+                message: "操作成功",
+                type: "success",
+              });
+            }
+          })
+        })
+    },
+    handleAudit(row){
+         this.$confirm(`此操作将核销该数据, 是否继续?`, "提示", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning",
+        }).then(() => {
+          verification({orderNo:row.订单号,id:row.ID}).then(res=>{
+            if(res.state == 'Success'){
+              this.handleCurrentChange(1)
+                 this.$notify({
+                title: "成功",
+                message: "操作成功",
+                type: "success",
+              });
+            }
+          })
+        })
+    },
+    handleSizeChange(val) {
+      this.query.currentPage = 1;
+      this.query.pageSize = val;
+      this.getSignUpData()
+    },
+    handleCurrentChange(val) {
+      this.query.currentPage = val;
+      this.getSignUpData()
+    },
+    activityDetail(){
+      this.loading = true
+      let id = this.$route.query.id
+      activityDetail({id}).then(res=>{
+        this.loading = false
+        if(res.state == 'Success'){
+          this.info = res.content
+        }
+      })
+    },
+     getSignUpData(){
+      this.loading = true
+      this.query.activityId = this.$route.query.id
+      getSignUpData(this.query).then(res=>{
+        this.loading = false
+        if(res.state == 'Success'){
+          this.tableData = []
+          let list = res.content.records
+          list.map(item=>{
+            console.log(item);
+            if(item.data.length){
+              let obj = {}
+              
+              obj.ID = item.data[0].serviceId 
+              obj.订单号 = item.data[0].orderNo 
+  
+              item.data.map(i=>{
+                if(i.content.length>1){
+                  obj[i.dataName] = i.content.join(',')
+  
+                }else{
+                  obj[i.dataName] = i.content
+                }
+              })
+              obj.报名时间 = item.data[0].signupTime
+              obj['支付金额(元)'] = this.info.price
+              obj.状态 = this.filterType(item.data[0].status) 
+              this.tableData.push(obj)
+            }
+          })
+          this.total = res.content.total
+        }
+      })
+    }
+  },
+  created() {
+   this.activityDetail()
+   this.getSignUpData()
+  },
+};
+</script>
+  
+<style lang="scss" >
+.dataList {
+    .title-box{
+        color: #222;
+        .title{
+            font-size: 18px;
+            font-weight: 600;
+
+        }
+        .data-box{
+            display: flex;
+            align-items: center;
+            font-size: 14px;
+            padding: 20px 0;
+            .value{
+                margin-right: 20px;
+            }
+        }
+    }
+
+    .export-box{
+        display: flex;
+        justify-content: flex-end;
+    }
+}
+
+</style>
+  

+ 348 - 0
src/views/operationManage/activityManage/index.vue

@@ -0,0 +1,348 @@
+
+<template>
+  <div class="activityManage app-container">
+    <div class="search">
+        <div>
+            <el-input
+            v-model="query.name"
+            size="small"
+            clearable
+            placeholder="请输入活动名称"
+            class="item-width-200 "
+            ></el-input>
+            <el-select
+          v-model="query.activityType"
+          size="small"
+          class="item-width-200 ml10"
+          placeholder="请选择活动类型"
+          clearable
+        >
+          <el-option
+            v-for="item in options"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select>
+        <el-select
+          v-model="query.state"
+          size="small"
+          class="item-width-200 ml10"
+          placeholder="请选择活动状态"
+          clearable
+        >
+          <el-option
+            v-for="item in options1"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select>
+            <el-button
+            class="ml10"
+            type="primary"
+            size="small"
+            icon="el-icon-search"
+            @click="handleSearch"
+        >
+            搜索
+        </el-button>
+        </div>
+        <el-button
+            type="primary"
+            size="small"
+            @click="handleAdd"
+        >
+            添加
+        </el-button>
+    </div>
+
+    <el-table
+      :data="tableData"
+      tooltip-effect="dark"
+      border
+      v-loading="loading"
+      style="width: 100%"
+    >
+      <el-table-column
+        align="center"
+        label="活动名称"
+        prop="activityName"
+        show-overflow-tooltip
+      >
+      </el-table-column>
+      <el-table-column
+        align="center"
+        label="活动时间"
+        prop="orderNo"
+        show-overflow-tooltip
+      >
+       <template slot-scope="scope">
+         {{scope.row.activityStartTime}} 至 {{scope.row.activityEndTime}}
+        </template>
+      </el-table-column>
+      <el-table-column
+        align="center"
+        label="活动类型"
+        prop="activityType"
+        show-overflow-tooltip
+      >
+       <template slot-scope="scope">
+        {{scope.row.activityType == 1?'海报':'报名'}}
+       </template>
+      </el-table-column>
+      <el-table-column
+        align="center"
+        label="活动状态"
+        prop="status"
+        show-overflow-tooltip
+      >
+      </el-table-column>
+
+       <el-table-column prop="address" align="center" label="操作">
+        <template slot-scope="scope">
+          <el-button type="text" size="small" @click="handleData(scope.row.id)">数据</el-button>
+          <el-button type="text" size="small" v-if="scope.row.status != '已结束'" @click="handleShare(scope.row)">分享</el-button>
+          <el-button type="text" size="small" @click="handleDetail(scope.row, scope.row.status != '已结束'?'edit':'detail')">{{scope.row.status != '已结束'?'编辑':'查看'}}</el-button>
+          <el-button type="text" size="small" v-if="scope.row.status != '已结束'" @click="handleStop(scope.row.id)">停止</el-button>
+          <el-button type="text" size="small" @click="handleDel(scope.row.id)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="page-box">
+      <el-pagination
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+        background
+        :current-page="query.currentPage"
+        :page-sizes="[10, 20, 30, 40]"
+        :page-size="query.pageSize"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="total"
+      >
+      </el-pagination>
+    </div>
+
+     <el-dialog
+    :visible.sync="showCode"
+    width="400px"
+    center>
+    <div v-loading="codeLoading">
+      <img style="width:300px;height:300px;margin:0 auto;display:block" :src="codeImg" alt="">
+    </div>
+    <span slot="footer" class="dialog-footer">
+      <a id="downBtn" v-show="false" :download="downName" :href="codeImg" >下载</a>
+      <el-button @click="download">下载</el-button>
+      <el-button @click="refresh">刷新二维码</el-button>
+    </span>
+    </el-dialog>
+
+  </div>
+</template>
+
+  <script>
+  import {debounce} from '@/utils/index'
+  import {activityList,activityDel,activityStop} from '@/api/activity'
+  import {timeFormat} from '@/utils/index'
+  import {BASE_URL} from '@/utils/config'
+  import axios from 'axios'
+  import {clear} from '@/api/common'
+export default {
+  name: "activityManage",
+  data() {
+    return {
+      options:[
+        {
+          value:1,
+          label:'海报'
+        },
+        {
+          value:2,
+          label:'报名'
+        },
+      ],
+      options1:[
+        {
+          value:1,
+          label:'未开始'
+        },
+        {
+          value:1,
+          label:'进行中'
+        },
+        {
+          value:1,
+          label:'已结束'
+        }
+      ],
+      tableData: [],
+      loading: false,
+      codeLoading: false,
+      showCode: false,
+      codeImg:'',//收款码
+      downName:'',//下载名称
+      query: {
+        "activityType":null,
+        "state":'',
+        "currentPage": 1,
+        "pageSize": 10,
+        shopId: 0,
+      },
+      title: "",
+      total: 0,
+      id:''
+    };
+  },
+  methods: {
+    handleShare(item){
+      this.showCode = true
+      this.codeLoading = true
+      this.downName = item.activityName + "活动码"
+      this.id = item.id
+      const platformType = localStorage.getItem('platformType')
+      axios(
+        {
+      url: BASE_URL+'zswl-cloud-bdb/promotion/qrcode',
+      method: 'post',
+      responseType: "arraybuffer",
+      data:{
+        "page": "signUp/index",
+        "scene": item.id,
+        "platformType" : platformType
+      }
+    }).then(res=>{
+      console.log(res);
+      this.codeLoading = false
+       let blob = new Blob([res.data], { type: "image/png" });
+       this.codeImg =  (window.URL || window.webkitURL).createObjectURL(blob);
+      })
+    },
+    refresh(){
+      this.codeLoading = true
+      clear({type:1}).then(res=>{
+          if(res.state == 'Success'){
+             axios(
+              {
+              url: BASE_URL+'zswl-cloud-bdb/promotion/qrcode',
+              method: 'post',
+              responseType: "arraybuffer",
+              data:{
+                "page": "signUp/index",
+                "scene": this.id
+              }
+            }).then(res=>{
+              console.log(res);
+              this.codeLoading = false
+              let blob = new Blob([res.data], { type: "image/png" });
+              this.codeImg =  (window.URL || window.webkitURL).createObjectURL(blob);
+            })
+          }
+      })
+    },
+    // 下载
+    download(){
+      document.getElementById('downBtn').click()
+    },
+    handleAdd(){
+        this.$router.push({
+            path:'/operationManage/activityManage/addActivity',
+            query:{
+            mode:'add',
+            }
+        })
+    },
+    handleSearch(){
+      this.query.currentPage = 1
+      this.activityList();
+    },
+    timeFormat(val){
+      return timeFormat(val)
+    },
+    handleData(id){
+        this.$router.push({
+          path:'/operationManage/activityManage/dataList',
+          query:{
+            id
+          }
+        })
+    },
+    handleDetail(row,mode){
+      this.$router.push({
+        path:'/operationManage/activityManage/addActivity',
+        query:{
+          mode,
+          id:row.id,
+          status:row.status
+        }
+      })
+    },
+    handleDel(id){
+         this.$confirm(`此操作将删除该活动, 是否继续?`, "提示", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning",
+        }).then(() => {
+          activityDel({id}).then(res=>{
+            if(res.state == 'Success'){
+               this.$notify({
+                title: "成功",
+                message: "操作成功",
+                type: "success",
+              });
+              this.handleSearch()
+            }
+          })
+        })
+    },
+    handleStop(id){
+         this.$confirm(`此操作将停止该活动, 是否继续?`, "提示", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning",
+        }).then(() => {
+          activityStop({id}).then(res=>{
+            if(res.state == 'Success'){
+               this.$notify({
+                title: "成功",
+                message: "操作成功",
+                type: "success",
+              });
+              this.handleSearch()
+            }
+          })
+        })
+    },
+    handleSizeChange(val) {
+      this.query.currentPage = 1;
+      this.query.pageSize = val;
+      this.activityList()
+    },
+    handleCurrentChange(val) {
+      this.query.currentPage = val;
+      this.activityList()
+    },
+    activityList(){
+      this.loading = true
+      activityList(this.query).then(res=>{
+        this.loading = false
+        if(res.state == 'Success'){
+          this.tableData = res.content.records
+          this.total = res.content.total
+        }
+      })
+    }
+  },
+  created() {
+    this.activityList()
+  },
+};
+</script>
+
+<style lang="scss" >
+.activityManage {
+
+}
+
+</style>

+ 20 - 4
src/views/operationManage/advertisingManage/addAdv.vue

@@ -81,6 +81,17 @@
           <el-radio :label="2">隐藏</el-radio>
         </el-radio-group>
       </el-form-item>
+      <template v-if="setQuery.advertsType == 6">
+        <el-form-item label="弹框显示限制:">
+            <el-radio-group v-model="setQuery.loginShow">
+            <el-radio label="1">未登录</el-radio>
+            <el-radio label="2">已登录</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="登录限制:">
+          <el-checkbox :true-label="1" :false-label="2" v-model="setQuery.loginLimit">登录后才允许查看</el-checkbox>
+        </el-form-item>
+      </template>
 
     </el-form>
 
@@ -94,7 +105,6 @@
 <script>
 import Upload from '@/components/Upload'
 import {addOrUpdateAdv} from '@/api/appConfig'
-import { cancel } from 'ali-oss/lib/common/parallel';
 export default {
     components: {
         Upload,
@@ -111,7 +121,9 @@ export default {
           "sort": 0,
           "showSort":0,
           "status":1,
-          "belongType":'2'
+          "belongType":'2',
+          "loginShow":'1',
+          "loginLimit":1,
         },
       options:[
         {
@@ -129,16 +141,20 @@ export default {
         {
           label:'贵大奶茶广告位',
           value:4
+        },
+        {
+          label:'首页弹窗',
+          value:6
         }
       ],
       belongTypeOptions:[
         {
           label: "贵大",
-          value: 1,
+          value: '1',
         },
         {
           label: "慧研学",
-          value: 2,
+          value: '2',
         },
       ],
     };

+ 30 - 0
src/views/operationManage/advertisingManage/index.vue

@@ -18,6 +18,21 @@
           >
           </el-option>
         </el-select>
+        <el-select
+          v-model="query.belongType"
+          size="small"
+          clearable
+          class="item-width-200 ml10"
+          placeholder="请选择所属平台"
+        >
+          <el-option
+            v-for="item in options1"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select>
         <el-button
         class="ml10"
         type="primary"
@@ -141,10 +156,25 @@ export default {
         {
           label:'贵大奶茶广告位',
           value:4
+        },
+        {
+          label:'首页弹窗',
+          value:6
         }
       ],
+      options1:[
+         {
+          label: "贵大",
+          value: '1',
+        },
+        {
+          label: "慧研学",
+          value: '2',
+        },
+      ],
       loading: false,
       query: {
+        belongType:'',
         advertsType:'',
         currentPage: 1,
         pageSize: 10,

+ 6 - 0
src/views/operationManage/appMenuManage/addMenu.vue

@@ -37,6 +37,12 @@
           class="item-width-300"
         ></el-input>
       </el-form-item>
+      <el-form-item label="菜单下方文字:">
+        <el-input
+          v-model="setQuery.labelBelow"
+          class="item-width-300"
+        ></el-input>
+      </el-form-item>
 
        <el-form-item label="域名地址:" prop="domainUrl">
         <el-input

+ 9 - 9
src/views/operationManage/appMenuManage/index.vue

@@ -148,18 +148,18 @@ export default {
       total: 0,
     };
   },
-  watch: {
-    query: {
-      handler: debounce(function (val) {
-        this.getMenu()
-      }),
-      deep: true,
-    },
-  },
+  // watch: {
+  //   query: {
+  //     handler: debounce(function (val) {
+  //       this.getMenu()
+  //     }),
+  //     deep: true,
+  //   },
+  // },
   methods: {
     handleSearch(){
       this.query.currentPage = 1
-      this.advList();
+      this.getMenu();
 
     },
     handle(id){

+ 87 - 5
src/views/operationManage/comboManage/editCombo.vue

@@ -9,16 +9,57 @@
       <el-form-item label="套餐名称:" prop="setMealName">
         <el-input
           v-model="setQuery.setMealName"
-          :maxlength="11"
           class="item-width-300"
         ></el-input>
       </el-form-item>
       <el-form-item label="套餐code:" prop="setMealCode">
         <el-input
           v-model="setQuery.setMealCode"
-          :maxlength="11"
           class="item-width-300"
         ></el-input>
+      </el-form-item>
+       <el-form-item label="折扣参数:" prop="discount">
+        <el-input
+        type="number"
+          v-model.number="setQuery.discount"
+          class="item-width-300"
+        ></el-input>
+      </el-form-item>
+      <el-form-item label="套餐颜色:" prop="colour">
+        <el-input
+          v-model="setQuery.colour"
+          class="item-width-300"
+          placeholder="请输入#FFF或rgb(255,255,255)格式"
+        ></el-input>
+      </el-form-item>
+      <el-form-item label="套餐背景颜色:" prop="backColour">
+        <el-input
+          v-model="setQuery.backColour"
+          class="item-width-300"
+          placeholder="请输入#FFF或rgb(255,255,255)格式"
+        ></el-input>
+      </el-form-item>
+       <el-form-item label="套餐图片:" prop="imgUrl">
+        <Upload
+          type="imgUrl"
+          id="imgUrl"
+          width="150px"
+          height="150px"
+          uploadType="OTHER"
+          :imgUrl="setQuery.imgUrl"
+          @uploadEnd="uploadEnd"
+        ></Upload>
+      </el-form-item>
+       <el-form-item label="套餐背景图片:" prop="backImg">
+        <Upload
+          type="backImg"
+          id="backImg"
+          width="150px"
+          height="150px"
+          uploadType="OTHER"
+          :imgUrl="setQuery.backImg"
+          @uploadEnd="uploadEnd"
+        ></Upload>
       </el-form-item>
       <el-form-item label="套餐说明:">
         <el-input
@@ -45,16 +86,27 @@
 
 <script>
 import { addOrUpdate,detail } from "@/api/common";
+import Upload from '@/components/Upload'
+
 export default {
+   components: {
+        Upload,
+    },
   data() {
     return {
       loading: false,
       loading1: false,
+      mode:'',
       setQuery: {
         setMealCode: 0,
         setMealDetail: "",
         setMealId: 0,
         setMealName: "",
+         discount: 0,
+        imgUrl: "",
+        backImg:"",
+        colour:'',
+        backColour:'',
       },
       rules: {
         setMealCode: [
@@ -63,10 +115,25 @@ export default {
         setMealName: [
           { required: true, message: "请输入套餐名称", trigger: "blur" },
         ],
+         colour: [
+          { required: true, message: "请输入套餐颜色", trigger: "blur" },
+        ],
+         backColour: [
+          { required: true, message: "请输入套餐背景颜色", trigger: "blur" },
+        ],
+         imgUrl: [
+          { required: true, message: "请上传套餐图片", trigger: "change" },
+        ],
+         backImg: [
+          { required: true, message: "请上传套餐背景图片", trigger: "change" },
+        ],
       },
     };
   },
   methods: {
+     uploadEnd(val){
+      this.setQuery[val.type] = val.url
+    },
     detail(){
         this.loading1 = true
         detail({setMealId:this.$route.query.id}).then(res=>{
@@ -76,13 +143,19 @@ export default {
                 this.setQuery.setMealCode = res.content.setMealCode
                 this.setQuery.setMealDetail = res.content.setMealDetail
                 this.setQuery.setMealName = res.content.setMealName
+                this.setQuery.imgUrl = res.content.imgUrl
+                this.setQuery.colour = res.content.colour
+                this.setQuery.backColour = res.content.backColour
+                this.setQuery.discount = res.content.discount
+                this.setQuery.backImg = res.content.backImg
+                
             }
         })
     },
     save() {
-      this.loading = true;
       this.$refs.setQuery.validate((v) => {
         if (v) {
+          this.loading = true;
           addOrUpdate(this.setQuery).then((res) => {
             this.loading = false;
             if (res.state == "Success") {
@@ -99,13 +172,22 @@ export default {
               };
               this.$router.push("/operationManage/comboManage/index");
             }
-          });
+          }).catch(()=>{
+            this.loading = false;
+
+          })
         }
       });
     },
   },
   created () {
-    this.detail();
+    if(this.$route.query.id){
+      this.mode = 'edit'
+      this.detail();
+    }else{
+      this.mode = 'add'
+
+    }
   },
 };
 </script>

+ 57 - 4
src/views/operationManage/comboManage/index.vue

@@ -14,6 +14,16 @@
       v-loading="loading"
       style="width: 100%"
     >
+      <el-table-column
+        prop="createTime"
+        align="center"
+        label="套餐图片"
+        show-overflow-tooltip
+      >
+        <template slot-scope="scope">
+          <img :src="scope.row.imgUrl" alt="" class="icon">
+        </template>
+      </el-table-column>
       <el-table-column
         align="center"
         label="套餐code"
@@ -36,11 +46,14 @@
       >
       </el-table-column>
       <el-table-column
-        prop="createTime"
+        prop="count"
         align="center"
         label="累计套餐订购人数"
         show-overflow-tooltip
       >
+      <template slot-scope="scope">
+          <span>{{ scope.row.count || 0 }}</span>
+        </template>
       </el-table-column>
       <el-table-column
         prop="createTime"
@@ -67,9 +80,13 @@
             @click="handle(scope.row)"
             >{{ scope.row.status == 1 ? "禁用" : "启用" }}</el-button
           >
+
           <el-button type="text" size="small" @click="handleEdit(scope.row.id)"
             >修改</el-button
           >
+          <el-button type="text" size="small" @click="handleEditEquities(scope.row.setMealCode)"
+            >权益配置</el-button
+          >
           <el-button type="text" size="small" @click="handleDel(scope.row)"
             >删除</el-button
           >
@@ -94,7 +111,7 @@
   
   <script>
 import { debounce } from "@/utils/index";
-import { getList,operate } from "@/api/common";
+import { getList,operate,delMeal } from "@/api/common";
 export default {
   name: "comboManage",
   data() {
@@ -150,6 +167,7 @@ export default {
                 message: '操作成功',
                 type: 'success'
               });
+              this.query.currentPage = 1
               this.getList()
             }
           })
@@ -165,10 +183,42 @@ export default {
         }
       });
     },
+    handleEditEquities(id){
+      this.$router.push({
+        path:"/operationManage/equitiesManage/index",
+        query:{
+          id
+        }
+      });
+    },
     handleAdd() {
-      this.$router.push("/operationManage/comboManage/addCombo");
+       this.$router.push({
+        path:"/operationManage/comboManage/editCombo",
+        query:{
+          title:'添加套餐'
+        }
+      });
+    },
+    handleDel(row) {
+      this.$confirm(`此操作将删除该条数据, 是否继续?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          delMeal({setMealId:row.id}).then(res=>{
+            if (res.state == "Success") {
+              this.$notify({
+                title: '提示',
+                message: '操作成功',
+                type: 'success'
+              });
+              this.query.currentPage = 1
+              this.getList()
+            }
+          })
+         
+        })
     },
-    handleDel(row) {},
     handleSizeChange(val) {
       this.query.currentPage = 1;
       this.query.pageSize = val;
@@ -202,6 +252,9 @@ export default {
   
 <style lang="scss" >
 .comboManage {
+  .icon{
+    width: 80px;
+  }
 }
 </style>
   

+ 52 - 11
src/views/operationManage/couponManage/discountCoupon.vue

@@ -32,7 +32,7 @@
               </el-input>
             </el-form-item>
           </div>
-          <div class="label">,</div>
+          <div class="label">,</div>
           <div class="flex">
             <el-form-item prop="couponDiscount">
               <el-input
@@ -40,20 +40,20 @@
                 size="small"
                 class="item-width-200"
               >
-                <template slot="append"></template>
+                <template slot="append"></template>
               </el-input>
             </el-form-item>
           </div>
         </div>
         <div class="flex" :span="24">
-          <el-radio v-model="radio1" label="2">无门槛,立减</el-radio>
+          <el-radio v-model="radio1" label="2">无门槛,</el-radio>
           <el-form-item prop="couponDiscount">
             <el-input
               v-model="setQuery.couponDiscount"
               size="small"
               class="item-width-200"
             >
-              <template slot="append"></template>
+              <template slot="append"></template>
             </el-input>
           </el-form-item>
         </div>
@@ -209,6 +209,7 @@
         <div v-if="radio3 == 2">
           <el-input
             v-model.number="setQuery.claimNum"
+            type="number"
             size="small"
             class="item-width-300"
           >
@@ -375,7 +376,7 @@
 
 <script>
 import { getSetMealNameAndId } from "@/api/common";
-import { saveOrUpdate, detail } from "@/api/coupon";
+import { saveOrUpdate, detail,getGoodsInfoByCoupon } from "@/api/coupon";
 import { goodsList } from "@/api/goods";
 import { getList } from "@/api/shop";
 import { debounce } from "@/utils/index";
@@ -384,9 +385,18 @@ export default {
   data() {
     var validateLimit = (rule, value, callback) => {
       if (value === "") {
-        callback(new Error("请输入"));
+        callback(new Error("请输入发放数量"));
       } else if (value > 100000000 || value < 1) {
-        callback(new Error("应在~100000000之间"));
+        callback(new Error("应在1~100000000之间"));
+      } else {
+        callback();
+      }
+    };
+    var validateDiscount = (rule, value, callback) => {
+      if (value === "") {
+        callback(new Error("请输入"));
+      } else if (value > 9.9 || value < 0.1) {
+        callback(new Error("折扣应在0.1~9.9之间"));
       } else {
         callback();
       }
@@ -407,7 +417,7 @@ export default {
         couponCondition: 0,
         couponDiscount: 0,
         couponName: "",
-        couponType: 1,
+        couponType: 2,
         id: 0,
         limitNum: 0,
         maxDiscount: 0,
@@ -429,8 +439,12 @@ export default {
         couponName: [
           { required: true, message: "请输入优惠券名称", trigger: "blur" },
         ],
-        couponDiscount: [{ validator: this.validateMoney, trigger: "blur" }],
+        couponDiscount: [{ validator: validateDiscount, trigger: "blur" }],
         limitNum: [{ validator: validateLimit, trigger: "blur" }],
+        claimNum:[
+            { required: true, message: '请输入领取次数', trigger: 'blur' },
+             { type:'number',min: 1, max: 100, message: '领取限制:1~100次', trigger: 'blur' }
+          ]
       },
       comboList: [],
       loading: false,
@@ -539,6 +553,11 @@ export default {
       deep: true,
       immediate: true,
     },
+    radio5(val){
+      if(val == 1){
+        this.setQuery.useGoodsRang = ''
+      }
+    }
   },
   computed: {
     list() {
@@ -597,8 +616,8 @@ export default {
       });
     },
     validateNum(rule, value, callback) {
-      if (value > 100 || value < 1) {
-        callback(new Error("应在1~2000之间"));
+      if (value > 200 || value < 1) {
+        callback(new Error("应在1~200之间"));
       } else {
         callback();
       }
@@ -648,6 +667,13 @@ export default {
             this.shopOptions = []
         }
     }),
+    getGoodsInfoByCoupon(id){
+      getGoodsInfoByCoupon({id,currentPage:1,pageSize:999}).then(res=>{
+          if (res.state == "Success") {
+            this.tableData1 = res.content.records
+          }
+      })
+    },
     getDetail(id) {
       this.pageLoading = true;
       detail({ id }).then((res) => {
@@ -690,6 +716,14 @@ export default {
             obj.claimUser = obj.claimUser.split(",");
           }
 
+          if(obj.useGoodsRang){
+            this.radio5 = '2'
+            this.getGoodsInfoByCoupon(id)
+
+          }else{
+            this.radio5 = '1'
+          }
+
           this.setQuery = obj;
         }
       });
@@ -722,6 +756,13 @@ export default {
             delete query.showType;
           }
 
+          if (this.radio5 == 2) {
+           query.useGoodsRang = this.tableData1.map(item=>item.goodsId).toString()
+          }else{
+           query.useGoodsRang = ''
+
+          }
+
           if (!query.id) {
             delete query.id;
           }

+ 824 - 0
src/views/operationManage/couponManage/fullDiscountCoupon.vue

@@ -0,0 +1,824 @@
+
+<template>
+  <div class="fullDiscountCoupon app-container">
+    <el-form
+      :model="setQuery"
+      ref="setQuery"
+      :rules="rules"
+      label-width="130px"
+      :disabled="mode == 'detail'"
+      v-loading="pageLoading"
+    >
+      <el-form-item label="优惠券名称:" prop="couponName">
+        <el-input
+          v-model="setQuery.couponName"
+          size="small"
+          class="item-width-300"
+          :maxlength="20"
+        ></el-input>
+      </el-form-item>
+
+      <el-form-item label="优惠券内容:" required>
+        <div class="flex">
+          <div class="flex">
+            <el-radio v-model="radio1" label="1">满</el-radio>
+            <el-form-item prop="couponCondition">
+              <el-input
+                v-model="setQuery.couponCondition"
+                size="small"
+                class="item-width-200"
+              >
+                <template slot="append">元</template>
+              </el-input>
+            </el-form-item>
+          </div>
+          <div class="label">,减</div>
+          <div class="flex">
+            <el-form-item prop="couponDiscount">
+              <el-input
+                v-model="setQuery.couponDiscount"
+                size="small"
+                class="item-width-200"
+              >
+                <template slot="append">元</template>
+              </el-input>
+            </el-form-item>
+          </div>
+        </div>
+        <div class="flex" :span="24">
+          <el-radio v-model="radio1" label="2">无门槛,立减</el-radio>
+          <el-form-item prop="couponDiscount">
+            <el-input
+              v-model="setQuery.couponDiscount"
+              size="small"
+              class="item-width-200"
+            >
+              <template slot="append">元</template>
+            </el-input>
+          </el-form-item>
+        </div>
+      </el-form-item>
+
+      <el-form-item label="使用日期:" prop="contactName">
+        <div class="flex">
+          <el-radio v-model="radio2" label="1">{{ "" }}</el-radio>
+          <el-form-item prop="useStartTime">
+            <el-date-picker
+              v-model="date"
+              size="small"
+              type="datetimerange"
+              range-separator="至"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              :default-time="['00:00:00', '23:59:59']"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              :picker-options="pickerOptions"
+            >
+            </el-date-picker>
+          </el-form-item>
+        </div>
+        <div class="flex">
+          <el-radio v-model="radio2" label="2">领券后</el-radio>
+          <el-select
+            v-model="setQuery.claimCalmDay"
+            size="small"
+            class="item-width-200"
+            placeholder="请选择"
+          >
+            <el-option label="立即生效" :value="0"> </el-option>
+            <el-option
+              :disabled="disabled"
+              :label="setQuery.claimCalmDay + '天生效'"
+              :value="setQuery.claimCalmDay"
+            >
+              <el-input
+                v-model.number="setQuery.claimCalmDay"
+                type="number"
+                size="small"
+                class="item-width-150"
+                @blur.stop="disabled = false"
+                @focus.stop="disabled = true"
+              >
+                <template slot="append">天</template>
+              </el-input>
+              生效
+            </el-option>
+          </el-select>
+          <div class="label">有效期</div>
+
+          <el-form-item prop="claimValidDay">
+            <el-input
+              v-model.number="setQuery.claimValidDay"
+              size="small"
+              type="number"
+              class="item-width-150"
+            >
+              <template slot="append">天</template>
+            </el-input>
+          </el-form-item>
+        </div>
+        <div class="notice">
+          例:用户在 1月1日9:00 领券,则该券的可用时间为 6月23日00:00:00 至
+          6月23日23:59:59(按自然天计算)
+        </div>
+      </el-form-item>
+      <el-form-item label="发放数量:" prop="limitNum">
+        <el-input
+          v-model.number="setQuery.limitNum"
+          type="number"
+          size="small"
+          class="item-width-300"
+        >
+          <template slot="append">张</template>
+        </el-input>
+      </el-form-item>
+
+      <el-form-item label="使用说明:" prop="usrDetail">
+        <el-input
+          v-model="setQuery.usrDetail"
+          class="item-width-300"
+          type="textarea"
+          :maxlength="100"
+          show-word-limit
+        ></el-input>
+      </el-form-item>
+      <el-form-item label="适用商品:" prop="usrDetail">
+        <el-radio v-model="radio5" label="1">全部商品</el-radio>
+        <el-radio v-model="radio5" label="2">指定商品</el-radio>
+        <div class="box" style="width: 600px" v-if="radio5 == 2">
+          <div class="tab-box">
+            <el-button size="small" @click="handleChoose">选择商品</el-button>
+            <el-button size="small" @click="tableData1 = []">全部删除</el-button>
+          </div>
+
+          <el-table
+            :data="list"
+            tooltip-effect="dark"
+            border
+            v-loading="loading1"
+            style="width: 100%"
+          >
+            <el-table-column
+            align="center"
+            label="商品图"
+            prop="couponName"
+            show-overflow-tooltip
+            >
+            <template slot-scope="scope">
+                <img class="icon" :src="scope.row.goodsImg" alt="" />
+            </template>
+            </el-table-column>
+
+            <el-table-column
+            prop="goodsName"
+            align="center"
+            label="商品名称"
+            show-overflow-tooltip
+            >
+            </el-table-column>
+
+            <el-table-column
+              prop="address"
+              width="180px"
+              fixed="right"
+              align="center"
+              label="操作"
+            >
+              <template slot-scope="scope">
+                <el-button type="text" size="small" @click="handleDel(scope.row.goodsId)">删除</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <div class="page-box">
+            <el-pagination
+              @current-change="handleCurrentChange1"
+              background
+              :current-page="chooseQuery.currentPage"
+              :page-sizes="[10]"
+              :page-size="chooseQuery.pageSize"
+              layout="total, sizes, prev, pager, next, jumper"
+              :total="tableData1.length"
+            >
+            </el-pagination>
+          </div>
+        </div>
+      </el-form-item>
+      <el-form-item label="领取限制:" required>
+        <el-radio v-model="radio3" label="1">不限制</el-radio>
+        <el-radio v-model="radio3" label="2">限制</el-radio>
+          <el-form-item v-if="radio3 == 2" prop="claimNum">
+          <el-input
+            v-model.number="setQuery.claimNum"
+            type="number"
+            size="small"
+            class="item-width-300"
+          >
+            <template slot="append">次</template>
+          </el-input>
+       </el-form-item>
+      </el-form-item>
+      <el-form-item label="领取用户限制:" required>
+        <el-radio v-model="radio4" label="1">不限制</el-radio>
+        <el-radio v-model="radio4" label="2">限制分类用户领取</el-radio>
+          <el-form-item v-if="radio4 == 2" prop="claimUser">
+          <el-checkbox-group v-model="setQuery.claimUser">
+            <el-checkbox label="99">非会员</el-checkbox>
+            <el-checkbox
+              :label="item.value"
+              v-for="item in comboList"
+              :key="item.value"
+              >{{ item.label }}</el-checkbox
+            >
+          </el-checkbox-group>
+      </el-form-item>
+
+      </el-form-item>
+      <el-form-item label="展示位置:" prop="showType">
+        <el-checkbox-group v-model="setQuery.showType">
+          <el-checkbox label="1">领取中心</el-checkbox>
+          <el-checkbox label="2">店铺首页</el-checkbox>
+        </el-checkbox-group>
+      </el-form-item>
+    </el-form>
+
+    <div class="btn-group">
+      <el-button>取 消</el-button>
+      <el-button type="primary" :loading="loading" @click="save"
+        >确 定</el-button
+      >
+    </div>
+
+    <el-dialog title="指定商品" top="30px" width="900px" :visible.sync="dialogTableVisible">
+      <div class="search">
+        <div>
+
+            <el-input
+            v-model="query.goodsName"
+            size="small"
+            placeholder="请输入商品名称"
+            class="item-width-200"
+            ></el-input>
+            <el-select
+            v-model="query.goodsType"
+            size="small"
+            clearable
+            class="item-width-200 ml10"
+            placeholder="请选择类型"
+            >
+            <el-option
+                v-for="item in typeOptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+            >
+            </el-option>
+            </el-select>
+            <el-select
+            v-model="query.shopId"
+            size="small"
+            class="item-width-200 ml10"
+            placeholder="请搜索并选择店铺"
+            :remote-method="getShopList"
+            :loading="shopLoading"
+            clearable
+            filterable
+            remote
+            >
+            <el-option
+                v-for="item in shopOptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+            >
+            </el-option>
+            </el-select>
+            <el-button
+            class="ml10"
+            type="primary"
+            size="small"
+            icon="el-icon-search"
+            @click="handleSearch"
+            >
+            搜索
+            </el-button>
+        </div>
+      </div>
+      <el-table
+        :data="tableData"
+        tooltip-effect="dark"
+        border
+        v-loading="loading1"
+        style="width: 100%"
+        ref="multipleTable"
+         @selection-change="handleSelectionChange"
+      >
+       <el-table-column
+        type="selection"
+        width="40">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="商品图"
+          prop="couponName"
+          show-overflow-tooltip
+        >
+          <template slot-scope="scope">
+            <img class="icon" :src="scope.row.goodsImg" alt="" />
+          </template>
+        </el-table-column>
+
+        <el-table-column
+          prop="goodsName"
+          align="center"
+          label="商品名称"
+          show-overflow-tooltip
+        >
+        </el-table-column>
+        <el-table-column
+          prop="goodsName"
+          align="center"
+          label="商品分类"
+          show-overflow-tooltip
+        >
+          <template slot-scope="scope">
+            {{ goodsTypeObj[scope.row.goodsType] || "-" }}
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="shopName"
+          align="center"
+          label="店铺"
+          show-overflow-tooltip
+        >
+        </el-table-column>
+      </el-table>
+      <div class="page-box">
+        <el-pagination
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          background
+          :current-page="query.currentPage"
+          :page-sizes="[10, 20, 30, 40]"
+          :page-size="query.pageSize"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="total"
+        >
+        </el-pagination>
+      </div>
+      <!-- <div class="btn-group">
+      <el-button @click="dialogTableVisible = false">取 消</el-button>
+      <el-button type="primary" @click="saveChoose"
+        >确 定</el-button
+      >
+    </div> -->
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getSetMealNameAndId } from "@/api/common";
+import { saveOrUpdate, detail,getGoodsInfoByCoupon } from "@/api/coupon";
+import { goodsList } from "@/api/goods";
+import { getList } from "@/api/shop";
+import { debounce } from "@/utils/index";
+
+export default {
+  data() {
+    var validateLimit = (rule, value, callback) => {
+      if (value === "") {
+        callback(new Error("请输入发放数量"));
+      } else if (value > 100000000 || value < 1) {
+        callback(new Error("应在1~100000000之间"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      mode: "add",
+      radio: 1,
+      radio1: "1",
+      radio2: "1",
+      radio3: "1",
+      radio4: "1",
+      radio5: "1",
+      setQuery: {
+        claimCalmDay: 1,
+        claimNum: 0,
+        claimUser: [],
+        claimValidDay: 0,
+        couponCondition: 0,
+        couponDiscount: 0,
+        couponName: "",
+        couponType: 1,
+        id: 0,
+        limitNum: 0,
+        maxDiscount: 0,
+        shopId: "",
+        showType: [],
+        useEndTime: "",
+        useGoodsRang: "",
+        useStartTime: "",
+        usrDetail: "",
+      },
+      date: [],
+      disabled: false,
+      pickerOptions: {
+        disabledDate(time) {
+          return time.getTime() < Date.now() - 1000 * 60 * 60 * 24;
+        },
+      },
+      rules: {
+        couponName: [
+          { required: true, message: "请输入优惠券名称", trigger: "blur" },
+        ],
+        couponDiscount: [{ validator: this.validateMoney, trigger: "blur" }],
+        limitNum: [{ required:true,validator: validateLimit, trigger: "blur" }],
+        claimNum:[
+            { required: true, message: '请输入领取次数', trigger: 'blur' },
+             { type:'number',min: 1, max: 100, message: '领取限制:1~100次', trigger: 'blur' }
+          ]
+      },
+      comboList: [],
+      loading: false,
+      tableData: [],
+      tableData1: [],
+      chooseList: [],
+      chooseQuery:{
+        currentPage:1,
+        pageSize: 10,
+
+      },
+      loading1: false,
+      pageLoading: false,
+      shopLoading: false,
+      dialogTableVisible: false,
+      goodsTypeObj: JSON.parse(sessionStorage.getItem("goodsTypeObj")),
+      typeOptions:[],
+      shopOptions:[],
+      query: {
+        applyState: "",
+        status: "3",
+        shopId: "",
+        goodsName: "",
+        currentPage: 1,
+        pageSize: 10,
+      },
+      total: 0,
+    };
+  },
+  watch: {
+    date(val) {
+      if (val == null) {
+        this.setQuery.useStartTime = "";
+        this.setQuery.useEndTime = "";
+      } else {
+        this.setQuery.useStartTime = val[0];
+        this.setQuery.useEndTime = val[1];
+      }
+    },
+    radio1: {
+      handler: function (val) {
+        if (val == 1) {
+          this.$set(this.rules, "couponCondition", [
+            { validator: this.validateMoney, trigger: "blur" },
+          ]);
+        } else {
+          delete this.rules.couponCondition;
+          this.$refs.setQuery.clearValidate("couponCondition");
+        }
+      },
+      deep: true,
+      immediate: true,
+    },
+    radio2: {
+      handler: function (val) {
+        if (val == 1) {
+          this.$set(this.rules, "useStartTime", [
+            { required: true, message: "请选择使用时间", trigger: "change" },
+          ]);
+          delete this.rules.claimCalmDay;
+          delete this.rules.claimValidDay;
+        } else {
+          delete this.rules.useStartTime;
+          this.$refs.setQuery.clearValidate("useStartTime");
+          this.$set(this.rules, "claimCalmDay", [
+            { required: true, message: "请输入生效时间", trigger: "blur" },
+            { validator: this.validateNum, trigger: "blur" },
+          ]);
+          this.$set(this.rules, "claimValidDay", [
+            { required: true, message: "请输入有效天数", trigger: "blur" },
+            { validator: this.validateNum, trigger: "blur" },
+          ]);
+        }
+      },
+      deep: true,
+      immediate: true,
+    },
+    // radio3:{
+    //   handler: function (val) {
+    //     if(val == 1){
+    //         delete this.rules.claimNum
+
+    //     }else{
+    //         this.rules.claimNum = [
+    //           { validator: validateNum, trigger: 'blur' }
+    //         ]
+    //     }
+    //    },
+    //   deep: true,
+    //   immediate: true
+    // },
+    radio4: {
+      handler: function (val) {
+        if (val == 1) {
+          delete this.rules.claimUser;
+        } else {
+          this.rules.claimUser = [
+            {
+              required: true,
+              message: "请选择领取用户限制",
+              trigger: "change",
+            },
+          ];
+        }
+      },
+      deep: true,
+      immediate: true,
+    },
+    radio5(val){
+      if(val == 1){
+        this.setQuery.useGoodsRang = ''
+      }
+    }
+  },
+  computed: {
+    list() {
+        return this.tableData1.slice((this.chooseQuery.currentPage-1)*this.chooseQuery.pageSize,this.chooseQuery.currentPage*this.chooseQuery.pageSize)
+    }
+  },
+  methods: {
+    handleDel(id){
+        this.tableData1.map((item,index)=>{
+            if(item.goodsId == id){
+                return this.tableData1.splice(index,1)
+            }
+        })
+    },
+    // 勾选变化
+    handleSelectionChange(val){
+      this.chooseList = val
+         this.tableData1 = this.tableData1.concat(JSON.parse(JSON.stringify(this.chooseList)) ) 
+         this.tableData1 = Array.from(new Set(this.tableData1.map(JSON.stringify))).map(JSON.parse)
+        console.log(this.tableData1.map(item=>item.goodsId));
+        this.chooseList = []
+    },
+    saveChoose(){
+        this.dialogTableVisible = false
+       
+    },
+    handleChoose(){
+        this.dialogTableVisible = true
+        this.handleSearch()
+    },
+    handleSearch(){
+      this.query.currentPage = 1;
+      this.getGoodsList();
+    },
+    handleSizeChange(val) {
+      this.query.currentPage = 1;
+      this.query.pageSize = val;
+      this.getGoodsList();
+    },
+    handleCurrentChange(val) {
+      this.query.currentPage = val;
+      this.getGoodsList();
+    },
+    // 静态表格手动分页
+    handleCurrentChange1(val) {
+      this.chooseQuery.currentPage = val;
+    },
+    getGoodsList() {
+      this.loading1 = true;
+      goodsList(this.query).then((res) => {
+        this.loading1 = false;
+        if (res.state == "Success") {
+          this.tableData = res.content.records;
+          this.total = res.content.total;
+        }
+      });
+    },
+    validateNum(rule, value, callback) {
+      if (value > 200 || value < 1) {
+        callback(new Error("应在1~200之间"));
+      } else {
+        callback();
+      }
+    },
+    validateMoney(rule, value, callback) {
+      if (Number(value).toString() == "NaN") {
+        callback(new Error("请输入数字"));
+      } else if (value > 100000 || value < 0.01) {
+        callback(new Error("金额应在0.01~100000.00之间"));
+      } else {
+        callback();
+      }
+    },
+    // 获取套餐列表
+    getSetMealNameAndId() {
+      getSetMealNameAndId().then((res) => {
+        if (res.state == "Success") {
+          for (const key in res.content) {
+            if (res.content.hasOwnProperty.call(res.content, key)) {
+              this.comboList.push({
+                label: res.content[key],
+                value: key,
+              });
+            }
+          }
+        }
+      });
+    },
+    // 获取店铺列表
+    getShopList:debounce(function(val) {
+        if(val){
+            getList({shopNameOrPhoneNum: val,
+              currentPage: 1,
+              pageSize: 20}).then((res) => {
+              this.shopLoading = false;
+              if (res.state == "Success") {
+                 this.shopOptions = []
+                res.content.records.map(item=>{
+                    this.shopOptions.push({
+                        label:item.shopName,
+                        value:item.shopId
+                    })
+                })
+              }
+            });
+        }else{
+            this.shopOptions = []
+        }
+    }),
+    getGoodsInfoByCoupon(id){
+      getGoodsInfoByCoupon({id,currentPage:1,pageSize:999}).then(res=>{
+          if (res.state == "Success") {
+            this.tableData1 = res.content.records
+          }
+      })
+    },
+    getDetail(id) {
+      this.pageLoading = true;
+      detail({ id }).then((res) => {
+        this.pageLoading = false;
+        if (res.state == "Success") {
+          let obj = JSON.parse(JSON.stringify(res.content));
+          if (obj.showType == 3) {
+            obj.showType = ["1", "2"];
+          } else if (obj.showType) {
+            obj.showType = [obj.showType.toString()];
+          } else {
+            obj.showType = [];
+          }
+
+          if (obj.couponCondition) {
+            this.radio1 = "1";
+          } else {
+            this.radio1 = "2";
+          }
+          obj.claimCalmDay = obj.claimCalmDay || 1;
+          obj.claimValidDay = obj.claimValidDay || 0;
+          if (obj.claimValidDay > 0) {
+            this.radio2 = "2";
+          } else if (obj.useStartTime && obj.useEndTime) {
+            this.radio2 = "1";
+            this.date = [obj.useStartTime, obj.useEndTime];
+          }
+
+          if (obj.claimNum == 0) {
+            this.radio3 = "1";
+          } else {
+            this.radio3 = "2";
+          }
+
+          if (obj.claimUser == 0) {
+            this.radio4 = "1";
+            obj.claimUser = [];
+          } else {
+            this.radio4 = "2";
+            obj.claimUser = obj.claimUser.split(",");
+          }
+
+          if(obj.useGoodsRang){
+            this.radio5 = '2'
+            this.getGoodsInfoByCoupon(id)
+          }else{
+            this.radio5 = '1'
+          }
+
+          this.setQuery = obj;
+        }
+      });
+    },
+    save() {
+      this.$refs.setQuery.validate((v) => {
+        if (v) {
+          let query = JSON.parse(JSON.stringify(this.setQuery));
+          if (this.radio2 == 1) {
+            delete query.claimCalmDay;
+            delete query.claimValidDay;
+          } else {
+            delete query.useStartTime;
+            delete query.useEndTime;
+          }
+          if (this.radio3 == 1) {
+            query.claimNum = 0;
+          }
+          if (this.radio4 == 1) {
+            query.claimUser = 0;
+          } else {
+            query.claimUser = query.claimUser.join();
+          }
+          if (query.showType.length == 2) {
+            query.showType = 3;
+          } else if (query.showType.length == 1) {
+            query.showType = query.showType[0];
+          } else if (!query.showType.length) {
+            delete query.showType;
+          }
+
+           if (this.radio5 == 2) {
+           query.useGoodsRang = this.tableData1.map(item=>item.goodsId).toString()
+          }else{
+           query.useGoodsRang = ''
+
+          }
+
+          if (!query.id) {
+            delete query.id;
+          }
+          this.loading = true;
+          saveOrUpdate(query).then((res) => {
+            this.loading = false;
+            if (res.state == "Success") {
+              this.$notify({
+                title: "成功",
+                message: "操作成功",
+                type: "success",
+              });
+
+              this.$router.push("/operationManage/couponManage/index");
+            }
+          });
+        }
+      });
+    },
+  },
+  created() {
+    this.mode = this.$route.query.mode || "add";
+    if (this.$route.query.id) {
+      this.getDetail(this.$route.query.id);
+    }
+    this.getSetMealNameAndId();
+    for (const key in this.goodsTypeObj) {
+        if (Object.hasOwnProperty.call(this.goodsTypeObj, key)) {
+            this.typeOptions.push({
+                label:this.goodsTypeObj[key],
+                value:key
+            })
+            
+        }
+    }
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.fullDiscountCoupon {
+    .icon{
+        width: 50px;
+        height: 50px;
+    }
+  .label {
+    font-size: 14px;
+    color: #606266;
+    height: 32px;
+    align-self: flex-start;
+    padding: 0 10px;
+  }
+  .flex {
+    display: flex;
+    align-items: center;
+    margin-bottom: 10px;
+  }
+  .notice {
+    font-size: 12px;
+    color: #aaa;
+    margin-top: 10px;
+  }
+  .btn-group {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+}
+</style>

+ 26 - 12
src/views/operationManage/couponManage/index.vue

@@ -3,7 +3,7 @@
   <div class="couponManage app-container">
 
     <div class="type-box">
-      <div class="type">
+      <!-- <div class="type">
         <div class="title">满减券</div>
         <div class="desc">例:满100元减20元 </div>
         <div class="desc">便于合理控制活动成本</div>
@@ -11,25 +11,25 @@
           class="add-btn"
           type="primary"
           size="small"
-          @click="handleAdd('/operationManage/couponManage/refuelCoupon')"
+          @click="handleAdd('/operationManage/couponManage/fullDiscountCoupon')"
         >
           立即添加
         </el-button>
       </div>
 
       <div class="type">
-        <div class="title">满减券</div>
+        <div class="title">折扣券</div>
         <div class="desc">例:满100元打8折</div>
         <div class="desc">便于合理控制活动成本</div>
          <el-button
           class="add-btn"
           type="primary"
           size="small"
-          @click="handleAdd(1)"
+          @click="handleAdd('/operationManage/couponManage/discountCoupon')"
         >
           立即添加
         </el-button>
-      </div>
+      </div> -->
 
       <div class="type">
         <div class="title">小桔加油券</div>
@@ -50,7 +50,7 @@
     <div class="search">
       <div>
         <el-input
-          v-model="query.shopNameOrPhoneNum"
+          v-model="query.couponName"
           size="small"
           placeholder="请输入优惠券名称"
           class="item-width-200"
@@ -65,7 +65,7 @@
           start-placeholder="开始日期"
           end-placeholder="结束日期">
         </el-date-picker>
-        <el-select
+        <!-- <el-select
           v-model="query.couponType"
           size="small"
           clearable
@@ -79,11 +79,12 @@
             :value="item.value"
           >
           </el-option>
-        </el-select>
+        </el-select> -->
         <el-select
           v-model="query.status"
           size="small"
           class="item-width-200 ml10"
+          clearable
           placeholder="请选择状态"
         >
           <el-option
@@ -221,7 +222,20 @@ export default {
   data() {
     return {
       tableData: [],
-      options: [],
+      options: [
+        {
+          value: "1",
+          label: "满减券",
+        },
+        {
+          value: "2",
+          label: "打折券",
+        },
+        {
+          value: "3",
+          label: "加油券",
+        },
+      ],
       options1: [
         {
           value: "1",
@@ -239,7 +253,7 @@ export default {
       loading: false,
       query: {
         couponName:'',
-        couponType: '',
+        couponType: 3,
         status:'',
         startTime:'',
         endTime:'',
@@ -306,9 +320,9 @@ export default {
     handleDetail(row,mode) {
       let url
       if(row.couponType == 1){
-        url = 'discountCoupon'
+        url = 'fullDiscountCoupon'
       }else if(row.couponType == 2){
-        url = ''
+        url = 'discountCoupon'
       }else if(row.couponType == 3){
         url = 'refuelCoupon'
       }

+ 98 - 10
src/views/operationManage/couponManage/refuelCoupon.vue

@@ -8,6 +8,26 @@
       :disabled="mode == 'detail'"
       v-loading="pageLoading"
     >
+     <el-form-item label="活动ID:" prop="activityXiaojuId">
+       <el-select v-model="setQuery.activityXiaojuId" size="small" class="item-width-300" placeholder="请选择活动">
+          <el-option
+            v-for="item in activityOptions"
+            :key="item.activityId"
+            :label="item.activityId"
+            :value="item.activityId">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="活动金额">
+       <el-select v-model="setQuery.activityXiaojuId" disabled size="small" class="item-width-300" placeholder="">
+          <el-option
+            v-for="item in activityOptions"
+            :key="item.activityId"
+            :label="item.residueMoney"
+            :value="item.activityId">
+          </el-option>
+        </el-select>
+      </el-form-item>
       <el-form-item label="优惠券名称:" prop="couponName">
         <el-input
           v-model="setQuery.couponName"
@@ -36,7 +56,7 @@
             <div class="flex">
             <el-form-item prop="couponDiscount">
                 <el-input
-                v-model.number="setQuery.couponDiscount"
+                v-model="setQuery.couponDiscount"
                 size="small"
                 class="item-width-200"
                 >
@@ -49,7 +69,7 @@
             <el-radio v-model="radio1" label="2">无门槛,立减</el-radio>
             <el-form-item prop="couponDiscount">
                 <el-input
-                v-model.number="setQuery.couponDiscount"
+                v-model="setQuery.couponDiscount"
                 size="small"
                 class="item-width-200"
                 >
@@ -140,12 +160,13 @@
           show-word-limit
         ></el-input>
       </el-form-item>
-      <el-form-item label="领取限制:" prop="claimNum">
+      <!-- <el-form-item label="领取限制:" prop="claimNum">
         <el-radio v-model="radio3" label="1">不限制</el-radio>
         <el-radio v-model="radio3" label="2">限制</el-radio>
-        <div v-if="radio == 2">
+        <div v-if="radio3 == 2">
           <el-input
             v-model.number="setQuery.claimNum"
+            type="number"
             size="small"
             class="item-width-300"
           >
@@ -162,13 +183,51 @@
             <el-checkbox :label="item.value" v-for="item in comboList" :key="item.value">{{item.label}}</el-checkbox>
           </el-checkbox-group>
         </div>
+      </el-form-item> -->
+
+       <!-- <el-form-item label="领取限制:" required >
+        <el-radio v-model="radio3" label="1">不限制</el-radio>
+        <el-radio v-model="radio3" label="2">限制</el-radio>
+          <el-form-item v-if="radio3 == 2" prop="claimNum">
+            <el-select v-model="setQuery.claimType"  size="small" class="item-width-300" placeholder="">
+            <el-option
+              v-for="item in typeOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value">
+            </el-option>
+          </el-select>
+          <el-input
+            v-model.number="setQuery.claimNum"
+            type="number"
+            size="small"
+            class="item-width-300"
+          >
+            <template slot="append">次</template>
+          </el-input>
+       </el-form-item>
+      </el-form-item>
+      <el-form-item label="领取用户限制:" required>
+        <el-radio v-model="radio4" label="1">不限制</el-radio>
+        <el-radio v-model="radio4" label="2">限制分类用户领取</el-radio>
+          <el-form-item v-if="radio4 == 2" prop="claimUser">
+          <el-checkbox-group v-model="setQuery.claimUser">
+            <el-checkbox label="99">非会员</el-checkbox>
+            <el-checkbox
+              :label="item.value"
+              v-for="item in comboList"
+              :key="item.value"
+              >{{ item.label }}</el-checkbox
+            >
+          </el-checkbox-group>
+      </el-form-item>
       </el-form-item>
       <el-form-item label="展示位置:" prop="showType">
         <el-checkbox-group v-model="setQuery.showType">
           <el-checkbox label="1">领取中心</el-checkbox>
           <el-checkbox label="2">店铺首页</el-checkbox>
         </el-checkbox-group>
-      </el-form-item>
+      </el-form-item> -->
     </el-form>
 
     <div class="btn-group">
@@ -182,15 +241,16 @@
 
 <script>
 import { getSetMealNameAndId } from "@/api/common";
-import {saveOrUpdate,detail} from '@/api/coupon'
+import {saveOrUpdate,detail} from '@/api/coupon';
+import { activityXiaojuList } from "@/api/marketing";
 export default {
   data() {
      
       var validateLimit = (rule, value, callback) => {
         if (value === '') {
-          callback(new Error('请输入'));
+          callback(new Error('请输入发放数量'));
         } else if(value>100000000||value<1) {
-          callback(new Error('应在~100000000之间'));
+          callback(new Error('应在1~100000000之间'));
         }else{
           callback();
         }
@@ -203,6 +263,8 @@ export default {
       radio3:'1',
       radio4:'1',
       setQuery: {
+        activityXiaojuId: "",
+        claimType:1,
         "claimCalmDay": 1,
         "claimNum": 0,
         "claimUser": [],
@@ -221,6 +283,17 @@ export default {
         "useStartTime": "",
         "usrDetail": ""
         },
+      activityOptions:[],
+      typeOptions:[
+        {
+          label:'每月',
+          value:1
+        },
+        {
+          label:'最多',
+          value:2
+        }
+      ],
       date:[],
       disabled:false,
       pickerOptions: {
@@ -229,6 +302,9 @@ export default {
           },
         },
       rules: {
+          activityXiaojuId: [
+            { required: true, message: '请选择活动', trigger: 'change' }
+          ],
           couponName: [
             { required: true, message: '请输入优惠券名称', trigger: 'blur' }
           ],
@@ -238,6 +314,10 @@ export default {
           limitNum: [
             { validator: validateLimit, trigger: 'blur' }
           ],
+          claimNum:[
+            { required: true, message: '请输入领取次数', trigger: 'blur' },
+             { type:'number',min: 1, max: 100, message: '领取限制:1~100次', trigger: 'blur' }
+          ]
         
       },
       comboList:[],
@@ -328,8 +408,8 @@ export default {
   },
   methods: {
     validateNum (rule, value, callback) {
-         if(value>100||value<1) {
-          callback(new Error('应在1~2000之间'));
+         if(value>200||value<1) {
+          callback(new Error('应在1~200之间'));
         }else{
           callback();
         }
@@ -453,6 +533,13 @@ export default {
         }
       });
     },
+    activityXiaojuList(){
+      activityXiaojuList().then(res=>{
+        if (res.state == "Success") {
+          this.activityOptions = res.content.records;
+        }
+      })
+    }
   },
   created () {
     this.mode = this.$route.query.mode || 'add'
@@ -460,6 +547,7 @@ export default {
       this.getDetail(this.$route.query.id)
     }
     this.getSetMealNameAndId();
+    this.activityXiaojuList();
   },
 };
 </script>

+ 470 - 0
src/views/operationManage/equitiesManage/addEquities.vue

@@ -0,0 +1,470 @@
+<template>
+  <div class="addEquities app-container" v-loading="loading1">
+    <el-form
+      :model="setQuery"
+      ref="setQuery"
+      :rules="rules"
+      label-width="230px"
+    >
+      <el-form-item label="权益名称:" prop="equityName">
+        <el-input
+          v-model="setQuery.equityName"
+          :maxlength="15"
+          class="item-width-300"
+        ></el-input>
+      </el-form-item>
+      <el-form-item label="权益图标:" prop="equityImg">
+        <Upload
+          type="equityImg"
+          id="equityImg"
+          width="250px"
+          height="150px"
+          uploadType="OTHER"
+          :imgUrl="setQuery.equityImg"
+          @uploadEnd="uploadEnd"
+        ></Upload>
+      </el-form-item>
+      <el-form-item label="权益描述:" prop="equityDetail">
+        <el-input
+          type="text"
+          placeholder="请输入权益描述"
+          v-model="setQuery.equityDetail"
+          class="item-width-500"
+        >
+        </el-input>
+      </el-form-item>
+
+      <template v-if="setQuery.equityType == 2">
+         <el-form-item label="权益说明:" prop="equityMsg">
+          <el-input
+            type="textarea"
+            placeholder="请输入权益说明"
+            v-model="setQuery.equityMsg"
+            :maxlength="400"
+            :rows="6"
+            class="item-width-500"
+            show-word-limit
+          >
+          </el-input>
+      </el-form-item>
+        <el-form-item label="关联服务:">
+        <el-radio-group v-model="setQuery.bindService" @input="changeService">
+          <!-- <el-radio :label="1">满减券</el-radio> -->
+          <el-radio :label="2">小桔加油券</el-radio>
+          <el-radio :label="3">品类权限</el-radio>
+        </el-radio-group>
+        </el-form-item>
+        <template v-if="setQuery.bindService !=3">
+          <el-form-item label="选择优惠券:" prop="bindContent">
+            <el-input
+            v-if="setQuery.bindContent"
+            v-model="couponName"
+            class="item-width-300"
+            disabled
+          ></el-input>
+          <el-button class="ml10" @click="handleChoose">{{setQuery.bindContent?'切换':'选择优惠券'}}</el-button>
+          </el-form-item>
+          <el-form-item label="限制核销后才能再次领取:">
+            <el-checkbox v-model="setQuery.getFlag" :true-label="1" :false-label="2" ></el-checkbox>
+          </el-form-item>
+          <el-form-item label="赠送数量:" prop="claimNum">
+            <div class="item">
+              <div class="label">限制每人</div>
+                <el-select v-model="setQuery.claimType" size="small" class="item-width-100" placeholder="">
+                <el-option
+                  v-for="item in typeOptions"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+              <div class="label">领取</div>
+              <el-input
+                  size="small"
+                  type="number"
+                  v-model.number="setQuery.claimNum"
+                  :maxlength="10"
+                  class="item-width-100"
+              >
+                <template slot="append">次</template>
+              </el-input>
+            </div>
+          </el-form-item>
+          
+        </template>
+        <el-form-item label="选择品类:" prop="bindContent" v-else>
+          <el-tree
+            v-loading="loadingTree"
+              :data="data"
+              :props="{
+                label: 'cateName',
+                children: 'child'
+              }"  
+              ref="tree"
+              node-key="id"
+              show-checkbox
+              @check-change="handleCheckChange">
+          </el-tree>
+        </el-form-item>
+      </template>
+
+     
+
+    </el-form>
+
+    <div class="btn-group">
+      <el-button>取 消</el-button>
+      <el-button type="primary" :loading="loading" @click="save"
+        >确 定</el-button
+      >
+    </div>
+
+    <el-dialog title="选择优惠券" width="70%" :visible.sync="dialogTableVisible">
+      
+      <div class="search">
+        <div>
+            <el-input
+            v-model="couponQuery.couponName"
+            size="small"
+            clearable
+            placeholder="请输入活动名称"
+            class="item-width-200 "
+            ></el-input>
+            
+            <el-button
+            class="ml10"
+            type="primary"
+            size="small"
+            icon="el-icon-search"
+            @click="handleSearch"
+        >
+            搜索
+        </el-button>
+        </div>
+    </div>
+        <el-table
+      :data="tableData"
+      tooltip-effect="dark"
+      border
+      v-loading="loading2"
+      style="width: 100%"
+    >
+      <el-table-column
+        align="center"
+        label="选择"
+        prop="setMealCode"
+        show-overflow-tooltip
+      >
+       <template slot-scope="scope">
+         <el-radio v-model="setQuery.bindContent" :label="scope.row.id" @input="selectCoupon(scope.row.couponName)"></el-radio>
+        </template>
+      </el-table-column>
+      <el-table-column
+        prop="couponName"
+        align="center"
+        label="优惠券名称"
+        show-overflow-tooltip
+      >
+      </el-table-column>
+      <el-table-column
+        prop="surplusNum"
+        align="center"
+        label="剩余数量"
+        show-overflow-tooltip
+      >
+      </el-table-column>
+      <el-table-column
+        prop="useNum"
+        align="center"
+        label="已使用"
+        show-overflow-tooltip
+      >
+      </el-table-column>
+      <el-table-column
+        prop="createTime"
+        align="center"
+        label="创建时间"
+        show-overflow-tooltip
+      >
+      </el-table-column>
+    </el-table>
+    <div class="page-box">
+      <el-pagination
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+        background
+        :current-page="couponQuery.currentPage"
+        :page-sizes="[10, 20, 30, 40]"
+        :page-size="couponQuery.pageSize"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="total"
+      >
+      </el-pagination>
+    </div>
+    </el-dialog>
+
+
+  </div>
+</template>
+
+<script>
+import { editEquity,getEquity } from "@/api/equity";
+import { getCouponList } from "@/api/coupon";
+import {getData} from '@/api/goods'
+import Upload from "@/components/Upload";
+
+export default {
+    components: {
+        Upload,
+    },
+  data() {
+    return {
+      couponName:'',
+      loading: false,
+      loading1: false,
+      loading2: false,
+      loadingTree: false,
+      dialogTableVisible: false,
+      tableData: [],
+      title: "",
+      total: 0,
+      data:[
+        // {
+        //   label: '一级 1',
+        //   children: [{
+        //     label: '二级 1-1',
+        //     children: [{
+        //       label: '三级 1-1-1'
+        //     }]
+        //   }]
+        // }, {
+        //   label: '一级 2',
+        //   children: [{
+        //     label: '二级 2-1',
+        //     children: [{
+        //       label: '三级 2-1-1'
+        //     }]
+        //   }, {
+        //     label: '二级 2-2',
+        //     children: [{
+        //       label: '三级 2-2-1'
+        //     }]
+        //   }]
+        // }
+        ],
+        typeOptions:[
+        {
+          label:'每月',
+          value:1
+        },
+        {
+          label:'最多',
+          value:2
+        }
+      ],
+      setQuery: {
+        claimType: 1,
+        claimNum:1,
+        getFlag:1,
+        "setMealCode":'',
+        "bindContent": "",
+        "bindService": 2,
+        "equityDetail": "",
+        "equityImg": "",
+        "equityName": "",
+        "equityType": 0,
+        "givenNum": 1,
+        "showType": 1,
+        "status": 1
+      },
+      couponQuery: {
+         couponName:'',
+        startTime:'',
+        endTime:'',
+        couponType: '',
+        status:'2',
+        currentPage: 1,
+        pageSize: 10,
+      },
+    };
+  },
+  computed: {
+    rules() {
+      if(this.setQuery.equityType == 2){
+
+        return  {
+        equityName: [
+          { required: true, message: "请输入权益名称", trigger: "blur" },
+        ],
+        equityImg: [
+          { required: true, message: "请上传权益图片", trigger: "change" },
+        ],
+        equityDetail: [
+          { required: true, message: "请输入权益描述", trigger: "blur" },
+        ],
+        equityMsg: [
+          { required: true, message: "请输入权益说明", trigger: "blur" },
+        ],
+         bindContent: [
+          { required: true, message: "请选择", trigger: "change" },
+        ],
+        claimNum: [
+          { required: true, message: "请选择", trigger: "blur" },
+          { type:'number',min:1, message: "最小数量为1", trigger: "blur" },
+        ],
+      }
+      }else{
+          return  {
+        equityName: [
+          { required: true, message: "请输入权益名称", trigger: "blur" },
+        ],
+        equityImg: [
+          { required: true, message: "请上传权益图片", trigger: "change" },
+        ],
+        equityDetail: [
+          { required: true, message: "请输入权益描述", trigger: "blur" },
+        ],
+      }
+      }
+    }
+  },
+  watch: {
+    'setQuery.bindService'(val) {
+      if(val==3&&!this.data.length){
+        this.getData()
+      }
+    }
+  },
+  methods: {
+    handleSearch(){
+      this.couponQuery.currentPage = 1
+      this.getCouponList();
+    },
+    selectCoupon(name){
+      this.couponName = name
+    },
+    changeService(){
+      this.setQuery.bindContent = ''
+    },
+    // 选择优惠券
+    handleChoose(){
+      this.dialogTableVisible = true
+      this.couponQuery.currentPage = 1
+      this.getCouponList()
+    },
+    handleCheckChange(val,ischecked){
+      if(ischecked){
+        this.$nextTick(()=>{
+          this.$refs.setQuery.clearValidate('bindContent')
+        })
+      }
+    },
+    handleSizeChange(val) {
+      this.couponQuery.currentPage = 1;
+      this.couponQuery.pageSize = val;
+      this.getCouponList()
+    },
+    handleCurrentChange(val) {
+      this.couponQuery.currentPage = val;
+      this.getCouponList()
+    },
+    uploadEnd(val) {
+      this.setQuery[val.type] = val.url;
+    },
+    save() {
+      let setQuery = JSON.parse(JSON.stringify(this.setQuery))
+      
+      if(this.setQuery.bindService==3){
+        this.setQuery.bindContent = this.$refs.tree.getCheckedKeys().join()
+      }
+      this.$refs.setQuery.validate((v) => {
+    if (v) {
+          this.loading = true;
+          editEquity(this.setQuery).then((res) => {
+            this.loading = false;
+            if (res.state == "Success") {
+              this.$notify({
+                title: "成功",
+                message: "操作成功",
+                type: "success",
+              });
+               this.$router.push({
+                path:"/operationManage/equitiesManage/index",
+                query:{
+                  id:this.setQuery.setMealCode
+                }
+              });
+            }
+          });
+        }
+      });
+    },
+    getDetail(){
+       this.loading1 = true
+      getEquity({equityId:this.$route.query.id}).then((res) => {
+        this.loading1 = false
+        if (res.state == "Success") {
+            this.setQuery = res.content
+            if(this.setQuery.bindService == 3){
+              this.$nextTick(()=>{
+
+                this.$refs.tree.setCheckedKeys(this.setQuery.bindContent.split(','))
+              })
+            }else{
+              this.couponName = this.setQuery.couponName
+            }
+         
+        }
+      });
+    },
+    getCouponList(){
+      this.couponQuery.couponType = this.setQuery.bindService == 1?1:3
+      this.loading2 = true
+      getCouponList(this.couponQuery).then((res) => {
+          this.loading2 = false;
+          if (res.state == "Success") {
+            this.tableData = res.content.records;
+            this.total = res.content.total;
+          }
+        });
+    },
+    getData(){
+      this.loadingTree=true
+      getData().then(res=>{
+          this.loadingTree=false
+          if (res.state == "Success") {
+            this.data = res.content
+          }
+      })
+    }
+  },
+  created () {
+    this.setQuery.equityType = this.$route.query.equityType
+    this.setQuery.setMealCode = this.$route.query.setMealCode
+    if(this.$route.query.id){
+      this.getDetail()
+    }
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.addEquities {
+  padding-bottom: 40px;
+  .btn-group {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+  .item{
+    display: flex;
+    align-items: center;
+    .label{
+      color: #606266;
+      font-size: 14px;
+      padding: 0 10px;
+    }
+
+  }
+}
+</style>

+ 291 - 0
src/views/operationManage/equitiesManage/index.vue

@@ -0,0 +1,291 @@
+<!--
+ * @Author: wenjie 1454560336@qq.com
+ * @Date: 2024-07-11 13:51:26
+ * @LastEditors: wenjie 1454560336@qq.com
+ * @LastEditTime: 2024-07-24 18:15:43
+ * @FilePath: \admin-manage\src\views\operationManage\equitiesManage\index.vue
+ * @Description: 
+ * 
+ * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. 
+-->
+
+<template>
+  <div class="equitiesManage app-container">
+    <el-tabs v-model="query.equityType">
+    <el-tab-pane label="基础权益" name="1"></el-tab-pane>
+    <el-tab-pane label="专属权益" name="2"></el-tab-pane>
+  </el-tabs>
+    <div class="search">
+      <el-button class="add-btn" type="primary" size="small" @click="handleAdd"
+        >添加</el-button
+      >
+    </div>
+
+    <el-table
+      :data="tableData"
+      tooltip-effect="dark"
+      border
+      v-loading="loading"
+      style="width: 100%"
+    >
+      <el-table-column
+        prop="equityName"
+        align="center"
+        label="权益名称"
+        show-overflow-tooltip
+      >
+      </el-table-column>
+      <el-table-column
+        prop="setMealDetail"
+        align="center"
+        label="权益图标"
+        show-overflow-tooltip
+      >
+       <template slot-scope="scope">
+          <img class="icon" :src="scope.row.equityImg" alt="">
+        </template>
+      </el-table-column>
+      <el-table-column
+        prop="equityDetail"
+        align="center"
+        label="权益描述"
+        show-overflow-tooltip
+      >
+      </el-table-column>
+      <el-table-column
+        prop="createTime"
+        align="center"
+        label="创建时间"
+        show-overflow-tooltip
+      >
+      </el-table-column>
+       <el-table-column
+        prop="createTime"
+        align="center"
+        label="是否显示在用户端"
+        show-overflow-tooltip
+      >
+       <template slot-scope="scope">
+          <span :class="[scope.row.showType == 1?'green':'red']">{{ scope.row.showType == 1 ? "展示" : "不展示"}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column
+        prop="createTime"
+        align="center"
+        label="状态"
+        v-if="query.equityType == 2"
+        show-overflow-tooltip
+      >
+        <template slot-scope="scope">
+          <span :class="[scope.row.status == 1?'green':'red']">{{ scope.row.status == 1 ? "启用" : "禁用"}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column align="center" label="操作">
+        <template slot-scope="scope">
+          <el-button
+            type="text"
+            size="small"
+            v-if="query.equityType == 2"
+            @click="handle(scope.row)"
+            >{{ scope.row.status == 1 ? "禁用" : "启用" }}</el-button
+          >
+          <el-button
+            type="text"
+            size="small"
+            @click="handleShow(scope.row)"
+            >{{ scope.row.showType == 1 ? "不展示" : "展示" }}</el-button
+          >
+
+          <el-button type="text" size="small" @click="handleEdit(scope.row.id)"
+            >修改</el-button
+          >
+          <el-button type="text" size="small" @click="handleDel(scope.row.id)"
+            >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="page-box">
+      <el-pagination
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+        background
+        :current-page="query.currentPage"
+        :page-sizes="[10, 20, 30, 40]"
+        :page-size="query.pageSize"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="total"
+      >
+      </el-pagination>
+    </div>
+  </div>
+</template>
+  
+  <script>
+import { debounce } from "@/utils/index";
+import { equityList,enableEquity,delEquity,showEquity } from "@/api/equity";
+export default {
+  name: "equitiesManage",
+  data() {
+    return {
+      options: [
+        {
+          value: "0",
+          label: "全部状态",
+        },
+        {
+          value: "1",
+          label: "已完成",
+        },
+        {
+          value: "2",
+          label: "进行中",
+        },
+        {
+          value: "3",
+          label: "失败",
+        },
+      ],
+      tableData: [],
+      loading: false,
+      query: {
+        setMealCode:'',
+        equityName:'',
+        equityType:'1',
+        status:'',
+        currentPage: 1,
+        pageSize: 10,
+      },
+      title: "",
+      total: 0,
+    };
+  },
+  watch: {
+    'query.equityType'(newValue) {
+      this.query.currentPage =1
+      this.getList()
+    }
+  },
+  methods: {
+
+    handle(row){
+       this.$confirm(`此操作将${row.status == 1?'禁用':'启用'}该条数据, 是否继续?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          enableEquity({equityId:row.id,status:row.status == 1?2:1}).then(res=>{
+            if (res.state == "Success") {
+              this.$notify({
+                title: '提示',
+                message: '操作成功',
+                type: 'success'
+              });
+              this.getList()
+            }
+          })
+         
+        })
+      
+    },
+    handleShow(row){
+       this.$confirm(`此操作将${row.showType == 1?'不展示':'展示'}该条数据, 是否继续?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          showEquity({equityId:row.id,showType:row.showType == 1?2:1}).then(res=>{
+            if (res.state == "Success") {
+              this.$notify({
+                title: '提示',
+                message: '操作成功',
+                type: 'success'
+              });
+              this.getList()
+            }
+          })
+         
+        })
+      
+    },
+    handleEdit(id){
+      this.$router.push({
+        path:"/operationManage/equitiesManage/addEquities",
+        query:{
+          id,
+          equityType:this.query.equityType,
+          setMealCode:this.$route.query.id
+        }
+      });
+    },
+    handleAdd() {
+      this.$router.push({
+        path:"/operationManage/equitiesManage/addEquities",
+        query:{
+          equityType:this.query.equityType,
+          setMealCode:this.$route.query.id
+
+        }
+      });
+    },
+    handleDel(equityId) {
+      
+      this.$confirm(`此操作将永久删除该条数据, 是否继续?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          delEquity({equityId}).then(res=>{
+            if (res.state == "Success") {
+              this.$notify({
+                title: '提示',
+                message: '操作成功',
+                type: 'success'
+              });
+              this.getList()
+            }
+          })
+         
+        })
+    },
+    handleSizeChange(val) {
+      this.query.currentPage = 1;
+      this.query.pageSize = val;
+      this.getList();
+    },
+    handleCurrentChange(val) {
+      this.query.currentPage = val;
+      this.getList();
+    },
+
+    search() {
+      this.query.currentPage = 1;
+      this.getList();
+    },
+    getList() {
+      this.loading = true
+      equityList(this.query).then((res) => {
+        this.loading = false
+        if (res.state == "Success") {
+          this.tableData = res.content.records;
+          this.total = res.content.total
+        }
+      });
+    },
+  },
+  created() {
+    this.query.setMealCode = this.$route.query.id
+    this.getList();
+  },
+};
+</script>
+  
+<style lang="scss" >
+.equitiesManage {
+    .icon{
+        width: 70px;
+        height: 70px;
+    }
+}
+</style>
+  

+ 56 - 49
src/views/operationManage/financeManage/withdraw.vue

@@ -44,55 +44,58 @@
 
     </div>
     <div class="right">
-      {{query.channel | filterName(that)}}
+       <el-select
+            v-model="query.channel"
+            size="small"
+            class="item-width-200 ml10"
+            placeholder="请选择"
+          >
+            <el-option
+              v-for="item in options"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
     </div>
    </div>
    
      <div class="search">
-        <el-input
-          v-model="query.noOrGName"
-          size="small"
-          placeholder="请输入订单编号"
-          class="item-width-200 "
-        ></el-input>
+      <div>
 
-         <el-select
-          v-model="query.channel"
-          size="small"
-          class="item-width-200 ml10"
-          placeholder="请选择"
-        >
-          <el-option
-            v-for="item in options"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value"
-          >
-          </el-option>
-        </el-select>
+          <el-input
+            v-model="query.noOrGName"
+            size="small"
+            placeholder="请输入订单编号"
+            class="item-width-200 "
+          ></el-input>
+
+         
 
-        <el-date-picker
+          <el-date-picker
+            size="small"
+          v-model="date"
+          value-format="timestamp"
+          class="item-width-400 ml10"
+          type="daterange"
+          :default-time="['00:00:00','23:59:59']"
+          :picker-options="pickerOptions"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          align="right">
+      </el-date-picker>
+      <el-button
+          class="ml10"
+          type="primary"
           size="small"
-        v-model="date"
-        value-format="timestamp"
-        class="item-width-400 ml10"
-        type="daterange"
-        :default-time="['00:00:00','23:59:59']"
-        :picker-options="pickerOptions"
-        range-separator="至"
-        start-placeholder="开始日期"
-        end-placeholder="结束日期"
-        align="right">
-    </el-date-picker>
-    <el-button
-        class="ml10"
-        type="primary"
-        size="small"
-        icon="el-icon-search"
-        @click="handleSearch"
-      >
-        搜索
-      </el-button>
+          icon="el-icon-search"
+          @click="handleSearch"
+        >
+          搜索
+        </el-button>
+      </div>
     </div>
 
     <el-table
@@ -199,16 +202,16 @@
         >
         </el-table-column>
         <el-table-column
-            prop="Amount"
+            prop="amount"
             align="center"
             label="金额"
             show-overflow-tooltip
         >
         <template slot-scope="scope">
-            <span class="green"> +{{scope.row.Amount}}</span>
+            <span class="green"> +{{scope.row.amount}}</span>
             </template>
         </el-table-column>
-        <el-table-column
+        <!-- <el-table-column
             prop="createTime"
             align="center"
             label="状态"
@@ -217,7 +220,7 @@
         <template slot-scope="scope">
             {{scope.row.transferAll?'交易成功':'交易未完成'}}
             </template>
-        </el-table-column>
+        </el-table-column> -->
         </el-table>
         <div class="page-box">
         <el-pagination
@@ -269,6 +272,7 @@ export default {
         size: 10,
       },
        query1: {
+        channel:"",
         page: 1,
         size: 10,
       },
@@ -358,10 +362,11 @@ export default {
           type: 'warning'
         }).then(() => {
              this.btnLoading = true
-            withdrawals().then(res=>{
+            withdrawals({channel:this.query.channel}).then(res=>{
                 this.btnLoading = false
                 if(res.state == 'Success'){
-                this.dialogFormVisible = true
+                this.dialogFormVisible = false
+                this.handleSearch()
                  this.$notify({
                     title: "成功",
                     message: "操作成功",
@@ -405,7 +410,9 @@ export default {
     withdrawList(){
       this.loading1 = true
       let obj = JSON.parse(JSON.stringify(this.query1))
-      // --obj.page
+      obj.channel = this.query.channel
+      obj.shopId = this.query.channel
+      --obj.page
       withdrawList(obj).then(res=>{
         this.loading1 = false
         if(res.state == 'Success'){

+ 41 - 2
src/views/operationManage/goodsManage/goodsDetail.vue

@@ -2,7 +2,7 @@
  * @Author: wj 1454560336@qq.com
  * @Date: 2023-11-24 14:39:54
  * @LastEditors: wenjie 1454560336@qq.com
- * @LastEditTime: 2024-04-16 10:26:52
+ * @LastEditTime: 2024-07-30 16:52:31
  * @FilePath: \admin-manage\src\views\operationManage\goodsManage\goodsDetail.vue
  * @Description: 
  * 
@@ -105,6 +105,13 @@
               @uploadEnd="uploadEnd"
             ></Upload>
           </el-form-item>
+           <!-- <el-form-item label="退款服务:">
+            <el-radio-group v-model="setQuery.refundType">
+              <el-radio :label="1">自动退款</el-radio>
+              <el-radio :label="3">人工审核退款</el-radio>
+              <el-radio :label="2">不支持退款</el-radio>
+            </el-radio-group>
+          </el-form-item> -->
         </el-tab-pane>
 
         <el-tab-pane label="商品规格" name="商品规格">
@@ -358,6 +365,20 @@
               </el-option>
             </el-select>
           </el-form-item>
+          <template v-if="mode == 'audit'">
+           <el-form-item label="价格标签:">
+            <el-radio-group  v-model="showGoodsLabel">
+              <el-radio :label="1">展示标签</el-radio>
+              <el-radio :label="2">不展示标签</el-radio>
+            </el-radio-group>
+            <div v-if="showGoodsLabel == 1">
+               <el-radio-group  v-model="labelId">
+                <el-radio v-for="item in labelList" :key="item.id" :label="item.id">{{item.labelName}}</el-radio>
+              </el-radio-group>
+            </div>
+          </el-form-item>
+          </template>
+
            <el-form-item v-if="mode == 'audit'" label="审核意见:" prop="checkDetail">
             <el-input
               type="textarea"
@@ -388,7 +409,8 @@
 </template>
 
 <script>
-import { goodsSet, detail, getData,check } from "@/api/goods";
+import { goodsSet, detail, getData,check,getLabelList } from "@/api/goods";
+
 import {getRuleList } from "@/api/rule";
 import { requestUploadImg, finishUploadImg,getSetMealNameAndId } from "@/api/common";
 import Upload from "@/components/Upload";
@@ -404,6 +426,9 @@ export default Vue.extend({
   data() {
     return {
       that:this,
+      showGoodsLabel:1,
+      labelId:0,//标签id
+      labelList:[],//标签列表
       activeName: "基本信息",
       editor: null,
       editorMode: "default", // or 'simple'
@@ -501,6 +526,7 @@ export default Vue.extend({
         withdrawalRate:0,
         shareId:'',
         goodsSets:[],
+        refundType:1
       },
       rules: {
         taxRate: [
@@ -695,6 +721,7 @@ export default Vue.extend({
       check({ 
             "goodsId":this.$route.query.id,
             "applyState": applyState,
+            "labelId":this.showGoodsLabel == 1? this.labelId:null,
             "checkDetail": this.setQuery.checkDetail,
             "checkUserId": localStorage.getItem('epid'),
             }).then(res=>{
@@ -777,6 +804,7 @@ export default Vue.extend({
         this.loading = false;
         if (res.state == "Success") {
           this.setQuery = res.content;
+          this.labelId = Number(res.content.goodsLabelId) || this.labelList[0].id
           this.setQuery.goodsCateId = Number(this.setQuery.goodsCateId);
             // 初始化购买设置
             if (!this.setQuery.goodsSets.length) {
@@ -793,6 +821,16 @@ export default Vue.extend({
         }
       });
     },
+    // 获取标签列表
+    getLabelList(){
+      getLabelList({
+        currentPage: 1,
+        pageSize: 99,}).then(res=>{
+        if(res.state == 'Success'){
+          this.labelList = res.content.records
+        }
+      })
+    },
   },
   created() {
     this.options = []
@@ -807,6 +845,7 @@ export default Vue.extend({
     }
     this.getRuleList()
     this.getData();
+    this.getLabelList()
     this.mode = this.$route.query.mode || "add";
     this.getSetMealNameAndId().then(() => {
       if (this.$route.query.id) {

+ 33 - 4
src/views/operationManage/goodsManage/index.vue

@@ -1,6 +1,35 @@
 
 <template>
   <div class="goodsList app-container">
+
+    <div class="search">
+      <div>
+        <el-input
+          v-model="query.goodsName"
+          size="small"
+          placeholder="请输入商品名称"
+          class="item-width-200 "
+        ></el-input>
+
+        <el-input
+          v-model="query.shopId"
+          size="small"
+          placeholder="请输入店铺ID"
+          class="item-width-200 ml10"
+        ></el-input>
+       
+        <el-button
+        class="ml10"
+        type="primary"
+        size="small"
+        icon="el-icon-search"
+        @click="handleSearch"
+      >
+        搜索
+      </el-button>
+      </div>
+    </div>
+
    <el-tabs v-model="activeName">
     <el-tab-pane label="上架商品" name="上架商品"></el-tab-pane>
     <el-tab-pane label="待审核商品" name="待审核商品"></el-tab-pane>
@@ -191,6 +220,10 @@ export default {
     }
   },
   methods: {
+    handleSearch(){
+      this.query.currentPage = 1;
+      this.goodsList()
+    },
     handleDetail(row,mode){
       this.$router.push({
         path:'/operationManage/goodsManage/goodsDetail',
@@ -241,10 +274,6 @@ export default {
 
     },
 
-    search() {
-      this.query.currentPage = 1;
-      this.goodsList()
-    },
     goodsList(){
       this.loading = true
       goodsList(this.query).then(res=>{

+ 261 - 0
src/views/operationManage/goodsManage/labelList.vue

@@ -0,0 +1,261 @@
+
+<template>
+  <div class="labelList app-container">
+   <div class="search">
+      <div>
+        <el-input
+          v-model="query.labelName"
+          size="small"
+          placeholder="请输入名称"
+          class="item-width-200 "
+        ></el-input>
+         <el-button
+        class="ml10"
+        type="primary"
+        size="small"
+         icon="el-icon-search"
+        @click="handleSearch"
+      >
+        搜索
+      </el-button>
+        <!-- <el-select
+          v-model="query.columnId"
+          size="small"
+          clearable
+          class="item-width-200 ml10"
+          placeholder="请选择栏目"
+        >
+          <el-option
+            v-for="item in options"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select> -->
+      </div>
+      <el-button class="add-btn" type="primary" size="small" @click="handleAdd"
+        >添加</el-button
+      >
+    </div>
+
+    <el-table
+      :data="tableData"
+      tooltip-effect="dark"
+      border
+      v-loading="loading"
+      style="width: 100%"
+    >
+ 
+      <el-table-column
+        prop="labelName"
+        align="center"
+        label="标签名称"
+        show-overflow-tooltip
+      >
+      </el-table-column>
+      
+      <el-table-column
+        prop="createTime"
+        align="center"
+        label="创建时间"
+        show-overflow-tooltip
+      >
+      </el-table-column>
+
+      <el-table-column prop="address" align="center" label="操作">
+        <template slot-scope="scope">
+          <el-button type="text" size="small" @click="handleEdit(scope.row)">编辑</el-button>
+          <el-button type="text" size="small" @click="handleDel(scope.row.id)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="page-box">
+      <el-pagination
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+        background
+        :current-page="query.currentPage"
+        :page-sizes="[10, 20, 30, 40]"
+        :page-size="query.pageSize"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="total"
+      >
+      </el-pagination>
+    </div>
+
+    <el-dialog :title="title" :visible.sync="dialogFormVisible" width="530px">
+       <el-form
+        :model="setQuery"
+        ref="setQuery"
+        :rules="rules"
+        label-width="130px"
+        >
+        <el-form-item label="标签名称:" prop="labelName">
+            <el-input
+            v-model="setQuery.labelName"
+            :maxlength="6"
+            class="item-width-300"
+            ></el-input>
+        </el-form-item>
+        </el-form>
+         <div class="btn-group">
+            <el-button @click="cancle">取 消</el-button>
+            <el-button type="primary" :loading="btnLoading"  @click="save">确 定</el-button>
+        </div>
+    </el-dialog>
+
+
+  </div>
+</template>
+  
+  <script>
+import { debounce } from "@/utils/index";
+import {getLabelList,delLabel,addOrUpdateLabel} from '@/api/goods';
+export default {
+  name: "labelList",
+  data() {
+    return {
+        dialogFormVisible:false,
+      tableData: [],
+      options:[],
+      loading: false,
+      btnLoading: false,
+      query: {
+        // labelType: '',
+        labelName: "",
+        currentPage: 1,
+        pageSize: 10,
+      },
+      title: "",
+      total: 0,
+      setQuery:{
+        "id": 0,
+        "labelName": "",
+        "labelType": ''
+      },
+      rules: {
+        labelName: [{ required: true, message: "请输入标签名称", trigger: "blur" }],
+      },
+    };
+  },
+  // watch: {
+  //   query: {
+  //     handler: debounce(function (val) {
+  //       this.getList()
+  //     }),
+  //     deep: true,
+  //   },
+  // },
+  methods: {
+    handleSearch(){
+      this.query.currentPage = 1
+      this.getList();
+
+    },
+    handleEdit(row){
+     this.dialogFormVisible = true
+     this.title = '编辑标签'
+      this.setQuery ={
+        "id": row.id,
+        "labelName": row.labelName,
+        // "labelType": row.labelType
+      }
+    },
+    handleAdd(){
+     this.dialogFormVisible = true
+     this.title = '添加标签'
+     this.setQuery ={
+        "id": 0,
+        "labelName": "",
+        // "labelType": 0
+      }
+    
+    },
+    // 点击删除
+    handleDel(id) {
+       this.$confirm(`此操作将删除该数据, 是否继续?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          delLabel({id}).then(res=>{
+            if(res.state == 'Success'){
+               this.$notify({
+                title: '成功',
+                message: '操作成功',
+                type: 'success'
+              });
+              this.getList()
+            }
+          })
+        })
+    },
+    handleSizeChange(val) {
+      this.query.currentPage = 1;
+      this.query.pageSize = val;
+    this.getList()
+    },
+    handleCurrentChange(val) {
+      this.query.currentPage = val;
+    this.getList()
+    },
+    getList(){
+      this.loading = true
+      getLabelList(this.query).then(res=>{
+        this.loading = false
+        if(res.state == 'Success'){
+          this.tableData = res.content.records
+          this.total = res.content.total
+        }
+      })
+    },
+    cancle(){
+         this.dialogFormVisible = false
+
+    },
+    save() {
+      this.$refs.setQuery.validate((v) => {
+        if (v) {
+          this.btnLoading = true
+         
+          addOrUpdateLabel(this.setQuery).then(res=>{
+            this.btnLoading = false
+            if(res.state == 'Success'){
+                this.dialogFormVisible = false
+                this.$notify({
+                  title: '成功',
+                  message: '操作成功',
+                  type: 'success'
+                });
+               this.handleSearch()
+            }
+          })
+              
+        }
+      });
+    },
+  },
+  created() {
+    this.getList()
+  },
+};
+</script>
+  
+<style lang="scss" scoped>
+.labelList {
+  .search{
+    justify-content: space-between;
+  }
+  .icon{
+    width: 80px;
+    height: 80px;
+  }
+   .btn-group{
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+}
+</style>
+  

+ 1 - 0
src/views/operationManage/goodsType/addGoodsType.vue

@@ -18,6 +18,7 @@
         <el-input
         type="number"
           v-model.number="setQuery.sort"
+          :maxlength="5"
           class="item-width-300"
         ></el-input>
       </el-form-item>

+ 293 - 0
src/views/operationManage/marketingManage/index.vue

@@ -0,0 +1,293 @@
+
+<template>
+  <div class="marketing app-container">
+     <div class="search">
+      <div>
+
+        <el-input
+          v-model="query.key"
+          size="small"
+          placeholder="请输入ID或活动名称"
+          clearable
+          class="item-width-200 "
+        ></el-input>
+        <el-button
+        class="ml10"
+        type="primary"
+        size="small"
+        icon="el-icon-search"
+        @click="handleSearch"
+      >
+        搜索
+      </el-button>
+      </div>
+       <el-button class="add-btn" type="primary" size="small" @click="handleAdd"
+        >添加</el-button
+      >
+    </div>
+
+    <el-table
+      :data="tableData"
+      tooltip-effect="dark"
+      border
+      v-loading="loading"
+      style="width: 100%"
+    >
+     <el-table-column
+        align="center"
+        label="活动ID"
+        prop="activityId"
+        show-overflow-tooltip
+      >
+      </el-table-column>
+      <el-table-column
+        align="center"
+        label="活动金额"
+        prop="activityMoney"
+        show-overflow-tooltip
+      >
+      </el-table-column>
+       <el-table-column
+        align="center"
+        label="剩余金额"
+        prop="residueMoney"
+        show-overflow-tooltip
+      >
+      </el-table-column>
+       <el-table-column
+        align="center"
+        label="活动内容"
+        prop="activityContent"
+        show-overflow-tooltip
+      >
+      </el-table-column>
+       <el-table-column
+        align="center"
+        label="创建时间"
+        prop="communityName"
+        show-overflow-tooltip
+      >
+      </el-table-column>
+
+      <el-table-column align="center" label="操作">
+        <template slot-scope="scope">
+          <el-button type="text" size="small" @click="handleEdit(scope.row)"
+            >编辑</el-button
+          >
+          <el-button type="text" size="small" @click="handleDel(scope.row.id)"
+            >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="page-box">
+      <el-pagination
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+        background
+        :current-page="query.currentPage"
+        :page-sizes="[10, 20, 30, 40]"
+        :page-size="query.pageSize"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="total"
+      >
+      </el-pagination>
+    </div>
+
+    <el-dialog :title="title" width="550px" :visible.sync="dialogFormVisible">
+    <el-form label-width="130px" :model="setQuery"
+      ref="setQuery"
+      :rules="rules">
+        <el-form-item label="活动ID"  prop="activityId">
+            <el-input
+            v-model="setQuery.activityId"
+            class="item-width-300"
+            ></el-input>
+        </el-form-item>
+         <el-form-item label="活动金额"  prop="activityMoney">
+            <el-input
+            v-model.number="setQuery.activityMoney"
+            class="item-width-300"
+            ></el-input>
+        </el-form-item>
+         <el-form-item label="活动有效期"  prop="startTime">
+            <el-date-picker
+            v-model="date"
+            size="small"
+            class="item-width-350 ml10"
+            value-format="yyyy-MM-dd hh:mm:ss"
+            type="datetimerange"
+            range-separator="至"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期">
+            </el-date-picker>
+        </el-form-item>
+         <el-form-item label="活动内容"  prop="activityContent">
+            <el-input
+            v-model.number="setQuery.activityContent"
+            class="item-width-300"
+            ></el-input>
+        </el-form-item>
+    </el-form>
+  <div slot="footer" class="dialog-footer">
+    <el-button @click="dialogFormVisible = false">取 消</el-button>
+    <el-button type="primary" :loading="btnLoading" @click="save">确 定</el-button>
+  </div>
+</el-dialog>
+
+
+  </div>
+</template>
+  
+  <script>
+import { debounce } from "@/utils/index";
+import { activityXiaojuList,delActivityXiaoju,addOrUpdateActivityXiaoju } from "@/api/marketing";
+export default {
+  name: "marketing",
+  data() {
+    return {
+      date:'',
+      title:'',
+      tableData: [],
+      loading: false,
+      btnLoading: false,
+      dialogFormVisible: false,
+      query: {
+        key:'',
+        currentPage: 1,
+        pageSize: 10,
+      },
+      total: 0,
+      setQuery:{
+        "activityContent": "",
+        "activityId": "",
+        "activityMoney": 0,
+        "endTime": "",
+        "id": 0,
+        "startTime": ""
+      },
+      rules:{
+         activityId: [{ required: true, message: "请输入活动ID", trigger: "blur" }],
+         activityMoney: [{ required: true, message: "请输入活动金额", trigger: "blur" }],
+         startTime: [{ required: true, message: "请选择活动时间", trigger: "change" }],
+      }
+    };
+  },
+  watch: {
+
+     date(val){
+      if(val){
+        this.setQuery.startTime = val[0]
+        this.setQuery.endTime = val[1]
+      }else{
+        this.setQuery.startTime = ''
+        this.setQuery.endTime = ''
+      }
+    },
+  },
+  methods: {
+    handleSearch(){
+        this.query.currentPage = 1;
+        this.getList();
+    },
+    handleEdit(row){
+        this.title = '编辑'
+      this.dialogFormVisible = true
+      this.setQuery = {
+        "activityContent": row.activityContent,
+        "activityId": row.activityId,
+        "activityMoney": row.activityMoney,
+        "endTime": row.endTime,
+        "startTime": row.startTime,
+        "id":row.id
+      }
+      this.date = [row.startTime, row.endTime]
+    },
+    handleAdd() {
+        this.title = '添加'
+      this.dialogFormVisible = true
+      this.setQuery = {
+        "activityContent": "",
+        "activityId": "",
+        "activityMoney": 0,
+        "endTime": "",
+        "startTime": ""
+      }
+    },
+    // 删除
+     handleDel(id) {
+       this.$confirm(`此操作将删除该数据, 是否继续?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          delActivityXiaoju({id}).then(res=>{
+            if(res.state == 'Success'){
+               this.$notify({
+                title: '成功',
+                message: '操作成功',
+                type: 'success'
+              });
+              this.getList()
+            }
+          })
+        })
+    },
+    handleSizeChange(val) {
+      this.query.currentPage = 1;
+      this.query.pageSize = val;
+      this.getList();
+    },
+    handleCurrentChange(val) {
+      this.query.currentPage = val;
+      this.getList();
+    },
+
+    search() {
+      this.query.currentPage = 1;
+      this.getList();
+    },
+    getList() {
+      this.loading = true
+      activityXiaojuList(this.query).then((res) => {
+        this.loading = false
+        if (res.state == "Success") {
+          this.tableData = res.content.records;
+          this.total = res.content.total
+        }
+      });
+    },
+    save(){
+        this.$refs.setQuery.validate((v) => {
+        if (v) {
+          this.btnLoading = true
+          addOrUpdateActivityXiaoju(this.setQuery).then(res=>{
+            this.btnLoading = false
+            if(res.state == 'Success'){
+                this.dialogFormVisible = false
+              this.$notify({
+                  title: '成功',
+                  message: '操作成功',
+                  type: 'success'
+                });
+                this.query.currentPage = 1
+                this.getList();
+
+            }
+          })
+              
+        }
+      });
+    }
+  },
+  created() {
+    this.getList();
+  },
+};
+</script>
+  
+<style lang="scss" >
+.marketing {
+}
+</style>
+  

+ 49 - 27
src/views/operationManage/orderManage/index.vue

@@ -103,7 +103,7 @@
         show-overflow-tooltip
       >
       <template slot-scope="scope">
-        {{scope.row.goodsModelList[0].goodsState | filterType}}
+        {{scope.row.goodsModelList[0] | filterType}}
       </template>
       </el-table-column>
       <el-table-column
@@ -150,7 +150,7 @@
   
   <script>
   import {debounce} from '@/utils/index'
-  import {getList} from '@/api/order'
+  import {getOrderList} from '@/api/order'
   import {timeFormat} from '@/utils/index'
 
 export default {
@@ -171,6 +171,10 @@ export default {
           value: "REFUNDED",
           label: "已退款",
         },
+        {
+          value: "APPLY_REFUNDING",
+          label: "退款中",
+        },
         {
           value: "REFUSAL_REFUND",
           label: "拒绝退款",
@@ -223,30 +227,32 @@ export default {
   },
   filters: {
     filterType: function(val) {
-      if(val == 'APPLY_REFUND'){
-          return "申请退款"
-      }else if(val == 'CLOSE'){
-          return "关闭订单"
-        
-      }else if(val == 'REFUNDED'){
-          return "已退款"
-        
-      }else if(val == 'REFUSAL_REFUND'){
-          return "拒绝退款"
-        
-      }else if(val == 'USED'){
-          return "已使用"
-        
-      }else if(val == 'WAIT_PAYMENT'){
-          return "待付款"
-        
-      }else if(val =='AOUTO_REFUNDED'){
-          return '自动退款'
-      }
-      else if(val == 'WAIT_USE'){
-          return '待使用'
-      }
-    },
+				if(val.refundLog&&val.refundLog.refund == 'REFUSAL_REFUND'&&!val.change){
+					return '拒绝退款'
+				}
+                else if(val.jobFlowMap == 'Hotel'&&JSON.parse(val.extend).orderInfo){
+					return JSON.parse(val.extend).orderInfo.orderStatus
+				}
+				else if(val.goodsState == 'APPLY_REFUND'){
+					return '退款审核中'
+				}else if(val.goodsState == 'CLOSE'){
+					return '关闭订单'
+				}else if(val.goodsState == 'REFUNDED'){
+					return '已退款'
+				}else if(val.goodsState == 'REFUSAL_REFUND'){
+					return '拒绝退款'
+				}else if(val.goodsState == 'APPLY_REFUNDING'){
+					return '退款中'
+				}else if(val.goodsState == 'USED'){
+					return '订单已完成'
+				}else if(val.goodsState == 'WAIT_PAYMENT'){
+					return '待付款'
+				}else if(val.goodsState == 'WAIT_USE'){
+					return '待使用'
+				}else{
+					return ''
+				}
+			},
    
   },
   methods: {
@@ -261,6 +267,22 @@ export default {
             goodsName:goodsModelList[0].goodsInfo.activityName,
             price:goodsModelList[0].goodsInfo.price
           }
+        }else if(goodsModelList[0].jobFlowMap == 'Ticket'){
+          return {
+            goodsName:goodsModelList[0].goodsInfo.goodsName,
+            // price:goodsModelList[0].payAmount
+            price:goodsModelList[0].goodsInfo.salePrice
+          }
+        }else if(goodsModelList[0].jobFlowMap == 'Hotel'){
+          return {
+            goodsName:goodsModelList[0].goodsInfo.goodsName,
+            price:goodsModelList[0].goodsInfo.totalPrice
+          }
+        }else if(goodsModelList[0].jobFlowMap == 'YPP'){
+          return {
+            goodsName:goodsModelList[0].goodsInfo.goodsName,
+            price:goodsModelList[0].goodsInfo.originPrice
+          }
         }else{
           return {
             goodsName:goodsModelList[0].goodsInfo.goodsName,
@@ -306,7 +328,7 @@ export default {
       if(!obj.orderType){
         delete obj.orderType
       }
-      getList(obj).then(res=>{
+      getOrderList(obj).then(res=>{
         this.loading = false
         if(res.state == 'Success'){
           this.tableData = res.content.content

+ 152 - 37
src/views/operationManage/orderManage/list.vue

@@ -7,9 +7,40 @@
           <el-input
             v-model="query.noOrGName"
             size="small"
-            placeholder="请输入订单编号"
+            placeholder="请输入订单编号或商品名称"
             class="item-width-200 "
           ></el-input>
+           <el-input
+            v-model="query.phone"
+            size="small"
+            placeholder="请输入手机号"
+            class="item-width-200 ml10"
+          ></el-input>
+           <el-input
+            v-model="query.userId"
+            size="small"
+            placeholder="请输入用户ID"
+            class="item-width-200 ml10"
+          ></el-input>
+            <el-select
+            v-model="query.shopId"
+            size="small"
+            clearable
+            class="item-width-200 ml10"
+            placeholder="请输入搜索店铺名称"
+            filterable
+            remote
+            reserve-keyword
+            :remote-method="getShopList"
+          >
+            <el-option
+              v-for="item in options1"
+              :key="item.shopId"
+              :label="item.shopName"
+              :value="item.shopId"
+            >
+            </el-option>
+          </el-select>
               <el-date-picker
             v-model="date"
             size="small"
@@ -34,6 +65,21 @@
               :value="item.value"
             >
             </el-option>
+          </el-select>
+            <el-select
+            v-model="query.platInter"
+            size="small"
+            clearable
+            class="item-width-200 ml10"
+            placeholder="是否客服介入"
+          >
+            <el-option
+              v-for="item in options2"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
           </el-select>
           <el-button
           class="ml10"
@@ -109,7 +155,7 @@
         show-overflow-tooltip
       >
       <template slot-scope="scope">
-        {{scope.row.goodsModelList[0].goodsState | filterType}}
+        {{scope.row.goodsModelList[0] | filterType}}
       </template>
       </el-table-column>
       <el-table-column
@@ -131,11 +177,22 @@
       <template slot-scope="scope">
         {{ timeFormat(scope.row.createTime) }}
       </template>
+      </el-table-column>
+       <el-table-column
+        prop="createTime"
+        align="center"
+        label="申请介入"
+        show-overflow-tooltip
+      >
+      <template slot-scope="scope">
+        {{scope.row.goodsModelList[0].refundLog | filterApply}}
+      </template>
       </el-table-column>
        <el-table-column prop="address" align="center" label="操作">
         <template slot-scope="scope">
           <el-button type="text" size="small" @click="handleDetail(scope.row,'detail')">详情</el-button>
-          <el-button type="text" size="small" v-if="scope.row.goodsModelList[0].goodsState == 'APPLY_REFUND'&&scope.row.goodsModelList[0].jobFlowMap!='XiaoJu'" @click="handleDetail(scope.row,'refund')">介入处理</el-button>
+          <!-- 拒绝退款和申请退款都显示 -->
+          <el-button type="text" size="small" v-if="(scope.row.goodsModelList[0].refundLog&&scope.row.goodsModelList[0].refundLog.refund == 'REFUSAL_REFUND')||scope.row.goodsModelList[0].goodsState == 'APPLY_REFUND'&&scope.row.goodsModelList[0].jobFlowMap!='XiaoJu'" @click="handleDetail(scope.row,'refund')">介入处理</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -157,8 +214,9 @@
   
   <script>
   import {debounce} from '@/utils/index'
-  import {getList} from '@/api/order'
+  import {getOrderList} from '@/api/order'
   import {timeFormat} from '@/utils/index'
+import { getList } from "@/api/shop";
 
 export default {
   name: "list",
@@ -182,6 +240,10 @@ export default {
           value: "REFUSAL_REFUND",
           label: "拒绝退款",
         },
+        {
+          value: "APPLY_REFUNDING",
+          label: "退款中",
+        },
         {
           value: "USED",
           label: "已使用",
@@ -195,17 +257,32 @@ export default {
           label: "待使用",
         },
       ],
+      options1:[],
+      options2:[
+        {
+          label:'是',
+          value:true
+        },
+        {
+          label:'否',
+          value:false
+        }
+      ],
       tableData: [],
       goodsTypeObj:{},
       loading: false,
       query: {
+        userId:'',
+        phone:'',
+        shopId:'',
         "endTime": '',
         "noOrGName": '',
         "orderType": "",
         "page": 1,
         "size": 10,
         "sort": "",
-        "startTime": ''
+        "startTime": '',
+        "platInter":''
       },
       title: "",
       total: 0,
@@ -231,41 +308,59 @@ export default {
   },
   filters: {
     filterType: function(val) {
-      if(val == 'APPLY_REFUND'){
-          return "申请退款"
-      }else if(val == 'CLOSE'){
-          return "关闭订单"
-        
-      }else if(val == 'REFUNDED'){
-          return "已退款"
-        
-      }else if(val == 'REFUSAL_REFUND'){
-          return "拒绝退款"
-        
-      }else if(val == 'USED'){
-          return "已使用"
-        
-      }else if(val == 'WAIT_PAYMENT'){
-          return "待付款"
-        
-      }else if(val =='AOUTO_REFUNDED'){
-          return '自动退款'
-      }
-      else if(val == 'WAIT_USE'){
-          return '待使用'
+				if(val.refundLog&&val.refundLog.refund == 'REFUSAL_REFUND'&&!val.change){
+					return '拒绝退款'
+				}
+                else if(val.jobFlowMap == 'Hotel'&&JSON.parse(val.extend).orderInfo){
+					return JSON.parse(val.extend).orderInfo.orderStatus
+				}
+				else if(val.goodsState == 'APPLY_REFUND'){
+					return '退款审核中'
+				}else if(val.goodsState == 'CLOSE'){
+					return '关闭订单'
+				}else if(val.goodsState == 'REFUNDED'){
+					return '已退款'
+				}else if(val.goodsState == 'REFUSAL_REFUND'){
+					return '拒绝退款'
+				}else if(val.goodsState == 'APPLY_REFUNDING'){
+					return '退款中'
+				}else if(val.goodsState == 'USED'){
+					return '订单已完成'
+				}else if(val.goodsState == 'WAIT_PAYMENT'){
+					return '待付款'
+				}else if(val.goodsState == 'WAIT_USE'){
+					return '待使用'
+				}else{
+					return ''
+				}
+			},
+    filterApply: function(val) {
+      if(val){
+        if(val.platInter){
+          return '是'
+        }else{
+          return '否'
+        }
+      }else{
+        return '否'
       }
-     
     }
   },
   methods: {
     formatType(row){
-      if(row.goodsModelList[0].jobFlowMap == 'XiaoJu'){
-        return '加油充电'
-      }else if(row.goodsModelList[0].jobFlowMap == 'Activity'){
-        return '活动报名'
-      }else{
-        return '-'
-      }
+        if(row.goodsModelList[0].jobFlowMap == 'XiaoJu'){
+            return '加油充电'
+        }else if(row.goodsModelList[0].jobFlowMap == 'Activity'){
+            return '活动报名'
+        }else if(row.goodsModelList[0].jobFlowMap == 'Ticket'){
+            return '景区门票'
+        }else if(row.goodsModelList[0].jobFlowMap == 'Hotel'){
+            return '酒店住宿'
+        }else if(row.goodsModelList[0].jobFlowMap == 'YPP'){
+            return '电影票'
+        }else{
+            return '-'
+        }
     },
     handleSearch(){
       this.query.page = 1
@@ -308,14 +403,34 @@ export default {
       if(!obj.orderType){
         delete obj.orderType
       }
-      getList(obj).then(res=>{
+      if(obj.platInter === ''){
+        obj.platInter = null
+      }
+      getOrderList(obj).then(res=>{
         this.loading = false
         if(res.state == 'Success'){
           this.tableData = res.content.content
           this.total = res.content.totalElements
         }
       })
-    }
+    },
+    getShopList(shopNameOrPhoneNum) {
+      if(shopNameOrPhoneNum){
+          this.loading = true;
+          getList({
+              shopNameOrPhoneNum,
+              currentPage: 1,
+              pageSize: 10
+          }).then((res) => {
+            this.loading = false;
+            if (res.state == "Success") {
+              this.options1 = res.content.records;
+            }
+          });
+      }else{
+        this.options1 = []
+      }
+    },
   },
   created() {
     this.goodsTypeObj = JSON.parse(sessionStorage.getItem('goodsTypeObj'))

+ 183 - 66
src/views/operationManage/orderManage/orderDetail.vue

@@ -2,7 +2,7 @@
  * @Author: wj 1454560336@qq.com
  * @Date: 2023-11-01 14:21:43
  * @LastEditors: wenjie 1454560336@qq.com
- * @LastEditTime: 2024-05-07 16:35:56
+ * @LastEditTime: 2024-07-29 15:58:58
  * @FilePath: \admin-manage\src\views\operationManage\orderManage\orderDetail.vue
  * @Description:
  *
@@ -61,7 +61,7 @@
         show-overflow-tooltip
       >
       <template slot-scope="scope">
-        {{scope.row.goodsList[0].goodsState | filterType}}
+        {{scope.row.goodsList[0] | filterType}}
       </template>
       </el-table-column>
     </el-table>
@@ -223,8 +223,8 @@
     </template>
 
 
-        <div class="apply" v-if="mode == 'refund'">
-            <el-button class="btn" size="small" @click="handleBtn">立即处理</el-button>
+        <div class="apply" v-if="tableData[0].goodsList[0].refundLog">
+            <el-button class="btn" v-if="mode == 'refund'&&tableData[0].goodsList[0].goodsState!='REFUNDED'" size="small" @click="handleBtn">立即处理</el-button>
             <div class="top-info">
                 <div class="sub-title">用户申请退款</div>
                 <div class="time">申请时间: {{timeFormat(tableData[0].goodsList[0].refundLog.createTime) }}</div>
@@ -236,6 +236,11 @@
             <div class="reason">
               {{tableData[0].goodsList[0].refundLog.remark}}
             </div>
+
+            <div class="refuse-box" v-if="tableData[0].goodsList[0].refundLog.conclusion">
+                <div class="sub-title">拒绝原因:</div>
+                <div class="refuse-reason">{{tableData[0].goodsList[0].refundLog.conclusion}}</div>
+            </div>
         </div>
 
 
@@ -267,8 +272,8 @@
         </el-form-item>
     </el-form>
     <div slot="footer" class="dialog-footer">
-        <el-button size="small" @click="dialogFormVisible = false">取 消</el-button>
-        <el-button size="small" type="primary" :loading="btnLoading" @click="auditRefund">确 定</el-button>
+        <el-button size="small" type="danger" :loading="btnLoading" @click="auditRefund(1)">拒绝</el-button>
+        <el-button size="small" type="primary" :loading="btnLoading" @click="auditRefund(0)">确 定</el-button>
     </div>
     </el-dialog>
 
@@ -328,24 +333,59 @@ import {auditRefund,transfer,orderDetail,subOrdersConfirm} from '@/api/order'
         },
         filters: {
             filterType: function(val) {
-                if(val == 'APPLY_REFUND'){
-                    return '退款审核中'
-                }else if(val == 'CLOSE'){
-                    return '关闭订单'
-                }else if(val == 'REFUNDED'){
-                    return '已退款'
-                }else if(val == 'REFUSAL_REFUND'){
-                    return '拒绝退款'
-                }else if(val == 'USED'){
-                    return '订单已完成'
-                }else if(val == 'WAIT_PAYMENT'){
-                    return '待付款'
-                }else if(val == 'WAIT_USE'){
-                    return '待使用'
-                }else if(val =='AOUTO_REFUNDED'){
-                    return '自动退款'
-                }
-            },
+				if(val.refundLog&&val.refundLog.refund == 'REFUSAL_REFUND'&&!val.change){
+					return '拒绝退款'
+				}
+                else if(val.jobFlowMap == 'Hotel'&&JSON.parse(val.extend).orderInfo){
+					return JSON.parse(val.extend).orderInfo.orderStatus
+				}
+				else if(val.goodsState == 'APPLY_REFUND'){
+					return '退款审核中'
+				}else if(val.goodsState == 'CLOSE'){
+					return '关闭订单'
+				}else if(val.goodsState == 'REFUNDED'){
+					return '已退款'
+				}else if(val.goodsState == 'REFUSAL_REFUND'){
+					return '拒绝退款'
+				}else if(val.goodsState == 'APPLY_REFUNDING'){
+					return '退款中'
+				}else if(val.goodsState == 'USED'){
+					return '订单已完成'
+				}else if(val.goodsState == 'WAIT_PAYMENT'){
+					return '待付款'
+				}else if(val.goodsState == 'WAIT_USE'){
+					return '待使用'
+				}else{
+					return ''
+				}
+			},
+            // filterType: function(val) {
+			// 	if(val.refundLog&&val.refundLog.refund == 'REFUSAL_REFUND'){
+			// 		return '拒绝退款'
+			// 	}
+			// 	else if(val.jobFlowMap == 'Hotel'&&JSON.parse(val.extend).orderInfo){
+			// 		return JSON.parse(val.extend).orderInfo.orderStatus
+			// 	}
+			// 	else if(val.goodsState == 'APPLY_REFUND'){
+			// 		return '退款审核中'
+			// 	}else if(val.goodsState == 'CLOSE'){
+			// 		return '关闭订单'
+			// 	}else if(val.goodsState == 'REFUNDED'){
+			// 		return '已退款'
+			// 	}else if(val.goodsState == 'REFUSAL_REFUND'){
+			// 		return '拒绝退款'
+			// 	}else if(val.goodsState == 'APPLY_REFUNDING'){
+			// 		return '退款中'
+			// 	}else if(val.goodsState == 'USED'){
+			// 		return '订单已完成'
+			// 	}else if(val.goodsState == 'WAIT_PAYMENT'){
+			// 		return '待付款'
+			// 	}else if(val.goodsState == 'WAIT_USE'){
+			// 		return '待使用'
+			// 	}else{
+			// 		return ''
+			// 	}
+			// },
             filterPay(val){
                 if(val == 'wx.unifiedOrder'){
                     return '微信支付'
@@ -366,6 +406,12 @@ import {auditRefund,transfer,orderDetail,subOrdersConfirm} from '@/api/order'
                     return '加油充电'
                 }else if(row.goodsList[0].jobFlowMap == 'Activity'){
                     return '活动报名'
+                }else if(row.goodsList[0].jobFlowMap == 'Ticket'){
+                    return '景区门票'
+                }else if(row.goodsList[0].jobFlowMap == 'Hotel'){
+                    return '酒店住宿'
+                }else if(row.goodsList[0].jobFlowMap == 'YPP'){
+                    return '电影票'
                 }else{
                     return '-'
                 }
@@ -397,7 +443,33 @@ import {auditRefund,transfer,orderDetail,subOrdersConfirm} from '@/api/order'
                         goodsName:row.goodsList[0].goodsInfo.activityName,
 
                     }
-                }else{
+                }else if(row.goodsList[0].jobFlowMap == 'Ticket'){
+                    return {
+                        paymentTime:row.payment?row.payment.paymentTime:'',
+                        paymentWay:row.payment?row.payment.paymentWay:'',
+                        price:row.goodsList[0].goodsInfo.salePrice,
+                        goodsName:row.goodsList[0].goodsInfo.goodsName,
+
+                    }
+                }else if(row.goodsList[0].jobFlowMap == 'Hotel'){
+                    return {
+                        paymentTime:row.payment?row.payment.paymentTime:'',
+                        paymentWay:row.payment?row.payment.paymentWay:'',
+                        price:row.goodsList[0].goodsInfo.totalPrice/row.goodsList[0].goodsInfo.numberofRooms,
+                        goodsName:row.goodsList[0].goodsInfo.goodsName,
+
+                    }
+                }
+                else if(row.goodsList[0].jobFlowMap == 'YPP'){
+                    return {
+                        paymentTime:row.payment?row.payment.paymentTime:'',
+                        paymentWay:row.payment?row.payment.paymentWay:'',
+                        price:row.goodsList[0].goodsInfo.originPrice,
+                        goodsName:row.goodsList[0].goodsInfo.goodsName,
+
+                    }
+                }
+                else{
                     return {
                         paymentTime:row.payment?row.payment.paymentTime:'',
                         paymentWay:row.payment?row.payment.paymentWay:'',
@@ -411,50 +483,82 @@ import {auditRefund,transfer,orderDetail,subOrdersConfirm} from '@/api/order'
                 return timeFormat(val)
             },
             handleBtn() {
-                if(this.tableData[0].payment.transferAll){
-                    this.dialogFormVisible = true
+                this.dialogFormVisible = true
+
+                // if(this.tableData[0].payment.transferAll){
+                //     this.dialogFormVisible = true
+                // }else{
+                //     this.$confirm('此订单未完成分账, 是否立即分账?(确认分账后,第二天00:00:00后可以退款)', '分账', {
+                //     confirmButtonText: '确定',
+                //     cancelButtonText: '取消',
+                //     type: 'warning'
+                //     }).then(() => {
+                //         subOrdersConfirm({
+                //             "goodId": this.tableData[0].goodsList[0].id,
+                //             "useShop": this.tableData[0].shopId
+                //             }).then(res=>{
+                //             if(res.state == 'Success'){
+                //                 this.orderDetail(this.$route.query.orderNo)
+                //                 this.$notify({
+                //                     title: "成功",
+                //                     message: "操作成功",
+                //                     type: "success",
+                //                 });
+                //             }
+                //         })
+                //     })
+                // }
+            },
+            auditRefund(type){
+                if(type){
+                      this.$prompt('请输入拒绝原因', '提示', {
+                        confirmButtonText: '确定',
+                        cancelButtonText: '取消',
+                        inputPattern:/^[\s\S]*.*[^\s][\s\S]*$/,
+                        inputErrorMessage: '请填写拒绝原因'
+                        }).then(({ value }) => {
+                            let query = JSON.parse(JSON.stringify(this.query))
+                            query.orderType = 'REFUSAL_REFUND'
+                            query.refundDesc = value
+                            this.btnLoading = true
+                            auditRefund(query).then(res=>{
+                               this.btnLoading = false
+                               if(res.state == 'Success'){
+                                   this.dialogFormVisible = false
+                                    this.$notify({
+                                       title: "成功",
+                                       message: "操作成功",
+                                       type: "success",
+                                   });
+                               }
+                           })
+                        }).catch(() => {
+                            this.dialogFormVisible = false
+
+                        });
+                    
                 }else{
-                    this.$confirm('此订单未完成分账, 是否立即分账?(确认分账后,第二天00:00:00后可以退款)', '分账', {
-                    confirmButtonText: '确定',
-                    cancelButtonText: '取消',
-                    type: 'warning'
-                    }).then(() => {
-                        subOrdersConfirm({
-                            "goodId": this.tableData[0].goodsList[0].id,
-                            "useShop": this.tableData[0].shopId
-                            }).then(res=>{
-                            if(res.state == 'Success'){
-                                this.orderDetail(this.$route.query.orderNo)
-                                this.$notify({
-                                    title: "成功",
-                                    message: "操作成功",
-                                    type: "success",
-                                });
-                            }
-                        })
+
+                    this.$refs.query.validate((v) => {
+                       if (v) {
+                           this.btnLoading = true
+                           this.query.platformAmount = Number(this.query.platformAmount)
+                           this.query.buyShopAmount = Number(this.query.buyShopAmount)
+                           this.query.useShopAmount = Number(this.query.useShopAmount)
+                           auditRefund(this.query).then(res=>{
+                               this.btnLoading = false
+                               if(res.state == 'Success'){
+                                   this.dialogFormVisible = false
+                                    this.$notify({
+                                       title: "成功",
+                                       message: res.content,
+                                       type: "success",
+                                   });
+                               }
+                           })
+                       }
                     })
                 }
-            },
-            auditRefund(){
-                 this.$refs.query.validate((v) => {
-                    if (v) {
-                        this.btnLoading = true
-                        this.query.platformAmount = Number(this.query.platformAmount)
-                        this.query.buyShopAmount = Number(this.query.buyShopAmount)
-                        this.query.useShopAmount = Number(this.query.useShopAmount)
-                        auditRefund(this.query).then(res=>{
-                            this.btnLoading = false
-                            if(res.state == 'Success'){
-                                this.dialogFormVisible = false
-                                 this.$notify({
-                                    title: "成功",
-                                    message: "操作成功",
-                                    type: "success",
-                                });
-                            }
-                        })
-                    }
-                 })
             },
              transfer(orderNo){
                 transfer(orderNo).then(res=>{
@@ -521,6 +625,19 @@ import {auditRefund,transfer,orderDetail,subOrdersConfirm} from '@/api/order'
                margin-left: 10px;
             }
         }
+        .refuse-box{
+            display: flex;
+            align-items: center;
+            .sub-title{
+                font-size: 14px;
+                font-weight: bold;
+            }
+            .refuse-reason{
+               color:  red;
+               font-size: 12px;
+               margin-left: 10px;
+            }
+        }
         .info{
             display: flex;
             align-items: center;

+ 29 - 21
src/views/operationManage/orderManage/payDetail.vue

@@ -2,7 +2,7 @@
  * @Author: wj 1454560336@qq.com
  * @Date: 2023-11-01 14:21:43
  * @LastEditors: wenjie 1454560336@qq.com
- * @LastEditTime: 2024-04-29 11:33:30
+ * @LastEditTime: 2024-07-29 16:02:03
  * @FilePath: \admin-manage\src\views\operationManage\orderManage\payDetail.vue
  * @Description:
  *
@@ -60,7 +60,7 @@
         show-overflow-tooltip
       >
         <template slot-scope="scope">
-          {{ scope.row.goodsList[0].goodsState | filterType }}
+          {{ scope.row.goodsList[0] | filterType }}
         </template>
       </el-table-column>
     </el-table>
@@ -150,25 +150,33 @@ export default {
     };
   },
   filters: {
-    filterType: function (val) {
-      if (val == "APPLY_REFUND") {
-        return "退款审核中";
-      } else if (val == "CLOSE") {
-        return "关闭订单";
-      } else if (val == "REFUNDED") {
-        return "已退款";
-      } else if (val == "REFUSAL_REFUND") {
-        return "拒绝退款";
-      } else if (val == "USED") {
-        return "订单已完成";
-      } else if (val == "WAIT_PAYMENT") {
-        return "待付款";
-      } else if (val == "WAIT_USE") {
-        return "待使用";
-      }else if(val =='AOUTO_REFUNDED'){
-          return '自动退款'
-      }
-    },
+    filterType: function(val) {
+				if(val.refundLog&&val.refundLog.refund == 'REFUSAL_REFUND'&&!val.change){
+					return '拒绝退款'
+				}
+        else if(val.jobFlowMap == 'Hotel'&&JSON.parse(val.extend).orderInfo){
+					return JSON.parse(val.extend).orderInfo.orderStatus
+				}
+				else if(val.goodsState == 'APPLY_REFUND'){
+					return '退款审核中'
+				}else if(val.goodsState == 'CLOSE'){
+					return '关闭订单'
+				}else if(val.goodsState == 'REFUNDED'){
+					return '已退款'
+				}else if(val.goodsState == 'REFUSAL_REFUND'){
+					return '拒绝退款'
+				}else if(val.goodsState == 'APPLY_REFUNDING'){
+					return '退款中'
+				}else if(val.goodsState == 'USED'){
+					return '订单已完成'
+				}else if(val.goodsState == 'WAIT_PAYMENT'){
+					return '待付款'
+				}else if(val.goodsState == 'WAIT_USE'){
+					return '待使用'
+				}else{
+					return ''
+				}
+			},
     filterPay(val) {
       if (val == "wx.unifiedOrder") {
         return "微信支付";

+ 41 - 5
src/views/operationManage/shopManage/shopAdd.vue

@@ -2,7 +2,7 @@
  * @Author: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git
  * @Date: 2023-05-26 16:37:34
  * @LastEditors: wenjie 1454560336@qq.com
- * @LastEditTime: 2024-05-15 15:57:35
+ * @LastEditTime: 2024-08-01 17:53:54
  * @FilePath: \admin-manage\src\views\operationManage\shopManage\shopAdd.vue
  * @Description: 
  * 
@@ -21,7 +21,7 @@
     <el-tabs v-model="activeName">
     <el-tab-pane label="基本信息" name="1">
       <el-form-item label="商铺主体:" prop="shopMainId">
-        <el-select v-model="setQuery.shopMainId" size="small" filterable class="item-width-300" placeholder="请搜索选择店铺主体">
+        <el-select v-model="setQuery.shopMainId" :disabled="mode != 'add'" size="small" filterable class="item-width-300" placeholder="请搜索选择店铺主体">
           <el-option
             v-for="item in shopMainOptions"
             :key="item.value"
@@ -59,6 +59,13 @@
           class="item-width-300"
         ></el-input>
       </el-form-item>
+       <!-- <el-form-item label="店铺标签:">
+        <el-input
+          v-model="setQuery.shopLabel"
+          size="small"
+          class="item-width-300"
+        ></el-input>
+      </el-form-item> -->
       <!-- <el-form-item label="店铺类型:" prop="shopType">
         <el-select v-model="setQuery.shopType" size="small" class="item-width-300" placeholder="请选择店铺经营类型">
           <el-option
@@ -91,6 +98,16 @@
         >
         </el-input>
       </el-form-item>
+      <el-form-item label="店铺电话:" prop="serviceTel">
+        <el-input
+          type="tel"
+          placeholder="请输入店铺电话"
+          v-model="setQuery.serviceTel"
+          :maxlength="11"
+          class="item-width-300"
+        >
+        </el-input>
+      </el-form-item>
 
       <el-form-item label="店铺头像:" prop="logoPath">
         <Upload
@@ -264,6 +281,18 @@ export default {
     Upload,
   },
   data() {
+    var validateTel = (rule, value, callback) => {
+        if (value == '') {
+          callback(new Error('请输入店铺电话'));
+        } else {
+          let reg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/
+          if (reg.test(value)) {
+            callback();
+          }else{
+            callback(new Error('请输入正确的手机号'));
+          }
+        }
+      };
     return {
       checkList:[],
       activeName:"1",
@@ -367,6 +396,10 @@ export default {
         platformType: [
           { type: 'array', required: true, message: '请至少绑定一个主商户', trigger: 'change' }
         ],
+        serviceTel: [
+          { required: true, message: "请输入店铺电话", trigger: "blur" },
+          { validator: validateTel, trigger: 'change' }
+        ],
       },
       rules1:{
         address: [
@@ -441,7 +474,7 @@ export default {
     searchAddress(val){
       if(val){
         this.addressLoading = true
-        getSearchList({query:val,region:this.cityName,output:'json',ak:'7aGqlyBw6mGwS6vNMLbmMlsHqE2OGV0E',ret_coordtype:'gcj02'}).then(res=>{
+        getSearchList({query:val,region:this.cityName,output:'json',ak:'7aGqlyBw6mGwS6vNMLbmMlsHqE2OGV0E'}).then(res=>{
           this.addressLoading = false
           if(res.status == 0){
             this.addressOptions = []
@@ -593,6 +626,8 @@ export default {
       
       this.$nextTick(() => {
         this.map = new BMapGL.Map("container",{enableIconClick: true});
+        //  var point = new BMapGL.Point(this.setQuery.mapLon,this.setQuery.mapLat);
+        // this.map.centerAndZoom(point, 15);
         var geoc = new BMapGL.Geocoder();
         this.map.enableScrollWheelZoom(true)
         var myCity = new BMapGL.LocalCity();
@@ -616,14 +651,15 @@ export default {
           console.log(1111111,itemId);
 
           if (itemId) {
-            uidToAddress({uid:itemId.uid,scope:2,output:'json',ak:'7aGqlyBw6mGwS6vNMLbmMlsHqE2OGV0E',ret_coordtype:'gcj02'}).then(res=>{
+            uidToAddress({uid:itemId.uid,scope:2,output:'json',ak:'7aGqlyBw6mGwS6vNMLbmMlsHqE2OGV0E'}).then(res=>{
               if(res.status == 0){
+                console.log(res.result);
                  that.setQuery.mapLat = res.result.location.lat
                 that.setQuery.mapLon = res.result.location.lng
                 that.map.removeOverlay(that.marker); //移除点标记
                 that.marker = new BMapGL.Marker(res.result.location, {title: res.result.name})
                 that.map.addOverlay(that.marker)
-                that.setQuery.address = res.result.address;
+                that.setQuery.address = res.result.name+'-'+ res.result.address;
                 that.setQuery.province = res.result.province;
                 that.setQuery.city = res.result.city;
                 that.setQuery.district = res.result.area;

+ 442 - 0
src/views/operationManage/templateManage/addTemplate.vue

@@ -0,0 +1,442 @@
+<template>
+  <div class="addTemplate app-container" v-loading="loading">
+    <el-form
+      :model="setQuery"
+      ref="setQuery"
+      :rules="rules"
+      label-width="130px"
+    >
+      <el-form-item label="名称:" prop="dataCollectName">
+        <el-input
+          v-model="setQuery.dataCollectName"
+          class="item-width-300"
+        ></el-input>
+      </el-form-item>
+    </el-form>
+    <div class="table-box">
+
+      <el-table
+        :data="setQuery.data"
+        tooltip-effect="dark"
+        border
+        class="table"
+      >
+        <el-table-column
+          align="center"
+          label="字段名称"
+          prop="dataName"
+          show-overflow-tooltip
+        >
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="字段类型"
+          prop="dataType"
+          show-overflow-tooltip
+        >
+         <template slot-scope="scope">
+          {{scope.row.dataType | filterType}}
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="必填"
+          prop="orderNo"
+          show-overflow-tooltip
+        >
+         <template slot-scope="scope">
+            <el-checkbox :true-label="1" :false-label="2" v-model="scope.row.requiredEnable"></el-checkbox>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="显示"
+          prop="orderNo"
+          show-overflow-tooltip
+        >
+          <template slot-scope="scope">
+            <el-checkbox :true-label="1" :false-label="2" v-model="scope.row.state"></el-checkbox>
+          </template>
+        </el-table-column>
+        <el-table-column prop="address" align="center" label="操作">
+          <template slot-scope="scope">
+            <el-button type="text" size="small" @click="handleEdit(scope.row,scope.$index)">编辑</el-button>
+            <el-button type="text" size="small" @click="handleDel(scope.$index)">删除</el-button>
+            <el-button type="text" size="small" @click="handleMoveUp(scope.$index,-1)">上移</el-button>
+            <el-button type="text" size="small" @click="handleMoveDown(scope.$index,2)">下移</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-button
+          type="primary"
+          size="small"
+          @click="handleAdd"
+      >
+          添加
+      </el-button>
+    </div>
+
+    <div class="btn-group">
+       <el-button>取 消</el-button>
+     <el-button type="primary" :loading="loading"  @click="save">确 定</el-button>
+    </div>
+
+    <el-dialog title="添加自定义字段" width="600px" :visible.sync="dialogFormVisible">
+        <el-form
+        :model="form"
+        ref="form"
+        :rules="rules1"
+        label-width="170px"
+      >
+        <el-form-item label="字段名称:" prop="dataName">
+          <el-input
+            v-model="form.dataName"
+            class="item-width-300"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="类型:" prop="dataType">
+          <el-select v-model="form.dataType" class="item-width-300" placeholder="请选择">
+            <el-option
+              v-for="item in options"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="字段校验规则:" prop="validType"  v-if="form.dataType == 1">
+          <el-select v-model="form.validType" class="item-width-300" placeholder="请选择">
+            <el-option
+              v-for="item in options1"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <template v-if="form.dataType == 3 || form.dataType == 4">
+
+          <el-form-item :label="'选项'+(index+1)+':'"  v-for="(item, index) in form.content"
+            :key="index"
+            :prop="'content.' + index + '.value'"
+            :rules="{
+              required: true, message: '选项不能为空', trigger: 'blur'
+            }">
+            <el-input
+              v-model="item.value"
+              class="item-width-300"
+            ></el-input>
+            <el-button v-if="index" class="ml10" type="text" @click="del(index)">删除</el-button>
+          </el-form-item>
+          <el-button style="margin-left:130px;" type="text" @click="add">+ 新建选项</el-button>
+        </template>
+        <template v-if="form.dataType == 5">
+          <el-form-item label="最大上传数量:" prop="num">
+            <el-input
+              type="number"
+              v-model.number="form.num"
+              class="item-width-300"
+              :max="99"
+              :min="1"
+            ></el-input>
+          </el-form-item>
+          <el-form-item label="文件限制大小(MB):" prop="size">
+            <el-input
+              type="number"
+              v-model.number="form.size"
+              class="item-width-300"
+              :max="100"
+            ></el-input>
+          </el-form-item>
+          <el-form-item label="上传类型:" prop="uploadType">
+          <el-select v-model="form.uploadType" multiple  class="item-width-300" placeholder="请选择">
+            <el-option
+              v-for="item in options2"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        </template>
+       
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogFormVisible = false">取 消</el-button>
+        <el-button type="primary" @click="submit">确 定</el-button>
+      </div>
+  </el-dialog>
+
+  </div>
+</template>
+
+<script>
+import Upload from '@/components/Upload'
+import {dataTemplateAddOrUpdate,dataTemplateDetail} from '@/api/activity'
+export default {
+    components: {
+        Upload,
+    },
+  data() {
+    return {
+        editMode:'add',
+        editIndex:0,//编辑行的index
+        dialogFormVisible:false,
+        loading:false,
+        setQuery: {
+          dataCollectName: "",
+          shopId: 0,
+          data:[
+            //   {
+            //     "dataName": "",
+            //     "dataType": 0,
+            //     "num": 0,
+            //     "requiredEnable": 0,
+            //     "size": 0,
+            //     "state": 0,
+            //     "uploadType": "",
+            //      "validType":0,
+            //  }
+          ],
+         
+        },
+         form:{
+              "content":[],
+              "dataName": "",
+              "dataType": 0,
+              "num": 0,
+              "requiredEnable": 0,
+              "size": 0,
+              "state": 0,
+              "uploadType": "",
+              "validType":0,
+         },
+        options:[
+            {
+              label:'单行文本',
+              value:1
+            },
+            {
+              label:'长文本',
+              value:2
+            },
+            {
+              label:'单选',
+              value:3
+            },
+            {
+              label:'多选',
+              value:4
+            },
+             {
+              label:'图片',
+              value:5
+            }
+        ],
+        options1:[
+            {
+              label:'无',
+              value:0
+            },
+            {
+              label:'手机号码',
+              value:1
+            },
+            {
+              label:'身份证',
+              value:2
+            },
+            {
+              label:'邮箱',
+              value:3
+            },
+             {
+              label:'数字',
+              value:4
+            }
+        ],
+         options2:[
+            {
+              label:'jpg',
+              value:'jpg'
+            },
+            {
+              label:'jpeg',
+              value:'jpeg'
+            },
+            {
+              label:'png',
+              value:'png'
+            },
+        ],
+         rules: {
+            dataCollectName: [{ required: true, message: "请输入字段名称", trigger: "blur" }],
+         },
+         rules1: {
+            dataName: [{ required: true, message: "请输入字段名称", trigger: "blur" }],
+            num: [{ required: true, message: "请输入最大上传数量", trigger: "blur" }],
+            size: [{ required: true, message: "请输入文件限制大小", trigger: "blur" }],
+            dataType: [{ required: true, message: "请选择类型", trigger: "change" }],
+            uploadType: [{ required: true, message: "请选择上传类型", trigger: "change" }],
+         }
+
+    };
+  },
+  filters: {
+    filterType: function(value) {
+      if(value == 1){
+        return '单行文本'
+      }else if(value == 2){
+        return '多行文本'
+      }else if(value == 3){
+        return '单选'
+      }else if(value == 4){
+        return '多选'
+      }else if(value == 5){
+        return '图片'
+      }
+    }
+  },
+  methods: {
+    add(){
+      this.form.content.push({value:''})
+    },
+    del(index){
+       this.form.content.splice(index,1)
+    },
+    submit(){
+       this.$refs.form.validate((v) => {
+          if (v) {
+             let obj =  JSON.parse(JSON.stringify(this.form))
+             obj.uploadType = obj.uploadType.toString()
+
+            //处理单选多选  
+             if(obj.content.length){
+              obj.content = obj.content.map(item=>item.value)
+             }
+             if(this.editMode == 'add'){
+               this.setQuery.data.push(obj)
+             }else{
+              this.$set(this.setQuery.data,this.editIndex,obj)
+             }
+            
+             this.dialogFormVisible = false
+             console.log(11111,this.setQuery);
+          }
+        })
+    },
+    handleAdd(){
+      this.editMode ='add'
+      this.dialogFormVisible = true
+       this.form = {
+              "content":[],
+              "dataName": "",
+              "dataType": 1,
+              "num": 0,
+              "requiredEnable": 1,
+              "size": 0,
+              "state": 1,
+              "uploadType": "",
+              "validType":0,
+            }
+    },
+    handleEdit(row,index){
+      console.log(row);
+      this.editMode ='edit'
+      this.editIndex = index
+      this.form = JSON.parse(JSON.stringify(row)) 
+      if(row.dataType == 3 || row.dataType == 4){
+        let content = []
+        this.form.content.map(item=>{
+          if(!item.hasOwnProperty('value')){
+            content.push({
+              value:item
+            })
+          }
+        })
+        if(content.length){
+          this.form.content = content
+        }
+      }
+      if(this.form.uploadType){
+        this.form.uploadType = this.form.uploadType.split(',')
+      }
+      this.dialogFormVisible = true
+
+    },
+    handleDel(index){
+       this.setQuery.data.splice(index,1)
+    },
+    handleMoveUp(index,num){
+      this.setQuery.data.splice(index+num,0,this.setQuery.data[index])
+        this.setQuery.data.splice(index-num,1)
+    },
+     handleMoveDown(index,num){
+      this.setQuery.data.splice(index+num,0,this.setQuery.data[index])
+        this.setQuery.data.splice(index,1)
+    },
+   save() {
+      this.$refs.setQuery.validate((v) => {
+        if (v) {
+          if(this.loading) return
+          this.loading = true
+          if(this.$route.query.mode == 'copy'){
+            delete this.setQuery.id
+          }
+          dataTemplateAddOrUpdate(this.setQuery).then(res=>{
+            this.loading = false
+
+            if(res.state == 'Success'){
+
+              this.$notify({
+                  title: '成功',
+                  message: '操作成功',
+                  type: 'success'
+                });
+               
+                  this.$router.push('/operationManage/templateManage/index')
+            }
+          })
+              
+        }
+      });
+    },
+    dataTemplateDetail(id){
+      this.loading = true
+      dataTemplateDetail({id}).then(res=>{
+          this.loading = false
+          if(res.state == 'Success'){
+            let {data,dataCollectName} = res.content
+            this.setQuery.data = data
+            this.setQuery.dataCollectName = dataCollectName
+            this.setQuery.id = id
+          }
+      })
+    }
+  },
+  created () {
+    if(this.$route.query.id){
+      this.dataTemplateDetail(this.$route.query.id)
+    }
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.addTemplate {
+  padding-bottom: 40px;
+  .table-box{
+    margin-left: 130px;
+
+    .table{
+      width: 800px;
+      box-sizing: border-box;
+    }
+  }
+  .btn-group{
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+}
+</style>

+ 198 - 0
src/views/operationManage/templateManage/index.vue

@@ -0,0 +1,198 @@
+
+<template>
+  <div class="templateManage app-container">
+    <div class="search">
+        <div>
+            <el-input
+            v-model="query.name"
+            size="small"
+            clearable
+            placeholder="请输入模板名称"
+            class="item-width-200 "
+            ></el-input>
+            <el-button
+            class="ml10"
+            type="primary"
+            size="small"
+            icon="el-icon-search"
+            @click="handleSearch"
+        >
+            搜索
+        </el-button>
+        </div>
+        <el-button
+            type="primary"
+            size="small"
+            @click="handleAdd"
+        >
+            添加
+        </el-button>
+    </div>
+
+    <el-table
+      :data="tableData"
+      tooltip-effect="dark"
+      border
+      v-loading="loading"
+      style="width: 100%"
+    >
+      <el-table-column
+        align="center"
+        label="模板名称"
+        prop="dataCollectName"
+        show-overflow-tooltip
+      >
+      </el-table-column>
+    
+      <el-table-column
+        align="center"
+        label="状态"
+        prop="status"
+        show-overflow-tooltip
+      >
+        <template slot-scope="scope">
+          {{scope.row.status == 1?"启用":"停用"}}
+        </template>
+      </el-table-column>
+      
+       <el-table-column prop="address" align="center" label="操作">
+        <template slot-scope="scope">
+          <el-button type="text" size="small" @click="handleDetail(scope.row.id,'edit')">编辑</el-button>
+          <el-button type="text" size="small" @click="handleCopy(scope.row.id)">复制</el-button>
+          <el-button type="text" size="small" @click="handleOperate(scope.row.id,scope.row.status == 1?2:1)">{{scope.row.status == 1?'停用':'启用'}}</el-button>
+          <el-button type="text" class="red" size="small" @click="handleOperate(scope.row.id,3)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="page-box">
+      <el-pagination
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+        background
+        :current-page="query.currentPage"
+        :page-sizes="[10, 20, 30, 40]"
+        :page-size="query.pageSize"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="total"
+      >
+      </el-pagination>
+    </div>
+  </div>
+</template>
+  
+  <script>
+  import {debounce} from '@/utils/index'
+  import {dataTemplate,operate} from '@/api/activity'
+  import {timeFormat} from '@/utils/index'
+
+export default {
+  name: "templateManage",
+  data() {
+    return {
+      tableData: [],
+      loading: false,
+      query: {
+        "name": "",
+        "currentPage": 1,
+        "pageSize": 10,
+        shopId: 0,
+
+      },
+      title: "",
+      total: 0,
+    };
+  },
+  methods: {
+    handleAdd(){
+        this.$router.push({
+            path:'/operationManage/templateManage/addTemplate',
+            query:{
+            mode:'add',
+            }
+        })
+    },
+    handleSearch(){
+      this.query.currentPage = 1
+      this.dataTemplate();
+
+    },
+    timeFormat(val){
+      return timeFormat(val)
+    },
+    handleCopy(id){
+        this.$router.push({
+        path:'/operationManage/templateManage/addTemplate',
+        query:{
+          mode:'copy',
+          id
+        }
+      })
+    },
+    handleDetail(id,mode){
+      this.$router.push({
+        path:'/operationManage/templateManage/addTemplate',
+        query:{
+          mode,
+          id
+        }
+      })
+    },
+    handleOperate(id,type){
+        let msg
+        if(type == 1){
+          msg = '启用'
+        }else if(type == 2){
+          msg = '禁用'
+        }else if(type == 3){
+          msg = '删除'
+        }
+        this.$confirm(`此操作将${msg}该活动, 是否继续?`, "提示", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning",
+        }).then(() => {
+          operate({id,type}).then(res=>{
+            if(res.state == 'Success'){
+                this.$notify({
+                  title: '成功',
+                  message: '操作成功',
+                  type: 'success'
+                });
+                this.handleSearch()
+            }
+          })
+        })
+    },
+    handleSizeChange(val) {
+      this.query.currentPage = 1;
+      this.query.pageSize = val;
+      this.dataTemplate()
+    },
+    handleCurrentChange(val) {
+      this.query.currentPage = val;
+       this.dataTemplate()
+    },
+    dataTemplate(){
+      this.loading = true
+      dataTemplate(this.query).then(res=>{
+        this.loading = false
+        if(res.state == 'Success'){
+          this.tableData = res.content.records
+          this.total = res.content.total
+        }
+      })
+    }
+  },
+  created() {
+   this.dataTemplate()
+  },
+};
+</script>
+  
+<style lang="scss" >
+.templateManage {
+
+}
+
+</style>
+  

+ 6 - 0
src/views/studyManage/questionBankManage/editQuestions.vue

@@ -176,6 +176,12 @@ export default {
       this.getResult()
     },
     add() {
+      if(this.setQuery.answers.length==5){
+        return this.$message({
+            message: '最多可设置5个答案',
+            type: 'error'
+          });
+      }
       this.setQuery.answers.push({
         answer: "",
         columnId: "",

+ 1 - 1
src/views/studyManage/tabManage/index.vue

@@ -58,7 +58,7 @@
     <el-form label-width="130px" :model="setQuery"
       ref="setQuery"
       :rules="rules">
-        <el-form-item label="活动名称"  prop="communityName">
+        <el-form-item label="标签名称"  prop="communityName">
             <el-input
             v-model.number="setQuery.communityName"
             class="item-width-300"

+ 5 - 4
src/views/updatePassword/index.vue

@@ -1,8 +1,8 @@
 <!--
  * @Author: wen 1454560336@qq.com
  * @Date: 2024-01-15 16:58:52
- * @LastEditors: wen 1454560336@qq.com
- * @LastEditTime: 2024-01-18 15:31:10
+ * @LastEditors: wenjie 1454560336@qq.com
+ * @LastEditTime: 2024-07-24 20:03:53
  * @FilePath: \admin-manage\src\views\updatePassword\index.vue
  * @Description: 
  * 
@@ -75,7 +75,7 @@ import { removeToken } from '@/utils/auth'
                         { validator: validatePassword1, trigger: 'blur' }
                     ],
                     
-                }
+                },
             }
         },
         methods: {
@@ -102,8 +102,9 @@ import { removeToken } from '@/utils/auth'
             },
             resetForm(formName) {
                 this.$refs[formName].resetFields();
-            }
+            },
         },
+  
     }
 </script>
 

+ 37 - 1
src/views/userManage/memberManage/index.vue

@@ -23,6 +23,20 @@
             :value="item.value"
           >
           </el-option>
+        </el-select>
+         <el-select
+          v-model="query.platformType"
+          size="small"
+          class="item-width-200 ml10"
+          placeholder="请选择注册平台"
+        >
+          <el-option
+            v-for="item in options1"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
         </el-select>
         <el-button
         class="ml10"
@@ -61,9 +75,13 @@
       <el-table-column
         prop="createTime"
         align="center"
-        label="地区"
+        label="注册平台"
         show-overflow-tooltip
       >
+       <template slot-scope="scope">
+          {{ scope.row.platformType == 1?'慧研学惠生活':'印象贵大' }}
+        </template>
+      
       </el-table-column>
       <el-table-column
         prop="setMealId"
@@ -82,6 +100,13 @@
         show-overflow-tooltip
       >
       </el-table-column>
+      <el-table-column
+        align="center"
+        prop="createTime"
+        label="注册时间"
+        show-overflow-tooltip
+      >
+      </el-table-column>
     </el-table>
     <div class="page-box">
       <el-pagination
@@ -110,8 +135,19 @@ export default {
       that: this,
       tableData: [],
       options: [],
+      options1: [
+        {
+          label:'慧研学惠生活',
+          value:1
+        },
+        {
+          label:'印象贵大',
+          value:2
+        }
+      ],
       loading: false,
       query: {
+        platformType:1,
         setMealId: "",
         userIdOrPhone: "",
         currentPage: 1,

+ 102 - 0
yarn.lock

@@ -2014,6 +2014,19 @@
   "resolved" "https://registry.npmjs.org/address/-/address-1.2.2.tgz"
   "version" "1.2.2"
 
+"adler-32@~1.2.0":
+  "integrity" "sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ=="
+  "resolved" "https://registry.npmmirror.com/adler-32/-/adler-32-1.2.0.tgz"
+  "version" "1.2.0"
+  dependencies:
+    "exit-on-epipe" "~1.0.1"
+    "printj" "~1.1.0"
+
+"adler-32@~1.3.0":
+  "integrity" "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A=="
+  "resolved" "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz"
+  "version" "1.3.1"
+
 "agentkeepalive@^3.4.1":
   "integrity" "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ=="
   "resolved" "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz"
@@ -3129,6 +3142,14 @@
   "resolved" "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz"
   "version" "0.12.0"
 
+"cfb@^1.1.4":
+  "integrity" "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA=="
+  "resolved" "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz"
+  "version" "1.2.2"
+  dependencies:
+    "adler-32" "~1.3.0"
+    "crc-32" "~1.2.0"
+
 "chalk@^1.1.3":
   "integrity" "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A=="
   "resolved" "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz"
@@ -3391,6 +3412,14 @@
     "chalk" "^2.4.1"
     "q" "^1.1.2"
 
+"codepage@~1.14.0":
+  "integrity" "sha512-iz3zJLhlrg37/gYRWgEPkaFTtzmnEv1h+r7NgZum2lFElYQPi0/5bnmuDfODHxfp0INEfnRqyfyeIJDbb7ahRw=="
+  "resolved" "https://registry.npmmirror.com/codepage/-/codepage-1.14.0.tgz"
+  "version" "1.14.0"
+  dependencies:
+    "commander" "~2.14.1"
+    "exit-on-epipe" "~1.0.1"
+
 "collection-visit@^1.0.0":
   "integrity" "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw=="
   "resolved" "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz"
@@ -3451,6 +3480,16 @@
   "resolved" "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz"
   "version" "2.20.3"
 
+"commander@~2.14.1":
+  "integrity" "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw=="
+  "resolved" "https://registry.npmmirror.com/commander/-/commander-2.14.1.tgz"
+  "version" "2.14.1"
+
+"commander@~2.17.1":
+  "integrity" "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="
+  "resolved" "https://registry.npmmirror.com/commander/-/commander-2.17.1.tgz"
+  "version" "2.17.1"
+
 "commander@~2.19.0":
   "integrity" "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg=="
   "resolved" "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz"
@@ -3673,6 +3712,11 @@
     "js-yaml" "^3.13.1"
     "parse-json" "^4.0.0"
 
+"crc-32@~1.2.0":
+  "integrity" "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="
+  "resolved" "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz"
+  "version" "1.2.2"
+
 "create-ecdh@^4.0.0":
   "integrity" "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A=="
   "resolved" "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz"
@@ -4930,6 +4974,11 @@
     "signal-exit" "^3.0.2"
     "strip-final-newline" "^2.0.0"
 
+"exit-on-epipe@~1.0.1":
+  "integrity" "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw=="
+  "resolved" "https://registry.npmmirror.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz"
+  "version" "1.0.1"
+
 "exit@^0.1.2":
   "integrity" "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ=="
   "resolved" "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz"
@@ -5121,6 +5170,11 @@
   dependencies:
     "bser" "2.1.1"
 
+"fflate@^0.3.8":
+  "integrity" "sha512-Rr5QlUeGN1mbOHlaqcSYMKVpPbgLy0AWT/W0EHxA6NGI12yO1jpoui2zBBvU2G824ltM6Ut8BFgfHSBGfkmS0A=="
+  "resolved" "https://registry.npmmirror.com/fflate/-/fflate-0.3.11.tgz"
+  "version" "0.3.11"
+
 "figgy-pudding@^3.5.1":
   "integrity" "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw=="
   "resolved" "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz"
@@ -5148,6 +5202,11 @@
     "loader-utils" "^1.2.3"
     "schema-utils" "^2.5.0"
 
+"file-saver@^2.0.5":
+  "integrity" "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
+  "resolved" "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz"
+  "version" "2.0.5"
+
 "file-uri-to-path@1.0.0":
   "integrity" "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="
   "resolved" "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz"
@@ -5358,6 +5417,11 @@
   "resolved" "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz"
   "version" "0.2.0"
 
+"frac@~1.1.2":
+  "integrity" "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="
+  "resolved" "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz"
+  "version" "1.1.2"
+
 "fragment-cache@^0.2.1":
   "integrity" "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA=="
   "resolved" "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz"
@@ -9365,6 +9429,11 @@
     "extend-shallow" "^2.0.1"
     "js-beautify" "^1.6.12"
 
+"printj@~1.1.0":
+  "integrity" "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
+  "resolved" "https://registry.npmmirror.com/printj/-/printj-1.1.2.tgz"
+  "version" "1.1.2"
+
 "prismjs@^1.23.0":
   "integrity" "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q=="
   "resolved" "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz"
@@ -10566,6 +10635,13 @@
   "resolved" "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz"
   "version" "1.0.3"
 
+"ssf@~0.11.2":
+  "integrity" "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g=="
+  "resolved" "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz"
+  "version" "0.11.2"
+  dependencies:
+    "frac" "~1.1.2"
+
 "sshpk@^1.7.0":
   "integrity" "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ=="
   "resolved" "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz"
@@ -12031,11 +12107,21 @@
   dependencies:
     "semver" "^5.0.1"
 
+"wmf@~1.0.1":
+  "integrity" "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw=="
+  "resolved" "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz"
+  "version" "1.0.2"
+
 "word-wrap@~1.2.3":
   "integrity" "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
   "resolved" "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz"
   "version" "1.2.3"
 
+"word@~0.3.0":
+  "integrity" "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA=="
+  "resolved" "https://registry.npmmirror.com/word/-/word-0.3.0.tgz"
+  "version" "0.3.0"
+
 "worker-farm@^1.7.0":
   "integrity" "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw=="
   "resolved" "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz"
@@ -12117,6 +12203,22 @@
   "resolved" "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz"
   "version" "7.5.8"
 
+"xlsx@^0.16.0":
+  "integrity" "sha512-gxi1I3EasYvgCX1vN9pGyq920Ron4NO8PNfhuoA3Hpq6Y8f0ECXiy4OLrK4QZBnj1jx3QD+8Fq5YZ/3mPZ5iXw=="
+  "resolved" "https://registry.npmmirror.com/xlsx/-/xlsx-0.16.9.tgz"
+  "version" "0.16.9"
+  dependencies:
+    "adler-32" "~1.2.0"
+    "cfb" "^1.1.4"
+    "codepage" "~1.14.0"
+    "commander" "~2.17.1"
+    "crc-32" "~1.2.0"
+    "exit-on-epipe" "~1.0.1"
+    "fflate" "^0.3.8"
+    "ssf" "~0.11.2"
+    "wmf" "~1.0.1"
+    "word" "~0.3.0"
+
 "xml-name-validator@^3.0.0":
   "integrity" "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="
   "resolved" "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz"