Browse Source

refactor(order): 优化订单管理页面

- 修复订单详情页面布局和数据显示问题
- 优化订单列表页面展示效果
- 调整订单状态显示逻辑
- 修复部分组件样式问题
zhangtao 3 weeks ago
parent
commit
0984223634

+ 20 - 12
src/components/ZtCustomTable/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <BasicTable @register="registerTable" @edit-change="onEditChange" :pagination="false" autoCreateKey :data-source="modelValue" :rowKey="handleKey">
+  <BasicTable @register="registerTable" @edit-change="onEditChange" :pagination="false" :data-source="modelValue">
     <template #headerCell="{ column }">
       <template v-if="column.dataIndex == 'operation' && showAction">
         <div class="text-18px cursor-pointer" @click="handleAdd">
@@ -20,12 +20,13 @@
   </BasicTable>
 </template>
 <script lang="ts" setup>
-  import { ref, computed, withDefaults } from 'vue';
+  import { ref, computed, withDefaults, nextTick } from 'vue';
   import { PlusCircleOutlined, MinusCircleOutlined } from '@ant-design/icons-vue';
   import { BasicTable, BasicColumn } from '/@/components/Table';
   import { useListPage } from '/@/hooks/system/useListPage';
   import { useMessage } from '/@/hooks/web/useMessage';
   import dayjs from 'dayjs';
+  import { cloneDeep } from 'lodash-es';
   interface Props {
     tableColumn: BasicColumn[];
     value: any;
@@ -46,11 +47,12 @@
   const emit = defineEmits(['update:value', 'update:deleteId']);
   const modelValue = computed({
     get() {
-      console.log(props.value, 'props.value');
-
+      console.log(props.value, 'get得到值');
       return props.value;
     },
     set(val) {
+      console.log(val, 'set得到值');
+
       emit('update:value', val);
     },
   });
@@ -79,8 +81,7 @@
   });
 
   //BasicTable绑定注册
