2 Commits 6509cc17fb ... 2cda44c53b

Tác giả SHA1 Thông báo Ngày
  qiny 2cda44c53b Merge branch 'master' of http://114.55.67.98:8070/Natural_p1/zjugis_OA 11 tháng trước cách đây
  qiny b302af0214 fix: web端一些改动 11 tháng trước cách đây

+ 48 - 6
client/src/views/OaSystem/financialManagement/businessBoard/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="oa-sys-list-view">
-    <el-row class="up-box">
-      <el-col :span="24">
+    <el-row class="up-box" justify="space-between">
+      <el-col :span="15">
         <div class="title">板块经营情况</div>
         <el-table class="detail-table" :data="segmentData" style="width: 100%" max-height="400">
           <el-table-column prop="segment" label="板块" />
@@ -30,17 +30,23 @@
               <span>{{ unitConversion(scope.row.contractBalance) }}</span>
             </template>
           </el-table-column>
-          <el-table-column prop="subAmount" label="分包额" sortable>
+        </el-table>
+      </el-col>
+      <el-col :span="8">
+        <div class="title">分包情况</div>
+        <el-table class="detail-table" :data="segmentData" style="width: 100%" max-height="400">
+          <el-table-column prop="segment" label="板块" />
+          <el-table-column prop="subAmount" label="总分包额" sortable>
             <template #default="scope">
               <span>{{ unitConversion(scope.row.subAmount) }}</span>
             </template>
           </el-table-column>
-          <el-table-column prop="subPayed" label="分包已支付" sortable>
+          <el-table-column prop="subPayed" label="已支付" sortable>
             <template #default="scope">
               <span>{{ unitConversion(scope.row.subPayed) }}</span>
             </template>
           </el-table-column>
-          <el-table-column prop="subToPay" label="分包待支付" sortable>
+          <el-table-column prop="subToPay" label="未支付额" sortable>
             <template #default="scope">
               <span>{{ unitConversion(scope.row.subToPay) }}</span>
             </template>
@@ -128,9 +134,45 @@ const personData = ref<IPerson[]>([])
 
 onMounted(async () => {
   segmentData.value = await getSegmentData()
-  deptData.value = await getDeptData()
+  const dataSource = await getDeptData()
+  deptData.value = filterDept(dataSource)
   personData.value = await getPersonData()
 })
