瀏覽代碼

Merge remote-tracking branch 'origin/master'

user7 5 年之前
父節點
當前提交
681e64c460
共有 27 個文件被更改,包括 2353 次插入22 次删除
  1. 50 0
      src/main/java/com/jeeplus/modules/projectType/dao/ProjectTypeDao.java
  2. 99 0
      src/main/java/com/jeeplus/modules/projectType/entity/ProjectType.java
  3. 90 0
      src/main/java/com/jeeplus/modules/projectType/service/ProjectTypeService.java
  4. 180 0
      src/main/java/com/jeeplus/modules/projectType/web/ProjectTypeController.java
  5. 8 0
      src/main/java/com/jeeplus/modules/workclientinfo/dao/WorkClientLinkmanDao.java
  6. 10 0
      src/main/java/com/jeeplus/modules/workclientinfo/entity/WorkClientInfo.java
  7. 26 0
      src/main/java/com/jeeplus/modules/workclientinfo/entity/WorkClientJobTypeInfo.java
  8. 48 4
      src/main/java/com/jeeplus/modules/workclientinfo/service/WorkClientInfoService.java
  9. 28 0
      src/main/java/com/jeeplus/modules/workclientinfo/web/WorkClientInfoController.java
  10. 4 0
      src/main/java/com/jeeplus/modules/workcontent/common/WorkContentDetailFactory.java
  11. 37 0
      src/main/java/com/jeeplus/modules/workcontent/dao/WorkScheduleDao.java
  12. 176 0
      src/main/java/com/jeeplus/modules/workcontent/entity/WorkScheduleInfo.java
  13. 78 0
      src/main/java/com/jeeplus/modules/workcontent/service/WorkScheduleService.java
  14. 138 0
      src/main/java/com/jeeplus/modules/workcontent/web/WorkScheduleController.java
  15. 157 0
      src/main/resources/mappings/modules/projectType/ProjectTypeDao.xml
  16. 12 0
      src/main/resources/mappings/modules/workclientinfo/WorkClientLinkmanDao.xml
  17. 235 0
      src/main/resources/mappings/modules/workcontent/WorkScheduleDao.xml
  18. 62 0
      src/main/webapp/webpage/modules/project/type/projectTypeForm.jsp
  19. 62 0
      src/main/webapp/webpage/modules/project/type/projectTypeFormSubordinate.jsp
  20. 376 0
      src/main/webapp/webpage/modules/project/type/projectTypeList.jsp
  21. 62 0
      src/main/webapp/webpage/modules/project/type/projectTypeView.jsp
  22. 20 9
      src/main/webapp/webpage/modules/projectcontentinfo/workContentForm.jsp
  23. 11 0
      src/main/webapp/webpage/modules/projectcontentinfo/workContentView.jsp
  24. 9 9
      src/main/webapp/webpage/modules/sys/mainDictDetailForm.jsp
  25. 52 0
      src/main/webapp/webpage/modules/workclientinfo/workClientInfoForm.jsp
  26. 238 0
      src/main/webapp/webpage/modules/workcontent/workScheduleList.jsp
  27. 85 0
      src/main/webapp/webpage/modules/workcontent/workScheduleListView.jsp

+ 50 - 0
src/main/java/com/jeeplus/modules/projectType/dao/ProjectTypeDao.java

@@ -0,0 +1,50 @@
+/**
+ * Copyright &copy; 2013-2017 <a href="http://www.rhcncpa.com/">瑞华会计师事务所</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectType.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.projectType.entity.ProjectType;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportTreeData;
+import com.jeeplus.modules.sys.entity.Menu;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.workcontent.entity.WorkContentCompanyType;
+import com.jeeplus.modules.workcontent.entity.WorkContentType;
+
+import java.util.List;
+
+/**
+ * 项目类型DAO接口
+ * @author 徐滕
+ * @version 2020-07-03
+ */
+@MyBatisDao
+public interface ProjectTypeDao extends CrudDao<ProjectType> {
+	List<ProjectType> findProjectList(ProjectType projectType);
+
+	/**
+	 * 获取最新的一个父节点id
+	 * @return
+	 */
+	String getNewParentId();
+
+	/**
+	 * 获取最新的一个id
+	 * @return
+	 */
+	String getNewId();
+
+	/**
+	 * 获取最新的一个type_id
+	 * @return
+	 */
+	String getNewTypeId(String parentId);
+
+	int updateTypeId(ProjectType projectType);
+
+	List<ProjectReportTreeData> getProjectTypeList(ProjectType projectType);
+
+	Integer deleteProjectTypeById(String id);
+
+}

+ 99 - 0
src/main/java/com/jeeplus/modules/projectType/entity/ProjectType.java

@@ -0,0 +1,99 @@
+package com.jeeplus.modules.projectType.entity;
+
+import com.fasterxml.jackson.annotation.JsonBackReference;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.jeeplus.common.persistence.DataEntity;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 项目类型entity
+ * @author 徐滕
+ * @version 2020-07-03
+ */
+public class ProjectType extends DataEntity<ProjectType> {
+    private static final long serialVersionUID = 1L;
+    private String parentId;	// 父级ID
+    private String parentIds; // 所有父级编号
+    private String typeName; 	// 类型名称
+    private String parentName;  //父级名称
+    private String typeId;   //类型id
+
+
+    private String createId;//创建者id
+    private String view;
+
+    @JsonIgnore
+    public static String getRootId(){
+        return "1";
+    }
+
+    public ProjectType(){
+        super();
+    }
+
+    public ProjectType(String id){
+        super(id);
+    }
+
+    @JsonBackReference
+    @NotNull
+    public String getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(String parentId) {
+        this.parentId = parentId;
+    }
+
+    @Length(min=1, max=2000)
+    public String getParentIds() {
+        return parentIds;
+    }
+
+    public void setParentIds(String parentIds) {
+        this.parentIds = parentIds;
+    }
+
+    @Length(min=1, max=100)
+    public String getTypeName() {
+        return typeName;
+    }
+
+    public void setTypeName(String typeName) {
+        this.typeName = typeName;
+    }
+
+    public String getParentName() {
+        return parentName;
+    }
+
+    public void setParentName(String parentName) {
+        this.parentName = parentName;
+    }
+
+    public String getCreateId() {
+        return createId;
+    }
+
+    public void setCreateId(String createId) {
+        this.createId = createId;
+    }
+
+    public String getTypeId() {
+        return typeId;
+    }
+
+    public void setTypeId(String typeId) {
+        this.typeId = typeId;
+    }
+
+    public String getView() {
+        return view;
+    }
+
+    public void setView(String view) {
+        this.view = view;
+    }
+}

+ 90 - 0
src/main/java/com/jeeplus/modules/projectType/service/ProjectTypeService.java

@@ -0,0 +1,90 @@
+package com.jeeplus.modules.projectType.service;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.projectType.dao.ProjectTypeDao;
+import com.jeeplus.modules.projectType.entity.ProjectType;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportTreeData;
+import org.aspectj.apache.bcel.generic.RET;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 项目类型service
+ * @author 徐滕
+ * @version 2020-07-03
+ */
+@Service
+@Transactional(readOnly = true)
+public class ProjectTypeService extends CrudService<ProjectTypeDao, ProjectType> {
+    @Autowired
+    private ProjectTypeDao projectTypeDao;
+
+    public ProjectType getProjectType(String id) {
+        return projectTypeDao.get(id);
+    }
+
+    @Transactional(readOnly = false)
+    public List<ProjectType> findList(ProjectType projectType) {
+        List<ProjectType> list = super.findList(projectType);
+        return list;
+    }
+
+    @Transactional(readOnly = false)
+    public List<ProjectReportTreeData> getProjectTypeList(String typeName) {
+        ProjectType projectType = new ProjectType();
+        projectType.setTypeName(typeName);
+        List<ProjectReportTreeData> list = dao.getProjectTypeList(projectType);
+        return list;
+    }
+    /*@Transactional(readOnly = false)
+    public List<ProjectType> findProjectList(ProjectType projectType) {
+        List<ProjectType> list = dao.findProjectList(projectType);
+        return list;
+    }*/
+    public Page<ProjectType> findPage(Page<ProjectType> page, ProjectType projectType) {
+        return super.findPage(page, projectType);
+    }
+
+    @Transactional(readOnly = false)
+    public void save(ProjectType projectType) {
+        if(StringUtils.isBlank(projectType.getParentId())){
+            String newIdStr = dao.getNewParentId();
+            Integer newIdInt = null;
+            if(StringUtils.isNotBlank(newIdStr)){
+                newIdInt = Integer.valueOf(newIdStr)+1;
+            }
+            projectType.preInsert();
+            projectType.setId(newIdInt.toString());
+            projectType.setParentId("0");
+            projectType.setParentIds("0");
+            dao.insert(projectType);
+            dao.updateTypeId(projectType);
+        }else{
+            projectType.setParentIds("0,"+projectType.getParentId());
+            if(StringUtils.isNotBlank(projectType.getId())){
+                projectType.preUpdate();
+                dao.update(projectType);
+            }else{
+                projectType.preInsert();
+                dao.insert(projectType);
+            }
+
+        }
+    }
+
+    @Transactional(readOnly = false)
+    public Integer deleteProjectTypeById(ProjectType projectType) {
+        Integer result = dao.deleteProjectTypeById(projectType.getId());
+        return result;
+    }
+
+    @Transactional(readOnly = false)
+    public void deleteByLogic(ProjectType projectType) {
+        dao.deleteByLogic(projectType);
+    }
+}

+ 180 - 0
src/main/java/com/jeeplus/modules/projectType/web/ProjectTypeController.java

