Browse Source

fix: change textbookSubscription

DESKTOP-USV654P\pc 2 months ago
parent
commit
b6f046c362

+ 1 - 1
Makefile

@@ -12,7 +12,7 @@ build:
 
 commit:
 	git add . && \
-	git commit --no-verify -m "fix: change studentbaseInfo"
+	git commit --no-verify -m "fix: change textbookSubscription"
 
 checkPre:
 	git checkout pre

+ 22 - 22
src/views/educational/textbookSubscription/components/data.config.ts

@@ -249,11 +249,11 @@ export const textbookColumns: BasicColumn[] = [
 ];
 
 export const historyTableColumns: BasicColumn[] = [
-  {
-    title: '主键ID',
-    dataIndex: 'id',
-    width: 120,
-  },
+  // {
+  //   title: '主键ID',
+  //   dataIndex: 'id',
+  //   width: 120,
+  // },
   {
     title: '课程名称',
     dataIndex: 'courseSubjectIdCn',
@@ -320,7 +320,7 @@ export const historyTableColumns: BasicColumn[] = [
 
   {
     title: '学生用书征订数量',
-    dataIndex: 'studentSubscriptionNumber',
+    dataIndex: 'studentNum',
     customRender({ record, text }) {
       if (record.alterationType !== 0) {
         return h('span', { style: 'color:red' }, text);
@@ -330,7 +330,7 @@ export const historyTableColumns: BasicColumn[] = [
   },
   {
     title: '教师用书征订数量',
-    dataIndex: 'teacherSubscriptionNumber',
+    dataIndex: 'teacherNum',
     customRender({ record, text }) {
       if (record.alterationType !== 0) {
         return h('span', { style: 'color:red' }, text);
@@ -338,24 +338,24 @@ export const historyTableColumns: BasicColumn[] = [
     },
     width: 150,
   },
-  {
-    title: '使用班级数量',
-    dataIndex: 'classNum',
-    width: 150,
-  },
   {
     title: '征订总数量',
     dataIndex: 'sumNumber',
     customRender: ({ record }) => {
-      return record.sumNumber ? record.sumNumber : '';
+      return record.studentNum + record.teacherNum;
     },
     width: 120,
   },
   {
     title: '已入库数量',
-    dataIndex: 'inStockroomNum',
+    dataIndex: 'inStockNum',
     width: 120,
   },
+  {
+    title: '使用班级数量',
+    dataIndex: 'classNum',
+    width: 150,
+  },
   {
     title: '操作',
     dataIndex: 'action',
@@ -444,14 +444,14 @@ export const changeColumns: BasicColumn[] = [
   },
 ];
 export const historySchema: FormSchema[] = [
-  {
-    field: 'wfTextbookSubscriptionItemId',
-    label: 'ID',
-    component: 'Input',
-    colProps: {
-      span: 6,
-    },
-  },
+  // {
+  //   field: 'wfTextbookSubscriptionItemId',
+  //   label: 'ID',
+  //   component: 'Input',
+  //   colProps: {
+  //     span: 6,
+  //   },
+  // },
   {
     field: 'textbookType',
     label: '教材类型',

+ 1 - 1
src/views/educational/textbookSubscription/components/edit.vue

@@ -29,7 +29,7 @@
 
   const [addReg, { openModal: addModelOpen }] = useModal();
   const [historyViewReg, { openModal: historyViewOpen }] = useModal();
-  const emits = defineEmits(['success']);
+  const emits = defineEmits(['success', 'register']);
   const [formReg, { validate, resetFields, setFieldsValue }] = useForm({
     labelWidth: 120,
     schemas: [

+ 369 - 0
src/views/educational/textbookSubscription/components/editTeacher.vue

@@ -0,0 +1,369 @@
+<script setup lang="ts">
+  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 { useTable } from '/@/components/Table';
+  import BasicForm from '/@/components/Form/src/BasicForm.vue';
+  import { useForm } from '/@/components/Form';
+  import { textbookColumns } from './data.config';
+  import BasicTable from '/@/components/Table/src/BasicTable.vue';
+  import addTextbook from './addTextbook.vue';
+  import selectModalVue from './selectModal.vue';
+  import { getTextbookListSubscription } from '/@/services/apis/TextbookController';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import historyView from './historyView.vue';
+  import { requestMagicApi } from '/@/api/magicApi';
+  import {
+    getTextbookSubscriptionInfo,
+    postTextbookTextbookSubscription,
+    putTextbookTextbookSubscription,
+  } from '/@/services/apis/TextbookSubscriptionController';
+  const step = Steps.Step;
+  const selectRow = ref<any>([]);
+  const thisStep = ref(0);
+  const dataInfo = ref<any>({});
+  const selectUserList = ref<any>([]);
+  const isUpdate = ref(true);
+  const modelRef = ref({});
+
+  const [addReg, { openModal: addModelOpen }] = useModal();
+  const [historyViewReg, { openModal: historyViewOpen }] = useModal();
+  const emits = defineEmits(['success']);
+  const [formReg, { validate, resetFields, setFieldsValue }] = useForm({
+    labelWidth: 120,
+    schemas: [
+      {
+        label: '学期',
+        field: 'baseSemesterId',
+        component: 'ApiSelect',
+        colProps: { span: 24 },
+        componentProps: () => {
+          return {
+            api: requestMagicApi,
+            getPopupContainer: () => document.body,
+            params: {
+              url: '/baseData/semester/option',
+            },
+            showSearch: true,
+            filterOption: (input: string, option: any) => {
+              return (
+                option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0 ||
+                option.value.toLowerCase().indexOf(input.toLowerCase()) >= 0
+              );
+            },
+            onChange: () => {
+              handleChange();
+            },
+          };
+        },
+        required: true,
+      },
+      {
+        label: '征订方式',
+        field: 'subscriptionMethod',
+        component: 'Select',
+        required: true,
+        componentProps: () => {
+          return {
+            options: [
+              {
+                label: '按班级征订',
+                value: 1,
+              },
+              {
+                label: '按教材征订',
+                value: 2,
+              },
+            ],
+            onChange: () => {
+              handleChange();
+            },
+          };
+        },
+        colProps: { span: 24 },
+      },
+      {
+        label: '备注',
+        field: 'remark',
+        component: 'InputTextArea',
+        colProps: { span: 24 },
+      },
+    ],
+    showActionButtonGroup: false,
+  });
+
+  const handleChangeDiscount = (record) => {
+    if (record.discount < 1) {
+      record.discount = 1;
+    }
+    if (record.discount > 10) {
+      record.discount = 10;
+    }
+    record.price = Number((Number(record.sourcePrice || 0) * record.discount) / 10).toFixed(2);
+  };
+
+  const handleChangePrice = (record) => {
+    if (record.price !== 0) {
+      record.discount = Number(((record.price / record.sourcePrice) * 10).toFixed(1));
+    } else {
+      record.discount = 0;
+    }
+  };
+
+  const [modalReg, { closeModal }] = useModalInner(async (data) => {
+    isUpdate.value = !!data?.isUpdate;
+    modelRef.value = { ...data.baseData };
+
+    if (unref(isUpdate)) {
+      const resData = await getTextbookSubscriptionInfo({ id: data.baseData.id });
+      modelRef.value = { ...resData };
+      setFieldsValue(resData);
+
+      resData.textbookSubscriptionItemList.forEach((item: any) => {
+        item.studentSubscriptionNumber = item.studentNum;
+        item.teacherSubscriptionNumber = item.teacherNum;
+        item.courseName = item.courseSubjectIdCn;
+        item.sourcePrice = item.pricing;
+      });
+
+      setTableData(resData.textbookSubscriptionItemList);
+    }
+  });
+  const handleChange = () => {
+    setTableData([]);
+    selectUserList.value = [];
+    setSelectedRowKeys([]);
+  };
+  const handleNext = () => {
+    validate().then((res) => {
+      dataInfo.value = res;
+      thisStep.value++;
+    });
+  };
+  const handleClose = () => {
+    thisStep.value = 0;
+    resetFields();
+    closeModal();
+  };
+  const [selectModalReg, { openModal: selectModalOpen }] = useModal();
+  const [tableRef, { setTableData, getDataSource, redoHeight, setSelectedRowKeys }] = useTable({
+    title: '征订列表',
+    columns: textbookColumns,
+    bordered: true,
+    rowKey: 'id',
+    resizeHeightOffset: 200,
+    rowSelection: {
+      type: 'checkbox',
+      onChange: (selectedRowKeys) => {
+        selectRow.value = selectedRowKeys;
+      },
+    },
+    pagination: false,
+  });
+  const handleAdd = () => {
+    addModelOpen(true, {
+      baseSemesterId: dataInfo.value.baseSemesterId,
+    });
+  };
+  const handleSuccess = (e) => {
+    const data = getDataSource();
+    const addList: any[] = [];
+    e.forEach((item: any) => {
+      if (!data.find((i: any) => i.id === item.id)) {
+        item.sourcePrice = item.price;
+        item.textbookId = item.id;
+        handleChangeDiscount(item);
+        addList.push(item);
+      }
+    });
+    setTableData(data.concat(addList));
+    redoHeight();
+  };
+  const handleClear = (id) => {
+    const data = getDataSource();
+    if (id) {
+      setTableData(data.filter((item: any) => item.id !== id));
+    } else {
+      setTableData(data.filter((item: any) => !selectRow.value.includes(item.id)));
+    }
+  };
+  const handleSelect = async (e) => {
+    selectUserList.value = e.classList;
+    const ids = selectUserList.value.map((item: any) => item.id);
+    const data = await getTextbookListSubscription({
+      classIds: ids.join(','),
+      baseSemesterId: dataInfo.value.baseSemesterId,
+    });
+
+    data.forEach((item: any) => {
+      item.sourcePrice = item.price;
+      handleChangeDiscount(item);
+    });
+    setTableData(data);
+  };
+  const { createMessage } = useMessage();
+  const handleSubmit = async () => {
+    const dataSoruce = getDataSource();
+
+    if (dataSoruce.length === 0) {
+      createMessage.warning('至少征订一本教材');
+      return;
+    }
+
+    dataSoruce.forEach((item: any) => {
+      item.studentNum = item.studentSubscriptionNumber;
+      item.teacherNum = item.teacherSubscriptionNumber;
+    });
+
+    const postParams = unref(modelRef);
+    Object.assign(postParams, {
+      remark: dataInfo.value?.remark,
+      subscriptionMethod: dataInfo.value.subscriptionMethod,
+      baseSemesterId: dataInfo.value.baseSemesterId,
+      textbookSubscriptionItemList: getDataSource(),
+      baseClassIds: dataSoruce[0].classIds,
+    });
+
+    // const params = {
+    //   remark: dataInfo.value?.remark,
+    //   subscriptionMethod: dataInfo.value.subscriptionMethod,
+    //   baseSemesterId: dataInfo.value.baseSemesterId,
+    //   textbookSubscriptionItemList: getDataSource(),
+    //   baseClassIds: dataSoruce[0].classIds,
+    // };
+    try {
+      if (isUpdate.value) {
+        await putTextbookTextbookSubscription(postParams, 'none');
+      } else {
+        await postTextbookTextbookSubscription(postParams, 'none');
+      }
+      createMessage.success('新增成功');
+      emits('success');
+      thisStep.value = 0;
+      await resetFields();
+      setTableData([]);
+      selectUserList.value = [];
+      closeModal();
+    } catch {
+      createMessage.error('新增失败');
+    }
+  };
+  const handleViewHistory = (id) => {
+    historyViewOpen(true, { textbookId: id, baseSemesterId: dataInfo.value.baseSemesterId });
+  };
+</script>
+
+<template>
+  <BasicModal
+    @cancel="handleClose"
+    :footer="null"
+    :canFullscreen="false"
+    defaultFullscreen
+    v-bind="$attrs"
+    @register="modalReg"
+    title="教材征订"
+  >
+    <div class="full flex flex-col">
+      <div class="w-2/3">
+        <Steps v-model:current="thisStep">
+          <step disabled title="基础信息" />
+          <step disabled title="教材征订" />
+        </Steps>
+      </div>
+
+      <div v-show="thisStep === 0" class="mt-[24px] w-full">
+        <BasicForm @register="formReg" />
+      </div>
+      <div v-show="thisStep === 1" class="mt-[24px] w-full">
+        <div v-if="dataInfo && dataInfo.subscriptionMethod == 2">
+          <span class="required">征订教材</span>
+          <a-button type="primary" class="ml-[12px]" @click="handleAdd">选择教材</a-button>
+        </div>
+        <div
+          @click="selectModalOpen(true, { classList: selectUserList })"
+          class="flex flex-row items-center mt-[24px]"
+          v-if="dataInfo && dataInfo.subscriptionMethod == 1"
+        >
+          <span class="required">用书班级</span>
+          <div
+            class="flex ml-[12px] items-center"
+            style="
+              width: 94%;
+              justify-content: space-between;
+              height: 32px;
+              border: 1px solid #ccc;
+              border-radius: 2px;
+              cursor: pointer;
+            "
+          >
+            <div class="flex flex-row">
+              <div
+                class="ml-[4px]"
+                v-for="(items, indexs) in selectUserList.slice(0, 3)"
+                :key="indexs"
+              >
+                {{ items.name }}
+              </div>
+              <div class="ml-[4px]" v-if="selectUserList.length > 3">
+                剩余{{ selectUserList.length - 3 }}个班级
+              </div>
+            </div>
+
+            <span class="mr-[12px]">添加+</span>
+          </div>
+        </div>
+        <div class="flex">
+          <BasicTable @register="tableRef">
+            <template #toolbar>
+              <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" />
+            </template>
+            <template #teacherSubscriptionNumber="{ record }">
+              <a-input-number :step="1" :min="0" v-model:value="record.teacherSubscriptionNumber" />
+            </template>
+            <template #discount="{ record }">
+              <a-input-number
+                :step="1"
+                :min="0"
+                v-model:value="record.discount"
+                @change="handleChangeDiscount(record)"
+              />
+            </template>
+            <template #price="{ record }">
+              <a-input-number
+                :step="1"
+                :min="0"
+                v-model:value="record.price"
+                @change="handleChangePrice(record)"
+              />
+            </template>
+            <template #action="{ record }">
+              <a-button type="link" @click="handleClear(record.id)">移出</a-button>
+              <a-button type="link" @click="handleViewHistory(record.textbookId)">
+                历史征订
+              </a-button>
+            </template>
+          </BasicTable>
+        </div>
+      </div>
+      <div class="mt-[24px] ml-[120px]">
+        <a-button @click="handleClose">取消</a-button>
+        <a-button v-show="thisStep === 1" @click="thisStep = 0" class="ml-[24px]">上一步</a-button>
+        <a-button v-show="thisStep === 0" type="primary" @click="handleNext" class="ml-[24px]">
+          下一步
+        </a-button>
+        <a-button v-show="thisStep === 1" type="primary" class="ml-[24px]" @click="handleSubmit">
+          提交
+        </a-button>
+      </div>
+    </div>
+    <addTextbook @register="addReg" @success="handleSuccess" />
+    <selectModalVue @register="selectModalReg" @success="handleSelect" />
+    <historyView @register="historyViewReg" />
+  </BasicModal>
+</template>
+
+<style scoped lang="less"></style>

+ 8 - 13
src/views/educational/textbookSubscription/components/textBookPop.vue

@@ -6,7 +6,7 @@
   import classImportVue from './classImport.vue';
   import { textbookColumns } from '/@/views/educational/textbookSubscription/components/data.config';
   import { postWfTextbookSubscriptionTextbookSubscriptionExportQuery } from '/@/services/apis/WfTextbookSubscriptionController';
-  import { ref } from 'vue';
+  import { reactive } from 'vue';
   import { useMessage } from '/@/hooks/web/useMessage';
   import { downloadByData } from '/@/utils/file/download';
   import { formatToDate } from '/@/utils/dateUtil';
@@ -14,9 +14,10 @@
     getTextbookSubscriptionInstockroomList,
     postTextbookSubscriptionInstockroom,
   } from '/@/services/apis/TextbookSubscriptionController';
-  const wfTextbookSubscriptionId = ref('');
+
+  const searchInfo = reactive<Recordable>({});
   const [register, { closeModal, setModalProps }] = useModalInner((data) => {
-    wfTextbookSubscriptionId.value = data.id;
+    searchInfo.textbookSubscriptionId = data.baseData.id;
     reload();
   });
   const [modalRef, { openModal }] = useModal();
@@ -29,12 +30,6 @@
     showTableSetting: true,
     bordered: true,
     resizeHeightOffset: 200,
-    beforeFetch: (params) => {
-      return {
-        textbookSubscriptionId: wfTextbookSubscriptionId.value,
-        ...params,
-      };
-    },
     columns: [
       ...textbookColumns,
       {
@@ -81,16 +76,16 @@
     }
   };
   const handleExport = () => {
-    openModal(true, { wfTextbookSubscriptionId: wfTextbookSubscriptionId.value });
+    openModal(true, { wfTextbookSubscriptionId: searchInfo.textbookSubscriptionId });
   };
   const handleDownLoad = async () => {
     const data = await postWfTextbookSubscriptionTextbookSubscriptionExportQuery({
-      wfTextbookSubscriptionId: wfTextbookSubscriptionId.value,
+      wfTextbookSubscriptionId: searchInfo.textbookSubscriptionId,
     });
 
     await downloadByData(
       data.data,
-      `${wfTextbookSubscriptionId.value}征订记录${formatToDate(
+      `${searchInfo.textbookSubscriptionId}征订记录${formatToDate(
         new Date(),
         'YYYY-MM-DD-HH-mm-ss',
       )}.xlsx`,
@@ -106,7 +101,7 @@
     default-fullscreen
     @register="register"
   >
-    <BasicTable @register="tableReg">
+    <BasicTable @register="tableReg" :search-info="searchInfo">
       <template #toolbar>
         <!-- <a-button @click="handleDownLoad" type="primary">导出</a-button> -->
         <a-button type="primary" @click="handleExport">导入</a-button>

+ 4 - 4
src/views/educational/textbookSubscription/components/view.vue

@@ -22,10 +22,10 @@
   const itemId = ref<any>(null);
   const status = ref<any>(null);
   const [viewReg] = useModalInner(async (data) => {
-    dataInfo.value = await getTextbookSubscriptionDetail({ id: data.id });
-    itemId.value = data.id;
-    status.value = data.status;
-    console.log(data);
+    dataInfo.value = await getTextbookSubscriptionDetail({ id: data.baseData.id });
+    itemId.value = data.baseData.id;
+    status.value = data.baseData.status;
+    // console.log(data);
     await reloadHistory();
   });
   const [changeHistoryRef, { openModal: openChangeHistory }] = useModal();

+ 69 - 36
src/views/educational/textbookSubscription/index.vue

@@ -3,7 +3,7 @@
   import { useTable } from '/@/components/Table';
   import BasicTable from '/@/components/Table/src/BasicTable.vue';
   import { searchFormSchema, tableColumns } from './components/data.config';
-  import edit from './components/edit.vue';
+  import FormEdit from './components/edit.vue';
   import textBookPopVue from './components/textBookPop.vue';
   import { useModal } from '/@/components/Modal';
 
@@ -14,16 +14,22 @@
     deleteTextbookTextbookSubscription,
     putTextbookSubscriptionChangeStatus,
   } from '/@/services/apis/TextbookSubscriptionController';
+  import { useMessage } from '/@/hooks/web/useMessage';
   const [editReg, { openModal }] = useModal();
   const [viewReg, { openModal: openViewModal }] = useModal();
   const [popReg, { openModal: openTextBookPopModal }] = useModal();
+
+  const { createConfirm, createMessage } = useMessage();
+
   const [tableReg, { reload }] = useTable({
     title: '征订记录表',
     showTableSetting: true,
     bordered: true,
+    useSearchForm: true,
+    immediate: true,
+    canResize: true,
     api: getTextbookSubscriptionPage,
     columns: tableColumns,
-    useSearchForm: true,
     formConfig: {
       labelWidth: 120,
       schemas: searchFormSchema,
@@ -35,6 +41,59 @@
       isUpdate: isUpdate,
     });
   };
+
+  const handleDelete = (record: any) => {
+    createConfirm({
+      iconType: 'warning',
+      title: '温馨提醒',
+      content: '是否删除该记录?',
+      onOk: async () => {
+        try {
+          await deleteTextbookTextbookSubscription([record.id]);
+          createMessage.success('删除成功');
+          await reload();
+        } catch (e) {
+          createMessage.error('删除失败');
+        }
+      },
+      okText: '确认',
+      cancelText: '取消',
+    });
+  };
+
+  const handleStatus = (record: any) => {
+    createConfirm({
+      iconType: 'warning',
+      title: '温馨提醒',
+      content: '是否改变状态?',
+      onOk: async () => {
+        try {
+          await putTextbookSubscriptionChangeStatus({
+            id: record.id,
+            status: record.status === 0 ? 1 : 2,
+          });
+          createMessage.success('操作成功');
+          await reload();
+        } catch (e) {
+          createMessage.error('操作失败');
+        }
+      },
+      okText: '确认',
+      cancelText: '取消',
+    });
+  };
+
+  const handleView = (record: any) => {
+    openViewModal(true, {
+      baseData: { ...record },
+    });
+  };
+
+  const handleStore = (record: any) => {
+    openTextBookPopModal(true, {
+      baseData: { ...record },
+    });
+  };
 </script>
 
 <template>
@@ -47,57 +106,31 @@
         <TableAction
           :actions="[
             {
-              ifShow: () => [0, 1].includes(record.status),
+              ifShow: record.status === 0 || record.status === 1,
               label: record.status === 0 ? '发起' : record.status === 2 ? '完成' : '征订中',
-              popConfirm: {
-                title: `是否改变状态?`,
-                confirm: async () => {
-                  await putTextbookSubscriptionChangeStatus({
-                    id: record.id,
-                    status: record.status === 0 ? 1 : 2,
-                  });
-                  await reload();
-                },
-                cancel: () => {
-                  console.log('取消删除', record);
-                },
-              },
+              onClick: handleStatus.bind(null, record),
             },
             {
               ifShow: record.status === 1,
               label: '教材入库',
-              onClick: () => openTextBookPopModal(true, record),
+              onClick: handleStore.bind(true, record),
             },
             {
-              ifShow: () => [1, 2].includes(record.status),
+              ifShow: record.status === 2 || record.status === 1,
               label: '征订明细',
-              onClick: () => openViewModal(true, record),
-            },
-            {
-              ifShow: () => record.status === 0,
-              label: '编辑',
-              onClick: () => handleEdit(record, true),
+              onClick: handleView.bind(true, record),
             },
             {
-              ifShow: () => record.status === 0,
+              ifShow: record.status === 0,
               label: '删除',
               color: 'error',
-              popConfirm: {
-                title: '是否确认删除',
-                confirm: async () => {
-                  await deleteTextbookTextbookSubscription([record.id]);
-                  await reload();
-                },
-                cancel: () => {
-                  console.log('取消删除', record);
-                },
-              },
+              onClick: handleDelete.bind(null, record),
             },
           ]"
         />
       </template>
     </BasicTable>
-    <edit @register="editReg" @success="reload" />
+    <FormEdit @register="editReg" @success="reload" />
     <View @register="viewReg" />
     <textBookPopVue @register="popReg" />
   </PageWrapper>