+
+// 部门显示内容筛选
+const showDeptList = [
+  '营销与产品策划部',
+  '智慧政务产品部',
+  '自然资源产品部',
+  '智慧GIS产品部',
+  '产业发展产品部',
+  '数智产业研发部',
+  '战略产品部',
+  '空间规划研究中心',
+  '城乡发展规划研究中心',
+  '规划一所',
+  '规划二所',
+  '规划三所',
+  '规划四所',
+  '规划五所',
+  '土地事务部',
+  '国土整治与生态修复设计研究中心'
+]
+// 筛选并排序
+const filterDept = (dataSource) => {
+  const dataObj = {}
+  dataSource.forEach((item) => {
+    dataObj[item.deptName] = item
+  })
+  const showData: any = []
+  showDeptList.forEach((item) => {
+    if (dataObj[item]) {
+      showData.push(dataObj[item])
+    }
+  })
+  return showData
+  // return dataSource.filter((item) => showDeptList.includes(item.deptName))
+}
 </script>
 <style scoped lang="scss">
 .oa-sys-list-view {

+ 3 - 4
client/src/views/OaSystem/mineCenter/components/leftInfo.vue

@@ -139,9 +139,8 @@ onMounted(() => {})
   border-radius: 10px;
 
   .leftImgs {
-    position: absolute;
-    top: -3px;
-    left: -3px;
+    width: calc(100% + 3.5px);
+    margin-left: -3.5px;
   }
 
   .headImgs {
@@ -174,7 +173,7 @@ onMounted(() => {})
   .infoContent {
     width: 100%;
     height: calc(100% - 165px);
-    margin-top: 165px;
+    margin-top: 50px;
 
     .contentBox {
       display: flex;

+ 12 - 0
client/src/views/OaSystem/mineCenter/rightChild/index.ts

@@ -80,6 +80,18 @@ export const formConfigList = [
       {
         name: 'hkszd',
         title: '户口所在地'
+      },
+      {
+        name: 'xqah',
+        title: '兴趣爱好'
+      },
+      {
+        name: 'jntc',
+        title: '技能特长'
+      },
+      {
+        name: 'cgjl',
+        title: '成果奖励'
       }
     ]
   },

+ 78 - 32
client/src/views/OaSystem/mineCenter/rightChild/wdda.vue

@@ -1,21 +1,24 @@
 <script setup lang="ts">
-import { useQuery } from '@tanstack/vue-query'
-import { getRecordsDetail } from '@/api/oa/staffRecords'
+import { useQuery, useMutation } from '@tanstack/vue-query'
+import { getRecordsDetail, editRecordsDetail } from '@/api/oa/staffRecords'
 import { useUserStore } from '@/store/modules/user'
 import { getConfigDict } from './index'
 import TechCertificate from '../../personnelManagement/ygdaPage/TechCertificate.vue'
 import WorkTable from '../../personnelManagement/ygdaPage/WorkTable.vue'
 import FamilyTable from '../../personnelManagement/ygdaPage/familyTable.vue'
 import SchoolTable from '../../personnelManagement/ygdaPage/SchoolTable.vue'
+import { cloneDeep } from 'lodash-es'
+import { FormInstance } from 'element-plus'
+import moment from 'moment'
 
 /**
  * @description 我的档案
  */
 const formConfigList = getConfigDict()
-
 const userId = useUserStore().getUser.id // 当前登录的编号
-
+const isDisabled = ref(true)
 const data = ref<any>({})
+const formRef = ref<FormInstance>()
 useQuery(
   ['fetch-staff-detail', userId],
   async () => {
@@ -33,26 +36,79 @@ const handleTimeData = (dataSource) => {
   const keyList = ['birthday', 'bysj', 'cjgzsj', 'yshtqssj', 'htdqs', 'htqdsj', 'rgssj', 'zzsj']
   Object.keys(dataSource).forEach((key) => {
     if (keyList.includes(key) && Array.isArray(dataSource[key])) {
-      dataSource[key] = dataSource[key].join('-')
+      const dateString = dataSource[key].join('-')
+      const dateValue = moment(dateString).valueOf()
+      dataSource[key] = dateValue
     }
   })
-  // console.log('dataSource', dataSource)
   return dataSource
 }
 
-const router = useRouter()
+// const router = useRouter()
+const tempData = ref({})
 const editDetail = () => {
-  router.push({
-    path: '/staffDetail',
-    query: { id: data.value.userId, type: 'edit' }
+  isDisabled.value = false
+  tempData.value = cloneDeep(data.value)
+  // router.push({
+  //   path: '/staffDetail',
+  //   query: { id: data.value.userId, type: 'edit' }
+  // })
+}
+const cancleEdit = () => {
+  isDisabled.value = true
+  data.value = cloneDeep(tempData.value)
+  tempData.value = {}
+}
+// const saveDetail = () => {
+//   isDisabled.value = true
+// }
+
+/**编辑员工档案详情 */
+const { mutate: addUserMutate } = useMutation({
+  mutationFn: async (values: any) => {
+    return await editRecordsDetail(values)
+  },
+  onSuccess() {
+    isDisabled.value = true
+    ElMessage({
+      message: '档案修改成功!',
+      type: 'success'
+    })
+  },
+  onError() {
+    ElMessage({
+      message: '档案修改失败,请稍后再试!',
+      type: 'error'
+    })
+  }
+})
+
+/**表单保存 */
+const submitForm = (formEl: FormInstance | undefined) => {
+  // console.log('formData.value', formData.value)
+  // return
+  if (!formEl) return
+  formEl.validate((valid) => {
+    if (valid) {
+      addUserMutate(data.value)
+    } else {
+      return false
+    }
   })
 }
 </script>
 <template>
   <div class="form-unable-edit my-portrait">
-    <div class="edit-button"><el-button type="primary" @click="editDetail">编辑</el-button></div>
+    <div class="edit-button">
+      <el-button type="default" @click="editDetail" v-if="isDisabled" :disabled="!isDisabled"
+        >编辑</el-button
+      >
+      <el-button type="default" @click="cancleEdit" v-if="!isDisabled">取消编辑</el-button>
+      <el-button type="primary" @click="submitForm(formRef)" v-if="!isDisabled">保存</el-button>
+      <!-- <el-button type="primary" @click="saveDetail" v-if="!isDisabled">保存</el-button> -->
+    </div>
 
-    <el-form ref="formRef" v-if="data" :model="data" label-width="150px" :disabled="true">
+    <el-form ref="formRef" v-if="data" :model="data" label-width="150px" :disabled="isDisabled">
       <div class="my-portrait-item" v-for="(item, index) in formConfigList" :key="index">
         <div class="title">
           <i></i>
@@ -69,6 +125,7 @@ const editDetail = () => {
                   style="width: 100%"
                   placeholder=""
                   type="date"
+                  value-format="x"
                 />
 
                 <el-select
@@ -93,36 +150,25 @@ const editDetail = () => {
       </div>
     </el-form>
 
-    <div class="my-portrait-item" style="height: 200px">
-      <div class="title">
-        <i></i>
-        <span>技能证书</span>
-      </div>
-
-      <div>
-        <TechCertificate />
-      </div>
-    </div>
     <div class="my-portrait-item">
-      <div class="title">
-        <i></i>
-        <span>工作经历</span>
-      </div>
       <WorkTable :defaultData="data['workList'] ?? []" :onlyRead="true" />
     </div>
     <div class="my-portrait-item">
-      <div class="title">
-        <i></i>
-        <span>家庭成员</span>
-      </div>
       <FamilyTable :defaultData="data['familyList'] ?? []" :onlyRead="true" />
     </div>
     <div class="my-portrait-item">
+      <SchoolTable :defaultData="data['schoolList'] ?? []" :onlyRead="true" />
+    </div>
+
+    <div class="my-portrait-item" style="height: 200px">
       <div class="title">
         <i></i>
-        <span>学习经历</span>
+        <span>技能证书</span>
+      </div>
+
+      <div>
+        <TechCertificate />
       </div>
-      <SchoolTable :defaultData="data['schoolList'] ?? []" :onlyRead="true" />
     </div>
   </div>
 </template>

+ 6 - 2
client/src/views/OaSystem/personnelManagement/rchbkPage/index.vue

@@ -81,11 +81,16 @@
             {{ getDictLabel(DICT_TYPE.POST_TYPE, scope.row.ypgw) }}
           </template>
         </el-table-column>
-        <el-table-column label="初定等级" align="center" prop="djcd">
+        <el-table-column label="初定等级" align="center" prop="djcd" width="100">
           <template #default="scope">
             {{ getDictLabel(DICT_TYPE.ABILITY_LEVEL, scope.row.djcd) }}
           </template>
         </el-table-column>
+        <el-table-column label="报到" align="center" prop="report" width="100">
+          <template #default="scope">
+            {{ scope.row.report == 1 ? '已发送' : '未发送' }}
+          </template>
+        </el-table-column>
         <el-table-column label="操作" width="180" align="center" fixed="right">
           <template #default="scope">
             <div class="operateBtn">
@@ -534,7 +539,6 @@ const operateClick = (row: any) => {
 }
 // 报到登记
 const checkInRegister = (row: any) => {
-  console.log('row', row)
   ElMessageBox.confirm('将创建OA账号及个人档案信息,是否继续?', '报到登记', {
     confirmButtonText: '是',
     cancelButtonText: '否',

+ 130 - 90
client/src/views/OaSystem/personnelManagement/ygdaPage/SchoolTable.vue

@@ -1,98 +1,105 @@
 <template>
-  <el-tag
-    type="primary"
-    size="large"
-    effect="plain"
-    v-if="!tableData.length && !onlyRead"
-    @click="onAddItem(0)"
-    >增加一行</el-tag
-  >
-  <el-table
-    class="detail-table"
-    :header-cell-style="{
-      background: '#F2F4F8',
-      color: '#000000'
-    }"
-    :data="tableData"
-    v-else
-  >
-    <el-table-column prop="major" label="专业">
-      <template #default="scope">
-        <el-input v-model="scope.row.major" v-if="scope.row.isEdit" />
-        <span v-else>{{ scope.row.major }}</span>
-      </template>
-    </el-table-column>
-    <el-table-column prop="byxx" label="毕业学校">
-      <template #default="scope">
-        <el-input v-model="scope.row.byxx" v-if="scope.row.isEdit" />
-        <span v-else>{{ scope.row.byxx }}</span>
-      </template>
-    </el-table-column>
-    <el-table-column prop="bysj" label="毕业时间">
-      <template #default="scope">
-        <el-date-picker
-          v-model="scope.row.bysj"
-          type="date"
-          value-format="YYYY-MM-DD"
-          v-if="scope.row.isEdit"
-        />
-        <span v-else>{{ scope.row.bysj }}</span>
-      </template>
-    </el-table-column>
-    <el-table-column prop="xl" label="学历">
-      <template #default="scope">
-        <el-select
-          v-if="scope.row.isEdit"
-          v-model="scope.row.xl"
-          style="width: 100%"
-          placeholder="请选择学历水平"
-        >
-          <el-option
-            v-for="opt in selectOptions"
-            :key="opt.value"
-            :label="opt.label"
-            :value="opt.value"
+  <div class="casually-name">
+    <div class="star-title">
+      <i></i>
+      <span>学习经历</span>
+    </div>
+    <el-tag
+      class="add-tag"
+      type="primary"
+      effect="plain"
+      v-if="!tableData.length && !onlyRead"
+      @click="onAddItem(-1)"
+      >+ 新增</el-tag
+    >
+    <el-table
+      class="detail-table"
+      :header-cell-style="{
+        background: '#F2F4F8',
+        color: '#000000'
+      }"
+      :data="tableData"
+      v-else
+    >
+      <el-table-column prop="major" label="专业">
+        <template #default="scope">
+          <el-input v-model="scope.row.major" v-if="scope.row.isEdit" />
+          <span v-else>{{ scope.row.major }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="byxx" label="毕业学校">
+        <template #default="scope">
+          <el-input v-model="scope.row.byxx" v-if="scope.row.isEdit" />
+          <span v-else>{{ scope.row.byxx }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="bysj" label="毕业时间">
+        <template #default="scope">
+          <el-date-picker
+            v-model="scope.row.bysj"
+            type="date"
+            value-format="YYYY-MM-DD"
+            v-if="scope.row.isEdit"
           />
-        </el-select>
-        <span v-else>{{ degreeShowValue(scope.row.xl) }}</span>
-      </template>
-    </el-table-column>
-    <el-table-column prop="filePath" label="附件" width="400px">
-      <template #default="scope">
-        <!-- <el-input v-model="scope.row.filePath" v-if="scope.row.isEdit" /> -->
-        <!-- <span v-else>{{ scope.row.filePath }}</span> -->
-        <UploadImgs :modelValue="scope.row.filePath" :updateUrl="updateUrl" height="55px" />
-      </template>
-    </el-table-column>
-    <el-table-column fixed="right" label="操作" width="140">
-      <template #default="scope">
-        <el-button
-          link
-          type="primary"
-          size="small"
-          @click="onSaveItem(scope.$index)"
-          v-if="scope.row.isEdit"
-        >
-          保存
-        </el-button>
-        <el-button link type="primary" size="small" @click="onEditItem(scope.$index)" v-else>
-          编辑
-        </el-button>
-        <el-button link type="primary" size="small" @click="deleteRow(scope.$index)">
-          删除
-        </el-button>
-        <el-button link type="primary" size="small" @click="onAddItem(scope.$index)">
-          新增
-        </el-button>
-      </template>
-    </el-table-column>
-  </el-table>
+          <span v-else>{{ scope.row.bysj }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="xl" label="学历">
+        <template #default="scope">
+          <el-select
+            v-if="scope.row.isEdit"
+            v-model="scope.row.xl"
+            style="width: 100%"
+            placeholder="请选择学历水平"
+          >
+            <el-option
+              v-for="opt in selectOptions"
+              :key="opt.value"
+              :label="opt.label"
+              :value="opt.value"
+            />
+          </el-select>
+          <span v-else>{{ degreeShowValue(scope.row.xl) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="filePath" label="附件" width="400px">
+        <template #default="scope">
+          <!-- <el-input v-model="scope.row.filePath" v-if="scope.row.isEdit" /> -->
+          <!-- <span v-else>{{ scope.row.filePath }}</span> -->
+          <UploadImgs :modelValue="scope.row.filePath" :updateUrl="updateUrl" height="55px" />
+        </template>
+      </el-table-column>
+      <el-table-column fixed="right" label="操作" width="140">
+        <template #default="scope">
+          <el-button
+            link
+            type="primary"
+            size="small"
+            @click="onSaveItem(scope.$index)"
+            v-if="scope.row.isEdit"
+          >
+            保存
+          </el-button>
+          <el-button link type="primary" size="small" @click="onEditItem(scope.$index)" v-else>
+            编辑
+          </el-button>
+          <el-button link type="primary" size="small" @click="deleteRow(scope.$index)">
+            删除
+          </el-button>
+          <el-button link type="primary" size="small" @click="onAddItem(scope.$index)">
+            新增
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
 </template>
 <script lang="ts" setup>
 /**
  * @description 学习经历
  */
 
+import { cloneDeep } from 'lodash-es'
 import { UploadImgs } from '@/components/UploadFile'
 import { getDictList } from './index'
 
@@ -140,7 +147,7 @@ onMounted(() => {
 
 // 新增行
 const onAddItem = (index: number) => {
-  tableData.value.splice(index - 1, 0, {
+  tableData.value.splice(index + 1, 0, {
     major: '',
     byxx: '',
     bysj: '',
@@ -152,8 +159,12 @@ const onAddItem = (index: number) => {
 
 // 保存行
 const onSaveItem = (index: number) => {
-  tableData.value[index].isEdit = false
-  const changeData = tableData.value.map((item: any) => {
+  tableData.value.forEach((item: any, num: number) => {
+    if (num == index) {
+      item.isEdit = false
+    }
+  })
+  const changeData = cloneDeep(tableData.value).map((item: any) => {
     delete item.isEdit
     return item
   })
@@ -171,6 +182,35 @@ const deleteRow = (index: number) => {
 }
 </script>
 <style scoped lang="scss">
+.casually-name {
+  position: relative;
+}
+.star-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;
+  }
+}
+.add-tag {
+  position: absolute;
+  top: 2px;
+  left: 120px;
+  cursor: pointer;
+}
 .detail-table {
   width: 100%;
   min-height: 100px;

+ 137 - 96
client/src/views/OaSystem/personnelManagement/ygdaPage/WorkTable.vue

@@ -1,101 +1,110 @@
 <template>
-  <el-tag
-    type="primary"
-    size="large"
-    effect="plain"
-    v-if="!tableData.length && !onlyRead"
-    @click="onAddItem(0)"
-    >增加一行</el-tag
-  >
-  <el-table
-    class="detail-table"
-    :header-cell-style="{
-      background: '#F2F4F8',
-      color: '#000000'
-    }"
-    :data="tableData"
-    v-else
-  >
-    <el-table-column prop="workLocation" label="工作单位">
-      <template #default="scope">
-        <el-input v-model="scope.row.workLocation" v-if="scope.row.isEdit" />
-        <span v-else>{{ scope.row.workLocation }}</span>
-      </template>
-    </el-table-column>
-    <el-table-column prop="post" label="职位">
-      <template #default="scope">
-        <el-input v-model="scope.row.post" v-if="scope.row.isEdit" />
-        <span v-else>{{ scope.row.post }}</span>
-      </template>
-    </el-table-column>
-    <el-table-column prop="startTime" label="开始时间">
-      <template #default="scope">
-        <el-date-picker
-          v-model="scope.row.startTime"
-          type="date"
-          value-format="YYYY-MM-DD"
-          v-if="scope.row.isEdit"
-        />
-        <span v-else>{{ scope.row.startTime }}</span>
-      </template>
-    </el-table-column>
-    <el-table-column prop="endTime" label="结束时间">
-      <template #default="scope">
-        <el-date-picker
-          v-model="scope.row.endTime"
-          type="date"
-          value-format="YYYY-MM-DD"
-          v-if="scope.row.isEdit"
-        />
-        <span v-else>{{ scope.row.endTime }}</span>
-      </template>
-    </el-table-column>
-    <el-table-column prop="resignReason" label="离职原因">
-      <template #default="scope">
-        <el-input v-model="scope.row.resignReason" v-if="scope.row.isEdit" />
-        <span v-else>{{ scope.row.resignReason }}</span>
-      </template>
-    </el-table-column>
-    <el-table-column prop="jyxy" label="是否有竞业限制/未尽法律事宜">
-      <template #default="scope">
-        <el-input v-model="scope.row.jyxy" v-if="scope.row.isEdit" />
-        <span v-else>{{ scope.row.jyxy }}</span>
-      </template>
-    </el-table-column>
-    <el-table-column prop="competitionDetail" label="具体条款">
-      <template #default="scope">
-        <el-input v-model="scope.row.competitionDetail" v-if="scope.row.isEdit" />
-        <span v-else>{{ scope.row.competitionDetail }}</span>
-      </template>
-    </el-table-column>
-    <el-table-column fixed="right" label="操作" width="140">
-      <template #default="scope">
-        <el-button
-          link
-          type="primary"
-          size="small"
-          @click="onSaveItem(scope.$index)"
-          v-if="scope.row.isEdit"
-        >
-          保存
-        </el-button>
-        <el-button link type="primary" size="small" @click="onEditItem(scope.$index)" v-else>
-          编辑
-        </el-button>
-        <el-button link type="primary" size="small" @click="deleteRow(scope.$index)">
-          删除
-        </el-button>
-        <el-button link type="primary" size="small" @click="onAddItem(scope.$index)">
-          新增
-        </el-button>
-      </template>
-    </el-table-column>
-  </el-table>
+  <div class="casually-name">
+    <div class="star-title">
+      <i></i>
+      <span>工作经历</span>
+    </div>
+    <el-tag
+      class="add-tag"
+      type="primary"
+      effect="plain"
+      v-if="!tableData.length && !onlyRead"
+      @click="onAddItem(-1)"
+      >+ 新增</el-tag
+    >
+    <el-table
+      class="detail-table"
+      :header-cell-style="{
+        background: '#F2F4F8',
+        color: '#000000'
+      }"
+      :data="tableData"
+      v-else
+    >
+      <el-table-column prop="workLocation" label="工作单位">
+        <template #default="scope">
+          <el-input v-model="scope.row.workLocation" v-if="scope.row.isEdit" />
+          <span v-else>{{ scope.row.workLocation }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="post" label="职位">
+        <template #default="scope">
+          <el-input v-model="scope.row.post" v-if="scope.row.isEdit" />
+          <span v-else>{{ scope.row.post }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="startTime" label="开始时间">
+        <template #default="scope">
+          <el-date-picker
+            v-model="scope.row.startTime"
+            type="date"
+            value-format="YYYY-MM-DD"
+            v-if="scope.row.isEdit"
+          />
+          <span v-else>{{ scope.row.startTime }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="endTime" label="结束时间">
+        <template #default="scope">
+          <el-date-picker
+            v-model="scope.row.endTime"
+            type="date"
+            value-format="YYYY-MM-DD"
+            v-if="scope.row.isEdit"
+          />
+          <span v-else>{{ scope.row.endTime }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="resignReason" label="离职原因">
+        <template #default="scope">
+          <el-input v-model="scope.row.resignReason" v-if="scope.row.isEdit" />
+          <span v-else>{{ scope.row.resignReason }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="jyxy" label="是否有竞业限制/未尽法律事宜">
+        <template #default="scope">
+          <el-input v-model="scope.row.jyxy" v-if="scope.row.isEdit" />
+          <span v-else>{{ scope.row.jyxy }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="competitionDetail" label="具体条款">
+        <template #default="scope">
+          <el-input v-model="scope.row.competitionDetail" v-if="scope.row.isEdit" />
+          <span v-else>{{ scope.row.competitionDetail }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column fixed="right" label="操作" width="140">
+        <template #default="scope">
+          <el-button
+            link
+            type="primary"
+            size="small"
+            @click="onSaveItem(scope.$index)"
+            v-if="scope.row.isEdit"
+          >
+            保存
+          </el-button>
+          <el-button link type="primary" size="small" @click="onEditItem(scope.$index)" v-else>
+            编辑
+          </el-button>
+          <el-button link type="primary" size="small" @click="deleteRow(scope.$index)">
+            删除
+          </el-button>
+          <el-button link type="primary" size="small" @click="onAddItem(scope.$index)">
+            新增
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
 </template>
 <script lang="ts" setup>
 /**
  * @description 工作经历
  */
+
+import { cloneDeep } from 'lodash-es'
+
 interface ITable {
   id?: string
   userId?: string
@@ -133,7 +142,7 @@ onMounted(() => {
 
 // 新增行
 const onAddItem = (index: number) => {
-  tableData.value.splice(index - 1, 0, {
+  tableData.value.splice(index + 1, 0, {
     workLocation: '',
     post: '',
     startTime: '',
@@ -147,9 +156,12 @@ const onAddItem = (index: number) => {
 
 // 保存行
 const onSaveItem = (index: number) => {
-  tableData.value[index].isEdit = false
-  // console.log('tableData.value', tableData.value)
-  const changeData = tableData.value.map((item: any) => {
+  tableData.value.forEach((item: any, num: number) => {
+    if (num == index) {
+      item.isEdit = false
+    }
+  })
+  const changeData = cloneDeep(tableData.value).map((item: any) => {
     delete item.isEdit
     return item
   })
@@ -167,6 +179,35 @@ const deleteRow = (index: number) => {
 }
 </script>
 <style scoped lang="scss">
+.casually-name {
+  position: relative;
+}
+.star-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;
+  }
+}
+.add-tag {
+  position: absolute;
+  top: 2px;
+  left: 120px;
+  cursor: pointer;
+}
 .detail-table {
   width: 100%;
   min-height: 100px;

+ 121 - 79
client/src/views/OaSystem/personnelManagement/ygdaPage/familyTable.vue

@@ -1,85 +1,94 @@
 <template>
-  <el-tag
-    type="primary"
-    size="large"
-    effect="plain"
-    v-if="!tableData.length && !onlyRead"
-    @click="onAddItem(0)"
-    >增加一行</el-tag
-  >
-  <el-table
-    class="detail-table"
-    :header-cell-style="{
-      background: '#F2F4F8',
-      color: '#000000'
-    }"
-    :data="tableData"
-    v-else
-  >
-    <el-table-column prop="name" label="姓名">
-      <template #default="scope">
-        <el-input v-model="scope.row.name" v-if="scope.row.isEdit" />
-        <span v-else>{{ scope.row.name }}</span>
-      </template>
-    </el-table-column>
-    <el-table-column prop="xb" label="性别">
-      <template #default="scope">
-        <el-input v-model="scope.row.xb" v-if="scope.row.isEdit" />
-        <span v-else>{{ scope.row.xb }}</span>
-      </template>
-    </el-table-column>
-    <el-table-column prop="gzdw" label="工作单位">
-      <template #default="scope">
-        <el-input v-model="scope.row.gzdw" v-if="scope.row.isEdit" />
-        <span v-else>{{ scope.row.gzdw }}</span>
-      </template>
-    </el-table-column>
-    <el-table-column prop="zz" label="家庭住址">
-      <template #default="scope">
-        <el-input v-model="scope.row.zz" v-if="scope.row.isEdit" />
-        <span v-else>{{ scope.row.zz }}</span>
-      </template>
-    </el-table-column>
-    <el-table-column prop="lxdh" label="联系电话">
-      <template #default="scope">
-        <el-input v-model="scope.row.lxdh" v-if="scope.row.isEdit" />
-        <span v-else>{{ scope.row.lxdh }}</span>
-      </template>
-    </el-table-column>
-    <el-table-column prop="gx" label="与本人关系">
-      <template #default="scope">
-        <el-input v-model="scope.row.gx" v-if="scope.row.isEdit" />
-        <span v-else>{{ scope.row.gx }}</span>
-      </template>
-    </el-table-column>
-    <el-table-column fixed="right" label="操作" width="140">
-      <template #default="scope">
-        <el-button
-          link
-          type="primary"
-          size="small"
-          @click="onSaveItem(scope.$index)"
-          v-if="scope.row.isEdit"
-        >
-          保存
-        </el-button>
-        <el-button link type="primary" size="small" @click="onEditItem(scope.$index)" v-else>
-          编辑
-        </el-button>
-        <el-button link type="primary" size="small" @click="deleteRow(scope.$index)">
-          删除
-        </el-button>
-        <el-button link type="primary" size="small" @click="onAddItem(scope.$index)">
-          新增
-        </el-button>
-      </template>
-    </el-table-column>
-  </el-table>
+  <div class="casually-name">
+    <div class="star-title">
+      <i></i>
+      <span>家庭成员</span>
+    </div>
+    <el-tag
+      class="add-tag"
+      type="primary"
+      effect="plain"
+      v-if="!tableData.length && !onlyRead"
+      @click="onAddItem(-1)"
+      >+ 新增</el-tag
+    >
+    <el-table
+      class="detail-table"
+      :header-cell-style="{
+        background: '#F2F4F8',
+        color: '#000000'
+      }"
+      :data="tableData"
+      v-else
+    >
+      <el-table-column prop="name" label="姓名">
+        <template #default="scope">
+          <el-input v-model="scope.row.name" v-if="scope.row.isEdit" />
+          <span v-else>{{ scope.row.name }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="xb" label="性别">
+        <template #default="scope">
+          <el-input v-model="scope.row.xb" v-if="scope.row.isEdit" />
+          <span v-else>{{ scope.row.xb }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="gzdw" label="工作单位">
+        <template #default="scope">
+          <el-input v-model="scope.row.gzdw" v-if="scope.row.isEdit" />
+          <span v-else>{{ scope.row.gzdw }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="zz" label="家庭住址">
+        <template #default="scope">
+          <el-input v-model="scope.row.zz" v-if="scope.row.isEdit" />
+          <span v-else>{{ scope.row.zz }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="lxdh" label="联系电话">
+        <template #default="scope">
+          <el-input v-model="scope.row.lxdh" v-if="scope.row.isEdit" />
+          <span v-else>{{ scope.row.lxdh }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="gx" label="与本人关系">
+        <template #default="scope">
+          <el-input v-model="scope.row.gx" v-if="scope.row.isEdit" />
+          <span v-else>{{ scope.row.gx }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column fixed="right" label="操作" width="140">
+        <template #default="scope">
+          <el-button
+            link
+            type="primary"
+            size="small"
+            @click="onSaveItem(scope.$index)"
+            v-if="scope.row.isEdit"
+          >
+            保存
+          </el-button>
+          <el-button link type="primary" size="small" @click="onEditItem(scope.$index)" v-else>
+            编辑
+          </el-button>
+          <el-button link type="primary" size="small" @click="deleteRow(scope.$index)">
+            删除
+          </el-button>
+          <el-button link type="primary" size="small" @click="onAddItem(scope.$index)">
+            新增
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
 </template>
 <script lang="ts" setup>
 /**
  * @description 家庭成员
  */
+
+import { cloneDeep } from 'lodash-es'
+
 interface ITable {
   id?: string
   userId?: string
@@ -116,7 +125,7 @@ onMounted(() => {
 
 // 新增行
 const onAddItem = (index: number) => {
-  tableData.value.splice(index - 1, 0, {
+  tableData.value.splice(index + 1, 0, {
     name: '',
     xb: '',
     gzdw: '',
@@ -129,8 +138,12 @@ const onAddItem = (index: number) => {
 
 // 保存行
 const onSaveItem = (index: number) => {
-  tableData.value[index].isEdit = false
-  const changeData = tableData.value.map((item: any) => {
+  tableData.value.forEach((item: any, num: number) => {
+    if (num == index) {
+      item.isEdit = false
+    }
+  })
+  const changeData = cloneDeep(tableData.value).map((item: any) => {
     delete item.isEdit
     return item
   })
@@ -148,6 +161,35 @@ const deleteRow = (index: number) => {
 }
 </script>
 <style scoped lang="scss">
+.casually-name {
+  position: relative;
+}
+.star-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;
+  }
+}
+.add-tag {
+  position: absolute;
+  top: 2px;
+  left: 120px;
+  cursor: pointer;
+}
 .detail-table {
   width: 100%;
   min-height: 100px;

+ 12 - 5
client/src/views/OaSystem/personnelManagement/ygdaPage/index.ts

@@ -259,12 +259,19 @@ export const formConfigList = [
         name: 'htdqs',
         title: '合同到期时间',
         type: 'time'
+      },
+      {
+        name: 'xqah',
+        title: '兴趣爱好'
+      },
+      {
+        name: 'jntc',
+        title: '技能特长'
+      },
+      {
+        name: 'cgjl',
+        title: '成果奖励'
       }
-      // {
-      //   name: 'htdqs',
-      //   title: '合同时间',
-      //   type: 'timerange'
-      // }
     ]
   },
   {

+ 7 - 15
client/src/views/OaSystem/personnelManagement/ygdaPage/staffDetail.vue

@@ -16,6 +16,7 @@ import { createImageViewer } from '@/components/ImageViewer'
 import WorkTable from './WorkTable.vue'
 import FamilyTable from './familyTable.vue'
 import SchoolTable from './SchoolTable.vue'
+import moment from 'moment'
 
 const formConfigList = getConfigDict()
 
@@ -34,6 +35,7 @@ useQuery(
   {
     onSuccess: (res) => {
       formData.value = handleTimeData(res)
+      // formData.value = res
       // if (Array.isArray(formData.value['bysj'])) {
       //   formData.value['bysj'] = res.bysj.join('-')
       // }
@@ -47,10 +49,11 @@ const handleTimeData = (dataSource) => {
   const keyList = ['birthday', 'bysj', 'cjgzsj', 'yshtqssj', 'htdqs', 'htqdsj', 'rgssj', 'zzsj']
   Object.keys(dataSource).forEach((key) => {
     if (keyList.includes(key) && Array.isArray(dataSource[key])) {
-      dataSource[key] = dataSource[key].join('-')
+      const dateString = dataSource[key].join('-')
+      const dateValue = moment(dateString).valueOf()
+      dataSource[key] = dateValue
     }
   })
-  // console.log('dataSource', dataSource)
   return dataSource
 }
 
@@ -67,7 +70,7 @@ const { mutate: addUserMutate } = useMutation({
   },
   onError() {
     ElMessage({
-      message: '员工档案修改失败!',
+      message: '员工档案修改失败,请稍后再试!',
       type: 'error'
     })
   }
@@ -173,6 +176,7 @@ const saveSchoolList = (data: any[]) => {
                     :placeholder="isEdit ? child.title : ''"
                     type="date"
                     format="YYYY-MM-DD"
+                    value-format="x"
                   />
 
                   <DeptSelect
@@ -218,24 +222,12 @@ const saveSchoolList = (data: any[]) => {
         </div>
 
         <div class="my-portrait-item">
-          <div class="title">
-            <i></i>
-            <span>工作经历</span>
-          </div>
           <WorkTable :defaultData="formData['workList']" @onSave="saveWorkList" />
         </div>
         <div class="my-portrait-item">
-          <div class="title">
-            <i></i>
-            <span>家庭成员</span>
-          </div>
           <FamilyTable :defaultData="formData['familyList']" @onSave="saveFamilyList" />
         </div>
         <div class="my-portrait-item">
-          <div class="title">
-            <i></i>
-            <span>学习经历</span>
-          </div>
           <SchoolTable :defaultData="formData['schoolList']" @onSave="saveSchoolList" />
         </div>
         <el-row justify="end">