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