Переглянути джерело

Merge remote-tracking branch 'origin/master'

ljy121 1 рік тому
батько
коміт
1aefe27bda

+ 3 - 3
client/src/service/project.ts

@@ -135,11 +135,11 @@ export const getProjectMileStone = async (projectId: ProjectId) => {
  * @param id
  * @param projectId
  */
-export const finishProjectMileStone = async (params: { id: string; projectId: ProjectId }) => {
-  return await request.get(
+export const finishProjectMileStone = async (data: { id: string; projectId: ProjectId }) => {
+  return await request.post(
     {
       url: '/project-milestone/finish',
-      params: params
+      data: data
     },
     '/business'
   )

+ 12 - 0
client/src/utils/index.ts

@@ -233,3 +233,15 @@ export const yuanToFen = (amount: string | number): number => {
 export const fenToYuan = (amount: string | number): number => {
   return Number((Number(amount) / 100).toFixed(2))
 }
+
+/***
+ * 复制对象值
+ */
+export const copyObject = (target: object, source: object) => {
+  const tKeys = Object.keys(target)
+  for (let i = 0; i < tKeys.length; i++) {
+    if (source[tKeys[i]]) {
+      target[tKeys[i]] = source[tKeys[i]]
+    }
+  }
+}

+ 4 - 2
client/src/views/OaSystem/attendanceCenter/dep.vue

@@ -129,7 +129,7 @@
         >
           <template #header>
             <span>{{ item.text }}</span>
-            <span class="c-#989FA8 font-size-14px m-t-8px">{{ item.unit }}</span>
+            <span class="m-t-8px font-size-14px c-#989FA8">{{ item.unit }}</span>
           </template>
         </el-table-column>
       </el-table>
@@ -376,7 +376,9 @@ const getExcelTable = (attendanceData) => {
       if (!isworkday) return ''
       // 判断有没有数据
       if (!arr.swAttendanceStatus) return ''
-      return `${attendanceTypeObj[arr.swAttendanceStatus] ?? ''} / ${attendanceTypeObj[arr.xwAttendanceStatus] ?? ''}`
+      return `${attendanceTypeObj[arr.swAttendanceStatus] ?? ''} / ${
+        attendanceTypeObj[arr.xwAttendanceStatus] ?? ''
+      }`
     })
     return [
       item.deptName,

+ 1 - 1
client/src/views/OaSystem/projectCenter/projectBook/projectBook.vue

@@ -173,7 +173,7 @@ const handleCurrentChange = (pageNo: number) => {
 const operateClick = (row: any) => {
   router.push({
     path: '/projectDetail',
-    query: { [row.flowStatus === 99 ? 'subId' : 'id']: row.id }
+    query: { id: row.id }
   })
 }
 const tableData = ref<Array<any>>([])

+ 32 - 3
client/src/views/OaSystem/projectCenter/projectDetail/components/xmht/index.vue

@@ -166,8 +166,24 @@
               <td>
                 <UserOrgTree v-model="mContractDetail.areaManagerId" :disabled="!editor" />
               </td>
-              <td class="th"></td>
-              <td></td>
+              <td class="th">签订方式:</td>
+              <td>
+                <span v-if="!editor && !mContractDetail.signWay"></span>
+                <el-select
+                  v-else
+                  style="width: 100%"
+                  placeholder="请选择签订方式"
+                  v-model="mContractDetail.signWay"
+                  :disabled="!editor"
+                >
+                  <el-option
+                    v-for="item in signWayList"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  />
+                </el-select>
+              </td>
             </tr>
             <tr>
               <td class="th">付款条件:</td>
@@ -513,6 +529,20 @@ const mContractDetail = ref<Contract>({} as Contract)
 const cContractDetail = ref<any>()
 const mContractDetails = ref<any[]>([])
 const childrenContracts = ref<any[]>([])
+const signWayList = reactive<any[]>([
+  {
+    label: '跟单',
+    value: 1
+  },
+  {
+    label: '半开拓',
+    value: 2
+  },
+  {
+    label: '开拓',
+    value: 3
+  }
+])
 /***
  * 查询主合同和子合同详情数据: 存在多个主合同(兼容之前项目合同),一般来说子合同只存在最新主合同
  * **/
@@ -524,7 +554,6 @@ const { refetch } = useQuery(
       for (const contract of tData) {
         if (contract.children && contract.children.length > 0) {
           childrenContracts.value = contract.children.filter((child) => {
-            child['contractType'] = 2 //模拟子合同
             return child?.contractType !== 4
           })
           for (let i = 0; i < childrenContracts.value.length; i++) {

+ 18 - 5
client/src/views/OaSystem/projectCenter/projectDetail/components/xmxx/AddSubProject.vue

@@ -4,7 +4,7 @@ import { ProjectId } from '@/interface/project'
 import { useMutation } from '@tanstack/vue-query'
 import { ElMessageBox } from 'element-plus'
 import type { Action } from 'element-plus'
-import { postSubProject } from '@/service/project'
+import { addMember, postSubProject } from '@/service/project'
 import UserOrgTree from '@/views/OaSystem/components/UserOrgTree/index.vue'
 import DeptTree from '@/views/OaSystem/components/DeptTree/index.vue'
 
@@ -50,15 +50,24 @@ const rules = reactive({
   xmjlId: [{ required: true, message: '请选择项目经理', trigger: 'change' }],
   zrbmId: [{ required: true, message: '请选择责任部门', trigger: 'change' }]
 })
-const ruleFormRef = ref<FormInstance>()
+const ruleFormRef = ref()
 const projectChildForm = ref(_projectChildFormSource)
 const { mutate: addSubProject } = useMutation(postSubProject, {
-  onSuccess: () => {
+  onSuccess: (data) => {
     onSuccessCallBack()
     projectChildForm.value = _projectChildFormSource
+    if (data) {
+      //新增项目成员
+      addMember({
+        projectId: data,
+        responsibility: '',
+        workerId: xmjlId.value as string
+      })
+    }
   }
 })
 const message = useMessage() // 消息弹窗
+const xmjlId = ref<string>()
 const submitProjectChild = () => {
   projectChildForm.value.xmbh = projectNo.value
   projectChildForm.value.shareRatio = props.parentData.shareRatio
@@ -82,9 +91,13 @@ const submitProjectChild = () => {
     return
   }
   ElMessageBox.alert('添加子项目后将无法撤销,确认是否添加子项目?', '提交确认', {
-    confirmButtonText: 'OK',
+    showCancelButton: true,
+    confirmButtonText: '确认',
     callback: (action: Action) => {
-      if (action === 'confirm') addSubProject(sendData)
+      if (action === 'confirm') {
+        xmjlId.value = sendData.xmjlId
+        addSubProject(sendData)
+      }
     }
   })
 }

+ 72 - 40
client/src/views/OaSystem/projectCenter/projectDetail/components/xmxx/ProjectMileStone.vue

@@ -1,7 +1,10 @@
 <script setup lang="ts">
 import { useMutation, useQuery } from '@tanstack/vue-query'
+import { copyObject } from '@/utils'
+import request from '@/config/axios'
 import { finishProjectMileStone, getProjectMileStone } from '@/service/project'
 
+const message = useMessage() // 消息弹窗
 /**
  * 项目里程碑
  */
@@ -14,17 +17,54 @@ const { refetch } = useQuery(
   async () => await getProjectMileStone(props.projectId),
   {
     onSuccess: (data) => {
-      projectMilestoneList.value = data
+      projectMilestoneList.value = data.map((item) => {
+        item['is_edit'] = false
+        return item
+      })
     }
   }
 )
+//新增项目里程碑
+const addProjectMilestone = async (item) => {
+  const url = '/project-milestone'
+  const sendData = {
+    name: '',
+    planFinishTime: '',
+    actualFinishTime: '',
+    process: '',
+    projectId: props.projectId
+  }
+  copyObject(sendData, item)
+  const result = await request.post({ url, data: sendData }, '/business')
+  if (result) {
+    item['id'] = result
+    message.success('项目里程碑新增成功!')
+    item['is_edit'] = false
+  }
+}
+//编辑项目里程碑
+const updateProjectMilestone = async (item) => {
+  const url = '/project-milestone'
+  const sendData = {
+    ...item
+  }
+  const result = await request.put({ url, data: sendData }, '/business')
+  if (result) {
+    message.success('项目里程碑编辑成功!')
+  }
+}
+//删除项目里程碑
+const deleteProjectMilestone = async (id: string) => {
+  const url = `/project-milestone?id=${id}`
+  request.delete({ url }, '/business')
+}
 watch(
   () => props.projectId,
   () => {
     refetch()
   }
 )
-const { mutate: handleFinish } = useMutation(finishProjectMileStone, {
+const { mutate: handleFinishMutate } = useMutation(finishProjectMileStone, {
   onSuccess: () => {
     refetch()
     ElMessage({
@@ -33,37 +73,34 @@ const { mutate: handleFinish } = useMutation(finishProjectMileStone, {
     })
   }
 })
+const handleFinish = (item) => {
+  if (item.is_edit) {
+    if (!item.id) {
+      //新增保存
+      addProjectMilestone(item)
+      return
+    }
+    updateProjectMilestone(item)
+    if (item.actualFinishTime) {
+      handleFinishMutate({ id: item.id, projectId: item.projectId })
+    }
+  }
+  item.is_edit = !item.is_edit
+}
 const pMileStoneAddHandle = () => {
   projectMilestoneList.value.push({
-    id: '',
     name: '',
     planFinishTime: '',
     actualFinishTime: '',
-    state: 2,
-    sortnum: 1,
-    projectId: ''
+    process: '100',
+    is_edit: true
   })
 }
-interface StateTypeInterface {
-  value: number
-  label: string
-}
-const stateTypes: StateTypeInterface[] = [
-  {
-    value: 0,
-    label: '未开始'
-  },
-  {
-    value: 1,
-    label: '进行中'
-  },
-  {
-    value: 2,
-    label: '已完成'
-  }
-]
 const confirmHandle = (id: string, index: number) => {
   projectMilestoneList.value.splice(index, 1)
+  if (id) {
+    deleteProjectMilestone(id)
+  }
 }
 </script>
 
@@ -76,13 +113,15 @@ const confirmHandle = (id: string, index: number) => {
       <el-table :data="projectMilestoneList" border style="width: 100%" header-align="center">
         <el-table-column label="里程碑名称">
           <template #default="scope">
-            <el-input :disabled="scope.row.id !== ''" v-model="scope.row.name" />
+            <span v-if="!scope.row.is_edit">{{ scope.row.name }}</span>
+            <el-input v-else v-model="scope.row.name" />
           </template>
         </el-table-column>
         <el-table-column prop="planFinishTime" label="计划完成时间" width="260">
           <template #default="scope">
+            <span v-if="!scope.row.is_edit">{{ scope.row.planFinishTime }}</span>
             <el-date-picker
-              :disabled="scope.row.id !== ''"
+              v-else
               style="width: 100%"
               v-model="scope.row.planFinishTime"
               value-format="YYYY-MM-DD"
@@ -92,33 +131,26 @@ const confirmHandle = (id: string, index: number) => {
 
         <el-table-column label="实际完成时间" prop="actualFinishTime" width="260">
           <template #default="scope">
+            <span v-if="!scope.row.is_edit">{{ scope.row.actualFinishTime }}</span>
             <el-date-picker
-              :disabled="scope.row.id !== ''"
+              v-else
               style="width: 100%"
               v-model="scope.row.actualFinishTime"
               value-format="YYYY-MM-DD"
             />
           </template>
         </el-table-column>
-        <el-table-column label="状态" width="200">
+        <el-table-column label="项目进度" width="200">
           <template #default="scope">
-            <el-select :disabled="scope.row.id !== ''" v-model="scope.row.state">
-              <el-option
-                v-for="(item, index) in stateTypes"
-                :key="index"
-                :label="item.label"
-                :value="item.value"
-              />
-            </el-select>
+            <span v-if="!scope.row.is_edit">{{ scope.row.process }}%</span>
+            <el-input v-else v-model="scope.row.process" />
           </template>
         </el-table-column>
         >
         <el-table-column label="操作" width="200">
           <template #default="scope">
-            <el-button
-              @click="handleFinish({ id: scope.row.id, projectId: scope.row.projectId })"
-              type="text"
-              >完成
+            <el-button @click="handleFinish(scope.row)" type="text"
+              >{{ !scope.row.is_edit ? '编辑' : '保存' }}
             </el-button>
             <el-popconfirm title="确定删除?" @confirm="confirmHandle(scope.row.id, scope.$index)">
               <template #reference>

+ 1 - 1
client/src/views/OaSystem/projectCenter/projectDetail/components/xmxx/index.vue

@@ -176,7 +176,7 @@
                 <td class="th">是否签合同:</td>
                 <td>{{ projectDetail['isSign'] === 0 ? '否' : '是' }}</td>
                 <td class="th">本项目成本(元):</td>
-                <td>{{ projectDetail['xmcbys'] }}</td>
+                <td>{{ projectDetail['xmcbys'] ?? 0 }}</td>
               </tr>
               <tr>
                 <td class="th">本项目产值(元):</td>

+ 3 - 0
client_h5/index.html

@@ -4,6 +4,9 @@
     <meta charset="UTF-8" />
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1">
+    <!-- <script src="https://g.alicdn.com/dingding/dingtalk-jsapi/2.10.3/dingtalk.open.js"></script> -->
+    <script src="eruda.js"></script>
+    <script>eruda.init()</script>
     <title></title>
   </head>
   <body>

+ 19 - 34
client_h5/src/App.vue

@@ -1,37 +1,27 @@
 <script setup lang="ts">
 import { getAuthCode } from 'dingtalk-jsapi'; 
-import { getUrlParams } from "@/utils/common";
 import reqest from "@/utils/request";
 
-const socialAuthRedirect = (type: number, redirectUri: string) => {
-    return reqest.get('/system/auth/social-auth-redirect?type=' + type + '&redirectUri=' + redirectUri)
-}
-const initUserInfoHandler = async (type: number) => {
-    const redirectUri:string ='http://10.10.10.7:48080/admin-api/system/auth/social-login?type=' + type
-    const res = await socialAuthRedirect(type, encodeURIComponent(redirectUri))
-    if (res && res.data) {
-        const map = getUrlParams(res.data);
-        const state: string = map?.get("state") as string
-        const code: string = await getDDAuthCode() as string
-        const userIdResult = await getUserIdByDD({
-            type,
-            code,
-            state
-        })
-        if (userIdResult && userIdResult.data) { 
-            getUserInfoById(userIdResult.data)
-        }
+const initUserInfoHandler = async () => {
+    const code: string = await getDDAuthCode() as string
+    const userIdResult = await getUserIdByDD({
+        code
+    })
+    console.log("userIdResult--------")
+    console.log(userIdResult)
+    if (userIdResult && userIdResult?.data) {
+        getUserInfoById(userIdResult?.data.userId)
     }
 }
-initUserInfoHandler(20)
+initUserInfoHandler()
 function getDDAuthCode() {
     return new Promise((resolve, reject) => {
         getAuthCode({
             corpId: 'ding65143abf9aeea2ec',
-            success: (res) => {
-                const { authCode } = res;
-                if (authCode) {
-                    resolve(authCode);
+            success: (res: any) => {
+                const { code } = res;
+                if (code) {
+                    resolve(code);
                 }
             },
             fail: (ex: any) => {
@@ -42,21 +32,16 @@ function getDDAuthCode() {
     });
 }
 interface UserIdParam {
-    type: number
     code: string
-    state: string
 }
 const getUserIdByDD = async (data: Required<UserIdParam>) => {
-    return reqest.post({
-        url: '/system/auth/social-login',
-        data: data
-    })
+  return reqest.post(`/app-api/system/auth/login-ding?code=${data.code}`, null)
 }
+//@ts-ignore
 const getUserInfoById = async (idStr: Required<string>) => {
-    return reqest.get({
-        url: '/system/user/get',
-        params: {id: idStr}
-    })
+  return reqest.get('/admin-api/system/user/get', {
+      params: {id: idStr}
+  })
 }
 </script>
 

+ 1 - 1
client_h5/src/stores/modules/user.ts

@@ -21,7 +21,7 @@ const UserStore = defineStore("UserStore", {
             mobile: "",
             sex: "",
             avatar: ""
-        }
+        } as UserInterface
     }),
     getters: {
         getUser(state) {

+ 1 - 1
client_h5/src/utils/request.ts

@@ -2,7 +2,7 @@ import axios from 'axios';
  
  
 const defaultConfig = {
-  baseURL:'http://10.10.10.7:48080/admin-api/'
+  baseURL:'http://10.10.10.7:48080/'
 };
  
 const instance = axios.create(Object.assign({}, defaultConfig));

+ 65 - 102
zjugis-business/src/main/resources/templates/RecruitDemand/js/index.js

@@ -1,11 +1,18 @@
 (function () {
     let isTimes = []
     let read = z.ui.comm.getUrlParam("read");
+    var addData = null;
     window.onload = function (ex) {
+        addData = $("#addData")
+        addValue();
+        bindEvents();
+    }
 
+    function addValue() {
         let timeObject = document.querySelector('#timeObject')
         let arrays = JSON.parse(timeObject.value)//存在的列表详情
         $("#addData").click(function () {
+            addData.attr('disabled', "true");
             let obj = {
                 post: "",
                 requireNum: "",
@@ -21,7 +28,6 @@
             buildQjsjSeq();
         })
 
-        bindEvents();
 
         if (arrays.length > 0) {
             for (let i = 0; i < arrays.length; i++) {
@@ -36,104 +42,8 @@
                 }
                 isTimes.push(obj)
             }
-            updateView()
-        }
-    }
-
-    function updateView() {
-        let tbodyQjsq = document.querySelector('.tbodyQjsq')
-        let html = ''
-        let dictJson1 = document.querySelector('#dictJson1').value
-        let dictJson2 = document.querySelector('#dictJson2').value
-        for (let i = 0; i < isTimes.length; i++) {
-            html += '<tr class="qjsjClass" id="qjsj_' + i + '" style="background:#fff"> <td name="qjsj_seq">' + (i + 1) + '</td>'
-                + '<td>'/*岗位*/
-                + '<div class="form-item">'
-                + '<div class="z-comp-select" data =\' ' + dictJson1 + '\'  name="RecruitDetailDO[' + i + ']$post">'
-                + '<div class="z-inputselect-bar">'
-                + '<span></span><i></i>'
-                + '</div>'
-                + '</div>'
-                + '</div>'
-                + '</td>'
-                + '<td>'/*需求人数*/
-                + '<div class="form-item">'
-                + '<div class="z-comp-input" name="RecruitDetailDO[' + i + ']$requireNum">'
-                + '<input type="number" value="' + isTimes[i].requireNum + '">'
-                + '</div>'
-                + '</div>'
-                + '</td>'
-                + '<td>'/*已招人数*/
-                + '<div class="form-item">'
-                + '<div class="z-comp-input" name="RecruitDetailDO[' + i + ']$recruitNum">'
-                + '<input type="number" value="' + isTimes[i].recruitNum + '">'
-                + '</div>'
-                + '</div>'
-                + '</td>'
-                + '<td>'/*任职要求*/
-                + '<div class="form-item" >'
-                + '<div class="z-comp-textarea" name="RecruitDetailDO[' + i + ']$jobRequest">'
-                + '<textarea></textarea>'
-                + '</div>'
-                + '</div>'
-                + '</td>'
-                + '<td>'/*岗位职责*/
-                + '<div class="form-item">'
-                + '<div class="z-comp-textarea" name="RecruitDetailDO[' + i + ']$postDuty">'
-                + '<textarea></textarea>'
-                + '</div>'
-                + '</div>'
-                + '</td>'
-                + '<td>'/*落实情况*/
-                + '<div class="form-item">'
-                + '<div class="z-comp-textarea" name="RecruitDetailDO[' + i + ']$remark">'
-                + '<textarea></textarea>'
-                + '</div>'
-                + '</div>'
-                + '</td>'
-                + '<td>'/*所属类别*/
-                + '<div class="form-item">'
-                + '<div class="z-comp-select" data =\' ' + dictJson2 + '\'  name="RecruitDetailDO[' + i + ']$type">'
-                + '<div class="z-inputselect-bar">'
-                + '<span></span><i></i>'
-                + '</div>'
-                + '</div>'
-                + '</div>'
-                + '</td>'
-                + '<td>'
-                + '<div id="delBtn_' + (i) + '" class="table-btn delBtn_' + (i) + '" data-index="' + (i) + '">'
-                + '<span>删除</span>'
-                + '</div>'
-                + '</td>';
-        }
-        tbodyQjsq.innerHTML = html
-        for (let i = 0; i < isTimes.length; i++) {
-            z.ui.textarea("[name='RecruitDetailDO[" + i + "]$jobRequest']").setValue(isTimes[i].jobRequest);
-            z.ui.textarea("[name='RecruitDetailDO[" + i + "]$postDuty']").setValue(isTimes[i].postDuty);
-            z.ui.textarea("[name='RecruitDetailDO[" + i + "]$remark']").setValue(isTimes[i].remark);
-            z.ui.select("[name='RecruitDetailDO[" + i + "]$post']").init();
-            z.ui.select("[name='RecruitDetailDO[" + i + "]$post']").setValue(isTimes[i].post + "");
-            z.ui.select("[name='RecruitDetailDO[" + i + "]$type']").init();
-            z.ui.select("[name='RecruitDetailDO[" + i + "]$type']").setValue(isTimes[i].type + "");
-            $("#delBtn_" + i).click(function () {
-                var index = this.id.substring(this.id.indexOf("_") + 1)
-                z.ui.confirm("compid").init({
-                    content: "确定删除吗?",
-                    onConfirm: function () {
-                        var element = document.getElementById("qjsj_" + index);
-                        element.remove();
-                        buildQjsjSeq();
-                    },
-                    onCancel: function () {
-
-                    }
-                })
-
-            })
-
-
-            if (read === '1') {
-                detailReadonly(i)
+            for (let i = 0; i < arrays.length; i++) {
+                generateTableTrHtml(i);
             }
         }
 
@@ -181,6 +91,31 @@
         }
     }
 
+
+    function detailWrite(i){
+       $ ("#delBtn_" + i).css("display", "block");
+        //设置只读属性
+        $("[name='RecruitDetailDO\\[" + i + "\\]\\$post']").removeClass("z-readonly");
+        $("[name='RecruitDetailDO\\[" + i + "\\]\\$type']").removeClass("z-readonly");
+
+        //设置输入框鼠标不可选
+        $("[name='RecruitDetailDO\\[" + i + "\\]\\$post']").css("pointer-events", "auto");
+        $("[name='RecruitDetailDO\\[" + i + "\\]\\$type']").css("pointer-events", "auto");
+
+
+        let detailElement = document.getElementById("qjsj_" + i);
+        let detailInput = detailElement.getElementsByTagName("input");
+        let detailTextarea = detailElement.getElementsByTagName("textarea");
+        for (let j = 0; j < detailInput.length; j++) {
+            detailInput[j].disabled = false;
+            $(detailInput[j]).removeClass("z-readonly");
+        }
+        for (let j = 0; j < detailTextarea.length; j++) {
+            detailTextarea[j].disabled = false;
+            $(detailTextarea[j]).removeClass("z-readonly")
+        }
+    }
+
     /*
   * all 工作流js传递到业务的参数 success执行的方法
   * istransfer 工作流js传递到业务的参数 是否转件
@@ -280,10 +215,15 @@
             + '</div>'
             + '</div>'
             + '</td>'
-            + '<td>'
+            + '<td style="align-items: center">'
+            + '<div style="display: flex;white-space: nowrap">'
+            + '<div id="editBtn_' + (index) + '" class="table-btn editBtn_' + (index) + '" data-index="' + (index) + '">'
+            + '<span>保存</span>'
+            + '</div>'
             + '<div id="delBtn_' + (index) + '" class="table-btn delBtn_' + (index) + '" data-index="' + (index) + '">'
             + '<span>删除</span>'
             + '</div>'
+            + '</div>'
             + '</td>';
         let trFragment = document.createDocumentFragment();
         trFragment.appendChild(trDom);
@@ -292,6 +232,27 @@
         z.ui.select("[name='RecruitDetailDO[" + index + "]$post']").setValue(isTimes[index].post);
         z.ui.select("[name='RecruitDetailDO[" + index + "]$type']").init();
         z.ui.select("[name='RecruitDetailDO[" + index + "]$type']").setValue(isTimes[index].type);
+
+
+        $("#editBtn_" + index).click(function () {
+            const span = $(this).find("span");
+            const html = span.html();
+            if (html === '编辑') {
+                span.html('保存')
+                detailWrite(index)
+                addData.attr('disabled', "true");
+                $("#qjsj_" + index).removeClass("form-table-disable")
+                return;
+            }
+            if (html === '保存') {
+                span.html('编辑')
+                detailReadonly(index)
+                addData.removeAttr('disabled')
+                $("#qjsj_" + index).addClass("form-table-disable")
+                return;
+            }
+        })
+
         $("#delBtn_" + index).click(function () {
             z.ui.confirm("compid").init({
                 content: "确定删除吗?",
@@ -300,8 +261,6 @@
                     element.remove();
                     buildQjsjSeq();
                     isTimes.splice(index, 1)
-                    updateView()
-
                 },
                 onCancel: function () {
 
@@ -309,6 +268,10 @@
             })
 
         })
+
+        if (read === '1') {
+            detailReadonly(index)
+        }
     }
 }());
 

+ 24 - 2
zjugis-business/src/main/resources/templates/Resign/js/index.js

@@ -203,13 +203,15 @@
             + '</div>'
             + '</div>'
             + '</td>'
-            + '<td>'
+            + '<td style="align-items: center">'
+            + '<div style="display: flex;white-space: nowrap">'
             + '<div id="editBtnF_' + (i) + '" class="table-btn editBtnF_' + (i) + '" data-index="' + (i) + '">'
             + '<span>保存</span>'
             + '</div>'
             + '<div id="delBtnF_' + (i) + '" class="table-btn delBtnF_' + (i) + '" data-index="' + (i) + '">'
             + '<span>删除</span>'
             + '</div>'
+            + '</div>'
             + '</td>';
         let trFragment = document.createDocumentFragment();
         trFragment.appendChild(trDom);
@@ -250,12 +252,14 @@
                     const html = span.html();
                     if (html === '编辑') {
                         span.html('保存')
+                        detailWrite(i);
                         addDataFinished.attr('disabled', "true");
                         $("#qjsjF_" + i).removeClass("form-table-disable")
                         return;
                     }
                     if (html === '保存') {
                         span.html('编辑')
+                        detailReadonly(i);
                         addDataFinished.removeAttr('disabled')
                         $("#qjsjF_" + i).addClass("form-table-disable")
                         return;
@@ -333,13 +337,15 @@
             + '</div>'
             + '</div>'
             + '</td>'
-            + '<td>'
+            + '<td style="align-items: center">'
+            + '<div style="display: flex;white-space: nowrap">'
             + '<div id="editBtnU_' + (i) + '" class="table-btn editBtnU_' + (i) + '" data-index="' + (i) + '">'
             + '<span>保存</span>'
             + '</div>'
             + '<div id="delBtnU_' + (i) + '" class="table-btn delBtnU_' + (i) + '" data-index="' + (i) + '">'
             + '<span>删除</span>'
             + '</div>'
+            + '</div>'
             + '</td>';
         let trFragment = document.createDocumentFragment();
         trFragment.appendChild(trDom);
@@ -380,12 +386,14 @@
                     const html = span.html();
                     if (html === '编辑') {
                         span.html('保存')
+                        detailWriteU(i);
                         addDataUnFinished.attr('disabled', "true");
                         $("#qjsj_" + i).removeClass("form-table-disable")
                         return;
                     }
                     if (html === '保存') {
                         span.html('编辑')
+                        detailReadonlyU(i);
                         addDataUnFinished.removeAttr('disabled')
                         $("#qjsj_" + i).addClass("form-table-disable")
                         return;
@@ -433,6 +441,13 @@
     }
 
 
+    function detailWrite(i) {
+        $("#delBtn_" + i).css("display", "block");
+        $("[name='receive1[" + i + "]']").removeClass("z-readonly").css("pointer-events", "auto");
+        $("[name='review1[" + i + "]']").removeClass("z-readonly").css("pointer-events", "auto");
+        $("[name='ResignDetailDO1[" + i + "]$content']").removeClass("z-readonly").css("pointer-events", "auto");
+    }
+
     function detailReadonly(i) {
         //设置只读属性
         $("#delBtn_" + i).css("display", "none");
@@ -442,6 +457,13 @@
     }
 
 
+    function detailWriteU(i) {
+        $("#delBtn_" + i).css("display", "block");
+        $("[name='receive[" + i + "]']").removeClass("z-readonly").css("pointer-events", "auto");
+        $("[name='confirm[" + i + "]']").removeClass("z-readonly").css("pointer-events", "auto");
+        $("[name='ResignDetailDO[" + i + "]$content']").removeClass("z-readonly").css("pointer-events", "auto");
+    }
+
     //手动列表添加只读效果
     function detailReadonlyU(i) {
         $("#delBtn_" + i).css("display", "none");