Bläddra i källkod

员工档案功能优化和字段添加

songxy 9 månader sedan
förälder
incheckning
e1d29493f1

BIN
client/src/assets/imgs/menus/xmgz_icon.png


+ 8 - 4
client/src/components/TreeSelectV2/index.vue

@@ -74,7 +74,7 @@ const $props = withDefaults(
 )
 const $emit = defineEmits<{
   (e: 'update:modelValue', v: any): void
-  (e: 'node-click', v: any): void
+  (e: 'node-click', v: any, t?: string[]): void
 }>()
 const visiable = ref<boolean>(false)
 const isRotate = ref<boolean>(false)
@@ -131,15 +131,16 @@ const setExpandedKeys = async () => {
 const nodeClickHandle = (data) => {
   visiable.value = false
   $emit('update:modelValue', data[$props.props['value'] ?? 'value'])
-  $emit('node-click', data)
   //@ts-ignore
   const item = treeRef.value?.getNode($props.modelValue)
   if (item && $props.labelAll) {
     const arrs = initLabelNameAll(item)
     labelName.value = arrs.join('-')
-    return
+    $emit('node-click', data, arrs)
+  } else {
+    labelName.value = data[$props.props['label'] ?? 'label']
+    $emit('node-click', data, [labelName.value])
   }
-  labelName.value = data[$props.props['label'] ?? 'label']
 }
 
 watchEffect(() => {
@@ -172,6 +173,9 @@ const initLabelNameAll = (item): string[] => {
   arrs.reverse()
   return arrs
 }
+defineExpose({
+  labelName
+})
 </script>
 
 <style lang="scss" scoped>

+ 3 - 3
client/src/views/OaSystem/components/DistrictTree/index.vue

@@ -48,7 +48,7 @@ const props = defineProps({
 })
 const emit = defineEmits<{
   (e: 'update:modelValue', v: any): void
-  (e: 'nodeClick', v: any): void
+  (e: 'nodeClick', v: any, t?: string[]): void
 }>()
 const xzqdm = computed({
   get: () => Number(props.modelValue),
@@ -56,8 +56,8 @@ const xzqdm = computed({
 })
 const { data: areaTree } = useQuery([getAreaTree.name], getAreaTree)
 
-const nodeClickHandler = (node) => {
-  emit('nodeClick', node)
+const nodeClickHandler = (node, labels) => {
+  emit('nodeClick', node, labels)
 }
 </script>
 

+ 14 - 2
client/src/views/OaSystem/marketCenter/contractSubOut/applyIndex.vue

@@ -6,7 +6,7 @@
         <el-input
           v-model="queryParams.projectName"
           placeholder="请输入项目名称"
-          style="width: 210px"
+          style="width: 160px"
         />
       </div>
       <div class="form">
@@ -17,6 +17,10 @@
           style="width: 160px"
         />
       </div>
+      <div class="form">
+        <span class="formSpan">责任部门:</span>
+        <DeptTree v-model="queryParams['zrbmId']" placeholder="请选择责任部门" />
+      </div>
       <div class="form">
         <span class="formSpan">申请人:</span>
         <UserOrgTree v-model="queryParams['userId']" placeholder="请选择申请人" />
@@ -176,6 +180,7 @@ import request from '@/config/axios'
 import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
 import subscribe from '@/utils/Subscribe'
 import UserOrgTree from '@/views/OaSystem/components/UserOrgTree/index.vue'
+import DeptTree from '@/views/OaSystem/components/DeptTree/index.vue'
 
 defineOptions({ name: 'ContractSubOut' })
 
@@ -225,7 +230,7 @@ const queryParams = reactive<QueryParams>({
   projectNumber: '',
   applyType: -1,
   pageNo: 1,
-  pageSize: 10,
+  pageSize: 15,
   userId: userId
 })
 
@@ -416,3 +421,10 @@ onMounted(() => {
   tableHeight.value = tableRef.value.clientHeight
 })
 </script>
+
+<style lang="scss" scoped>
+.form {
+  width: 14.5rem !important;
+  margin-right: 1rem !important;
+}
+</style>

+ 10 - 2
client/src/views/OaSystem/mineCenter/rightChild/wdda.vue

@@ -151,6 +151,7 @@ const saveFamilyList = (newData: any[]) => {
 }
 // 修改并保存学习经历
 const saveSchoolList = (newData: any[]) => {
+  console.log(newData)
   data.value['schoolList'] = newData.map((item) => ({ ...item, userId }))
 }
 // 修改并保存职称证书
@@ -281,14 +282,21 @@ const saveTechCertificateList = (newData: any[]) => {
   height: 100%;
   padding: 30px 30px 0;
   overflow: auto;
-
+  padding-top: 0px !important;
   .edit-button {
     text-align: right;
+    position: sticky;
+    right: 20px;
+    width: 100%;
+    left: 20px;
+    top: 0px;
+    background: #fff;
+    padding: 10px 0px;
+    z-index: 9999;
   }
 
   .my-portrait-item {
     margin-bottom: 30px;
-
     .title {
       display: flex;
       align-items: center;

+ 8 - 3
client/src/views/OaSystem/personnelManagement/ygdaPage/SchoolTable.vue

@@ -145,7 +145,7 @@ const updateUrl =
   import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + import.meta.env.VITE_UPLOAD_URL
 
 interface ITable {
-  indexCode?: number //排序序号
+  indexCode?: number | string //排序序号
   id?: string
   userId?: string
   major?: string // 专业
@@ -234,8 +234,6 @@ const deleteRow = (index: number) => {
 }
 // 回填正确路径
 const imageUrl = (url) => {
-  console.log('url------------------')
-  console.log(url)
   if (!url) return []
   return url.split(',').map((item, index) => ({
     url: item,
@@ -262,6 +260,13 @@ const upAndDownHandle = (row, index: number, i: number = 1) => {
   old['indexCode'] = indexCode
   tableData.value[indexCode - 1 * i] = cRow
   tableData.value[indexCode] = old
+  tableData.value.forEach((item, index) => {
+    item['indexCode'] = index.toString()
+  })
+  const changeData = cloneDeep(tableData.value).map((item: any) => {
+    return item
+  })
+  $emit('onSave', changeData)
 }
 </script>
 <style scoped lang="scss">

+ 3 - 3
client/src/views/OaSystem/personnelManagement/ygdaPage/TechCertificate.vue

@@ -39,10 +39,10 @@
           <span v-else>{{ moment(scope.row.acTime).format('YYYY-MM-DD') }}</span>
         </template>
       </el-table-column>
-      <el-table-column prop="certDetail" label="发证机构">
+      <el-table-column prop="fzjg" label="发证机构">
         <template #default="scope">
-          <el-input v-model="scope.row.certDetail" v-if="scope.row.isEdit" />
-          <span v-else>{{ scope.row.certDetail }}</span>
+          <el-input v-model="scope.row.fzjg" v-if="scope.row.isEdit" />
+          <span v-else>{{ scope.row.fzjg }}</span>
         </template>
       </el-table-column>
       <el-table-column prop="filePath" label="附件" width="400px">

+ 14 - 3
client/src/views/OaSystem/personnelManagement/ygdaPage/WorkTable.vue

@@ -43,12 +43,17 @@
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="工作单位">
+              <el-form-item label="位">
                 <el-input v-model="item.post" :disabled="!item.isEdit" />
               </el-form-item>
             </el-col>
           </el-row>
           <el-row :gutter="66">
+            <el-col :span="12">
+              <el-form-item label="单位名称">
+                <el-input v-model="item.workLocation" :disabled="!item.isEdit" />
+              </el-form-item>
+            </el-col>
             <el-col :span="12">
               <el-form-item label="是否有竞业限制/未尽法律事宜">
                 <el-select v-model="item.jyxy" style="width: 100%" :disabled="!item.isEdit">
@@ -57,9 +62,15 @@
                 </el-select>
               </el-form-item>
             </el-col>
-            <el-col :span="12" v-if="item.jyxy === '1'">
+          </el-row>
+          <el-row :gutter="66">
+            <el-col :span="24" v-if="item.jyxy === '1'">
               <el-form-item label="具体条款">
-                <el-input v-model="item.competitionDetail" :disabled="!item.isEdit" />
+                <el-input
+                  type="textarea"
+                  v-model="item.competitionDetail"
+                  :disabled="!item.isEdit"
+                />
               </el-form-item>
             </el-col>
           </el-row>

+ 336 - 291
client/src/views/OaSystem/personnelManagement/ygdaPage/staffDetail.vue

@@ -25,6 +25,7 @@ const { query } = useRoute()
 const { id, type } = query
 const formRef = ref<FormInstance>()
 const formData = ref({})
+const tabNav = ref<string>('#gsxx')
 let avatar = avatarImg
 
 /**获取员工档案详情 */
@@ -114,7 +115,14 @@ const imagePreview = (imgUrl: string) => {
     urlList: [imgUrl]
   })
 }
-
+//模拟锚点跳转
+const goAnchor = (selector) => {
+  tabNav.value = selector
+  //参数selector是id选择器(#anchor14)
+  document.querySelector(selector).scrollIntoView({
+    behavior: 'smooth'
+  })
+}
 /**是否是编辑页面 */
 const isEdit = computed(() => {
   return type === 'edit'
@@ -143,25 +151,12 @@ const savePerformanceList = (data: any[]) => {
 </script>
 <template>
   <div class="staff-files-wrap">
-    <div class="staff-name">
-      <el-image
-        class="staff-avator"
-        :src="avatar"
-        :zoom-rate="1.2"
-        :max-scale="7"
-        :min-scale="0.2"
-        @click="imagePreview(avatar)"
-        :initial-index="0"
-      />
-      <span>{{ formData?.['nickname'] }}员工档案</span>
-    </div>
-
     <div
       v-if="formData && Object.keys(formData)?.length > 0"
       :class="isEdit ? 'my-portrait' : 'my-portrait form-unable-edit'"
     >
       <el-form ref="formRef" :model="formData" label-width="150px" :disabled="!isEdit">
-        <div class="my-portrait-item-first">
+        <div class="my-portrait-header">
           <div class="user-card">
             <el-image
               class="staff-avator"
@@ -174,134 +169,20 @@ const savePerformanceList = (data: any[]) => {
             />
           </div>
           <div class="my-portrait-card">
+            <div class="btn_box">
+              <el-form-item v-if="isEdit">
+                <el-button color="#1B80EB" type="primary" @click="submitForm(formRef)"
+                  >保存</el-button
+                >
+              </el-form-item>
+            </div>
             <div class="user-base-info">
               <h4>{{ formData?.['nickname'] }}</h4>
               <span>{{ formData?.['deptName'] }}</span>
             </div>
             <ul>
               <li v-for="(child, c) in formConfigList[0].children" :key="c">
-                <el-form-item :label="`${child.title}:`" :prop="child.name" label-width="auto">
-                  <el-date-picker
-                    v-if="child.type === 'time'"
-                    v-model="formData[child?.name]"
-                    style="width: 100%"
-                    :placeholder="isEdit ? child.title : ''"
-                    type="date"
-                    format="YYYY-MM-DD"
-                    value-format="x"
-                  />
-
-                  <DeptSelect
-                    v-if="child.type === 'dept-select'"
-                    v-model="formData['deptId']"
-                    :defaultValue="formData['deptId'] ?? ''"
-                  />
-
-                  <el-select
-                    v-if="child.type === 'select'"
-                    v-model="formData[child?.name]"
-                    style="width: 100%"
-                    :placeholder="isEdit ? child.title : '-'"
-                  >
-                    <el-option
-                      v-for="opt in child.options"
-                      :key="opt.value"
-                      :label="opt.label"
-                      :value="opt.value"
-                    />
-                  </el-select>
-
-                  <el-input
-                    v-if="child?.type === undefined"
-                    v-model="formData[child?.name]"
-                    placeholder=""
-                  />
-                  <div v-if="child?.type === 'button'" class="generate-num">
-                    <el-input v-model="formData[child?.name]" placeholder="" :disabled="true" />
-                    <ElButton
-                      v-if="isEdit"
-                      type="primary"
-                      style="width: 70px; height: 30px; margin-left: 10px"
-                      @click="generateStaffNumber()"
-                      >生成工号</ElButton
-                    >
-                  </div>
-                </el-form-item>
-              </li>
-              <li></li>
-            </ul>
-          </div>
-        </div>
-
-        <div class="my-portrait-item">
-          <div class="title">
-            <i></i>
-            <span>公司信息</span>
-          </div>
-          <div class="my-portrait-card">
-            <ul>
-              <li v-for="(child, c) in formConfigList[1].children" :key="c">
-                <el-form-item :label="`${child.title}:`" :prop="child.name">
-                  <el-date-picker
-                    v-if="child.type === 'time'"
-                    v-model="formData[child?.name]"
-                    style="width: 100%"
-                    :placeholder="isEdit ? child.title : ''"
-                    type="date"
-                    format="YYYY-MM-DD"
-                    value-format="x"
-                  />
-
-                  <DeptSelect
-                    v-if="child.type === 'dept-select'"
-                    v-model="formData['deptId']"
-                    :defaultValue="formData['deptId'] ?? ''"
-                  />
-
-                  <el-select
-                    v-if="child.type === 'select'"
-                    v-model="formData[child?.name]"
-                    style="width: 100%"
-                    :placeholder="isEdit ? child.title : '-'"
-                  >
-                    <el-option
-                      v-for="opt in child.options"
-                      :key="opt.value"
-                      :label="opt.label"
-                      :value="opt.value"
-                    />
-                  </el-select>
-
-                  <el-input
-                    v-if="child?.type === undefined"
-                    v-model="formData[child?.name]"
-                    placeholder=""
-                  />
-                  <div v-if="child?.type === 'button'" class="generate-num">
-                    <el-input v-model="formData[child?.name]" placeholder="" :disabled="true" />
-                    <ElButton
-                      v-if="isEdit"
-                      type="primary"
-                      style="width: 70px; height: 30px; margin-left: 10px"
-                      @click="generateStaffNumber()"
-                      >生成工号</ElButton
-                    >
-                  </div>
-                </el-form-item>
-              </li>
-              <li></li>
-            </ul>
-          </div>
-        </div>
-        <div class="my-portrait-item">
-          <div class="title">
-            <i></i>
-            <span>工资卡信息</span>
-          </div>
-          <div class="my-portrait-card">
-            <ul>
-              <li v-for="(child, c) in formConfigList[2].children" :key="c">
-                <el-form-item :label="`${child.title}:`" :prop="child.name">
+                <el-form-item :label="`${child.title}:`" :prop="child.name" label-width="110px">
                   <el-date-picker
                     v-if="child.type === 'time'"
                     v-model="formData[child?.name]"
@@ -353,90 +234,220 @@ const savePerformanceList = (data: any[]) => {
             </ul>
           </div>
         </div>
-        <div class="my-portrait-item">
-          <div class="title">
-            <i></i>
-            <span>紧急联系人信息</span>
-          </div>
-          <div class="my-portrait-card">
-            <ul>
-              <li v-for="(child, c) in formConfigList[3].children" :key="c">
-                <el-form-item :label="`${child.title}:`" :prop="child.name">
-                  <el-date-picker
-                    v-if="child.type === 'time'"
-                    v-model="formData[child?.name]"
-                    style="width: 100%"
-                    :placeholder="isEdit ? child.title : ''"
-                    type="date"
-                    format="YYYY-MM-DD"
-                    value-format="x"
-                  />
-
-                  <DeptSelect
-                    v-if="child.type === 'dept-select'"
-                    v-model="formData['deptId']"
-                    :defaultValue="formData['deptId'] ?? ''"
-                  />
-
-                  <el-select
-                    v-if="child.type === 'select'"
-                    v-model="formData[child?.name]"
-                    style="width: 100%"
-                    :placeholder="isEdit ? child.title : '-'"
-                  >
-                    <el-option
-                      v-for="opt in child.options"
-                      :key="opt.value"
-                      :label="opt.label"
-                      :value="opt.value"
-                    />
-                  </el-select>
+        <div class="my-portrait-wrap">
+          <ul class="my-portrait-nav">
+            <li @click="goAnchor('#gsxx')" :class="{ active: tabNav === '#gsxx' }">公司信息</li>
+            <li @click="goAnchor('#gzkxx')" :class="{ active: tabNav === '#gzkxx' }">工资卡信息</li>
+            <li @click="goAnchor('#jjlxrxx')" :class="{ active: tabNav === '#jjlxrxx' }"
+              >紧急联系人信息</li
+            >
+            <li @click="goAnchor('#gzjl')" :class="{ active: tabNav === '#gzjl' }">工作经历</li>
+            <li @click="goAnchor('#jtcy')" :class="{ active: tabNav === '#jtcy' }">家庭成员</li>
+            <li @click="goAnchor('#xxjl')" :class="{ active: tabNav === '#xxjl' }">学习经历</li>
+            <li @click="goAnchor('#jxkh')" :class="{ active: tabNav === '#jxkh' }">绩效考核</li>
+          </ul>
+          <div class="my-portrait-container">
+            <div class="my-portrait-item" id="gsxx">
+              <div class="title">
+                <i></i>
+                <span>公司信息</span>
+              </div>
+              <div class="my-portrait-card">
+                <ul>
+                  <li v-for="(child, c) in formConfigList[1].children" :key="c">
+                    <el-form-item :label="`${child.title}:`" :prop="child.name">
+                      <el-date-picker
+                        v-if="child.type === 'time'"
+                        v-model="formData[child?.name]"
+                        style="width: 100%"
+                        :placeholder="isEdit ? child.title : ''"
+                        type="date"
+                        format="YYYY-MM-DD"
+                        value-format="x"
+                      />
+
+                      <DeptSelect
+                        v-if="child.type === 'dept-select'"
+                        v-model="formData['deptId']"
+                        :defaultValue="formData['deptId'] ?? ''"
+                      />
+
+                      <el-select
+                        v-if="child.type === 'select'"
+                        v-model="formData[child?.name]"
+                        style="width: 100%"
+                        :placeholder="isEdit ? child.title : '-'"
+                      >
+                        <el-option
+                          v-for="opt in child.options"
+                          :key="opt.value"
+                          :label="opt.label"
+                          :value="opt.value"
+                        />
+                      </el-select>
+
+                      <el-input
+                        v-if="child?.type === undefined"
+                        v-model="formData[child?.name]"
+                        placeholder=""
+                      />
+                      <div v-if="child?.type === 'button'" class="generate-num">
+                        <el-input v-model="formData[child?.name]" placeholder="" :disabled="true" />
+                        <ElButton
+                          v-if="isEdit"
+                          type="primary"
+                          style="width: 70px; height: 30px; margin-left: 10px"
+                          @click="generateStaffNumber()"
+                          >生成工号</ElButton
+                        >
+                      </div>
+                    </el-form-item>
+                  </li>
+                  <li></li>
+                </ul>
+              </div>
+            </div>
+            <div class="my-portrait-item" id="gzkxx">
+              <div class="title">
+                <i></i>
+                <span>工资卡信息</span>
+              </div>
+              <div class="my-portrait-card">
+                <ul>
+                  <li v-for="(child, c) in formConfigList[2].children" :key="c">
+                    <el-form-item :label="`${child.title}:`" :prop="child.name">
+                      <el-date-picker
+                        v-if="child.type === 'time'"
+                        v-model="formData[child?.name]"
+                        style="width: 100%"
+                        :placeholder="isEdit ? child.title : ''"
+                        type="date"
+                        format="YYYY-MM-DD"
+                        value-format="x"
+                      />
+
+                      <DeptSelect
+                        v-if="child.type === 'dept-select'"
+                        v-model="formData['deptId']"
+                        :defaultValue="formData['deptId'] ?? ''"
+                      />
+
+                      <el-select
+                        v-if="child.type === 'select'"
+                        v-model="formData[child?.name]"
+                        style="width: 100%"
+                        :placeholder="isEdit ? child.title : '-'"
+                      >
+                        <el-option
+                          v-for="opt in child.options"
+                          :key="opt.value"
+                          :label="opt.label"
+                          :value="opt.value"
+                        />
+                      </el-select>
+
+                      <el-input
+                        v-if="child?.type === undefined"
+                        v-model="formData[child?.name]"
+                        placeholder=""
+                      />
+                      <div v-if="child?.type === 'button'" class="generate-num">
+                        <el-input v-model="formData[child?.name]" placeholder="" :disabled="true" />
+                        <ElButton
+                          v-if="isEdit"
+                          type="primary"
+                          style="width: 70px; height: 30px; margin-left: 10px"
+                          @click="generateStaffNumber()"
+                          >生成工号</ElButton
+                        >
+                      </div>
+                    </el-form-item>
+                  </li>
+                  <li></li>
+                </ul>
+              </div>
+            </div>
+            <div class="my-portrait-item" id="jjlxrxx">
+              <div class="title">
+                <i></i>
+                <span>紧急联系人信息</span>
+              </div>
+              <div class="my-portrait-card">
+                <ul>
+                  <li v-for="(child, c) in formConfigList[3].children" :key="c">
+                    <el-form-item :label="`${child.title}:`" :prop="child.name">
+                      <el-date-picker
+                        v-if="child.type === 'time'"
+                        v-model="formData[child?.name]"
+                        style="width: 100%"
+                        :placeholder="isEdit ? child.title : ''"
+                        type="date"
+                        format="YYYY-MM-DD"
+                        value-format="x"
+                      />
+
+                      <DeptSelect
+                        v-if="child.type === 'dept-select'"
+                        v-model="formData['deptId']"
+                        :defaultValue="formData['deptId'] ?? ''"
+                      />
+
+                      <el-select
+                        v-if="child.type === 'select'"
+                        v-model="formData[child?.name]"
+                        style="width: 100%"
+                        :placeholder="isEdit ? child.title : '-'"
+                      >
+                        <el-option
+                          v-for="opt in child.options"
+                          :key="opt.value"
+                          :label="opt.label"
+                          :value="opt.value"
+                        />
+                      </el-select>
+
+                      <el-input
+                        v-if="child?.type === undefined"
+                        v-model="formData[child?.name]"
+                        placeholder=""
+                      />
+                    </el-form-item>
+                  </li>
+                  <li></li>
+                </ul>
+              </div>
+            </div>
 
-                  <el-input
-                    v-if="child?.type === undefined"
-                    v-model="formData[child?.name]"
-                    placeholder=""
-                  />
-                </el-form-item>
-              </li>
-              <li></li>
-            </ul>
+            <div class="my-portrait-item" id="gzjl">
+              <WorkTable
+                :defaultData="formData['workList']"
+                @onSave="saveWorkList"
+                :onlyRead="type == 'view'"
+              />
+            </div>
+            <div class="my-portrait-item" id="jtcy">
+              <FamilyTable
+                :defaultData="formData['familyList']"
+                @onSave="saveFamilyList"
+                :onlyRead="type == 'view'"
+              />
+            </div>
+            <div class="my-portrait-item" id="xxjl">
+              <SchoolTable
+                :defaultData="formData['schoolList']"
+                @onSave="saveSchoolList"
+                :onlyRead="type == 'view'"
+              />
+            </div>
+            <div class="my-portrait-item" id="jxkh">
+              <PerformanceTable
+                :defaultData="formData['performanceList']"
+                @onSave="savePerformanceList"
+                :onlyRead="type == 'view'"
+              />
+            </div>
           </div>
         </div>
-
-        <div class="my-portrait-item">
-          <WorkTable
-            :defaultData="formData['workList']"
-            @onSave="saveWorkList"
-            :onlyRead="type == 'view'"
-          />
-        </div>
-        <div class="my-portrait-item">
-          <FamilyTable
-            :defaultData="formData['familyList']"
-            @onSave="saveFamilyList"
-            :onlyRead="type == 'view'"
-          />
-        </div>
-        <div class="my-portrait-item">
-          <SchoolTable
-            :defaultData="formData['schoolList']"
-            @onSave="saveSchoolList"
-            :onlyRead="type == 'view'"
-          />
-        </div>
-        <div class="my-portrait-item">
-          <PerformanceTable
-            :defaultData="formData['performanceList']"
-            @onSave="savePerformanceList"
-            :onlyRead="type == 'view'"
-          />
-        </div>
-        <el-row justify="end">
-          <el-form-item v-if="isEdit">
-            <el-button color="#1B80EB" type="primary" @click="submitForm(formRef)">保存</el-button>
-          </el-form-item>
-        </el-row>
       </el-form>
     </div>
   </div>
@@ -444,90 +455,43 @@ const savePerformanceList = (data: any[]) => {
 
 <style lang="scss" scoped>
 .staff-files-wrap {
-  height: calc(100% - 10px);
-  padding: 26px 30px;
-  margin: 40px 0 25px;
-  overflow: hidden;
-  background: #fff;
-  border-radius: 20px;
-
-  .staff-name {
-    display: flex;
-    justify-content: center;
-    align-items: center;
-
-    span {
-      display: block;
-      font-family: 'Microsoft YaHei';
-      font-size: 32px;
-      font-weight: bold;
-      color: #000000;
-      text-align: center;
-    }
-
-    .staff-avator {
-      width: 36px;
-      height: 36px;
-      margin-right: 12px;
-      cursor: pointer;
-      border-radius: 50%;
-    }
-  }
+  height: 100%;
 
   .my-portrait {
     width: 100%;
-    height: calc(100% - 40px);
+    height: 100%;
     padding: 0 0 10px;
-    overflow: auto;
-    .my-portrait-item {
-      margin-bottom: 20px;
-      width: 100%;
-      .title {
-        display: flex;
-        align-items: center;
-        margin-bottom: 8px;
-
-        i {
-          display: block;
-          width: 16px;
-          height: 16px;
-          margin-right: 9px;
-          background: url('../../../../assets/imgs/OA/mine/star.png') center no-repeat;
-          background-size: 100%;
-        }
-
-        span {
-          font-size: 18px;
-          font-weight: bold;
-          color: #000000;
-        }
-      }
-
-      ul {
-        display: flex;
-        padding: 20px 40px 0;
-        background: #f7f8fa;
-        border-radius: 4px;
-        flex-wrap: wrap;
-        justify-content: space-between;
-
-        li {
-          width: calc(33.3% - 40px);
-        }
-      }
+    overflow: hidden;
+    :deep(.el-form) {
+      display: flex;
+      flex-direction: column;
+      height: 100% !important;
     }
-    .my-portrait-item-first {
+    .my-portrait-header {
+      background: #fff;
+      padding: 26px 30px;
+      padding-bottom: 0px;
+      overflow: hidden;
+      border-radius: 20px;
       display: flex;
+      align-content: center;
+      margin-bottom: 15px;
       > .user-card {
         width: 160px;
-        margin-right: 20px;
+        margin-right: 10px;
       }
       > .my-portrait-card {
         flex: 1;
+        position: relative;
+        > .btn_box {
+          position: absolute;
+          right: 0px;
+        }
         > .user-base-info {
           display: flex;
           align-items: center;
           margin-bottom: 10px;
+          margin-left: 20px;
           > h4 {
             font-size: 22px;
             color: #111518;
@@ -540,15 +504,97 @@ const savePerformanceList = (data: any[]) => {
         > ul {
           > li {
             display: inline-block;
-            width: calc(25% - 50px);
+            width: calc(20% - 30px);
             text-align: left;
-            margin-right: 50px;
+            &:not(:nth-child(5n + 5)) {
+              margin-right: 30px;
+            }
           }
         }
       }
     }
-  }
+    .my-portrait-wrap {
+      background: #fff;
+      padding: 26px 30px;
+      padding-top: 0px;
+      border-radius: 20px;
+      overflow-y: auto;
+      flex: 1;
+      flex-grow: 1;
+      display: flex;
+      flex-direction: column;
+      > .my-portrait-nav {
+        display: flex;
+        border-bottom: 1px solid #e5eff7;
+        margin: 0px -30px;
+        margin-bottom: 15px;
+        padding: 0px 20px;
+        > li {
+          padding: 15px;
+          cursor: pointer;
+          font-size: 17px;
+          position: relative;
+          &.active {
+            color: #2e77e6;
+            &::after {
+              display: block;
+              content: '';
+              width: 20px;
+              height: 3px;
+              background: #2e77e6;
+              position: absolute;
+              bottom: 0px;
+              left: 0px;
+              right: 0px;
+              margin: auto;
+            }
+          }
+        }
+      }
+      > .my-portrait-container {
+        overflow-y: auto;
+        flex: 1;
+        flex-grow: 1;
+        > .my-portrait-item {
+          margin-bottom: 20px;
+          width: 100%;
+          .title {
+            display: flex;
+            align-items: center;
+            margin-bottom: 8px;
+
+            i {
+              display: block;
+              width: 16px;
+              height: 16px;
+              margin-right: 9px;
+              background: url('../../../../assets/imgs/OA/mine/star.png') center no-repeat;
+              background-size: 100%;
+            }
+
+            span {
+              font-size: 18px;
+              font-weight: bold;
+              color: #000000;
+            }
+          }
 
+          ul {
+            display: flex;
+            padding: 20px 40px 0;
+            background: #f7f8fa;
+            border-radius: 4px;
+            flex-wrap: wrap;
+            justify-content: space-between;
+
+            li {
+              width: calc(33.3% - 40px);
+            }
+          }
+        }
+      }
+    }
+  }
   .form-unable-edit {
     .my-portrait-item {
       ul {
@@ -556,7 +602,6 @@ const savePerformanceList = (data: any[]) => {
         border: 1px solid #e4e9f1;
       }
     }
-
     :deep(.el-form) {
       .el-input.is-disabled .el-input__wrapper {
         background-color: unset;

+ 13 - 4
client/src/views/OaSystem/projectCenter/projectTrack/index.vue

@@ -11,7 +11,7 @@
       </div>
       <div class="form">
         <span class="formSpan">跟踪人员:</span>
-        <UserOrgTree v-model="queryParams['gzryId']" placeholder="请选择项目经理" />
+        <UserOrgTree v-model="queryParams['gzryId']" placeholder="请选择跟踪人员" />
       </div>
       <div class="from">
         <div class="btnBox">
@@ -67,12 +67,17 @@
           <el-table-column prop="jf" label="甲方" width="120" />
           <el-table-column prop="jfdjr" label="甲方对接人" width="120" />
           <el-table-column prop="xmbm" label="项目归属部门" width="120" />
-          <el-table-column prop="xzqdm" label="行政区" width="120" />
+          <el-table-column prop="xzqmc" label="行政区" width="120" />
           <el-table-column prop="zt" label="状态" width="120">
             <template #default="scope">
               {{ ztMap[scope.row.zt] }}
             </template>
           </el-table-column>
+          <el-table-column prop="latestModifyTime" label="更新时间" width="120">
+            <template #default="scope">
+              {{ formatDate(scope.row.latestModifyTime) }}
+            </template>
+          </el-table-column>
           <el-table-column prop="xmjl" label="开关" width="120">
             <template #default="scope">
               <el-switch
@@ -112,7 +117,6 @@
       <el-form
         ref="ruleFormRef"
         style="width: 600px"
-        :model="ruleForm"
         label-width="auto"
         class="demo-ruleForm"
         status-icon
@@ -163,7 +167,7 @@
               <DistrictTree
                 class="form-item-disable-style"
                 v-model="formData.xzqdm"
-                @node-click="(item) => treeNodeClick(item, 'xzqmc')"
+                @node-click="(item, labels) => treeNodeClick(labels, 'xzqmc')"
                 style="width: 100%"
               />
             </el-form-item>
@@ -202,6 +206,7 @@
 import { DICT_TYPE, getDictLabel } from '@/utils/dict'
 import { IFormType, useMixins, infoList, user } from './common'
 import request from '@/config/axios'
+import { formatDate } from '@/utils/formatTime'
 import { getAssetURL } from '@/utils/auth'
 import UserOrgTree from '@/views/OaSystem/components/UserOrgTree/index.vue'
 import DeptTree from '@/views/OaSystem/components/DeptTree/index.vue'
@@ -244,6 +249,10 @@ const addOrEditHandle = (row?: IFormType) => {
 }
 const treeNodeClick = (item, type: string) => {
   if (!item) return
+  if (type === 'xzqmc') {
+    formData.value[type] = item.join('-')
+    return
+  }
   formData.value[type] = item['label'] || item['name']
 }
 const saveProjectTracking = async (): Promise<void> => {