-  const [registerTable] = tableContext;
-
+  const [registerTable, { getDataSource }] = tableContext;
   function onEditChange({ column, value, record }) {
     if (column.dataIndex == 'time') {
       record.editValueRefs.time.value = value;
@@ -96,23 +97,30 @@
     const newRow: DataRow = {};
     inputFields.forEach((field) => {
       newRow[String(field)] = null;
-      newRow['rowId'] = dayjs().valueOf();
+      newRow['key'] = `table-${dayjs().valueOf()}`;
     });
     return newRow;
   };
   function handleAdd() {
     if (props.count == modelValue.value.length) return useMessage().createMessage.error('最多添加' + props.count + '行数据');
-    modelValue.value.push(addEmptyRow(props.tableColumn));
+    modelValue.value.push(JSON.parse(JSON.stringify(addEmptyRow(props.tableColumn))));
     modelValue.value = [].concat(modelValue.value);
   }
   function handleRemove(index, column) {
-    modelValue.value.splice(index, 1);
+    const newData = cloneDeep(
+      getDataSource()
+        .filter((it) => it.key !== column.key)
+        .map((it) => {
+          return { ...it.editValueRefs, key: it.key };
+        })
+    );
+    modelValue.value = [];
+    nextTick(() => {
+      modelValue.value = newData;
+    });
     if (column.id) {
       deletIdVaule.value.push(column.id);
       deletIdVaule.value = ([] as string[]).concat(deletIdVaule.value);
     }
   }
-  function handleKey(row) {
-    return row.rowId;
-  }
 </script>

+ 13 - 13
src/settings/componentSetting.ts

@@ -9,7 +9,7 @@ export default {
     // 支持 xxx.xxx.xxx格式
     fetchSetting: {
       // 传给后台的当前页字段
-      pageField: 'pageNo',
+      pageField: 'pageNum',
       // 传给后台的每页显示多少条的字段
       sizeField: 'pageSize',
       // 接口返回表格数据的字段
@@ -26,20 +26,20 @@ export default {
     // 默认排序方法
     defaultSortFn: (sortInfo: SorterResult) => {
       //update-begin-author:taoyan date:2022-10-21 for: VUEN-2199【表单设计器】多字段排序
-      if(sortInfo instanceof Array){
-        let sortInfoArray:any[] = []
-        for(let item of sortInfo){
+      if (sortInfo instanceof Array) {
+        let sortInfoArray: any[] = [];
+        for (let item of sortInfo) {
           let info = getSort(item);
-          if(info){
-            sortInfoArray.push(info)
+          if (info) {
+            sortInfoArray.push(info);
           }
         }
         return {
-          sortInfoString: JSON.stringify(sortInfoArray)
-        }
-      }else{
-        let info = getSort(sortInfo)
-        return info || {}
+          sortInfoString: JSON.stringify(sortInfoArray),
+        };
+      } else {
+        let info = getSort(sortInfo);
+        return info || {};
       }
       //update-end-author:taoyan date:2022-10-21 for: VUEN-2199【表单设计器】多字段排序
     },
@@ -78,7 +78,7 @@ export default {
  * 获取排序信息
  * @param item
  */
-function getSort(item){
+function getSort(item) {
   const { field, order } = item;
   if (field && order) {
     let sortType = 'ascend' == order ? 'asc' : 'desc';
@@ -89,5 +89,5 @@ function getSort(item){
       order: sortType,
     };
   }
-  return ''
+  return '';
 }

+ 2 - 0
src/utils/index.ts

@@ -647,6 +647,8 @@ export function areAllItemsAllFieldsFilled(arr: Array<Record<string, any>>): boo
   // return arr.every((item) => areAllFieldsFilled(item));
   //修复新增的时候id校验
   return arr.every((item) => {
+    console.log(item, 'it饿迷糊好几十');
+
     const { coursesId, id, ...rest } = item;
     return areAllFieldsFilled(rest);
   });

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

@@ -225,6 +225,7 @@ export const formSchema: FormSchema[] = [
     component: 'JImageUpload',
     componentProps: {
       tipText: '支持单张上传;宽高比为5:4,且宽高均大于480px,大小5M以内。',
+      fileMax: 9,
     },
     required: true,
   },

+ 16 - 16
src/views/businessManagement/gymnasiumBag/index.vue

@@ -11,20 +11,25 @@
           <Divider></Divider>
         </template>
         <template #customer="{ model }">
-          <div v-for="(item, idx) in getCustomerList(model['categoryId'])" :key="item.value">
+          <div v-for="item in getCustomerList(model['categoryId'])" :key="item.value">
             <Card class="my-4">
               <FormItem :label="`${item.label}场地`" required :labelCol="{ xl: 2, sm: 3 }">
                 <InputNumber
                   addon-before="共有"
                   :disabled="!getIsMerchant"
                   addon-after="个球场"
-                  v-model:value="model['inventory' + idx]"
+                  v-model:value="model['inventory' + item.value]"
                   :max="30"
                   :min="1"
                 ></InputNumber>
               </FormItem>
               <FormItem label="时间段及费用" required :labelCol="{ xl: 2, sm: 3 }" :wrapper-col="{ span: 22 }">
-                <ZtCustomTable :show-action="getIsMerchant" :tableColumn="ScheduleArrangementColums" v-model:value="model[item.value]">
+                <ZtCustomTable
+                  :key="item.value"
+                  :show-action="getIsMerchant"
+                  :tableColumn="ScheduleArrangementColums"
+                  v-model:value="model[item.value]"
+                >
                 </ZtCustomTable>
               </FormItem>
             </Card>
@@ -46,7 +51,6 @@
   </div>
 </template>
 <script lang="ts" setup name="business-management-gymnasiumbag">
-  import type { UserInfo } from '/#/store';
   import { TypographyTitle, Divider, InputNumber, FormItem, Card, message } from 'ant-design-vue';
   import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
   import { getSprotProject } from '/@/api/common/api';
@@ -222,8 +226,6 @@
       const newDATA: any = [];
       const categoryId: any = [];
       res.appSiteCategoryRuleDTOS.map((it) => {
-        console.log(it, '数据');
-
         newDATA.push(
           ...it.appSiteRuleTimeFormDTOList.map((its) => {
             categoryId.push({ [it.categoryId]: its.id });
@@ -239,9 +241,11 @@
       };
       const newData = mergeSameKeys(newDATA);
       uploadId.value = mergeSameKeysIds(categoryId);
+      console.log(uploadId.value, '数据');
+
       categoryIdList.forEach((it, idx) => {
         filed[it] = newData[it];
-        filed[`inventory${idx}`] = res.appSiteCategoryRuleDTOS[idx].count;
+        filed[`inventory${it}`] = res.appSiteCategoryRuleDTOS[idx].count;
       });
       setFieldsValue(filed);
     }
@@ -271,14 +275,14 @@
         reminder: form.reminder,
         siteId: form.name,
       },
-      appSiteCategoryRuleDTOS: categoryList.map((it, idx) => {
+      appSiteCategoryRuleDTOS: categoryList.map((it) => {
         const appSiteRuleTimeFormDTOList = form[it].map((items) => extractRefs(items.editValueRefs));
         return {
           categoryId: it,
-          count: form[`inventory${idx}`],
+          count: form[`inventory${it}`],
           appSiteRuleTimeFormDTOList: appSiteRuleTimeFormDTOList.map((formDtoList, index) => {
             return {
-              id: uploadId.value ? uploadId.value[it][index] : null,
+              id: uploadId.value ? (uploadId.value[it] ? uploadId.value[it][index] : null) : null,
               startTime: formDtoList.time[0],
               endTime: formDtoList.time[1],
               appSiteRuleDTOList: transformData([appSiteRuleTimeFormDTOList[index]], it),
@@ -292,8 +296,6 @@
     try {
       await saveOrUpdate(newObj, isUpdate.value);
       isSubmit.value = false;
-
-      await closeTab();
     } catch (error) {
       isSubmit.value = false;
     }
@@ -329,7 +331,7 @@
       );
       await appendSchemaByField(
         {
-          field: `inventory${idx}`,
+          field: `inventory${it.value}`,
           label: ``,
           component: 'Select',
           show: false,
@@ -387,7 +389,7 @@
 
     const categoryIds = categoryId.split(',');
     for (let i = 0; i < categoryIds.length; i++) {
-      const inventoryField = `inventory${i}`;
+      const inventoryField = `inventory${categoryIds[i]}`;
       const inventoryValue = formValues[inventoryField];
       const priceRulesList = formValues[categoryIds[i]];
       if (inventoryValue === undefined || inventoryValue === null || inventoryValue <= 0 || !priceRulesList) {
@@ -403,8 +405,6 @@
   }
   function reverseTransformData(transformedData: TransformedItem[]): Record<string, OriginalItem[]> {
     const groupedByTime: Record<string, TransformedItem[]> = {};
-    console.log(transformedData, 'transformedData');
-
     // 首先按时间分组数据
     transformedData.forEach((item) => {
       const timeKey = `${item.startTime}-${item.endTime}`;

+ 2 - 3
src/views/businessManagement/schoolOpen/index.vue

@@ -5,7 +5,7 @@
         <template #title1>
           <div class="flex">
             <TypographyTitle :level="4">开放时间</TypographyTitle>
-            <a-button type="link" @click="handleClick">查看教学日与非教学日日历</a-button>
+            <a-button type="link" @click="handleClick" v-if="getIsMerchant">查看教学日与非教学日日历</a-button>
           </div>
           <Divider></Divider>
         </template>
@@ -54,9 +54,8 @@
   import { ref, unref } from 'vue';
   import { useRouter } from 'vue-router';
   import { storeToRefs } from 'pinia';
-  const { userInfo } = storeToRefs(useUserStore());
+  const { userInfo, getIsMerchant } = storeToRefs(useUserStore());
   const router = useRouter();
-  const { getIsMerchant } = storeToRefs(useUserStore());
   const [registerForm, { setProps, resetFields, setFieldsValue, updateSchema, validate, clearValidate, getFieldsValue }] = useForm({
     schemas: formSchema,
     showActionButtonGroup: false,

+ 2 - 2
src/views/informationManagement/ContractList/index.vue

@@ -3,7 +3,7 @@
     <!--引用表格-->
     <BasicTable @register="registerTable">
       <template #tableTitle>
-        <a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
+        <a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined" v-if="getDataSource().length == 0"> 新增</a-button>
       </template>
       <template #action="{ record }">
         <TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)" />
@@ -57,7 +57,7 @@
     },
   });
 
-  const [registerTable, { reload }] = tableContext;
+  const [registerTable, { reload, getDataSource }] = tableContext;
   async function handleView(record: Recordable) {
     const res = await templateViewUrl({ docTemplateId: record.docTemplateId });
     window.open(res, '_blank');

+ 61 - 40
src/views/orderManagement/order/components/orderModelView.vue

@@ -1,18 +1,22 @@
 <template>
   <BasicModal v-bind="$attrs" @register="registerModal" title="查看" width="1000px" destroyOnClose>
-    <div class="px3" v-if="orderInfo">
+    <div class="px3 max-h-900px overflow-y-scroll" v-if="orderInfo">
       <div class="flex items-center font-semibold">
         <div>订单编号:{{ orderInfo.orderCode }}</div>
         <div class="ml-3">下单时间:{{ orderInfo.createTime }} </div>
       </div>
       <div class="mt3">
-        <div
+        <div v-if="orderInfo.orderType != 1 && orderInfo.orderType != 2"
           >共{{ orderInfo.proInfoList?.length }}人 <span class="text-gray">{{ orderStatus[orderInfo.orderStatus] }}</span>
         </div>
+        <div v-else> 共 {{ orderInfo.proInfoList?.length }} 场 </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 class="text-gray">{{ orderStatus[item.orderStatus] }} </div>
+            <template v-if="item.type != 6">
+              <div class="mr3 text-gray" v-if="orderInfo.orderType != 1 && orderInfo.orderType != 2">{{ item.userName }} </div>
+              <div class="mr3 text-gray" :class="[item.orderStatus == 2 ? 'line-through' : '']" v-else> {{ item.ticketNo }} </div>
+              <div class="text-gray">{{ orderStatus[item.orderStatus] }} </div>
+            </template>
           </div>
         </div>
         <div v-if="orderInfo.orderStatus == 0">
@@ -30,7 +34,7 @@
         </div>
       </div>
       <Divider></Divider>
-      <div class="flex items-center justify-between">
+      <div class="grid lg:grid-cols-3 gap-2 sm:grid-cols-1">
         <div>
           <div>使用地信息 </div>
           <div class="text-gray">地点:{{ orderInfo.siteName }}</div>
@@ -49,68 +53,77 @@
       </div>
       <Divider></Divider>
       <TypographyTitle :level="5">订单信息</TypographyTitle>
-      <Table :columns="orderColum" :dataSource="orderInfo.proInfoList" :pagination="{ hideOnSinglePage: true }"></Table>
+      <div class="w-full">
+        <Table :columns="orderColum" :dataSource="orderInfo.proInfoList" bordered :pagination="{ hideOnSinglePage: true }"></Table>
+      </div>
       <div class="mt3">
         <Descriptions title="费用信息" bordered layout="vertical">
-          <DescriptionsItem label="费用类型">
-            <div>
-              <div>商品总额</div>
-              <Divider></Divider>
-            </div>
-            <div v-if="orderInfo.tDiscounts">
-              <div>团购优惠</div>
-              <Divider></Divider>
-            </div>
-            <div v-if="orderInfo.price">
-              <div>实际付款</div>
-              <Divider></Divider>
-            </div>
-            <div v-if="orderInfo.sDiscounts">
-              <div>试听优惠</div>
-              <Divider></Divider>
-            </div>
-            <div v-if="orderInfo.price">
-              <div>应付款</div>
-              <Divider></Divider>
-            </div>
-          </DescriptionsItem>
-          <DescriptionsItem label="金额/元">
+          <DescriptionsItem>
+            <template #label>
+              <div class="flex items-center justify-between">
+                <div>费用信息</div>
+                <div>金额/元</div>
+              </div>
+            </template>
             <div>
-              <div>{{ orderInfo.totalPrice || 0 }}</div>
+              <div class="flex items-center justify-between">
+                <div>商品总额</div>
+                <div>{{ orderInfo.totalPrice || 0 }}</div>
+              </div>
               <Divider></Divider>
             </div>
-            <div v-if="orderInfo.tDiscounts">
-              <div>{{ orderInfo.tDiscounts || 0 }}</div>
+            <div v-if="orderInfo.tdiscounts">
+              <div class="flex items-center justify-between">
+                <div>团购优惠</div>
+                <div>- {{ orderInfo.tdiscounts || 0 }}</div>
+              </div>
               <Divider></Divider>
             </div>
             <div v-if="orderInfo.price">
-              <div>{{ orderInfo.price || 0 }}</div>
+              <div class="flex items-center justify-between">
+                <div>实际付款</div>
+                <div>{{ orderInfo.price || 0 }}</div>
+              </div>
               <Divider></Divider>
             </div>
-            <div v-if="orderInfo.sDiscounts">
-              <div>{{ orderInfo.sDiscounts || 0 }}</div>
+            <div v-if="orderInfo.sdiscounts">
+              <div class="flex items-center justify-between">
+                <div>试听优惠</div>
+                <div>{{ orderInfo.sdiscounts || 0 }}</div>
+              </div>
               <Divider></Divider>
             </div>
             <div v-if="orderInfo.price">
-              <div>{{ orderInfo.price || 0 }}</div>
+              <div class="flex items-center justify-between">
+                <div>应付款</div>
+                <div>{{ orderInfo.price || 0 }}</div>
+              </div>
               <Divider></Divider>
             </div>
           </DescriptionsItem>
         </Descriptions>
       </div>
-      <div class="mt3">
+      <div class="mt3" v-if="orderInfo.isinList">
         <TypographyTitle :level="5">使用记录</TypographyTitle>
-        <Table :columns="useRecord" :dataSource="orderInfo.isinList" :pagination="{ hideOnSinglePage: true }"></Table>
+        <Table :columns="getColumText(orderInfo.orderType)" :dataSource="orderInfo.isinList" :pagination="{ hideOnSinglePage: true }"></Table>
+      </div>
+      <div class="mt3" v-if="normalClass?.length">
+        <TypographyTitle :level="5">(正常课)核销记录</TypographyTitle>
+        <Table :columns="verificationRecordColumns" :dataSource="normalClass" :pagination="{ hideOnSinglePage: true }"></Table>
+      </div>
+      <div class="mt3" v-if="supplementClass?.length">
+        <TypographyTitle :level="5">(补课)核销记录</TypographyTitle>
+        <Table :columns="verificationRecordColumns" :dataSource="supplementClass" :pagination="{ hideOnSinglePage: true }"></Table>
       </div>
     </div>
   </BasicModal>
 </template>
 <script lang="ts" setup>
   import { TypographyTitle, Divider, Table, Descriptions, DescriptionsItem, StatisticCountdown } from 'ant-design-vue';
-  import { ref } from 'vue';
+  import { computed, ref } from 'vue';
   import { BasicModal, useModalInner } from '/@/components/Modal';
   import { queryByid, AppOrderInfoVO } from '../order.api';
-  import { orderStatus, orderColum, useRecord } from '../order.data';
+  import { orderStatus, orderColum, getColumText, verificationRecordColumns } from '../order.data';
   import dayjs from 'dayjs';
   const orderId = ref();
   const orderInfo = ref<AppOrderInfoVO>();
@@ -124,4 +137,12 @@
     const res = await queryByid(orderId.value);
     orderInfo.value = res;
   }
+  const normalClass = computed(() => {
+    const newList = orderInfo.value?.verificationRecordDTOList?.filter((it) => it.coursesType == 0);
+    return newList?.length ? newList[0].verificationRecordList : [];
+  });
+  const supplementClass = computed(() => {
+    const newList = orderInfo.value?.verificationRecordDTOList?.filter((it) => it.coursesType == 1);
+    return newList?.length ? newList[0].verificationRecordList : [];
+  });
 </script>

+ 2 - 2
src/views/orderManagement/order/index.vue

@@ -12,7 +12,7 @@
         <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="item.productImage" />
+        <Image :width="80" class="rounded-16px" :src="item.productImage" v-if="item.productImage" />
         <div class="ml3">{{ item.productName }}</div>
       </div>
     </template>
@@ -29,7 +29,7 @@
     <template #user="{ 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>{{ item.userName }}</div>
+        <div>{{ item.userName || '无' }}</div>
         <div class="text-gray">{{ item.userPhone }}</div>
       </div>
     </template>

+ 168 - 12
src/views/orderManagement/order/order.data.ts

@@ -1,7 +1,8 @@
 import { BasicColumn } from '/@/components/Table';
 import { FormSchema } from '/@/components/Table';
-import { h } from 'vue';
-import { TableColumnType } from 'ant-design-vue';
+import { h, VNode } from 'vue';
+import { TableColumnType, Image, Tag } from 'ant-design-vue';
+import dayjs from 'dayjs';
 //列表数据
 export const columns: BasicColumn[] = [
   {
@@ -144,30 +145,35 @@ export const orderColum: TableColumnType[] = [
     dataIndex: 'productName',
     title: '商品名称',
     align: 'center',
+    width: 280,
   },
   {
     dataIndex: 'ticketNo',
     title: '券号',
     align: 'center',
+    width: 180,
   },
   {
     dataIndex: 'originalPrice',
     title: '原价/元',
     align: 'center',
+    width: 180,
   },
 
   {
     dataIndex: 'orderStatus',
     title: '订单状态',
     align: 'center',
-    customRender: ({ text }) => {
-      return orderStatus[text];
+    customRender: ({ text, record }) => {
+      return record.type != 6 ? orderStatus[text] : '无';
     },
+    width: 180,
   },
   {
     dataIndex: 'quantity',
     title: '数量',
     align: 'center',
+    width: 180,
   },
   {
     dataIndex: 'price',
@@ -176,28 +182,178 @@ export const orderColum: TableColumnType[] = [
     customRender: ({ record }) => {
       return (record.originalPrice || 0) * record.quantity;
     },
+    width: 180,
   },
 ];
 
-export const useRecord: TableColumnType[] = [
+/**
+ *
+ * @param type 订单类型:0-学校 1-包场 2-无固定场 3-个人赛 4-团队赛 5-课程
+ */
+export function getColumText(type: number) {
+  let colum: TableColumnType[] = [];
+  const commonColum: TableColumnType[] = [
+    {
+      dataIndex: 'familyUserName',
+      title: '使用人',
+      align: 'center',
+      width: 180,
+    },
+    {
+      dataIndex: 'userPhone',
+      title: '手机号',
+      align: 'center',
+      width: 180,
+    },
+    {
+      dataIndex: 'isinCode',
+      title: '卷号',
+      align: 'center',
+      width: 180,
+    },
+    {
+      dataIndex: 'isinCode',
+      title: '使用地点',
+      align: 'center',
+      customRender: ({ record }) => {
+        const viewList: VNode[] = [];
+        record.isinList.forEach((it) => {
+          viewList.push(h('div', it.useAddress));
+        });
+        return h('div', viewList);
+      },
+      width: 280,
+    },
+    {
+      dataIndex: 'isinCode',
+      title: '使用时间',
+      align: 'center',
+      customRender: ({ record }) => {
+        const viewList: VNode[] = [];
+        record.isinList.forEach((it) => {
+          viewList.push(h('div', it.useTime));
+        });
+        return h('div', viewList);
+      },
+      width: 280,
+    },
+  ];
+  if (type == 0) {
+    colum = [...commonColum];
+  }
+  if (type == 1 || type == 2) {
+    //包场和无固定场显示一样的,
+    colum = [
+      {
+        dataIndex: 'isinCode',
+        title: '卷号',
+        align: 'center',
+        width: 180,
+      },
+      {
+        dataIndex: 'isinCode',
+        title: '使用地点',
+        align: 'center',
+        customRender: ({ record }) => {
+          const viewList: VNode[] = [];
+          record.isinList.forEach((it) => {
+            viewList.push(h('div', it.useAddress));
+          });
+          return h('div', viewList);
+        },
+        width: 280,
+      },
+      {
+        dataIndex: 'isinCode',
+        title: '核验人员',
+        align: 'center',
+        customRender: ({ record }) => {
+          const viewList: VNode[] = [];
+          record.isinList.forEach((it) => {
+            viewList.push(h('div', it.verifyUserName));
+          });
+          return h('div', viewList);
+        },
+      },
+      {
+        dataIndex: 'isinCode',
+        title: '使用时间',
+        align: 'center',
+        customRender: ({ record }) => {
+          const viewList: VNode[] = [];
+          record.isinList.forEach((it) => {
+            viewList.push(h('div', it.useTime));
+          });
+          return h('div', viewList);
+        },
+        width: 280,
+      },
+    ];
+  }
+  if (type == 5) {
+    colum = [...commonColum];
+    colum.splice(3, 0, {
+      dataIndex: 'isinCode',
+      title: '核验人员',
+      align: 'center',
+      customRender: ({ record }) => {
+        const viewList: VNode[] = [];
+        record.isinList.forEach((it) => {
+          viewList.push(h('div', it.verifyUserName));
+        });
+        return h('div', viewList);
+      },
+    });
+  }
+  console.log(colum, '数据');
+
+  return colum;
+}
+
+export const verificationRecordColumns: TableColumnType[] = [
   {
-    dataIndex: 'isinCode',
-    title: '卷号',
+    dataIndex: 'familyUserName',
+    title: '上课时间',
     align: 'center',
+    customRender: ({ record }) => {
+      return `${dayjs(record.coursesStartTime).format('YYYY-MM-DD HH:mm')} ${dayjs(record.coursesEndTime).format('HH:mm')}`;
+    },
   },
   {
-    dataIndex: 'useUserName',
-    title: '使用地点',
+    dataIndex: 'coursesName',
+    title: '课时名称',
     align: 'center',
   },
   {
     dataIndex: 'useUserName',
-    title: '核验人员 ',
+    title: '使用人',
     align: 'center',
   },
   {
-    dataIndex: 'useUserName',
-    title: '使用时间',
+    dataIndex: 'verifyStatus',
+    title: '核销状态',
+    align: 'left',
+    customRender: ({ text, record }) => {
+      const Viewtext = h('div', { class: 'mr2' }, text == 1 ? '已核销' : '未核销');
+      return record.orPostpone == 0 ? Viewtext : h('div', { class: 'flex items-center' }, [Viewtext, h(Tag, { color: 'green' }, () => '已延课')]);
+    },
+  },
+  {
+    dataIndex: 'verifyUserName',
+    title: '核验人',
+    align: 'center',
+  },
+  {
+    dataIndex: 'isinCode',
+    title: '核验照片',
+    align: 'center',
+    customRender: ({ record }) => {
+      return record.verifyImage ? h(Image, { src: record.verifyImage, width: 100, height: 100 }) : '';
+    },
+  },
+  {
+    dataIndex: 'verifyTime',
+    title: '核验时间',
     align: 'center',
   },
 ];

+ 1 - 2
src/views/safetyManagement/userEvaluation/evaluate.data.ts

@@ -182,7 +182,7 @@ export const formSchema: FormSchema[] = [
       readonly: true,
     },
     render: ({ model, field }) => {
-      const viewList = [h('div', { class: 'mr-3' }, `${model[field]}.0`), h(Rate, { value: model[field], disabled: true })];
+      const viewList = [h('div', { class: 'mr-3' }, `${model[field]}.0`), h(Rate, { value: Number(model[field]), disabled: true })];
       return h('div', { class: 'flex items-center' }, viewList);
     },
   },
@@ -249,7 +249,6 @@ export const formSchema: FormSchema[] = [
     field: 'type',
     component: 'Input',
     span: 12,
-    required: true,
     render: ({ model, field }) => {
       return model[field] == 0 ? '场地' : '课程';
     },

+ 16 - 8
src/views/system/staff/components/staffModl.vue

@@ -14,7 +14,7 @@
           <JSelectRole v-model:value="model[field]" isRadioSelection @options-change="handleChange" />
         </template>
         <template #trainingPrograms="{ model, field }">
-          <FormItem label="培训项目" :wrapperCol="{ span: 24 }" :labelCol="{ span: 5 }" required v-if="isShow">
+          <FormItem label="培训项目" required v-if="isShow" :label-col="{ span: 3 }">
             <ApiSelect
               mode="tags"
               v-model:value="model[field]"
@@ -26,32 +26,41 @@
           </FormItem>
         </template>
         <template #backgroundImg="{ model, field }">
-          <FormItem label="背景图" :wrapperCol="{ span: 24 }" :labelCol="{ span: 5 }" required v-if="isShow">
+          <FormItem label="背景图" required v-if="isShow" :label-col="{ span: 3 }">
             <JImageUpload v-model:value="model[field]" tipText="单张图片,支持格式:.jpg .png .svg .gif ,单个文件不能超过5MB"></JImageUpload>
           </FormItem>
         </template>
         <template #certificateInnocence="{ model, field }">
-          <FormItem label="无犯罪记录" :wrapperCol="{ span: 24 }" :labelCol="{ span: 10 }" :required="isShow">
+          <FormItem label="无犯罪记录" :required="isShow" :label-col="{ span: 3 }">
             <JImageUpload v-model:value="model[field]" tipText="单张图片,支持格式:.jpg .png .svg .gif ,单个文件不能超过5MB"></JImageUpload>
           </FormItem>
         </template>
         <template #healthy="{ model, field }">
-          <FormItem label="健康证" :wrapperCol="{ span: 24 }" :labelCol="{ span: 5 }" :required="isShow">
+          <FormItem label="健康证" :required="isShow" :label-col="{ span: 3 }">
             <JImageUpload v-model:value="model[field]" tipText="单张图片,支持格式:.jpg .png .svg .gif ,单个文件不能超过5MB"></JImageUpload>
           </FormItem>
         </template>
+        <template #avatar="{ model, field }">
+          <FormItem label="头像" :label-col="{ span: 3 }" required v-if="isShow">
+            <JImageUpload
+              v-model:value="model[field]"
+              :file-max="1"
+              tipText="多张图片,支持格式:.jpg .png .svg .gif ,单个文件不能超过5MB"
+            ></JImageUpload>
+          </FormItem>
+        </template>
         <template #teachingPhilosophy="{ model, field }">
-          <FormItem label="教学理念" :wrapperCol="{ span: 24 }" :labelCol="{ span: 5 }" v-if="isShow">
+          <FormItem label="教学理念" v-if="isShow" :label-col="{ span: 3 }">
             <Textarea v-model:value="model[field]"></Textarea>
           </FormItem>
         </template>
         <template #excelMsg="{ model, field }">
-          <FormItem label="擅长描述" :wrapperCol="{ span: 24 }" :labelCol="{ span: 5 }" v-if="isShow">
+          <FormItem label="擅长描述" v-if="isShow" :label-col="{ span: 3 }">
             <Textarea v-model:value="model[field]"></Textarea>
           </FormItem>
         </template>
         <template #honor="{ model, field }">
-          <FormItem label="荣誉认证" :wrapperCol="{ span: 24 }" :labelCol="{ span: 5 }">
+          <FormItem label="荣誉认证" :label-col="{ span: 3 }">
             <JImageUpload
               v-model:value="model[field]"
               :file-max="9"
@@ -88,7 +97,6 @@
     labelWidth: 150,
     schemas: formSchema,
     showActionButtonGroup: false,
-    baseColProps: { span: 24 },
   });
   //表单赋值
   const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {

+ 11 - 3
src/views/system/staff/staff.data.ts

@@ -204,15 +204,13 @@ export const formSchema: FormSchema[] = [
       tipText: '单张图片,支持格式:.jpg .png .svg .gif ,单个文件不能超过5MB',
     },
     colSlot: 'certificateInnocence',
-
-    colProps: { xl: 12, sm: 24 },
     required: true,
   },
+
   {
     field: 'healthy',
     label: '健康证',
     component: 'JImageUpload',
-    colProps: { xl: 12, sm: 24 },
     colSlot: 'healthy',
 
     componentProps: {
@@ -220,6 +218,16 @@ export const formSchema: FormSchema[] = [
     },
     required: true,
   },
+  {
+    field: 'avatar',
+    label: '头像',
+    component: 'JImageUpload',
+    componentProps: {
+      tipText: '单张图片,支持格式:.jpg .png .svg .gif ,单个文件不能超过5MB',
+    },
+    required: true,
+    colSlot: 'avatar',
+  },
   {
     field: 'teachingPhilosophy',
     label: '教学理念',