From 611dd8268e40caa4d97e8954b85b5adaaef99afa Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期一, 26 十月 2026 17:45:58 +0800
Subject: [PATCH] feat(hrm): 考勤规则支持地图定位打卡

---
 src/views/aftersales/ticket/data.ts |  223 +++++++++++++++++++++++--------------------------------
 1 files changed, 94 insertions(+), 129 deletions(-)

diff --git a/src/views/aftersales/ticket/data.ts b/src/views/aftersales/ticket/data.ts
index 15c83cc..aefa638 100644
--- a/src/views/aftersales/ticket/data.ts
+++ b/src/views/aftersales/ticket/data.ts
@@ -1,9 +1,8 @@
-import type { VbenFormApi, VbenFormSchema } from '#/adapter/form';
+import type { VbenFormSchema } from '#/adapter/form';
 import type { VxeTableGridOptions } from '#/adapter/vxe-table';
 import type { AftersalesTicketApi } from '#/api/aftersales/ticket';
-import type { ErpSaleOrderApi } from '#/api/erp/sale/order';
 
-import { h, markRaw } from 'vue';
+import { h } from 'vue';
 
 import { DICT_TYPE } from '@vben/constants';
 import { getDictOptions } from '@vben/hooks';
@@ -11,11 +10,9 @@
 import { Button, Tag } from 'ant-design-vue';
 
 import { z } from '#/adapter/form';
-import CrmCustomerSelect from '#/components/crm-customer-select.vue';
-import { ErpSaleOrderSelect } from '#/views/erp/sale/order/components';
-import { MdItemSelect } from '#/views/mes/md/item/components';
-import { WmBatchSelect } from '#/views/wls/batch/components';
-import { UserSelect } from '#/views/system/user/components';
+import { getSimpleUserList } from '#/api/system/user';
+import { getDeptList } from '#/api/system/dept';
+import { handleTree } from '#/packages/utils/src';
 
 /** 琛ㄥ崟绫诲瀷 */
 export type TicketFormType = 'create' | 'detail' | 'update';
@@ -40,11 +37,7 @@
 }
 
 /** 宸ュ崟琛ㄥ崟 */
