Browse Source

主题管理

xiaoqiao 1 year ago
parent
commit
669030ae43
28 changed files with 264 additions and 81 deletions
  1. 3 3
      lib/华北油田Ai检索.pdb
  2. 18 10
      src/main/java/com/bowintek/practice/controller/SubjectController.java
  3. 79 5
      src/main/java/com/bowintek/practice/services/impl/SubjectServiceImpl.java
  4. 4 0
      src/main/java/com/bowintek/practice/services/service/SubjectService.java
  5. 6 0
      src/main/java/com/bowintek/practice/util/Constant.java
  6. 13 0
      src/main/java/com/bowintek/practice/vo/SubjectfieldVo.java
  7. 1 1
      src/main/resources/application-user.yml
  8. 1 1
      src/main/resources/application.yml
  9. BIN
      src/main/resources/static/doc/template/主题字段导入模板.xlsx
  10. 1 1
      target/classes/application.yml
  11. BIN
      vue/src/assets/shortcutMenu/周报.png
  12. BIN
      vue/src/assets/shortcutMenu/实习任务.png
  13. BIN
      vue/src/assets/shortcutMenu/实习生名单.png
  14. BIN
      vue/src/assets/shortcutMenu/实习计划.png
  15. BIN
      vue/src/assets/shortcutMenu/日报.png
  16. BIN
      vue/src/assets/shortcutMenu/月报.png
  17. BIN
      vue/src/assets/shortcutMenu/签到信息.png
  18. BIN
      vue/src/assets/shortcutMenu/补签申请(补签管理).png
  19. BIN
      vue/src/assets/shortcutMenu/请假信息.png
  20. BIN
      vue/src/assets/shortcutMenu/请假申请(请假管理).png
  21. BIN
      vue/src/assets/shortcutMenu/轮科成绩.png
  22. BIN
      vue/src/assets/shortcutMenu/轮科记录.png
  23. BIN
      vue/src/assets/shortcutMenu/非轮科成绩.png
  24. 2 2
      vue/src/components/basic/excel/importExcel/importExcel.vue
  25. 88 31
      vue/src/views/subject/detail.vue
  26. 46 6
      vue/src/views/subject/edit.vue
  27. 0 20
      vue/src/views/subject/index.vue
  28. 2 1
      vue/src/views/subject/model.ts

+ 3 - 3
lib/华北油田Ai检索.pdb

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<?PowerDesigner AppLocale="UTF16" ID="{88086B01-C9E1-11D4-9552-0090277716A9}" Label="" LastModificationDate="1698738776" Name="SmartSearch" Objects="343" Symbols="39" Target="MySQL 5.0" Type="{CDE44E21-9669-11D1-9914-006097355D9B}" signature="PDM_DATA_MODEL_XML" version="16.0.0.3514"?>
+<?PowerDesigner AppLocale="UTF16" ID="{88086B01-C9E1-11D4-9552-0090277716A9}" Label="" LastModificationDate="1698738783" Name="SmartSearch" Objects="343" Symbols="39" Target="MySQL 5.0" Type="{CDE44E21-9669-11D1-9914-006097355D9B}" signature="PDM_DATA_MODEL_XML" version="16.0.0.3514"?>
 <!-- do not edit this file -->
 
 <Model xmlns:a="attribute" xmlns:c="collection" xmlns:o="object">
@@ -4990,9 +4990,9 @@ LABL 0 新宋体,8,N</a:FontList>
 <a:Code>createdName</a:Code>
 <a:CreationDate>1698738607</a:CreationDate>
 <a:Creator>qiao</a:Creator>
-<a:ModificationDate>1698738614</a:ModificationDate>
+<a:ModificationDate>1698738783</a:ModificationDate>
 <a:Modifier>qiao</a:Modifier>
-<a:Comment>创建</a:Comment>
+<a:Comment>创建姓名</a:Comment>
 <a:DataType>varchar(50)</a:DataType>
 <a:Length>50</a:Length>
 <a:Column.Mandatory>1</a:Column.Mandatory>

