Browse Source

新增站点人员绑定用户逻辑调整

liao-sea 1 year ago
parent
commit
858e8c2d6b

+ 1 - 1
h5app/src/api/company/index.ts

@@ -71,7 +71,7 @@ export function getCompanyPostList(params:any){
 }
 
 export function getCompanyById(id: string) {
-    return request<object>({
+    return request({
         url: 'companyService/company/getCompanyByID',
         method: 'get',
         params: {id}

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

@@ -44,6 +44,10 @@ const routes: Array<RouteRecordRaw> = [
                 path: 'tabMain/company/list',
                 component: () => import('@/views/pages/company/list.vue')
             },
+            {
+                path: 'tabMain/company/menu',
+                component: () => import('@/views/pages/company/menu.vue')
+            },
             {
                 path: 'tabMain/company/edit',
                 component: () => import('@/views/pages/company/edit.vue')

+ 224 - 206
h5app/src/views/pages/company/edit.vue

@@ -14,9 +14,9 @@
       <div class="stepFlex">
         <div v-for="(record,key) in stepList" :key="key" class="stepFlex-item">
           <div
-              :class="[(record.val <formState.dataModel?.statusVal || formState.dataModel?.statusVal==stepList[stepList.length-1].val) ? 'greenCircle' :record.val == formState.dataModel?.statusVal ? 'now' : 'greyCircle']"></div>
+              :class="[(record.val < curStepData?.statusVal || curStepData?.statusVal == stepList[stepList.length-1].val) ? 'greenCircle' :record.val == curStepData?.statusVal ? 'now' : 'grayCircle']"></div>
           <div v-if="key !== stepList.length - 1"
-               :class="[record.val < formState.dataModel?.statusVal ? 'greenline' : 'greyline']"></div>
+               :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>
@@ -31,79 +31,78 @@
               基本信息
             </div>
           </ion-item>
+          <ion-label class="title-item">统一信用代码<span class="danger">*</span></ion-label>
           <ion-item mode="md" :class="[v$.dataModel.companyCode.$error?'ion-invalid':'ion-valid']">
-            <ion-label style="width: 100px;">统一信用代码<span class="danger">*</span></ion-label>
             <ion-input placeholder="请输入统一信用代码" label-placement="stacked" :clear-input="true"
-                       v-model="formState.dataModel.companyCode">
+                       v-model="dataModel.companyCode" 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.companyName.$error?'ion-invalid':'ion-valid']">
-            <ion-label style="width: 100px;">企业名称<span class="danger">*</span></ion-label>
             <ion-input placeholder="请输入企业名称" label-placement="stacked" :clear-input="true"
-                       v-model="formState.dataModel.companyName">
+                       v-model="dataModel.companyName" 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.siteID.$error?'ion-invalid':'ion-valid']">
-            <div style="width: 27%;">
-              <ion-label style="width: 100px;">服务驿站<span class="danger">*</span></ion-label>
-            </div>
-            <div style="width: 73%;text-align: left;">
-              <ion-select interface="action-sheet" placeholder="请选择服务驿站" cancel-text="取消" style="max-width: 70%;"
-                          id="siteID" v-model="formState.dataModel.siteID">
-                <ion-select-option v-for="(record,key) in siteList" :key="key"
-                                   v-model:value="record.siteID">
+              <ion-select id="siteID" name="siteID"  cancel-text="取消"  v-model="dataModel.siteID"
+                          interface="action-sheet" placeholder="请选择服务驿站"  style="width: 100%;text-align: left;">
+                <ion-select-option v-for="(record,key) in siteList" :key="key"  v-model:value="record.siteID">
                   {{ record.siteName }}
                 </ion-select-option>
               </ion-select>
-            </div>
             <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.address.$error?'ion-invalid':'ion-valid']">
-            <ion-label style="width: 100px;">企业办公地址<span class="danger">*</span></ion-label>
-            <ion-input placeholder="请输入企业办公地址" label-placement="stacked" :clear-input="true"
-                       v-model="formState.dataModel.address">
-            </ion-input>
+            <ion-textarea placeholder="请输入企业办公地址" label-placement="stacked" :rows="3" :clear-input="true"
+                       v-model="dataModel.address" class="custom" >
+            </ion-textarea>
             <ion-note slot="error">企业办公地址不能为空</ion-note>
           </ion-item>
-          <ion-item mode="md" :class="[v$.dataModel.address.$error?'ion-invalid':'ion-valid']">
-            <ion-label style="width: 100px;">企业联系人<span class="danger">*</span></ion-label>
+          <ion-label class="title-item">企业联系人<span class="danger">*</span></ion-label>
+          <ion-item mode="md" :class="[v$.dataModel.userName.$error?'ion-invalid':'ion-valid']">
             <ion-input placeholder="请输入企业联系人" label-placement="stacked" :clear-input="true"
-                       v-model="formState.dataModel.userName">
+                       v-model="dataModel.userName" 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.userMobile.$error?'ion-invalid':'ion-valid']">
-            <ion-label style="width: 100px;">企业联系电话<span class="danger">*</span></ion-label>
-            <ion-input placeholder="请输入企业联系电话" label-placement="stacked" :clear-input="true"
-                       v-model="formState.dataModel.userMobile">
+            <ion-input placeholder="请输入联系电话" label-placement="stacked" :clear-input="true"
+                       v-model="dataModel.userMobile" class="custom">
             </ion-input>
             <ion-note slot="error">企业联系电话不能为空</ion-note>
           </ion-item>
-          <ion-item mode="md" :class="[v$.dataModel.insuredCount.$error?'ion-invalid':'ion-valid']">
-            <ion-label style="width: 100px;">参保人数<span class="danger">*</span></ion-label>
-            <ion-input placeholder="请输入参保人数" label-placement="stacked" :clear-input="true"
-                       v-model="formState.dataModel.insuredCount">
-            </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.recordStatus.$error?'ion-invalid':'ion-valid']">
-            <div style="width: 27%;">
-              <ion-label style="width: 100px;">企业状态</ion-label>
-            </div>
-            <div style="width: 73%;text-align: left;">
-              <ion-select interface="action-sheet" placeholder="请选择企业状态" cancel-text="取消" style="max-width: 70%;"
-                          id="recordStatus" v-model="formState.dataModel.recordStatus">
-                <ion-select-option v-for="(record,key) in companyStatuslist" :key="key"
-                                   v-model:value="record.value">
-                  {{ record.name }}
-                </ion-select-option>
-              </ion-select>
-            </div>
+            <ion-select id="recordStatus" name="recordStatus" cancel-text="取消"  v-model="dataModel.recordStatus"
+                        interface="action-sheet" placeholder="请选择企业状态" style="width: 100%;text-align: left;">
+              <ion-select-option v-for="(record,key) in companyStatusList" :key="key"
+                                 v-model:value="record.value">
+                {{ record.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="[v$.dataModel.isShortAge.$error?'ion-invalid':'ion-valid']">
+            <ion-select id="isShortAge" name="isShortAge" cancel-text="取消"  v-model="dataModel.isShortAge"
+                        interface="action-sheet" placeholder="请选择是否缺工" style="width: 100%;text-align: left;">
+              <ion-select-option v-for="(record,key) in shortAgeTypeList" :key="key"
+                                 v-model:value="record.value">
+                {{ record.name }}
+              </ion-select-option>
+            </ion-select>
             <ion-note slot="error">企业状态不能为空</ion-note>
           </ion-item>
-          <ion-item mode="md" style="">
+
+
+
+
+          <ion-item mode="md" >
             <div class="panel-title2" style="width: 25%;">
               <div class="item-flag"></div>
               其他信息
@@ -115,99 +114,95 @@
                         style="font-size: 24px;"></ion-icon>
             </div>
           </ion-item>
-          <ion-item v-show="isShow" mode="md" :class="[v$.dataModel.regionCode.$error?'ion-invalid':'ion-valid']">
-            <div style="width: 27%;">
-              <ion-label style="width: 100px;">所属县区<span class="danger">*</span></ion-label>
-            </div>
-            <div style="width: 73%;">
-              <ion-select interface="action-sheet" placeholder="请选择所属县区" cancel-text="取消" @ionChange="changeCity"
-                          style="max-width: 70%;"
-                          id="regionCode" v-model="formState.dataModel.regionCode">
-                <ion-select-option v-for="(record,key) in regionList" :key="key"
+          <ion-list v-show="isShow" >
+            <ion-label class="title-item">法定代表人(负责人)</ion-label>
+            <ion-item mode="md">
+              <ion-input placeholder="请输入法定代表人" label-placement="stacked" :clear-input="true"
+                         v-model="dataModel.frName" class="custom">
+              </ion-input>
+            </ion-item>
+            <ion-label class="title-item">营业执照有效期</ion-label>
+            <ion-item mode="md">
+              <ion-datetime-button datetime="validTime"></ion-datetime-button>
+              <ion-modal :keep-contents-mounted="true">
+                <ion-datetime id="validTime" placeholder="营业执照有效期"
+                              v-model="dataModel.validTime"  :prefer-wheel="true"
+                              dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
+                              :show-default-buttons="true" >
+                </ion-datetime>
+              </ion-modal>
+            </ion-item>
+            <ion-label class="title-item">企业邮箱</ion-label>
+            <ion-item mode="md">
+              <ion-input placeholder="请输入企业邮箱" label-placement="stacked" :clear-input="true"
+                         v-model="dataModel.companyEmail" class="custom">
+              </ion-input>
+            </ion-item>
+            <ion-label class="title-item">企业归类</ion-label>
+            <ion-item mode="md">
+              <ion-select interface="action-sheet" placeholder="请选择企业归类" cancel-text="取消"
+                          id="companyType" v-model="dataModel.companyType"  style="width: 100%;text-align: left;">
+                <ion-select-option v-for="(record,key) in companyTypeList" :key="key"
                                    v-model:value="record.code">
                   {{ record.name }}
                 </ion-select-option>
               </ion-select>
-            </div>
-            <ion-note slot="error">所属县区不能为空</ion-note>
-          </ion-item>
-          <ion-item v-show="isShow" mode="md" :class="[v$.dataModel.streetCode.$error?'ion-invalid':'ion-valid']">
-            <div style="width: 27%;">
-              <ion-label style="width: 100px;">所属街道<span class="danger">*</span></ion-label>
-            </div>
-            <div style="width: 73%;">
-              <ion-select interface="action-sheet" placeholder="请选择所属街道" cancel-text="取消" style="max-width: 70%;"
-                          id="streetCode" v-model="formState.dataModel.streetCode">
-                <ion-select-option v-for="(record,key) in streetList" :key="key"
+            </ion-item>
+            <ion-label class="title-item">企业规模</ion-label>
+            <ion-item mode="md">
+              <ion-select interface="action-sheet" placeholder="请选择企业规模" cancel-text="取消"
+                          id="companyModel" v-model="dataModel.companyModel"  style="width: 100%;text-align: left;">
+                <ion-select-option v-for="(record,key) in companyModelList" :key="key"
+                                   v-model:value="record.code" style="width:100%;text-align: left;">
+                  {{ record.name }}
+                </ion-select-option>
+              </ion-select>
+            </ion-item>
+            <ion-label class="title-item">所属县区</ion-label>
+            <ion-item mode="md">
+              <ion-select interface="action-sheet" placeholder="请选择所属县区" cancel-text="取消" @ionChange="changeCity"
+                          id="regionCode" v-model="dataModel.regionCode" style="width:100%;text-align: left;">
+                <ion-select-option v-for="(record,key) in regionList" :key="key"
                                    v-model:value="record.code">
                   {{ record.name }}
                 </ion-select-option>
               </ion-select>
-            </div>
-            <ion-note slot="error">所属街道不能为空</ion-note>
-          </ion-item>
-          <ion-item v-show="isShow" mode="md" :class="[v$.dataModel.companyModel.$error?'ion-invalid':'ion-valid']">
-            <ion-label style="width: 100px;">企业规模<span class="danger">*</span></ion-label>
-            <ion-input placeholder="请输入企业规模" label-placement="stacked" :clear-input="true"
-                       v-model="formState.dataModel.companyModel">
-            </ion-input>
-            <ion-note slot="error">企业规模不能为空</ion-note>
-          </ion-item>
-          <ion-item v-show="isShow">
-            <div style="width: 27%;">
-              <ion-label style="width: 100px;">企业归类</ion-label>
-            </div>
-            <div style="width: 73%;">
-              <ion-select interface="action-sheet" placeholder="请选择企业归类" cancel-text="取消" style="max-width: 70%;"
-                          id="companyType" v-model="formState.dataModel.companyType">
-                <ion-select-option v-for="(record,key) in studentStatuslist" :key="key"
+            </ion-item>
+            <ion-label class="title-item">所属街道</ion-label>
+            <ion-item  mode="md">
+              <ion-select interface="action-sheet" placeholder="请选择所属街道" cancel-text="取消"
+                          id="streetCode" v-model="dataModel.streetCode" style="width: 100%;text-align: left;">
+                <ion-select-option v-for="(record,key) in streetList" :key="key"
                                    v-model:value="record.code">
                   {{ record.name }}
                 </ion-select-option>
               </ion-select>
-            </div>
-          </ion-item>
-          <ion-item v-show="isShow" mode="md" :class="[v$.dataModel.companyEmail.$error?'ion-invalid':'ion-valid']">
-            <ion-label style="width: 100px;">企业邮箱<span class="danger">*</span></ion-label>
-            <ion-input placeholder="请选择企业邮箱" label-placement="stacked" :clear-input="true"
-                       v-model="formState.dataModel.companyEmail">
-            </ion-input>
-            <ion-note slot="error">企业邮箱不能为空</ion-note>
-          </ion-item>
-          <ion-item v-show="isShow" mode="md" :class="[v$.dataModel.frName.$error?'ion-invalid':'ion-valid']">
-            <ion-label style="width: 100px;">法人代表<span class="danger">*</span></ion-label>
-            <ion-input placeholder="请选择法人代表" label-placement="stacked" :clear-input="true"
-                       v-model="formState.dataModel.frName">
-            </ion-input>
-            <ion-note slot="error">法人代表不能为空</ion-note>
-          </ion-item>
-          <ion-item v-show="isShow" mode="md" >
-<!--            <ion-datetime style="text-align:center;" presentation="date"  max="2099" min="2000" cancelText="取消" doneText="选择" placeholder="上班时间"-->
-<!--                          v-model="formState.dataModel.validTime"  name="validTime" id="validTime"></ion-datetime>-->
-
-<!--            <ion-datetime   display-format="YYYY-MM-DD" presentation="date"  name="birthday"-->
-<!--                            doneText="确定" cancelText="取消" v-model="formState.dataModel.validTime"-->
-<!--                            :picker-options="{ buttons: [{ text: 'Done', handler: doneHandler }] }">-->
-<!--              -->
-<!--            </ion-datetime>-->
-<!--            <ion-button @click="showSelectedDate">-->
-<!--              Show Selected Date-->
-<!--            </ion-button>-->
-
-            <div style="width: 30%;">
-              <ion-label style="width: 150px;">营业执照有效期<span class="danger">*</span></ion-label>
-            </div>
-            <div style="width: 70%;">
-              <ion-datetime-button datetime="validTime" style="width: 70%;"></ion-datetime-button>
-              <ion-modal :keep-contents-mounted="true">
-                <ion-datetime id="validTime" placeholder="营业执照有效期"
-                              v-model="formState.dataModel.validTime"
-                              dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
-                              :show-default-buttons="true">
-                </ion-datetime>
-              </ion-modal>
-            </div>
-          </ion-item>
+            </ion-item>
+            <ion-label class="title-item">用工情况(人)</ion-label>
+            <ion-item mode="md">
+              <ion-input type="number" placeholder="请输入用工人数" label-placement="stacked" :clear-input="true"
+                         v-model="dataModel.insuredCount" 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" :clear-input="true"
+                         v-model="dataModel.insuredCount" class="custom">
+              </ion-input>
+            </ion-item>
+            <ion-label class="title-item">经营范围</ion-label>
+            <ion-item mode="md">
+              <ion-textarea placeholder="请输入经营范围" :rows="3" label-placement="stacked" :clear-input="true"
+                            v-model="dataModel.businScope" class="custom">
+              </ion-textarea>
+            </ion-item>
+            <ion-label class="title-item">企业简介</ion-label>
+            <ion-item mode="md">
+              <ion-textarea placeholder="请输入企业简介" :rows="3" label-placement="stacked" :clear-input="true"
+                         v-model="dataModel.companyDesc" class="custom">
+              </ion-textarea>
+            </ion-item>
+          </ion-list>
         </ion-list>
       </form>
     </ion-content>
@@ -221,79 +216,85 @@
   </ion-page>
 </template>
 <script lang="ts">
-import {defineComponent, ref, toRefs, reactive, computed, watch} from "vue";
+import {defineComponent, ref, reactive, computed, watch, toRefs} from "vue";
 import {getRegionList, getSiteList, getStreeList,getCurrentDate} from '@/api/company/index'
-import {useRoute, useRouter} from "vue-router";
+import {useRoute,useRouter} from "vue-router";
 import {alertController, onIonViewDidEnter} from "@ionic/vue";
 import {useVuelidate} from "@vuelidate/core";
+import {getCompanyById} from "@/api/company";
 import {chevronDownOutline, chevronUpOutline, arrowBackOutline} from 'ionicons/icons';
-import {minLength, required} from "@vuelidate/validators";
+import {minLength,required} from "@vuelidate/validators";
 
-interface FormState {
-  dataModel: any;
+interface StepParams{
+  name: string,
+  statusVal: number
 }
-
 export default defineComponent({
   name: 'PracticeIntentionEdit',
   setup() {
-    const router = useRouter();
     const route = useRoute();
-    const formState = reactive<FormState>({dataModel: {}});
-    const stepList = ref([{title: '基础信息', desc: '企业基础信息', val: 1}, {
-      title: '岗位信息',
-      desc: '企业岗位信息',
-      val: 2
-    }]);
+    const router = useRouter();
+    const curStepData = ref<StepParams>({
+      name:"",
+      statusVal: 1
+    });
     const isShow = ref<any>(false);
+    const formState = reactive({
+      dataModel: {
+        companyCode: null,
+        companyName: null,
+        siteID: null,
+        address: null,
+        userName:null,
+        userMobile:null,
+        recordStatus: 1,
+        isShortAge: null,
+        frName: null,
+        validTime:new Date(),
+        companyEmail:null,
+        companyType:null,
+        companyModel:null,
+        regionCode:null,
+        streetCode:null,
+
+    }});
+
+    const stepList = ref([
+        {title: '基础信息', desc: '企业基础信息', val: 1},
+        {title: '岗位信息', desc: '企业岗位信息', val: 2}
+    ]);
+    const companyTypeList = ref<any>([]);
+    const companyModelList = ref<any>([]);
     const regionList = ref<any>([]);
     const streetList = ref<any>([]);
     const siteList = ref<any>([]);
-    const companyStatuslist = [
+    const companyStatusList = [
       {value: 1, name: '在营'},
       {value: 0, name: '关闭'},
     ];
+    const shortAgeTypeList =[
+      {value: 1, name: '是'},
+      {value: 0, name: '否'},
+    ];
 
     const showSelectedDate=()=>{
       console.log('Selected Date:', formState.dataModel.validTime);
     }
-
-    const  doneHandler=()=>{
+    const doneHandler=()=>{
       console.log('Selected Date:',formState.dataModel.validTime);
     }
 
     const rules = computed(() => {
       return {
-        // dataModel: {
-        //   companyName: {required: true},
-        //   companyCode: {required: true},
-        //   siteID: {required: true},
-        //   regionCode: {required: true},
-        //   streetCode: {required: true},
-        //   address: {required: true},
-        //   companyModel: {required: true},
-        //   userName: {required: true},
-        //   userMobile: {required: true},
-        //   companyEmail: {required: true},
-        //   frName: {required: true},
-        //   validTime: {required: true},
-        //   recordStatus: {required: true},
-        //   insuredCount: {required: true},
-        // }
         dataModel: {
-          companyName: {required},
           companyCode: {required},
+          companyName: {required},
           siteID: {required},
-          regionCode: {required},
-          streetCode: {required},
           address: {required},
-          companyModel: {required},
           userName: {required},
           userMobile: {required},
-          companyEmail: {required},
-          frName: {required},
-          validTime: {required},
           recordStatus: {required},
-          insuredCount: {required},
+          isShortAge: {required},
         }
       }
     });
@@ -322,44 +323,44 @@ export default defineComponent({
         regionList.value = data;
       });
     }
-
     const getStreetListData = (code: any) => {
       getStreeList({code: code}).then(data => {
         streetList.value = data;
       });
     }
-
-    const getSitetListData = () => {
+    const getSiteListData = () => {
       getSiteList({}).then(data => {
         siteList.value = data;
       });
     }
-
     const changeCity = () => {
       console.log(formState.dataModel.regionCode);
       if (formState.dataModel.regionCode)
         getStreetListData(formState.dataModel.regionCode);
     }
 
-    const initData = () => {
-      getRegionListData();
-      getSitetListData();
+    const loadData = async (companyID: any,status:any) => {
+      curStepData.value.statusVal = status;
+      console.log("当前companyID",companyID);
+      const reqData = await getCompanyById(companyID);
+      formState.dataModel = reqData;
+      console.log('dataModel',formState.dataModel);
     };
 
-    onIonViewDidEnter(() => {
-      initData();
-      if (route.query.pageStatus == '1') {
-        formState.dataModel = {recordStatus: 1, statusVal: 1};
-        formState.dataModel.validTime = getCurrentDate();
+    watch(() => route.query, () => {
+      if (route.query.reload) {
+        loadData(route.query.companyID,route.query.status);
       }
     });
 
-    watch(() => route.query, () => {
-      if (route.query.date) {
-        if (route.query.pageStatus == '1') {
-          formState.dataModel = {recordStatus: 1, statusVal: 1};
-          formState.dataModel.validTime = getCurrentDate();
-        }
+    const reload = (companyID:any,status:any) => {
+      isShow.value = false;
+      loadData(companyID,status);
+    }
+
+    onIonViewDidEnter(() => {
+      if (route.query.reload) {
+        reload(route.query.companyID,route.query.status);
       }
     });
 
@@ -375,14 +376,6 @@ export default defineComponent({
       await alert.present();
     }
 
-    // const getCurrentDate = () => {
-    //   const validDate = new Date();
-    //   // 获取年月日
-    //   const year = validDate.getFullYear();
-    //   const month = validDate.getMonth() + 1; // 注意月份是从0开始的,需要加1
-    //   const day = validDate.getDate();
-    //   return `${year}-${month}-${day}`;
-    // }
 
     const back=()=>{
       isShow.value=false;
@@ -390,32 +383,57 @@ export default defineComponent({
     }
 
     return {
-      formState,
-      stepList,
-      initData,
-      onCancel,
-      next,
-      route,
-      back,
+      ...toRefs(formState),
       arrowBackOutline,
       chevronDownOutline,
       chevronUpOutline,
+      route,
+      isShow,
       router,
+      v$,
+      curStepData,
+      stepList,
+      companyTypeList,
+      siteList,
       regionList,
       streetList,
-      companyStatuslist,
+      shortAgeTypeList,
+      companyStatusList,
+      companyModelList,
+      next,
+      back,
+      onCancel,
+      getRegionListData,
+      getSiteListData,
       changeCity,
-      v$,
-      siteList,
-      isShow,
       showSelectedDate,
+      loadData,
       doneHandler
     }
+  },mounted(){
+    this.getRegionListData();
+    this.getSiteListData();
+    const companyID = this.route.query.companyID;
+    const status = this.route.query.status;
+    this.loadData(companyID,status);
   }
 });
 </script>
 
 <style lang="less">
+
+.custom{
+  --placeholder-color: gray;
+  --placeholder-font-style:italic;
+  --placeholder-opacity: 1;
+}
+
+.title-item{
+  margin-left: 15px;
+  color:#3a7be0;
+  font-size: 20px;
+}
+
 ion-item {
   --border-width: 0;
   --border-style: none;
@@ -474,7 +492,7 @@ ion-item {
     border: 4px solid #c5e8f9;
   }
 
-  .greyCircle {
+  .grayCircle {
     top: calc(50% - 15px);
     left: calc(50% - 4px);
     position: absolute;
@@ -485,7 +503,7 @@ ion-item {
     background-color: #ccc;
   }
 
-  .greenline {
+  .greenLine {
     width: 100%;
     top: calc(50% - 11px);
     left: calc(50% - 2px);
@@ -494,7 +512,7 @@ ion-item {
     position: absolute;
   }
 
-  .greyline {
+  .grayLine {
     height: 0;
     border: 1px dashed #ccc;
     width: 100%;

+ 14 - 16
h5app/src/views/pages/company/list.vue

@@ -7,23 +7,21 @@
         </ion-buttons>
         <ion-title>企业信息收集</ion-title>
         <ion-buttons slot="end">
-          <ion-icon :icon="addCircleOutline" @click="onAdd()"></ion-icon>
+          <ion-icon :icon="addCircleOutline" @click="onAdd"></ion-icon>
         </ion-buttons>
       </ion-toolbar>
     </ion-header>
     <ion-content>
       <ion-item style="margin: 10px 0;">
         <ion-input style="border: 1px solid #f2f2f5;border-radius: 14px;--padding-start: 10px;height: 35px;"
-                   v-model="searchParams.companyName"
-        ></ion-input>
+                   v-model="searchParams.companyName" placeholder="请输入公司名称" ></ion-input>
         <ion-button slot="end"
                     style="height: 33px;width: 70px;margin-left: 10px;--box-shadow: none;--border-radius: 14px;"
-                    @click="search"
-        >搜索
+                    @click="search" >搜索
         </ion-button>
       </ion-item>
       <ion-list class="list-content">
-        <ion-item v-for="(record,key) in dataList" :key="key" detail @click="enterPost(record.companyID)">
+        <ion-item v-for="(record,key) in dataList" :key="key" detail @click="onEdit(record.companyID)">
           <ion-grid>
             <ion-row>
               <ion-col>
@@ -31,9 +29,10 @@
                   <ion-text>
                     {{ record.companyName }}
                   </ion-text>
-                  <p>
-                    正在跟进
-                  </p>
+                  <ion-label slot="end">
+                    <ion-text style="text-align:right;color:#3a7be0;">◆</ion-text>
+                    <ion-text style="text-align:right;">正在跟进</ion-text>
+                  </ion-label>
                 </ion-label>
               </ion-col>
             </ion-row>
@@ -42,7 +41,6 @@
                 <ion-label>
                   <p>
                     最新跟进时间:{{ record.modifyTime }}
-
                   </p>
                 </ion-label>
               </ion-col>
@@ -51,7 +49,7 @@
               <ion-col>
                 <ion-label style="display: flex;justify-content: space-between;">
                   <p>
-                    参保人数:{{ record.insuredCount }}人
+                    参保人数:{{ record.insuredCount==null?"0":record.insuredCount }}人
                   </p>
                   <p>
                     岗位数量:{{ record.postCount }}
@@ -139,12 +137,12 @@ export default defineComponent({
       }, 500);
     }
 
-    const onAdd = (item: any) => {
-      router.push({path: './edit', query: {pageStatus: 1, id: "", date: new Date().getTime()}});
+    const onAdd = () => {
+      router.push({path: './edit', query: {reload: 1,id: "",status: 1}});
     }
 
-    const enterPost = (companyID: any) => {
-      router.push({path: './postList', query: {id: companyID, pageStatus: 1, reload: 1}});
+    const onEdit = (companyID:string) => {
+      router.push({path: './menu', query: {reload: 1,id: companyID,status: 2}});
     }
 
     const search = () => {
@@ -176,7 +174,7 @@ export default defineComponent({
       arrowBackOutline,
       addCircleOutline,
       searchParams,
-      enterPost,
+      onEdit,
       search
     }
   }

+ 224 - 0
h5app/src/views/pages/company/menu.vue

@@ -0,0 +1,224 @@
+<template>
+  <ion-page>
+    <ion-header class="header-theme2">
+      <ion-toolbar>
+        <ion-buttons slot="start">
+          <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">
+          <div
+              :class="[(record.val < curStepData?.statusVal || curStepData?.statusVal == stepList[stepList.length-1].val) ? 'greenCircle' :record.val == curStepData?.statusVal ? 'now' : 'greyCircle']"></div>
+          <div v-if="key !== stepList.length - 1"
+               :class="[record.val < curStepData?.statusVal ? 'greenline' : 'greyline']"></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>
+       <ion-item>
+         <ion-label style="text-align: center;color:#46b0e0;">
+           <h2 style="font-size: 28px;">
+             {{ dataModel.companyName == null?"":dataModel.companyName }}
+           </h2>
+         </ion-label>
+       </ion-item>
+      <ion-item style="padding-left: 75px;">
+          <ion-button expand="block" style="width: 140px;height:50px;font-size: 22px;margin-right: 10px;" @click="onPathForward('./edit',2)">信息维护</ion-button>
+          <ion-button expand="block" style="width: 140px;height:50px;font-size: 22px;margin-left: 10px;" @click="onPathForward('./postList',3)">岗位管理</ion-button>
+      </ion-item>
+    </ion-content>
+    <ion-footer>
+    </ion-footer>
+  </ion-page>
+</template>
+<script lang="ts">
+import {defineComponent, ref, reactive, watch, toRefs} from "vue";
+import {getCompanyById} from "@/api/company";
+import {useRoute, useRouter} from "vue-router";
+import {onIonViewDidEnter} from "@ionic/vue";
+import {arrowBackOutline} from 'ionicons/icons';
+
+interface StepParams{
+  name: string,
+  statusVal: number
+}
+
+interface FormData{
+  dataModel:any
+}
+export default defineComponent({
+  name: 'CompanyMenu',
+  setup() {
+    const router = useRouter();
+    const route = useRoute();
+    const curStepData = ref<StepParams>({
+      name:"",
+      statusVal: 1
+    });
+    const loading = ref<boolean>(false);
+    const formData = reactive<FormData>({
+      dataModel: {
+        companyID:null,
+        companyName:null
+      }
+    });
+    const stepList = ref([
+        {title: '基础信息', desc: '企业基础信息', val: 1},
+        {title: '', desc: '', val: 2},
+        {title: '岗位信息', desc: '企业岗位信息', val: 3}
+    ]);
+    const loadData = async (companyID:any,status:any)=>{
+      loading.value = true;
+      curStepData.value.statusVal = status;
+      console.log(companyID);
+      const reqData = await getCompanyById(companyID);
+      formData.dataModel = reqData;
+      console.log("dataModel",formData.dataModel);
+      loading.value = false;
+    }
+
+    watch(() => route.query, () => {
+      if (route.query.reload) {
+        reload(route.query.id,route.query.status);
+      }
+    });
+
+    const reload = (companyID:any,status:any) => {
+      loadData(companyID,status);
+    }
+
+    onIonViewDidEnter(() => {
+      if (route.query.reload) {
+        reload(route.query.id,route.query.status)
+      }
+    });
+
+    const onPathForward = (pathValue:string,statusValue:any)=>{
+      router.push({path: pathValue, query: {reload:1,companyID:formData.dataModel.companyID,status:statusValue}});
+    }
+
+    const onBack=()=>{
+      router.push('./list');
+    }
+
+    return {
+      ...toRefs(formData),
+      arrowBackOutline,
+      route,
+      loading,
+      stepList,
+      curStepData,
+      onPathForward,
+      onBack,
+      loadData,
+      router,
+    }
+  },
+  mounted() {
+    const companyID = this.route.query.id;
+    const status = this.route.query.status;
+    this.loadData(companyID,status);
+  }
+});
+</script>
+
+<style lang="less">
+ion-item {
+  --border-width: 0;
+  --border-style: none;
+
+  ion-label, ion-input, ion-select, ion-datetime-button {
+    font-size: 14px !important;
+  }
+}
+
+.stepFlex {
+  margin: 0;
+  display: flex;
+  width: 100%;
+
+  .stepFlex-item {
+    position: relative;
+    flex: 1;
+    text-align: center;
+    margin-top: -10px;
+
+    .stepFlex-item-label {
+      padding-top: 60px;
+      font-size: 14px;
+
+      .stepFlex-item-label-title {
+        margin-top: 30px;
+      }
+
+      .stepFlex-item-label-desc {
+        margin-top: 5px;
+        color: #b9b9bd;
+      }
+    }
+  }
+
+  .greenCircle {
+    top: calc(50% - 15px);
+    left: calc(50% - 4px);
+    position: absolute;
+    z-index: 2;
+    width: 10px;
+    height: 10px;
+    border-radius: 50%;
+    background-color: #31A2FE;
+  }
+
+  .now {
+    top: calc(50% - 18px);
+    left: calc(50% - 8px);
+    position: absolute;
+    z-index: 3;
+    width: 16px;
+    height: 16px;
+    border-radius: 50%;
+    background-color: #31A2FE;
+    border: 4px solid #c5e8f9;
+  }
+
+  .greyCircle {
+    top: calc(50% - 15px);
+    left: calc(50% - 4px);
+    position: absolute;
+    z-index: 2;
+    width: 10px;
+    height: 10px;
+    border-radius: 50%;
+    background-color: #ccc;
+  }
+
+  .greenline {
+    width: 100%;
+    top: calc(50% - 11px);
+    left: calc(50% - 2px);
+    height: 2px;
+    background-color: #31A2FE;
+    position: absolute;
+  }
+
+  .greyline {
+    height: 0;
+    border: 1px dashed #ccc;
+    width: 100%;
+    top: calc(50% - 11px);
+    left: calc(50% - 2px);
+    position: absolute;
+  }
+
+}
+
+
+</style>

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

@@ -326,7 +326,6 @@ export default defineComponent({
   setup() {
     const router = useRouter();
     const route = useRoute();
-    const editForm = ref();
     const expand = ref<boolean>(false);
     const loading = ref(true);
     const siteInfoList = ref<SelectProps[]>([]);
@@ -354,7 +353,8 @@ export default defineComponent({
     const streetList  = ref<SelectProps[]>([]);
     const educationList = ref([]);
     const jobHuntList = ref<SelectProps[]>([]);
-    const baseInfoData = reactive({baseData:{
+    const baseInfoData = reactive({
+      baseData:{
         jobUserID:null,
         siteID:null,
         name:null,
@@ -565,7 +565,6 @@ export default defineComponent({
       router,
       expand,
       loading,
-      editForm,
       stepList,
       curStepData,
       baseDataValid,

+ 5 - 0
pom.xml

@@ -147,6 +147,11 @@
             <scope>system</scope>
             <systemPath>${project.basedir}\lib\aspose-words-15.8.0-jdk16.jar</systemPath>
         </dependency>
+        <dependency>
+            <groupId>com.belerweb</groupId>
+            <artifactId>pinyin4j</artifactId>
+            <version>2.5.1</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 119 - 12
src/main/java/com/hz/employmentsite/services/impl/baseSettings/SiteUserImpl.java

@@ -3,22 +3,31 @@ package com.hz.employmentsite.services.impl.baseSettings;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 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.cquery.UserInfoCQuery;
-import com.hz.employmentsite.model.PcSiteUser;
-import com.hz.employmentsite.model.PcSiteUserExample;
-import com.hz.employmentsite.model.SelectProps;
+import com.hz.employmentsite.model.*;
 import com.hz.employmentsite.services.service.baseSettings.SiteUserService;
 import com.hz.employmentsite.util.StringUtils;
 import com.hz.employmentsite.vo.baseSettings.SiteUserVo;
+import net.sourceforge.pinyin4j.PinyinHelper;
+import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
+import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
+import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
+import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
+import org.apache.tomcat.util.security.MD5Encoder;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.DigestUtils;
 
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.UUID;
 
-@Service("UserInfoService")
+@Service("SiteUserService")
 public class SiteUserImpl implements SiteUserService {
 
     @Autowired
@@ -32,6 +41,13 @@ public class SiteUserImpl implements SiteUserService {
 
     @Autowired
     private SysUserMapper sysUserMapper;
+
+    @Autowired
+    private SysRoleMapper sysRoleMapper;
+
+    @Autowired
+    private SysUserSysRoleMapper sysUserSysRoleMapper;
+
     @Override
     public PageInfo<SiteUserVo> getList(int pageIndex, int pageSize, String primaryKey, String userName) {
         PageHelper.startPage(pageIndex, pageSize);
@@ -76,9 +92,38 @@ public class SiteUserImpl implements SiteUserService {
         SiteUserVo record = get(data.siteUserID);
         PcSiteUser dbData = record ==null ? null : pcSiteUserMapper.selectByPrimaryKey(record.siteUserID);
         Boolean isExist = dbData != null;
+        SysUser curSysUserData = data.userID != null ? sysUserMapper.selectByPrimaryKey(data.userID):null;
+        Boolean isLinkUser = curSysUserData != null;
+        /*SysRoleExample roleExp = null;*/
+        /*注意:这里的data.roleID为用户类型ID*/
         if (!isExist) {
             //添加
+            //处理用户表
+            curSysUserData = new SysUser();
+            curSysUserData.setUserID(UUID.randomUUID().toString());
+            curSysUserData.setName(data.getSiteUserName());
+            curSysUserData.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()).toUpperCase());
+            curSysUserData.setLoginID(StrToPinYin(data.getSiteUserName()));
+            curSysUserData.setUserTypeID(data.getRoleID());
+            curSysUserData.setCreateTime(new Date());
+            curSysUserData.setCreateBy(userId);
+            curSysUserData.setRecordStatus(1);
+            result += sysUserMapper.insert(curSysUserData);
+            //处理用户角色表
+            /*roleExp = new SysRoleExample();
+            roleExp.or().andUserTypeIDEqualTo(data.getRoleID());
+            var curRoleLink= sysRoleMapper.selectByExample(roleExp).stream().toList();
+            if (curRoleLink != null && curRoleLink.size() > 0){
+                for(SysRole curLinkData : curRoleLink) {
+                    SysUserSysRoleKey newLinkData = new SysUserSysRoleKey();
+                    newLinkData.setUserID(curSysUserData.getUserID());
+                    newLinkData.setRoleID(curLinkData.getRoleID());
+                    result += sysUserSysRoleMapper.insert(newLinkData);
+                }
+            }*/
+            //处理站点人员表
             dbData = new PcSiteUser();
+            dbData.setUserID(curSysUserData.getUserID());
             dbData.setSiteUserID(data.getSiteUserID());
             dbData.setSiteID(data.getSiteID());
             dbData.setGender(data.getGender());
@@ -88,9 +133,44 @@ public class SiteUserImpl implements SiteUserService {
             dbData.setMobile(data.getMobile());
             dbData.setCreateUserID(userId);
             dbData.setCreateTime(new Date());
-            result = pcSiteUserMapper.insert(dbData);
+            result += pcSiteUserMapper.insert(dbData);
         } else {
             //修改
+
+            //处理用户角色表(先删除再添加)
+            /*SysUserSysRoleExample userRoleExp = new  SysUserSysRoleExample();
+            userRoleExp.or().andUserIDEqualTo(data.userID);
+            var curUserRoleLink = sysUserSysRoleMapper.selectByExample(userRoleExp).stream().toList();
+            if (curUserRoleLink != null && curUserRoleLink.size() > 0){
+                for(SysUserSysRoleKey curLinkData : curUserRoleLink) {
+                    userRoleExp.or().andUserIDEqualTo(curLinkData.getRoleID());
+                    result += sysUserSysRoleMapper.deleteByExample(userRoleExp);
+                }
+            }
+            roleExp = new SysRoleExample();
+            roleExp.or().andUserTypeIDEqualTo(data.roleID);
+            var curRoleLink= sysRoleMapper.selectByExample(roleExp).stream().toList();
+            if (curRoleLink != null && curRoleLink.size() > 0){
+                for(SysRole curLinkData : curRoleLink) {
+                    SysUserSysRoleKey newLinkData = new SysUserSysRoleKey();
+                    newLinkData.setUserID(data.userID);
+                    newLinkData.setRoleID(curLinkData.getRoleID());
+                    result += sysUserSysRoleMapper.insert(newLinkData);
+                }
+            }*/
+
+            //处理用户表
+            if(isLinkUser){
+                curSysUserData.setName(data.siteUserName);
+                curSysUserData.setUserTypeID(data.roleID);
+                curSysUserData.setLoginID(StrToPinYin(data.siteUserName));
+                curSysUserData.setUpdateTime(new Date());
+                curSysUserData.setUpdateBy(userId);
+                result += sysUserMapper.updateByPrimaryKey(curSysUserData);
+            }
+
+            //处理站点人员表
+            dbData.setUserID(data.userID);
             dbData.setSiteUserID(data.siteUserID);
             dbData.setSiteID(data.getSiteID());
             dbData.setGender(data.gender);
@@ -100,14 +180,10 @@ public class SiteUserImpl implements SiteUserService {
             dbData.setMobile(data.mobile);
             dbData.setUpdateBy(userId);
             dbData.setUpdateTime(new Date());
-            result = pcSiteUserMapper.updateByPrimaryKey(dbData);
-        }
-        /*修改驿站人员角色时,同步修改已绑定的用户类型*/
-        if(data.userID!=null){
-            var curUserInfo=  sysUserMapper.selectByPrimaryKey(data.userID);
-            curUserInfo.setUserTypeID(data.roleID);
-            result += sysUserMapper.updateByPrimaryKey(curUserInfo);
+            result += pcSiteUserMapper.updateByPrimaryKey(dbData);
+
         }
+
         return result;
     }
 
@@ -115,7 +191,38 @@ public class SiteUserImpl implements SiteUserService {
     public Integer delete(List<String> idList){
         PcSiteUserExample contactExample = new PcSiteUserExample();
         contactExample.or().andSiteUserIDIn(idList);
+        var delSiteUserData = pcSiteUserMapper.selectByExample(contactExample).stream().toList();
         pcSiteUserMapper.deleteByExample(contactExample);
+        if (delSiteUserData != null && delSiteUserData.size() > 0){
+            for(PcSiteUser curDelData : delSiteUserData) {
+                /*SysUserSysRoleExample userRoleExp = new SysUserSysRoleExample();
+                userRoleExp.or().andUserIDEqualTo(curDelData.getUserID());
+                sysUserSysRoleMapper.deleteByExample(userRoleExp);*/
+                SysUserExample userExp = new SysUserExample();
+                userExp.or().andUserIDEqualTo(curDelData.getUserID());
+                sysUserMapper.deleteByExample(userExp);
+            }
+        }
         return pcSiteUserMapper.deleteByExample(contactExample);
     }
+
+    public String StrToPinYin(String chinese){
+        String pinyinStr = "";
+        char[] newChar = chinese.toCharArray();
+        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
+        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
+        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
+        for (int i = 0; i < newChar.length; i++) {
+            if (newChar[i] > 128) {
+                try {
+                    pinyinStr += PinyinHelper.toHanyuPinyinStringArray(newChar[i], defaultFormat)[0];
+                } catch (BadHanyuPinyinOutputFormatCombination e) {
+                    e.printStackTrace();
+                }
+            }else{
+                pinyinStr += newChar[i];
+            }
+        }
+        return pinyinStr;
+    }
 }

+ 1 - 1
vue/src/views/baseSettings/siteUser/edit.vue

@@ -25,7 +25,7 @@
       </a-row>
       <a-row type="flex">
         <a-col :span="7">
-          <a-form-item label="角色"  name="roleID" :label-col="{span:7}" :rules="[{ required: true, message: '请选择人员角色!' }]">
+          <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>

+ 1 - 1
vue/src/views/baseSettings/siteUser/index.vue

@@ -84,7 +84,7 @@ export default defineComponent({
     const columns: TableColumnsType = [
       {title: '序号', align: "center",key: 'siteUserID',customRender: item => `${searchParams.pageSize * (searchParams.pageIndex - 1) + item.index + 1}`},
       {title: '人员名称', dataIndex: 'siteUserName', key: 'siteUserName', align: "center"},
-      {title: '角色', dataIndex: 'roleName', key: 'roleName',width:120, 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: '操作', key: 'operation', fixed: 'right',width:170, align: "center"},

+ 1 - 1
vue/src/views/system/role/roleUser.vue

@@ -157,7 +157,7 @@ export default defineComponent({
         key: 'userID',
         customRender: item => `${searchParamsState.rows * (searchParamsState.page - 1) + item.index + 1}`
       },
-      {title: '帐号', dataIndex: 'loginId', key: 'loginId', width: 150},
+      {title: '帐号', dataIndex: 'loginID', key: 'loginID', width: 150},
       {title: '用户名称', width: 150, dataIndex: 'name', key: 'name',},
     ];
     const formState = reactive({