Browse Source

项目里程碑添加

ljy121 1 năm trước cách đây
mục cha
commit
eb7b661cc3

+ 8 - 1
zjugis-business/src/main/java/com/zjugis/business/flow/project/controller/FlowProjectController.java

@@ -3,7 +3,9 @@ package com.zjugis.business.flow.project.controller;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zjugis.business.bean.dto.ProjectDto;
 import com.zjugis.business.bean.entity.Project;
+import com.zjugis.business.bean.entity.ProjectMilestone;
 import com.zjugis.business.flow.project.service.FlowProjectService;
+import com.zjugis.business.service.ProjectMilestoneService;
 import com.zjugis.business.service.ProjectService;
 import com.zjugis.framework.security.core.util.SecurityFrameworkUtils;
 import com.zjugis.framework.workflow.model.BaseController;
@@ -17,6 +19,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -31,6 +34,9 @@ public class FlowProjectController extends BaseController {
     @Autowired
     FlowProjectService projectFlowService;
 
+    @Autowired
+    ProjectMilestoneService projectMilestoneService;
+
     @Autowired
     ProjectService projectService;
 
@@ -64,7 +70,8 @@ public class FlowProjectController extends BaseController {
         return resultPage(params);
     }
     @PostMapping("/update")
-    public String update(@ParamModel Project project) {
+    public String update(@ParamModel Project project,@ParamModel List<ProjectMilestone> milestoneList) {
+        projectMilestoneService.updateList(milestoneList,project.getId());
         return success(projectFlowService.updateById(project));
     }
 }

+ 7 - 0
zjugis-business/src/main/java/com/zjugis/business/flow/project/service/FlowProjectService.java

@@ -3,11 +3,13 @@ package com.zjugis.business.flow.project.service;
 import com.alibaba.excel.util.StringUtils;
 import com.alibaba.fastjson2.JSON;
 import com.zjugis.business.bean.entity.Project;
+import com.zjugis.business.bean.entity.ProjectMilestone;
 import com.zjugis.business.constants.DictConstants;
 import com.zjugis.business.constants.FlowStatusConstants;
 import com.zjugis.business.constants.XmztConstants;
 import com.zjugis.business.converter.common.SelectConvert;
 import com.zjugis.business.mapper.ProjectMapper;
+import com.zjugis.business.service.ProjectMilestoneService;
 import com.zjugis.business.service.ProjectService;
 import com.zjugis.framework.common.pojo.CommonResult;
 import com.zjugis.framework.security.core.util.SecurityFrameworkUtils;
@@ -42,6 +44,9 @@ public class FlowProjectService {
     @Autowired
     ProjectService projectService;
 
+    @Autowired
+    ProjectMilestoneService projectMilestoneService;
+
     @Autowired
     ProjectMapper projectMapper;
 
@@ -90,6 +95,8 @@ public class FlowProjectService {
     private Map<String, Object>  createMap(String flowInstanceId, Project entity,  String userId) {
         Map<String, Object> map = new HashMap<>();
         map.put("formEntity", entity);
+        List<ProjectMilestone> milestoneList = projectMilestoneService.list(entity.getId());
+        map.put("milestoneListJson",JSON.toJSONString(milestoneList));
         List<Select> hyTypeList = SelectConvert.INSTANCE.convertList(dictDataApi.getDictDataList(DictConstants.TYPE_HY).getCheckedData());
         map.put("hyTypeList", JSON.toJSONString(hyTypeList));
         if(entity.getHyId() != null){

+ 3 - 22
zjugis-business/src/main/java/com/zjugis/business/mapper/ProjectMilestoneMapper.java

@@ -1,10 +1,7 @@
 package com.zjugis.business.mapper;
 
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zjugis.business.bean.entity.ProjectMilestone;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
+import com.zjugis.framework.mybatis.core.mapper.BaseMapperX;
 
 /**
  * (ProjectMilestone)表数据库访问层
@@ -12,25 +9,9 @@ import java.util.List;
  * @author ljy
  * @since 2023-11-14 18:43:21
  */
-public interface ProjectMilestoneMapper extends BaseMapper<ProjectMilestone> {
-
-    /**
-     * 统计总行数
-     *
-     * @param projectMilestone 查询条件
-     * @return 总行数
-     */
-    long count(ProjectMilestone projectMilestone);
-
-
-    /**
-     * 批量新增数据(MyBatis原生foreach方法)
-     *
-     * @param entities List<ProjectMilestone> 实例对象列表
-     * @return 影响行数
-     */
-    int insertBatch(@Param("entities") List<ProjectMilestone> entities);
+public interface ProjectMilestoneMapper extends BaseMapperX<ProjectMilestone> {
 
 
+    int deleteByProjectId(String projectId);
 }
 

+ 2 - 0
zjugis-business/src/main/java/com/zjugis/business/service/ProjectMilestoneService.java

@@ -54,5 +54,7 @@ public interface ProjectMilestoneService {
     int finish(ProjectMilestoneRequest projectMilestone);
 
     List<ProjectMilestone> list(String projectId);
+
+    void updateList(List<ProjectMilestone> milestoneList,String id);
 }
 

+ 10 - 0
zjugis-business/src/main/java/com/zjugis/business/service/impl/ProjectCostServiceImpl.java

@@ -5,6 +5,8 @@ import com.zjugis.business.bean.dto.ProjectCostDto;
 import com.zjugis.business.bean.entity.ProjectCost;
 import com.zjugis.business.bean.response.ProjectCostResponse;
 import com.zjugis.business.bean.response.ProjectMonthCostResponse;
+import com.zjugis.business.flow.commoncost.service.CommonCostService;
+import com.zjugis.business.flow.travelcost.service.TravelCostService;
 import com.zjugis.business.mapper.ContractMapper;
 import com.zjugis.business.mapper.ProjectCostMapper;
 import com.zjugis.business.service.ProjectCostService;
@@ -29,6 +31,12 @@ public class ProjectCostServiceImpl implements ProjectCostService {
     @Autowired
     private ContractMapper contractMapper;
 
+    @Autowired
+    private CommonCostService commonCostService;
+
+    @Autowired
+    private TravelCostService travelCostService;
+
     @Override
     public ProjectCost queryById(String id) {
         return projectCostMapper.selectById(id);
@@ -48,6 +56,8 @@ public class ProjectCostServiceImpl implements ProjectCostService {
     public ProjectCostResponse calculate(ProjectCostDto projectCostDto) {
         ProjectCostResponse cost = projectCostMapper.calculate(projectCostDto);
         ProjectCostResponse subCost = projectCostMapper.selectSubcontractCost(projectCostDto);
+//        commonCostService.getCostByProjectId(projectCostDto.getProjectIds());
+//        travelCostService.getCostByProjectId(projectCostDto.getProjectIds());
         cost.setSubcontractCost(subCost.getSubcontractCost());
         cost.setOutsourceCost(subCost.getOutsourceCost());
         cost.calcCost();

+ 12 - 0
zjugis-business/src/main/java/com/zjugis/business/service/impl/ProjectMilestoneServiceImpl.java

@@ -1,5 +1,6 @@
 package com.zjugis.business.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zjugis.business.bean.dto.ProjectMilestoneDto;
@@ -126,5 +127,16 @@ public class ProjectMilestoneServiceImpl implements ProjectMilestoneService {
         queryWrapper.orderByAsc("SORTNUM");
         return projectMilestoneMapper.selectList(queryWrapper);
     }
+
+    /**
+     * @param milestoneList
+     */
+    @Override
+    public void updateList(List<ProjectMilestone> milestoneList,String projectId) {
+        projectMilestoneMapper.deleteByProjectId(projectId);
+        if (CollectionUtil.isNotEmpty(milestoneList)) {
+            projectMilestoneMapper.insertBatch(milestoneList);
+        }
+    }
 }
 

+ 5 - 1
zjugis-business/src/main/resources/mapper/oracle/ProjectCostMapper.xml

@@ -9,7 +9,11 @@
         NVL(SUM(NVL(REIMBURSEMENT_COST, 0)), 0) AS reimbursementCost,
         NVL(SUM(NVL(PAYMENT_COST, 0)), 0) AS paymentCost
         FROM PROJECT_COST
-        WHERE PROJECT_ID = #{params.projectId} AND ISVALID = 1
+        WHERE PROJECT_ID in
+        <foreach item="id" index="index" collection="projectIds" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+        AND ISVALID = 1
     </select>
 
     <select id="selectSubcontractCost" resultType="com.zjugis.business.bean.response.ProjectCostResponse">

+ 9 - 0
zjugis-business/src/main/resources/mapper/oracle/ProjectMilestoneMapper.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zjugis.business.mapper.ProjectMilestoneMapper">
+
+    <delete id="deleteByProjectId">
+        delete from PROJECT_MILESTONE where PROJECT_ID = #{projectId,jdbcType=VARCHAR}
+    </delete>
+</mapper>
+

+ 74 - 6
zjugis-business/src/main/resources/templates/FlowContract/js/apply.js

@@ -258,27 +258,45 @@
         }
         lists.push(dataObj);
         trFragment.appendChild(generateTableTrHtml(lists.length-1))
+        var index = lists.length - 1;
         $(".tbody").append(trFragment)
-        $("#delBtn_" + (lists.length-1)).click(function () {
-            var index = this.id.substring(this.id.indexOf("_") + 1)
+        $("#delBtn_" + index).click(function () {
+            var i = this.id.substring(this.id.indexOf("_") + 1)
             z.ui.confirm("compid").init({
                 content: "确定删除吗?",
                 onConfirm: function () {
-                    var element = document.getElementById("contract_milestone_" +  (lists.length-1));
+                    var element = document.getElementById("contract_milestone_" +  i);
                     element.remove();
                     buildSeq();
-                    lists.splice(lists.length-1,1);
+                    lists.splice(i,1);
                     updateView();
                 },
                 onCancel: function () {
 
                 }
             })
-
+        })
+        $("#editBtn_" + index).click(function () {
+            var i = this.id.substring(this.id.indexOf("_") + 1)
+            const span = $(this).find("span");
+            const html = span.html();
+            if (html === '编辑') {
+                span.html('保存')
+                detailWrite(i);
+                $("#addData").attr('disabled', "true");
+                $("#contract_milestone_" + i).removeClass("form-table-disable")
+                return;
+            }
+            if (html === '保存') {
+                span.html('编辑')
+                detailReadonly(i, false,"contract_milestone_")
+                $("#addData").removeAttr('disabled')
+                $("#contract_milestone_" + i).addClass("form-table-disable")
+                return;
+            }
         })
         z.ui.date("[name='ContractMilestone[" + (lists.length-1) + "]$planReturnTime']").init()
         buildSeq();
-        lists.push(dataObj)
 
         for (let i = 0; i < tbody.length; i++) {
             z.ui.date("[name='ContractMilestone[" + i + "]$planReturnTime']").init({
@@ -366,6 +384,9 @@
             + '</div>'
             + '</td>'
             + '<td>'
+            + '<div id="editBtn_' + (i) + '" class="table-btn editBtn_' + (i) + '" data-index="' + (i) + '">'
+            + '<span>编辑</span>'
+            + '</div>'
             + '<div id="delBtn_' + (i) + '" class="table-btn delBtn_' + (i) + '" data-index="' + (i) + '">'
             + '<span>删除</span>'
             + '</div>'
@@ -390,6 +411,26 @@
                 })
 
             })
+            $("#editBtn_" + i).click(function () {
+                const span = $(this).find("span");
+                const html = span.html();
+                if (html === '编辑') {
+                    span.html('保存')
+                    detailWrite(i);
+                    $("#addData").attr('disabled', "true");
+                    $("#contract_milestone_" + i).removeClass("form-table-disable")
+                    return;
+                }
+                if (html === '保存') {
+                    span.html('编辑')
+                    detailReadonly(i, false,"contract_milestone_")
+                    $("#addData").removeAttr('disabled')
+                    $("#contract_milestone_" + i).addClass("form-table-disable")
+                    return;
+                }
+            })
+            detailReadonly(i,false,"contract_milestone_")
+            $("#contract_milestone_" + i).addClass("form-table-disable")
             // if(viewState === 'v' || read=== '1'){
             //     detailReadonly(i)
             // }
@@ -460,6 +501,9 @@
             + '</div>'
             + '</td>'
             + '<td>'
+            + '<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>'
@@ -467,6 +511,30 @@
         return trDom;
     }
 
+    function detailReadonly(i, isBool = true,prefix) {
+        if (isBool) {
+            $("#delBtn_" + i).css("display", "none");
+            $("#editBtn_" + i).css("display", "none");
+        }
+        let detailElement = document.getElementById(prefix + i);
+        let detailInput = detailElement.getElementsByTagName("input");
+        for (let j = 0; j < detailInput.length; j++) {
+            detailInput[j].disabled = true;
+            detailInput[j].className += "z-readonly"
+        }
+    }
+
+
+    function detailWrite(i) {
+        //财务审核时可以核减修改金额
+        let detailElement = document.getElementById("contract_milestone_" + i);
+        let detailInput = detailElement.getElementsByTagName("input");
+        for (let j = 0; j < detailInput.length; j++) {
+            detailInput[j].disabled = false;
+            $(detailInput[j]).removeClass("z-readonly")
+        }
+    }
+
 
     // TODO tax valid
     // function Tax_ValidateInput() {

+ 24 - 6
zjugis-business/src/main/resources/templates/FlowContractInvoice/js/apply.js

@@ -263,27 +263,45 @@
         }
         lists.push(dataObj);
         trFragment.appendChild(generateTableTrHtml(lists.length-1))
+        var index = lists.length - 1;
         $("[name=returnMoney]").append(trFragment)
-        $("#delBtn_" + (lists.length-1)).click(function () {
-            var index = this.id.substring(this.id.indexOf("_") + 1)
+        $("#delBtn_" + index).click(function () {
+            var i = this.id.substring(this.id.indexOf("_") + 1)
             z.ui.confirm("compid").init({
                 content: "确定删除吗?",
                 onConfirm: function () {
-                    var element = document.getElementById("contract_return_" +  (lists.length-1));
+                    var element = document.getElementById("contract_return_" +  i);
                     element.remove();
                     buildSeq();
-                    lists.splice(lists.length-1,1);
+                    lists.splice(i,1);
                     updateView();
                 },
                 onCancel: function () {
 
                 }
             })
-
+        })
+        $("#editBtn_" + index).click(function () {
+            var i = this.id.substring(this.id.indexOf("_") + 1)
+            const span = $(this).find("span");
+            const html = span.html();
+            if (html === '编辑') {
+                span.html('保存')
+                detailWrite(i);
+                $("#addData").attr('disabled', "true");
+                $("#contract_return_" + i).removeClass("form-table-disable")
+                return;
+            }
+            if (html === '保存') {
+                span.html('编辑')
+                detailReadonly(i, false,"contract_return_")
+                $("#addData").removeAttr('disabled')
+                $("#contract_return_" + i).addClass("form-table-disable")
+                return;
+            }
         })
         z.ui.date("[name='ContractReturnMoney[" + (lists.length-1) + "]$returnDate']").init()
         buildSeq();
-        lists.push(dataObj)
 
         for (let i = 0; i < tbody.length; i++) {
             z.ui.date("[name='ContractReturnMoney[" + i + "]$returnDate']").init({

+ 30 - 1
zjugis-business/src/main/resources/templates/FlowProject/apply.ftl

@@ -266,8 +266,34 @@
             </table>
           </div>
         </div>
+        <div class="form-title">
+          <div class="form-icon">
+            <img src="/imgs/titleIcon.png" alt="">
+            <span>项目里程碑信息</span>
+          </div>
+          <div class="form-btn">
+            <div id="addData" name="addData">
+              <img src="/imgs/addIcon.png" alt="">
+              <span>新增</span>
+            </div>
+          </div>
+        </div>
+        <div class="qjsjxx-box">
+          <table class="form-table-info">
+            <thead>
+            <tr>
+              <td>序号</td>
+              <td>里程碑信息</td>
+              <td>计划完成时间</td>
+              <td>实际完成时间</td>
+              <td>操作</td>
+            </tr>
+            </thead>
+            <tbody class="tbody tbodyQjsq" name="milestone"></tbody>
+          </table>
+        </div>
       </div>
-        <#if WORKFLOW.OPINION! !="">
+      <#if WORKFLOW.OPINION! !="">
       <div class="ow-tab-content" name="yj">
 
           <div class="form-title">
@@ -305,4 +331,7 @@
       margin-top: 0;
     }
   </style>
+  <script>
+    window.milestoneList = '${milestoneListJson!}';
+  </script>
 </@w.workFlow>

+ 262 - 1
zjugis-business/src/main/resources/templates/FlowProject/js/apply.js

@@ -1,4 +1,8 @@
 (function () {
+  var lists = [];
+  var projectId = $("[name='project$id']").val()
+  let viewState = z.ui.comm.getUrlParam("_o");
+  let read = z.ui.comm.getUrlParam("read");
   let flowInstanceId = "";
   let isView = "";
   window.onload = function () {
@@ -19,6 +23,7 @@
     initZrbm();
     initProjectType();
     initBelongCompany();
+    initProjectMilestone();
   }
 
   function bindGenerateSerial(){
@@ -67,6 +72,17 @@
       all({ success: false });
       return;
     }
+    var milestoneList = new Array()
+    for (let key of Object.keys(postData)) {
+      let mealName = postData[key];
+      if (key.startsWith("ProjectMilestone")) {
+        mealName.projectId = projectId;
+        mealName.state = 0;
+        milestoneList.push(z.ui.form.childStringify(mealName));
+
+      }
+    }
+    postData.milestoneList = milestoneList;
     z.ui.ajax({
       url: z.ui.comm.getEntranceUrl("/flow/project/update"),
       data: z.ui.form.childStringify(postData),
@@ -79,6 +95,27 @@
     })
   }
 
+  function initProjectMilestone(){
+    var milestoneList = JSON.parse(window.milestoneList);
+    if (milestoneList.length > 0) {
+      for (let i = 0; i < milestoneList.length; i++) {
+        let obj = {
+          name: milestoneList[i].name || "",
+          planFinishTime: milestoneList[i].planFinishTime || "",
+          actualFinishTime: milestoneList[i].actualFinishTime || "",
+          id: milestoneList[i].id || "",
+          projectId: milestoneList[i].projectId || projectId,
+          sortnum: milestoneList[i].sortnum || ""
+        }
+        lists.push(obj)
+      }
+    }
+    $("#addData").click(function(){
+      addProjectMilestone();
+    })
+    updateView()
+  }
+
   function initLyfc(){
     //利益分成JS交互
     var lyfcGsDom = document.querySelector("#lyfcGs");
@@ -114,7 +151,7 @@
       if(!ele) continue;
       var val = ele.getAttribute('value');
       var eleClass = ele.classList;
-      if(val !== '0.4' && val !== '0.375' && val !== '0'){
+      if(val !== '0.42' && val !== '0.375' && val !== '0'){
         lyfcBmDom.value = defaultVal * 100;
         lyfcGsDom.value = 100 - defaultVal * 100;
         break;
@@ -168,6 +205,206 @@
     })
   }
 
+  function addProjectMilestone(){
+    var trFragment = document.createDocumentFragment();
+    let tbody = document.querySelectorAll('.tbody tr')
+    let qjsjElements = document.getElementsByName("project_milestone_seq");
+    var dataObj = {
+      name: "",
+      actualFinishTime: "",
+      planFinishTime: "",
+      id: "",
+      projectId: projectId,
+      sortnum: ""
+    }
+    lists.push(dataObj);
+    trFragment.appendChild(generateTableTrHtml(lists.length-1))
+    var index = lists.length - 1;
+    $(".tbody").append(trFragment)
+    $("#delBtn_" + index).click(function () {
+      var i = this.id.substring(this.id.indexOf("_") + 1)
+      z.ui.confirm("compid").init({
+        content: "确定删除吗?",
+        onConfirm: function () {
+          var element = document.getElementById("project_milestone_" +  i);
+          element.remove();
+          buildSeq();
+          lists.splice(i,1);
+          updateView();
+        },
+        onCancel: function () {
+
+        }
+      })
+    })
+    $("#editBtn_" + index).click(function () {
+      var i = this.id.substring(this.id.indexOf("_") + 1)
+      const span = $(this).find("span");
+      const html = span.html();
+      if (html === '编辑') {
+        span.html('保存')
+        detailWrite(i);
+        $("#addData").attr('disabled', "true");
+        $("#project_milestone_" + i).removeClass("form-table-disable")
+        return;
+      }
+      if (html === '保存') {
+        span.html('编辑')
+        detailReadonly(i, false,"project_milestone_")
+        $("#addData").removeAttr('disabled')
+        $("#project_milestone_" + i).addClass("form-table-disable")
+        return;
+      }
+    })
+    z.ui.date("[name='ProjectMilestone[" + (lists.length-1) + "]$planFinishTime']").init()
+    z.ui.date("[name='ProjectMilestone[" + (lists.length-1) + "]$actualFinishTime']").init()
+    buildSeq();
+  }
+
+  function buildSeq() {
+    let elementsByName = document.getElementsByName("project_milestone_seq");
+    for (let i = 0; i < elementsByName.length; i++) {
+      const seqElement = elementsByName[i];
+      seqElement.innerHTML = i + 1;
+    }
+  }
+
+  function updateView() {
+    let tbodyQjsq = document.querySelector('.tbodyQjsq')
+    let html = ''
+    for (let i = 0; i < lists.length; i++) {
+      html += '<tr class="qjsjClass" id="project_milestone_' + i + '" style="background:#fff">'
+          + '<td name="project_milestone_seq">' + (i + 1) + '</td>'
+          + '<td>'
+          + '<div class="form-flex">'
+          + '<div class="form-item" style="width: 100%;margin-right: 5px;">'
+          + '<input type="hidden" name="ProjectMilestone[' + i + ']$id" value="'+lists[i].id+'"/>'
+          + '<input type="hidden" name="ProjectMilestone[' + i + ']$sortnum" value="'+lists[i].sortnum+'"/>'
+          + '<div class="z-comp-input" name="ProjectMilestone[' + i + ']$name">'
+          + '<input type="text" value="'+lists[i].name+'">'
+          + '</div>'
+          + '</div>'
+          + '</div>'
+          + '</td>'
+          + '<td>'
+          + '<div class="form-flex">'
+          + '<div class="form-item" style="width: 100%;margin-right: 5px;">'
+          + '<div class="z-comp-input" name="ProjectMilestone[' + i + ']$planFinishTime">'
+          + '<input type="text" value="'+lists[i].planFinishTime+'">'
+          + '</div>'
+          + '</div>'
+          + '</div>'
+          + '</td>'
+          + '<td>'
+          + '<div class="form-flex">'
+          + '<div class="form-item" style="width: 100%;margin-right: 5px;">'
+          + '<div class="z-comp-input" name="ProjectMilestone[' + i + ']$actualFinishTime">'
+          + '<input type="text" value="'+lists[i].actualFinishTime+'">'
+          + '</div>'
+          + '</div>'
+          + '</div>'
+          + '</td>'
+          + '<td>'
+          + '<div id="editBtn_' + (i) + '" class="table-btn editBtn_' + (i) + '" data-index="' + (i) + '">'
+          + '<span>编辑</span>'
+          + '</div>'
+          + '<div id="delBtn_' + (i) + '" class="table-btn delBtn_' + (i) + '" data-index="' + (i) + '">'
+          + '<span>删除</span>'
+          + '</div>'
+          + '</td></tr>';
+    }
+    tbodyQjsq.innerHTML = html
+    for (let i = 0; i < lists.length; i++) {
+      z.ui.date("[name='ProjectMilestone[" + i + "]$planFinishTime']").init()
+      z.ui.date("[name='ProjectMilestone[" + i + "]$actualFinishTime']").init()
+      $("#delBtn_" + i).click(function () {
+        z.ui.confirm("compid").init({
+          content: "确定删除吗?",
+          onConfirm: function () {
+            var element = document.getElementById("project_milestone_" + i);
+            element.remove();
+            buildSeq();
+            lists.splice(i, 1)
+            updateView();
+          },
+          onCancel: function () {
+
+          }
+        })
+
+      })
+      $("#editBtn_" + i).click(function () {
+        const span = $(this).find("span");
+        const html = span.html();
+        if (html === '编辑') {
+          span.html('保存')
+          detailWrite(i);
+          $("#addData").attr('disabled', "true");
+          $("#project_milestone_" + i).removeClass("form-table-disable")
+          return;
+        }
+        if (html === '保存') {
+          span.html('编辑')
+          detailReadonly(i, false,"project_milestone_")
+          $("#addData").removeAttr('disabled')
+          $("#project_milestone_" + i).addClass("form-table-disable")
+          return;
+        }
+      })
+      detailReadonly(i,false,"project_milestone_")
+      $("#project_milestone_" + i).addClass("form-table-disable")
+      // if(viewState === 'v' || read=== '1'){
+      //     detailReadonly(i)
+      // }
+    }
+    // detailTotalInit()
+  }
+
+
+
+  function generateTableTrHtml(index) {
+    var trDom = document.createElement("tr");
+    trDom.style.backgroundColor = "#fff";
+    trDom.id = "project_milestone_" + index;
+    trDom.className = 'qjsjClass';
+    trDom.innerHTML = '<td name="project_milestone_seq">' + (index + 1) + '</td>'
+        + '<td>'
+        + '<div class="form-flex">'
+        + '<div class="form-item" style="width: 100%;margin-right: 5px;">'
+        + '<div class="z-comp-input" name="ProjectMilestone[' + index + ']$name">'
+        + '<input type="text" value="">'
+        + '</div>'
+        + '</div>'
+        + '</div>'
+        + '</td>'
+        + '<td>'
+        + '<div class="form-flex">'
+        + '<div class="form-item" style="width: 100%;margin-right: 5px;">'
+        + '<div class="z-comp-input" name="ProjectMilestone[' + index + ']$planFinishTime">'
+        + '<input type="text" value="">'
+        + '</div>'
+        + '</div>'
+        + '</div>'
+        + '</td>'
+        + '<td>'
+        + '<div class="form-flex">'
+        + '<div class="form-item" style="width: 100%;margin-right: 5px;">'
+        + '<div class="z-comp-input" name="ProjectMilestone[' + index + ']$actualFinishTime">'
+        + '<input type="text" value="">'
+        + '</div>'
+        + '</div>'
+        + '</div>'
+        + '</td>'
+        + '<td>'
+        + '<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>'
+        + '</td>';
+    return trDom;
+  }
 
   function initZrbm() {
     z.ui.ajax({
@@ -184,6 +421,30 @@
     })
   }
 
+  function detailReadonly(i, isBool = true,prefix) {
+    if (isBool) {
+      $("#delBtn_" + i).css("display", "none");
+      $("#editBtn_" + i).css("display", "none");
+    }
+    let detailElement = document.getElementById(prefix + i);
+    let detailInput = detailElement.getElementsByTagName("input");
+    for (let j = 0; j < detailInput.length; j++) {
+      detailInput[j].disabled = true;
+      detailInput[j].className += "z-readonly"
+    }
+  }
+
+
+  function detailWrite(i) {
+    //财务审核时可以核减修改金额
+    let detailElement = document.getElementById("project_milestone_" + i);
+    let detailInput = detailElement.getElementsByTagName("input");
+    for (let j = 0; j < detailInput.length; j++) {
+      detailInput[j].disabled = false;
+      $(detailInput[j]).removeClass("z-readonly")
+    }
+  }
+
   function initProjectType() {
     z.ui.ajax({
       type: "get",