|
@@ -2,7 +2,7 @@
|
|
|
import BasicModal from '/@/components/Modal/src/BasicModal.vue';
|
|
|
import { useModal, useModalInner } from '/@/components/Modal';
|
|
|
import { Steps } from 'ant-design-vue';
|
|
|
- import { ref, unref } from 'vue';
|
|
|
+ import { ref, unref, reactive } from 'vue';
|
|
|
import { useTable } from '/@/components/Table';
|
|
|
import BasicForm from '/@/components/Form/src/BasicForm.vue';
|
|
|
import { useForm } from '/@/components/Form';
|
|
@@ -19,6 +19,7 @@
|
|
|
postTextbookTextbookSubscription,
|
|
|
putTextbookTextbookSubscription,
|
|
|
} from '/@/services/apis/TextbookSubscriptionController';
|
|
|
+ import { cloneDeep, uniqueId } from 'lodash-es';
|
|
|
const step = Steps.Step;
|
|
|
const selectRow = ref<any>([]);
|
|
|
const thisStep = ref(0);
|
|
@@ -26,6 +27,10 @@
|
|
|
const selectUserList = ref<any>([]);
|
|
|
const isUpdate = ref(true);
|
|
|
const modelRef = ref<Recordable>({});
|
|
|
+ const state = reactive<{ isSearch: boolean; sourceData: any[] }>({
|
|
|
+ isSearch: false,
|
|
|
+ sourceData: [],
|
|
|
+ });
|
|
|
|
|
|
const [addReg, { openModal: addModelOpen }] = useModal();
|
|
|
const [historyViewReg, { openModal: historyViewOpen }] = useModal();
|
|
@@ -93,6 +98,13 @@
|
|
|
showActionButtonGroup: false,
|
|
|
});
|
|
|
|
|
|
+ const updateSourceData = (record) => {
|
|
|
+ const index = state.sourceData.findIndex((item) => item.uuid === record.uuid);
|
|
|
+ if (index > -1) {
|
|
|
+ state.sourceData[index] = cloneDeep(record);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
const handleChangeDiscount = (record) => {
|
|
|
if (record.discount < 1) {
|
|
|
record.discount = 1;
|
|
@@ -101,6 +113,7 @@
|
|
|
record.discount = 10;
|
|
|
}
|
|
|
record.price = Number((Number(record.sourcePrice || 0) * record.discount) / 10).toFixed(2);
|
|
|
+ updateSourceData(record);
|
|
|
};
|
|
|
|
|
|
const handleChangePrice = (record) => {
|
|
@@ -109,14 +122,14 @@
|
|
|
} else {
|
|
|
record.discount = 0;
|
|
|
}
|
|
|
+ updateSourceData(record);
|
|
|
};
|
|
|
|
|
|
const [modalReg, { closeModal, setModalProps }] = useModalInner(async (data) => {
|
|
|
isUpdate.value = !!data?.isUpdate;
|
|
|
modelRef.value = { ...data.baseData };
|
|
|
-
|
|
|
+ getForm().resetFields();
|
|
|
setModalProps({ loading: true });
|
|
|
-
|
|
|
if (unref(isUpdate)) {
|
|
|
const resData = await getTextbookSubscriptionInfo({ id: data.baseData.id });
|
|
|
modelRef.value = { ...resData };
|
|
@@ -127,8 +140,9 @@
|
|
|
item.teacherSubscriptionNumber = item.teacherNum;
|
|
|
item.courseName = item.courseSubjectIdCn;
|
|
|
item.sourcePrice = item.pricing;
|
|
|
+ item.uuid = uniqueId();
|
|
|
});
|
|
|
-
|
|
|
+ state.sourceData = resData.textbookSubscriptionItemList;
|
|
|
setTableData(resData.textbookSubscriptionItemList);
|
|
|
thisStep.value = 1;
|
|
|
} else {
|
|
@@ -156,11 +170,12 @@
|
|
|
closeModal();
|
|
|
};
|
|
|
const [selectModalReg, { openModal: selectModalOpen }] = useModal();
|
|
|
- const [tableRef, { setTableData, getDataSource, setSelectedRowKeys }] = useTable({
|
|
|
+
|
|
|
+ const [tableRef, { getForm, setTableData, getDataSource, setSelectedRowKeys }] = useTable({
|
|
|
title: '征订列表',
|
|
|
columns: textbookColumns,
|
|
|
bordered: true,
|
|
|
- rowKey: 'id',
|
|
|
+ rowKey: 'uuid',
|
|
|
rowSelection: {
|
|
|
type: 'checkbox',
|
|
|
onChange: (selectedRowKeys) => {
|
|
@@ -176,6 +191,51 @@
|
|
|
fixed: 'right',
|
|
|
},
|
|
|
resizeHeightOffset: 80,
|
|
|
+
|
|
|
+ useSearchForm: true,
|
|
|
+ formConfig: {
|
|
|
+ labelWidth: 100,
|
|
|
+ schemas: [
|
|
|
+ {
|
|
|
+ label: '书名',
|
|
|
+ field: 'bookName',
|
|
|
+ component: 'Input',
|
|
|
+ colProps: { span: 8 },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '书号',
|
|
|
+ field: 'issn',
|
|
|
+ component: 'Input',
|
|
|
+ colProps: { span: 8 },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '课程',
|
|
|
+ field: 'courseName',
|
|
|
+ component: 'Input',
|
|
|
+ colProps: { span: 8 },
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ submitFunc: async () => {
|
|
|
+ const values = getForm().getFieldsValue();
|
|
|
+ let searchData: any[] = cloneDeep(state.sourceData);
|
|
|
+
|
|
|
+ if (values.bookName || values.issn || values.courseName) {
|
|
|
+ if (values.bookName) {
|
|
|
+ searchData = searchData.filter((item) => item.bookName.includes(values.bookName));
|
|
|
+ }
|
|
|
+ if (values.issn) {
|
|
|
+ searchData = searchData.filter((item) => item.issn.includes(values.issn));
|
|
|
+ }
|
|
|
+ if (values.courseName) {
|
|
|
+ searchData = searchData.filter((item) => item.courseName.includes(values.courseName));
|
|
|
+ }
|
|
|
+ state.isSearch = true;
|
|
|
+ } else {
|
|
|
+ state.isSearch = false;
|
|
|
+ }
|
|
|
+ setTableData(searchData);
|
|
|
+ },
|
|
|
+ },
|
|
|
});
|
|
|
const handleAdd = () => {
|
|
|
addModelOpen(true, {
|
|
@@ -183,27 +243,28 @@
|
|
|
});
|
|
|
};
|
|
|
const handleSuccess = (e) => {
|
|
|
- const data = getDataSource();
|
|
|
+ const data = cloneDeep(state.sourceData);
|
|
|
const addList: any[] = [];
|
|
|
e.forEach((item: any) => {
|
|
|
- if (!data.find((i: any) => i.id === item.id)) {
|
|
|
+ if (!data.find((i: any) => i.textbookId === item.id)) {
|
|
|
item.sourcePrice = item.price;
|
|
|
item.textbookId = item.id;
|
|
|
+ item.uuid = uniqueId();
|
|
|
+ item.id = '';
|
|
|
handleChangeDiscount(item);
|
|
|
addList.push(item);
|
|
|
}
|
|
|
});
|
|
|
+ state.sourceData = data.concat(addList);
|
|
|
+
|
|
|
setTableData(data.concat(addList));
|
|
|
// redoHeight();
|
|
|
};
|
|
|
- const handleClear = (id) => {
|
|
|
+ const handleClear = (uuid) => {
|
|
|
+ const keys = uuid ? [uuid] : selectRow.value;
|
|
|
const data = getDataSource();
|
|
|
- if (id !== null) {
|
|
|
- data.splice(id, 1);
|
|
|
- setTableData(data); //.filter((item: any) => item.id !== id)
|
|
|
- } else {
|
|
|
- setTableData(data.filter((item: any) => !selectRow.value.includes(item.id)));
|
|
|
- }
|
|
|
+ setTableData(data.filter((item: any) => !keys.includes(item.uuid)));
|
|
|
+ state.sourceData = state.sourceData.filter((item: any) => !keys.includes(item.uuid));
|
|
|
};
|
|
|
const handleSelect = async (e) => {
|
|
|
selectUserList.value = e.list;
|
|
@@ -216,13 +277,15 @@
|
|
|
|
|
|
data.forEach((item: any) => {
|
|
|
item.sourcePrice = item.price;
|
|
|
+ item.uuid = uniqueId();
|
|
|
handleChangeDiscount(item);
|
|
|
});
|
|
|
+ state.sourceData = data;
|
|
|
setTableData(data);
|
|
|
};
|
|
|
const { createMessage } = useMessage();
|
|
|
const handleSubmit = async () => {
|
|
|
- const dataSoruce = getDataSource();
|
|
|
+ const dataSoruce = cloneDeep(state.sourceData);
|
|
|
|
|
|
if (dataSoruce.length === 0) {
|
|
|
createMessage.warning('至少征订一本教材');
|
|
@@ -303,10 +366,20 @@
|
|
|
<a-button type="primary" @click="handleClear(null)">批量移出</a-button>
|
|
|
</template>
|
|
|
<template #studentSubscriptionNumber="{ record }">
|
|
|
- <a-input-number :step="1" :min="0" v-model:value="record.studentSubscriptionNumber" />
|
|
|
+ <a-input-number
|
|
|
+ :step="1"
|
|
|
+ :min="0"
|
|
|
+ v-model:value="record.studentSubscriptionNumber"
|
|
|
+ @change="updateSourceData(record)"
|
|
|
+ />
|
|
|
</template>
|
|
|
<template #teacherSubscriptionNumber="{ record }">
|
|
|
- <a-input-number :step="1" :min="0" v-model:value="record.teacherSubscriptionNumber" />
|
|
|
+ <a-input-number
|
|
|
+ :step="1"
|
|
|
+ :min="0"
|
|
|
+ v-model:value="record.teacherSubscriptionNumber"
|
|
|
+ @change="updateSourceData(record)"
|
|
|
+ />
|
|
|
</template>
|
|
|
<template #discount="{ record }">
|
|
|
<a-input-number
|
|
@@ -324,8 +397,8 @@
|
|
|
@change="handleChangePrice(record)"
|
|
|
/>
|
|
|
</template>
|
|
|
- <template #action="{ record, index }">
|
|
|
- <a-button type="link" @click="handleClear(index)">移出</a-button>
|
|
|
+ <template #action="{ record }">
|
|
|
+ <a-button type="link" @click="handleClear(record.uuid)">移出</a-button>
|
|
|
<a-button type="link" @click="handleViewHistory(record.textbookId)">
|
|
|
历史征订
|
|
|
</a-button>
|