Jelajahi Sumber

feat(order): 优化订单列表和详情展示

- 重构订单详情界面,增加更多订单相关信息
- 优化订单列表展示,调整价格显示逻辑
- 添加使用记录表格
- 更新订单状态和售后服务状态显示
- 调整商品信息展示方式
zhangtao 3 minggu lalu
induk
melakukan
6ae228b5c5

+ 5 - 5
.env.development

@@ -8,21 +8,21 @@ VITE_PUBLIC_PATH = /
 
 # 跨域代理,您可以配置多个 ,请注意,没有换行符
 # VITE_PROXY = [["/jeecgboot","http://192.168.1.34:8080/jeecg-boot"],["/upload","http://192.168.1.34:8080/jeecg-boot"]]
-# VITE_PROXY = [["/jeecgboot","http://192.168.0.11:8080/jeecg-boot"],["/upload","http://192.168.0.11:8080/upload"]]
+VITE_PROXY = [["/jeecgboot","http://192.168.0.11:8080/jeecg-boot"],["/upload","http://192.168.0.11:8080/upload"]]
 # VITE_PROXY = [["/jeecgboot","http://192.168.1.253:8080/jeecg-boot"],["/upload","http://192.168.1.253:8080/upload"]]
-VITE_PROXY = [["/jeecgboot","http://192.168.1.166:8080/jeecg-boot"],["/upload","http://192.168.1.166:8080/upload"]]
+# VITE_PROXY = [["/jeecgboot","http://192.168.1.166:8080/jeecg-boot"],["/upload","http://192.168.1.166:8080/upload"]]
 
 #后台接口全路径地址(必填)
 # VITE_GLOB_DOMAIN_URL=http://192.168.1.34:8080/jeecg-boot #//黄、
-# VITE_GLOB_DOMAIN_URL=http://192.168.0.11:8080/jeecg-boot  #李
+VITE_GLOB_DOMAIN_URL=http://192.168.0.11:8080/jeecg-boot  #李
 # VITE_GLOB_DOMAIN_URL=http://192.168.1.253:8080/jeecg-boot  #张
-VITE_GLOB_DOMAIN_URL=http://192.168.1.166:8080/jeecg-boot  #张
+# VITE_GLOB_DOMAIN_URL=http://192.168.1.166:8080/jeecg-boot  #张
 
 
 #后台接口父地址(必填)
 VITE_GLOB_API_URL=/jeecgboot
 
-# 接口前缀
+#  
 VITE_GLOB_API_URL_PREFIX=
 
 #微前端qiankun应用,命名必须以VITE_APP_SUB_开头,jeecg-app-1为子应用的项目名称,也是子应用的路由父路径

+ 0 - 1
src/views/businessManagement/courses/courses.data.ts

@@ -153,7 +153,6 @@ export const formSchema: FormSchema[] = [
       valueField: 'id',
       params: {
         orgCode: 'A01',
-        type: 0,
       },
     },
   },

+ 5 - 0
src/views/dashboard/Analysis/api.ts