-export function useTicketFormSchema(
-  formType: TicketFormType,
-  formApi?: VbenFormApi,
-  onSaleOrderChange?: (order: Record<string, unknown> | undefined) => void,
-): VbenFormSchema[] {
+export function useTicketFormSchema(formType: TicketFormType): VbenFormSchema[] {
   const readonly = isHeaderReadonly(formType);
   return [
     {
@@ -73,42 +66,16 @@
       rules: 'required',
     },
     {
-      fieldName: 'saleOrderId',
-      label: '閿�鍞鍗曞彿',
-      component: markRaw(ErpSaleOrderSelect),
-      componentProps: {
-        placeholder: '璇烽�夋嫨閿�鍞鍗�',
-        outStatus: 3,
-        onChange: (item: Record<string, unknown> | undefined) => {
-          if (formApi) {
-            formApi.setFieldValue('saleOrderNo', item?.no ?? '');
-            if (item?.customerId) {
-              formApi.setFieldValue('customerId', item.customerId);
-            }
-          }
-          onSaleOrderChange?.(item);
-        },
-      },
-    },
-    {
-      fieldName: 'saleOrderNo',
-      component: 'Input',
-      dependencies: {
-        triggerFields: [''],
-        show: () => false,
-      },
-    },
-    {
-      fieldName: 'customerId',
+      fieldName: 'customerName',
       label: '瀹㈡埛',
-      component: markRaw(CrmCustomerSelect),
+      component: 'Input',
       componentProps: {
-        placeholder: '璇烽�夋嫨瀹㈡埛',
+        placeholder: '璇疯緭鍏ュ鎴�',
       },
-      rules: 'selectRequired',
+      rules: 'required',
     },
     {
-      fieldName: 'contactId',
+      fieldName: 'contactName',
       label: '鑱旂郴浜�',
       component: 'Input',
       componentProps: {
@@ -118,9 +85,17 @@
     {
       fieldName: 'handlerUserId',
       label: '澶勭悊浜�',
-      component: markRaw(UserSelect),
+      component: 'ApiSelect',
       componentProps: {
-        placeholder: '璇烽�夋嫨澶勭悊浜�',
+        api: getSimpleUserList,
+        labelField: 'nickname',
+        valueField: 'id',
+        showSearch: true,
+        filterOption: (input: string, option: any) =>
+          `${option?.label ?? ''}`.toLowerCase().includes(input.toLowerCase()) ||
+          `${option?.value ?? ''}`.includes(input),
+        allowClear: true,
+        placeholder: '璇烽�夋嫨澶勭悊浜猴紙鍙悳绱㈡樀绉帮級',
       },
       rules: 'selectRequired',
     },
@@ -219,11 +194,12 @@
       },
     },
     {
-      fieldName: 'customerId',
+      fieldName: 'customerName',
       label: '瀹㈡埛',
-      component: markRaw(CrmCustomerSelect),
+      component: 'Input',
       componentProps: {
-        placeholder: '璇烽�夋嫨瀹㈡埛',
+        allowClear: true,
+        placeholder: '璇疯緭鍏ュ鎴�',
       },
     },
     {
@@ -266,11 +242,6 @@
     {
       field: 'customerName',
       title: '瀹㈡埛',
-      minWidth: 150,
-    },
-    {
-      field: 'saleOrderNo',
-      title: '閿�鍞鍗曞彿',
       minWidth: 150,
     },
     {
@@ -322,6 +293,11 @@
 ): VxeTableGridOptions<AftersalesTicketApi.TicketItem>['columns'] {
   return [
     {
+      field: 'itemNo',
+      title: '鏄庣粏鍗曞彿',
+      minWidth: 170,
+    },
+    {
       field: 'itemCode',
       title: '鐗╂枡缂栫爜',
       minWidth: 120,
@@ -358,6 +334,22 @@
       width: 90,
       slots: { default: 'needReturn' },
     },
+    {
+      field: 'deptName',
+      title: '閮ㄩ棬',
+      minWidth: 120,
+    },
+    {
+      field: 'reasonType',
+      title: '鍘熷洜绫诲瀷',
+      width: 120,
+      slots: { default: 'reasonType' },
+    },
+    {
+      field: 'reason',
+      title: '鍏蜂綋鍘熷洜',
+      minWidth: 160,
+    },
     ...(editable
       ? [
           {
@@ -372,86 +364,25 @@
 }
 
 /** 宸ュ崟鏄庣粏琛岃〃鍗� */
-export function useTicketItemFormSchema(
-  clientId?: number,
-  salesOrderCode?: string,
-  orderItems?: ErpSaleOrderApi.SaleOrderItem[],
-  formApi?: VbenFormApi,
-): VbenFormSchema[] {
-  const hasOrderItems = orderItems && orderItems.length > 0;
+export function useTicketItemFormSchema(): VbenFormSchema[] {
   return [
     {
-      fieldName: 'itemId',
-      label: '鐗╂枡',
-      component: hasOrderItems ? 'Select' : markRaw(MdItemSelect),
-      componentProps: hasOrderItems
-        ? {
-            placeholder: '璇烽�夋嫨鐗╂枡',
-            options: orderItems!.map((oi) => ({
-              label: `${oi.productName || ''} (${oi.productBarCode || oi.productId})`,
-              value: oi.productId,
-            })),
-            showSearch: true,
-            onChange: (value: number) => {
-              const oi = orderItems!.find((o) => o.productId === value);
-              if (oi && formApi) {
-                formApi.setValues({
-                  itemName: oi.productName,
-                  itemCode: oi.productBarCode || '',
-                  saleQuantity: oi.count,
-                  batchCode: oi.batchCode || '',
-                });
-              }
-            },
-          }
-        : {
-            placeholder: '璇烽�夋嫨鐗╂枡',
-          },
-      rules: 'selectRequired',
-    },
-    {
-      fieldName: 'itemCode',
-      component: 'Input',
-      dependencies: { triggerFields: [''], show: () => false },
-    },
-    {
       fieldName: 'itemName',
+      label: '鐗╂枡',
       component: 'Input',
-      dependencies: { triggerFields: [''], show: () => false },
+      componentProps: {
+        placeholder: '璇疯緭鍏ョ墿鏂�',
+      },
+      rules: 'required',
     },
-    ...(hasOrderItems
-      ? [
-          {
-            fieldName: 'batchCode',
-            label: '鎵规',
-            component: 'Input',
-            componentProps: {
-              disabled: true,
-              placeholder: '鑷姩浠庤鍗曞甫鍏�',
-            },
-          },
-        ]
-      : [
-          {
-            fieldName: 'batchId',
-            label: '鎵规',
-            component: markRaw(WmBatchSelect),
-            componentProps: {
-              clientId,
-              placeholder: '璇烽�夋嫨鎵规',
-              salesOrderCode,
-            },
-            dependencies: {
-              triggerFields: ['itemId'],
-              componentProps: (values: Record<string, unknown>) => ({
-                clientId,
-                itemId: values.itemId,
-                placeholder: '璇烽�夋嫨鎵规',
-                salesOrderCode,
-              }),
-            },
-          },
-        ]),
+    {
+      fieldName: 'batchCode',
+      label: '鎵规',
+      component: 'Input',
+      componentProps: {
+        placeholder: '璇疯緭鍏ユ壒娆�',
+      },
+    },
     {
       fieldName: 'saleQuantity',
       label: '閿�鍞暟閲�',
@@ -488,6 +419,40 @@
       rules: z.boolean().default(false),
     },
     {
+      fieldName: 'deptId',
+      label: '閮ㄩ棬',
+      component: 'ApiTreeSelect',
+      componentProps: {
+        api: async () => handleTree(await getDeptList()),
+        labelField: 'name',
+        valueField: 'id',
+        childrenField: 'children',
+        placeholder: '璇烽�夋嫨閮ㄩ棬',
+        treeDefaultExpandAll: true,
+      },
+      rules: 'selectRequired',
+    },
+    {
+      fieldName: 'reasonType',
+      label: '鍘熷洜绫诲瀷',
+      component: 'Select',
+      componentProps: {
+        options: getDictOptions(DICT_TYPE.AFTERSALE_REASON_TYPE, 'number'),
+        placeholder: '璇烽�夋嫨鍘熷洜绫诲瀷',
+      },
+      rules: 'selectRequired',
+    },
+    {
+      fieldName: 'reason',
+      label: '鍏蜂綋鍘熷洜',
+      component: 'Textarea',
+      formItemClass: 'col-span-3',
+      componentProps: {
+        placeholder: '璇疯緭鍏ュ叿浣撳師鍥�',
+        rows: 2,
+      },
+    },
+    {
       fieldName: 'remark',
       label: '澶囨敞',
       component: 'Textarea',

--
Gitblit v1.9.3