+ 18 - 10
src/main/java/com/bowintek/practice/controller/SubjectController.java

@@ -1,6 +1,7 @@
 package com.bowintek.practice.controller;
 
 import com.alibaba.fastjson.JSONObject;
+import com.bowintek.practice.filter.exception.BaseErrorEnum;
 import com.bowintek.practice.filter.exception.BaseResponse;
 import com.bowintek.practice.filter.exception.RespGenerstor;
 import com.bowintek.practice.model.SrSubject;
@@ -8,22 +9,16 @@ import com.bowintek.practice.model.SrSubjectfield;
 import com.bowintek.practice.services.service.AccountService;
 import com.bowintek.practice.services.service.SubjectService;
 import com.bowintek.practice.services.service.UserService;
-import com.bowintek.practice.util.DateUtils;
-import com.bowintek.practice.util.ExcelHelper;
-import com.bowintek.practice.util.JsonMapper;
-import com.bowintek.practice.util.MapUtils;
-import com.bowintek.practice.vo.PositionModel;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import com.bowintek.practice.util.*;
+import com.bowintek.practice.vo.SubjectfieldVo;
 import com.github.pagehelper.PageInfo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
-
 import javax.servlet.http.HttpServletResponse;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import java.util.Map;
+import java.util.stream.Collectors;
 
 @RestController
 @RequestMapping(value = "/api/subject")
@@ -41,6 +36,8 @@ public class SubjectController {
     private MapUtils mapUtils;
     @Autowired
     private DateUtils dateUtils;
+    @Autowired
+    private StringUtils stringUtils;
 
     @ResponseBody
     @GetMapping("/getList")
@@ -118,8 +115,19 @@ public class SubjectController {
             row.add(item.getIsReferences() == 1 ? "是" : "否");
             rowData.add(row);
         }
-
         data.setRows(rowData);
         excelHelper.exportExcel(response, data);
     }
+
+    @PostMapping("importData")
+    public BaseResponse<Object> importData(@RequestBody List<SubjectfieldVo> dataList) {
+
+        List<SubjectfieldVo> result = subjectService.importData(dataList, accountService.getLoginUserID());
+
+        if (result.stream().filter(it -> !stringUtils.IsNullOrEmpty(it.getErrorMessage())).collect(Collectors.toList()).size() > 0) {
+             return RespGenerstor.fail(BaseErrorEnum.IMPORT_DATA_ERROR, result);
+        } else {
+            return RespGenerstor.success(result);
+        }
+    }
 }

+ 79 - 5
src/main/java/com/bowintek/practice/services/impl/SubjectServiceImpl.java

@@ -1,20 +1,21 @@
 package com.bowintek.practice.services.impl;
 
+import com.bowintek.practice.filter.exception.BaseException;
 import com.bowintek.practice.mapper.SrSubjectMapper;
 import com.bowintek.practice.mapper.SrSubjectfieldMapper;
 import com.bowintek.practice.mapper.cquery.SubjectCQuery;
-import com.bowintek.practice.model.SrSubject;
-import com.bowintek.practice.model.SrSubjectExample;
-import com.bowintek.practice.model.SrSubjectfield;
-import com.bowintek.practice.model.SrSubjectfieldExample;
+import com.bowintek.practice.model.*;
 import com.bowintek.practice.services.service.SubjectService;
+import com.bowintek.practice.services.service.system.DictionaryService;
+import com.bowintek.practice.util.Constant;
 import com.bowintek.practice.util.StringUtils;
