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

```
feat: 添加新功能模块和API接口

- 新增jy-manage活动管理模块路由配置
- 新增operation_coupon优惠券管理页面
- 新增order-manage_ponits-details和recharge-records页面
- 添加商品中心门店分类和重置功能API
- 添加虚拟商品名称修改和第三方余额查询API

fix: 修复表格搜索和订单详情显示问题

- 修复ZTable组件缺少search事件触发
- 修正订单详情页字段映射错误
- 修复政府积分管理搜索条件配置

refactor: 优化商品管理页面功能

- 为门店商品添加渠道价格重置表单
- 为虚拟商品添加名称修改功能
- 优化表格列配置和搜索条件
```

wenjie 1 неделя назад
Родитель
Сommit
7aafda5731

+ 3 - 3
.env.test

@@ -3,14 +3,14 @@
 # VITE_SERVICE_BASE_URL=https://b8dbdde.r39.cpolar.top #王
 # VITE_SERVICE_BASE_URL=https://b8dbdde.r39.cpolar.top #王
 # VITE_SERVICE_BASE_URL=http://89561bkaq794.vicp.fun:53846 #张
 # VITE_SERVICE_BASE_URL=http://89561bkaq794.vicp.fun:53846 #张
 # VITE_SERVICE_BASE_URL=http://192.168.1.89:8080#田
 # VITE_SERVICE_BASE_URL=http://192.168.1.89:8080#田
-# VITE_SERVICE_BASE_URL=http://192.168.0.19:8080 #邓
+VITE_SERVICE_BASE_URL=https://425f86e6.r24.cpolar.top #邓
 # VITE_SERVICE_BASE_URL=http://74949mkfh190.vicp.fun #付
 # VITE_SERVICE_BASE_URL=http://74949mkfh190.vicp.fun #付
 # VITE_SERVICE_BASE_URL=https://smqjh.api.zswlgz.com
 # VITE_SERVICE_BASE_URL=https://smqjh.api.zswlgz.com
 # VITE_SERVICE_BASE_URL=https://735a1bda.r24.cpolar.top #黄
 # VITE_SERVICE_BASE_URL=https://735a1bda.r24.cpolar.top #黄
 # VITE_SERVICE_BASE_URL=http://89561bkaq794.vicp.fun:53846
 # VITE_SERVICE_BASE_URL=http://89561bkaq794.vicp.fun:53846
 
 
-VITE_SERVICE_BASE_URL=https://smqjh.api.zswlgz.com #打包测试本地服务器
-# VITE_SERVICE_BASE_URL=/plt #测试打包服务器
+# VITE_SERVICE_BASE_URL=http://47.109.84.152:8081#打包测试本地服务器
+# VITE_SERVICE_BASE_URL=https://smqjh.api.zswlgz.com #服务器
 
 
 # other backend service base url, test environment
 # other backend service base url, test environment
 VITE_OTHER_SERVICE_BASE_URL= `{
 VITE_OTHER_SERVICE_BASE_URL= `{

+ 2 - 1
src/components/zt/Table/z-table.vue

@@ -13,7 +13,7 @@ export default defineComponent({
   props: {
   props: {
     ...basicProps
     ...basicProps
   },
   },
-  emits: ['register', 'add', 'delete'],
+  emits: ['register', 'add', 'delete', 'search'],
   setup(props, { emit, slots }) {
   setup(props, { emit, slots }) {
     const appStore = useAppStore();
     const appStore = useAppStore();
     const pageSize = import.meta.env.VITE_PAGE_SIZE;
     const pageSize = import.meta.env.VITE_PAGE_SIZE;
@@ -165,6 +165,7 @@ export default defineComponent({
 
 
       getForm.value = form;
       getForm.value = form;
       getDataByPage(1);
       getDataByPage(1);
+      emit('search');
     }
     }
     return {
     return {
       registerSearchForm,
       registerSearchForm,

+ 6 - 1
src/locales/langs/en-us.ts

@@ -285,7 +285,12 @@ const local: App.I18n.Schema = {
     'djk-manage_edit-activity': '',
     'djk-manage_edit-activity': '',
     'djk-manage_normal-order': '',
     'djk-manage_normal-order': '',
     'order-manage_after-sales-order': '',
     'order-manage_after-sales-order': '',
-    'order-manage_after-sales-order-detail': ''
+    'order-manage_after-sales-order-detail': '',
+    'jy-manage': '',
+    'jy-manage_activity': '',
+    'order-manage_ponits-details': '',
+    operation_coupon: '',
+    'order-manage_recharge-records': ''
   },
   },
   page: {
   page: {
     login: {
     login: {

+ 6 - 1
src/locales/langs/zh-cn.ts

@@ -282,7 +282,12 @@ const local: App.I18n.Schema = {
     'djk-manage_edit-activity': '',
     'djk-manage_edit-activity': '',
     'djk-manage_normal-order': '',
     'djk-manage_normal-order': '',
     'order-manage_after-sales-order': '',
     'order-manage_after-sales-order': '',
-    'order-manage_after-sales-order-detail': ''
+    'order-manage_after-sales-order-detail': '',
+    'jy-manage': '',
+    'jy-manage_activity': '',
+    'order-manage_ponits-details': '',
+    operation_coupon: '',
+    'order-manage_recharge-records': ''
   },
   },
   page: {
   page: {
     login: {
     login: {

+ 4 - 0
src/router/elegant/imports.ts

@@ -38,6 +38,7 @@ export const views: Record<LastLevelRouteKey, RouteComponent | (() => Promise<Ro
   government_points: () => import("@/views/government/points/index.vue"),
   government_points: () => import("@/views/government/points/index.vue"),
   "government_user-list": () => import("@/views/government/user-list/index.vue"),
   "government_user-list": () => import("@/views/government/user-list/index.vue"),
   home: () => import("@/views/home/index.vue"),
   home: () => import("@/views/home/index.vue"),
+  "jy-manage_activity": () => import("@/views/jy-manage/activity/index.vue"),
   manage_config: () => import("@/views/manage/config/index.vue"),
   manage_config: () => import("@/views/manage/config/index.vue"),
   manage_department: () => import("@/views/manage/department/index.vue"),
   manage_department: () => import("@/views/manage/department/index.vue"),
   manage_dict: () => import("@/views/manage/dict/index.vue"),
   manage_dict: () => import("@/views/manage/dict/index.vue"),
@@ -47,10 +48,13 @@ export const views: Record<LastLevelRouteKey, RouteComponent | (() => Promise<Ro
   manage_schedule: () => import("@/views/manage/schedule/index.vue"),
   manage_schedule: () => import("@/views/manage/schedule/index.vue"),
   manage_user: () => import("@/views/manage/user/index.vue"),
   manage_user: () => import("@/views/manage/user/index.vue"),
   "operation_accounting-strategy": () => import("@/views/operation/accounting-strategy/index.vue"),
   "operation_accounting-strategy": () => import("@/views/operation/accounting-strategy/index.vue"),
+  operation_coupon: () => import("@/views/operation/coupon/index.vue"),
   "order-manage_after-sales-order-detail": () => import("@/views/order-manage/after-sales-order-detail/index.vue"),
   "order-manage_after-sales-order-detail": () => import("@/views/order-manage/after-sales-order-detail/index.vue"),
   "order-manage_after-sales-order": () => import("@/views/order-manage/after-sales-order/index.vue"),
   "order-manage_after-sales-order": () => import("@/views/order-manage/after-sales-order/index.vue"),
   "order-manage_normal-order": () => import("@/views/order-manage/normal-order/index.vue"),
   "order-manage_normal-order": () => import("@/views/order-manage/normal-order/index.vue"),
   "order-manage_order-detail": () => import("@/views/order-manage/order-detail/index.vue"),
   "order-manage_order-detail": () => import("@/views/order-manage/order-detail/index.vue"),
+  "order-manage_ponits-details": () => import("@/views/order-manage/ponits-details/index.vue"),
+  "order-manage_recharge-records": () => import("@/views/order-manage/recharge-records/index.vue"),
   "user-center": () => import("@/views/user-center/index.vue"),
   "user-center": () => import("@/views/user-center/index.vue"),
   "user-management_user-list": () => import("@/views/user-management/user-list/index.vue"),
   "user-management_user-list": () => import("@/views/user-management/user-list/index.vue"),
   "xsb-manage_advertisement": () => import("@/views/xsb-manage/advertisement/index.vue"),
   "xsb-manage_advertisement": () => import("@/views/xsb-manage/advertisement/index.vue"),

+ 47 - 0
src/router/elegant/routes.ts

@@ -269,6 +269,26 @@ export const generatedRoutes: GeneratedRoute[] = [
       keepAlive: true
       keepAlive: true
     }
     }
   },
   },
+  {
+    name: 'jy-manage',
+    path: '/jy-manage',
+    component: 'layout.base',
+    meta: {
+      title: 'jy-manage',
+      i18nKey: 'route.jy-manage'
+    },
+    children: [
+      {
+        name: 'jy-manage_activity',
+        path: '/jy-manage/activity',
+        component: 'view.jy-manage_activity',
+        meta: {
+          title: 'jy-manage_activity',
+          i18nKey: 'route.jy-manage_activity'
+        }
+      }
+    ]
+  },
   {
   {
     name: 'login',
     name: 'login',
     path: '/login/:module(pwd-login|code-login|register|reset-pwd|bind-wechat)?',
     path: '/login/:module(pwd-login|code-login|register|reset-pwd|bind-wechat)?',
@@ -394,6 +414,15 @@ export const generatedRoutes: GeneratedRoute[] = [
           title: 'operation_accounting-strategy',
           title: 'operation_accounting-strategy',
           i18nKey: 'route.operation_accounting-strategy'
           i18nKey: 'route.operation_accounting-strategy'
         }
         }
+      },
+      {
+        name: 'operation_coupon',
+        path: '/operation/coupon',
+        component: 'view.operation_coupon',
+        meta: {
+          title: 'operation_coupon',
+          i18nKey: 'route.operation_coupon'
+        }
       }
       }
     ]
     ]
   },
   },
@@ -441,6 +470,24 @@ export const generatedRoutes: GeneratedRoute[] = [
           title: 'order-manage_order-detail',
           title: 'order-manage_order-detail',
           i18nKey: 'route.order-manage_order-detail'
           i18nKey: 'route.order-manage_order-detail'
         }
         }
+      },
+      {
+        name: 'order-manage_ponits-details',
+        path: '/order-manage/ponits-details',
+        component: 'view.order-manage_ponits-details',
+        meta: {
+          title: 'order-manage_ponits-details',
+          i18nKey: 'route.order-manage_ponits-details'
+        }
+      },
+      {
+        name: 'order-manage_recharge-records',
+        path: '/order-manage/recharge-records',
+        component: 'view.order-manage_recharge-records',
+        meta: {
+          title: 'order-manage_recharge-records',
+          i18nKey: 'route.order-manage_recharge-records'
+        }
       }
       }
     ]
     ]
   },
   },

