Browse Source

Merge remote-tracking branch 'origin/master'

liao-sea 10 months ago
parent
commit
b54ec6404d

+ 15 - 0
h5app/src/api/label/index.ts

@@ -0,0 +1,15 @@
+import {request} from "@/utils/request";
+
+
+export function getLabelList(params: any) {
+    return request<object>(
+        {
+            url: "label/getList",
+            method: 'get',
+            params: params,
+        },
+        {
+            isNew: true,
+        },
+    );
+}

+ 138 - 0
h5app/src/components/labelSelection.vue

@@ -0,0 +1,138 @@
+<template>
+  <ion-button id="labelSelection" style="color: #02a6f1;font-size: 15px;" fill="clear" @click="loadData()">选择标签
+  </ion-button>
+  <ion-page>
+    <ion-content class="ion-padding">
+      <ion-modal trigger="labelSelection" :is-open="isOpen">
+        <ion-header class="header-theme2">
+          <ion-toolbar>
+            <ion-buttons slot="start">
+              <ion-icon :icon="arrowBackOutline" @click="onCancel()"></ion-icon>
+            </ion-buttons>
+            <ion-title>{{ title }}</ion-title>
+            <ion-buttons slot="end">
+              <ion-button fill="clear" @click="onConfirm()">确定</ion-button>
+            </ion-buttons>
+          </ion-toolbar>
+        </ion-header>
+        <ion-content class="ion-padding">
+          <div class="bw-vue-list">
+            <div class="list-content">
+              <ion-item style="margin: 0px 0px;--padding-start:0px;--inner-padding-end:0px;">
+                <ion-label>
+                  <div class="multi-title">
+                    <h2 style="font-weight:600;">基础标签</h2>
+                  </div>
+                  <p>
+                    <ion-grid>
+                      <ion-row>
+                        <ion-col size="auto" v-for="(record,key) in basicsLabelList" :key="key">
+                          <ion-button size="small" :color="record.checked?'primary':'light'"
+                                      @click="record.checked=!record.checked">{{ record.labelName }}
+                          </ion-button>
+                        </ion-col>
+                      </ion-row>
+                    </ion-grid>
+                  </p>
+                </ion-label>
+              </ion-item>
+              <ion-item style="margin: 0px 0px;--padding-start:0px;--inner-padding-end:0px;">
+                <ion-label>
+                  <div class="multi-title">
+                    <h2 style="font-weight:600;">自定义标签</h2>
+                  </div>
+                  <p>
+                    <ion-grid>
+                      <ion-row>
+                        <ion-col size="auto" v-for="(record,key) in customLabelList" :key="key">
+                          <ion-button size="small" :color="record.checked?'primary':'light'"
+                                      @click="record.checked=!record.checked">{{ record.labelName }}
+                          </ion-button>
+                        </ion-col>
+                      </ion-row>
+                    </ion-grid>
+                  </p>
+                </ion-label>
+              </ion-item>
+            </div>
+          </div>
+        </ion-content>
+      </ion-modal>
+    </ion-content>
+  </ion-page>
+</template>
+
+<script lang="ts">
+
+import {defineComponent, ref} from 'vue';
+import {arrowBackOutline, searchOutline} from 'ionicons/icons';
+import {IonIcon} from '@ionic/vue';
+import {getLabelList} from "@/api/label";
+
+export default defineComponent({
+  name: 'labelSelection',
+  components: {IonIcon},
+  props: {
+    listLabel: {
+      type: Array,
+      default: null
+    },
+    bigType: {
+      type: Number,
+      default: null
+    },
+    title: {
+      type: String,
+      default: null
+    }
+  },
+  setup(props, context) {
+    const loading = ref(true);
+    const isOpen = ref(false);
+    const basicsLabelList = ref<any>([]);
+    const customLabelList = ref<any>([]);
+    const loadData = async function () {
+      loading.value = true;
+      basicsLabelList.value = [];
+      customLabelList.value = [];
+      const result: any = await getLabelList({pageIndex: 1, pageSize: 9999, bigType: props.bigType})
+
+      result.list.forEach((x: any) => {
+        if (props.listLabel) {
+          x.checked = props.listLabel.findIndex((f: any) => f.labelID == x.labelID) >= 0;
+        }
+
+        if (x.labelType === 1) {
+          basicsLabelList.value.push(x);
+        } else {
+          customLabelList.value.push(x);
+        }
+      })
+      loading.value = false;
+      isOpen.value = true;
+    }
+
+    const onConfirm = () => {
+      const selects = basicsLabelList.value.filter((x: any) => x.checked == true).concat(customLabelList.value.filter((x: any) => x.checked == true))
+      context.emit("resultBack", selects)
+      isOpen.value = false;
+    }
+
+    const onCancel = () => {
+      isOpen.value = false;
+    }
+
+    return {
+      searchOutline,
+      arrowBackOutline,
+      loading,
+      isOpen,
+      basicsLabelList,
+      customLabelList,
+      onConfirm,
+      onCancel,
+      loadData
+    }
+  }
+});
+</script>

+ 23 - 2
h5app/src/views/pages/company/edit.vue

@@ -278,6 +278,20 @@
                             v-model="dataModel.companyDesc" class="custom" style="border-bottom: 1px solid #fff2e8;">
               </ion-textarea>
             </div>
+            <div class="form-input">
+              <ion-label>标签</ion-label>
+              <ion-row>
+                <ion-col size="auto" v-for="(itemLabel,keyLabel) in dataModel.listLabel" :key="keyLabel">
+                  <ion-button color="primary" size="small">{{ itemLabel.labelName }}</ion-button>
+                </ion-col>
+                <ion-col>
+                  <ion-item style="float: right;padding:0px;margin: 0px;">
+                    <label-selection :big-type="1" :list-label="dataModel.listLabel" :title="'企业标签'"
+                                     @resultBack="onResultBackLabels"></label-selection>
+                  </ion-item>
+                </ion-col>
+              </ion-row>
+            </div>
           </div>
         </div>
       </form>
@@ -321,6 +335,7 @@ import dayjs from "dayjs";
 import IndustrySelection from "@/components/industrySelection.vue";
 import {getPosition} from "@/utils/position";
 import CompanySelectionLike from "@/components/companySelectionLike.vue";