@@ -4,6 +4,8 @@ enum Api {
   loginfo = '/sys/loginfo',
   visitInfo = '/sys/visitInfo',
   indexData = '/statisticsInfo/findByStatistics',
+  storeData = '/statisticsInfo/findByShopMoneyList',
+  goodsData = '/statisticsInfo/findByShopSumList',
 }
 /**
  * 日志统计信息
@@ -17,3 +19,6 @@ export const getLoginfo = (params) => defHttp.get({ url: Api.loginfo, params },
 export const getVisitInfo = (params) => defHttp.get({ url: Api.visitInfo, params }, { isTransformResponse: false });
 
 export const getIndexData = () => defHttp.get({ url: Api.indexData });
+
+export const getStoreData = (params) => defHttp.get({ url: Api.storeData, params });
+export const getGoodsData = (params) => defHttp.get({ url: Api.goodsData, params });

+ 0 - 4
src/views/dashboard/Analysis/components/Line.vue

@@ -17,8 +17,6 @@
         dataMap[item.dateDailyDate] = item.expectIncomeMoney || 0;
       }
     });
-    console.log(dataMap, 'dataMap');
-
     for (let i = 1; i <= daysInMonth; i++) {
       const dayStr = `${String(dayjs().month() + 1).padStart(2, '0')}/${String(i).padStart(2, '0')}`;
       const formattedDayStr = `${dayjs().month() + 1}/${i}`;
@@ -46,8 +44,6 @@
       const chartRef = ref<HTMLDivElement | null>(null);
       const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
       const { days, values } = generateCurrentMonthDays(ctx.chartData);
-      console.log(days, values);
-
       onMounted(() => {
         setOptions({
           tooltip: {

+ 67 - 35
src/views/dashboard/Analysis/index.vue

@@ -31,50 +31,55 @@
       </a-card>
     </div>
 
-    <div class="mt24px grid lg:grid-cols-2 sm:grid-cols-1 gap-3">
-      <a-card :bordered="false" title="门店销售额排行">
+    <div class="mt24px grid gap-3" :class="[!getIsMerchant ? 'lg:grid-cols-2 sm:grid-cols-1' : '']">
+      <a-card :bordered="false" title="门店销售额排行" v-if="!getIsMerchant">
         <template #extra>
           <a-radio-group v-model:value="storeBtn" button-style="solid">
-            <a-radio-button ::value="0">今日</a-radio-button>
-            <a-radio-button :value="1">本周</a-radio-button>
-            <a-radio-button :value="2">本月</a-radio-button>
+            <a-radio-button :value="1">今日</a-radio-button>
+            <a-radio-button :value="2">本周</a-radio-button>
+            <a-radio-button :value="3">本月</a-radio-button>
           </a-radio-group>
         </template>
-        <a-list item-layout="horizontal" :data-source="data">
-          <template #renderItem="{ item }">
-            <a-list-item>
-              <a-list-item-meta description="Ant Design, a design language for background applications, is refined by Ant UED Team">
-                <template #title>
-                  <a href="https://www.antdv.com/">{{ item.title }}</a>
+        <a-list item-layout="horizontal" :data-source="storeDataList">
+          <template #renderItem="{ item, index }">
+            <a-badge-ribbon placement="start" :text="index + 1" :color="index == 0 ? 'red' : index == 1 ? 'green' : index == 2 ? 'volcano' : ''">
+              <a-list-item>
+                <template #actions>
+                  <span> {{ item.saleMoney }} </span>
                 </template>
-                <template #avatar>
-                  <a-avatar src="https://joeschmoe.io/api/v1/random" />
-                </template>
-              </a-list-item-meta>
-            </a-list-item>
+                <a-list-item-meta>
+                  <template #title>
+                    <span class="ml40px">{{ item.deptName }} </span>
+                  </template>
+                </a-list-item-meta>
+              </a-list-item>
+            </a-badge-ribbon>
           </template>
         </a-list>
       </a-card>
       <a-card :bordered="false" title="商品销量排行">
         <template #extra>
           <a-radio-group v-model:value="goodsBtn" button-style="solid">
-            <a-radio-button ::value="0">今日</a-radio-button>
-            <a-radio-button :value="1">本周</a-radio-button>
-            <a-radio-button :value="2">本月</a-radio-button>
+            <a-radio-button :value="1">今日</a-radio-button>
+            <a-radio-button :value="2">本周</a-radio-button>
+            <a-radio-button :value="3">本月</a-radio-button>
           </a-radio-group>
         </template>
-        <a-list item-layout="horizontal" :data-source="data">
-          <template #renderItem="{ item }">
-            <a-list-item>
-              <a-list-item-meta description="Ant Design, a design language for background applications, is refined by Ant UED Team">
-                <template #title>
-                  <a href="https://www.antdv.com/">{{ item.title }}</a>
-                </template>
-                <template #avatar>
-                  <a-avatar src="https://joeschmoe.io/api/v1/random" />
+        <a-list item-layout="horizontal" :data-source="goodsDataList">
+          <template #renderItem="{ item, index }">
+            <a-badge-ribbon placement="start" :text="index + 1" :color="index == 0 ? 'red' : index == 1 ? 'green' : index == 2 ? 'volcano' : ''">
+              <a-list-item>
+                <template #actions>
+                  <span> {{ item.totalPrice }} </span>
                 </template>
-              </a-list-item-meta>
-            </a-list-item>
+                <a-list-item-meta>
+                  <template #title>
+                    <span class="ml40px">{{ item.shopName }} </span>
+                  </template>
+                </a-list-item-meta>
+                <div> {{ item.productCount }}</div>
+              </a-list-item>
+            </a-badge-ribbon>
           </template>
         </a-list>
       </a-card>
@@ -86,10 +91,15 @@
   import Line from './components/Line.vue';
   import CountTo from '/@/components/CountTo/src/CountTo.vue';
   import { createReusableTemplate } from '@vueuse/core';
-  import { ref, unref } from 'vue';
-  import { getIndexData } from './api';
-  const storeBtn = ref(0);
-  const goodsBtn = ref(0);
+  import { ref, unref, watch } from 'vue';
+  const { getIsMerchant } = storeToRefs(useUserStore());
+  import { getGoodsData, getIndexData, getStoreData } from './api';
+  import { storeToRefs } from 'pinia';
+  import { useUserStore } from '/@/store/modules/user';
+  const storeBtn = ref(1);
+  const goodsBtn = ref(1);
+  const storeDataList = ref([]);
+  const goodsDataList = ref([]);
   interface GradientBgProps {
     gradientColor: string;
   }
@@ -169,6 +179,17 @@
     },
   ]);
   const chartData = ref([]);
+  watch(
+    () => [storeBtn.value, goodsBtn.value],
+    (newValue, old) => {
+      if (newValue[0] != old[0]) {
+        getStoreDataList();
+      }
+      if (newValue[1] != old[1]) {
+        getGoodsList();
+      }
+    }
+  );
   function getGradientColor(color: CardData['color']) {
     return `linear-gradient(to bottom right, ${color.start}, ${color.end})`;
   }
@@ -185,10 +206,21 @@
     unref(cardData)[4].value = res.addNumber;
     unref(cardData)[4].Proportion = res.addNumberChain;
     chartData.value = res.findByStatisticsChartVOList;
-    console.log(unref(cardData), '获取数据');
   }
+  async function getStoreDataList() {
+    const res = await getStoreData({ type: storeBtn.value });
+    console.log(res, 'getStoreDataList');
+    storeDataList.value = res;
+  }
+  getStoreDataList();
 
   getDataIndex();
+  async function getGoodsList() {
+    const res = await getGoodsData({ type: goodsBtn.value });
+    console.log(res, 'getGoodsList');
+    goodsDataList.value = res;
+  }
+  getGoodsList();
 </script>
 
 <style scoped></style>

+ 10 - 4
src/views/informationManagement/shopInfo/index.vue

@@ -46,7 +46,7 @@
   import { TypographyTitle, Divider, FormItem, Textarea, Input, message } from 'ant-design-vue';
   import { BasicForm, useForm, JAreaSelect } from '/@/components/Form/index';
   import uploadVideo from '@/components/uploadVideo/index.vue';
-  import { onUnmounted, ref, watch } from 'vue';
+  import { onMounted, onUnmounted, ref, watch } from 'vue';
   import { useUserStore } from '/@/store/modules/user';
   const { userInfo } = storeToRefs(useUserStore());
 
@@ -75,7 +75,11 @@
       updateSchema({ field: 'isCertified', componentProps: { disabled: true } });
     }
   }
-  getisCertified();
+  onMounted(() => {
+    if (userInfo.value?.orgType != '20') {
+      getisCertified();
+    }
+  });
   async function getData(id) {
     const res = await queryById(id);
     console.log(res, 'asdsad');
@@ -96,8 +100,10 @@
   }
   getData(userInfo.value?.orgCode);
   async function save() {
-    const res = await isCertified(userInfo.value?.orgCode);
-    if (!res) return message.error('请完成企业认证!');
+    if (userInfo.value?.orgType != '20') {
+      const res = await isCertified(userInfo.value?.orgCode);
+      if (!res) return message.error('请完成企业认证!');
+    }
     await validate();
     isLoading.value = true;
     const form = await getFieldsValue();

+ 2 - 0
src/views/informationManagement/shopInfo/shopInfo.data.ts

@@ -26,8 +26,10 @@ export const formSchema: FormSchema[] = [
         { label: '学校', value: 0 },
         { label: '体育馆', value: 1 },
       ],
+      disabled: true,
     },
     required: true,
+    defaultValue: userInfo.value?.orgType != '20' ? 1 : 0,
   },
   {
     field: 'name',

+ 49 - 24
src/views/orderManagement/order/components/orderModelView.vue

@@ -6,11 +6,26 @@
         <div class="ml-3">下单时间:{{ orderInfo.createTime }} </div>
       </div>
       <div class="mt3">
-        <div>共{{ orderInfo.proInfoList.length }}人</div>
-        <div class="flex items-center">
-          <div class="flex items-center" v-for="item in orderInfo.proInfoList" :key="item.id">
+        <div
+          >共{{ orderInfo.proInfoList?.length }}人 <span class="text-gray">{{ orderStatus[orderInfo.orderStatus] }}</span>
+        </div>
+        <div class="flex items-center mt3" v-if="orderInfo.orderStatus == 1 || orderInfo.orderStatus == 2">
+          <div class="flex items-center mr2" v-for="item in orderInfo.proInfoList" :key="item.id">
             <div class="mr3 text-gray">{{ item.userName }} </div>
-            <div>{{ orderStatus[item.orderStatus] }} </div>
+            <div class="text-gray">{{ orderStatus[item.orderStatus] }} </div>
+          </div>
+        </div>
+        <div v-if="orderInfo.orderStatus == 0">
+          <div>商品已拍下,等待买家付款</div>
+          <div class="text-gray flex items-center">
+            如买家未在
+            <StatisticCountdown
+              @finish="finish"
+              :value="dayjs(orderInfo.createTime).add(15, 'minute').valueOf()"
+              :valueStyle="{ fontSize: '18px' }"
+              class="mx2"
+            />
+            内付款,订单将自动关闭
           </div>
         </div>
       </div>
@@ -42,61 +57,71 @@
               <div>商品总额</div>
               <Divider></Divider>
             </div>
-            <div>
+            <div v-if="orderInfo.tDiscounts">
               <div>团购优惠</div>
               <Divider></Divider>
             </div>
-            <div>
+            <div v-if="orderInfo.price">
               <div>实际付款</div>
               <Divider></Divider>
             </div>
-            <div>
+            <div v-if="orderInfo.sDiscounts">
               <div>试听优惠</div>
               <Divider></Divider>
             </div>
-            <div>
-              <div>付款</div>
+            <div v-if="orderInfo.price">
+              <div>付款</div>
               <Divider></Divider>
             </div>
           </DescriptionsItem>
           <DescriptionsItem label="金额/元">
             <div>
-              <div>24</div>
+              <div>{{ orderInfo.totalPrice || 0 }}</div>
               <Divider></Divider>
             </div>
-            <div>
-              <div>432</div>
+            <div v-if="orderInfo.tDiscounts">
+              <div>{{ orderInfo.tDiscounts || 0 }}</div>
               <Divider></Divider>
             </div>
-            <div>
-              <div>53</div>
+            <div v-if="orderInfo.price">
+              <div>{{ orderInfo.price || 0 }}</div>
               <Divider></Divider>
             </div>
-            <div>
-              <div>345</div>
+            <div v-if="orderInfo.sDiscounts">
+              <div>{{ orderInfo.sDiscounts || 0 }}</div>
               <Divider></Divider>
             </div>
-            <div>
-              <div>345</div>
+            <div v-if="orderInfo.price">
+              <div>{{ orderInfo.price || 0 }}</div>
               <Divider></Divider>
             </div>
           </DescriptionsItem>
         </Descriptions>
       </div>
+      <div class="mt3">
+        <TypographyTitle :level="5">使用记录</TypographyTitle>
+        <Table :columns="useRecord" :dataSource="orderInfo.isinList" :pagination="{ hideOnSinglePage: true }"></Table>
+      </div>
     </div>
   </BasicModal>
 </template>
 <script lang="ts" setup>
-  import { TypographyTitle, Divider, Table, Descriptions, DescriptionsItem } from 'ant-design-vue';
-  import { ref, computed, unref } from 'vue';
+  import { TypographyTitle, Divider, Table, Descriptions, DescriptionsItem, StatisticCountdown } from 'ant-design-vue';
+  import { ref } from 'vue';
   import { BasicModal, useModalInner } from '/@/components/Modal';
-  import { queryByid, orderInfo } from '../order.api';
-  import { orderStatus, orderColum } from '../order.data';
-  const orderInfo = ref<orderInfo>();
+  import { queryByid, AppOrderInfoVO } from '../order.api';
+  import { orderStatus, orderColum, useRecord } from '../order.data';
+  import dayjs from 'dayjs';
+  const orderId = ref();
+  const orderInfo = ref<AppOrderInfoVO>();
   const [registerModal, { setModalProps }] = useModalInner(async (data) => {
     setModalProps({ confirmLoading: false, showCancelBtn: false, showOkBtn: false });
+    orderId.value = data.record.id;
     const res = await queryByid(data.record.id);
     orderInfo.value = res;
-    console.log(res);
   });
+  async function finish() {
+    const res = await queryByid(orderId.value);
+    orderInfo.value = res;
+  }
 </script>

+ 9 - 14
src/views/orderManagement/order/index.vue

@@ -6,15 +6,13 @@
     <template #action="{ record }">
       <TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)" />
     </template>
-    <!--字段回显插槽-->
-    <template v-slot:bodyCell="{ column, record, index, text }"> </template>
     <template #goods="{ record }">
       <div class="flex items-center h-20px text-16px">
         <div class="font-semibold">订单编号:{{ record.orderCode }}</div>
-        <div class="ml3">下单时间:2025-03-07 16:08:58</div>
+        <div class="ml3">下单时间:{{ record.createTime }}</div>
       </div>
       <div class="mt3 flex items-center border-b border-solid pb-3 h-90px" v-for="item in record.orderProInfoList" :key="item.id">
-        <Image :width="80" class="rounded-16px" src="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png" />
+        <Image :width="80" class="rounded-16px" :src="item.productImage" />
         <div class="ml3">{{ item.productName }}</div>
       </div>
     </template>
@@ -22,8 +20,8 @@
       <div class="h-20px"></div>
       <div class="mt3 h-90px flex flex-col justify-center border-b border-solid" v-for="item in record.orderProInfoList" :key="item.id">
         <div class="flex items-center">
-          <div>¥{{ item.price }}</div>
-          <div class="line-through ml-3 text-gray">¥{{ item.originalPrice }}</div>
+          <div>¥{{ item.price || 0 }}</div>
+          <div class="line-through ml-3 text-gray">¥{{ item.originalPrice || 0 }}</div>
         </div>
         <div class="text-gray">x{{ item.quantity }}</div>
       </div>
@@ -38,13 +36,15 @@
     <template #status="{ record }">
       <div class="h-20px"></div>
       <div class="mt3 h-90px flex flex-col justify-center border-b border-solid" v-for="item in record.orderProInfoList" :key="item.id">
-        <div>待使用</div>
+        <div v-if="item.type != 6">{{ orderStatus[item.orderStatus] }}</div>
+        <div v-else>无</div>
       </div>
     </template>
     <template #After="{ record }">
       <div class="h-20px"></div>
       <div class="mt3 h-90px flex flex-col justify-center border-b border-solid" v-for="item in record.orderProInfoList" :key="item.id">
-        <div>{{ afterSaleStatus[item.afterSaleStatus] }}</div>
+        <div v-if="item.type != 6">{{ afterSaleStatus[item.afterSaleStatus] }}</div>
+        <div v-else>无</div>
       </div>
     </template>
   </BasicTable>
@@ -58,14 +58,11 @@
   import { BasicTable, useTable, TableAction, TableImg } from '/@/components/Table';
   import { useModal } from '/@/components/Modal';
   import { useListPage } from '/@/hooks/system/useListPage';
-  import { columns, searchFormSchema, afterSaleStatus } from './order.data';
+  import { columns, searchFormSchema, afterSaleStatus, orderStatus } from './order.data';
   import { list } from './order.api';
   import { useUserStore } from '/@/store/modules/user';
-  import { useMessage } from '/@/hooks/web/useMessage';
   const queryParam = reactive<any>({});
-  const checkedKeys = ref<Array<string | number>>([]);
   const userStore = useUserStore();
-  const { createMessage } = useMessage();
   //注册model
   const [registerModal, { openModal }] = useModal();
   //注册table数据
@@ -73,9 +70,7 @@
     tableProps: {
       api: list,
       columns,
-      canResize: false,
       formConfig: {
-        //labelWidth: 120,
         schemas: searchFormSchema,
         autoSubmitOnEnter: true,
         showAdvancedButton: true,

+ 503 - 69
src/views/orderManagement/order/order.api.ts

@@ -1,7 +1,4 @@
 import { defHttp } from '/@/utils/http/axios';
-import { useMessage } from '/@/hooks/web/useMessage';
-
-const { createConfirm } = useMessage();
 
 enum Api {
   list = '/app/appOrder/queryPage',
@@ -13,73 +10,510 @@ enum Api {
  */
 export const list = (params) => defHttp.post({ url: Api.list, params });
 