+ 5 - 0
src/router/elegant/transform.ts

@@ -205,6 +205,8 @@ const routeMap: RouteMap = {
   "government_user-list": "/government/user-list",
   "government_user-list": "/government/user-list",
   "home": "/home",
   "home": "/home",
   "iframe-page": "/iframe-page/:url",
   "iframe-page": "/iframe-page/:url",
+  "jy-manage": "/jy-manage",
+  "jy-manage_activity": "/jy-manage/activity",
   "login": "/login/:module(pwd-login|code-login|register|reset-pwd|bind-wechat)?",
   "login": "/login/:module(pwd-login|code-login|register|reset-pwd|bind-wechat)?",
   "manage": "/manage",
   "manage": "/manage",
   "manage_config": "/manage/config",
   "manage_config": "/manage/config",
@@ -217,11 +219,14 @@ const routeMap: RouteMap = {
   "manage_user": "/manage/user",
   "manage_user": "/manage/user",
   "operation": "/operation",
   "operation": "/operation",
   "operation_accounting-strategy": "/operation/accounting-strategy",
   "operation_accounting-strategy": "/operation/accounting-strategy",
+  "operation_coupon": "/operation/coupon",
   "order-manage": "/order-manage",
   "order-manage": "/order-manage",
   "order-manage_after-sales-order": "/order-manage/after-sales-order",
   "order-manage_after-sales-order": "/order-manage/after-sales-order",
   "order-manage_after-sales-order-detail": "/order-manage/after-sales-order-detail",
   "order-manage_after-sales-order-detail": "/order-manage/after-sales-order-detail",
   "order-manage_normal-order": "/order-manage/normal-order",
   "order-manage_normal-order": "/order-manage/normal-order",
   "order-manage_order-detail": "/order-manage/order-detail",
   "order-manage_order-detail": "/order-manage/order-detail",
+  "order-manage_ponits-details": "/order-manage/ponits-details",
+  "order-manage_recharge-records": "/order-manage/recharge-records",
   "user-center": "/user-center",
   "user-center": "/user-center",
   "user-management": "/user-management",
   "user-management": "/user-management",
   "user-management_user-list": "/user-management/user-list",
   "user-management_user-list": "/user-management/user-list",

+ 21 - 0
src/service/api/goods-center/store-goods/index.ts

@@ -61,3 +61,24 @@ export function fetchImportGoods(data: { file: File }) {
     }
     }
   });
   });
 }
 }
+
+/**
+ * 获取门店分类
+ * @returns
+ */
+export function fetchGetShopCategories(params: any) {
+  return request({
+    url: '/smqjh-pms/api/v1/shop-categories',
+    method: 'get',
+    params
+  });
+}
+
+// 重置商品
+export function fetchReset(data: any) {
+  return request({
+    url: '/smqjh-pms/api/v1/channelProd/deleteUpdate',
+    method: 'post',
+    data
+  });
+}

+ 23 - 0
src/service/api/goods-center/virtual-goods/index.ts

@@ -85,3 +85,26 @@ export function fetchUpdateProductImg(data: any) {
     params: data
     params: data
   });
   });
 }
 }
+
+/**
+ * 修改商品名称
+ * @returns
+ */
+export function fetchUpdateName(data: any) {
+  return request({
+    url: '/smqjh-pms/v1/videoProduct/updateName',
+    method: 'post',
+    data
+  });
+}
+
+/**
+ * 获取第三方平台余额
+ * @returns
+ */
+export function fetchFindThirdPartyBalance() {
+  return request({
+    url: '/smqjh-pms/v1/videoProduct/findThirdPartyBalance',
+    method: 'get'
+  });
+}

+ 81 - 0
src/service/api/jy-manage/activity/index.ts

@@ -0,0 +1,81 @@
+import { request } from '@/service/request';
+
+/**
+ * 所有列表
+ * @returns
+ */
+export function fetchGetActivityList(data: any) {
+  return request({
+    url: `/smqjh-system/sys-api/coupon/page`,
+    method: 'get',
+    params: data
+  });
+}
+
+/**
+ *
+    新增
+ * @param data
+ * @returns
+ */
+
+export function fetchAddActivity(data: any) {
+  return request({
+    url: `/smqjh-system/sys-api/coupon/save`,
+    method: 'post',
+    data
+  });
+}
+
+/**
+ *
+    编辑
+ * @param data
+ * @returns
+ */
+
+export function fetchEditActivity(data: any) {
+  return request({
+    url: `/smqjh-system/sys-api/coupon/update`,
+    method: 'PUT',
+    data
+  });
+}
+
+/**
+ *
+    删除
+ * @param data
+ * @returns
+ */
+
+export function delActivity(id: any) {
+  return request({
+    url: `/smqjh-system/sys-api/coupon/delete/${id}`,
+    method: 'DELETE'
+  });
+}
+
+/**
+ * 获取领取记录
+ * @returns
+ */
+export function fetchReceiveRecord(data: any) {
+  return request({
+    url: `/smqjh-system/sys-api/coupon/receiveRecord`,
+    method: 'get',
+    params: data
+  });
+}
+
+/**
+ * 获取领取记录统计
+ * @returns
+ */
+export function fetchReceiveRecordCount(data: any) {
+  return request({
+    url: `/smqjh-system/sys-api/coupon/receiveRecordCount`,
+    method: 'get',
+    params: data
+  });
+}

+ 69 - 0
src/service/api/operation/coupon/index.ts

@@ -0,0 +1,69 @@
+import { request } from '@/service/request';
+/**
+ * 分页获取券列表
+ * @param params
+ * @returns
+ */
+export function fetchList(data: any) {
+  return request({
+    url: '/smqjh-system/api/v1/recharge-level/page',
+    method: 'get',
+    params: data
+  });
+}
+
+/**
+ * 获取详情
+ * @param params
+ * @returns
+ */
+export function fetchDetail(id: any) {
+  return request({
+    url: `/smqjh-system/api/v1/recharge-level/${id}/form`,
+    method: 'get'
+  });
+}
+
+/**
+ *
+    新增
+ * @param data
+ * @returns
+ */
+
+export function fetchAdd(data: any) {
+  return request({
+    url: `/smqjh-system/api/v1/recharge-level/add`,
+    method: 'post',
+    data
+  });
+}
+
+/**
+ *
+    编辑
+ * @param data
+ * @returns
+ */
+
+export function fetchEdit(data: any) {
+  return request({
+    url: `/smqjh-system/api/v1/recharge-level/edit/${data.id}`,
+    method: 'put',
+    data
+  });
+}
+
+/**
+ *
+    编辑
+ * @param data
+ * @returns
+ */
+
+export function fetchDelete(ids: any) {
+  return request({
+    url: `/smqjh-system/api/v1/recharge-level/delete/${ids}`,
+    method: 'delete'
+  });
+}

+ 13 - 0
src/service/api/order-manage/ponits-details/index.ts