+import com.bowintek.practice.vo.SubjectfieldVo;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
-import org.apache.poi.hpsf.GUID;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.UUID;
@@ -30,6 +31,8 @@ public class SubjectServiceImpl implements SubjectService {
     private SubjectCQuery subjectCQuery;
     @Autowired
     private StringUtils stringUtils;
+    @Autowired
+    private DictionaryService dictionaryService;
 
     @Override
     public PageInfo<SrSubject> getList(Integer page, Integer rows,
@@ -79,6 +82,8 @@ public class SubjectServiceImpl implements SubjectService {
             subjectfieldMapper.deleteByExample(example);
             fieldList.stream().forEach(x -> {
                 long count = dbList.stream().filter(f -> f.getFieldId() == x.getFieldId()).count();
+                //不是外键字段编码和显示别名需一致
+                x.setFieldAlias(x.getIsForeignKey() == 0 ? x.getFieldCode() : x.getFieldAlias());
                 if (count > 0) {
                     subjectfieldMapper.updateByPrimaryKeySelective(x);
                 } else {
@@ -117,4 +122,73 @@ public class SubjectServiceImpl implements SubjectService {
         }
         return 1;
     }
+
+    @Override
+    public List<SubjectfieldVo> importData(List<SubjectfieldVo> dataList, String loginUserID) {
+
+        if (dataList.size() <= 0)
+            throw new BaseException("", "请添加导入数据!");
+        List<SysDictionaryItem> dicQueryTypeList = dictionaryService.getDictionaryItemList("queryType");
+        List<SysDictionaryItem> dicSettingTypeList = dictionaryService.getDictionaryItemList("settingType");
+
+        dataList.forEach(item -> {
+            String errorInfo = "";
+            SysDictionaryItem dicQueryType = dicQueryTypeList.stream().filter(e -> e.getName().equals(item.getQueryTypeName())).findFirst().orElse(null);
+            SysDictionaryItem dicSettingType = dicSettingTypeList.stream().filter(e -> e.getName().equals(item.getSettingTypeName())).findFirst().orElse(null);
+
+            if (stringUtils.IsNullOrEmpty(item.getFieldCode()))
+                errorInfo += "请填写字段编码!";
+
+            if (stringUtils.IsNullOrEmpty(item.getFieldName()))
+                errorInfo += "请填写字段名称!";
+
+            if (stringUtils.IsNullOrEmpty(item.getSettingTypeName()))
+                errorInfo += "请填写配置类型!";
+
+            if (stringUtils.IsNullOrEmpty(item.getDataType()))
+                errorInfo += "请填写数据类型!";
+
+            if ("字典值".equals(item.getDataType())) {
+                if (stringUtils.IsNullOrEmpty(item.getDictionaryCode()))
+                    errorInfo += "查询类型为字典值请填写取数字典编码!";
+            }
+            if (item.getDisOrder() == null)
+                errorInfo += "请填写显示排序!";
+
+            if (stringUtils.IsNullOrEmpty(item.getIsSearchFieldText()))
+                errorInfo += "请填写是否查询字段!";
+            else if (!Constant.YES.equals(item.getIsSearchFieldText()) && !Constant.No.equals(item.getIsSearchFieldText())) {
+                errorInfo += "是否查询字段请填是或者否!";
+            }
+            if (stringUtils.IsNullOrEmpty(item.getIsForeignKeyText()))
+                errorInfo += "请填写是否关联字段!";
+            else if (!Constant.YES.equals(item.getIsForeignKeyText()) && !Constant.No.equals(item.getIsForeignKeyText())) {
+                errorInfo += "是否关联字段请填是或者否!";
+            }
+            if (Constant.YES.equals(item.getIsForeignKeyText())) {
+                if (stringUtils.IsNullOrEmpty(item.getFieldAlias()))
+                    errorInfo += "关联字段请填写显示别名!";
+                if (stringUtils.IsNullOrEmpty(item.getReferencesTab()))
+                    errorInfo += "关联字段请填写外键表!";
+                if (stringUtils.IsNullOrEmpty(item.getReferencesTab()))
+                    errorInfo += "关联字段请填写外键列!";
+                if (stringUtils.IsNullOrEmpty(item.getReferencesTab()))
+                    errorInfo += "关联字段请填写外键表显示列!";
+            }
+
+            if (dicSettingType == null)
+                errorInfo += "配置类型数据有误!";
+            if (dicQueryType == null)
+                errorInfo += "查询类型不在支持范围!";
+
+            if (stringUtils.IsNullOrEmpty(errorInfo)) {
+                item.setQueryTypeId(dicQueryType.getValue());
+                item.setSettingTypeId(dicSettingType.getValue());
+                item.setIsSearchField(Constant.YES.equals(item.getIsSearchFieldText()) ? 1 : 0);
+                item.setIsForeignKey(Constant.YES.equals(item.getIsForeignKeyText()) ? 1 : 0);
+            }
+            item.setErrorMessage(errorInfo);
+        });
+        return dataList;
+    }
 }

+ 4 - 0
src/main/java/com/bowintek/practice/services/service/SubjectService.java

@@ -2,6 +2,8 @@ package com.bowintek.practice.services.service;
 
 import com.bowintek.practice.model.SrSubject;
 import com.bowintek.practice.model.SrSubjectfield;
+import com.bowintek.practice.vo.SubjectfieldVo;
+import com.bowintek.practice.vo.practicebase.ImportPositionModel;
 import com.github.pagehelper.PageInfo;
 
 import java.util.List;
@@ -20,4 +22,6 @@ public interface SubjectService {
     List<SrSubjectfield> getFieldList(String subjectId);
 
     int delete(List<String> idList);
+
+    List<SubjectfieldVo> importData(List<SubjectfieldVo> dataList, String loginUserID);
 }

+ 6 - 0
src/main/java/com/bowintek/practice/util/Constant.java

@@ -0,0 +1,6 @@
+package com.bowintek.practice.util;
+
+public class Constant {
+    public static final String YES = "是";
+    public static final String No = "否";
+}

+ 13 - 0
src/main/java/com/bowintek/practice/vo/SubjectfieldVo.java

@@ -0,0 +1,13 @@
+package com.bowintek.practice.vo;
+
+import com.bowintek.practice.model.SrSubjectfield;
+import lombok.Data;
+
+@Data
+public class SubjectfieldVo extends SrSubjectfield {
+    private String queryTypeName;
+    private String settingTypeName;
+    private String isSearchFieldText;
+    private String isForeignKeyText;
+    private String errorMessage;
+}

+ 1 - 1
src/main/resources/application-user.yml

@@ -1,3 +1,3 @@
 spring:
   resources:
-    static-locations: file:D:/工作项目/学校党建管理系统/code/gt_partybuild/src/main/resources/static/
+    static-locations: file:D:/我的文件/博颖项目/华北油田AI检索/smartsearch/src/main/resources/static/

+ 1 - 1
src/main/resources/application.yml

@@ -6,7 +6,7 @@ server:
 spring:
   web:
     resources:
-      static-locations: file:D:\pengj\work\java\practice\src\main\resources\static\
+      static-locations: file:D:/我的文件/博颖项目/华北油田AI检索/smartsearch/src/main/resources/static/
   datasource:
     name: practice_db
     type: com.alibaba.druid.pool.DruidDataSource

BIN
src/main/resources/static/doc/template/主题字段导入模板.xlsx


+ 1 - 1
target/classes/application.yml

@@ -6,7 +6,7 @@ server:
 spring:
   web:
     resources:
-      static-locations: file:D:\pengj\work\java\practice\src\main\resources\static\
+      static-locations: file:D:/我的文件/博颖项目/华北油田AI检索/smartsearch/src/main/resources/static/
   datasource:
     name: practice_db
     type: com.alibaba.druid.pool.DruidDataSource

BIN
vue/src/assets/shortcutMenu/周报.png


BIN
vue/src/assets/shortcutMenu/实习任务.png


BIN
vue/src/assets/shortcutMenu/实习生名单.png


BIN
vue/src/assets/shortcutMenu/实习计划.png


BIN
vue/src/assets/shortcutMenu/日报.png


BIN
vue/src/assets/shortcutMenu/月报.png


BIN
vue/src/assets/shortcutMenu/签到信息.png


BIN
vue/src/assets/shortcutMenu/补签申请(补签管理).png


BIN
vue/src/assets/shortcutMenu/请假信息.png


BIN
vue/src/assets/shortcutMenu/请假申请(请假管理).png


BIN
vue/src/assets/shortcutMenu/轮科成绩.png


BIN
vue/src/assets/shortcutMenu/轮科记录.png


BIN
vue/src/assets/shortcutMenu/非轮科成绩.png


+ 2 - 2
vue/src/components/basic/excel/importExcel/importExcel.vue

@@ -87,9 +87,9 @@ export default defineComponent({
     }
 
     const handleOk = () => {
-      post(props.options.url, excelData.value, "导入").then(() => {
+      post(props.options.url, excelData.value, "导入").then((data) => {
         visible.value = false;
-        emit("success");
+        emit("success",data);
       }, (error) => {
         errorVisible.value = true;
         errorDataList.value = error.data;

+ 88 - 31
vue/src/views/subject/detail.vue

@@ -1,21 +1,27 @@
 <template>
   <div class="card-edit">
-    <a-divider orientation="left">学校信息</a-divider>
+    <a-divider orientation="left">主题定义</a-divider>
     <a-descriptions title="" bordered>
-      <a-descriptions-item   :labelStyle="{'width':'12%'}" :contentStyle="{'width':'21%'}"  label="实习学年"> {{ dataModel.schoolYear }}</a-descriptions-item>
-      <a-descriptions-item  :labelStyle="{'width':'12%'}" :contentStyle="{'width':'21%'}"  label="专业"> {{ dataModel.majorGradeName }}</a-descriptions-item>
-      <a-descriptions-item  :labelStyle="{'width':'12%'}" :contentStyle="{'width':'21%'}"  label="基地类型"> {{ dataModel.practiceBaseTypeName }}</a-descriptions-item>
-    </a-descriptions>
-    <a-divider orientation="left">岗位信息</a-divider>
-    <a-descriptions title="" bordered>
-      <a-descriptions-item :labelStyle="{'width':'12%'}" :contentStyle="{'width':'21%'}"  label="单位" > {{ dataModel.practiceBaseName }}</a-descriptions-item>
-      <a-descriptions-item  :labelStyle="{'width':'12%'}" :contentStyle="{'width':'21%'}"  label="岗位名称"> {{ dataModel.name }}</a-descriptions-item>
-      <a-descriptions-item  :labelStyle="{'width':'12%'}" :contentStyle="{'width':'21%'}"  label="岗位数量"> {{ dataModel.qty }}</a-descriptions-item>
-    </a-descriptions>
-    <a-divider orientation="left">备注</a-divider>
-    <a-descriptions title="" bordered>
-      <a-descriptions-item  :labelStyle="{'width':'12%'}"  label="备注"> {{ dataModel.remark }}</a-descriptions-item>
-    </a-descriptions>
+      <a-descriptions-item   :labelStyle="{'width':'12%'}" :contentStyle="{'width':'21%'}"  label="主题名称"> {{ dataModel.subjectName }}</a-descriptions-item>
+      <a-descriptions-item  :labelStyle="{'width':'12%'}" :contentStyle="{'width':'21%'}"  label="表编码"> {{ dataModel.tabCode }}</a-descriptions-item>
+      <a-descriptions-item  :labelStyle="{'width':'12%'}" :contentStyle="{'width':'21%'}"  label="表名称"> {{ dataModel.tabName }}</a-descriptions-item>
+      <a-descriptions-item   :labelStyle="{'width':'12%'}" :contentStyle="{'width':'21%'}"  label="描述"> {{ dataModel.tabDesc }}</a-descriptions-item>
+      <a-descriptions-item  :labelStyle="{'width':'12%'}" :contentStyle="{'width':'21%'}"  label="是否有外键字段"> {{ dataModel.isReferences==1?"是":"否" }}</a-descriptions-item>
+     </a-descriptions>
+    <a-divider orientation="left">字段定义</a-divider>
+    <a-table :columns="columns" :data-source="fieldData" :scroll="{ x:'100%', y: 500 }" :pagination="false"
+             bordered>
+    </a-table>
+    <a-divider orientation="left">Sql预览</a-divider>
+    <codemirror
+      v-model="dataModel.execSql"
+      :style="{ height: '100px',width:'100%' }"
+      :autofocus="true"
+      :indent-with-tab="true"
+      disabled="false"
+      tab-size="2"
+      :theme="'oneDark'"
+    />
     <a-form-item class="buttom-btns">
       <a-button @click="onClose">关闭</a-button>
     </a-form-item>
@@ -26,35 +32,86 @@ import { ref,defineComponent} from 'vue';
 import {get} from "@/api/common";
 import {useTabsViewStore} from "@/store/modules/tabsView";
 import dayjs from "dayjs";
+import type {TableColumnsType} from "ant-design-vue";
+import {getDictionaryItemList} from "@/api/system/dictionary";
+import type {Subject, Subjectfield} from "@/views/subject/model";
+import {Codemirror} from 'vue-codemirror';
+import {MySQL, sql} from "@codemirror/lang-sql";
+import {oneDark} from "@codemirror/theme-one-dark";
+import {useRoute} from "vue-router";
+import router from "@/router";
 
 export default defineComponent({
-  name: 'positiondetail',
+  name: 'subjectDetail',
+  components: {
+    Codemirror, MySQL, sql, oneDark
+  },
   setup() {
     const tabsViewStore = useTabsViewStore();
-    const dataModel = ref({
-      schoolYearID: "",
-      majorGradeID: "",
-      practiceBaseTypeID: "",
-      practiceBaseID: "",
-      name: null,
-      qty: null,
-      remark: "",
-      practiceBaseName:"",
-      schoolYear:"",
-      practiceBaseTypeName:""
+    const route = useRoute();
+    const fieldData = ref<Subjectfield[]>([]);
+    const dataModel = ref<Subject>();
+    const settingTypeList = ref([{name: '', value: ''}]);
+    const queryTypeList = ref([{name: '', value: ''}]);
+
+    getDictionaryItemList({code: "queryType"}).then(data => {
+      queryTypeList.value = data;
+    });
+
+    getDictionaryItemList({code: "settingType"}).then(data => {
+      settingTypeList.value = data;
     });
+    const columns: TableColumnsType = [
+      {
+        title: '序号', width: 80, dataIndex: 'num', key: 'num', align: "center", customRender: ({index}) => {
+          return `${index + 1}`;
+        }
+      },
+      {title: '字段编码', dataIndex: 'fieldCode', key: 'fieldCode', align: "center"},
+      {title: '字段名称', dataIndex: 'fieldName', key: 'fieldName', align: "center"},
+      {
+        title: '配置类型', dataIndex: 'settingTypeId', key: 'settingTypeId', align: "center", customRender: ({record}) => {
+          return settingTypeList.value.filter(x => x.value == record.settingTypeId)[0]?.name;
+        }
+      },
+      {
+        title: '是否查询字段', dataIndex: 'isSearchField', key: 'isSearchField', align: "center", customRender: ({record}) =>
+          record.isSearchField == "1" ? "是" : "否"
+      },
+      {
+        title: '查询类型', dataIndex: 'queryTypeId', key: 'queryTypeId', align: "center", customRender: ({record}) =>
+          queryTypeList.value.filter(x => x.value == record.queryTypeId)[0]?.name
+      },
+      {title: '取数字典编码', dataIndex: 'dictionaryCode', key: 'dictionaryCode', align: "center"},
+      {title: '显示排序', dataIndex: 'disOrder', key: 'disOrder', align: "center"},
+      {
+        title: '是否关联字段', dataIndex: 'isForeignKey', key: 'isForeignKey', align: "center", customRender: ({record}) =>
+          record.isForeignKey == "1" ? "是" : "否"
+      },
+      {title: '显示别名', dataIndex: 'fieldAlias', key: 'fieldAlias', align: "center"},
+      {title: '外键表', dataIndex: 'referencesTab', key: 'referencesTab', align: "center"},
+      {title: '外键列', dataIndex: 'foreignKey', key: 'foreignKey', align: "center"},
+      {title: '外键表显示列', dataIndex: 'displayColumn', key: 'displayColumn', align: "center"},
+    ];
     const loadData = async (id) => {
-      const reqData = await get('position/getPosition', {positionID: id});
-      (dataModel.value as any) = reqData;
+      get('subject/getSubject',
+        {subjectId: id}).then(data => {
+        dataModel.value = data;
+      })
+      get('subject/getFieldList',
+        {subjectId: id}).then(data => {
+        fieldData.value = data;
+      })
     }
     loadData( history.state.params?.id);
 
     const onClose = () => {
-      tabsViewStore.addTabByPath("/position/list",{});
+      tabsViewStore.closeCurrentTab(route);
+      router.back();
     };
 
     return {
-      loadData,
+      loadData,columns,fieldData,
       onClose,
       dataModel,
       dayjs

+ 46 - 6
vue/src/views/subject/edit.vue

@@ -47,6 +47,8 @@
         <a-col :span="24" style="margin-right: 20px;">
           <div style="float: right;">
             <Space>
+              <BImportExcel :options="importOptions" @success="onImportSuccess"></BImportExcel>
+              &nbsp;
               <a-button @click="add()">
                 <template #icon>
                   <plus-circle-outlined/>
@@ -114,10 +116,13 @@ import type {TableColumnsType} from 'ant-design-vue';
 import {get, save} from '@/api/common';
 import FieldEdit from "@/views/subject/fieldedit.vue";
 import {getDictionaryItemList} from "@/api/system/dictionary";
-import {Codemirror} from 'vue-codemirror'
-import {oneDark} from '@codemirror/theme-one-dark'
+import {Codemirror} from 'vue-codemirror';
+import {oneDark} from '@codemirror/theme-one-dark';
 import {sql, MySQL} from '@codemirror/lang-sql';
 import type {Subjectfield, Subject} from "@/views/subject/model";
+import type {ImportProps} from "@/components/basic/excel/importExcel/ImportProps";
+import BImportExcel from "@/components/basic/excel/importExcel/importExcel.vue";
+import {message} from "ant-design-vue";
 
 interface FormState {
   dataModel: Subject;
@@ -126,7 +131,7 @@ interface FormState {
 export default defineComponent({
   name: 'subjectEditForm',
   components: {
-    BUploadFile, FieldEdit, Codemirror, MySQL, sql, oneDark
+    BUploadFile, FieldEdit, Codemirror, MySQL, sql, oneDark, BImportExcel
   },
   setup() {
     const subject: Subject = {
@@ -134,7 +139,8 @@ export default defineComponent({
       tabCode: "",
       tabName: "",
       isReferences: 0,
-      tabDesc: ""
+      tabDesc: "",
+      execSql: ""
     }
     const formState = reactive<FormState>({dataModel: subject});
     const tabsViewStore = useTabsViewStore();
@@ -147,6 +153,10 @@ export default defineComponent({
     let isEdit = false;
 
     const onFinish = () => {
+      if (fieldData.value.length == 0) {
+        message.warn("尚未添加任何字段定义。");
+        return;
+      }
       save('/subject/saveSubject', {dataModel: formState.dataModel, fieldList: fieldData.value}).then(result => {
         if (result) {
           onClose(1)
@@ -207,6 +217,36 @@ export default defineComponent({
       {title: '外键表显示列', dataIndex: 'displayColumn', key: 'displayColumn', align: "center"},
       {title: '操作', key: 'operation', fixed: 'right', width: 120, align: "center"},
     ];
+    const importOptions = ref<ImportProps>({
+      title: "导入",
+      url: 'subject/importData',
+      columns: [
+        {cnName: "字段编码", enName: "fieldCode", width: 100},
+        {cnName: "字段名称", enName: "fieldName", width: 200},
+        {cnName: "配置类型", enName: "settingTypeName", width: 200},
+        {cnName: "字段描述", enName: "fieldDesc", width: 100},
+        {cnName: "数据类型", enName: "dataType", width: 150},
+        {cnName: "查询类型", enName: "queryTypeName", width: 100},
+        {cnName: "取数字典编码", enName: "dictionaryCode", width: 200},
+        {cnName: "显示排序", enName: "disOrder", width: 200},
+        {cnName: "是否查询字段", enName: "isSearchFieldText", width: 200},
+        {cnName: "是否关联字段", enName: "isForeignKeyText", width: 100},
+        {cnName: "外键表", enName: "referencesTab", width: 150},
+        {cnName: "外键列", enName: "foreignKey", width: 150},
+        {cnName: "外键表显示列", enName: "displayColumn", width: 150},
+        {cnName: "显示别名", enName: "fieldAlias", width: 200},
+      ],
+      template: {
+        tempFileName: "主题字段导入模板.xlsx",
+        url: '',
+        params: null
+      }
+    });
+    const onImportSuccess = (data: []) => {
+      fieldData.value = fieldData.value.concat(data);
+      formState.dataModel.isReferences = fieldData.value.filter((x) => x.isForeignKey == 1).length > 0 ? 1 : 0;
+    }
+
     const data = ref([]);
 
     const add = () => {
@@ -247,8 +287,8 @@ export default defineComponent({
     );
     return {
       ...toRefs(formState),
-      onFinish, onFieldSave, onClose, add,
-      edit,
+      onFinish, onFieldSave, onClose, add, onImportSuccess,
+      edit, importOptions,
       onDelete,
       loadData, oneDark,
       fieldData, columns,

+ 0 - 20
vue/src/views/subject/index.vue

@@ -40,7 +40,6 @@
       <a-row class="edit-operation">
         <a-col :span="24" style="text-align: right">
           <a-button type="primary" html-type="button" @click="add" functioncode="T010601">新增</a-button>
-          <BImportExcel :options="importOptions" @success="loadData" functioncode="T010602"></BImportExcel>
           <BExportExcel :title="'导出'" :filename="'主题信息'" :url="'subject/exportSubject'"
                         :params="{...formState, idList:selectedRowKeys}"></BExportExcel>
           <a-popconfirm placement="leftTop"
@@ -79,7 +78,6 @@ import {useRoute, useRouter} from "vue-router";
 import {useTabsViewStore} from "@/store/modules/tabsView";
 import {message} from "ant-design-vue";
 import {DownOutlined, UpOutlined} from "@ant-design/icons-vue";
-import type {ImportProps} from "@/components/basic/excel/importExcel/ImportProps";
 import BImportExcel from "@/components/basic/excel/importExcel/importExcel.vue";
 import BExportExcel from "@/components/basic/excel/exportExcel/exportExcel.vue";
 import {getPaginationTotalTitle} from "@/utils/common";
@@ -123,23 +121,6 @@ export default defineComponent({
       },
     ];
 
-    const importOptions = ref<ImportProps>({
-      title: "导入",
-      url: 'position/importData',
-      columns: [
-        {cnName: "实习开始年份", enName: "startYear",width:100},
-        {cnName: "年级专业名称", enName: "majorGradeName",width:200},
-        {cnName: "所属单位", enName: "practiceBaseName",width:200},
-        {cnName: "岗位名称", enName: "name",width:200},
-        {cnName: "岗位数量", enName: "qty",width:100},
-        {cnName: "备注", enName: "remark",width:150}],
-      template: {
-        tempFileName: "岗位导入模板.xlsx",
-        url: '',
-        params: null
-      }
-    });
-
     const data = ref([]);
     const pagination = computed(() => ({
       total: formState.total,
@@ -208,7 +189,6 @@ export default defineComponent({
       detail,
       add,
       edit,onDelete,filterOption,
-      importOptions
     };
   },
   created() {

+ 2 - 1
vue/src/views/subject/model.ts

@@ -3,7 +3,8 @@ export interface Subject {
   tabCode: string,
   tabName: string,
   isReferences: number | null,
-  tabDesc: string
+  tabDesc: string,
+  execSql:string
 }
 
 export interface Subjectfield {