Przeglądaj źródła

Merge branch 'master' of http://39.98.153.250:9080/bowintek/EmploymentSite

pengjing 1 rok temu
rodzic
commit
378b920de7
42 zmienionych plików z 1460 dodań i 599 usunięć
  1. 73 1
      doc/待更新脚本
  2. 4 0
      h5app/src/router/index.ts
  3. 5 19
      h5app/src/views/pages/company/edit.vue
  4. 95 94
      h5app/src/views/pages/company/editPost.vue
  5. 1 1
      h5app/src/views/pages/company/list.vue
  6. 55 50
      h5app/src/views/pages/company/postList.vue
  7. 365 236
      h5app/src/views/pages/jobhunt/edit.vue
  8. 45 49
      h5app/src/views/pages/jobhunt/educationEdit.vue
  9. 50 50
      h5app/src/views/pages/jobhunt/experienceEdit.vue
  10. 167 19
      h5app/src/views/pages/jobhunt/list.vue
  11. 35 0
      h5app/src/views/sapp/about.vue
  12. 1 1
      h5app/src/views/sapp/tabUser.vue
  13. 18 4
      src/main/java/com/hz/employmentsite/controller/baseSettings/SiteUserController.java
  14. 2 2
      src/main/java/com/hz/employmentsite/controller/companyService/CompanyController.java
  15. 1 1
      src/main/java/com/hz/employmentsite/controller/companyService/PostController.java
  16. 13 1
      src/main/java/com/hz/employmentsite/controller/jobUserManager/EducationController.java
  17. 12 0
      src/main/java/com/hz/employmentsite/controller/jobUserManager/ExperienceController.java
  18. 14 0
      src/main/java/com/hz/employmentsite/controller/jobUserManager/JobUserController.java
  19. 5 0
      src/main/java/com/hz/employmentsite/mapper/PcSiteUserMapper.java
  20. 2 1
      src/main/java/com/hz/employmentsite/mapper/cquery/UserInfoCQuery.java
  21. 154 11
      src/main/java/com/hz/employmentsite/services/impl/baseSettings/SiteUserImpl.java
  22. 26 0
      src/main/java/com/hz/employmentsite/services/impl/companyService/CompanyServiceImpl.java
  23. 9 0
      src/main/java/com/hz/employmentsite/services/impl/jobUserManager/EducationServiceImpl.java
  24. 11 0
      src/main/java/com/hz/employmentsite/services/impl/jobUserManager/ExperienceServiceImpl.java
  25. 10 1
      src/main/java/com/hz/employmentsite/services/service/baseSettings/SiteUserService.java
  26. 4 0
      src/main/java/com/hz/employmentsite/services/service/jobUserManager/EducationService.java
  27. 4 0
      src/main/java/com/hz/employmentsite/services/service/jobUserManager/ExperienceService.java
  28. 9 2
      src/main/java/com/hz/employmentsite/vo/baseSettings/SiteUserVo.java
  29. 13 1
      src/main/resources/mapping/PcSiteUserMapper.xml
  30. 5 5
      src/main/resources/mapping/cquery/CompanyCQuery.xml
  31. 1 1
      src/main/resources/mapping/cquery/PostCQuery.xml
  32. 3 0
      src/main/resources/mapping/cquery/SiteUserCQuery.xml
  33. BIN
      src/main/resources/static/doc/template/驿站站点人员导入模板.xlsx
  34. 2 0
      vue/src/router/asyncModules/basesettings.ts
  35. 60 0
      vue/src/views/baseSettings/siteInfo/detail.vue
  36. 13 6
      vue/src/views/baseSettings/siteInfo/index.vue
  37. 49 0
      vue/src/views/baseSettings/siteUser/detail.vue
  38. 34 8
      vue/src/views/baseSettings/siteUser/edit.vue
  39. 48 12
      vue/src/views/baseSettings/siteUser/index.vue
  40. 15 8
      vue/src/views/companyService/company/edit.vue
  41. 24 12
      vue/src/views/companyService/post/edit.vue
  42. 3 3
      vue/src/views/companyService/post/index.vue

+ 73 - 1
doc/待更新脚本