@@ -0,0 +1,13 @@
+import { request } from '@/service/request';
+/**
+ * 分页获取商品
+ * @param params
+ * @returns
+ */
+export function fetchList(data: any) {
+  return request({
+    url: '/smqjh-system/app-api/v1/pointsRecord/backendPointsRecordList',
+    method: 'get',
+    params: data
+  });
+}

+ 13 - 0
src/service/api/order-manage/recharge-records/index.ts

@@ -0,0 +1,13 @@
+import { request } from '@/service/request';
+/**
+ * 分页获取充值记录
+ * @param params
+ * @returns
+ */
+export function fetchList(data: any) {
+  return request({
+    url: '/smqjh-system/api/v1/purchaseRecord/getPurchaseRecordPage',
+    method: 'post',
+    data
+  });
+}

+ 10 - 0
src/typings/elegant-router.d.ts

@@ -59,6 +59,8 @@ declare module "@elegant-router/types" {
     "government_user-list": "/government/user-list";
     "government_user-list": "/government/user-list";
     "home": "/home";
     "home": "/home";
     "iframe-page": "/iframe-page/:url";
     "iframe-page": "/iframe-page/:url";
+    "jy-manage": "/jy-manage";
+    "jy-manage_activity": "/jy-manage/activity";
     "login": "/login/:module(pwd-login|code-login|register|reset-pwd|bind-wechat)?";
     "login": "/login/:module(pwd-login|code-login|register|reset-pwd|bind-wechat)?";
     "manage": "/manage";
     "manage": "/manage";
     "manage_config": "/manage/config";
     "manage_config": "/manage/config";
@@ -71,11 +73,14 @@ declare module "@elegant-router/types" {
     "manage_user": "/manage/user";
     "manage_user": "/manage/user";
     "operation": "/operation";
     "operation": "/operation";
     "operation_accounting-strategy": "/operation/accounting-strategy";
     "operation_accounting-strategy": "/operation/accounting-strategy";
+    "operation_coupon": "/operation/coupon";
     "order-manage": "/order-manage";
     "order-manage": "/order-manage";
     "order-manage_after-sales-order": "/order-manage/after-sales-order";
     "order-manage_after-sales-order": "/order-manage/after-sales-order";
     "order-manage_after-sales-order-detail": "/order-manage/after-sales-order-detail";
     "order-manage_after-sales-order-detail": "/order-manage/after-sales-order-detail";
     "order-manage_normal-order": "/order-manage/normal-order";
     "order-manage_normal-order": "/order-manage/normal-order";
     "order-manage_order-detail": "/order-manage/order-detail";
     "order-manage_order-detail": "/order-manage/order-detail";
+    "order-manage_ponits-details": "/order-manage/ponits-details";
+    "order-manage_recharge-records": "/order-manage/recharge-records";
     "user-center": "/user-center";
     "user-center": "/user-center";
     "user-management": "/user-management";
     "user-management": "/user-management";
     "user-management_user-list": "/user-management/user-list";
     "user-management_user-list": "/user-management/user-list";
@@ -140,6 +145,7 @@ declare module "@elegant-router/types" {
     | "government"
     | "government"
     | "home"
     | "home"
     | "iframe-page"
     | "iframe-page"
+    | "jy-manage"
     | "login"
     | "login"
     | "manage"
     | "manage"
     | "operation"
     | "operation"
@@ -188,6 +194,7 @@ declare module "@elegant-router/types" {
     | "government_points"
     | "government_points"
     | "government_user-list"
     | "government_user-list"
     | "home"
     | "home"
+    | "jy-manage_activity"
     | "manage_config"
     | "manage_config"
     | "manage_department"
     | "manage_department"
     | "manage_dict"
     | "manage_dict"
@@ -197,10 +204,13 @@ declare module "@elegant-router/types" {
     | "manage_schedule"
     | "manage_schedule"
     | "manage_user"
     | "manage_user"
     | "operation_accounting-strategy"
     | "operation_accounting-strategy"
+    | "operation_coupon"
     | "order-manage_after-sales-order-detail"
     | "order-manage_after-sales-order-detail"
     | "order-manage_after-sales-order"
     | "order-manage_after-sales-order"
     | "order-manage_normal-order"
     | "order-manage_normal-order"
     | "order-manage_order-detail"
     | "order-manage_order-detail"
+    | "order-manage_ponits-details"
+    | "order-manage_recharge-records"
     | "user-center"
     | "user-center"
     | "user-management_user-list"
     | "user-management_user-list"
     | "xsb-manage_advertisement"
     | "xsb-manage_advertisement"

+ 5 - 1
src/views/djk-manage/normal-order/normal-order.ts

@@ -373,5 +373,9 @@ export const businessType = {
   DYY: '电影演出',
   DYY: '电影演出',
   DJK: '大健康',
   DJK: '大健康',
   XNSP: '虚拟商品',
   XNSP: '虚拟商品',
-  JY: '加油'
+  JY: '加油',
+  CZ: '充值',
+  GQ: '过期',
+  TKGQ: '退款过期',
+  TK: '退款'
 };
 };

+ 123 - 2
src/views/goods-center/store-goods/index.vue

@@ -12,13 +12,17 @@ import { fetchGetDictDataList } from '@/service/api/system-manage';
 import {
 import {
   // fetchGetAllChannelList,
   // fetchGetAllChannelList,
   fetchGetChannelList,
   fetchGetChannelList,
+  fetchGetShopCategories,
   fetchImportGoods,
   fetchImportGoods,
   fetchProductList,
   fetchProductList,
+  fetchReset,
   fetchSetUpChannels
   fetchSetUpChannels
 } from '@/service/api/goods-center/store-goods';
 } from '@/service/api/goods-center/store-goods';
+import { useAuth } from '@/hooks/business/auth';
 import { areAllItemsAllFieldsFilled } from '@/utils/zt';
 import { areAllItemsAllFieldsFilled } from '@/utils/zt';
 import { commonExport } from '@/utils/common';
 import { commonExport } from '@/utils/common';
 import { useTable } from '@/components/zt/Table/hooks/useTable';
 import { useTable } from '@/components/zt/Table/hooks/useTable';
+import { useModalFrom } from '@/components/zt/ModalForm/hooks/useModalForm';
 import SvgIcon from '@/components/custom/svg-icon.vue';
 import SvgIcon from '@/components/custom/svg-icon.vue';
 import { useModal } from '@/components/zt/Modal/hooks/useModal';
 import { useModal } from '@/components/zt/Modal/hooks/useModal';
 // import { businessType } from '../../order-manage/normal-order/normal-order';
 // import { businessType } from '../../order-manage/normal-order/normal-order';
@@ -27,6 +31,8 @@ const importTemplateRef = useTemplateRef('importTemplateRef');
 const loading = ref(false);
 const loading = ref(false);
 
 
 const options = ref<Api.goods.Channel[]>([]);
 const options = ref<Api.goods.Channel[]>([]);
+const typeOptions = ref([]);
+const loadingCategories = ref(false);
 // const TypeName = ['企业用户', 'B端用户', 'C端用户'];
 // const TypeName = ['企业用户', 'B端用户', 'C端用户'];
 const statusList = ['商家下架', '上架', '违规下架', '平台审核'];
 const statusList = ['商家下架', '上架', '违规下架', '平台审核'];
 const businessType = ref<Record<string, string>>({});
 const businessType = ref<Record<string, string>>({});
@@ -336,7 +342,10 @@ const [registerTable, { getTableCheckedRowKeys, refresh, getTableData, getSeachF
       {
       {
         label: '关键词',
         label: '关键词',
         component: 'NInput',
         component: 'NInput',
-        field: 'keywords'
+        field: 'keywords',
+        componentProps: {
+          placeholder: '请输入商品名称/海博商品ID'
+        }
       },
       },
       {
       {
         label: '业务类型',
         label: '业务类型',
@@ -406,7 +415,7 @@ const [registerTable, { getTableCheckedRowKeys, refresh, getTableData, getSeachF
       {
       {
         label: '海博商品ID',
         label: '海博商品ID',
         component: 'NInput',
         component: 'NInput',
-        field: 'hbSkuld'
+        field: 'hbSkuId'
       },
       },
       {
       {
         label: '商品编码',
         label: '商品编码',
@@ -456,6 +465,89 @@ const [registerModalFail, { openModal: openModalFail }] = useModal({
   showFooter: false
   showFooter: false
 });
 });
 
 
+const [
+  registerModalForm,
+  {
+    openModal: openModalForm,
+    setFieldsValue: setModalFormValue,
+    getFieldsValue: getModalFormValue,
+    closeModal: closeModalForm,
+    setSubLoading
+  }
+] = useModalFrom({
+  modalConfig: {
+    title: '重置渠道价格',
+    isShowHeaderText: false
+  },
+  formConfig: {
+    schemas: [
+      {
+        label: '门店名称',
+        component: 'ApiSelect',
+        field: 'shopId',
+        required: true,
+        componentProps: {
+          api: fetchGetStoreList,
+          resultFeild: 'data.list',
+          labelFeild: 'shopName',
+          valueFeild: 'shopId',
+          onUpdateValue: e => {
+            console.log(e, '门店名称');
+            if (e) {
+              getShopCategories(e);
+            } else {
+              typeOptions.value = [];
+            }
+          }
+        }
+      },
+      {
+        field: 'categoryCodes',
+        label: '分类',
+        component: 'NInput',
+        required: true,
+        render({ model }) {
+          return (
+            <div>
+              <NSelect
+                v-model:value={model.categoryCodes}
+                class={'w-400px'}
+                multiple
+                loading={loadingCategories.value}
+                label-field="name"
+                value-field="code"
+                placeholder="请先选择门店再选择分类"
+                options={typeOptions.value}
+              />
+            </div>
+          );
+        },
+        ifShow({ model }) {
+          return model.shopId;
+        }
+      },
+      {
+        field: 'channelId',
+        component: 'ApiSelect',
+        label: '渠道',
+        componentProps: {
+          api: fetchGetChannelList,
+          labelField: 'channelName',
+          valueField: 'id',
+          clearable: true
+        },
+        required: true
+      }
+    ],
+    labelWidth: 120,
+    layout: 'horizontal',
+    gridProps: {
+      cols: '1',
+      itemResponsive: true
+    }
+  }
+});
+
 const isDisabledExport = computed(() => {
 const isDisabledExport = computed(() => {
   return !getTableCheckedRowKeys().length;
   return !getTableCheckedRowKeys().length;
 });
 });
@@ -592,6 +684,18 @@ async function getData() {
   }
   }
 }
 }
 getData();
 getData();
+
+async function getShopCategories(shopId: any) {
+  loadingCategories.value = true;
+  const { data, error } = await fetchGetShopCategories({ shopId });
+  const categoryCodes = data.map((item: any) => item.code);
+  setModalFormValue({ categoryCodes });
+  loadingCategories.value = false;
+  if (!error) {
+    typeOptions.value = data;
+  }
+}
+
 async function handleExport() {
 async function handleExport() {
   setTableLoading(true);
   setTableLoading(true);
   try {
   try {
@@ -600,6 +704,18 @@ async function handleExport() {
     setTableLoading(false);
     setTableLoading(false);
   }
   }
 }
 }
+
+async function handleSubmit() {
+  const form = await getModalFormValue();
+  console.log(form, '表单');
+  const { error } = await fetchReset(form);
+  if (!error) {
+    window.$message?.success('保存成功');
+  }
+  setSubLoading(false);
+  closeModalForm();
+  refresh();
+}
 </script>
 </script>
 
 
 <template>
 <template>
@@ -612,6 +728,9 @@ async function handleExport() {
       </template>
       </template>
       <template #prefix="{ loading }">
       <template #prefix="{ loading }">
         <NSpace>
         <NSpace>
+          <NButton v-if="useAuth().hasAuth('goods:reset-btn')" size="small" @click="openModalForm">
+            渠道价格重置
+          </NButton>
           <NButton size="small" @click="openImportLogModal">导入记录</NButton>
           <NButton size="small" @click="openImportLogModal">导入记录</NButton>
           <NButton size="small" @click="openImportModal">导入商品销售渠道及价格</NButton>
           <NButton size="small" @click="openImportModal">导入商品销售渠道及价格</NButton>
           <NButton size="small" :disabled="tableData.length == 0" :loading="loading" @click="handleExport">
           <NButton size="small" :disabled="tableData.length == 0" :loading="loading" @click="handleExport">
@@ -642,6 +761,8 @@ async function handleExport() {
         @register="registerLogTable"
         @register="registerLogTable"
       ></ZTable>
       ></ZTable>
     </BasicModal>
     </BasicModal>
+
+    <BasicModelForm @register-modal-form="registerModalForm" @submit-form="handleSubmit"></BasicModelForm>
   </LayoutTable>
   </LayoutTable>
 </template>
 </template>
 
 

+ 81 - 2
src/views/goods-center/virtual-goods/index.vue

@@ -12,10 +12,12 @@ import { NButton, NImage, NInputNumber, NSelect } from 'naive-ui';
 import {
 import {
   // fetchGetAllChannelList,
   // fetchGetAllChannelList,
   fetchChangeStatus,
   fetchChangeStatus,
+  fetchFindThirdPartyBalance,
   fetchGetChannelList,
   fetchGetChannelList,
   fetchImportGoods,
   fetchImportGoods,
   fetchProductList,
   fetchProductList,
   fetchSetUpChannels,
   fetchSetUpChannels,
+  fetchUpdateName,
   fetchUpdateProductImg
   fetchUpdateProductImg
 } from '@/service/api/goods-center/virtual-goods';
 } from '@/service/api/goods-center/virtual-goods';
 import { areAllItemsAllFieldsFilled } from '@/utils/zt';
 import { areAllItemsAllFieldsFilled } from '@/utils/zt';
@@ -26,7 +28,7 @@ import { useModal } from '@/components/zt/Modal/hooks/useModal';
 import { useModalFrom } from '@/components/zt/ModalForm/hooks/useModalForm';
 import { useModalFrom } from '@/components/zt/ModalForm/hooks/useModalForm';
 type Price = { channelId: number | undefined; channelProdPrice: number; id?: number; channelName?: string };
 type Price = { channelId: number | undefined; channelProdPrice: number; id?: number; channelName?: string };
 const importTemplateRef = useTemplateRef('importTemplateRef');
 const importTemplateRef = useTemplateRef('importTemplateRef');
-
+const Balance = ref<number>(0);
 const options = ref<Api.goods.Channel[]>([]);
 const options = ref<Api.goods.Channel[]>([]);
 // const TypeName = ['企业用户', 'B端用户', 'C端用户'];
 // const TypeName = ['企业用户', 'B端用户', 'C端用户'];
 const statusList = ['上架', '下架'];
 const statusList = ['上架', '下架'];
@@ -61,6 +63,15 @@ const columns: NaiveUI.TableColumn<Api.goods.ShopSku>[] = [
       tooltip: true
       tooltip: true
     }
     }
   },
   },
+  {
+    key: 'localProductName',
+    title: '本地商品名称',
+    align: 'center',
+    width: 120,
+    ellipsis: {
+      tooltip: true
+    }
+  },
   {
   {
     key: 'productType',
     key: 'productType',
     title: '商品类型',
     title: '商品类型',
@@ -395,6 +406,47 @@ const [
   }
   }
 });
 });
 
 
+const [
+  registerNameModalForm,
+  {
+    openModal: opeNamenModalForm,
+    setFieldsValue: setNameModalFormValue,
+    getFieldsValue: getNameModalFormValue,
+    closeModal: closeNameModalForm,
+    setSubLoading: setNameSubLoading
+  }
+] = useModalFrom({
+  modalConfig: {
+    title: '商品名称',
+    isShowHeaderText: true,
+    height: 300,
+    width: 500
+  },
+  formConfig: {
+    schemas: [
+      {
+        field: 'videoProductId',
+        label: '分类ID',
+        component: 'NInput',
+        required: true,
+        show: false
+      },
+      {
+        field: 'videoProductName',
+        label: '本地商品名称',
+        component: 'NInput',
+        required: true
+      }
+    ],
+    labelWidth: 120,
+    layout: 'horizontal',
+    gridProps: {
+      cols: '1',
+      itemResponsive: true
+    }
+  }
+});
+
 // const isDisabledExport = computed(() => {
 // const isDisabledExport = computed(() => {
 //   return !getTableCheckedRowKeys().length;
 //   return !getTableCheckedRowKeys().length;
 // });
 // });
@@ -440,6 +492,10 @@ function handleModalImg(row: Api.goods.ShopSku) {
   openModalForm(row);
   openModalForm(row);
   setModalFormValue({ productImg: row.productImg, productId: row.productId });
   setModalFormValue({ productImg: row.productImg, productId: row.productId });
 }
 }
+function handleModalName(row: Api.goods.ShopSku) {
+  opeNamenModalForm(row);
+  setNameModalFormValue({ videoProductId: row.id, videoProductName: row.localProductName });
+}
 function handleAddPrice() {
 function handleAddPrice() {
   // if (PriceData.value.length == 3) {
   // if (PriceData.value.length == 3) {
   //   window.$message?.error('最多只能添加3条数据');
   //   window.$message?.error('最多只能添加3条数据');
@@ -542,14 +598,32 @@ async function handleSubmit() {
   closeModalForm();
   closeModalForm();
   refresh();
   refresh();
 }
 }
+
+async function handleSubmitName() {
+  const form = await getNameModalFormValue();
+  // console.log(form, '表单', selectChekedKeys.value);
+  await fetchUpdateName(form);
+  setNameSubLoading(false);
+  closeNameModalForm();
+  refresh();
+}
+async function handleFindThirdPartyBalance() {
+  const { data, error } = await fetchFindThirdPartyBalance();
+  if (!error) {
+    Balance.value = data;
+  }
+}
+handleFindThirdPartyBalance();
 </script>
 </script>
 
 
 <template>
 <template>
   <LayoutTable>
   <LayoutTable>
-    <ZTable :columns="columns" :api="fetchProductList" @register="registerTable">
+    <ZTable :columns="columns" :api="fetchProductList" @search="handleFindThirdPartyBalance" @register="registerTable">
       <template #op="{ row }">
       <template #op="{ row }">
         <NSpace align="center">
         <NSpace align="center">
           <NButton size="small" ghost type="primary" @click="handleModalImg(row)">编辑图片</NButton>
           <NButton size="small" ghost type="primary" @click="handleModalImg(row)">编辑图片</NButton>
+          <NButton size="small" ghost type="primary" @click="handleModalName(row)">修改名称</NButton>
+
           <NButton size="small" ghost type="primary" @click="handleModalPrice(row)">设置渠道及价格</NButton>
           <NButton size="small" ghost type="primary" @click="handleModalPrice(row)">设置渠道及价格</NButton>
           <NButton size="small" ghost type="primary" @click="handleStatus(row)">
           <NButton size="small" ghost type="primary" @click="handleStatus(row)">
             {{ row.productStatus == 1 ? '上架' : '下架' }}
             {{ row.productStatus == 1 ? '上架' : '下架' }}
@@ -558,6 +632,10 @@ async function handleSubmit() {
       </template>
       </template>
       <template #prefix="{ loading }">
       <template #prefix="{ loading }">
         <NSpace>
         <NSpace>
+          <NButton type="primary" size="small" @click="handleFindThirdPartyBalance">
+            蓝色兄弟余额:
+            <div class="text-red">{{ Balance }}元</div>
+          </NButton>
           <NButton size="small" @click="openImportModal">导入商品销售渠道及价格</NButton>
           <NButton size="small" @click="openImportModal">导入商品销售渠道及价格</NButton>
           <NButton size="small" :disabled="tableData.length == 0" :loading="loading" @click="handleExport">
           <NButton size="small" :disabled="tableData.length == 0" :loading="loading" @click="handleExport">
             导出全部
             导出全部
@@ -579,6 +657,7 @@ async function handleSubmit() {
     </BasicModal>
     </BasicModal>
 
 
     <BasicModelForm @register-modal-form="registerModalForm" @submit-form="handleSubmit"></BasicModelForm>
     <BasicModelForm @register-modal-form="registerModalForm" @submit-form="handleSubmit"></BasicModelForm>
+    <BasicModelForm @register-modal-form="registerNameModalForm" @submit-form="handleSubmitName"></BasicModelForm>
   </LayoutTable>
   </LayoutTable>
 </template>
 </template>
 
 

+ 16 - 1
src/views/government/points/index.vue

@@ -105,6 +105,20 @@ const searchSchemas: FormSchema[] = [
     field: 'userPhone',
     field: 'userPhone',
     label: '员工手机号',
     label: '员工手机号',
     component: 'NInput'
     component: 'NInput'
+  },
+  {
+    field: 'userName',
+    label: '员工姓名',
+    component: 'NInput'
+  },
+  {
+    label: '创建时间',
+    component: 'NDatePicker',
+    field: 'createTime',
+    componentProps: {
+      type: 'datetimerange',
+      defaultTime: ['00:00:00', '23:59:59']
+    }
   }
   }
 ];
 ];
 const failColumns: NaiveUI.TableColumn<Api.government.PointsFailureRecordVO>[] = [
 const failColumns: NaiveUI.TableColumn<Api.government.PointsFailureRecordVO>[] = [
@@ -235,7 +249,8 @@ const [registerModalTable, { refresh: refreshModal, setFieldsValue, getSeachForm
       title: '积分列表',
       title: '积分列表',
       showAddButton: false,
       showAddButton: false,
       minHeight: 400,
       minHeight: 400,
-      defaultParamsNotReset: 'channelIdList'
+      defaultParamsNotReset: 'channelIdList',
+      fieldMapToTime: [['createTime', ['createTimeStart', 'createTimeEnd']]]
     }
     }
   });
   });
 
 

+ 492 - 0
src/views/jy-manage/activity/index.vue

@@ -0,0 +1,492 @@
+<script setup lang="tsx">
+import { ref } from 'vue';
+import { NButton, NTag } from 'naive-ui';
+import {
+  delActivity,
+  fetchAddActivity,
+  fetchEditActivity,
+  fetchGetActivityList,
+  fetchReceiveRecord,
+  fetchReceiveRecordCount
+} from '@/service/api/jy-manage/activity';
+import { useModalFrom } from '@/components/zt/ModalForm/hooks/useModalForm';
+import { useTable } from '@/components/zt/Table/hooks/useTable';
+import { useModal } from '@/components/zt/Modal/hooks/useModal';
+const couponId = ref();
+const countObj = ref({
+  provideNumber: '',
+  unclaimedNumber: 0,
+  receiveUnusedNumber: 0,
+  receiveUsedNumber: '',
+  receiveFreezeNumber: '',
+  receiveFailureNumber: ''
+});
+const [registerModalTable, { refresh }] = useTable({
+  searchFormConfig: {
+    schemas: [
+      {
+        field: 'activityName',
+        component: 'NInput',
+        label: '活动名称'
+      }
+    ],
+    inline: false,
+    size: 'small',
+    labelPlacement: 'left',
+    isFull: false
+  },
+  tableConfig: {
+    keyField: 'id',
+    title: '活动列表',
+    minHeight: 400
+  }
+});
+
+const [registerModal, { openModal }] = useModal({
+  title: '查看领取情况',
+  height: 800,
+  showFooter: false,
+  width: 1200
+});
+
+const [registerClaimModalTable, { refresh: refreshModal }] = useTable({
+  searchFormConfig: {
+    schemas: [
+      // {
+      //   field: 'activityId',
+      //   component: 'NInput',
+      //   label: '券ID'
+      // },
+      {
+        field: 'batchId',
+        component: 'NInput',
+        label: '批次号'
+      },
+      {
+        field: 'useStatus',
+        component: 'NSelect',
+        label: '状态',
+        componentProps: {
+          options: [
+            {
+              label: '已使用',
+              value: 1
+            },
+            {
+              label: '可使用',
+              value: 2
+            },
+            {
+              label: '已过期',
+              value: 5
+            },
+            {
+              label: '未生效',
+              value: 7
+            }
+          ]
+        }
+      },
+      {
+        field: 'memberMobile',
+        component: 'NInput',
+        label: '用户手机号'
+      },
+      {
+        field: 'lockOrderId',
+        component: 'NInput',
+        label: '订单号'
+      }
+    ],
+    inline: false,
+    size: 'small',
+    labelPlacement: 'left',
+    isFull: false
+  },
+  tableConfig: {
+    keyField: 'id',
+    title: '',
+    showAddButton: false,
+    minHeight: 400,
+    showTableHeaderAction: true
+  }
+});
+
+const [
+  registerModalForm,
+  {
+    openModal: openModalForm,
+    setFieldsValue: setModalFormValue,
+    getFieldsValue: getModalFormValue,
+    closeModal: closeModalForm,
+    setSubLoading
+  }
+] = useModalFrom({
+  modalConfig: {
+    title: '一级分类',
+    isShowHeaderText: true
+  },
+  formConfig: {
+    schemas: [
+      {
+        field: 'id',
+        label: 'ID',
+        show: false,
+        component: 'NInput'
+      },
+      {
+        field: 'activityId',
+        label: '活动ID',
+        component: 'NInput',
+        required: true,
+        componentProps: {
+          placeholder: '小桔提供,务必仔细核对,保持一致'
+        }
+      },
+      {
+        field: 'activityName',
+        component: 'NInput',
+        label: '活动名称',
+        required: true,
+        componentProps: {
+          maxlength: 20
+        }
+      },
+      {
+        field: 'promotionType',
+        component: 'NRadioGroup',
+        label: '类型',
+        required: true,
+        defaultValue: 1,
+        componentProps: {
+          options: [
+            {
+              label: '满减券',
+              value: 1
+            },
+            {
+              label: '立减券',
+              value: 2
+            }
+          ]
+        }
+      },
+      {
+        field: 'amountMoney',
+        component: 'NInputNumber',
+        label: '门槛(元)',
+        required: true,
+        componentProps: {
+          min: 0,
+          max: 1000,
+          precision: 2
+        }
+      },
+      {
+        field: 'discountMoney',
+        component: 'NInputNumber',
+        label: '面额(元)',
+        rules: { validator: validateDiscountMoney, trigger: 'input' },
+        componentProps: {
+          min: 0,
+          max: 1000,
+          precision: 2
+        }
+      },
+      {
+        field: 'inventory',
+        component: 'NInputNumber',
+        label: '库存',
+        required: true,
+        componentProps: {
+          min: 0,
+          max: 100000
+        }
+      },
+      {
+        field: 'purchasePrice',
+        component: 'NInputNumber',
+        label: '含税采购价(元)',
+        rules: { validator: validatePrice, message: '小于等于面额', trigger: 'input' },
+        componentProps: {
+          min: 0
+        }
+      },
+      {
+        field: 'createTime',
+        label: '发放有效期',
+        component: 'NDatePicker',
+        required: true,
+        componentProps: {
+          type: 'datetimerange',
+          defaultTime: ['00:00:00', '23:59:59']
+        }
+      },
+      {
+        field: 'expirationDate',
+        component: 'NInputNumber',
+        label: '券使用有效期',
+        required: true,
+        componentProps: {
+          min: 0,
+          max: 100000
+        },
+        render: ({ model, field }) => {
+          return (
+            <div class="flex items-center">
+              领取后 <n-input-number v-model:value={model[field]} min={0} max={100} clearable /> 天有效
+            </div>
+          );
+        }
+      }
+    ],
+    labelWidth: 120,
+    layout: 'horizontal',
+    gridProps: {
+      cols: '1',
+      itemResponsive: true
+    }
+  }
+});
+
+const tableColumns: NaiveUI.TableColumn<Api.goods.ShopCategory>[] = [
+  {
+    title: '活动ID',
+    align: 'center',
+    key: 'activityId'
+  },
+  {
+    title: '活动名称',
+    align: 'center',
+    key: 'activityName'
+  },
+  {
+    title: '类型',
+    align: 'center',
+    key: 'promotionType',
+    render: row => {
+      return row.promotionType === 1 ? '满减券' : '立减券';
+    }
+  },
+  {
+    title: '门槛(元)',
+    align: 'center',
+    key: 'amountMoney'
+  },
+  {
+    title: '面额(元)',
+    align: 'center',
+    key: 'discountMoney'
+  },
+  {
+    title: '库存',
+    align: 'center',
+    key: 'inventoryTotal'
+  },
+  {
+    title: '含税采购价(元)',
+    align: 'center',
+    key: 'purchasePrice'
+  },
+  {
+    title: '发放有效期',
+    align: 'center',
+    key: 'createTime',
+    render: row => {
+      return `${row.couponStartTime}~${row.couponEndTime}`;
+    }
+  },
+  {
+    title: '券使用有效期',
+    align: 'center',
+    key: 'expirationDate'
+  },
+
+  {
+    title: '操作',
+    key: 'op',
+    fixed: 'right',
+    align: 'center',
+    width: 230,
+    render: row => (
+      <div class="flex-center gap-8px">
+        {
+          <NButton type="primary" size="small" ghost onClick={() => handleRecord(row.id)}>
+            查看领取情况
+          </NButton>
+        }
+        {
+          <NButton type="primary" size="small" ghost onClick={() => edit(row)}>
+            编辑
+          </NButton>
+        }
+        <NButton type="primary" size="small" ghost onClick={() => del(row)}>
+          删除
+        </NButton>
+      </div>
+    )
+  }
+];
+
+const ModalColumns: NaiveUI.TableColumn<Api.government.PointsFailureRecordVO>[] = [
+  {
+    key: 'couponId',
+    title: '券ID',
+    align: 'center'
+  },
+  {
+    key: 'batchId',
+    title: '批次号',
+    align: 'center'
+  },
+  {
+    key: 'expirationTime',
+    title: '使用有效期至',
+    align: 'center'
+  },
+  {
+    key: 'memberMobile',
+    title: '用户手机号',
+    align: 'center'
+  },
+  {
+    key: 'userName',
+    title: '状态',
+    align: 'center',
+    render: row => {
+      const statuList = {
+        '1': '已使用',
+        '2': '可使用',
+        '5': '已过期',
+        '7': '未生效'
+      };
+      return <NTag class={'mt7'}>{statuList[row.useStatus as keyof typeof statuList]}</NTag>;
+    }
+  },
+  {
+    key: 'lockOrderId',
+    title: '订单号',
+    align: 'center'
+  }
+];
+
+function handleRecord(id: any) {
+  couponId.value = id;
+  openModal();
+  getCount();
+}
+async function validatePrice(_: any, value: any) {
+  const form = await getModalFormValue();
+  if (value <= form.discountMoney) {
+    console.log(1111111);
+
+    return; // 验证通过时返回undefined
+  }
+  console.log(2222222222);
+
+  throw new Error('应小于等于面额'); // 验证失败时抛出错误
+}
+async function validateDiscountMoney(_: any, value: any) {
+  const form = await getModalFormValue();
+  if (value < form.amountMoney * 0.5) {
+    return; // 验证通过时返回undefined
+  }
+  throw new Error('需要小于门槛金额*0.5.数值范围0-1000,保留两位小数'); // 验证失败时抛出错误
+}
+
+async function edit(row: Api.goods.ShopCategory) {
+  openModalForm(row);
+  const data = { ...row, createTime: [row.couponStartTime, row.couponEndTime], inventory: row.inventoryTotal };
+  // setModalProps({ title: `修改${Number(row.level)}级分类` });
+  setModalFormValue(data);
+}
+function add(row: Api.goods.ShopCategory) {
+  openModalForm();
+  console.log(row, 'row-key');
+  // updateSchema({ field: 'iconUrl', required: true });
+  // setModalProps({ title: `新增二级分类` });
+  // setModalFormValue({ parentName: row.name, name: '', parentId: row.id });
+}
+function del(row: Api.goods.ShopCategory) {
+  window.$dialog?.info({
+    title: '删除活动',
+    content: '你确定要删除吗?',
+    positiveText: '确定',
+    negativeText: '取消',
+    onPositiveClick: async () => {
+      const { error } = await delActivity(row.id);
+      if (!error) {
+        refresh();
+      }
+    }
+  });
+}
+
+async function handleSubmit() {
+  const form = await getModalFormValue();
+  setSubLoading(false);
+  form.couponStartTime = form.createTime[0];
+  form.couponEndTime = form.createTime[1];
+  delete form.createTime;
+  if (!form.id) {
+    const { error } = await fetchAddActivity(form);
+    if (error) {
+      return;
+    }
+  } else {
+    // 修改
+    const { error } = await fetchEditActivity(form);
+    if (error) {
+      return;
+    }
+  }
+  closeModalForm();
+  refresh();
+}
+
+async function getCount() {
+  const { data, error } = await fetchReceiveRecordCount({
+    couponId: couponId.value
+  });
+  console.log(3333333333333, data, error);
+  if (!error && data) {
+    countObj.value = data;
+  }
+}
+</script>
+
+<template>
+  <LayoutTable>
+    <ZTable
+      :show-table-action="false"
+      :columns="tableColumns"
+      :api="fetchGetActivityList"
+      @register="registerModalTable"
+      @add="add"
+    ></ZTable>
+    <BasicModelForm @register-modal-form="registerModalForm" @submit-form="handleSubmit"></BasicModelForm>
+
+    <BasicModal @register="registerModal" @after-leave="refreshModal">
+      <ZTable
+        :show-table-action="false"
+        :columns="ModalColumns"
+        :api="fetchReceiveRecord"
+        :default-params="{ couponId }"
+        @register="registerClaimModalTable"
+      >
+        <template #header>
+          <div class="flex">
+            <div class="ml-10px">发放数量:{{ countObj.provideNumber }}</div>
+            <div class="ml-10px">未领取:{{ countObj.unclaimedNumber }}</div>
+            <div class="ml-10px">领取-未使用:{{ countObj.receiveUnusedNumber }}</div>
+            <div class="ml-10px">领取-已使用:{{ countObj.receiveUsedNumber }}</div>
+            <div class="ml-10px">领取-冻结:{{ countObj.receiveFreezeNumber }}</div>
+            <div class="ml-10px">领取-失效:{{ countObj.receiveFailureNumber }}</div>
+          </div>
+        </template>
+      </ZTable>
+    </BasicModal>
+  </LayoutTable>
+</template>
+
+<style scoped></style>

+ 262 - 0
src/views/operation/coupon/index.vue

@@ -0,0 +1,262 @@
+<script setup lang="tsx">
+import { computed } from 'vue';
+import { NTag } from 'naive-ui';
+import { fetchAdd, fetchDelete, fetchEdit, fetchList } from '@/service/api/operation/coupon';
+import { useTable } from '@/components/zt/Table/hooks/useTable';
+import { useModalFrom } from '@/components/zt/ModalForm/hooks/useModalForm';
+
+const columns: NaiveUI.TableColumn<Api.goods.ShopSku>[] = [
+  {
+    type: 'selection',
+    align: 'center',
+    width: 48,
+    fixed: 'left'
+  },
+  {
+    key: 'name',
+    align: 'center',
+    title: '券名称'
+  },
+  {
+    key: 'money',
+    title: '充值金额',
+    align: 'center'
+  },
+  {
+    key: 'createTime',
+    title: '创建时间',
+    align: 'center'
+  },
+  {
+    key: 'status',
+    title: '状态',
+    align: 'center',
+    render: row => {
+      return <NTag class={'mt7'}>{row.status == 1 ? '可用' : '不可用'}</NTag>;
+    }
+  },
+  {
+    key: 'tips',
+    title: '充值提示',
+    align: 'center'
+  }
+];
+
+const [registerTable, { getTableCheckedRowKeys, refresh }] = useTable({
+  searchFormConfig: {
+    schemas: [
+      {
+        label: '充电券名称',
+        component: 'NInput',
+        field: 'name'
+      },
+      {
+        label: '充值金额',
+        component: 'NInput',
+        field: 'money'
+      },
+      {
+        label: '状态',
+        component: 'NSelect',
+        field: 'status',
+        componentProps: {
+          options: [
+            {
+              label: '不可用',
+              value: 0
+            },
+            {
+              label: '可用',
+              value: 1
+            }
+          ]
+        }
+      }
+    ],
+    inline: false,
+    size: 'small',
+    labelPlacement: 'left',
+    isFull: false
+  },
+  tableConfig: {
+    keyField: 'id',
+    title: '平台券列表'
+  }
+});
+
+const [
+  registerModalForm,
+  {
+    openModal: openModalForm,
+    setFieldsValue: setModalFormValue,
+    setModalProps,
+    getFieldsValue: getModalFormValue,
+    closeModal: closeModalForm,
+    setSubLoading
+  }
+] = useModalFrom({
+  modalConfig: {
+    title: '平台券',
+    isShowHeaderText: false
+  },
+  formConfig: {
+    schemas: [
+      {
+        label: '',
+        field: 'id',
+        component: 'NInput',
+        show: false
+      },
+      {
+        label: '',
+        field: 'createTime',
+        component: 'NInput',
+        show: false
+      },
+      {
+        label: '',
+        field: 'createBy',
+        component: 'NInput',
+        show: false
+      },
+      {
+        label: '',
+        field: 'updateTime',
+        component: 'NInput',
+        show: false
+      },
+      {
+        label: '',
+        field: 'updateBy',
+        component: 'NInput',
+        show: false
+      },
+      {
+        label: '',
+        field: 'isDeleted',
+        component: 'NInput',
+        show: false
+      },
+      {
+        field: 'name',
+        label: '充电券名称',
+        component: 'NInput',
+        required: true
+      },
+      {
+        field: 'money',
+        label: '充值金额',
+        component: 'NInput',
+        required: true
+      },
+      {
+        field: 'tips',
+        label: '充值提示',
+        component: 'NInput',
+        required: true
+      },
+      {
+        field: 'status',
+        label: '状态',
+        component: 'NSwitch',
+        defaultValue: 1,
+        required: true,
+        componentProps: {
+          checkedValue: 1,
+          uncheckedValue: 0
+        }
+      }
+    ],
+    labelWidth: 120,
+    layout: 'horizontal',
+    gridProps: {
+      cols: '1',
+      itemResponsive: true
+    }
+  }
+});
+
+const isDisabled = computed(() => {
+  return !getTableCheckedRowKeys().length;
+});
+
+function handleAdd() {
+  setModalProps({
+    title: '新增平台券'
+  });
+  openModalForm();
+}
+function handleEdit(row: any) {
+  setModalProps({
+    title: '编辑平台券'
+  });
+  openModalForm();
+  setModalFormValue(row);
+}
+function handleBatchDelete() {
+  const ids = getTableCheckedRowKeys().join(',');
+  console.log('ids', ids);
+  handleDelete(ids);
+}
+function handleDelete(id: any) {
+  window.$dialog?.info({
+    title: '删除',
+    content: '你确定要删除吗?',
+    positiveText: '确定',
+    negativeText: '取消',
+    onPositiveClick: async () => {
+      const { error } = await fetchDelete(id);
+      if (!error) {
+        refresh();
+      }
+    }
+  });
+}
+
+async function handleSubmit() {
+  const form = await getModalFormValue();
+  console.log(form, '表单');
+  if (form.id) {
+    // 编辑
+    const { error } = await fetchEdit(form);
+    if (error) {
+      return;
+    }
+  } else {
+    // 新增
+    const { error } = await fetchAdd(form);
+    if (error) {
+      return;
+    }
+  }
+  window.$message?.success('保存成功');
+
+  setSubLoading(false);
+  closeModalForm();
+  refresh();
+}
+</script>
+
+<template>
+  <LayoutTable>
+    <ZTable :columns="columns" :api="fetchList" @register="registerTable" @add="handleAdd">
+      <template #prefix="{ loading }">
+        <NSpace>
+          <NButton size="small" type="error" :disabled="isDisabled" :loading="loading" @click="handleBatchDelete">
+            批量删除
+          </NButton>
+        </NSpace>
+      </template>
+      <template #op="{ row }">
+        <NSpace>
+          <NButton size="small" @click="handleDelete(row.id)">删除</NButton>
+          <NButton size="small" @click="handleEdit(row)">编辑</NButton>
+        </NSpace>
+      </template>
+    </ZTable>
+
+    <BasicModelForm @register-modal-form="registerModalForm" @submit-form="handleSubmit"></BasicModelForm>
+  </LayoutTable>
+</template>
+
+<style scoped></style>

+ 1 - 0
src/views/order-manage/normal-order/index.vue

@@ -357,6 +357,7 @@ onMounted(async () => {
       :immediate="false"
       :immediate="false"
       :default-params="{ orderStatus: activeTab }"
       :default-params="{ orderStatus: activeTab }"
       @register="registerTable"
       @register="registerTable"
+      @search="getNums"
     >
     >
       <template #op="{ row }">
       <template #op="{ row }">
         <NButton size="small" type="primary" ghost @click="handleOrderDetail(row)">订单详情</NButton>
         <NButton size="small" type="primary" ghost @click="handleOrderDetail(row)">订单详情</NButton>

+ 19 - 15
src/views/order-manage/order-detail/index.vue

@@ -167,7 +167,7 @@ function secondsToTime(seconds: number) {
               {{ yppStatus[orderInfo.yppDetail?.orderState as keyof typeof yppStatus] }}
               {{ yppStatus[orderInfo.yppDetail?.orderState as keyof typeof yppStatus] }}
             </template>
             </template>
           </div>
           </div>
-          <div class="mb-10px ml-20px text-16px font-semibold">第三方订单编号:{{ orderInfo.orderNumber }}</div>
+          <div class="mb-10px ml-20px text-16px font-semibold">第三方订单编号:{{ orderInfo.thirdOrderId }}</div>
         </div>
         </div>
         <NCard size="small" title="业务信息" :bordered="false">
         <NCard size="small" title="业务信息" :bordered="false">
           <template v-if="orderInfo.businessType == 'XSB'">
           <template v-if="orderInfo.businessType == 'XSB'">
@@ -406,26 +406,30 @@ function secondsToTime(seconds: number) {
           </template>
           </template>
           <template v-else-if="orderInfo.businessType == 'JY'">
           <template v-else-if="orderInfo.businessType == 'JY'">
             <div class="mt-20px pb-20px font-semibold">01 订单编号</div>
             <div class="mt-20px pb-20px font-semibold">01 订单编号</div>
-            <div>我方订单编号:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
-            <div>小桔订单编号:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
+            <div>我方订单编号:{{ orderInfo.orderNumber || '---' }}</div>
+            <div>小桔订单编号:{{ orderInfo.omsOrderOilVO?.xjOrderId || '---' }}</div>
 
 
             <div class="mt-20px pb-20px font-semibold">02 油站信息</div>
             <div class="mt-20px pb-20px font-semibold">02 油站信息</div>
-            <div>油站名称:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
-            <div>油站地址:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
-            <div>所在城市:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
+            <div>油站名称:{{ orderInfo.omsOrderOilVO?.storeName || '---' }}</div>
+            <div>油站地址:{{ orderInfo.omsOrderOilVO?.address || '---' }}</div>
+            <div>所在城市:{{ orderInfo.omsOrderOilVO?.cityName || '---' }}</div>
 
 
             <div class="mt-20px pb-20px font-semibold">03 加油明细</div>
             <div class="mt-20px pb-20px font-semibold">03 加油明细</div>
-            <div>油品名称:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
-            <div>枪号:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
-            <div>加油量:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
+            <div>油品名称:{{ orderInfo.omsOrderOilVO?.itemName || '---' }}</div>
+            <div>枪号:{{ orderInfo.omsOrderOilVO?.gunNo || '---' }}</div>
+            <div>加油量:{{ orderInfo.omsOrderOilVO?.quantity + 'L' || '---' }}</div>
 
 
             <div class="mt-20px pb-20px font-semibold">04 加油明细</div>
             <div class="mt-20px pb-20px font-semibold">04 加油明细</div>
-            <div>门店价:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
-            <div>平台价:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
-            <div>订单金额:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
-            <div>抵扣金额:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
-            <div>服务费:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
-            <div>需付金额:{{ orderInfo.yppDetail?.movieName || '---' }}</div>
+            <div>门店价:{{ orderInfo.omsOrderOilVO?.storePrice || '---' }}</div>
+            <div>平台价:{{ orderInfo.omsOrderOilVO?.vipPrice || '---' }}</div>
+            <div>订单金额:{{ orderInfo.omsOrderOilVO?.totalMoney || '---' }}</div>
+            <div>抵扣金额:{{ orderInfo.omsOrderOilVO?.promotionAmount || '---' }}</div>
+            <div>服务费:{{ orderInfo.omsOrderOilVO?.serviceFee || '---' }}</div>
+            <div>实付金额:{{ orderInfo.omsOrderOilVO?.realMoney || '---' }}</div>
+
+            <div class="mt-20px pb-20px font-semibold">05 抵扣信息</div>
+            <div>抵扣券ID:{{ orderInfo.omsOrderOilVO?.allowanceId || '---' }}</div>
+            <div>优惠描述:{{ orderInfo.omsOrderOilVO?.activityName || '---' }}</div>
           </template>
           </template>
         </NCard>
         </NCard>
       </div>
       </div>

+ 166 - 0
src/views/order-manage/ponits-details/index.vue

@@ -0,0 +1,166 @@
+<script setup lang="tsx">
+import { computed } from 'vue';
+// import dayjs from 'dayjs';
+// import { fetchGetStoreList } from '@/service/api/xsb-manage/store-info';
+import { fetchList } from '@/service/api/order-manage/ponits-details';
+import { commonExport } from '@/utils/common';
+import { useTable } from '@/components/zt/Table/hooks/useTable';
+
+const columns: NaiveUI.TableColumn<Api.goods.ShopSku>[] = [
+  {
+    key: 'orderNumber',
+    align: 'center',
+    title: '流水号'
+  },
+  {
+    key: 'realName',
+    title: '姓名',
+    align: 'center'
+  },
+  {
+    key: 'mobile',
+    title: '用户手机号',
+    align: 'center'
+  },
+  {
+    key: 'businessType',
+    title: '业务场景',
+    align: 'center'
+  },
+  {
+    key: 'variablePoints',
+    title: '变动积分',
+    align: 'center'
+  },
+  {
+    key: 'currentlyAvailablePoints',
+    title: '变动后积分',
+    align: 'center'
+  },
+  // {
+  //   key: 'receiveTime',
+  //   title: '变动前积分',
+  //   align: 'center',
+  //   width: 120,
+  //   ellipsis: {
+  //     tooltip: true
+  //   }
+  // },
+  {
+    key: 'creationDate',
+    title: '更新时间',
+    align: 'center'
+  }
+];
+
+const [registerTable, { getTableData, getSeachForm, setTableLoading }] = useTable({
+  searchFormConfig: {
+    schemas: [
+      {
+        label: '手机号',
+        component: 'NInput',
+        field: 'mobile'
+      },
+      {
+        label: '业务场景',
+        component: 'NSelect',
+        field: 'businessType',
+        componentProps: {
+          options: [
+            {
+              label: '充值',
+              value: 'CZ'
+            },
+            {
+              label: '过期',
+              value: 'GQ'
+            },
+            {
+              label: '退款过期',
+              value: 'TKGQ'
+            },
+            {
+              label: '退款',
+              value: 'TK'
+            },
+            {
+              label: '星闪豹',
+              value: 'XSB'
+            },
+            {
+              label: '充电',
+              value: 'CD'
+            },
+
+            {
+              label: '电影',
+              value: 'DYY'
+            },
+            {
+              label: '虚拟商品',
+              value: 'XNSP'
+            },
+            {
+              label: '大健康',
+              value: 'DJK'
+            }
+          ]
+        }
+      },
+
+      {
+        label: '更新时间',
+        component: 'NDatePicker',
+        field: 'createTime',
+        componentProps: {
+          type: 'datetimerange',
+          defaultTime: ['00:00:00', '23:59:59']
+        }
+      }
+    ],
+    inline: false,
+    size: 'small',
+    labelPlacement: 'left',
+    isFull: false
+  },
+  tableConfig: {
+    keyField: 'skuId',
+    title: '积分明细',
+    showAddButton: false,
+    fieldMapToTime: [['createTime', ['startTime', 'endTime']]]
+  }
+});
+
+const tableData = computed(() => {
+  return getTableData();
+});
+
+async function handleExport() {
+  setTableLoading(true);
+  try {
+    await commonExport(
+      '/smqjh-system/app-api/v1/pointsRecord/backendPointsRecordListExport',
+      getSeachForm(),
+      '积分明细.xlsx'
+    );
+  } finally {
+    setTableLoading(false);
+  }
+}
+</script>
+
+<template>
+  <LayoutTable>
+    <ZTable :columns="columns" :show-table-action="false" :api="fetchList" @register="registerTable">
+      <template #prefix="{ loading }">
+        <NSpace>
+          <NButton size="small" :disabled="tableData.length == 0" :loading="loading" @click="handleExport">
+            导出全部
+          </NButton>
+        </NSpace>
+      </template>
+    </ZTable>
+  </LayoutTable>
+</template>
+
+<style scoped></style>

+ 157 - 0
src/views/order-manage/recharge-records/index.vue

@@ -0,0 +1,157 @@
+<script setup lang="tsx">
+import { computed } from 'vue';
+// import dayjs from 'dayjs';
+// import { fetchGetStoreList } from '@/service/api/xsb-manage/store-info';
+import { fetchList } from '@/service/api/order-manage/recharge-records';
+import { commonExport } from '@/utils/common';
+import { useTable } from '@/components/zt/Table/hooks/useTable';
+
+const columns: NaiveUI.TableColumn<Api.goods.ShopSku>[] = [
+  {
+    key: 'orderNumber',
+    align: 'center',
+    title: '充值订单编号'
+  },
+  {
+    key: 'consigneeMobile',
+    title: '用户手机号',
+    align: 'center'
+  },
+  {
+    key: 'actualTotal',
+    title: '充值金额',
+    align: 'center'
+  },
+  {
+    key: 'actualTotalShow',
+    title: '金额积分',
+    align: 'center'
+  },
+  {
+    key: 'recordStatus',
+    title: '订单状态',
+    align: 'center',
+    render: row => {
+      if (row.recordStatus === 1) {
+        return '已取消';
+      } else if (row.recordStatus === 2) {
+        return '已到账';
+      } else if (row.recordStatus === 3) {
+        return '退款';
+      }
+      return '-';
+    }
+  },
+  {
+    key: 'orderTypes',
+    title: '订单类型',
+    align: 'center'
+  },
+  {
+    key: 'transactionId',
+    title: '交易流水号',
+    align: 'center'
+  },
+  {
+    key: 'refundAmount',
+    title: '退款金额',
+    align: 'center'
+  },
+  {
+    key: 'remarks',
+    title: '备注',
+    align: 'center'
+  },
+  {
+    key: 'updateTime',
+    title: '更新时间',
+    align: 'center'
+  }
+];
+
+const [registerTable, { getTableData, getSeachForm, setTableLoading }] = useTable({
+  searchFormConfig: {
+    schemas: [
+      {
+        label: '手机号',
+        component: 'NInput',
+        field: 'tel'
+      },
+      {
+        label: '状态',
+        component: 'NSelect',
+        field: 'status',
+        componentProps: {
+          options: [
+            {
+              label: '已取消',
+              value: 1
+            },
+            {
+              label: '已到账',
+              value: 2
+            },
+            {
+              label: '退款',
+              value: 3
+            }
+          ]
+        }
+      },
+
+      {
+        label: '更新时间',
+        component: 'NDatePicker',
+        field: 'createTime',
+        componentProps: {
+          type: 'datetimerange',
+          defaultTime: ['00:00:00', '23:59:59']
+        }
+      }
+    ],
+    inline: false,
+    size: 'small',
+    labelPlacement: 'left',
+    isFull: false
+  },
+  tableConfig: {
+    keyField: 'skuId',
+    title: '积分明细',
+    showAddButton: false,
+    fieldMapToTime: [['createTime', ['startTime', 'endTime']]]
+  }
+});
+
+const tableData = computed(() => {
+  return getTableData();
+});
+
+async function handleExport() {
+  setTableLoading(true);
+  try {
+    await commonExport(
+      '/smqjh-system/api/v1/purchaseRecord/getPurchaseRecordListExport',
+      getSeachForm(),
+      '充值记录.xlsx'
+    );
+  } finally {
+    setTableLoading(false);
+  }
+}
+</script>
+
+<template>
+  <LayoutTable>
+    <ZTable :columns="columns" :show-table-action="false" :api="fetchList" @register="registerTable">
+      <template #prefix="{ loading }">
+        <NSpace>
+          <NButton size="small" :disabled="tableData.length == 0" :loading="loading" @click="handleExport">
+            导出全部
+          </NButton>
+        </NSpace>
+      </template>
+    </ZTable>
+  </LayoutTable>
+</template>
+
+<style scoped></style>