liu
5 天以前 fe2d6627b8f1002af7a31b08f6f43bec034d04ee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
<script lang="ts" setup>
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { AssetRequisitionApi } from '#/api/asset/requisition';
 
import { Page, useVbenModal } from '@vben/common-ui';
 
import { message, Tag } from 'ant-design-vue';
 
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import {
  deleteAssetRequisition,
  getAssetRequisitionPage,
} from '#/api/asset/requisition';
import { $t } from '#/locales';
 
import { useGridColumns, useGridFormSchema } from './data';
import Form from './modules/form.vue';
import ReturnForm from './modules/return-form.vue';
 
defineOptions({ name: 'AssetRequisition' });
 
const [FormModal, formModalApi] = useVbenModal({
  connectedComponent: Form,
  destroyOnClose: true,
});
 
const [ReturnModal, returnModalApi] = useVbenModal({
  connectedComponent: ReturnForm,
  destroyOnClose: true,
});
 
function handleRefresh() {
  gridApi.query();
}
 
function handleCreate() {
  formModalApi.setData({ formType: 'create' }).open();
}
 
function handleEdit(row: AssetRequisitionApi.AssetRequisition) {
  formModalApi.setData({ formType: 'edit', id: row.id }).open();
}
 
function handleDetail(row: AssetRequisitionApi.AssetRequisition) {
  formModalApi.setData({ formType: 'detail', id: row.id }).open();
}
 
function handleReturn(row: AssetRequisitionApi.AssetRequisition) {
  returnModalApi.setData(row).open();
}
 
async function handleDelete(row: AssetRequisitionApi.AssetRequisition) {
  const hideLoading = message.loading({
    content: $t('ui.actionMessage.deleting'),
    duration: 0,
  });
  try {
    await deleteAssetRequisition(row.id!);
    message.success($t('ui.actionMessage.deleteSuccess'));
    handleRefresh();
  } finally {
    hideLoading();
  }
}
 
const [Grid, gridApi] = useVbenVxeGrid({
  formOptions: {
    schema: useGridFormSchema(),
  },
  gridOptions: {
    columns: useGridColumns(),
    height: 'auto',
    keepSource: true,
    proxyConfig: {
      ajax: {
        query: async ({ page }, formValues) => {
          return await getAssetRequisitionPage({
            pageNo: page.currentPage,
            pageSize: page.pageSize,
            ...formValues,
          });
        },
      },
    },
    rowConfig: { keyField: 'id', isHover: true },
    toolbarConfig: { refresh: true, search: true },
  } as VxeTableGridOptions<AssetRequisitionApi.AssetRequisition>,
});
</script>
 
<template>
  <Page auto-content-height>
    <FormModal @success="handleRefresh" />
    <ReturnModal @success="handleRefresh" />
    <Grid table-title="资产领用管理">
      <template #toolbar-tools>
        <TableAction
          :actions="[
            {
              label: '新增领用',
              type: 'primary',
              icon: ACTION_ICON.ADD,
              auth: ['asset:requisition:create'],
              onClick: handleCreate,
            },
          ]"
        />
      </template>
      <template #category="{ row }">
        <Tag v-if="row.category === 1" color="default">易耗品</Tag>
        <Tag v-else-if="row.category === 2" color="processing">办公资产</Tag>
        <Tag v-else color="gold">固定资产</Tag>
      </template>
      <template #returnStatus="{ row }">
        <Tag v-if="row.returnStatus === 1" color="warning">未归还</Tag>
        <Tag v-else-if="row.returnStatus === 2" color="processing">部分归还</Tag>
        <Tag v-else color="success">已归还</Tag>
      </template>
      <template #actions="{ row }">
        <TableAction
          :actions="[
            {
              label: $t('common.detail'),
              type: 'link',
              icon: ACTION_ICON.VIEW,
              auth: ['asset:requisition:query'],
              onClick: handleDetail.bind(null, row),
            },
            {
              label: '归还',
              type: 'link',
              icon: ACTION_ICON.UPLOAD,
              auth: ['asset:requisition:return'],
              ifShow: () => (row.remainingQuantity ?? 0) > 0,
              onClick: handleReturn.bind(null, row),
            },
            {
              label: $t('common.edit'),
              type: 'link',
              icon: ACTION_ICON.EDIT,
              auth: ['asset:requisition:update'],
              onClick: handleEdit.bind(null, row),
            },
            {
              label: $t('common.delete'),
              type: 'link',
              danger: true,
              icon: ACTION_ICON.DELETE,
              auth: ['asset:requisition:delete'],
              ifShow: () => (row.returnedQuantity ?? 0) === 0,
              popConfirm: {
                title: `确认删除领用记录「${row.no}」吗?删除后未归还数量将退回库存`,
                confirm: handleDelete.bind(null, row),
              },
            },
          ]"
        />
      </template>
    </Grid>
  </Page>
</template>