@@ -44,6 +44,78 @@ INSERT INTO sys_dictionary_item (DictionaryItemID, Code, DictionaryCode, Value,
 INSERT INTO sys_dictionary_item (DictionaryItemID, Code, DictionaryCode, Value, Name, OrderNo, RecordStatus, IsEditable) VALUES ('f06cf371-a77a-11ed-a6c5-7485c2a9999e', '', 'DataRange', 5, '企业', 50, 1, 0);
 INSERT INTO sys_dictionary_item (DictionaryItemID, Code, DictionaryCode, Value, Name, OrderNo, RecordStatus, IsEditable) VALUES ('f06cf371-a77a-11ed-a6c5-7585c3a9999e', '', 'DataRange', 6, '本人', 60, 1, 0);
 
+
+-- 2024.4.17
+insert sys_dictionary values('NationType','民族',89,1);
+insert sys_dictionary_item values(UUID(),'','NationType',1,'汉族',1,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',2,'蒙古族',2,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',3,'回族',3,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',4,'藏族',4,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',5,'维吾尔族',5,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',6,'苗族',6,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',7,'彝族',7,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',8,'壮族',8,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',9,'布依族',9,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',10,'朝鲜族',10,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',11,'满族',11,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',12,'侗族',12,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',13,'瑶族',13,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',14,'白族',14,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',15,'土家族',15,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',16,'哈尼族',16,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',17,'哈萨克族',17,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',18,'傣族',18,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',19,'黎族',19,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',20,'傈傈族',20,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',21,'佤族',21,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',22,'畲族',22,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',23,'高山族',23,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',24,'拉祜族',24,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',25,'水族',25,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',26,'东乡族',26,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',27,'纳西族',27,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',28,'景颇族',28,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',29,'柯尔克族',29,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',30,'土族',30,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',31,'达斡尔族',31,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',32,'仫佬族',32,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',33,'羌族',33,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',34,'布朗族',34,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',35,'撒拉族',35,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',36,'毛难族',36,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',37,'仡佬族',37,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',38,'锡伯族',38,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',39,'阿昌族',39,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',40,'普米族',40,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',41,'塔吉克族',41,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',42,'怒族',42,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',43,'乌孜别克',43,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',44,'俄罗斯族',44,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',45,'鄂温克族',45,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',46,'崩龙族',46,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',47,'保安族',47,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',48,'裕固族',48,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',49,'京族',49,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',50,'塔塔尔族',50,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',51,'独龙族',51,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',52,'鄂伦春族',52,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',53,'赫哲族',53,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',54,'门巴族',54,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',55,'珞巴族',55,1,1);
+insert sys_dictionary_item values(UUID(),'','NationType',56,'基诺族',56,1,1);
+
 -- 2024.4.17
 alter table pc_site_user add UserNo varchar(50) comment '工号';
-alter table pc_site_user add IDCard varchar(100) comment '身份证号';
+alter table pc_site_user add IDCard varchar(100) comment '身份证号';
+
+--2024.4.18
+insert into sys_dictionary values('CompanyType','企业类型',53,1);
+INSERT into sys_dictionary_item (`DictionaryItemID`, `Code`, `DictionaryCode`, `Value`, `Name`, `OrderNo`, `RecordStatus`, `IsEditable`)
+VALUES
+(UUID(), '', 'CompanyType', 1, '国有企业', 1, 1, 0),
+(UUID(), '', 'CompanyType', 2, '联营企业', 2, 1, 0),
+(UUID(), '', 'CompanyType', 3, '有限责任公司', 3, 1, 0),
+(UUID(), '', 'CompanyType', 4, '股份有限公司', 4, 1, 0),
+(UUID(), '', 'CompanyType', 5, '私营企业', 5, 1, 0),
+(UUID(), '', 'CompanyType', 6, '中外合资企业', 6, 1, 0),
+(UUID(), '', 'CompanyType', 7, '外资企业', 7, 1, 0)

+ 4 - 0
h5app/src/router/index.ts

@@ -141,6 +141,10 @@ const routes: Array<RouteRecordRaw> = [
                 path: 'tabUser/updatePassword',
                 component: () => import('@/views/pages/user/updatePassword.vue')
             },
+            {
+                path: 'tabUser/about',
+                component: () => import('@/views/sapp/about.vue')
+            },
             {
                 path: 'tabMain/demo/edit',
                 component: () => import('@/views/pages/demo/edit.vue')

+ 5 - 19
h5app/src/views/pages/company/edit.vue

@@ -181,13 +181,13 @@
             <div class="form-input">
             <ion-label>经营范围</ion-label>
               <ion-textarea placeholder="请输入经营范围" :rows="3" label-placement="stacked" :clear-input="true"
-                            v-model="dataModel.businScope" class="custom">
+                            v-model="dataModel.businScope" class="custom" style="border-bottom: 1px solid #fff2e8;">
               </ion-textarea>
             </div>
             <div class="form-input">
             <ion-label>企业简介</ion-label>
               <ion-textarea placeholder="请输入企业简介" :rows="3" label-placement="stacked" :clear-input="true"
-                            v-model="dataModel.companyDesc" class="custom">
+                            v-model="dataModel.companyDesc" class="custom" style="border-bottom: 1px solid #fff2e8;">
               </ion-textarea>
             </div>
           </div>
@@ -196,16 +196,13 @@
     </ion-content>
     <ion-footer>
       <ion-toolbar>
-        <div slot="end">
-          <ion-button shape="round" expand="block" @click="onNext">提交</ion-button>
-        </div>
+          <ion-button style="width:100%;" @click="onNext">保存并下一步</ion-button>
       </ion-toolbar>
     </ion-footer>
   </ion-page>
 </template>
 <script lang="ts">
 import {defineComponent, ref, reactive, computed, toRefs} from "vue";
-// import {MultiPickerModule} from 'ion-multi-picker';
 import {chevronDownOutline, chevronUpOutline, arrowBackOutline} from 'ionicons/icons';
 import {getRegionList, getSiteList, getStreeList} from '@/api/company/index'
 import {useRoute,useRouter} from "vue-router";
@@ -215,6 +212,7 @@ import {getCompanyById,saveCompanyInfo} from "@/api/company";
 import {required} from "@vuelidate/validators";
 import {getSysDictionaryList} from "@/api/system/dictionary";
 import dayjs from "dayjs";
+// import {MultiPickerModule} from 'ion-multi-picker';
 
 interface StepParams{
   name: string,
@@ -278,13 +276,7 @@ export default defineComponent({
       {value: 0, name: '否'},
     ];
 
-    // 选中省市区
-    const cityDefault = ref<string >('');
-    //数据数组
-    const provinceColumns = ref<any>([{name:"广东省",code:"440000000000000"}]);
-    const cityColumns = ref<any>([{name:"惠州市",code:"441300000000000"}]);
-    const regionColumns = ref<any>([]);
-    const streetColumns = ref<any>([]);
+
 
     // /** 选择的区域 */
     // const regionChecked= ref<string>('');
@@ -501,12 +493,6 @@ export default defineComponent({
       siteList,
       regionList,
       streetList,
-      // defaultAddText,
-      // cityDefault,
-      // provinceColumns,
-      // cityColumns ,
-      // regionColumns ,
-      // streetColumns,
       shortAgeTypeList,
       companyStatusList,
       companyModelList,

+ 95 - 94
h5app/src/views/pages/company/editPost.vue

@@ -12,81 +12,79 @@
     </ion-header>
     <ion-content>
       <form autocomplete="off">
+        <div class="bw-vue-form">
         <ion-list>
-          <ion-item>
-            <div class="panel-title2">
-              <div class="item-flag"></div>
-              基础信息
-            </div>
-          </ion-item>
-          <ion-label class="title-item">岗位名称<span class="danger">*</span></ion-label>
-          <ion-item mode="md" :class="[v$.dataModel.postName.$error?'ion-invalid':'ion-valid']">
+          <div class="form-title">基本信息</div>
+          <div class="form-input">
+            <ion-label>岗位名称<span class="danger">*</span></ion-label>
             <ion-input placeholder="请输入岗位名称" label-placement="stacked" :clear-input="true"
                        v-model="dataModel.postName" class="custom">
             </ion-input>
-            <ion-note slot="error">请输入岗位名称</ion-note>
-          </ion-item>
-          <ion-label class="title-item">招聘数量(人)<span class="danger">*</span></ion-label>
-          <ion-item mode="md" :class="[v$.dataModel.recruitCount.$error?'ion-invalid':'ion-valid']">
+<!--            <ion-note slot="error">请输入岗位名称</ion-note>-->
+          </div>
+          <div class="form-input">
+          <ion-label>招聘数量(人)<span class="danger">*</span></ion-label>
             <ion-input type="number" placeholder="请输入招聘数量" label-placement="stacked" :clear-input="true"
                        v-model="dataModel.recruitCount" class="custom">
             </ion-input>
-            <ion-note slot="error">请输入招聘数量</ion-note>
-          </ion-item>
-          <ion-label class="title-item">招聘日期<span class="danger">*</span></ion-label>
-          <ion-item mode="md" :class="[v$.dataModel.startTime.$error||v$.dataModel.endTime.$error?'ion-invalid':'ion-valid']">
-            <ion-datetime-button datetime="startTime"></ion-datetime-button>
-            <ion-modal :keep-contents-mounted="true">
-              <ion-datetime placeholder="招聘日期" id="startTime"
-                            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-datetime-button datetime="endTime"></ion-datetime-button>
-            <ion-modal :keep-contents-mounted="true">
-              <ion-datetime placeholder="招聘日期" id="endTime"
-                            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>
-            </ion-modal>
-            <ion-note slot="error">招聘开始日期与结束日期不能为空</ion-note>
-          </ion-item>
-          <ion-label class="title-item">招聘地点<span class="danger">*</span></ion-label>
-          <ion-item mode="md" :class="[v$.dataModel.jobPlace.$error?'ion-invalid':'ion-valid']">
+<!--            <ion-note slot="error">请输入招聘数量</ion-note>-->
+          </div>
+          <div class="form-input">
+          <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"
+                              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"
+                              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-note slot="error">招聘开始日期与结束日期不能为空</ion-note>-->
+            </div>
+          </div>
+          <div style="overflow: hidden;width:100%;"></div>
+          <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">
+                       v-model="dataModel.jobPlace" class="custom" style="border-bottom: 1px solid #fff2e8;">
             </ion-textarea>
-            <ion-note slot="error">请输入招聘地点</ion-note>
-          </ion-item>
-
-          <ion-item mode="md" >
-            <div class="panel-title2" style="width: 25%;">
-              <div class="item-flag"></div>
-              其他信息
-            </div>
-            <div style="width: 75%;text-align: right;">
-              <ion-icon :icon="chevronDownOutline" @click="isShow=!isShow" v-show="!isShow"
+<!--            <ion-note slot="error">请输入招聘地点</ion-note>-->
+          </div>
+          <div class="form-title">
+            其他信息
+            <div style="float: right;">
+              <ion-icon :icon="chevronDownOutline"  @click="isShow=!isShow" v-if="!isShow"
                         style="font-size: 24px;"></ion-icon>
-              <ion-icon :icon="chevronUpOutline" @click="isShow=!isShow" v-show="isShow"
+              <ion-icon :icon="chevronUpOutline"  @click="isShow=!isShow" v-if="isShow"
                         style="font-size: 24px;"></ion-icon>
             </div>
-          </ion-item>
-          <ion-list v-show="isShow" >
-            <ion-label class="title-item">岗位月薪(元)</ion-label>
-            <ion-item mode="md" >
-              <ion-input placeholder="请输入金额" label-placement="stacked"
-                         v-model="dataModel.minSalary" class="custom">
-              </ion-input>
-              <ion-label style="text-align:left;width:70px;">至</ion-label>
-              <ion-input placeholder="请输入金额" label-placement="stacked"
-                         v-model="dataModel.maxSalary" class="custom">
-              </ion-input>
-            </ion-item>
-            <ion-label class="title-item">是否有试用期</ion-label>
-            <ion-item mode="md" >
+          </div>
+          <div v-show="isShow" >
+            <div class="form-input">
+              <ion-label>岗位月薪(元)</ion-label>
+              <div>
+                <ion-input placeholder="请输入金额" label-placement="stacked" style="float:left;width:40%;"
+                           v-model="dataModel.minSalary" class="custom">
+                </ion-input>
+                <ion-label style="float:left;width:5%;padding-top: 8px;">至</ion-label>
+                <ion-input placeholder="请输入金额" label-placement="stacked" style="float:left;width:40%;"
+                           v-model="dataModel.maxSalary" class="custom">
+                </ion-input>
+              </div>
+            </div>
+            <div style="overflow: hidden;width:100%;"></div>
+            <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;">
                 <ion-select-option v-for="(record,key) in isTrailList" :key="key"
@@ -94,25 +92,28 @@
                   {{ record.name }}
                 </ion-select-option>
               </ion-select>
-            </ion-item>
-            <ion-label class="title-item">试用期(月)</ion-label>
-            <ion-item mode="md" >
+            </div>
+            <div class="form-input">
+            <ion-label>试用期(月)</ion-label>
               <ion-input type="number" placeholder="请输入试用期月数" label-placement="stacked"
                          v-model="dataModel.trailMonths" class="custom">
               </ion-input>
-            </ion-item>
-            <ion-label class="title-item">试用期月薪(元)</ion-label>
-            <ion-item mode="md" >
-              <ion-input type="number" placeholder="请输入金额" label-placement="stacked"
-                         v-model="dataModel.trailMinSalary" class="custom">
-              </ion-input>
-              <ion-label style="text-align:left;width:70px;">至</ion-label>
-              <ion-input type="number" placeholder="请输入金额" label-placement="stacked"
-                         v-model="dataModel.trailMaxSalary" class="custom">
-              </ion-input>
-            </ion-item>
-            <ion-label class="title-item">工作年限要求</ion-label>
-            <ion-item mode="md" >
+            </div>
+            <div class="form-input">
+            <ion-label>试用期月薪(元)</ion-label>
+              <div>
+                <ion-input placeholder="请输入金额" label-placement="stacked" style="float:left;width:40%;"
+                           v-model="dataModel.trailMinSalary" class="custom">
+                </ion-input>
+                <ion-label style="float:left;width:5%;padding-top: 8px;">至</ion-label>
+                <ion-input placeholder="请输入金额" label-placement="stacked" style="float:left;width:40%;"
+                           v-model="dataModel.trailMaxSalary" class="custom">
+                </ion-input>
+              </div>
+            </div>
+            <div style="overflow: hidden;width:100%;"></div>
+            <div class="form-select">
+              <ion-label>工作年限要求</ion-label>
               <ion-select interface="action-sheet" placeholder="请选择工作年限" cancel-text="取消"
                           id="workYear" v-model="dataModel.workYear" style="width: 100%;text-align: left;">
                 <ion-select-option v-for="(record,key) in workYearList" :key="key"
@@ -120,9 +121,9 @@
                   {{ record.name }}
                 </ion-select-option>
               </ion-select>
-            </ion-item>
-            <ion-label class="title-item">学历要求</ion-label>
-            <ion-item mode="md" >
+            </div>
+            <div class="form-select">
+            <ion-label>学历要求</ion-label>
               <ion-select interface="action-sheet" placeholder="请选择学历" cancel-text="取消"
                           id="cultureRank" v-model="dataModel.cultureRank" style="width: 100%;text-align: left;">
                 <ion-select-option v-for="(record,key) in cultureRankList" :key="key"
@@ -130,21 +131,22 @@
                   {{ record.name }}
                 </ion-select-option>
               </ion-select>
-            </ion-item>
-            <ion-label class="title-item">福利待遇</ion-label>
-            <ion-item mode="md" >
+            </div>
+            <div class="form-input">
+            <ion-label>福利待遇</ion-label>
               <ion-textarea placeholder="请输入福利待遇" :rows="3" label-placement="stacked"
-                            v-model="dataModel.welfare" class="custom">
+                            v-model="dataModel.welfare" class="custom" style="border-bottom: 1px solid #fff2e8;">
               </ion-textarea>
-            </ion-item>
-            <ion-label class="title-item">其他要求</ion-label>
-            <ion-item mode="md" >
+            </div>
+            <div class="form-input">
+            <ion-label>其他要求</ion-label>
               <ion-textarea placeholder="请输入其他要求" :rows="3" label-placement="stacked"
-                            v-model="dataModel.postDesc" class="custom">
+                            v-model="dataModel.postDesc" class="custom" style="border-bottom: 1px solid #fff2e8;">
               </ion-textarea>
-            </ion-item>
-          </ion-list>
+            </div>
+          </div>
         </ion-list>
+        </div>
       </form>
     </ion-content>
     <ion-footer>
@@ -296,8 +298,7 @@ export default defineComponent({
 
 .custom{
   --placeholder-color: gray;
-  --placeholder-font-style:italic;
-  --placeholder-opacity: 1;
+  --placeholder-opacity: 0.5;
 }
 
 .title-item{

+ 1 - 1
h5app/src/views/pages/company/list.vue

@@ -195,7 +195,7 @@ export default defineComponent({
         },
       },
     ];
-    // 设置要删除的日志
+      // 设置要删除的企业信息
     function setDelAlertOpen(value: boolean, companyID: any) {
       delAlertOpen.value = value;
       if(companyID != null) {

+ 55 - 50
h5app/src/views/pages/company/postList.vue

@@ -6,10 +6,11 @@
           <ion-icon :icon="arrowBackOutline" @click="onBack"></ion-icon>
         </ion-buttons>
         <ion-title>
-          企业信息收集
+          企业岗位信息
         </ion-title>
       </ion-toolbar>
     </ion-header>
+
     <ion-content>
       <div class="stepFlex">
         <div v-for="(record,key) in stepList" :key="key" class="stepFlex-item">
@@ -23,59 +24,58 @@
           </div>
         </div>
       </div>
-      <ion-list>
-        <ion-item>
-          <div class="panel-title2">
-            <div class="item-flag"></div>
+
+      <form autocomplete="off">
+        <div class="bw-vue-form">
+          <div class="form-title">
             岗位信息
+            <ion-icon :icon="addCircleOutline" class="iconBtn" style="float:right;"
+                       @click="onAdd()" ></ion-icon>
+          </div>
+          <div class="bw-vue-list">
+            <div class="list-content" v-if="!loading">
+            <ion-list>
+              <div v-for="(record,key) in postList" :key="key" >
+                <ion-item-sliding>
+                <ion-item detail @click="onEdit(record.postID)">
+                  <ion-label>
+                    <h2>
+                      {{ record.postName }}
+                    </h2>
+                    <p v-if="record.startTime!=null&&record.endTime!=null">
+                      {{ dayjs(record.startTime).format("YYYY-MM-DD") }}至{{ dayjs(record.endTime).format("YYYY-MM-DD") }}
+                    </p>
+                    <p v-if="record.startTime==null||record.endTime==null">
+                      暂未设置有效期限
+                    </p>
+                    <p>
+                      招聘数量:{{ record.recruitCount }}
+                    </p>
+                  </ion-label>
+                </ion-item>
+                <ion-item-options>
+               <ion-item-option color="danger" @click="setDelAlertOpen(true, record.educationID)">
+               <ion-icon :icon="trashOutline"></ion-icon>
+             </ion-item-option>
+             </ion-item-options>
+                </ion-item-sliding>
+              </div>
+            </ion-list>
+            </div>
           </div>
-          <ion-icon slot="end" :icon="addCircleOutline" @click="onAdd()" style="font-size: 24px;"></ion-icon>
-        </ion-item>
-        <ion-item v-for="(record,key) in postList" :key="key" detail @click="onEdit(record.postID)">
-          <ion-grid>
-            <ion-row>
-              <ion-col>
-                <ion-label style="display: flex;justify-content: space-between;">
-                  <ion-text>
-                    {{ record.postName }}
-                  </ion-text>
-                </ion-label>
-              </ion-col>
-            </ion-row>
-            <ion-row>
-              <ion-col size="8">
-                <ion-label>
-                  <p v-if="record.startTime!=null&&record.endTime!=null">
-                    {{ dayjs(record.startTime).format("YYYY-MM-DD") }}至{{ dayjs(record.endTime).format("YYYY-MM-DD") }}
-                  </p>
-                  <p v-if="record.startTime==null||record.endTime==null">
-                    暂未设置有效期限
-                  </p>
-                </ion-label>
-              </ion-col>
-              <ion-col>
-                <ion-label>
-                  <p>
-                    招聘数量:{{ record.recruitCount }}
-                  </p>
-                </ion-label>
-              </ion-col>
-            </ion-row>
-          </ion-grid>
-        </ion-item>
-      </ion-list>
-      <ion-infinite-scroll  threshold="100px" @ionInfinite="onScroll($event)">
-        <ion-infinite-scroll-content
-            :loadingText="pageParams.total>pageParams.pageIndex*pageParams.pageSize?'正在加载...':'暂无更多'"
-            loadingSpinner="bubbles">
-        </ion-infinite-scroll-content>
-      </ion-infinite-scroll>
+          <ion-infinite-scroll  threshold="100px" @ionInfinite="onScroll($event)">
+            <ion-infinite-scroll-content
+                :loadingText="pageParams.total>pageParams.pageIndex*pageParams.pageSize?'正在加载...':'暂无更多'"
+                loadingSpinner="bubbles">
+            </ion-infinite-scroll-content>
+          </ion-infinite-scroll>
+        </div>
+      </form>
     </ion-content>
     <ion-footer>
       <ion-toolbar>
-        <div slot="end">
-          <ion-button shape="round" expand="block" @click="onFinish">完成</ion-button>
-        </div>
+        <ion-button style="width: 48%;float:left;margin-left: 1%;" @click="onBack" >上一步</ion-button>
+        <ion-button style="width: 48%;float:left;margin-right: 1%;" @click="onFinish" >完  成</ion-button>
       </ion-toolbar>
     </ion-footer>
   </ion-page>
@@ -84,7 +84,7 @@
 import {defineComponent, reactive, ref} from "vue";
 import {useRoute, useRouter} from "vue-router";
 import {alertController, onIonViewDidEnter} from "@ionic/vue";
-import {arrowBackOutline, addCircleOutline} from 'ionicons/icons';
+import {arrowBackOutline, addCircleOutline,trashOutline} from 'ionicons/icons';
 import {getCompanyPostList} from '@/api/company/index'
 import dayjs from "dayjs";
 
@@ -195,6 +195,7 @@ export default defineComponent({
     return {
       arrowBackOutline,
       addCircleOutline,
+      trashOutline,
       route,
       router,
       loading,
@@ -226,6 +227,10 @@ export default defineComponent({
   font-size: 14px;
 }
 
+.iconBtn{
+  width:24px;
+  height:24px;
+}
 .stepFlex {
   margin: 0;
   display: flex;

+ 365 - 236
h5app/src/views/pages/jobhunt/edit.vue

@@ -1,132 +1,149 @@
 <template>
-  <ion-page  class="list-page">
-    <ion-header>
+  <ion-page class="list-page">
+    <ion-header class="header-theme2">
       <ion-toolbar>
         <ion-buttons slot="start">
           <ion-icon :icon="arrowBackOutline" @click="onBack" style="padding-left:10px;width:24px;height:24px;"></ion-icon>
         </ion-buttons>
-        <ion-title>求职信息录入</ion-title>
+        <ion-title>求职人员信息登记</ion-title>
       </ion-toolbar>
     </ion-header>
-    <div class="stepFlex">
-      <div v-for="(record,key) in stepList" :key="key" class="stepFlex-item">
-        <div :class="[(record.val < curStepData?.statusVal || curStepData?.statusVal == stepList.val) ? 'greenCircle' :record.val == curStepData?.statusVal ? 'now' : 'grayCircle']"></div>
-        <div v-if="key !== stepList.length - 1"  :class="[record.val < curStepData?.statusVal ? 'greenLine' : 'grayLine']"></div>
-        <div class="stepFlex-item-label">
-          <p class="stepFlex-item-label-title">{{ record.title }}</p>
-<!--          <p class="stepFlex-item-label-desc">{{ record.desc }}</p>-->
+    <ion-content>
+      <div class="stepFlex">
+        <div v-for="(record,key) in stepList" :key="key" class="stepFlex-item">
+          <div
+              :class="[(record.val < curStepData?.statusVal || curStepData?.statusVal == stepList.val) ? 'greenCircle' :record.val == curStepData?.statusVal ? 'now' : 'grayCircle']"></div>
+          <div v-if="key !== stepList.length - 1"
+               :class="[record.val < curStepData?.statusVal ? 'greenLine' : 'grayLine']"></div>
+          <div class="stepFlex-item-label">
+            <p class="stepFlex-item-label-title">{{ record.title }}</p>
+            <p class="stepFlex-item-label-desc">{{ record.desc }}</p>
+          </div>
         </div>
       </div>
-    </div>
-    <ion-content>
-      <ion-list  v-if="curStepData.statusVal==1">
-        <ion-label class="title-item">姓名<span class="danger">*</span></ion-label>
-        <ion-item mode="md" :class="[baseDataValid.baseData.name.$error?'ion-invalid':'ion-valid']">
-          <ion-input name="name" id="name" style="text-align: left;"  class="custom" :clear-input="true"
-                     placeholder="请输入姓名" v-model="baseData.name" ></ion-input>
-          <ion-note slot="error">姓名不能为空</ion-note>
-        </ion-item>
-        <ion-label class="title-item">公民身份号码<span class="danger">*</span></ion-label>
-        <ion-item mode="md" :class="[baseDataValid.baseData.identityNumber.$error?'ion-invalid':'ion-valid']">
-          <ion-input name="identityNumber" id="identityNumber" style="text-align: left;" class="custom" :clear-input="true"
+
+      <form autocomplete="off">
+        <div class="bw-vue-form">
+          <ion-list  v-if="curStepData.statusVal==1">
+            <div class="form-title">基本信息</div>
+            <div class="form-input">
+            <ion-label>姓名<span class="danger">*</span></ion-label>
+            <ion-input name="name" id="name" class="custom" :clear-input="true"
+                     placeholder="请输入姓名" v-model="baseData.name" >
+            </ion-input>
+<!--              <ion-note slot="error">姓名不能为空</ion-note>-->
+            </div>
+            <div class="form-input">
+              <ion-label>公民身份号码<span class="danger">*</span></ion-label>
+              <ion-input name="identityNumber" id="identityNumber"  class="custom" :clear-input="true"
                      placeholder="请输入身份证号码" v-model="baseData.identityNumber" ></ion-input>
-          <ion-note slot="error">公民身份号码不能为空</ion-note>
-        </ion-item>
-        <ion-label class="title-item">性别<span class="danger">*</span></ion-label>
-        <ion-item mode="md" :class="[baseDataValid.baseData.sex.$error?'ion-invalid':'ion-valid']">
-          <ion-select name="sex" id="sex" okText="确定" cancelText="取消" v-model="baseData.sex"
-                      interface="action-sheet"  placeholder="请选择性别" style="width:100%;text-align:left;" >
-            <ion-select-option v-for=" (it,key) in genderList" :key="key"  :value="it.value" >
-              {{ it.name }}
-            </ion-select-option>
-          </ion-select>
-          <ion-note slot="error">性别不能为空</ion-note>
-        </ion-item>
-        <ion-label class="title-item">联系电话<span class="danger">*</span></ion-label>
-        <ion-item mode="md" :class="[baseDataValid.baseData.userMobile.$error?'ion-invalid':'ion-valid']">
-          <ion-input name="userMobile" id="userMobile"  style="text-align: left;" class="custom" :clear-input="true"
-                     placeholder="请输入联系电话" v-model="baseData.userMobile" ></ion-input>
-          <ion-note slot="error">联系电话不能为空</ion-note>
-        </ion-item>
-        <ion-label class="title-item">地址<span class="danger">*</span></ion-label>
-        <ion-item mode="md" :class="[baseDataValid.baseData.address.$error?'ion-invalid':'ion-valid']">
-          <ion-input name="address" id="address"  style="text-align: left;"  class="custom" :clear-input="true"
-                     placeholder="请输入地址" v-model="baseData.address" ></ion-input>
-          <ion-note slot="error">地址不能为空</ion-note>
-        </ion-item>
-        <ion-label class="title-item">就业状态<span class="danger">*</span></ion-label>
-        <ion-item mode="md" :class="[baseDataValid.baseData.jobStatusID.$error?'ion-invalid':'ion-valid']">
-          <ion-select name="jobStatusID"  id="jobStatusID" okText="确定" cancelText="取消" v-model="baseData.jobStatusID"
+<!--              <ion-note slot="error">公民身份号码不能为空</ion-note>-->
+            </div>
+            <div class="form-select">
+              <ion-label>性别<span class="danger">*</span></ion-label>
+              <ion-select name="sex" id="sex" okText="确定" cancelText="取消" v-model="baseData.sex"
+                          interface="action-sheet"  placeholder="请选择性别" style="width:100%;text-align:left;" >
+                <ion-select-option v-for=" (it,key) in genderList" :key="key"  :value="it.value" >{{ it.name }}</ion-select-option>
+              </ion-select>
+<!--              <ion-note slot="error">性别不能为空</ion-note>-->
+            </div>
+            <div class="form-input">
+             <ion-label>联系电话<span class="danger">*</span></ion-label>
+             <ion-input name="userMobile" id="userMobile"  style="text-align: left;" class="custom" :clear-input="true"
+                       placeholder="请输入联系电话" v-model="baseData.userMobile" ></ion-input>
+            <!--              <ion-note slot="error">联系电话不能为空</ion-note>-->
+            </div>
+            <div class="form-select">
+              <ion-label>所属驿站<span class="danger">*</span></ion-label>
+              <ion-select name="siteID"  id="siteID" okText="确定" cancelText="取消" v-model="baseData.siteID"
+                          interface="action-sheet" placeholder="请选择所属驿站"  style="width:100%;text-align:left;">
+                <ion-select-option v-for=" (it,key) in siteInfoList" :key="key" :value="it.value">
+                  {{ it.text }}
+                </ion-select-option>
+              </ion-select>
+              <!--          <ion-note slot="error">所属驿站不能为空</ion-note>-->
+            </div>
+            <div class="form-select">
+              <ion-label>市/县<span class="danger">*</span></ion-label>
+              <ion-select name="regionCode"  id="regionCode" okText="确定" cancelText="取消" v-model="baseData.regionCode"
+                          interface="action-sheet" placeholder="请选择市/县" style="width:100%;text-align:left;" @ionChange="regionChange()" >
+                <ion-select-option v-for=" (it,key) in regionList" :key="key" :value="it.code">
+                  {{ it.name }}
+                </ion-select-option>
+              </ion-select>
+            </div>
+            <div class="form-select">
+              <ion-label>所在街道<span class="danger">*</span></ion-label>
+              <ion-select name="streetCode"  id="streetCode" okText="确定" cancelText="取消" v-model="baseData.streetCode"
+                          interface="action-sheet" placeholder="请选择镇/街" style="width:100%;text-align:left;">
+                <ion-select-option v-for=" (it,key) in streetList" :key="key" :value="it.code">
+                  {{ it.name }}
+                </ion-select-option>
+              </ion-select>
+            </div>
+            <div class="form-input">
+              <ion-label>住址<span class="danger">*</span></ion-label>
+              <ion-input name="address" id="address"  style="text-align: left;"  class="custom" :clear-input="true"
+                     placeholder="请输入住址" v-model="baseData.address" ></ion-input>
+<!--          <ion-note slot="error">地址不能为空</ion-note>-->
+            </div>
+            <div class="form-select">
+              <ion-label>就业状态<span class="danger">*</span></ion-label>
+              <ion-select name="jobStatusID"  id="jobStatusID" okText="确定" cancelText="取消" v-model="baseData.jobStatusID"
                       interface="action-sheet" placeholder="请选择就业状态"  style="width:100%;text-align:left;" >
-            <ion-select-option v-for=" (it,key) in jobUserStatusList" :key="key" :value="it.value">
-              {{ it.name }}
-            </ion-select-option>
-          </ion-select>
-          <ion-note slot="error">就业状态不能为空</ion-note>
-        </ion-item>
-        <ion-label class="title-item">所属驿站<span class="danger">*</span></ion-label>
-        <ion-item mode="md" :class="[baseDataValid.baseData.siteID.$error?'ion-invalid':'ion-valid']"  >
-          <ion-select name="siteID"  id="siteID" okText="确定" cancelText="取消" v-model="baseData.siteID"
-                      interface="action-sheet" placeholder="请选择所属驿站"  style="width:100%;text-align:left;">
-            <ion-select-option v-for=" (it,key) in siteInfoList" :key="key" :value="it.value">
-              {{ it.text }}
-            </ion-select-option>
-          </ion-select>
-          <ion-note slot="error">所属驿站不能为空</ion-note>
-        </ion-item>
-        <ion-label class="title-item">重点人员类别<span class="danger">*</span></ion-label>
-        <ion-item mode="md" :class="[baseDataValid.baseData.keyPersonTypeID.$error?'ion-invalid':'ion-valid']">
-          <ion-select name="keyPersonTypeID"  id="keyPersonTypeID" okText="确定" cancelText="取消" v-model="baseData.keyPersonTypeID"
-                      interface="action-sheet" placeholder="请选择重点人员类别"  style="width:100%;text-align:left;" >
-            <ion-select-option v-for=" (it,key) in keyPersonTypeList" :key="key" :value="it.value">
-              {{ it.name }}
-            </ion-select-option>
-          </ion-select>
-          <ion-note slot="error">重点人员类别不能为空</ion-note>
-        </ion-item>
-        <ion-item mode="md">
-          <div class="panel-title2" style="width: 25%;">
-            <div class="item-flag"></div>
-            其他信息
-          </div>
-          <div style="width: 75%;text-align: right;">
+                <ion-select-option v-for=" (it,key) in jobUserStatusList" :key="key" :value="it.value">{{ it.name }}</ion-select-option>
+              </ion-select>
+                <!--          <ion-note slot="error">就业状态不能为空</ion-note>-->
+            </div>
+            <div class="form-select">
+              <ion-label>重点人员类别<span class="danger">*</span></ion-label>
+              <ion-select name="keyPersonTypeID"  id="keyPersonTypeID" okText="确定" cancelText="取消" v-model="baseData.keyPersonTypeID"
+                          interface="action-sheet" placeholder="请选择重点人员类别"  style="width:100%;text-align:left;" >
+                <ion-select-option v-for=" (it,key) in keyPersonTypeList" :key="key" :value="it.value">
+                  {{ it.name }}
+                </ion-select-option>
+              </ion-select>
+              <!--          <ion-note slot="error">重点人员类别不能为空</ion-note>-->
+            </div>
+
+        <div class="form-title">
+          其他信息
+          <div style="float: right;">
             <ion-icon :icon="chevronDownOutline"  @click="expandChange" v-if="!expand"
                       style="font-size: 24px;"></ion-icon>
             <ion-icon :icon="chevronUpOutline"  @click="expandChange" v-if="expand"
                       style="font-size: 24px;"></ion-icon>
-<!--            <img alt="" src="@/assets/icon/arrow-down-bold.png" class="iconBtn"  @click="expandChange" v-if="!expand"/>
-            <img alt="" src="@/assets/icon/arrow-up-bold.png"   class="iconBtn"  @click="expandChange" v-if="expand"/>-->
           </div>
-        </ion-item>
-        <ion-item-group v-if="expand">
-          <ion-label class="title-item">民族</ion-label>
-          <ion-item>
-            <ion-input name="nation" id="nation"  style="text-align: left;" class="custom"  :clear-input="true"
-                       v-model="baseData.nation" placeholder="请输入民族" ></ion-input>
-            <!--<ion-select name="nation"  id="nation" okText="确定" cancelText="取消" v-model="baseData.nation"
-                        interface="action-sheet" placeholder="请选择民族" style="width:100%;text-align:left;">
-              <ion-select-option v-for=" (it,key) in nationList" :key="key" :value="it.code">
+        </div>
+        <div v-if="expand">
+          <div class="form-select">
+            <ion-label>民族</ion-label>
+            <ion-select name="nationID"  id="nationID" okText="确定" cancelText="取消" v-model="baseData.nation"
+                        interface="action-sheet" placeholder="请选择民族" style="width:100%;text-align:left;" >
+              <ion-select-option v-for=" (it,key) in nationTypeList" :key="key" :value="it.name">
                 {{ it.name }}
               </ion-select-option>
-            </ion-select>-->
-          </ion-item>
-          <ion-label class="title-item">政治面貌</ion-label>
-          <ion-item>
+            </ion-select>
+<!--            <ion-input name="nation" id="nation"  style="text-align: left;" class="custom"  :clear-input="true"
+                       v-model="baseData.nation" placeholder="请输入民族" ></ion-input>-->
+          </div>
+          <div class="form-select">
+          <ion-label>政治面貌</ion-label>
             <ion-select name="politicsStatusID"  id="politicsStatusID" okText="确定" cancelText="取消" v-model="baseData.politicsStatusID"
                         interface="action-sheet" placeholder="请选择政治面貌" style="width:100%;text-align:left;" >
               <ion-select-option v-for=" (it,key) in politicsStatusList" :key="key" :value="it.value">
                 {{ it.name }}
               </ion-select-option>
             </ion-select>
-          </ion-item>
-          <ion-label class="title-item">出生地</ion-label>
-          <ion-item>
+          </div>
+          <div class="form-input">
+          <ion-label>出生地</ion-label>
             <ion-input name="birthPlace" id="birthPlace"  style="text-align: left;" class="custom" :clear-input="true"
                        v-model="baseData.birthPlace" placeholder="请输入出生地" ></ion-input>
-          </ion-item>
-          <ion-label class="title-item">出生日期</ion-label>
-          <ion-item>
-            <ion-datetime-button datetime="birthDay" style="background-color: white;"></ion-datetime-button>
+          </div>
+<!--          <div class="form-input">
+            <ion-label>出生日期</ion-label>
+            <ion-datetime-button datetime="birthDay" style="position:relative;right:110px;"></ion-datetime-button>
             <ion-modal :keep-contents-mounted="true">
               <ion-datetime name="birthDay" id="birthDay" placeholder="日期"
                             v-model="baseData.birthDay"  :prefer-wheel="true"
@@ -134,179 +151,180 @@
                             :show-default-buttons="true">
               </ion-datetime>
             </ion-modal>
-          </ion-item>
-          <ion-label class="title-item">户口性质</ion-label>
-          <ion-item>
+          </div>-->
+          <div class="form-select">
+            <ion-label>户口性质</ion-label>
             <ion-select name="familyNatureID"  id="familyNatureID" okText="确定" cancelText="取消" v-model="baseData.familyNatureID"
                         interface="action-sheet" placeholder="请选择户口性质" style="width:100%;text-align:left;">
               <ion-select-option v-for=" (it,key) in familyNatureList" :key="key" :value="it.value">
                 {{ it.name }}
               </ion-select-option>
             </ion-select>
-          </ion-item>
-          <ion-label class="title-item">文化程度</ion-label>
-          <ion-item>
+          </div>
+          <div class="form-select">
+          <ion-label>文化程度</ion-label>
             <ion-select name="cultureRank"  id="cultureRank" okText="确定" cancelText="取消" v-model="baseData.cultureRank"
                         interface="action-sheet" placeholder="请选择文化程度" style="width:100%;text-align:left;">
               <ion-select-option v-for=" (it,key) in cultureRankList" :key="key" :value="it.value">
                 {{ it.name }}
               </ion-select-option>
             </ion-select>
-          </ion-item>
-          <ion-label class="title-item">健康状况</ion-label>
-          <ion-item>
+          </div>
+          <div class="form-select">
+            <ion-label>健康状况</ion-label>
             <ion-select name="healthID"  id="healthID" okText="确定" cancelText="取消" v-model="baseData.healthID"
                         interface="action-sheet" placeholder="请选择健康状况" style="width:100%;text-align:left;">
               <ion-select-option v-for=" (it,key) in userHealthList" :key="key" :value="it.value">
                 {{ it.name }}
               </ion-select-option>
             </ion-select>
-          </ion-item>
-          <ion-label class="title-item">血型</ion-label>
-          <ion-item>
+          </div>
+          <div class="form-select">
+            <ion-label>血型</ion-label>
             <ion-select name="bloodTypeID"  id="bloodTypeID" okText="确定" cancelText="取消" v-model="baseData.bloodTypeID"
                         interface="action-sheet" placeholder="请选择血型" style="width:100%;text-align:left;">
               <ion-select-option v-for=" (it,key) in bloodTypeList" :key="key" :value="it.value">
                 {{ it.name }}
               </ion-select-option>
             </ion-select>
-          </ion-item>
-          <ion-label class="title-item">身高(cm)</ion-label>
-          <ion-item>
+          </div>
+          <div class="form-input">
+            <ion-label>身高(cm)</ion-label>
             <ion-input name="height" id="height"  style="text-align: left;"  class="custom" :clear-input="true"
                        placeholder="请输入身高" v-model="baseData.height" ></ion-input>
-          </ion-item>
-          <ion-label class="title-item">视力</ion-label>
-          <ion-item>
+          </div>
+          <div class="form-input">
+            <ion-label>视力</ion-label>
             <ion-input name="vision" id="vision"  style="text-align: left;" class="custom" :clear-input="true"
                        placeholder="如1.0" v-model="baseData.vision" ></ion-input>
-          </ion-item>
-          <ion-label class="title-item">体重(kg)</ion-label>
-          <ion-item>
+          </div>
+          <div class="form-input">
+            <ion-label>体重(kg)</ion-label>
             <ion-input name="weight" id="weight"  style="text-align: left;" class="custom" :clear-input="true"
                        placeholder="请输入体重" v-model="baseData.weight" ></ion-input>
-          </ion-item>
-          <ion-label class="title-item">婚姻状况</ion-label>
-          <ion-item>
+          </div>
+          <div class="form-select">
+            <ion-label>婚姻状况</ion-label>
             <ion-select name="maritalStatusID"  id="maritalStatusID" okText="确定" cancelText="取消" v-model="baseData.maritalStatusID"
                         interface="action-sheet" placeholder="请选择婚姻状况" style="width:100%;text-align:left;">
               <ion-select-option v-for=" (it,key) in maritalStatusList" :key="key" :value="it.value">
                 {{ it.name }}
               </ion-select-option>
             </ion-select>
-          </ion-item>
-          <ion-label class="title-item">省份</ion-label>
-          <ion-item>
+          </div>
+<!--      <div class="form-select">
+            <ion-label>省份</ion-label>
             <ion-select name="provinceCode"  id="provinceCode" okText="确定" cancelText="取消" v-model="baseData.provinceCode"
                         interface="action-sheet" placeholder="请选择省份" style="width:100%;text-align:left;" @change="provinceChange()" >
               <ion-select-option v-for=" (it,key) in provinceList" :key="key" :value="it.value">
                 {{ it.name }}
               </ion-select-option>
             </ion-select>
-          </ion-item>
-          <ion-label class="title-item">市/县</ion-label>
-          <ion-item>
-            <ion-select name="regionCode"  id="regionCode" okText="确定" cancelText="取消" v-model="baseData.regionCode"
-                        interface="action-sheet" placeholder="请选择市/县" style="width:100%;text-align:left;" @ionChange="regionChange()" >
-              <ion-select-option v-for=" (it,key) in regionList" :key="key" :value="it.code">
-                {{ it.name }}
-              </ion-select-option>
-            </ion-select>
-          </ion-item>
-          <ion-label class="title-item">镇/街</ion-label>
-          <ion-item>
-            <ion-select name="streetCode"  id="streetCode" okText="确定" cancelText="取消" v-model="baseData.streetCode"
-                        interface="action-sheet" placeholder="请选择镇/街" style="width:100%;text-align:left;">
-              <ion-select-option v-for=" (it,key) in streetList" :key="key" :value="it.code">
-                {{ it.name }}
-              </ion-select-option>
-            </ion-select>
-          </ion-item>
-          <ion-label class="title-item">联系人</ion-label>
-          <ion-item>
+          </div>-->
+
+          <div class="form-input">
+            <ion-label>联系人员</ion-label>
             <ion-input name="userName" id="userName"  style="text-align: left;" class="custom" :clear-input="true"
-                       placeholder="请输入联系人姓名" v-model="baseData.userName" ></ion-input>
-          </ion-item>
-          <ion-label class="title-item">电子邮箱</ion-label>
-          <ion-item>
+                       placeholder="请输入联系人员" v-model="baseData.userName" ></ion-input>
+          </div>
+          <div class="form-input">
+            <ion-label>电子邮箱</ion-label>
             <ion-input name="email" id="email"  style="text-align: left;" class="custom" :clear-input="true"
                        placeholder="请输入电子邮箱" v-model="baseData.email" ></ion-input>
-          </ion-item>
-          <ion-label class="title-item">家庭住址</ion-label>
-          <ion-item>
-            <ion-textarea name="familyAddress" id="familyAddress"  style="text-align: left;" class="custom" rows="4"
-                          placeholder="请输入家庭住址" v-model="baseData.familyAddress" ></ion-textarea>
-          </ion-item>
-          <ion-label class="title-item">兴趣爱好</ion-label>
-          <ion-item>
-            <ion-textarea name="hobby" id="hobby"  style="text-align: left;" class="custom" rows="4"
-                          placeholder="请输入兴趣爱好" v-model="baseData.hobby" ></ion-textarea>
-          </ion-item>
-        </ion-item-group>
-      </ion-list>
-
-      <ion-list  v-if="curStepData.statusVal==2" >
-        <ion-item>
-          <div class="panel-title2"  slot="start">
-          <div class="item-flag"></div>
-          教育经历
           </div>
-          <ion-buttons slot="end">
-            <ion-icon :icon="addCircleOutline"  class="iconBtn"
-                      @click="onPathForward('./educationEdit',null,null,null,2)"></ion-icon>
-          </ion-buttons>
-        </ion-item>
-        <ion-item v-for="(record,key) in educationList" :key="key" detail
-                  @click="onPathForward('./educationEdit',record.educationID,null,null,2)">
-          <ion-label>
-            <h3>{{record.schoolName}}</h3>
-            <p>{{dayjs(record.schoolTime).format("YYYY-MM-DD")}}至{{dayjs(record.overTime).format("YYYY-MM-DD")}}</p>
-          </ion-label>
-        </ion-item>
-        <b-empty v-if="educationList.length==0"  :loading="loading" />
-      </ion-list>
-
-      <ion-list  v-if="curStepData.statusVal==3" >
-        <ion-item>
-          <div class="panel-title2"  slot="start">
-            <div class="item-flag"></div>
-            工作经验
+          <div class="form-input">
+            <ion-label>家庭住址</ion-label>
+            <ion-textarea name="familyAddress" id="familyAddress"  class="custom" rows="4"
+                          placeholder="请输入家庭住址" v-model="baseData.familyAddress" style="border-bottom: 1px solid #fff2e8;"></ion-textarea>
           </div>
-          <ion-buttons slot="end">
-            <ion-icon :icon="addCircleOutline"  class="iconBtn"
-                      @click="onPathForward('./experienceEdit',null,null,null,3)"></ion-icon>
-          </ion-buttons>
-        </ion-item>
-        <ion-item v-for="(record,key) in experienceList" :key="key" detail
-                  @click="onPathForward('./experienceEdit',null,record.experienceID,null,3)">
-          <ion-label>
-            <h3>{{record.workAddress}}</h3>
-            <p>{{dayjs(record.startTime).format("YYYY-MM-DD")}}至{{dayjs(record.endTime).format("YYYY-MM-DD")}}</p>
-          </ion-label>
-        </ion-item>
-        <b-empty v-if="experienceList.length==0"  :loading="loading" />
-      </ion-list>
-
-      <ion-list  v-if="curStepData.statusVal==4">
-        <ion-item>
-          <div class="panel-title2"  slot="start">
-            <div class="item-flag"></div>
-            求职意向
+          <div class="form-input">
+            <ion-label>兴趣爱好</ion-label>
+            <ion-textarea name="hobby" id="hobby"  class="custom" rows="4"
+                          placeholder="请输入兴趣爱好" v-model="baseData.hobby" style="border-bottom: 1px solid #fff2e8;" ></ion-textarea>
           </div>
-          <ion-buttons slot="end">
-            <ion-icon :icon="addCircleOutline" class="iconBtn"
-                      @click="onPathForward('./jobHuntEdit',null,null,null,4)"></ion-icon>
-          </ion-buttons>
-        </ion-item>
-        <ion-item  v-for="(record,key) in jobHuntList" :key="key" detail
-                   @click="onPathForward( './jobHuntEdit',null,null,record.jobHuntID,4)">
-          <ion-label>
-            <h3>{{record.postName}}</h3>
-            <p>期望薪资:{{record.minSalary}}-{{record.maxSalary}}</p>
-          </ion-label>
-        </ion-item>
-        <b-empty  v-if="jobHuntList.length==0"  :loading="loading" />
+        </div>
       </ion-list>
+
+          <ion-list  v-if="curStepData.statusVal==2" >
+            <div class="form-title">
+              教育经历
+              <ion-icon :icon="addCircleOutline"  class="iconBtn" style="float:right;"
+                        @click="onPathForward('./educationEdit',null,null,null,2)"></ion-icon>
+            </div>
+            <div class="bw-vue-list">
+              <div class="list-content" v-if="!loading">
+                <ion-list>
+                  <div v-for="(record,key) in educationList" :key="key" >
+                    <ion-item-sliding>
+                      <ion-item detail @click="onPathForward('./educationEdit',record.educationID,null,null,2)">
+                        <ion-label>
+                          <h2>{{record.schoolName}}</h2>
+                          <p>{{dayjs(record.schoolTime).format("YYYY-MM-DD")}}至{{dayjs(record.overTime).format("YYYY-MM-DD")}}</p>
+                        </ion-label>
+                      </ion-item>
+                      <ion-item-options>
+                        <ion-item-option color="danger" @click="setDelAlertOpen(true, record.educationID)">
+                          <ion-icon :icon="trashOutline"></ion-icon>
+                        </ion-item-option>
+                      </ion-item-options>
+                    </ion-item-sliding>
+                  </div>
+                </ion-list>
+              </div>
+            </div>
+            <b-empty v-if="educationList.length==0"  :loading="loading" />
+          </ion-list>
+
+          <ion-list  v-if="curStepData.statusVal==3" >
+            <div class="form-title">
+              工作经验
+              <ion-icon :icon="addCircleOutline"  class="iconBtn" style="float:right;"
+                        @click="onPathForward('./experienceEdit',null,null,null,3)"></ion-icon>
+            </div>
+            <div class="bw-vue-list">
+              <div class="list-content" v-if="!loading">
+                <ion-list>
+                  <div v-for="(record,key) in experienceList" :key="key">
+                    <ion-item-sliding>
+                      <ion-item detail @click="onPathForward('./experienceEdit',null,record.experienceID,null,3)">
+                        <ion-label>
+                          <h2>{{record.workAddress}}</h2>
+                          <p>{{dayjs(record.startTime).format("YYYY-MM-DD")}}至{{dayjs(record.endTime).format("YYYY-MM-DD")}}</p>
+                        </ion-label>
+                      </ion-item>
+                      <ion-item-options>
+                        <ion-item-option color="danger" @click="setDelAlertOpen(true, record.experienceID)">
+                          <ion-icon :icon="trashOutline"></ion-icon>
+                        </ion-item-option>
+                      </ion-item-options>
+                    </ion-item-sliding>
+                  </div>
+                </ion-list>
+              </div>
+            </div>
+            <b-empty v-if="experienceList.length==0"  :loading="loading" />
+          </ion-list>
+
+          <ion-list  v-if="curStepData.statusVal==4">
+            <ion-item>
+              <div class="panel-title2"  slot="start">
+                <div class="item-flag"></div>
+                求职意向
+              </div>
+              <ion-buttons slot="end">
+                <ion-icon :icon="addCircleOutline" class="iconBtn"
+                          @click="onPathForward('./jobHuntEdit',null,null,null,4)"></ion-icon>
+              </ion-buttons>
+            </ion-item>
+            <ion-item  v-for="(record,key) in jobHuntList" :key="key" detail
+                       @click="onPathForward( './jobHuntEdit',null,null,record.jobHuntID,4)">
+              <ion-label>
+                <h3>{{record.postName}}</h3>
+                <p>期望薪资:{{record.minSalary}}-{{record.maxSalary}}</p>
+              </ion-label>
+            </ion-item>
+            <b-empty  v-if="jobHuntList.length==0"  :loading="loading" />
+          </ion-list>
         <!--<ion-refresher pulling-text="下拉刷新" @ionRefresh="onRefresh"></ion-refresher>-->
         <ion-infinite-scroll v-if="curStepData.statusVal!=1" threshold="100px" @ionInfinite="onScroll($event)">
           <ion-infinite-scroll-content
@@ -314,19 +332,45 @@
               loadingSpinner="bubbles">
           </ion-infinite-scroll-content>
         </ion-infinite-scroll>
+        </div>
+      </form>
     </ion-content>
     <ion-footer>
       <ion-toolbar>
-        <div slot="end">
-          <ion-button shape="round" expand="block" @click="onSave"   v-if="curStepData.statusVal!=4">下一步</ion-button>
-          <ion-button shape="round" expand="block" @click="onFinish" v-if="curStepData.statusVal==4">完  成</ion-button>
+          <ion-button style="width: 100%;" @click="onSave" v-if="curStepData.statusVal==1">保存并下一步</ion-button>
+        <div v-if="curStepData.statusVal!=1" >
+          <ion-button style="width: 48%;float:left;margin-left: 1%;" @click="onBack" >上一步</ion-button>
+          <ion-button style="width: 48%;margin-right: 1%;" @click="onSave"   v-if="curStepData.statusVal!=4">下一步</ion-button>
+          <ion-button style="width: 48%;margin-right: 1%;" @click="onFinish" v-if="curStepData.statusVal==4">完  成</ion-button>
         </div>
+
       </ion-toolbar>
     </ion-footer>
+
+    <ion-alert
+        :is-open="delAlertOpen"
+        header="删除确认"
+        message="确定要删除该信息吗?"
+        :buttons="delAlertButtons"
+        @didDismiss="setDelAlertOpen(false, null)"
+    ></ion-alert>
+
+    <ion-alert
+        :is-open="infoAlertOpen"
+        :header="infoAlterData.title"
+        :message="infoAlterData.message"
+        :buttons="infoAlertButtons"
+        @didDismiss="setInfoAlertOpen(false)"
+    ></ion-alert>
+    <ion-loading
+        :is-open="delLoading"
+        message="删除中..."
+        @didDismiss="setDelLoadingOpen(false)" >
+    </ion-loading>
   </ion-page>
 </template>
 <script lang="ts">
-import {chevronDownOutline, chevronUpOutline,arrowBackOutline,addCircleOutline} from 'ionicons/icons';
+import {chevronDownOutline, chevronUpOutline,arrowBackOutline,addCircleOutline,trashOutline} from 'ionicons/icons';
 import {reactive,defineComponent, computed,watch,ref,toRefs} from "vue";
 import {useRoute, useRouter} from "vue-router";
 import {required} from "@vuelidate/validators";
@@ -340,6 +384,7 @@ import {getSiteDataList} from "@/api/siteInfo";
 import {getSysDictionaryList} from '@/api/system/dictionary';
 import {alertController, onIonViewDidEnter} from "@ionic/vue";
 import dayjs from "dayjs";
+import {post} from "@/api/common";
 
 interface SelectProps {
   name: string,
@@ -376,7 +421,7 @@ export default defineComponent({
     const bloodTypeList  = ref<SelectProps[]>([]);
     const maritalStatusList  = ref<SelectProps[]>([]);
     const provinceList  = ref<SelectProps[]>([{name:'广东省',value:'440000000000000'}]);
-    /*const nationList  = ref([{code:'001',name:'汉族'}]);*/
+    const nationTypeList  = ref<SelectProps[]>([]);
     const familyNatureList = ref([]);
     const politicsStatusList = ref([]);
     const regionList  = ref<SelectProps[]>([]);
@@ -440,7 +485,79 @@ export default defineComponent({
     const expandChange= ()=>{
       expand.value = !expand.value;
     }
+    // 删除警告弹窗开关
+    const delAlertOpen = ref(false);
+
+    // 删除数据
+    const delID = ref("");
+    const postUrl = ref("jobUserService/education/deleteEducation");
+    const actionName = ref("删除教育经历信息");
+    // 删除加载
+    const delLoading = ref(false);
+    // 信息弹窗开关
+    const infoAlertOpen = ref(false);
+    // 删除警告弹窗按钮定义
+    const infoAlertButtons = [
+      {
+        text: '确定',
+        role: 'confirm',
+        handler: () => {
+          reload(baseInfoData.baseData.jobUserID,curStepData.value.statusVal);
+        },
+      },
+    ];
+    // 设置要删除的教育经历
+    function setDelAlertOpen(value: boolean, id: any) {
+      delAlertOpen.value = value;
+      if(id != null) {
+        delID.value = id;
+      }
+    }
+    // 设置信息提示弹窗开关
+    function setInfoAlertOpen(value: boolean) {
+      infoAlertOpen.value = value;
+    }
+    // 设置删除弹窗开启关闭
+    function setDelLoadingOpen(value: boolean) {
+      delLoading.value = value;
+    }
+    // 信息弹窗内容
+    const infoAlterData = reactive({
+      title:"",
+      message:""
+    });
 
+    // 删除警告弹窗按钮定义
+    const delAlertButtons = [
+      {
+        text: '取消',
+        role: 'cancel',
+        handler: () => {
+           console.log("取消了删除");
+        },
+      },
+      {
+        text: '确定',
+        role: 'confirm',
+        handler: () => {
+          delLoading.value = true;
+          postUrl.value = "jobUserService/education/deleteEducation";
+          actionName.value = "删除教育经历";
+          if(curStepData.value.statusVal!=2){
+            postUrl.value = curStepData.value.statusVal==3 ?"jobUserService/experience/deleteExperience":"jobUserService/jobHunt/deleteJobHunt";
+            actionName.value = curStepData.value.statusVal==3 ?"删除工作经验":"删除求职意向";
+          }
+          post(postUrl.value,[delID.value],actionName.value).then((res) => {
+            /*infoAlterData.title = "提示";
+            infoAlterData.message = "删除成功";
+            setInfoAlertOpen(true);*/
+          }).finally(()=>{
+            delLoading.value = false;
+            reload(baseInfoData.baseData.jobUserID,curStepData.value.statusVal);
+          });
+        },
+      },
+    ];
     const presentAlert = async (message: string) => {
       const alert = await alertController.create({
         header: '错误!',
@@ -479,7 +596,7 @@ export default defineComponent({
         }
       }
       const emailReg = /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/;
-      if(baseInfoData.baseData.email!=""){
+      if(baseInfoData.baseData.email!=""&&baseInfoData.baseData.email!=null){
         if(!emailReg.test(baseInfoData.baseData.email)){
           presentAlert("输入的电子邮箱有误!");
           isAllowCommit.value = false;
@@ -548,6 +665,8 @@ export default defineComponent({
       politicsStatusList.value = politicsStatusResult;
       const familyNatureResult :any = await getSysDictionaryList("FamilyNature");
       familyNatureList.value = familyNatureResult;
+      const nationTypeListResult :any = await getSysDictionaryList("NationType");
+      nationTypeList.value = nationTypeListResult;
     }
 
     const getSiteInfoList = async function(){
@@ -630,6 +749,7 @@ export default defineComponent({
       chevronUpOutline,
       arrowBackOutline,
       addCircleOutline,
+      trashOutline,
       route,
       router,
       expand,
@@ -639,7 +759,7 @@ export default defineComponent({
       baseDataValid,
       siteInfoList,
       genderList,
-      /*nationList,*/
+      nationTypeList,
       familyNatureList,
       politicsStatusList,
       pageParams,
@@ -655,6 +775,13 @@ export default defineComponent({
       educationList,
       experienceList,
       jobHuntList,
+      delID,
+      delAlertButtons,
+      infoAlertButtons,
+      delAlertOpen,
+      infoAlertOpen,
+      delLoading,
+      infoAlterData,
       expandChange,
       provinceChange,
       regionChange,
@@ -665,6 +792,9 @@ export default defineComponent({
       onPathForward,
       loadData,
       reload,
+      setDelAlertOpen,
+      setInfoAlertOpen,
+      setDelLoadingOpen,
       getSiteInfoList,
       getSelectorDataList,
       getRegionList,
@@ -683,8 +813,7 @@ export default defineComponent({
 <style lang="less">
 .custom{
   --placeholder-color: gray;
-  --placeholder-font-style:italic;
-  --placeholder-opacity: 1;
+  --placeholder-opacity: 0.5;
 }
 
 .title-item{

+ 45 - 49
h5app/src/views/pages/jobhunt/educationEdit.vue

@@ -1,6 +1,6 @@
 <template>
   <ion-page>
-    <ion-header>
+    <ion-header class="header-theme2">
       <ion-toolbar>
         <ion-buttons slot="start">
           <ion-icon :icon="arrowBackOutline" @click="onCancel" style="padding-left:10px;width:24px;height:24px;"></ion-icon>
@@ -21,67 +21,64 @@
           </div>
         </div>
       </div>
+
       <form ref="editForm" @submit.prevent="onSave">
-        <ion-list class="canvasWrapper" >
-          <ion-item-group>
-            <ion-item>
-              <div class="panel-title2">
-                <div class="item-flag"></div>
-                教育经历
-              </div>
-            </ion-item>
-            <ion-label class="title-item">毕业院校/培训机构<span class="danger">*</span></ion-label>
-            <ion-item :class="[educationValid.dataModel.schoolName.$error?'ion-invalid':'ion-valid']">
-              <ion-input name="schoolName" id="schoolName" style="text-align: left;" class="custom"
+        <div class="bw-vue-form">
+          <ion-list class="canvasWrapper" >
+          <div class="form-title">教育经历</div>
+            <div class="form-input">
+              <ion-label>毕业院校/培训机构<span class="danger">*</span></ion-label>
+              <ion-input name="schoolName" id="schoolName"  class="custom"
                          placeholder="请输入毕业院校/培训机构" v-model="dataModel.schoolName" ></ion-input>
-              <ion-note slot="error">毕业院校/培训机构不能为空</ion-note>
-            </ion-item>
-            <ion-label class="title-item">最高学历<span class="danger">*</span></ion-label>
-            <ion-item :class="[educationValid.dataModel.cultureRank.$error?'ion-invalid':'ion-valid']">
+<!--              <ion-note slot="error">毕业院校/培训机构不能为空</ion-note>-->
+            </div>
+            <div class="form-select">
+              <ion-label>最高学历<span class="danger">*</span></ion-label>
               <ion-select name="cultureRank"  id="cultureRank" okText="确定" cancelText="取消" v-model="dataModel.cultureRank"
                           interface="action-sheet" placeholder="请选择最高学历" style="width:100%;text-align:left;">
                 <ion-select-option v-for=" (it,key) in cultureRankList" :key="key" :value="it.value">
                   {{ it.name }}
                 </ion-select-option>
               </ion-select>
-              <ion-note slot="error">最高学历不能为空</ion-note>
-            </ion-item>
-            <ion-label class="title-item">专业<span class="danger">*</span></ion-label>
-            <ion-item :class="[educationValid.dataModel.major.$error?'ion-invalid':'ion-valid']">
-              <ion-input name="major" id="major" style="text-align: left;" class="custom"
+<!--              <ion-note slot="error">最高学历不能为空</ion-note>-->
+            </div>
+<!--            <ion-item :class="[educationValid.dataModel.cultureRank.$error?'ion-invalid':'ion-valid']"></ion-item>-->
+            <div class="form-input">
+              <ion-label>专业<span class="danger">*</span></ion-label>
+              <ion-input name="major" id="major"  class="custom"
                          placeholder="请输入专业" v-model="dataModel.major" ></ion-input>
-              <ion-note slot="error">专业不能为空</ion-note>
-            </ion-item>
-            <ion-label class="title-item">起止日期<span class="danger">*</span></ion-label>
-            <ion-item mode="md">
-              <ion-datetime-button datetime="schoolTime"></ion-datetime-button>
-              <ion-modal :keep-contents-mounted="true">
-                <ion-datetime id="schoolTime" placeholder="日期"
-                              v-model="dataModel.schoolTime" :prefer-wheel="true"
-                              dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
-                              :show-default-buttons="true">
-                </ion-datetime>
-              </ion-modal>
-              至
-              <ion-datetime-button datetime="overTime"></ion-datetime-button>
-              <ion-modal :keep-contents-mounted="true">
-                <ion-datetime id="overTime" placeholder="日期"
-                              v-model="dataModel.overTime" :prefer-wheel="true"
-                              dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
-                              :show-default-buttons="true">
-                </ion-datetime>
-              </ion-modal>
+<!--              <ion-note slot="error">专业不能为空</ion-note>-->
+            </div>
+            <div class="form-input">
+              <ion-label>起止日期<span class="danger">*</span></ion-label>
+              <div>
+                <ion-datetime-button datetime="schoolTime" style="float:left;"></ion-datetime-button>
+                <span style="float:left;padding-top: 5px;">至</span>
+                <ion-datetime-button datetime="overTime" style="float:left;"></ion-datetime-button>
+                <ion-modal :keep-contents-mounted="true">
+                  <ion-datetime id="schoolTime" placeholder="日期"
+                                v-model="dataModel.schoolTime" :prefer-wheel="true"
+                                dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
+                                :show-default-buttons="true">
+                  </ion-datetime>
+                </ion-modal>
+                <ion-modal :keep-contents-mounted="true">
+                  <ion-datetime id="overTime" placeholder="日期"
+                                v-model="dataModel.overTime" :prefer-wheel="true"
+                                dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
+                                :show-default-buttons="true">
+                  </ion-datetime>
+                </ion-modal>
+              </div>
               <!--<ion-note slot="error">起止日期不能为空</ion-note>-->
-            </ion-item>
-          </ion-item-group>
+            </div>
         </ion-list>
+        </div>
       </form>
     </ion-content>
     <ion-footer>
       <ion-toolbar>
-        <div slot="end">
-          <ion-button shape="round" expand="block"  @click="onSave" >保  存</ion-button>
-        </div>
+          <ion-button style="width:100%;"  @click="onSave" >保  存</ion-button>
       </ion-toolbar>
     </ion-footer>
     <ion-loading
@@ -230,8 +227,7 @@ export default defineComponent({
 
 ion-input.custom{
   --placeholder-color: gray;
-  --placeholder-font-style:oblique;
-  --placeholder-opacity: 1;
+  --placeholder-opacity: 0.5;
 }
 
 .title-item{

+ 50 - 50
h5app/src/views/pages/jobhunt/experienceEdit.vue

@@ -1,6 +1,6 @@
 <template>
   <ion-page>
-    <ion-header>
+    <ion-header class="header-theme2">
       <ion-toolbar>
         <ion-buttons slot="start">
           <ion-icon :icon="arrowBackOutline" @click="onCancel" style="padding-left:10px;width:24px;height:24px;"></ion-icon>
@@ -21,62 +21,63 @@
           </div>
         </div>
       </div>
+
       <form ref="editForm" @submit.prevent="onSave">
-        <ion-list class="canvasWrapper" >
-          <ion-item-group>
-            <ion-item>
-              <div class="panel-title2">
-                <div class="item-flag"></div>
-                工作经验
-              </div>
-            </ion-item>
-            <ion-label class="title-item">工作单位<span class="danger">*</span></ion-label>
-            <ion-item :class="[experienceValid.dataModel.workAddress.$error?'ion-invalid':'ion-valid']">
+
+        <div class="bw-vue-form">
+          <ion-list class="canvasWrapper" >
+            <div class="form-title">教育经历</div>
+
+            <div class="form-input">
+              <ion-label>工作单位<span class="danger">*</span></ion-label>
               <ion-input name="workAddress" id="workAddress" style="text-align: left;" class="custom"
                          placeholder="请输入工作单位" v-model="dataModel.workAddress" ></ion-input>
-              <ion-note slot="error">工作单位不能为空</ion-note>
-            </ion-item>
-            <ion-label class="title-item">职务<span class="danger">*</span></ion-label>
-            <ion-item :class="[experienceValid.dataModel.duties.$error?'ion-invalid':'ion-valid']">
+<!--              <ion-note slot="error">工作单位不能为空</ion-note>-->
+            </div>
+
+            <div class="form-input">
+              <ion-label>职务<span class="danger">*</span></ion-label>
               <ion-input name="duties" id="duties" style="text-align: left;" class="custom"
                          placeholder="请输入职务" v-model="dataModel.duties" ></ion-input>
-              <ion-note slot="error">职务不能为空</ion-note>
-            </ion-item>
-            <ion-label class="title-item">工作内容<span class="danger">*</span></ion-label>
-            <ion-item :class="[experienceValid.dataModel.workOffice.$error?'ion-invalid':'ion-valid']">
-              <ion-textarea name="workOffice" id="workOffice"  style="text-align: left;" class="custom" rows="4"
-                            placeholder="请输入工作内容" v-model="dataModel.workOffice" ></ion-textarea>
-              <ion-note slot="error">工作内容不能为空</ion-note>
-            </ion-item>
-            <ion-label class="title-item">起止日期<span class="danger">*</span></ion-label>
-            <ion-item mode="md">
-              <ion-datetime-button datetime="startTime"></ion-datetime-button>
-              <ion-modal :keep-contents-mounted="true">
-                <ion-datetime id="startTime" placeholder="日期"
-                              v-model="dataModel.startTime" :prefer-wheel="true"
-                              dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
-                              :show-default-buttons="true">
-                </ion-datetime>
-              </ion-modal>
-              至
-              <ion-datetime-button datetime="endTime"></ion-datetime-button>
-              <ion-modal :keep-contents-mounted="true">
-                <ion-datetime id="endTime" placeholder="日期"
-                              v-model="dataModel.endTime" :prefer-wheel="true"
-                              dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
-                              :show-default-buttons="true">
-                </ion-datetime>
-              </ion-modal>
-            </ion-item>
-          </ion-item-group>
-        </ion-list>
+<!--              <ion-note slot="error">职务不能为空</ion-note>-->
+            </div>
+
+            <div class="form-input">
+            <ion-label>工作内容<span class="danger">*</span></ion-label>
+              <ion-textarea name="workOffice" id="workOffice"  class="custom" rows="4"
+                            placeholder="请输入工作内容" v-model="dataModel.workOffice" style="border-bottom: 1px solid #fff2e8;"></ion-textarea>
+<!--              <ion-note slot="error">工作内容不能为空</ion-note>-->
+            </div>
+
+            <div class="form-input">
+              <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 id="startTime" placeholder="日期"
+                                v-model="dataModel.startTime" :prefer-wheel="true"
+                                dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
+                                :show-default-buttons="true">
+                  </ion-datetime>
+                </ion-modal>
+                <ion-modal :keep-contents-mounted="true">
+                  <ion-datetime id="endTime" placeholder="日期"
+                                v-model="dataModel.endTime" :prefer-wheel="true"
+                                dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
+                                :show-default-buttons="true">
+                  </ion-datetime>
+                </ion-modal>
+              </div>
+            </div>
+          </ion-list>
+        </div>
       </form>
     </ion-content>
     <ion-footer>
       <ion-toolbar>
-        <div slot="end">
-          <ion-button shape="round" expand="block"  @click="onSave" >保  存</ion-button>
-        </div>
+          <ion-button style="width:100%;" @click="onSave" >保  存</ion-button>
       </ion-toolbar>
     </ion-footer>
     <ion-loading
@@ -219,8 +220,7 @@ export default defineComponent({
 
 ion-input.custom{
   --placeholder-color: gray;
-  --placeholder-font-style:oblique;
-  --placeholder-opacity: 1;
+  --placeholder-opacity: 0.5;
 }
 
 .title-item{

+ 167 - 19
h5app/src/views/pages/jobhunt/list.vue

@@ -5,7 +5,7 @@
         <ion-buttons slot="start">
           <ion-icon :icon="arrowBackOutline" @click="onBack"></ion-icon>
         </ion-buttons>
-        <ion-title>求职信息收集</ion-title>
+        <ion-title>求职人员信息</ion-title>
         <ion-buttons slot="end">
           <ion-icon :icon="addCircleOutline" @click="onAdd"></ion-icon>
         </ion-buttons>
@@ -17,17 +17,38 @@
                     v-model="searchParams.name" style="border: 1px solid #f2f2f5;border-radius: 14px;--padding-start: 10px;height: 35px;"></ion-input>
         <ion-button slot="end" style="height: 33px;width: 70px;margin-left: 10px;--box-shadow: none;--border-radius: 14px;" @click="reload">搜索</ion-button>
       </ion-item>
-      <ion-list  class="list-content" >
-        <ion-item v-for="(record,key) in dataList" :key="key" detail  @click="onDetail(record.jobUserID)">
-          <ion-avatar aria-hidden="true" slot="start">
-            <img alt="" src="@/assets/icon/avatar.svg" />
-          </ion-avatar>
-          <ion-label>
-            <h3>{{ record.name }}</h3>
-            <p>已推荐岗位:{{record.recommendedCount}}</p>
-          </ion-label>
-        </ion-item>
-      </ion-list>
+
+      <div class="bw-vue-list">
+        <div class="list-content" v-if="!loading">
+          <ion-list>
+            <div v-for="(record,key) in dataList" :key="key">
+              <ion-item-sliding>
+                <ion-item detail  @click="onDetail(record.jobUserID)">
+                  <ion-label>
+                    <div class="multi-title">
+                      <h2>{{ record.name }}</h2>
+                    </div>
+                    <p>联系电话:{{record.userMobile}}</p>
+                    <p>年龄:{{record.age}}</p>
+                    <div class="multi-title">
+                      <p>性别:{{record.genderName}}</p>
+                      <p>求职岗位数量:{{ record.jobHuntCount }}</p>
+                    </div>
+                  </ion-label>
+                </ion-item>
+                <ion-item-options>
+                  <ion-item-option @click="onEdit(record.jobUserID)">
+                    <ion-icon :icon="buildOutline"></ion-icon>
+                  </ion-item-option>
+                  <ion-item-option color="danger" @click="setDelAlertOpen(true, record.jobUserID)">
+                    <ion-icon :icon="trashOutline"></ion-icon>
+                  </ion-item-option>
+                </ion-item-options>
+              </ion-item-sliding>
+            </div>
+          </ion-list>
+        </div>
+      </div>
       <b-empty v-if="dataList.length<=0" :loading="loading"/>
       <ion-infinite-scroll threshold="100px" @ionInfinite="onScroll($event)">
         <ion-infinite-scroll-content
@@ -36,6 +57,27 @@
         </ion-infinite-scroll-content>
       </ion-infinite-scroll>
     </ion-content>
+
+    <ion-alert
+        :is-open="delAlertOpen"
+        header="删除确认"
+        message="确定要删除该求职人员吗?"
+        :buttons="delAlertButtons"
+        @didDismiss="setDelAlertOpen(false, null)"
+    ></ion-alert>
+
+    <ion-alert
+        :is-open="infoAlertOpen"
+        :header="infoAlterData.title"
+        :message="infoAlterData.message"
+        :buttons="infoAlertButtons"
+        @didDismiss="setInfoAlertOpen(false)"
+    ></ion-alert>
+    <ion-loading
+        :is-open="delLoading"
+        message="删除中..."
+        @didDismiss="setDelLoadingOpen(false)" >
+    </ion-loading>
   </ion-page>
 </template>
 
@@ -43,8 +85,11 @@
 import {useRouter} from "vue-router";
 import {computed, defineComponent, reactive, ref} from 'vue';
 import {arrowBackOutline,addCircleOutline} from 'ionicons/icons';
+import {chevronForwardOutline,buildOutline,trashOutline} from 'ionicons/icons';
 import {IonIcon, onIonViewDidEnter} from '@ionic/vue';
 import {getJobUserList} from "@/api/jobUserInfo";
+import {getJobHuntListByJobUserID} from "@/api/jobHuntInfo";
+import {post} from "@/api/common";
 
 export default defineComponent({
   name: 'jobUserList',
@@ -65,12 +110,36 @@ export default defineComponent({
     });
     const dataList = ref<any>([]);
     const colors = ref(["secondary", "tertiary", "success", "warning"]);
-
+    const calculateAge = (idCardNumber:string) => {
+      // 假设身份证号中出生日期的格式为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--; // 生日还未过,减去一岁
+      }
+      return age;
+    }
     const loadData = async function () {
       loading.value = true;
       getJobUserList(searchParams).then(data=>{
         dataList.value = dataList.value.concat(data.list);
-        console.log("dataList",dataList.value);
+        (dataList.value as any[]).map(item=>{
+          if(item.identityNumber){
+            item.age = calculateAge(item.identityNumber)+"岁";
+          }
+          getJobHuntListByJobUserID({pageIndex:1,pageSize:10000,jobUserID:item.jobUserID}).then(data=>{
+            item.jobHuntCount = data.total;
+          });
+        });
+        //console.log("dataList",dataList.value);
         total.value = data.total;
       });
       loading.value = false;
@@ -99,9 +168,74 @@ export default defineComponent({
     const onBack =()=>{
       router.push('../');
     }
+    // 信息弹窗内容
+    const infoAlterData = reactive({
+      title:"",
+      message:""
+    });
+    // 删除警告弹窗开关
+    const delAlertOpen = ref(false);
+    // 删除警告弹窗按钮定义
+    const infoAlertButtons = [
+      {
+        text: '确定',
+        role: 'confirm',
+        handler: () => {
+          reload();
+        },
+      },
+    ];
 
-
-    const onDetail = (jobUserID:string) =>{
+    // 删除数据
+    const delJobUserID = ref("");
+    // 删除加载
+    const delLoading = ref(false);
+    // 信息弹窗开关
+    const infoAlertOpen = ref(false);
+    // 删除警告弹窗按钮定义
+    const delAlertButtons = [
+      {
+        text: '取消',
+        role: 'cancel',
+        handler: () => {
+          reload();
+        },
+      },
+      {
+        text: '确定',
+        role: 'confirm',
+        handler: () => {
+          delLoading.value = true;
+          post("jobUserService/jobUser/delete",[delJobUserID.value],"求职人员信息删除").then((res) => {
+            infoAlterData.title = "提示";
+            infoAlterData.message = "删除成功";
+            setInfoAlertOpen(true);
+          }).finally(()=>{
+            delLoading.value = false;
+            reload();
+          });
+        },
+      },
+    ];
+    // 设置要删除的求职人员
+    function setDelAlertOpen(value: boolean, jobUserID: any) {
+      delAlertOpen.value = value;
+      if(jobUserID != null) {
+        delJobUserID.value = jobUserID;
+      }
+    }
+    // 设置信息提示弹窗开关
+    function setInfoAlertOpen(value: boolean) {
+      infoAlertOpen.value = value;
+    }
+    // 设置删除弹窗开启关闭
+    function setDelLoadingOpen(value: boolean) {
+      delLoading.value = value;
+    }
+    const onDetail = (jobUserID: string) => {
+      router.push({path: './detail', query: {reload: 1, id: jobUserID}});
+    }
+    const onEdit = (jobUserID:string) =>{
       router.push({path: './edit', query: {reload:1,jobUserID: jobUserID,status: 1}});
     }
 
@@ -112,6 +246,9 @@ export default defineComponent({
     return {
       arrowBackOutline,
       addCircleOutline,
+      chevronForwardOutline,
+      buildOutline,
+      trashOutline,
       router,
       colors,
       total,
@@ -119,12 +256,23 @@ export default defineComponent({
       pagination,
       searchParams,
       dataList,
+      delJobUserID,
+      delAlertButtons,
+      infoAlertButtons,
+      delAlertOpen,
+      infoAlertOpen,
+      delLoading,
+      infoAlterData,
       onAdd,
       onBack,
       onDetail,
+      onEdit,
       onScroll,
       loadData,
       reload,
+      setDelAlertOpen,
+      setInfoAlertOpen,
+      setDelLoadingOpen,
     }
   }
 });
@@ -141,7 +289,9 @@ ion-input.custom{
   margin: 10px 0;
   font-size: 14px;
   ion-input{
-    border: 1px solid #f2f2f5;border-radius: 4px;--padding-start: 10px;
+    border: 1px solid #f2f2f5;
+    border-radius: 4px;
+    --padding-start: 10px;
     width: 100px;
   }
 
@@ -156,9 +306,7 @@ ion-input.custom{
     background-color: white !important;
     border-radius: 0 !important;
     ion-item{
-      margin-top: 10px;
       font-size: 14px;
-      border: 1px solid rgb(242, 242, 245);
       p{
         font-size: 12px;
       }

+ 35 - 0
h5app/src/views/sapp/about.vue

@@ -0,0 +1,35 @@
+<template>
+  <ion-page class="edit-page">
+    <ion-header class="header-theme2">
+      <ion-toolbar>
+        <ion-buttons slot="start">
+          <ion-icon :icon="arrowBackOutline" @click="()=>router.go(-1)"></ion-icon>
+        </ion-buttons>
+        <ion-title>关于我们</ion-title>
+      </ion-toolbar>
+    </ion-header>
+    <ion-content>
+      <div class="bw-vue-form">
+        <div class="form-title">关于我们</div>
+        <div class="form-detail">
+          <ion-label>当前版本</ion-label>
+          <ion-text>V1.1</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>技术支持</ion-label>
+          <ion-text>同略科技</ion-text>
+        </div>
+      </div>
+    </ion-content>
+  </ion-page>
+</template>
+
+<script setup lang="ts">
+
+import {arrowBackOutline} from "ionicons/icons";
+import router from "@/router";
+</script>
+
+<style scoped>
+
+</style>

+ 1 - 1
h5app/src/views/sapp/tabUser.vue

@@ -72,7 +72,7 @@
             </ion-item>
             <ion-item class="item-menu" detail mode="md">
               <img src="@/assets/icon/gywm.png">
-              <ion-label>关于我们</ion-label>
+              <ion-label @click="router.push('/tabs/tabUser/about')">关于我们</ion-label>
             </ion-item>
           </div>
         </div>

+ 18 - 4
src/main/java/com/hz/employmentsite/controller/baseSettings/SiteUserController.java

@@ -1,6 +1,7 @@
 package com.hz.employmentsite.controller.baseSettings;
 
 import com.github.pagehelper.PageInfo;
+import com.hz.employmentsite.filter.exception.BaseErrorEnum;
 import com.hz.employmentsite.filter.exception.BaseResponse;
 import com.hz.employmentsite.filter.exception.RespGenerstor;
 import com.hz.employmentsite.model.SelectProps;
@@ -10,6 +11,7 @@ import com.hz.employmentsite.util.ExcelHelper;
 import com.hz.employmentsite.vo.baseSettings.SiteUserVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+
 import javax.servlet.http.HttpServletResponse;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -36,9 +38,10 @@ public class SiteUserController {
                                                       @RequestParam(required = false) String siteUserName,
                                                       @RequestParam(required = false) String siteID,
                                                       @RequestParam(required = false) String roleName,
-                                                      @RequestParam(required = false) String regionCode) {
+                                                      @RequestParam(required = false) String regionCode,
+                                                      @RequestParam(required = false) String userNo) {
 
-        PageInfo<SiteUserVo> result = userInfoService.getList(pageIndex,pageSize,siteUserIDList,siteUserName,siteID,roleName,regionCode);
+        PageInfo<SiteUserVo> result = userInfoService.getList(pageIndex, pageSize, siteUserIDList, siteUserName, siteID, roleName, regionCode, userNo);
 
         return RespGenerstor.success(result);
     }
@@ -75,7 +78,7 @@ public class SiteUserController {
                                @RequestParam(required = false) List<String> siteUserIDList,
                                @RequestParam(required = false) String siteUserName,
                                @RequestParam(required = false) String siteID) throws Exception{
-        PageInfo<SiteUserVo> result = userInfoService.getList(pageIndex,pageSize,siteUserIDList,siteUserName,siteID, null, null);
+        PageInfo<SiteUserVo> result = userInfoService.getList(pageIndex, pageSize, siteUserIDList, siteUserName, siteID, null, null, null);
         ExcelHelper.ExcelData data = excelHelper.new ExcelData();
         data.setTitles(Arrays.asList(new String[]{"序号","人员名称","角色", "性别", "联系电话","所属驿站"}));
         int i = 0;
@@ -98,9 +101,20 @@ public class SiteUserController {
 
     @ResponseBody
     @PostMapping("/delete")
-    public BaseResponse<Integer> delete(@RequestBody List<String> idList){
+    public BaseResponse<Integer> delete(@RequestBody List<String> idList) {
         return RespGenerstor.success(userInfoService.delete(idList));
     }
 
+    @PostMapping("/importSiteUser")
+    public BaseResponse<Object> importSiteUser(@RequestBody List<SiteUserVo> dataList) {
+        List<SiteUserVo> result = userInfoService.importSiteUser(dataList, accountService.getLoginUserID());
+
+        if (result != null && result.size() > 0) {
+            return RespGenerstor.fail(BaseErrorEnum.IMPORT_DATA_ERROR, result);
+        } else {
+            return RespGenerstor.success(true);
+        }
+    }
+
 
 }

+ 2 - 2
src/main/java/com/hz/employmentsite/controller/companyService/CompanyController.java

@@ -122,8 +122,8 @@ public class CompanyController {
                 row.add(item.streetName);
                 row.add(item.companyCode);
                 row.add(recordName);
-                row.add("");
-                row.add(item.companyModel);
+                row.add(item.insuredCount);
+                row.add(item.companyModelType);
                 row.add(item.postCount);
                 row.add(item.createUserName);
                 row.add(dateUtils.dateToStr(item.createTime));

+ 1 - 1
src/main/java/com/hz/employmentsite/controller/companyService/PostController.java

@@ -134,7 +134,7 @@ public class PostController {
                 List<Object> row = new ArrayList();
                 ++i;
                 row.add(i);
-                row.add(item.postName);
+                row.add(item.professionName);
                 row.add(item.recruitCount);
                 row.add(dateUtils.dateToStr(item.startTime));
                 row.add(dateUtils.dateToStr(item.endTime));

+ 13 - 1
src/main/java/com/hz/employmentsite/controller/jobUserManager/EducationController.java

@@ -1,6 +1,8 @@
 package com.hz.employmentsite.controller.jobUserManager;
 
 import com.github.pagehelper.PageInfo;
+import com.hz.employmentsite.filter.exception.BaseErrorEnum;
+import com.hz.employmentsite.filter.exception.BaseException;
 import com.hz.employmentsite.filter.exception.BaseResponse;
 import com.hz.employmentsite.filter.exception.RespGenerstor;
 import com.hz.employmentsite.model.PcEducation;
@@ -9,6 +11,7 @@ import com.hz.employmentsite.services.service.jobUserManager.EducationService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import java.util.Date;
+import java.util.List;
 import java.util.UUID;
 
 @RestController
@@ -17,6 +20,7 @@ public class EducationController {
 
     @Autowired
     private EducationService educationService;
+
     @Autowired
     private AccountService accountService;
 
@@ -47,5 +51,13 @@ public class EducationController {
         return RespGenerstor.success(educationService.save(data,accountService.getLoginUserID()));
     }
 
-
+    @ResponseBody
+    @PostMapping("/deleteEducation")
+    public BaseResponse deleteEducation(@RequestBody List<String> ids) {
+        var result = educationService.deleteEducationByIDs(ids);
+        if (result <= 0) {
+            throw new BaseException(BaseErrorEnum.DELETE_NOT_DATA_ERROR);
+        }
+        return RespGenerstor.success(1);
+    }
 }

+ 12 - 0
src/main/java/com/hz/employmentsite/controller/jobUserManager/ExperienceController.java

@@ -1,6 +1,8 @@
 package com.hz.employmentsite.controller.jobUserManager;
 
 import com.github.pagehelper.PageInfo;
+import com.hz.employmentsite.filter.exception.BaseErrorEnum;
+import com.hz.employmentsite.filter.exception.BaseException;
 import com.hz.employmentsite.filter.exception.BaseResponse;
 import com.hz.employmentsite.filter.exception.RespGenerstor;
 import com.hz.employmentsite.model.PcExperience;
@@ -9,6 +11,7 @@ import com.hz.employmentsite.services.service.jobUserManager.ExperienceService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import java.util.Date;
+import java.util.List;
 import java.util.UUID;
 
 @RestController
@@ -48,4 +51,13 @@ public class ExperienceController {
     }
 
 
+    @ResponseBody
+    @PostMapping("/deleteExperience")
+    public BaseResponse deleteExperience(@RequestBody List<String> ids) {
+        var result = experienceService.deleteExperienceByIDs(ids);
+        if (result <= 0) {
+            throw new BaseException(BaseErrorEnum.DELETE_NOT_DATA_ERROR);
+        }
+        return RespGenerstor.success(1);
+    }
 }

+ 14 - 0
src/main/java/com/hz/employmentsite/controller/jobUserManager/JobUserController.java

@@ -5,7 +5,9 @@ import com.hz.employmentsite.filter.exception.BaseErrorEnum;
 import com.hz.employmentsite.filter.exception.BaseException;
 import com.hz.employmentsite.filter.exception.BaseResponse;
 import com.hz.employmentsite.filter.exception.RespGenerstor;
+import com.hz.employmentsite.mapper.PcSiteUserMapper;
 import com.hz.employmentsite.model.PcJobuser;
+import com.hz.employmentsite.model.PcSiteUserExample;
 import com.hz.employmentsite.model.SelectProps;
 import com.hz.employmentsite.services.service.AccountService;
 import com.hz.employmentsite.services.service.jobUserManager.JobUserService;
@@ -28,6 +30,10 @@ public class JobUserController {
     private JobUserService jobuserService;
     @Autowired
     private AccountService accountService;
+
+    @Autowired
+    private PcSiteUserMapper pcSiteUserMapper;
+
     @Autowired
     private DateUtils dateUtils;
 
@@ -50,6 +56,13 @@ public class JobUserController {
         if (data == null) {
             data = new JobUserVo();
             data.setJobUserID(UUID.randomUUID().toString());
+            PcSiteUserExample siteUserExp = new PcSiteUserExample();
+            PcSiteUserExample.Criteria siteUserCro = siteUserExp.createCriteria();
+            siteUserCro.andUserIDEqualTo(accountService.getLoginUserID());
+            var curSiteUserInfo = pcSiteUserMapper.selectByExample(siteUserExp).stream().findFirst().orElse(null);
+            if(curSiteUserInfo != null){
+                data.setSiteID(curSiteUserInfo.getSiteID());
+            }
         }
         return RespGenerstor.success(data);
     }
@@ -106,6 +119,7 @@ public class JobUserController {
         return RespGenerstor.success(1);
     }
 
+
     @GetMapping("/export")
     public BaseResponse export(HttpServletResponse response, @RequestParam(required = false) Boolean isExport,
                                @RequestParam("pageIndex") int pageIndex, @RequestParam("pageSize") int pageSize,

+ 5 - 0
src/main/java/com/hz/employmentsite/mapper/PcSiteUserMapper.java

@@ -23,6 +23,11 @@ public interface PcSiteUserMapper {
 
     List<String> selectByMobile(@Param("mobile") String mobile);
 
+    List<String> selectByUserNo(@Param("userNo") String userNo);
+
+    List<String> selectByIdCard(@Param("idCard") String idCard);
+
+
     int updateByExampleSelective(@Param("row") PcSiteUser row, @Param("example") PcSiteUserExample example);
 
     int updateByExample(@Param("row") PcSiteUser row, @Param("example") PcSiteUserExample example);

+ 2 - 1
src/main/java/com/hz/employmentsite/mapper/cquery/UserInfoCQuery.java

@@ -11,7 +11,8 @@ public interface UserInfoCQuery {
                              @Param("siteUserName") String siteUserName,
                              @Param("siteID") String siteID,
                              @Param("roleName") String roleName,
-                             @Param("regionCode") String regionCode);
+                             @Param("regionCode") String regionCode,
+                             @Param("userNo") String userNo);
 
     List<SiteUserVo> getListBySiteID(@Param("siteID") String siteID);
 }

+ 154 - 11
src/main/java/com/hz/employmentsite/services/impl/baseSettings/SiteUserImpl.java

@@ -3,13 +3,11 @@ package com.hz.employmentsite.services.impl.baseSettings;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.hz.employmentsite.filter.exception.BaseException;
-import com.hz.employmentsite.mapper.PcSiteUserMapper;
-import com.hz.employmentsite.mapper.SysRoleMapper;
-import com.hz.employmentsite.mapper.SysUserMapper;
-import com.hz.employmentsite.mapper.SysUserSysRoleMapper;
+import com.hz.employmentsite.mapper.*;
 import com.hz.employmentsite.mapper.cquery.UserInfoCQuery;
 import com.hz.employmentsite.model.*;
 import com.hz.employmentsite.services.service.baseSettings.SiteUserService;
+import com.hz.employmentsite.services.service.system.DictionaryService;
 import com.hz.employmentsite.util.StringUtils;
 import com.hz.employmentsite.vo.baseSettings.SiteUserVo;
 import net.sourceforge.pinyin4j.PinyinHelper;
@@ -25,6 +23,7 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.UUID;
+import java.util.stream.Collectors;
 
 @Service("SiteUserService")
 public class SiteUserImpl implements SiteUserService {
@@ -47,10 +46,16 @@ public class SiteUserImpl implements SiteUserService {
     @Autowired
     private SysUserSysRoleMapper sysUserSysRoleMapper;
 
+    @Autowired
+    private PcSiteMapper siteMapper;
+
+    @Autowired
+    private DictionaryService dictionaryService;
+
     @Override
-    public PageInfo<SiteUserVo> getList(int pageIndex, int pageSize, List<String> siteUserIDList, String siteUserName,String siteID, String roleName, String regionCode) {
+    public PageInfo<SiteUserVo> getList(int pageIndex, int pageSize, List<String> siteUserIDList, String siteUserName, String siteID, String roleName, String regionCode, String userNo) {
         PageHelper.startPage(pageIndex, pageSize);
-        List<SiteUserVo> dataList = userInfoCQuery.getList(stringUtils.ListToInSql(siteUserIDList),siteUserName,siteID, roleName, regionCode);
+        List<SiteUserVo> dataList = userInfoCQuery.getList(stringUtils.ListToInSql(siteUserIDList), siteUserName, siteID, roleName, regionCode, userNo);
         PageInfo<SiteUserVo> result = new PageInfo(dataList);
         return result;
     }
@@ -71,13 +76,13 @@ public class SiteUserImpl implements SiteUserService {
         }else{
             ids.add(siteUserID);
         }
-        SiteUserVo model = userInfoCQuery.getList(stringUtils.ListToInSql(ids),null,null, null, null).stream().findFirst().orElse(null);
+        SiteUserVo model = userInfoCQuery.getList(stringUtils.ListToInSql(ids), null, null, null, null, null).stream().findFirst().orElse(null);
         return model;
     }
 
     @Override
     public List<SelectProps> getDataList() {
-        var dataList = getList(1,99999,null,null,null, null, null).getList();
+        var dataList = getList(1, 99999, null, null, null, null, null, null).getList();
         List<SelectProps> dataResult = new ArrayList<>();
         for (var item: dataList) {
             SelectProps  itemResult = new SelectProps();
@@ -94,6 +99,8 @@ public class SiteUserImpl implements SiteUserService {
 
         // 手机号查重
         List<String> byMobileSiteId = pcSiteUserMapper.selectByMobile(data.mobile);
+        List<String> byUserNoSiteId = pcSiteUserMapper.selectByUserNo(data.userNo);
+        List<String> byIdCardSiteId = pcSiteUserMapper.selectByIdCard(data.idCard);
 
         SiteUserVo record = get(data.siteUserID);
         PcSiteUser dbData = record == null ? null : pcSiteUserMapper.selectByPrimaryKey(record.siteUserID);
@@ -103,10 +110,16 @@ public class SiteUserImpl implements SiteUserService {
         SysRoleExample roleExp = null;
         /*注意:这里的data.roleID为用户类型ID*/
         if (!isExist) {
-            // 添加时有重复手机号立即报错
+            // 添加时有重复数据立即报错
             if (!byMobileSiteId.isEmpty()) {
                 throw new BaseException("500", "该手机号已绑定其他驿站人员");
             }
+            if (!byUserNoSiteId.isEmpty()) {
+                throw new BaseException("500", "该工号已绑定其他驿站人员");
+            }
+            if (!byIdCardSiteId.isEmpty()) {
+                throw new BaseException("500", "该身份证已绑定其他驿站人员");
+            }
 
             //添加
             //处理用户表
@@ -131,14 +144,22 @@ public class SiteUserImpl implements SiteUserService {
             dbData.setGender(data.getGender());
             dbData.setRoleID(data.getRoleID());
             dbData.setMobile(data.getMobile());
+            dbData.setUserNo(data.getUserNo());
+            dbData.setIDCard(data.getIdCard());
             dbData.setCreateUserID(userId);
             dbData.setCreateTime(new Date());
             result += pcSiteUserMapper.insert(dbData);
         } else {
             // 修改时,ID列表中没有参数中的ID才报错
-            if (!byMobileSiteId.isEmpty() && !byMobileSiteId.contains(data.siteID)) {
+            if (!byMobileSiteId.isEmpty() && !byMobileSiteId.contains(data.siteUserID)) {
                 throw new BaseException("500", "该手机号已绑定其他驿站人员");
             }
+            if (!byUserNoSiteId.isEmpty() && !byUserNoSiteId.contains(data.siteUserID)) {
+                throw new BaseException("500", "该工号已绑定其他驿站人员");
+            }
+            if (!byIdCardSiteId.isEmpty() && !byIdCardSiteId.contains(data.siteUserID)) {
+                throw new BaseException("500", "该身份证已绑定其他驿站人员");
+            }
 
             //修改
             //处理用户表
@@ -160,6 +181,8 @@ public class SiteUserImpl implements SiteUserService {
             dbData.setGender(data.gender);
             dbData.setRoleID(data.roleID);
             dbData.setMobile(data.mobile);
+            dbData.setUserNo(data.userNo);
+            dbData.setIDCard(data.idCard);
             dbData.setUpdateBy(userId);
             dbData.setUpdateTime(new Date());
             result += pcSiteUserMapper.updateByPrimaryKey(dbData);
@@ -189,7 +212,127 @@ public class SiteUserImpl implements SiteUserService {
         return result;
     }
 
-    public String StrToPinYin(String chinese){
+    /**
+     * 数据导入
+     *
+     * @param dataList    excel数据
+     * @param loginUserId 当前登录用户ID
+     * @return 导入结果
+     */
+    @Override
+    public List<SiteUserVo> importSiteUser(List<SiteUserVo> dataList, String loginUserId) {
+        if (dataList.size() <= 0)
+            throw new BaseException("", "请添加导入数据!");
+        // 所属驿站
+        List<PcSite> siteList = siteMapper.selectByExample(null);
+        // 已存在的驿站工作人员
+        List<PcSiteUser> pcSiteUsers = pcSiteUserMapper.selectByExample(null);
+        // 用户类型字典数据
+        List<SysDictionaryItem> userTypeList = dictionaryService.getDictionaryItemList("UserType");
+        // 性别字典数据
+        List<SysDictionaryItem> genderList = dictionaryService.getDictionaryItemList("Gender");
+
+        // 最终结果
+        List<SiteUserVo> resultList = new ArrayList<>();
+
+        dataList.forEach(item -> {
+            String errorInfo = "";
+
+            // 数据内容为空判断
+            if (stringUtils.IsNullOrEmpty(item.siteUserName)) {
+                errorInfo += "请填写姓名!";
+            }
+            if (stringUtils.IsNullOrEmpty(item.userNo)) {
+                errorInfo += "请填写工号!";
+            } else {
+                String siteUserID = pcSiteUsers.stream()
+                        .filter(it -> it.getUserNo() != null && it.getUserNo().equals(item.getUserNo().trim()))
+                        .findFirst()
+                        .orElse(new PcSiteUser())
+                        .getSiteUserID();
+                if (!stringUtils.IsNullOrEmpty(siteUserID)) {
+                    errorInfo += "工号已绑定其他驿站人员!";
+                }
+            }
+            if (stringUtils.IsNullOrEmpty(item.genderName)) {
+                errorInfo += "请填写性别!";
+            } else {
+                item.gender = genderList.stream().filter(it -> it.getName().equals(item.getGenderName().trim()))
+                        .findFirst().orElse(new SysDictionaryItem()).getValue();
+                if (item.gender == null) {
+                    errorInfo += "性别不存在!";
+                }
+            }
+            if (stringUtils.IsNullOrEmpty(item.mobile)) {
+                errorInfo += "请填写联系电话!";
+            } else {
+                String siteUserID = pcSiteUsers.stream()
+                        .filter(it -> it.getMobile() != null && it.getMobile().equals(item.getMobile().trim()))
+                        .findFirst()
+                        .orElse(new PcSiteUser())
+                        .getSiteUserID();
+                if (!stringUtils.IsNullOrEmpty(siteUserID)) {
+                    errorInfo += "联系电话已绑定其他驿站人员!";
+                }
+            }
+            if (stringUtils.IsNullOrEmpty(item.idCard)) {
+                errorInfo += "请填写身份证号码!";
+            } else {
+                String siteUserID = pcSiteUsers.stream()
+                        .filter(it -> it.getIDCard() != null && it.getIDCard().equals(item.getIdCard().trim()))
+                        .findFirst()
+                        .orElse(new PcSiteUser())
+                        .getSiteUserID();
+                if (!stringUtils.IsNullOrEmpty(siteUserID)) {
+                    errorInfo += "身份证已绑定其他驿站人员!";
+                }
+            }
+            if (stringUtils.IsNullOrEmpty(item.roleName)) {
+                errorInfo += "请填写用户类型!";
+            } else {
+                item.roleID = userTypeList.stream()
+                        .filter(it -> it.getName().equals(item.getRoleName().trim()))
+                        .findFirst()
+                        .orElse(new SysDictionaryItem())
+                        .getValue();
+                if (item.roleID == null) {
+                    errorInfo += "用户类型不存在!";
+                }
+            }
+            if (stringUtils.IsNullOrEmpty(item.siteName)) {
+                errorInfo += "请填写所属驿站!";
+            } else {
+                item.siteID = siteList.stream()
+                        .filter(it -> it.getSiteName().equals(item.getSiteName().trim()))
+                        .findFirst()
+                        .orElse(new PcSite())
+                        .getSiteID();
+                if (stringUtils.IsNullOrEmpty(item.siteID)) {
+                    errorInfo += "驿站不存在!";
+                }
+            }
+
+            // 检查结果填充
+            if (stringUtils.IsNullOrEmpty(errorInfo)) {
+                item.setSiteUserID(UUID.randomUUID().toString());
+                resultList.add(item);
+            } else {
+                item.setErrorMessage(errorInfo);
+            }
+        });
+
+        // 返回结果
+        if (dataList.stream().filter(it -> !stringUtils.IsNullOrEmpty(it.errorMessage)).collect(Collectors.toList()).size() > 0)
+            return dataList;
+
+        // 保存到数据
+        resultList.forEach(item -> {
+            save(item, loginUserId);
+        });
+        return null;
+    }
+
+    public String StrToPinYin(String chinese) {
         String pinyinStr = "";
         char[] newChar = chinese.toCharArray();
         HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();

+ 26 - 0
src/main/java/com/hz/employmentsite/services/impl/companyService/CompanyServiceImpl.java

@@ -65,6 +65,19 @@ public class CompanyServiceImpl implements CompanyService {
         return pcCompanyMapper.selectByExample(exp);
     }
 
+    private int ifHadRepeatData(CompanyVo data){
+        var result = 0;
+        PcCompanyExample companyExp1 = new PcCompanyExample();
+        companyExp1.or().andCompanyNameEqualTo(data.getCompanyName()).andCompanyIDNotEqualTo(data.getCompanyID());
+        var ifRepeatName = pcCompanyMapper.selectByExample(companyExp1).size()>0;
+        PcCompanyExample companyExp2 = new PcCompanyExample();
+        companyExp2.or().andCompanyCodeEqualTo(data.getCompanyCode()).andCompanyIDNotEqualTo(data.getCompanyID());
+        var ifRepeatCode = pcCompanyMapper.selectByExample(companyExp2).size()>0;
+        result += ifRepeatName? 1:0;
+        result += ifRepeatCode? 2:0;
+        return result;
+    }
+
     @Override
     public Integer save(CompanyVo data, String userId) {
         Integer result = 0;
@@ -76,7 +89,20 @@ public class CompanyServiceImpl implements CompanyService {
             cro.andCompanyIDEqualTo(data.getCompanyID());
             dbData = pcCompanyMapper.selectByExampleWithBLOBs(exp).stream().findFirst().orElse(null);
         }
+        var repeatResult = ifHadRepeatData(data);
+        switch (repeatResult){
+            default:
+            case 0:
+                break;
+            case 1:
+                throw new  BaseException("1004","企业名称已存在!");
+            case 2:
+                throw new  BaseException("1004","统一社会信用代码已存在!");
+            case 3:
+                throw new  BaseException("1004","信用代码、企业名称重复!");
+        }
         if (dbData == null) {
+            exp = new PcCompanyExample();
             dbData = new PcCompanyWithBLOBs();
 //            dbData.setCompanyID(UUID.randomUUID().toString());
             dbData.setCompanyID(data.getCompanyID());

+ 9 - 0
src/main/java/com/hz/employmentsite/services/impl/jobUserManager/EducationServiceImpl.java

@@ -76,4 +76,13 @@ public class EducationServiceImpl implements EducationService {
         return result;
     }
 
+    @Override
+    public int deleteEducationByIDs(List<String> educationIDs) {
+        int educationRows = 0;
+        PcEducationExample eduExp = new PcEducationExample();
+        PcEducationExample.Criteria croEducation = eduExp.or();
+        croEducation.andEducationIDIn(educationIDs);
+        educationRows = pcEducationMapper.deleteByExample(eduExp);
+        return educationRows;
+    }
 }

+ 11 - 0
src/main/java/com/hz/employmentsite/services/impl/jobUserManager/ExperienceServiceImpl.java

@@ -5,6 +5,7 @@ import com.github.pagehelper.PageInfo;
 import com.hz.employmentsite.mapper.PcExperienceMapper;
 import com.hz.employmentsite.mapper.cquery.ExperienceCQuery;
 import com.hz.employmentsite.model.PcExperience;
+import com.hz.employmentsite.model.PcExperienceExample;
 import com.hz.employmentsite.services.service.jobUserManager.ExperienceService;
 import com.hz.employmentsite.util.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -71,4 +72,14 @@ public class ExperienceServiceImpl implements ExperienceService {
         return result;
     }
 
+    @Override
+    public int deleteExperienceByIDs(List<String> experienceIDs) {
+        int experienceRows = 0;
+        PcExperienceExample expExp = new PcExperienceExample();
+        PcExperienceExample.Criteria croExperience = expExp.or();
+        croExperience.andExperienceIDIn(experienceIDs);
+        experienceRows = pcExperienceMapper.deleteByExample(expExp);
+
+        return experienceRows;
+    }
 }

+ 10 - 1
src/main/java/com/hz/employmentsite/services/service/baseSettings/SiteUserService.java

@@ -8,7 +8,7 @@ import java.util.List;
 
 public interface SiteUserService {
 
-    PageInfo<SiteUserVo> getList(int pageIndex, int pageSize, List<String> siteUserIDList, String siteUserName,String siteID, String roleName, String regionCode);
+    PageInfo<SiteUserVo> getList(int pageIndex, int pageSize, List<String> siteUserIDList, String siteUserName, String siteID, String roleName, String regionCode, String userNo);
 
     PageInfo<SiteUserVo> getListBySiteID(int pageIndex, int pageSize, String siteID);
 
@@ -19,4 +19,13 @@ public interface SiteUserService {
     Integer save(SiteUserVo data, String userId);
 
     Integer delete(List<String> idList);
+
+    /**
+     * 数据导入
+     *
+     * @param dataList    excel数据
+     * @param loginUserId 当前登录用户ID
+     * @return 导入结果
+     */
+    List<SiteUserVo> importSiteUser(List<SiteUserVo> dataList, String loginUserId);
 }

+ 4 - 0
src/main/java/com/hz/employmentsite/services/service/jobUserManager/EducationService.java

@@ -3,6 +3,8 @@ package com.hz.employmentsite.services.service.jobUserManager;
 import com.github.pagehelper.PageInfo;
 import com.hz.employmentsite.model.PcEducation;
 
+import java.util.List;
+
 public interface EducationService {
 
     PageInfo<PcEducation> getListByJobUserID(Integer pageIndex, Integer pageSize,String jobUserID);
@@ -10,4 +12,6 @@ public interface EducationService {
     PcEducation getById(String educationID);
 
     Integer save(PcEducation data, String userId);
+
+    int deleteEducationByIDs(List<String> ids);
 }

+ 4 - 0
src/main/java/com/hz/employmentsite/services/service/jobUserManager/ExperienceService.java

@@ -3,6 +3,8 @@ package com.hz.employmentsite.services.service.jobUserManager;
 import com.github.pagehelper.PageInfo;
 import com.hz.employmentsite.model.PcExperience;
 
+import java.util.List;
+
 public interface ExperienceService {
 
     PageInfo<PcExperience> getListByJobUserID(Integer pageIndex, Integer pageSize,String jobUserID);
@@ -10,4 +12,6 @@ public interface ExperienceService {
     PcExperience getById(String experienceID);
 
     Integer save(PcExperience data, String userId);
+
+    int deleteExperienceByIDs(List<String> ids);
 }

+ 9 - 2
src/main/java/com/hz/employmentsite/vo/baseSettings/SiteUserVo.java

@@ -2,10 +2,11 @@ package com.hz.employmentsite.vo.baseSettings;
 
 import com.hz.employmentsite.util.datarange.annotations.InstitutionID;
 import com.hz.employmentsite.util.datarange.annotations.RegionID;
+import com.hz.employmentsite.util.datarange.annotations.SiteID;
+import com.hz.employmentsite.util.datarange.annotations.SiteUserID;
 import lombok.Data;
+
 import java.sql.Date;
-import com.hz.employmentsite.util.datarange.annotations.SiteUserID;
-import com.hz.employmentsite.util.datarange.annotations.SiteID;
 
 @Data
 public class SiteUserVo {
@@ -21,6 +22,9 @@ public class SiteUserVo {
     public Integer gender;
     public String genderName;
 
+    public String userNo;
+    public String idCard;
+
     public String userID;
     //注意:roleID已用于绑定用户表sys_user中用户类型字典,非角色类型数据
     public Integer roleID;
@@ -35,4 +39,7 @@ public class SiteUserVo {
     @RegionID
     public String regionCode;
 
+    // 导入时的报错信息
+    public String errorMessage;
+
 }

+ 13 - 1
src/main/resources/mapping/PcSiteUserMapper.xml

@@ -337,8 +337,20 @@
   </update>
 
   <select id="selectByMobile" resultType="String">
-    select SiteID
+    select SiteUserID
     from pc_site_user
     where mobile = #{mobile,jdbcType=VARCHAR}
   </select>
+
+  <select id="selectByUserNo" resultType="String">
+    select SiteUserID
+    from pc_site_user
+    where userNo = #{userNo,jdbcType=VARCHAR}
+  </select>
+
+  <select id="selectByIdCard" resultType="String">
+    select SiteUserID
+    from pc_site_user
+    where idCard = #{idCard,jdbcType=VARCHAR}
+  </select>
 </mapper>

+ 5 - 5
src/main/resources/mapping/cquery/CompanyCQuery.xml

@@ -15,22 +15,22 @@
         left join pc_institution institution on inSites.institutionID = institution.InstitutionID
         where 1=1
         <if test="companyIDList!='' and companyIDList!=null">
-            and companyID in (${companyIDList})
+            and company.companyID in (${companyIDList})
         </if>
         <if test="companyName!='' and companyName!=null">
-            and companyName like Concat('%',#{companyName},'%')
+            and company.companyName like Concat('%',#{companyName},'%')
         </if>
         <if test="companyCode!='' and companyCode!=null">
-            and companyCode like Concat('%',#{companyCode},'%')
+            and company.companyCode like Concat('%',#{companyCode},'%')
         </if>
         <if test="recordStatus!='' and recordStatus!=null">
             and company.RecordStatus = #{recordStatus}
         </if>
         <if test="regionCode!='' and regionCode!=null">
-            and regionCode like Concat('%',#{regionCode},'%')
+            and company.regionCode like Concat('%',#{regionCode},'%')
         </if>
         <if test="streetCode!='' and regionCode!=null">
-            and streetCode like Concat('%',#{streetCode},'%')
+            and company.streetCode like Concat('%',#{streetCode},'%')
         </if>
         order by company.CreateTime desc,postCount desc
     </select>

+ 1 - 1
src/main/resources/mapping/cquery/PostCQuery.xml

@@ -32,7 +32,7 @@
                 and company.CompanyName like Concat('%',#{companyName},'%')
             </if>
             <if test="RecordStatus != null and RecordStatus != ''">
-                and pro.RecordStatus = #{RecordStatus}
+                and post.RecordStatus = #{RecordStatus}
             </if>
             <if test="WorkName != null and WorkName != ''">
                 and post.WorkName like Concat('%', #{WorkName},'%')

+ 3 - 0
src/main/resources/mapping/cquery/SiteUserCQuery.xml

@@ -26,6 +26,9 @@
         <if test="regionCode!='' and regionCode!=null">
             and site.regionCode = #{regionCode}
         </if>
+        <if test="userNo!='' and userNo!=null">
+            and siteUser.userNo like Concat('%', #{userNo}, '%')
+        </if>
     </select>
 
     <select id="getListBySiteID" resultType="com.hz.employmentsite.vo.baseSettings.SiteUserVo">

BIN
src/main/resources/static/doc/template/驿站站点人员导入模板.xlsx


+ 2 - 0
vue/src/router/asyncModules/basesettings.ts

@@ -5,7 +5,9 @@ export default {
   'baseSettings/site/index': () => import('@/views/baseSettings/siteInfo/index.vue'),
   'baseSettings/site/add': () => import('@/views/baseSettings/siteInfo/edit.vue'),
   'baseSettings/site/edit': () => import('@/views/baseSettings/siteInfo/edit.vue'),
+  'baseSettings/site/detail': () => import('@/views/baseSettings/siteInfo/detail.vue'),
   'baseSettings/user/index': () => import('@/views/baseSettings/siteUser/index.vue'),
   'baseSettings/user/add': () => import('@/views/baseSettings/siteUser/edit.vue'),
   'baseSettings/user/edit': () => import('@/views/baseSettings/siteUser/edit.vue'),
+  'baseSettings/user/detail': () => import('@/views/baseSettings/siteUser/detail.vue'),
 };

+ 60 - 0
vue/src/views/baseSettings/siteInfo/detail.vue

@@ -0,0 +1,60 @@
+<template>
+  <div class="card-edit">
+    <a-divider orientation="left">驿站站点基本信息</a-divider>
+    <a-descriptions bordered>
+      <a-descriptions-item label="驿站编号">{{ siteInfo.siteCode }}</a-descriptions-item>
+      <a-descriptions-item label="站点名称">{{ siteInfo.siteName }}</a-descriptions-item>
+      <a-descriptions-item label="所属机构">{{ siteInfo.institutionName }}</a-descriptions-item>
+      <a-descriptions-item label="所属县区">{{ siteInfo.regionName }}</a-descriptions-item>
+      <a-descriptions-item label="所属街道">{{ siteInfo.streetName }}</a-descriptions-item>
+      <a-descriptions-item label="详细地址">{{ siteInfo.detailAddress }}</a-descriptions-item>
+      <a-descriptions-item label="站点负责人">{{ siteInfo.fzrName }}</a-descriptions-item>
+      <a-descriptions-item label="联系电话">{{ siteInfo.fzrMobile }}</a-descriptions-item>
+      <a-descriptions-item label="经度">{{ siteInfo.siteLongitude }}</a-descriptions-item>
+      <a-descriptions-item label="纬度">{{ siteInfo.siteLatitude }}</a-descriptions-item>
+    </a-descriptions>
+    <a-divider orientation="left">其他信息</a-divider>
+    <a-descriptions bordered>
+      <a-descriptions-item label="备注">{{ siteInfo.remark }}</a-descriptions-item>
+    </a-descriptions>
+  </div>
+</template>
+
+<script setup lang="ts">
+import {onMounted, reactive} from "vue";
+import {getSiteByID} from "@/api/baseSettings/siteInfo";
+
+// 站点信息
+const siteInfo = reactive({
+  siteCode: "",
+  siteName: "",
+  institutionName: "",
+  regionName: "",
+  streetName: "",
+  detailAddress: "",
+  fzrName: "",
+  fzrMobile: "",
+  siteLongitude: "",
+  siteLatitude: "",
+  remark: "",
+})
+
+// 站点数据加载
+function loadData(siteID: any) {
+  getSiteByID(siteID).then((result: any) => {
+    Object.keys(siteInfo).forEach(key => {
+      siteInfo[key] = result[key];
+    })
+  });
+}
+
+// 页面初始化
+onMounted(() => {
+  const id = history.state.params?.id;
+  loadData(id);
+})
+</script>
+
+<style scoped>
+
+</style>

+ 13 - 6
vue/src/views/baseSettings/siteInfo/index.vue

@@ -94,6 +94,8 @@
         <template #bodyCell="{ column, text, record }">
           <template v-if="column.key === 'operation'">
             <div class="table-operation">
+              <a-button type="link" size="small" functioncode="T01010201" @click='onDetail(record.siteID)'>查看
+              </a-button>
               <a-button type="link" size="small"  functioncode="T01010203" @click='onEdit(record.siteID)' >编辑</a-button>
               <a-button type="link" size="small"  functioncode="T01010204" @click="onDel(record)" >删除</a-button>
             </div>
@@ -105,15 +107,15 @@
 </template>
 
 <script lang="ts">
-import {reactive, ref, computed, defineComponent, createVNode} from 'vue';
+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 {getSiteList,delSite} from '@/api/baseSettings/siteInfo';
+import type {FormInstance, TableColumnsType, 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 {message, Modal, SelectProps} from "ant-design-vue";
 import {getInstitutionDataList} from "@/api/baseSettings/institution";
 
 export default defineComponent({
@@ -148,7 +150,7 @@ export default defineComponent({
       {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:100, align: "center"},
+      {title: '操作', key: 'operation', fixed: 'right', width: 150, align: "center"},
     ];
     const pagination = computed(() => ({
       total: formState.total,
@@ -235,6 +237,10 @@ export default defineComponent({
       tabsViewStore.addTabByPath('/baseSettings/site/edit', {id:id});
     };
 
+    const onDetail = (id: string) => {
+      tabsViewStore.addTabByPath('/baseSettings/site/detail', {id: id});
+    };
+
     const loadData = async function () {
       formState.loading = true;
       await getAllInstitutions();
@@ -263,7 +269,8 @@ export default defineComponent({
       onEdit,
       onDel,
       loadData,
-      changeRegion
+      changeRegion,
+      onDetail
     };
   },
   created() {

+ 49 - 0
vue/src/views/baseSettings/siteUser/detail.vue

@@ -0,0 +1,49 @@
+<template>
+  <div class="card-edit">
+    <a-divider orientation="left">站点人员基本信息</a-divider>
+    <a-descriptions bordered>
+      <a-descriptions-item label="姓名">{{ siteUserInfo.siteUserName }}</a-descriptions-item>
+      <a-descriptions-item label="性别">{{ siteUserInfo.genderName }}</a-descriptions-item>
+      <a-descriptions-item label="联系电话">{{ siteUserInfo.mobile }}</a-descriptions-item>
+      <a-descriptions-item label="工号">{{ siteUserInfo.userNo }}</a-descriptions-item>
+      <a-descriptions-item label="身份证">{{ siteUserInfo.idCard }}</a-descriptions-item>
+      <a-descriptions-item label="用户类型">{{ siteUserInfo.roleName }}</a-descriptions-item>
+      <a-descriptions-item label="所属驿站">{{ siteUserInfo.siteName }}</a-descriptions-item>
+    </a-descriptions>
+  </div>
+</template>
+
+<script setup lang="ts">
+import {onMounted, reactive} from "vue";
+import {getSiteUserByID} from "@/api/baseSettings/userInfo";
+
+// 站点人员信息
+const siteUserInfo = reactive({
+  siteUserName: "",
+  genderName: "",
+  mobile: "",
+  userNo: "",
+  idCard: "",
+  roleName: "",
+  siteName: "",
+})
+
+// 站点人员数据加载
+function loadData(siteUserID: string) {
+  getSiteUserByID(siteUserID).then((result: any) => {
+    Object.keys(siteUserInfo).forEach(key => {
+      siteUserInfo[key] = result[key];
+    })
+  });
+}
+
+// 页面初始化
+onMounted(() => {
+  const id = history.state.params?.id;
+  loadData(id);
+})
+</script>
+
+<style scoped>
+
+</style>

+ 34 - 8
vue/src/views/baseSettings/siteUser/edit.vue

@@ -25,13 +25,30 @@
       </a-row>
       <a-row type="flex">
         <a-col :span="7">
-          <a-form-item label="用户类型"  name="roleID" :label-col="{span:7}" :rules="[{ required: true, message: '请选择用户类型!' }]">
-            <label v-if="opCategory==3">{{dataModel.roleID }}</label>
-            <a-select ref="select" v-model:value="dataModel.roleID" :options="roleList"
-                      :field-names="{ label: 'name', value: 'value' }" :allow-clear="false" > </a-select>
+          <a-form-item label="工号" name="userNo" :label-col="{span:7}"
+                       :rules="[{ required: true, message: '请输入工号!' }]">
+            <label v-if="opCategory==3">{{ dataModel.userNo }}</label>
+            <a-input v-model:value="dataModel.userNo" placeholder=""/>
+          </a-form-item>
+        </a-col>
+        <a-col :span="8">
+          <a-form-item label="身份证" name="idCard" :label-col="{span:7}"
+                       :rules="[{ required: true, message: '请输入身份证!' }]">
+            <label v-if="opCategory==3">{{ dataModel.idCard }}</label>
+            <a-input v-model:value="dataModel.idCard" placeholder=""/>
           </a-form-item>
         </a-col>
         <a-col :span="8">
+          <a-form-item label="用户类型" name="roleID" :label-col="{span:8}"
+                       :rules="[{ required: true, message: '请选择用户类型!' }]">
+            <label v-if="opCategory==3">{{ dataModel.roleID }}</label>
+            <a-select ref="select" v-model:value="dataModel.roleID" :options="roleList"
+                      :field-names="{ label: 'name', value: 'value' }" :allow-clear="false"></a-select>
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row type="flex">
+        <a-col :span="7">
           <a-form-item label="所属驿站"  name="siteID" :label-col="{span:7}" :rules="[{ required: true, message: '请选择所属驿站!' }]">
             <a-select
               ref="select"
@@ -41,9 +58,6 @@
             </a-select>
           </a-form-item>
         </a-col>
-        <a-col :span="7">
-
-        </a-col>
       </a-row>
       <a-form-item class="buttom-btns">
         <a-button @click="onClose">取消</a-button>
@@ -58,8 +72,8 @@ import {useTabsViewStore} from "@/store/modules/tabsView";
 import {getSiteUserByID, saveSiteUser} from "@/api/baseSettings/userInfo";
 import BUploadFile from "@/components/file/uploadFile.vue";
 import type {SelectProps} from "ant-design-vue";
-import {getSysDictionaryList} from "@/api/system/dictionary";
 import {message} from "ant-design-vue";
+import {getSysDictionaryList} from "@/api/system/dictionary";
 import {getSiteList} from "@/api/baseSettings/siteInfo";
 
 interface siteUserModel {
@@ -129,6 +143,17 @@ export default defineComponent({
       }
     };
 
+    function idCardValidate() {
+      isAllowCommit.value = true;
+      let _IDRe18 = /^([1-6][1-9]|50)\d{4}(18|19|20)\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
+      let _IDre15 = /^([1-6][1-9]|50)\d{4}\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}$/
+      // 校验身份证
+      if (!_IDRe18.test(formData.dataModel.idCard) && !_IDre15.test(formData.dataModel.idCard)) {
+        message.error("输入的身份证格式有误!");
+        isAllowCommit.value = false;
+      }
+    }
+
     const onClose = (reload: any) => {
       tabsViewStore.closeCurrentTabByPath('/baseSettings/user/add');
       tabsViewStore.closeCurrentTabByPath('/baseSettings/user/edit');
@@ -137,6 +162,7 @@ export default defineComponent({
 
     const onFinish = () => {
       mobileValidate();
+      idCardValidate();
       if(isAllowCommit.value){
         saveSiteUser(formData.dataModel).then(result => {
           if (result) {

+ 48 - 12
vue/src/views/baseSettings/siteUser/index.vue

@@ -7,6 +7,11 @@
             <a-input v-model:value="searchParams.siteUserName" placeholder="" :allow-clear="true"/>
           </a-form-item>
         </a-col>
+        <a-col :span="6">
+          <a-form-item label="工号" :label-col="{span:8}" name="userNo">
+            <a-input v-model:value="searchParams.userNo" placeholder="" :allow-clear="true"/>
+          </a-form-item>
+        </a-col>
         <a-col :span="6">
           <a-form-item label="所属驿站" :label-col="{span:8}" name="siteID">
             <a-select
@@ -20,9 +25,6 @@
             </a-select>
           </a-form-item>
         </a-col>
-        <a-col :span="6">
-
-        </a-col>
       <a-col :span="6" style="text-align: left">
           <a-button type="primary" html-type="submit" @click="onSearch">查询</a-button>
           <a-button
@@ -39,6 +41,10 @@
       <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="{...searchParams, rows:100000,siteUserIDList:formState.selectedRowKeys.join(',')}"></BExportExcel>
         </a-col>
       </a-row>
@@ -53,6 +59,8 @@
         <template #bodyCell="{ column, text, record }">
           <template v-if="column.key === 'operation'">
             <div class="table-operation">
+              <a-button type="link" size="small" functioncode="T01010301" @click='onDetail(record.siteUserID)'>查看
+              </a-button>
               <a-button type="link" size="small"  functioncode="T01010303"  @click='onEdit(record.siteUserID)' >编辑</a-button>
               <a-button type="link" size="small"  functioncode="T01010304"  @click="onDel(record)" >删除</a-button>
             </div>
@@ -64,20 +72,21 @@
 </template>
 
 <script lang="ts">
-import {reactive, ref, computed, defineComponent, createVNode} from 'vue';
+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} from 'ant-design-vue';
-import type {TableColumnsType, TableProps} from 'ant-design-vue';
-import {getSiteUserList,delSiteUser} from '@/api/baseSettings/userInfo';
+import type {FormInstance, TableColumnsType, 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";
 import {getPaginationTotalTitle} from "@/utils/common";
-import {message, Modal} from "ant-design-vue";
 import {getSiteList} from "@/api/baseSettings/siteInfo";
+import BImportExcel from "@/components/basic/excel/importExcel/importExcel.vue";
+import type {ImportProps} from "@/components/basic/excel/importExcel/ImportProps";
 
 export default defineComponent({
   name: 'UserInfoList',
-  components: {DownOutlined, UpOutlined, BExportExcel},
+  components: {BImportExcel, DownOutlined, UpOutlined, BExportExcel},
   setup() {
     const formRef = ref<FormInstance>();
     const tabsViewStore = useTabsViewStore();
@@ -86,7 +95,8 @@ export default defineComponent({
       pageIndex: 1,
       pageSize: 20,
       siteUserName: '',
-      siteID:''
+      siteID: '',
+      userNo: ""
     });
     const formState = reactive({
       total: 0,
@@ -95,13 +105,33 @@ export default defineComponent({
     });
     const columns: TableColumnsType = [
       {title: '序号', align: "center",key: 'siteUserID',customRender: item => `${searchParams.pageSize * (searchParams.pageIndex - 1) + item.index + 1}`},
+      {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: 'idCard', key: 'idCard', align: "center"},
       {title: '所属驿站', dataIndex: 'siteName', key: 'siteName', align: "center"},
-      {title: '操作', key: 'operation', fixed: 'right',width:100, align: "center"},
+      {title: '操作', key: 'operation', fixed: 'right', width: 150, align: "center"},
     ];
+    const importOptions = ref<ImportProps>({
+      title: '导入',
+      url: 'userInfo/importSiteUser',
+      columns: [
+        {cnName: '姓名', enName: 'siteUserName', width: 100},
+        {cnName: '工号', enName: 'userNo', width: 100},
+        {cnName: '性别', enName: 'genderName', width: 100},
+        {cnName: '联系电话', enName: 'mobile', width: 100},
+        {cnName: '身份证号码', enName: 'idCard', width: 140},
+        {cnName: '用户类型', enName: 'roleName', width: 100},
+        {cnName: '所属驿站', enName: 'siteName', width: 100},
+      ],
+      template: {
+        tempFileName: '站点人员信息导入模板.xlsx',
+        url: '',
+        params: null,
+      },
+    });
     const pagination = computed(() => ({
       total: formState.total,
       current: searchParams.pageIndex,
@@ -179,6 +209,10 @@ export default defineComponent({
       tabsViewStore.addTabByPath('/baseSettings/user/edit', {id:id,op:2});
     };
 
+    const onDetail = (id: string) => {
+      tabsViewStore.addTabByPath('/baseSettings/user/detail', {id: id, op: 2});
+    };
+
     return {
       formRef,
       allSites,
@@ -193,7 +227,9 @@ export default defineComponent({
       onAdd,
       onEdit,
       onDel,
-      loadData
+      loadData,
+      onDetail,
+      importOptions
     };
   },
   created() {

+ 15 - 8
vue/src/views/companyService/company/edit.vue

@@ -178,8 +178,8 @@
             <a-select
               ref="select"
               v-model:value="dataModel.companyType"
-              :options="companyCategoryList"
-              :field-names="{ label: 'name', value: 'value' }"
+              :options="companyTypeList"
+              :field-names="{ label: 'name', value: 'name' }"
             >
             </a-select>
           </a-form-item>
@@ -327,7 +327,7 @@ export default defineComponent(
 
       const regionList = ref<SelectProps['options']>();
       const streetList = ref<SelectProps['options']>();
-      const companyCategoryList = ref<SelectProps['options']>();
+      const companyTypeList = ref<SelectProps['options']>();
       const companyModelList = ref<SelectProps['options']>();
       const fullPath = router.currentRoute.value.fullPath;
 
@@ -360,6 +360,12 @@ export default defineComponent(
         // console.log("companyModelList", companyModelList.value);
       }
 
+      const getCompanyTypeList = async function () {
+        const data: any = await getSysDictionaryList("CompanyType");
+        companyTypeList.value = data;
+        // console.log("companyCategoryList", companyCategoryList.value);
+      }
+
       const siteChange = async function () {
         const curSiteData: any = await getSiteByID(formState.dataModel.siteID);
         formState.dataModel.regionCode = curSiteData.regionCode;
@@ -374,9 +380,7 @@ export default defineComponent(
       }
 
       const companyCodeValidate = ()=>{
-        isAllowCommit.value = true;
         const codeReg = /^[0-9A-Z]+$/;
-        console.log(formState.dataModel.companyCode);
         if(formState.dataModel.companyCode.length != 18 || !codeReg.test(formState.dataModel.companyCode)){
           message.error("输入的信用代码有误!");
           isAllowCommit.value = false;
@@ -415,7 +419,7 @@ export default defineComponent(
         }
         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.companyEmail.trim()!==""){
+        if(formState.dataModel.companyEmail!=null&&formState.dataModel.companyEmail.trim()!=''){
           if(!emailReg.test(formState.dataModel.companyEmail)){
             message.error("输入的企业邮箱有误!");
             isAllowCommit.value = false;
@@ -424,7 +428,8 @@ export default defineComponent(
       };
 
       const onFinish = () => {
-        // console.log(showPicker.value);
+        isAllowCommit.value = true;
+        console.log(showPicker.value);
         if (showPicker.value === '1') {
           formState.dataModel.validDate = '2099-12-31T00:00:00.000+08:00';
         }
@@ -433,6 +438,7 @@ export default defineComponent(
         };
         companyCodeValidate();
         inputDataValidate();
+        console.log("isAllowCommit",isAllowCommit.value);
         if(isAllowCommit.value){
           save(formState.dataModel).then(result => {
             if (result) {
@@ -447,6 +453,7 @@ export default defineComponent(
         getAllSites();
         getRegionList();
         getCompanyModelList();
+        getCompanyTypeList();
         getCompanyById(id).then(result => {
           formState.dataModel = result;
           // console.log("curDataModel",formState.dataModel);
@@ -468,7 +475,7 @@ export default defineComponent(
         siteList,
         regionList,
         streetList,
-        companyCategoryList,
+        companyTypeList,
         companyModelList,
         companyStatusList,
         showDateTime,

+ 24 - 12
vue/src/views/companyService/post/edit.vue

@@ -183,7 +183,7 @@
 </template>
 
 <script lang="ts">
-import {defineComponent, reactive, ref, toRefs} from 'vue';
+import {defineComponent, reactive, ref, toRefs, watch} from 'vue';
 import {useRouter} from 'vue-router';
 import {savePost, getPostByID} from '@/api/companyService/post';
 import type {CascaderProps,SelectProps} from 'ant-design-vue';
@@ -243,7 +243,7 @@ export default defineComponent(
                 };
               });
             });
-            postCompany.dataModel.professionID = null;
+            postCompany.dataModel.hasProfession = false;
           } else if (targetOption.tag == "secondLevel") {
             get("profession/getListByParentProfessionID",{parentProfessionID:targetOption.value}).then(data => {
               targetOption.loading = false;
@@ -251,22 +251,34 @@ export default defineComponent(
                 return {
                   label: x.name,
                   value: x.code,
-                  isLeaf: false,
+                  isLeaf: true,
                   tag: 'thirdLevel'
                 };
               });
             });
-            postCompany.dataModel.professionID = null;
-          }else if (targetOption.tag == "thirdLevel") {
-            targetOption.loading = false;
-            targetOption.children = [];
-            postCompany.dataModel.professionID = targetOption.value;
-            postCompany.dataModel.postName = targetOption.label;
-            //console.log("xx",postCompany.dataModel);
+            postCompany.dataModel.hasProfession = false;
           }
+          // else if (targetOption.tag == "thirdLevel") {
+          //   targetOption.children = null;
+          //   postCompany.dataModel.professionID = targetOption.value;
+          //   postCompany.dataModel.postName = targetOption.label;
+          //   postCompany.dataModel.hasProfession = true;
+          //   //console.log("xx",postCompany.dataModel);
+          // }
         }
       };
 
+      watch(() => postCompany.dataModel.professionName, (selectedValues) => {
+        console.log("dd",selectedValues);
+        if (selectedValues && selectedValues.length == 3) {
+          postCompany.dataModel.professionID = selectedValues[2];
+          postCompany.dataModel.hasProfession = true;
+        } else {
+          postCompany.dataModel.professionID = '';
+          postCompany.dataModel.hasProfession = false;
+        }
+      });
+
       get('system/dictionary/getDictionaryItemByCodeList', {code: 'CultureLevel'}).then(result => {
         cultureLevelList.value = result;
       });
@@ -286,11 +298,11 @@ export default defineComponent(
       };
 
       const onFinish = () => {
-        if(postCompany.dataModel.professionID==null){
+        if(!postCompany.dataModel.hasProfession){
           message.error("请选择完整的岗位信息!")
         }else{
           postCompany.dataModel.professionName=null;
-          //console.log("当前岗位信息",postCompany.dataModel);
+          console.log("当前岗位信息",postCompany.dataModel);
           savePost(postCompany.dataModel).then((result) => {
             if (result) {
               tabsViewStore.closeCurrentTab(fullpath);

+ 3 - 3
vue/src/views/companyService/post/index.vue

@@ -94,7 +94,7 @@
                bordered>
         <template #bodyCell="{ column, text, record }">
           <template v-if="column.key === 'recommendNum'">
-            <div class="table-operation">
+            <div>
               <a-button type="link" size="small" @click='onRecommendInfo(record)'>{{record.recommendNum}}</a-button>
             </div>
           </template>
@@ -204,7 +204,7 @@ export default defineComponent({
           return item.record.recordStatus == 1 ? "启用" : "停用";
         }
       },
-      {title: '工种名称', dataIndex: 'workName', key: 'workName', align: "center"},
+      // {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) => {
@@ -214,7 +214,7 @@ export default defineComponent({
       },
       {title: '联系人', dataIndex: 'userName', key: 'userName', align: "center"},
       {title: '联系电话', dataIndex: 'userMobile', key: 'userMobile', width: 200, align: "center"},
-      {title: '推荐数量', key: 'recommendNum', align: "center"},
+      {title: '推荐数量', dataIndex: 'recommendNum',key: 'recommendNum',width: 100, align: "center"},
       {title: '操作', key: 'operation', fixed: 'right', width: 200, align: "center"},
     ];
     const pagination = computed(() => ({