refactor: 单据审核改为审批配置状态机(前端统一审核弹窗)
已删除5个文件
已添加19个文件
已修改43个文件
| | |
| | | applyUserName?: string; |
| | | applyTime?: string; |
| | | auditStatus?: number; |
| | | processInstanceId?: string; |
| | | // 以ä¸ä¸ºå®¡æ ¸æ´¾çåæ®µï¼ç±å端å¨å®¡æ ¸æ¶åå
¥ï¼å端åªè¯»å±ç¤º |
| | | reviewerId?: number; // å®¡æ ¸äººIDï¼å®é
æ§è¡å®¡æ ¸çç¨æ·ï¼ |
| | | reviewerName?: string; // å®¡æ ¸äººå§å |
| | | reviewTime?: string; // å®¡æ ¸æ¶é´ |
| | | reviewRemark?: string; // å®¡æ ¸æè§ï¼å®¡æ ¸éè¿æ¶çæè§ / å®¡æ ¸ä¸éè¿æ¶çåå ï¼ |
| | | remark?: string; |
| | | createTime?: string; |
| | | } |
| | |
| | | return requestClient.put('/crm/cancellation/update', data); |
| | | } |
| | | |
| | | /** 审æ¹éæ·ç³è¯· */ |
| | | export function auditCancellation(data: { |
| | | id: number; |
| | | auditStatus: number; |
| | | }) { |
| | | return requestClient.put('/crm/cancellation/audit', data); |
| | | /** |
| | | * æäº¤å®¡æ¹ï¼è稿 / å®¡æ ¸ä¸éè¿ â 审æ¹ä¸ï¼ |
| | | * 审æ¹äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãç»ä¸é
ç½®ï¼æäº¤æ¶æ éæå®ã |
| | | */ |
| | | export function submitCancellation(id: number) { |
| | | return requestClient.put('/crm/cancellation/submit', null, { params: { id } }); |
| | | } |
| | | |
| | | /** è·å¾éæ·ç³è¯·ç审æ¹äººç¼å·éåï¼ä¾åè¡¨é¡µå¤ææ¯å¦å±ç¤ºå®¡æ ¸æé® */ |
| | | export function getCancellationApproverIds() { |
| | | return requestClient.get<number[]>('/crm/cancellation/approver-ids'); |
| | | } |
| | | |
| | | /** |
| | | * å®¡æ ¸éæ·ç³è¯·ï¼å®¡æ¹ä¸ â å®¡æ ¸éè¿ / å®¡æ ¸ä¸éè¿ï¼ |
| | | * |
| | | * ä»
审æ¹é
ç½®ä¸ç审æ¹äººå¯è°ç¨ï¼å¤äººæ¶æç¾ï¼ï¼pass=false æ¶ reviewRemarkï¼ä¸éè¿åå ï¼å¿
å¡«ã |
| | | */ |
| | | export function auditCancellation( |
| | | id: number, |
| | | pass: boolean, |
| | | reviewRemark?: string, |
| | | ) { |
| | | return requestClient.put('/crm/cancellation/audit', { |
| | | id, |
| | | pass, |
| | | reviewRemark, |
| | | }); |
| | | } |
| | | |
| | | /** å é¤éæ·ç³è¯· */ |
| | |
| | | ownerUserId: number; |
| | | ownerUserName?: string; |
| | | ownerUserDeptName?: string; |
| | | processInstanceId: number; |
| | | auditStatus: number; |
| | | // 以ä¸ä¸ºå®¡æ ¸æ´¾çåæ®µï¼ç±å端å¨å®¡æ ¸æ¶åå
¥ï¼å端åªè¯»å±ç¤º |
| | | reviewerId?: number; // å®¡æ ¸äººIDï¼å®é
æ§è¡å®¡æ ¸çç¨æ·ï¼ |
| | | reviewerName?: string; // å®¡æ ¸äººå§å |
| | | reviewTime?: Date; // å®¡æ ¸æ¶é´ |
| | | reviewRemark?: string; // å®¡æ ¸æè§ï¼å®¡æ ¸éè¿æ¶çæè§ / å®¡æ ¸ä¸éè¿æ¶çåå ï¼ |
| | | orderDate: Date; |
| | | startTime: Date; |
| | | endTime: Date; |
| | |
| | | totalPrice: number; |
| | | } |
| | | |
| | | /** å®¡æ¹æµç¨ */ |
| | | export interface ApproveProcess { |
| | | key: string; |
| | | name: string; |
| | | } |
| | | } |
| | | |
| | | /** æ¥è¯¢ååå表 */ |
| | |
| | | return requestClient.download('/crm/contract/export-excel', { params }); |
| | | } |
| | | |
| | | /** æäº¤å®¡æ ¸ */ |
| | | export function submitContract(id: number, processDefinitionKey: string) { |
| | | /** |
| | | * æäº¤åå审æ¹ï¼æªæäº¤ / å®¡æ ¸ä¸éè¿ â 审æ¹ä¸ï¼ |
| | | * |
| | | * 审æ¹äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãæä¸å¡ç±»åç»ä¸é
ç½®ï¼æäº¤æ¶æ éæå®ï¼ |
| | | * æªå¯ç¨å®¡æ¹ææªé
ç½®ææå®¡æ¹äººæ¶åç«¯ä¼æåºä¸å¡å¼å¸¸ã |
| | | */ |
| | | export function submitContract(id: number) { |
| | | return requestClient.put('/crm/contract/submit', null, { |
| | | params: { id, processDefinitionKey }, |
| | | params: { id }, |
| | | }); |
| | | } |
| | | |
| | | /** è·åååå®¡æ¹æµç¨å表 */ |
| | | export function getContractApproveProcessList() { |
| | | return requestClient.get<CrmContractApi.ApproveProcess[]>( |
| | | '/crm/contract/approve-process-list', |
| | | ); |
| | | /** |
| | | * è·å¾ååç审æ¹äººç¼å·éå |
| | | * |
| | | * ä¾åè¡¨é¡µå¤æå½åç»å½ç¨æ·æ¯å¦åºå±ç¤ºãå®¡æ ¸ / å®¡æ ¸ä¸éè¿ãæé®ï¼æªé
ç½®æ¶è¿å空æ°ç»ã |
| | | */ |
| | | export function getContractApproverIds() { |
| | | return requestClient.get<number[]>('/crm/contract/approver-ids'); |
| | | } |
| | | |
| | | /** |
| | | * å®¡æ ¸ååï¼å®¡æ¹ä¸ â å®¡æ ¸éè¿ / å®¡æ ¸ä¸éè¿ï¼ |
| | | * |
| | | * ä»
审æ¹é
ç½®ä¸ç审æ¹äººå¯è°ç¨ï¼å¤äººæ¶æç¾ï¼ï¼pass=false æ¶ reviewRemarkï¼ä¸éè¿åå ï¼å¿
å¡«ã |
| | | */ |
| | | export function auditContract( |
| | | id: number, |
| | | pass: boolean, |
| | | reviewRemark?: string, |
| | | ) { |
| | | return requestClient.put('/crm/contract/audit', { |
| | | id, |
| | | pass, |
| | | reviewRemark, |
| | | }); |
| | | } |
| | | |
| | | /** åå转移 */ |
| | |
| | | price?: number; |
| | | invoiceTime?: string; |
| | | auditStatus?: number; |
| | | // 以ä¸ä¸ºå®¡æ ¸æ´¾çåæ®µï¼ç±å端å¨å®¡æ ¸æ¶åå
¥ï¼å端åªè¯»å±ç¤º |
| | | reviewerId?: number; // å®¡æ ¸äººIDï¼å®é
æ§è¡å®¡æ ¸çç¨æ·ï¼ |
| | | reviewerName?: string; // å®¡æ ¸äººå§å |
| | | reviewTime?: string; // å®¡æ ¸æ¶é´ |
| | | reviewRemark?: string; // å®¡æ ¸æè§ï¼å®¡æ ¸éè¿æ¶çæè§ / å®¡æ ¸ä¸éè¿æ¶çåå ï¼ |
| | | remark?: string; |
| | | ownerUserId?: number; |
| | | ownerUserName?: string; |
| | | ownerUserDeptName?: string; |
| | | processInstanceId?: string; |
| | | attachmentList?: Attachment[]; |
| | | blobIds?: number[]; |
| | | hasAttachment?: boolean; |
| | |
| | | return requestClient.download('/crm/invoice/export-excel', { params }); |
| | | } |
| | | |
| | | /** æäº¤å®¡æ ¸ */ |
| | | /** |
| | | * æäº¤å®¡æ¹ï¼è稿 / å®¡æ ¸ä¸éè¿ â 审æ¹ä¸ï¼ |
| | | * 审æ¹äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãç»ä¸é
ç½®ï¼æäº¤æ¶æ éæå®ã |
| | | */ |
| | | export function submitInvoice(id: number) { |
| | | return requestClient.put(`/crm/invoice/submit?id=${id}`); |
| | | return requestClient.put('/crm/invoice/submit', null, { params: { id } }); |
| | | } |
| | | |
| | | /** è·å¾å¼ç¥¨ç审æ¹äººç¼å·éåï¼ä¾åè¡¨é¡µå¤ææ¯å¦å±ç¤ºå®¡æ ¸æé® */ |
| | | export function getInvoiceApproverIds() { |
| | | return requestClient.get<number[]>('/crm/invoice/approver-ids'); |
| | | } |
| | | |
| | | /** |
| | | * å®¡æ ¸å¼ç¥¨ï¼å®¡æ¹ä¸ â å®¡æ ¸éè¿ / å®¡æ ¸ä¸éè¿ï¼ |
| | | * |
| | | * ä»
审æ¹é
ç½®ä¸ç审æ¹äººå¯è°ç¨ï¼å¤äººæ¶æç¾ï¼ï¼pass=false æ¶ reviewRemarkï¼ä¸éè¿åå ï¼å¿
å¡«ã |
| | | */ |
| | | export function auditInvoice( |
| | | id: number, |
| | | pass: boolean, |
| | | reviewRemark?: string, |
| | | ) { |
| | | return requestClient.put('/crm/invoice/audit', { id, pass, reviewRemark }); |
| | | } |
| | | |
| | | /** è·å¾å¾
å®¡æ ¸å¼ç¥¨æ°é */ |
| | |
| | | applyUserName?: string; |
| | | applyTime?: string; |
| | | auditStatus?: number; |
| | | processInstanceId?: string; |
| | | // 以ä¸ä¸ºå®¡æ ¸æ´¾çåæ®µï¼ç±å端å¨å®¡æ ¸æ¶åå
¥ï¼å端åªè¯»å±ç¤º |
| | | reviewerId?: number; // å®¡æ ¸äººIDï¼å®é
æ§è¡å®¡æ ¸çç¨æ·ï¼ |
| | | reviewerName?: string; // å®¡æ ¸äººå§å |
| | | reviewTime?: string; // å®¡æ ¸æ¶é´ |
| | | reviewRemark?: string; // å®¡æ ¸æè§ï¼å®¡æ ¸éè¿æ¶çæè§ / å®¡æ ¸ä¸éè¿æ¶çåå ï¼ |
| | | remark?: string; |
| | | createTime?: string; |
| | | } |
| | |
| | | return requestClient.put('/crm/refund/update', data); |
| | | } |
| | | |
| | | /** 审æ¹éè´¹å */ |
| | | export function auditRefund(data: { id: number; auditStatus: number }) { |
| | | return requestClient.put('/crm/refund/audit', data); |
| | | /** |
| | | * æäº¤å®¡æ¹ï¼è稿 / å®¡æ ¸ä¸éè¿ â 审æ¹ä¸ï¼ |
| | | * 审æ¹äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãç»ä¸é
ç½®ï¼æäº¤æ¶æ éæå®ã |
| | | */ |
| | | export function submitRefund(id: number) { |
| | | return requestClient.put('/crm/refund/submit', null, { params: { id } }); |
| | | } |
| | | |
| | | /** è·å¾éè´¹åç审æ¹äººç¼å·éåï¼ä¾åè¡¨é¡µå¤ææ¯å¦å±ç¤ºå®¡æ ¸æé® */ |
| | | export function getRefundApproverIds() { |
| | | return requestClient.get<number[]>('/crm/refund/approver-ids'); |
| | | } |
| | | |
| | | /** |
| | | * å®¡æ ¸éè´¹åï¼å®¡æ¹ä¸ â å®¡æ ¸éè¿ / å®¡æ ¸ä¸éè¿ï¼ |
| | | * |
| | | * ä»
审æ¹é
ç½®ä¸ç审æ¹äººå¯è°ç¨ï¼å¤äººæ¶æç¾ï¼ï¼pass=false æ¶ reviewRemarkï¼ä¸éè¿åå ï¼å¿
å¡«ã |
| | | */ |
| | | export function auditRefund(id: number, pass: boolean, reviewRemark?: string) { |
| | | return requestClient.put('/crm/refund/audit', { id, pass, reviewRemark }); |
| | | } |
| | | |
| | | /** å é¤éè´¹å */ |
| | |
| | | discountPrice: number; // 伿 éé¢ |
| | | paymentPrice: number; // å®é
仿¬¾éé¢ |
| | | status: number; // ç¶æ |
| | | processInstanceId?: string; // 工使µç¼å· |
| | | // ========== 审æ¹ä¿¡æ¯ï¼è½»éçº§ç¶ææºå®¡æ¹ï¼ ========== |
| | | reviewerId?: number; // å®¡æ ¸äººç¼å· |
| | | reviewerName?: string; // å®¡æ ¸äººå§å |
| | | reviewTime?: Date | string; // å®¡æ ¸æ¶é´ |
| | | reviewRemark?: string; // å®¡æ ¸æè§ï¼ä¸éè¿æ¶ä¸ºé©³ååå ï¼ |
| | | remark: string; // 夿³¨ |
| | | attachmentList?: { id: number; name?: string; url?: string }[]; // éä»¶å表 |
| | | accountId?: number; // 仿¬¾è´¦æ· |
| | |
| | | return requestClient.put('/erp/finance-payment/update', data); |
| | | } |
| | | |
| | | /** æäº¤ä»æ¬¾åå®¡æ¹ */ |
| | | export function submitFinancePayment(id: number, processDefinitionKey: string) { |
| | | return requestClient.post('/erp/finance-payment/submit', null, { |
| | | params: { id, processDefinitionKey }, |
| | | /** |
| | | * æäº¤å®¡æ¹ï¼æªå®¡æ ¸ â 审æ¹ä¸ï¼ |
| | | * |
| | | * 审æ¹äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãç»ä¸é
ç½®ï¼æäº¤æ¶æ éæå®ã |
| | | */ |
| | | export function submitFinancePayment(id: number) { |
| | | return requestClient.put('/erp/finance-payment/submit', null, { |
| | | params: { id }, |
| | | }); |
| | | } |
| | | |
| | | /** è·å仿¬¾åå®¡æ¹æµç¨å表 */ |
| | | export function getFinancePaymentApproveProcessList() { |
| | | return requestClient.get('/erp/finance-payment/approve-process-list'); |
| | | /** è·å¾å®¡æ¹äººç¼å·éåï¼ä¾åè¡¨é¡µå¤ææ¯å¦å±ç¤ºå®¡æ ¸æé® */ |
| | | export function getFinancePaymentApproverUserIds() { |
| | | return requestClient.get<number[]>('/erp/finance-payment/approver-ids'); |
| | | } |
| | | |
| | | /** |
| | | * å®¡æ ¸ï¼å®¡æ¹ä¸ â å®¡æ ¸éè¿/å®¡æ ¸ä¸éè¿ï¼ |
| | | * |
| | | * ä»
审æ¹é
ç½®ä¸æå®ç审æ¹äººæ¬äººå¯è°ç¨ï¼pass=false æ¶ reviewRemarkï¼ä¸éè¿åå ï¼å¿
å¡«ã |
| | | */ |
| | | export function auditFinancePayment( |
| | | id: number, |
| | | pass: boolean, |
| | | reviewRemark?: string, |
| | | ) { |
| | | return requestClient.put('/erp/finance-payment/audit', { |
| | | id, |
| | | pass, |
| | | reviewRemark, |
| | | }); |
| | | } |
| | | |
| | | /** å é¤ä»æ¬¾å */ |
| | |
| | | id?: number; // ç¼å· |
| | | no?: string; // ç³è¯·ç¼å· |
| | | status?: number; // ç¶æï¼0æªæäº¤ 10审æ¹ä¸ 20å®¡æ ¸éè¿ 30å®¡æ ¸ä¸éè¿ 40已忶 |
| | | processInstanceId?: string; // 工使µç¼å· |
| | | requestUserId?: number; // ç³è¯·äººç¼å· |
| | | requestUserName?: string; // ç³è¯·äººåç§° |
| | | requestDeptId?: number; // ç³è¯·é¨é¨ç¼å· |
| | |
| | | productNames?: string; // 产ååç§°å表 |
| | | orderId?: number; // çæçéè´è®¢åç¼å· |
| | | orderNo?: string; // çæçéè´è®¢åå· |
| | | processInstanceId?: number; // å®¡æ¹æµç¨å®ä¾ç¼å· |
| | | // ========== 审æ¹ä¿¡æ¯ï¼è½»éçº§ç¶ææºå®¡æ¹ï¼ ========== |
| | | reviewerId?: number; // å®¡æ ¸äººç¼å· |
| | | reviewerName?: string; // å®¡æ ¸äººå§å |
| | | reviewTime?: Date | string; // å®¡æ ¸æ¶é´ |
| | | reviewRemark?: string; // å®¡æ ¸æè§ï¼ä¸éè¿æ¶ä¸ºé©³ååå ï¼ |
| | | items?: PurchaseRequestItem[]; // ç³è¯·æç» |
| | | createTime?: string; // å建æ¶é´ |
| | | } |
| | |
| | | return requestClient.put('/purchase/request/update', data); |
| | | } |
| | | |
| | | /** æäº¤éè´ç³è¯·å®¡æ¹ */ |
| | | export function submitPurchaseRequest(id: number, processDefinitionKey: string) { |
| | | return requestClient.put('/purchase/request/submit', null, { params: { id, processDefinitionKey } }); |
| | | /** |
| | | * æäº¤å®¡æ¹ï¼æªæäº¤/å®¡æ ¸ä¸éè¿ â 审æ¹ä¸ï¼ |
| | | * |
| | | * 审æ¹äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãç»ä¸é
ç½®ï¼æäº¤æ¶æ éæå®ã |
| | | */ |
| | | export function submitPurchaseRequest(id: number) { |
| | | return requestClient.put('/purchase/request/submit', null, { |
| | | params: { id }, |
| | | }); |
| | | } |
| | | |
| | | /** è·å¾å®¡æ¹äººç¼å·éåï¼ä¾åè¡¨é¡µå¤ææ¯å¦å±ç¤ºå®¡æ ¸æé® */ |
| | | export function getPurchaseRequestApproverUserIds() { |
| | | return requestClient.get<number[]>('/purchase/request/approver-ids'); |
| | | } |
| | | |
| | | /** |
| | | * å®¡æ ¸ï¼å®¡æ¹ä¸ â å®¡æ ¸éè¿/å®¡æ ¸ä¸éè¿ï¼ |
| | | * |
| | | * ä»
审æ¹é
ç½®ä¸æå®ç审æ¹äººæ¬äººå¯è°ç¨ï¼pass=false æ¶ reviewRemarkï¼ä¸éè¿åå ï¼å¿
å¡«ã |
| | | */ |
| | | export function auditPurchaseRequest( |
| | | id: number, |
| | | pass: boolean, |
| | | reviewRemark?: string, |
| | | ) { |
| | | return requestClient.put('/purchase/request/audit', { |
| | | id, |
| | | pass, |
| | | reviewRemark, |
| | | }); |
| | | } |
| | | |
| | | /** çæéè´è®¢å */ |
| | |
| | | /** 导åºéè´ç³è¯· Excel */ |
| | | export function exportPurchaseRequest(params: any) { |
| | | return requestClient.download('/purchase/request/export-excel', { params }); |
| | | } |
| | | |
| | | /** è·åå®¡æ¹æµç¨å表 */ |
| | | export function getApproveProcessList(id: number) { |
| | | return requestClient.get(`/purchase/request/approve-process-list`, { params: { id } }); |
| | | } |
| | |
| | | blobIds?: number[]; |
| | | attachmentList?: SystemStorageApi.StorageBlob[]; |
| | | status?: number; |
| | | processInstanceId?: string; |
| | | exceptionDate?: string; |
| | | // 以ä¸ä¸ºå®¡æ ¸æ´¾çåæ®µï¼ç±å端å¨å®¡æ ¸æ¶åå
¥ï¼å端åªè¯»å±ç¤º |
| | | reviewerId?: number; // å®¡æ ¸äººIDï¼å®é
æ§è¡å®¡æ ¸çç¨æ·ï¼ |
| | | reviewerName?: string; // å®¡æ ¸äººå§å |
| | | reviewTime?: string; // å®¡æ ¸æ¶é´ |
| | | reviewRemark?: string; // å®¡æ ¸æè§ï¼å®¡æ ¸éè¿æ¶çæè§ / å®¡æ ¸ä¸éè¿æ¶çåå ï¼ |
| | | remark?: string; |
| | | createTime?: string; |
| | | } |
| | | |
| | | /** å®¡æ¹æµç¨ */ |
| | | export interface ApproveProcess { |
| | | key: string; |
| | | name: string; |
| | | } |
| | | } |
| | | |
| | |
| | | return requestClient.post('/hrm/attendance/exception/create', data); |
| | | } |
| | | |
| | | /** æäº¤èå¤å¼å¸¸ç³è¯· */ |
| | | export function submitAttendanceException(id: number, processDefinitionKey: string) { |
| | | return requestClient.post('/hrm/attendance/exception/submit', null, { |
| | | params: { id, processDefinitionKey }, |
| | | /** |
| | | * æäº¤èå¤å¼å¸¸ç³è¯·å®¡æ¹ï¼è稿 / å®¡æ ¸ä¸éè¿ â 审æ¹ä¸ï¼ |
| | | * |
| | | * 审æ¹äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãæä¸å¡ç±»åï¼hrm_attendance_approveï¼ç»ä¸é
ç½®ï¼æäº¤æ¶æ éæå®ã |
| | | */ |
| | | export function submitAttendanceException(id: number) { |
| | | return requestClient.put('/hrm/attendance/exception/submit', null, { |
| | | params: { id }, |
| | | }); |
| | | } |
| | | |
| | | /** è·åèå¤å¼å¸¸å®¡æ¹æµç¨å表 */ |
| | | export function getAttendanceExceptionApproveProcessList() { |
| | | return requestClient.get<HrmAttendanceExceptionApi.ApproveProcess[]>( |
| | | '/hrm/attendance/exception/approve-process-list', |
| | | /** è·å¾èå¤å¼å¸¸ç³è¯·ç审æ¹äººç¼å·éåï¼ä¾åè¡¨é¡µå¤ææ¯å¦å±ç¤ºå®¡æ ¸æé® */ |
| | | export function getAttendanceExceptionApproverIds() { |
| | | return requestClient.get<number[]>( |
| | | '/hrm/attendance/exception/approver-ids', |
| | | ); |
| | | } |
| | | |
| | | /** |
| | | * å®¡æ ¸èå¤å¼å¸¸ç³è¯·ï¼å®¡æ¹ä¸ â å®¡æ ¸éè¿ / å®¡æ ¸ä¸éè¿ï¼ |
| | | * |
| | | * ä»
审æ¹é
ç½®ä¸ç审æ¹äººå¯è°ç¨ï¼å¤äººæ¶æç¾ï¼ï¼pass=false æ¶ reviewRemarkï¼ä¸éè¿åå ï¼å¿
å¡«ã |
| | | */ |
| | | export function auditAttendanceException( |
| | | id: number, |
| | | pass: boolean, |
| | | reviewRemark?: string, |
| | | ) { |
| | | return requestClient.put('/hrm/attendance/exception/audit', { |
| | | id, |
| | | pass, |
| | | reviewRemark, |
| | | }); |
| | | } |
| | |
| | | blobIds?: number[]; |
| | | attachmentList?: SystemStorageApi.StorageBlob[]; |
| | | status?: number; |
| | | processInstanceId?: string; |
| | | // 以ä¸ä¸ºå®¡æ ¸æ´¾çåæ®µï¼ç±å端å¨å®¡æ ¸æ¶åå
¥ï¼å端åªè¯»å±ç¤º |
| | | reviewerId?: number; // å®¡æ ¸äººIDï¼å®é
æ§è¡å®¡æ ¸çç¨æ·ï¼ |
| | | reviewerName?: string; // å®¡æ ¸äººå§å |
| | | reviewTime?: string; // å®¡æ ¸æ¶é´ |
| | | reviewRemark?: string; // å®¡æ ¸æè§ï¼å®¡æ ¸éè¿æ¶çæè§ / å®¡æ ¸ä¸éè¿æ¶çåå ï¼ |
| | | remark?: string; |
| | | createTime?: string; |
| | | } |
| | |
| | | return requestClient.delete(`/hrm/leave/delete?id=${id}`); |
| | | } |
| | | |
| | | /** æäº¤è¯·åç³è¯·ï¼å起审æ¹ï¼ */ |
| | | /** |
| | | * æäº¤è¯·åç³è¯·å®¡æ¹ï¼è稿 / å®¡æ ¸ä¸éè¿ â 审æ¹ä¸ï¼ |
| | | * |
| | | * 审æ¹äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãæä¸å¡ç±»åï¼hrm_leave_approveï¼ç»ä¸é
ç½®ï¼æäº¤æ¶æ éæå®ã |
| | | */ |
| | | export function submitLeave(id: number) { |
| | | return requestClient.post(`/hrm/leave/submit?id=${id}`); |
| | | return requestClient.put('/hrm/leave/submit', null, { params: { id } }); |
| | | } |
| | | |
| | | /** æ¤é请åç³è¯· */ |
| | |
| | | return requestClient.post(`/hrm/leave/cancel?id=${id}`); |
| | | } |
| | | |
| | | /** è·åå¯ç¨æµç¨å®ä¹å表 */ |
| | | export function getLeaveApproveProcessDefinitionList() { |
| | | return requestClient.get<any[]>('/hrm/leave/approve-process-definition-list'); |
| | | /** è·å¾è¯·åç³è¯·ç审æ¹äººç¼å·éåï¼ä¾åè¡¨é¡µå¤ææ¯å¦å±ç¤ºå®¡æ ¸æé® */ |
| | | export function getLeaveApproverIds() { |
| | | return requestClient.get<number[]>('/hrm/leave/approver-ids'); |
| | | } |
| | | |
| | | /** |
| | | * å®¡æ ¸è¯·åç³è¯·ï¼å®¡æ¹ä¸ â å®¡æ ¸éè¿ / å®¡æ ¸ä¸éè¿ï¼ |
| | | * |
| | | * ä»
审æ¹é
ç½®ä¸ç审æ¹äººå¯è°ç¨ï¼å¤äººæ¶æç¾ï¼ï¼pass=false æ¶ reviewRemarkï¼ä¸éè¿åå ï¼å¿
å¡«ã |
| | | */ |
| | | export function auditLeave(id: number, pass: boolean, reviewRemark?: string) { |
| | | return requestClient.put('/hrm/leave/audit', { id, pass, reviewRemark }); |
| | | } |
| | |
| | | statusName?: string; |
| | | auditStatus?: number; // 审æ¹ç¶æï¼0æªæäº¤ 10审æ¹ä¸ 20éè¿ 30驳å 40已忶 |
| | | auditStatusName?: string; |
| | | processInstanceId?: string; |
| | | auditUserId?: number; |
| | | auditTime?: string; |
| | | auditRemark?: string; |
| | | // 以ä¸ä¸ºå®¡æ ¸æ´¾çåæ®µï¼ç±å端å¨å®¡æ ¸æ¶åå
¥ï¼å端åªè¯»å±ç¤º |
| | | reviewerId?: number; // å®¡æ ¸äººIDï¼å®é
æ§è¡å®¡æ ¸çç¨æ·ï¼ |
| | | reviewerName?: string; // å®¡æ ¸äººå§å |
| | | reviewTime?: string; // å®¡æ ¸æ¶é´ |
| | | reviewRemark?: string; // å®¡æ ¸æè§ï¼å®¡æ ¸éè¿æ¶çæè§ / å®¡æ ¸ä¸éè¿æ¶çåå ï¼ |
| | | remark?: string; |
| | | itemCount?: number; // èæ ¸ææ æ° |
| | | resultCount?: number; // å·²è¯åäººæ° |
| | |
| | | return requestClient.post<boolean>('/hrm/performance-appraise/item-save', data); |
| | | } |
| | | |
| | | /** æäº¤ç»©æèæ ¸æ¹æ¡å®¡æ¹ */ |
| | | export function submitAppraise(id: number, processDefinitionKey: string) { |
| | | return requestClient.post<boolean>('/hrm/performance-appraise/submit', null, { |
| | | params: { id, processDefinitionKey }, |
| | | /** |
| | | * æäº¤ç»©æèæ ¸æ¹æ¡å®¡æ¹ï¼è稿 / å®¡æ ¸ä¸éè¿ â 审æ¹ä¸ï¼ |
| | | * |
| | | * 审æ¹äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãæä¸å¡ç±»åï¼performance_appraise_approveï¼ç»ä¸é
ç½®ï¼æäº¤æ¶æ éæå®ã |
| | | */ |
| | | export function submitAppraise(id: number) { |
| | | return requestClient.put<boolean>('/hrm/performance-appraise/submit', null, { |
| | | params: { id }, |
| | | }); |
| | | } |
| | | |
| | | /** 审æ¹ç»©æèæ ¸æ¹æ¡ */ |
| | | export function auditAppraise(data: { id: number; auditStatus: number; remark?: string }) { |
| | | return requestClient.put<boolean>('/hrm/performance-appraise/audit', data); |
| | | /** è·å¾ç»©æèæ ¸æ¹æ¡ç审æ¹äººç¼å·éåï¼ä¾åè¡¨é¡µå¤ææ¯å¦å±ç¤ºå®¡æ ¸æé® */ |
| | | export function getAppraiseApproverIds() { |
| | | return requestClient.get<number[]>('/hrm/performance-appraise/approver-ids'); |
| | | } |
| | | |
| | | /** è·å绩æèæ ¸æ¹æ¡å®¡æ¹æµç¨å®ä¹å表 */ |
| | | export function getAppraiseProcessList() { |
| | | return requestClient.get<{ id: string; name: string; version: number; key: string }[]>( |
| | | '/hrm/performance-appraise/approve-process-list', |
| | | ); |
| | | /** |
| | | * å®¡æ ¸ç»©æèæ ¸æ¹æ¡ï¼å®¡æ¹ä¸ â å®¡æ ¸éè¿ / å®¡æ ¸ä¸éè¿ï¼ |
| | | * |
| | | * ä»
审æ¹é
ç½®ä¸ç审æ¹äººå¯è°ç¨ï¼å¤äººæ¶æç¾ï¼ï¼pass=false æ¶ reviewRemarkï¼ä¸éè¿åå ï¼å¿
å¡«ã |
| | | */ |
| | | export function auditAppraise( |
| | | id: number, |
| | | pass: boolean, |
| | | reviewRemark?: string, |
| | | ) { |
| | | return requestClient.put<boolean>('/hrm/performance-appraise/audit', { |
| | | id, |
| | | pass, |
| | | reviewRemark, |
| | | }); |
| | | } |
| | | |
| | | /** è·åèæ ¸ç»æå页 */ |
| | |
| | | blobIds?: number[]; |
| | | attachmentList?: SystemStorageApi.StorageBlob[]; |
| | | status?: number; |
| | | processInstanceId?: string; |
| | | // 以ä¸ä¸ºå®¡æ ¸æ´¾çåæ®µï¼ç±å端å¨å®¡æ ¸æ¶åå
¥ï¼å端åªè¯»å±ç¤º |
| | | reviewerId?: number; // å®¡æ ¸äººIDï¼å®é
æ§è¡å®¡æ ¸çç¨æ·ï¼ |
| | | reviewerName?: string; // å®¡æ ¸äººå§å |
| | | reviewTime?: string; // å®¡æ ¸æ¶é´ |
| | | reviewRemark?: string; // å®¡æ ¸æè§ï¼å®¡æ ¸éè¿æ¶çæè§ / å®¡æ ¸ä¸éè¿æ¶çåå ï¼ |
| | | remark?: string; |
| | | createTime?: string; |
| | | } |
| | |
| | | return requestClient.delete(`/hrm/resignation/delete?id=${id}`); |
| | | } |
| | | |
| | | /** æäº¤ç¦»èç³è¯·ï¼å起审æ¹ï¼ */ |
| | | /** |
| | | * æäº¤ç¦»èç³è¯·å®¡æ¹ï¼è稿 / å®¡æ ¸ä¸éè¿ â 审æ¹ä¸ï¼ |
| | | * |
| | | * 审æ¹äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãæä¸å¡ç±»åï¼hrm_resignation_approveï¼ç»ä¸é
ç½®ï¼æäº¤æ¶æ éæå®ã |
| | | */ |
| | | export function submitResignation(id: number) { |
| | | return requestClient.post(`/hrm/resignation/submit?id=${id}`); |
| | | return requestClient.put('/hrm/resignation/submit', null, { params: { id } }); |
| | | } |
| | | |
| | | /** æ¤é离èç³è¯· */ |
| | |
| | | return requestClient.put('/hrm/resignation/handover', { id, handoverStatus }); |
| | | } |
| | | |
| | | /** è·åå¯ç¨æµç¨å®ä¹å表 */ |
| | | export function getResignationApproveProcessDefinitionList() { |
| | | return requestClient.get<any[]>('/hrm/resignation/approve-process-definition-list'); |
| | | /** è·å¾ç¦»èç³è¯·ç审æ¹äººç¼å·éåï¼ä¾åè¡¨é¡µå¤ææ¯å¦å±ç¤ºå®¡æ ¸æé® */ |
| | | export function getResignationApproverIds() { |
| | | return requestClient.get<number[]>('/hrm/resignation/approver-ids'); |
| | | } |
| | | |
| | | /** |
| | | * å®¡æ ¸ç¦»èç³è¯·ï¼å®¡æ¹ä¸ â å®¡æ ¸éè¿ / å®¡æ ¸ä¸éè¿ï¼ |
| | | * |
| | | * ä»
审æ¹é
ç½®ä¸ç审æ¹äººå¯è°ç¨ï¼å¤äººæ¶æç¾ï¼ï¼pass=false æ¶ reviewRemarkï¼ä¸éè¿åå ï¼å¿
å¡«ã |
| | | */ |
| | | export function auditResignation( |
| | | id: number, |
| | | pass: boolean, |
| | | reviewRemark?: string, |
| | | ) { |
| | | return requestClient.put('/hrm/resignation/audit', { |
| | | id, |
| | | pass, |
| | | reviewRemark, |
| | | }); |
| | | } |
| | |
| | | blobIds?: number[]; |
| | | attachmentList?: SystemStorageApi.StorageBlob[]; |
| | | status?: number; |
| | | processInstanceId?: string; |
| | | // 以ä¸ä¸ºå®¡æ ¸æ´¾çåæ®µï¼ç±å端å¨å®¡æ ¸æ¶åå
¥ï¼å端åªè¯»å±ç¤º |
| | | reviewerId?: number; // å®¡æ ¸äººIDï¼å®é
æ§è¡å®¡æ ¸çç¨æ·ï¼ |
| | | reviewerName?: string; // å®¡æ ¸äººå§å |
| | | reviewTime?: string; // å®¡æ ¸æ¶é´ |
| | | reviewRemark?: string; // å®¡æ ¸æè§ï¼å®¡æ ¸éè¿æ¶çæè§ / å®¡æ ¸ä¸éè¿æ¶çåå ï¼ |
| | | remark?: string; |
| | | createTime?: string; |
| | | } |
| | |
| | | return requestClient.delete(`/hrm/transfer/delete?id=${id}`); |
| | | } |
| | | |
| | | /** æäº¤è°å²ç³è¯·ï¼å起审æ¹ï¼ */ |
| | | /** |
| | | * æäº¤è°å²ç³è¯·å®¡æ¹ï¼è稿 / å®¡æ ¸ä¸éè¿ â 审æ¹ä¸ï¼ |
| | | * |
| | | * 审æ¹äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãæä¸å¡ç±»åï¼hrm_transfer_approveï¼ç»ä¸é
ç½®ï¼æäº¤æ¶æ éæå®ã |
| | | */ |
| | | export function submitTransfer(id: number) { |
| | | return requestClient.post(`/hrm/transfer/submit?id=${id}`); |
| | | return requestClient.put('/hrm/transfer/submit', null, { params: { id } }); |
| | | } |
| | | |
| | | /** æ¤éè°å²ç³è¯· */ |
| | |
| | | return requestClient.post(`/hrm/transfer/cancel?id=${id}`); |
| | | } |
| | | |
| | | /** è·åå¯ç¨æµç¨å®ä¹å表 */ |
| | | export function getTransferApproveProcessDefinitionList() { |
| | | return requestClient.get<any[]>('/hrm/transfer/approve-process-definition-list'); |
| | | /** è·å¾è°å²ç³è¯·ç审æ¹äººç¼å·éåï¼ä¾åè¡¨é¡µå¤ææ¯å¦å±ç¤ºå®¡æ ¸æé® */ |
| | | export function getTransferApproverIds() { |
| | | return requestClient.get<number[]>('/hrm/transfer/approver-ids'); |
| | | } |
| | | |
| | | /** |
| | | * å®¡æ ¸è°å²ç³è¯·ï¼å®¡æ¹ä¸ â å®¡æ ¸éè¿ / å®¡æ ¸ä¸éè¿ï¼ |
| | | * |
| | | * ä»
审æ¹é
ç½®ä¸ç审æ¹äººå¯è°ç¨ï¼å¤äººæ¶æç¾ï¼ï¼pass=false æ¶ reviewRemarkï¼ä¸éè¿åå ï¼å¿
å¡«ã |
| | | */ |
| | | export function auditTransfer(id: number, pass: boolean, reviewRemark?: string) { |
| | | return requestClient.put('/hrm/transfer/audit', { id, pass, reviewRemark }); |
| | | } |
| | |
| | | remark?: string; |
| | | /** å建æ¶é´ */ |
| | | createTime?: number; |
| | | /** BPM æµç¨å®ä¾ç¼å· */ |
| | | processInstanceId?: string; |
| | | /** å®¡æ ¸äººç¨æ·ç¼å·ï¼å®¡æ ¸éè¿ååå
¥å®é
å®¡æ ¸äººï¼ */ |
| | | reviewerId?: number; |
| | | /** å®¡æ ¸äººå§å */ |
| | | reviewerName?: string; |
| | | /** å®¡æ ¸æ¶é´ */ |
| | | reviewTime?: number; |
| | | /** å®¡æ ¸æè§ï¼éè¿æ¶çæè§ / ä¸éè¿æ¶çåå ï¼ */ |
| | | reviewRemark?: string; |
| | | } |
| | | |
| | | export interface PageParams extends PageParam { |
| | |
| | | }); |
| | | } |
| | | |
| | | /** æäº¤å®¡æ¹ï¼å¾
å®¡æ ¸â审æ¹ä¸ï¼ */ |
| | | export function submitPdProjectApproval(id: number, processDefinitionKey: string) { |
| | | /** |
| | | * æäº¤å®¡æ¹ï¼å¾
å®¡æ ¸â审æ¹ä¸ï¼ |
| | | * |
| | | * å®¡æ ¸äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãæä¸å¡ç±»åç»ä¸é
ç½®ï¼æäº¤æ¶æ éæå®ï¼ |
| | | * æªå¯ç¨å®¡æ¹ææªé
ç½®ææå®¡æ ¸äººæ¶åç«¯ä¼æåºä¸å¡å¼å¸¸ã |
| | | */ |
| | | export function submitPdProjectApproval(id: number) { |
| | | return requestClient.put('/mes/pd/project/submit-approval', undefined, { |
| | | params: { id, processDefinitionKey }, |
| | | params: { id }, |
| | | }); |
| | | } |
| | | |
| | | /** è·å¾å®¡æ¹æµç¨å表 */ |
| | | export function getPdProjectApproveProcessList() { |
| | | return requestClient.get<Array<{ id: string; name: string; key: string }>>( |
| | | '/mes/pd/project/approve-process-list', |
| | | ); |
| | | /** |
| | | * è·å¾è®¾è®¡é¡¹ç®çå®¡æ ¸äººç¼å·éå |
| | | * |
| | | * ä¾åè¡¨é¡µå¤æå½åç»å½ç¨æ·æ¯å¦åºå±ç¤ºãå®¡æ ¸ / å®¡æ ¸ä¸éè¿ãæé®ï¼æªé
ç½®æ¶è¿å空æ°ç»ã |
| | | */ |
| | | export function getPdProjectApproverIds() { |
| | | return requestClient.get<number[]>('/mes/pd/project/approver-ids'); |
| | | } |
| | | |
| | | /** |
| | | * å®¡æ ¸è®¾è®¡é¡¹ç®ï¼å®¡æ¹ä¸âå¾
彿¡£/å¾
å®¡æ ¸ï¼ |
| | | * |
| | | * ä»
审æ¹é
ç½®ä¸çå®¡æ ¸äººå¯è°ç¨ï¼å¤äººæ¶æç¾ï¼ï¼pass=false æ¶ reviewRemarkï¼ä¸éè¿åå ï¼å¿
å¡«ã |
| | | */ |
| | | export function auditPdProject( |
| | | id: number, |
| | | pass: boolean, |
| | | reviewRemark?: string, |
| | | ) { |
| | | return requestClient.put('/mes/pd/project/audit', { |
| | | id, |
| | | pass, |
| | | reviewRemark, |
| | | }); |
| | | } |
| | | |
| | | /** 彿¡£ï¼å¾
彿¡£â已彿¡£ï¼ï¼å端èªå¨åå»ºå½æ¡£å°è´¦è®°å½ */ |
| | |
| | | specification?: string; // è§æ ¼åå· |
| | | techParams?: string; // ææ¯åæ° JSON |
| | | templateType?: string; // 模æ¿ç±»å |
| | | // 以ä¸ä¸ºæµç¨æ´¾çåæ®µï¼ç±å端èªå¨è®°å½ï¼å端åªè¯»å±ç¤º |
| | | drafterId?: number; // ç¼å¶äººID |
| | | drafterName?: string; // ç¼å¶äººå§å |
| | | draftTime?: Date; // ç¼å¶æ¶é´ |
| | | reviewerId?: number; // å®¡æ ¸äººID |
| | | reviewerName?: string; // å®¡æ ¸äººå§å |
| | | reviewerId?: number; // å®¡æ ¸äººIDï¼å®é
æ§è¡å®¡æ ¸çç¨æ·ï¼ç±å端å¨å®¡æ ¸æ¶åå
¥ï¼ |
| | | reviewerName?: string; // å®¡æ ¸äººå§åï¼å®¡æ ¸æ¶åä½è®°å½ï¼ |
| | | reviewTime?: Date; // å®¡æ ¸æ¶é´ |
| | | reviewRemark?: string; // å®¡æ ¸æè§ï¼å®¡æ ¸éè¿æ¶çæè§ / å®¡æ ¸ä¸éè¿æ¶çåå ï¼ |
| | | customerConfirmUser?: string; // 客æ·ç¡®è®¤äºº |
| | | customerConfirmTime?: Date; // 客æ·ç¡®è®¤æ¶é´ |
| | | status?: number; // ç¶æ |
| | | status?: number; // ç¶æï¼0=è稿ï¼1=å¾
å®¡æ ¸ï¼2=å·²å®¡æ ¸ï¼3=客æ·å·²ç¡®è®¤ï¼4=å®¡æ ¸ä¸éè¿ï¼ |
| | | remark?: string; // 夿³¨ |
| | | createTime?: Date; // å建æ¶é´ |
| | | } |
| | |
| | | ); |
| | | } |
| | | |
| | | /** æ°å¢äº§åææ¯ç¡®è®¤å½ */ |
| | | /** |
| | | * æ°å¢äº§åææ¯ç¡®è®¤å½ |
| | | * |
| | | * ç¶æç±å端åºå®ä¸ºè稿ï¼ç¼å¶äººä¸ç¼å¶æ¶é´ç±å端èªå¨è®°å½ï¼åæ éåç«¯ä¼ åã |
| | | */ |
| | | export function createTechConfirm(data: MesPdTechConfirmApi.TechConfirm) { |
| | | return requestClient.post('/mes/pd/tech-confirm/create', data); |
| | | } |
| | | |
| | | /** ä¿®æ¹äº§åææ¯ç¡®è®¤å½ */ |
| | | /** |
| | | * ä¿®æ¹äº§åææ¯ç¡®è®¤å½ |
| | | * |
| | | * ä»
èç¨¿ç¶æå¯ä¿®æ¹ï¼ä¸ç¶æä¸æµç¨æ´¾çåæ®µä¸åä¸æäº¤ã |
| | | */ |
| | | export function updateTechConfirm(data: MesPdTechConfirmApi.TechConfirm) { |
| | | return requestClient.put('/mes/pd/tech-confirm/update', data); |
| | | } |
| | | |
| | | /** å é¤äº§åææ¯ç¡®è®¤å½ */ |
| | | /** å é¤äº§åææ¯ç¡®è®¤å½ï¼ä»
è稿 / å®¡æ ¸ä¸éè¿ç¶æå¯å é¤ï¼ */ |
| | | export function deleteTechConfirm(id: number) { |
| | | return requestClient.delete(`/mes/pd/tech-confirm/delete?id=${id}`); |
| | | } |
| | | |
| | | /** |
| | | * æäº¤ææ¯ç¡®è®¤å½å®¡æ ¸ï¼è稿/å®¡æ ¸ä¸éè¿âå¾
å®¡æ ¸ï¼ |
| | | * |
| | | * å®¡æ ¸äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãæä¸å¡ç±»åç»ä¸é
ç½®ï¼æäº¤æ¶æ éæå®ï¼ |
| | | * æªå¯ç¨å®¡æ¹ææªé
ç½®ææå®¡æ ¸äººæ¶åç«¯ä¼æåºä¸å¡å¼å¸¸ã |
| | | */ |
| | | export function submitTechConfirmAudit(id: number) { |
| | | return requestClient.put('/mes/pd/tech-confirm/submit-approval', undefined, { |
| | | params: { id }, |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * è·å¾ææ¯ç¡®è®¤å½çå®¡æ ¸äººç¼å·éå |
| | | * |
| | | * ä¾åè¡¨é¡µå¤æå½åç»å½ç¨æ·æ¯å¦åºå±ç¤ºãå®¡æ ¸ / å®¡æ ¸ä¸éè¿ãæé®ï¼æªé
ç½®æ¶è¿å空æ°ç»ã |
| | | */ |
| | | export function getTechConfirmApproverIds() { |
| | | return requestClient.get<number[]>('/mes/pd/tech-confirm/approver-ids'); |
| | | } |
| | | |
| | | /** |
| | | * å®¡æ ¸ææ¯ç¡®è®¤å½ï¼å¾
å®¡æ ¸âå·²å®¡æ ¸/å®¡æ ¸ä¸éè¿ï¼ |
| | | * |
| | | * ä»
审æ¹é
ç½®ä¸çå®¡æ ¸äººå¯è°ç¨ï¼å¤äººæ¶æç¾ï¼ï¼pass=false æ¶ reviewRemarkï¼ä¸éè¿åå ï¼å¿
å¡«ã |
| | | */ |
| | | export function auditTechConfirm( |
| | | id: number, |
| | | pass: boolean, |
| | | reviewRemark?: string, |
| | | ) { |
| | | return requestClient.put('/mes/pd/tech-confirm/audit', { |
| | | id, |
| | | pass, |
| | | reviewRemark, |
| | | }); |
| | | } |
| | | |
| | | /** 客æ·ç¡®è®¤ï¼å·²å®¡æ ¸â客æ·å·²ç¡®è®¤ï¼ */ |
| | | export function confirmTechConfirmByCustomer( |
| | | id: number, |
| | | customerConfirmUser: string, |
| | | ) { |
| | | return requestClient.put('/mes/pd/tech-confirm/customer-confirm', undefined, { |
| | | params: { id, customerConfirmUser }, |
| | | }); |
| | | } |
| | | |
| | | /** 导åºäº§åææ¯ç¡®è®¤å½ */ |
| | | export function exportTechConfirm(params: any) { |
| | | return requestClient.download('/mes/pd/tech-confirm/export-excel', { params }); |
| | |
| | | receiptDate?: number; // å
¥åºæ¥æ |
| | | source?: string; // å
¥åºæ¥æº |
| | | status?: number; // åæ®ç¶æ |
| | | processInstanceId?: string; // å®¡æ¹æµç¨å®ä¾ç¼å· |
| | | reviewerId?: number; // å®¡æ ¸äººç¨æ·ç¼å· |
| | | reviewerName?: string; // å®¡æ ¸äººå§å |
| | | reviewTime?: number; // å®¡æ ¸æ¶é´ |
| | | reviewRemark?: string; // å®¡æ ¸æè§ï¼éè¿æ¶çæè§ / ä¸éè¿æ¶çåå ï¼ |
| | | remark?: string; // 夿³¨ |
| | | createTime?: Date; // å建æ¶é´ |
| | | lines?: MesWmEquipmentReceiptLineApi.EquipmentReceiptLine[]; // æç»è¡ |
| | |
| | | return requestClient.delete(`/mes/wm/equipment-receipt/delete?id=${id}`); |
| | | } |
| | | |
| | | /** æ¥è¯¢å¯ç¨ç设å¤å
¥åºåå®¡æ¹æµç¨å®ä¹ */ |
| | | export function getEquipmentReceiptApproveProcessList() { |
| | | return requestClient.get<{ id: string; name: string; key: string }[]>( |
| | | '/mes/wm/equipment-receipt/approval-process-list', |
| | | ); |
| | | /** |
| | | * æäº¤è®¾å¤å
¥åºå审æ¹ï¼è稿â审æ¹ä¸ï¼ |
| | | * |
| | | * å®¡æ ¸äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãæä¸å¡ç±»åç»ä¸é
ç½®ï¼æäº¤æ¶æ éæå®ï¼ |
| | | * æªå¯ç¨å®¡æ¹ææªé
ç½®ææå®¡æ ¸äººæ¶åç«¯ä¼æåºä¸å¡å¼å¸¸ã |
| | | */ |
| | | export function submitEquipmentReceiptApproval(id: number) { |
| | | return requestClient.put('/mes/wm/equipment-receipt/submit-approval', undefined, { |
| | | params: { id }, |
| | | }); |
| | | } |
| | | |
| | | /** æäº¤è®¾å¤å
¥åºåå®¡æ¹ */ |
| | | export function submitEquipmentReceiptApproval( |
| | | /** |
| | | * è·å¾è®¾å¤å
¥åºåçå®¡æ ¸äººç¼å·éå |
| | | * |
| | | * ä¾åè¡¨é¡µå¤æå½åç»å½ç¨æ·æ¯å¦åºå±ç¤ºãå®¡æ ¸ / å®¡æ ¸ä¸éè¿ãæé®ï¼æªé
ç½®æ¶è¿å空æ°ç»ã |
| | | */ |
| | | export function getEquipmentReceiptApproverIds() { |
| | | return requestClient.get<number[]>('/mes/wm/equipment-receipt/approver-ids'); |
| | | } |
| | | |
| | | /** |
| | | * å®¡æ ¸è®¾å¤å
¥åºåï¼å®¡æ¹ä¸â已审æ¹/èç¨¿ï¼ |
| | | * |
| | | * ä»
审æ¹é
ç½®ä¸çå®¡æ ¸äººå¯è°ç¨ï¼å¤äººæ¶æç¾ï¼ï¼pass=false æ¶ reviewRemarkï¼ä¸éè¿åå ï¼å¿
å¡«ã |
| | | */ |
| | | export function auditEquipmentReceipt( |
| | | id: number, |
| | | processDefinitionKey: string, |
| | | pass: boolean, |
| | | reviewRemark?: string, |
| | | ) { |
| | | return requestClient.put( |
| | | `/mes/wm/equipment-receipt/submit-approval?id=${id}&processDefinitionKey=${processDefinitionKey}`, |
| | | ); |
| | | return requestClient.put('/mes/wm/equipment-receipt/audit', { |
| | | id, |
| | | pass, |
| | | reviewRemark, |
| | | }); |
| | | } |
| | | |
| | | /** æ§è¡è®¾å¤å
¥åº */ |
| | |
| | | areaName?: string; // åºä½åç§° |
| | | receiptDate?: number; // å
¥åºæ¥æ |
| | | status?: number; // ç¶æ |
| | | reviewerId?: number; // å®¡æ ¸äººç¨æ·ç¼å· |
| | | reviewerName?: string; // å®¡æ ¸äººå§å |
| | | reviewTime?: number; // å®¡æ ¸æ¶é´ |
| | | reviewRemark?: string; // å®¡æ ¸æè§ï¼éè¿æ¶çæè§ / ä¸éè¿æ¶çåå ï¼ |
| | | remark?: string; // 夿³¨ |
| | | createTime?: Date; // å建æ¶é´ |
| | | } |
| | |
| | | ); |
| | | } |
| | | |
| | | /** æäº¤éè´å
¥åºåå®¡æ¹ */ |
| | | export function submitItemReceiptApproval( |
| | | /** |
| | | * è·å¾éè´å
¥åºåçå®¡æ ¸äººç¼å·éå |
| | | * |
| | | * ä¾åè¡¨é¡µå¤æå½åç»å½ç¨æ·æ¯å¦åºå±ç¤ºãå®¡æ ¸ / å®¡æ ¸ä¸éè¿ãæé®ï¼æªé
ç½®æ¶è¿å空æ°ç»ã |
| | | */ |
| | | export function getItemReceiptApproverIds() { |
| | | return requestClient.get<number[]>('/mes/wm/item-receipt/approver-ids'); |
| | | } |
| | | |
| | | /** |
| | | * å®¡æ ¸éè´å
¥åºåï¼å®¡æ¹ä¸â已审æ¹/èç¨¿ï¼ |
| | | * |
| | | * ä»
审æ¹é
ç½®ä¸çå®¡æ ¸äººå¯è°ç¨ï¼å¤äººæ¶æç¾ï¼ï¼pass=false æ¶ reviewRemarkï¼ä¸éè¿åå ï¼å¿
å¡«ã |
| | | */ |
| | | export function auditItemReceipt( |
| | | id: number, |
| | | processDefinitionKey: string, |
| | | pass: boolean, |
| | | reviewRemark?: string, |
| | | ) { |
| | | return requestClient.put( |
| | | `/mes/wm/item-receipt/submit-approval?id=${id}&processDefinitionKey=${processDefinitionKey}`, |
| | | ); |
| | | return requestClient.put('/mes/wm/item-receipt/audit', { |
| | | id, |
| | | pass, |
| | | reviewRemark, |
| | | }); |
| | | } |
| | |
| | | sourceDocCode?: string; // æ¥æºåæ®ç¼ç |
| | | issueDate?: number; // åºåºæ¥æ |
| | | status?: number; // åæ®ç¶æ |
| | | processInstanceId?: string; // å®¡æ¹æµç¨å®ä¾ç¼å· |
| | | reviewerId?: number; // å®¡æ ¸äººç¨æ·ç¼å· |
| | | reviewerName?: string; // å®¡æ ¸äººå§å |
| | | reviewTime?: number; // å®¡æ ¸æ¶é´ |
| | | reviewRemark?: string; // å®¡æ ¸æè§ï¼éè¿æ¶çæè§ / ä¸éè¿æ¶çåå ï¼ |
| | | remark?: string; // 夿³¨ |
| | | createTime?: Date; // å建æ¶é´ |
| | | } |
| | |
| | | return requestClient.delete(`/mes/wm/misc-issue/delete?id=${id}`); |
| | | } |
| | | |
| | | /** æ¥è¯¢å¯ç¨çæé¡¹åºåºåå®¡æ¹æµç¨å®ä¹ */ |
| | | export function getMiscIssueApproveProcessList() { |
| | | return requestClient.get<{ id: string; name: string; key: string }[]>( |
| | | '/mes/wm/misc-issue/approval-process-list', |
| | | ); |
| | | /** |
| | | * æäº¤æé¡¹åºåºå审æ¹ï¼è稿 â 审æ¹ä¸ï¼ |
| | | * |
| | | * å®¡æ ¸äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãæä¸å¡ç±»åç»ä¸é
ç½®ï¼æäº¤æ¶æ éæå®ï¼ |
| | | * æªå¯ç¨å®¡æ¹ææªé
ç½®ææå®¡æ ¸äººæ¶åç«¯ä¼æåºä¸å¡å¼å¸¸ã |
| | | */ |
| | | export function submitMiscIssueApproval(id: number) { |
| | | return requestClient.put('/mes/wm/misc-issue/submit', null, { |
| | | params: { id }, |
| | | }); |
| | | } |
| | | |
| | | /** æäº¤æé¡¹åºåºåå®¡æ¹ */ |
| | | export function submitMiscIssueApproval( |
| | | /** |
| | | * è·å¾æé¡¹åºåºåçå®¡æ ¸äººç¼å·éå |
| | | * |
| | | * ä¾åè¡¨é¡µå¤æå½åç»å½ç¨æ·æ¯å¦åºå±ç¤ºãå®¡æ ¸ / å®¡æ ¸ä¸éè¿ãæé®ï¼æªé
ç½®æ¶è¿å空æ°ç»ã |
| | | */ |
| | | export function getMiscIssueApproverIds() { |
| | | return requestClient.get<number[]>('/mes/wm/misc-issue/approver-ids'); |
| | | } |
| | | |
| | | /** |
| | | * å®¡æ ¸æé¡¹åºåºåï¼å®¡æ¹ä¸ â å¾
æ§è¡åºåº / èç¨¿ï¼ |
| | | * |
| | | * ä»
审æ¹é
ç½®ä¸çå®¡æ ¸äººå¯è°ç¨ï¼å¤äººæ¶æç¾ï¼ï¼pass=false æ¶ reviewRemarkï¼ä¸éè¿åå ï¼å¿
å¡«ã |
| | | */ |
| | | export function auditMiscIssue( |
| | | id: number, |
| | | processDefinitionKey: string, |
| | | pass: boolean, |
| | | reviewRemark?: string, |
| | | ) { |
| | | return requestClient.put( |
| | | `/mes/wm/misc-issue/submit?id=${id}&processDefinitionKey=${processDefinitionKey}`, |
| | | ); |
| | | return requestClient.put('/mes/wm/misc-issue/audit', { |
| | | id, |
| | | pass, |
| | | reviewRemark, |
| | | }); |
| | | } |
| | | |
| | | /** æ§è¡åºåº */ |
| | |
| | | sourceDocCode?: string; // æ¥æºåæ®ç¼ç |
| | | receiptDate?: number; // å
¥åºæ¥æ |
| | | status?: number; // åæ®ç¶æ |
| | | processInstanceId?: string; // å®¡æ¹æµç¨å®ä¾ç¼å· |
| | | reviewerId?: number; // å®¡æ ¸äººç¨æ·ç¼å· |
| | | reviewerName?: string; // å®¡æ ¸äººå§å |
| | | reviewTime?: number; // å®¡æ ¸æ¶é´ |
| | | reviewRemark?: string; // å®¡æ ¸æè§ï¼éè¿æ¶çæè§ / ä¸éè¿æ¶çåå ï¼ |
| | | remark?: string; // 夿³¨ |
| | | createTime?: Date; // å建æ¶é´ |
| | | } |
| | |
| | | return requestClient.delete(`/mes/wm/misc-receipt/delete?id=${id}`); |
| | | } |
| | | |
| | | /** æ¥è¯¢å¯ç¨çæé¡¹å
¥åºåå®¡æ¹æµç¨å®ä¹ */ |
| | | export function getMiscReceiptApproveProcessList() { |
| | | return requestClient.get<{ id: string; name: string; key: string }[]>( |
| | | '/mes/wm/misc-receipt/approval-process-list', |
| | | ); |
| | | /** |
| | | * æäº¤æé¡¹å
¥åºå审æ¹ï¼è稿 â 审æ¹ä¸ï¼ |
| | | * |
| | | * å®¡æ ¸äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãæä¸å¡ç±»åç»ä¸é
ç½®ï¼æäº¤æ¶æ éæå®ï¼ |
| | | * æªå¯ç¨å®¡æ¹ææªé
ç½®ææå®¡æ ¸äººæ¶åç«¯ä¼æåºä¸å¡å¼å¸¸ã |
| | | */ |
| | | export function submitMiscReceiptApproval(id: number) { |
| | | return requestClient.put('/mes/wm/misc-receipt/submit', null, { |
| | | params: { id }, |
| | | }); |
| | | } |
| | | |
| | | /** æäº¤æé¡¹å
¥åºåå®¡æ¹ */ |
| | | export function submitMiscReceiptApproval( |
| | | /** |
| | | * è·å¾æé¡¹å
¥åºåçå®¡æ ¸äººç¼å·éå |
| | | * |
| | | * ä¾åè¡¨é¡µå¤æå½åç»å½ç¨æ·æ¯å¦åºå±ç¤ºãå®¡æ ¸ / å®¡æ ¸ä¸éè¿ãæé®ï¼æªé
ç½®æ¶è¿å空æ°ç»ã |
| | | */ |
| | | export function getMiscReceiptApproverIds() { |
| | | return requestClient.get<number[]>('/mes/wm/misc-receipt/approver-ids'); |
| | | } |
| | | |
| | | /** |
| | | * å®¡æ ¸æé¡¹å
¥åºåï¼å®¡æ¹ä¸ â å·²å®¡æ¹ / èç¨¿ï¼ |
| | | * |
| | | * ä»
审æ¹é
ç½®ä¸çå®¡æ ¸äººå¯è°ç¨ï¼å¤äººæ¶æç¾ï¼ï¼pass=false æ¶ reviewRemarkï¼ä¸éè¿åå ï¼å¿
å¡«ã |
| | | */ |
| | | export function auditMiscReceipt( |
| | | id: number, |
| | | processDefinitionKey: string, |
| | | pass: boolean, |
| | | reviewRemark?: string, |
| | | ) { |
| | | return requestClient.put( |
| | | `/mes/wm/misc-receipt/submit?id=${id}&processDefinitionKey=${processDefinitionKey}`, |
| | | ); |
| | | return requestClient.put('/mes/wm/misc-receipt/audit', { |
| | | id, |
| | | pass, |
| | | reviewRemark, |
| | | }); |
| | | } |
| | | |
| | | /** æ§è¡å
¥åº */ |
| | |
| | | transportCode?: string; // è¿åå· |
| | | transportTelephone?: string; // èç³»çµè¯ |
| | | status?: number; // åæ®ç¶æ |
| | | processInstanceId?: string; // å®¡æ¹æµç¨å®ä¾ç¼å· |
| | | reviewerId?: number; // å®¡æ ¸äººç¨æ·ç¼å· |
| | | reviewerName?: string; // å®¡æ ¸äººå§å |
| | | reviewTime?: number; // å®¡æ ¸æ¶é´ |
| | | reviewRemark?: string; // å®¡æ ¸æè§ï¼éè¿æ¶çæè§ / ä¸éè¿æ¶çåå ï¼ |
| | | remark?: string; // 夿³¨ |
| | | createTime?: Date; // å建æ¶é´ |
| | | } |
| | |
| | | return requestClient.delete(`/mes/wm/return-vendor/delete?id=${id}`); |
| | | } |
| | | |
| | | /** æ¥è¯¢å¯ç¨çä¾åºåéè´§åå®¡æ¹æµç¨å®ä¹ */ |
| | | export function getReturnVendorApproveProcessList() { |
| | | return requestClient.get<{ id: string; name: string; key: string }[]>( |
| | | '/mes/wm/return-vendor/approval-process-list', |
| | | ); |
| | | /** |
| | | * æäº¤ä¾åºåéè´§å审æ¹ï¼è稿 â å¾
æ£è´§ï¼ |
| | | * |
| | | * å®¡æ ¸äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãæä¸å¡ç±»åç»ä¸é
ç½®ï¼æäº¤æ¶æ éæå®ï¼ |
| | | * æªå¯ç¨å®¡æ¹ææªé
ç½®ææå®¡æ ¸äººæ¶åç«¯ä¼æåºä¸å¡å¼å¸¸ã |
| | | */ |
| | | export function submitReturnVendorApproval(id: number) { |
| | | return requestClient.put('/mes/wm/return-vendor/submit', null, { |
| | | params: { id }, |
| | | }); |
| | | } |
| | | |
| | | /** æäº¤ä¾åºåéè´§åå®¡æ¹ */ |
| | | export function submitReturnVendorApproval( |
| | | /** |
| | | * è·å¾ä¾åºåéè´§åçå®¡æ ¸äººç¼å·éå |
| | | * |
| | | * ä¾åè¡¨é¡µå¤æå½åç»å½ç¨æ·æ¯å¦åºå±ç¤ºãå®¡æ ¸ / å®¡æ ¸ä¸éè¿ãæé®ï¼æªé
ç½®æ¶è¿å空æ°ç»ã |
| | | */ |
| | | export function getReturnVendorApproverIds() { |
| | | return requestClient.get<number[]>('/mes/wm/return-vendor/approver-ids'); |
| | | } |
| | | |
| | | /** |
| | | * å®¡æ ¸ä¾åºåéè´§åï¼å¾
æ£è´§ â å¾
æ§è¡éè´§ / èç¨¿ï¼ |
| | | * |
| | | * ä»
审æ¹é
ç½®ä¸çå®¡æ ¸äººå¯è°ç¨ï¼å¤äººæ¶æç¾ï¼ï¼pass=false æ¶ reviewRemarkï¼ä¸éè¿åå ï¼å¿
å¡«ã |
| | | */ |
| | | export function auditReturnVendor( |
| | | id: number, |
| | | processDefinitionKey: string, |
| | | pass: boolean, |
| | | reviewRemark?: string, |
| | | ) { |
| | | return requestClient.put( |
| | | `/mes/wm/return-vendor/submit?id=${id}&processDefinitionKey=${processDefinitionKey}`, |
| | | ); |
| | | return requestClient.put('/mes/wm/return-vendor/audit', { |
| | | id, |
| | | pass, |
| | | reviewRemark, |
| | | }); |
| | | } |
| | | |
| | | /** æ§è¡æ£è´§ */ |
| | |
| | | startTime?: number; // å¼å§æ¶é´ |
| | | endTime?: number; // ç»ææ¶é´ |
| | | status?: number; // åæ®ç¶æ |
| | | processInstanceId?: string; // å®¡æ¹æµç¨å®ä¾ç¼å· |
| | | reviewerId?: number; // å®¡æ ¸äººç¨æ·ç¼å· |
| | | reviewerName?: string; // å®¡æ ¸äººå§å |
| | | reviewTime?: number; // ç»æå®¡æ¹æäº¤æ¶é´ / å®¡æ ¸æ¶é´ |
| | | reviewRemark?: string; // å®¡æ ¸æè§ï¼éè¿æ¶çæè§ / ä¸éè¿æ¶çåå ï¼ |
| | | remark?: string; // 夿³¨ |
| | | createTime?: string; // å建æ¶é´ |
| | | } |
| | |
| | | }); |
| | | } |
| | | |
| | | /** æ¥è¯¢å¯ç¨ççç¹ç»æå®¡æ¹æµç¨å®ä¹ */ |
| | | export function getStockTakingApproveProcessList() { |
| | | return requestClient.get<{ id: string; name: string; key: string }[]>( |
| | | '/mes/wm/stocktaking-task/approval-process-list', |
| | | ); |
| | | /** |
| | | * æäº¤çç¹ç»æå®¡æ¹ï¼çç¹ä¸ â çç¹ä¸Â·ç»æå®¡æ¹ä¸ï¼ |
| | | * |
| | | * å®¡æ ¸äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãæä¸å¡ç±»åç»ä¸é
ç½®ï¼æäº¤æ¶æ éæå®ï¼ |
| | | * æªå¯ç¨å®¡æ¹ææªé
ç½®ææå®¡æ ¸äººæ¶åç«¯ä¼æåºä¸å¡å¼å¸¸ã |
| | | */ |
| | | export function submitStockTakingApproval(id: number) { |
| | | return requestClient.put('/mes/wm/stocktaking-task/submit-approval', null, { |
| | | params: { id }, |
| | | }); |
| | | } |
| | | |
| | | /** æäº¤çç¹ç»æå®¡æ¹ */ |
| | | export function submitStockTakingApproval( |
| | | /** |
| | | * è·å¾çç¹ç»æå®¡æ¹çå®¡æ ¸äººç¼å·éå |
| | | * |
| | | * ä¾åè¡¨é¡µå¤æå½åç»å½ç¨æ·æ¯å¦åºå±ç¤ºãå®¡æ ¸ / å®¡æ ¸ä¸éè¿ãæé®ï¼æªé
ç½®æ¶è¿å空æ°ç»ã |
| | | */ |
| | | export function getStockTakingApproverIds() { |
| | | return requestClient.get<number[]>('/mes/wm/stocktaking-task/approver-ids'); |
| | | } |
| | | |
| | | /** |
| | | * å®¡æ ¸çç¹ç»æï¼ç»æå®¡æ¹ä¸ â 已宿 / çç¹ä¸ï¼ |
| | | * |
| | | * ä»
审æ¹é
ç½®ä¸çå®¡æ ¸äººå¯è°ç¨ï¼å¤äººæ¶æç¾ï¼ï¼pass=false æ¶ reviewRemarkï¼ä¸éè¿åå ï¼å¿
å¡«ã |
| | | */ |
| | | export function auditStockTakingResult( |
| | | id: number, |
| | | processDefinitionKey: string, |
| | | pass: boolean, |
| | | reviewRemark?: string, |
| | | ) { |
| | | return requestClient.put( |
| | | `/mes/wm/stocktaking-task/submit-approval?id=${id}&processDefinitionKey=${processDefinitionKey}`, |
| | | ); |
| | | return requestClient.put('/mes/wm/stocktaking-task/audit', { |
| | | id, |
| | | pass, |
| | | reviewRemark, |
| | | }); |
| | | } |
| | | |
| | | /** 导åºçç¹ä»»å¡ */ |
| | |
| | | FINISHED: MesOrderStatusConstants.FINISHED, |
| | | CANCELED: MesOrderStatusConstants.CANCELLED, |
| | | } as const; |
| | | |
| | | /** |
| | | * MES äº§åææ¯ç¡®è®¤å½ç¶ææä¸¾ |
| | | * |
| | | * ç¶æç±ä¸å¡æµç¨é©±å¨ï¼åç«¯ä¸æä¾æå·¥éæ©ï¼ |
| | | * è稿 --æäº¤å®¡æ ¸(æå®å®¡æ ¸äºº)--> å¾
å®¡æ ¸ --å®¡æ ¸éè¿--> å·²å®¡æ ¸ --客æ·ç¡®è®¤--> 客æ·å·²ç¡®è®¤ |
| | | * å¾
å®¡æ ¸ --å®¡æ ¸ä¸éè¿--> å®¡æ ¸ä¸éè¿ï¼å¯ä¿®æ¹åéæ°æäº¤ã |
| | | */ |
| | | export const MesPdTechConfirmStatusEnum = { |
| | | DRAFT: 0, // è稿ï¼å¯ä¿®æ¹ãå é¤ãæäº¤å®¡æ ¸ |
| | | PENDING_AUDIT: 1, // å¾
å®¡æ ¸ï¼åæ®éå®ï¼ä»
æå®å®¡æ ¸äººå¯æä½ |
| | | AUDITED: 2, // å·²å®¡æ ¸ï¼å¯å®¢æ·ç¡®è®¤ |
| | | CUSTOMER_CONFIRMED: 3, // 客æ·å·²ç¡®è®¤ï¼ç»æ |
| | | REJECTED: 4, // å®¡æ ¸ä¸éè¿ï¼å¯ä¿®æ¹åéæ°æäº¤ |
| | | } as const; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { VbenFormSchema } from '#/adapter/form'; |
| | | import type { CrmCancellationApi } from '#/api/crm/cancellation'; |
| | | |
| | | import { computed, ref } from 'vue'; |
| | | |
| | | import { useVbenModal } from '@vben/common-ui'; |
| | | |
| | | import { message } from 'ant-design-vue'; |
| | | |
| | | import { useVbenForm } from '#/adapter/form'; |
| | | import { auditCancellation } from '#/api/crm/cancellation'; |
| | | |
| | | const emit = defineEmits(['success']); |
| | | |
| | | const pass = ref(true); // true=å®¡æ ¸éè¿ / false=å®¡æ ¸ä¸éè¿ |
| | | const rowData = ref<CrmCancellationApi.Cancellation>(); |
| | | const getTitle = computed(() => (pass.value ? 'å®¡æ ¸éè¿' : 'å®¡æ ¸ä¸éè¿')); |
| | | |
| | | const [Form, formApi] = useVbenForm({ |
| | | commonConfig: { |
| | | componentProps: { |
| | | class: 'w-full', |
| | | }, |
| | | formItemClass: 'col-span-1', |
| | | labelWidth: 90, |
| | | }, |
| | | wrapperClass: 'grid-cols-1', |
| | | layout: 'horizontal', |
| | | schema: [], |
| | | showDefaultActions: false, |
| | | }); |
| | | |
| | | /** å®¡æ ¸è¡¨ååæ®µï¼ä¸éè¿æ¶å¿
须填ååå */ |
| | | function useAuditSchema(): VbenFormSchema[] { |
| | | return [ |
| | | { |
| | | fieldName: 'reviewRemark', |
| | | label: 'å®¡æ ¸æè§', |
| | | component: 'Textarea', |
| | | formItemClass: 'col-span-1', |
| | | componentProps: { |
| | | rows: 3, |
| | | placeholder: pass.value |
| | | ? '请è¾å
¥å®¡æ ¸æè§ï¼å¯éï¼' |
| | | : '请è¾å
¥ä¸éè¿åå ï¼å¿
å¡«ï¼', |
| | | }, |
| | | rules: pass.value ? '' : 'required', |
| | | }, |
| | | ]; |
| | | } |
| | | |
| | | const [Modal, modalApi] = useVbenModal({ |
| | | async onConfirm() { |
| | | const { valid } = await formApi.validate(); |
| | | if (!valid) { |
| | | return; |
| | | } |
| | | modalApi.lock(); |
| | | const values = await formApi.getValues(); |
| | | try { |
| | | await auditCancellation( |
| | | rowData.value!.id!, |
| | | pass.value, |
| | | values.reviewRemark, |
| | | ); |
| | | await modalApi.close(); |
| | | emit('success'); |
| | | message.success(pass.value ? 'å®¡æ ¸éè¿' : 'å·²éåï¼å¯ä¿®æ¹åéæ°æäº¤'); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | | }, |
| | | async onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { |
| | | rowData.value = undefined; |
| | | return; |
| | | } |
| | | const data = modalApi.getData<{ |
| | | pass: boolean; |
| | | row: CrmCancellationApi.Cancellation; |
| | | }>(); |
| | | rowData.value = data.row; |
| | | pass.value = data.pass; |
| | | formApi.setState({ schema: useAuditSchema() }); |
| | | formApi.resetForm(); |
| | | }, |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Modal :title="getTitle" class="w-2/5"> |
| | | <div v-if="rowData" class="mx-4 mb-4 text-sm text-gray-600"> |
| | | <div>éæ·ç¼å·ï¼{{ rowData.cancellationNo }}</div> |
| | | <div>客æ·åç§°ï¼{{ rowData.customerName }}</div> |
| | | </div> |
| | | <Form class="mx-4" /> |
| | | </Modal> |
| | | </template> |
| | |
| | | import { useRouter } from 'vue-router'; |
| | | |
| | | import { Page, useVbenModal } from '@vben/common-ui'; |
| | | import { useUserStore } from '@vben/stores'; |
| | | import { downloadFileFromBlobPart } from '@vben/utils'; |
| | | |
| | | import { Button, message, Modal, Select, Tabs, Tag, Tooltip } from 'ant-design-vue'; |
| | | import { Button, message, Tabs, Tag, Tooltip } from 'ant-design-vue'; |
| | | |
| | | import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; |
| | | import { |
| | | deleteContract, |
| | | exportContract, |
| | | generateSaleOrder, |
| | | getContractApproveProcessList, |
| | | getContractApproverIds, |
| | | getContractPage, |
| | | submitContract, |
| | | } from '#/api/crm/contract'; |
| | | import { $t } from '#/locales'; |
| | | |
| | | import { useGridColumns, useGridFormSchema } from './data'; |
| | | import AuditModal from './modules/audit-modal.vue'; |
| | | import Form from './modules/form.vue'; |
| | | |
| | | const { push } = useRouter(); |
| | | const sceneType = ref('1'); |
| | | const userStore = useUserStore(); |
| | | const currentUserId = userStore.userInfo?.id; // å½åç»å½ç¨æ· IDï¼ç¨äºå®¡æ¹äººæé夿 |
| | | |
| | | /** 审æ¹é
ç½®ä¸è¯¥ä¸å¡ç审æ¹äººç¼å·éåï¼å³å®ãå®¡æ ¸ / å®¡æ ¸ä¸éè¿ãæé®æ¯å¦å±ç¤º */ |
| | | const approverIds = ref<number[]>([]); |
| | | |
| | | /** æå审æ¹äººéåï¼å¤±è´¥æ¶ä¿æä¸ºç©ºï¼æé®ä¸å±ç¤ºï¼ï¼ä¸é»æå表å è½½ */ |
| | | async function loadApproverIds() { |
| | | try { |
| | | approverIds.value = (await getContractApproverIds()) ?? []; |
| | | } catch { |
| | | approverIds.value = []; |
| | | } |
| | | } |
| | | |
| | | /** å½åç»å½ç¨æ·æ¯å¦ä¸ºè¯¥ä¸å¡ç审æ¹äººï¼ä¸ååå¤äºå®¡æ¹ä¸ï¼10ï¼ */ |
| | | function canAudit(row: CrmContractApi.Contract) { |
| | | return ( |
| | | row.auditStatus === 10 && |
| | | !!currentUserId && |
| | | approverIds.value.includes(currentUserId) |
| | | ); |
| | | } |
| | | |
| | | const [FormModal, formModalApi] = useVbenModal({ |
| | | connectedComponent: Form, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** å·æ°è¡¨æ ¼ */ |
| | | const [AuditModalComp, auditModalApi] = useVbenModal({ |
| | | connectedComponent: AuditModal, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** å·æ°è¡¨æ ¼ä¸å®¡æ¹äººéå */ |
| | | function handleRefresh() { |
| | | gridApi.query(); |
| | | loadApproverIds(); |
| | | } |
| | | |
| | | /** å¤çåºæ¯ç±»åç忢 */ |
| | |
| | | } |
| | | } |
| | | |
| | | /** æäº¤å®¡æ¹å¼¹çª */ |
| | | const submitModalVisible = ref(false); |
| | | const currentRow = ref<CrmContractApi.Contract>(); |
| | | const processList = ref<CrmContractApi.ApproveProcess[]>([]); |
| | | const selectedProcessKey = ref<string>(); |
| | | const submitLoading = ref(false); |
| | | |
| | | /** æäº¤å®¡æ¹ - 审æ¹äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãç»ä¸æå®ï¼æ¤å¤æ ééæ© */ |
| | | async function handleSubmit(row: CrmContractApi.Contract) { |
| | | const res = await getContractApproveProcessList(); |
| | | processList.value = res; |
| | | currentRow.value = row; |
| | | selectedProcessKey.value = undefined; |
| | | submitModalVisible.value = true; |
| | | } |
| | | |
| | | async function confirmSubmit() { |
| | | if (!selectedProcessKey.value) { |
| | | message.warning('è¯·éæ©å®¡æ¹æµç¨'); |
| | | return; |
| | | } |
| | | submitLoading.value = true; |
| | | const hideLoading = message.loading({ |
| | | content: 'æ£å¨æäº¤å®¡æ¹...', |
| | | duration: 0, |
| | | }); |
| | | try { |
| | | await submitContract(currentRow.value!.id!, selectedProcessKey.value); |
| | | await submitContract(row.id!); |
| | | message.success('æäº¤å®¡æ¹æå'); |
| | | submitModalVisible.value = false; |
| | | handleRefresh(); |
| | | } finally { |
| | | submitLoading.value = false; |
| | | hideLoading(); |
| | | } |
| | | } |
| | | |
| | | /** å®¡æ ¸ - éè¿ / ä¸éè¿ */ |
| | | function handleAudit(row: CrmContractApi.Contract, pass: boolean) { |
| | | auditModalApi.setData({ pass, row }).open(); |
| | | } |
| | | |
| | | /** æ¥çåå详æ
*/ |
| | |
| | | /** æ¥çåæºè¯¦æ
*/ |
| | | function handleBusinessDetail(row: CrmContractApi.Contract) { |
| | | push({ name: 'CrmBusinessDetail', params: { id: row.businessId } }); |
| | | } |
| | | |
| | | /** æ¥ç审æ¹è¯¦æ
*/ |
| | | function handleProcessDetail(row: CrmContractApi.Contract) { |
| | | push({ |
| | | name: 'BpmProcessInstanceDetail', |
| | | query: { id: row.processInstanceId }, |
| | | }); |
| | | } |
| | | |
| | | /** çæéå®è®¢å */ |
| | |
| | | }, |
| | | } as VxeTableGridOptions<CrmContractApi.Contract>, |
| | | }); |
| | | |
| | | // è¿å
¥é¡µé¢å³æå审æ¹äººéåï¼ç¨äºæ§å¶å®¡æ ¸æé®æ¾é |
| | | loadApproverIds(); |
| | | </script> |
| | | |
| | | <template> |
| | | <Page auto-content-height> |
| | | <FormModal @success="handleRefresh" /> |
| | | <AuditModalComp @success="handleRefresh" /> |
| | | <Grid> |
| | | <template #toolbar-actions> |
| | | <Tabs class="w-full" @change="handleChangeSceneType"> |
| | |
| | | label: 'æäº¤å®¡æ¹', |
| | | type: 'link', |
| | | auth: ['crm:contract:update'], |
| | | onClick: handleSubmit.bind(null, row), |
| | | ifShow: row.auditStatus === 0, |
| | | // 审æ¹äººç±å®¡æ¹é
ç½®ç»ä¸æå®ï¼æäº¤åä»
äºæ¬¡ç¡®è®¤ï¼ä¸åå¼¹éæµç¨æ¡ |
| | | popConfirm: { |
| | | title: '确认æäº¤å®¡æ¹ï¼æäº¤åç±å®¡æ¹é
ç½®ä¸æå®ç审æ¹äººå¤çã', |
| | | confirm: handleSubmit.bind(null, row), |
| | | }, |
| | | // æªæäº¤(0) ä¸ å®¡æ ¸ä¸éè¿(30) åå¯æäº¤ï¼åè
éä¿®æ¹åéæ°æäº¤ |
| | | ifShow: row.auditStatus === 0 || row.auditStatus === 30, |
| | | }, |
| | | { |
| | | label: 'æ¥ç审æ¹', |
| | | label: 'å®¡æ ¸', |
| | | type: 'link', |
| | | auth: ['crm:contract:update'], |
| | | onClick: handleProcessDetail.bind(null, row), |
| | | ifShow: row.auditStatus !== 0, |
| | | icon: ACTION_ICON.AUDIT, |
| | | auth: ['crm:contract:audit'], |
| | | // ä»
ã审æ¹ä¸ + å½åç»å½ç¨æ·å¨å®¡æ¹é
ç½®ç审æ¹äººååå
ãææ¾ç¤º |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, true), |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸ä¸éè¿', |
| | | type: 'link', |
| | | danger: true, |
| | | auth: ['crm:contract:audit'], |
| | | // åä¸ï¼ä¸ãå®¡æ ¸ãæå¯¹åºç° |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, false), |
| | | }, |
| | | { |
| | | label: 'çæéå®è®¢å', |
| | |
| | | </template> |
| | | </Grid> |
| | | |
| | | <!-- æäº¤å®¡æ¹å¼¹çª --> |
| | | <Modal |
| | | v-model:open="submitModalVisible" |
| | | title="éæ©å®¡æ¹æµç¨" |
| | | width="400px" |
| | | @ok="confirmSubmit" |
| | | :confirmLoading="submitLoading" |
| | | > |
| | | <Select |
| | | v-model:value="selectedProcessKey" |
| | | placeholder="è¯·éæ©å®¡æ¹æµç¨" |
| | | class="w-full" |
| | | > |
| | | <Select.Option |
| | | v-for="item in processList" |
| | | :key="item.key" |
| | | :value="item.key" |
| | | > |
| | | {{ item.name }} |
| | | </Select.Option> |
| | | </Select> |
| | | </Modal> |
| | | </Page> |
| | | </template> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { VbenFormSchema } from '#/adapter/form'; |
| | | import type { CrmContractApi } from '#/api/crm/contract'; |
| | | |
| | | import { computed, ref } from 'vue'; |
| | | |
| | | import { useVbenModal } from '@vben/common-ui'; |
| | | |
| | | import { message } from 'ant-design-vue'; |
| | | |
| | | import { useVbenForm } from '#/adapter/form'; |
| | | import { auditContract } from '#/api/crm/contract'; |
| | | |
| | | const emit = defineEmits(['success']); |
| | | |
| | | const pass = ref(true); // true=å®¡æ ¸éè¿ / false=å®¡æ ¸ä¸éè¿ |
| | | const rowData = ref<CrmContractApi.Contract>(); |
| | | const getTitle = computed(() => (pass.value ? 'å®¡æ ¸éè¿' : 'å®¡æ ¸ä¸éè¿')); |
| | | |
| | | const [Form, formApi] = useVbenForm({ |
| | | commonConfig: { |
| | | componentProps: { |
| | | class: 'w-full', |
| | | }, |
| | | formItemClass: 'col-span-1', |
| | | labelWidth: 90, |
| | | }, |
| | | wrapperClass: 'grid-cols-1', |
| | | layout: 'horizontal', |
| | | schema: [], |
| | | showDefaultActions: false, |
| | | }); |
| | | |
| | | /** å®¡æ ¸è¡¨ååæ®µï¼ä¸éè¿æ¶å¿
须填ååå */ |
| | | function useAuditSchema(): VbenFormSchema[] { |
| | | return [ |
| | | { |
| | | fieldName: 'reviewRemark', |
| | | label: 'å®¡æ ¸æè§', |
| | | component: 'Textarea', |
| | | formItemClass: 'col-span-1', |
| | | componentProps: { |
| | | rows: 3, |
| | | placeholder: pass.value |
| | | ? '请è¾å
¥å®¡æ ¸æè§ï¼å¯éï¼' |
| | | : '请è¾å
¥ä¸éè¿åå ï¼å¿
å¡«ï¼', |
| | | }, |
| | | rules: pass.value ? '' : 'required', |
| | | }, |
| | | ]; |
| | | } |
| | | |
| | | const [Modal, modalApi] = useVbenModal({ |
| | | async onConfirm() { |
| | | const { valid } = await formApi.validate(); |
| | | if (!valid) { |
| | | return; |
| | | } |
| | | modalApi.lock(); |
| | | const values = await formApi.getValues(); |
| | | try { |
| | | await auditContract(rowData.value!.id!, pass.value, values.reviewRemark); |
| | | await modalApi.close(); |
| | | emit('success'); |
| | | message.success(pass.value ? 'å®¡æ ¸éè¿' : 'å·²éåï¼å¯ä¿®æ¹åéæ°æäº¤'); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | | }, |
| | | async onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { |
| | | rowData.value = undefined; |
| | | return; |
| | | } |
| | | const data = modalApi.getData<{ |
| | | pass: boolean; |
| | | row: CrmContractApi.Contract; |
| | | }>(); |
| | | rowData.value = data.row; |
| | | pass.value = data.pass; |
| | | formApi.setState({ schema: useAuditSchema() }); |
| | | formApi.resetForm(); |
| | | }, |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Modal :title="getTitle" class="w-2/5"> |
| | | <div v-if="rowData" class="mx-4 mb-4 text-sm text-gray-600"> |
| | | <div>åååç§°ï¼{{ rowData.name }}</div> |
| | | <div>ååç¼å·ï¼{{ rowData.no }}</div> |
| | | </div> |
| | | <Form class="mx-4" /> |
| | | </Modal> |
| | | </template> |
| | |
| | | import { useRouter } from 'vue-router'; |
| | | |
| | | import { Page, useVbenModal } from '@vben/common-ui'; |
| | | import { useUserStore } from '@vben/stores'; |
| | | import { downloadFileFromBlobPart } from '@vben/utils'; |
| | | |
| | | import { Button, message, Tag, Tabs } from 'ant-design-vue'; |
| | |
| | | import { |
| | | deleteInvoice, |
| | | exportInvoice, |
| | | getInvoiceApproverIds, |
| | | getInvoicePage, |
| | | submitInvoice, |
| | | } from '#/api/crm/invoice'; |
| | | import { $t } from '#/locales'; |
| | | |
| | | import { useGridColumns, useGridFormSchema } from './data'; |
| | | import AuditModal from './modules/audit-modal.vue'; |
| | | import Form from './modules/form.vue'; |
| | | |
| | | const { push } = useRouter(); |
| | | const sceneType = ref('1'); |
| | | const userStore = useUserStore(); |
| | | const currentUserId = userStore.userInfo?.id; // å½åç»å½ç¨æ· IDï¼ç¨äºå®¡æ¹äººæé夿 |
| | | |
| | | /** 审æ¹é
ç½®ä¸è¯¥ä¸å¡ç审æ¹äººç¼å·éåï¼å³å®ãå®¡æ ¸ / å®¡æ ¸ä¸éè¿ãæé®æ¯å¦å±ç¤º */ |
| | | const approverIds = ref<number[]>([]); |
| | | |
| | | /** æå审æ¹äººéåï¼å¤±è´¥æ¶ä¿æä¸ºç©ºï¼æé®ä¸å±ç¤ºï¼ï¼ä¸é»æå表å è½½ */ |
| | | async function loadApproverIds() { |
| | | try { |
| | | approverIds.value = (await getInvoiceApproverIds()) ?? []; |
| | | } catch { |
| | | approverIds.value = []; |
| | | } |
| | | } |
| | | |
| | | /** å½åç»å½ç¨æ·æ¯å¦ä¸ºè¯¥ä¸å¡ç审æ¹äººï¼ä¸å¼ç¥¨å¤äºå®¡æ¹ä¸ï¼10ï¼ */ |
| | | function canAudit(row: CrmInvoiceApi.Invoice) { |
| | | return ( |
| | | row.auditStatus === 10 && |
| | | !!currentUserId && |
| | | approverIds.value.includes(currentUserId) |
| | | ); |
| | | } |
| | | |
| | | const [FormModal, formModalApi] = useVbenModal({ |
| | | connectedComponent: Form, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** å·æ°è¡¨æ ¼ */ |
| | | const [AuditModalComp, auditModalApi] = useVbenModal({ |
| | | connectedComponent: AuditModal, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** å·æ°è¡¨æ ¼ä¸å®¡æ¹äººéå */ |
| | | function handleRefresh() { |
| | | gridApi.query(); |
| | | loadApproverIds(); |
| | | } |
| | | |
| | | /** å¤çåºæ¯ç±»åç忢 */ |
| | |
| | | } |
| | | } |
| | | |
| | | /** æäº¤å®¡æ ¸ */ |
| | | /** æäº¤å®¡æ¹ - 审æ¹äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãç»ä¸æå®ï¼æ¤å¤æ ééæ© */ |
| | | async function handleSubmit(row: CrmInvoiceApi.Invoice) { |
| | | const hideLoading = message.loading({ |
| | | content: 'æäº¤å®¡æ ¸ä¸...', |
| | | content: 'æ£å¨æäº¤å®¡æ¹...', |
| | | duration: 0, |
| | | }); |
| | | try { |
| | | await submitInvoice(row.id!); |
| | | message.success('æäº¤å®¡æ ¸æå'); |
| | | message.success('æäº¤å®¡æ¹æå'); |
| | | handleRefresh(); |
| | | } finally { |
| | | hideLoading(); |
| | | } |
| | | } |
| | | |
| | | /** å®¡æ ¸ - éè¿ / ä¸éè¿ */ |
| | | function handleAudit(row: CrmInvoiceApi.Invoice, pass: boolean) { |
| | | auditModalApi.setData({ pass, row }).open(); |
| | | } |
| | | |
| | | /** æ¥çå¼ç¥¨è¯¦æ
*/ |
| | |
| | | /** æ¥çåå详æ
*/ |
| | | function handleContractDetail(row: CrmInvoiceApi.Invoice) { |
| | | push({ name: 'CrmContractDetail', params: { id: row.contractId } }); |
| | | } |
| | | |
| | | /** æ¥ç审æ¹è¯¦æ
*/ |
| | | function handleProcessDetail(row: CrmInvoiceApi.Invoice) { |
| | | push({ |
| | | name: 'BpmProcessInstanceDetail', |
| | | query: { id: row.processInstanceId }, |
| | | }); |
| | | } |
| | | |
| | | const [Grid, gridApi] = useVbenVxeGrid({ |
| | |
| | | }, |
| | | } as VxeTableGridOptions<CrmInvoiceApi.Invoice>, |
| | | }); |
| | | |
| | | // è¿å
¥é¡µé¢å³æå审æ¹äººéåï¼ç¨äºæ§å¶å®¡æ ¸æé®æ¾é |
| | | loadApproverIds(); |
| | | </script> |
| | | |
| | | <template> |
| | | <Page auto-content-height> |
| | | <FormModal @success="handleRefresh" /> |
| | | <AuditModalComp @success="handleRefresh" /> |
| | | <Grid> |
| | | <template #toolbar-actions> |
| | | <Tabs class="w-full" @change="handleChangeSceneType"> |
| | |
| | | onClick: handleEdit.bind(null, row), |
| | | }, |
| | | { |
| | | label: 'æäº¤å®¡æ ¸', |
| | | label: 'æäº¤å®¡æ¹', |
| | | type: 'link', |
| | | auth: ['crm:invoice:update'], |
| | | onClick: handleSubmit.bind(null, row), |
| | | ifShow: row.auditStatus === 0, |
| | | // 审æ¹äººç±å®¡æ¹é
ç½®ç»ä¸æå®ï¼æäº¤åä»
äºæ¬¡ç¡®è®¤ï¼ä¸åå¼¹éæµç¨æ¡ |
| | | popConfirm: { |
| | | title: '确认æäº¤å®¡æ¹ï¼æäº¤åç±å®¡æ¹é
ç½®ä¸æå®ç审æ¹äººå¤çã', |
| | | confirm: handleSubmit.bind(null, row), |
| | | }, |
| | | // æªæäº¤(0) ä¸ å®¡æ ¸ä¸éè¿(30) åå¯æäº¤ï¼åè
éä¿®æ¹åéæ°æäº¤ |
| | | ifShow: row.auditStatus === 0 || row.auditStatus === 30, |
| | | }, |
| | | { |
| | | label: 'æ¥ç审æ¹', |
| | | label: 'å®¡æ ¸', |
| | | type: 'link', |
| | | auth: ['crm:invoice:update'], |
| | | onClick: handleProcessDetail.bind(null, row), |
| | | ifShow: row.auditStatus !== 0 && !!row.processInstanceId, |
| | | icon: ACTION_ICON.AUDIT, |
| | | auth: ['crm:invoice:audit'], |
| | | // ä»
ã审æ¹ä¸ + å½åç»å½ç¨æ·å¨å®¡æ¹é
ç½®ç审æ¹äººååå
ãææ¾ç¤º |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, true), |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸ä¸éè¿', |
| | | type: 'link', |
| | | danger: true, |
| | | auth: ['crm:invoice:audit'], |
| | | // åä¸ï¼ä¸ãå®¡æ ¸ãæå¯¹åºç° |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, false), |
| | | }, |
| | | { |
| | | label: $t('common.delete'), |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { VbenFormSchema } from '#/adapter/form'; |
| | | import type { CrmInvoiceApi } from '#/api/crm/invoice'; |
| | | |
| | | import { computed, ref } from 'vue'; |
| | | |
| | | import { useVbenModal } from '@vben/common-ui'; |
| | | |
| | | import { message } from 'ant-design-vue'; |
| | | |
| | | import { useVbenForm } from '#/adapter/form'; |
| | | import { auditInvoice } from '#/api/crm/invoice'; |
| | | |
| | | const emit = defineEmits(['success']); |
| | | |
| | | const pass = ref(true); // true=å®¡æ ¸éè¿ / false=å®¡æ ¸ä¸éè¿ |
| | | const rowData = ref<CrmInvoiceApi.Invoice>(); |
| | | const getTitle = computed(() => (pass.value ? 'å®¡æ ¸éè¿' : 'å®¡æ ¸ä¸éè¿')); |
| | | |
| | | const [Form, formApi] = useVbenForm({ |
| | | commonConfig: { |
| | | componentProps: { |
| | | class: 'w-full', |
| | | }, |
| | | formItemClass: 'col-span-1', |
| | | labelWidth: 90, |
| | | }, |
| | | wrapperClass: 'grid-cols-1', |
| | | layout: 'horizontal', |
| | | schema: [], |
| | | showDefaultActions: false, |
| | | }); |
| | | |
| | | /** å®¡æ ¸è¡¨ååæ®µï¼ä¸éè¿æ¶å¿
须填ååå */ |
| | | function useAuditSchema(): VbenFormSchema[] { |
| | | return [ |
| | | { |
| | | fieldName: 'reviewRemark', |
| | | label: 'å®¡æ ¸æè§', |
| | | component: 'Textarea', |
| | | formItemClass: 'col-span-1', |
| | | componentProps: { |
| | | rows: 3, |
| | | placeholder: pass.value |
| | | ? '请è¾å
¥å®¡æ ¸æè§ï¼å¯éï¼' |
| | | : '请è¾å
¥ä¸éè¿åå ï¼å¿
å¡«ï¼', |
| | | }, |
| | | rules: pass.value ? '' : 'required', |
| | | }, |
| | | ]; |
| | | } |
| | | |
| | | const [Modal, modalApi] = useVbenModal({ |
| | | async onConfirm() { |
| | | const { valid } = await formApi.validate(); |
| | | if (!valid) { |
| | | return; |
| | | } |
| | | modalApi.lock(); |
| | | const values = await formApi.getValues(); |
| | | try { |
| | | await auditInvoice(rowData.value!.id!, pass.value, values.reviewRemark); |
| | | await modalApi.close(); |
| | | emit('success'); |
| | | message.success(pass.value ? 'å®¡æ ¸éè¿' : 'å·²éåï¼å¯ä¿®æ¹åéæ°æäº¤'); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | | }, |
| | | async onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { |
| | | rowData.value = undefined; |
| | | return; |
| | | } |
| | | const data = modalApi.getData<{ |
| | | pass: boolean; |
| | | row: CrmInvoiceApi.Invoice; |
| | | }>(); |
| | | rowData.value = data.row; |
| | | pass.value = data.pass; |
| | | formApi.setState({ schema: useAuditSchema() }); |
| | | formApi.resetForm(); |
| | | }, |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Modal :title="getTitle" class="w-2/5"> |
| | | <div v-if="rowData" class="mx-4 mb-4 text-sm text-gray-600"> |
| | | <div>å¼ç¥¨ç¼å·ï¼{{ rowData.no }}</div> |
| | | <div>客æ·åç§°ï¼{{ rowData.customerName }}</div> |
| | | </div> |
| | | <Form class="mx-4" /> |
| | | </Modal> |
| | | </template> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { VbenFormSchema } from '#/adapter/form'; |
| | | import type { CrmRefundApi } from '#/api/crm/refund'; |
| | | |
| | | import { computed, ref } from 'vue'; |
| | | |
| | | import { useVbenModal } from '@vben/common-ui'; |
| | | |
| | | import { message } from 'ant-design-vue'; |
| | | |
| | | import { useVbenForm } from '#/adapter/form'; |
| | | import { auditRefund } from '#/api/crm/refund'; |
| | | |
| | | const emit = defineEmits(['success']); |
| | | |
| | | const pass = ref(true); // true=å®¡æ ¸éè¿ / false=å®¡æ ¸ä¸éè¿ |
| | | const rowData = ref<CrmRefundApi.Refund>(); |
| | | const getTitle = computed(() => (pass.value ? 'å®¡æ ¸éè¿' : 'å®¡æ ¸ä¸éè¿')); |
| | | |
| | | const [Form, formApi] = useVbenForm({ |
| | | commonConfig: { |
| | | componentProps: { |
| | | class: 'w-full', |
| | | }, |
| | | formItemClass: 'col-span-1', |
| | | labelWidth: 90, |
| | | }, |
| | | wrapperClass: 'grid-cols-1', |
| | | layout: 'horizontal', |
| | | schema: [], |
| | | showDefaultActions: false, |
| | | }); |
| | | |
| | | /** å®¡æ ¸è¡¨ååæ®µï¼ä¸éè¿æ¶å¿
须填ååå */ |
| | | function useAuditSchema(): VbenFormSchema[] { |
| | | return [ |
| | | { |
| | | fieldName: 'reviewRemark', |
| | | label: 'å®¡æ ¸æè§', |
| | | component: 'Textarea', |
| | | formItemClass: 'col-span-1', |
| | | componentProps: { |
| | | rows: 3, |
| | | placeholder: pass.value |
| | | ? '请è¾å
¥å®¡æ ¸æè§ï¼å¯éï¼' |
| | | : '请è¾å
¥ä¸éè¿åå ï¼å¿
å¡«ï¼', |
| | | }, |
| | | rules: pass.value ? '' : 'required', |
| | | }, |
| | | ]; |
| | | } |
| | | |
| | | const [Modal, modalApi] = useVbenModal({ |
| | | async onConfirm() { |
| | | const { valid } = await formApi.validate(); |
| | | if (!valid) { |
| | | return; |
| | | } |
| | | modalApi.lock(); |
| | | const values = await formApi.getValues(); |
| | | try { |
| | | await auditRefund(rowData.value!.id!, pass.value, values.reviewRemark); |
| | | await modalApi.close(); |
| | | emit('success'); |
| | | message.success(pass.value ? 'å®¡æ ¸éè¿' : 'å·²éåï¼å¯ä¿®æ¹åéæ°æäº¤'); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | | }, |
| | | async onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { |
| | | rowData.value = undefined; |
| | | return; |
| | | } |
| | | const data = modalApi.getData<{ |
| | | pass: boolean; |
| | | row: CrmRefundApi.Refund; |
| | | }>(); |
| | | rowData.value = data.row; |
| | | pass.value = data.pass; |
| | | formApi.setState({ schema: useAuditSchema() }); |
| | | formApi.resetForm(); |
| | | }, |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Modal :title="getTitle" class="w-2/5"> |
| | | <div v-if="rowData" class="mx-4 mb-4 text-sm text-gray-600"> |
| | | <div>éè´¹åå·ï¼{{ rowData.refundNo }}</div> |
| | | <div>客æ·åç§°ï¼{{ rowData.customerName }}</div> |
| | | </div> |
| | | <Form class="mx-4" /> |
| | | </Modal> |
| | | </template> |
| | |
| | | import type { VxeTableGridOptions } from '#/adapter/vxe-table'; |
| | | import type { ErpFinancePaymentApi } from '#/api/erp/finance/payment'; |
| | | |
| | | import { ref } from 'vue'; |
| | | import { useRouter } from 'vue-router'; |
| | | import { onMounted, ref } from 'vue'; |
| | | |
| | | import { Page, useVbenModal } from '@vben/common-ui'; |
| | | import { useUserStore } from '@vben/stores'; |
| | | import { downloadFileFromBlobPart, isEmpty } from '@vben/utils'; |
| | | |
| | | import { message } from 'ant-design-vue'; |
| | |
| | | import { |
| | | deleteFinancePayment, |
| | | exportFinancePayment, |
| | | getFinancePaymentApproveProcessList, |
| | | getFinancePaymentApproverUserIds, |
| | | getFinancePaymentPage, |
| | | submitFinancePayment, |
| | | } from '#/api/erp/finance/payment'; |
| | | import { $t } from '#/locales'; |
| | | |
| | | import { useGridColumns, useGridFormSchema } from './data'; |
| | | import AuditModal from './modules/audit-modal.vue'; |
| | | import Form from './modules/form.vue'; |
| | | import ProcessSelectModal from './modules/process-select-modal.vue'; |
| | | |
| | | /** ERP 仿¬¾åå表 */ |
| | | defineOptions({ name: 'ErpFinancePayment' }); |
| | | |
| | | const router = useRouter(); |
| | | const userStore = useUserStore(); |
| | | |
| | | /** å½åä¸å¡ç±»åç审æ¹äººç¼å·éåï¼ç¨äºå¤ææ¯å¦å±ç¤ºå®¡æ ¸æé® */ |
| | | const approverIds = ref<number[]>([]); |
| | | /** å½åç»å½ç¨æ·ç¼å· */ |
| | | const currentUserId = userStore.userInfo?.id; |
| | | |
| | | const [FormModal, formModalApi] = useVbenModal({ |
| | | connectedComponent: Form, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | const [ProcessModal, processModalApi] = useVbenModal({ |
| | | connectedComponent: ProcessSelectModal, |
| | | const [AuditModalComp, auditModalApi] = useVbenModal({ |
| | | connectedComponent: AuditModal, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** å·æ°è¡¨æ ¼ */ |
| | | /** å·æ°è¡¨æ ¼ã审æ¹äººéå */ |
| | | function handleRefresh() { |
| | | gridApi.query(); |
| | | loadApproverIds(); |
| | | } |
| | | |
| | | /** å è½½å½åä¸å¡ç±»åç审æ¹äººç¼å·éå */ |
| | | async function loadApproverIds() { |
| | | try { |
| | | approverIds.value = (await getFinancePaymentApproverUserIds()) ?? []; |
| | | } catch { |
| | | approverIds.value = []; |
| | | } |
| | | } |
| | | |
| | | /** å½åç¨æ·æ¯å¦ä¸ºè¯¥ä¸å¡ç±»åç审æ¹äººï¼ä¸åæ®å¤äºå®¡æ¹ä¸ */ |
| | | function canAudit(row: ErpFinancePaymentApi.FinancePayment) { |
| | | return ( |
| | | row.status === 15 && approverIds.value.includes(currentUserId as number) |
| | | ); |
| | | } |
| | | |
| | | /** 导åºè¡¨æ ¼ */ |
| | |
| | | } |
| | | } |
| | | |
| | | /** æäº¤å®¡æ¹ - å
è·åæµç¨å表 */ |
| | | /** æäº¤å®¡æ ¸ - å端æå®¡æ¹é
ç½®æ ¡éªå®¡æ¹äººï¼æ éåç«¯éæ©æµç¨ */ |
| | | async function handleSubmit(row: ErpFinancePaymentApi.FinancePayment) { |
| | | const hideLoading = message.loading({ |
| | | content: 'è·åå®¡æ¹æµç¨...', |
| | | content: 'æ£å¨æäº¤å®¡æ ¸...', |
| | | duration: 0, |
| | | }); |
| | | try { |
| | | const processList = await getFinancePaymentApproveProcessList(); |
| | | hideLoading(); |
| | | if (!processList || processList.length === 0) { |
| | | message.warning('ææ å¯ç¨å®¡æ¹æµç¨ï¼è¯·å
é
ç½® BPM æµç¨'); |
| | | return; |
| | | } |
| | | // æå¼æµç¨éæ©å¼¹çª |
| | | processModalApi.setData({ id: row.id, processList }).open(); |
| | | } catch { |
| | | await submitFinancePayment(row.id!); |
| | | message.success('æäº¤æåï¼çå¾
审æ¹äººå®¡æ ¸'); |
| | | handleRefresh(); |
| | | } finally { |
| | | hideLoading(); |
| | | } |
| | | } |
| | | |
| | | /** æ¥ç审æ¹è¯¦æ
*/ |
| | | function handleProcessDetail(row: ErpFinancePaymentApi.FinancePayment) { |
| | | if (!row.processInstanceId) { |
| | | message.warning('è¯¥ä»æ¬¾åå°æªæäº¤å®¡æ¹'); |
| | | /** å®¡æ ¸ - éè¿ / ä¸éè¿ */ |
| | | function handleAudit(row: ErpFinancePaymentApi.FinancePayment, pass: boolean) { |
| | | auditModalApi.setData({ pass, row }).open(); |
| | | } |
| | | |
| | | /** æ¥ç审æ¹è®°å½ - è½»é级审æ¹ä¸å跳转 BPM æµç¨è¯¦æ
*/ |
| | | function handleViewProcess(row: ErpFinancePaymentApi.FinancePayment) { |
| | | const parts: string[] = []; |
| | | if (row.reviewerName) { |
| | | parts.push(`å®¡æ ¸äººï¼${row.reviewerName}`); |
| | | } |
| | | if (row.reviewTime) { |
| | | parts.push(`å®¡æ ¸æ¶é´ï¼${row.reviewTime}`); |
| | | } |
| | | if (row.reviewRemark) { |
| | | parts.push(`å®¡æ ¸æè§ï¼${row.reviewRemark}`); |
| | | } |
| | | if (parts.length === 0) { |
| | | message.info('è¯¥ä»æ¬¾åææ å®¡æ ¸è®°å½'); |
| | | return; |
| | | } |
| | | router.push({ |
| | | name: 'BpmProcessInstanceDetail', |
| | | query: { id: row.processInstanceId }, |
| | | }); |
| | | message.info(parts.join('ã')); |
| | | } |
| | | |
| | | const checkedIds = ref<number[]>([]); |
| | |
| | | checkboxChange: handleRowCheckboxChange, |
| | | }, |
| | | }); |
| | | |
| | | onMounted(() => { |
| | | loadApproverIds(); |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Page auto-content-height><FormModal @success="handleRefresh" /> |
| | | <ProcessModal @success="handleRefresh" /> |
| | | <AuditModalComp @success="handleRefresh" /> |
| | | <Grid table-title="仿¬¾åå表"> |
| | | <template #toolbar-tools> |
| | | <TableAction |
| | |
| | | type: 'link', |
| | | icon: ACTION_ICON.AUDIT, |
| | | auth: ['erp:finance-payment:update'], |
| | | // æªå®¡æ ¸ï¼å«å®¡æ ¸ä¸éè¿éåï¼åå¯æäº¤ï¼éååéä¿®æ¹åéæ°æäº¤ |
| | | ifShow: () => row.status === 10, |
| | | onClick: handleSubmit.bind(null, row), |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸', |
| | | type: 'link', |
| | | icon: ACTION_ICON.AUDIT, |
| | | auth: ['erp:finance-payment:audit'], |
| | | // ä»
ã审æ¹ä¸ + å½åç»å½ç¨æ·æ¯å®¡æ¹äººãææ¾ç¤ºï¼å
¶ä»äººçä¸å°è¯¥æé® |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, true), |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸ä¸éè¿', |
| | | type: 'link', |
| | | danger: true, |
| | | icon: ACTION_ICON.AUDIT, |
| | | auth: ['erp:finance-payment:audit'], |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, false), |
| | | }, |
| | | { |
| | | label: 'æ¥ç审æ¹', |
| | | type: 'link', |
| | | icon: ACTION_ICON.VIEW, |
| | | auth: ['erp:finance-payment:query'], |
| | | ifShow: () => row.status !== 10 && !!row.processInstanceId, |
| | | onClick: handleProcessDetail.bind(null, row), |
| | | ifShow: () => row.status === 20 || !!row.reviewRemark, |
| | | onClick: handleViewProcess.bind(null, row), |
| | | }, |
| | | { |
| | | label: $t('common.delete'), |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { VbenFormSchema } from '#/adapter/form'; |
| | | import type { ErpFinancePaymentApi } from '#/api/erp/finance/payment'; |
| | | |
| | | import { computed, ref } from 'vue'; |
| | | |
| | | import { useVbenModal } from '@vben/common-ui'; |
| | | |
| | | import { message } from 'ant-design-vue'; |
| | | |
| | | import { useVbenForm } from '#/adapter/form'; |
| | | import { auditFinancePayment } from '#/api/erp/finance/payment'; |
| | | |
| | | const emit = defineEmits(['success']); |
| | | |
| | | const pass = ref(true); // true=å®¡æ ¸éè¿ / false=å®¡æ ¸ä¸éè¿ |
| | | const rowData = ref<ErpFinancePaymentApi.FinancePayment>(); |
| | | const getTitle = computed(() => (pass.value ? 'å®¡æ ¸éè¿' : 'å®¡æ ¸ä¸éè¿')); |
| | | |
| | | const [Form, formApi] = useVbenForm({ |
| | | commonConfig: { |
| | | componentProps: { |
| | | class: 'w-full', |
| | | }, |
| | | formItemClass: 'col-span-1', |
| | | labelWidth: 130, |
| | | }, |
| | | wrapperClass: 'grid-cols-1', |
| | | layout: 'horizontal', |
| | | schema: [], |
| | | showDefaultActions: false, |
| | | }); |
| | | |
| | | /** å®¡æ ¸è¡¨ååæ®µï¼ä¸éè¿æ¶å¿
须填ååå */ |
| | | function useAuditSchema(): VbenFormSchema[] { |
| | | return [ |
| | | { |
| | | fieldName: 'reviewRemark', |
| | | label: 'å®¡æ ¸æè§', |
| | | component: 'Textarea', |
| | | formItemClass: 'col-span-1', |
| | | componentProps: { |
| | | rows: 3, |
| | | placeholder: pass.value |
| | | ? '请è¾å
¥å®¡æ ¸æè§ï¼å¯éï¼' |
| | | : '请è¾å
¥ä¸éè¿åå ï¼å¿
å¡«ï¼', |
| | | }, |
| | | rules: pass.value ? '' : 'required', |
| | | }, |
| | | ]; |
| | | } |
| | | |
| | | const [Modal, modalApi] = useVbenModal({ |
| | | async onConfirm() { |
| | | const { valid } = await formApi.validate(); |
| | | if (!valid) { |
| | | return; |
| | | } |
| | | modalApi.lock(); |
| | | const values = await formApi.getValues(); |
| | | try { |
| | | await auditFinancePayment( |
| | | rowData.value!.id!, |
| | | pass.value, |
| | | values.reviewRemark, |
| | | ); |
| | | await modalApi.close(); |
| | | emit('success'); |
| | | message.success(pass.value ? 'å®¡æ ¸éè¿' : 'å·²éåï¼å¯ä¿®æ¹åéæ°æäº¤'); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | | }, |
| | | async onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { |
| | | rowData.value = undefined; |
| | | return; |
| | | } |
| | | const data = modalApi.getData<{ |
| | | pass: boolean; |
| | | row: ErpFinancePaymentApi.FinancePayment; |
| | | }>(); |
| | | rowData.value = data.row; |
| | | pass.value = data.pass; |
| | | formApi.setState({ schema: useAuditSchema() }); |
| | | formApi.resetForm(); |
| | | }, |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Modal :title="getTitle" class="w-2/5"> |
| | | <div v-if="rowData" class="mx-4 mb-4 text-sm text-gray-600"> |
| | | <div>仿¬¾åå·ï¼{{ rowData.no }}</div> |
| | | <div>ä¾åºåï¼{{ rowData.supplierName || '-' }}</div> |
| | | </div> |
| | | <Form class="mx-4" /> |
| | | </Modal> |
| | | </template> |
| | |
| | | import type { VxeTableGridOptions } from '#/adapter/vxe-table'; |
| | | import type { ErpPurchaseRequestApi } from '#/api/erp/purchase/request'; |
| | | |
| | | import { ref } from 'vue'; |
| | | import { onMounted, ref } from 'vue'; |
| | | import { useRouter } from 'vue-router'; |
| | | |
| | | import { confirm, Page, useVbenModal } from '@vben/common-ui'; |
| | | import { Page, useVbenModal } from '@vben/common-ui'; |
| | | import { useUserStore } from '@vben/stores'; |
| | | import { downloadFileFromBlobPart, isEmpty } from '@vben/utils'; |
| | | |
| | | import { message, Tag } from 'ant-design-vue'; |
| | |
| | | import { |
| | | deletePurchaseRequest, |
| | | exportPurchaseRequest, |
| | | getApproveProcessList, |
| | | getPurchaseRequestApproverUserIds, |
| | | getPurchaseRequestPage, |
| | | submitPurchaseRequest, |
| | | } from '#/api/erp/purchase/request'; |
| | | import { $t } from '#/locales'; |
| | | |
| | | import { useGridColumns, useGridFormSchema } from './data'; |
| | | import AuditModal from './modules/audit-modal.vue'; |
| | | import Form from './modules/form.vue'; |
| | | import OrderForm from './modules/order-form.vue'; |
| | | import ProcessSelectModal from './modules/process-select-modal.vue'; |
| | | |
| | | /** ERP éè´ç³è¯·å表 */ |
| | | defineOptions({ name: 'ErpPurchaseRequest' }); |
| | | |
| | | const router = useRouter(); |
| | | const userStore = useUserStore(); |
| | | |
| | | /** å½åä¸å¡ç±»åç审æ¹äººç¼å·éåï¼ç¨äºå¤ææ¯å¦å±ç¤ºå®¡æ ¸æé® */ |
| | | const approverIds = ref<number[]>([]); |
| | | /** å½åç»å½ç¨æ·ç¼å· */ |
| | | const currentUserId = userStore.userInfo?.id; |
| | | |
| | | const [FormModal, formModalApi] = useVbenModal({ |
| | | connectedComponent: Form, |
| | |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | const [ProcessModal, processModalApi] = useVbenModal({ |
| | | connectedComponent: ProcessSelectModal, |
| | | const [AuditModalComp, auditModalApi] = useVbenModal({ |
| | | connectedComponent: AuditModal, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** å·æ°è¡¨æ ¼ */ |
| | | /** å·æ°è¡¨æ ¼ã审æ¹äººéå */ |
| | | function handleRefresh() { |
| | | gridApi.query(); |
| | | loadApproverIds(); |
| | | } |
| | | |
| | | /** å è½½å½åä¸å¡ç±»åç审æ¹äººç¼å·éå */ |
| | | async function loadApproverIds() { |
| | | try { |
| | | approverIds.value = (await getPurchaseRequestApproverUserIds()) ?? []; |
| | | } catch { |
| | | approverIds.value = []; |
| | | } |
| | | } |
| | | |
| | | /** å½åç¨æ·æ¯å¦ä¸ºè¯¥ä¸å¡ç±»åç审æ¹äººï¼ä¸åæ®å¤äºå®¡æ¹ä¸ */ |
| | | function canAudit(row: ErpPurchaseRequestApi.PurchaseRequest) { |
| | | return ( |
| | | row.status === 10 && approverIds.value.includes(currentUserId as number) |
| | | ); |
| | | } |
| | | |
| | | /** 导åºè¡¨æ ¼ */ |
| | |
| | | } |
| | | } |
| | | |
| | | /** æäº¤å®¡æ¹ - å
è·åæµç¨å表 */ |
| | | /** æäº¤å®¡æ ¸ - å端æå®¡æ¹é
ç½®æ ¡éªå®¡æ¹äººï¼æ éåç«¯éæ©æµç¨ */ |
| | | async function handleSubmit(row: ErpPurchaseRequestApi.PurchaseRequest) { |
| | | const hideLoading = message.loading({ |
| | | content: 'è·åå®¡æ¹æµç¨...', |
| | | content: 'æ£å¨æäº¤å®¡æ ¸...', |
| | | duration: 0, |
| | | }); |
| | | try { |
| | | const processList = await getApproveProcessList(row.id!); |
| | | hideLoading(); |
| | | if (!processList || processList.length === 0) { |
| | | message.warning('ææ å¯ç¨å®¡æ¹æµç¨ï¼è¯·å
é
ç½® BPM æµç¨'); |
| | | return; |
| | | } |
| | | // æå¼æµç¨éæ©å¼¹çª |
| | | processModalApi.setData({ id: row.id, processList }).open(); |
| | | } catch { |
| | | await submitPurchaseRequest(row.id!); |
| | | message.success('æäº¤æåï¼çå¾
审æ¹äººå®¡æ ¸'); |
| | | handleRefresh(); |
| | | } finally { |
| | | hideLoading(); |
| | | } |
| | | } |
| | | |
| | | /** å®¡æ ¸ - éè¿ / ä¸éè¿ */ |
| | | function handleAudit(row: ErpPurchaseRequestApi.PurchaseRequest, pass: boolean) { |
| | | auditModalApi.setData({ pass, row }).open(); |
| | | } |
| | | |
| | | /** çæéè´è®¢å */ |
| | |
| | | formModalApi.setData({ formType: 'detail', id: row.id }).open(); |
| | | } |
| | | |
| | | /** æ¥ç审æ¹è¯¦æ
*/ |
| | | /** æ¥ç审æ¹è®°å½ - è½»é级审æ¹ä¸å跳转 BPM æµç¨è¯¦æ
*/ |
| | | function handleViewProcess(row: ErpPurchaseRequestApi.PurchaseRequest) { |
| | | if (!row.processInstanceId) { |
| | | message.warning('该ç³è¯·å°æªæäº¤å®¡æ¹'); |
| | | const parts: string[] = []; |
| | | if (row.reviewerName) { |
| | | parts.push(`å®¡æ ¸äººï¼${row.reviewerName}`); |
| | | } |
| | | if (row.reviewTime) { |
| | | parts.push(`å®¡æ ¸æ¶é´ï¼${row.reviewTime}`); |
| | | } |
| | | if (row.reviewRemark) { |
| | | parts.push( |
| | | `${row.status === 30 ? 'ä¸éè¿åå ' : 'å®¡æ ¸æè§'}ï¼${row.reviewRemark}`, |
| | | ); |
| | | } |
| | | if (parts.length === 0) { |
| | | message.info('该ç³è¯·ææ å®¡æ ¸è®°å½'); |
| | | return; |
| | | } |
| | | router.push({ name: 'BpmProcessInstanceDetail', query: { id: row.processInstanceId } }); |
| | | message.info(parts.join('ã')); |
| | | } |
| | | |
| | | /** æ¥çéè´è®¢å */ |
| | |
| | | checkboxChange: handleRowCheckboxChange, |
| | | }, |
| | | }); |
| | | |
| | | onMounted(() => { |
| | | loadApproverIds(); |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Page auto-content-height> |
| | | <FormModal @success="handleRefresh" /> |
| | | <OrderFormModal @success="handleRefresh" /> |
| | | <ProcessModal @success="handleRefresh" /> |
| | | <AuditModalComp @success="handleRefresh" /> |
| | | <Grid table-title="éè´ç³è¯·å表"> |
| | | <template #toolbar-tools> |
| | | <TableAction |
| | |
| | | { |
| | | label: 'æäº¤', |
| | | type: 'link', |
| | | auth: ['erp:purchase-request:submit'], |
| | | // æªæäº¤ä¸å®¡æ ¸ä¸éè¿åå¯æäº¤ï¼å®¡æ ¸ä¸éè¿éä¿®æ¹åéæ°æäº¤ |
| | | ifShow: () => row.status === 0 || row.status === 30, |
| | | onClick: handleSubmit.bind(null, row), |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸', |
| | | type: 'link', |
| | | icon: ACTION_ICON.AUDIT, |
| | | auth: ['erp:purchase-request:audit'], |
| | | // ä»
ã审æ¹ä¸ + å½åç»å½ç¨æ·æ¯å®¡æ¹äººãææ¾ç¤ºï¼å
¶ä»äººçä¸å°è¯¥æé® |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, true), |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸ä¸éè¿', |
| | | type: 'link', |
| | | danger: true, |
| | | icon: ACTION_ICON.AUDIT, |
| | | auth: ['erp:purchase-request:audit'], |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, false), |
| | | }, |
| | | { |
| | | label: 'çæè®¢å', |
| | |
| | | { |
| | | label: 'æ¥ç审æ¹', |
| | | type: 'link', |
| | | ifShow: () => row.status !== 0, |
| | | ifShow: () => row.status === 20 || row.status === 30, |
| | | onClick: handleViewProcess.bind(null, row), |
| | | }, |
| | | { |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { VbenFormSchema } from '#/adapter/form'; |
| | | import type { ErpPurchaseRequestApi } from '#/api/erp/purchase/request'; |
| | | |
| | | import { computed, ref } from 'vue'; |
| | | |
| | | import { useVbenModal } from '@vben/common-ui'; |
| | | |
| | | import { message } from 'ant-design-vue'; |
| | | |
| | | import { useVbenForm } from '#/adapter/form'; |
| | | import { auditPurchaseRequest } from '#/api/erp/purchase/request'; |
| | | |
| | | const emit = defineEmits(['success']); |
| | | |
| | | const pass = ref(true); // true=å®¡æ ¸éè¿ / false=å®¡æ ¸ä¸éè¿ |
| | | const rowData = ref<ErpPurchaseRequestApi.PurchaseRequest>(); |
| | | const getTitle = computed(() => (pass.value ? 'å®¡æ ¸éè¿' : 'å®¡æ ¸ä¸éè¿')); |
| | | |
| | | const [Form, formApi] = useVbenForm({ |
| | | commonConfig: { |
| | | componentProps: { |
| | | class: 'w-full', |
| | | }, |
| | | formItemClass: 'col-span-1', |
| | | labelWidth: 130, |
| | | }, |
| | | wrapperClass: 'grid-cols-1', |
| | | layout: 'horizontal', |
| | | schema: [], |
| | | showDefaultActions: false, |
| | | }); |
| | | |
| | | /** å®¡æ ¸è¡¨ååæ®µï¼ä¸éè¿æ¶å¿
须填ååå */ |
| | | function useAuditSchema(): VbenFormSchema[] { |
| | | return [ |
| | | { |
| | | fieldName: 'reviewRemark', |
| | | label: 'å®¡æ ¸æè§', |
| | | component: 'Textarea', |
| | | formItemClass: 'col-span-1', |
| | | componentProps: { |
| | | rows: 3, |
| | | placeholder: pass.value |
| | | ? '请è¾å
¥å®¡æ ¸æè§ï¼å¯éï¼' |
| | | : '请è¾å
¥ä¸éè¿åå ï¼å¿
å¡«ï¼', |
| | | }, |
| | | rules: pass.value ? '' : 'required', |
| | | }, |
| | | ]; |
| | | } |
| | | |
| | | const [Modal, modalApi] = useVbenModal({ |
| | | async onConfirm() { |
| | | const { valid } = await formApi.validate(); |
| | | if (!valid) { |
| | | return; |
| | | } |
| | | modalApi.lock(); |
| | | const values = await formApi.getValues(); |
| | | try { |
| | | await auditPurchaseRequest( |
| | | rowData.value!.id!, |
| | | pass.value, |
| | | values.reviewRemark, |
| | | ); |
| | | await modalApi.close(); |
| | | emit('success'); |
| | | message.success(pass.value ? 'å®¡æ ¸éè¿' : 'å·²éåï¼å¯ä¿®æ¹åéæ°æäº¤'); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | | }, |
| | | async onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { |
| | | rowData.value = undefined; |
| | | return; |
| | | } |
| | | const data = modalApi.getData<{ |
| | | pass: boolean; |
| | | row: ErpPurchaseRequestApi.PurchaseRequest; |
| | | }>(); |
| | | rowData.value = data.row; |
| | | pass.value = data.pass; |
| | | formApi.setState({ schema: useAuditSchema() }); |
| | | formApi.resetForm(); |
| | | }, |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Modal :title="getTitle" class="w-2/5"> |
| | | <div v-if="rowData" class="mx-4 mb-4 text-sm text-gray-600"> |
| | | <div>ç³è¯·åå·ï¼{{ rowData.no }}</div> |
| | | <div>ç³è¯·äººï¼{{ rowData.requestUserName || '-' }}</div> |
| | | </div> |
| | | <Form class="mx-4" /> |
| | | </Modal> |
| | | </template> |
| | |
| | | import { ref } from 'vue'; |
| | | |
| | | import { Page, useVbenModal } from '#/packages/effects/common-ui/src'; |
| | | import { useUserStore } from '@vben/stores'; |
| | | |
| | | import { message, Modal, Select } from 'ant-design-vue'; |
| | | import { message } from 'ant-design-vue'; |
| | | |
| | | import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; |
| | | import { |
| | | getAttendanceExceptionApproveProcessList, |
| | | getAttendanceExceptionApproverIds, |
| | | getAttendanceExceptionPage, |
| | | submitAttendanceException, |
| | | } from '#/api/hrm/attendance/exception'; |
| | | import { $t } from '#/locales'; |
| | | |
| | | import { useGridColumns, useGridFormSchema } from './data'; |
| | | import AuditModal from './modules/audit-modal.vue'; |
| | | import Form from './modules/form.vue'; |
| | | |
| | | const userStore = useUserStore(); |
| | | const currentUserId = userStore.userInfo?.id; // å½åç»å½ç¨æ· IDï¼ç¨äºå®¡æ¹äººæé夿 |
| | | |
| | | /** 审æ¹é
ç½®ä¸è¯¥ä¸å¡ç审æ¹äººç¼å·éåï¼å³å®ãå®¡æ ¸ / å®¡æ ¸ä¸éè¿ãæé®æ¯å¦å±ç¤º */ |
| | | const approverIds = ref<number[]>([]); |
| | | |
| | | /** æå审æ¹äººéåï¼å¤±è´¥æ¶ä¿æä¸ºç©ºï¼æé®ä¸å±ç¤ºï¼ï¼ä¸é»æå表å è½½ */ |
| | | async function loadApproverIds() { |
| | | try { |
| | | approverIds.value = (await getAttendanceExceptionApproverIds()) ?? []; |
| | | } catch { |
| | | approverIds.value = []; |
| | | } |
| | | } |
| | | |
| | | /** å½åç»å½ç¨æ·æ¯å¦ä¸ºè¯¥ä¸å¡ç审æ¹äººï¼ä¸ç³è¯·å¤äºå®¡æ¹ä¸ï¼10ï¼ */ |
| | | function canAudit(row: HrmAttendanceExceptionApi.AttendanceException) { |
| | | return ( |
| | | row.status === 10 && |
| | | !!currentUserId && |
| | | approverIds.value.includes(currentUserId) |
| | | ); |
| | | } |
| | | |
| | | const [FormModal, formModalApi] = useVbenModal({ |
| | | connectedComponent: Form, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** å·æ°è¡¨æ ¼ */ |
| | | const [AuditModalComp, auditModalApi] = useVbenModal({ |
| | | connectedComponent: AuditModal, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** å·æ°è¡¨æ ¼ä¸å®¡æ¹äººéå */ |
| | | function handleRefresh() { |
| | | gridApi.query(); |
| | | loadApproverIds(); |
| | | } |
| | | |
| | | /** å建èå¤å¼å¸¸ç³è¯· */ |
| | |
| | | formModalApi.setData({ id: row.id, formType: 'detail' }).open(); |
| | | } |
| | | |
| | | /** æäº¤å®¡æ¹å¼¹çª */ |
| | | const submitModalVisible = ref(false); |
| | | const currentRow = ref<HrmAttendanceExceptionApi.AttendanceException>(); |
| | | const processList = ref<HrmAttendanceExceptionApi.ApproveProcess[]>([]); |
| | | const selectedProcessKey = ref<string>(); |
| | | const submitLoading = ref(false); |
| | | |
| | | /** æäº¤èå¤å¼å¸¸ç³è¯· */ |
| | | /** æäº¤å®¡æ¹ - 审æ¹äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãç»ä¸æå®ï¼æ¤å¤æ ééæ© */ |
| | | async function handleSubmit(row: HrmAttendanceExceptionApi.AttendanceException) { |
| | | const res = await getAttendanceExceptionApproveProcessList(); |
| | | processList.value = res; |
| | | currentRow.value = row; |
| | | selectedProcessKey.value = undefined; |
| | | submitModalVisible.value = true; |
| | | } |
| | | |
| | | /** 确认æäº¤ */ |
| | | async function confirmSubmit() { |
| | | if (!selectedProcessKey.value) { |
| | | message.warning('è¯·éæ©å®¡æ¹æµç¨'); |
| | | return; |
| | | } |
| | | submitLoading.value = true; |
| | | const hideLoading = message.loading({ |
| | | content: 'æ£å¨æäº¤å®¡æ¹...', |
| | | duration: 0, |
| | | }); |
| | | try { |
| | | await submitAttendanceException(currentRow.value!.id!, selectedProcessKey.value); |
| | | await submitAttendanceException(row.id!); |
| | | message.success('æäº¤å®¡æ¹æå'); |
| | | submitModalVisible.value = false; |
| | | handleRefresh(); |
| | | } finally { |
| | | submitLoading.value = false; |
| | | hideLoading(); |
| | | } |
| | | } |
| | | |
| | | /** å®¡æ ¸ - éè¿ / ä¸éè¿ */ |
| | | function handleAudit( |
| | | row: HrmAttendanceExceptionApi.AttendanceException, |
| | | pass: boolean, |
| | | ) { |
| | | auditModalApi.setData({ pass, row }).open(); |
| | | } |
| | | |
| | | const [Grid, gridApi] = useVbenVxeGrid({ |
| | |
| | | }, |
| | | } as VxeTableGridOptions<HrmAttendanceExceptionApi.AttendanceException>, |
| | | }); |
| | | |
| | | // è¿å
¥é¡µé¢å³æå审æ¹äººéåï¼ç¨äºæ§å¶å®¡æ ¸æé®æ¾é |
| | | loadApproverIds(); |
| | | </script> |
| | | |
| | | <template> |
| | | <Page auto-content-height> |
| | | <FormModal @success="handleRefresh" /> |
| | | <AuditModalComp @success="handleRefresh" /> |
| | | <Grid table-title="èå¤å¼å¸¸ç³è¯·å表"> |
| | | <template #toolbar-tools> |
| | | <TableAction |
| | |
| | | onClick: handleDetail.bind(null, row), |
| | | }, |
| | | { |
| | | label: 'æäº¤', |
| | | label: 'æäº¤å®¡æ¹', |
| | | type: 'link', |
| | | auth: ['hrm:attendance-exception:submit'], |
| | | ifShow: row.status === 0, |
| | | onClick: handleSubmit.bind(null, row), |
| | | // 审æ¹äººç±å®¡æ¹é
ç½®ç»ä¸æå®ï¼æäº¤åä»
äºæ¬¡ç¡®è®¤ï¼ä¸åå¼¹éæµç¨æ¡ |
| | | popConfirm: { |
| | | title: '确认æäº¤å®¡æ¹ï¼æäº¤åç±å®¡æ¹é
ç½®ä¸æå®ç审æ¹äººå¤çã', |
| | | confirm: handleSubmit.bind(null, row), |
| | | }, |
| | | // è稿(0) ä¸ å®¡æ ¸ä¸éè¿(30) åå¯æäº¤ï¼åè
éä¿®æ¹åéæ°æäº¤ |
| | | ifShow: row.status === 0 || row.status === 30, |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸', |
| | | type: 'link', |
| | | icon: ACTION_ICON.AUDIT, |
| | | auth: ['hrm:attendance-exception:audit'], |
| | | // ä»
ã审æ¹ä¸ + å½åç»å½ç¨æ·å¨å®¡æ¹é
ç½®ç审æ¹äººååå
ãææ¾ç¤º |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, true), |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸ä¸éè¿', |
| | | type: 'link', |
| | | danger: true, |
| | | auth: ['hrm:attendance-exception:audit'], |
| | | // åä¸ï¼ä¸ãå®¡æ ¸ãæå¯¹åºç° |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, false), |
| | | }, |
| | | ]" |
| | | /> |
| | | </template> |
| | | </Grid> |
| | | |
| | | <!-- æäº¤å®¡æ¹å¼¹çª --> |
| | | <Modal |
| | | v-model:open="submitModalVisible" |
| | | title="éæ©å®¡æ¹æµç¨" |
| | | width="400px" |
| | | @ok="confirmSubmit" |
| | | :confirmLoading="submitLoading" |
| | | > |
| | | <Select |
| | | v-model:value="selectedProcessKey" |
| | | placeholder="è¯·éæ©å®¡æ¹æµç¨" |
| | | class="w-full" |
| | | > |
| | | <Select.Option |
| | | v-for="item in processList" |
| | | :key="item.key" |
| | | :value="item.key" |
| | | > |
| | | {{ item.name }} |
| | | </Select.Option> |
| | | </Select> |
| | | </Modal> |
| | | </Page> |
| | | </template> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { VbenFormSchema } from '#/adapter/form'; |
| | | import type { HrmAttendanceExceptionApi } from '#/api/hrm/attendance/exception'; |
| | | |
| | | import { computed, ref } from 'vue'; |
| | | |
| | | import { useVbenModal } from '#/packages/effects/common-ui/src'; |
| | | |
| | | import { message } from 'ant-design-vue'; |
| | | |
| | | import { useVbenForm } from '#/adapter/form'; |
| | | import { auditAttendanceException } from '#/api/hrm/attendance/exception'; |
| | | |
| | | const emit = defineEmits(['success']); |
| | | |
| | | const pass = ref(true); // true=å®¡æ ¸éè¿ / false=å®¡æ ¸ä¸éè¿ |
| | | const rowData = ref<HrmAttendanceExceptionApi.AttendanceException>(); |
| | | const getTitle = computed(() => (pass.value ? 'å®¡æ ¸éè¿' : 'å®¡æ ¸ä¸éè¿')); |
| | | |
| | | const [Form, formApi] = useVbenForm({ |
| | | commonConfig: { |
| | | componentProps: { |
| | | class: 'w-full', |
| | | }, |
| | | formItemClass: 'col-span-1', |
| | | labelWidth: 90, |
| | | }, |
| | | wrapperClass: 'grid-cols-1', |
| | | layout: 'horizontal', |
| | | schema: [], |
| | | showDefaultActions: false, |
| | | }); |
| | | |
| | | /** å®¡æ ¸è¡¨ååæ®µï¼ä¸éè¿æ¶å¿
须填ååå */ |
| | | function useAuditSchema(): VbenFormSchema[] { |
| | | return [ |
| | | { |
| | | fieldName: 'reviewRemark', |
| | | label: 'å®¡æ ¸æè§', |
| | | component: 'Textarea', |
| | | formItemClass: 'col-span-1', |
| | | componentProps: { |
| | | rows: 3, |
| | | placeholder: pass.value |
| | | ? '请è¾å
¥å®¡æ ¸æè§ï¼å¯éï¼' |
| | | : '请è¾å
¥ä¸éè¿åå ï¼å¿
å¡«ï¼', |
| | | }, |
| | | rules: pass.value ? '' : 'required', |
| | | }, |
| | | ]; |
| | | } |
| | | |
| | | const [Modal, modalApi] = useVbenModal({ |
| | | async onConfirm() { |
| | | const { valid } = await formApi.validate(); |
| | | if (!valid) { |
| | | return; |
| | | } |
| | | modalApi.lock(); |
| | | const values = await formApi.getValues(); |
| | | try { |
| | | await auditAttendanceException( |
| | | rowData.value!.id!, |
| | | pass.value, |
| | | values.reviewRemark, |
| | | ); |
| | | await modalApi.close(); |
| | | emit('success'); |
| | | message.success(pass.value ? 'å®¡æ ¸éè¿' : 'å·²éåï¼å¯ä¿®æ¹åéæ°æäº¤'); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | | }, |
| | | async onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { |
| | | rowData.value = undefined; |
| | | return; |
| | | } |
| | | const data = modalApi.getData<{ |
| | | pass: boolean; |
| | | row: HrmAttendanceExceptionApi.AttendanceException; |
| | | }>(); |
| | | rowData.value = data.row; |
| | | pass.value = data.pass; |
| | | formApi.setState({ schema: useAuditSchema() }); |
| | | formApi.resetForm(); |
| | | }, |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Modal :title="getTitle" class="w-2/5"> |
| | | <div v-if="rowData" class="mx-4 mb-4 text-sm text-gray-600"> |
| | | <div>ç³è¯·äººï¼{{ rowData.userName }}</div> |
| | | <div>æå±é¨é¨ï¼{{ rowData.deptName }}</div> |
| | | <div>å¼å¸¸æ¥æï¼{{ rowData.exceptionDate }}</div> |
| | | <div>å¼å¸¸ç±»åï¼{{ rowData.exceptionTypeName }}</div> |
| | | <div>ç³è¯·åå ï¼{{ rowData.reason }}</div> |
| | | </div> |
| | | <Form class="mx-4" /> |
| | | </Modal> |
| | | </template> |
| | |
| | | import type { VxeTableGridOptions } from '#/adapter/vxe-table'; |
| | | import type { HrmLeaveApi } from '#/api/hrm/leave'; |
| | | |
| | | import { ref } from 'vue'; |
| | | |
| | | import { Page, useVbenModal } from '#/packages/effects/common-ui/src'; |
| | | import { useUserStore } from '@vben/stores'; |
| | | |
| | | import { message, Tag } from 'ant-design-vue'; |
| | | |
| | |
| | | import { |
| | | cancelLeave, |
| | | deleteLeave, |
| | | getLeaveApproverIds, |
| | | getLeavePage, |
| | | submitLeave, |
| | | } from '#/api/hrm/leave'; |
| | | import { $t } from '#/locales'; |
| | | |
| | | import { useGridColumns, useGridFormSchema } from './data'; |
| | | import AuditModal from './modules/audit-modal.vue'; |
| | | import Form from './modules/form.vue'; |
| | | |
| | | const userStore = useUserStore(); |
| | | const currentUserId = userStore.userInfo?.id; // å½åç»å½ç¨æ· IDï¼ç¨äºå®¡æ¹äººæé夿 |
| | | |
| | | /** 审æ¹é
ç½®ä¸è¯¥ä¸å¡ç审æ¹äººç¼å·éåï¼å³å®ãå®¡æ ¸ / å®¡æ ¸ä¸éè¿ãæé®æ¯å¦å±ç¤º */ |
| | | const approverIds = ref<number[]>([]); |
| | | |
| | | /** æå审æ¹äººéåï¼å¤±è´¥æ¶ä¿æä¸ºç©ºï¼æé®ä¸å±ç¤ºï¼ï¼ä¸é»æå表å è½½ */ |
| | | async function loadApproverIds() { |
| | | try { |
| | | approverIds.value = (await getLeaveApproverIds()) ?? []; |
| | | } catch { |
| | | approverIds.value = []; |
| | | } |
| | | } |
| | | |
| | | /** å½åç»å½ç¨æ·æ¯å¦ä¸ºè¯¥ä¸å¡ç审æ¹äººï¼ä¸ç³è¯·å¤äºå®¡æ¹ä¸ï¼10ï¼ */ |
| | | function canAudit(row: HrmLeaveApi.Leave) { |
| | | return ( |
| | | row.status === 10 && |
| | | !!currentUserId && |
| | | approverIds.value.includes(currentUserId) |
| | | ); |
| | | } |
| | | |
| | | const [FormModal, formModalApi] = useVbenModal({ |
| | | connectedComponent: Form, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** å·æ°è¡¨æ ¼ */ |
| | | const [AuditModalComp, auditModalApi] = useVbenModal({ |
| | | connectedComponent: AuditModal, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** å·æ°è¡¨æ ¼ä¸å®¡æ¹äººéå */ |
| | | function handleRefresh() { |
| | | gridApi.query(); |
| | | loadApproverIds(); |
| | | } |
| | | |
| | | /** å建请åç³è¯· */ |
| | |
| | | } |
| | | } |
| | | |
| | | /** æäº¤è¯·åç³è¯· */ |
| | | /** æäº¤å®¡æ¹ - 审æ¹äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãç»ä¸æå®ï¼æ¤å¤æ ééæ© */ |
| | | async function handleSubmit(row: HrmLeaveApi.Leave) { |
| | | const hideLoading = message.loading({ |
| | | content: 'æ£å¨æäº¤å®¡æ¹...', |
| | | duration: 0, |
| | | }); |
| | | try { |
| | | await submitLeave(row.id!); |
| | | message.success('æäº¤æå'); |
| | | message.success('æäº¤å®¡æ¹æå'); |
| | | handleRefresh(); |
| | | } finally { |
| | | hideLoading(); |
| | | } |
| | | } |
| | | |
| | | /** å®¡æ ¸ - éè¿ / ä¸éè¿ */ |
| | | function handleAudit(row: HrmLeaveApi.Leave, pass: boolean) { |
| | | auditModalApi.setData({ pass, row }).open(); |
| | | } |
| | | |
| | | /** æ¤é请åç³è¯· */ |
| | |
| | | }, |
| | | } as VxeTableGridOptions<HrmLeaveApi.Leave>, |
| | | }); |
| | | |
| | | // è¿å
¥é¡µé¢å³æå审æ¹äººéåï¼ç¨äºæ§å¶å®¡æ ¸æé®æ¾é |
| | | loadApproverIds(); |
| | | </script> |
| | | |
| | | <template> |
| | | <Page auto-content-height> |
| | | <FormModal @success="handleRefresh" /> |
| | | <AuditModalComp @success="handleRefresh" /> |
| | | <Grid table-title="请åç³è¯·å表"> |
| | | <template #toolbar-tools> |
| | | <TableAction |
| | |
| | | onClick: handleEdit.bind(null, row), |
| | | }, |
| | | { |
| | | label: 'æäº¤', |
| | | label: 'æäº¤å®¡æ¹', |
| | | type: 'link', |
| | | auth: ['hrm:leave:submit'], |
| | | ifShow: row.status === 0, |
| | | onClick: handleSubmit.bind(null, row), |
| | | auth: ['hrm:leave:update'], |
| | | // 审æ¹äººç±å®¡æ¹é
ç½®ç»ä¸æå®ï¼æäº¤åä»
äºæ¬¡ç¡®è®¤ï¼ä¸åå¼¹éæµç¨æ¡ |
| | | popConfirm: { |
| | | title: '确认æäº¤å®¡æ¹ï¼æäº¤åç±å®¡æ¹é
ç½®ä¸æå®ç审æ¹äººå¤çã', |
| | | confirm: handleSubmit.bind(null, row), |
| | | }, |
| | | // è稿(0) ä¸ å®¡æ ¸ä¸éè¿(30) åå¯æäº¤ï¼åè
éä¿®æ¹åéæ°æäº¤ |
| | | ifShow: row.status === 0 || row.status === 30, |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸', |
| | | type: 'link', |
| | | icon: ACTION_ICON.AUDIT, |
| | | auth: ['hrm:leave:audit'], |
| | | // ä»
ã审æ¹ä¸ + å½åç»å½ç¨æ·å¨å®¡æ¹é
ç½®ç审æ¹äººååå
ãææ¾ç¤º |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, true), |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸ä¸éè¿', |
| | | type: 'link', |
| | | danger: true, |
| | | auth: ['hrm:leave:audit'], |
| | | // åä¸ï¼ä¸ãå®¡æ ¸ãæå¯¹åºç° |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, false), |
| | | }, |
| | | { |
| | | label: 'æ¤é', |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { VbenFormSchema } from '#/adapter/form'; |
| | | import type { HrmLeaveApi } from '#/api/hrm/leave'; |
| | | |
| | | import { computed, ref } from 'vue'; |
| | | |
| | | import { useVbenModal } from '#/packages/effects/common-ui/src'; |
| | | |
| | | import { message } from 'ant-design-vue'; |
| | | |
| | | import { useVbenForm } from '#/adapter/form'; |
| | | import { auditLeave } from '#/api/hrm/leave'; |
| | | |
| | | const emit = defineEmits(['success']); |
| | | |
| | | const pass = ref(true); // true=å®¡æ ¸éè¿ / false=å®¡æ ¸ä¸éè¿ |
| | | const rowData = ref<HrmLeaveApi.Leave>(); |
| | | const getTitle = computed(() => (pass.value ? 'å®¡æ ¸éè¿' : 'å®¡æ ¸ä¸éè¿')); |
| | | |
| | | const [Form, formApi] = useVbenForm({ |
| | | commonConfig: { |
| | | componentProps: { |
| | | class: 'w-full', |
| | | }, |
| | | formItemClass: 'col-span-1', |
| | | labelWidth: 90, |
| | | }, |
| | | wrapperClass: 'grid-cols-1', |
| | | layout: 'horizontal', |
| | | schema: [], |
| | | showDefaultActions: false, |
| | | }); |
| | | |
| | | /** å®¡æ ¸è¡¨ååæ®µï¼ä¸éè¿æ¶å¿
须填ååå */ |
| | | function useAuditSchema(): VbenFormSchema[] { |
| | | return [ |
| | | { |
| | | fieldName: 'reviewRemark', |
| | | label: 'å®¡æ ¸æè§', |
| | | component: 'Textarea', |
| | | formItemClass: 'col-span-1', |
| | | componentProps: { |
| | | rows: 3, |
| | | placeholder: pass.value |
| | | ? '请è¾å
¥å®¡æ ¸æè§ï¼å¯éï¼' |
| | | : '请è¾å
¥ä¸éè¿åå ï¼å¿
å¡«ï¼', |
| | | }, |
| | | rules: pass.value ? '' : 'required', |
| | | }, |
| | | ]; |
| | | } |
| | | |
| | | const [Modal, modalApi] = useVbenModal({ |
| | | async onConfirm() { |
| | | const { valid } = await formApi.validate(); |
| | | if (!valid) { |
| | | return; |
| | | } |
| | | modalApi.lock(); |
| | | const values = await formApi.getValues(); |
| | | try { |
| | | await auditLeave(rowData.value!.id!, pass.value, values.reviewRemark); |
| | | await modalApi.close(); |
| | | emit('success'); |
| | | message.success(pass.value ? 'å®¡æ ¸éè¿' : 'å·²éåï¼å¯ä¿®æ¹åéæ°æäº¤'); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | | }, |
| | | async onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { |
| | | rowData.value = undefined; |
| | | return; |
| | | } |
| | | const data = modalApi.getData<{ |
| | | pass: boolean; |
| | | row: HrmLeaveApi.Leave; |
| | | }>(); |
| | | rowData.value = data.row; |
| | | pass.value = data.pass; |
| | | formApi.setState({ schema: useAuditSchema() }); |
| | | formApi.resetForm(); |
| | | }, |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Modal :title="getTitle" class="w-2/5"> |
| | | <div v-if="rowData" class="mx-4 mb-4 text-sm text-gray-600"> |
| | | <div>ç³è¯·äººï¼{{ rowData.employeeName }}</div> |
| | | <div>æå±é¨é¨ï¼{{ rowData.deptName }}</div> |
| | | <div>å¼å§æ¶é´ï¼{{ rowData.startTime }}</div> |
| | | <div>ç»ææ¶é´ï¼{{ rowData.endTime }}</div> |
| | | <div>è¯·åæ¶é¿ï¼{{ rowData.duration }} 天</div> |
| | | </div> |
| | | <Form class="mx-4" /> |
| | | </Modal> |
| | | </template> |
| | |
| | | import type { HrmPerformanceAppraiseApi } from '#/api/hrm/performance-appraise'; |
| | | |
| | | import { ref } from 'vue'; |
| | | import { useRouter } from 'vue-router'; |
| | | |
| | | import { Page, useVbenModal } from '@vben/common-ui'; |
| | | import { useUserStore } from '@vben/stores'; |
| | | import { isEmpty } from '@vben/utils'; |
| | | |
| | | import { message, Tag } from 'ant-design-vue'; |
| | |
| | | import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; |
| | | import { |
| | | deleteAppraise, |
| | | getAppraiseApproverIds, |
| | | getAppraisePage, |
| | | getAppraiseProcessList, |
| | | submitAppraise, |
| | | } from '#/api/hrm/performance-appraise'; |
| | | import { $t } from '#/locales'; |
| | | |
| | |
| | | import AuditModal from './modules/audit-modal.vue'; |
| | | import Form from './modules/form.vue'; |
| | | import ItemModal from './modules/item.vue'; |
| | | import ProcessSelectModal from './modules/process-select-modal.vue'; |
| | | import ResultModal from './modules/result.vue'; |
| | | import ScoreModal from './modules/score.vue'; |
| | | |
| | | /** HRM 绩æèæ ¸æ¹æ¡å表 */ |
| | | defineOptions({ name: 'HrmPerformanceAppraise' }); |
| | | |
| | | const router = useRouter(); |
| | | const userStore = useUserStore(); |
| | | const currentUserId = userStore.userInfo?.id; // å½åç»å½ç¨æ· IDï¼ç¨äºå®¡æ¹äººæé夿 |
| | | |
| | | /** 审æ¹é
ç½®ä¸è¯¥ä¸å¡ç审æ¹äººç¼å·éåï¼å³å®ãå®¡æ ¸ / å®¡æ ¸ä¸éè¿ãæé®æ¯å¦å±ç¤º */ |
| | | const approverIds = ref<number[]>([]); |
| | | |
| | | /** æå审æ¹äººéåï¼å¤±è´¥æ¶ä¿æä¸ºç©ºï¼æé®ä¸å±ç¤ºï¼ï¼ä¸é»æå表å è½½ */ |
| | | async function loadApproverIds() { |
| | | try { |
| | | approverIds.value = (await getAppraiseApproverIds()) ?? []; |
| | | } catch { |
| | | approverIds.value = []; |
| | | } |
| | | } |
| | | |
| | | /** å½åç»å½ç¨æ·æ¯å¦ä¸ºè¯¥ä¸å¡ç审æ¹äººï¼ä¸æ¹æ¡å¤äºå®¡æ¹ä¸ï¼10ï¼ */ |
| | | function canAudit(row: HrmPerformanceAppraiseApi.Appraise) { |
| | | return ( |
| | | row.auditStatus === AUDIT_STATUS.PROCESS && |
| | | !!currentUserId && |
| | | approverIds.value.includes(currentUserId) |
| | | ); |
| | | } |
| | | |
| | | const [FormModal, formModalApi] = useVbenModal({ |
| | | connectedComponent: Form, |
| | |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | const [ProcessModal, processModalApi] = useVbenModal({ |
| | | connectedComponent: ProcessSelectModal, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | const [AuditFormModal, auditModalApi] = useVbenModal({ |
| | | connectedComponent: AuditModal, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** å·æ°è¡¨æ ¼ä¸å®¡æ¹äººéå */ |
| | | function handleRefresh() { |
| | | gridApi.query(); |
| | | loadApproverIds(); |
| | | } |
| | | |
| | | function handleCreate() { |
| | |
| | | } |
| | | } |
| | | |
| | | /** æäº¤å®¡æ¹ - å
è·åæµç¨å表 */ |
| | | /** æäº¤å®¡æ¹ - 审æ¹äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãç»ä¸æå®ï¼æ¤å¤æ ééæ© */ |
| | | async function handleSubmit(row: HrmPerformanceAppraiseApi.Appraise) { |
| | | const hideLoading = message.loading({ |
| | | content: 'è·åå®¡æ¹æµç¨...', |
| | | content: 'æ£å¨æäº¤å®¡æ¹...', |
| | | duration: 0, |
| | | }); |
| | | try { |
| | | const processList = await getAppraiseProcessList(); |
| | | hideLoading(); |
| | | if (!processList || processList.length === 0) { |
| | | message.warning('ææ å¯ç¨å®¡æ¹æµç¨ï¼è¯·å
é
ç½® BPM æµç¨'); |
| | | return; |
| | | } |
| | | processModalApi.setData({ id: row.id, processList }).open(); |
| | | } catch { |
| | | await submitAppraise(row.id!); |
| | | message.success('æäº¤å®¡æ¹æå'); |
| | | handleRefresh(); |
| | | } finally { |
| | | hideLoading(); |
| | | } |
| | | } |
| | | |
| | | /** 审æ¹ï¼éè¿/驳åï¼ */ |
| | | function handleAudit(row: HrmPerformanceAppraiseApi.Appraise) { |
| | | auditModalApi.setData({ id: row.id }).open(); |
| | | } |
| | | |
| | | /** æ¥ç审æ¹è¯¦æ
*/ |
| | | function handleViewProcess(row: HrmPerformanceAppraiseApi.Appraise) { |
| | | if (!row.processInstanceId) { |
| | | message.warning('è¯¥æ¹æ¡å°æªæäº¤å®¡æ¹'); |
| | | return; |
| | | } |
| | | router.push({ |
| | | name: 'BpmProcessInstanceDetail', |
| | | query: { id: row.processInstanceId }, |
| | | }); |
| | | /** å®¡æ ¸ - éè¿ / ä¸éè¿ */ |
| | | function handleAudit(row: HrmPerformanceAppraiseApi.Appraise, pass: boolean) { |
| | | auditModalApi.setData({ pass, row }).open(); |
| | | } |
| | | |
| | | const checkedIds = ref<number[]>([]); |
| | |
| | | checkboxChange: handleRowCheckboxChange, |
| | | }, |
| | | }); |
| | | |
| | | // è¿å
¥é¡µé¢å³æå审æ¹äººéåï¼ç¨äºæ§å¶å®¡æ ¸æé®æ¾é |
| | | loadApproverIds(); |
| | | </script> |
| | | |
| | | <template> |
| | |
| | | <ItemFormModal @success="handleRefresh" /> |
| | | <ScoreFormModal @success="handleRefresh" /> |
| | | <ResultFormModal @success="handleRefresh" /> |
| | | <ProcessModal @success="handleRefresh" /> |
| | | <AuditFormModal @success="handleRefresh" /> |
| | | <Grid table-title="绩æèæ ¸æ¹æ¡å表"> |
| | | <template #toolbar-tools> |
| | |
| | | { |
| | | label: 'æäº¤å®¡æ¹', |
| | | type: 'link', |
| | | auth: ['hrm:performance-appraise:submit'], |
| | | auth: ['hrm:performance-appraise:update'], |
| | | // 审æ¹äººç±å®¡æ¹é
ç½®ç»ä¸æå®ï¼æäº¤åä»
äºæ¬¡ç¡®è®¤ï¼ä¸åå¼¹éæµç¨æ¡ |
| | | popConfirm: { |
| | | title: '确认æäº¤å®¡æ¹ï¼æäº¤åç±å®¡æ¹é
ç½®ä¸æå®ç审æ¹äººå¤çã', |
| | | confirm: handleSubmit.bind(null, row), |
| | | }, |
| | | // è稿(0) ä¸ å®¡æ ¸ä¸éè¿(30) åå¯æäº¤ï¼åè
éä¿®æ¹åéæ°æäº¤ |
| | | ifShow: row.auditStatus === AUDIT_STATUS.DRAFT || row.auditStatus === AUDIT_STATUS.REJECT, |
| | | onClick: handleSubmit.bind(null, row), |
| | | }, |
| | | { |
| | | label: '审æ¹', |
| | | label: 'å®¡æ ¸', |
| | | type: 'link', |
| | | icon: ACTION_ICON.AUDIT, |
| | | auth: ['hrm:performance-appraise:audit'], |
| | | ifShow: row.auditStatus === AUDIT_STATUS.PROCESS, |
| | | onClick: handleAudit.bind(null, row), |
| | | // ä»
ã审æ¹ä¸ + å½åç»å½ç¨æ·å¨å®¡æ¹é
ç½®ç审æ¹äººååå
ãææ¾ç¤º |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, true), |
| | | }, |
| | | { |
| | | label: 'æ¥ç审æ¹', |
| | | label: 'å®¡æ ¸ä¸éè¿', |
| | | type: 'link', |
| | | ifShow: row.auditStatus !== AUDIT_STATUS.DRAFT && !!row.processInstanceId, |
| | | onClick: handleViewProcess.bind(null, row), |
| | | danger: true, |
| | | auth: ['hrm:performance-appraise:audit'], |
| | | // åä¸ï¼ä¸ãå®¡æ ¸ãæå¯¹åºç° |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, false), |
| | | }, |
| | | { |
| | | label: $t('common.delete'), |
| | |
| | | <script lang="ts" setup> |
| | | import { ref } from 'vue'; |
| | | import type { VbenFormSchema } from '#/adapter/form'; |
| | | import type { HrmPerformanceAppraiseApi } from '#/api/hrm/performance-appraise'; |
| | | |
| | | import { computed, ref } from 'vue'; |
| | | |
| | | import { useVbenModal } from '@vben/common-ui'; |
| | | |
| | |
| | | |
| | | const emit = defineEmits(['success']); |
| | | |
| | | const appraiseId = ref<number>(); |
| | | const pass = ref(true); // true=å®¡æ ¸éè¿ / false=å®¡æ ¸ä¸éè¿ |
| | | const rowData = ref<HrmPerformanceAppraiseApi.Appraise>(); |
| | | const getTitle = computed(() => (pass.value ? 'å®¡æ ¸éè¿' : 'å®¡æ ¸ä¸éè¿')); |
| | | |
| | | const [Form, formApi] = useVbenForm({ |
| | | commonConfig: { |
| | | componentProps: { |
| | | class: 'w-full', |
| | | }, |
| | | labelWidth: 100, |
| | | formItemClass: 'col-span-1', |
| | | labelWidth: 90, |
| | | }, |
| | | wrapperClass: 'grid-cols-1', |
| | | layout: 'vertical', |
| | | schema: [ |
| | | { |
| | | fieldName: 'auditStatus', |
| | | label: '审æ¹ç»æ', |
| | | component: 'RadioGroup', |
| | | componentProps: { |
| | | options: [ |
| | | { label: 'éè¿', value: 20 }, |
| | | { label: '驳å', value: 30 }, |
| | | ], |
| | | }, |
| | | rules: 'selectRequired', |
| | | }, |
| | | { |
| | | fieldName: 'remark', |
| | | label: '审æ¹å¤æ³¨', |
| | | component: 'Textarea', |
| | | componentProps: { |
| | | placeholder: '请è¾å
¥å®¡æ¹å¤æ³¨', |
| | | rows: 3, |
| | | }, |
| | | }, |
| | | ], |
| | | layout: 'horizontal', |
| | | schema: [], |
| | | showDefaultActions: false, |
| | | }); |
| | | |
| | | /** å®¡æ ¸è¡¨ååæ®µï¼ä¸éè¿æ¶å¿
须填ååå */ |
| | | function useAuditSchema(): VbenFormSchema[] { |
| | | return [ |
| | | { |
| | | fieldName: 'reviewRemark', |
| | | label: 'å®¡æ ¸æè§', |
| | | component: 'Textarea', |
| | | formItemClass: 'col-span-1', |
| | | componentProps: { |
| | | rows: 3, |
| | | placeholder: pass.value |
| | | ? '请è¾å
¥å®¡æ ¸æè§ï¼å¯éï¼' |
| | | : '请è¾å
¥ä¸éè¿åå ï¼å¿
å¡«ï¼', |
| | | }, |
| | | rules: pass.value ? '' : 'required', |
| | | }, |
| | | ]; |
| | | } |
| | | |
| | | const [Modal, modalApi] = useVbenModal({ |
| | | async onConfirm() { |
| | |
| | | return; |
| | | } |
| | | modalApi.lock(); |
| | | const values = await formApi.getValues(); |
| | | try { |
| | | const values = await formApi.getValues<{ |
| | | auditStatus: number; |
| | | remark?: string; |
| | | }>(); |
| | | await auditAppraise({ |
| | | id: appraiseId.value!, |
| | | auditStatus: values.auditStatus, |
| | | remark: values.remark, |
| | | }); |
| | | await auditAppraise(rowData.value!.id!, pass.value, values.reviewRemark); |
| | | await modalApi.close(); |
| | | emit('success'); |
| | | message.success('审æ¹å®æ'); |
| | | message.success(pass.value ? 'å®¡æ ¸éè¿' : 'å·²éåï¼å¯ä¿®æ¹åéæ°æäº¤'); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | | }, |
| | | async onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { |
| | | appraiseId.value = undefined; |
| | | await formApi.resetForm(); |
| | | rowData.value = undefined; |
| | | return; |
| | | } |
| | | const data = modalApi.getData<{ id: number }>(); |
| | | appraiseId.value = data?.id; |
| | | await formApi.setValues({ auditStatus: 20 }); |
| | | const data = modalApi.getData<{ |
| | | pass: boolean; |
| | | row: HrmPerformanceAppraiseApi.Appraise; |
| | | }>(); |
| | | rowData.value = data.row; |
| | | pass.value = data.pass; |
| | | formApi.setState({ schema: useAuditSchema() }); |
| | | formApi.resetForm(); |
| | | }, |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Modal title="审æ¹ç»©æèæ ¸æ¹æ¡" class="w-1/3"> |
| | | <Form class="mx-3" /> |
| | | <Modal :title="getTitle" class="w-2/5"> |
| | | <div v-if="rowData" class="mx-4 mb-4 text-sm text-gray-600"> |
| | | <div>æ¹æ¡åç§°ï¼{{ rowData.name }}</div> |
| | | <div>èæ ¸å¨æï¼{{ rowData.period }}</div> |
| | | <div>èæ ¸ææ æ°ï¼{{ rowData.itemCount }}</div> |
| | | </div> |
| | | <Form class="mx-4" /> |
| | | </Modal> |
| | | </template> |
| | |
| | | import type { VxeTableGridOptions } from '#/adapter/vxe-table'; |
| | | import type { HrmResignationApi } from '#/api/hrm/resignation'; |
| | | |
| | | import { ref } from 'vue'; |
| | | |
| | | import { Page, useVbenModal } from '#/packages/effects/common-ui/src'; |
| | | import { useUserStore } from '@vben/stores'; |
| | | |
| | | import { message } from 'ant-design-vue'; |
| | | |
| | |
| | | import { |
| | | cancelResignation, |
| | | deleteResignation, |
| | | getResignationApproverIds, |
| | | getResignationPage, |
| | | submitResignation, |
| | | updateHandoverStatus, |
| | |
| | | import { $t } from '#/locales'; |
| | | |
| | | import { useGridColumns, useGridFormSchema } from './data'; |
| | | import AuditModal from './modules/audit-modal.vue'; |
| | | import Form from './modules/form.vue'; |
| | | |
| | | const userStore = useUserStore(); |
| | | const currentUserId = userStore.userInfo?.id; // å½åç»å½ç¨æ· IDï¼ç¨äºå®¡æ¹äººæé夿 |
| | | |
| | | /** 审æ¹é
ç½®ä¸è¯¥ä¸å¡ç审æ¹äººç¼å·éåï¼å³å®ãå®¡æ ¸ / å®¡æ ¸ä¸éè¿ãæé®æ¯å¦å±ç¤º */ |
| | | const approverIds = ref<number[]>([]); |
| | | |
| | | /** æå审æ¹äººéåï¼å¤±è´¥æ¶ä¿æä¸ºç©ºï¼æé®ä¸å±ç¤ºï¼ï¼ä¸é»æå表å è½½ */ |
| | | async function loadApproverIds() { |
| | | try { |
| | | approverIds.value = (await getResignationApproverIds()) ?? []; |
| | | } catch { |
| | | approverIds.value = []; |
| | | } |
| | | } |
| | | |
| | | /** å½åç»å½ç¨æ·æ¯å¦ä¸ºè¯¥ä¸å¡ç审æ¹äººï¼ä¸ç³è¯·å¤äºå®¡æ¹ä¸ï¼10ï¼ */ |
| | | function canAudit(row: HrmResignationApi.Resignation) { |
| | | return ( |
| | | row.status === 10 && |
| | | !!currentUserId && |
| | | approverIds.value.includes(currentUserId) |
| | | ); |
| | | } |
| | | |
| | | const [FormModal, formModalApi] = useVbenModal({ |
| | | connectedComponent: Form, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** å·æ°è¡¨æ ¼ */ |
| | | const [AuditModalComp, auditModalApi] = useVbenModal({ |
| | | connectedComponent: AuditModal, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** å·æ°è¡¨æ ¼ä¸å®¡æ¹äººéå */ |
| | | function handleRefresh() { |
| | | gridApi.query(); |
| | | loadApproverIds(); |
| | | } |
| | | |
| | | /** å建离èç³è¯· */ |
| | |
| | | } |
| | | } |
| | | |
| | | /** æäº¤ç¦»èç³è¯· */ |
| | | /** æäº¤å®¡æ¹ - 审æ¹äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãç»ä¸æå®ï¼æ¤å¤æ ééæ© */ |
| | | async function handleSubmit(row: HrmResignationApi.Resignation) { |
| | | const hideLoading = message.loading({ |
| | | content: 'æ£å¨æäº¤å®¡æ¹...', |
| | | duration: 0, |
| | | }); |
| | | try { |
| | | await submitResignation(row.id!); |
| | | message.success('æäº¤æå'); |
| | | message.success('æäº¤å®¡æ¹æå'); |
| | | handleRefresh(); |
| | | } finally { |
| | | hideLoading(); |
| | | } |
| | | } |
| | | |
| | | /** å®¡æ ¸ - éè¿ / ä¸éè¿ */ |
| | | function handleAudit(row: HrmResignationApi.Resignation, pass: boolean) { |
| | | auditModalApi.setData({ pass, row }).open(); |
| | | } |
| | | |
| | | /** æ¤é离èç³è¯· */ |
| | |
| | | }, |
| | | } as VxeTableGridOptions<HrmResignationApi.Resignation>, |
| | | }); |
| | | |
| | | // è¿å
¥é¡µé¢å³æå审æ¹äººéåï¼ç¨äºæ§å¶å®¡æ ¸æé®æ¾é |
| | | loadApproverIds(); |
| | | </script> |
| | | |
| | | <template> |
| | | <Page auto-content-height> |
| | | <FormModal @success="handleRefresh" /> |
| | | <AuditModalComp @success="handleRefresh" /> |
| | | <Grid table-title="离èç³è¯·å表"> |
| | | <template #toolbar-tools> |
| | | <TableAction |
| | |
| | | onClick: handleEdit.bind(null, row), |
| | | }, |
| | | { |
| | | label: 'æäº¤', |
| | | label: 'æäº¤å®¡æ¹', |
| | | type: 'link', |
| | | auth: ['hrm:resignation:submit'], |
| | | ifShow: row.status === 0, |
| | | onClick: handleSubmit.bind(null, row), |
| | | auth: ['hrm:resignation:update'], |
| | | // 审æ¹äººç±å®¡æ¹é
ç½®ç»ä¸æå®ï¼æäº¤åä»
äºæ¬¡ç¡®è®¤ï¼ä¸åå¼¹éæµç¨æ¡ |
| | | popConfirm: { |
| | | title: '确认æäº¤å®¡æ¹ï¼æäº¤åç±å®¡æ¹é
ç½®ä¸æå®ç审æ¹äººå¤çã', |
| | | confirm: handleSubmit.bind(null, row), |
| | | }, |
| | | // è稿(0) ä¸ å®¡æ ¸ä¸éè¿(30) åå¯æäº¤ï¼åè
éä¿®æ¹åéæ°æäº¤ |
| | | ifShow: row.status === 0 || row.status === 30, |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸', |
| | | type: 'link', |
| | | icon: ACTION_ICON.AUDIT, |
| | | auth: ['hrm:resignation:audit'], |
| | | // ä»
ã审æ¹ä¸ + å½åç»å½ç¨æ·å¨å®¡æ¹é
ç½®ç审æ¹äººååå
ãææ¾ç¤º |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, true), |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸ä¸éè¿', |
| | | type: 'link', |
| | | danger: true, |
| | | auth: ['hrm:resignation:audit'], |
| | | // åä¸ï¼ä¸ãå®¡æ ¸ãæå¯¹åºç° |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, false), |
| | | }, |
| | | { |
| | | label: 'æ¤é', |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { VbenFormSchema } from '#/adapter/form'; |
| | | import type { HrmResignationApi } from '#/api/hrm/resignation'; |
| | | |
| | | import { computed, ref } from 'vue'; |
| | | |
| | | import { useVbenModal } from '#/packages/effects/common-ui/src'; |
| | | |
| | | import { message } from 'ant-design-vue'; |
| | | |
| | | import { useVbenForm } from '#/adapter/form'; |
| | | import { auditResignation } from '#/api/hrm/resignation'; |
| | | |
| | | const emit = defineEmits(['success']); |
| | | |
| | | const pass = ref(true); // true=å®¡æ ¸éè¿ / false=å®¡æ ¸ä¸éè¿ |
| | | const rowData = ref<HrmResignationApi.Resignation>(); |
| | | const getTitle = computed(() => (pass.value ? 'å®¡æ ¸éè¿' : 'å®¡æ ¸ä¸éè¿')); |
| | | |
| | | const [Form, formApi] = useVbenForm({ |
| | | commonConfig: { |
| | | componentProps: { |
| | | class: 'w-full', |
| | | }, |
| | | formItemClass: 'col-span-1', |
| | | labelWidth: 90, |
| | | }, |
| | | wrapperClass: 'grid-cols-1', |
| | | layout: 'horizontal', |
| | | schema: [], |
| | | showDefaultActions: false, |
| | | }); |
| | | |
| | | /** å®¡æ ¸è¡¨ååæ®µï¼ä¸éè¿æ¶å¿
须填ååå */ |
| | | function useAuditSchema(): VbenFormSchema[] { |
| | | return [ |
| | | { |
| | | fieldName: 'reviewRemark', |
| | | label: 'å®¡æ ¸æè§', |
| | | component: 'Textarea', |
| | | formItemClass: 'col-span-1', |
| | | componentProps: { |
| | | rows: 3, |
| | | placeholder: pass.value |
| | | ? '请è¾å
¥å®¡æ ¸æè§ï¼å¯éï¼' |
| | | : '请è¾å
¥ä¸éè¿åå ï¼å¿
å¡«ï¼', |
| | | }, |
| | | rules: pass.value ? '' : 'required', |
| | | }, |
| | | ]; |
| | | } |
| | | |
| | | const [Modal, modalApi] = useVbenModal({ |
| | | async onConfirm() { |
| | | const { valid } = await formApi.validate(); |
| | | if (!valid) { |
| | | return; |
| | | } |
| | | modalApi.lock(); |
| | | const values = await formApi.getValues(); |
| | | try { |
| | | await auditResignation(rowData.value!.id!, pass.value, values.reviewRemark); |
| | | await modalApi.close(); |
| | | emit('success'); |
| | | message.success(pass.value ? 'å®¡æ ¸éè¿' : 'å·²éåï¼å¯ä¿®æ¹åéæ°æäº¤'); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | | }, |
| | | async onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { |
| | | rowData.value = undefined; |
| | | return; |
| | | } |
| | | const data = modalApi.getData<{ |
| | | pass: boolean; |
| | | row: HrmResignationApi.Resignation; |
| | | }>(); |
| | | rowData.value = data.row; |
| | | pass.value = data.pass; |
| | | formApi.setState({ schema: useAuditSchema() }); |
| | | formApi.resetForm(); |
| | | }, |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Modal :title="getTitle" class="w-2/5"> |
| | | <div v-if="rowData" class="mx-4 mb-4 text-sm text-gray-600"> |
| | | <div>ç³è¯·äººï¼{{ rowData.employeeName }}</div> |
| | | <div>æå±é¨é¨ï¼{{ rowData.deptName }}</div> |
| | | <div>é¢è®¡ç¦»èæ¥æï¼{{ rowData.expectedDate }}</div> |
| | | <div>交æ¥äººï¼{{ rowData.handoverUserName }}</div> |
| | | <div>离èåå ï¼{{ rowData.reason }}</div> |
| | | </div> |
| | | <Form class="mx-4" /> |
| | | </Modal> |
| | | </template> |
| | |
| | | import type { VxeTableGridOptions } from '#/adapter/vxe-table'; |
| | | import type { HrmTransferApi } from '#/api/hrm/transfer'; |
| | | |
| | | import { ref } from 'vue'; |
| | | |
| | | import { Page, useVbenModal } from '#/packages/effects/common-ui/src'; |
| | | import { useUserStore } from '@vben/stores'; |
| | | |
| | | import { message } from 'ant-design-vue'; |
| | | |
| | |
| | | import { |
| | | cancelTransfer, |
| | | deleteTransfer, |
| | | getTransferApproverIds, |
| | | getTransferPage, |
| | | submitTransfer, |
| | | } from '#/api/hrm/transfer'; |
| | | import { $t } from '#/locales'; |
| | | |
| | | import { useGridColumns, useGridFormSchema } from './data'; |
| | | import AuditModal from './modules/audit-modal.vue'; |
| | | import Form from './modules/form.vue'; |
| | | |
| | | const userStore = useUserStore(); |
| | | const currentUserId = userStore.userInfo?.id; // å½åç»å½ç¨æ· IDï¼ç¨äºå®¡æ¹äººæé夿 |
| | | |
| | | /** 审æ¹é
ç½®ä¸è¯¥ä¸å¡ç审æ¹äººç¼å·éåï¼å³å®ãå®¡æ ¸ / å®¡æ ¸ä¸éè¿ãæé®æ¯å¦å±ç¤º */ |
| | | const approverIds = ref<number[]>([]); |
| | | |
| | | /** æå审æ¹äººéåï¼å¤±è´¥æ¶ä¿æä¸ºç©ºï¼æé®ä¸å±ç¤ºï¼ï¼ä¸é»æå表å è½½ */ |
| | | async function loadApproverIds() { |
| | | try { |
| | | approverIds.value = (await getTransferApproverIds()) ?? []; |
| | | } catch { |
| | | approverIds.value = []; |
| | | } |
| | | } |
| | | |
| | | /** å½åç»å½ç¨æ·æ¯å¦ä¸ºè¯¥ä¸å¡ç审æ¹äººï¼ä¸ç³è¯·å¤äºå®¡æ¹ä¸ï¼10ï¼ */ |
| | | function canAudit(row: HrmTransferApi.Transfer) { |
| | | return ( |
| | | row.status === 10 && |
| | | !!currentUserId && |
| | | approverIds.value.includes(currentUserId) |
| | | ); |
| | | } |
| | | |
| | | const [FormModal, formModalApi] = useVbenModal({ |
| | | connectedComponent: Form, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** å·æ°è¡¨æ ¼ */ |
| | | const [AuditModalComp, auditModalApi] = useVbenModal({ |
| | | connectedComponent: AuditModal, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** å·æ°è¡¨æ ¼ä¸å®¡æ¹äººéå */ |
| | | function handleRefresh() { |
| | | gridApi.query(); |
| | | loadApproverIds(); |
| | | } |
| | | |
| | | /** å建è°å²ç³è¯· */ |
| | |
| | | } |
| | | } |
| | | |
| | | /** æäº¤è°å²ç³è¯· */ |
| | | /** æäº¤å®¡æ¹ - 审æ¹äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãç»ä¸æå®ï¼æ¤å¤æ ééæ© */ |
| | | async function handleSubmit(row: HrmTransferApi.Transfer) { |
| | | const hideLoading = message.loading({ |
| | | content: 'æ£å¨æäº¤å®¡æ¹...', |
| | | duration: 0, |
| | | }); |
| | | try { |
| | | await submitTransfer(row.id!); |
| | | message.success('æäº¤æå'); |
| | | message.success('æäº¤å®¡æ¹æå'); |
| | | handleRefresh(); |
| | | } finally { |
| | | hideLoading(); |
| | | } |
| | | } |
| | | |
| | | /** å®¡æ ¸ - éè¿ / ä¸éè¿ */ |
| | | function handleAudit(row: HrmTransferApi.Transfer, pass: boolean) { |
| | | auditModalApi.setData({ pass, row }).open(); |
| | | } |
| | | |
| | | /** æ¤éè°å²ç³è¯· */ |
| | |
| | | }, |
| | | } as VxeTableGridOptions<HrmTransferApi.Transfer>, |
| | | }); |
| | | |
| | | // è¿å
¥é¡µé¢å³æå审æ¹äººéåï¼ç¨äºæ§å¶å®¡æ ¸æé®æ¾é |
| | | loadApproverIds(); |
| | | </script> |
| | | |
| | | <template> |
| | | <Page auto-content-height> |
| | | <FormModal @success="handleRefresh" /> |
| | | <AuditModalComp @success="handleRefresh" /> |
| | | <Grid table-title="è°å²ç³è¯·å表"> |
| | | <template #toolbar-tools> |
| | | <TableAction |
| | |
| | | onClick: handleEdit.bind(null, row), |
| | | }, |
| | | { |
| | | label: 'æäº¤', |
| | | label: 'æäº¤å®¡æ¹', |
| | | type: 'link', |
| | | auth: ['hrm:transfer:submit'], |
| | | ifShow: row.status === 0, |
| | | onClick: handleSubmit.bind(null, row), |
| | | auth: ['hrm:transfer:update'], |
| | | // 审æ¹äººç±å®¡æ¹é
ç½®ç»ä¸æå®ï¼æäº¤åä»
äºæ¬¡ç¡®è®¤ï¼ä¸åå¼¹éæµç¨æ¡ |
| | | popConfirm: { |
| | | title: '确认æäº¤å®¡æ¹ï¼æäº¤åç±å®¡æ¹é
ç½®ä¸æå®ç审æ¹äººå¤çã', |
| | | confirm: handleSubmit.bind(null, row), |
| | | }, |
| | | // è稿(0) ä¸ å®¡æ ¸ä¸éè¿(30) åå¯æäº¤ï¼åè
éä¿®æ¹åéæ°æäº¤ |
| | | ifShow: row.status === 0 || row.status === 30, |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸', |
| | | type: 'link', |
| | | icon: ACTION_ICON.AUDIT, |
| | | auth: ['hrm:transfer:audit'], |
| | | // ä»
ã审æ¹ä¸ + å½åç»å½ç¨æ·å¨å®¡æ¹é
ç½®ç审æ¹äººååå
ãææ¾ç¤º |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, true), |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸ä¸éè¿', |
| | | type: 'link', |
| | | danger: true, |
| | | auth: ['hrm:transfer:audit'], |
| | | // åä¸ï¼ä¸ãå®¡æ ¸ãæå¯¹åºç° |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, false), |
| | | }, |
| | | { |
| | | label: 'æ¤é', |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { VbenFormSchema } from '#/adapter/form'; |
| | | import type { HrmTransferApi } from '#/api/hrm/transfer'; |
| | | |
| | | import { computed, ref } from 'vue'; |
| | | |
| | | import { useVbenModal } from '#/packages/effects/common-ui/src'; |
| | | |
| | | import { message } from 'ant-design-vue'; |
| | | |
| | | import { useVbenForm } from '#/adapter/form'; |
| | | import { auditTransfer } from '#/api/hrm/transfer'; |
| | | |
| | | const emit = defineEmits(['success']); |
| | | |
| | | const pass = ref(true); // true=å®¡æ ¸éè¿ / false=å®¡æ ¸ä¸éè¿ |
| | | const rowData = ref<HrmTransferApi.Transfer>(); |
| | | const getTitle = computed(() => (pass.value ? 'å®¡æ ¸éè¿' : 'å®¡æ ¸ä¸éè¿')); |
| | | |
| | | const [Form, formApi] = useVbenForm({ |
| | | commonConfig: { |
| | | componentProps: { |
| | | class: 'w-full', |
| | | }, |
| | | formItemClass: 'col-span-1', |
| | | labelWidth: 90, |
| | | }, |
| | | wrapperClass: 'grid-cols-1', |
| | | layout: 'horizontal', |
| | | schema: [], |
| | | showDefaultActions: false, |
| | | }); |
| | | |
| | | /** å®¡æ ¸è¡¨ååæ®µï¼ä¸éè¿æ¶å¿
须填ååå */ |
| | | function useAuditSchema(): VbenFormSchema[] { |
| | | return [ |
| | | { |
| | | fieldName: 'reviewRemark', |
| | | label: 'å®¡æ ¸æè§', |
| | | component: 'Textarea', |
| | | formItemClass: 'col-span-1', |
| | | componentProps: { |
| | | rows: 3, |
| | | placeholder: pass.value |
| | | ? '请è¾å
¥å®¡æ ¸æè§ï¼å¯éï¼' |
| | | : '请è¾å
¥ä¸éè¿åå ï¼å¿
å¡«ï¼', |
| | | }, |
| | | rules: pass.value ? '' : 'required', |
| | | }, |
| | | ]; |
| | | } |
| | | |
| | | const [Modal, modalApi] = useVbenModal({ |
| | | async onConfirm() { |
| | | const { valid } = await formApi.validate(); |
| | | if (!valid) { |
| | | return; |
| | | } |
| | | modalApi.lock(); |
| | | const values = await formApi.getValues(); |
| | | try { |
| | | await auditTransfer(rowData.value!.id!, pass.value, values.reviewRemark); |
| | | await modalApi.close(); |
| | | emit('success'); |
| | | message.success(pass.value ? 'å®¡æ ¸éè¿' : 'å·²éåï¼å¯ä¿®æ¹åéæ°æäº¤'); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | | }, |
| | | async onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { |
| | | rowData.value = undefined; |
| | | return; |
| | | } |
| | | const data = modalApi.getData<{ |
| | | pass: boolean; |
| | | row: HrmTransferApi.Transfer; |
| | | }>(); |
| | | rowData.value = data.row; |
| | | pass.value = data.pass; |
| | | formApi.setState({ schema: useAuditSchema() }); |
| | | formApi.resetForm(); |
| | | }, |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Modal :title="getTitle" class="w-2/5"> |
| | | <div v-if="rowData" class="mx-4 mb-4 text-sm text-gray-600"> |
| | | <div>ç³è¯·äººï¼{{ rowData.employeeName }}</div> |
| | | <div>åé¨é¨ï¼{{ rowData.currentDeptName }}</div> |
| | | <div>ç®æ é¨é¨ï¼{{ rowData.targetDeptName }}</div> |
| | | <div>åå²ä½ï¼{{ rowData.currentPostName }}</div> |
| | | <div>ç®æ å²ä½ï¼{{ rowData.targetPostName }}</div> |
| | | <div>çææ¥æï¼{{ rowData.effectiveDate }}</div> |
| | | </div> |
| | | <Form class="mx-4" /> |
| | | </Modal> |
| | | </template> |
| | |
| | | import { FilePreviewModal, useFilePreview } from '#/components/file-preview'; |
| | | |
| | | interface Props { |
| | | visible: boolean; |
| | | visible?: boolean; |
| | | productCode?: string; |
| | | } |
| | | |
| | | const props = withDefaults(defineProps<Props>(), { |
| | | visible: false, |
| | | productCode: '', |
| | | }); |
| | | |
| | |
| | | const loading = ref(false); |
| | | const detailList = ref<MesPdArchiveApi.DetailItem[]>([]); |
| | | const activeProject = ref('0'); |
| | | /** å½åæ¥çç产åç¼ç ï¼å½ä»¤å¼ open(code) ä¼ å
¥æåèª propï¼ */ |
| | | const currentCode = ref(''); |
| | | |
| | | const { openPreview, previewState } = useFilePreview(); |
| | | |
| | |
| | | }, |
| | | ]; |
| | | |
| | | watch(() => props.visible, async (newVal) => { |
| | | if (newVal && props.productCode) { |
| | | /** æå¼å¼¹çªå¹¶å è½½æå®äº§åç¼ç ç彿¡£è¯¦æ
ï¼ç¼ç 为空æ¶ç´æ¥å±ç¤ºç©ºæ */ |
| | | async function showDetail(code: string) { |
| | | currentCode.value = code || ''; |
| | | open.value = true; |
| | | loading.value = true; |
| | | detailList.value = []; |
| | | activeProject.value = '0'; |
| | | if (!currentCode.value) { |
| | | return; |
| | | } |
| | | loading.value = true; |
| | | try { |
| | | detailList.value = await getPdArchiveDetailByProduct(props.productCode); |
| | | detailList.value = await getPdArchiveDetailByProduct(currentCode.value); |
| | | } catch { |
| | | message.error('è·å彿¡£è¯¦æ
失败'); |
| | | } finally { |
| | | loading.value = false; |
| | | } |
| | | } else if (!newVal) { |
| | | } |
| | | |
| | | watch( |
| | | () => props.visible, |
| | | (newVal) => { |
| | | if (newVal) { |
| | | // å³ä½¿äº§åç¼ç ä¸ºç©ºä¹æå¼å¼¹çªï¼å±ç¤ºç©ºæï¼ï¼é¿å
ç¶ç»ä»¶ visible å¡å¨ true åå乿 æ³è§¦å |
| | | showDetail(props.productCode || ''); |
| | | } else { |
| | | open.value = false; |
| | | detailList.value = []; |
| | | } |
| | | }); |
| | | }, |
| | | ); |
| | | |
| | | function handleClose() { |
| | | open.value = false; |
| | | detailList.value = []; |
| | | emit('update:visible', false); |
| | | } |
| | | |
| | | /** å
¼å®¹å½ä»¤å¼è°ç¨ï¼archiveDetailRef.value?.open(productCode) */ |
| | | function handleOpen(code?: string) { |
| | | showDetail(code ?? props.productCode ?? ''); |
| | | } |
| | | |
| | | defineExpose({ open: handleOpen }); |
| | | </script> |
| | | |
| | | <template> |
| | |
| | | </Tabs.TabPane> |
| | | </Tabs> |
| | | <div v-else class="py-8 text-center text-gray-400"> |
| | | ææ å½æ¡£è®°å½ |
| | | {{ currentCode ? 'ææ å½æ¡£è®°å½' : 'è¯¥å·¥åæªè®¾ç½®äº§åç¼ç ï¼ææ 彿¡£è®°å½' }} |
| | | </div> |
| | | </template> |
| | | </Modal> |
| | |
| | | import { computed, onMounted, ref } from 'vue'; |
| | | import { useRoute, useRouter } from 'vue-router'; |
| | | |
| | | import { useUserStore } from '@vben/stores'; |
| | | |
| | | import { Page, useVbenModal } from '#/packages/effects/common-ui/src'; |
| | | import { useTabs } from '#/packages/effects/hooks/src'; |
| | | import { MesPdProjectStatusEnum } from '#/packages/constants/src'; |
| | |
| | | import { |
| | | archivePdProject, |
| | | getPdProject, |
| | | getPdProjectApproveProcessList, |
| | | getPdProjectApproverIds, |
| | | publishPdProject, |
| | | submitPdProjectApproval, |
| | | uploadPdProject, |
| | | } from '#/api/mes/pd/project'; |
| | | import { useDescription } from '#/components/description'; |
| | |
| | | import { $t } from '#/locales'; |
| | | |
| | | import Form from '../modules/form.vue'; |
| | | import AuditModal from '../modules/audit-modal.vue'; |
| | | import DocumentAuditList from '../modules/document-audit-list.vue'; |
| | | import DocumentList from '../modules/document-list.vue'; |
| | | import ProcessSelectModal from '../modules/process-select-modal.vue'; |
| | | import WorkflowTimeline from '../modules/workflow-timeline.vue'; |
| | | import TaskDraftBanner from '../modules/task-draft-banner.vue'; |
| | | import { useDetailSchema } from './data'; |
| | |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | const [ProcessModal, processModalApi] = useVbenModal({ |
| | | connectedComponent: ProcessSelectModal, |
| | | const [AuditModalComp, auditModalApi] = useVbenModal({ |
| | | connectedComponent: AuditModal, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | const userStore = useUserStore(); |
| | | const currentUserId = userStore.userInfo?.id; // å½åç»å½ç¨æ· IDï¼ç¨äºå®¡æ ¸äººæé夿 |
| | | |
| | | /** 审æ¹é
ç½®ä¸è¯¥ä¸å¡çå®¡æ ¸äººç¼å·éåï¼å³å®ãå®¡æ ¸ / å®¡æ ¸ä¸éè¿ãæé®æ¯å¦å±ç¤º */ |
| | | const approverIds = ref<number[]>([]); |
| | | |
| | | /** æåå®¡æ ¸äººéåï¼å¤±è´¥æ¶ä¿æä¸ºç©ºï¼æé®ä¸å±ç¤ºï¼ï¼ä¸é»æè¯¦æ
å è½½ */ |
| | | async function loadApproverIds() { |
| | | try { |
| | | approverIds.value = (await getPdProjectApproverIds()) ?? []; |
| | | } catch { |
| | | approverIds.value = []; |
| | | } |
| | | } |
| | | |
| | | /** å½åç»å½ç¨æ·æ¯å¦ä¸ºè¯¥ä¸å¡çå®¡æ ¸äººï¼ä¸åæ®å¤äºå®¡æ¹ä¸ç¶æ */ |
| | | const canAudit = computed( |
| | | () => |
| | | isApproving.value && |
| | | !!currentUserId && |
| | | approverIds.value.includes(currentUserId), |
| | | ); |
| | | |
| | | async function loadProjectDetail() { |
| | | loading.value = true; |
| | |
| | | } |
| | | } |
| | | |
| | | /** æäº¤å®¡æ¹ - å
è·åæµç¨å表 */ |
| | | /** æäº¤å®¡æ¹ - å®¡æ ¸äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãç»ä¸æå®ï¼æ¤å¤æ ééæ© */ |
| | | async function handleSubmit() { |
| | | const hideLoading = message.loading({ content: 'è·åå®¡æ¹æµç¨...', duration: 0 }); |
| | | try { |
| | | const processList = await getPdProjectApproveProcessList(); |
| | | hideLoading(); |
| | | if (!processList || processList.length === 0) { |
| | | message.warning('ææ å¯ç¨å®¡æ¹æµç¨ï¼è¯·å
é
ç½® BPM æµç¨'); |
| | | return; |
| | | } |
| | | // æå¼æµç¨éæ©å¼¹çª |
| | | processModalApi.setData({ id: projectId.value, processList }).open(); |
| | | } catch { |
| | | hideLoading(); |
| | | } |
| | | } |
| | | |
| | | /** æ¥ç审æ¹è¯¦æ
*/ |
| | | function handleProcessDetail() { |
| | | if (!project.value.processInstanceId) { |
| | | message.warning('该项ç®å°æªæäº¤å®¡æ¹'); |
| | | return; |
| | | } |
| | | router.push({ |
| | | name: 'BpmProcessInstanceDetail', |
| | | query: { id: project.value.processInstanceId }, |
| | | const hideLoading = message.loading({ |
| | | content: 'æ£å¨æäº¤å®¡æ¹...', |
| | | duration: 0, |
| | | }); |
| | | try { |
| | | await submitPdProjectApproval(projectId.value); |
| | | message.success('æäº¤å®¡æ¹æå'); |
| | | loadProjectDetail(); |
| | | } finally { |
| | | hideLoading(); |
| | | } |
| | | } |
| | | |
| | | /** æäº¤å®¡æ¹æååå·æ°è¯¦æ
*/ |
| | | function handleSubmitSuccess() { |
| | | loadProjectDetail(); |
| | | /** å®¡æ ¸ - éè¿ / ä¸éè¿ */ |
| | | function handleAudit(pass: boolean) { |
| | | auditModalApi.setData({ pass, row: project.value }).open(); |
| | | } |
| | | |
| | | async function handleArchive() { |
| | |
| | | onMounted(() => { |
| | | projectId.value = Number(route.params.id); |
| | | loadProjectDetail(); |
| | | // è¿å
¥é¡µé¢å³æåå®¡æ ¸äººéåï¼ç¨äºæ§å¶å®¡æ ¸æé®æ¾é |
| | | loadApproverIds(); |
| | | }); |
| | | </script> |
| | | |
| | |
| | | :title="project.taskName || '设计任å¡è¯¦æ
'" |
| | | > |
| | | <FormModal @success="loadProjectDetail" /> |
| | | <ProcessModal @success="handleSubmitSuccess" /> |
| | | <AuditModalComp @success="loadProjectDetail" /> |
| | | |
| | | <template #extra> |
| | | <TableAction |
| | |
| | | label: 'æäº¤å®¡æ¹', |
| | | type: 'primary', |
| | | ifShow: isPendingAudit, |
| | | onClick: handleSubmit, |
| | | // å®¡æ ¸äººç±å®¡æ¹é
ç½®ç»ä¸æå®ï¼æäº¤åä»
äºæ¬¡ç¡®è®¤ï¼ä¸åå¼¹éæµç¨æ¡ |
| | | popConfirm: { |
| | | title: '确认æäº¤å®¡æ¹ï¼æäº¤åç±å®¡æ¹é
ç½®ä¸æå®çå®¡æ ¸äººå¤çã', |
| | | confirm: handleSubmit, |
| | | }, |
| | | }, |
| | | { |
| | | label: 'æ¥ç审æ¹', |
| | | label: 'å®¡æ ¸', |
| | | type: 'primary', |
| | | ifShow: isApproving, |
| | | onClick: handleProcessDetail, |
| | | icon: ACTION_ICON.AUDIT, |
| | | // ä»
ã审æ¹ä¸ + å½åç»å½ç¨æ·å¨å®¡æ¹é
ç½®çå®¡æ ¸äººååå
ãææ¾ç¤º |
| | | ifShow: canAudit, |
| | | onClick: () => handleAudit(true), |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸ä¸éè¿', |
| | | type: 'default', |
| | | danger: true, |
| | | // åä¸ï¼ä¸ãå®¡æ ¸ãæå¯¹åºç° |
| | | ifShow: canAudit, |
| | | onClick: () => handleAudit(false), |
| | | }, |
| | | { |
| | | label: '彿¡£', |
| | |
| | | import type { VxeTableGridOptions } from '#/adapter/vxe-table'; |
| | | import type { MesPdProjectApi } from '#/api/mes/pd/project'; |
| | | |
| | | import { onActivated } from 'vue'; |
| | | import { onActivated, ref } from 'vue'; |
| | | import { useRouter } from 'vue-router'; |
| | | |
| | | import { useUserStore } from '@vben/stores'; |
| | | |
| | | import { Page, useVbenModal } from '#/packages/effects/common-ui/src'; |
| | | import { MesPdProjectStatusEnum } from '#/packages/constants/src'; |
| | |
| | | |
| | | deletePdProject, |
| | | exportPdProject, |
| | | getPdProjectApproveProcessList, |
| | | getPdProjectApproverIds, |
| | | getPdProjectPage, |
| | | publishPdProject, |
| | | submitPdProjectApproval, |
| | | |
| | | } from '#/api/mes/pd/project'; |
| | | import { $t } from '#/locales'; |
| | | |
| | | import { useGridColumns, useGridFormSchema } from './data'; |
| | | import AuditModal from './modules/audit-modal.vue'; |
| | | import CreateForm from './modules/create-form.vue'; |
| | | import Form from './modules/form.vue'; |
| | | import ProcessSelectModal from './modules/process-select-modal.vue'; |
| | | |
| | | const router = useRouter(); |
| | | |
| | | const userStore = useUserStore(); |
| | | const currentUserId = userStore.userInfo?.id; // å½åç»å½ç¨æ· IDï¼ç¨äºå®¡æ ¸äººæé夿 |
| | | |
| | | /** 审æ¹é
ç½®ä¸è¯¥ä¸å¡çå®¡æ ¸äººç¼å·éåï¼å³å®ãå®¡æ ¸ / å®¡æ ¸ä¸éè¿ãæé®æ¯å¦å±ç¤º */ |
| | | const approverIds = ref<number[]>([]); |
| | | |
| | | /** æåå®¡æ ¸äººéåï¼å¤±è´¥æ¶ä¿æä¸ºç©ºï¼æé®ä¸å±ç¤ºï¼ï¼ä¸é»æå表å è½½ */ |
| | | async function loadApproverIds() { |
| | | try { |
| | | approverIds.value = (await getPdProjectApproverIds()) ?? []; |
| | | } catch { |
| | | approverIds.value = []; |
| | | } |
| | | } |
| | | |
| | | /** å½åç»å½ç¨æ·æ¯å¦ä¸ºè¯¥ä¸å¡çå®¡æ ¸äººï¼ä¸åæ®å¤äºå®¡æ¹ä¸ç¶æ */ |
| | | function canAudit(row: MesPdProjectApi.Project) { |
| | | return ( |
| | | row.status === MesPdProjectStatusEnum.APPROVING && |
| | | !!currentUserId && |
| | | approverIds.value.includes(currentUserId) |
| | | ); |
| | | } |
| | | |
| | | const [CreateFormModal, createFormModalApi] = useVbenModal({ |
| | | connectedComponent: CreateForm, |
| | |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | const [ProcessModal, processModalApi] = useVbenModal({ |
| | | connectedComponent: ProcessSelectModal, |
| | | const [AuditModalComp, auditModalApi] = useVbenModal({ |
| | | connectedComponent: AuditModal, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** å·æ°è¡¨æ ¼ä¸å®¡æ ¸äººéå */ |
| | | function handleRefresh() { |
| | | gridApi.query(); |
| | | loadApproverIds(); |
| | | } |
| | | |
| | | function handleCreateSuccess() { |
| | |
| | | } |
| | | } |
| | | |
| | | /** æäº¤å®¡æ¹ - å
è·åæµç¨å表 */ |
| | | /** æäº¤å®¡æ¹ - å®¡æ ¸äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãç»ä¸æå®ï¼æ¤å¤æ ééæ© */ |
| | | async function handleSubmit(row: MesPdProjectApi.Project) { |
| | | const hideLoading = message.loading({ |
| | | content: 'è·åå®¡æ¹æµç¨...', |
| | | content: 'æ£å¨æäº¤å®¡æ¹...', |
| | | duration: 0, |
| | | }); |
| | | try { |
| | | const processList = await getPdProjectApproveProcessList(); |
| | | hideLoading(); |
| | | if (!processList || processList.length === 0) { |
| | | message.warning('ææ å¯ç¨å®¡æ¹æµç¨ï¼è¯·å
é
ç½® BPM æµç¨'); |
| | | return; |
| | | } |
| | | // æå¼æµç¨éæ©å¼¹çª |
| | | processModalApi.setData({ id: row.id, processList }).open(); |
| | | } catch { |
| | | await submitPdProjectApproval(row.id!); |
| | | message.success('æäº¤å®¡æ¹æå'); |
| | | handleRefresh(); |
| | | } finally { |
| | | hideLoading(); |
| | | } |
| | | } |
| | | |
| | | /** æ¥ç审æ¹è¯¦æ
*/ |
| | | function handleProcessDetail(row: MesPdProjectApi.Project) { |
| | | if (!row.processInstanceId) { |
| | | message.warning('该项ç®å°æªæäº¤å®¡æ¹'); |
| | | return; |
| | | } |
| | | router.push({ |
| | | name: 'BpmProcessInstanceDetail', |
| | | query: { id: row.processInstanceId }, |
| | | }); |
| | | /** å®¡æ ¸ - éè¿ / ä¸éè¿ */ |
| | | function handleAudit(row: MesPdProjectApi.Project, pass: boolean) { |
| | | auditModalApi.setData({ pass, row }).open(); |
| | | } |
| | | |
| | | async function handleArchive(row: MesPdProjectApi.Project) { |
| | |
| | | onActivated(() => { |
| | | handleRefresh(); |
| | | }); |
| | | |
| | | // è¿å
¥é¡µé¢å³æåå®¡æ ¸äººéåï¼ç¨äºæ§å¶å®¡æ ¸æé®æ¾é |
| | | loadApproverIds(); |
| | | </script> |
| | | |
| | | <template> |
| | | <Page auto-content-height> |
| | | <CreateFormModal @success="handleCreateSuccess" /> |
| | | <FormModal @success="handleRefresh" /> |
| | | <ProcessModal @success="handleRefresh" /> |
| | | <AuditModalComp @success="handleRefresh" /> |
| | | |
| | | <Grid table-title="设计任å¡"> |
| | | <template #toolbar-tools> |
| | |
| | | label: 'æäº¤å®¡æ¹', |
| | | type: 'link', |
| | | auth: ['mes:pd-project:update'], |
| | | // å¾
å®¡æ ¸å¯æäº¤ï¼å®¡æ ¸ä¸éè¿ä¼éåå¾
å®¡æ ¸ï¼å¯ä¿®æ¹åéæ°æäº¤ |
| | | ifShow: row.status === MesPdProjectStatusEnum.PENDING_AUDIT, |
| | | onClick: handleSubmit.bind(null, row), |
| | | // å®¡æ ¸äººç±å®¡æ¹é
ç½®ç»ä¸æå®ï¼æäº¤åä»
äºæ¬¡ç¡®è®¤ï¼ä¸åå¼¹éæµç¨æ¡ |
| | | popConfirm: { |
| | | title: '确认æäº¤å®¡æ¹ï¼æäº¤åç±å®¡æ¹é
ç½®ä¸æå®çå®¡æ ¸äººå¤çã', |
| | | confirm: handleSubmit.bind(null, row), |
| | | }, |
| | | }, |
| | | { |
| | | label: 'æ¥ç审æ¹', |
| | | label: 'å®¡æ ¸', |
| | | type: 'link', |
| | | auth: ['mes:pd-project:update'], |
| | | ifShow: row.status === MesPdProjectStatusEnum.APPROVING, |
| | | onClick: handleProcessDetail.bind(null, row), |
| | | icon: ACTION_ICON.AUDIT, |
| | | auth: ['mes:pd-project:audit'], |
| | | // ä»
ã审æ¹ä¸ + å½åç»å½ç¨æ·å¨å®¡æ¹é
ç½®çå®¡æ ¸äººååå
ãææ¾ç¤º |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, true), |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸ä¸éè¿', |
| | | type: 'link', |
| | | danger: true, |
| | | auth: ['mes:pd-project:audit'], |
| | | // åä¸ï¼ä¸ãå®¡æ ¸ãæå¯¹åºç° |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, false), |
| | | }, |
| | | { |
| | | label: '彿¡£', |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { VbenFormSchema } from '#/adapter/form'; |
| | | import type { MesPdProjectApi } from '#/api/mes/pd/project'; |
| | | |
| | | import { computed, ref } from 'vue'; |
| | | |
| | | import { useVbenModal } from '#/packages/effects/common-ui/src'; |
| | | |
| | | import { message } from 'ant-design-vue'; |
| | | |
| | | import { useVbenForm } from '#/adapter/form'; |
| | | import { auditPdProject } from '#/api/mes/pd/project'; |
| | | |
| | | const emit = defineEmits(['success']); |
| | | |
| | | const pass = ref(true); // true=å®¡æ ¸éè¿ / false=å®¡æ ¸ä¸éè¿ |
| | | const rowData = ref<MesPdProjectApi.Project>(); |
| | | const getTitle = computed(() => (pass.value ? 'å®¡æ ¸éè¿' : 'å®¡æ ¸ä¸éè¿')); |
| | | |
| | | const [Form, formApi] = useVbenForm({ |
| | | commonConfig: { |
| | | componentProps: { |
| | | class: 'w-full', |
| | | }, |
| | | formItemClass: 'col-span-1', |
| | | labelWidth: 90, |
| | | }, |
| | | wrapperClass: 'grid-cols-1', |
| | | layout: 'horizontal', |
| | | schema: [], |
| | | showDefaultActions: false, |
| | | }); |
| | | |
| | | /** å®¡æ ¸è¡¨ååæ®µï¼ä¸éè¿æ¶å¿
须填ååå */ |
| | | function useAuditSchema(): VbenFormSchema[] { |
| | | return [ |
| | | { |
| | | fieldName: 'reviewRemark', |
| | | label: 'å®¡æ ¸æè§', |
| | | component: 'Textarea', |
| | | formItemClass: 'col-span-1', |
| | | componentProps: { |
| | | rows: 3, |
| | | placeholder: pass.value |
| | | ? '请è¾å
¥å®¡æ ¸æè§ï¼å¯éï¼' |
| | | : '请è¾å
¥ä¸éè¿åå ï¼å¿
å¡«ï¼', |
| | | }, |
| | | rules: pass.value ? '' : 'required', |
| | | }, |
| | | ]; |
| | | } |
| | | |
| | | const [Modal, modalApi] = useVbenModal({ |
| | | async onConfirm() { |
| | | const { valid } = await formApi.validate(); |
| | | if (!valid) { |
| | | return; |
| | | } |
| | | modalApi.lock(); |
| | | const values = await formApi.getValues(); |
| | | try { |
| | | await auditPdProject(rowData.value!.id!, pass.value, values.reviewRemark); |
| | | await modalApi.close(); |
| | | emit('success'); |
| | | message.success(pass.value ? 'å®¡æ ¸éè¿' : 'å·²éåï¼å¯ä¿®æ¹åéæ°æäº¤'); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | | }, |
| | | async onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { |
| | | rowData.value = undefined; |
| | | return; |
| | | } |
| | | const data = modalApi.getData<{ |
| | | pass: boolean; |
| | | row: MesPdProjectApi.Project; |
| | | }>(); |
| | | rowData.value = data.row; |
| | | pass.value = data.pass; |
| | | formApi.setState({ schema: useAuditSchema() }); |
| | | formApi.resetForm(); |
| | | }, |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Modal :title="getTitle" class="w-2/5"> |
| | | <div v-if="rowData" class="mx-4 mb-4 text-sm text-gray-600"> |
| | | <div>ä»»å¡ç¼ç ï¼{{ rowData.taskCode }}</div> |
| | | <div>ä»»å¡åç§°ï¼{{ rowData.taskName }}</div> |
| | | <div>产ååç§°ï¼{{ rowData.productName }}</div> |
| | | </div> |
| | | <Form class="mx-4" /> |
| | | </Modal> |
| | | </template> |
| | |
| | | /** 表åç±»å */ |
| | | export type FormType = 'create' | 'detail' | 'update'; |
| | | |
| | | /** æ°å¢/ä¿®æ¹äº§åææ¯ç¡®è®¤å½ */ |
| | | /** |
| | | * æ°å¢/ä¿®æ¹/æ¥çäº§åææ¯ç¡®è®¤å½ |
| | | * |
| | | * ç¶æåç¼å¶äººãå®¡æ ¸äººã客æ·ç¡®è®¤äººçæµç¨æ´¾çåæ®µä¸å¾åªè¯»ï¼ |
| | | * ç¶æç±å端æä¸å¡æµç¨æ¨è¿ï¼æäº¤å®¡æ ¸ â å®¡æ ¸éè¿/ä¸éè¿ â 客æ·ç¡®è®¤ï¼ï¼ |
| | | * 人å䏿¶é´ç±å端èªå¨è®°å½ï¼åä¸å
许æå·¥å¡«åã |
| | | * |
| | | * @param formType 表åç±»åï¼create æ¶ä¸å±ç¤ºç¶æåæ®µï¼æ°å»ºåæ®åºå®ä¸ºèç¨¿ï¼ |
| | | * @param formApi 表å API |
| | | */ |
| | | export function useFormSchema( |
| | | formType: FormType, |
| | | formApi?: VbenFormApi, |
| | | ): VbenFormSchema[] { |
| | | return [ |
| | |
| | | label: 'ç¶æ', |
| | | component: 'Select', |
| | | componentProps: { |
| | | allowClear: true, |
| | | // ç¶æç±ä¸å¡æµç¨é©±å¨ï¼ä»
ä½å±ç¤ºï¼ä¸å¯æå·¥éæ© |
| | | disabled: true, |
| | | options: getDictOptions(DICT_TYPE.PRODUCT_TECH_CONFIRM_STATUS, 'number'), |
| | | placeholder: 'è¯·éæ©ç¶æ', |
| | | }, |
| | | dependencies: { |
| | | triggerFields: [''], |
| | | // æ°å»ºåæ®åºå®ä¸ºè稿ï¼ä¸å±ç¤ºç¶æ |
| | | show: () => formType !== 'create', |
| | | }, |
| | | }, |
| | | { |
| | | fieldName: 'flowDivider', |
| | | label: 'æµç¨ä¿¡æ¯ï¼ç³»ç»èªå¨è®°å½ï¼', |
| | | component: 'Divider', |
| | | formItemClass: 'col-span-3', |
| | | dependencies: { |
| | | triggerFields: [''], |
| | | show: () => formType !== 'create', |
| | | }, |
| | | }, |
| | | { |
| | |
| | | label: 'ç¼å¶äºº', |
| | | component: 'Input', |
| | | componentProps: { |
| | | placeholder: '请è¾å
¥ç¼å¶äººå§å', |
| | | disabled: true, |
| | | placeholder: 'ç±ç³»ç»èªå¨è®°å½', |
| | | }, |
| | | dependencies: { |
| | | triggerFields: [''], |
| | | show: () => formType !== 'create', |
| | | }, |
| | | }, |
| | | { |
| | |
| | | component: 'DatePicker', |
| | | componentProps: { |
| | | class: '!w-full', |
| | | disabled: true, |
| | | format: 'YYYY-MM-DD HH:mm:ss', |
| | | showTime: true, |
| | | valueFormat: 'YYYY-MM-DD HH:mm:ss', |
| | | }, |
| | | dependencies: { |
| | | triggerFields: [''], |
| | | show: () => formType !== 'create', |
| | | }, |
| | | }, |
| | | { |
| | |
| | | label: 'å®¡æ ¸äºº', |
| | | component: 'Input', |
| | | componentProps: { |
| | | placeholder: '请è¾å
¥å®¡æ ¸äººå§å', |
| | | disabled: true, |
| | | placeholder: 'æäº¤å®¡æ ¸æ¶éæ©', |
| | | }, |
| | | dependencies: { |
| | | triggerFields: [''], |
| | | show: () => formType !== 'create', |
| | | }, |
| | | }, |
| | | { |
| | |
| | | component: 'DatePicker', |
| | | componentProps: { |
| | | class: '!w-full', |
| | | disabled: true, |
| | | format: 'YYYY-MM-DD HH:mm:ss', |
| | | showTime: true, |
| | | valueFormat: 'YYYY-MM-DD HH:mm:ss', |
| | | }, |
| | | dependencies: { |
| | | triggerFields: [''], |
| | | show: () => formType !== 'create', |
| | | }, |
| | | }, |
| | | { |
| | | fieldName: 'reviewRemark', |
| | | label: 'å®¡æ ¸æè§', |
| | | component: 'Textarea', |
| | | formItemClass: 'col-span-3', |
| | | componentProps: { |
| | | disabled: true, |
| | | placeholder: 'å®¡æ ¸æ¶å¡«å', |
| | | rows: 2, |
| | | }, |
| | | dependencies: { |
| | | triggerFields: [''], |
| | | show: () => formType !== 'create', |
| | | }, |
| | | }, |
| | | { |
| | |
| | | label: '客æ·ç¡®è®¤äºº', |
| | | component: 'Input', |
| | | componentProps: { |
| | | placeholder: '请è¾å
¥å®¢æ·ç¡®è®¤äºº', |
| | | disabled: true, |
| | | placeholder: 'ç±ç³»ç»èªå¨è®°å½', |
| | | }, |
| | | dependencies: { |
| | | triggerFields: [''], |
| | | show: () => formType !== 'create', |
| | | }, |
| | | }, |
| | | { |
| | |
| | | component: 'DatePicker', |
| | | componentProps: { |
| | | class: '!w-full', |
| | | disabled: true, |
| | | format: 'YYYY-MM-DD HH:mm:ss', |
| | | showTime: true, |
| | | valueFormat: 'YYYY-MM-DD HH:mm:ss', |
| | | }, |
| | | dependencies: { |
| | | triggerFields: [''], |
| | | show: () => formType !== 'create', |
| | | }, |
| | | }, |
| | | { |
| | |
| | | }, |
| | | }, |
| | | { field: 'drafterName', title: 'ç¼å¶äºº', width: 90 }, |
| | | { field: 'reviewerName', title: 'å®¡æ ¸äºº', width: 90 }, |
| | | { |
| | | field: 'status', |
| | | title: 'ç¶æ', |
| | |
| | | import type { VxeTableGridOptions } from '#/adapter/vxe-table'; |
| | | import type { MesPdTechConfirmApi } from '#/api/mes/pd/tech-confirm'; |
| | | |
| | | import { ref } from 'vue'; |
| | | |
| | | import { Page, useVbenModal } from '@vben/common-ui'; |
| | | import { $t } from '@vben/locales'; |
| | | import { downloadFileFromBlobPart } from '@vben/utils'; |
| | | |
| | | import { ref } from 'vue'; |
| | | |
| | | import { MesPdTechConfirmStatusEnum } from '#/packages/constants/src'; |
| | | |
| | | import { Button, message } from 'ant-design-vue'; |
| | | |
| | |
| | | import { |
| | | deleteTechConfirm, |
| | | exportTechConfirm, |
| | | getTechConfirmApproverIds, |
| | | getTechConfirmPage, |
| | | updateTechConfirm, |
| | | submitTechConfirmAudit, |
| | | } from '#/api/mes/pd/tech-confirm'; |
| | | import { useUserStore } from '@vben/stores'; |
| | | |
| | | import { useGridColumns, useGridFormSchema } from './data'; |
| | | import AuditModal from './modules/audit-modal.vue'; |
| | | import CustomerConfirmModal from './modules/customer-confirm-modal.vue'; |
| | | import Form from './modules/form.vue'; |
| | | |
| | | const userStore = useUserStore(); |
| | | const currentUserId = userStore.userInfo?.id; // å½åç»å½ç¨æ· IDï¼ç¨äºå®¡æ ¸äººæé夿 |
| | | |
| | | /** 审æ¹é
ç½®ä¸è¯¥ä¸å¡çå®¡æ ¸äººç¼å·éåï¼å³å®ãå®¡æ ¸ / å®¡æ ¸ä¸éè¿ãæé®æ¯å¦å±ç¤º */ |
| | | const approverIds = ref<number[]>([]); |
| | | |
| | | /** æåå®¡æ ¸äººéåï¼å¤±è´¥æ¶ä¿æä¸ºç©ºï¼æé®ä¸å±ç¤ºï¼ï¼ä¸é»æå表å è½½ */ |
| | | async function loadApproverIds() { |
| | | try { |
| | | approverIds.value = (await getTechConfirmApproverIds()) ?? []; |
| | | } catch { |
| | | approverIds.value = []; |
| | | } |
| | | } |
| | | |
| | | /** å½åç»å½ç¨æ·æ¯å¦ä¸ºè¯¥ä¸å¡çå®¡æ ¸äººï¼ä¸åæ®å¤äºå¾
å®¡æ ¸ç¶æ */ |
| | | function canAudit(row: MesPdTechConfirmApi.TechConfirm) { |
| | | return ( |
| | | row.status === MesPdTechConfirmStatusEnum.PENDING_AUDIT && |
| | | !!currentUserId && |
| | | approverIds.value.includes(currentUserId) |
| | | ); |
| | | } |
| | | |
| | | const [FormModal, formModalApi] = useVbenModal({ |
| | | connectedComponent: Form, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** å·æ°è¡¨æ ¼ */ |
| | | const [AuditModalComp, auditModalApi] = useVbenModal({ |
| | | connectedComponent: AuditModal, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | const [CustomerConfirm, customerConfirmApi] = useVbenModal({ |
| | | connectedComponent: CustomerConfirmModal, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** å·æ°è¡¨æ ¼ä¸å®¡æ ¸äººéå */ |
| | | function handleRefresh() { |
| | | gridApi.query(); |
| | | loadApproverIds(); |
| | | } |
| | | |
| | | /** æ°å¢ */ |
| | |
| | | } |
| | | } |
| | | |
| | | /** ç¶ææµè½¬ */ |
| | | async function handleStatus(row: MesPdTechConfirmApi.TechConfirm, next: number) { |
| | | const hideLoading = message.loading({ content: 'ç¶ææ´æ°ä¸...', duration: 0 }); |
| | | /** æäº¤å®¡æ ¸ - å®¡æ ¸äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãç»ä¸æå®ï¼æ¤å¤æ ééæ© */ |
| | | async function handleSubmitAudit(row: MesPdTechConfirmApi.TechConfirm) { |
| | | const hideLoading = message.loading({ |
| | | content: 'æ£å¨æäº¤å®¡æ ¸...', |
| | | duration: 0, |
| | | }); |
| | | try { |
| | | await updateTechConfirm({ ...row, status: next }); |
| | | message.success($t('ui.actionMessage.operationSuccess')); |
| | | await submitTechConfirmAudit(row.id!); |
| | | message.success('æäº¤å®¡æ ¸æå'); |
| | | handleRefresh(); |
| | | } finally { |
| | | hideLoading(); |
| | | } |
| | | } |
| | | |
| | | /** å®¡æ ¸ - éè¿ / ä¸éè¿ */ |
| | | function handleAudit(row: MesPdTechConfirmApi.TechConfirm, pass: boolean) { |
| | | auditModalApi.setData({ pass, row }).open(); |
| | | } |
| | | |
| | | /** 客æ·ç¡®è®¤ - è®°å½å®¢æ·ç¡®è®¤äººï¼ç±å端åå
¥ç¡®è®¤æ¶é´ */ |
| | | function handleCustomerConfirm(row: MesPdTechConfirmApi.TechConfirm) { |
| | | customerConfirmApi |
| | | .setData({ |
| | | id: row.id, |
| | | confirmNo: row.confirmNo, |
| | | customerName: row.customerName, |
| | | }) |
| | | .open(); |
| | | } |
| | | |
| | | /** å¯¼åº */ |
| | |
| | | }, |
| | | } as VxeTableGridOptions<MesPdTechConfirmApi.TechConfirm>, |
| | | }); |
| | | |
| | | // è¿å
¥é¡µé¢å³æåå®¡æ ¸äººéåï¼ç¨äºæ§å¶å®¡æ ¸æé®æ¾é |
| | | loadApproverIds(); |
| | | </script> |
| | | |
| | | <template> |
| | | <Page auto-content-height> |
| | | <FormModal @success="handleRefresh" /> |
| | | <AuditModalComp @success="handleRefresh" /> |
| | | <CustomerConfirm @success="handleRefresh" /> |
| | | <Grid table-title="äº§åææ¯ç¡®è®¤å½å表"> |
| | | <template #toolbar-tools> |
| | | <TableAction |
| | |
| | | type: 'link', |
| | | icon: ACTION_ICON.AUDIT, |
| | | auth: ['mes:pd-tech-confirm:update'], |
| | | ifShow: row.status === 0, |
| | | onClick: handleStatus.bind(null, row, 1), |
| | | // è稿ä¸å®¡æ ¸ä¸éè¿åå¯æäº¤ï¼å®¡æ ¸ä¸éè¿éä¿®æ¹åéæ°æäº¤ |
| | | ifShow: |
| | | row.status === MesPdTechConfirmStatusEnum.DRAFT || |
| | | row.status === MesPdTechConfirmStatusEnum.REJECTED, |
| | | // å®¡æ ¸äººç±å®¡æ¹é
ç½®ç»ä¸æå®ï¼æäº¤åä»
äºæ¬¡ç¡®è®¤ï¼ä¸åå¼¹éäººæ¡ |
| | | popConfirm: { |
| | | title: '确认æäº¤å®¡æ ¸ï¼æäº¤åç±å®¡æ¹é
ç½®ä¸æå®çå®¡æ ¸äººå¤çã', |
| | | confirm: handleSubmitAudit.bind(null, row), |
| | | }, |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸éè¿', |
| | | label: 'å®¡æ ¸', |
| | | type: 'link', |
| | | icon: ACTION_ICON.AUDIT, |
| | | auth: ['mes:pd-tech-confirm:update'], |
| | | ifShow: row.status === 1, |
| | | onClick: handleStatus.bind(null, row, 2), |
| | | auth: ['mes:pd-tech-confirm:audit'], |
| | | // ä»
ãå¾
å®¡æ ¸ + å½åç»å½ç¨æ·å¨å®¡æ¹é
ç½®çå®¡æ ¸äººååå
ãææ¾ç¤º |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, true), |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸ä¸éè¿', |
| | | type: 'link', |
| | | danger: true, |
| | | auth: ['mes:pd-tech-confirm:audit'], |
| | | // åä¸ï¼ä¸ãå®¡æ ¸ãæå¯¹åºç° |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, false), |
| | | }, |
| | | { |
| | | label: '客æ·ç¡®è®¤', |
| | | type: 'link', |
| | | icon: ACTION_ICON.AUDIT, |
| | | auth: ['mes:pd-tech-confirm:update'], |
| | | ifShow: row.status === 2, |
| | | onClick: handleStatus.bind(null, row, 3), |
| | | ifShow: row.status === MesPdTechConfirmStatusEnum.AUDITED, |
| | | onClick: handleCustomerConfirm.bind(null, row), |
| | | }, |
| | | { |
| | | label: $t('common.edit'), |
| | | type: 'link', |
| | | icon: ACTION_ICON.EDIT, |
| | | auth: ['mes:pd-tech-confirm:update'], |
| | | // ä»
è稿ä¸å®¡æ ¸ä¸éè¿å¯ä¿®æ¹ï¼å
¶ä½ç¶æåæ®å·²éå® |
| | | ifShow: |
| | | row.status === MesPdTechConfirmStatusEnum.DRAFT || |
| | | row.status === MesPdTechConfirmStatusEnum.REJECTED, |
| | | onClick: handleEdit.bind(null, row), |
| | | }, |
| | | { |
| | |
| | | danger: true, |
| | | icon: ACTION_ICON.DELETE, |
| | | auth: ['mes:pd-tech-confirm:delete'], |
| | | // ä»
è稿ä¸å®¡æ ¸ä¸éè¿å¯å é¤ |
| | | ifShow: |
| | | row.status === MesPdTechConfirmStatusEnum.DRAFT || |
| | | row.status === MesPdTechConfirmStatusEnum.REJECTED, |
| | | popConfirm: { |
| | | title: $t('ui.actionMessage.deleteConfirm', [row.confirmNo ?? '']), |
| | | confirm: handleDelete.bind(null, row), |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { VbenFormSchema } from '#/adapter/form'; |
| | | import type { MesPdTechConfirmApi } from '#/api/mes/pd/tech-confirm'; |
| | | |
| | | import { computed, ref } from 'vue'; |
| | | |
| | | import { useVbenModal } from '@vben/common-ui'; |
| | | import { $t } from '@vben/locales'; |
| | | |
| | | import { message } from 'ant-design-vue'; |
| | | |
| | | import { useVbenForm } from '#/adapter/form'; |
| | | import { auditTechConfirm } from '#/api/mes/pd/tech-confirm'; |
| | | |
| | | const emit = defineEmits(['success']); |
| | | |
| | | const pass = ref(true); // true=å®¡æ ¸éè¿ / false=å®¡æ ¸ä¸éè¿ |
| | | const rowData = ref<MesPdTechConfirmApi.TechConfirm>(); |
| | | const getTitle = computed(() => (pass.value ? 'å®¡æ ¸éè¿' : 'å®¡æ ¸ä¸éè¿')); |
| | | |
| | | const [Form, formApi] = useVbenForm({ |
| | | commonConfig: { |
| | | componentProps: { |
| | | class: 'w-full', |
| | | }, |
| | | formItemClass: 'col-span-1', |
| | | labelWidth: 130, |
| | | }, |
| | | wrapperClass: 'grid-cols-1', |
| | | layout: 'horizontal', |
| | | schema: [], |
| | | showDefaultActions: false, |
| | | }); |
| | | |
| | | /** å®¡æ ¸è¡¨ååæ®µï¼ä¸éè¿æ¶å¿
须填ååå */ |
| | | function useAuditSchema(): VbenFormSchema[] { |
| | | return [ |
| | | { |
| | | fieldName: 'reviewRemark', |
| | | label: 'å®¡æ ¸æè§', |
| | | component: 'Textarea', |
| | | formItemClass: 'col-span-1', |
| | | componentProps: { |
| | | rows: 3, |
| | | placeholder: pass.value |
| | | ? '请è¾å
¥å®¡æ ¸æè§ï¼å¯éï¼' |
| | | : '请è¾å
¥ä¸éè¿åå ï¼å¿
å¡«ï¼', |
| | | }, |
| | | rules: pass.value ? '' : 'required', |
| | | }, |
| | | ]; |
| | | } |
| | | |
| | | const [Modal, modalApi] = useVbenModal({ |
| | | async onConfirm() { |
| | | const { valid } = await formApi.validate(); |
| | | if (!valid) { |
| | | return; |
| | | } |
| | | modalApi.lock(); |
| | | const values = await formApi.getValues(); |
| | | try { |
| | | await auditTechConfirm(rowData.value!.id!, pass.value, values.reviewRemark); |
| | | await modalApi.close(); |
| | | emit('success'); |
| | | message.success(pass.value ? 'å®¡æ ¸éè¿' : 'å·²éåï¼å¯ä¿®æ¹åéæ°æäº¤'); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | | }, |
| | | async onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { |
| | | rowData.value = undefined; |
| | | return; |
| | | } |
| | | const data = modalApi.getData<{ |
| | | pass: boolean; |
| | | row: MesPdTechConfirmApi.TechConfirm; |
| | | }>(); |
| | | rowData.value = data.row; |
| | | pass.value = data.pass; |
| | | formApi.setState({ schema: useAuditSchema() }); |
| | | formApi.resetForm(); |
| | | }, |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Modal :title="getTitle" class="w-2/5"> |
| | | <div v-if="rowData" class="mx-4 mb-4 text-sm text-gray-600"> |
| | | <div>确认å½ç¼å·ï¼{{ rowData.confirmNo }}</div> |
| | | <div>产ååç§°ï¼{{ rowData.productName }}</div> |
| | | </div> |
| | | <Form class="mx-4" /> |
| | | </Modal> |
| | | </template> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import { reactive } from 'vue'; |
| | | |
| | | import { useVbenModal } from '@vben/common-ui'; |
| | | |
| | | import { Form, FormItem, Input, message } from 'ant-design-vue'; |
| | | |
| | | import { confirmTechConfirmByCustomer } from '#/api/mes/pd/tech-confirm'; |
| | | |
| | | const emit = defineEmits(['success']); |
| | | |
| | | const formData = reactive({ |
| | | id: 0, |
| | | confirmNo: '', |
| | | customerName: '', |
| | | customerConfirmUser: '', |
| | | }); |
| | | |
| | | const [Modal, modalApi] = useVbenModal({ |
| | | async onConfirm() { |
| | | if (!formData.customerConfirmUser.trim()) { |
| | | message.warning('请è¾å
¥å®¢æ·ç¡®è®¤äºº'); |
| | | return; |
| | | } |
| | | modalApi.lock(); |
| | | try { |
| | | await confirmTechConfirmByCustomer( |
| | | formData.id, |
| | | formData.customerConfirmUser.trim(), |
| | | ); |
| | | await modalApi.close(); |
| | | emit('success'); |
| | | message.success('客æ·ç¡®è®¤æå'); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | | }, |
| | | onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { |
| | | return; |
| | | } |
| | | const data = modalApi.getData<{ |
| | | customerName?: string; |
| | | confirmNo?: string; |
| | | id: number; |
| | | }>(); |
| | | formData.id = data.id; |
| | | formData.confirmNo = data.confirmNo ?? ''; |
| | | formData.customerName = data.customerName ?? ''; |
| | | // é»è®¤å¸¦å
¥å®¢æ·åç§°ä½ä¸ºç¡®è®¤äººï¼å®¢æ·å¯¹æ¥äººå§åå¯ç±ä¸å¡åä¿®æ£ |
| | | formData.customerConfirmUser = data.customerName ?? ''; |
| | | }, |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Modal class="w-1/3" title="客æ·ç¡®è®¤"> |
| | | <Form :label-col="{ style: { width: '100px' } }"> |
| | | <FormItem label="确认å½ç¼å·"> |
| | | {{ formData.confirmNo }} |
| | | </FormItem> |
| | | <FormItem label="客æ·åç§°"> |
| | | {{ formData.customerName }} |
| | | </FormItem> |
| | | <FormItem label="客æ·ç¡®è®¤äºº" required> |
| | | <Input |
| | | v-model:value="formData.customerConfirmUser" |
| | | :maxlength="64" |
| | | placeholder="请è¾å
¥å®¢æ·ç¡®è®¤äººå§å" |
| | | /> |
| | | </FormItem> |
| | | </Form> |
| | | </Modal> |
| | | </template> |
| | |
| | | import { useVbenModal } from '@vben/common-ui'; |
| | | import { $t } from '@vben/locales'; |
| | | |
| | | import { MesPdTechConfirmStatusEnum } from '#/packages/constants/src'; |
| | | |
| | | import { message } from 'ant-design-vue'; |
| | | |
| | | import { useVbenForm } from '#/adapter/form'; |
| | |
| | | return; |
| | | } |
| | | modalApi.lock(); |
| | | // æäº¤è¡¨å |
| | | const data = (await formApi.getValues()) as MesPdTechConfirmApi.TechConfirm; |
| | | // æäº¤è¡¨åï¼åªæäº¤ç¨æ·å¯å¡«åçä¸å¡å段ï¼ç¶æä¸æµç¨æ´¾çåæ®µç±åç«¯ææµç¨æ¨è¿ï¼ä¸åä¼ |
| | | const { |
| | | status, |
| | | drafterId, |
| | | drafterName, |
| | | draftTime, |
| | | reviewerId, |
| | | reviewerName, |
| | | reviewTime, |
| | | reviewRemark, |
| | | customerConfirmUser, |
| | | customerConfirmTime, |
| | | ...values |
| | | } = await formApi.getValues(); |
| | | const data = values as MesPdTechConfirmApi.TechConfirm; |
| | | try { |
| | | await (data.id ? updateTechConfirm(data) : createTechConfirm(data)); |
| | | // å
³éå¹¶æç¤º |
| | |
| | | // å è½½æ°æ® |
| | | const data = modalApi.getData<{ formType: FormType; id?: number }>(); |
| | | formType.value = data.formType; |
| | | formApi.setState({ schema: useFormSchema(formApi) }); |
| | | formApi.setState({ schema: useFormSchema(formType.value, formApi) }); |
| | | formApi.setDisabled(formType.value === 'detail'); |
| | | modalApi.setState({ showConfirmButton: formType.value !== 'detail' }); |
| | | if (!data?.id) { |
| | |
| | | formData.value = await getTechConfirm(data.id); |
| | | // è®¾ç½®å° values |
| | | await formApi.setValues(formData.value); |
| | | // ä»
è稿ä¸å®¡æ ¸ä¸éè¿å¯ä¿®æ¹ï¼å¾
å®¡æ ¸ / å·²å®¡æ ¸ / 客æ·å·²ç¡®è®¤ä¸ºéå®æç»æ |
| | | const editable = |
| | | formData.value?.status === MesPdTechConfirmStatusEnum.DRAFT || |
| | | formData.value?.status === MesPdTechConfirmStatusEnum.REJECTED; |
| | | if (!editable) { |
| | | formApi.setDisabled(true); |
| | | modalApi.setState({ showConfirmButton: false }); |
| | | } |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | |
| | | [BarcodeBizTypeEnum.WORKORDER]: 'project', |
| | | [BarcodeBizTypeEnum.TASK]: 'task', |
| | | }; |
| | | gantt.parse({ |
| | | data: tasks.map((item: any) => ({ |
| | | const data = tasks |
| | | .map((item: any) => ({ |
| | | ...item, |
| | | type: typeMap[item.type] || item.type, |
| | | start_date: item.startDate ? new Date(item.startDate) : undefined, |
| | | end_date: item.endDate ? new Date(item.endDate) : undefined, |
| | | })), |
| | | links: [], |
| | | }); |
| | | })) |
| | | // è¿æ»¤ç¼ºå¤±/éæ³æ¥æçä»»å¡ï¼é¿å
dhtmlx-gantt è®¡ç®æ¶é´è½´æ¶æ valueOf å¼å¸¸ |
| | | .filter( |
| | | (task: any) => |
| | | task.start_date instanceof Date && |
| | | task.end_date instanceof Date && |
| | | !Number.isNaN(task.start_date.getTime()) && |
| | | !Number.isNaN(task.end_date.getTime()), |
| | | ); |
| | | if (data.length === 0) { |
| | | return; |
| | | } |
| | | try { |
| | | gantt.parse({ data, links: [] }); |
| | | } catch (error) { |
| | | console.error('çç¹å¾æ¸²æå¤±è´¥ï¼', error); |
| | | } |
| | | } |
| | | |
| | | watch( |
| | |
| | | import type { VxeTableGridOptions } from '#/adapter/vxe-table'; |
| | | import type { MesWmEquipmentReceiptApi } from '#/api/mes/wm/equipmentreceipt'; |
| | | |
| | | import { useRouter } from 'vue-router'; |
| | | import { ref } from 'vue'; |
| | | |
| | | import { Page, useVbenModal } from '@vben/common-ui'; |
| | | import { MesWmEquipmentReceiptStatusEnum } from '@vben/constants'; |
| | | import { useUserStore } from '@vben/stores'; |
| | | |
| | | import { Button, message, Tag } from 'ant-design-vue'; |
| | | |
| | |
| | | import { |
| | | cancelEquipmentReceipt, |
| | | deleteEquipmentReceipt, |
| | | getEquipmentReceiptApproveProcessList, |
| | | getEquipmentReceiptApproverIds, |
| | | getEquipmentReceiptPage, |
| | | submitEquipmentReceiptApproval, |
| | | } from '#/api/mes/wm/equipmentreceipt'; |
| | | import { $t } from '#/locales'; |
| | | |
| | | import ProcessSelectModal from '#/views/wls/components/process-select-modal.vue'; |
| | | import { EQUIPMENT_RECEIPT_STATUS_MAP, useGridColumns, useGridFormSchema } from './data'; |
| | | import AuditModal from './modules/audit-modal.vue'; |
| | | import Form from './modules/form.vue'; |
| | | |
| | | const router = useRouter(); |
| | | const userStore = useUserStore(); |
| | | const currentUserId = userStore.userInfo?.id; // å½åç»å½ç¨æ· IDï¼ç¨äºå®¡æ ¸äººæé夿 |
| | | |
| | | /** 审æ¹é
ç½®ä¸è¯¥ä¸å¡çå®¡æ ¸äººç¼å·éåï¼å³å®ãå®¡æ ¸ / å®¡æ ¸ä¸éè¿ãæé®æ¯å¦å±ç¤º */ |
| | | const approverIds = ref<number[]>([]); |
| | | |
| | | /** æåå®¡æ ¸äººéåï¼å¤±è´¥æ¶ä¿æä¸ºç©ºï¼æé®ä¸å±ç¤ºï¼ï¼ä¸é»æå表å è½½ */ |
| | | async function loadApproverIds() { |
| | | try { |
| | | approverIds.value = (await getEquipmentReceiptApproverIds()) ?? []; |
| | | } catch { |
| | | approverIds.value = []; |
| | | } |
| | | } |
| | | |
| | | /** å½åç»å½ç¨æ·æ¯å¦ä¸ºè¯¥ä¸å¡çå®¡æ ¸äººï¼ä¸åæ®å¤äºå®¡æ¹ä¸ç¶æ */ |
| | | function canAudit(row: MesWmEquipmentReceiptApi.EquipmentReceipt) { |
| | | return ( |
| | | row.status === MesWmEquipmentReceiptStatusEnum.APPROVING && |
| | | !!currentUserId && |
| | | approverIds.value.includes(currentUserId) |
| | | ); |
| | | } |
| | | |
| | | const [FormModal, formModalApi] = useVbenModal({ |
| | | connectedComponent: Form, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | const [ProcessModal, processModalApi] = useVbenModal({ |
| | | connectedComponent: ProcessSelectModal, |
| | | const [AuditModalComp, auditModalApi] = useVbenModal({ |
| | | connectedComponent: AuditModal, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** å·æ°è¡¨æ ¼ */ |
| | | /** å·æ°è¡¨æ ¼ä¸å®¡æ ¸äººéå */ |
| | | function handleRefresh() { |
| | | gridApi.query(); |
| | | loadApproverIds(); |
| | | } |
| | | |
| | | /** å建设å¤å
¥åºå */ |
| | |
| | | formModalApi.setData({ formType: 'finish', id: row.id }).open(); |
| | | } |
| | | |
| | | /** æäº¤å®¡æ¹ - å
è·åæµç¨å表 */ |
| | | async function handleSubmitApproval(row: MesWmEquipmentReceiptApi.EquipmentReceipt) { |
| | | /** æäº¤å®¡æ¹ - å®¡æ ¸äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãç»ä¸æå®ï¼æ¤å¤æ ééæ© */ |
| | | async function handleSubmitApproval( |
| | | row: MesWmEquipmentReceiptApi.EquipmentReceipt, |
| | | ) { |
| | | const hideLoading = message.loading({ |
| | | content: 'è·åå®¡æ¹æµç¨...', |
| | | content: 'æ£å¨æäº¤å®¡æ¹...', |
| | | duration: 0, |
| | | }); |
| | | try { |
| | | const processList = await getEquipmentReceiptApproveProcessList(); |
| | | hideLoading(); |
| | | if (!processList || processList.length === 0) { |
| | | message.warning('ææ å¯ç¨å®¡æ¹æµç¨ï¼è¯·å
é
ç½® BPM æµç¨'); |
| | | return; |
| | | } |
| | | processModalApi |
| | | .setData({ |
| | | id: row.id, |
| | | processList, |
| | | submitFn: submitEquipmentReceiptApproval, |
| | | }) |
| | | .open(); |
| | | } catch { |
| | | await submitEquipmentReceiptApproval(row.id!); |
| | | message.success('æäº¤å®¡æ¹æå'); |
| | | handleRefresh(); |
| | | } finally { |
| | | hideLoading(); |
| | | } |
| | | } |
| | | |
| | | /** æ¥ç审æ¹è¯¦æ
*/ |
| | | function handleProcessDetail(row: MesWmEquipmentReceiptApi.EquipmentReceipt) { |
| | | if (!row.processInstanceId) { |
| | | message.warning('è¯¥åæ®å°æªæäº¤å®¡æ¹'); |
| | | return; |
| | | } |
| | | router.push({ |
| | | name: 'BpmProcessInstanceDetail', |
| | | query: { id: row.processInstanceId }, |
| | | }); |
| | | /** å®¡æ ¸ - éè¿ / ä¸éè¿ */ |
| | | function handleAudit( |
| | | row: MesWmEquipmentReceiptApi.EquipmentReceipt, |
| | | pass: boolean, |
| | | ) { |
| | | auditModalApi.setData({ pass, row }).open(); |
| | | } |
| | | |
| | | /** å é¤è®¾å¤å
¥åºå */ |
| | |
| | | }); |
| | | |
| | | const StatusEnum = MesWmEquipmentReceiptStatusEnum; |
| | | |
| | | // è¿å
¥é¡µé¢å³æåå®¡æ ¸äººéåï¼ç¨äºæ§å¶å®¡æ ¸æé®æ¾é |
| | | loadApproverIds(); |
| | | </script> |
| | | |
| | | <template> |
| | | <Page auto-content-height><FormModal @success="handleRefresh" /> |
| | | <ProcessModal @success="handleRefresh" /> |
| | | <AuditModalComp @success="handleRefresh" /> |
| | | |
| | | <Grid table-title="设å¤å
¥åºåå表"> |
| | | <template #toolbar-tools> |
| | |
| | | label: 'æäº¤å®¡æ¹', |
| | | type: 'link', |
| | | auth: ['mes:wm:equipment-receipt:submit'], |
| | | // èç¨¿å¯æäº¤ï¼å®¡æ ¸ä¸éè¿ä¼éåè稿ï¼å¯ä¿®æ¹åéæ°æäº¤ |
| | | ifShow: row.status === StatusEnum.PREPARE, |
| | | onClick: handleSubmitApproval.bind(null, row), |
| | | // å®¡æ ¸äººç±å®¡æ¹é
ç½®ç»ä¸æå®ï¼æäº¤åä»
äºæ¬¡ç¡®è®¤ï¼ä¸åå¼¹éæµç¨æ¡ |
| | | popConfirm: { |
| | | title: '确认æäº¤å®¡æ¹ï¼æäº¤åç±å®¡æ¹é
ç½®ä¸æå®çå®¡æ ¸äººå¤çã', |
| | | confirm: handleSubmitApproval.bind(null, row), |
| | | }, |
| | | }, |
| | | { |
| | | label: 'æ¥ç审æ¹', |
| | | label: 'å®¡æ ¸', |
| | | type: 'link', |
| | | auth: ['mes:wm:equipment-receipt:query'], |
| | | ifShow: row.status === StatusEnum.APPROVING, |
| | | onClick: handleProcessDetail.bind(null, row), |
| | | icon: ACTION_ICON.AUDIT, |
| | | auth: ['mes:wm:equipment-receipt:audit'], |
| | | // ä»
ã审æ¹ä¸ + å½åç»å½ç¨æ·å¨å®¡æ¹é
ç½®çå®¡æ ¸äººååå
ãææ¾ç¤º |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, true), |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸ä¸éè¿', |
| | | type: 'link', |
| | | danger: true, |
| | | auth: ['mes:wm:equipment-receipt:audit'], |
| | | // åä¸ï¼ä¸ãå®¡æ ¸ãæå¯¹åºç° |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, false), |
| | | }, |
| | | { |
| | | label: 'æ§è¡å
¥åº', |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { VbenFormSchema } from '#/adapter/form'; |
| | | import type { MesWmEquipmentReceiptApi } from '#/api/mes/wm/equipmentreceipt'; |
| | | |
| | | import { computed, ref } from 'vue'; |
| | | |
| | | import { useVbenModal } from '@vben/common-ui'; |
| | | |
| | | import { message } from 'ant-design-vue'; |
| | | |
| | | import { useVbenForm } from '#/adapter/form'; |
| | | import { auditEquipmentReceipt } from '#/api/mes/wm/equipmentreceipt'; |
| | | |
| | | const emit = defineEmits(['success']); |
| | | |
| | | const pass = ref(true); // true=å®¡æ ¸éè¿ / false=å®¡æ ¸ä¸éè¿ |
| | | const rowData = ref<MesWmEquipmentReceiptApi.EquipmentReceipt>(); |
| | | const getTitle = computed(() => (pass.value ? 'å®¡æ ¸éè¿' : 'å®¡æ ¸ä¸éè¿')); |
| | | |
| | | const [Form, formApi] = useVbenForm({ |
| | | commonConfig: { |
| | | componentProps: { |
| | | class: 'w-full', |
| | | }, |
| | | formItemClass: 'col-span-1', |
| | | labelWidth: 90, |
| | | }, |
| | | wrapperClass: 'grid-cols-1', |
| | | layout: 'horizontal', |
| | | schema: [], |
| | | showDefaultActions: false, |
| | | }); |
| | | |
| | | /** å®¡æ ¸è¡¨ååæ®µï¼ä¸éè¿æ¶å¿
须填ååå */ |
| | | function useAuditSchema(): VbenFormSchema[] { |
| | | return [ |
| | | { |
| | | fieldName: 'reviewRemark', |
| | | label: 'å®¡æ ¸æè§', |
| | | component: 'Textarea', |
| | | formItemClass: 'col-span-1', |
| | | componentProps: { |
| | | rows: 3, |
| | | placeholder: pass.value |
| | | ? '请è¾å
¥å®¡æ ¸æè§ï¼å¯éï¼' |
| | | : '请è¾å
¥ä¸éè¿åå ï¼å¿
å¡«ï¼', |
| | | }, |
| | | rules: pass.value ? '' : 'required', |
| | | }, |
| | | ]; |
| | | } |
| | | |
| | | const [Modal, modalApi] = useVbenModal({ |
| | | async onConfirm() { |
| | | const { valid } = await formApi.validate(); |
| | | if (!valid) { |
| | | return; |
| | | } |
| | | modalApi.lock(); |
| | | const values = await formApi.getValues(); |
| | | try { |
| | | await auditEquipmentReceipt( |
| | | rowData.value!.id!, |
| | | pass.value, |
| | | values.reviewRemark, |
| | | ); |
| | | await modalApi.close(); |
| | | emit('success'); |
| | | message.success(pass.value ? 'å®¡æ ¸éè¿' : 'å·²éåï¼å¯ä¿®æ¹åéæ°æäº¤'); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | | }, |
| | | async onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { |
| | | rowData.value = undefined; |
| | | return; |
| | | } |
| | | const data = modalApi.getData<{ |
| | | pass: boolean; |
| | | row: MesWmEquipmentReceiptApi.EquipmentReceipt; |
| | | }>(); |
| | | rowData.value = data.row; |
| | | pass.value = data.pass; |
| | | formApi.setState({ schema: useAuditSchema() }); |
| | | formApi.resetForm(); |
| | | }, |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Modal :title="getTitle" class="w-2/5"> |
| | | <div v-if="rowData" class="mx-4 mb-4 text-sm text-gray-600"> |
| | | <div>åæ®ç¼ç ï¼{{ rowData.code }}</div> |
| | | <div>åæ®åç§°ï¼{{ rowData.name }}</div> |
| | | </div> |
| | | <Form class="mx-4" /> |
| | | </Modal> |
| | | </template> |
| | |
| | | import type { VxeTableGridOptions } from '#/adapter/vxe-table'; |
| | | import type { MesWmItemReceiptApi } from '#/api/mes/wm/itemreceipt'; |
| | | |
| | | import { ref } from 'vue'; |
| | | |
| | | import { Page, useVbenModal } from '@vben/common-ui'; |
| | | import { MesWmItemReceiptStatusEnum } from '@vben/constants'; |
| | | import { useUserStore } from '@vben/stores'; |
| | | import { downloadFileFromBlobPart } from '@vben/utils'; |
| | | |
| | | import { Button, message } from 'ant-design-vue'; |
| | |
| | | deleteItemReceipt, |
| | | exportItemReceipt, |
| | | generateItemReceiptFromArrivalNotice, |
| | | getItemReceiptApproverIds, |
| | | getItemReceiptPage, |
| | | } from '#/api/mes/wm/itemreceipt'; |
| | | import { $t } from '#/locales'; |
| | | |
| | | import { useGridColumns, useGridFormSchema } from './data'; |
| | | import AuditModal from './modules/audit-modal.vue'; |
| | | import Form from './modules/form.vue'; |
| | | import AnSelectDialog from './modules/an-select-dialog.vue'; |
| | | |
| | | const userStore = useUserStore(); |
| | | const currentUserId = userStore.userInfo?.id; // å½åç»å½ç¨æ· IDï¼ç¨äºå®¡æ ¸äººæé夿 |
| | | |
| | | /** 审æ¹é
ç½®ä¸è¯¥ä¸å¡çå®¡æ ¸äººç¼å·éåï¼å³å®ãå®¡æ ¸ / å®¡æ ¸ä¸éè¿ãæé®æ¯å¦å±ç¤º */ |
| | | const approverIds = ref<number[]>([]); |
| | | |
| | | /** æåå®¡æ ¸äººéåï¼å¤±è´¥æ¶ä¿æä¸ºç©ºï¼æé®ä¸å±ç¤ºï¼ï¼ä¸é»æå表å è½½ */ |
| | | async function loadApproverIds() { |
| | | try { |
| | | approverIds.value = (await getItemReceiptApproverIds()) ?? []; |
| | | } catch { |
| | | approverIds.value = []; |
| | | } |
| | | } |
| | | |
| | | /** å½åç»å½ç¨æ·æ¯å¦ä¸ºè¯¥ä¸å¡çå®¡æ ¸äººï¼ä¸åæ®å¤äºå®¡æ¹ä¸ç¶æ */ |
| | | function canAudit(row: MesWmItemReceiptApi.ItemReceipt) { |
| | | return ( |
| | | row.status === MesWmItemReceiptStatusEnum.APPROVING && |
| | | !!currentUserId && |
| | | approverIds.value.includes(currentUserId) |
| | | ); |
| | | } |
| | | |
| | | const [FormModal, formModalApi] = useVbenModal({ |
| | | connectedComponent: Form, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | const [AuditModalComp, auditModalApi] = useVbenModal({ |
| | | connectedComponent: AuditModal, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** å·æ°è¡¨æ ¼ */ |
| | | /** å·æ°è¡¨æ ¼ä¸å®¡æ ¸äººéå */ |
| | | function handleRefresh() { |
| | | gridApi.query(); |
| | | loadApproverIds(); |
| | | } |
| | | |
| | | /** å建éè´å
¥åºå */ |
| | |
| | | } |
| | | } |
| | | |
| | | /** å®¡æ ¸ - éè¿ / ä¸éè¿ */ |
| | | function handleAudit(row: MesWmItemReceiptApi.ItemReceipt, pass: boolean) { |
| | | auditModalApi.setData({ pass, row }).open(); |
| | | } |
| | | |
| | | /** 导åºè¡¨æ ¼ */ |
| | | async function handleExport() { |
| | | const data = await exportItemReceipt(await gridApi.formApi.getValues()); |
| | |
| | | }, |
| | | } as VxeTableGridOptions<MesWmItemReceiptApi.ItemReceipt>, |
| | | }); |
| | | |
| | | // è¿å
¥é¡µé¢å³æåå®¡æ ¸äººéåï¼ç¨äºæ§å¶å®¡æ ¸æé®æ¾é |
| | | loadApproverIds(); |
| | | </script> |
| | | |
| | | <template> |
| | | <Page auto-content-height> |
| | | <FormModal @success="handleRefresh" /> |
| | | <AuditModalComp @success="handleRefresh" /> |
| | | <AnSelectModal @selected="handleArrivalNoticeSelected" /> |
| | | |
| | | <Grid table-title="éè´å
¥åºåå表"> |
| | |
| | | onClick: handleStock.bind(null, row), |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸', |
| | | type: 'link', |
| | | icon: ACTION_ICON.AUDIT, |
| | | auth: ['mes:wm-item-receipt:audit'], |
| | | // ä»
ã审æ¹ä¸ + å½åç»å½ç¨æ·å¨å®¡æ¹é
ç½®çå®¡æ ¸äººååå
ãææ¾ç¤º |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, true), |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸ä¸éè¿', |
| | | type: 'link', |
| | | danger: true, |
| | | auth: ['mes:wm-item-receipt:audit'], |
| | | // åä¸ï¼ä¸ãå®¡æ ¸ãæå¯¹åºç° |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, false), |
| | | }, |
| | | { |
| | | label: 'æ§è¡å
¥åº', |
| | | type: 'link', |
| | | auth: ['mes:wm-item-receipt:finish'], |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { VbenFormSchema } from '#/adapter/form'; |
| | | import type { MesWmItemReceiptApi } from '#/api/mes/wm/itemreceipt'; |
| | | |
| | | import { computed, ref } from 'vue'; |
| | | |
| | | import { useVbenModal } from '@vben/common-ui'; |
| | | |
| | | import { message } from 'ant-design-vue'; |
| | | |
| | | import { useVbenForm } from '#/adapter/form'; |
| | | import { auditItemReceipt } from '#/api/mes/wm/itemreceipt'; |
| | | |
| | | const emit = defineEmits(['success']); |
| | | |
| | | const pass = ref(true); // true=å®¡æ ¸éè¿ / false=å®¡æ ¸ä¸éè¿ |
| | | const rowData = ref<MesWmItemReceiptApi.ItemReceipt>(); |
| | | const getTitle = computed(() => (pass.value ? 'å®¡æ ¸éè¿' : 'å®¡æ ¸ä¸éè¿')); |
| | | |
| | | const [Form, formApi] = useVbenForm({ |
| | | commonConfig: { |
| | | componentProps: { |
| | | class: 'w-full', |
| | | }, |
| | | formItemClass: 'col-span-1', |
| | | labelWidth: 90, |
| | | }, |
| | | wrapperClass: 'grid-cols-1', |
| | | layout: 'horizontal', |
| | | schema: [], |
| | | showDefaultActions: false, |
| | | }); |
| | | |
| | | /** å®¡æ ¸è¡¨ååæ®µï¼ä¸éè¿æ¶å¿
须填ååå */ |
| | | function useAuditSchema(): VbenFormSchema[] { |
| | | return [ |
| | | { |
| | | fieldName: 'reviewRemark', |
| | | label: 'å®¡æ ¸æè§', |
| | | component: 'Textarea', |
| | | formItemClass: 'col-span-1', |
| | | componentProps: { |
| | | rows: 3, |
| | | placeholder: pass.value |
| | | ? '请è¾å
¥å®¡æ ¸æè§ï¼å¯éï¼' |
| | | : '请è¾å
¥ä¸éè¿åå ï¼å¿
å¡«ï¼', |
| | | }, |
| | | rules: pass.value ? '' : 'required', |
| | | }, |
| | | ]; |
| | | } |
| | | |
| | | const [Modal, modalApi] = useVbenModal({ |
| | | async onConfirm() { |
| | | const { valid } = await formApi.validate(); |
| | | if (!valid) { |
| | | return; |
| | | } |
| | | modalApi.lock(); |
| | | const values = await formApi.getValues(); |
| | | try { |
| | | await auditItemReceipt(rowData.value!.id!, pass.value, values.reviewRemark); |
| | | await modalApi.close(); |
| | | emit('success'); |
| | | message.success(pass.value ? 'å®¡æ ¸éè¿' : 'å·²éåï¼å¯ä¿®æ¹åéæ°æäº¤'); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | | }, |
| | | async onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { |
| | | rowData.value = undefined; |
| | | return; |
| | | } |
| | | const data = modalApi.getData<{ |
| | | pass: boolean; |
| | | row: MesWmItemReceiptApi.ItemReceipt; |
| | | }>(); |
| | | rowData.value = data.row; |
| | | pass.value = data.pass; |
| | | formApi.setState({ schema: useAuditSchema() }); |
| | | formApi.resetForm(); |
| | | }, |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Modal :title="getTitle" class="w-2/5"> |
| | | <div v-if="rowData" class="mx-4 mb-4 text-sm text-gray-600"> |
| | | <div>å
¥åºåç¼ç ï¼{{ rowData.code }}</div> |
| | | <div>å
¥åºååç§°ï¼{{ rowData.name }}</div> |
| | | </div> |
| | | <Form class="mx-4" /> |
| | | </Modal> |
| | | </template> |
| | |
| | | import type { VxeTableGridOptions } from '#/adapter/vxe-table'; |
| | | import type { MesWmMiscIssueApi } from '#/api/mes/wm/miscissue'; |
| | | |
| | | import { useRouter } from 'vue-router'; |
| | | import { ref } from 'vue'; |
| | | |
| | | import { Page, useVbenModal } from '@vben/common-ui'; |
| | | import { MesWmMiscIssueStatusEnum } from '@vben/constants'; |
| | | import { useUserStore } from '@vben/stores'; |
| | | import { downloadFileFromBlobPart } from '@vben/utils'; |
| | | |
| | | import { Button, message } from 'ant-design-vue'; |
| | |
| | | cancelMiscIssue, |
| | | deleteMiscIssue, |
| | | exportMiscIssue, |
| | | getMiscIssueApproveProcessList, |
| | | getMiscIssueApproverIds, |
| | | getMiscIssuePage, |
| | | submitMiscIssueApproval, |
| | | } from '#/api/mes/wm/miscissue'; |
| | | import { $t } from '#/locales'; |
| | | |
| | | import ProcessSelectModal from '#/views/wls/components/process-select-modal.vue'; |
| | | import { useGridColumns, useGridFormSchema } from './data'; |
| | | import AuditModal from './modules/audit-modal.vue'; |
| | | import Form from './modules/form.vue'; |
| | | |
| | | const router = useRouter(); |
| | | const userStore = useUserStore(); |
| | | const currentUserId = userStore.userInfo?.id; // å½åç»å½ç¨æ· IDï¼ç¨äºå®¡æ ¸äººæé夿 |
| | | |
| | | /** 审æ¹é
ç½®ä¸è¯¥ä¸å¡çå®¡æ ¸äººç¼å·éåï¼å³å®ãå®¡æ ¸ / å®¡æ ¸ä¸éè¿ãæé®æ¯å¦å±ç¤º */ |
| | | const approverIds = ref<number[]>([]); |
| | | |
| | | /** æåå®¡æ ¸äººéåï¼å¤±è´¥æ¶ä¿æä¸ºç©ºï¼æé®ä¸å±ç¤ºï¼ï¼ä¸é»æå表å è½½ */ |
| | | async function loadApproverIds() { |
| | | try { |
| | | approverIds.value = (await getMiscIssueApproverIds()) ?? []; |
| | | } catch { |
| | | approverIds.value = []; |
| | | } |
| | | } |
| | | |
| | | /** å½åç»å½ç¨æ·æ¯å¦ä¸ºè¯¥ä¸å¡çå®¡æ ¸äººï¼ä¸åæ®å¤äºå®¡æ¹ä¸ç¶æ */ |
| | | function canAudit(row: MesWmMiscIssueApi.MiscIssue) { |
| | | return ( |
| | | row.status === MesWmMiscIssueStatusEnum.APPROVING && |
| | | !!currentUserId && |
| | | approverIds.value.includes(currentUserId) |
| | | ); |
| | | } |
| | | |
| | | const [FormModal, formModalApi] = useVbenModal({ |
| | | connectedComponent: Form, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | const [ProcessModal, processModalApi] = useVbenModal({ |
| | | connectedComponent: ProcessSelectModal, |
| | | const [AuditModalComp, auditModalApi] = useVbenModal({ |
| | | connectedComponent: AuditModal, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** å·æ°è¡¨æ ¼ */ |
| | | /** å·æ°è¡¨æ ¼ä¸å®¡æ ¸äººéå */ |
| | | function handleRefresh() { |
| | | gridApi.query(); |
| | | loadApproverIds(); |
| | | } |
| | | |
| | | /** å建æé¡¹åºåºå */ |
| | |
| | | formModalApi.setData({ formType: 'finish', id: row.id }).open(); |
| | | } |
| | | |
| | | /** æäº¤å®¡æ¹ - å
è·åæµç¨å表 */ |
| | | /** æäº¤å®¡æ¹ - å®¡æ ¸äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãç»ä¸æå®ï¼æ¤å¤æ ééæ© */ |
| | | async function handleSubmitApproval(row: MesWmMiscIssueApi.MiscIssue) { |
| | | const hideLoading = message.loading({ |
| | | content: 'è·åå®¡æ¹æµç¨...', |
| | | content: 'æ£å¨æäº¤å®¡æ¹...', |
| | | duration: 0, |
| | | }); |
| | | try { |
| | | const processList = await getMiscIssueApproveProcessList(); |
| | | hideLoading(); |
| | | if (!processList || processList.length === 0) { |
| | | message.warning('ææ å¯ç¨å®¡æ¹æµç¨ï¼è¯·å
é
ç½® BPM æµç¨'); |
| | | return; |
| | | } |
| | | processModalApi |
| | | .setData({ |
| | | id: row.id, |
| | | processList, |
| | | submitFn: submitMiscIssueApproval, |
| | | }) |
| | | .open(); |
| | | } catch { |
| | | await submitMiscIssueApproval(row.id!); |
| | | message.success('æäº¤å®¡æ¹æå'); |
| | | handleRefresh(); |
| | | } finally { |
| | | hideLoading(); |
| | | } |
| | | } |
| | | |
| | | /** æ¥ç审æ¹è¯¦æ
*/ |
| | | function handleProcessDetail(row: MesWmMiscIssueApi.MiscIssue) { |
| | | if (!row.processInstanceId) { |
| | | message.warning('è¯¥åæ®å°æªæäº¤å®¡æ¹'); |
| | | return; |
| | | } |
| | | router.push({ |
| | | name: 'BpmProcessInstanceDetail', |
| | | query: { id: row.processInstanceId }, |
| | | }); |
| | | /** å®¡æ ¸ - éè¿ / ä¸éè¿ */ |
| | | function handleAudit(row: MesWmMiscIssueApi.MiscIssue, pass: boolean) { |
| | | auditModalApi.setData({ pass, row }).open(); |
| | | } |
| | | |
| | | /** å 餿项åºåºå */ |
| | |
| | | }, |
| | | } as VxeTableGridOptions<MesWmMiscIssueApi.MiscIssue>, |
| | | }); |
| | | |
| | | // è¿å
¥é¡µé¢å³æåå®¡æ ¸äººéåï¼ç¨äºæ§å¶å®¡æ ¸æé®æ¾é |
| | | loadApproverIds(); |
| | | </script> |
| | | |
| | | <template> |
| | | <Page auto-content-height><FormModal @success="handleRefresh" /> |
| | | <ProcessModal @success="handleRefresh" /> |
| | | <Page auto-content-height> |
| | | <FormModal @success="handleRefresh" /> |
| | | <AuditModalComp @success="handleRefresh" /> |
| | | |
| | | <Grid table-title="æé¡¹åºåºåå表"> |
| | | <template #toolbar-tools> |
| | |
| | | type: 'link', |
| | | auth: ['mes:wm-misc-issue:update'], |
| | | ifShow: row.status === MesWmMiscIssueStatusEnum.PREPARE, |
| | | onClick: handleSubmitApproval.bind(null, row), |
| | | // å®¡æ ¸äººç±å®¡æ¹é
ç½®ç»ä¸æå®ï¼æäº¤åä»
äºæ¬¡ç¡®è®¤ï¼ä¸åå¼¹éæµç¨æ¡ |
| | | popConfirm: { |
| | | title: '确认æäº¤å®¡æ¹ï¼æäº¤åç±å®¡æ¹é
ç½®ä¸æå®çå®¡æ ¸äººå¤çã', |
| | | confirm: handleSubmitApproval.bind(null, row), |
| | | }, |
| | | }, |
| | | { |
| | | label: 'æ¥ç审æ¹', |
| | | label: 'å®¡æ ¸', |
| | | type: 'link', |
| | | auth: ['mes:wm-misc-issue:query'], |
| | | ifShow: row.status === MesWmMiscIssueStatusEnum.APPROVING, |
| | | onClick: handleProcessDetail.bind(null, row), |
| | | icon: ACTION_ICON.AUDIT, |
| | | auth: ['mes:wm-misc-issue:audit'], |
| | | // ä»
ã审æ¹ä¸ + å½åç»å½ç¨æ·å¨å®¡æ¹é
ç½®çå®¡æ ¸äººååå
ãææ¾ç¤º |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, true), |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸ä¸éè¿', |
| | | type: 'link', |
| | | danger: true, |
| | | auth: ['mes:wm-misc-issue:audit'], |
| | | // åä¸ï¼ä¸ãå®¡æ ¸ãæå¯¹åºç° |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, false), |
| | | }, |
| | | { |
| | | label: 'æ§è¡åºåº', |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { VbenFormSchema } from '#/adapter/form'; |
| | | import type { MesWmMiscIssueApi } from '#/api/mes/wm/miscissue'; |
| | | |
| | | import { computed, ref } from 'vue'; |
| | | |
| | | import { useVbenModal } from '@vben/common-ui'; |
| | | |
| | | import { message } from 'ant-design-vue'; |
| | | |
| | | import { useVbenForm } from '#/adapter/form'; |
| | | import { auditMiscIssue } from '#/api/mes/wm/miscissue'; |
| | | |
| | | const emit = defineEmits(['success']); |
| | | |
| | | const pass = ref(true); // true=å®¡æ ¸éè¿ / false=å®¡æ ¸ä¸éè¿ |
| | | const rowData = ref<MesWmMiscIssueApi.MiscIssue>(); |
| | | const getTitle = computed(() => (pass.value ? 'å®¡æ ¸éè¿' : 'å®¡æ ¸ä¸éè¿')); |
| | | |
| | | const [Form, formApi] = useVbenForm({ |
| | | commonConfig: { |
| | | componentProps: { |
| | | class: 'w-full', |
| | | }, |
| | | formItemClass: 'col-span-1', |
| | | labelWidth: 90, |
| | | }, |
| | | wrapperClass: 'grid-cols-1', |
| | | layout: 'horizontal', |
| | | schema: [], |
| | | showDefaultActions: false, |
| | | }); |
| | | |
| | | /** å®¡æ ¸è¡¨ååæ®µï¼ä¸éè¿æ¶å¿
须填ååå */ |
| | | function useAuditSchema(): VbenFormSchema[] { |
| | | return [ |
| | | { |
| | | fieldName: 'reviewRemark', |
| | | label: 'å®¡æ ¸æè§', |
| | | component: 'Textarea', |
| | | formItemClass: 'col-span-1', |
| | | componentProps: { |
| | | rows: 3, |
| | | placeholder: pass.value |
| | | ? '请è¾å
¥å®¡æ ¸æè§ï¼å¯éï¼' |
| | | : '请è¾å
¥ä¸éè¿åå ï¼å¿
å¡«ï¼', |
| | | }, |
| | | rules: pass.value ? '' : 'required', |
| | | }, |
| | | ]; |
| | | } |
| | | |
| | | const [Modal, modalApi] = useVbenModal({ |
| | | async onConfirm() { |
| | | const { valid } = await formApi.validate(); |
| | | if (!valid) { |
| | | return; |
| | | } |
| | | modalApi.lock(); |
| | | const values = await formApi.getValues(); |
| | | try { |
| | | await auditMiscIssue(rowData.value!.id!, pass.value, values.reviewRemark); |
| | | await modalApi.close(); |
| | | emit('success'); |
| | | message.success(pass.value ? 'å®¡æ ¸éè¿' : 'å·²éåï¼å¯ä¿®æ¹åéæ°æäº¤'); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | | }, |
| | | async onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { |
| | | rowData.value = undefined; |
| | | return; |
| | | } |
| | | const data = modalApi.getData<{ |
| | | pass: boolean; |
| | | row: MesWmMiscIssueApi.MiscIssue; |
| | | }>(); |
| | | rowData.value = data.row; |
| | | pass.value = data.pass; |
| | | formApi.setState({ schema: useAuditSchema() }); |
| | | formApi.resetForm(); |
| | | }, |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Modal :title="getTitle" class="w-2/5"> |
| | | <div v-if="rowData" class="mx-4 mb-4 text-sm text-gray-600"> |
| | | <div>åºåºåç¼å·ï¼{{ rowData.code }}</div> |
| | | <div>åºåºååç§°ï¼{{ rowData.name }}</div> |
| | | </div> |
| | | <Form class="mx-4" /> |
| | | </Modal> |
| | | </template> |
| | |
| | | import type { VxeTableGridOptions } from '#/adapter/vxe-table'; |
| | | import type { MesWmMiscReceiptApi } from '#/api/mes/wm/miscreceipt'; |
| | | |
| | | import { useRouter } from 'vue-router'; |
| | | import { ref } from 'vue'; |
| | | |
| | | import { Page, useVbenModal } from '@vben/common-ui'; |
| | | import { MesWmMiscReceiptStatusEnum } from '@vben/constants'; |
| | | import { useUserStore } from '@vben/stores'; |
| | | import { downloadFileFromBlobPart } from '@vben/utils'; |
| | | |
| | | import { Button, message } from 'ant-design-vue'; |
| | |
| | | cancelMiscReceipt, |
| | | deleteMiscReceipt, |
| | | exportMiscReceipt, |
| | | getMiscReceiptApproveProcessList, |
| | | getMiscReceiptApproverIds, |
| | | getMiscReceiptPage, |
| | | submitMiscReceiptApproval, |
| | | } from '#/api/mes/wm/miscreceipt'; |
| | | import { $t } from '#/locales'; |
| | | |
| | | import ProcessSelectModal from '#/views/wls/components/process-select-modal.vue'; |
| | | import { useGridColumns, useGridFormSchema } from './data'; |
| | | import AuditModal from './modules/audit-modal.vue'; |
| | | import Form from './modules/form.vue'; |
| | | |
| | | const router = useRouter(); |
| | | const userStore = useUserStore(); |
| | | const currentUserId = userStore.userInfo?.id; // å½åç»å½ç¨æ· IDï¼ç¨äºå®¡æ ¸äººæé夿 |
| | | |
| | | /** 审æ¹é
ç½®ä¸è¯¥ä¸å¡çå®¡æ ¸äººç¼å·éåï¼å³å®ãå®¡æ ¸ / å®¡æ ¸ä¸éè¿ãæé®æ¯å¦å±ç¤º */ |
| | | const approverIds = ref<number[]>([]); |
| | | |
| | | /** æåå®¡æ ¸äººéåï¼å¤±è´¥æ¶ä¿æä¸ºç©ºï¼æé®ä¸å±ç¤ºï¼ï¼ä¸é»æå表å è½½ */ |
| | | async function loadApproverIds() { |
| | | try { |
| | | approverIds.value = (await getMiscReceiptApproverIds()) ?? []; |
| | | } catch { |
| | | approverIds.value = []; |
| | | } |
| | | } |
| | | |
| | | /** å½åç»å½ç¨æ·æ¯å¦ä¸ºè¯¥ä¸å¡çå®¡æ ¸äººï¼ä¸åæ®å¤äºå®¡æ¹ä¸ç¶æ */ |
| | | function canAudit(row: MesWmMiscReceiptApi.MiscReceipt) { |
| | | return ( |
| | | row.status === MesWmMiscReceiptStatusEnum.APPROVING && |
| | | !!currentUserId && |
| | | approverIds.value.includes(currentUserId) |
| | | ); |
| | | } |
| | | |
| | | const [FormModal, formModalApi] = useVbenModal({ |
| | | connectedComponent: Form, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | const [ProcessModal, processModalApi] = useVbenModal({ |
| | | connectedComponent: ProcessSelectModal, |
| | | const [AuditModalComp, auditModalApi] = useVbenModal({ |
| | | connectedComponent: AuditModal, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** å·æ°è¡¨æ ¼ */ |
| | | /** å·æ°è¡¨æ ¼ä¸å®¡æ ¸äººéå */ |
| | | function handleRefresh() { |
| | | gridApi.query(); |
| | | loadApproverIds(); |
| | | } |
| | | |
| | | /** å建æé¡¹å
¥åºå */ |
| | |
| | | formModalApi.setData({ formType: 'finish', id: row.id }).open(); |
| | | } |
| | | |
| | | /** æäº¤å®¡æ¹ - å
è·åæµç¨å表 */ |
| | | /** æäº¤å®¡æ¹ - å®¡æ ¸äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãç»ä¸æå®ï¼æ¤å¤æ ééæ© */ |
| | | async function handleSubmitApproval(row: MesWmMiscReceiptApi.MiscReceipt) { |
| | | const hideLoading = message.loading({ |
| | | content: 'è·åå®¡æ¹æµç¨...', |
| | | content: 'æ£å¨æäº¤å®¡æ¹...', |
| | | duration: 0, |
| | | }); |
| | | try { |
| | | const processList = await getMiscReceiptApproveProcessList(); |
| | | hideLoading(); |
| | | if (!processList || processList.length === 0) { |
| | | message.warning('ææ å¯ç¨å®¡æ¹æµç¨ï¼è¯·å
é
ç½® BPM æµç¨'); |
| | | return; |
| | | } |
| | | processModalApi |
| | | .setData({ |
| | | id: row.id, |
| | | processList, |
| | | submitFn: submitMiscReceiptApproval, |
| | | }) |
| | | .open(); |
| | | } catch { |
| | | await submitMiscReceiptApproval(row.id!); |
| | | message.success('æäº¤å®¡æ¹æå'); |
| | | handleRefresh(); |
| | | } finally { |
| | | hideLoading(); |
| | | } |
| | | } |
| | | |
| | | /** æ¥ç审æ¹è¯¦æ
*/ |
| | | function handleProcessDetail(row: MesWmMiscReceiptApi.MiscReceipt) { |
| | | if (!row.processInstanceId) { |
| | | message.warning('è¯¥åæ®å°æªæäº¤å®¡æ¹'); |
| | | return; |
| | | } |
| | | router.push({ |
| | | name: 'BpmProcessInstanceDetail', |
| | | query: { id: row.processInstanceId }, |
| | | }); |
| | | /** å®¡æ ¸ - éè¿ / ä¸éè¿ */ |
| | | function handleAudit(row: MesWmMiscReceiptApi.MiscReceipt, pass: boolean) { |
| | | auditModalApi.setData({ pass, row }).open(); |
| | | } |
| | | |
| | | /** å 餿项å
¥åºå */ |
| | |
| | | }, |
| | | } as VxeTableGridOptions<MesWmMiscReceiptApi.MiscReceipt>, |
| | | }); |
| | | |
| | | // è¿å
¥é¡µé¢å³æåå®¡æ ¸äººéåï¼ç¨äºæ§å¶å®¡æ ¸æé®æ¾é |
| | | loadApproverIds(); |
| | | </script> |
| | | |
| | | <template> |
| | | <Page auto-content-height><FormModal @success="handleRefresh" /> |
| | | <ProcessModal @success="handleRefresh" /> |
| | | <Page auto-content-height> |
| | | <FormModal @success="handleRefresh" /> |
| | | <AuditModalComp @success="handleRefresh" /> |
| | | |
| | | <Grid table-title="æé¡¹å
¥åºåå表"> |
| | | <template #toolbar-tools> |
| | |
| | | type: 'link', |
| | | auth: ['mes:wm:misc-receipt:submit'], |
| | | ifShow: row.status === MesWmMiscReceiptStatusEnum.PREPARE, |
| | | onClick: handleSubmitApproval.bind(null, row), |
| | | // å®¡æ ¸äººç±å®¡æ¹é
ç½®ç»ä¸æå®ï¼æäº¤åä»
äºæ¬¡ç¡®è®¤ï¼ä¸åå¼¹éæµç¨æ¡ |
| | | popConfirm: { |
| | | title: '确认æäº¤å®¡æ¹ï¼æäº¤åç±å®¡æ¹é
ç½®ä¸æå®çå®¡æ ¸äººå¤çã', |
| | | confirm: handleSubmitApproval.bind(null, row), |
| | | }, |
| | | }, |
| | | { |
| | | label: 'æ¥ç审æ¹', |
| | | label: 'å®¡æ ¸', |
| | | type: 'link', |
| | | auth: ['mes:wm:misc-receipt:query'], |
| | | ifShow: row.status === MesWmMiscReceiptStatusEnum.APPROVING, |
| | | onClick: handleProcessDetail.bind(null, row), |
| | | icon: ACTION_ICON.AUDIT, |
| | | auth: ['mes:wm:misc-receipt:audit'], |
| | | // ä»
ã审æ¹ä¸ + å½åç»å½ç¨æ·å¨å®¡æ¹é
ç½®çå®¡æ ¸äººååå
ãææ¾ç¤º |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, true), |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸ä¸éè¿', |
| | | type: 'link', |
| | | danger: true, |
| | | auth: ['mes:wm:misc-receipt:audit'], |
| | | // åä¸ï¼ä¸ãå®¡æ ¸ãæå¯¹åºç° |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, false), |
| | | }, |
| | | { |
| | | label: 'æ§è¡å
¥åº', |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { VbenFormSchema } from '#/adapter/form'; |
| | | import type { MesWmMiscReceiptApi } from '#/api/mes/wm/miscreceipt'; |
| | | |
| | | import { computed, ref } from 'vue'; |
| | | |
| | | import { useVbenModal } from '@vben/common-ui'; |
| | | |
| | | import { message } from 'ant-design-vue'; |
| | | |
| | | import { useVbenForm } from '#/adapter/form'; |
| | | import { auditMiscReceipt } from '#/api/mes/wm/miscreceipt'; |
| | | |
| | | const emit = defineEmits(['success']); |
| | | |
| | | const pass = ref(true); // true=å®¡æ ¸éè¿ / false=å®¡æ ¸ä¸éè¿ |
| | | const rowData = ref<MesWmMiscReceiptApi.MiscReceipt>(); |
| | | const getTitle = computed(() => (pass.value ? 'å®¡æ ¸éè¿' : 'å®¡æ ¸ä¸éè¿')); |
| | | |
| | | const [Form, formApi] = useVbenForm({ |
| | | commonConfig: { |
| | | componentProps: { |
| | | class: 'w-full', |
| | | }, |
| | | formItemClass: 'col-span-1', |
| | | labelWidth: 90, |
| | | }, |
| | | wrapperClass: 'grid-cols-1', |
| | | layout: 'horizontal', |
| | | schema: [], |
| | | showDefaultActions: false, |
| | | }); |
| | | |
| | | /** å®¡æ ¸è¡¨ååæ®µï¼ä¸éè¿æ¶å¿
须填ååå */ |
| | | function useAuditSchema(): VbenFormSchema[] { |
| | | return [ |
| | | { |
| | | fieldName: 'reviewRemark', |
| | | label: 'å®¡æ ¸æè§', |
| | | component: 'Textarea', |
| | | formItemClass: 'col-span-1', |
| | | componentProps: { |
| | | rows: 3, |
| | | placeholder: pass.value |
| | | ? '请è¾å
¥å®¡æ ¸æè§ï¼å¯éï¼' |
| | | : '请è¾å
¥ä¸éè¿åå ï¼å¿
å¡«ï¼', |
| | | }, |
| | | rules: pass.value ? '' : 'required', |
| | | }, |
| | | ]; |
| | | } |
| | | |
| | | const [Modal, modalApi] = useVbenModal({ |
| | | async onConfirm() { |
| | | const { valid } = await formApi.validate(); |
| | | if (!valid) { |
| | | return; |
| | | } |
| | | modalApi.lock(); |
| | | const values = await formApi.getValues(); |
| | | try { |
| | | await auditMiscReceipt(rowData.value!.id!, pass.value, values.reviewRemark); |
| | | await modalApi.close(); |
| | | emit('success'); |
| | | message.success(pass.value ? 'å®¡æ ¸éè¿' : 'å·²éåï¼å¯ä¿®æ¹åéæ°æäº¤'); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | | }, |
| | | async onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { |
| | | rowData.value = undefined; |
| | | return; |
| | | } |
| | | const data = modalApi.getData<{ |
| | | pass: boolean; |
| | | row: MesWmMiscReceiptApi.MiscReceipt; |
| | | }>(); |
| | | rowData.value = data.row; |
| | | pass.value = data.pass; |
| | | formApi.setState({ schema: useAuditSchema() }); |
| | | formApi.resetForm(); |
| | | }, |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Modal :title="getTitle" class="w-2/5"> |
| | | <div v-if="rowData" class="mx-4 mb-4 text-sm text-gray-600"> |
| | | <div>å
¥åºåç¼å·ï¼{{ rowData.code }}</div> |
| | | <div>å
¥åºååç§°ï¼{{ rowData.name }}</div> |
| | | </div> |
| | | <Form class="mx-4" /> |
| | | </Modal> |
| | | </template> |
| | |
| | | import type { VxeTableGridOptions } from '#/adapter/vxe-table'; |
| | | import type { MesWmReturnVendorApi } from '#/api/mes/wm/returnvendor'; |
| | | |
| | | import { useRouter } from 'vue-router'; |
| | | import { ref } from 'vue'; |
| | | |
| | | import { Page, useVbenModal } from '@vben/common-ui'; |
| | | import { MesWmReturnVendorStatusEnum } from '@vben/constants'; |
| | | import { useUserStore } from '@vben/stores'; |
| | | import { downloadFileFromBlobPart } from '@vben/utils'; |
| | | |
| | | import { Button, message } from 'ant-design-vue'; |
| | |
| | | cancelReturnVendor, |
| | | deleteReturnVendor, |
| | | exportReturnVendor, |
| | | getReturnVendorApproveProcessList, |
| | | getReturnVendorApproverIds, |
| | | getReturnVendorPage, |
| | | submitReturnVendorApproval, |
| | | } from '#/api/mes/wm/returnvendor'; |
| | | import { $t } from '#/locales'; |
| | | |
| | | import ProcessSelectModal from '#/views/wls/components/process-select-modal.vue'; |
| | | import { useGridColumns, useGridFormSchema } from './data'; |
| | | import AuditModal from './modules/audit-modal.vue'; |
| | | import Form from './modules/form.vue'; |
| | | |
| | | const router = useRouter(); |
| | | const userStore = useUserStore(); |
| | | const currentUserId = userStore.userInfo?.id; // å½åç»å½ç¨æ· IDï¼ç¨äºå®¡æ ¸äººæé夿 |
| | | |
| | | /** 审æ¹é
ç½®ä¸è¯¥ä¸å¡çå®¡æ ¸äººç¼å·éåï¼å³å®ãå®¡æ ¸ / å®¡æ ¸ä¸éè¿ãæé®æ¯å¦å±ç¤º */ |
| | | const approverIds = ref<number[]>([]); |
| | | |
| | | /** æåå®¡æ ¸äººéåï¼å¤±è´¥æ¶ä¿æä¸ºç©ºï¼æé®ä¸å±ç¤ºï¼ï¼ä¸é»æå表å è½½ */ |
| | | async function loadApproverIds() { |
| | | try { |
| | | approverIds.value = (await getReturnVendorApproverIds()) ?? []; |
| | | } catch { |
| | | approverIds.value = []; |
| | | } |
| | | } |
| | | |
| | | /** å½åç»å½ç¨æ·æ¯å¦ä¸ºè¯¥ä¸å¡çå®¡æ ¸äººï¼ä¸åæ®å¤äºå¾
æ£è´§ç¶æ */ |
| | | function canAudit(row: MesWmReturnVendorApi.ReturnVendor) { |
| | | return ( |
| | | row.status === MesWmReturnVendorStatusEnum.APPROVING && |
| | | !!currentUserId && |
| | | approverIds.value.includes(currentUserId) |
| | | ); |
| | | } |
| | | |
| | | const [FormModal, formModalApi] = useVbenModal({ |
| | | connectedComponent: Form, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | const [ProcessModal, processModalApi] = useVbenModal({ |
| | | connectedComponent: ProcessSelectModal, |
| | | const [AuditModalComp, auditModalApi] = useVbenModal({ |
| | | connectedComponent: AuditModal, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** å·æ°è¡¨æ ¼ */ |
| | | /** å·æ°è¡¨æ ¼ä¸å®¡æ ¸äººéå */ |
| | | function handleRefresh() { |
| | | gridApi.query(); |
| | | loadApproverIds(); |
| | | } |
| | | |
| | | /** å建ä¾åºåéè´§å */ |
| | |
| | | formModalApi.setData({ formType: 'stock', id: row.id }).open(); |
| | | } |
| | | |
| | | /** æäº¤å®¡æ¹ - å
è·åæµç¨å表 */ |
| | | /** æäº¤å®¡æ¹ - å®¡æ ¸äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãç»ä¸æå®ï¼æ¤å¤æ ééæ© */ |
| | | async function handleSubmitApproval(row: MesWmReturnVendorApi.ReturnVendor) { |
| | | const hideLoading = message.loading({ |
| | | content: 'è·åå®¡æ¹æµç¨...', |
| | | content: 'æ£å¨æäº¤å®¡æ¹...', |
| | | duration: 0, |
| | | }); |
| | | try { |
| | | const processList = await getReturnVendorApproveProcessList(); |
| | | hideLoading(); |
| | | if (!processList || processList.length === 0) { |
| | | message.warning('ææ å¯ç¨å®¡æ¹æµç¨ï¼è¯·å
é
ç½® BPM æµç¨'); |
| | | return; |
| | | } |
| | | processModalApi |
| | | .setData({ |
| | | id: row.id, |
| | | processList, |
| | | submitFn: submitReturnVendorApproval, |
| | | }) |
| | | .open(); |
| | | } catch { |
| | | await submitReturnVendorApproval(row.id!); |
| | | message.success('æäº¤å®¡æ¹æå'); |
| | | handleRefresh(); |
| | | } finally { |
| | | hideLoading(); |
| | | } |
| | | } |
| | | |
| | | /** æ¥ç审æ¹è¯¦æ
*/ |
| | | function handleProcessDetail(row: MesWmReturnVendorApi.ReturnVendor) { |
| | | if (!row.processInstanceId) { |
| | | message.warning('è¯¥åæ®å°æªæäº¤å®¡æ¹'); |
| | | return; |
| | | } |
| | | router.push({ |
| | | name: 'BpmProcessInstanceDetail', |
| | | query: { id: row.processInstanceId }, |
| | | }); |
| | | /** å®¡æ ¸ - éè¿ / ä¸éè¿ */ |
| | | function handleAudit(row: MesWmReturnVendorApi.ReturnVendor, pass: boolean) { |
| | | auditModalApi.setData({ pass, row }).open(); |
| | | } |
| | | |
| | | /** 宿éè´§ */ |
| | |
| | | }, |
| | | } as VxeTableGridOptions<MesWmReturnVendorApi.ReturnVendor>, |
| | | }); |
| | | |
| | | // è¿å
¥é¡µé¢å³æåå®¡æ ¸äººéåï¼ç¨äºæ§å¶å®¡æ ¸æé®æ¾é |
| | | loadApproverIds(); |
| | | </script> |
| | | |
| | | <template> |
| | | <Page auto-content-height><FormModal @success="handleRefresh" /> |
| | | <ProcessModal @success="handleRefresh" /> |
| | | <Page auto-content-height> |
| | | <FormModal @success="handleRefresh" /> |
| | | <AuditModalComp @success="handleRefresh" /> |
| | | |
| | | <Grid table-title="ä¾åºåéè´§åå表"> |
| | | <template #toolbar-tools> |
| | |
| | | type: 'link', |
| | | auth: ['mes:wm-return-vendor:update'], |
| | | ifShow: row.status === MesWmReturnVendorStatusEnum.PREPARE, |
| | | onClick: handleSubmitApproval.bind(null, row), |
| | | // å®¡æ ¸äººç±å®¡æ¹é
ç½®ç»ä¸æå®ï¼æäº¤åä»
äºæ¬¡ç¡®è®¤ï¼ä¸åå¼¹éæµç¨æ¡ |
| | | popConfirm: { |
| | | title: '确认æäº¤å®¡æ¹ï¼æäº¤åç±å®¡æ¹é
ç½®ä¸æå®çå®¡æ ¸äººå¤çã', |
| | | confirm: handleSubmitApproval.bind(null, row), |
| | | }, |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸', |
| | | type: 'link', |
| | | icon: ACTION_ICON.AUDIT, |
| | | auth: ['mes:wm-return-vendor:audit'], |
| | | // ä»
ãå¾
æ£è´§ + å½åç»å½ç¨æ·å¨å®¡æ¹é
ç½®çå®¡æ ¸äººååå
ãææ¾ç¤º |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, true), |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸ä¸éè¿', |
| | | type: 'link', |
| | | danger: true, |
| | | auth: ['mes:wm-return-vendor:audit'], |
| | | // åä¸ï¼ä¸ãå®¡æ ¸ãæå¯¹åºç° |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, false), |
| | | }, |
| | | { |
| | | label: $t('common.edit'), |
| | |
| | | title: $t('ui.actionMessage.deleteConfirm', [row.code]), |
| | | confirm: handleDelete.bind(null, row), |
| | | }, |
| | | }, |
| | | { |
| | | label: 'æ¥ç审æ¹', |
| | | type: 'link', |
| | | auth: ['mes:wm-return-vendor:query'], |
| | | ifShow: row.status === MesWmReturnVendorStatusEnum.APPROVING, |
| | | onClick: handleProcessDetail.bind(null, row), |
| | | }, |
| | | { |
| | | label: 'æ§è¡æ£è´§', |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { VbenFormSchema } from '#/adapter/form'; |
| | | import type { MesWmReturnVendorApi } from '#/api/mes/wm/returnvendor'; |
| | | |
| | | import { computed, ref } from 'vue'; |
| | | |
| | | import { useVbenModal } from '@vben/common-ui'; |
| | | |
| | | import { message } from 'ant-design-vue'; |
| | | |
| | | import { useVbenForm } from '#/adapter/form'; |
| | | import { auditReturnVendor } from '#/api/mes/wm/returnvendor'; |
| | | |
| | | const emit = defineEmits(['success']); |
| | | |
| | | const pass = ref(true); // true=å®¡æ ¸éè¿ / false=å®¡æ ¸ä¸éè¿ |
| | | const rowData = ref<MesWmReturnVendorApi.ReturnVendor>(); |
| | | const getTitle = computed(() => (pass.value ? 'å®¡æ ¸éè¿' : 'å®¡æ ¸ä¸éè¿')); |
| | | |
| | | const [Form, formApi] = useVbenForm({ |
| | | commonConfig: { |
| | | componentProps: { |
| | | class: 'w-full', |
| | | }, |
| | | formItemClass: 'col-span-1', |
| | | labelWidth: 90, |
| | | }, |
| | | wrapperClass: 'grid-cols-1', |
| | | layout: 'horizontal', |
| | | schema: [], |
| | | showDefaultActions: false, |
| | | }); |
| | | |
| | | /** å®¡æ ¸è¡¨ååæ®µï¼ä¸éè¿æ¶å¿
须填ååå */ |
| | | function useAuditSchema(): VbenFormSchema[] { |
| | | return [ |
| | | { |
| | | fieldName: 'reviewRemark', |
| | | label: 'å®¡æ ¸æè§', |
| | | component: 'Textarea', |
| | | formItemClass: 'col-span-1', |
| | | componentProps: { |
| | | rows: 3, |
| | | placeholder: pass.value |
| | | ? '请è¾å
¥å®¡æ ¸æè§ï¼å¯éï¼' |
| | | : '请è¾å
¥ä¸éè¿åå ï¼å¿
å¡«ï¼', |
| | | }, |
| | | rules: pass.value ? '' : 'required', |
| | | }, |
| | | ]; |
| | | } |
| | | |
| | | const [Modal, modalApi] = useVbenModal({ |
| | | async onConfirm() { |
| | | const { valid } = await formApi.validate(); |
| | | if (!valid) { |
| | | return; |
| | | } |
| | | modalApi.lock(); |
| | | const values = await formApi.getValues(); |
| | | try { |
| | | await auditReturnVendor(rowData.value!.id!, pass.value, values.reviewRemark); |
| | | await modalApi.close(); |
| | | emit('success'); |
| | | message.success(pass.value ? 'å®¡æ ¸éè¿' : 'å·²éåï¼å¯ä¿®æ¹åéæ°æäº¤'); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | | }, |
| | | async onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { |
| | | rowData.value = undefined; |
| | | return; |
| | | } |
| | | const data = modalApi.getData<{ |
| | | pass: boolean; |
| | | row: MesWmReturnVendorApi.ReturnVendor; |
| | | }>(); |
| | | rowData.value = data.row; |
| | | pass.value = data.pass; |
| | | formApi.setState({ schema: useAuditSchema() }); |
| | | formApi.resetForm(); |
| | | }, |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Modal :title="getTitle" class="w-2/5"> |
| | | <div v-if="rowData" class="mx-4 mb-4 text-sm text-gray-600"> |
| | | <div>éè´§åç¼å·ï¼{{ rowData.code }}</div> |
| | | <div>ä¾åºåï¼{{ rowData.vendorName }}</div> |
| | | </div> |
| | | <Form class="mx-4" /> |
| | | </Modal> |
| | | </template> |
| | |
| | | import type { MesWmStockTakingTaskApi } from '#/api/mes/wm/stocktaking/task'; |
| | | |
| | | import { ref } from 'vue'; |
| | | import { useRouter } from 'vue-router'; |
| | | |
| | | import { Page, useVbenModal } from '@vben/common-ui'; |
| | | import { MesWmStockTakingTaskStatusEnum } from '@vben/constants'; |
| | | import { useUserStore } from '@vben/stores'; |
| | | import { downloadFileFromBlobPart } from '@vben/utils'; |
| | | |
| | | import { Button, message } from 'ant-design-vue'; |
| | |
| | | cancelStockTaking, |
| | | deleteStockTaking, |
| | | exportStockTaking, |
| | | getStockTakingApproveProcessList, |
| | | getStockTakingApproverIds, |
| | | getStockTakingPage, |
| | | submitStockTakingApproval, |
| | | } from '#/api/mes/wm/stocktaking/task'; |
| | |
| | | } from '#/api/wls/stocktaking/task/line'; |
| | | import { $t } from '#/locales'; |
| | | |
| | | import ProcessSelectModal from '#/views/wls/components/process-select-modal.vue'; |
| | | import { useGridColumns, useGridFormSchema } from './data'; |
| | | import AuditModal from './modules/audit-modal.vue'; |
| | | import Form from './modules/form.vue'; |
| | | |
| | | const router = useRouter(); |
| | | const userStore = useUserStore(); |
| | | const currentUserId = userStore.userInfo?.id; // å½åç»å½ç¨æ· IDï¼ç¨äºå®¡æ ¸äººæé夿 |
| | | |
| | | /** 审æ¹é
ç½®ä¸è¯¥ä¸å¡çå®¡æ ¸äººç¼å·éåï¼å³å®ãå®¡æ ¸ / å®¡æ ¸ä¸éè¿ãæé®æ¯å¦å±ç¤º */ |
| | | const approverIds = ref<number[]>([]); |
| | | |
| | | /** æåå®¡æ ¸äººéåï¼å¤±è´¥æ¶ä¿æä¸ºç©ºï¼æé®ä¸å±ç¤ºï¼ï¼ä¸é»æå表å è½½ */ |
| | | async function loadApproverIds() { |
| | | try { |
| | | approverIds.value = (await getStockTakingApproverIds()) ?? []; |
| | | } catch { |
| | | approverIds.value = []; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ¬è½®çç¹ç»æå®¡æ¹æ¯å¦å·²æäº¤ãæ£å¨çå¾
å®¡æ ¸ |
| | | * |
| | | * ä»»å¡ç¶æãçç¹ä¸ãåæ¶æ¿è½½çç¹ä¸ä¸ç»æå®¡æ¹ä¸ä¸¤ä¸ªé¶æ®µï¼ |
| | | * reviewTime éç©ºä¸ reviewerId ä¸ºç©ºè¡¨ç¤ºç»æå·²æäº¤ãçå¾
å®¡æ ¸ï¼ |
| | | * å®¡æ ¸ä¸éè¿å reviewerId é空ï¼ä»»å¡åå°å¯éæ°æäº¤ç»æå®¡æ¹çç¶æã |
| | | */ |
| | | function isResultApprovalPending(row: MesWmStockTakingTaskApi.StockTakingTask) { |
| | | return !row.reviewerId && !!row.reviewTime; |
| | | } |
| | | |
| | | /** å½åç»å½ç¨æ·æ¯å¦ä¸ºè¯¥ä¸å¡çå®¡æ ¸äººï¼ä¸ç»æå®¡æ¹å·²æäº¤çå¾
å®¡æ ¸ */ |
| | | function canAudit(row: MesWmStockTakingTaskApi.StockTakingTask) { |
| | | return ( |
| | | row.status === MesWmStockTakingTaskStatusEnum.APPROVING && |
| | | isResultApprovalPending(row) && |
| | | !!currentUserId && |
| | | approverIds.value.includes(currentUserId) |
| | | ); |
| | | } |
| | | |
| | | /** æ¯å¦å¯æäº¤ç»æå®¡æ¹ï¼çç¹ä¸ä¸æ¬è½®ç»æå®¡æ¹å°æªæäº¤ */ |
| | | function canSubmitApproval( |
| | | row: MesWmStockTakingTaskApi.StockTakingTask, |
| | | ) { |
| | | return ( |
| | | row.status === MesWmStockTakingTaskStatusEnum.APPROVING && |
| | | !isResultApprovalPending(row) |
| | | ); |
| | | } |
| | | |
| | | const [FormModal, formModalApi] = useVbenModal({ |
| | | connectedComponent: Form, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | const [ProcessModal, processModalApi] = useVbenModal({ |
| | | connectedComponent: ProcessSelectModal, |
| | | const [AuditModalComp, auditModalApi] = useVbenModal({ |
| | | connectedComponent: AuditModal, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** å·æ°è¡¨æ ¼ */ |
| | | /** å·æ°è¡¨æ ¼ä¸å®¡æ ¸äººéå */ |
| | | function handleRefresh() { |
| | | gridApi.query(); |
| | | loadApproverIds(); |
| | | } |
| | | |
| | | /** å建çç¹ä»»å¡ */ |
| | |
| | | formModalApi.setData({ formType: 'submit', id: row.id }).open(); |
| | | } |
| | | |
| | | /** æäº¤ç»æå®¡æ¹ - å
è·åæµç¨å表 */ |
| | | /** æäº¤ç»æå®¡æ¹ - å®¡æ ¸äººç±ãç³»ç»ç®¡ç - 审æ¹é
ç½®ãç»ä¸æå®ï¼æ¤å¤æ ééæ© */ |
| | | async function handleSubmitApproval(row: MesWmStockTakingTaskApi.StockTakingTask) { |
| | | const hideLoading = message.loading({ |
| | | content: 'è·åå®¡æ¹æµç¨...', |
| | | content: 'æ£å¨æäº¤ç»æå®¡æ¹...', |
| | | duration: 0, |
| | | }); |
| | | try { |
| | | const processList = await getStockTakingApproveProcessList(); |
| | | hideLoading(); |
| | | if (!processList || processList.length === 0) { |
| | | message.warning('ææ å¯ç¨å®¡æ¹æµç¨ï¼è¯·å
é
ç½® BPM æµç¨'); |
| | | return; |
| | | } |
| | | processModalApi |
| | | .setData({ |
| | | id: row.id, |
| | | processList, |
| | | submitFn: submitStockTakingApproval, |
| | | }) |
| | | .open(); |
| | | } catch { |
| | | await submitStockTakingApproval(row.id!); |
| | | message.success('æäº¤ç»æå®¡æ¹æå'); |
| | | handleRefresh(); |
| | | } finally { |
| | | hideLoading(); |
| | | } |
| | | } |
| | | |
| | | /** æ¥ç审æ¹è¯¦æ
*/ |
| | | function handleProcessDetail(row: MesWmStockTakingTaskApi.StockTakingTask) { |
| | | if (!row.processInstanceId) { |
| | | message.warning('该任å¡å°æªæäº¤ç»æå®¡æ¹'); |
| | | return; |
| | | } |
| | | router.push({ |
| | | name: 'BpmProcessInstanceDetail', |
| | | query: { id: row.processInstanceId }, |
| | | }); |
| | | /** å®¡æ ¸ - éè¿ / ä¸éè¿ */ |
| | | function handleAudit(row: MesWmStockTakingTaskApi.StockTakingTask, pass: boolean) { |
| | | auditModalApi.setData({ pass, row }).open(); |
| | | } |
| | | |
| | | /** åæ¶çç¹ä»»å¡ */ |
| | |
| | | }); |
| | | |
| | | const StatusEnum = MesWmStockTakingTaskStatusEnum; |
| | | |
| | | // è¿å
¥é¡µé¢å³æåå®¡æ ¸äººéåï¼ç¨äºæ§å¶å®¡æ ¸æé®æ¾é |
| | | loadApproverIds(); |
| | | </script> |
| | | |
| | | <template> |
| | | <Page auto-content-height><FormModal @success="handleRefresh" /> |
| | | <ProcessModal @success="handleRefresh" /> |
| | | <Page auto-content-height> |
| | | <FormModal @success="handleRefresh" /> |
| | | <AuditModalComp @success="handleRefresh" /> |
| | | |
| | | <Grid table-title="çç¹ä»»å¡å表"> |
| | | <template #toolbar-tools> |
| | |
| | | label: 'æäº¤ç»æå®¡æ¹', |
| | | type: 'link', |
| | | auth: ['mes:wm-stock-taking-task:update'], |
| | | ifShow: row.status === StatusEnum.APPROVING, |
| | | onClick: handleSubmitApproval.bind(null, row), |
| | | // çç¹ä¸ä¸æ¬è½®ç»æå®¡æ¹å°æªæäº¤æ¶æå¯æäº¤ |
| | | ifShow: canSubmitApproval(row), |
| | | // å®¡æ ¸äººç±å®¡æ¹é
ç½®ç»ä¸æå®ï¼æäº¤åä»
äºæ¬¡ç¡®è®¤ï¼ä¸åå¼¹éæµç¨æ¡ |
| | | popConfirm: { |
| | | title: '确认æäº¤ç»æå®¡æ¹ï¼æäº¤åç±å®¡æ¹é
ç½®ä¸æå®çå®¡æ ¸äººå¤çã', |
| | | confirm: handleSubmitApproval.bind(null, row), |
| | | }, |
| | | }, |
| | | { |
| | | label: 'æ¥ç审æ¹', |
| | | label: 'å®¡æ ¸', |
| | | type: 'link', |
| | | auth: ['mes:wm-stock-taking-task:query'], |
| | | ifShow: row.status === StatusEnum.APPROVING, |
| | | onClick: handleProcessDetail.bind(null, row), |
| | | icon: ACTION_ICON.AUDIT, |
| | | auth: ['mes:wm-stock-taking-task:audit'], |
| | | // ä»
ãç»æå®¡æ¹ä¸ + å½åç»å½ç¨æ·å¨å®¡æ¹é
ç½®çå®¡æ ¸äººååå
ãææ¾ç¤º |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, true), |
| | | }, |
| | | { |
| | | label: 'å®¡æ ¸ä¸éè¿', |
| | | type: 'link', |
| | | danger: true, |
| | | auth: ['mes:wm-stock-taking-task:audit'], |
| | | // åä¸ï¼ä¸ãå®¡æ ¸ãæå¯¹åºç° |
| | | ifShow: canAudit(row), |
| | | onClick: handleAudit.bind(null, row, false), |
| | | }, |
| | | { |
| | | label: 'åæ¶', |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { VbenFormSchema } from '#/adapter/form'; |
| | | import type { MesWmStockTakingTaskApi } from '#/api/mes/wm/stocktaking/task'; |
| | | |
| | | import { computed, ref } from 'vue'; |
| | | |
| | | import { useVbenModal } from '@vben/common-ui'; |
| | | |
| | | import { message } from 'ant-design-vue'; |
| | | |
| | | import { useVbenForm } from '#/adapter/form'; |
| | | import { auditStockTakingResult } from '#/api/mes/wm/stocktaking/task'; |
| | | |
| | | const emit = defineEmits(['success']); |
| | | |
| | | const pass = ref(true); // true=å®¡æ ¸éè¿ / false=å®¡æ ¸ä¸éè¿ |
| | | const rowData = ref<MesWmStockTakingTaskApi.StockTakingTask>(); |
| | | const getTitle = computed(() => (pass.value ? 'å®¡æ ¸éè¿' : 'å®¡æ ¸ä¸éè¿')); |
| | | |
| | | const [Form, formApi] = useVbenForm({ |
| | | commonConfig: { |
| | | componentProps: { |
| | | class: 'w-full', |
| | | }, |
| | | formItemClass: 'col-span-1', |
| | | labelWidth: 90, |
| | | }, |
| | | wrapperClass: 'grid-cols-1', |
| | | layout: 'horizontal', |
| | | schema: [], |
| | | showDefaultActions: false, |
| | | }); |
| | | |
| | | /** å®¡æ ¸è¡¨ååæ®µï¼ä¸éè¿æ¶å¿
须填ååå */ |
| | | function useAuditSchema(): VbenFormSchema[] { |
| | | return [ |
| | | { |
| | | fieldName: 'reviewRemark', |
| | | label: 'å®¡æ ¸æè§', |
| | | component: 'Textarea', |
| | | formItemClass: 'col-span-1', |
| | | componentProps: { |
| | | rows: 3, |
| | | placeholder: pass.value |
| | | ? '请è¾å
¥å®¡æ ¸æè§ï¼å¯éï¼' |
| | | : '请è¾å
¥ä¸éè¿åå ï¼å¿
å¡«ï¼', |
| | | }, |
| | | rules: pass.value ? '' : 'required', |
| | | }, |
| | | ]; |
| | | } |
| | | |
| | | const [Modal, modalApi] = useVbenModal({ |
| | | async onConfirm() { |
| | | const { valid } = await formApi.validate(); |
| | | if (!valid) { |
| | | return; |
| | | } |
| | | modalApi.lock(); |
| | | const values = await formApi.getValues(); |
| | | try { |
| | | await auditStockTakingResult( |
| | | rowData.value!.id!, |
| | | pass.value, |
| | | values.reviewRemark, |
| | | ); |
| | | await modalApi.close(); |
| | | emit('success'); |
| | | message.success(pass.value ? 'å®¡æ ¸éè¿' : 'å·²éåï¼å¯ä¿®æ¹åéæ°æäº¤'); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | | }, |
| | | async onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { |
| | | rowData.value = undefined; |
| | | return; |
| | | } |
| | | const data = modalApi.getData<{ |
| | | pass: boolean; |
| | | row: MesWmStockTakingTaskApi.StockTakingTask; |
| | | }>(); |
| | | rowData.value = data.row; |
| | | pass.value = data.pass; |
| | | formApi.setState({ schema: useAuditSchema() }); |
| | | formApi.resetForm(); |
| | | }, |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Modal :title="getTitle" class="w-2/5"> |
| | | <div v-if="rowData" class="mx-4 mb-4 text-sm text-gray-600"> |
| | | <div>ä»»å¡ç¼ç ï¼{{ rowData.code }}</div> |
| | | <div>ä»»å¡åç§°ï¼{{ rowData.name }}</div> |
| | | </div> |
| | | <Form class="mx-4" /> |
| | | </Modal> |
| | | </template> |