@@ -0,0 +1,180 @@
+package com.jeeplus.modules.projectType.web;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.projectType.entity.ProjectType;
+import com.jeeplus.modules.projectType.service.ProjectTypeService;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportTreeData;
+import com.jeeplus.modules.sys.entity.Menu;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.service.SystemService;
+import com.jeeplus.modules.sys.utils.DictUtils;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workcontent.entity.WorkContentType;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 项目类型Controller
+ * @author 徐滕
+ * @version 2020-07-03
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/projectType/projectType")
+public class ProjectTypeController extends BaseController {
+
+	@Autowired
+	private ProjectTypeService projectTypeService;
+
+	@ModelAttribute
+	public ProjectType get(@RequestParam(required=false) String id) {
+		ProjectType entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = projectTypeService.getProjectType(id);
+		}
+		if (entity == null){
+			entity = new ProjectType();
+		}
+		return entity;
+	}
+
+	/**
+	 * 工作内容类型列表页面
+	 */
+	@RequiresPermissions("project:projectType:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(ProjectType projectType, Model model) {
+		/*List<ProjectType> list = projectTypeService.findList(projectType);
+		model.addAttribute("list", list);*/
+		return "modules/project/type/projectTypeList";
+	}
+
+	/**
+	 * 根据项目id查询工作内容信息Tree
+	 * @param typeName
+	 * @return
+	 */
+	@RequestMapping("getProjectTypeTreeList")
+	@ResponseBody
+	public Map<String,List> getProjectTypeTreeList(String typeName){
+		Map<String,List> map = new HashMap<>();
+		//获取成果列表父节点
+		List<ProjectReportTreeData> parentReportDataList = projectTypeService.getProjectTypeList(typeName);
+		for (ProjectReportTreeData reportData : parentReportDataList) {
+			//添加登陆者id
+			reportData.setLoginUserId(UserUtils.getUser().getId());
+		}
+		map.put("data",parentReportDataList);
+		return map;
+	}
+
+	/**
+	 * 查看,增加,编辑工作内容类型表单页面
+	 */
+	@RequiresPermissions(value={"project:projectType:view","project:projectType:add","project:projectType:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(ProjectType projectType, Model model) {
+		if(StringUtils.isNotBlank(projectType.getView())){
+			if("view".equals(projectType.getView())){
+				return "modules/project/type/projectTypeView";
+			}else if("saveSubordinateInfo".equals(projectType.getView())){
+				projectType.setParentName(projectType.getTypeName());
+				projectType.setParentId(projectType.getId());
+				projectType.setTypeName("");
+				projectType.setRemarks("");
+				projectType.setId("");
+			}else if("updateSubordinateInfo".equals(projectType.getView())){
+
+			}
+		}
+		model.addAttribute("projectType", projectType);
+		if("updateSubordinateInfo".equals(projectType.getView()) || "saveSubordinateInfo".equals(projectType.getView())){
+			return "modules/project/type/projectTypeFormSubordinate";
+		}
+		return "modules/project/type/projectTypeForm";
+	}
+
+	/**
+	 * 保存工作内容类型
+	 */
+	@RequiresPermissions(value={"project:projectType:add","project:projectType:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String saveParentInfo(ProjectType projectType, Model model, RedirectAttributes redirectAttributes) throws Exception{
+
+		if (!beanValidator(model, projectType)){
+			return form(projectType, model);
+		}
+		if(!projectType.getIsNewRecord()){//编辑表单保存
+			ProjectType t = projectTypeService.get(projectType.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(projectType, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			projectTypeService.save(t);//保存
+		}else{//新增表单保存
+			projectTypeService.save(projectType);//保存
+		}
+		addMessage(redirectAttributes, "保存工作内容类型成功");
+		return "redirect:"+Global.getAdminPath()+"/projectType/projectType/?repage";
+	}
+
+	/**
+	 * 保存工作内容类型
+	 */
+	@RequestMapping(value = "saveSubordinateInfo")
+	@ResponseBody
+	public Map<String,Object> saveSubordinateInfo(ProjectType projectType, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		Map<String,Object> map = new HashMap<>();
+		if (!beanValidator(model, projectType)){
+			map.put("code",0);
+			map.put("msg","数据错误");
+			return map;
+		}
+		if(!projectType.getIsNewRecord()){//编辑表单保存
+			ProjectType t = projectTypeService.get(projectType.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(projectType, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			projectTypeService.save(t);//保存
+		}else{//新增表单保存
+			projectTypeService.save(projectType);//保存
+		}
+		addMessage(redirectAttributes, "保存工作内容类型成功");
+		map.put("code",1);
+		map.put("msg","操作成功");
+		return map;
+	}
+
+	/**
+	 * 删除工作内容类型
+	 */
+	@RequiresPermissions("project:projectType:remove")
+	@RequestMapping(value = "delete")
+	@ResponseBody
+	public Map<String,Object> delete(ProjectType projectType, RedirectAttributes redirectAttributes) {
+		Map<String,Object> map = new HashMap<>();
+		Integer result = projectTypeService.deleteProjectTypeById(projectType);
+		if (result ==1){
+			addMessage(redirectAttributes, "删除工作内容类型成功");
+			map.put("code",1);
+		}else{
+			addMessage(redirectAttributes, "删除工作内容类型失败");
+			map.put("code",0);
+		}
+		return map;
+	}
+}

+ 8 - 0
src/main/java/com/jeeplus/modules/workclientinfo/dao/WorkClientLinkmanDao.java

@@ -6,7 +6,9 @@ package com.jeeplus.modules.workclientinfo.dao;
 import com.jeeplus.common.persistence.CrudDao;
 import com.jeeplus.common.persistence.annotation.MyBatisDao;
 import com.jeeplus.modules.workbidproject.entity.WorkBidProject;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientJobTypeInfo;
 import com.jeeplus.modules.workclientinfo.entity.WorkClientLinkman;
+import com.jeeplus.modules.workcontent.entity.WorkContentInvestmentCost;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -41,4 +43,10 @@ public interface WorkClientLinkmanDao extends CrudDao<WorkClientLinkman> {
      * @return
      */
     List<WorkClientLinkman> queryLinkManByCompany(WorkClientLinkman workClientLinkman);
+
+    /**
+     * 客户信息和工作类型关系
+     * @param wlist
+     */
+    void jobTypeInsert(List<WorkClientJobTypeInfo> wlist);
 }

+ 10 - 0
src/main/java/com/jeeplus/modules/workclientinfo/entity/WorkClientInfo.java

@@ -64,6 +64,8 @@ public class WorkClientInfo extends DataEntity<WorkClientInfo> {
 	private String errInfo;
 	private String unitIntroduction;
 
+	private String jobTypeStr;
+
 	public String getUnitIntroduction() {
 		return unitIntroduction;
 	}
@@ -504,4 +506,12 @@ public class WorkClientInfo extends DataEntity<WorkClientInfo> {
 	public void setNumber(String number) {
 		this.number = number;
 	}
+
+	public String getJobTypeStr() {
+		return jobTypeStr;
+	}
+
+	public void setJobTypeStr(String jobTypeStr) {
+		this.jobTypeStr = jobTypeStr;
+	}
 }

+ 26 - 0
src/main/java/com/jeeplus/modules/workclientinfo/entity/WorkClientJobTypeInfo.java

@@ -0,0 +1,26 @@
+package com.jeeplus.modules.workclientinfo.entity;
+
+/**
+ * 客户和工作类型关系表
+ */
+public class WorkClientJobTypeInfo {
+
+    private String workClientId;
+    private String jobTypeId;
+
+    public String getWorkClientId() {
+        return workClientId;
+    }
+
+    public void setWorkClientId(String workClientId) {
+        this.workClientId = workClientId;
+    }
+
+    public String getJobTypeId() {
+        return jobTypeId;
+    }
+
+    public void setJobTypeId(String jobTypeId) {
+        this.jobTypeId = jobTypeId;
+    }
+}

+ 48 - 4
src/main/java/com/jeeplus/modules/workclientinfo/service/WorkClientInfoService.java

@@ -10,20 +10,22 @@ import com.jeeplus.common.oss.OSSClientUtil;
 import com.jeeplus.common.persistence.Page;
 import com.jeeplus.common.service.CrudService;
 import com.jeeplus.common.utils.MenuStatusEnum;
+import com.jeeplus.common.utils.SpringContextHolder;
 import com.jeeplus.common.utils.StringUtils;
 import com.jeeplus.modules.serialnum.service.SerialNumTplService;
 import com.jeeplus.modules.sys.dao.AreaDao;
+import com.jeeplus.modules.sys.dao.MainDictDetailDao;
 import com.jeeplus.modules.sys.entity.Area;
+import com.jeeplus.modules.sys.entity.MainDict;
+import com.jeeplus.modules.sys.entity.MainDictDetail;
 import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.MainDictService;
 import com.jeeplus.modules.sys.utils.UserUtils;
 import com.jeeplus.modules.workclientinfo.dao.WorkClientAttachmentDao;
 import com.jeeplus.modules.workclientinfo.dao.WorkClientBankDao;
 import com.jeeplus.modules.workclientinfo.dao.WorkClientInfoDao;
 import com.jeeplus.modules.workclientinfo.dao.WorkClientLinkmanDao;
-import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
-import com.jeeplus.modules.workclientinfo.entity.WorkClientBank;
-import com.jeeplus.modules.workclientinfo.entity.WorkClientInfo;
-import com.jeeplus.modules.workclientinfo.entity.WorkClientLinkman;
+import com.jeeplus.modules.workclientinfo.entity.*;
 import com.jeeplus.modules.workcontractinfo.dao.WorkContractInfoDao;
 import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
 import com.jeeplus.modules.workreimbursement.utils.VarStr;
@@ -42,6 +44,7 @@ import java.net.HttpURLConnection;
 import java.net.URL;
 import java.net.URLEncoder;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -70,6 +73,11 @@ public class WorkClientInfoService extends CrudService<WorkClientInfoDao, WorkCl
     @Autowired
     private AreaDao areaDao;
 
+    private static MainDictService mainDictService = SpringContextHolder.getBean(MainDictService.class);
+
+    private static MainDictDetailDao mainDictDetailDao = SpringContextHolder.getBean(MainDictDetailDao.class);
+
+
     public WorkClientInfo get(String id) {
 	    if(StringUtils.isBlank(id)){
 	        return new WorkClientInfo();
@@ -272,6 +280,18 @@ public class WorkClientInfoService extends CrudService<WorkClientInfoDao, WorkCl
 		super.save(workClientInfo);
         long t2 = System.currentTimeMillis();
         logger.info("保存客户主表耗时:{}",t2-t1);
+        //保存客户和工作类型关系信息
+        if(StringUtils.isNotBlank(workClientInfo.getJobTypeStr())){
+            List<String> list = Arrays.asList(workClientInfo.getJobTypeStr().split(","));
+            List<WorkClientJobTypeInfo> workClientJobTypeList = new ArrayList<>();
+            for (String jobType:list){
+                WorkClientJobTypeInfo workClientJobTypeInfo = new WorkClientJobTypeInfo();
+                workClientJobTypeInfo.setJobTypeId(jobType);
+                workClientJobTypeInfo.setWorkClientId(workClientInfo.getId());
+                workClientJobTypeList.add(workClientJobTypeInfo);
+            }
+            workClientLinkmanDao.jobTypeInsert(workClientJobTypeList);
+        }
 		//联系人信息
 		for (WorkClientLinkman workClientLinkman : workClientInfo.getWorkClientLinkmanList()){
 			if (workClientLinkman.getId() == null){
@@ -588,4 +608,28 @@ public class WorkClientInfoService extends CrudService<WorkClientInfoDao, WorkCl
         return workClientInfoDao.findByName(workClientInfo);
     }
 
+
+    public List<MainDictDetail> getJobType(){
+        String type = "job_type";
+        List<MainDictDetail> dictList=new ArrayList<>();
+        String comId=UserUtils.getSelectCompany().getId();
+        String branchId=UserUtils.getSelectBranchOffice();
+        MainDict mainDict = mainDictService.getIdByName(type);
+        try {
+            MainDictDetail mainDictDetail = new MainDictDetail();
+            if("1".equals(mainDict.getDictType())){
+                mainDictDetail.setBranchOffice(comId);
+            }else{
+                mainDictDetail.setBranchOffice(branchId);
+            }
+            mainDictDetail.setType(type);
+            dictList = mainDictDetailDao.findAchievementParentIdList(mainDictDetail);
+            return dictList;
+        } catch (Exception e) {
+            System.out.println("获取业务字典失败!");
+        }
+        return dictList;
+    }
+
+
 }

+ 28 - 0
src/main/java/com/jeeplus/modules/workclientinfo/web/WorkClientInfoController.java

@@ -18,6 +18,7 @@ import com.jeeplus.common.utils.TicketQueryUtils;
 import com.jeeplus.common.utils.excel.ExportExcel;
 import com.jeeplus.common.utils.excel.ImportExcel;
 import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.sys.entity.MainDictDetail;
 import com.jeeplus.modules.sys.utils.DictUtils;
 import com.jeeplus.modules.sys.utils.UserUtils;
 import com.jeeplus.modules.sysimportinfo.entity.SysImportInfo;
@@ -651,4 +652,31 @@ public class WorkClientInfoController extends BaseController {
        return "true";
 	}
 
+	/**
+	 * 查询工作类型
+	 * @return
+	 */
+	@RequestMapping("getJobType")
+	@ResponseBody
+	public AjaxJson getJobType(){
+		AjaxJson ajaxJson = new AjaxJson();
+		try {
+			List<MainDictDetail> getAchievementTypeList = workClientInfoService.getJobType();
+			List<Map<String, Object>> mapList = new ArrayList<>();
+			for (int i = 0; i < getAchievementTypeList.size(); i++) {
+				Map<String, Object> map = new HashMap<>();
+				map.put("name", getAchievementTypeList.get(i).getLabel());
+				map.put("value", getAchievementTypeList.get(i).getValue());
+				mapList.add(map);
+			}
+			ajaxJson.getBody().put("list", mapList);
+			ajaxJson.setMsg("获取数据成功");
+		} catch (Exception e) {
+			logger.error("获取数据异常!", e);
+			ajaxJson.setSuccess(false);
+			ajaxJson.setMsg("获取数据异常");
+		}
+		return ajaxJson;
+	}
+
 }

+ 4 - 0
src/main/java/com/jeeplus/modules/workcontent/common/WorkContentDetailFactory.java

@@ -46,6 +46,8 @@ public class WorkContentDetailFactory {
     private static WorkContentBranchAccountService workContentBranchAccountService=SpringContextHolder.getBean(WorkContentBranchAccountService.class);
     //输变电工程竣工结算
     private static WorkContentCompleteAccountService workContentCompleteAccountService=SpringContextHolder.getBean(WorkContentCompleteAccountService.class);
+    //施工单位工程款支付明细表
+    private static WorkScheduleService workScheduleService=SpringContextHolder.getBean(WorkScheduleService.class);
 
     public static WorkContentDetailBaseService getDetailService(String type){
         switch (type){
@@ -90,6 +92,8 @@ public class WorkContentDetailFactory {
                 return workContentBranchAccountService;
             case "510":
                 return workContentCompleteAccountService;
+            case "420":
+                return workScheduleService;
             default:
                 return null;
         }

+ 37 - 0
src/main/java/com/jeeplus/modules/workcontent/dao/WorkScheduleDao.java

@@ -0,0 +1,37 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workcontent.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workcontent.entity.WorkPreliminaryDesignEstimate;
+import com.jeeplus.modules.workcontent.entity.WorkScheduleInfo;
+
+import java.util.List;
+
+
+/**
+ * 设计概算编制审核调整DAO接口
+ * @author ssrh
+ * @version 2018-06-05
+ */
+@MyBatisDao
+public interface WorkScheduleDao extends CrudDao<WorkScheduleInfo> {
+
+
+    void batchInsert(List<WorkScheduleInfo> wlist);
+
+    /**
+     * 根据contentId删除数据
+     * @param contentId
+     * @return
+     */
+    int deleteByContentId(String contentId);
+
+    /**
+     * 查询数据表中的所有数据类型
+     * @return
+     */
+    List<String> getTableType(String contentId);
+}

+ 176 - 0
src/main/java/com/jeeplus/modules/workcontent/entity/WorkScheduleInfo.java

@@ -0,0 +1,176 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workcontent.entity;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import org.springframework.format.annotation.NumberFormat;
+
+/**
+ * 设计概算编制审核调整Entity
+ * @author ssrh
+ * @version 2018-06-05
+ */
+public class WorkScheduleInfo extends DataEntity<WorkScheduleInfo> {
+
+	private static final long serialVersionUID = 1L;
+	private String projectId;		// 项目id
+	private String contentId;		// 工作内容ID
+
+	@NumberFormat(style = NumberFormat.Style.CURRENCY)
+	private Double contractMoney;		// 签约合同价款
+    @NumberFormat(style = NumberFormat.Style.CURRENCY)
+	private Double beforeCumulativeCompletionMoney;		// 已累计完成价款
+    @NumberFormat(style = NumberFormat.Style.CURRENCY)
+	private Double beforeTotalPaymentMoney;		// 已累计支付价款
+	@NumberFormat(style = NumberFormat.Style.CURRENCY)
+	private Double beforePayRatio;		// 支付比例
+
+    @NumberFormat(style = NumberFormat.Style.CURRENCY)
+	private Double currentAccomplishMoney;		// 完成价款
+    @NumberFormat(style = NumberFormat.Style.CURRENCY)
+	private Double currentAppointPayMoney;		// 按约定比例应支付价款
+	@NumberFormat(style = NumberFormat.Style.CURRENCY)
+	private Double currentShouldDeductPrepayMoney;		// 应扣预付款
+	@NumberFormat(style = NumberFormat.Style.CURRENCY)
+	private Double currentShouldDeductMoney;		// 其他应扣款
+	@NumberFormat(style = NumberFormat.Style.CURRENCY)
+	private Double currentPracticalPayMoney;		// 实际应支付
+
+	@NumberFormat(style = NumberFormat.Style.CURRENCY)
+	private Double currentCumulativeCompletionMoney;		// 已累计完成价款
+	@NumberFormat(style = NumberFormat.Style.CURRENCY)
+	private Double currentTotalPaymentMoney;		// 已累计支付价款
+	private String currentPayRatio;		// 支付比例
+	private String type;          //数据状态
+
+	public WorkScheduleInfo() {
+		super();
+	}
+
+	public WorkScheduleInfo(String id){
+		super(id);
+	}
+
+	public String getProjectId() {
+		return projectId;
+	}
+
+	public void setProjectId(String projectId) {
+		this.projectId = projectId;
+	}
+	
+	public String getContentId() {
+		return contentId;
+	}
+
+	public void setContentId(String contentId) {
+		this.contentId = contentId;
+	}
+
+	public Double getContractMoney() {
+		return contractMoney;
+	}
+
+	public void setContractMoney(Double contractMoney) {
+		this.contractMoney = contractMoney;
+	}
+
+	public Double getBeforeCumulativeCompletionMoney() {
+		return beforeCumulativeCompletionMoney;
+	}
+
+	public void setBeforeCumulativeCompletionMoney(Double beforeCumulativeCompletionMoney) {
+		this.beforeCumulativeCompletionMoney = beforeCumulativeCompletionMoney;
+	}
+
+	public Double getBeforeTotalPaymentMoney() {
+		return beforeTotalPaymentMoney;
+	}
+
+	public void setBeforeTotalPaymentMoney(Double beforeTotalPaymentMoney) {
+		this.beforeTotalPaymentMoney = beforeTotalPaymentMoney;
+	}
+
+	public Double getBeforePayRatio() {
+		return beforePayRatio;
+	}
+
+	public void setBeforePayRatio(Double beforePayRatio) {
+		this.beforePayRatio = beforePayRatio;
+	}
+
+	public Double getCurrentAccomplishMoney() {
+		return currentAccomplishMoney;
+	}
+
+	public void setCurrentAccomplishMoney(Double currentAccomplishMoney) {
+		this.currentAccomplishMoney = currentAccomplishMoney;
+	}
+
+	public Double getCurrentAppointPayMoney() {
+		return currentAppointPayMoney;
+	}
+
+	public void setCurrentAppointPayMoney(Double currentAppointPayMoney) {
+		this.currentAppointPayMoney = currentAppointPayMoney;
+	}
+
+	public Double getCurrentShouldDeductMoney() {
+		return currentShouldDeductMoney;
+	}
+
+	public void setCurrentShouldDeductMoney(Double currentShouldDeductMoney) {
+		this.currentShouldDeductMoney = currentShouldDeductMoney;
+	}
+
+	public Double getCurrentPracticalPayMoney() {
+		return currentPracticalPayMoney;
+	}
+
+	public void setCurrentPracticalPayMoney(Double currentPracticalPayMoney) {
+		this.currentPracticalPayMoney = currentPracticalPayMoney;
+	}
+
+	public Double getCurrentCumulativeCompletionMoney() {
+		return currentCumulativeCompletionMoney;
+	}
+
+	public void setCurrentCumulativeCompletionMoney(Double currentCumulativeCompletionMoney) {
+		this.currentCumulativeCompletionMoney = currentCumulativeCompletionMoney;
+	}
+
+	public Double getCurrentTotalPaymentMoney() {
+		return currentTotalPaymentMoney;
+	}
+
+	public void setCurrentTotalPaymentMoney(Double currentTotalPaymentMoney) {
+		this.currentTotalPaymentMoney = currentTotalPaymentMoney;
+	}
+
+	public String getCurrentPayRatio() {
+		return currentPayRatio;
+	}
+
+	public void setCurrentPayRatio(String currentPayRatio) {
+		this.currentPayRatio = currentPayRatio;
+	}
+
+	public Double getCurrentShouldDeductPrepayMoney() {
+		return currentShouldDeductPrepayMoney;
+	}
+
+	public void setCurrentShouldDeductPrepayMoney(Double currentShouldDeductPrepayMoney) {
+		this.currentShouldDeductPrepayMoney = currentShouldDeductPrepayMoney;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+}

+ 78 - 0
src/main/java/com/jeeplus/modules/workcontent/service/WorkScheduleService.java

@@ -0,0 +1,78 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workcontent.service;
+
+import com.alibaba.fastjson.JSON;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.workcontent.dao.WorkPreliminaryDesignEstimateDao;
+import com.jeeplus.modules.workcontent.dao.WorkScheduleDao;
+import com.jeeplus.modules.workcontent.entity.WorkPreliminaryDesignEstimate;
+import com.jeeplus.modules.workcontent.entity.WorkScheduleInfo;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 设计概算编制审核调整Service
+ * @author ssrh
+ * @version 2018-06-05
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkScheduleService extends CrudService<WorkScheduleDao, WorkScheduleInfo> implements WorkContentDetailBaseService{
+
+	public WorkScheduleInfo get(String id) {
+		return super.get(id);
+	}
+	
+	public List<WorkScheduleInfo> findList(WorkScheduleInfo workPreliminaryDesignEstimate) {
+		return super.findList(workPreliminaryDesignEstimate);
+	}
+	
+	public Page<WorkScheduleInfo> findPage(Page<WorkScheduleInfo> page, WorkScheduleInfo workPreliminaryDesignEstimate) {
+		return super.findPage(page, workPreliminaryDesignEstimate);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(WorkScheduleInfo workPreliminaryDesignEstimate) {
+		super.save(workPreliminaryDesignEstimate);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(WorkScheduleInfo workPreliminaryDesignEstimate) {
+		super.delete(workPreliminaryDesignEstimate);
+	}
+	
+    @Override
+    @Transactional(readOnly = false)
+    public void saveDetails(String detailStr, String projectId, String contentId) {
+	    if(StringUtils.isBlank(detailStr)){
+	        return;
+        }
+		/*detailStr = detailStr.replace("][",",");*/
+        List<WorkScheduleInfo> preliminaryDesignEstimateList = JSON.parseArray(detailStr, WorkScheduleInfo.class);
+        for (WorkScheduleInfo preliminaryDesignEstimate : preliminaryDesignEstimateList) {
+            if(WorkPreliminaryDesignEstimate.DEL_FLAG_DELETE.equals(preliminaryDesignEstimate.getDelFlag())){
+                dao.delete(preliminaryDesignEstimate);
+                continue;
+            }
+			preliminaryDesignEstimate.setContentId(contentId);
+			preliminaryDesignEstimate.setProjectId(projectId);
+            this.save(preliminaryDesignEstimate);
+        }
+    }
+
+	/**
+	 * 查询数据表中的所有数据类型
+	 * @return
+	 */
+    public List<String> getTableType(String contentId){
+		List<String> tableType = dao.getTableType(contentId);
+		return tableType;
+	}
+
+}

+ 138 - 0
src/main/java/com/jeeplus/modules/workcontent/web/WorkScheduleController.java

@@ -0,0 +1,138 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workcontent.web;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.sys.entity.MainDictDetail;
+import com.jeeplus.modules.sys.utils.DictUtils;
+import com.jeeplus.modules.workcontent.entity.WorkPreliminaryDesignEstimate;
+import com.jeeplus.modules.workcontent.entity.WorkScheduleInfo;
+import com.jeeplus.modules.workcontent.service.WorkPreliminaryDesignEstimateService;
+import com.jeeplus.modules.workcontent.service.WorkScheduleService;
+import com.jeeplus.modules.workreceiptsregister.entity.ResponseEntity;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 工程费用Controller
+ * @author ssrh
+ * @version 2018-06-05
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workSchedule/workSchedule")
+public class WorkScheduleController extends BaseController {
+
+	@Autowired
+	private WorkScheduleService workScheduleService;
+	
+	@ModelAttribute
+	public WorkScheduleInfo get(@RequestParam(required=false) String id) {
+		WorkScheduleInfo entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workScheduleService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkScheduleInfo();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 工程费用列表页面
+	 */
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkScheduleInfo workScheduleInfo,String view, HttpServletRequest request, Model model) {
+		String sign = request.getParameter("sign");
+		List<String> signList = new ArrayList();
+		if (StringUtils.isNotBlank(sign)){
+			signList = Arrays.asList(sign.split(","));
+		}
+		List<WorkScheduleInfo> list = new ArrayList<>();
+        if(StringUtils.isNotBlank(workScheduleInfo.getContentId())){
+            list = workScheduleService.findList(workScheduleInfo);
+        }
+        model.addAttribute("signList", signList);
+        model.addAttribute("workScheduleList", list);
+        String viewPath = "modules/workcontent/workScheduleList";
+        if("view".equals(view)){
+            viewPath+="View";
+        }
+		List<MainDictDetail> unitList=DictUtils.getMainDictList("unit_type");
+		model.addAttribute("unitList", unitList);
+		List<MainDictDetail> nodeList=DictUtils.getMainDictList("node_type");
+		model.addAttribute("nodeList", nodeList);
+		List<MainDictDetail> costList=DictUtils.getMainDictList("cost_type");
+		model.addAttribute("costList", costList);
+        return viewPath;
+	}
+
+
+	/**
+	 * 查询数据表中的所有数据类型
+	 * @return
+	 */
+	@ResponseBody
+	@RequestMapping(value = "getTableType", method=RequestMethod.POST)
+	public List<String> getTableType(String contentId){
+		List<String> tableType = workScheduleService.getTableType(contentId);
+		return tableType;
+	}
+
+	/**
+	 * 导入Excel数据
+	 */
+	@ResponseBody
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public Object importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+        ResponseEntity<WorkScheduleInfo> responseEntity = new ResponseEntity<>();
+		try {
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+            List<WorkScheduleInfo> list = ei.getDataList(WorkScheduleInfo.class);
+			List<WorkScheduleInfo> listAll = new ArrayList<>();
+			for (WorkScheduleInfo investmentCost : list) {
+				if(null != investmentCost.getContractMoney() && null != investmentCost.getBeforeCumulativeCompletionMoney() && null != investmentCost.getBeforeTotalPaymentMoney() && null != investmentCost.getBeforePayRatio()){
+					listAll.add(investmentCost);
+				}
+			}
+            responseEntity.setData(listAll);
+		} catch (Exception e) {
+		    logger.error("导入工程进度款审核表失败!",e);
+		    responseEntity.setCode(400);
+		    responseEntity.setMessage("导入工程进度款审核表失败!"+e.getMessage());
+		}
+		return responseEntity;
+    }
+	
+	/**
+	 * 下载导入设计概算编制审核调整数据模板
+	 */
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "工程进度款审核导入模板.xlsx";
+    		List<WorkPreliminaryDesignEstimate> list = Lists.newArrayList();
+    		new ExportExcel("工程进度款审核调整数据", WorkPreliminaryDesignEstimate.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workSchedule/workSchedule/?repage";
+    }
+	
+}

+ 157 - 0
src/main/resources/mappings/modules/projectType/ProjectTypeDao.xml

@@ -0,0 +1,157 @@
+<?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.jeeplus.modules.projectType.dao.ProjectTypeDao">
+
+	<sql id="projectTypeColumns">
+		a.id,
+		a.parent_id AS "parentId",
+		a.parent_ids as parentIds,
+		a.type_name as "typeName",
+		a.type_id as "typeId",
+		a.remarks,
+		a.create_by AS "createBy.id",
+		a.create_date,
+		a.update_by AS "updateBy.id",
+		a.update_date,
+		a.del_flag
+	</sql>
+
+
+	<select id="get" resultType="com.jeeplus.modules.projectType.entity.ProjectType" >
+		SELECT
+		<include refid="projectTypeColumns"/>
+		,p.type_name as "parentName"
+		FROM project_type a
+		left join project_type p on p.id = a.parent_id
+		WHERE a.id = #{id}
+	</select>
+
+	<select id="findList" resultType="com.jeeplus.modules.projectType.entity.ProjectType" >
+		SELECT DISTINCT
+		<include refid="projectTypeColumns"/>
+		,p.type_name as "parentName"
+		FROM project_type a
+		left join project_type p on p.id = a.parent_id
+		<where>
+			a.del_flag = '0'
+			<if test="typeName != null and typeName != ''">
+				AND (a.type_name LIKE concat('%',#{typeName},'%') OR a.parent_id ='0')
+			</if>
+			<if test="parentId !=null and parentId !=''">
+				AND a.parent_id = #{parentId}
+			</if>
+		</where>
+		<choose>
+			<otherwise>
+				ORDER BY a.parent_id, a.type_id
+			</otherwise>
+		</choose>
+	</select>
+
+	<select id="getProjectTypeList" resultType="com.jeeplus.modules.projectcontentinfo.entity.ProjectReportTreeData" >
+		select a.id as "id",
+		a.create_date as "createDate",a.create_by as "createId",
+		 a.type_name as "name",a.parent_id as "pid"
+		from project_type a
+		<where>
+			a.del_flag = 0
+			<if test="typeName != null and typeName != ''">
+				AND (a.type_name LIKE concat('%',#{typeName},'%') OR a.parent_id ='0')
+			</if>
+		</where>
+		order by a.update_date desc
+	</select>
+
+	<select id="findProjectList" resultType="com.jeeplus.modules.projectType.entity.ProjectType" >
+		SELECT DISTINCT
+		<include refid="projectTypeColumns"/>
+		FROM project_type a
+		<where>
+			AND a.parent_id = #{parentId}
+		</where>
+		<choose>
+			<otherwise>
+				ORDER BY a.parent_id, a.type_id
+			</otherwise>
+		</choose>
+	</select>
+
+	<select id="getNewParentId" resultType="java.lang.String" >
+		select id from project_type where parent_id = '0' order by create_date desc limit 0,1
+	</select>
+
+	<select id="getNewId" resultType="java.lang.String" >
+		select id from project_type order by id desc limit 0,1
+	</select>
+
+	<select id="getNewTypeId" resultType="java.lang.String" >
+		select type_id as typeId from project_type where parent_id = #{parentId} order by create_date desc limit 0,1
+	</select>
+
+	<update id="updateTypeId">
+		update project_type set type_id = #{id} where id = #{id}
+	</update>
+
+	<insert id="insert">
+		INSERT INTO project_type(
+			id,
+			parent_id,
+			parent_ids,
+			type_name,
+			type_id,
+			create_by,
+			create_date,
+			update_by,
+			update_date,
+			remarks,
+			del_flag
+		) VALUES (
+			#{id},
+			#{parentId},
+			#{parentIds},
+			#{typeName},
+			#{typeId},
+			#{createBy.id},
+			#{createDate},
+			#{updateBy.id},
+			#{updateDate},
+			#{remarks},
+			#{delFlag}
+		)
+	</insert>
+
+	<update id="update">
+		UPDATE project_type SET
+			parent_id = #{parentId},
+			parent_ids = #{parentIds},
+			type_name = #{typeName},
+			update_by = #{updateBy.id},
+			update_date = #{updateDate},
+			remarks = #{remarks}
+		WHERE id = #{id}
+	</update>
+
+
+	<!--物理删除-->
+	<update id="delete">
+		DELETE FROM project_type
+		WHERE id = #{id}
+	</update>
+
+	<delete id="deleteProjectTypeById">
+		DELETE FROM project_type
+		WHERE id = #{id}
+	</delete>
+
+	<!--逻辑删除-->
+	<update id="deleteByLogic">
+		UPDATE project_type SET
+			del_flag = #{DEL_FLAG_DELETE}
+		WHERE id = #{id}
+	</update>
+
+	<!-- 根据实体名称和字段名称和字段值获取唯一记录 -->
+	<select id="findUniqueByProperty" resultType="com.jeeplus.modules.projectType.entity.ProjectType" statementType="STATEMENT">
+		select * FROM project_type  where ${propertyName} = '${value}'
+	</select>
+</mapper>

+ 12 - 0
src/main/resources/mappings/modules/workclientinfo/WorkClientLinkmanDao.xml

@@ -310,5 +310,17 @@
 		</if>
 
 	</select>
+	<insert id="jobTypeInsert" parameterType="java.util.List">
+		INSERT INTO work_client_job_type_info(
+		work_client_id,
+		job_type_id
+		) VALUES
+		<foreach collection="list" item="item" separator=",">
+			( #{item.workClientId},
+			#{item.jobTypeId}
+			)
+		</foreach>
+	</insert>
+
 
 </mapper>

+ 235 - 0
src/main/resources/mappings/modules/workcontent/WorkScheduleDao.xml

@@ -0,0 +1,235 @@
+<?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.jeeplus.modules.workcontent.dao.WorkScheduleDao">
+    
+	<sql id="workPreliminaryDesignEstimateColumns">
+		a.id AS "id",
+		a.create_by AS "createBy.id",
+		a.create_date AS "createDate",
+		a.update_by AS "updateBy.id",
+		a.update_date AS "updateDate",
+		a.remarks AS "remarks",
+		a.del_flag AS "delFlag",
+		a.project_id AS "projectId",
+		a.content_id AS "contentId",
+		a.contract_money as "contractMoney",
+		a.before_cumulative_completion_money as "beforeCumulativeCompletionMoney",
+		a.before_total_payment_money as "beforeTotalPaymentMoney",
+		a.before_pay_ratio as "beforePayRatio",
+		a.current_accomplish_money as "currentAccomplishMoney",
+		a.current_appoint_pay_money as "currentAppointPayMoney",
+		a.current_should_deduct_prepay_money as "currentShouldDeductPrepayMoney",
+		a.current_should_deduct_money as "currentShouldDeductMoney",
+		a.current_practical_pay_money as "currentPracticalPayMoney",
+		a.current_cumulative_completion_money as "currentCumulativeCompletionMoney",
+		a.current_total_payment_money as "currentTotalPaymentMoney",
+		a.current_pay_ratio as "currentPayRatio",
+		a.type as "type"
+	</sql>
+	
+
+	<select id="get" resultType="com.jeeplus.modules.workcontent.entity.WorkScheduleInfo" >
+		SELECT 
+			<include refid="workPreliminaryDesignEstimateColumns"/>
+		FROM work_schedule_info a
+		WHERE a.id = #{id}
+	</select>
+	
+	<select id="findList" resultType="com.jeeplus.modules.workcontent.entity.WorkScheduleInfo" >
+		SELECT 
+			<include refid="workPreliminaryDesignEstimateColumns"/>
+		FROM work_schedule_info a
+		<where>
+            <if test="projectId!=null and projectId !=''">
+                AND a.project_id = #{projectId}
+            </if>
+            <if test="contentId!=null and contentId !=''">
+                AND a.content_id = #{contentId}
+            </if>
+			AND a.del_flag = #{DEL_FLAG_NORMAL}
+		</where>
+		<choose>
+			<when test="page !=null and page.orderBy != null and page.orderBy != ''">
+				ORDER BY ${page.orderBy}
+			</when>
+			<otherwise>
+				ORDER BY a.update_date DESC
+			</otherwise>
+		</choose>
+	</select>
+	
+	<select id="findAllList" resultType="com.jeeplus.modules.workcontent.entity.WorkScheduleInfo" >
+		SELECT 
+			<include refid="workPreliminaryDesignEstimateColumns"/>
+		FROM work_schedule_info a
+		<where>
+			a.del_flag = #{DEL_FLAG_NORMAL}
+		</where>
+		<choose>
+			<when test="page !=null and page.orderBy != null and page.orderBy != ''">
+				ORDER BY ${page.orderBy}
+			</when>
+			<otherwise>
+				ORDER BY a.update_date DESC
+			</otherwise>
+		</choose>
+	</select>
+	
+	<insert id="insert">
+		INSERT INTO work_schedule_info(
+			id,
+			create_by,
+			create_date,
+			update_by,
+			update_date,
+			remarks,
+			del_flag,
+			project_id,
+			content_id,
+			contract_money,
+			before_cumulative_completion_money,
+			before_total_payment_money,
+			before_pay_ratio,
+			current_accomplish_money,
+			current_appoint_pay_money,
+			current_should_deduct_prepay_money,
+			current_should_deduct_money,
+			current_practical_pay_money,
+			current_cumulative_completion_money,
+			current_total_payment_money,
+			current_pay_ratio,
+			type
+		) VALUES (
+			#{id},
+			#{createBy.id},
+			#{createDate},
+			#{updateBy.id},
+			#{updateDate},
+			#{remarks},
+			#{delFlag},
+			#{projectId},
+			#{contentId},
+            #{contractMoney},
+			#{beforeCumulativeCompletionMoney},
+			#{beforeTotalPaymentMoney},
+			#{beforePayRatio},
+			#{currentAccomplishMoney},
+			#{currentAppointPayMoney},
+			#{currentShouldDeductPrepayMoney},
+			#{currentShouldDeductMoney},
+			#{currentPracticalPayMoney},
+			#{currentCumulativeCompletionMoney},
+			#{currentTotalPaymentMoney},
+			#{currentPayRatio},
+            #{type}
+		)
+	</insert>
+
+    <insert id="batchInsert" parameterType="java.util.List">
+		INSERT INTO work_schedule_info(
+			id,
+			create_by,
+			create_date,
+			update_by,
+			update_date,
+			remarks,
+			del_flag,
+			project_id,
+			content_id,
+			contract_money,
+			before_cumulative_completion_money,
+			before_total_payment_money,
+			before_pay_ratio,
+			current_accomplish_money,
+			current_appoint_pay_money,
+			current_should_deduct_prepay_money,
+			current_should_deduct_money,
+			current_practical_pay_money,
+			current_cumulative_completion_money,
+			current_total_payment_money,
+			current_pay_ratio,
+			type
+		) VALUES
+		<foreach collection="list" item="item" separator=",">
+            ( #{item.id},
+            #{item.createBy.id},
+            #{item.createDate},
+            #{item.updateBy.id},
+            #{item.updateDate},
+            #{item.remarks},
+            #{item.delFlag},
+            #{item.projectId},
+            #{item.contentId},
+            #{item.contractMoney},
+			#{item.beforeCumulativeCompletionMoney},
+			#{item.beforeTotalPaymentMoney},
+			#{item.beforePayRatio},
+			#{item.currentAccomplishMoney},
+			#{item.currentAppointPayMoney},
+			#{item.currentShouldDeductPrepayMoney},
+			#{item.currentShouldDeductMoney},
+			#{item.currentPracticalPayMoney},
+			#{item.currentCumulativeCompletionMoney},
+			#{item.currentTotalPaymentMoney},
+			#{item.currentPayRatio},
+			#{item.type}
+			)
+        </foreach>
+	</insert>
+	
+	<update id="update">
+		UPDATE work_schedule_info SET
+			update_by = #{updateBy.id},
+			update_date = #{updateDate},
+			remarks = #{remarks},
+			del_flag = #{delFlag},
+			project_id = #{projectId},
+			content_id = #{contentId},
+			contract_money = #{contractMoney},
+			before_cumulative_completion_money = #{beforeCumulativeCompletionMoney},
+			before_total_payment_money = #{beforeTotalPaymentMoney},
+			before_pay_ratio = #{beforePayRatio},
+			current_accomplish_money = #{currentAccomplishMoney},
+			current_appoint_pay_money = #{currentAppointPayMoney},
+			current_should_deduct_prepay_money = #{currentShouldDeductPrepayMoney},
+			current_should_deduct_money = #{currentShouldDeductMoney},
+			current_practical_pay_money = #{currentPracticalPayMoney},
+			current_cumulative_completion_money = #{currentCumulativeCompletionMoney},
+			current_total_payment_money = #{currentTotalPaymentMoney},
+			current_pay_ratio = #{currentPayRatio},
+			type = #{type}
+		WHERE id = #{id}
+	</update>
+	
+	
+	<!--物理删除-->
+	<update id="delete">
+		DELETE FROM work_schedule_info
+		WHERE id = #{id}
+	</update>
+	
+	<!--逻辑删除-->
+	<update id="deleteByLogic">
+		UPDATE work_schedule_info SET
+			del_flag = #{DEL_FLAG_DELETE}
+		WHERE id = #{id}
+	</update>
+
+	<delete id="deleteByContentId">
+		DELETE FROM work_schedule_info
+		WHERE content_id = #{id}
+	</delete>
+	
+	
+	<!-- 根据实体名称和字段名称和字段值获取唯一记录 -->
+	<select id="findUniqueByProperty" resultType="com.jeeplus.modules.workcontent.entity.WorkScheduleInfo" statementType="STATEMENT">
+		select * FROM work_schedule_info  where ${propertyName} = '${value}'
+	</select>
+
+	<select id="getTableType" resultType="java.lang.String">
+		select a.type from(
+		select DISTINCT(wpde.type) as type from work_schedule_info wpde where wpde.del_flag = 0 and wpde.content_id = #{contentId}
+		) a
+	</select>
+
+</mapper>

+ 62 - 0
src/main/webapp/webpage/modules/project/type/projectTypeForm.jsp

@@ -0,0 +1,62 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<html>
+<head>
+	<title>工作内容类型管理</title>
+	<meta name="decorator" content="default"/>
+	<script type="text/javascript">
+		var validateForm;
+		function doSubmit(){//回调函数,在编辑和保存动作时,供openDialog调用提交表单。
+			if(validateForm.form()){
+				$("#inputForm").submit();
+				return true;
+			}
+
+			return false;
+		}
+		$(document).ready(function() {
+			validateForm = $("#inputForm").validate({
+				submitHandler: function(form){
+					loading('正在提交,请稍等...');
+					form.submit();
+				},
+				errorContainer: "#messageBox",
+				errorPlacement: function(error, element) {
+					$("#messageBox").text("输入有误,请先更正。");
+					if (element.is(":checkbox")||element.is(":radio")||element.parent().is(".input-append")){
+						error.appendTo(element.parent().parent());
+					} else {
+						error.insertAfter(element);
+					}
+				}
+			});
+		});
+	</script>
+</head>
+<body>
+<div class="single-form">
+	<div class="container view-form">
+		<form:form id="inputForm" modelAttribute="projectType" action="${ctx}/projectType/projectType/save" method="post" class="form-horizontal">
+			<form:hidden path="id"/>
+			<input type="hidden" name="parentId" value="${projectType.parentId}">
+			<sys:message content="${message}"/>
+			<div class="form-group layui-row first lw9">
+				<div class="form-group-label"><h2>基础信息</h2></div>
+				<div class="layui-item layui-col-sm12">
+					<label class="layui-form-label">父级节点:</label>
+					<div class="layui-input-block">
+						<form:input path="parentName" htmlEscape="false" readonly="true" class="form-control layui-input"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm12">
+					<label class="layui-form-label">项目类型名称:</label>
+					<div class="layui-input-block">
+						<form:input path="typeName" htmlEscape="false" class="form-control layui-input"/>
+					</div>
+				</div>
+			</div>
+		</form:form>
+	</div>
+</div>
+</body>
+</html>

+ 62 - 0
src/main/webapp/webpage/modules/project/type/projectTypeFormSubordinate.jsp

@@ -0,0 +1,62 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<html>
+<head>
+	<title>工作内容类型管理</title>
+	<meta name="decorator" content="default"/>
+	<script type="text/javascript">
+		var validateForm;
+		function doSubmit(){//回调函数,在编辑和保存动作时,供openDialog调用提交表单。
+			if(validateForm.form()){
+				$("#inputForm").submit();
+				return true;
+			}
+
+			return false;
+		}
+		$(document).ready(function() {
+			validateForm = $("#inputForm").validate({
+				submitHandler: function(form){
+					loading('正在提交,请稍等...');
+					form.submit();
+				},
+				errorContainer: "#messageBox",
+				errorPlacement: function(error, element) {
+					$("#messageBox").text("输入有误,请先更正。");
+					if (element.is(":checkbox")||element.is(":radio")||element.parent().is(".input-append")){
+						error.appendTo(element.parent().parent());
+					} else {
+						error.insertAfter(element);
+					}
+				}
+			});
+		});
+	</script>
+</head>
+<body>
+<div class="single-form">
+	<div class="container view-form">
+		<form:form id="inputForm" modelAttribute="projectType" action="${ctx}/projectType/projectType/saveSubordinateInfo" method="post" class="form-horizontal">
+			<form:hidden path="id"/>
+			<input type="hidden" name="parentId" value="${projectType.parentId}">
+			<sys:message content="${message}"/>
+			<div class="form-group layui-row first lw9">
+				<div class="form-group-label"><h2>基础信息</h2></div>
+				<div class="layui-item layui-col-sm12">
+					<label class="layui-form-label">父级节点:</label>
+					<div class="layui-input-block">
+						<form:input path="parentName" htmlEscape="false" readonly="true" class="form-control layui-input"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm12">
+					<label class="layui-form-label">项目类型名称:</label>
+					<div class="layui-input-block">
+						<form:input path="typeName" htmlEscape="false" class="form-control layui-input"/>
+					</div>
+				</div>
+			</div>
+		</form:form>
+	</div>
+</div>
+</body>
+</html>

+ 376 - 0
src/main/webapp/webpage/modules/project/type/projectTypeList.jsp

@@ -0,0 +1,376 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<html>
+<head>
+	<title>工作内容类型管理</title>
+	<meta name="decorator" content="default"/>
+	<link href="${ctxStatic}/layer-v2.3/layui/tableTree/treetable.css" rel="stylesheet" />
+	<%@include file="/webpage/include/treetable.jsp" %>
+	<script type="text/javascript">
+		$(document).ready(function() {
+			$("#treeTable").treeTable({expandLevel : 5},{ expandable: true });
+		});
+	</script>
+	<style>
+		body{
+			background-color:transparent;
+			filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#26FFFFFF, endColorstr=#26FFFFFF);
+			color:#ffffff;
+			background-color:rgba(255,255,255,0);
+			height:100%;
+		}
+	</style>
+</head>
+<body>
+<div class="wrapper wrapper-content">
+	<sys:message content="${message}"/>
+	<div class="layui-row">
+		<div class="full-width fl">
+			<div class="contentShadow layui-row" id="queryDiv">
+				<form:form id="searchForm" modelAttribute="projectType" action="${ctx}/projectType/projectType/" method="post" class="form-inline">
+					<input id="pageNo" name="pageNo" type="hidden" value="${page.pageNo}"/>
+					<input id="pageSize" name="pageSize" type="hidden" value="${page.pageSize}"/>
+					<table:sortColumn id="orderBy" name="orderBy" value="${page.orderBy}" callback="sortOrRefresh();"/><!-- 支持排序 -->
+
+					<div class="commonQuery lw9">
+						<div class="layui-item query athird">
+							<label class="layui-form-label">项目类型名称:</label>
+							<div class="layui-input-block">
+								<form:input path="typeName" htmlEscape="false" class=" form-control layui-input"></form:input>
+							</div>
+						</div>
+						<div class="layui-item athird">
+							<div class="input-group">
+								<button id="searchReset" style="margin-right: 0px;" class="fixed-btn searchReset fr" onclick="resetSearch()">重置</button>
+								<button id="searchQuery" class="fixed-btn searchQuery fr" onclick="search()">查询</button>
+							</div>
+						</div>
+						<div style="    clear:both;"></div>
+					</div>
+
+				</form:form>
+			</div>
+		</div>
+		<div class="full-width fl">
+			<div class="contentShadow layui-form contentDetails">
+				<div class="nav-btns">
+					<shiro:hasPermission name="project:projectType:add">
+						<table:addRow url="${ctx}/projectType/projectType/form" title="项目内容类型"></table:addRow><!-- 增加按钮 -->
+					</shiro:hasPermission>
+					<shiro:hasPermission name="project:projectType:import">
+						<table:importExcel url="${ctx}/projectType/projectType/import"></table:importExcel><!-- 导入按钮 -->
+					</shiro:hasPermission>
+					<shiro:hasPermission name="project:projectType:export">
+						<table:exportExcel url="${ctx}/projectType/projectType/export"></table:exportExcel><!-- 导出按钮 -->
+					</shiro:hasPermission>
+					<button class="nav-btn nav-btn-refresh" data-toggle="tooltip" data-placement="left" onclick="sortOrRefresh()" title="刷新"><i class="glyphicon glyphicon-repeat"></i>&nbsp;刷新</button>
+					<div style="clear: both;"></div>
+				</div>
+
+					<table id="achievementTable" class="layui-table" lay-filter="achievementTable"></table>
+
+				<!-- 表格 -->
+				<%--<table id="treeTable" class="table table-bordered table-hover list-table">
+					<thead>
+					<tr>
+						<th width="50%">项目类型名称</th>
+						<th width="20%">创建时间</th>
+						<th width="30%">操作</th>
+					</tr>
+					</thead>
+					<tbody>
+					<c:forEach items="${list}" var="projectType">
+						<tr  id="${projectType.id}" pId="${projectType.parentId}">
+							<td><a  href="#" onclick="openDialogView('查看工作内容类型', '${ctx}/projectType/projectType/form?id=${projectType.id}','95%', '95%')">
+									${projectType.typeName}</a>
+							</td>
+							<td style="text-align: center">
+								<fmt:formatDate value="${projectType.createDate}" pattern="yyyy-MM-dd"/>
+							</td>
+							<td class="op-td text-center">
+								<div class="op-btn-box">
+									<shiro:hasPermission name="project:projectType:view">
+										<a href="#" onclick="openDialogView('查看项目类型信息', '${ctx}/projectType/projectType/form?view=view&id=${projectType.id}','80%', '80%')" class="op-btn op-btn-view" ><i class="fa fa-search-plus"></i> 查看</a>
+									</shiro:hasPermission>
+									<shiro:hasPermission name="project:projectType:add">
+										<a href="#" onclick="openDialog('新增项目类型信息', '${ctx}/projectType/projectType/form?view=save&id=${projectType.id}','80%', '80%')" class="op-btn nav-btn-add layui-bg-green" ><i class="fa fa-plus layui-bg-green"></i> 新增下级类型</a>
+									</shiro:hasPermission>
+									<shiro:hasPermission name="project:projectType:edit">
+										<a href="#" onclick="openDialog('修改项目类型信息', '${ctx}/projectType/projectType/form?view=edit&id=${projectType.id}','80%','80%')" class="btn btn-success btn-xs" ><i class="fa fa-edit"></i> 修改</a>
+									</shiro:hasPermission>
+									<shiro:hasPermission name="project:projectType:remove">
+										<a href="${ctx}/projectType/projectType/delete?id=${projectType.id}&delFlag=${projectType.delFlag}" onclick="return confirmx('确认要删除该项目类型吗?', this.href)"   class="op-btn op-btn-delete"><i class="fa fa-trash"></i> 删除</a>
+									</shiro:hasPermission>
+								</div>
+							</td>
+						</tr>
+					</c:forEach>
+					</tbody>
+				</table>--%>
+
+				<!-- 分页代码 -->
+			</div>
+		</div>
+	</div>
+</div>
+<script src="${ctxStatic}/layer-v2.3/layui/layui.all.js" charset="utf-8"></script>
+<script src="${ctxStatic}/layer-v2.3/layui/tableTree/treetable.js" charset="utf-8"></script>
+
+<script>
+	/*使用模块加载的方式 加载文件*/
+	layui.config({
+		base: '${ctx}/resoueces/css/layui/module/'
+	}).extend({
+		treetable: 'treetable-lay/treetable'
+	}).use(['layer', 'table', 'treetable'], function () {
+		var $ = layui.jquery;
+		var table = layui.table;
+		var layer = layui.layer;
+		var treetable = layui.treetable;
+
+		// 渲染表格
+		var renderTable = function () {
+			layer.load(2);
+			treetable.render({
+				treeColIndex: 1,//树形图标显示在第几列
+				treeSpid: 0,//最上级的父级id
+				treeIdName: 'permissionId',//id字段的名称
+				treePidName: 'pid',//pid字段的名称
+				treeDefaultClose: false,//是否默认折叠
+				treeLinkage: true,//父级展开时是否自动展开所有子级
+				elem: '#achievementTable',
+				url: '${ctx}/projectType/projectType/getProjectTypeTreeList?typeName=',
+				page: false,
+				cols: [[
+					{type: 'numbers', title: '序号' ,width:80},
+					{field: 'name', title: '类型',templet:function(d){
+							if(null != d.name){
+								return "<a class=\"attention-info\" href=\"javascript:void(0)\" onclick=\"openDialogView('查看项目类型信息', '${ctx}/projectType/projectType/form?view=view&id="+d.id+"','95%', '95%')\">" + d.name + "</a>";
+							}else{
+								return "";
+							}
+						}},
+					{field: 'name', title: '项目类型名称',templet:function(d){
+							if(null != d.name){
+								return "<a class=\"attention-info\" href=\"javascript:void(0)\" onclick=\"openDialogView('查看项目类型信息', '${ctx}/projectType/projectType/form?view=view&id="+d.id+"','95%', '95%')\">" + d.name + "</a>";
+							}else{
+								return "";
+							}
+						}},
+					{field: 'createDate', title: '创建时间',width:80},
+					{templet: complain, title: '操作'}
+				]],
+				done: function () {
+					layer.closeAll('loading');
+				}
+			});
+		};
+
+		renderTable();
+
+		//触发三个button按钮
+		$('#btn-expand').click(function () {
+			treetable.expandAll('#permissionTable');
+		});
+
+		$('#btn-fold').click(function () {
+			treetable.foldAll('#permissionTable');
+		});
+
+		$('#btn-refresh').click(function () {
+			renderTable();
+		});
+
+
+		function complain(d){//操作中显示的内容
+			return [
+				"<a href=\"javascript:void(0)\" onclick=\"openProjectTypeView('查看项目类型信息','${ctx}/projectType/projectType/form?view=view&id="+d.id+"','95%', '95%');\" class=\"op-btn op-btn-view\"><i class=\"fa fa-search-plus\"></i> 查看</a>",
+				"<a href=\"javascript:void(0)\" onclick=\"openProjectType('新增项目类型信息','${ctx}/projectType/projectType/form?view=saveSubordinateInfo&id="+d.id+"','95%', '95%');\" class=\"op-btn nav-btn-add layui-bg-green\"><i class=\"fa fa-plus layui-bg-green\"></i> 新增下级项目类型</a>",
+				"<a href=\"javascript:void(0)\" onclick=\"openProjectType('修改项目类型信息','${ctx}/projectType/projectType/form?view=updateSubordinateInfo&id="+d.id+"','95%', '95%');\" class=\"btn btn-success btn-xs\"><i class=\"fa fa-edit\"></i> 修改</a>",
+				'<a href="${ctx}/projectType/projectType/delete?id='+d.id+'" onclick="return confirmxRefresh(\'确认要删除该项目类型信息吗?\', this.href)"   class="op-btn op-btn-delete"><i class="fa fa-trash"></i> 删除</a>',
+			].join('');
+			<%--<shiro:hasPermission name="project:projectType:add">
+			<a href="#" onclick="openDialog('新增项目类型信息', '${ctx}/projectType/projectType/form?view=save&id=${projectType.id}','80%', '80%')" class="op-btn nav-btn-add layui-bg-green" ><i class="fa fa-plus layui-bg-green"></i> 新增下级类型</a>
+			</shiro:hasPermission>
+			<shiro:hasPermission name="project:projectType:edit">
+			<a href="#" onclick="openDialog('修改项目类型信息', '${ctx}/projectType/projectType/form?view=edit&id=${projectType.id}','80%','80%')" class="btn btn-success btn-xs" ><i class="fa fa-edit"></i> 修改</a>
+			</shiro:hasPermission>
+			<shiro:hasPermission name="project:projectType:remove">
+			<a href="${ctx}/projectType/projectType/delete?id=${projectType.id}&delFlag=${projectType.delFlag}" onclick="return confirmx('确认要删除该项目类型吗?', this.href)"   class="op-btn op-btn-delete"><i class="fa fa-trash"></i> 删除</a>
+			</shiro:hasPermission>--%>
+			/*if(d.loginUserId == d.createBy){
+				if(d.fileStatus == 1){
+					return [
+						'<a href="javascript:void(0)" onclick="openDialogres(\'修改报告\', \'${ctx}/projectcontentinfo/projectcontentinfo/form?view=report&dictType=${dictType}&id=${id}&parentIds=${parentIds}&projectReportData.id='+d.id+'\',\'95%\',\'95%\')" class="op-btn op-btn-edit" ><i class="fa fa-edit"></i> 修改</a>',
+						'<a href="${ctx}/projectcontentinfo/projectcontentinfo/delete?infoId='+d.id+'&id=${id}&type=8" onclick="return confirmxRefresh(\'确认要删除该工作内容报告吗?\', this.href)"   class="op-btn op-btn-delete"><i class="fa fa-trash"></i> 删除</a>',
+					].join('');
+				}else if(d.fileStatus == 2){
+					return [
+						'<a href="${ctx}/projectcontentinfo/projectcontentinfo/cancelInvalidate?infoId='+d.id+'&id=${id}&type=8" onclick="return confirmxRefresh(\'确认要撤回该工作内容报告吗?\', this.href)"   class="op-btn op-btn-cancel"><i class="glyphicon glyphicon-share-alt"></i> 撤回</a>',
+					].join('');
+				}else if(d.fileStatus == 3){
+					return [
+						'<a href="javascript:void(0)" onclick="openDialogreAudit(\'修改报告\', \'${ctx}/projectcontentinfo/projectcontentinfo/form?view=report&dictType=${dictType}&id=${id}&parentIds=${parentIds}&projectReportData.id='+d.id+'\',\'95%\',\'95%\')" class="op-btn op-btn-edit" ><i class="fa fa-edit"></i> 修改</a>',
+						'<a href="${ctx}/projectcontentinfo/projectcontentinfo/delete?infoId='+d.id+'&id=${id}&type=8" onclick="return confirmxRefresh(\'确认要删除该工作内容报告吗?\', this.href)"   class="op-btn op-btn-delete"><i class="fa fa-trash"></i> 删除</a>',
+					].join('');
+				}else if(d.fileStatus == 4){
+					return [
+						'<a href="javascript:void(0)" onclick="openDialogreAudit(\'修改报告\', \'${ctx}/projectcontentinfo/projectcontentinfo/form?view=reportModify&dictType=${dictType}&id=${id}&parentIds=${parentIds}&projectReportData.id='+d.id+'\',\'95%\',\'95%\')" class="op-btn op-btn-edit" ><i class="fa fa-edit"></i> 修改</a>',
+						'<a href="${ctx}/projectcontentinfo/projectcontentinfo/delete?infoId='+d.id+'&id=${id}&type=8" onclick="return confirmxRefresh(\'确认要删除该工作内容报告吗?\', this.href)"   class="op-btn op-btn-delete"><i class="fa fa-trash"></i> 删除</a>',
+					].join('');
+				}else if(d.fileStatus == 5){
+					return [
+						'<a href="javascript:void(0)" onclick="openDialogres(\'报告作废\', \'${ctx}/projectcontentinfo/projectcontentinfo/form?view=reportInvalid&dictType=${dictType}&id=${id}&parentIds=${parentIds}&projectReportData.id='+d.id+'\',\'95%\',\'95%\')" class="op-btn op-btn-invalid" ><i class="fa fa-trash-o"></i> 作废</a>',
+					].join('');
+				}else{
+					return[''].join('');
+				}
+			}else{
+				return[''].join('');
+			}*/
+		}
+		//监听工具条
+		table.on('tool(permissionTable)', function (obj) {
+			var data = obj.data;
+			var layEvent = obj.event;
+			if(data.permissionName!=null){
+				if (layEvent === 'del') {
+					layer.msg('删除' + data.id);
+				} else if (layEvent === 'edit') {
+					layer.msg('修改' + data.id);
+				}
+			}
+		});
+	});
+</script>
+<script>
+	function openProjectTypeView(title,url,width,height,target){
+		var company=$("#company").val();
+		url=url+"&company="+company;
+		if(navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)){//如果是移动端,就使用自适应大小弹窗
+			width='auto';
+			height='auto';
+		}else{//如果是PC端,根据用户设置的width和height显示。
+
+		}
+
+		top.layer.open({
+			type: 2,
+			area: [width, height],
+			title: title,
+			maxmin: true, //开启最大化最小化按钮
+			content: url ,
+			skin:"two-btns",
+			btn: ['关闭'],
+			yes: function(index, layero){
+				var body = top.layer.getChildFrame('body', index);
+				var iframeWin = layero.find('iframe')[0]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method();
+				var inputForm = body.find('#inputForm');
+				var top_iframe;
+				if(target){
+					top_iframe = target;//如果指定了iframe,则在改frame中跳转
+				}else{
+					top_iframe = top.getActiveTab().attr("name");//获取当前active的tab的iframe
+				}
+				inputForm.attr("target",top_iframe);//表单提交成功后,从服务器返回的url在当前tab中展示
+				var $document = iframeWin.contentWindow.document;
+				top.layer.close(index);
+				//formSubmit($document,"inputForm",index);
+			},
+			cancel: function(index){
+			}
+		});
+
+	}
+
+	function openProjectType(title,url,width,height,target){
+		var company=$("#company").val();
+		url=url+"&company="+company;
+		if(navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)){//如果是移动端,就使用自适应大小弹窗
+			width='auto';
+			height='auto';
+		}else{//如果是PC端,根据用户设置的width和height显示。
+
+		}
+
+		top.layer.open({
+			type: 2,
+			area: [width, height],
+			title: title,
+			maxmin: true, //开启最大化最小化按钮
+			content: url ,
+			skin:"two-btns",
+			btn: ['提交','关闭'],
+			yes: function(index, layero){
+				var body = top.layer.getChildFrame('body', index);
+				var iframeWin = layero.find('iframe')[0]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method();
+				var inputForm = body.find('#inputForm');
+				var top_iframe;
+				if(target){
+					top_iframe = target;//如果指定了iframe,则在改frame中跳转
+				}else{
+					top_iframe = top.getActiveTab().attr("name");//获取当前active的tab的iframe
+				}
+				inputForm.attr("target",top_iframe);//表单提交成功后,从服务器返回的url在当前tab中展示
+				var $document = iframeWin.contentWindow.document;
+				formSubmit($document,"inputForm",index);
+			},
+			cancel: function(index){
+			}
+		});
+
+	}
+	function formSubmit($document,inputForm,index){
+		$($document.getElementById(inputForm)).ajaxSubmit({
+			success:function(data) {
+				top.layer.close(index);
+				/*if(data.status){
+					parent.layer.msg('删除成功',{icon:1});
+					window.location.reload();
+				}else {
+					parent.layer.msg('删除失败',{icon:2});
+				}*/
+				if(data.code == 0){
+					layer.msg(data.msg, {icon: 1,time: 1000}, function(){
+						return false;
+					});
+				}else{
+					layer.msg(data.msg, {icon: 1,time: 1000}, function(){
+						window.location.reload();
+					});
+				}
+			},error:function(){
+				layer.msg("操作失败",{icon:2});
+				window.location.reload();
+			}
+		});
+	}
+	// 确认对话框
+	function confirmxRefresh(mess, href){
+		top.layer.confirm(mess, {icon: 3, title:'系统提示'}, function(index){
+			//do something
+			if (typeof href == 'function') {
+				href();
+			}else{
+				resetTip(); //loading();
+				$.ajax({
+					url:href,
+					data:$('#loginForm').serialize(),
+					type:"post",
+					success:function(data){
+						if(data.code == 1){
+							parent.layer.msg('删除成功',{icon:1});
+							window.location.reload();
+						}else {
+							parent.layer.msg('删除失败',{icon:2});
+						}
+					}
+				});
+			}
+			top.layer.close(index);
+		});
+		return false;
+	}
+</script>
+</body>
+</html>

+ 62 - 0
src/main/webapp/webpage/modules/project/type/projectTypeView.jsp

@@ -0,0 +1,62 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<html>
+<head>
+	<title>工作内容类型管理</title>
+	<meta name="decorator" content="default"/>
+	<script type="text/javascript">
+		var validateForm;
+		function doSubmit(){//回调函数,在编辑和保存动作时,供openDialog调用提交表单。
+			if(validateForm.form()){
+				$("#inputForm").submit();
+				return true;
+			}
+
+			return false;
+		}
+		$(document).ready(function() {
+			validateForm = $("#inputForm").validate({
+				submitHandler: function(form){
+					loading('正在提交,请稍等...');
+					form.submit();
+				},
+				errorContainer: "#messageBox",
+				errorPlacement: function(error, element) {
+					$("#messageBox").text("输入有误,请先更正。");
+					if (element.is(":checkbox")||element.is(":radio")||element.parent().is(".input-append")){
+						error.appendTo(element.parent().parent());
+					} else {
+						error.insertAfter(element);
+					}
+				}
+			});
+		});
+	</script>
+</head>
+<body>
+<div class="single-form">
+	<div class="container view-form">
+		<form:form id="inputForm" modelAttribute="projectType" action="${ctx}/projectType/projectType/save" method="post" class="form-horizontal">
+			<form:hidden path="id"/>
+			<input type="hidden" name="parentId" value="${projectType.parentId}">
+			<sys:message content="${message}"/>
+			<div class="form-group layui-row first lw9">
+				<div class="form-group-label"><h2>基础信息</h2></div>
+				<div class="layui-item layui-col-sm12">
+					<label class="layui-form-label">父级节点:</label>
+					<div class="layui-input-block">
+						<form:input path="parentName" htmlEscape="false" readonly="true" class="form-control layui-input"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm12">
+					<label class="layui-form-label">项目类型名称:</label>
+					<div class="layui-input-block">
+						<form:input path="typeName" htmlEscape="false" readonly="true" class="form-control layui-input"/>
+					</div>
+				</div>
+			</div>
+		</form:form>
+	</div>
+</div>
+</body>
+</html>

+ 20 - 9
src/main/webapp/webpage/modules/projectcontentinfo/workContentForm.jsp

@@ -250,6 +250,9 @@
                 case '510':
                     $("#contentDetail").load("${ctx}/workContent/workContentCompleteAccount/list",param2);
                     break;
+                case '420':
+                    $("#contentDetail").load("${ctx}/workSchedule/workSchedule/list",param2);
+                    break;
                 default:
                     detailFlag=0;
                     $("#contentDetail").html("");
@@ -504,18 +507,18 @@
                                     <form:options items="${fns:getContentTypeList(projectcontentinfo.type-1)}" itemLabel="typeName" itemValue="typeId"></form:options>
                                 </c:when>
                                 <c:otherwise>
-                                    <optgroup label="决策阶段"/>
-                                    <form:options items="${fns:getContentTypeList('1')}" itemLabel="typeName" itemValue="typeId"></form:options>
-                                    <optgroup label="设计阶段"/>
+                                   <%-- <optgroup label="决策阶段"/>
+                                    <form:options items="${fns:getContentTypeList('1')}" itemLabel="typeName" itemValue="typeId"></form:options>--%>
+                                    <optgroup label="项目实施前期"/>
                                     <form:options items="${fns:getContentTypeList('2')}" itemLabel="typeName" itemValue="typeId"></form:options>
-                                    <optgroup label="发承包阶段"/>
-                                    <form:options items="${fns:getContentTypeList('3')}" itemLabel="typeName" itemValue="typeId"></form:options>
-                                    <optgroup label="实施阶段"/>
+                                    <%--<optgroup label="发承包阶段"/>
+                                    <form:options items="${fns:getContentTypeList('3')}" itemLabel="typeName" itemValue="typeId"></form:options>--%>
+                                    <optgroup label="项目实施阶段"/>
                                     <form:options items="${fns:getContentTypeList('4')}" itemLabel="typeName" itemValue="typeId"></form:options>
-                                    <optgroup label="竣工阶段"/>
+                                    <optgroup label="项目竣工阶段"/>
                                     <form:options items="${fns:getContentTypeList('5')}" itemLabel="typeName" itemValue="typeId"></form:options>
-                                    <optgroup label="运营阶段"/>
-                                    <form:options items="${fns:getContentTypeList('6')}" itemLabel="typeName" itemValue="typeId"></form:options>
+                                    <%--<optgroup label="运营阶段"/>
+                                    <form:options items="${fns:getContentTypeList('6')}" itemLabel="typeName" itemValue="typeId"></form:options>--%>
                                 </c:otherwise>
                             </c:choose>
                         </form:select>
@@ -1035,6 +1038,8 @@
             /*新加代码*/
             case '510':
                 return  "${ctx}/workContent/workContentCompleteAccount/getTableType";
+            case '420':
+                return "${ctx}/workSchedule/workSchedule/getTableType";
             default:
                 return "";
         }
@@ -1116,6 +1121,9 @@
             case '510':
                 $("#contentDetail").load("${ctx}/workContent/workContentCompleteAccount/list",param2);
                 break;
+            case '420':
+                $("#contentDetail").load("${ctx}/workSchedule/workSchedule/list",param2);
+                break;
             default:
                 detailFlag=0;
                 $("#contentDetail").html("");
@@ -1198,6 +1206,9 @@
             case '510':
                 $("#contentDetail").load("${ctx}/workContent/workContentCompleteAccount/list",param2);
                 break;
+            case '420':
+                $("#contentDetail").load("${ctx}/workSchedule/workSchedule/list",param2);
+                break;
             default:
                 detailFlag=0;
                 $("#contentDetail").html("");

+ 11 - 0
src/main/webapp/webpage/modules/projectcontentinfo/workContentView.jsp

@@ -219,6 +219,9 @@
                 case '510':
                     $("#contentDetail").load("${ctx}/workContent/workContentCompleteAccount/list",param2);
                     break;
+                case '420':
+                    $("#contentDetail").load("${ctx}/workSchedule/workSchedule/list",param2);
+                    break;
                 default:
                     detailFlag=0;
                     $("#contentDetail").html("");
@@ -935,6 +938,8 @@
                 return "${ctx}/workcontentbranchaccount/workcontentBranchAccount/getTableType";
             case '510':
                 return "${ctx}/workContent/workContentCompleteAccount/getTableType";
+            case '420':
+                return "${ctx}/workSchedule/workSchedule/getTableType";
                 default:
                 return "";
         }
@@ -1015,6 +1020,9 @@
             case '510':
                 $("#contentDetail").load("${ctx}/workContent/workContentCompleteAccount/list",param2);
                 break;
+            case '420':
+                $("#contentDetail").load("${ctx}/workSchedule/workSchedule/list",param2);
+                break;
             default:
                 detailFlag=0;
                 $("#contentDetail").html("");
@@ -1090,6 +1098,9 @@
             case '510':
                 $("#contentDetail").load("${ctx}/workContent/workContentCompleteAccount/list",param2);
                 break;
+            case '420':
+                $("#contentDetail").load("${ctx}/workSchedule/workSchedule/list",param2);
+                break;
             default:
                 detailFlag=0;
                 $("#contentDetail").html("");

+ 9 - 9
src/main/webapp/webpage/modules/sys/mainDictDetailForm.jsp

@@ -190,18 +190,18 @@
 					<div class="layui-input-block">
 						<form:select id="achievementParentId" path="achievementParentId"  htmlEscape="false"   onchange="changeContentDetail(this)"  class="form-control simple-select required">
 							<form:option value=""></form:option>
-							<optgroup label="决策阶段"/>
-							<form:options items="${fns:getContentTypeList('1')}" itemLabel="typeName" itemValue="typeId"></form:options>
-							<optgroup label="设计阶段"/>
+							<%--<optgroup label="决策阶段"/>
+							<form:options items="${fns:getContentTypeList('1')}" itemLabel="typeName" itemValue="typeId"></form:options>--%>
+							<optgroup label="项目实施前期"/>
 							<form:options items="${fns:getContentTypeList('2')}" itemLabel="typeName" itemValue="typeId"></form:options>
-							<optgroup label="发承包阶段"/>
-							<form:options items="${fns:getContentTypeList('3')}" itemLabel="typeName" itemValue="typeId"></form:options>
-							<optgroup label="实施阶段"/>
+							<%--<optgroup label="发承包阶段"/>
+							<form:options items="${fns:getContentTypeList('3')}" itemLabel="typeName" itemValue="typeId"></form:options>--%>
+							<optgroup label="项目实施阶段"/>
 							<form:options items="${fns:getContentTypeList('4')}" itemLabel="typeName" itemValue="typeId"></form:options>
-							<optgroup label="竣工阶段"/>
+							<optgroup label="项目竣工阶段"/>
 							<form:options items="${fns:getContentTypeList('5')}" itemLabel="typeName" itemValue="typeId"></form:options>
-							<optgroup label="运营阶段"/>
-							<form:options items="${fns:getContentTypeList('6')}" itemLabel="typeName" itemValue="typeId"></form:options>
+							<%--<optgroup label="运营阶段"/>
+							<form:options items="${fns:getContentTypeList('6')}" itemLabel="typeName" itemValue="typeId"></form:options>--%>
 						</form:select>
 					</div>
 				</div>

+ 52 - 0
src/main/webapp/webpage/modules/workclientinfo/workClientInfoForm.jsp

@@ -8,6 +8,7 @@
 <head>
 	<title>客户信息管理</title>
 	<meta name="decorator" content="default"/>
+    <script src="${ctxStatic}/layer-v2.3/layui/xmSelect.js" charset="utf-8"></script>
     <%--<style type="text/css">--%>
         <%--.btn-file{--%>
             <%--margin-top:8px;--%>
@@ -42,6 +43,7 @@
 		var exitName = true;
 		function doSubmit(){//回调函数,在编辑和保存动作时,供openDialog调用提交表单。
 		  if(validateForm.form()){
+              var jobTypeStr = $("#jobTypeStr").val();
               var tableObj = document.getElementById('contentTable').rows[1];
               if (tableObj == null) {
                   parent.layer.msg("请填写联系人信息!", {icon: 5});
@@ -59,6 +61,7 @@
 		  return false;
 		}
 		$(document).ready(function() {
+            contentDetailTypeShow();
             checkContentKeyUp('unitIntroduction',500);
             $.validator.messages["orUnicode"] = true;
             $.validator.methods["orUnicode"] = function( value, element ) {
@@ -394,6 +397,7 @@
                    onkeydown="if(event.keyCode==13)return false;" action="${ctx}/workclientinfo/workClientInfo/save"
                    method="post" class="form-horizontal">
             <form:hidden path="id"/>
+            <input type="hidden" id="jobTypeStr" name="jobTypeStr" value="">
             <div class="form-group layui-row first">
                 <div class="form-group-label"><h2>基本信息</h2></div>
                 <div class="layui-item layui-col-sm6 lw7">
@@ -498,6 +502,13 @@
                         <form:input path="companyUrl" htmlEscape="false" class="form-control isUrl layui-input"/>
                     </div>
                 </div>
+                <div class="layui-item layui-col-sm6 lw7">
+                    <label class="layui-form-label"><span class="require-item">*</span>工作类型:</label>
+                    <div class="layui-input-block">
+                        <div id="jobType" class="xm-select-demo" tabindex="0" contenteditable="true"></div>
+                    </div>
+                </div>
+
                 <div class="layui-item layui-col-sm12 lw7">
                     <label class="layui-form-label"><span class="require-item">*</span>注册地址:</label>
                     <div class="layui-input-block">
@@ -898,5 +909,46 @@
 
 
 <%--</script>--%>
+<script src="${ctxStatic}/layer-v2.3/layui/layui.all.js" charset="utf-8"></script>
+<script>
+    function contentDetailTypeShow() {
+        $.ajax({
+            type:'post',
+            url:'${ctx}/workclientinfo/workClientInfo/getJobType',
+            data:{
+                "type":2
+            },
+            success:function(data){
+                if(data.success) {
+                    xmSelect.render({
+                        el: '#jobType',
+                        language: 'zn',
+                        data:data.body.list
+                    })
+                    $("#dataBodyList").val(data.body.list);
+                }
+            }
+        })
+    }
+
+    var jobType = xmSelect.render({
+        el: '#jobType',
+        language: 'zn',
+        data: [
+        ]
+    })
+
+
+    document.getElementById('jobType').onblur=function(){
+        var list = [];
+        //获取当前多选选中的值
+        var selectArr = jobType.getValue();
+        for (var i in selectArr){
+            list.push(selectArr[i].value);
+        }
+        $("#jobTypeStr").val(list);
+        console.log(list);
+    }
+</script>
 </body>
 </html>

+ 238 - 0
src/main/webapp/webpage/modules/workcontent/workScheduleList.jsp

@@ -0,0 +1,238 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<script type="text/javascript">
+    function formatJiananNumMoney(obj,index) {
+        var val = $(obj).val();
+        var beforeCumulativeCompletionMoney=$("#workScheduleList"+index+"_beforeCumulativeCompletionMoney").val();
+        var beforeTotalPaymentMoney=$("#workScheduleList"+index+"_beforeTotalPaymentMoney").val();
+        if(beforeCumulativeCompletionMoney==undefined||!isNumber(beforeCumulativeCompletionMoney)||beforeCumulativeCompletionMoney==''){
+            beforeCumulativeCompletionMoney=0;
+        }
+        if(beforeTotalPaymentMoney==undefined||!isNumber(beforeTotalPaymentMoney)||beforeTotalPaymentMoney==''){
+            beforeTotalPaymentMoney=0;
+        }
+        var total=(parseFloat(beforeTotalPaymentMoney) / parseFloat(beforeCumulativeCompletionMoney)).toFixed(2);
+        $("#workScheduleList"+index+"_beforePayRatio").val(total);
+
+        if(!isNumber(val))return;
+    }
+    function formatOtherNumMoney(obj,index) {
+        var val = $(obj).val();
+        var currentCumulativeCompletionMoney=$("#workScheduleList"+index+"_currentCumulativeCompletionMoney").val();
+        var currentTotalPaymentMoney=$("#workScheduleList"+index+"_currentTotalPaymentMoney").val();
+        if(currentCumulativeCompletionMoney==undefined||!isNumber(currentCumulativeCompletionMoney)||currentCumulativeCompletionMoney==''){
+            currentCumulativeCompletionMoney=0;
+        }
+        if(currentTotalPaymentMoney==undefined||!isNumber(currentTotalPaymentMoney)||currentTotalPaymentMoney==''){
+            currentTotalPaymentMoney=0;
+        }
+        var total=(parseFloat(currentTotalPaymentMoney) / parseFloat(currentCumulativeCompletionMoney)).toFixed(2);
+        $("#workScheduleList"+index+"_currentPayRatio").val(total);
+
+        if(!isNumber(val))return;
+    }
+</script>
+<form id="subForm"  action="#" onsubmit="return false;" method="post" class="form-horizontal">
+    <c:forEach items="${signList}" var="sign">
+        <c:if test="${sign =='workSchedule'}">
+            <div class="layui-item nav-btns" style="padding-left:0px;">
+                <a class="nav-btn nav-btn-add" onclick="addRowCost('#workScheduleList',preliminaryIdx,preliminaryTpl)" title="新增"><i class="fa fa-plus"></i> 新增</a>
+                <table:importExcelCost url="${ctx}/workPreliminary/workPreliminaryDesignEstimate/import"></table:importExcelCost><!-- 导入按钮 -->
+            </div>
+
+            <table id="contentTable" class="table table-bordered table-condensed can-edit">
+                <thead>
+                    <tr>
+                        <th colspan="15" style="font-size: 20px">施工单位工程款支付明细表</th>
+                    </tr>
+                    <tr>
+                        <th rowspan="2" class="hide"></th>
+                        <th rowspan="2" >序号</th>
+                        <th rowspan="2" >签约合同价款</th>
+                        <th colspan="3" >截至上期末</th>
+                        <th colspan="5">本期</th>
+                        <th colspan="3">截至本期末</th>
+                        <th rowspan="2" >备注</th>
+                        <th width="60" rowspan="2">操作</th>
+                    </tr>
+                    <tr>
+                        <th>已累计完成价款</th>
+                        <th>已累计支付价款</th>
+                        <th>支付比例</th>
+                        <th>完成价款</th>
+                        <th>按约定比例应支付价款</th>
+                        <th>应扣预付款</th>
+                        <th>其他应扣款</th>
+                        <th>实际应支付</th>
+                        <th>已累计完成价款</th>
+                        <th>已累计支付价款</th>
+                        <th>支付比例</th>
+                    </tr>
+                </thead>
+                <tbody id="workScheduleList">
+                </tbody>
+            </table>
+        </c:if>
+    </c:forEach>
+	<script type="text/template" id="preliminaryTpl">//<!--
+        <tr id="workScheduleList{{idx}}">
+            <td class="hide">
+                <input id="workScheduleList{{idx}}_id" subName="id" class="contentDetail" type="hidden" value="{{row.id}}"/>
+                <input id="workScheduleList{{idx}}_delFlag" subName="delFlag" class="contentDetail" type="hidden" value="0"/>
+                <input id="workScheduleList{{idx}}_costType" subName="costType" class="contentDetail"  type="hidden" value="{{row.costType}}"/>
+                <input id="workScheduleList{{idx}}_type" subName="type" class="contentDetail"  type="hidden" value="workSchedule"/>
+            </td>
+            <td>
+                <input id="workScheduleList{{idx}}_costNum" subName="costNum" readonly="readonly" style="text-align: center"  value="{{idx}}" type="text" class="form-control contentDetail"/>
+            </td>
+
+            <td>
+                <input id="workScheduleList{{idx}}_contractMoney" subName="contractMoney" style="text-align: center"  value="{{row.contractMoney}}" type="text" class="form-control number contentDetail money"/>
+            </td>
+
+            <td>
+                <input id="workScheduleList{{idx}}_beforeCumulativeCompletionMoney" subName="beforeCumulativeCompletionMoney" type="text" value="{{row.beforeCumulativeCompletionMoney}}" onchange="formatJiananNumMoney(this,{{idx}});"  class="form-control number contentDetail money"/>
+            </td>
+            <td>
+                <input id="workScheduleList{{idx}}_beforeTotalPaymentMoney" subName="beforeTotalPaymentMoney" type="text" value="{{row.beforeTotalPaymentMoney}}" onchange="formatJiananNumMoney(this,{{idx}});" class="form-control number contentDetail money"/>
+            </td>
+            <td>
+                <input id="workScheduleList{{idx}}_beforePayRatio" subName="beforePayRatio"  readonly="readonly" type="text" value="{{row.beforePayRatio}}" onchange="formatJiananNumMoney(this,{{idx}});" class="form-control number contentDetail money"/>
+            </td>
+
+            <td>
+                <input id="workScheduleList{{idx}}_currentAccomplishMoney" subName="currentAccomplishMoney" type="text"  value="{{row.currentAccomplishMoney}}" class="form-control number  contentDetail money"/>
+            </td>
+            <td>
+                <input id="workScheduleList{{idx}}_currentAppointPayMoney" subName="currentAppointPayMoney" type="text"    value="{{row.currentAppointPayMoney}}" class="form-control number contentDetail"/>
+            </td>
+            <td>
+                <input id="workScheduleList{{idx}}_currentShouldDeductPrepayMoney" subName="currentShouldDeductPrepayMoney" type="text"    value="{{row.currentShouldDeductPrepayMoney}}" class="form-control number contentDetail"/>
+            </td>
+
+            <td>
+                <input id="workScheduleList{{idx}}_currentShouldDeductMoney" subName="currentShouldDeductMoney" type="text"  value="{{row.currentShouldDeductMoney}}" class="form-control contentDetail"/>
+            </td>
+            <td>
+                <input id="workScheduleList{{idx}}_currentPracticalPayMoney" subName="currentPracticalPayMoney" type="text"  value="{{row.currentPracticalPayMoney}}" class="form-control number contentDetail"/>
+            </td>
+
+            <td>
+                <input id="workScheduleList{{idx}}_currentCumulativeCompletionMoney" subName="currentCumulativeCompletionMoney" type="text"  value="{{row.currentCumulativeCompletionMoney}}" onchange="formatOtherNumMoney(this,{{idx}});" class="form-control number contentDetail"/>
+            </td>
+            <td>
+                <input id="workScheduleList{{idx}}_currentTotalPaymentMoney" subName="currentTotalPaymentMoney" type="text"  value="{{row.currentTotalPaymentMoney}}" onchange="formatOtherNumMoney(this,{{idx}});" class="form-control number contentDetail"/>
+            </td>
+            <td>
+                <input id="workScheduleList{{idx}}_currentPayRatio"  readonly="readonly" subName="currentPayRatio" type="text"  value="{{row.currentPayRatio}}" onchange="formatOtherNumMoney(this,{{idx}});" class="form-control  contentDetail"/>
+            </td>
+            <td>
+                <input id="workScheduleList{{idx}}_remarks" subName="remarks" type="text"  value="{{row.remarks}}" class="form-control  contentDetail"/>
+            </td>
+            <td class="text-center op-td">
+                        <a href="#" onclick="delRow(this, '#workScheduleList{{idx}}')"   class="op-btn op-btn-delete"><i class="fa fa-trash"></i> 取消</a>
+            </td>
+        </tr>//-->
+    </script>
+    <script type="text/javascript">
+        var preliminaryIdx = 0, preliminaryTpl = $("#preliminaryTpl").html().replace(/(\/\/\<!\-\-)|(\/\/\-\->)/g,"");
+        var validateForm2;
+        $(function(){
+            validateForm2 = $("#subForm").validate({
+                errorContainer: "#messageBox",
+                errorPlacement: function(error, element) {
+                    $("#messageBox").text("输入有误,请先更正。");
+                    if (element.is(":checkbox")||element.is(":radio")||element.parent().is(".input-append")){
+                        error.appendTo(element.parent().parent());
+                    } else {
+                        error.insertAfter(element);
+                    }
+                }
+            });
+
+            var data = ${fns:toJson(workScheduleList)};
+            console.log(data);
+            for (var i=0; i<data.length; i++){
+                addRowCost('#workScheduleList', preliminaryIdx, preliminaryTpl,data[i]);
+                $("#workScheduleList"+i+"_nodeTypes").val(data[i].nodeTypes);
+                $("#workScheduleList"+i+"_expenseType").val(data[i].expenseType);
+                $("#workScheduleList"+i+"_unit").val(data[i].unit);
+            }
+            $(":input.money").change();
+        })
+
+        function addRowCost(list, idx, tpl, row){
+            idx = idx+1;
+            bornTemplete(list, idx, tpl, row, idx);
+            preliminaryIdx +=1;
+        }
+
+        function bornTemplete(list, idx, tpl, row, idx1){
+            var idx1 = $("#workScheduleList tr").length +1;
+            $(list).append(Mustache.render(tpl, {
+                idx: idx, delBtn: true, row: row,
+                order:idx1 + 1, idx1:idx1
+            }));
+            $(list+idx).find("select").each(function(){
+                $(this).val($(this).attr("data-value"));
+            });
+            $(list+idx).find("input[type='checkbox'], input[type='radio']").each(function(){
+                var ss = $(this).attr("data-value").split(',');
+                for (var i=0; i<ss.length; i++){
+                    if($(this).val() == ss[i]){
+                        $(this).attr("checked","checked");
+                    }
+                }
+            });
+        }
+        function delRow(obj, prefix,idx){
+            var id = $(prefix+"_id");
+            var delFlag = $(prefix+"_delFlag");
+            if(id.val()==null||id.val()==''){
+                $(obj).parent().parent().remove();
+            }else {
+                delFlag.val("1");
+                $(obj).parent().parent().hide();
+            }
+        }
+
+        function genRow(data) {
+            for (var i = 0; i < data.length; i++) {
+                addRowCost('#workScheduleList',preliminaryIdx,preliminaryTpl,data[i]);
+            }
+            $(":input.money").change();
+        }
+
+        function genDetailStr(){
+            var costList = $("#workScheduleList tr");
+            var contentStr = "[";
+            for(var j=0; j<costList.length;j++){
+                contentStr+="{"
+                var idstr = $(costList[j]).attr("id");
+                var detail = $("tr[id="+idstr+"] .contentDetail");
+                for(var i=0; i<detail.length;i++){
+                    contentStr+="'"
+                    contentStr+=$(detail[i]).attr("subName");
+                    contentStr+="'"
+                    contentStr+=":";
+                    contentStr+="'"
+                    contentStr+=$(detail[i]).val();
+                    contentStr+="'"
+                    if(i!=detail.length-1){
+                        contentStr+=","
+                    }
+                }
+                contentStr+="}"
+                if(j!=costList.length-1){
+                    contentStr+=","
+                }
+            }
+            contentStr += "]";
+            return contentStr;
+        }
+
+        function genSecondDetailStr(){
+            return '';
+        }
+    </script>
+</form>

+ 85 - 0
src/main/webapp/webpage/modules/workcontent/workScheduleListView.jsp

@@ -0,0 +1,85 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<form id="subForm"  action="#" onsubmit="return false;" method="post" class="form-horizontal">
+    <c:forEach items="${signList}" var="sign">
+        <c:if test="${sign =='workSchedule'}">
+            <table id="contentTable" class="table table-bordered table-condensed">
+                <thead>
+                    <tr>
+                        <th colspan="14" style="font-size: 20px">施工单位工程款支付明细表</th>
+                    </tr>
+                    <tr>
+                        <th rowspan="2" class="hide"></th>
+                        <th rowspan="2" >序号</th>
+                        <th rowspan="2" >签约合同价款</th>
+                        <th colspan="3" >截至上期末</th>
+                        <th colspan="5">本期</th>
+                        <th colspan="3">截至本期末</th>
+                        <th rowspan="2" >备注</th>
+                    </tr>
+                    <tr>
+                        <th>已累计完成价款</th>
+                        <th>已累计支付价款</th>
+                        <th>支付比例</th>
+                        <th>完成价款</th>
+                        <th>按约定比例应支付价款</th>
+                        <th>应扣预付款</th>
+                        <th>其他应扣款</th>
+                        <th>实际应支付</th>
+                        <th>已累计完成价款</th>
+                        <th>已累计支付价款</th>
+                        <th>支付比例</th>
+                    </tr>
+                </thead>
+                <tbody id="preliminaryList">
+                <c:forEach items="${workScheduleList}" var="row" varStatus="status">
+                    <tr>
+                        <td style='text-align:center;'>
+                                ${status.index+1}
+                        </td>
+                        <td style='text-align:center;'>
+                            <fmt:formatNumber value="${row.contractMoney}" pattern="#,##0.00#"/>
+                        </td>
+                        <td style='text-align:center;'>
+                            <fmt:formatNumber value="${row.beforeCumulativeCompletionMoney}" pattern="#,##0.00#"/>
+                        </td>
+                        <td style='text-align:center;'>
+                            <fmt:formatNumber value="${row.beforeTotalPaymentMoney}" pattern="#,##0.00#"/>
+                        </td>
+                        <td style='text-align:center;'>
+                            <fmt:formatNumber value="${row.beforePayRatio}" pattern="#,##0.00#"/>
+                        </td>
+                        <td style='text-align:center;'>
+                            <fmt:formatNumber value="${row.currentAccomplishMoney}" pattern="#,##0.00#"/>
+                        </td>
+                        <td style='text-align:center;'>
+                            <fmt:formatNumber value="${row.currentAppointPayMoney}" pattern="#,##0.00#"/>
+                        </td>
+                        <td style='text-align:center;'>
+                            <fmt:formatNumber value="${row.currentShouldDeductPrepayMoney}" pattern="#,##0.00#"/>
+                        </td>
+                        <td style='text-align:center;'>
+                            <fmt:formatNumber value="${row.currentShouldDeductMoney}" pattern="#,##0.00#"/>
+                        </td>
+                        <td style='text-align:center;'>
+                            <fmt:formatNumber value="${row.currentPracticalPayMoney}" pattern="#,##0.00#"/>
+                        </td>
+                        <td style='text-align:center;'>
+                            <fmt:formatNumber value="${row.currentCumulativeCompletionMoney}" pattern="#,##0.00#"/>
+                        </td>
+                        <td style='text-align:center;'>
+                            <fmt:formatNumber value="${row.currentTotalPaymentMoney}" pattern="#,##0.00#"/>
+                        </td>
+                        <td style='text-align:center;'>
+                            <fmt:formatNumber value="${row.currentPayRatio}" pattern="#,##0.00#"/>
+                        </td>
+                        <td style='text-align:center;'>
+                                ${row.remarks}
+                        </td>
+                    </tr>
+                </c:forEach>
+                </tbody>
+            </table>
+        </c:if>
+    </c:forEach>
+</form>