-export const queryByid = (orderId) => defHttp.get<orderInfo>({ url: `${Api.queryByid}/${orderId}` });
+export const queryByid = (orderId) => defHttp.get<AppOrderInfoVO>({ url: `${Api.queryByid}/${orderId}` });
+
+/**
+ * 返回数据对象 data
+ * 返回数据对象
+ *
+ * AppOrderInfoVO
+ */
+export interface AppOrderInfoVO {
+  /**
+   * 订单类型:0-学校 1-包场 2-无固定场 3-个人赛 4-团队赛 5-课程
+   */
+
+  orderType: number;
 
-interface proInfoList {
-  id: string;
-  orderId: string;
-  orderCode: string;
-  productId: string;
-  productName: string;
-  address: string;
-  type: number;
-  useDateStr: string;
-  frameTimeStr: string;
-  gameTimeStr: string;
-  ticketNo: string;
-  price: number;
+  /**
+   * 地址
+   */
+  address?: string;
+  /**
+   * 下单时间
+   */
+  createTime?: string;
+  /**
+   * 赛程安排
+   */
+  gameScheduleVOList?: AppGameScheduleVO[];
+  /**
+   * ID
+   */
+  id?: string;
+  /**
+   * 使用记录
+   */
+  isinList?: AppIsinVO[];
+  /**
+   * 买家昵称
+   */
+  nikeName?: string;
+  /**
+   * 订单号
+   */
+  orderCode?: string;
+  /**
+   * 订单状态
+   */
   orderStatus: number;
-  afterSaleStatus: number;
-  quantity: number;
-  familyUserId: string;
-  userName: string;
-  userPhone: string;
-  orFreePro: number;
-  createBy: string;
-  createTime: string;
-  updateBy: string;
-  updateTime: string;
-  status: number;
-  delFlag: number;
+  /**
+   * 付款时间
+   */
+  payTime?: string;
+  /**
+   * 买家电话
+   */
+  phoneNumber?: string;
+  /**
+   * 实际付款
+   */
+  price?: number;
+  /**
+   * 订单信息
+   */
+  proInfoList?: AppOrderProInfo[];
+  /**
+   * 试听优惠金额
+   */
+  sDiscounts?: number;
+  /**
+   * 地点
+   */
+  siteName?: string;
+  /**
+   * 团购优惠金额
+   */
+  tDiscounts?: number;
+  /**
+   * 商品总额
+   */
+  totalPrice?: number;
+  /**
+   * 核销记录
+   */
+  verificationRecordDTOList?: VerificationRecordDTO[];
+  [property: string]: any;
 }
-export interface orderInfo {
-  id: string;
-  orderCode: string;
-  createTime: string;
-  payTime: string;
-  siteName: string;
-  address: string;
-  nikeName: string;
-  phoneNumber: string;
-  totalPrice: number;
-  price: number;
-  proInfoList: proInfoList[];
-  isinList: [
-    {
-      isinList: [
-        {
-          id: '';
-          orderId: '';
-          orderCode: '';
-          orderProInfoId: '';
-          familyId: '';
-          familyUserName: '';
-          isinCode: '';
-          isinStatus: 0;
-          verifyUserId: '';
-          verifyUserName: '';
-          useTime: '';
-          useAddress: '';
-          useImage: '';
-          createBy: '';
-          createTime: '';
-          updateTime: '';
-          expireTime: '';
-          status: 0;
-          delFlag: 0;
-          userPhone: '';
-        },
-      ];
-    },
-  ];
+
+/**
+ * org.jeecg.modules.app.vo.AppGameScheduleVO
+ *
+ * AppGameScheduleVO
+ */
+export interface AppGameScheduleVO {
+  /**
+   * 安排
+   */
+  arrange?: string;
+  /**
+   * 结束时间
+   */
+  endTime?: string;
+  /**
+   * 赛事id
+   */
+  gameId?: string;
+  /**
+   * id
+   */
+  id?: string;
+  /**
+   * 比赛名称
+   */
+  name?: string;
+  /**
+   * 开始状态
+   */
+  startStatus?: string;
+  /**
+   * 开始时间
+   */
+  startTime?: string;
+  [property: string]: any;
+}
+
+/**
+ * org.jeecg.modules.system.app.vo.AppIsinVO
+ *
+ * AppIsinVO
+ */
+export interface AppIsinVO {
+  /**
+   * 用户ID(关联家庭用户表)
+   */
+  familyId?: string;
+  /**
+   * 用户名
+   */
+  familyUserName?: string;
+  /**
+   * 券码号
+   */
+  isinCode?: string;
+  /**
+   * 使用记录
+   */
+  isinList?: AppIsin[];
+  /**
+   * 手机号码
+   */
+  UserPhone?: string;
+  [property: string]: any;
+}
+
+/**
+ * AppIsin
+ */
+export interface AppIsin {
+  /**
+   * 创建人;创建人
+   */
+  createBy?: string;
+  /**
+   * 创建时间;创建时间
+   * 创建时间
+   */
+  createTime?: string;
+  /**
+   * 删除标志;删除状态(0-正常,1-已删除)
+   * 删除状态(0-正常,1-已删除)
+   */
+  delFlag?: number;
+  /**
+   * 到期时间
+   */
+  expireTime?: string;
+  /**
+   * 用户ID
+   * 用户ID(关联家庭用户表)
+   */
+  familyId?: string;
+  /**
+   * 用户名
+   */
+  familyUserName?: string;
+  /**
+   * 主键ID
+   */
+  id?: string;
+  /**
+   * 券状态  0-待使用 1-已使用 2-已失效
+   */
+  isinStatus?: number;
+  /**
+   * 订单编号
+   */
+  orderCode?: string;
+  /**
+   * 订单ID
+   */
+  orderId?: string;
+  /**
+   * 子订单商品ID
+   */
+  orderProInfoId?: string;
+  /**
+   * 部门编号
+   */
+  orgCode?: string;
+  /**
+   * 备注
+   */
+  remark?: string;
+  /**
+   * 系统状态;状态(0-正常,1-冻结)
+   * 系统状态(0-正常,1-冻结)
+   */
+  status?: number;
+  /**
+   * 券码号
+   */
+  ticketNo?: string;
+  /**
+   * 更新时间;更新时间
+   * 更新时间
+   */
+  updateTime?: string;
+  /**
+   * 使用地点
+   */
+  useAddress?: string;
+  /**
+   * 使用照片
+   */
+  useImage?: string;
+  /**
+   * 手机号码
+   */
+  UserPhone?: string;
+  /**
+   * 使用时间
+   */
+  useTime?: string;
+  /**
+   * 核验人ID
+   */
+  verifyUserId?: string;
+  /**
+   * 核验人
+   * 核验人名称
+   */
+  verifyUserName?: string;
+  [property: string]: any;
+}
+
+/**
+ * org.jeecg.modules.system.app.entity.AppOrderProInfo
+ *
+ * AppOrderProInfo
+ */
+export interface AppOrderProInfo {
+  /**
+   * 地点
+   */
+  address?: string;
+  /**
+   * 售后状态
+   */
+  afterSaleStatus?: number;
+  /**
+   * 创建人;创建人
+   */
+  createBy?: string;
+  /**
+   * 创建时间;创建时间
+   */
+  createTime?: string;
+  /**
+   * 删除标志;删除状态(0-正常,1-已删除)
+   */
+  delFlag?: number;
+  /**
+   * 过期时间
+   */
+  expireTime?: string;
+  /**
+   * 使用人ID
+   */
+  familyUserId?: string;
+  /**
+   * 时间段
+   */
+  frameTimeStr?: string;
+  /**
+   * 比赛日期
+   */
+  gameTimeStr?: string;
+  /**
+   * id
+   */
+  id?: string;
+  /**
+   * 订单id
+   * 订单编号
+   */
+  orderCode?: string;
+  /**
+   * 订单id
+   */
+  orderId?: string;
+  /**
+   * 订单状态
+   */
+  orderStatus: number;
+  /**
+   * 是否免费试听课(0-否 1-是)
+   */
+  orFreePro?: number;
+  /**
+   * 原价/元
+   */
+  originalPrice?: number;
+  /**
+   * 实际价格/元
+   */
+  price?: number;
+  /**
+   * 产品id;场地/赛事/课程
+   */
+  productId?: string;
+  /**
+   * 商品图片
+   */
+  productImage?: string;
+  /**
+   * 商品名称
+   */
+  productName?: string;
+  /**
+   * 数量
+   */
+  quantity?: number;
+  /**
+   * 系统状态;状态(0-正常,1-冻结)
+   */
+  status?: number;
+  /**
+   * 券号
+   */
+  ticketNo?: string;
+  /**
+   * 商品类型(1-学校 2-包场 3-无固定场 4-个人赛 5-团队赛 6-课程 7-保险)
+   */
+  type?: number;
+  /**
+   * 更新人;更新人
+   */
+  updateBy?: string;
+  /**
+   * 更新时间;更新时间
+   */
+  updateTime?: string;
+  /**
+   * 日期
+   */
+  useDateStr?: string;
+  /**
+   * 使用人
+   */
+  userName?: string;
+  /**
+   * 手机号
+   */
+  userPhone?: string;
+  [property: string]: any;
+}
+
+/**
+ * org.jeecg.modules.system.app.dto.VerificationRecordDTO
+ *
+ * VerificationRecordDTO
+ */
+export interface VerificationRecordDTO {
+  /**
+   * 课程类型(0-正常课 1-补课)
+   */
+  coursesType?: number;
+  /**
+   * 核销记录
+   */
+  verificationRecordList?: AppCoursesVerificationRecord[];
+  [property: string]: any;
+}
+
+/**
+ * AppCoursesVerificationRecord
+ */
+export interface AppCoursesVerificationRecord {
+  /**
+   * 上课时间
+   */
+  coursesEndTime?: string;
+  /**
+   * 课程ID
+   */
+  coursesId?: string;
+  /**
+   * 课时名称
+   */
+  coursesName?: string;
+  /**
+   * 课程小节ID
+   */
+  coursesPriceRuleId?: string;
+  /**
+   * 上课时间
+   */
+  coursesStartTime?: string;
+  /**
+   * 课程类型(0-正常课 1-补课)
+   */
+  coursesType?: number;
+  /**
+   * 创建人;创建人
+   */
+  createBy?: string;
+  /**
+   * 创建时间;创建时间
+   */
+  createTime?: string;
+  /**
+   * 删除标志;删除状态(0-正常,1-已删除)
+   */
+  delFlag?: number;
+  /**
+   * id
+   */
+  id?: string;
+  /**
+   * 订单编号
+   */
+  orderCode?: string;
+  /**
+   * 订单id
+   */
+  orderId?: string;
+  /**
+   * id
+   * 部门编号
+   */
+  orgCode?: string;
+  /**
+   * 是否延课(0-未延课 1-已延课)
+   */
+  orPostpone?: number;
+  /**
+   * 延课原因
+   */
+  postponeReason?: string;
+  /**
+   * 系统状态;状态(0-正常,1-冻结)
+   */
+  status?: number;
+  /**
+   * 更新人;更新人
+   */
+  updateBy?: string;
+  /**
+   * 更新时间;更新时间
+   */
+  updateTime?: string;
+  /**
+   * 使用人ID
+   */
+  useUserId?: string;
+  /**
+   * 使用人人脸照片
+   */
+  useUserImage?: string;
+  /**
+   * 使用人名称
+   */
+  useUserName?: string;
+  /**
+   * 使用人手机号
+   */
+  useUserPhone?: string;
+  /**
+   * 核验照片
+   */
+  verifyImage?: string;
+  /**
+   * 核销状态(0-未核销 1-已核销)
+   */
+  verifyStatus?: number;
+  /**
+   * 核验时间
+   */
+  verifyTime?: string;
+  /**
+   * 核验人ID
+   */
+  verifyUserId?: string;
+  /**
+   * 核验人名称
+   */
+  verifyUserName?: string;
+  [property: string]: any;
 }

+ 30 - 4
src/views/orderManagement/order/order.data.ts

@@ -1,7 +1,7 @@
 import { BasicColumn } from '/@/components/Table';
 import { FormSchema } from '/@/components/Table';
 import { h } from 'vue';
-import { Image, TableColumnType } from 'ant-design-vue';
+import { TableColumnType } from 'ant-design-vue';
 //列表数据
 export const columns: BasicColumn[] = [
   {
@@ -135,9 +135,9 @@ export const goodsType = [
 export const afterSaleStatus = ['暂无售后', '待退款', '已退款'];
 
 /**
- * orderStatus 订单状态 0-待付款 1-待使用 2-已使用 3-已到期 4-已取消
+ * 0-待付款 1-待使用 2-已使用 3-已到期 4-已取消 5-退款中 6已退款
  */
-export const orderStatus = ['待付款', '待使用', '已使用', '已到期', '已取消'];
+export const orderStatus = ['待付款', '待使用', '已使用', '已到期', '已取消', '退款中', '已退款'];
 
 export const orderColum: TableColumnType[] = [
   {
@@ -151,7 +151,7 @@ export const orderColum: TableColumnType[] = [
     align: 'center',
   },
   {
-    dataIndex: 'price',
+    dataIndex: 'originalPrice',
     title: '原价/元',
     align: 'center',
   },
@@ -173,5 +173,31 @@ export const orderColum: TableColumnType[] = [
     dataIndex: 'price',
     title: '小计/元',
     align: 'center',
+    customRender: ({ record }) => {
+      return (record.originalPrice || 0) * record.quantity;
+    },
+  },
+];
+
+export const useRecord: TableColumnType[] = [
+  {
+    dataIndex: 'isinCode',
+    title: '卷号',
+    align: 'center',
+  },
+  {
+    dataIndex: 'useUserName',
+    title: '使用地点',
+    align: 'center',
+  },
+  {
+    dataIndex: 'useUserName',
+    title: '核验人员 ',
+    align: 'center',
+  },
+  {
+    dataIndex: 'useUserName',
+    title: '使用时间',
+    align: 'center',
   },
 ];

+ 6 - 0
src/views/safetyManagement/Turnstile/Turnstile.data.ts

@@ -72,6 +72,12 @@ export const formSchema: FormSchema[] = [
     component: 'Input',
     required: true,
   },
+  {
+    label: '设备密码',
+    field: 'validateCode',
+    component: 'Input',
+    required: true,
+  },
   {
     label: '门店名称',
     field: 'siteId',