Przeglądaj źródła

fix 高校接口对接

haveyou 1 rok temu
rodzic
commit
237a3c5f9f

+ 42 - 13
src/components/CommonPage/CommonTable.vue

@@ -3,7 +3,7 @@
     <!-- 表格 -->
     <ele-pro-table
       ref="tableRef"
-      row-key="postId"
+      :row-key="pageConfig.rowKey || 'id'"
       :columns="columns"
       :datasource="datasource"
       :show-overflow-tooltip="true"
@@ -35,7 +35,8 @@
       type: Object,
       default: () => ({
         cacheKey: 'recycleOrderTable',
-        fileName: '回收订单查询'
+        fileName: '回收订单查询',
+        rowKey: 'id'
       })
     },
     pageUrl: { type: String, default: '/system/post/list' },
@@ -52,8 +53,6 @@
 
   async function queryPage(params) {
     let url = props.pageConfig.pageUrl || props.pageUrl;
-    // const res = await proxy.$http.post(url, params);
-
     const res = await proxy.$http.get(url, { params });
     if (res.data.code === 200) {
       return res.data;
@@ -68,11 +67,11 @@
 
   /** 搜索 */
   const reload = (where) => {
-    tableRef.value?.reload?.({ page: 1, where });
+    tableRef.value?.reload?.({ where });
   };
 
   /** 批量操作 */
-  const operatBatch = ({ row, url, title }) => {
+  const operatBatch = ({ method, row, url, title }) => {
     const rows = row == null ? selections.value : [row];
     if (!rows.length) {
       EleMessage.error('请至少选择一条数据');
@@ -89,12 +88,15 @@
           plain: true
         });
 
-        proxy.$http
-          .delete(url)
-          .then(() => {
+        proxy.$http[method](url)
+          .then((res) => {
+            if (res.data.code === 200) {
+              EleMessage.success('操作成功');
+              reload();
+            } else {
+              EleMessage.error(res.data.msg);
+            }
             loading.close();
-            EleMessage.success('操作成功');
-            reload();
           })
           .catch((e) => {
             loading.close();
@@ -107,7 +109,7 @@
   /// 导出数据
   async function exportPage(params, name) {
     const res = await proxy.$http({
-      url: props.exportUrl,
+      url: props.pageConfig.exportUrl,
       method: 'POST',
       data: toFormData(params),
       responseType: 'blob'
@@ -137,5 +139,32 @@
     });
   };
 
-  defineExpose({ reload, exportData, operatBatch });
+  function messageBoxConfirm({ message, fetch }) {
+    ElMessageBox.confirm(message, '提示', {
+      confirmButtonText: '确定',
+      cancelButtonText: '关闭',
+      type: 'warning'
+    }).then(() => {
+      fetch().then((res) => {
+        if (res.data.code === 200) {
+          EleMessage.success('操作成功');
+          reload();
+        } else {
+          EleMessage.error(res.data.msg);
+        }
+      });
+    });
+  }
+
+  function getSelections() {
+    return selections.value;
+  }
+
+  defineExpose({
+    reload,
+    exportData,
+    operatBatch,
+    getSelections,
+    messageBoxConfirm
+  });
 </script>

+ 0 - 1
src/components/CommonPage/SimpleForm.vue

@@ -42,7 +42,6 @@
   const [form, resetFields, assignFields, setFieldValue] = useFormData(
     props.initKeys
   );
-  console.log(form, 'form');
   /** 提交表单 */
   const submitForm = () => {
     return new Promise((resolve, reject) => {

+ 74 - 0
src/components/CommonPage/SimpleFormModal.vue

@@ -0,0 +1,74 @@
+<!-- 编辑弹窗 -->
+<template>
+  <ele-modal form :width="width" v-model="visible" :title="title">
+    <SimpleForm
+      :items="items"
+      :labelWidth="labelWidth"
+      ref="formRef"
+      v-bind="formProps"
+    ></SimpleForm>
+    <template #footer>
+      <el-button @click="handleCancel">关闭</el-button>
+      <el-button type="primary" @click="handleSumbit">确定</el-button>
+    </template>
+  </ele-modal>
+</template>
+
+<script setup>
+  import { ref, reactive, nextTick, getCurrentInstance } from 'vue';
+  import { Flag, ChatDotSquare } from '@element-plus/icons-vue';
+  import orderTimeline from '@/views/recycleOrder/components/order-timeline.vue';
+  import SimpleForm from '@/components/CommonPage/SimpleForm.vue';
+  import validators from '@/utils/validators';
+  import { EleMessage } from 'ele-admin-plus/es';
+  let { proxy } = getCurrentInstance();
+
+  const props = defineProps({
+    items: { type: Array, default: () => [] },
+    title: { type: String, default: '编辑' },
+    width: { type: String, default: '520px' },
+    labelWidth: { type: String, default: '90px' },
+    formProps: { type: Object, default: () => ({}) },
+    baseUrl: { type: Object, default: () => ({}) }
+  });
+  const emit = defineEmits(['success']);
+  /** 弹窗是否打开 */
+  const visible = defineModel({ type: Boolean });
+
+  /** 关闭弹窗 */
+  const handleCancel = () => {
+    visible.value = false;
+    nextTick(() => {
+      formRef.value?.resetForm();
+    });
+  };
+
+  const form = ref({});
+  /** 弹窗打开事件 */
+  const handleOpen = (data) => {
+    visible.value = true;
+    nextTick(() => {
+      form.value = data;
+      formRef.value?.assignFields(data);
+    });
+  };
+
+  const formRef = ref();
+  const handleSumbit = () => {
+    formRef.value?.submitForm().then((data) => {
+      data.id = form.value?.id;
+      let url = data.id ? props.baseUrl.update : props.baseUrl.add;
+      proxy.$http.post(url, data).then((res) => {
+        if (res.data.code !== 200) return;
+        visible.value = false;
+        emit('success', data);
+        EleMessage.success(form.id ? '编辑成功' : '新增成功');
+      });
+    });
+  };
+
+  defineExpose({
+    handleOpen,
+    handleSumbit
+  });
+</script>

+ 0 - 1
src/router/index.js

@@ -47,7 +47,6 @@ router.beforeEach(async (to) => {
     if (menus) {
       getMenuRoutes(menus, homePath).forEach((r) => {
         router.addRoute(r);
-        console.log(r.path, r, 'r');
       });
 
       return { ...to, replace: true };

+ 8 - 0
src/utils/request.js

@@ -4,6 +4,7 @@
 import axios from 'axios';
 import { unref } from 'vue';
 import { ElMessageBox } from 'element-plus/es';
+import { EleMessage } from 'ele-admin-plus/es';
 import { API_BASE_URL, LAYOUT_PATH } from '@/config/setting';
 import router from '@/router';
 import { getToken } from './token-util';
@@ -62,6 +63,13 @@ service.interceptors.response.use(
       }
       return Promise.reject(new Error(res.data.msg));
     }
+    let bool =
+      res.data?.code !== 200 &&
+      res.config.method !== 'get' &&
+      res.config.responseType !== 'blob';
+    if (bool) {
+      EleMessage.error(res.data?.msg);
+    }
     return res;
   },
   (error) => {

+ 90 - 57
src/views/data/universities/components/universities-edit.vue

@@ -1,69 +1,102 @@
 <!-- 搜索表单 -->
 <template>
-  <ele-card :body-style="{ paddingBottom: '8px' }">
-    <ProSearch :columns="columns" v-model:form="form" ref="searchRef">
-      <el-col :span="6" style="min-width: 160px">
-        <el-button style="width: 80px" type="primary" plain @click="search"
-          >查询</el-button
-        >
-        <el-button style="width: 80px" type="info" @click="reset"
-          >重置</el-button
-        >
-      </el-col>
-    </ProSearch>
-  </ele-card>
+  <simple-form-modal
+    :title="title"
+    :items="formItems"
+    ref="editRef"
+    :baseUrl="baseUrl"
+    @success="(data) => emit('success', data)"
+  ></simple-form-modal>
 </template>
 
 <script setup>
-  import { reactive, ref, defineEmits } from 'vue';
+  import { reactive, ref, defineEmits, getCurrentInstance } from 'vue';
   import { useFormData } from '@/utils/use-form-data';
-  import ProSearch from '@/components/CommonPage/ProSearch.vue';
+  import SimpleFormModal from '@/components/CommonPage/SimpleFormModal.vue';
+  const { proxy } = getCurrentInstance();
 
-  const emit = defineEmits(['search']);
-  const columns = reactive([
-    { tag: 'el-input', label: '书名', prop: 'bookName', span: 4 },
-    { tag: 'el-input', label: '条码', prop: 'code', span: 4 },
-    {
-      tag: 'el-input',
-      label: '作者',
-      prop: 'senderAddress',
-      span: 4
-    },
-    { tag: 'el-input', label: '出版社', prop: 'userName', span: 4 },
-    {
-      tag: 'el-select',
-      label: '人工核实',
-      prop: 'receivingWarehouse',
-      span: 3
-    },
-    { tag: 'el-select', label: '是否套装', prop: 'allOrders', span: 3 },
-    {
-      tag: 'el-select',
-      label: '商品标记',
-      prop: 'logisticsCompany',
-      span: 3
-    }
-  ]);
+  //获取省市
+  const provinceList = ref([]);
+  const cityList = ref([]);
+  const title = ref('新增高校');
+  const emit = defineEmits(['success']);
 
-  const initKeys = {};
-  for (let i = 0; i < columns.length; i++) {
-    initKeys[columns[i].prop] = '';
-  }
-
-  /** 表单数据 */
-  const [form, resetFields] = useFormData({
-    ...initKeys
+  const formItems = computed(() => {
+    return [
+      { type: 'input', label: '学校名称', prop: 'schoolName', required: true },
+      {
+        type: 'select',
+        label: '省份',
+        prop: 'provinceId',
+        required: true,
+        options: provinceList.value.map((d) => {
+          return { label: d.district, value: d.id };
+        }),
+        props: {
+          filterable: true,
+          onChange: (val) => {
+            getProviceList(val).then((res) => {
+              cityList.value = res.data.data;
+            });
+          }
+        }
+      },
+      {
+        type: 'select',
+        label: '所在市',
+        prop: 'cityId',
+        required: true,
+        options: cityList.value.map((d) => {
+          return { label: d.district, value: d.id };
+        }),
+        props: {
+          filterable: true
+        }
+      },
+      {
+        type: 'dictSelect',
+        label: '办学层次',
+        prop: 'schoolLevel',
+        props: { code: 'school_level' },
+        required: true
+      },
+      {
+        type: 'input',
+        label: '主管部门',
+        prop: 'departmentName',
+        required: true
+      },
+      {
+        type: 'dictSelect',
+        label: '标记',
+        prop: 'schoolTag',
+        props: { code: 'school_tag' },
+        required: true
+      }
+    ];
   });
+  //默认值
+  const baseUrl = reactive({
+    add: '/baseinfo/schoolInfo/save',
+    update: '/baseinfo/schoolInfo/edit'
+  });
+  const formData = ref({ schoolTag: '1' });
+
+  const editRef = ref(null);
 
-  const searchRef = ref(null);
-  /** 搜索 */
-  const search = () => {
-    emit('search', { ...form });
-  };
+  function handleOpen(data = {}) {
+    title.value = data && data.id ? '编辑高校' : '新增高校';
+    formData.value = Object.assign(formData.value, data || {});
+    getProviceList().then((res) => {
+      provinceList.value = res.data.data;
+      console.log(provinceList.value, 'formData');
+    });
+    editRef.value?.handleOpen(data);
+  }
+
+  function getProviceList(id = 1) {
+    return proxy.$http.get(`/baseinfo/districtInfo/findInfo/${id}`);
+  }
 
-  /** 重置 */
-  const reset = () => {
-    resetFields();
-    search();
-  };
+  defineExpose({ handleOpen });
 </script>

+ 59 - 58
src/views/data/universities/index.vue

@@ -9,7 +9,7 @@
           plain
           :icon="PlusOutlined"
           v-permission="'data:universities:add'"
-          @click="handleBatchDelete"
+          @click="handleUpdate()"
         >
           新增高校
         </el-button>
@@ -26,7 +26,7 @@
           type="success"
           plain
           v-permission="'data:universities:export'"
-          @click="handleBatchDelete"
+          @click="handleExportExcel"
           :icon="DownloadOutlined"
         >
           导出EXCEL
@@ -60,6 +60,9 @@
           </div>
         </div>
       </template>
+      <template #schoolTag="{ row }">
+        <dict-data code="school_tag" type="tag" :model-value="row.schoolTag" />
+      </template>
 
       <template #action="{ row }">
         <div>
@@ -67,7 +70,7 @@
             type="primary"
             link
             v-permission="'data:universities:update'"
-            @click="toOrderDetail(row)"
+            @click="handleUpdate(row)"
           >
             编辑
           </el-button>
@@ -82,14 +85,16 @@
           <el-button
             type="warning"
             link
-            v-permission="'data:universities:delete'"
-            @click="handleApplyForOrderRestore(row)"
+            v-permission="'data:universities:schoolTag'"
+            @click="handleSchoolTag(row)"
           >
-            标为正常/标为盗版
+            {{ row.schoolTag == 2 ? '标为正常' : '标为盗版' }}
           </el-button>
         </div>
       </template>
     </common-table>
+
+    <universities-edit ref="editRef" @success="reload"></universities-edit>
   </ele-page>
 </template>
 
@@ -107,9 +112,19 @@
   import universitiesSearch from '@/views/data/universities/components/universities-search.vue';
   import { useDictData } from '@/utils/use-dict-data';
   import { useRouter } from 'vue-router';
+  import request from '@/utils/request';
 
-  defineOptions({ name: 'recycleOrderCancelled' });
+  defineOptions({ name: 'universities' });
+  const [schoolLevelDicts, schoolTagDicts] = useDictData([
+    'school_level',
+    'school_tag'
+  ]);
 
+  console.log(
+    schoolLevelDicts.value,
+    schoolTagDicts,
+    'schoolLevelDicts, schoolTagDicts'
+  );
   /** 表格列配置 */
   const columns = ref([
     {
@@ -123,30 +138,27 @@
       label: '学校名称',
       prop: 'schoolName',
       align: 'center',
-      minWidth: 100
-    },
-    {
-      label: '省份',
-      prop: 'province',
-      align: 'center'
-    },
-    {
-      label: '所在市',
-      prop: 'city',
-      align: 'center'
+      minWidth: 140
     },
-    { label: '主管部门', prop: 'createTime', align: 'center' },
+    { label: '省份', prop: 'provinceName', align: 'center' },
+    { label: '所在市', prop: 'cityName', align: 'center' },
+    { label: '主管部门', prop: 'departmentName', align: 'center' },
     {
       label: '办学层次',
-      prop: 'tag',
-      align: 'center'
+      prop: 'schoolLevel',
+      align: 'center',
+      formatter: (row) =>
+        schoolLevelDicts.value.find((d) => d.dictValue == row.schoolLevel)
+          ?.dictLabel
     },
     {
       label: '标记',
-      prop: 'peo',
-      formatter: (row) => '是',
+      prop: 'schoolTag',
       align: 'center',
-      width:150
+      slot: 'schoolTag',
+      formatter: (row) =>
+        schoolTagDicts.value.find((d) => d.dictValue == row.schoolTag)
+          ?.dictLabel
     },
     {
       columnKey: 'action',
@@ -162,8 +174,8 @@
   const pageRef = ref(null);
 
   const pageConfig = reactive({
-    // pageUrl: '/baseinfo/schoolInfo/list',
-    exportUrl: '',
+    pageUrl: '/baseinfo/schoolInfo/list',
+    exportUrl: '/baseinfo/schoolInfo/export',
     fileName: '高校列表',
     cacheKey: 'universitiesTable'
   });
@@ -175,46 +187,35 @@
 
   //批量删除
   function handleBatchDelete(row) {
+    let selections = row ? [row] : pageRef.value?.getSelections();
+    let ids = selections.map((item) => item.id).join(',');
+    let url = `/baseinfo/schoolInfo/removeById/${ids}`;
     pageRef.value?.operatBatch({
       title: '确认删除?',
-      row,
-      url: '/recycleOrder/batchAudit'
+      method: 'post',
+      url,
+      row
     });
   }
-
-  //订单详情
-  function toOrderDetail(row) {
-    router.push({ path: '/recycleOrder/detail', query: { id: row.postId } });
-  }
-
-  //订单日志
-  const orderLogRef = ref(null);
-  function openOrderLog(row) {
-    orderLogRef.value?.handleOpen(row);
-  }
-
-  //用户绑定标签
-  const userTagRef = ref(null);
-  function openEditUserTag(row) {
-    userTagRef.value?.handleOpen(row);
+  //导出excel
+  function handleExportExcel() {
+    pageRef.value?.exportData('高校列表');
   }
 
-  function messageBoxConfirm({ message, url, row }) {
-    ElMessageBox.confirm(message, '提示', {
-      confirmButtonText: '确定',
-      cancelButtonText: '关闭',
-      type: 'warning'
-    }).then(() => {
-      console.log(row, 'row');
+  //申请恢复订单
+  function handleSchoolTag(row) {
+    let message = row.schoolTag == 1 ? '确认标为盗版?' : '确认标为正常?';
+    let data = JSON.parse(JSON.stringify(row));
+    data.schoolTag = row.schoolTag == 1 ? 2 : 1;
+    pageRef.value?.messageBoxConfirm({
+      message,
+      fetch: () => request.post('/baseinfo/schoolInfo/edit', data)
     });
   }
 
-  //申请恢复订单
-  function handleApplyForOrderRestore(row) {
-    messageBoxConfirm({
-      message: '确认申请恢复订单?',
-      url: `/recycleOrder/applyForOrderRestore/${row.postId}`,
-      row
-    });
+  //编辑页面
+  const editRef = ref(null);
+  function handleUpdate(row) {
+    editRef.value?.handleOpen(row);
   }
 </script>