+import LabelSelection from "@/components/labelSelection.vue";
 
 interface StepParams{
   name: string,
@@ -329,7 +344,7 @@ interface StepParams{
 }
 export default defineComponent({
   name: 'CompanyEdit',
-  components:{IndustrySelection,CompanySelectionLike},
+  components:{IndustrySelection,CompanySelectionLike, LabelSelection},
   setup() {
     const route = useRoute();
     const router = useRouter();
@@ -395,7 +410,8 @@ export default defineComponent({
         businScope: null,
         companyDesc: null,
         longitude: null,
-        latitude: null
+        latitude: null,
+        listLabel: null
     }});
     const stepList = ref([
         {title: '基础信息', desc: '企业基础信息', val: 1},
@@ -639,6 +655,10 @@ export default defineComponent({
       }
     };
 
+    const onResultBackLabels = (data: any) => {
+      formState.dataModel.listLabel = data;
+    }
+
     const onResultInfo = (data: any)=>{
       formState.dataModel.companyName = data.text;
       onGetFirmByCompanyName();
@@ -746,6 +766,7 @@ export default defineComponent({
       refCompanySelectionLike,
       onOpenCompany,
       onResultInfo,
+      onResultBackLabels,
       isLongDate,
       curStepData,
       stepList,

+ 140 - 109
h5app/src/views/pages/company/editPost.vue

@@ -1,5 +1,5 @@
 <template>
-  <ion-page  class="list-page">
+  <ion-page class="list-page">
     <ion-header class="header-theme2">
       <ion-toolbar>
         <ion-buttons slot="start">
@@ -18,26 +18,27 @@
             <ion-label>岗位名称<span class="danger">*</span></ion-label>
             <div>
               <ion-input placeholder="请输入岗位" label-placement="stacked" style="float: left;width:78%;"
-                         @click="onOpenPost" v-model="dataModel.professionName" class="custom" readonly >
+                         @click="onOpenPost" v-model="dataModel.professionName" class="custom" readonly>
               </ion-input>
               <ion-item style="width:22%;float: right;padding:0px;margin: 0px;">
                 <post-selection-like ref="refPostSelectionLike" @resultInfo="onResultInfo"></post-selection-like>
               </ion-item>
             </div>
-            <ion-note v-show="isCommit&&v$.dataModel.professionName.$error" class="danger" >请选择岗位</ion-note>
+            <ion-note v-show="isCommit&&v$.dataModel.professionName.$error" class="danger">请选择岗位</ion-note>
           </div>
           <div style="width: 100%;overflow: hidden;"></div>
           <div class="form-input">
             <ion-label>工种名称<span class="danger">*</span></ion-label>
             <div>
               <ion-input placeholder="请选择工种" label-placement="stacked" style="float: left;width:78%;"
-                         v-model="dataModel.workCategoryName" class="custom" readonly >
+                         v-model="dataModel.workCategoryName" class="custom" readonly>
               </ion-input>
               <ion-item style="width:22%;float: right;padding:0px;margin: 0px;">
-                <work-category-selection  :WorkCategoryID="dataModel.workCode" @SetWorkCategoryID="onSetWorkCategoryID"></work-category-selection>
+                <work-category-selection :WorkCategoryID="dataModel.workCode"
+                                         @SetWorkCategoryID="onSetWorkCategoryID"></work-category-selection>
               </ion-item>
             </div>
-            <ion-note v-show="isCommit&&v$.dataModel.workCategoryName.$error" class="danger" >请选择工种</ion-note>
+            <ion-note v-show="isCommit&&v$.dataModel.workCategoryName.$error" class="danger">请选择工种</ion-note>
           </div>
           <div style="width: 100%;overflow: hidden;"></div>
           <div class="form-input">
@@ -45,24 +46,24 @@
             <ion-input placeholder="请输入招聘数量" label-placement="stacked" :clear-input="true"
                        v-model="dataModel.recruitCount" class="custom" @ionBlur="recruitCountBlur">
             </ion-input>
-            <ion-note v-show="isCommit&&v$.dataModel.recruitCount.$error" class="danger"  >请输入招聘数量</ion-note>
+            <ion-note v-show="isCommit&&v$.dataModel.recruitCount.$error" class="danger">请输入招聘数量</ion-note>
           </div>
           <div class="form-input">
-          <ion-label>招聘日期<span class="danger">*</span></ion-label>
+            <ion-label>招聘日期<span class="danger">*</span></ion-label>
             <div>
               <ion-datetime-button datetime="startTime" style="float:left;"></ion-datetime-button>
               <span style="float:left;padding-top: 5px;">至</span>
               <ion-datetime-button datetime="endTime" style="float:left;"></ion-datetime-button>
               <ion-modal :keep-contents-mounted="true">
                 <ion-datetime placeholder="招聘开始日期" id="startTime"
-                              v-model="dataModel.startTime"  :prefer-wheel="true"
+                              v-model="dataModel.startTime" :prefer-wheel="true"
                               dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
                               :show-default-buttons="true" style="text-align: left;width: 100%;">
                 </ion-datetime>
               </ion-modal>
               <ion-modal :keep-contents-mounted="true">
                 <ion-datetime placeholder="招聘结束日期" id="endTime"
-                              v-model="dataModel.endTime"  :prefer-wheel="true"
+                              v-model="dataModel.endTime" :prefer-wheel="true"
                               dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
                               :show-default-buttons="true" style="text-align: left;width: 100%;">
                 </ion-datetime>
@@ -73,23 +74,24 @@
           <div class="form-input">
             <ion-label>工作地点<span class="danger">*</span></ion-label>
             <ion-textarea placeholder="请输入工作地点" :rows="3" label-placement="stacked" :clear-input="true"
-                       v-model="dataModel.jobPlace" class="custom" style="border-bottom: 1px solid #fff2e8;">
+                          v-model="dataModel.jobPlace" class="custom" style="border-bottom: 1px solid #fff2e8;">
             </ion-textarea>
-              <ion-note v-show="isCommit&&v$.dataModel.jobPlace.$error" class="danger" >请输入工作地点</ion-note>
+            <ion-note v-show="isCommit&&v$.dataModel.jobPlace.$error" class="danger">请输入工作地点</ion-note>
           </div>
         </div>
         <div class="bw-vue-form">
-          <div class="form-title" >
+          <div class="form-title">
             其他信息
             <div style="float: right;">
-              <ion-label style="color: red;font-size: 14px;" @click="isShow=!isShow">{{isShow?"收起":"展开"}}</ion-label>
+              <ion-label style="color: red;font-size: 14px;" @click="isShow=!isShow">{{ isShow ? "收起" : "展开" }}
+              </ion-label>
             </div>
           </div>
-          <div v-show="isShow" >
+          <div v-show="isShow">
             <div class="form-select">
               <ion-label>工作性质</ion-label>
               <ion-select interface="action-sheet" placeholder="请选择工作性质" cancel-text="取消" name="workNatureID"
-                          id="workNatureID" v-model="dataModel.workNatureID" style="width: 100%;text-align: left;" >
+                          id="workNatureID" v-model="dataModel.workNatureID" style="width: 100%;text-align: left;">
                 <ion-select-option v-for="(record,key) in workNatureList" :key="key"
                                    v-model:value="record.value">
                   {{ record.name }}
@@ -112,7 +114,8 @@
             <div class="form-select">
               <ion-label>是否有试用期</ion-label>
               <ion-select interface="action-sheet" placeholder="请选择是否有试用期" cancel-text="取消"
-                          id="isTrail" v-model="dataModel.isTrail" style="width: 100%;text-align: left;" @ionChange="onIsTrailChange">
+                          id="isTrail" v-model="dataModel.isTrail" style="width: 100%;text-align: left;"
+                          @ionChange="onIsTrailChange">
                 <ion-select-option v-for="(record,key) in isTrailList" :key="key"
                                    v-model:value="record.value">
                   {{ record.name }}
@@ -188,13 +191,27 @@
                          v-model="dataModel.contactEmail" class="custom">
               </ion-input>
             </div>
+            <div class="form-input">
+              <ion-label>标签</ion-label>
+              <ion-row>
+                <ion-col size="auto" v-for="(itemLabel,keyLabel) in dataModel.listLabel" :key="keyLabel">
+                  <ion-button color="primary" size="small">{{ itemLabel.labelName }}</ion-button>
+                </ion-col>
+                <ion-col>
+                  <ion-item style="float: right;padding:0px;margin: 0px;">
+                    <label-selection :big-type="3" :list-label="dataModel.listLabel" :title="'岗位标签'"
+                                     @resultBack="onResultBackLabels"></label-selection>
+                  </ion-item>
+                </ion-col>
+              </ion-row>
+            </div>
           </div>
         </div>
       </form>
     </ion-content>
     <ion-footer>
       <ion-toolbar>
-          <ion-button style="width: 100%;" @click="onSave">提交</ion-button>
+        <ion-button style="width: 100%;" @click="onSave">提交</ion-button>
       </ion-toolbar>
     </ion-footer>
   </ion-page>
@@ -205,7 +222,7 @@ import {arrowBackOutline} from 'ionicons/icons';
 import {useRoute, useRouter} from "vue-router";
 import {alertController, onIonViewDidEnter} from "@ionic/vue";
 import {useVuelidate} from "@vuelidate/core";
-import {getPostByID,savePost} from "@/api/post";
+import {getPostByID, savePost} from "@/api/post";
 import {getCompanyById} from "@/api/company";
 import {required} from "@vuelidate/validators";
 import {getSysDictionaryList} from "@/api/system/dictionary";
@@ -213,6 +230,7 @@ import dayjs from "dayjs";
 import PostSelectionLike from "@/components/postSelectionLike.vue";
 import WorkCategorySelection from "@/components/workCategorySelection.vue";
 import {useUserStore} from "@/store/modules/user";
+import LabelSelection from "@/components/labelSelection.vue";
 
 interface postModel {
   dataModel: any;
@@ -220,7 +238,7 @@ interface postModel {
 
 export default defineComponent({
   name: 'PostEdit',
-  components:{PostSelectionLike,WorkCategorySelection},
+  components: {PostSelectionLike, WorkCategorySelection, LabelSelection},
   setup() {
     const router = useRouter();
     const route = useRoute();
@@ -230,34 +248,36 @@ export default defineComponent({
     const isCommit = ref<any>(false);
     const formState = reactive<postModel>({
       dataModel: {
-        companyID:null,
-        loginUserID:'',
-        professionName:null,
-        professionID:null,
-        postName:null,
-        workCategoryName:null,
-        workCode:null,
-        workName:null,
-        recruitCount:null,
-        startTime:dayjs().format("YYYY-MM-DD"),
-        endTime:dayjs().format("YYYY-MM-DD"),
-        jobPlace:null,
-        minSalary:null,
-        maxSalary:null,
-        isTrail:null,
-        trailMonths:0,
-        trailMinSalary:null,
-        trailMaxSalary:null,
-        workYear:null,
-        cultureRank:null,
-        welfare:null,
-        postDesc:null,
-        workNatureID:null,
-        contactName:null,
-        contactMobile:null,
-        contactEmail:null,
-        bonus:null
-      }});
+        companyID: null,
+        loginUserID: '',
+        professionName: null,
+        professionID: null,
+        postName: null,
+        workCategoryName: null,
+        workCode: null,
+        workName: null,
+        recruitCount: null,
+        startTime: dayjs().format("YYYY-MM-DD"),
+        endTime: dayjs().format("YYYY-MM-DD"),
+        jobPlace: null,
+        minSalary: null,
+        maxSalary: null,
+        isTrail: null,
+        trailMonths: 0,
+        trailMinSalary: null,
+        trailMaxSalary: null,
+        workYear: null,
+        cultureRank: null,
+        welfare: null,
+        postDesc: null,
+        workNatureID: null,
+        contactName: null,
+        contactMobile: null,
+        contactEmail: null,
+        bonus: null,
+        listLabel: null
+      }
+    });
     const rules = computed(() => {
       return {
         dataModel: {
@@ -266,7 +286,7 @@ export default defineComponent({
           recruitCount: {required},
           startTime: {required},
           endTime: {required},
-          jobPlace:{required}
+          jobPlace: {required}
         }
       }
     });
@@ -291,31 +311,35 @@ export default defineComponent({
       await alert.present();
     }
 
-    const onSetWorkCategoryID = (data: any)=>{
+    const onSetWorkCategoryID = (data: any) => {
       formState.dataModel.workCode = data.value;
       formState.dataModel.workCategoryName = data.text;
     }
 
 
-    const onSave = async function (){
+    const onSave = async function () {
       isCommit.value = true;
       const isFormCorrect = await v$.value.$validate();
-      console.log("当前岗位信息",formState.dataModel);
+      console.log("当前岗位信息", formState.dataModel);
       if (!isFormCorrect) {
         await presentAlert('请输入完整信息!');
         return null;
       }
       ifInputAllValid();
-      if(isCommit.value&&inputValid.value){
-        savePost(formState.dataModel).then(result=>{
-          if(result){
-            router.push({path: "./postList", query: {reload:1,id:formState.dataModel.companyID,status: 3}});
+      if (isCommit.value && inputValid.value) {
+        savePost(formState.dataModel).then(result => {
+          if (result) {
+            router.push({path: "./postList", query: {reload: 1, id: formState.dataModel.companyID, status: 3}});
           }
         })
       }
     }
 
-    const onResultInfo = (data: any)=>{
+    const onResultBackLabels = (data: any) => {
+      formState.dataModel.listLabel = data;
+    }
+
+    const onResultInfo = (data: any) => {
       formState.dataModel.professionID = data.value;
       formState.dataModel.professionName = data.text;
     }
@@ -325,25 +349,28 @@ export default defineComponent({
     }
 
     const back = () => {
-      router.push({path: "./postList", query: {reload:1,id:formState.dataModel.companyID,status: 3,isEdit:isEditCompany.value}});
+      router.push({
+        path: "./postList",
+        query: {reload: 1, id: formState.dataModel.companyID, status: 3, isEdit: isEditCompany.value}
+      });
     }
 
-    const getWorkYearList = async function(){
-      const data :any = await getSysDictionaryList("WorkYearType");
+    const getWorkYearList = async function () {
+      const data: any = await getSysDictionaryList("WorkYearType");
       workYearList.value = data;
     }
-    const getCultureRankList = async function(){
-      const data:any = await getSysDictionaryList("CultureLevel");
+    const getCultureRankList = async function () {
+      const data: any = await getSysDictionaryList("CultureLevel");
       cultureRankList.value = data;
     }
 
-    const getWorkNationList = async function(){
-      const data:any = await getSysDictionaryList("WorkNature");
+    const getWorkNationList = async function () {
+      const data: any = await getSysDictionaryList("WorkNature");
       workNatureList.value = data;
     }
 
-    const loadData = async (postID: any,companyID:any,isEdit:any) => {
-      isCommit.value =false;
+    const loadData = async (postID: any, companyID: any, isEdit: any) => {
+      isCommit.value = false;
       await getWorkYearList();
       await getCultureRankList();
       await getWorkNationList();
@@ -352,16 +379,16 @@ export default defineComponent({
       const reqData = await getPostByID(postID);
       formState.dataModel = reqData;
       formState.dataModel.companyID = companyID;
-      formState.dataModel.loginUserID = loginUserInfo.userID == undefined?"":loginUserInfo.userID;
-      if(postID==null){
-        const curPostCompany :any = await getCompanyById(companyID,formState.dataModel.loginUserID);
-        formState.dataModel.welfare =  curPostCompany.bonus;
+      formState.dataModel.loginUserID = loginUserInfo.userID == undefined ? "" : loginUserInfo.userID;
+      if (postID == null) {
+        const curPostCompany: any = await getCompanyById(companyID, formState.dataModel.loginUserID);
+        formState.dataModel.welfare = curPostCompany.bonus;
       }
-      console.log("初始化岗位信息",formState.dataModel);
+      console.log("初始化岗位信息", formState.dataModel);
     };
 
-    const onIsTrailChange = ()=>{
-      if(!formState.dataModel.isTrail){
+    const onIsTrailChange = () => {
+      if (!formState.dataModel.isTrail) {
         formState.dataModel.trailMonths = 0;
       }
     }
@@ -373,10 +400,11 @@ export default defineComponent({
     }
 
     const inputValid = ref(true);
+
     function recruitCountBlur() {
       inputValid.value = true;
       if (formState.dataModel.recruitCount != null) {
-        if(!isStringInteger(formState.dataModel.recruitCount)||formState.dataModel.recruitCount<1){
+        if (!isStringInteger(formState.dataModel.recruitCount) || formState.dataModel.recruitCount < 1) {
           presentAlert("招聘数量必须为一个正整数!");
           inputValid.value = false;
         }
@@ -384,100 +412,102 @@ export default defineComponent({
     }
 
     function trailMonthsBlur() {
-      if (formState.dataModel.trailMonths!= null) {
-        if(!isStringInteger(formState.dataModel.trailMonths)){
+      if (formState.dataModel.trailMonths != null) {
+        if (!isStringInteger(formState.dataModel.trailMonths)) {
           formState.dataModel.trailMonths = Math.floor(formState.dataModel.trailMonths);
-          if(parseInt(formState.dataModel.trailMonths)<0){
+          if (parseInt(formState.dataModel.trailMonths) < 0) {
             formState.dataModel.trailMonths = 0;
           }
         }
       }
     }
 
-    const ifInputAllValid = ()=>{
+    const ifInputAllValid = () => {
       let errorMessage = "";
       let hasMinSalary = false;
       let hasTrailMinSalary = false;
       let curMinSalary = 0.0;
       let curTrailMinSalary = 0.0;
-      if(dayjs(formState.dataModel.startTime).isAfter(dayjs(formState.dataModel.endTime))){
-        errorMessage +="招聘结束日期不能早于开始日期!";
+      if (dayjs(formState.dataModel.startTime).isAfter(dayjs(formState.dataModel.endTime))) {
+        errorMessage += "招聘结束日期不能早于开始日期!";
         isCommit.value = false;
       }
-      if (formState.dataModel.minSalary!=null) {
+      if (formState.dataModel.minSalary != null) {
         hasMinSalary = true;
         curMinSalary = parseFloat(formState.dataModel.minSalary);
-        if(formState.dataModel.minSalary<0){
-          errorMessage +="岗位最低月薪不能小于0!";
+        if (formState.dataModel.minSalary < 0) {
+          errorMessage += "岗位最低月薪不能小于0!";
           isCommit.value = false;
         }
       }
-      if (formState.dataModel.trailMinSalary!=null) {
+      if (formState.dataModel.trailMinSalary != null) {
         hasTrailMinSalary = true;
         curTrailMinSalary = parseFloat(formState.dataModel.trailMinSalary);
-        if(formState.dataModel.trailMinSalary<0){
-          errorMessage +="试用期最低月薪不能小于0!";
+        if (formState.dataModel.trailMinSalary < 0) {
+          errorMessage += "试用期最低月薪不能小于0!";
           isCommit.value = false;
         }
       }
-      if (formState.dataModel.maxSalary!=null) {
-        if(formState.dataModel.maxSalary<0){
-          errorMessage +="岗位最高月薪不能小于0!";
+      if (formState.dataModel.maxSalary != null) {
+        if (formState.dataModel.maxSalary < 0) {
+          errorMessage += "岗位最高月薪不能小于0!";
           isCommit.value = false;
         }
-        if(hasMinSalary){
-          if(parseFloat(formState.dataModel.maxSalary) < curMinSalary){
-            errorMessage +="岗位最高月薪不能小于岗位最低月薪!";
+        if (hasMinSalary) {
+          if (parseFloat(formState.dataModel.maxSalary) < curMinSalary) {
+            errorMessage += "岗位最高月薪不能小于岗位最低月薪!";
             isCommit.value = false;
           }
         }
       }
-      if (formState.dataModel.trailMaxSalary!=null) {
-        if(formState.dataModel.trailMaxSalary<0){
-          errorMessage +="试用期最高月薪不能小于0!";
+      if (formState.dataModel.trailMaxSalary != null) {
+        if (formState.dataModel.trailMaxSalary < 0) {
+          errorMessage += "试用期最高月薪不能小于0!";
           isCommit.value = false;
         }
-        if(hasTrailMinSalary){
-          if(parseFloat(formState.dataModel.trailMaxSalary) < curTrailMinSalary){
-            errorMessage +="试用期最高月薪不能小于试用期最低月薪!";
+        if (hasTrailMinSalary) {
+          if (parseFloat(formState.dataModel.trailMaxSalary) < curTrailMinSalary) {
+            errorMessage += "试用期最高月薪不能小于试用期最低月薪!";
             isCommit.value = false;
           }
         }
       }
-      if (formState.dataModel.trailMonths!=null) {
-        if(formState.dataModel.isTrail&&formState.dataModel.trailMonths<0){
-          errorMessage +="试用月数不能小于0!";
+      if (formState.dataModel.trailMonths != null) {
+        if (formState.dataModel.isTrail && formState.dataModel.trailMonths < 0) {
+          errorMessage += "试用月数不能小于0!";
           isCommit.value = false;
         }
       }
 
       const mobileReg = /^1[3|4|5|6|7|8|9]\d{9}$/;
       const landlineReg = /[0-9-()()]{7,18}/;
-      if(formState.dataModel.contactMobile != null){
-        if(!mobileReg.test(formState.dataModel.contactMobile)&&!landlineReg.test(formState.dataModel.contactMobile)){
+      if (formState.dataModel.contactMobile != null) {
+        if (!mobileReg.test(formState.dataModel.contactMobile) && !landlineReg.test(formState.dataModel.contactMobile)) {
           errorMessage += "输入的联系电话有误!";
           isCommit.value = false;
         }
       }
       const emailReg = /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/;
-      if(formState.dataModel.contactEmail!=""&&formState.dataModel.contactEmail!=null){
-        if(!emailReg.test(formState.dataModel.contactEmail)){
+      if (formState.dataModel.contactEmail != "" && formState.dataModel.contactEmail != null) {
+        if (!emailReg.test(formState.dataModel.contactEmail)) {
           errorMessage += "输入的邮箱有误!";
           isCommit.value = false;
         }
       }
-      if(!isCommit.value){presentAlert(errorMessage);}
+      if (!isCommit.value) {
+        presentAlert(errorMessage);
+      }
     }
 
 
-    const reload = (postID: any,companyID:any,isEdit:any) => {
+    const reload = (postID: any, companyID: any, isEdit: any) => {
       formState.dataModel.recruitCount = null;
-      loadData(postID,companyID,isEdit);
+      loadData(postID, companyID, isEdit);
     }
 
     onIonViewDidEnter(() => {
       if (route.query.reload)
-        reload(route.query.id,route.query.companyID,route.query.isEdit);
+        reload(route.query.id, route.query.companyID, route.query.isEdit);
     });
 
     return {
@@ -493,6 +523,7 @@ export default defineComponent({
       workNatureList,
       cultureRankList,
       v$,
+      onResultBackLabels,
       refPostSelectionLike,
       onOpenPost,
       onResultInfo,

+ 23 - 2
h5app/src/views/pages/jobhunt/edit.vue

@@ -322,6 +322,20 @@
                           placeholder="请输入个人技能" v-model="baseData.personalSkills"
                           style="border-bottom: 1px solid #fff2e8;"></ion-textarea>
           </div>
+          <div class="form-input">
+            <ion-label>标签</ion-label>
+            <ion-row>
+              <ion-col size="auto" v-for="(itemLabel,keyLabel) in baseData.listLabel" :key="keyLabel">
+                <ion-button color="primary" size="small">{{ itemLabel.labelName }}</ion-button>
+              </ion-col>
+              <ion-col>
+                <ion-item style="float: right;padding:0px;margin: 0px;">
+                  <label-selection :big-type="2" :list-label="baseData.listLabel" :title="'人员标签'"
+                                   @resultBack="onResultBackLabels"></label-selection>
+                </ion-item>
+              </ion-col>
+            </ion-row>
+          </div>
         </div>
       </ion-list>
 
@@ -477,6 +491,7 @@ import dayjs from "dayjs";
 import {useUserStore} from "@/store/modules/user";
 import CategorySelection from "@/components/ocCategorySelection.vue";
 import {getPosition} from "@/utils/position";
+import LabelSelection from "@/components/labelSelection.vue";
 
 interface SelectProps {
   name: string,
@@ -488,7 +503,7 @@ interface StepParams{
 }
 export default defineComponent({
   name: 'jobUserEdit',
-  components:{CategorySelection},
+  components:{CategorySelection, LabelSelection},
   setup() {
     const router = useRouter();
     const route = useRoute();
@@ -567,7 +582,8 @@ export default defineComponent({
         occupationalCategoryName:null,
         occupationalLevel: null,
         longitude: null,
-        latitude: null
+        latitude: null,
+        listLabel: null
       }});
     const pageParams = reactive({
       pageIndex: 1,
@@ -674,6 +690,10 @@ export default defineComponent({
       await alert.present();
     }
 
+    const onResultBackLabels = (data: any) => {
+      baseInfoData.baseData.listLabel = data;
+    }
+
     const onBack = () => {
       curStepData.value.statusVal-=1;
       if(curStepData.value.statusVal > 0){
@@ -938,6 +958,7 @@ export default defineComponent({
       provinceChange,
       regionChange,
       onSetOccupationalID,
+      onResultBackLabels,
       onSave,
       onBack,
       onFinish,

+ 15 - 4
h5app/src/views/pages/work/signin/index.vue

@@ -12,7 +12,17 @@
       <ion-item class="search-item">
         当前时间:{{ dayjs(new Date()).format("YYYY-MM-DD HH:mm") }}
       </ion-item>
-      <div id='signInMap' style=' width: 100%; height: 80%; z-index: 100'></div>
+      <div id='signInMap' style=' width: 100%; height: 65%; z-index: 100'></div>
+      <div class="bw-vue-form">
+        <div class="form-detail">
+          <ion-label>经度</ion-label>
+          <ion-text>{{ position.longitude }}</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>纬度</ion-label>
+          <ion-text>{{ position.latitude }}</ion-text>
+        </div>
+      </div>
       <div class="btn-box">
         <ion-button @click="onSave">确定打卡</ion-button>
       </div>
@@ -21,7 +31,7 @@
   </ion-page>
 </template>
 <script>
-import {defineComponent, ref} from "vue";
+import {defineComponent, reactive, ref} from "vue";
 import {alertController, onIonViewDidEnter} from "@ionic/vue";
 import {useUserStore} from "../../../../store/modules/user";
 import dayjs from 'dayjs';
@@ -54,10 +64,10 @@ export default defineComponent({
     const router = useRouter()
     const userStore = useUserStore();
     const userInfo = ref(userStore.getUserInfo);
-    const position = {
+    const position = reactive({
       longitude: null,
       latitude: null
-    };
+    });
     const T = window.T;
     const zoom = 14;
     let map = null;
@@ -138,6 +148,7 @@ export default defineComponent({
     return {
       onBack,
       onSave,
+      position
     }
   }
 });

+ 13 - 0
src/main/java/com/hz/employmentsite/services/impl/jobUserManager/JobUserServiceImpl.java

@@ -510,6 +510,19 @@ public class JobUserServiceImpl implements JobUserService {
             dbData.setModifyUserID(userId);
             result = pcJobuserMapper.updateByPrimaryKey(dbData);
         }
+
+        PcLabelJobuserExample labelEmp = new PcLabelJobuserExample();
+        labelEmp.or().andJobuserIDEqualTo(data.getJobUserID());
+        pcLabelJobuserMapper.deleteByExample(labelEmp);
+        if(data.listLabel!=null && data.listLabel.size()>0){
+            data.listLabel.forEach(x->{
+                PcLabelJobuser labelModel = new PcLabelJobuser();
+                labelModel.setJobuserID(data.getJobUserID());
+                labelModel.setLabelID(x.getLabelID());
+                pcLabelJobuserMapper.insert(labelModel);
+            });
+        }
+
         return result;
     }
 

+ 5 - 0
vue/src/App.vue

@@ -159,4 +159,9 @@ body {
   }
 }
 
+.flex-space-between {
+  display: flex !important;
+  justify-content: space-between !important;
+}
+
 </style>

+ 2 - 2
vue/src/api/baseSettings/label.ts

@@ -14,7 +14,7 @@ export function getLabelList(params: any) {
   );
 }
 
-export function getUserLabelList(id: any, bigType) {
+export function getUserLabelList(id: any, bigType: any) {
   return request<object>(
     {
       url: "label/getUserLabelList",
@@ -27,7 +27,7 @@ export function getUserLabelList(id: any, bigType) {
   );
 }
 
-export function getCompanyLabelList(id: any, bigType) {
+export function getCompanyLabelList(id: any, bigType: any) {
   return request<object>(
     {
       url: "label/getCompanyLabelList",

+ 99 - 0
vue/src/components/common/ColumnsSetting.vue

@@ -0,0 +1,99 @@
+<template>
+  <div>
+    <a-button html-type="submit" type="text" @click="openModel" class="open-btn">
+      <template #icon>
+        <setting-outlined/>
+      </template>
+      字段设置
+    </a-button>
+    <!-- 字段设置对话框 -->
+    <a-modal v-model:visible="columnsSettingsVisible" title="字段设置" width="600px">
+      <!-- 字段列表 -->
+      <div>
+        <a-checkbox-group v-model:value="checkedColumnsList">
+          <div class="check-div">
+            <a-checkbox v-for="(item, index) in tableColumns" :key="index" :value="item.key"
+                        :disabled="item.isDisabled">
+              {{ item.title }}
+            </a-checkbox>
+          </div>
+        </a-checkbox-group>
+      </div>
+      <!-- 功能按钮 -->
+      <template #footer>
+        <div style="width:100%;display: flex; justify-content: space-between">
+          <div>
+            <a-button key="back" @click="onCheckAll(true)">全选</a-button>
+            <a-button key="back" @click="onCheckAll(false)">全不选</a-button>
+          </div>
+          <div>
+            <a-button key="back" @click="onClose">取消</a-button>
+            <a-button key="submit" type="primary" @click="onSubmit">确定</a-button>
+          </div>
+        </div>
+      </template>
+    </a-modal>
+  </div>
+</template>
+
+<script setup lang="ts">
+import {ref} from "vue";
+
+const props = defineProps(["tableColumns", "checkedTableColumns"]);
+const emits = defineEmits(["onCheck"]);
+
+// 对话框开关
+const columnsSettingsVisible = ref<boolean>(false)
+// 已选择的表格列
+const checkedColumnsList = ref<Array<any>>([]);
+
+// 开启对话框
+function openModel() {
+  columnsSettingsVisible.value = true;
+  checkedColumnsList.value = props.checkedTableColumns.map((item: any) => item.key);
+}
+
+// 全选 or 全不选
+function onCheckAll(isChecked: boolean) {
+  if (isChecked) {
+    checkedColumnsList.value = props.tableColumns.map((item: any) => item.key);
+  } else {
+    checkedColumnsList.value = props.tableColumns.map((item: any) => {
+      if (item.isDisabled) {
+        return item.key;
+      }
+    });
+  }
+}
+
+// 关闭对话框
+function onClose() {
+  columnsSettingsVisible.value = false;
+  checkedColumnsList.value = []
+}
+
+// 确定选择
+function onSubmit() {
+  emits("onCheck", JSON.parse(JSON.stringify(checkedColumnsList.value)));
+  onClose();
+}
+</script>
+
+<style scoped>
+.open-btn {
+  display: flex;
+  align-items: center;
+  color: #6b6b6b;
+}
+
+.check-div {
+  display: grid;
+  grid-template-columns: repeat(4, minmax(0, 1fr));
+  column-gap: 8px;
+  row-gap: 12px;
+
+  .ant-checkbox-wrapper {
+    margin-left: 8px !important;
+  }
+}
+</style>

+ 45 - 14
vue/src/views/baseSettings/institution/index.vue

@@ -32,10 +32,17 @@
       </a-row>
 
       <a-row class="edit-operation">
-        <a-col :span="24" style="text-align: right">
-          <a-button type="primary" html-type="submit" functioncode="T01010102" @click='onAdd' >新增</a-button>
-          <BExportExcel :title="'导出'" :filename="'运营机构信息'" :url="'institution/export'"
-                        :params="{...exportSearchParams, rows:100000,institutionIDList:formState.selectedRowKeys.join(',')}"></BExportExcel>
+        <a-col :span="24" class="flex-space-between">
+          <div>
+            <!-- 表格字段筛选按钮 -->
+            <ColumnsSetting :table-columns="originalColumns" :checked-table-columns="columns"
+                            @on-check="columnsCheckSub"></ColumnsSetting>
+          </div>
+          <div>
+            <a-button type="primary" html-type="submit" functioncode="T01010102" @click='onAdd'>新增</a-button>
+            <BExportExcel :title="'导出'" :filename="'运营机构信息'" :url="'institution/export'"
+                          :params="{...exportSearchParams, rows:100000,institutionIDList:formState.selectedRowKeys.join(',')}"></BExportExcel>
+          </div>
         </a-col>
       </a-row>
     </a-form>
@@ -65,15 +72,16 @@
 import {computed, createVNode, defineComponent, reactive, ref} from 'vue';
 import {useTabsViewStore} from "@/store/modules/tabsView";
 import {DownOutlined, ExclamationCircleOutlined, UpOutlined} from '@ant-design/icons-vue';
-import type {FormInstance, TableColumnsType, TableProps} from 'ant-design-vue';
+import type {FormInstance, TableProps} from 'ant-design-vue';
 import {message, Modal} from "ant-design-vue";
 import {delInstitution, getInstitutionList} from '@/api/baseSettings/institution';
 import BExportExcel from "@/components/basic/excel/exportExcel/exportExcel.vue";
 import {getPaginationTotalTitle} from "@/utils/common";
+import ColumnsSetting from "@/components/common/ColumnsSetting.vue";
 
 export default defineComponent({
   name: 'InstitutionList',
-  components: { DownOutlined, UpOutlined, BExportExcel},
+  components: {ColumnsSetting, DownOutlined, UpOutlined, BExportExcel},
   setup() {
     const formRef = ref<FormInstance>();
     const tabsViewStore = useTabsViewStore();
@@ -95,20 +103,35 @@ export default defineComponent({
       selectedRowKeys: [],
       loading: false
     });
-    const columns: TableColumnsType = [
-      {title: '序号', align: "center",key: 'institutionID',width:50,customRender: item => `${searchParams.pageSize * (searchParams.pageIndex - 1) + item.index + 1}`},
+    // 原始表格定义数据
+    const originalColumns = [
+      {
+        title: '序号',
+        align: "center",
+        key: 'institutionID',
+        width: 50,
+        customRender: item => `${searchParams.pageSize * (searchParams.pageIndex - 1) + item.index + 1}`,
+        isDisabled: true
+      },
       {title: '企业名称', dataIndex: 'companyName', key: 'companyName',width:260, align: "center"},
       {title: '企业地址', dataIndex: 'companyAddress', key: 'companyAddress',width:260, align: "center"},
       {title: '负责人姓名', dataIndex: 'fzrName', key: 'fzrName',width:100, align: "center"},
       {title: '负责人电话', dataIndex: 'fzrMobile', key: 'fzrMobile', width:110,align: "center"},
-      {title: '法人姓名', dataIndex: 'frName', key: 'frName',width:100, align: "center"},
-      {title: '法人电话', dataIndex: 'frMobile', key: 'frMobile',width:110, align: "center"},
-      {title: '企业机构代码', dataIndex: 'companyCode', key: 'companyCode',width:180, align: "center"},
-      {title: '管理驿站数量', dataIndex: 'siteCount', key: 'siteCount', width:100,align: "center",
-        /*customRender:  ({record}) => record.resolveDate == null?"":dayjs(record.resolveDate).format('YYYY-MM-DD')*/
+      {title: '管理驿站数量', dataIndex: 'siteCount', key: 'siteCount', width: 100, align: "center",},
+      {title: '法人姓名', dataIndex: 'frName', key: 'frName', width: 100, align: "center", isDefaultClose: true},
+      {title: '法人电话', dataIndex: 'frMobile', key: 'frMobile', width: 110, align: "center", isDefaultClose: true},
+      {
+        title: '企业机构代码',
+        dataIndex: 'companyCode',
+        key: 'companyCode',
+        width: 180,
+        align: "center",
+        isDefaultClose: true
       },
-      {title: '操作', key: 'operation', fixed: 'right', width: 150, align: "center"},
+      {title: '操作', key: 'operation', fixed: 'right', width: 150, align: "center", isDisabled: true},
     ];
+    // 响应式表格定义
+    const columns = ref<Array<any>>(originalColumns.filter(item => !item.isDefaultClose));
     const pagination = computed(() => ({
       total: formState.total,
       current: searchParams.pageIndex,
@@ -183,11 +206,19 @@ export default defineComponent({
       tabsViewStore.addTabByPath('/baseSettings/institution/detail', {id: id});
     };
 
+    // 字段展示列选择完毕
+    function columnsCheckSub(columnsKeys: Array<string>) {
+      // 从原始表格定义数据中过滤出已选择的字段
+      columns.value = originalColumns.filter((item: any) => columnsKeys.includes(item.key));
+    }
+
     return {
       formRef,
       searchParams,
       formState,
       columns,
+      originalColumns,
+      columnsCheckSub,
       pagination,
       dataList,
       handleTableChange,

+ 45 - 12
vue/src/views/baseSettings/siteInfo/index.vue

@@ -78,10 +78,17 @@
         </a-col>
       </a-row>
       <a-row class="edit-operation">
-        <a-col :span="24" style="text-align: right">
-          <a-button type="primary" html-type="submit"  functioncode="T01010202" @click='onAdd' >新增</a-button>
-          <BExportExcel :title="'导出'" :filename="'驿站站点信息'" :url="'siteInfo/export'"
-                        :params="{...exportSearchParams, rows:100000,siteIDList:formState.selectedRowKeys.join(',')}"></BExportExcel>
+        <a-col :span="24" class="flex-space-between">
+          <div>
+            <!-- 表格字段筛选按钮 -->
+            <ColumnsSetting :table-columns="originalColumns" :checked-table-columns="columns"
+                            @on-check="columnsCheckSub"></ColumnsSetting>
+          </div>
+          <div>
+            <a-button type="primary" html-type="submit" functioncode="T01010202" @click='onAdd'>新增</a-button>
+            <BExportExcel :title="'导出'" :filename="'驿站站点信息'" :url="'siteInfo/export'"
+                          :params="{...exportSearchParams, rows:100000,siteIDList:formState.selectedRowKeys.join(',')}"></BExportExcel>
+          </div>
         </a-col>
       </a-row>
     </a-form>
@@ -111,17 +118,18 @@
 import {computed, createVNode, defineComponent, reactive, ref} from 'vue';
 import {useTabsViewStore} from "@/store/modules/tabsView";
 import {DownOutlined, ExclamationCircleOutlined, UpOutlined} from '@ant-design/icons-vue';
-import type {FormInstance, TableColumnsType, TableProps} from 'ant-design-vue';
+import type {FormInstance, TableProps} from 'ant-design-vue';
 import {message, Modal, SelectProps} from "ant-design-vue";
 import {delSite, getSiteList} from '@/api/baseSettings/siteInfo';
 import {getRegionCodeList, getStreetCodeList} from "@/api/system/area/index";
 import BExportExcel from "@/components/basic/excel/exportExcel/exportExcel.vue";
 import {getPaginationTotalTitle} from "@/utils/common";
 import {getInstitutionDataList} from "@/api/baseSettings/institution";
+import ColumnsSetting from "@/components/common/ColumnsSetting.vue";
 
 export default defineComponent({
   name: 'SiteList',
-  components: {DownOutlined, UpOutlined, BExportExcel},
+  components: {ColumnsSetting, DownOutlined, UpOutlined, BExportExcel},
   setup() {
     const formRef = ref<FormInstance>();
     const tabsViewStore = useTabsViewStore();
@@ -146,19 +154,36 @@ export default defineComponent({
       selectedRowKeys: [],
       loading: false
     });
-    const columns: TableColumnsType = [
-      {title: '序号', align: "center",key: 'siteID',customRender: item => `${searchParams.pageSize * (searchParams.pageIndex - 1) + item.index + 1}`},
+    // 原始表格定义数据
+    const originalColumns = [
+      {
+        title: '序号',
+        align: "center",
+        key: 'siteID',
+        customRender: item => `${searchParams.pageSize * (searchParams.pageIndex - 1) + item.index + 1}`,
+        isDisabled: true
+      },
       {title: '驿站编号', dataIndex: 'siteCode', key: 'siteCode', align: "center"},
       {title: '站点名称', dataIndex: 'siteName', key: 'siteName',width:120, align: "center"},
       {title: '站点负责人', dataIndex: 'fzrName', key: 'fzrName', align: "center"},
       {title: '联系电话', dataIndex: 'fzrMobile', key: 'fzrMobile', align: "center"},
       {title: '所属县区', dataIndex: 'regionName', key: 'regionName', align: "center"},
-      {title: '所属街道', dataIndex: 'streetName', key: 'streetName', align: "center"},
-      {title: '详细地址', dataIndex: 'detailAddress', key: 'detailAddress', align: "center"},
       {title: '所属机构', dataIndex: 'institutionName', key: 'institutionName', align: "center"},
-      {title: '驿站人员',  dataIndex: 'siteUsers',key: 'siteUsers', fixed: 'right',width:170, align: "center"},
-      {title: '操作', key: 'operation', fixed: 'right', width: 150, align: "center"},
+      {title: '所属街道', dataIndex: 'streetName', key: 'streetName', align: "center", isDefaultClose: true},
+      {title: '详细地址', dataIndex: 'detailAddress', key: 'detailAddress', align: "center", isDefaultClose: true},
+      {
+        title: '驿站人员',
+        dataIndex: 'siteUsers',
+        key: 'siteUsers',
+        fixed: 'right',
+        width: 170,
+        align: "center",
+        isDefaultClose: true
+      },
+      {title: '操作', key: 'operation', fixed: 'right', width: 150, align: "center", isDisabled: true},
     ];
+    // 响应式表格定义
+    const columns = ref<Array<any>>(originalColumns.filter(item => !item.isDefaultClose));
     const pagination = computed(() => ({
       total: formState.total,
       current: searchParams.pageIndex,
@@ -258,12 +283,20 @@ export default defineComponent({
       formState.loading = false;
     }
 
+    // 字段展示列选择完毕
+    function columnsCheckSub(columnsKeys: Array<string>) {
+      // 从原始表格定义数据中过滤出已选择的字段
+      columns.value = originalColumns.filter((item: any) => columnsKeys.includes(item.key));
+    }
+
     return {
       formRef,
       expand,
       searchParams,
       formState,
       columns,
+      originalColumns,
+      columnsCheckSub,
       pagination,
       allInstitutions,
       streetList,

+ 77 - 18
vue/src/views/baseSettings/siteUser/index.vue

@@ -39,14 +39,21 @@
       </a-row>
 
       <a-row class="edit-operation">
-        <a-col :span="24" style="text-align: right">
-          <a-button type="primary" html-type="submit" functioncode="T01010302" @click='onAdd' >新增</a-button>
-          <BImportExcel functioncode="T01010306"
-                        :options="importOptions"
-                        @success="loadData"
-          ></BImportExcel>
-          <BExportExcel :title="'导出'" :filename="'驿站人员信息'" :url="'userInfo/export'"
-                        :params="{...exportSearchParams, rows:100000,siteUserIDList:formState.selectedRowKeys.join(',')}"></BExportExcel>
+        <a-col :span="24" class="flex-space-between">
+          <div>
+            <!-- 表格字段筛选按钮 -->
+            <ColumnsSetting :table-columns="originalColumns" :checked-table-columns="columns"
+                            @on-check="columnsCheckSub"></ColumnsSetting>
+          </div>
+          <div>
+            <a-button type="primary" html-type="submit" functioncode="T01010302" @click='onAdd'>新增</a-button>
+            <BImportExcel functioncode="T01010306"
+                          :options="importOptions"
+                          @success="loadData"
+            ></BImportExcel>
+            <BExportExcel :title="'导出'" :filename="'驿站人员信息'" :url="'userInfo/export'"
+                          :params="{...exportSearchParams, rows:100000,siteUserIDList:formState.selectedRowKeys.join(',')}"></BExportExcel>
+          </div>
         </a-col>
       </a-row>
     </a-form>
@@ -77,7 +84,7 @@
 import {computed, createVNode, defineComponent, reactive, ref} from 'vue';
 import {useTabsViewStore} from "@/store/modules/tabsView";
 import {DownOutlined, ExclamationCircleOutlined, UpOutlined} from '@ant-design/icons-vue';
-import type {FormInstance, TableColumnsType, TableProps} from 'ant-design-vue';
+import type {FormInstance, TableProps} from 'ant-design-vue';
 import {message, Modal} from "ant-design-vue";
 import {delSiteUser, getSiteUserList} from '@/api/baseSettings/userInfo';
 import BExportExcel from "@/components/basic/excel/exportExcel/exportExcel.vue";
@@ -86,10 +93,11 @@ import {getSiteList} from "@/api/baseSettings/siteInfo";
 import BImportExcel from "@/components/basic/excel/importExcel/importExcel.vue";
 import type {ImportProps} from "@/components/basic/excel/importExcel/ImportProps";
 import {updateUserStatus} from "@/api/system/user";
+import ColumnsSetting from "@/components/common/ColumnsSetting.vue";
 
 export default defineComponent({
   name: 'UserInfoList',
-  components: {BImportExcel, DownOutlined, UpOutlined, BExportExcel},
+  components: {ColumnsSetting, BImportExcel, DownOutlined, UpOutlined, BExportExcel},
   setup() {
     const formRef = ref<FormInstance>();
     const tabsViewStore = useTabsViewStore();
@@ -112,20 +120,36 @@ export default defineComponent({
       selectedRowKeys: [],
       loading: false
     });
-    const columns: TableColumnsType = [
-      {title: '序号', align: "center",key: 'siteUserID',customRender: item => `${searchParams.pageSize * (searchParams.pageIndex - 1) + item.index + 1}`},
+    // 原始表格定义数据
+    const originalColumns = [
+      {
+        title: '序号',
+        align: "center",
+        key: 'siteUserID',
+        customRender: item => `${searchParams.pageSize * (searchParams.pageIndex - 1) + item.index + 1}`,
+        isDisabled: true
+      },
       {title: '工号', dataIndex: 'userNo', key: 'userNo', align: "center"},
       {title: '人员名称', dataIndex: 'siteUserName', key: 'siteUserName', align: "center"},
-      {title: '用户类型', dataIndex: 'roleName', key: 'roleName',width:120, align: "center"},
       {title: '性别', dataIndex: 'genderName', key: 'genderName', align: "center"},
       {title: '联系电话', dataIndex: 'mobile', key: 'mobile', align: "center"},
-      {title: '年龄', dataIndex: 'age', key: 'age', align: "center"},
-      {title: '状态', dataIndex: 'recordStatus', key: 'recordStatus', align: "center",
-        customRender:  ({record}) => record.recordStatus == 1?"正常":"禁用"
+      {
+        title: '年龄', dataIndex: 'age', key: 'age', align: "center",
+        customRender: item => {
+          return calculateAge(item.record.idCard);
+        }
       },
       {title: '所属驿站', dataIndex: 'siteName', key: 'siteName', align: "center"},
-      {title: '操作', key: 'operation', fixed: 'right',width:200, align: "center"},
+      {title: '用户类型', dataIndex: 'roleName', key: 'roleName', width: 120, align: "center", isDefaultClose: true},
+      {
+        title: '状态', dataIndex: 'recordStatus', key: 'recordStatus', align: "center",
+        customRender: ({record}) => record.recordStatus == 1 ? "正常" : "禁用",
+        isDefaultClose: true
+      },
+      {title: '操作', key: 'operation', fixed: 'right', width: 200, align: "center", isDisabled: true},
     ];
+    // 响应式表格定义
+    const columns = ref<Array<any>>(originalColumns.filter(item => !item.isDefaultClose));
     const importOptions = ref<ImportProps>({
       title: '导入',
       url: 'userInfo/importSiteUser',
@@ -163,6 +187,33 @@ export default defineComponent({
       showSizeChanger: true,
       showTotal: total => getPaginationTotalTitle(total)
     }));
+    const calculateAge = (idCardNumber) => {
+      if (!idCardNumber) {
+        return "";
+      }
+      try {
+        // 假设身份证号中出生日期的格式为YYYYMMDD
+        const birthYear = parseInt(idCardNumber.substring(6, 10), 10);
+        const birthMonth = parseInt(idCardNumber.substring(10, 12), 10);
+        const birthDay = parseInt(idCardNumber.substring(12, 14), 10);
+        // 获取当前日期
+        const currentDate = new Date();
+        const currentYear = currentDate.getFullYear();
+        const currentMonth = currentDate.getMonth() + 1; // 月份从 0 开始
+        const currentDay = currentDate.getDate();
+        // 计算年龄
+        let age = currentYear - birthYear;
+        if (currentMonth < birthMonth || (currentMonth === birthMonth && currentDay < birthDay)) {
+          age--; // 生日还未过,减去一岁
+        }
+        if (Number.isNaN(age) || !Number.isInteger(age)) {
+          return "";
+        }
+        return age;
+      } catch (e) {
+        return "";
+      }
+    }
 
     const getAllSites = () => {
       getSiteList(searchParams).then((result :any) => {
@@ -241,11 +292,18 @@ export default defineComponent({
       tabsViewStore.addTabByPath('/baseSettings/user/detail', {id: id, op: 2});
     };
 
+    // 字段展示列选择完毕
+    function columnsCheckSub(columnsKeys: Array<string>) {
+      // 从原始表格定义数据中过滤出已选择的字段
+      columns.value = originalColumns.filter((item: any) => columnsKeys.includes(item.key));
+    }
+
     return {
       formRef,
       allSites,
       searchParams,
       formState,
+      originalColumns,
       columns,
       pagination,
       dataList,
@@ -259,7 +317,8 @@ export default defineComponent({
       loadData,
       onDetail,
       importOptions,
-      exportSearchParams
+      exportSearchParams,
+      columnsCheckSub
     };
   },
   created() {

+ 87 - 22
vue/src/views/companyService/company/index.vue

@@ -96,15 +96,22 @@
         </a-col>
       </a-row>
       <a-row class="edit-operation">
-        <a-col :span="24" style="text-align: right">
-          <a-button type="primary" html-type="submit" @click='onAdd' functioncode="T01020102">新增</a-button>
-          <BImportExcel functioncode="T01020105"
-            :options="importOptions"
-            @success="loadData"
-          ></BImportExcel>
-          <BExportExcel :title="'导出'" :filename="'企业信息'"
-                        :url="'companyService/company/export'"
-                        :params="{...exportSearchParams, isExport: true, rows:10000,companyIDList:formState.selectedRowKeys.join(',')}"></BExportExcel>
+        <a-col :span="24" class="flex-space-between">
+          <div>
+            <!-- 表格字段筛选按钮 -->
+            <ColumnsSetting :table-columns="originalColumns" :checked-table-columns="columns"
+                            @on-check="columnsCheckSub"></ColumnsSetting>
+          </div>
+          <div>
+            <a-button type="primary" html-type="submit" @click='onAdd' functioncode="T01020102">新增</a-button>
+            <BImportExcel functioncode="T01020105"
+                          :options="importOptions"
+                          @success="loadData"
+            ></BImportExcel>
+            <BExportExcel :title="'导出'" :filename="'企业信息'"
+                          :url="'companyService/company/export'"
+                          :params="{...exportSearchParams, isExport: true, rows:10000,companyIDList:formState.selectedRowKeys.join(',')}"></BExportExcel>
+          </div>
         </a-col>
       </a-row>
     </a-form>
@@ -139,7 +146,7 @@
 <script lang="ts">
 import {computed, createVNode, defineComponent, reactive, ref} from 'vue';
 import {DownOutlined, ExclamationCircleOutlined, UpOutlined} from '@ant-design/icons-vue';
-import type {FormInstance, TableColumnsType, TableProps} from 'ant-design-vue';
+import type {FormInstance, TableProps} from 'ant-design-vue';
 import {Modal, SelectProps} from "ant-design-vue";
 import {del, getList} from '@/api/companyService/company';
 import BExportExcel from "@/components/basic/excel/exportExcel/exportExcel.vue";
@@ -151,10 +158,11 @@ import {get} from "@/api/common";
 import type {ImportProps} from '@/components/basic/excel/importExcel/ImportProps';
 import PositionShowModal from './show.vue';
 import {getSiteList} from "@/api/baseSettings/siteInfo";
+import ColumnsSetting from "@/components/common/ColumnsSetting.vue";
 
 export default defineComponent({
   name: 'CompanyList',
-  components: {DownOutlined, UpOutlined, BExportExcel, BImportExcel, PositionShowModal},
+  components: {ColumnsSetting, DownOutlined, UpOutlined, BExportExcel, BImportExcel, PositionShowModal},
   setup() {
     const formRef = ref<FormInstance>();
     const modalShowRef = ref();
@@ -219,35 +227,84 @@ export default defineComponent({
         params: null,
       },
     });
-    const columns: TableColumnsType = [
+    // 原始表格定义数据
+    const originalColumns = [
       {
         title: '序号',
         align: "center",
         key: 'companyID',
         width:60,
-        customRender: item => `${searchParams.pageSize * (searchParams.pageIndex - 1) + item.index + 1}`
+        customRender: item => `${searchParams.pageSize * (searchParams.pageIndex - 1) + item.index + 1}`,
+        isDisabled: true
       },
       {title: '企业名称', dataIndex: 'companyName', key: 'companyName',width: 200, align: "center"},
       {title: '所属县区', dataIndex: 'regionName', key: 'regionName', width: 120, align: "center"},
-      {title: '所属街道', dataIndex: 'streetName', key: 'streetName', width: 120,align: "center"},
       {title: '所属驿站', dataIndex: 'siteName', key: 'siteName', width: 200, align: "center"},
-      {title: '统一信用代码', dataIndex: 'companyCode', key: 'companyCode', width: 200,align: "center"},
       {
-        title: '企业状态', dataIndex: 'recordStatus', key: 'recordStatus',width: 120, align: "center", customRender: (item) => {
+        title: '企业状态',
+        dataIndex: 'recordStatus',
+        key: 'recordStatus',
+        width: 120,
+        align: "center",
+        customRender: (item) => {
           return item.record.recordStatus == 1 ? "在营" : "关闭";
         }
       },
-      {title: '参保人数', dataIndex: 'insuredCount', key: 'insuredCount', width: 100,align: "center"},
-      {title: '企业规模', dataIndex: 'companyModelType', key: 'companyModelType',width: 120, align: "center"},
-      {title: '当前岗位数量', dataIndex: 'postCount', key: 'postCount', width: 120,align: "center"},
-      {title: '录入人', dataIndex: 'createUserName', key: 'createUserName', width: 120,align: "center"},
+      {
+        title: '企业规模',
+        dataIndex: 'companyModelType',
+        key: 'companyModelType',
+        width: 120,
+        align: "center",
+      },
+      {
+        title: '当前岗位数量',
+        dataIndex: 'postCount',
+        key: 'postCount',
+        width: 120,
+        align: "center",
+      },
+      {
+        title: '所属街道',
+        dataIndex: 'streetName',
+        key: 'streetName',
+        width: 120,
+        align: "center",
+        isDefaultClose: true
+      },
+      {
+        title: '统一信用代码',
+        dataIndex: 'companyCode',
+        key: 'companyCode',
+        width: 200,
+        align: "center",
+        isDefaultClose: true
+      },
+      {
+        title: '参保人数',
+        dataIndex: 'insuredCount',
+        key: 'insuredCount',
+        width: 100,
+        align: "center",
+        isDefaultClose: true
+      },
+      {
+        title: '录入人',
+        dataIndex: 'createUserName',
+        key: 'createUserName',
+        width: 120,
+        align: "center",
+        isDefaultClose: true
+      },
       {
         title: '录入时间   ', dataIndex: 'createTime', key: 'createTime',width: 120, align: "center", customRender: (item) => {
           return item.record.createTime == null ? "" : (dayjs(item.record.createTime).format('YYYY-MM-DD'))
-        }
+        }, isDefaultClose: true
       },
-      {title: '操作', key: 'operation', fixed: 'right', width: 150, align: "center"},
+      {title: '操作', key: 'operation', fixed: 'right', width: 150, align: "center", isDisabled: true},
     ];
+    // 响应式表格定义
+    const columns = ref<Array<any>>(originalColumns.filter(item => !item.isDefaultClose));
     const siteList = ref<Array<any>>([])
     const pagination = computed(() => ({
       total: formState.total,
@@ -362,12 +419,20 @@ export default defineComponent({
       loadData();
     }
 
+    // 字段展示列选择完毕
+    function columnsCheckSub(columnsKeys: Array<string>) {
+      // 从原始表格定义数据中过滤出已选择的字段
+      columns.value = originalColumns.filter((item: any) => columnsKeys.includes(item.key));
+    }
+
     return {
       formRef,
       modalShowRef,
       searchParams,
       formState,
       columns,
+      originalColumns,
+      columnsCheckSub,
       pagination,
       dataList,
       expand,

+ 80 - 27
vue/src/views/companyService/post/index.vue

@@ -86,16 +86,23 @@
         </a-col>
       </a-row>
       <a-row class="edit-operation">
-        <a-col :span="24" style="text-align: right">
-          <a-button type="primary" html-type="submit" functioncode="T01020202" @click='onAdd'>新增</a-button>
-          <BImportExcel
-            functioncode="T01020205"
-            :options="importOptions"
-            @success="loadData"
-          ></BImportExcel>
-          <BExportExcel :title="'导出'" :filename="'岗位信息'"
-                        :url="'companyService/post/export'"
-                        :params="{...exportSearchParams, isExport: true, rows:10000,postIDList:formState.selectedRowKeys.join(',')}"></BExportExcel>
+        <a-col :span="24" class="flex-space-between">
+          <div>
+            <!-- 表格字段筛选按钮 -->
+            <ColumnsSetting :table-columns="originalColumns" :checked-table-columns="columns"
+                            @on-check="columnsCheckSub"></ColumnsSetting>
+          </div>
+          <div>
+            <a-button type="primary" html-type="submit" functioncode="T01020202" @click='onAdd'>新增</a-button>
+            <BImportExcel
+              functioncode="T01020205"
+              :options="importOptions"
+              @success="loadData"
+            ></BImportExcel>
+            <BExportExcel :title="'导出'" :filename="'岗位信息'"
+                          :url="'companyService/post/export'"
+                          :params="{...exportSearchParams, isExport: true, rows:10000,postIDList:formState.selectedRowKeys.join(',')}"></BExportExcel>
+          </div>
         </a-col>
       </a-row>
     </a-form>
@@ -130,7 +137,7 @@
 <script lang="ts">
 import {computed, createVNode, defineComponent, reactive, ref} from 'vue';
 import {DownOutlined, ExclamationCircleOutlined, UpOutlined} from '@ant-design/icons-vue';
-import type {FormInstance, TableColumnsType, TableProps} from 'ant-design-vue';
+import type {FormInstance, TableProps} from 'ant-design-vue';
 import {Modal, SelectProps} from 'ant-design-vue';
 import {del, getList} from '@/api/companyService/post';
 import BExportExcel from "@/components/basic/excel/exportExcel/exportExcel.vue";
@@ -143,10 +150,11 @@ import type {ImportProps} from "@/components/basic/excel/importExcel/ImportProps
 import {get} from "@/api/common";
 import Recommend from "@/views/companyService/post/recommend.vue";
 import {getSiteList} from "@/api/baseSettings/siteInfo";
+import ColumnsSetting from "@/components/common/ColumnsSetting.vue";
 
 export default defineComponent({
   name: "PostList",
-  components: {DownOutlined, UpOutlined, BExportExcel, BImportExcel, Recommend},
+  components: {ColumnsSetting, DownOutlined, UpOutlined, BExportExcel, BImportExcel, Recommend},
   setup: function () {
     const formRef = ref<FormInstance>();
     const searchParams = reactive({
@@ -203,13 +211,15 @@ export default defineComponent({
       selectedRowKeys: [],
       loading: false
     });
-    const columns: TableColumnsType = [
+    // 原始表格定义数据
+    const originalColumns = [
       {
         title: '序号',
         align: "center",
         key: 'postID',
-        width: 90,
-        customRender: item => `${searchParams.pageSize * (searchParams.pageIndex - 1) + item.index + 1}`
+        width: 50,
+        customRender: item => `${searchParams.pageSize * (searchParams.pageIndex - 1) + item.index + 1}`,
+        isDisabled: true
       },
       {title: '岗位名称', dataIndex: 'professionName', key: 'professionName', align: "center"},
       {title: '招聘人数', dataIndex: 'recruitCount', key: 'recruitCount', width: 120, align: "center"},
@@ -225,23 +235,58 @@ export default defineComponent({
       {title: '招聘企业', dataIndex: 'companyName', key: 'companyName', width: 200, align: "center"},
       {title: '所属驿站', dataIndex: 'siteName', key: 'siteName', width: 200, align: "center"},
       {
-        title: '岗位状态', dataIndex: 'recordStatus', key: 'recordStatus', align: "center", customRender: (item) => {
+        title: '岗位状态', dataIndex: 'recordStatus', key: 'recordStatus', align: "center",
+        customRender: (item) => {
           return item.record.recordStatus == 1 ? "启用" : "停用";
         }
       },
-      // {title: '工种名称', dataIndex: 'workName', key: 'workName', align: "center"},
-      {title: '学历要求', dataIndex: 'cultureLevelName', key: 'cultureLevelName', width: 150, align: "center"},
       {
-        title: '薪酬', dataIndex: 'postSalary', key: 'postSalary', align: "center", customRender: (item) => {
-          const salary = showSalary(item.record.minSalary,item.record.maxSalary);/*`${item.record.minSalary ?? ""}-${item.record.maxSalary ?? ""}`*/
-          return salary;
-        }
+        title: '学历要求',
+        dataIndex: 'cultureLevelName',
+        key: 'cultureLevelName',
+        width: 150,
+        align: "center",
+        isDefaultClose: true
+      },
+      {
+        title: '薪酬',
+        dataIndex: 'postSalary',
+        key: 'postSalary',
+        width: 150,
+        align: "center",
+        customRender: (item) => {
+          return showSalary(item.record.minSalary, item.record.maxSalary);
+        },
+        isDefaultClose: true
+      },
+      {
+        title: '联系人',
+        dataIndex: 'contactName',
+        key: 'contactName',
+        width: 150,
+        align: "center",
+        isDefaultClose: true
       },
-      {title: '联系人', dataIndex: 'contactName', key: 'contactName', align: "center"},
-      {title: '联系电话', dataIndex: 'contactMobile', key: 'contactMobile', width: 200, align: "center"},
-      {title: '推荐数量', dataIndex: 'recommendNum',key: 'recommendNum',width: 100, align: "center"},
-      {title: '操作', key: 'operation', fixed: 'right', width: 240, align: "center"},
+      {
+        title: '联系电话',
+        dataIndex: 'contactMobile',
+        key: 'contactMobile',
+        width: 200,
+        align: "center",
+        isDefaultClose: true
+      },
+      {
+        title: '推荐数量',
+        dataIndex: 'recommendNum',
+        key: 'recommendNum',
+        width: 100,
+        align: "center",
+        isDefaultClose: true
+      },
+      {title: '操作', key: 'operation', fixed: 'right', width: 240, align: "center", isDisabled: true},
     ];
+    // 响应式表格定义
+    const columns = ref<Array<any>>(originalColumns.filter(item => !item.isDefaultClose));
     const pagination = computed(() => ({
       total: formState.total,
       current: searchParams.pageIndex,
@@ -355,10 +400,17 @@ export default defineComponent({
       loadData();
     }
 
+    // 字段展示列选择完毕
+    function columnsCheckSub(columnsKeys: Array<string>) {
+      // 从原始表格定义数据中过滤出已选择的字段
+      columns.value = originalColumns.filter((item: any) => columnsKeys.includes(item.key));
+    }
+
     return {
       formRef,
       searchParams,
       formState,
+      originalColumns,
       columns,
       pagination,
       dataList,
@@ -383,7 +435,8 @@ export default defineComponent({
       siteList,
       getAllSites,
       createDate,
-      onCreateTimeChange
+      onCreateTimeChange,
+      columnsCheckSub
     };
   },
   created() {

+ 39 - 19
vue/src/views/jobUserManager/jobhunt/index.vue

@@ -137,14 +137,21 @@
         </a-col>
       </a-row>
       <a-row class="edit-operation">
-        <a-col :span="24" style="text-align: right">
-          <a-button type="primary" html-type="submit" functioncode="T01030202" @click='onAdd'>新增</a-button>
-          <BImportExcel functioncode="T01030205"
-                        :options="importOptions"
-                        @success="loadData"
-          ></BImportExcel>
-          <BExportExcel :title="'导出'" :filename="'求职意向信息'" :url="'/jobUserService/jobHunt/export'"
-                        :params="{...exportSearchParams, rows:100000,jobHuntIDList:formState.selectedRowKeys.join(',')}"></BExportExcel>
+        <a-col :span="24" class="flex-space-between">
+          <div>
+            <!-- 表格字段筛选按钮 -->
+            <ColumnsSetting :table-columns="originalColumns" :checked-table-columns="columns"
+                            @on-check="columnsCheckSub"></ColumnsSetting>
+          </div>
+          <div>
+            <a-button type="primary" html-type="submit" functioncode="T01030202" @click='onAdd'>新增</a-button>
+            <BImportExcel functioncode="T01030205"
+                          :options="importOptions"
+                          @success="loadData"
+            ></BImportExcel>
+            <BExportExcel :title="'导出'" :filename="'求职意向信息'" :url="'/jobUserService/jobHunt/export'"
+                          :params="{...exportSearchParams, rows:100000,jobHuntIDList:formState.selectedRowKeys.join(',')}"></BExportExcel>
+          </div>
         </a-col>
       </a-row>
     </a-form>
@@ -179,7 +186,7 @@
 
 <script lang="ts">
 import {computed, createVNode, defineComponent, reactive, ref} from 'vue';
-import type {FormInstance, SelectProps, TableColumnsType, TableProps} from 'ant-design-vue';
+import type {FormInstance, SelectProps, TableProps} from 'ant-design-vue';
 import {message, Modal} from "ant-design-vue";
 import {delJobHunt, getJobHuntList} from '@/api/jobUserManager/jobhunt';
 import {getSysDictionaryList} from '@/api/system/dictionary';
@@ -193,10 +200,11 @@ import {useTabsViewStore} from "@/store/modules/tabsView";
 import Recommend from "@/views/jobUserManager/jobhunt/recommend.vue";
 import {getSiteList} from "@/api/baseSettings/siteInfo";
 import {get} from "@/api/common";
+import ColumnsSetting from "@/components/common/ColumnsSetting.vue";
 
 export default defineComponent({
   name: 'JobHuntList',
-  components: {BImportExcel, BExportExcel, Recommend},
+  components: {ColumnsSetting, BImportExcel, BExportExcel, Recommend},
   setup() {
     const formRef = ref<FormInstance>();
     const tabsViewStore = useTabsViewStore();
@@ -230,7 +238,8 @@ export default defineComponent({
       selectedRowKeys: [],
       loading: false,
     });
-    const columns: TableColumnsType = [
+    // 原始表格定义数据
+    const originalColumns = [
       {
         title: '序号',
         align: 'center',
@@ -238,28 +247,31 @@ export default defineComponent({
         key: 'jobHuntID',
         customRender: (item) =>
           `${searchParamsState.pageSize * (searchParamsState.pageIndex - 1) + item.index + 1}`,
+        isDisabled: true
       },
       {title: '姓名', dataIndex: 'jobUserName', key: 'jobUserName', width: 100, align: "center",},
-      // { title: '工种名称', dataIndex: 'workName', key: 'workName', width: 150, align: "center", },
       {title: '希望工作地区', dataIndex: 'areaWork', key: 'areaWork', width: 150, align: "center",},
+      {title: '工作年限', dataIndex: 'workYear', key: 'workYear', align: "center",},
+      {title: '求职类型', dataIndex: 'jobHuntTypeStr', key: 'jobHuntTypeStr', align: "center",},
+      {title: '求职岗位', dataIndex: 'professionName', key: 'professionName', align: "center",},
+      {title: '推荐数量', key: 'recommendNum', align: "center"},
       {
         title: '可到职日期', dataIndex: 'inDate', key: 'inDate', width: 100, align: "center",
         customRender: ({record}) => record.inDate == null ? "" : dayjs(record.inDate).format('YYYY-MM-DD'),
+        isDefaultClose: true
       },
-      {title: '工作年限', dataIndex: 'workYear', key: 'workYear', align: "center",},
-      {title: '求职类型', dataIndex: 'jobHuntTypeStr', key: 'jobHuntTypeStr', align: "center",},
-      {title: '求职岗位', dataIndex: 'professionName', key: 'professionName', align: "center",},
-      {title: '人才类型', dataIndex: 'jobUserTypeStr', key: 'jobUserTypeStr', align: "center",},
+      {title: '人才类型', dataIndex: 'jobUserTypeStr', key: 'jobUserTypeStr', align: "center", isDefaultClose: true},
       {
         title: '月薪要求', dataIndex: 'salary', key: 'salary', align: "center",
         customRender: (item) => {
           const salary = showSalary(item.record.minSalary, item.record.maxSalary);
           return salary;
-        }
+        }, isDefaultClose: true
       },
-      {title: '推荐数量', key: 'recommendNum', align: "center"},
-      {title: '操作', key: 'operation', fixed: 'right', width: 220, align: "center"},
+      {title: '操作', key: 'operation', fixed: 'right', width: 220, align: "center", isDisabled: true},
     ];
+    // 响应式表格定义
+    const columns = ref<Array<any>>(originalColumns.filter(item => !item.isDefaultClose));
     const pagination = computed(() => ({
       total: formState.total,
       current: searchParamsState.pageIndex,
@@ -429,12 +441,20 @@ export default defineComponent({
       loadData();
     }
 
+    // 字段展示列选择完毕
+    function columnsCheckSub(columnsKeys: Array<string>) {
+      // 从原始表格定义数据中过滤出已选择的字段
+      columns.value = originalColumns.filter((item: any) => columnsKeys.includes(item.key));
+    }
+
     return {
       formRef,
       expand,
       searchParamsState,
       formState,
       columns,
+      originalColumns,
+      columnsCheckSub,
       pagination,
       dataList,
       importOptions,

+ 36 - 16
vue/src/views/jobUserManager/jobuser/index.vue

@@ -122,11 +122,18 @@
         </a-col>
       </a-row>
       <a-row class="edit-operation">
-        <a-col :span="24" style="text-align: right">
-          <a-button type="primary" html-type="submit" @click='onAdd' functioncode="T01030102">新增</a-button>
-          <BExportExcel :title="'导出'" :filename="'求职人员信息'"
-                        :url="'jobUserService/jobUser/export'"
-                        :params="{...exportSearchParams, isExport: true, rows:10000,jobUserIDList:formState.selectedRowKeys.join(',')}"></BExportExcel>
+        <a-col :span="24" class="flex-space-between">
+          <div>
+            <!-- 表格字段筛选按钮 -->
+            <ColumnsSetting :table-columns="originalColumns" :checked-table-columns="columns"
+                            @on-check="columnsCheckSub"></ColumnsSetting>
+          </div>
+          <div>
+            <a-button type="primary" html-type="submit" @click='onAdd' functioncode="T01030102">新增</a-button>
+            <BExportExcel :title="'导出'" :filename="'求职人员信息'"
+                          :url="'jobUserService/jobUser/export'"
+                          :params="{...exportSearchParams, isExport: true, rows:10000,jobUserIDList:formState.selectedRowKeys.join(',')}"></BExportExcel>
+          </div>
         </a-col>
       </a-row>
     </a-form>
@@ -157,7 +164,7 @@
 
 <script lang="ts">
 import {computed, createVNode, defineComponent, reactive, ref} from 'vue';
-import type {FormInstance, SelectProps, TableColumnsType, TableProps} from 'ant-design-vue';
+import type {FormInstance, SelectProps, TableProps} from 'ant-design-vue';
 import {message, Modal} from "ant-design-vue";
 import {del, getList} from '@/api/jobUserManager/jobuser';
 import {getSysDictionaryList} from '@/api/system/dictionary';
@@ -168,10 +175,11 @@ import BExportExcel from "@/components/basic/excel/exportExcel/exportExcel.vue";
 import BImportExcel from "@/components/basic/excel/importExcel/importExcel.vue";
 import {getSiteList} from "@/api/baseSettings/siteInfo";
 import {get} from "@/api/common";
+import ColumnsSetting from "@/components/common/ColumnsSetting.vue";
 
 export default defineComponent({
   name: 'JobUserList',
-  components: {DownOutlined, UpOutlined, BExportExcel, BImportExcel},
+  components: {ColumnsSetting, DownOutlined, UpOutlined, BExportExcel, BImportExcel},
   setup() {
     const modalRoleUserRef = ref();
     const expand = ref(false);
@@ -202,7 +210,8 @@ export default defineComponent({
       selectedRowKeys: [],
       loading: false,
     });
-    const columns: TableColumnsType = [
+    // 原始表格定义数据
+    const originalColumns = [
       {
         title: '序号',
         align: 'center',
@@ -210,19 +219,22 @@ export default defineComponent({
         key: 'jobUserID',
         customRender: (item) =>
           `${searchParamsState.pageSize * (searchParamsState.pageIndex - 1) + item.index + 1}`,
+        isDisabled: true
       },
       {title: '姓名', dataIndex: 'name', key: 'name', width: 100,align: "center"},
       {title: '性别', dataIndex: 'genderName', key: 'genderName', width: 80,align: "center"},
-      {title: '民族', dataIndex: 'nationName', key: 'nationName', width: 80, align: "center"},
-      {title: '联系电话', dataIndex: 'userMobile', key: 'userMobile',align: "center"},
-      {title: '所属驿站', dataIndex: 'siteName', key: 'siteName',align: "center"},
+      {title: '联系电话', dataIndex: 'userMobile', key: 'userMobile', align: "center"},
+      {title: '所属驿站', dataIndex: 'siteName', key: 'siteName', align: "center"},
       {title: '年龄', dataIndex: 'age', key: 'age', align: "center"},
-      {title: '最高学历', dataIndex: 'cultureName', key: 'cultureName', align: "center"},
-      {title: '地址', dataIndex: 'address', key: 'address',align: "center"},
-      {title: '就业状态', dataIndex: 'jobStatusName', key: 'jobStatusName',align: "center"},
-      {title: '重点人员类别', dataIndex: 'keyTypeName', key: 'keyTypeName',align: "center"},
-      {title: '操作', key: 'operation', width: 170, align: 'center'},
+      {title: '就业状态', dataIndex: 'jobStatusName', key: 'jobStatusName', align: "center"},
+      {title: '重点人员类别', dataIndex: 'keyTypeName', key: 'keyTypeName', align: "center"},
+      {title: '民族', dataIndex: 'nationName', key: 'nationName', width: 80, align: "center", isDefaultClose: true},
+      {title: '最高学历', dataIndex: 'cultureName', key: 'cultureName', align: "center", isDefaultClose: true},
+      {title: '地址', dataIndex: 'address', key: 'address', align: "center", isDefaultClose: true},
+      {title: '操作', key: 'operation', width: 170, align: 'center', isDisabled: true},
     ];
+    // 响应式表格定义
+    const columns = ref<Array<any>>(originalColumns.filter(item => !item.isDefaultClose));
     const createDate = ref([]);
     const pagination = computed(() => ({
       total: formState.total,
@@ -349,6 +361,12 @@ export default defineComponent({
       loadData();
     }
 
+    // 字段展示列选择完毕
+    function columnsCheckSub(columnsKeys: Array<string>) {
+      // 从原始表格定义数据中过滤出已选择的字段
+      columns.value = originalColumns.filter((item: any) => columnsKeys.includes(item.key));
+    }
+
     return {
       modalRoleUserRef,
       modalRoleEditRef,
@@ -360,6 +378,8 @@ export default defineComponent({
       searchParamsState,
       formState,
       columns,
+      originalColumns,
+      columnsCheckSub,
       pagination,
       dataList,
       siteList,

+ 42 - 15
vue/src/views/jobUserManager/recommendMgt/index.vue

@@ -122,7 +122,14 @@
         </a-col>
       </a-row>
       <a-row class="edit-operation">
-        <a-col :span="24" style="text-align: right"></a-col>
+        <a-col :span="24" class="flex-space-between">
+          <div>
+            <!-- 表格字段筛选按钮 -->
+            <ColumnsSetting :table-columns="originalColumns" :checked-table-columns="columns"
+                            @on-check="columnsCheckSub"></ColumnsSetting>
+          </div>
+          <div></div>
+        </a-col>
       </a-row>
     </a-form>
     <div class="search-result-list">
@@ -156,16 +163,19 @@
 
 <script lang="ts">
 import {reactive, ref, computed, defineComponent} from 'vue';
-import type {FormInstance, TableColumnsType, TableProps, SelectProps} from 'ant-design-vue';
+import type {FormInstance, TableProps, SelectProps} from 'ant-design-vue';
 import {getList, setEntryState} from '@/api/jobUserManager/recommendMgt';
 import {getSysDictionaryList} from '@/api/system/dictionary';
 import {getPaginationTotalTitle} from '@/utils/common';
 import dayjs from "dayjs";
 import {getSiteList} from "@/api/baseSettings/siteInfo";
 import {get} from "@/api/common";
+import BExportExcel from "@/components/basic/excel/exportExcel/exportExcel.vue";
+import ColumnsSetting from "@/components/common/ColumnsSetting.vue";
 
 export default defineComponent({
   name: 'recommendMgtList',
+  components: {ColumnsSetting, BExportExcel},
   setup() {
     const expand = ref(false);
     const modalRoleUserRef = ref();
@@ -192,30 +202,39 @@ export default defineComponent({
       selectedRowKeys: [],
       loading: false,
     });
-    const columns: TableColumnsType = [
+    // 原始表格定义数据
+    const originalColumns = [
       {
         title: '序号',
         align: 'center',
         width: 80,
         key: 'recommendMgtID',
         customRender: (item) =>
-          `${searchParamsState.pageSize * (searchParamsState.pageIndex - 1) + item.index + 1}`,
+          `${searchParamsState.pageSize * (searchParamsState.pageIndex - 1) + item.index + 1}`, isDisabled: true
+      },
+      {title: '求职者', dataIndex: 'name', key: 'name', align: "center"},
+      {title: '求职者电话', dataIndex: 'userMobile', key: 'userMobile', align: "center"},
+      {title: '求职岗位', dataIndex: 'qzProfessionName', key: 'qzProfessionName', align: "center"},
+      {title: '企业', dataIndex: 'companyName', key: 'companyName', align: "center"},
+      {title: '企业电话', dataIndex: 'companyMobile', key: 'companyMobile', align: "center"},
+      {title: '招聘岗位', dataIndex: 'zpProfessionName', key: 'zpProfessionName', align: "center"},
+      {title: '入职状态', dataIndex: 'entryStateName', key: 'entryStateName', align: "center"},
+      {
+        title: '推荐类型',
+        dataIndex: 'recommendTypeName',
+        key: 'recommendTypeName',
+        align: "center",
+        isDefaultClose: true
       },
-      {title: '求职者', dataIndex: 'name', key: 'name'},
-      {title: '求职者电话', dataIndex: 'userMobile', key: 'userMobile'},
-      {title: '求职岗位', dataIndex: 'qzProfessionName', key: 'qzProfessionName'},
-      {title: '企业', dataIndex: 'companyName', key: 'companyName'},
-      {title: '企业电话', dataIndex: 'companyMobile', key: 'companyMobile'},
-      {title: '招聘岗位', dataIndex: 'zpProfessionName', key: 'zpProfessionName'},
-      {title: '推荐类型', dataIndex: 'recommendTypeName', key: 'recommendTypeName'},
-      {title: '入职状态', dataIndex: 'entryStateName', key: 'entryStateName'},
-      {title: '推送人', dataIndex: 'pushName', key: 'pushName'},
+      {title: '推送人', dataIndex: 'pushName', key: 'pushName', isDefaultClose: true},
       {
         title: '推送时间', dataIndex: 'createTime', key: 'createTime',
-        customRender: ({record}) => dayjs(record.createTime).format('YYYY-MM-DD'),
+        customRender: ({record}) => dayjs(record.createTime).format('YYYY-MM-DD'), isDefaultClose: true
       },
-      {title: '操作', key: 'operation', width: 100, align: 'center'},
+      {title: '操作', key: 'operation', width: 100, align: 'center', isDisabled: true},
     ];
+    // 响应式表格定义
+    const columns = ref<Array<any>>(originalColumns.filter(item => !item.isDefaultClose));
     const siteList = ref<Array<any>>([]);
     const regionList = ref<SelectProps['options']>();
     const createDate = ref([]);
@@ -295,6 +314,12 @@ export default defineComponent({
       loadData();
     }
 
+    // 字段展示列选择完毕
+    function columnsCheckSub(columnsKeys: Array<string>) {
+      // 从原始表格定义数据中过滤出已选择的字段
+      columns.value = originalColumns.filter((item: any) => columnsKeys.includes(item.key));
+    }
+
     return {
       modalRoleUserRef,
       modalRoleEditRef,
@@ -303,6 +328,8 @@ export default defineComponent({
       searchParamsState,
       formState,
       columns,
+      originalColumns,
+      columnsCheckSub,
       pagination,
       dataList,
       recommendTypeList,

+ 35 - 11
vue/src/views/system/log/index.vue

@@ -28,6 +28,16 @@
         </a-col>
       </a-row>
     </a-form>
+    <a-row class="edit-operation">
+      <a-col :span="24" class="flex-space-between">
+        <div>
+          <!-- 表格字段筛选按钮 -->
+          <ColumnsSetting :table-columns="originalColumns" :checked-table-columns="columns"
+                          @on-check="columnsCheckSub"></ColumnsSetting>
+        </div>
+        <div></div>
+      </a-col>
+    </a-row>
     <div class="search-result-list">
       <a-table :columns="columns" :data-source="dataList" :scroll="{ x:'100%', y: 500 }" :pagination="pagination"
                :loading="formState.loading"
@@ -41,18 +51,19 @@
 </template>
 
 <script lang="ts">
-import {reactive, ref, computed, defineComponent} from 'vue';
+import {computed, defineComponent, reactive, ref} from 'vue';
 import {DownOutlined, UpOutlined} from '@ant-design/icons-vue';
-import type {FormInstance} from 'ant-design-vue';
-import type {TableColumnsType, TableProps} from 'ant-design-vue';
+import type {FormInstance, TableProps} from 'ant-design-vue';
 import {getList} from '@/api/system/log';
 import {useRoute} from 'vue-router';
 import dayjs from 'dayjs';
 import {getPaginationTotalTitle} from "@/utils/common";
+import BExportExcel from "@/components/basic/excel/exportExcel/exportExcel.vue";
+import ColumnsSetting from "@/components/common/ColumnsSetting.vue";
 
 export default defineComponent({
   name: 'LogList',
-  components: {DownOutlined, UpOutlined},
+  components: {ColumnsSetting, BExportExcel, DownOutlined, UpOutlined},
   setup() {
     const route = useRoute();
     const expand = ref(false);
@@ -63,15 +74,18 @@ export default defineComponent({
       selectedRowKeys: [],
       loading: false
     });
-    const columns: TableColumnsType = [
+    // 原始表格定义数据
+    const originalColumns = [
       {
         title: '序号',
         align: 'center',
         width: 80,
         key: 'logID',
-        customRender: item => `${searchParamsState.rows * (searchParamsState.page - 1) + item.index + 1}`
+        customRender: item => `${searchParamsState.rows * (searchParamsState.page - 1) + item.index + 1}`,
+        // 字段筛选时禁止变更
+        isDisabled: true
       },
-      {title: '登录账号', dataIndex: 'loginID', key: 'loginID'},
+      {title: '登录账号', dataIndex: 'loginID', key: 'loginID', align: "center"},
       {title: '姓名', dataIndex: 'userName', key: 'userName',align:"center"},
       {title: '操作页面', dataIndex: 'pageName', key: 'pageName',align:"center"},
       {
@@ -79,9 +93,13 @@ export default defineComponent({
         dataIndex: 'logTime',
         key: 'logTime',
         align:"center",
-        customRender: ({record}) => dayjs(record.logTime).format('YYYY-MM-DD HH:mm:ss')
+        customRender: ({record}) => dayjs(record.logTime).format('YYYY-MM-DD HH:mm:ss'),
+        // 默认不显示
+        isDefaultClose: true
       }
-    ];
+    ]
+    // 响应式表格定义
+    const columns = ref<Array<any>>(originalColumns.filter(item => !item.isDefaultClose));
     const pagination = computed(() => ({
       total: formState.total,
       current: searchParamsState.page,
@@ -114,7 +132,6 @@ export default defineComponent({
       loadData();
     }
 
-
     const loadData = async function () {
       formState.loading = true;
       const result: any = await getList(searchParamsState);
@@ -124,6 +141,11 @@ export default defineComponent({
       formState.loading = false;
     }
 
+    // 字段展示列选择完毕
+    function columnsCheckSub(columnsKeys: Array<string>) {
+      // 从原始表格定义数据中过滤出已选择的字段
+      columns.value = originalColumns.filter((item: any) => columnsKeys.includes(item.key));
+    }
 
     return {
       route,
@@ -131,6 +153,7 @@ export default defineComponent({
       formRef,
       searchParamsState,
       formState,
+      originalColumns,
       columns,
       pagination,
       dataList,
@@ -138,7 +161,8 @@ export default defineComponent({
       onSelectChange,
       onFinish,
       loadData,
-      onRangeChange
+      onRangeChange,
+      columnsCheckSub
     };
   },
   created() {

+ 33 - 13
vue/src/views/taskAndLog/dotask/index.vue

@@ -68,12 +68,19 @@
         </a-col>
       </a-row>
       <a-row class="edit-operation">
-        <a-col :span="24" style="text-align: right">
-          <a-button functioncode="T01040102" html-type="submit" type="primary" @click='onAdd'>新增</a-button>
-          <BExportExcel :filename="'任务信息'"
-                        :params="{...exportSearchParams, isExport: true, rows:10000,doTaskIDList:formState.selectedRowKeys.join(',')}"
-                        :title="'导出'"
-                        :url="'taskAndLog/doTask/export'"></BExportExcel>
+        <a-col :span="24" class="flex-space-between">
+          <div>
+            <!-- 表格字段筛选按钮 -->
+            <ColumnsSetting :table-columns="originalColumns" :checked-table-columns="columns"
+                            @on-check="columnsCheckSub"></ColumnsSetting>
+          </div>
+          <div>
+            <a-button functioncode="T01040102" html-type="submit" type="primary" @click='onAdd'>新增</a-button>
+            <BExportExcel :filename="'任务信息'"
+                          :params="{...exportSearchParams, isExport: true, rows:10000,doTaskIDList:formState.selectedRowKeys.join(',')}"
+                          :title="'导出'"
+                          :url="'taskAndLog/doTask/export'"></BExportExcel>
+          </div>
         </a-col>
       </a-row>
     </a-form>
@@ -102,18 +109,20 @@
 import {get} from '@/api/common';
 import {computed, createVNode, defineComponent, reactive, ref} from 'vue';
 import {DownOutlined, ExclamationCircleOutlined, UpOutlined} from '@ant-design/icons-vue';
-import type {FormInstance, SelectProps, TableColumnsType, TableProps} from 'ant-design-vue';
+import type {FormInstance, SelectProps, TableProps} from 'ant-design-vue';
 import {message, Modal} from "ant-design-vue";
 import {del, getList} from '@/api/taskAndLog/dotask';
 import BExportExcel from "@/components/basic/excel/exportExcel/exportExcel.vue";
 import {getPaginationTotalTitle} from "@/utils/common";
 import dayjs from 'dayjs';
 import {useTabsViewStore} from "@/store/modules/tabsView";
+import BImportExcel from "@/components/basic/excel/importExcel/importExcel.vue";
+import ColumnsSetting from "@/components/common/ColumnsSetting.vue";
 
 
 export default defineComponent({
   name: 'doTaskList',
-  components: {DownOutlined, UpOutlined, BExportExcel},
+  components: {ColumnsSetting, BImportExcel, DownOutlined, UpOutlined, BExportExcel},
   setup() {
     const formRef = ref<FormInstance>();
     const searchParams = reactive({
@@ -141,12 +150,14 @@ export default defineComponent({
       selectedRowKeys: [],
       loading: false
     });
-    const columns: TableColumnsType = [
+    // 原始表格定义数据
+    const originalColumns = [
       {
         title: '序号',
         align: "center",
         key: 'institutionID',
-        customRender: item => `${searchParams.pageSize * (searchParams.pageIndex - 1) + item.index + 1}`
+        customRender: item => `${searchParams.pageSize * (searchParams.pageIndex - 1) + item.index + 1}`,
+        isDisabled: true
       },
       {title: '任务名称', dataIndex: 'doTaskName', key: 'doTaskName', align: "center"},
       {title: '任务类型', dataIndex: 'workTypeName', key: 'workTypeName', width: 120, align: "center"},
@@ -156,16 +167,17 @@ export default defineComponent({
         }
       },
       {title: '所属县区', dataIndex: 'regionName', key: 'regionName', align: "center"},
-      // {title: '所属街道', dataIndex: 'streetName', key: 'streetName', align: "center"},
       {title: '执行用户数', dataIndex: 'userCount', key: 'userCount', align: "center"},
       {
         title: '下达时间', dataIndex: 'createTime', key: 'createTime', align: "center", customRender: (item) => {
           return item.record.createTime == null ? "" : (dayjs(item.record.createTime).format('YYYY-MM-DD'))
         }
       },
-      {title: '下达人', dataIndex: 'createName', key: 'createName', align: "center"},
-      {title: '操作', key: 'operation', fixed: 'right', width: 150, align: "center"},
+      {title: '下达人', dataIndex: 'createName', key: 'createName', align: "center", isDefaultClose: true},
+      {title: '操作', key: 'operation', fixed: 'right', width: 150, align: "center", isDisabled: true},
     ];
+    // 响应式表格定义
+    const columns = ref<Array<any>>(originalColumns.filter(item => !item.isDefaultClose));
     const pagination = computed(() => ({
       total: formState.total,
       current: searchParams.pageIndex,
@@ -298,6 +310,12 @@ export default defineComponent({
 
     };
 
+    // 字段展示列选择完毕
+    function columnsCheckSub(columnsKeys: Array<string>) {
+      // 从原始表格定义数据中过滤出已选择的字段
+      columns.value = originalColumns.filter((item: any) => columnsKeys.includes(item.key));
+    }
+
     return {
       expand,
       orderDate,
@@ -309,6 +327,8 @@ export default defineComponent({
       searchParams,
       formState,
       columns,
+      originalColumns,
+      columnsCheckSub,
       pagination,
       dataList,
       handleTableChange,

+ 46 - 14
vue/src/views/taskAndLog/dowork/index.vue

@@ -85,12 +85,19 @@
         </a-col>
       </a-row>
       <a-row class="edit-operation">
-        <a-col :span="24" style="text-align: right">
-          <a-button functioncode="T01040202" html-type="submit" type="primary" @click='onAdd'>新增</a-button>
-          <BExportExcel :filename="'工作日志信息'"
-                        :params="{...exportSearchParams, rows:100000,doWorkIDList:formState.selectedRowKeys.join(',')}"
-                        :title="'导出'"
-                        :url="'taskAndLog/doWork/export'"></BExportExcel>
+        <a-col :span="24" class="flex-space-between">
+          <div>
+            <!-- 表格字段筛选按钮 -->
+            <ColumnsSetting :table-columns="originalColumns" :checked-table-columns="columns"
+                            @on-check="columnsCheckSub"></ColumnsSetting>
+          </div>
+          <div>
+            <a-button functioncode="T01040202" html-type="submit" type="primary" @click='onAdd'>新增</a-button>
+            <BExportExcel :filename="'工作日志信息'"
+                          :params="{...exportSearchParams, rows:100000,doWorkIDList:formState.selectedRowKeys.join(',')}"
+                          :title="'导出'"
+                          :url="'taskAndLog/doWork/export'"></BExportExcel>
+          </div>
         </a-col>
       </a-row>
     </a-form>
@@ -142,7 +149,7 @@
 import {computed, createVNode, defineComponent, reactive, ref} from 'vue';
 import {useTabsViewStore} from "@/store/modules/tabsView";
 import {DownOutlined, ExclamationCircleOutlined, UpOutlined} from '@ant-design/icons-vue';
-import type {FormInstance, SelectProps, TableColumnsType, TableProps} from 'ant-design-vue';
+import type {FormInstance, SelectProps, TableProps} from 'ant-design-vue';
 import {message, Modal} from "ant-design-vue";
 import {delWorkLog, getList} from '@/api/taskAndLog/dowork';
 import {getRegionCodeList, getStreetCodeList} from '@/api/system/area/index';
@@ -153,10 +160,11 @@ import dayjs from 'dayjs';
 import CompanyTableCom from "@/views/companyService/company/CompanyTableCom.vue";
 import JobUserTableCom from "@/views/jobUserManager/jobuser/JobUserTableCom.vue";
 import {getSiteList} from "@/api/baseSettings/siteInfo";
+import ColumnsSetting from "@/components/common/ColumnsSetting.vue";
 
 export default defineComponent({
   name: 'doTaskList',
-  components: {JobUserTableCom, CompanyTableCom, DownOutlined, UpOutlined, BExportExcel},
+  components: {ColumnsSetting, JobUserTableCom, CompanyTableCom, DownOutlined, UpOutlined, BExportExcel},
   setup() {
     const formRef = ref<FormInstance>();
     const tabsViewStore = useTabsViewStore();
@@ -186,12 +194,14 @@ export default defineComponent({
       selectedRowKeys: [],
       loading: false
     });
-    const columns: TableColumnsType = [
+    // 原始表格定义数据
+    const originalColumns = [
       {
         title: '序号',
         align: "center",
         key: 'LogId',
-        customRender: item => `${searchParams.pageSize * (searchParams.pageIndex - 1) + item.index + 1}`
+        customRender: item => `${searchParams.pageSize * (searchParams.pageIndex - 1) + item.index + 1}`,
+        isDisabled: true
       },
       {title: '姓名', dataIndex: 'userName', key: 'userName', align: "center"},
       {
@@ -204,11 +214,25 @@ export default defineComponent({
       {title: '工作情况', dataIndex: 'workContent', key: 'workContent', align: "center"},
       {title: '所属驿站', dataIndex: 'siteName', key: 'siteName', align: "center"},
       {title: '所属县区', dataIndex: 'regionName', key: 'regionName', align: "center"},
-      {title: '所属街道', dataIndex: 'streetName', key: 'streetName', align: "center"},
-      {title: '走访企业数量', dataIndex: 'RecordsCompanyNum', key: 'RecordsCompanyNum', align: "center"},
-      {title: '登记就业人员人数', dataIndex: 'RecordsJobuserNum', key: 'RecordsJobuserNum', align: "center"},
-      {title: '操作', key: 'operation', fixed: 'right', width: 150, align: "center"},
+      {title: '所属街道', dataIndex: 'streetName', key: 'streetName', align: "center", isDefaultClose: true},
+      {
+        title: '走访企业数量',
+        dataIndex: 'RecordsCompanyNum',
+        key: 'RecordsCompanyNum',
+        align: "center",
+        isDefaultClose: true
+      },
+      {
+        title: '登记就业人员人数',
+        dataIndex: 'RecordsJobuserNum',
+        key: 'RecordsJobuserNum',
+        align: "center",
+        isDefaultClose: true
+      },
+      {title: '操作', key: 'operation', fixed: 'right', width: 150, align: "center", isDisabled: true},
     ];
+    // 响应式表格定义
+    const columns = ref<Array<any>>(originalColumns.filter(item => !item.isDefaultClose));
     const pagination = computed(() => ({
       total: formState.total,
       current: searchParams.pageIndex,
@@ -360,6 +384,12 @@ export default defineComponent({
       loadData();
     }
 
+    // 字段展示列选择完毕
+    function columnsCheckSub(columnsKeys: Array<string>) {
+      // 从原始表格定义数据中过滤出已选择的字段
+      columns.value = originalColumns.filter((item: any) => columnsKeys.includes(item.key));
+    }
+
     return {
       formRef,
       expand,
@@ -369,6 +399,8 @@ export default defineComponent({
       streetList,
       searchParams,
       formState,
+      originalColumns,
+      columnsCheckSub,
       columns,
       pagination,
       dataList,