소스 검색

外部单位-项目,文件上传,提资需求,意见反馈

sangwenwei 9 달 전
부모
커밋
a45085152c
47개의 변경된 파일9383개의 추가작업 그리고 20개의 파일을 삭제
  1. 1 0
      src/main/java/com/jeeplus/common/utils/MenuStatusEnum.java
  2. 5 0
      src/main/java/com/jeeplus/modules/act/service/ActTaskService.java
  3. 6 0
      src/main/java/com/jeeplus/modules/act/web/ActTaskController.java
  4. 15 0
      src/main/java/com/jeeplus/modules/externalUnit/dao/ExternalUnitCapitalDemandDao.java
  5. 15 0
      src/main/java/com/jeeplus/modules/externalUnit/dao/ExternalUnitFeedbackDao.java
  6. 15 0
      src/main/java/com/jeeplus/modules/externalUnit/dao/ExternalUnitProjectRecordsDao.java
  7. 11 0
      src/main/java/com/jeeplus/modules/externalUnit/dao/ExternalUnitProjectUserDao.java
  8. 168 0
      src/main/java/com/jeeplus/modules/externalUnit/entity/ExternalUnitCapitalDemand.java
  9. 154 0
      src/main/java/com/jeeplus/modules/externalUnit/entity/ExternalUnitFeedback.java
  10. 265 0
      src/main/java/com/jeeplus/modules/externalUnit/entity/ExternalUnitProjectRecords.java
  11. 26 0
      src/main/java/com/jeeplus/modules/externalUnit/entity/ExternalUnitProjectUser.java
  12. 1265 0
      src/main/java/com/jeeplus/modules/externalUnit/service/ExternalUnitCapitalDemandService.java
  13. 775 0
      src/main/java/com/jeeplus/modules/externalUnit/service/ExternalUnitFeedbackService.java
  14. 261 0
      src/main/java/com/jeeplus/modules/externalUnit/service/ExternalUnitProjectRecordsService.java
  15. 350 0
      src/main/java/com/jeeplus/modules/externalUnit/web/ExternalUnitCapitalDemandController.java
  16. 366 0
      src/main/java/com/jeeplus/modules/externalUnit/web/ExternalUnitFeedbackController.java
  17. 306 0
      src/main/java/com/jeeplus/modules/externalUnit/web/ExternalUnitProjectRecordsController.java
  18. 7 0
      src/main/java/com/jeeplus/modules/workclientinfo/dao/WorkClientAttachmentDao.java
  19. 19 0
      src/main/java/com/jeeplus/modules/workclientinfo/entity/WorkClientAttachment.java
  20. 6 0
      src/main/java/com/jeeplus/modules/workprojectnotify/dao/WorkProjectNotifyDao.java
  21. 12 3
      src/main/java/com/jeeplus/modules/workprojectnotify/service/WorkProjectNotifyService.java
  22. 112 16
      src/main/java/com/jeeplus/modules/workprojectnotify/web/WorkProjectNotifyController.java
  23. 1 1
      src/main/resources/jeeplus.properties
  24. 105 0
      src/main/resources/mappings/modules/externalUnit/ExternalUnitCapitalDemandDao.xml
  25. 105 0
      src/main/resources/mappings/modules/externalUnit/ExternalUnitFeedbackDao.xml
  26. 194 0
      src/main/resources/mappings/modules/externalUnit/ExternalUnitProjectRecordsDao.xml
  27. 21 0
      src/main/resources/mappings/modules/externalUnit/ExternalUnitProjectUserDao.xml
  28. 88 0
      src/main/resources/mappings/modules/workclientinfo/WorkClientAttachmentDao.xml
  29. 22 0
      src/main/resources/mappings/modules/workprojectnotify/WorkProjectNotifyDao.xml
  30. 18 0
      src/main/webapp/WEB-INF/tags/table/feedbackAddRow.tag
  31. 118 0
      src/main/webapp/webpage/modules/externalUnit/capitalDemandFormAdd.jsp
  32. 406 0
      src/main/webapp/webpage/modules/externalUnit/capitalDemandFormAudit.jsp
  33. 240 0
      src/main/webapp/webpage/modules/externalUnit/capitalDemandFormEdit.jsp
  34. 112 0
      src/main/webapp/webpage/modules/externalUnit/capitalDemandFormModify.jsp
  35. 15 0
      src/main/webapp/webpage/modules/externalUnit/capitalDemandTask.jsp
  36. 380 0
      src/main/webapp/webpage/modules/externalUnit/externalUnitCapitalDemandList.jsp
  37. 354 0
      src/main/webapp/webpage/modules/externalUnit/externalUnitFeedbackList.jsp
  38. 338 0
      src/main/webapp/webpage/modules/externalUnit/externalUnitFileForm.jsp
  39. 245 0
      src/main/webapp/webpage/modules/externalUnit/externalUnitProjectFile.jsp
  40. 234 0
      src/main/webapp/webpage/modules/externalUnit/externalUnitProjectRecordsForm.jsp
  41. 310 0
      src/main/webapp/webpage/modules/externalUnit/externalUnitProjectRecordsList.jsp
  42. 222 0
      src/main/webapp/webpage/modules/externalUnit/externalUnitProjectRecordsView.jsp
  43. 422 0
      src/main/webapp/webpage/modules/externalUnit/feedbackFormAdd.jsp
  44. 431 0
      src/main/webapp/webpage/modules/externalUnit/feedbackFormAudit.jsp
  45. 417 0
      src/main/webapp/webpage/modules/externalUnit/feedbackFormModify.jsp
  46. 410 0
      src/main/webapp/webpage/modules/externalUnit/feedbackFormView.jsp
  47. 15 0
      src/main/webapp/webpage/modules/externalUnit/feedbackTask.jsp

+ 1 - 0
src/main/java/com/jeeplus/common/utils/MenuStatusEnum.java

@@ -84,6 +84,7 @@ public enum MenuStatusEnum {
     DISPUTE_MEDIATION("c0ce72cbeb5d446a946795b0a3b7e4a4","纠纷调解"),
     ELECTRONIC_SIGNATURE("50cfb2ad32814623a976bb7776e87c12","电子用章管理"),
     EBUSINESS_SIGNATURE("976b008b2c0f402ea7015bb15665d1f4","业务用章管理"),
+    EXTERNAL_UNIT("024cb3e37141480ababb4d37128472a2","外部单位"),
     END("19940722131313","废弃");
 
     private String value;

+ 5 - 0
src/main/java/com/jeeplus/modules/act/service/ActTaskService.java

@@ -1141,4 +1141,9 @@ public class ActTaskService extends BaseService {
 		return  act;
 	}
 
+	public boolean turnTask(String taskId, String assignee ){
+		taskService.setAssignee(taskId,assignee);
+		return true;
+	}
+
 }

+ 6 - 0
src/main/java/com/jeeplus/modules/act/web/ActTaskController.java

@@ -234,6 +234,12 @@ public class ActTaskController extends BaseController {
 							}else if(r==null&&"bxrbc".equals(role.getEnname())){
 								a.setRoleName("报销人补充");
 								a.setAssigneeName(user.getName());
+							}else if(r==null&&"wjbc".equals(role.getEnname())){
+								a.setRoleName("提资需求补充人");
+								a.setAssigneeName(user.getName());
+							}else if(r==null&&"yjfk".equals(role.getEnname())){
+								a.setRoleName("意见反馈人");
+								a.setAssigneeName(user.getName());
 							}
 						}
 						a.setTaskName(activityProcess.getActivity().getName());

+ 15 - 0
src/main/java/com/jeeplus/modules/externalUnit/dao/ExternalUnitCapitalDemandDao.java

@@ -0,0 +1,15 @@
+package com.jeeplus.modules.externalUnit.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.externalUnit.entity.ExternalUnitCapitalDemand;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@MyBatisDao
+public interface ExternalUnitCapitalDemandDao extends CrudDao<ExternalUnitCapitalDemand> {
+    List<ExternalUnitCapitalDemand> findByProId(ExternalUnitCapitalDemand externalUnitCapitalDemand);
+
+    void updateProcessInstanceId(ExternalUnitCapitalDemand capitalDemand);
+}

+ 15 - 0
src/main/java/com/jeeplus/modules/externalUnit/dao/ExternalUnitFeedbackDao.java

@@ -0,0 +1,15 @@
+package com.jeeplus.modules.externalUnit.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.externalUnit.entity.ExternalUnitFeedback;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@MyBatisDao
+public interface ExternalUnitFeedbackDao extends CrudDao<ExternalUnitFeedback> {
+    List<ExternalUnitFeedback> findByProId(ExternalUnitFeedback feedback);
+
+    void updateProcessInstanceId(ExternalUnitFeedback feedback);
+}

+ 15 - 0
src/main/java/com/jeeplus/modules/externalUnit/dao/ExternalUnitProjectRecordsDao.java

@@ -0,0 +1,15 @@
+package com.jeeplus.modules.externalUnit.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.externalUnit.entity.ExternalUnitProjectRecords;
+import com.jeeplus.modules.sys.entity.User;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@MyBatisDao
+public interface ExternalUnitProjectRecordsDao extends CrudDao<ExternalUnitProjectRecords> {
+    public List<User> isDelFalg(@Param("projectId") String projectId, @Param("delFlag")String delFlag );
+
+}

+ 11 - 0
src/main/java/com/jeeplus/modules/externalUnit/dao/ExternalUnitProjectUserDao.java

@@ -0,0 +1,11 @@
+package com.jeeplus.modules.externalUnit.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.externalUnit.entity.ExternalUnitProjectUser;
+import org.apache.ibatis.annotations.Param;
+
+@MyBatisDao
+public interface ExternalUnitProjectUserDao extends CrudDao<ExternalUnitProjectUser> {
+    void deleteByProjectId(@Param("projectId") String projectId);
+}

+ 168 - 0
src/main/java/com/jeeplus/modules/externalUnit/entity/ExternalUnitCapitalDemand.java

@@ -0,0 +1,168 @@
+package com.jeeplus.modules.externalUnit.entity;
+
+import com.jeeplus.common.persistence.ActEntity;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+import org.activiti.engine.runtime.ProcessInstance;
+
+import java.util.List;
+
+/**
+ * 外部单位提资需求表
+ */
+public class ExternalUnitCapitalDemand extends ActEntity<ExternalUnitCapitalDemand> {
+
+    private String projectId; //项目id
+    private String processInstanceId; //流程id
+    private String status; //状态
+    private String remarks; //备注
+    private String examiner; //审核人
+    private List<WorkClientAttachment> workAttachments; //文件管理
+    private ExternalUnitProjectRecords project;
+    private List<User> projectMembers;
+
+    private String officeId;
+    private String companyId;
+
+    private String home;
+    private Office company;		// 公司ID
+    private Office office;   //部门
+
+    private String turner; //转办人
+
+    private String ext; //是否转办
+
+    public String getExt() {
+        return ext;
+    }
+
+    public void setExt(String ext) {
+        this.ext = ext;
+    }
+
+    public String getTurner() {
+        return turner;
+    }
+
+    public void setTurner(String turner) {
+        this.turner = turner;
+    }
+
+    public String getHome() {
+        return home;
+    }
+
+    public void setHome(String home) {
+        this.home = home;
+    }
+
+    public Office getCompany() {
+        return company;
+    }
+
+    public void setCompany(Office company) {
+        this.company = company;
+    }
+
+    public Office getOffice() {
+        return office;
+    }
+
+    public void setOffice(Office office) {
+        this.office = office;
+    }
+
+    // 运行中的流程实例
+    private ProcessInstance processInstance;
+
+    public ProcessInstance getProcessInstance() {
+        return processInstance;
+    }
+
+    public void setProcessInstance(ProcessInstance processInstance) {
+        this.processInstance = processInstance;
+    }
+
+    public String getOfficeId() {
+        return officeId;
+    }
+
+    public void setOfficeId(String officeId) {
+        this.officeId = officeId;
+    }
+
+    public String getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(String companyId) {
+        this.companyId = companyId;
+    }
+
+    public List<User> getProjectMembers() {
+        return projectMembers;
+    }
+
+    public void setProjectMembers(List<User> projectMembers) {
+        this.projectMembers = projectMembers;
+    }
+
+    public ExternalUnitProjectRecords getProject() {
+        return project;
+    }
+
+    public void setProject(ExternalUnitProjectRecords project) {
+        this.project = project;
+    }
+
+    public List<WorkClientAttachment> getWorkAttachments() {
+        return workAttachments;
+    }
+
+    public void setWorkAttachments(List<WorkClientAttachment> workAttachments) {
+        this.workAttachments = workAttachments;
+    }
+
+    public String getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(String projectId) {
+        this.projectId = projectId;
+    }
+
+    public String getProcessInstanceId() {
+        return processInstanceId;
+    }
+
+    public void setProcessInstanceId(String processInstanceId) {
+        this.processInstanceId = processInstanceId;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    @Override
+    public String getRemarks() {
+        return remarks;
+    }
+
+    @Override
+    public void setRemarks(String remarks) {
+        this.remarks = remarks;
+    }
+
+    public String getExaminer() {
+        return examiner;
+    }
+
+    public void setExaminer(String examiner) {
+        this.examiner = examiner;
+    }
+}

+ 154 - 0
src/main/java/com/jeeplus/modules/externalUnit/entity/ExternalUnitFeedback.java

@@ -0,0 +1,154 @@
+package com.jeeplus.modules.externalUnit.entity;
+
+import com.jeeplus.common.persistence.ActEntity;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+import org.activiti.engine.runtime.ProcessInstance;
+
+import java.util.List;
+
+public class ExternalUnitFeedback extends ActEntity<ExternalUnitFeedback> {
+
+    private String projectId; //项目id
+    private String processInstanceId; //流程id
+    private String status; //状态
+    private String remarks; //备注
+    private String examiner; //审核人
+    private String applyView; //审核意见
+    private List<WorkClientAttachment> workAttachments; //文件管理
+
+    private ExternalUnitProjectRecords project;
+    private String officeId;
+    private String companyId;
+
+    private String home;
+    private Office company;		// 公司ID
+    private Office office;   //部门
+
+    private List<String> examinerList; //审核人集合
+
+    // 运行中的流程实例
+    private ProcessInstance processInstance;
+
+    public ProcessInstance getProcessInstance() {
+        return processInstance;
+    }
+
+    public void setProcessInstance(ProcessInstance processInstance) {
+        this.processInstance = processInstance;
+    }
+
+    public List<String> getExaminerList() {
+        return examinerList;
+    }
+
+    public void setExaminerList(List<String> examinerList) {
+        this.examinerList = examinerList;
+    }
+
+    public ExternalUnitProjectRecords getProject() {
+        return project;
+    }
+
+    public void setProject(ExternalUnitProjectRecords project) {
+        this.project = project;
+    }
+
+    public String getOfficeId() {
+        return officeId;
+    }
+
+    public void setOfficeId(String officeId) {
+        this.officeId = officeId;
+    }
+
+    public String getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(String companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getHome() {
+        return home;
+    }
+
+    public void setHome(String home) {
+        this.home = home;
+    }
+
+    public Office getCompany() {
+        return company;
+    }
+
+    public void setCompany(Office company) {
+        this.company = company;
+    }
+
+    public Office getOffice() {
+        return office;
+    }
+
+    public void setOffice(Office office) {
+        this.office = office;
+    }
+
+    public List<WorkClientAttachment> getWorkAttachments() {
+        return workAttachments;
+    }
+
+    public void setWorkAttachments(List<WorkClientAttachment> workAttachments) {
+        this.workAttachments = workAttachments;
+    }
+
+    public String getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(String projectId) {
+        this.projectId = projectId;
+    }
+
+    public String getProcessInstanceId() {
+        return processInstanceId;
+    }
+
+    public void setProcessInstanceId(String processInstanceId) {
+        this.processInstanceId = processInstanceId;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    @Override
+    public String getRemarks() {
+        return remarks;
+    }
+
+    @Override
+    public void setRemarks(String remarks) {
+        this.remarks = remarks;
+    }
+
+    public String getExaminer() {
+        return examiner;
+    }
+
+    public void setExaminer(String examiner) {
+        this.examiner = examiner;
+    }
+
+    public String getApplyView() {
+        return applyView;
+    }
+
+    public void setApplyView(String applyView) {
+        this.applyView = applyView;
+    }
+}

+ 265 - 0
src/main/java/com/jeeplus/modules/externalUnit/entity/ExternalUnitProjectRecords.java

@@ -0,0 +1,265 @@
+package com.jeeplus.modules.externalUnit.entity;
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.entity.Workattachment;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+
+import java.util.Date;
+import java.util.List;
+
+public class ExternalUnitProjectRecords extends DataEntity<ExternalUnitProjectRecords> {
+    private static final long serialVersionUID = 1L;
+
+    private String name; //项目名称
+    private String projectBuilder; //建设方
+    private String buildPlace; //建设地点
+    private String remarks; //备注
+    private String projectMember;
+
+    private String createName;   //创建人
+    private String createNameStr;   //创建人
+    private String createOffice;   //创建人部门
+    private String createId;     //创建人id
+
+    private String companyId;
+    private String officeId;
+
+    private Date beginDate;
+    private Date endDate;
+
+    private List<User> projectMembers;  //项目组成员
+    private String memberNameStr;
+    private String memberIds;
+
+    private Office company;
+    private Office office;
+
+    private String isProjectMember;
+
+    private List<WorkClientAttachment> workAttachments; //文件管理
+    private List<ExternalUnitCapitalDemand> capitalDemandList; //提资需求
+    private List<ExternalUnitFeedback> feedbackList; //意见反馈
+
+
+    /**
+     * 文件管理查询页
+     * @return
+     */
+    private String fileName; //文件名
+    private String fileSubmiter; //上传人
+    private Date fileBeginDate;
+    private Date fileEndDate;
+
+
+    public String getFileName() {
+        return fileName;
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+
+    public String getFileSubmiter() {
+        return fileSubmiter;
+    }
+
+    public void setFileSubmiter(String fileSubmiter) {
+        this.fileSubmiter = fileSubmiter;
+    }
+
+    public Date getFileBeginDate() {
+        return fileBeginDate;
+    }
+
+    public void setFileBeginDate(Date fileBeginDate) {
+        this.fileBeginDate = fileBeginDate;
+    }
+
+    public Date getFileEndDate() {
+        return fileEndDate;
+    }
+
+    public void setFileEndDate(Date fileEndDate) {
+        this.fileEndDate = fileEndDate;
+    }
+
+    public List<WorkClientAttachment> getWorkAttachments() {
+        return workAttachments;
+    }
+
+    public void setWorkAttachments(List<WorkClientAttachment> workAttachments) {
+        this.workAttachments = workAttachments;
+    }
+
+    public List<ExternalUnitCapitalDemand> getCapitalDemandList() {
+        return capitalDemandList;
+    }
+
+    public void setCapitalDemandList(List<ExternalUnitCapitalDemand> capitalDemandList) {
+        this.capitalDemandList = capitalDemandList;
+    }
+
+    public List<ExternalUnitFeedback> getFeedbackList() {
+        return feedbackList;
+    }
+
+    public void setFeedbackList(List<ExternalUnitFeedback> feedbackList) {
+        this.feedbackList = feedbackList;
+    }
+
+    public String getIsProjectMember() {
+        return isProjectMember;
+    }
+
+    public void setIsProjectMember(String isProjectMember) {
+        this.isProjectMember = isProjectMember;
+    }
+
+    public Office getCompany() {
+        return company;
+    }
+
+    public void setCompany(Office company) {
+        this.company = company;
+    }
+
+    public Office getOffice() {
+        return office;
+    }
+
+    public void setOffice(Office office) {
+        this.office = office;
+    }
+
+    public List<User> getProjectMembers() {
+        return projectMembers;
+    }
+
+    public void setProjectMembers(List<User> projectMembers) {
+        this.projectMembers = projectMembers;
+    }
+
+    public String getMemberNameStr() {
+        return memberNameStr;
+    }
+
+    public void setMemberNameStr(String memberNameStr) {
+        this.memberNameStr = memberNameStr;
+    }
+
+    public String getMemberIds() {
+        return memberIds;
+    }
+
+    public void setMemberIds(String memberIds) {
+        this.memberIds = memberIds;
+    }
+
+    public String getCreateName() {
+        return createName;
+    }
+
+    public void setCreateName(String createName) {
+        this.createName = createName;
+    }
+
+    public String getCreateNameStr() {
+        return createNameStr;
+    }
+
+    public void setCreateNameStr(String createNameStr) {
+        this.createNameStr = createNameStr;
+    }
+
+    public String getCreateOffice() {
+        return createOffice;
+    }
+
+    public void setCreateOffice(String createOffice) {
+        this.createOffice = createOffice;
+    }
+
+    public String getCreateId() {
+        return createId;
+    }
+
+    public void setCreateId(String createId) {
+        this.createId = createId;
+    }
+
+    public String getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(String companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getOfficeId() {
+        return officeId;
+    }
+
+    public void setOfficeId(String officeId) {
+        this.officeId = officeId;
+    }
+
+    public Date getBeginDate() {
+        return beginDate;
+    }
+
+    public void setBeginDate(Date beginDate) {
+        this.beginDate = beginDate;
+    }
+
+    public Date getEndDate() {
+        return endDate;
+    }
+
+    public void setEndDate(Date endDate) {
+        this.endDate = endDate;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getProjectBuilder() {
+        return projectBuilder;
+    }
+
+    public void setProjectBuilder(String projectBuilder) {
+        this.projectBuilder = projectBuilder;
+    }
+
+    public String getBuildPlace() {
+        return buildPlace;
+    }
+
+    public void setBuildPlace(String buildPlace) {
+        this.buildPlace = buildPlace;
+    }
+
+    @Override
+    public String getRemarks() {
+        return remarks;
+    }
+
+    @Override
+    public void setRemarks(String remarks) {
+        this.remarks = remarks;
+    }
+
+    public String getProjectMember() {
+        return projectMember;
+    }
+
+    public void setProjectMember(String projectMember) {
+        this.projectMember = projectMember;
+    }
+}

+ 26 - 0
src/main/java/com/jeeplus/modules/externalUnit/entity/ExternalUnitProjectUser.java

@@ -0,0 +1,26 @@
+package com.jeeplus.modules.externalUnit.entity;
+
+import com.jeeplus.common.persistence.DataEntity;
+
+public class ExternalUnitProjectUser extends DataEntity<ExternalUnitProjectUser> {
+
+    private String userId;
+    private String projectId;
+
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(String projectId) {
+        this.projectId = projectId;
+    }
+}

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1265 - 0
src/main/java/com/jeeplus/modules/externalUnit/service/ExternalUnitCapitalDemandService.java


+ 775 - 0
src/main/java/com/jeeplus/modules/externalUnit/service/ExternalUnitFeedbackService.java

@@ -0,0 +1,775 @@
+package com.jeeplus.modules.externalUnit.service;
+
+import com.google.common.collect.Maps;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.externalUnit.dao.ExternalUnitFeedbackDao;
+import com.jeeplus.modules.externalUnit.entity.ExternalUnitCapitalDemand;
+import com.jeeplus.modules.externalUnit.entity.ExternalUnitFeedback;
+import com.jeeplus.modules.externalUnit.entity.ExternalUnitProjectRecords;
+import com.jeeplus.modules.signatureManagement.electronicSignature.entity.DistrictDirectorApplication;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.service.WorkattachmentService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workactivity.dao.WorkActivityProcessDao;
+import com.jeeplus.modules.workactivity.entity.Activity;
+import com.jeeplus.modules.workactivity.entity.WorkActivityProcess;
+import com.jeeplus.modules.workactivity.service.ActivityService;
+import com.jeeplus.modules.workactivity.service.WorkActivityProcessService;
+import com.jeeplus.modules.workactivitymenu.entity.WorkActivityMenu;
+import com.jeeplus.modules.workactivitymenu.service.WorkActivityMenuService;
+import com.jeeplus.modules.workclientinfo.dao.WorkClientAttachmentDao;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+import com.jeeplus.modules.workprojectnotify.entity.WorkProjectNotify;
+import com.jeeplus.modules.workprojectnotify.service.WorkProjectNotifyService;
+import com.jeeplus.modules.workprojectnotify.util.UtilNotify;
+import org.activiti.engine.ActivitiObjectNotFoundException;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+
+@Service
+@Transactional(readOnly = true)
+public class ExternalUnitFeedbackService extends CrudService<ExternalUnitFeedbackDao, ExternalUnitFeedback> {
+
+    @Autowired
+    private ExternalUnitFeedbackDao feedbackDao;
+    @Autowired
+    private ExternalUnitProjectRecordsService projectRecordsService;
+    @Autowired
+    private WorkattachmentService workattachmentService;
+    @Autowired
+    private WorkClientAttachmentDao workClientAttachmentDao;
+    @Autowired
+    protected WorkActivityMenuService workActivityMenuService;
+
+    @Autowired
+    private OfficeService officeService;
+
+    @Autowired
+    protected WorkActivityProcessService workActivityProcessService;
+
+    @Autowired
+    protected WorkProjectNotifyService workProjectNotifyService;
+    @Autowired
+    private RuntimeService runtimeService;
+    @Autowired
+    private WorkActivityProcessDao workActivityProcessDao;
+    @Autowired
+    private ActTaskService actTaskService;
+    @Autowired
+    private ActivityService activityService;
+
+
+    public ExternalUnitFeedback get(String id) {
+        ExternalUnitFeedback capitalDemand = super.get(id);
+        if (capitalDemand != null){
+            ExternalUnitProjectRecords externalUnitProjectRecords = projectRecordsService.get(capitalDemand.getProjectId());
+            capitalDemand.setProject(externalUnitProjectRecords);
+            //查询附件
+            WorkClientAttachment workClientAttachment = new WorkClientAttachment();
+            workClientAttachment.setAttachmentId(capitalDemand.getId());
+            workClientAttachment.setAttachmentFlag("160");
+            workClientAttachment.setDivIdType("_exterFeedback");
+            List<WorkClientAttachment> attachmentList = workattachmentService.getAttachmentList(workClientAttachment);
+            capitalDemand.setWorkAttachments(attachmentList);
+            //审核人
+            ArrayList<String> strings = new ArrayList<>();
+            if (StringUtils.isNotBlank(capitalDemand.getExaminer())){
+                if (capitalDemand.getExaminer().contains(",")){
+                    String[] split = capitalDemand.getExaminer().split(",");
+                    for (String s : split) {
+                        strings.add(s);
+                    }
+                }else {
+                    strings.add(capitalDemand.getExaminer());
+                }
+            }
+            capitalDemand.setExaminerList(strings);
+        }
+
+        return capitalDemand;
+    }
+
+
+    /**
+     * 意见反馈列表页面
+     * @param page
+     * @param projectRecords
+     * @return
+     */
+    public Page<ExternalUnitFeedback> getFeedbackList(Page<ExternalUnitFeedback> page, ExternalUnitProjectRecords projectRecords) {
+        ExternalUnitFeedback feedback = new ExternalUnitFeedback();
+        feedback.setProjectId(projectRecords.getId());
+        int count = feedbackDao.queryCount(feedback);
+        page.setCount(count);
+        page.setCountFlag(false);
+        feedback.setPage(page);
+        List<ExternalUnitFeedback> capitalDemandList = feedbackDao.findByProId(feedback);
+        page.setList(capitalDemandList);
+        return page;
+
+    }
+
+    /**
+     * 暂存 意见反馈
+     * @param feedback
+
+     */
+    @Transactional(readOnly = false)
+    public void save(ExternalUnitFeedback feedback) {
+        //保存审核人
+        String ids = "";
+        if (feedback.getExaminerList().size() != 0){
+            for (String examine : feedback.getExaminerList()) {
+                ids += examine + ",";
+            }
+            String newIds = ids.substring(0,ids.lastIndexOf(","));
+            feedback.setExaminer(newIds);
+        }
+
+        super.save(feedback);
+        //保存附件
+        if (CollectionUtils.isNotEmpty(feedback.getWorkAttachments())){
+            for (WorkClientAttachment workClientAttachment : feedback.getWorkAttachments()){
+                if (workClientAttachment.getId() == null){
+                    continue;
+                }
+                if (WorkClientAttachment.DEL_FLAG_NORMAL.equals(workClientAttachment.getDelFlag())){
+                    workClientAttachment.setAttachmentId(feedback.getId());
+                    workClientAttachment.setAttachmentFlag("160");
+                    workClientAttachment.setAttachmentUser(UserUtils.getUser().getId());
+                    if (StringUtils.isBlank(workClientAttachment.getId()) || "null".equals(workClientAttachment.getId())){
+                        workattachmentService.insertOnWorkClientAttachment(workClientAttachment);
+                    }else{
+                        workattachmentService.updateOnWorkClientAttachment(workClientAttachment);
+                    }
+                }else{
+                    workClientAttachmentDao.delete(workClientAttachment);
+                }
+            }
+        }
+
+    }
+
+
+    /**
+     * 保存 意见反馈
+     * @param feedback
+     * @param variables
+     * @param processInstanceId
+     */
+    @Transactional(readOnly = false)
+    public String saveBranch(ExternalUnitFeedback feedback, Map<String, Object> variables, String processInstanceId) {
+        String officeId = UserUtils.getUser().getOffice().getId();
+        Office office = officeService.get(officeId);
+        feedback.setOfficeId(officeId);
+        String companyId = UserUtils.getUser().getCompany().getId();
+        feedback.setCompanyId(companyId);
+        //保存审核人
+        String ids = "";
+        if (feedback.getExaminerList().size() != 0){
+            for (String examine : feedback.getExaminerList()) {
+                ids += examine + ",";
+            }
+            String newIds = ids.substring(0,ids.lastIndexOf(","));
+            feedback.setExaminer(newIds);
+        }
+        super.save(feedback);
+        String str = "";
+        String title = "项目-"+feedback.getProject().getName()+"意见反馈待审批";
+        str = "项目-"+feedback.getProject().getName()+"意见反馈待审批";
+
+        // 启动流程
+        String businessKey = feedback.getId().toString();
+        WorkActivityMenu workActivityMenu = workActivityMenuService.findByParentAndOffice("ggh3125f1f194c82bdea00005c750905",officeService.get(feedback.getOfficeId()));
+        // 启动流程
+        String processType = workActivityMenu.getProcessType();
+        StringBuffer buffer = new StringBuffer();
+        Activity activity = new Activity();
+        WorkProjectNotify workProjectNotify = UtilNotify
+                .saveNotify(feedback.getId(),
+                        null,
+                        feedback.getCompanyId(),
+                        title,
+                        str,
+                        "311", //对应之后的判断
+                        "0",
+                        "待审批",
+                        ""  //通知角色
+                );
+        long s6=System.currentTimeMillis();
+        List<User> users = new ArrayList<>();
+        List<User> jyfk = new ArrayList<>();
+        //审核人
+        for (String s : feedback.getExaminerList()) {
+            User user = UserUtils.get(s);
+            jyfk.add(user);
+        }
+
+        long s7=System.currentTimeMillis();
+        if (StringUtils.isNotBlank(workActivityMenu.getId())) {
+            workProjectNotify.setNotifyRole("");
+            workActivityMenu = workActivityMenuService.get(workActivityMenu.getId());
+            List<Activity> activities = workActivityMenu.getActivities();
+            for (Activity a : activities) {
+                String encount = a.getEncount();
+                String enlist = a.getEnlist();
+                if (a.getRole()!=null && StringUtils.isNotBlank(a.getRole().getEnname())){
+                    List enusers = UserUtils.getByRoleActivityEnnames(a.getRole().getEnname(),office.getId(),"5",feedback.getCreateBy());
+                    if (enusers.size()==0){
+                        feedback.setStatus("1");//暂存
+                        this.save(feedback);
+                        return "流程审批人不能为空,角色"+a.getRole().getName()+"下无用户,请联系管理员!";
+                    }
+                    variables.put(enlist, enusers);
+                    variables.put(encount, enusers.size());
+                }
+                if (a.getDelFlag().equals("0") && a.getCount() == 1) {
+                    activity = a;
+                }
+            }
+            buffer.append(activity.getRole().getEnname());
+            if (activity != null && StringUtils.isNotBlank(activity.getId())) {
+                //角色审批
+                if (StringUtils.isNotBlank(activity.getRole().getEnname())) {
+                    users = UserUtils.getByRoleActivityEnnames(activity.getRole().getEnname(),office.getId(),"5",feedback.getCreateBy());
+                }
+                //人员审批
+                if (StringUtils.isNotBlank(activity.getUser().getId())) {
+                    users.add(activity.getUser());
+                }
+            }
+            workProjectNotify.setId("");
+        } else {
+            if (jyfk.size()==0 ){
+                feedback.setStatus("1");//暂存
+                this.save(feedback);
+            }
+            if (jyfk.size()==0){
+                return "流程审批人不能为空,请联系管理员!";
+            }
+            variables.put("yjfkCount",jyfk.size());
+            variables.put("yjfkList",jyfk);
+            processType = "feedback";
+            users.addAll(jyfk);
+        }
+        for (User user : users){
+            workProjectNotify.setUser(user);
+            workProjectNotify.setId("");
+            workProjectNotifyService
+                    .save(workProjectNotify);
+            Map<String,Object> extras = new HashMap<>();
+            extras.put("type","7002");
+            extras.put("id",workProjectNotify.getId());
+            extras.put("procDefKey","311");
+            UserUtils.pushInfoToApp(title,str,extras,user.getId());
+            UserUtils.pushIm(user.getId(),str);
+        }
+        variables.put("type", processType);
+        variables.put("busId", businessKey);
+        variables.put("title", "项目-"+feedback.getProject().getName()+"意见反馈待审批");//设置标题;
+        long s8=System.currentTimeMillis();
+        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processType, businessKey, variables);
+        feedback.setProcessInstance(processInstance);
+        long s9=System.currentTimeMillis();
+        if (StringUtils.isNotBlank(processInstanceId)) {
+            workActivityProcessService.updateProcessInstanceId(processInstance.getId(),processInstanceId);
+            workActivityProcessService.deleteProcessInstanceId(processInstanceId);
+            workActivityProcessService.deleteProcessIdAuditUsers(processInstanceId);
+        }
+        long s10=System.currentTimeMillis();
+        // 更新流程实例ID
+        feedback.setProcessInstanceId(processInstance.getId());
+        feedbackDao.updateProcessInstanceId(feedback);
+        //通知添加流程实例ID
+        workProjectNotify.setProcessInstanceId(processInstance.getId());
+        workProjectNotify.setWapBeginDate(new Date());
+        workProjectNotifyService.save(workProjectNotify);
+        List<Activity> list = workActivityMenu.getActivities();
+        long s11=System.currentTimeMillis();
+        if (list != null && list.size() != 0) {
+            workActivityProcessService.saveList(list, processInstance.getId());
+        } else {
+            WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+            workActivityProcess.setProcessKey("feedback");
+            workActivityProcess.setCount(1);
+            workActivityProcess.setProcessInstanceId(processInstance.getId());
+            workActivityProcess.setIsApproval("0");
+            workActivityProcessService.save(workActivityProcess);
+				/*workActivityProcess.setCount(2);
+				workActivityProcess.setId("");
+				workActivityProcessService.save(workActivityProcess);*/
+            workActivityProcessService.insertAuditsByType(jyfk,processInstance.getId(),1,1);
+            //workActivityProcessService.insertAuditsByType(fpglys,processInstance.getId(),2,0);
+        }
+        //保存附件
+        if (CollectionUtils.isNotEmpty(feedback.getWorkAttachments())){
+            for (WorkClientAttachment workClientAttachment : feedback.getWorkAttachments()){
+                if (workClientAttachment.getId() == null){
+                    continue;
+                }
+                if (WorkClientAttachment.DEL_FLAG_NORMAL.equals(workClientAttachment.getDelFlag())){
+                    workClientAttachment.setAttachmentId(feedback.getId());
+                    workClientAttachment.setAttachmentFlag("160");
+                    workClientAttachment.setAttachmentUser(UserUtils.getUser().getId());
+                    if (StringUtils.isBlank(workClientAttachment.getId()) || "null".equals(workClientAttachment.getId())){
+                        workattachmentService.insertOnWorkClientAttachment(workClientAttachment);
+                    }else{
+                        workattachmentService.updateOnWorkClientAttachment(workClientAttachment);
+                    }
+                }else{
+                    workClientAttachmentDao.delete(workClientAttachment);
+                }
+            }
+        }
+
+
+        return "";
+    }
+
+    /*8
+    审核
+     */
+    @Transactional(readOnly = false)
+    public String auditSaveBranch(ExternalUnitFeedback feedback, List<User> auditUsers) {
+        String userName = UserUtils.get(feedback.getCreateBy().getId()).getName();
+        Office office = officeService.get(feedback.getOfficeId());
+        String str =  "意见反馈申请";
+        String title = "意见反馈申请";
+        // 对不同环节的业务逻辑进行操作
+        String taskDefKey = feedback.getAct().getTaskDefKey();
+        if (!"modifyApply".equals(taskDefKey)) {
+            actTaskService.claim(feedback.getAct().getTaskId(), UserUtils.getUser().getId());
+        }else {
+            feedback.getAct().setFlag("yes");
+        }
+        String comment = "";
+        if (feedback.getStatus().equals("4")){
+            comment = ("yes".equals(feedback.getAct().getFlag())?"[重新申请] ":"[已撤销] ");
+        }else {
+            comment = ("yes".equals(feedback.getAct().getFlag())?"[同意] ":"[驳回] ")+feedback.getAct().getComment();
+        }
+        //yes 的时候状态为审核通过 否则为未通过
+        feedback.setStatus(("yes".equals(feedback.getAct().getFlag()) ? "2" : "4"));
+        Map<String, Object> vars = Maps.newHashMap();
+        //业务逻辑对应的条件表达式
+        String exp = "";
+        String taskCount = "";
+        String notifyRole = "";
+        int key = 0;
+        String enname = "";
+        List<Activity> activitieList = activityService.getByProcessInstanceId(feedback.getProcessInstanceId());
+        WorkActivityMenu workActivityMenu = new WorkActivityMenu();
+        if (activitieList != null && activitieList.size() != 0) {
+            workActivityMenu.setProcessType(activitieList.get(0).getProcessKey());
+            workActivityMenu.setActivities(activitieList);
+        }
+
+        WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+        WorkActivityProcess selectProcess = new WorkActivityProcess();
+        selectProcess.setProcessInstanceId(feedback.getProcessInstanceId());
+        List<WorkActivityProcess> workActivityProcesses = workActivityProcessService.findList(selectProcess);
+        List<Activity> activities = workActivityMenu.getActivities();
+        if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("feedback")) {
+            key = 1;
+            for (int i = 0; i < workActivityProcesses.size(); i++) {
+                WorkActivityProcess activityProcess = workActivityProcesses.get(i);
+                if (taskDefKey.equals(activityProcess.getActivityTask()) && !taskDefKey.equals("modifyApply")) {
+                    taskCount = activityProcess.getCount()+"";
+                    workActivityProcess = activityProcess;
+                    if (!workActivityProcess.getIsApproval().equals("0")) {
+                        workActivityProcess.setId("");
+                    }
+                    exp = "pass";
+                    if (!"yes".equals(feedback.getAct().getFlag())) {
+                        feedback.setStatus("4");
+                        workActivityProcess.setIsApproval("2");
+                        String returnBack = "-1";
+                        for (Activity activity : activities) {
+                            if (activity.getCount() == activityProcess.getCount()) {
+                                notifyRole = activity.getName();
+                                returnBack = activity.getReturnBack();
+                                break;
+                            }
+                        }
+                        if (returnBack.equals("0")) {
+                            workActivityProcess.setId("");
+                        }
+
+                    } else {
+                        workActivityProcess.setIsApproval("1");
+                    }
+                }else if(taskDefKey.equals("modifyApply")){
+                    notifyRole = "调整申请";
+                    taskCount = "0";
+                    exp = "pass";
+                    workActivityProcess.setId("");
+                    workActivityProcess.setCount(0);
+                    if (!"yes".equals(feedback.getAct().getFlag())) {
+                        feedback.setStatus("3");
+                        workActivityProcess.setIsApproval("2");
+                    } else {
+                        workActivityProcess.setIsApproval("1");
+                    }
+                    break;
+                }
+            }
+        } else {
+            workActivityMenu.setProcessType("feedback");
+            for (int i = 0; i < workActivityProcesses.size(); i++) {
+                WorkActivityProcess activityProcess = workActivityProcesses.get(i);
+                String count = activityProcess.getCount() + "";
+                workActivityProcess = activityProcess;
+                if (!workActivityProcess.getIsApproval().equals("0")) {
+                    workActivityProcess.setId("");
+                }
+                // 审核环节
+                if ("yjfk".equals(taskDefKey) && count.contains("1")) {
+                    taskCount = "1";
+                    exp = "pass";
+                    if ("yes".equals(feedback.getAct().getFlag())) {
+                        //审核通过处理
+
+                        notifyRole = "项目-"+feedback.getProject().getName()+"-发起人:"+userName+"意见反馈审核完成";
+                        workActivityProcess.setIsApproval("1");
+                    } else {
+                        workActivityProcess.setIsApproval("2");
+                    }
+                    break;
+                } else if ("modifyApply".equals(taskDefKey)&& count.contains("0")) {
+                    notifyRole = "意见反馈审批";
+                    taskCount = "0";
+                    exp = "pass";
+                    workActivityProcess.setCount(0);
+                    enname ="yjfk";
+                    if (!"yes".equals(feedback.getAct().getFlag())) {
+                        feedback.setStatus("3");
+                    }
+                    break;
+                } else if ("apply_end".equals(taskDefKey)) {
+                }
+
+            }
+        }
+        Boolean state = null;
+
+        WorkProjectNotify nowWorkProjectNotify = workProjectNotifyService.processingInfo(feedback.getProcessInstanceId());
+
+        // 设置意见
+        feedback.getAct().setComment(("yes".equals(feedback.getAct().getFlag()) ? "[同意] " : "[驳回] ") + feedback.getAct().getComment());
+        feedback.preUpdate();
+
+        // 提交流程任务
+        vars.put(exp, "yes".equals(feedback.getAct().getFlag()) ? true : false);
+        vars.put("passs", true);
+
+        workActivityProcessService.updateProcess(workActivityProcess,workActivityMenu,key,taskCount,feedback.getProcessInstanceId(),taskDefKey,"modifyApply",feedback.getAct().getFlag(),comment, activities);
+        // 提交流程任务
+        actTaskService.complete(feedback.getAct().getTaskId(), feedback.getAct().getProcInsId(), feedback.getAct().getComment(), vars);
+        state = actTaskService.isProcessEnd(feedback.getAct().getProcInsId());
+
+
+        List<User> users = new ArrayList<>();
+        List<User> userList = new ArrayList<>();
+        if (!state) {
+            str =  "项目-"+feedback.getProject().getName()+"-发起人:"+userName+"意见反馈申请成功" ;
+            title = "项目-"+feedback.getProject().getName()+"-发起人:"+userName+"意见反馈申请成功";
+            users.add(feedback.getCreateBy());
+            if ("yes".equals(feedback.getAct().getFlag())) {
+                feedback.setStatus("5");
+                WorkProjectNotify notify = new WorkProjectNotify();
+                notify.setNotifyId(feedback.getId());
+                notify.setAuditor(UserUtils.getUser().getId());
+                userList = workProjectNotifyService.readByNotifyId(notify);
+                workProjectNotifyService
+                        .save(UtilNotify
+                                .saveNewNotify(feedback.getId(),
+                                        feedback.getCreateBy(),
+                                        feedback.getCompanyId(),
+                                        title,
+                                        str,
+                                        "311",
+                                        "0",
+                                        "待通知",
+                                        notifyRole,
+                                        feedback.getProcessInstanceId(),new Date()));
+
+            } else {
+                WorkProjectNotify notify = new WorkProjectNotify();
+                notify.setNotifyId(feedback.getId());
+                userList = workProjectNotifyService.readByNotifyId(notify);
+                if (StringUtils.isNotBlank(feedback.getStatus()) && !feedback.getStatus().equals("3")){
+                    feedback.setStatus("4");
+                    workProjectNotifyService
+                            .save(UtilNotify
+                                    .saveNewNotify(feedback.getId(),
+                                            feedback.getCreateBy(),
+                                            feedback.getCompanyId(),
+                                            title,
+                                            str,
+                                            "311",
+                                            "0",
+                                            "待通知",
+                                            notifyRole,
+                                            feedback.getProcessInstanceId(),new Date()));
+                }
+            }
+            workActivityProcessService.deleteProcessIdAuditUsers(feedback.getProcessInstanceId());
+        }else{
+            if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("yjfk")) {
+                WorkProjectNotify notify = new WorkProjectNotify();
+                notify.setNotifyId(feedback.getId());
+                notify.setAuditor(UserUtils.getUser().getId());
+                userList = workProjectNotifyService.readByNotifyId(notify);
+                WorkProjectNotify workProjectNotify = UtilNotify
+                        .saveNewNotify(feedback.getId(),
+                                new User(),
+                                feedback.getCompanyId(),
+                                title,
+                                str,
+                                "311",
+                                "0",
+                                "待审批",
+                                notifyRole,
+                                feedback.getProcessInstanceId(),new Date());
+                List<WorkProjectNotify> workProjectNotifys = activityService.getByFlagAndTaskDefKeyList(
+                        activities,
+                        workProjectNotify,
+                        taskDefKey,
+                        feedback.getAct().getFlag(),
+                        taskCount,
+                        feedback.getCreateBy(),
+                        feedback.getOfficeId(),
+                        "5");
+                for (WorkProjectNotify workProjectNotify1:workProjectNotifys){
+                    users.add(workProjectNotify1.getUser());
+                    workProjectNotify1.setId("");
+                    workProjectNotify1.setIsNewRecord(false);
+                    workProjectNotifyService
+                            .save(workProjectNotify1);
+                    if (!"modifyApply".equals(taskDefKey)){
+                        Map<String,Object> extras = new HashMap<>();
+                        if ("yjfk".equals(taskDefKey) ){
+                            extras.put("type","7001");
+                        }else {
+                            extras.put("type","7002");
+                        }
+                        extras.put("id",workProjectNotify.getId());
+                        extras.put("procDefKey","311");
+                        UserUtils.pushInfoToApp(title,str,extras,workProjectNotify1.getUser().getId());
+
+                    }
+                }
+
+            } else {
+                if (!"yes".equals(feedback.getAct().getFlag())) {//驳回待办提醒
+                    title = "项目-"+feedback.getProject().getName()+"-发起人:"+userName+"意见反馈申请被驳回";
+                    str = "项目-"+feedback.getProject().getName()+"-发起人:"+userName+"意见反馈申请被驳回,请重新申请";
+                    WorkProjectNotify notify = new WorkProjectNotify();
+                    notify.setNotifyId(feedback.getId());
+                    userList = workProjectNotifyService.readByNotifyId(notify);
+                    workProjectNotifyService
+                            .save(UtilNotify
+                                    .saveNewNotify(feedback.getId(),
+                                            feedback.getCreateBy(),
+                                            feedback.getCompanyId(),
+                                            title,
+                                            str,
+                                            "311",
+                                            "0",
+                                            "重新申请",
+                                            notifyRole,
+                                            feedback.getProcessInstanceId(),new Date()));
+                    users.add( feedback.getCreateBy());
+                } else {
+                    if (StringUtils.isNotBlank(enname)) {//驳回重新申请待办
+                        title = "项目-"+feedback.getProject().getName()+"-发起人:"+userName+"意见反馈重新申请,待审批";
+                        str = "项目-"+feedback.getProject().getName()+"-发起人:"+userName+"意见反馈重新申请,待审批";
+                        WorkProjectNotify notify = new WorkProjectNotify();
+                        notify.setNotifyId(feedback.getId());
+                        userList = workProjectNotifyService.readByNotifyId(notify);
+                        WorkProjectNotify workProjectNotify = UtilNotify
+                                .saveNewNotify(feedback.getId(),
+                                        new User(),
+                                        feedback.getCompanyId(),
+                                        title,
+                                        str,
+                                        "311",
+                                        "0",
+                                        "待审批",
+                                        notifyRole,
+                                        feedback.getProcessInstanceId(),new Date());
+                        for (User user1:auditUsers){
+                            users.add(user1);
+                            workProjectNotify.setUser(user1);
+                            workProjectNotify.setId("");
+                            workProjectNotify.setIsNewRecord(false);
+                            workProjectNotifyService
+                                    .save(workProjectNotify);
+                            if (!"modifyApply".equals(taskDefKey)){
+                                Map<String,Object> extras = new HashMap<>();
+                                if ("yjfk".equals(taskDefKey)){
+                                    extras.put("type","7001");
+                                }else {
+                                    extras.put("type","7002");
+                                }
+                                extras.put("id",workProjectNotify.getId());
+                                extras.put("procDefKey","311");
+                                UserUtils.pushInfoToApp(title,str,extras,user1.getId());
+
+                            }
+                        }
+                    }else {
+                        WorkProjectNotify notify = new WorkProjectNotify();
+                        notify.setNotifyId(feedback.getId());
+                        userList = workProjectNotifyService.readByNotifyId(notify);
+                        users.addAll(userList);
+                        users.add(feedback.getCreateBy());
+                        workProjectNotifyService
+                                .save(UtilNotify
+                                        .saveNewNotify(feedback.getId(),
+                                                feedback.getCreateBy(),
+                                                feedback.getCompanyId(),
+                                                title,
+                                                str,
+                                                "311",
+                                                "0",
+                                                "重新申请",
+                                                notifyRole,
+                                                feedback.getProcessInstanceId(),new Date()));
+                    }
+                }
+            }
+        }
+        //对数据进行处理
+        if(null != nowWorkProjectNotify){
+            workProjectNotifyService.updateWpaData(nowWorkProjectNotify);
+        }
+        if (users!=null && users.size()!=0) {
+            for (User u : users) {
+                UserUtils.pushIm(u.getId(),str);
+            }
+        }
+        if (userList!=null && userList.size()!=0) {
+            for (User u : userList) {
+                UserUtils.pushMeIm(u.getId());
+            }
+        }
+        //保存审核人
+        String ids = "";
+        if (feedback.getExaminerList().size() != 0){
+            for (String examine : feedback.getExaminerList()) {
+                ids += examine + ",";
+            }
+            String newIds = ids.substring(0,ids.lastIndexOf(","));
+            feedback.setExaminer(newIds);
+        }
+        dao.update(feedback);
+        //保存附件
+        if (CollectionUtils.isNotEmpty(feedback.getWorkAttachments())){
+            for (WorkClientAttachment workClientAttachment : feedback.getWorkAttachments()){
+                if (workClientAttachment.getId() == null){
+                    continue;
+                }
+                if (WorkClientAttachment.DEL_FLAG_NORMAL.equals(workClientAttachment.getDelFlag())){
+                    workClientAttachment.setAttachmentId(feedback.getId());
+                    workClientAttachment.setAttachmentFlag("160");
+                    workClientAttachment.setAttachmentUser(UserUtils.getUser().getId());
+                    if (StringUtils.isBlank(workClientAttachment.getId()) || "null".equals(workClientAttachment.getId())){
+                        workattachmentService.insertOnWorkClientAttachment(workClientAttachment);
+                    }else{
+                        workattachmentService.updateOnWorkClientAttachment(workClientAttachment);
+                    }
+                }else{
+                    workClientAttachmentDao.delete(workClientAttachment);
+                }
+            }
+        }
+        return "保存审核意见成功!";
+
+    }
+
+
+    /**
+     * 撤回
+     * @param feedback
+     */
+    @Transactional(readOnly = false)
+    public void cancelInvalidate(ExternalUnitFeedback feedback) {
+        try {
+            String invalidateProcessInstanceId = feedback.getProcessInstanceId();
+            //将流程图中尚未走到的task的流程追踪信息逻辑删除,添加一条"撤销"流程追踪信息
+            WorkActivityProcess process = new WorkActivityProcess();
+            process.setProcessInstanceId(feedback.getProcessInstanceId());
+            process.setIsApproval("0");
+            WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+            workActivityProcess.setProcessInstanceId(feedback.getProcessInstanceId());
+            List<WorkActivityProcess> processList = workActivityProcessService.findList(workActivityProcess);
+            WorkProjectNotify notify = new WorkProjectNotify();
+            notify.setNotifyId(feedback.getId());
+            List<User> userList = workProjectNotifyService.readByNotifyId(notify);
+            if (userList!=null && userList.size()!=0) {
+                for (User u : userList) {
+                    User user = UserUtils.get(u.getId());
+                    UserUtils.pushMeIm(user.getId());
+                }
+            }
+            if(processList!=null && processList.size()>0){
+                for (int i =0;i<processList.size();i++) {
+                    WorkActivityProcess p = processList.get(i);
+                    if(com.jeeplus.common.utils.StringUtils.isNotBlank(p.getIsApproval()) && "0".equals(p.getIsApproval())){
+                        p.setDelFlag("1");
+                        p.setIsApproval("-1");
+                        workActivityProcessDao.updateDelFlagAndIsApproval(p);
+                    }
+                }
+                WorkActivityProcess pro = new WorkActivityProcess();
+                pro.setId("");
+                pro.preInsert();
+                pro.setDelFlag("0");
+                pro.setRemarks("[强制撤销]");
+                pro.setProcessKey(processList.get(0).getProcessKey());
+                pro.setIsApproval("1");
+                pro.setProcessInstanceId(processList.get(0).getProcessInstanceId());
+                pro.setCount(0);
+                workActivityProcessDao.insert(pro);
+            }
+
+            //结束该流程,设为"撤销"状态
+            actTaskService.endProcessInstance(invalidateProcessInstanceId,"意见反馈申请-强制撤销");
+            feedback.setStatus("3");
+            feedback.preUpdate();
+            dao.update(feedback);
+
+        }catch (ActivitiObjectNotFoundException e){
+            System.err.println("意见反馈申请撤销异常,因为这个流程已不存在!");
+            e.printStackTrace();
+            logger.error("Exception e:"+e);
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+            logger.error("Exception e:"+e);
+        }
+    }
+
+    /**
+     * 删除操作
+     * @param feedback
+     * @return
+     */
+    @Transactional(readOnly = false)
+    public void delete(ExternalUnitFeedback feedback){
+        //删除数据
+        dao.delete(feedback);
+    }
+}

+ 261 - 0
src/main/java/com/jeeplus/modules/externalUnit/service/ExternalUnitProjectRecordsService.java

@@ -0,0 +1,261 @@
+package com.jeeplus.modules.externalUnit.service;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.common.utils.Collections3;
+import com.jeeplus.common.utils.IdGen;
+import com.jeeplus.common.utils.MenuStatusEnum;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.examplesingle.entity.ExampleSingle;
+import com.jeeplus.modules.externalUnit.dao.ExternalUnitCapitalDemandDao;
+import com.jeeplus.modules.externalUnit.dao.ExternalUnitFeedbackDao;
+import com.jeeplus.modules.externalUnit.dao.ExternalUnitProjectRecordsDao;
+import com.jeeplus.modules.externalUnit.dao.ExternalUnitProjectUserDao;
+import com.jeeplus.modules.externalUnit.entity.ExternalUnitCapitalDemand;
+import com.jeeplus.modules.externalUnit.entity.ExternalUnitFeedback;
+import com.jeeplus.modules.externalUnit.entity.ExternalUnitProjectRecords;
+import com.jeeplus.modules.externalUnit.entity.ExternalUnitProjectUser;
+
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.WorkattachmentService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workclientinfo.dao.WorkClientAttachmentDao;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+@Transactional(readOnly = true)
+public class ExternalUnitProjectRecordsService extends CrudService<ExternalUnitProjectRecordsDao, ExternalUnitProjectRecords> {
+
+    @Autowired
+    private ExternalUnitProjectRecordsDao unitProjectRecordsDao;
+
+    @Autowired
+    private ExternalUnitProjectUserDao projectUserDao;
+
+    @Autowired
+    private WorkattachmentService workattachmentService;
+
+    @Autowired
+    private ExternalUnitCapitalDemandDao capitalDemandDao;
+
+    @Autowired
+    private ExternalUnitFeedbackDao feedbackDao;
+
+    @Autowired
+    private WorkClientAttachmentDao workClientAttachmentDao;
+
+
+    public ExternalUnitProjectRecords get(String id) {
+        return super.get(id);
+    }
+
+
+    public Page<ExternalUnitProjectRecords> findPage(Page<ExternalUnitProjectRecords> page,ExternalUnitProjectRecords unitProjectRecords){
+        if(!UserUtils.getUser().isAdmin()) {
+            String dataScopeSql = dataScopeFilterOR(unitProjectRecords.getCurrentUser(), "o", "u", "s", MenuStatusEnum.EXTERNAL_UNIT.getValue());
+            unitProjectRecords.getSqlMap().put("dsf", dataScopeSql);
+            unitProjectRecords.getSqlMap().put("delFlag", "AND a.del_flag = 0");
+        }
+        int count = dao.queryCount(unitProjectRecords);
+        page.setCount(count);
+        page.setCountFlag(false);
+        unitProjectRecords.setPage(page);
+        List<ExternalUnitProjectRecords> recordsList = findList(unitProjectRecords);
+        //获取当前登陆人
+        User user = UserUtils.getUser();
+        for (ExternalUnitProjectRecords records : recordsList) {
+            if (records.getProjectMember().contains(user.getId())){
+                    records.setIsProjectMember("true");
+            }else {
+                records.setIsProjectMember("false");
+            }
+        }
+        page.setList(recordsList);
+        return page;
+    }
+
+    public List<ExternalUnitProjectRecords> findList(ExternalUnitProjectRecords projectRecords) {
+        return super.findList(projectRecords);
+    }
+
+    public void queryUserNames(ExternalUnitProjectRecords projectRecords) {
+        //查询项目组成员信息
+        List<User> members = unitProjectRecordsDao.isDelFalg(projectRecords.getId(), "");
+        projectRecords.setProjectMembers(members);
+        projectRecords.setMemberNameStr(Collections3.extractToString(members, "name", ","));
+        projectRecords.setMemberIds(Collections3.extractToString(members, "id", ","));
+    }
+
+    /**
+     * 修改  新增项目信息
+     * @param projectRecords
+     */
+    @Transactional(readOnly = false)
+    public void saveProject(ExternalUnitProjectRecords projectRecords) {
+        Office company= new Office();
+        Office office =  new Office();
+        company.setId(UserUtils.getUser().getCompany().getId());
+        office.setId(UserUtils.getUser().getOffice().getId());
+        projectRecords.setCompany(company);
+        projectRecords.setOffice(office);
+        if (StringUtils.isNotBlank(projectRecords.getMemberIds())){
+            if (projectRecords.getMemberIds().contains(",")){
+                projectRecords.setProjectMember(projectRecords.getMemberIds().substring(0,projectRecords.getMemberIds().lastIndexOf(",")));
+            }else {
+                projectRecords.setProjectMember(projectRecords.getMemberIds());
+            }
+        }else {
+            projectRecords.setProjectMember("");
+        }
+        //保存项目基本信息
+        if (StringUtils.isBlank(projectRecords.getId())){
+            projectRecords.preInsert();
+            unitProjectRecordsDao.insert(projectRecords);
+        }else {
+            super.save(projectRecords);
+        }
+        //先进行一次删除
+        projectUserDao.deleteByProjectId(projectRecords.getId());
+        if (StringUtils.isNotBlank(projectRecords.getMemberIds())){
+            //保存项目组成员
+            ExternalUnitProjectUser externalUnitProjectUser = new ExternalUnitProjectUser();
+            if (projectRecords.getMemberIds().contains(",")){
+                String substring = projectRecords.getMemberIds().substring(0, projectRecords.getMemberIds().lastIndexOf(","));
+                String[] split = substring.split(",");
+                for (String s : split) {
+                    externalUnitProjectUser.setProjectId(projectRecords.getId());
+                    externalUnitProjectUser.setUserId(s);
+                    externalUnitProjectUser.setDelFlag("0");
+                    projectUserDao.insert(externalUnitProjectUser);
+                }
+            }else {
+                externalUnitProjectUser.setProjectId(projectRecords.getId());
+                externalUnitProjectUser.setUserId(projectRecords.getMemberIds());
+                externalUnitProjectUser.setDelFlag("0");
+                projectUserDao.insert(externalUnitProjectUser);
+            }
+
+        }
+
+    }
+
+    /**
+     * 查看详情
+     * @param projectRecords
+     */
+    public void queryProjectDetail(ExternalUnitProjectRecords projectRecords) {
+        ExternalUnitProjectRecords externalUnitProjectRecords = unitProjectRecordsDao.get(projectRecords.getId());
+        projectRecords.setName(externalUnitProjectRecords.getName());
+        projectRecords.setProjectBuilder(externalUnitProjectRecords.getProjectBuilder());
+        projectRecords.setBuildPlace(externalUnitProjectRecords.getBuildPlace());
+        projectRecords.setCreateName(externalUnitProjectRecords.getCreateBy().getName());
+        projectRecords.setRemarks(externalUnitProjectRecords.getRemarks());
+        //查询项目组成员信息
+        List<User> members = unitProjectRecordsDao.isDelFalg(projectRecords.getId(), "");
+        projectRecords.setProjectMembers(members);
+        projectRecords.setMemberNameStr(Collections3.extractToString(members, "name", ","));
+        projectRecords.setMemberIds(Collections3.extractToString(members, "id", ","));
+    }
+
+    /**
+     * 获取项目文件信息
+     * @param projectRecords
+     * @return
+     */
+    public Page<WorkClientAttachment> getProjectFile(Page<WorkClientAttachment> page, ExternalUnitProjectRecords projectRecords) {
+        //获取文件管理
+        WorkClientAttachment workClientAttachment = new WorkClientAttachment();
+        workClientAttachment.setProjectId(projectRecords.getId());
+        workClientAttachment.setAttachmentFlag("160");
+        workClientAttachment.setAttachmentUser(projectRecords.getFileSubmiter());
+        workClientAttachment.setAttachmentName(projectRecords.getFileName());
+        workClientAttachment.setBeginDate(projectRecords.getFileBeginDate());
+        workClientAttachment.setEndDate(projectRecords.getFileEndDate());
+        int count = workClientAttachmentDao.queryFileCount(workClientAttachment);
+        page.setCount(count);
+        page.setCountFlag(false);
+        workClientAttachment.setPage(page);
+        List<WorkClientAttachment> attachmentList = workClientAttachmentDao.getFileList(workClientAttachment);
+        page.setList(attachmentList);
+
+        return page;
+    }
+
+    /**
+     * 查询无流程文件
+     * @param projectRecords
+     */
+    public void getNoProcessFile(ExternalUnitProjectRecords projectRecords) {
+        WorkClientAttachment workClientAttachment = new WorkClientAttachment();
+        workClientAttachment.setAttachmentId(projectRecords.getId());
+        workClientAttachment.setAttachmentFlag("160");
+        workClientAttachment.setDivIdType("_exterNoProcess");
+        List<WorkClientAttachment> attachmentList = workattachmentService.getAttachmentList(workClientAttachment);
+        projectRecords.setWorkAttachments(attachmentList);
+    }
+
+    /**
+     * 保存无流程附件
+     * @param projectRecords
+     */
+    @Transactional(readOnly = false)
+    public void saveFile(ExternalUnitProjectRecords projectRecords) {
+        if (CollectionUtils.isNotEmpty(projectRecords.getWorkAttachments())){
+            for (WorkClientAttachment workClientAttachment : projectRecords.getWorkAttachments()){
+                if (workClientAttachment.getId() == null){
+                    continue;
+                }
+                if (WorkClientAttachment.DEL_FLAG_NORMAL.equals(workClientAttachment.getDelFlag())){
+                    workClientAttachment.setAttachmentId(projectRecords.getId());
+                    workClientAttachment.setAttachmentFlag("160");
+                    workClientAttachment.setAttachmentUser(UserUtils.getUser().getId());
+                    workClientAttachment.setProjectId(projectRecords.getId());
+                    if (StringUtils.isBlank(workClientAttachment.getId()) || "null".equals(workClientAttachment.getId())){
+                        workattachmentService.insertOnWorkClientAttachment(workClientAttachment);
+                    }else{
+                        workattachmentService.updateOnWorkClientAttachment(workClientAttachment);
+                    }
+                }else{
+                    workClientAttachmentDao.delete(workClientAttachment);
+                }
+            }
+        }
+    }
+
+    /**
+     * 查询提资需求列表
+     * @param page
+     * @param projectRecords
+     * @return
+     */
+    public Page<ExternalUnitCapitalDemand> getCapitalDemandList(Page<ExternalUnitCapitalDemand> page, ExternalUnitProjectRecords projectRecords) {
+        ExternalUnitCapitalDemand externalUnitCapitalDemand = new ExternalUnitCapitalDemand();
+        externalUnitCapitalDemand.setProjectId(projectRecords.getId());
+        int count = capitalDemandDao.queryCount(externalUnitCapitalDemand);
+        page.setCount(count);
+        page.setCountFlag(false);
+        externalUnitCapitalDemand.setPage(page);
+        List<ExternalUnitCapitalDemand> capitalDemandList = capitalDemandDao.findByProId(externalUnitCapitalDemand);
+        page.setList(capitalDemandList);
+
+        return page;
+    }
+
+    /**
+     * 获取项目组成员
+     * @param projectId
+     * @return
+     */
+    public List<User> getProjectMembers(String projectId) {
+        List<User> members = unitProjectRecordsDao.isDelFalg(projectId, "");
+        return members;
+    }
+}

+ 350 - 0
src/main/java/com/jeeplus/modules/externalUnit/web/ExternalUnitCapitalDemandController.java

@@ -0,0 +1,350 @@
+package com.jeeplus.modules.externalUnit.web;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Maps;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.act.entity.Act;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.externalUnit.entity.ExternalUnitCapitalDemand;
+import com.jeeplus.modules.externalUnit.entity.ExternalUnitProjectRecords;
+import com.jeeplus.modules.externalUnit.service.ExternalUnitCapitalDemandService;
+import com.jeeplus.modules.externalUnit.service.ExternalUnitProjectRecordsService;
+import com.jeeplus.modules.signatureManagement.electronicSignature.entity.DistrictDirectorApplication;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import org.activiti.engine.TaskService;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.DelegationState;
+import org.activiti.engine.task.Task;
+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
+@RequestMapping(value = "${adminPath}/externalUnit/capitalDemand")
+public class ExternalUnitCapitalDemandController extends BaseController {
+
+    @Autowired
+    private ExternalUnitCapitalDemandService capitalDemandService;
+
+    @Autowired
+    private ExternalUnitProjectRecordsService unitProjectRecordsService;
+
+    @Autowired
+    private ActTaskService actTaskService;
+
+    @Autowired
+    private OfficeService officeService;
+
+    @Autowired
+    private TaskService taskService;
+
+    @ModelAttribute
+    public ExternalUnitCapitalDemand get(@RequestParam(required=false) String id) {
+        ExternalUnitCapitalDemand entity = null;
+        if (StringUtils.isNotBlank(id)){
+            entity = capitalDemandService.get(id);
+        }
+        if (entity == null){
+            entity = new ExternalUnitCapitalDemand();
+        }
+        return entity;
+    }
+
+    /**
+     * 提资需求列表
+     * @param projectRecords
+     * @param model
+     * @return
+     */
+    @RequestMapping(value = "capitalDemand")
+    public String capitalDemand(ExternalUnitProjectRecords projectRecords, HttpServletRequest request, HttpServletResponse response, Model model) {
+        ExternalUnitProjectRecords externalUnitProjectRecords = new ExternalUnitProjectRecords();
+        if (null != projectRecords.getId()){
+            externalUnitProjectRecords = unitProjectRecordsService.get(projectRecords.getId());
+            model.addAttribute("projectRecords",externalUnitProjectRecords);
+        }
+
+        Page<ExternalUnitCapitalDemand> page = unitProjectRecordsService.getCapitalDemandList(new Page<ExternalUnitCapitalDemand>(request, response),projectRecords);
+
+
+        model.addAttribute("page", page);
+        return "modules/externalUnit/externalUnitCapitalDemandList";
+    }
+
+    /*8
+   查看,增加,编辑提资需求表单页面
+    */
+    @RequestMapping(value = "demandForm")
+    public String demandForm(ExternalUnitCapitalDemand capitalDemand,Model model){
+        String view = "capitalDemandFormAdd";
+        //驳回状态数据操作
+        if (StringUtils.isNotBlank(capitalDemand.getId())&&("4").equals(capitalDemand.getStatus())){
+            capitalDemand = capitalDemandService.get(capitalDemand.getId());
+            ProcessInstance procIns = actTaskService.getProcIns(capitalDemand.getProcessInstanceId());
+            if (procIns != null){
+                Task currentTaskInfo = actTaskService.getCurrentTaskInfo(procIns);
+                Act act = new Act();
+                act.setTaskId(currentTaskInfo.getId());
+                act.setTaskName(currentTaskInfo.getName());
+                act.setTaskDefKey(currentTaskInfo.getTaskDefinitionKey());
+                act.setProcDefId(currentTaskInfo.getProcessDefinitionId());
+                act.setProcInsId(currentTaskInfo.getProcessInstanceId());
+                act.setTask(currentTaskInfo);
+                capitalDemand.setAct(act);
+                view = "capitalDemandFormModify";
+            }
+        }else if (StringUtils.isNotBlank(capitalDemand.getId())&&!("4").equals(capitalDemand.getStatus())){
+            capitalDemand = capitalDemandService.get(capitalDemand.getId());
+        }
+        //项目基本信息
+        ExternalUnitProjectRecords externalUnitProjectRecords = unitProjectRecordsService.get(capitalDemand.getProjectId());
+        capitalDemand.setProject(externalUnitProjectRecords);
+        //项目组成员
+        ArrayList<User> users = new ArrayList<>();
+        if (StringUtils.isNotBlank(externalUnitProjectRecords.getProjectMember())){
+            if (externalUnitProjectRecords.getProjectMember().contains(",")){
+                String[] split = externalUnitProjectRecords.getProjectMember().split(",");
+                for (String s : split) {
+                    User user = UserUtils.get(s);
+                    users.add(user);
+                }
+            }else {
+                User user = UserUtils.get(externalUnitProjectRecords.getProjectMember());
+                users.add(user);
+            }
+        }
+
+        model.addAttribute("capitalDemand", capitalDemand);
+        model.addAttribute("projectMembers", users);
+        return "modules/externalUnit/" + view;
+    }
+
+    /**
+     * 暂存  提资需求
+     * @param capitalDemand
+     * @param model
+     * @param redirectAttributes
+     * @return
+     * @throws Exception
+     */
+    @RequestMapping(value = "store")
+    @ResponseBody
+    public Object store(ExternalUnitCapitalDemand capitalDemand, Model model, RedirectAttributes redirectAttributes) throws Exception{
+        Map<String,Object> map = new HashMap<>();
+        if (!beanValidator(model, capitalDemand)){
+            return demandForm(capitalDemand, model);
+        }
+        User user = capitalDemand.getCreateBy();
+        String submitter = "";
+        if(user != null){
+            submitter = user.getId();
+        }
+        String sta = capitalDemand.getStatus();
+        if(!UserUtils.getUser().getId().equals(submitter) && !Strings.isNullOrEmpty(submitter) && sta != null){
+            map.put("str","您不是申请人,无法修改!");
+            return map;
+        }
+        if(!capitalDemand.getIsNewRecord()){//编辑表单保存
+            ExternalUnitCapitalDemand t = capitalDemandService.get(capitalDemand.getId());//从数据库取出记录的值
+            MyBeanUtils.copyBeanNotNull2Bean(capitalDemand, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+            capitalDemandService.save(t);//保存
+        }else{//新增表单保存
+            capitalDemand.setCompanyId(UserUtils.getSelectCompany().getId());
+            capitalDemand.setOfficeId(UserUtils.getSelectOffice().getId());
+            capitalDemand.setStatus("1");
+            capitalDemandService.save(capitalDemand);//保存
+        }
+        map.put("str","保存成功!");
+        return map;
+    }
+
+
+
+    /**
+     * 保存提资需求并启动流程
+     * @param capitalDemand
+     * @param model
+     * @param attributes
+     * @return
+     * @throws Exception
+     */
+    @RequestMapping(value = "saveDemand")
+    @ResponseBody
+    public Object saveDemand(ExternalUnitCapitalDemand capitalDemand, Model model, RedirectAttributes attributes)throws Exception{
+        Map<String,Object> map = new HashMap<>();
+        if (!beanValidator(model, capitalDemand)){
+            return demandForm(capitalDemand, model);
+        }
+
+        User user = capitalDemand.getCreateBy();
+        String State = capitalDemand.getStatus();
+        if(user!=null && !UserUtils.getUser().getId().equals(user.getId()) && StringUtils.isNotBlank(user.getId())){
+            map.put("str","您不是申请人,无法修改!");
+            return map;
+        }
+        //启动流程
+        capitalDemand.setStatus("2");
+        String processInstanceId ="";
+        if (user!=null && StringUtils.isNotBlank(user.getId()) && StringUtils.isNotBlank(State) && "3".equals(State)){
+            processInstanceId = capitalDemandService.get(capitalDemand.getId()).getProcessInstanceId();
+        }
+        try{
+            Map<String, Object> variables = Maps.newHashMap();
+            capitalDemand.setCompanyId(UserUtils.getSelectCompany().getId());
+            capitalDemand.setOfficeId(UserUtils.getSelectOffice().getId());
+            capitalDemandService.saveDemandBranch(capitalDemand, variables,processInstanceId);
+
+        }catch (Exception e){
+            logger.error("Exception e:"+e);
+        }
+        map.put("str","申请成功!");
+        return map;
+
+    }
+
+
+    /**
+     * 提资需求审核
+     */
+    @RequestMapping(value = "saveAuditDemand")
+    public String auditDemand(ExternalUnitCapitalDemand capitalDemand, Model model,
+                              RedirectAttributes redirectAttributes){
+        try{
+            // 对不同环节的业务逻辑进行操作
+            String taskDefKey = capitalDemand.getAct().getTaskDefKey();
+            List<User> users = null;
+            //所属部门
+            Office office = officeService.get(capitalDemand.getOfficeId());
+            if ("wjbc".equals(taskDefKey)){
+                users = UserUtils.getByProssType(capitalDemand.getProcessInstanceId(), 1);
+                if (users == null)
+                    users = UserUtils.getByRoleActivityEnname("wjbc", 2, office.getId(), "5", capitalDemand.getCreateBy());
+
+            }else if ("modifyApply".equals(taskDefKey)){
+                users = UserUtils.getByProssType(capitalDemand.getProcessInstanceId(), 1);
+            }
+            String flag = capitalDemand.getAct().getFlag();
+            if ("yes".equals(flag) && (users==null || users.size()==0)){
+                addMessage(redirectAttributes, "审批失败,审批人为空,请联系管理员!");
+            }else {
+                //获取当前的任务节点
+                List<Task> tasks = taskService.createTaskQuery().taskId(capitalDemand.getAct().getTaskId()).list();
+                Task task = tasks.get(0);
+                String str = "";
+                if ("no".equals(flag)){
+                    //判断当前的审核节点是否加签
+                    if (task.getDelegationState() == DelegationState.PENDING){
+                        str = capitalDemandService.OtherAudit(capitalDemand,users);
+                        addMessage(redirectAttributes, str);
+                    }else {
+                        str = capitalDemandService.auditSaveBranch(capitalDemand,users);
+                        addMessage(redirectAttributes, str);
+                    }
+                }else {
+                    //判断是否转办  0: 转办  1:不转办
+                    if (capitalDemand.getExt().equals("0")){
+                        str = capitalDemandService.turnToOther(capitalDemand);
+                        addMessage(redirectAttributes, str);
+                    }else {
+                        if (task.getDelegationState() == DelegationState.PENDING){
+                            str = capitalDemandService.OtherAudit(capitalDemand,users);
+                            addMessage(redirectAttributes, str);
+                        }else {
+                            str = capitalDemandService.auditSaveBranch(capitalDemand,users);
+                            addMessage(redirectAttributes, str);
+                        }
+                    }
+                }
+
+            }
+        }catch (Exception e){
+            addMessage(redirectAttributes, "审批失败:");
+            logger.error("Exception e:"+e);
+        }
+
+        if (StringUtils.isNotBlank(capitalDemand.getHome()) && "home".equals(capitalDemand.getHome())){
+            return "redirect:" + Global.getAdminPath() + "/home/?repage";
+        }else if (StringUtils.isNotBlank(capitalDemand.getHome()) && "notifyList".equals(capitalDemand.getHome())){
+            return "redirect:" + Global.getAdminPath() + "/workprojectnotify/workProjectNotify/list/?repage";
+        }else {
+            return "redirect:"+Global.getAdminPath()+"/externalUnit/externalUnit/?repage";
+        }
+    }
+
+    @RequestMapping(value = "getDemandProcess")
+    public String getDemandProcess(ExternalUnitCapitalDemand capitalDemand, Model model, HttpServletRequest request){
+        model.addAttribute("processInstanceId", capitalDemand.getProcessInstanceId());
+        return "modules/externalUnit/capitalDemandTask";
+    }
+
+    /**
+     * 撤回操作
+     * @param request
+     * @param redirectAttributes
+     * @return
+     * @throws Exception
+     */
+    @RequestMapping(value = "revoke")
+    @ResponseBody
+    public Object revoke(ExternalUnitCapitalDemand capitalDemand) throws Exception {
+        Map<String,Object> map = new HashMap<>();
+
+        try {
+            capitalDemand = capitalDemandService.get(capitalDemand.getId());
+            if("3".equals(capitalDemand.getStatus()) || "4".equals(capitalDemand.getStatus())){
+                map.put("str","提资需求申请已撤回、驳回,请勿重复操作");
+                map.put("success",false);
+                return map;
+            }else if("5".equals(capitalDemand.getStatus())){
+                map.put("str","提资需求已审批通过,无法撤回");
+                map.put("success",false);
+                return map;
+            }
+            capitalDemandService.cancelInvalidate(capitalDemand);
+            map.put("str", "撤回该提资需求申请成功");
+            map.put("success",true);
+        }catch (Exception e){
+            logger.info(e.getMessage());
+            map.put("str", "撤回该提资需求申请失败");
+            map.put("success",false);
+        }
+        return map;
+    }
+
+    /**
+     * 删除提资需求申请
+     * @param capitalDemand
+     * @param redirectAttributes
+     * @return
+     */
+    @RequestMapping(value = "delete")
+    @ResponseBody
+    public Object delete(ExternalUnitCapitalDemand capitalDemand, RedirectAttributes redirectAttributes) {
+        Map<String,Object> map = new HashMap<>();
+
+        capitalDemandService.delete(capitalDemand);
+        map.put("str",  "删除成功");
+        map.put("success",true);
+        return map;
+    }
+
+}

+ 366 - 0
src/main/java/com/jeeplus/modules/externalUnit/web/ExternalUnitFeedbackController.java

@@ -0,0 +1,366 @@
+package com.jeeplus.modules.externalUnit.web;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Maps;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.json.AjaxJson;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.act.entity.Act;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.externalUnit.entity.ExternalUnitCapitalDemand;
+import com.jeeplus.modules.externalUnit.entity.ExternalUnitFeedback;
+import com.jeeplus.modules.externalUnit.entity.ExternalUnitProjectRecords;
+import com.jeeplus.modules.externalUnit.service.ExternalUnitFeedbackService;
+import com.jeeplus.modules.externalUnit.service.ExternalUnitProjectRecordsService;
+import com.jeeplus.modules.signatureManagement.electronicSignature.entity.DistrictDirectorApplication;
+import com.jeeplus.modules.sys.entity.MainDictDetail;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+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
+@RequestMapping(value = "${adminPath}/externalUnit/feedback")
+public class ExternalUnitFeedbackController extends BaseController {
+
+    @Autowired
+    private ExternalUnitFeedbackService feedbackService;
+
+    @Autowired
+    private ExternalUnitProjectRecordsService unitProjectRecordsService;
+
+    @Autowired
+    private ActTaskService actTaskService;
+
+    @Autowired
+    private OfficeService officeService;
+
+    @ModelAttribute
+    public ExternalUnitFeedback get(@RequestParam(required=false) String id) {
+        ExternalUnitFeedback entity = null;
+        if (StringUtils.isNotBlank(id)){
+            entity = feedbackService.get(id);
+        }
+        if (entity == null){
+            entity = new ExternalUnitFeedback();
+        }
+        return entity;
+    }
+
+    /**
+     * 意见反馈列表
+     * @param projectRecords
+     * @param model
+     * @return
+     */
+    @RequestMapping(value = {"list"})
+    public String feedback(ExternalUnitProjectRecords projectRecords, HttpServletRequest request, HttpServletResponse response, Model model) {
+        ExternalUnitProjectRecords externalUnitProjectRecords = new ExternalUnitProjectRecords();
+        if (null != projectRecords.getId()){
+            externalUnitProjectRecords = unitProjectRecordsService.get(projectRecords.getId());
+            model.addAttribute("projectRecords",externalUnitProjectRecords);
+        }
+        Page<ExternalUnitFeedback> page = feedbackService.getFeedbackList(new Page<ExternalUnitFeedback>(request,response),projectRecords);
+
+        model.addAttribute("page", page);
+        return "modules/externalUnit/externalUnitFeedbackList";
+    }
+
+    /*8
+   查看,增加,编辑意见反馈表单页面
+    */
+    @RequestMapping(value = "form")
+    public String form(ExternalUnitFeedback feedback,Model model){
+        String view = "feedbackFormAdd";
+        //驳回状态数据操作
+        if (StringUtils.isNotBlank(feedback.getId())&&("4").equals(feedback.getStatus())){
+            feedback = feedbackService.get(feedback.getId());
+            ProcessInstance procIns = actTaskService.getProcIns(feedback.getProcessInstanceId());
+            if (procIns != null){
+                Task currentTaskInfo = actTaskService.getCurrentTaskInfo(procIns);
+                Act act = new Act();
+                act.setTaskId(currentTaskInfo.getId());
+                act.setTaskName(currentTaskInfo.getName());
+                act.setTaskDefKey(currentTaskInfo.getTaskDefinitionKey());
+                act.setProcDefId(currentTaskInfo.getProcessDefinitionId());
+                act.setProcInsId(currentTaskInfo.getProcessInstanceId());
+                act.setTask(currentTaskInfo);
+                feedback.setAct(act);
+                view = "feedbackFormModify";
+            }
+        }else if (StringUtils.isNotBlank(feedback.getId())&&!("4").equals(feedback.getStatus())){
+            feedback = feedbackService.get(feedback.getId());
+        }
+        //项目基本信息
+        ExternalUnitProjectRecords externalUnitProjectRecords = unitProjectRecordsService.get(feedback.getProjectId());
+        feedback.setProject(externalUnitProjectRecords);
+
+
+        model.addAttribute("feedback", feedback);
+        return "modules/externalUnit/" + view;
+    }
+
+
+    /**
+     * 暂存  意见反馈
+     * @param feedback
+     * @param model
+     * @param redirectAttributes
+     * @return
+     * @throws Exception
+     */
+    @RequestMapping(value = "store")
+    @ResponseBody
+    public Object store(ExternalUnitFeedback feedback, Model model, RedirectAttributes redirectAttributes) throws Exception{
+        Map<String,Object> map = new HashMap<>();
+
+        if (!beanValidator(model, feedback)){
+            return form(feedback, model);
+        }
+        User user = feedback.getCreateBy();
+        String submitter = "";
+        if(user != null){
+            submitter = user.getId();
+        }
+        String sta = feedback.getStatus();
+        if(!UserUtils.getUser().getId().equals(submitter) && !Strings.isNullOrEmpty(submitter) && sta != null){
+            map.put("str","您不是申请人,无法修改!");
+            return map;
+        }
+        if(!feedback.getIsNewRecord()){//编辑表单保存
+            ExternalUnitFeedback t = feedbackService.get(feedback.getId());//从数据库取出记录的值
+            MyBeanUtils.copyBeanNotNull2Bean(feedback, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+            feedbackService.save(t);//保存
+        }else{//新增表单保存
+            feedback.setCompanyId(UserUtils.getSelectCompany().getId());
+            feedback.setOfficeId(UserUtils.getSelectOffice().getId());
+            feedback.setStatus("1");
+            feedbackService.save(feedback);//保存
+        }
+        map.put("str","保存成功!");
+        return map;
+    }
+
+
+    /**
+     * 保存并启动流程
+     * @param feedback
+     * @param model
+     * @param attributes
+     * @return
+     * @throws Exception
+     */
+    @RequestMapping(value = "save")
+    @ResponseBody
+    public Object save(ExternalUnitFeedback feedback, Model model, RedirectAttributes attributes)throws Exception{
+        Map<String,Object> map = new HashMap<>();
+
+        if (!beanValidator(model, feedback)){
+            return form(feedback, model);
+        }
+
+        User user = feedback.getCreateBy();
+        String State = feedback.getStatus();
+        if(user!=null && !UserUtils.getUser().getId().equals(user.getId()) && StringUtils.isNotBlank(user.getId())){
+            map.put("str","您不是申请人,无法修改!");
+            return map;
+        }
+        //启动流程
+        feedback.setStatus("2");
+        String processInstanceId ="";
+        if (user!=null && StringUtils.isNotBlank(user.getId()) && StringUtils.isNotBlank(State) && "3".equals(State)){
+            processInstanceId = feedbackService.get(feedback.getId()).getProcessInstanceId();
+        }
+        try{
+            Map<String, Object> variables = Maps.newHashMap();
+            feedback.setCompanyId(UserUtils.getSelectCompany().getId());
+            feedback.setOfficeId(UserUtils.getSelectOffice().getId());
+            feedbackService.saveBranch(feedback, variables,processInstanceId);
+
+        }catch (Exception e){
+
+            logger.error("Exception e:"+e);
+        }
+        map.put("str","申请成功!");
+        return map;
+
+    }
+
+    /**
+     * 工单执行(完成任务)
+     * @param
+     * @param model
+     * @return
+     */
+    @RequestMapping(value = "saveAudit")
+    public String saveAudit(ExternalUnitFeedback feedback, Model model,
+                            RedirectAttributes redirectAttributes) {
+        Map<String,Object> map = new HashMap<>();
+
+        try{
+            // 对不同环节的业务逻辑进行操作
+            String taskDefKey = feedback.getAct().getTaskDefKey();
+            List<User> users = null;
+            //所属部门
+            Office office = officeService.get(feedback.getOfficeId());
+            if ("yjfk".equals(taskDefKey)){
+                users = UserUtils.getByProssType(feedback.getProcessInstanceId(), 1);
+                if (users == null)
+                    users = UserUtils.getByRoleActivityEnname("yjfk", 2, office.getId(), "5", feedback.getCreateBy());
+
+            }else if ("modifyApply".equals(taskDefKey)){
+                users = UserUtils.getByProssType(feedback.getProcessInstanceId(), 1);
+            }
+            String flag = feedback.getAct().getFlag();
+            if ("yes".equals(flag) && (users==null || users.size()==0)){
+                map.put("str", "审批失败,审批人为空,请联系管理员!");
+            }else {
+                String str = "";
+                str = feedbackService.auditSaveBranch(feedback,users);
+                addMessage(redirectAttributes, str);
+            }
+        }catch (Exception e){
+            map.put("str", "审批失败:");
+            logger.error("Exception e:"+e);
+        }
+
+        if (StringUtils.isNotBlank(feedback.getHome()) && "home".equals(feedback.getHome())){
+            return "redirect:" + Global.getAdminPath() + "/home/?repage";
+        }else if (StringUtils.isNotBlank(feedback.getHome()) && "notifyList".equals(feedback.getHome())){
+            return "redirect:" + Global.getAdminPath() + "/workprojectnotify/workProjectNotify/list/?repage";
+        }else {
+            return "redirect:"+Global.getAdminPath()+"/externalUnit/externalUnit/?repage";
+        }
+    }
+
+
+    /**
+     * 流程记录
+     * @param feedback
+     * @param model
+     * @param request
+     * @return
+     */
+    @RequestMapping(value = "getProcess")
+    public String getProcess(ExternalUnitFeedback feedback, Model model, HttpServletRequest request){
+        model.addAttribute("processInstanceId", feedback.getProcessInstanceId());
+        return "modules/externalUnit/feedbackTask";
+    }
+
+    /**
+     * 撤回操作
+     * @return
+     * @throws Exception
+     */
+    @RequestMapping(value = "revoke")
+    @ResponseBody
+    public Object revoke(ExternalUnitFeedback feedback) throws Exception {
+        Map<String,Object> map = new HashMap<>();
+        feedback = feedbackService.get(feedback.getId());
+        try {
+            if("3".equals(feedback.getStatus()) || "4".equals(feedback.getStatus())){
+                map.put("str","意见反馈申请已撤回、驳回,请勿重复操作");
+                map.put("success",false);
+
+                return map;
+            }else if("5".equals(feedback.getStatus())){
+                map.put("str","意见反馈已审批通过,无法撤回");
+                map.put("success",false);
+                return map;
+            }
+            feedbackService.cancelInvalidate(feedback);
+            map.put("str", "撤回该意见反馈申请成功");
+            map.put("success",true);
+        }catch (Exception e){
+            logger.info(e.getMessage());
+            map.put("str", "撤回该意见反馈申请失败");
+            map.put("success",false);
+        }
+        return map;
+    }
+
+    /**
+     * 删除
+     * @param feedback
+     * @param redirectAttributes
+     * @return
+     */
+    @RequestMapping(value = "delete")
+    @ResponseBody
+    public Object delete(ExternalUnitFeedback feedback, RedirectAttributes redirectAttributes) {
+        Map<String,Object> map = new HashMap<>();
+
+        feedbackService.delete(feedback);
+        map.put("str",  "删除成功");
+        map.put("success",true);
+        return map;
+    }
+
+    /**
+     * 详情
+     */
+    @RequestMapping(value = "detail")
+    public String detail(ExternalUnitFeedback feedback,Model model){
+        //项目基本信息
+        ExternalUnitProjectRecords externalUnitProjectRecords = unitProjectRecordsService.get(feedback.getProjectId());
+        feedback.setProject(externalUnitProjectRecords);
+
+        model.addAttribute("feedback", feedback);
+        return "modules/externalUnit/feedbackFormView";
+    }
+
+    /**
+     * 查询审核人
+     * @return
+     */
+    @RequestMapping("getAuditerById")
+    @ResponseBody
+    public AjaxJson getAuditerById(String id){
+        AjaxJson ajaxJson = new AjaxJson();
+        try {
+            ExternalUnitFeedback feedback = feedbackService.get(id);
+            List<Map<String, Object>> mapList = new ArrayList<>();
+            if (StringUtils.isNotBlank(feedback.getExaminer())){
+                if (feedback.getExaminer().contains(",")){
+                    String[] split = feedback.getExaminer().split(",");
+                    for (String s : split) {
+                        Map<String, Object> map = new HashMap<>();
+                        map.put("value", s);
+                        mapList.add(map);
+                    }
+                }else {
+                    Map<String, Object> map = new HashMap<>();
+                    map.put("value", feedback.getExaminer());
+                    mapList.add(map);
+                }
+            }
+            ajaxJson.getBody().put("list", mapList);
+            ajaxJson.setMsg("获取数据成功");
+        } catch (Exception e) {
+            logger.error("获取数据异常!", e);
+            ajaxJson.setSuccess(false);
+            ajaxJson.setMsg("获取数据异常");
+        }
+        return ajaxJson;
+    }
+}

+ 306 - 0
src/main/java/com/jeeplus/modules/externalUnit/web/ExternalUnitProjectRecordsController.java

@@ -0,0 +1,306 @@
+package com.jeeplus.modules.externalUnit.web;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Maps;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.json.AjaxJson;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.act.entity.Act;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.disputeMediation.entity.ProjectPrelitigationMediation;
+import com.jeeplus.modules.externalUnit.entity.ExternalUnitCapitalDemand;
+import com.jeeplus.modules.externalUnit.entity.ExternalUnitProjectRecords;
+import com.jeeplus.modules.externalUnit.service.ExternalUnitCapitalDemandService;
+import com.jeeplus.modules.externalUnit.service.ExternalUnitProjectRecordsService;
+
+import com.jeeplus.modules.ruralprojectrecords.entity.SubProjectInfo;
+import com.jeeplus.modules.signatureManagement.electronicSignature.entity.DistrictDirectorApplication;
+import com.jeeplus.modules.sys.entity.MainDictDetail;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+import com.jeeplus.modules.workprojectnotify.entity.WorkProjectNotify;
+import com.jeeplus.modules.workprojectnotify.service.WorkProjectNotifyService;
+import com.jeeplus.modules.workstaff.dao.WorkStaffAchivesDao;
+import com.jeeplus.modules.workstaff.entity.WorkStaffBasicInfo;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+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.transaction.annotation.Transactional;
+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
+@RequestMapping(value = "${adminPath}/externalUnit/externalUnit")
+public class ExternalUnitProjectRecordsController extends BaseController {
+
+    @Autowired
+    private ExternalUnitProjectRecordsService unitProjectRecordsService;
+
+    @Autowired
+    private WorkStaffAchivesDao workStaffAchivesDao;
+
+    @Autowired
+    private ActTaskService actTaskService;
+
+    @Autowired
+    private HttpServletRequest request;
+
+    @Autowired
+    private ExternalUnitCapitalDemandService capitalDemandService;
+
+    @Autowired
+    private WorkProjectNotifyService workProjectNotifyService;
+
+    @Autowired
+    private OfficeService officeService;
+
+
+
+    @ModelAttribute
+    public ExternalUnitProjectRecords get(@RequestParam(required=false) String id) {
+        ExternalUnitProjectRecords entity = null;
+        if (StringUtils.isNotBlank(id)){
+            entity = unitProjectRecordsService.get(id);
+        }
+        if (entity == null){
+            entity = new ExternalUnitProjectRecords();
+        }
+        return entity;
+    }
+
+    /**
+     * 项目列表页面
+     */
+    @RequiresPermissions("externalUnit:externalUnit:list")
+    @RequestMapping(value = {"list", ""})
+    public String list(ExternalUnitProjectRecords externalUnitProjectRecords, HttpServletRequest request, HttpServletResponse response, Model model) {
+        if(UserUtils.isManager()){
+            model.addAttribute("flag","1");
+        }
+        //进行查询之后进行任何操作,返回还是查询之后的数据页面
+        if (StringUtils.isNotBlank(externalUnitProjectRecords.getToflag())){
+            request.getSession().removeAttribute("searchProjectRecord");
+            ExternalUnitProjectRecords search=externalUnitProjectRecords;
+            request.getSession().setAttribute("searchProjectRecord",search);
+        }else{
+            if (request.getSession().getAttribute("searchProjectRecord")!=null){
+                externalUnitProjectRecords= (ExternalUnitProjectRecords) request.getSession().getAttribute("searchProjectRecord");
+                model.addAttribute("projectRecords", externalUnitProjectRecords);
+            }
+        }
+        Page<ExternalUnitProjectRecords> page = unitProjectRecordsService.findPage(new Page<ExternalUnitProjectRecords>(request, response), externalUnitProjectRecords);
+        model.addAttribute("page", page);
+        return "modules/externalUnit/externalUnitProjectRecordsList";
+    }
+
+    /**
+     * 查看,增加,编辑项目表单页面
+     */
+    @RequestMapping(value = "form")
+    public String form(ExternalUnitProjectRecords projectRecords, Model model) {
+        if (projectRecords!=null&&StringUtils.isNotBlank(projectRecords.getId())) {
+            projectRecords = unitProjectRecordsService.get(projectRecords.getId());
+            //设置项目组成员
+            unitProjectRecordsService.queryUserNames(projectRecords);
+        }else {
+            projectRecords.setCreateBy(UserUtils.getUser());
+        }
+
+        model.addAttribute("projectRecords", projectRecords);
+        return "modules/externalUnit/externalUnitProjectRecordsForm";
+    }
+
+
+    /**
+     * 获取项目组成员信息
+     * @param ids
+     * @return
+     */
+    @RequestMapping(value = "getProjectRecordUsers")
+    @ResponseBody
+    @Transactional(readOnly = false)
+    public List<Map<String,Object>> getProjectRecordUsers(@RequestParam(required=false) String ids) {
+        List<Map<String,Object>> list = new ArrayList<>();
+        String[] idArr = ids.split(",");
+        for (String id : idArr){
+            User user = UserUtils.get(id);
+            Map<String,Object> map = new HashMap<>();
+            map.put("id",StringUtils.isBlank(user.getId())?"":user.getId());
+            map.put("name",StringUtils.isBlank(user.getName())?"":user.getName());
+            map.put("officeId",StringUtils.isBlank(user.getOffice().getTopCompany())?"":user.getOffice().getTopCompany());
+            map.put("no",StringUtils.isBlank(user.getNo())?"":user.getNo());
+            map.put("mobile",StringUtils.isBlank(user.getMobile())?"":user.getMobile());
+            map.put("email",StringUtils.isBlank(user.getEmail())?"":user.getEmail());
+            map.put("msg","msg");
+            WorkStaffBasicInfo workStaffBasicInfo=workStaffAchivesDao.getJob(id);
+            if(workStaffBasicInfo!=null&&workStaffBasicInfo.getJobGrade()!=null){
+                map.put("jobName",StringUtils.isBlank(workStaffBasicInfo.getJobGrade().getName())?"":workStaffBasicInfo.getJobGrade().getName());
+            }
+            list.add(map);
+        }
+        return list;
+    }
+
+
+    /**
+     * 保存项目
+     */
+    @RequiresPermissions(value={"externalUnit:externalUnit:add","externalUnit:externalUnit:edit"},logical= Logical.OR)
+    @RequestMapping(value = "save")
+    public String save(ExternalUnitProjectRecords projectRecords, Model model, RedirectAttributes redirectAttributes) {
+        if (!beanValidator(model, projectRecords)){
+            return form(projectRecords, model);
+        }
+        try {
+//            projectRecords.setProjectStatus(ProjectStatusEnum.IN_APRL.getValue());
+            if (!projectRecords.getIsNewRecord()) {//编辑表单保存
+                ExternalUnitProjectRecords t = unitProjectRecordsService.get(projectRecords.getId());//从数据库取出记录的值
+                MyBeanUtils.copyBeanNotNull2Bean(projectRecords, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+                unitProjectRecordsService.saveProject(t);//保存
+            } else {//新增表单保存
+                unitProjectRecordsService.saveProject(projectRecords);//保存
+            }
+            addMessage(redirectAttributes, "保存项目成功");
+        }catch (Exception e){
+            logger.error("保存项目异常:",e);
+            addMessage(redirectAttributes, "保存项目异常:"+e.getMessage());
+        }
+        return "redirect:"+ Global.getAdminPath()+"/externalUnit/externalUnit/?repage";
+    }
+
+
+    /**
+     * 查看
+     * @param projectRecords
+     * @param model
+     * @return
+     */
+    @RequiresPermissions(value={"externalUnit:externalUnit:view"})
+    @RequestMapping(value = "detail")
+    public String view(ExternalUnitProjectRecords projectRecords, Model model) {
+        if (projectRecords!=null&&StringUtils.isNotBlank(projectRecords.getId())) {
+            unitProjectRecordsService.queryProjectDetail(projectRecords);
+        }
+        model.addAttribute("projectRecords", projectRecords);
+        return "modules/externalUnit/externalUnitProjectRecordsView";
+    }
+
+
+    /**
+     * 新增项目文件
+     * @param projectRecords
+     * @param model
+     * @return
+     */
+    @RequestMapping(value = "projectFile")
+    public String projectFile(ExternalUnitProjectRecords projectRecords, HttpServletRequest request, HttpServletResponse response, Model model) {
+        ExternalUnitProjectRecords externalUnitProjectRecords = new ExternalUnitProjectRecords();
+        if (null != projectRecords.getId()){
+            externalUnitProjectRecords = unitProjectRecordsService.get(projectRecords.getId());
+            model.addAttribute("projectRecords",externalUnitProjectRecords);
+        }
+        Page<WorkClientAttachment> page = unitProjectRecordsService.getProjectFile(new Page<WorkClientAttachment>(request, response),projectRecords);
+
+        model.addAttribute("page", page);
+        return "modules/externalUnit/externalUnitProjectFile";
+    }
+
+
+
+
+
+
+    /*8
+    文件上传页面
+     */
+    @RequestMapping(value = "fileForm")
+    public String fileForm(ExternalUnitProjectRecords projectRecords, Model model) {
+        if (projectRecords!=null&&StringUtils.isNotBlank(projectRecords.getId())) {
+            projectRecords = unitProjectRecordsService.get(projectRecords.getId());
+            //查询无流程文件
+            unitProjectRecordsService.getNoProcessFile(projectRecords);
+        }
+        model.addAttribute("projectRecords", projectRecords);
+        return "modules/externalUnit/externalUnitFileForm";
+    }
+
+
+    /**
+     * 保存无流程附件
+     * @param projectRecords
+     * @param model
+     * @param redirectAttributes
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @RequestMapping(value = "saveFile")
+    public String saveFile(ExternalUnitProjectRecords projectRecords,
+//                       @RequestParam(value = "file", required = false) MultipartFile[] upload_files,
+                       Model model, RedirectAttributes redirectAttributes,
+                       HttpServletRequest request
+    ) throws Exception{
+        unitProjectRecordsService.saveFile(projectRecords);//保存
+        addMessage(redirectAttributes, "保存附件成功");
+        return "redirect:"+ Global.getAdminPath()+"/externalUnit/externalUnit/?repage";
+    }
+
+
+    /*8
+    获取项目组成员
+     */
+    @RequestMapping("getProjectMembers")
+    @ResponseBody
+    public AjaxJson getProjectMembers(@RequestParam String projectId){
+        AjaxJson ajaxJson = new AjaxJson();
+        try {
+            List<User> getAchievementTypeList = unitProjectRecordsService.getProjectMembers(projectId);
+            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).getName());
+                map.put("value", getAchievementTypeList.get(i).getId());
+                mapList.add(map);
+            }
+            ajaxJson.getBody().put("list", mapList);
+            ajaxJson.setMsg("获取数据成功");
+        } catch (Exception e) {
+            logger.error("获取数据异常!", e);
+            ajaxJson.setSuccess(false);
+            ajaxJson.setMsg("获取数据异常");
+        }
+        return ajaxJson;
+    }
+
+
+
+
+
+
+
+
+
+
+
+}

+ 7 - 0
src/main/java/com/jeeplus/modules/workclientinfo/dao/WorkClientAttachmentDao.java

@@ -47,4 +47,11 @@ public interface WorkClientAttachmentDao extends CrudDao<WorkClientAttachment> {
      * @return
      */
     Integer deleteByattachmentIdAndProjectId(WorkClientAttachment attchment);
+
+    /*8
+    查询外部单位文件管理中的文件信息
+     */
+    int queryFileCount(WorkClientAttachment workClientAttachment);
+
+    List<WorkClientAttachment> getFileList(WorkClientAttachment workClientAttachment);
 }

+ 19 - 0
src/main/java/com/jeeplus/modules/workclientinfo/entity/WorkClientAttachment.java

@@ -37,6 +37,25 @@ public class WorkClientAttachment extends DataEntity<WorkClientAttachment> {
 	private String description;	//说明
 	private String divIdType;//判定条件
 
+	private Date beginDate;
+	private Date endDate;
+
+	public Date getBeginDate() {
+		return beginDate;
+	}
+
+	public void setBeginDate(Date beginDate) {
+		this.beginDate = beginDate;
+	}
+
+	public Date getEndDate() {
+		return endDate;
+	}
+
+	public void setEndDate(Date endDate) {
+		this.endDate = endDate;
+	}
+
 	public WorkClientAttachment() {
 		super();
 	}

+ 6 - 0
src/main/java/com/jeeplus/modules/workprojectnotify/dao/WorkProjectNotifyDao.java

@@ -47,8 +47,14 @@ public interface WorkProjectNotifyDao extends CrudDao<WorkProjectNotify> {
 
     //更新阅读状态
     boolean updateReadStateByNotifyId(WorkProjectNotify workProjectNotify);
+    //意见反馈 更新阅读状态
+    boolean updateNewReadStateByNotifyId(WorkProjectNotify workProjectNotify);
+
+
     void updateReadStateByUserAndTitle(WorkProjectNotify workProjectNotify);
     List<User> findReadStateByNotifyId(WorkProjectNotify workProjectNotify);
+    //意见反馈通知
+    List<User> findNewReadStateByNotifyId(WorkProjectNotify workProjectNotify);
 
     //逻辑删除
     int updateDelflagByNotifyId(WorkProjectNotify workProjectNotify);

+ 12 - 3
src/main/java/com/jeeplus/modules/workprojectnotify/service/WorkProjectNotifyService.java

@@ -280,10 +280,19 @@ public class WorkProjectNotifyService extends CrudService<WorkProjectNotifyDao,
 	@Transactional(readOnly = false)
 	public List<User> readByNotifyId(WorkProjectNotify workProjectNotify) {
 		try {
+			List<User> users = null;
 			workProjectNotify.setStatus("1");
-			List<User> users = dao.findReadStateByNotifyId(workProjectNotify);
-			workProjectNotify.preUpdate();
-			dao.updateReadStateByNotifyId(workProjectNotify);
+			if (StringUtils.isNotBlank(workProjectNotify.getAuditor())){
+				workProjectNotify.preUpdate();
+				dao.updateNewReadStateByNotifyId(workProjectNotify);
+				users = dao.findNewReadStateByNotifyId(workProjectNotify);
+
+			}else {
+				users = dao.findReadStateByNotifyId(workProjectNotify);
+				workProjectNotify.preUpdate();
+				dao.updateReadStateByNotifyId(workProjectNotify);
+			}
+
 			return users;
 		}catch (Exception e){
 			logger.error("Exception e:"+e);

+ 112 - 16
src/main/java/com/jeeplus/modules/workprojectnotify/web/WorkProjectNotifyController.java

@@ -28,6 +28,10 @@ import com.jeeplus.modules.caseinfo.service.CaseInfoService;
 import com.jeeplus.modules.centerservice.service.cpa.reimbursement.ReimbursementService;
 import com.jeeplus.modules.centerservice.service.cpa.task.TaskFlowService;
 import com.jeeplus.modules.centerservice.utils.ConvertServiceUtil;
+import com.jeeplus.modules.externalUnit.entity.ExternalUnitCapitalDemand;
+import com.jeeplus.modules.externalUnit.entity.ExternalUnitFeedback;
+import com.jeeplus.modules.externalUnit.service.ExternalUnitCapitalDemandService;
+import com.jeeplus.modules.externalUnit.service.ExternalUnitFeedbackService;
 import com.jeeplus.modules.filialeWorkInvoice.entity.FilialeWorkInvoice;
 import com.jeeplus.modules.filialeWorkInvoice.service.FilialeWorkInvoiceService;
 import com.jeeplus.modules.iim.entity.MailBox;
@@ -589,6 +593,12 @@ public class WorkProjectNotifyController extends BaseController {
 	private DistrictDirectorApplicationService directorApplicationService;
 
 	@Autowired
+	private ExternalUnitCapitalDemandService capitalDemandService;
+
+	@Autowired
+	private ExternalUnitFeedbackService feedbackService;
+
+	@Autowired
 	private SzFlowRequest flowRequest;
 
 	@ModelAttribute
@@ -1583,7 +1593,7 @@ public class WorkProjectNotifyController extends BaseController {
 							List<Map<String, Object>> hisTaskList = szTaskFlowService.getHisTaskListById(workInvoice.getProcessInstanceId());
 							model.addAttribute("hisTaskList", hisTaskList);
 						}
-						if ("view".equals(workProjectNotify.getView())){
+						if ("view".equals(workProjectNotify.getView())) {
 							return "modules/workinvoice/workInvoiceViewCpa";
 						}
 						return "modules/workinvoice/workInvoiceAuditCpa";
@@ -1699,7 +1709,7 @@ public class WorkProjectNotifyController extends BaseController {
 
 					return this.workReimbursementSpecificInvoiceAudit(workProjectNotify, model);
 
-				}  else if (workProjectNotify.getType().equals("111")) {    //报销附件补充文件
+				} else if (workProjectNotify.getType().equals("111")) {    //报销附件补充文件
 
 					return this.workReimbursementReplenishAudit(workProjectNotify, model);
 
@@ -1895,7 +1905,7 @@ public class WorkProjectNotifyController extends BaseController {
 				} else if (workProjectNotify.getType().equals("174")) {    //审定单签章
 					return this.disposeProjectReportSignatureWorkApproval(workProjectNotify, model);
 
-				}  else if (workProjectNotify.getType().equals("192")) {    //电子用章申请
+				} else if (workProjectNotify.getType().equals("192")) {    //电子用章申请
 					return this.electronicSignatureAudit(workProjectNotify, model);
 				} else if (workProjectNotify.getType().equals("193")) {    //业务用章申请
 					return this.businessSignatureAudit(workProjectNotify, model);
@@ -2302,7 +2312,7 @@ public class WorkProjectNotifyController extends BaseController {
 						return "modules/workinvoice/workInvoiceModify";
 					}
 				} else if (workProjectNotify.getType().equals("216")) {    //发票超期未收款
-					return this.getOverDueGatheringInvoiceList(workProjectNotify,model);
+					return this.getOverDueGatheringInvoiceList(workProjectNotify, model);
 				} else if (workProjectNotify.getType().equals("212")) {    //开票管理
 					WorkInvoice workInvoice = workInvoiceService.get(workProjectNotify.getNotifyId());
 					if (StringUtils.isNotBlank(workInvoice.getId())) {
@@ -2537,9 +2547,9 @@ public class WorkProjectNotifyController extends BaseController {
 						workInvoice.setBank(bankName);
 					}
 					workInvoice.setHome("home");
-					if(StringUtils.isNotBlank(workInvoice.getCancellationProcessInstanceId())){
+					if (StringUtils.isNotBlank(workInvoice.getCancellationProcessInstanceId())) {
 						workInvoice.setAct(getByAct(workInvoice.getCancellationProcessInstanceId()));
-					}else{
+					} else {
 						workInvoice.setAct(getByAct(workInvoice.getProcessInstanceId()));
 					}
 					String taskDefKey = workInvoice.getAct().getTaskDefKey();
@@ -3513,13 +3523,13 @@ public class WorkProjectNotifyController extends BaseController {
 					model.addAttribute("projectReportDataApprovalFee", 0D);
 
 					//送审价
-					if(StringUtils.isNotBlank(projectReportData.getReviewFee())){
-						Double songShenJia = Double.valueOf(projectReportData.getReviewFee())/10000;
+					if (StringUtils.isNotBlank(projectReportData.getReviewFee())) {
+						Double songShenJia = Double.valueOf(projectReportData.getReviewFee()) / 10000;
 						model.addAttribute("projectReportDataReviewFee", String.format("%.2f", songShenJia));
 					}
 					//审定价
-					if(StringUtils.isNotBlank(projectReportData.getApprovalFee())){
-						Double shenDingJia = Double.valueOf(projectReportData.getApprovalFee())/10000;
+					if (StringUtils.isNotBlank(projectReportData.getApprovalFee())) {
+						Double shenDingJia = Double.valueOf(projectReportData.getApprovalFee()) / 10000;
 						model.addAttribute("projectReportDataApprovalFee", String.format("%.2f", shenDingJia));
 					}
 
@@ -4656,7 +4666,7 @@ public class WorkProjectNotifyController extends BaseController {
 					Iterator<RuralReportConsultant> it = consultantList.iterator();
 					while (it.hasNext()) {
 						RuralReportConsultant consultant = it.next();
-						if(consultant.getZixunyuan().equals(currentConsultant.getZixunyuan()) && ((StringUtils.isNotBlank(consultant.getRole()) && consultant.getRole().equals(currentConsultant.getRole())) || StringUtils.isBlank(consultant.getRole()))){
+						if (consultant.getZixunyuan().equals(currentConsultant.getZixunyuan()) && ((StringUtils.isNotBlank(consultant.getRole()) && consultant.getRole().equals(currentConsultant.getRole())) || StringUtils.isBlank(consultant.getRole()))) {
 							try {
 								MyBeanUtils.copyBeanNotNull2Bean(consultant, currentConsultant);
 							} catch (Exception e) {
@@ -4685,7 +4695,7 @@ public class WorkProjectNotifyController extends BaseController {
 					}
 					consultants.addAll(consultantList);
 					for (RuralReportConsultant consultant : consultants) {
-						if(StringUtils.isBlank(consultant.getRole())){
+						if (StringUtils.isBlank(consultant.getRole())) {
 							consultant.setRole("咨询员");
 						}
 					}
@@ -4844,7 +4854,7 @@ public class WorkProjectNotifyController extends BaseController {
 						while (itView.hasNext()) {
 							RuralReportConsultant consultant = itView.next();
 							if (bzshbCertificateList.size() > 0) {
-								if (consultant.getZixunyuan().equals(bzshbConsultant.getZixunyuan()) && ((StringUtils.isNotBlank(consultant.getRole()) && consultant.getRole().equals("技术负责人")) || StringUtils.isBlank(consultant.getRole()) )) {
+								if (consultant.getZixunyuan().equals(bzshbConsultant.getZixunyuan()) && ((StringUtils.isNotBlank(consultant.getRole()) && consultant.getRole().equals("技术负责人")) || StringUtils.isBlank(consultant.getRole()))) {
 									try {
 										MyBeanUtils.copyBeanNotNull2Bean(consultant, bzshbConsultant);
 										bzshbConsultant.setZixunyuanName("陈红星(" + bzshbConsultant.getZixunyuanName() + "代)");
@@ -4855,7 +4865,7 @@ public class WorkProjectNotifyController extends BaseController {
 									itView.remove();
 								}
 							} else {
-								if (consultant.getZixunyuan().equals(projectReportData.getBzshbUserId()) && ((StringUtils.isNotBlank(consultant.getRole()) && consultant.getRole().equals("技术负责人")) || StringUtils.isBlank(consultant.getRole()) )) {
+								if (consultant.getZixunyuan().equals(projectReportData.getBzshbUserId()) && ((StringUtils.isNotBlank(consultant.getRole()) && consultant.getRole().equals("技术负责人")) || StringUtils.isBlank(consultant.getRole()))) {
 									try {
 										MyBeanUtils.copyBeanNotNull2Bean(consultant, bzshbConsultant);
 										bzshbConsultant.setZixunyuanName("陈红星(" + bzshbConsultant.getZixunyuanName() + "代)");
@@ -4932,7 +4942,7 @@ public class WorkProjectNotifyController extends BaseController {
 						while (itView.hasNext()) {
 							RuralReportConsultant consultant = itView.next();
 							if (bzshbCertificateList.size() > 0) {
-								if (consultant.getZixunyuan().equals(bzshbConsultant.getZixunyuan()) && ((StringUtils.isNotBlank(consultant.getRole()) && consultant.getRole().equals("技术负责人")) || StringUtils.isBlank(consultant.getRole()) )) {
+								if (consultant.getZixunyuan().equals(bzshbConsultant.getZixunyuan()) && ((StringUtils.isNotBlank(consultant.getRole()) && consultant.getRole().equals("技术负责人")) || StringUtils.isBlank(consultant.getRole()))) {
 									try {
 										MyBeanUtils.copyBeanNotNull2Bean(consultant, bzshbConsultant);
 										bzshbConsultant.setZixunyuanName("陈红星(" + bzshbConsultant.getZixunyuanName() + "代)");
@@ -4943,7 +4953,7 @@ public class WorkProjectNotifyController extends BaseController {
 									itView.remove();
 								}
 							} else {
-								if (consultant.getZixunyuan().equals(projectReportData.getBzshbUserId()) && ((StringUtils.isNotBlank(consultant.getRole()) && consultant.getRole().equals("技术负责人")) || StringUtils.isBlank(consultant.getRole()) )) {
+								if (consultant.getZixunyuan().equals(projectReportData.getBzshbUserId()) && ((StringUtils.isNotBlank(consultant.getRole()) && consultant.getRole().equals("技术负责人")) || StringUtils.isBlank(consultant.getRole()))) {
 									try {
 										MyBeanUtils.copyBeanNotNull2Bean(consultant, bzshbConsultant);
 										bzshbConsultant.setZixunyuanName("陈红星(" + bzshbConsultant.getZixunyuanName() + "代)");
@@ -8232,6 +8242,27 @@ public class WorkProjectNotifyController extends BaseController {
 					} else if (workProjectNotify.getRemarks().contains("重新申请") && !"1".equals(workProjectNotify.getStatus())) {
 						return "modules/signatureManagement/electronicSignature/directorApplicationModify";
 					}
+				} else if ("310".equals(workProjectNotify.getType())) {//提资需求
+					getCapitalDemand(workProjectNotify.getNotifyId(),model);
+
+					if (workProjectNotify.getRemarks().contains("待通知") || "view".equals(workProjectNotify.getView())) {
+						return "modules/externalUnit/capitalDemandFormView";
+					} else if (workProjectNotify.getRemarks().contains("待审批") && !"1".equals(workProjectNotify.getStatus())) {
+						return "modules/externalUnit/capitalDemandFormAudit";
+					} else if (workProjectNotify.getRemarks().contains("重新申请") && !"1".equals(workProjectNotify.getStatus())) {
+						return "modules/externalUnit/capitalDemandFormModify";
+					}
+				}else if ("311".equals(workProjectNotify.getType())) {//意见反馈
+					getFeedback(workProjectNotify.getNotifyId(),model);
+
+
+					if (workProjectNotify.getRemarks().contains("待通知") || "view".equals(workProjectNotify.getView())) {
+						return "modules/externalUnit/feedbackFormView";
+					} else if (workProjectNotify.getRemarks().contains("待审批") && !"1".equals(workProjectNotify.getStatus())) {
+						return "modules/externalUnit/feedbackFormAudit";
+					} else if (workProjectNotify.getRemarks().contains("重新申请") && !"1".equals(workProjectNotify.getStatus())) {
+						return "modules/externalUnit/feedbackFormModify";
+					}
 				}
 			}
 		}
@@ -8264,6 +8295,39 @@ public class WorkProjectNotifyController extends BaseController {
 		return "modules/workprojectnotify/workProjectNotifyForm";
 	}
 
+	private void getFeedback(String notifyId, Model model) {
+		ExternalUnitFeedback feedback = feedbackService.get(notifyId);
+		feedback.setHome("home");
+		feedback.setAct(getByAct(feedback.getProcessInstanceId()));
+		model.addAttribute("feedback", feedback);
+
+		model.addAttribute("processInstanceId", feedback.getProcessInstanceId());
+	}
+
+	private void getCapitalDemand(String notifyId, Model model) {
+		ExternalUnitCapitalDemand capitalDemand = capitalDemandService.get(notifyId);
+		capitalDemand.setHome("home");
+		capitalDemand.setAct(getByAct(capitalDemand.getProcessInstanceId()));
+		model.addAttribute("capitalDemand", capitalDemand);
+		//项目组成员
+		ArrayList<User> users = new ArrayList<>();
+		String members = capitalDemand.getProject().getProjectMember();
+		if (StringUtils.isNotBlank(members)) {
+			if (members.contains(",")) {
+				String[] split = members.split(",");
+				for (String s : split) {
+					User user = UserUtils.get(s);
+					users.add(user);
+				}
+			} else {
+				User user = UserUtils.get(members);
+				users.add(user);
+			}
+		}
+		model.addAttribute("projectMembers", users);
+		model.addAttribute("processInstanceId", capitalDemand.getProcessInstanceId());
+	}
+
 	/**
 	 * 查看,增加,编辑通知表单页面
 	 */
@@ -8803,6 +8867,38 @@ public class WorkProjectNotifyController extends BaseController {
 					}
 					model.addAttribute("districtDirectorApplication", directorApplication);
 					return "modules/signatureManagement/electronicSignature/directorApplicationView";
+				} else if (workProjectNotify.getType().equals("310")) {    //提资需求
+					ExternalUnitCapitalDemand capitalDemand = capitalDemandService.get(workProjectNotify.getNotifyId());
+					capitalDemand.setAct(getByAct(capitalDemand.getProcessInstanceId()));
+					if (capitalDemand.getAct() != null) {
+						String taskDefKey = capitalDemand.getAct().getTaskDefKey();
+					}
+					//项目组成员
+					ArrayList<User> users = new ArrayList<>();
+					String members = capitalDemand.getProject().getProjectMember();
+					if (StringUtils.isNotBlank(members)){
+						if (members.contains(",")){
+							String[] split = members.split(",");
+							for (String s : split) {
+								User user = UserUtils.get(s);
+								users.add(user);
+							}
+						}else {
+							User user = UserUtils.get(members);
+							users.add(user);
+						}
+					}
+					model.addAttribute("projectMembers", users);
+					model.addAttribute("capitalDemand", capitalDemand);
+					return "modules/externalUnit/externalUnitCapitalDemandView";
+				} else if (workProjectNotify.getType().equals("311")) {    //意见反馈申请
+					ExternalUnitFeedback feedback = feedbackService.get(workProjectNotify.getNotifyId());
+					feedback.setAct(getByAct(feedback.getProcessInstanceId()));
+					if (feedback.getAct() != null) {
+						String taskDefKey = feedback.getAct().getTaskDefKey();
+					}
+					model.addAttribute("feedback", feedback);
+					return "modules/externalUnit/feedbackView";
 				}
 			}
 		}

+ 1 - 1
src/main/resources/jeeplus.properties

@@ -7,7 +7,7 @@ jdbc.type=mysql
 jdbc.driver=com.mysql.jdbc.Driver
 db.name=ruihuaoa-activity-data
 #jdbc.url=jdbc:mysql://8.136.152.135:3306/new_ccpm?useUnicode=true&characterEncoding=utf-8
-jdbc.url=jdbc:mysql://127.0.0.1:3306/new_ccpm?useUnicode=true&characterEncoding=utf-8
+jdbc.url=jdbc:mysql://192.168.2.4:3306/new_ccpm?useUnicode=true&characterEncoding=utf-8
 jdbc.username=root
 jdbc.password=root
 #jdbc.password=Xgcomdata10376@

+ 105 - 0
src/main/resources/mappings/modules/externalUnit/ExternalUnitCapitalDemandDao.xml

@@ -0,0 +1,105 @@
+<?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.externalUnit.dao.ExternalUnitCapitalDemandDao">
+
+    <sql id="capitalDemandColumns">
+            a.id,
+            a.create_by as "createBy.id",
+            a.create_date,
+            a.update_by,
+            a.update_date,
+            a.del_flag,
+            a.company_id,
+            a.office_id,
+            a.process_instance_id,
+            a.status,
+            a.remarks,
+            a.project_id,
+            a.examiner
+    </sql>
+
+
+    <select id="get" resultType="ExternalUnitCapitalDemand">
+        select
+        <include refid="capitalDemandColumns"/>
+        from external_unit_capital_demand a
+        where a.id = #{id}
+    </select>
+
+    <select id="queryCount" resultType="int">
+        select count(distinct a.id)
+        from external_unit_capital_demand a
+        where a.project_id = #{projectId} and a.del_flag ='0'
+    </select>
+
+    <select id="findByProId" resultType="ExternalUnitCapitalDemand">
+        select
+            <include refid="capitalDemandColumns"/>,
+            su.name as "createBy.name",
+            pr.name as "project.name"
+        from external_unit_capital_demand a
+        left join sys_user su on a.create_by = su.id
+        left join external_unit_project_records pr on a.project_id = pr.id
+        where a.project_id = #{projectId} and a.del_flag ='0'
+        <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>
+
+    <update id="updateProcessInstanceId">
+		UPDATE external_unit_capital_demand SET
+			process_instance_id = #{processInstanceId}
+		WHERE id = #{id}
+	</update>
+
+
+    <insert id="insert">
+        insert into external_unit_capital_demand(
+            id,
+            create_by,
+            create_date,
+            update_by,
+            update_date,
+            del_flag,
+            office_id,
+            company_id,
+            project_id,
+            status,
+            remarks,
+            examiner
+        ) values(
+            #{id},
+            #{createBy.id},
+			#{createDate},
+			#{updateBy.id},
+			#{updateDate},
+			#{delFlag},
+			#{officeId},
+			#{companyId},
+			#{project.id},
+			#{status},
+			#{remarks},
+			#{examiner}
+        )
+    </insert>
+
+    <update id="update">
+        update external_unit_capital_demand set
+            update_by = #{updateBy.id},
+			update_date = #{updateDate},
+			status = #{status},
+			remarks = #{remarks},
+			examiner = #{examiner}
+		where id =#{id}
+    </update>
+
+    <update id="delete">
+		DELETE FROM external_unit_capital_demand
+		WHERE id = #{id}
+	</update>
+</mapper>

+ 105 - 0
src/main/resources/mappings/modules/externalUnit/ExternalUnitFeedbackDao.xml

@@ -0,0 +1,105 @@
+<?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.externalUnit.dao.ExternalUnitFeedbackDao">
+
+    <sql id="feedbackColumns">
+            a.id,
+            a.create_by as "createBy.id",
+            a.create_date,
+            a.update_by,
+            a.update_date,
+            a.del_flag,
+            a.company_id,
+            a.office_id,
+            a.process_instance_id,
+            a.status,
+            a.remarks,
+            a.project_id,
+            a.examiner,
+            a.apply_view
+    </sql>
+
+    <select id="get" resultType="ExternalUnitFeedback">
+        select
+        <include refid="feedbackColumns"/>
+        from external_unit_feedback a
+        where a.id = #{id}
+    </select>
+
+    <select id="queryCount" resultType="int">
+        select count(distinct a.id)
+        from external_unit_feedback a
+        where a.project_id = #{projectId} and a.del_flag ='0'
+    </select>
+
+
+    <select id="findByProId" resultType="ExternalUnitFeedback">
+        select
+            <include refid="feedbackColumns"/>
+            ,su.name as "createBy.name"
+            ,pr.name as "project.name"
+        from external_unit_feedback a
+        left join sys_user su on a.create_by = su.id
+        left join external_unit_project_records pr on a.project_id = pr.id
+        where a.project_id = #{projectId} and a.del_flag ='0'
+        <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 external_unit_feedback(
+            id,
+            create_by,
+            create_date,
+            update_by,
+            update_date,
+            del_flag,
+            office_id,
+            company_id,
+            project_id,
+            status,
+            remarks,
+            examiner
+        ) values(
+            #{id},
+            #{createBy.id},
+			#{createDate},
+			#{updateBy.id},
+			#{updateDate},
+			#{delFlag},
+			#{officeId},
+			#{companyId},
+			#{project.id},
+			#{status},
+			#{remarks},
+			#{examiner}
+        )
+    </insert>
+
+    <update id="update">
+        update external_unit_feedback set
+            update_by = #{updateBy.id},
+			update_date = #{updateDate},
+			status = #{status},
+			remarks = #{remarks},
+			examiner = #{examiner}
+		where id =#{id}
+    </update>
+
+    <update id="updateProcessInstanceId">
+		UPDATE external_unit_feedback SET
+			process_instance_id = #{processInstanceId}
+		WHERE id = #{id}
+	</update>
+
+    <update id="delete">
+		DELETE FROM external_unit_feedback
+		WHERE id = #{id}
+	</update>
+</mapper>

+ 194 - 0
src/main/resources/mappings/modules/externalUnit/ExternalUnitProjectRecordsDao.xml

@@ -0,0 +1,194 @@
+<?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.externalUnit.dao.ExternalUnitProjectRecordsDao">
+
+
+    <sql id="externalUnitProjectRecordsColumns">
+		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.name as "name",
+		a.project_builder as "projectBuilder",
+		a.build_place as "buildPlace",
+		a.project_member as "projectMember"
+	</sql>
+
+    <sql id="externalUnitProjectRecordsJoins">
+    </sql>
+
+
+    <select id="get" resultType="ExternalUnitProjectRecords" >
+        SELECT
+        <include refid="externalUnitProjectRecordsColumns"/>
+		,su.name AS "createBy.name"
+		,o.top_company AS "office.name"
+        FROM external_unit_project_records a
+		LEFT JOIN sys_user su ON su.id = a.create_by
+		LEFT JOIN sys_office o ON o.id = a.office_id
+		WHERE a.id = #{id}
+    </select>
+
+
+	<select id="queryCount" resultType="int">
+		select count(distinct a.id)
+		from external_unit_project_records a
+		left join external_unit_project_user eupu on a.id = eupu.project_id
+		left join sys_user su on su.id = a.create_by
+		left join sys_office so on so.id = su.office_id
+		<where>
+			<if test="name != null and name != ''">
+				AND a.name LIKE
+				<if test="dbName == 'oracle'">'%'||#{name}||'%'</if>
+				<if test="dbName == 'mssql'">'%'+#{name}+'%'</if>
+				<if test="dbName == 'mysql'">concat('%',#{name},'%')</if>
+			</if>
+			<if test="beginDate !=null">
+				AND a.create_date >= #{beginDate}
+			</if>
+			<if test="endDate !=null">
+				AND a.create_date &lt; #{endDate}
+			</if>
+			<if test="(createId != null and createId != '') or (createNameStr != null and createNameStr != '')">
+				AND (a.create_by = #{createId} or su.name = #{createNameStr})
+			</if>
+			<if test="officeId != null and officeId != ''">
+				AND so.id = #{officeId}
+			</if>
+			<if test="projectBuilder != null and projectBuilder != ''">
+				AND a.project_builder like concat('%',#{projectBuilder},'%')
+			</if>
+			<if test="buildPlace != null and buildPlace != ''">
+				AND a.build_place like concat('%',#{buildPlace},'%')
+			</if>
+			AND a.company_id = #{currentUser.company.id}
+			<if test="sqlMap.dsf !=null and sqlMap.dsf!=''">
+				AND ((eupu.user_id = #{currentUser.id} AND eupu.del_flag='0')${sqlMap.dsf} )
+			</if>
+		</where>
+	</select>
+
+	<select id="findList" resultType="ExternalUnitProjectRecords">
+		select distinct
+		<include refid="externalUnitProjectRecordsColumns"/>
+		,su.name as "createName"
+		,so.name as "createOffice"
+		from external_unit_project_records a
+		left join external_unit_project_user eupu on a.id = eupu.project_id
+		left join sys_user su on su.id = a.create_by
+		left join sys_office so on so.id = su.office_id
+		<where>
+			<if test="name != null and name != ''">
+				AND a.name LIKE
+				<if test="dbName == 'oracle'">'%'||#{name}||'%'</if>
+				<if test="dbName == 'mssql'">'%'+#{name}+'%'</if>
+				<if test="dbName == 'mysql'">concat('%',#{name},'%')</if>
+			</if>
+			<if test="beginDate !=null">
+				AND a.create_date >= #{beginDate}
+			</if>
+			<if test="endDate !=null">
+				AND a.create_date &lt; #{endDate}
+			</if>
+			<if test="(createId != null and createId != '') or (createNameStr != null and createNameStr != '')">
+				AND (a.create_by = #{createId} or su.name = #{createNameStr})
+			</if>
+			<if test="officeId != null and officeId != ''">
+				AND so.id = #{officeId}
+			</if>
+			<if test="projectBuilder != null and projectBuilder != ''">
+				AND a.project_builder like concat('%',#{projectBuilder},'%')
+			</if>
+			<if test="buildPlace != null and buildPlace != ''">
+				AND a.build_place like concat('%',#{buildPlace},'%')
+			</if>
+			AND a.company_id = #{currentUser.company.id}
+			<if test="sqlMap.dsf !=null and sqlMap.dsf!=''">
+				AND ((eupu.user_id = #{currentUser.id} AND eupu.del_flag='0')${sqlMap.dsf} )
+			</if>
+		</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="isDelFalg" resultType="com.jeeplus.modules.sys.entity.User">
+		SELECT u.id AS "id",
+		u.no,
+		u.name,
+		u.email,
+		u.phone,
+		u.mobile,
+		u.office_id AS "office.id",
+		o.top_company AS "office.name",
+		a.del_flag AS "delFlag",
+		j.name as "basicInfo.jobGrade.name"
+		from external_unit_project_user a
+		LEFT JOIN sys_user u ON u.id = a.user_id
+		LEFT JOIN work_staff_achives w ON w.user_id = a.user_id
+		LEFT JOIN work_job_grade j ON j.id = w.job_grade
+		LEFT JOIN sys_office o ON o.id = u.office_id
+		WHERE /*a.is_master = '0' AND*/ a.project_id = #{projectId}
+		<if test="delFlag !=null and delFlag !=''">
+			AND a.del_flag = #{delFlag}
+		</if>
+	</select>
+
+
+	<insert id="insert">
+		insert into external_unit_project_records(
+			id,
+			create_by,
+			create_date,
+			update_by,
+			update_date,
+			del_flag,
+			company_id,
+			office_id,
+			name,
+			project_builder,
+			build_place,
+			remarks,
+			project_member
+		) values (
+			#{id},
+			#{createBy.id},
+			#{createDate},
+			#{updateBy.id},
+			#{updateDate},
+			#{delFlag},
+			#{company.id},
+			#{office.id},
+			#{name},
+			#{projectBuilder},
+			#{buildPlace},
+			#{remarks},
+			#{projectMember}
+		)
+	</insert>
+
+	<update id="update">
+		update external_unit_project_records set
+			update_by = #{updateBy.id},
+			update_date = #{updateDate},
+			name = #{name},
+			project_builder = #{projectBuilder},
+			build_place = #{buildPlace},
+			remarks = #{remarks},
+			project_member = #{projectMember}
+		where id = #{id}
+	</update>
+
+
+
+
+
+</mapper>

+ 21 - 0
src/main/resources/mappings/modules/externalUnit/ExternalUnitProjectUserDao.xml

@@ -0,0 +1,21 @@
+<?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.externalUnit.dao.ExternalUnitProjectUserDao">
+    <delete id="deleteByProjectId">
+        delete from external_unit_project_user where project_id = #{projectId}
+    </delete>
+
+    <insert id="insert">
+        insert into external_unit_project_user(
+            user_id,
+            project_id,
+            del_flag
+        ) values (
+            #{userId},
+            #{projectId},
+            #{delFlag}
+        )
+    </insert>
+
+
+</mapper>

+ 88 - 0
src/main/resources/mappings/modules/workclientinfo/WorkClientAttachmentDao.xml

@@ -13,6 +13,7 @@
         a.url AS "url",
         a.type AS "type",
         a.attachment_id AS "attachmentId",
+        a.project_id AS "projectId",
         a.attachment_user AS "attachmentUser",
         a.attachment_name AS "attachmentName",
         a.attachment_flag AS "attachmentFlag",
@@ -273,4 +274,91 @@
         WHERE attachment_id = #{attachmentId}
         and project_id = #{projectId}
     </update>
+
+
+    <select id="queryFileCount" resultType="int" >
+        SELECT count(distinct a.id)
+        FROM work_attachment a
+        <include refid="workClientAttachmentJoins"/>
+        <where>
+            a.del_flag = #{DEL_FLAG_NORMAL}
+            and (a.div_id_type = '_exterNoProcess' or a.div_id_type = '_exterProcess')
+            <if test="attachmentId != null and attachmentId != ''">
+                AND a.attachment_id = #{attachmentId}
+            </if>
+            <if test="projectId != null and projectId != ''">
+                AND a.project_id = #{projectId}
+            </if>
+            <if test="attachmentFlag != null and attachmentFlag != ''">
+                AND attachment_flag = #{attachmentFlag}
+            </if>
+            <if test="attachmentName != null and attachmentName != ''">
+                AND attachment_name = #{attachmentName}
+            </if>
+            <if test="attachmentUser != null and attachmentUser != ''">
+                AND attachment_user = #{attachmentUser}
+            </if>
+            <if test="divIdType != null and divIdType != ''">
+                AND div_id_type = #{divIdType}
+            </if>
+            <if test="projectId != null and projectId != ''">
+                and project_id = #{projectId}
+            </if>
+            <if test="beginDate !=null">
+                AND a.create_date >= #{beginDate}
+            </if>
+            <if test="endDate !=null">
+                AND a.create_date &lt; #{endDate}
+            </if>
+        </where>
+    </select>
+
+    <select id="getFileList" resultType="WorkClientAttachment" >
+        SELECT
+        <include refid="workClientAttachmentColumns"/>
+        FROM work_attachment a
+        <include refid="workClientAttachmentJoins"/>
+        <where>
+            a.del_flag = #{DEL_FLAG_NORMAL}
+            and (a.div_id_type = '_exterNoProcess' or a.div_id_type = '_exterProcess')
+            <if test="attachmentId != null and attachmentId != ''">
+                AND a.attachment_id = #{attachmentId}
+            </if>
+            <if test="projectId != null and projectId != ''">
+                AND a.project_id = #{projectId}
+            </if>
+            <if test="attachmentFlag != null and attachmentFlag != ''">
+                AND attachment_flag = #{attachmentFlag}
+            </if>
+            <if test="attachmentName != null and attachmentName != ''">
+                AND a.attachment_name LIKE
+                <if test="dbName == 'oracle'">'%'||#{attachmentName}||'%'</if>
+                <if test="dbName == 'mssql'">'%'+#{attachmentName}+'%'</if>
+                <if test="dbName == 'mysql'">concat('%',#{attachmentName},'%')</if>
+            </if>
+            <if test="attachmentUser != null and attachmentUser != ''">
+                AND attachment_user = #{attachmentUser}
+            </if>
+            <if test="divIdType != null and divIdType != ''">
+                AND div_id_type = #{divIdType}
+            </if>
+            <if test="projectId != null and projectId != ''">
+                and project_id = #{projectId}
+            </if>
+            <if test="beginDate !=null">
+                AND a.create_date >= #{beginDate}
+            </if>
+            <if test="endDate !=null">
+                AND a.create_date &lt; #{endDate}
+            </if>
+        </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>
 </mapper>

+ 22 - 0
src/main/resources/mappings/modules/workprojectnotify/WorkProjectNotifyDao.xml

@@ -476,6 +476,21 @@
 		</choose>
 	</select>
 
+	<select id="findNewReadStateByNotifyId" resultType="User" >
+		SELECT
+		u.id ,u.name,u.login_name AS "loginName",u.photo
+		FROM work_project_notify a
+		LEFT JOIN sys_user u ON u.id = a.notify_user
+		<where>
+			a.del_flag = #{DEL_FLAG_NORMAL} AND a.status != '1' AND a.notify_id = #{notifyId} and notify_user =#{auditor}
+		</where>
+		<choose>
+			<otherwise>
+				ORDER BY a.update_date DESC
+			</otherwise>
+		</choose>
+	</select>
+
 	<select id="findAllList" resultType="WorkProjectNotify" >
 		SELECT
 		<include refid="workProjectNotifyColumns"/>
@@ -650,6 +665,13 @@
 									   status = #{status}
 		WHERE notify_id = #{notifyId} AND status != '1'
 	</update>
+	<update id="updateNewReadStateByNotifyId">
+		UPDATE work_project_notify SET
+									   update_by = #{updateBy.id},
+									   update_date = #{updateDate},
+									   status = #{status}
+		WHERE notify_id = #{notifyId} AND status != '1' and notify_user = #{auditor}
+	</update>
 
 	<update id="updateReadStateByUserAndTitle">
 		UPDATE work_project_notify SET

+ 18 - 0
src/main/webapp/WEB-INF/tags/table/feedbackAddRow.tag

@@ -0,0 +1,18 @@
+<%@ tag language="java" pageEncoding="UTF-8"%>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<%@ attribute name="url" type="java.lang.String" required="true"%>
+<%@ attribute name="title" type="java.lang.String" required="true"%>
+<%@ attribute name="width" type="java.lang.String" required="false"%>
+<%@ attribute name="height" type="java.lang.String" required="false"%>
+<%@ attribute name="target" type="java.lang.String" required="false"%>
+<%@ attribute name="label" type="java.lang.String" required="false"%>
+<button class="layui-btn layui-btn-sm layui-bg-blue" data-toggle="tooltip" data-placement="left" onclick="add()" title="添加">
+<%--    <i class="fa fa-plus"></i> --%>
+    ${label==null?'添加':label}
+</button>
+<%-- 使用方法: 1.将本tag写在查询的form之前;2.传入table的id和controller的url --%>
+<script type="text/javascript">
+	function add(){
+        openDialogre('${title}'+"登记",encodeURI("${url}"),"${width==null?'95%':width}", "${height==null?'95%':height}","${target}","inputForm"," layui-border-box");
+	}
+</script>

+ 118 - 0
src/main/webapp/webpage/modules/externalUnit/capitalDemandFormAdd.jsp

@@ -0,0 +1,118 @@
+<%@ 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" src="${ctxStatic}/helloweba_editable-select/jquery.editable-select.min.js"></script>
+	<link rel='stylesheet' type="text/css" href="${ctxStatic}/helloweba_editable-select/jquery.editable-select.min.css"/>
+	<script type="text/javascript">
+		var validateForm;
+		function doSubmit(obj){//回调函数,在编辑和保存动作时,供openDialog调用提交表单。
+			console.log('obj',obj)
+		  if(validateForm.form()){
+			  console.log('obj',validateForm.form())
+			  if(obj == 1){
+				  if($("#examiner").val() == ""){
+					  parent.layer.msg("请选择审核人!", {icon: 5});
+					  return false;
+				  }
+				  //送审
+				  $("#inputForm").submit();
+				  return true;
+			  }else if(obj ==2){
+				  //暂存
+				  $("#inputForm").attr("action","${ctx}/externalUnit/capitalDemand/store");
+			  }else if(obj ==3){
+				  //暂存
+				  $("#inputForm").attr("action","${ctx}/externalUnit/capitalDemand/store");
+			  }
+			  $("#inputForm").submit();
+			  return true;
+		  }else {
+			  parent.layer.msg("信息未填写完整!", {icon: 5});
+		  }
+		  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">
+		<form:form id="inputForm" modelAttribute="capitalDemand" action="${ctx}/externalUnit/capitalDemand/saveDemand" method="post" class="form-horizontal">
+		<form:hidden path="project.id"/>
+		<form:hidden path="id"/>
+			<div class="form-group layui-row first">
+				<div class="form-group-label"><h2>项目基本信息</h2></div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>项目名称:</label>
+					<div class="layui-input-block">
+						<form:input readonly="true" path="project.name" placeholder="请输入项目名称" htmlEscape="false"  class="form-control layui-input required"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>建设方:</label>
+					<div class="layui-input-block">
+						<form:input readonly="true" path="project.projectBuilder" placeholder="请输入建设方" htmlEscape="false"  class="form-control layui-input required"/>
+
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>建设地点:</label>
+					<div class="layui-input-block">
+						<form:input readonly="true" path="project.buildPlace" placeholder="请输入建设地点" htmlEscape="false"  class="form-control layui-input required"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw7">
+					<label class="layui-form-label">创建人:</label>
+					<div class="layui-input-block">
+						<form:input path="project.createBy.name" htmlEscape="false"  readonly="true"  class="form-control  layui-input"/>
+						<form:hidden path="project.createBy.id" htmlEscape="false"   readonly="true"  class="form-control  layui-input"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm12 lw7 with-textarea">
+					<label class="layui-form-label ">备注:</label>
+					<div class="layui-input-block">
+						<form:textarea disabled="true" placeholder="请输入备注" readonly="true" path="project.remarks" htmlEscape="false" rows="4"  maxlength="255"  class="form-control "/>
+					</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">
+						<form:select path="examiner" cssClass="form-control required judgment simple-select">
+							<form:option value="" label=""/>
+							<c:forEach items="${projectMembers}" var="member">
+								<option value="${member.id}" <c:if test="${examiner==member.id}">selected</c:if> >${member.name}</option>
+							</c:forEach>
+						</form:select>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm12 lw7 with-textarea">
+					<label class="layui-form-label "><span class="require-item">*</span>备注:</label>
+					<div class="layui-input-block">
+						<form:textarea placeholder="请输入备注" path="remarks" htmlEscape="false" rows="4"  maxlength="255"  class="form-control required"/>
+					</div>
+				</div>
+			</div>
+	</form:form>
+	</div>
+</div>
+</body>
+</html>

+ 406 - 0
src/main/webapp/webpage/modules/externalUnit/capitalDemandFormAudit.jsp

@@ -0,0 +1,406 @@
+<%@ 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" src="${ctxStatic}/helloweba_editable-select/jquery.editable-select.min.js"></script>
+	<script type="text/javascript" src="${ctxStatic}/iCheck/icheck.min.js"></script>
+	<script type="text/javascript" src="${ctxStatic}/layui/layui.js"></script>
+	<script src="${ctxStatic}/common/html/js/script.js"></script>
+
+	<link rel='stylesheet' type="text/css" href="${ctxStatic}/helloweba_editable-select/jquery.editable-select.min.css"/>
+	<link rel='stylesheet' type="text/css" href="${ctxStatic}/layui/css/layui.css"/>
+
+	<script src="${ctxStatic}/bootstrap-select-1.12.4/js/bootstrap-select.min.js"></script>
+	<link href="${ctxStatic}/bootstrap-select-1.12.4/css/bootstrap-select.min.css" rel="stylesheet" />
+	<script src="${ctxStatic}/layer-v2.3/layui/xmSelect.js" charset="utf-8"></script>
+
+
+
+
+	<script type="text/javascript">
+		var validateForm;
+		function doSubmit(obj){//回调函数,在编辑和保存动作时,供openDialog调用提交表单。
+			console.log('obj',obj)
+		  if(validateForm.form()){
+			  if(obj == 1) {
+				  $("#flag").val("yes");
+			  }else {
+				  $("#flag").val("no");
+			  }
+			  $("#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);
+					}
+				}
+			});
+
+			layui.use(['form', 'layer'], function () {
+				var form = layui.form;
+				//是否转办监听器
+				form.on('radio(ext)', function(data){
+					console.log('da',data.value)
+					var span=data.value;
+					if(span== '0'){
+						$("#zbr").show();
+					}else{
+						$("#zbr").hide();
+					}
+				});
+			});
+			$('input[name="ext"]').on('ifChecked', function(event){
+				disUscc(event.target.defaultValue);
+			});
+			disUscc($('input[name="ext"]:checked').val());
+
+
+			$("#attachment_btn_conciliationRecords").click(function () {
+				$("#attachment_file_conciliationRecords").click();
+			});
+
+			$("input[name='ext']").on('ifChecked',function(event){
+				radioVal = $(this).val();
+				console.log('radioVal',radioVal)
+				if(radioVal == '0'){
+					$("#zbr").show();
+				}else{
+					$("#zbr").hide();
+				}
+			});
+		});
+		function disUscc(hasUscc) {
+			if("0"==hasUscc){
+				$("#zbr").show();
+			}else {
+				$("#zbr").hide();
+
+			}
+		}
+
+		function insertTitle(tValue){
+			console.log('insertTitle')
+			var list = "${capitalDemand.workAttachments}";
+			var size = (list.split('url')).length-1;
+			var files = $("#attachment_file_conciliationRecords")[0].files;
+			for(var i = 0;i<files.length;i++) {
+				var file = files[i];
+				var attachmentId = "";
+				var attachmentFlag = "160";
+				console.log(file);
+				var timestamp = new Date().getTime();
+				var remarks = ""
+				var storeAs = "externalUnit";
+				var uploadPath = "http://gangwan-app.oss-cn-hangzhou.aliyuncs.com/" + storeAs;
+				/*将这段字符串存到数据库即可*/
+				var divId = "_exterProcess";
+				$("#addFile" + divId).show();
+				multipartUploadWithSts(storeAs, file, attachmentId, attachmentFlag, uploadPath, divId, size);
+			}
+			console.log('list',files)
+		}
+		function addFile() {
+			$("#attachment_file_conciliationRecords").click();
+		}
+	</script>
+</head>
+<body>
+<div class="single-form">
+	<div class="container">
+		<form:form id="inputForm" modelAttribute="capitalDemand" action="${ctx}/externalUnit/capitalDemand/saveAuditDemand" method="post" class="form-horizontal">
+		<form:hidden path="project.id"/>
+		<form:hidden path="id"/>
+		<form:hidden path="home"/>
+		<form:hidden path="act.taskId"/>
+		<form:hidden path="act.taskName"/>
+		<form:hidden path="act.taskDefKey"/>
+		<form:hidden path="act.procInsId"/>
+		<form:hidden path="act.procDefId"/>
+		<form:hidden id="flag" path="act.flag"/>
+			<div class="form-group layui-row first">
+				<div class="form-group-label"><h2>项目基本信息</h2></div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>项目名称:</label>
+					<div class="layui-input-block">
+						<form:input readonly="true" path="project.name" placeholder="请输入项目名称" htmlEscape="false"  class="form-control layui-input required"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>建设方:</label>
+					<div class="layui-input-block">
+						<form:input readonly="true" path="project.projectBuilder" placeholder="请输入建设方" htmlEscape="false"  class="form-control layui-input required"/>
+
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>建设地点:</label>
+					<div class="layui-input-block">
+						<form:input readonly="true" path="project.buildPlace" placeholder="请输入建设地点" htmlEscape="false"  class="form-control layui-input required"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw7">
+					<label class="layui-form-label">创建人:</label>
+					<div class="layui-input-block">
+						<form:input path="project.createBy.name" htmlEscape="false"  readonly="true"  class="form-control  layui-input"/>
+						<form:hidden path="project.createBy.id" htmlEscape="false"   readonly="true"  class="form-control  layui-input"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm12 lw7 with-textarea">
+					<label class="layui-form-label ">备注:</label>
+					<div class="layui-input-block">
+						<form:textarea disabled="true" placeholder="请输入备注" readonly="true" path="project.remarks" htmlEscape="false" rows="4"  maxlength="255"  class="form-control "/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm12 lw7 with-textarea">
+					<label class="layui-form-label "><span class="require-item">*</span>备注:</label>
+					<div class="layui-input-block">
+						<form:textarea placeholder="请输入备注" readonly="true" path="remarks" htmlEscape="false" rows="4"  maxlength="255"  class="form-control required judgment"/>
+					</div>
+				</div>
+
+
+			</div>
+			<div class="form-group layui-row first">
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label">是否转办:</label>
+					<div class="layui-input-block">
+						<form:radiobutton  class="i-checks" path="ext" value="0" label="转办"  />
+						<form:radiobutton  class="i-checks" path="ext" value="1" label="不转办" checked="true" />
+					</div>
+				</div>
+				<div id="zbr">
+					<div class="layui-item layui-col-sm6 lw7">
+
+						<label class="layui-form-label">转办人:</label>
+						<div class="layui-input-block">
+							<form:select path="turner" cssClass="form-control judgment simple-select">
+								<form:option value="" label=""/>
+								<c:forEach items="${projectMembers}" var="member">
+									<option value="${member.id}" <c:if test="${turner==member.id}">selected</c:if> >${member.name}</option>
+								</c:forEach>
+							</form:select>
+						</div>
+					</div>
+				</div>
+			</div>
+			<div class="form-group-label"><h2>文件管理</h2></div>
+			<div class="layui-item nav-btns">
+				<a id="attachment_btn_conciliationRecords" class="nav-btn nav-btn-add" title="上传文件"><i class="fa fa-plus"></i>&nbsp;添加附件</a>
+
+			</div>
+			<div id="addFile_exterProcess" style="display: none" class="upload-progress">
+				<span id="fileName_exterProcess"></span>
+				<b><span id="baifenbi_exterProcess"></span></b>
+				<div class="progress">
+						<%--进度条--%>
+					<div id="jindutiao_exterProcess" class="progress-bar" style="width: 0%" aria-valuenow="0">
+					</div>
+				</div>
+			</div>
+			<input id="attachment_file_conciliationRecords" type="file" multiple="multiple"
+				   style="display: none;" onChange="if(this.value)insertTitle(this.value);"/>
+			<span id="attachment_title_conciliationRecords"></span>
+			<div class="layui-item layui-col-xs12" style="padding:0 16px;">
+				<table id="upTable_conciliationRecords" class="table table-bordered table-condensed details">
+					<thead>
+					<tr>
+							<%-- <th>序号</th>--%>
+						<th>文件</th>
+						<th>上传人</th>
+						<th>上传时间</th>
+						<th width="200px">操作</th>
+					</tr>
+					</thead>
+					<tbody id="file_exterProcess">
+					<c:forEach items="${capitalDemand.workAttachments}" var="workClientAttachment"
+							   varStatus="status">
+						<tr>
+								<%-- <td>${status.index + 1}</td>--%>
+							<c:choose>
+								<c:when test="${capitalDemand.uploadMode == 2}">
+									<c:choose>
+										<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpg')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'png')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'gif')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'bmp')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpeg')}">
+											<td><img src="${workClientAttachment.temporaryUrl}" width="50" height="50" onclick="openDialogView('预览','${ctx}/sys/picturepreview/picturePreview?url=${workClientAttachment.temporaryUrl}','90%','90%')" alt="${workClientAttachment.attachmentName}">
+										</c:when>
+										<c:otherwise>
+											<c:choose>
+												<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+													<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',1)">${workClientAttachment.attachmentName}</a></td>
+												</c:when>
+												<c:otherwise>
+													<c:choose>
+														<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'rar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'zip')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'7z')}">
+															<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',3)">${workClientAttachment.attachmentName}</a></td>
+														</c:when>
+														<c:otherwise>
+															<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',2)">${workClientAttachment.attachmentName}</a></td>
+														</c:otherwise>
+													</c:choose>
+												</c:otherwise>
+											</c:choose>
+										</c:otherwise>
+									</c:choose>
+								</c:when>
+								<c:otherwise>
+									<c:choose>
+										<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpg')
+                                             or fn:containsIgnoreCase(workClientAttachment.attachmentName,'png')
+                                             or fn:containsIgnoreCase(workClientAttachment.attachmentName,'gif')
+                                             or fn:containsIgnoreCase(workClientAttachment.attachmentName,'bmp')
+                                             or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpeg')}">
+											<td><img src="${workClientAttachment.url}" width="50" height="50" onclick="openDialogView('预览','${ctx}/sys/picturepreview/picturePreview?url=${workClientAttachment.url}','90%','90%')" alt="${workClientAttachment.attachmentName}">
+										</c:when>
+										<c:otherwise>
+											<c:choose>
+												<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+													<td><a class="attention-info" href="javascript:void(0)"
+														   onclick="openPreview('${workClientAttachment.url}',1)">${workClientAttachment.attachmentName}</a>
+													</td>
+												</c:when>
+												<c:otherwise>
+													<c:choose>
+														<c:when test="${capitalDemand.uploadMode == 2}">
+															<c:choose>
+																<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpg')
+                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'png')
+                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'gif')
+                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'bmp')
+                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpeg')}">
+																	<td><img src="${workClientAttachment.temporaryUrl}" width="50" height="50" onclick="openDialogView('预览','${ctx}/sys/picturepreview/picturePreview?url=${workClientAttachment.temporaryUrl}','90%','90%')" alt="${workClientAttachment.attachmentName}">
+																</c:when>
+																<c:otherwise>
+																	<c:choose>
+																		<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+																			<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',1)">${workClientAttachment.attachmentName}</a></td>
+																		</c:when>
+																		<c:otherwise>
+																			<c:choose>
+																				<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'rar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'zip')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'7z')}">
+																					<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',3)">${workClientAttachment.attachmentName}</a></td>
+																				</c:when>
+																				<c:otherwise>
+																					<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',2)">${workClientAttachment.attachmentName}</a></td>
+																				</c:otherwise>
+																			</c:choose>
+																		</c:otherwise>
+																	</c:choose>
+																</c:otherwise>
+															</c:choose>
+														</c:when>
+														<c:otherwise>
+															<c:choose>
+																<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpg')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'png')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'gif')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'bmp')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpeg')}">
+																	<td><img src="${workClientAttachment.url}" width="50" height="50" onclick="openDialogView('预览','${ctx}/sys/picturepreview/picturePreview?url=${workClientAttachment.url}','90%','90%')" alt="${workClientAttachment.attachmentName}">
+																</c:when>
+																<c:otherwise>
+																	<c:choose>
+																		<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+																			<td><a href="javascript:void(0)" onclick="openPreview('${workClientAttachment.url}',1)">${workClientAttachment.attachmentName}</a></td>
+																		</c:when>
+																		<c:otherwise>
+																			<c:choose>
+																				<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'rar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'zip')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'7z')}">
+																					<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.url}',3)">${workClientAttachment.attachmentName}</a></td>
+																				</c:when>
+																				<c:otherwise>
+																					<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.url}',2)">${workClientAttachment.attachmentName}</a></td>
+																				</c:otherwise>
+																			</c:choose>
+																		</c:otherwise>
+																	</c:choose>
+																</c:otherwise>
+															</c:choose>
+														</c:otherwise>
+													</c:choose>
+												</c:otherwise>
+											</c:choose>
+										</c:otherwise>
+									</c:choose>
+								</c:otherwise>
+							</c:choose>
+
+
+
+							<td>${workClientAttachment.createBy.name}</td>
+							<td><fmt:formatDate value="${workClientAttachment.createDate}" type="both"/></td>
+							<td class="op-td">
+								<div class="op-btn-box">
+
+										<%--附件下载删除--%>
+									<c:choose>
+										<c:when test="${capitalDemand.uploadMode == 2}">
+											<c:choose>
+												<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+													<a href="${workClientAttachment.temporaryUrl}" target="_blank" class="op-btn op-btn-download"><i class="fa fa-download"></i>&nbsp;下载</a>
+												</c:when>
+												<c:otherwise>
+													<a href="${workClientAttachment.temporaryUrl}" class="op-btn op-btn-download"><i class="fa fa-download"></i>&nbsp;下载</a>
+												</c:otherwise>
+											</c:choose>
+										</c:when>
+										<c:otherwise>
+											<a href="javascript:location.href='${ctx}/workfullmanage/workFullManage/downLoadAttach?file='+encodeURIComponent('${workClientAttachment.url}');" class="op-btn op-btn-download"><i class="fa fa-download"></i>&nbsp;下载</a>
+										</c:otherwise>
+									</c:choose>
+									<c:if test="${workClientAttachment.createBy.id eq fns:getUser().id}">
+										<a href="javascript:void(0)"
+										   onclick="deleteFileFromAliyun(this,'${ctx}/sys/workattachment/deleteFileFromAliyun?url=${workClientAttachment.url}&id=${workClientAttachment.id}&type=2','addFile')"
+										   class="op-btn op-btn-delete"><i class="fa fa-trash"></i>&nbsp;删除</a>
+									</c:if>
+									<c:if test="${workClientAttachment.collectFlag != 1}">
+										<a href="javascript:void(0)" onclick="collectingAccessory(this,'${ctx}/projectAccessory/projectAccessory/saveCollectAccessory','${workClientAttachment.url}','${workClientAttachment.createBy.id}','${workClientAttachment.fileSize}')" class="op-btn layui-btn-warm" >&nbsp;收藏</a>
+									</c:if>
+								</div>
+							</td>
+						</tr>
+					</c:forEach>
+					</tbody>
+				</table>
+			</div>
+			<div>
+				<div class="form-group layui-row">
+					<div class="form-group-label"><h2>${projectNotifyType}审批流程</h2></div>
+					<div class="layui-item layui-col-xs12 form-table-container" >
+						<act:flowChart procInsId="${processInstanceId}"/>
+						<act:histoicFlow procInsId="${processInstanceId}"/>
+					</div>
+				</div>
+			</div>
+	</form:form>
+	</div>
+</div>
+</body>
+</html>

+ 240 - 0
src/main/webapp/webpage/modules/externalUnit/capitalDemandFormEdit.jsp

@@ -0,0 +1,240 @@
+<%@ 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" src="${ctxStatic}/helloweba_editable-select/jquery.editable-select.min.js"></script>
+	<link rel='stylesheet' type="text/css" href="${ctxStatic}/helloweba_editable-select/jquery.editable-select.min.css"/>
+	<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);
+					}
+				}
+			});
+		});
+
+		function changeUser(ids,names) {
+            $.ajax({
+                type:'POST',
+                dataType:'json',
+                url:'${ctx}/externalUnit/externalUnit/getProjectRecordUsers',
+                data:{"ids":ids},
+                cache:false,
+                success: function(data) {
+                    var str = "";
+					var userIds = $("#hiddenMemberIds").val()
+					console.log('userIds',userIds)
+
+					var msgInfo = "";
+                    for (var i=0; i<data.length; i++) {
+                        var msg = data[i].msg;
+                        if(msg == "del") {
+                            var id = data[i].id;
+                            $("#delFlag"+id).val("正常");
+                            $("#del"+id).css("display","inline-block");
+                        } else if (msg == "msg") {
+                            var id = data[i].id;
+                            var name = data[i].name;
+                            var office = data[i].officeId;
+                            var no = data[i].no;
+                            var mobile = data[i].mobile;
+                            var email = data[i].email;
+							if (userIds === undefined || userIds === null) {
+								userIds = "";
+							}
+							if (userIds && !userIds.endsWith(',')) {
+								userIds += ",";
+							}
+							userIds += id + ",";
+							str += '<tr id="'+id+'">' +
+                                '<td>' +
+                                no +
+                                '</td>' +
+                                '<td>' +
+                                name +
+                                '</td>' +
+                                '<td>' +
+                                office +
+                                '</td>' +
+                                '<td>' +
+                                mobile +
+                                '</td>' +
+                                '<td>' +
+                                email +
+                                '</td>' +
+                                '<td>' +
+                                '<span id="del'+id+'" onclick="delRow(this,\''+id+'\')" title="移除" class="op-btn op-btn-delete"><i class="fa fa-trash"></i>&nbsp;移除</span>' +
+                                '</td>' +
+                                '</tr>';
+                        } else {
+                            msgInfo = msg;
+                        }
+                    }
+                    $("#hiddenMemberIds").val(userIds)
+					console.log('ids',$("#hiddenMemberIds").val())
+                    $("#usersList").append(str);
+                    if (msgInfo!= null && msgInfo != '' && msgInfo!= undefined){
+                        parent.layer.msg("新增项目成员成功!"+msgInfo,{icon:1});
+                    }else {
+                        parent.layer.msg("新增项目成员成功!",{icon:1});
+                    }
+                },
+                error:function () {
+                    parent.layer.msg("获取用户信息失败!!!",{icon:2});
+                    parent.layer.close(loadingMessage);
+                }
+            });
+        }
+
+        function delRow(obj,id){
+			$(obj).parent().parent().remove();
+			// 从hiddenMemberIds数组中移除对应的id
+			var idsStr = $("#hiddenMemberIds").val();
+			console.log('idsStr',idsStr)
+
+			if (idsStr) {
+				// 将字符串转换为数组
+				var ids = idsStr.split(',');
+
+				// 从数组中移除对应的id
+				var index = ids.indexOf(id.toString()); // 确保id是字符串,与ids数组中的格式一致
+				if (index > -1) {
+					ids.splice(index, 1);
+					var newIds = ids.join(',')
+					if (newIds && !newIds.endsWith(',')) {
+						newIds += ",";
+					}
+					// 将数组转换回字符串,并更新隐藏输入元素的值
+					$("#hiddenMemberIds").val(newIds);
+
+				}
+			}
+			console.log('123',$("#hiddenMemberIds").val())
+		}
+        function getSelectUserIds() {
+            return "";
+        }
+	</script>
+</head>
+<body>
+<div class="single-form">
+	<div class="container">
+		<form:form id="inputForm" modelAttribute="capitalDemand" action="${ctx}/externalUnit/externalUnit/save" method="post" class="form-horizontal">
+		<form:hidden path="id"/>
+			<div class="form-group layui-row first">
+				<div class="form-group-label"><h2>项目基本信息</h2></div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>项目名称:</label>
+					<div class="layui-input-block">
+						<form:input readonly="true" path="project.name" placeholder="请输入项目名称" htmlEscape="false"  class="form-control layui-input required"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>建设方:</label>
+					<div class="layui-input-block">
+						<form:input readonly="true" path="project.projectBuilder" placeholder="请输入建设方" htmlEscape="false"  class="form-control layui-input required"/>
+
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>建设地点:</label>
+					<div class="layui-input-block">
+						<form:input readonly="true" path="project.buildPlace" placeholder="请输入建设地点" htmlEscape="false"  class="form-control layui-input required"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw7">
+					<label class="layui-form-label">创建人:</label>
+					<div class="layui-input-block">
+						<form:input path="createBy.name" htmlEscape="false"  readonly="true"  class="form-control  layui-input"/>
+						<form:hidden path="createBy.id" htmlEscape="false"   readonly="true"  class="form-control  layui-input"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm12 lw7 with-textarea">
+					<label class="layui-form-label ">备注:</label>
+					<div class="layui-input-block">
+						<form:textarea placeholder="请输入备注" readonly="true" path="project.remarks" htmlEscape="false" rows="4"  maxlength="255"  class="form-control "/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm12 lw7 with-textarea">
+					<label class="layui-form-label ">备注:</label>
+					<div class="layui-input-block">
+						<form:textarea placeholder="请输入备注" path="remarks" htmlEscape="false" rows="4"  maxlength="255"  class="form-control "/>
+					</div>
+				</div>
+			</div>
+
+	<div class="form-group layui-row">
+		<div class="form-group-label"><h2>成员明细</h2></div>
+		<input type="hidden" id="hiddenMemberIds" name="memberIds" value="${projectRecords.memberIds}">
+		<div class="layui-item nav-btns">
+			<sys:inquiretreeselectusers id="members" name="projectMembers" value="${projectRecords.memberIds}" labelName="memberNameStr" labelValue="${projectRecords.memberNameStr}"
+								 title="用户" url="/sys/office/treeDataAll?type=3" checked="true" cssClass="form-control required" allowClear="true" notAllowSelectParent="true"/>
+			<%--<a class="nav-btn nav-btn-add" onclick="addRow('#workAccountList', workAccountListRowIdx, workAccountListTpl);workAccountListRowIdx = workAccountListRowIdx + 1;" title="新增"><i class="fa fa-plus"></i>&nbsp;新增</a>--%>
+		</div>
+		<div class="layui-item layui-col-xs12 form-table-container" >
+			<table  class="table table-bordered table-condensed no-bottom-margin details">
+				<thead>
+				<tr>
+					<th>工号</th>
+					<th>姓名</th>
+					<th>部门</th>
+					<th>手机号</th>
+					<th>邮箱</th>
+					<th>操作</th>
+				</tr>
+				</thead>
+				<tbody id="usersList">
+				<c:if test="${not empty projectRecords.projectMembers}">
+					<c:forEach items="${projectRecords.projectMembers}" var="user">
+						<tr id="${user.id}">
+							<td>
+									${user.no}
+							</td>
+							<td>
+									${user.name}
+							</td>
+							<td>
+									${user.office.name}
+							</td>
+							<td>
+									${user.mobile}
+							</td>
+							<td>
+									${user.email}
+							</td>
+							<td>
+								<span id="del${user.id}" onclick="delRow(this,'${user.id}')" title="移除" class="op-btn op-btn-delete"><i class="fa fa-trash"></i>&nbsp;移除</span>
+							</td>
+						</tr>
+					</c:forEach>
+				</c:if>
+				</tbody>
+			</table>
+		</div>
+		<div class="form-group layui-row page-end"></div>
+	</div>
+	</form:form>
+	</div>
+</div>
+</body>
+</html>

+ 112 - 0
src/main/webapp/webpage/modules/externalUnit/capitalDemandFormModify.jsp

@@ -0,0 +1,112 @@
+<%@ 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" src="${ctxStatic}/helloweba_editable-select/jquery.editable-select.min.js"></script>
+	<link rel='stylesheet' type="text/css" href="${ctxStatic}/helloweba_editable-select/jquery.editable-select.min.css"/>
+	<script type="text/javascript">
+		var validateForm;
+		function doSubmit(obj){//回调函数,在编辑和保存动作时,供openDialog调用提交表单。
+			console.log('obj',obj)
+		  if(validateForm.form()){
+			  if(validateForm.form()){
+				  $("#inputForm").attr("action","${ctx}/externalUnit/capitalDemand/saveDemand");
+				  $("#inputForm").submit();
+				  return true;
+			  }else {
+				  parent.layer.msg("信息未填写完整!", {icon: 5});
+			  }
+		  }
+		  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">
+		<form:form id="inputForm" modelAttribute="capitalDemand" action="${ctx}/externalUnit/capitalDemand/saveDemand" method="post" class="form-horizontal">
+		<form:hidden path="project.id"/>
+		<form:hidden path="id"/>
+		<form:hidden path="home"/>
+		<form:hidden path="act.taskId"/>
+		<form:hidden path="act.taskName"/>
+		<form:hidden path="act.taskDefKey"/>
+		<form:hidden path="act.procInsId"/>
+		<form:hidden path="act.procDefId"/>
+		<form:hidden id="flag" path="act.flag"/>
+			<div class="form-group layui-row first">
+				<div class="form-group-label"><h2>项目基本信息</h2></div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>项目名称:</label>
+					<div class="layui-input-block">
+						<form:input readonly="true" path="project.name" placeholder="请输入项目名称" htmlEscape="false"  class="form-control layui-input required"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>建设方:</label>
+					<div class="layui-input-block">
+						<form:input readonly="true" path="project.projectBuilder" placeholder="请输入建设方" htmlEscape="false"  class="form-control layui-input required"/>
+
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>建设地点:</label>
+					<div class="layui-input-block">
+						<form:input readonly="true" path="project.buildPlace" placeholder="请输入建设地点" htmlEscape="false"  class="form-control layui-input required"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw7">
+					<label class="layui-form-label">创建人:</label>
+					<div class="layui-input-block">
+						<form:input path="project.createBy.name" htmlEscape="false"  readonly="true"  class="form-control  layui-input"/>
+						<form:hidden path="project.createBy.id" htmlEscape="false"   readonly="true"  class="form-control  layui-input"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm12 lw7 with-textarea">
+					<label class="layui-form-label ">备注:</label>
+					<div class="layui-input-block">
+						<form:textarea disabled="true" placeholder="请输入备注" readonly="true" path="project.remarks" htmlEscape="false" rows="4"  maxlength="255"  class="form-control "/>
+					</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">
+						<form:select path="examiner" cssClass="form-control judgment simple-select required judgment">
+							<form:option value="" label=""/>
+							<c:forEach items="${projectMembers}" var="member">
+								<option value="${member.id}" <c:if test="${examiner==member.id}">selected</c:if> >${member.name}</option>
+							</c:forEach>
+						</form:select>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm12 lw7 with-textarea">
+					<label class="layui-form-label "><span class="require-item">*</span>备注:</label>
+					<div class="layui-input-block">
+						<form:textarea placeholder="请输入备注" path="remarks" htmlEscape="false" rows="4"  maxlength="255"  class="form-control required judgment"/>
+					</div>
+				</div>
+			</div>
+	</form:form>
+	</div>
+</div>
+</body>
+</html>

+ 15 - 0
src/main/webapp/webpage/modules/externalUnit/capitalDemandTask.jsp

@@ -0,0 +1,15 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<html>
+<head>
+	<title>流程追踪</title>
+	<meta name="decorator" content="default"/>
+</head>
+<body class="gray-bg">
+<div class="container form layui-form">
+	<act:flowChart procInsId="${processInstanceId}"/>
+	<act:histoicFlow procInsId="${processInstanceId}"/>
+</div>
+</body>
+</html>
+

+ 380 - 0
src/main/webapp/webpage/modules/externalUnit/externalUnitCapitalDemandList.jsp

@@ -0,0 +1,380 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<%
+	String param = request.getParameter("param");
+
+%>
+<html>
+<head>
+	<title>提资需求</title>
+	<meta name="decorator" content="default"/>
+	<script type="text/javascript" src="${ctxStatic}/layui/layui.js"></script>
+	<link rel='stylesheet' type="text/css" href="${ctxStatic}/layui/css/layui.css"/>
+	<script src="${ctxStatic}/layer-v2.3/layui/xmSelect.js" charset="utf-8"></script>
+
+	<link href="${ctxStatic}/bootstrap-select-1.12.4/css/bootstrap-select.min.css" rel="stylesheet" />
+	<style>
+
+		.list-form-tab li.current {
+			background-color: #007BFF; /* 蓝色背景 */
+			color: white; /* 白色字体 */
+		}
+	</style>
+	<script src="${ctxStatic}/bootstrap-select-1.12.4/js/bootstrap-select.min.js"></script>
+	<script type="text/javascript">
+		var validateForm;
+		var exitName = true;
+		function doSubmit(){//回调函数,在编辑和保存动作时,供openDialog调用提交表单。
+			if(validateForm.form()) {
+				$("#inputForm").submit();
+				return true;
+			}
+		}
+
+		$(document).ready(function() {
+			layui.use(['form', 'layer'], function () {
+				var form = layui.form;
+			});
+			$("#attachment_btn_conciliationRecords").click(function () {
+				$("#attachment_file_conciliationRecords").click();
+			});
+
+			validateForm = $("#inputForm").validate({
+				submitHandler: function(form){
+					loading('正在提交,请稍等...');
+					form.submit();
+				},
+			});
+
+			$(".list-tabs li").click(function(){
+				$(".list-tabs li").each(function(){
+					$(this).removeAttr("class","active");
+					var id='#'+$(this).find("span").html();
+					$(id).attr("class","hide");
+				})
+				$(this).attr("class","active");
+				var id='#'+$(this).find("span").html();
+				$(id).removeAttr("class","hide");
+
+			})
+
+		});
+
+
+		function insertTitle(tValue){
+			console.log('insertTitle')
+			var list = "${projectRecords.workAttachments}";
+			var size = (list.split('url')).length-1;
+			var files = $("#attachment_file_conciliationRecords")[0].files;
+			for(var i = 0;i<files.length;i++) {
+				var file = files[i];
+				var attachmentId = "";
+				var attachmentFlag = "120";
+				console.log(file);
+				var timestamp = new Date().getTime();
+
+				var storeAs = "externalUnit";
+				var uploadPath = "http://gangwan-app.oss-cn-hangzhou.aliyuncs.com/" + storeAs;
+				/*将这段字符串存到数据库即可*/
+				var divId = "_attachment_conciliationRecords";
+				$("#addFile" + divId).show();
+				multipartUploadWithSts(storeAs, file, attachmentId, attachmentFlag, uploadPath, divId, size);
+			}
+			console.log('list',files)
+		}
+		function addFile() {
+			$("#attachment_file_conciliationRecords").click();
+		}
+		function openDialogre(title,url,width,height,target,formId,tableId){
+			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: false, //开启最大化最小化按钮
+				content: url ,
+				skin:"three-btns",
+				btn: ['送审','暂存','关闭'],
+				btn1: 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中展示
+					inputForm.attr("action","${ctx}/externalUnit/capitalDemand/saveDemand");//表单提交成功后,从服务器返回的url在当前tab中展示
+					var $document = iframeWin.contentWindow.document;
+
+					formSubmit2($document,formId,index,tableId);
+				},
+				btn2: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中展示
+					inputForm.attr("action","${ctx}/externalUnit/capitalDemand/store");//表单提交成功后,从服务器返回的url在当前tab中展示
+					var $document = iframeWin.contentWindow.document;
+
+					formSubmit2($document,formId,index,tableId);
+				},
+				btn3: function(index){
+				}
+			});
+
+		}
+		function formSubmit2($document,inputForm,index,tableId){
+
+			var validateForm = $($document.getElementById(inputForm)).validate({
+				submitHandler: function(form){
+					loading('正在提交,请稍等...');
+					form.submit();
+				},
+				errorContainer: "#messageBox",
+				errorPlacement: function(error, element) {
+					$($document.getElementById("#messageBox")).text("输入有误,请先更正。");
+					if (element.is(":checkbox")||element.is(":radio")||element.parent().is(".input-append")){
+						error.appendTo(element.parent().parent());
+					} else {
+						error.insertAfter(element);
+					}
+				}
+			});
+			if(validateForm.form()){
+				$($document.getElementById(inputForm)).ajaxSubmit({
+					success:function(data) {
+						var d = data;
+						//输出提示信息
+						if(d.str.length>0){
+							parent.layer.msg(d.str,{icon:1});
+						}
+						window.location.reload();
+						//关闭当前页
+						top.layer.close(index)
+					}
+				});
+			}
+		}
+		function subConfirmx(mess, href, closed){
+			console.log('12132')
+			top.layer.confirm(mess, {icon: 3, title:'系统提示'}, function(index){
+				//do something
+				if (typeof href == 'function') {
+					href();
+				}else{
+					$.ajax({
+						type:"post",
+						url:href,
+						dataType:"json",
+						success:function(data){
+							if(data.success) {
+								top.layer.msg(data.str, {icon: 1});
+								window.location.reload();
+							}else {
+								top.layer.msg(data.str, {icon: 0});
+							}
+						}
+					})
+				}
+				top.layer.close(index);
+			});
+			return false;
+		}
+
+	</script>
+
+</head>
+<body>
+<div class="single-form">
+	<div class="tapfixed">
+		<div class="list-form-tab contentShadow shadowLTR" id="tabDiv">
+			<ul class="list-tabs" >
+				<li ><a href="${ctx}/externalUnit/externalUnit/projectFile?id=${projectRecords.id}">文件管理</a></li>
+				<li class="active"><a href="${ctx}/externalUnit/capitalDemand/capitalDemand?id=${projectRecords.id}">提资需求</a></li>
+				<li><a href="${ctx}/externalUnit/feedback/list?id=${projectRecords.id}">意见反馈</a></li>
+			</ul>
+		</div>
+	</div>
+	<div class="layui-row" style="margin-top: 60px;">
+		<div class="full-width fl">
+			<div class="layui-row contentShadow shadowLR" id="queryDiv">
+				<form:form id="searchForm" modelAttribute="projectRecords" action="${ctx}/externalUnit/capitalDemand/capitalDemand?id=${projectRecords.id}" 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 lw6">--%>
+<%--						<div class="layui-item query athird">--%>
+<%--							<label class="layui-form-label">文件名称:</label>--%>
+<%--							<div class="layui-input-block">--%>
+<%--								<form:input path="name" htmlEscape="false" maxlength="64"  class=" form-control  layui-input"/>--%>
+<%--							</div>--%>
+<%--						</div>--%>
+<%--						<div class="layui-item query athird ">--%>
+<%--							<label class="layui-form-label">提交人:</label>--%>
+<%--							<div class="layui-input-block">--%>
+<%--								<form:input path="createBy.name" htmlEscape="false" maxlength="255"  class=" form-control layui-input"/>--%>
+<%--							</div>--%>
+<%--						</div>--%>
+<%--						<div class="layui-item fr">--%>
+<%--							<div class="input-group">--%>
+<%--								<a href="#" id="moresee"><i class="glyphicon glyphicon-menu-down"></i></a>--%>
+<%--								<div class="layui-btn-group search-spacing">--%>
+<%--									<button id="searchQuery" class="layui-btn layui-btn-sm  layui-bg-blue" onclick="search()">查询</button>--%>
+<%--									<button id="searchReset" class="layui-btn layui-btn-sm" onclick="resetSearch()">重置</button>--%>
+<%--								</div>--%>
+<%--							</div>--%>
+<%--						</div>--%>
+<%--						<div style="    clear:both;"></div>--%>
+<%--					</div>--%>
+<%--					<div id="moresees" style="clear:both;display:none;" class="lw6">--%>
+
+
+<%--						<div class="layui-item query athird ">--%>
+<%--							<label class="layui-form-label">创建时间:</label>--%>
+<%--							<div class="layui-input-block">--%>
+<%--								<input id="beginDate" name="beginDate" placeholder="开始时间" type="text" readonly="readonly" maxlength="20" class="laydate-icondate form-control layer-date layui-input laydate-icon query-group"--%>
+<%--									   value="<fmt:formatDate value="${subProjectInfo.beginDate}" pattern="yyyy-MM-dd"/>"/>--%>
+<%--								</input>--%>
+<%--								<span class="group-sep">-</span>--%>
+<%--								<input id="endDate" name="endDate" placeholder="结束时间" type="text" readonly="readonly" maxlength="20" class="laydate-icondate form-control layer-date layui-input laydate-icon query-group"--%>
+<%--									   value="<fmt:formatDate value="${subProjectInfo.endDate}" pattern="yyyy-MM-dd"/>"/>--%>
+<%--								</input>--%>
+<%--							</div>--%>
+<%--						</div>--%>
+<%--						<div style="clear:both;"></div>--%>
+<%--					</div>--%>
+				</form:form>
+			</div>
+		</div>
+		<div class="full-width fl">
+			<div class="layui-form contentDetails contentShadow shadowLBR">
+				<div class="nav-btns">
+					<div class="layui-btn-group">
+						<table:feedbackAddRow url="${ctx}/externalUnit/capitalDemand/demandForm?projectId=${projectRecords.id}" title="提资需求"></table:feedbackAddRow><!-- 增加按钮 -->
+
+						<button class="layui-btn layui-btn-sm" data-toggle="tooltip" data-placement="left" onclick="sortOrRefresh()" title="刷新"> 刷新</button>
+					</div>
+					<div style="clear: both;"></div>
+				</div>
+				<table class="oa-table layui-table" id="contentTable1"></table>
+
+				<!-- 分页代码 -->
+				<table:page page="${page}"></table:page>
+				<div style="clear: both;"></div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script src="${ctxStatic}/layer-v2.3/layui/layui.all.js" charset="utf-8"></script>
+<script>
+	layui.use('table', function(){
+		layui.table.render({
+			limit:${ page.pageSize }
+			,elem: '#contentTable1'
+			,page: false
+			,cols: [[
+				// {checkbox: true, fixed: true},
+				{field:'index',align:'center', title: '序号',width:80}
+				,{field:'projectName',align:'center', title: '项目名称',minWidth:200,templet:function(d){
+						return "<a class=\"attention-info\" title=\"" + d.projectName + "\" href=\"javascript:void(0);\" onclick=\"openDialogView('查看项目信息', '${ctx}/externalUnit/externalUnit/detail?id=" + d.projectId +"','95%', '95%')\">" + d.projectName + "</a>";
+					}}
+				,{field:'remarks',align:'center', title: '备注', minWidth:150}
+				,{field:'createName',align:'center', title: '创建人', minWidth:150,templet:function(d){
+						return "<span title=\"" + d.createName + "\">" + d.createName + "</span>";
+					}}
+				,{field:'packTime',align:'center', title: '创建时间', minWidth:150}
+				,{field:'status',align:'center', title: '状态', minWidth:150,templet:function(d){
+						var st = directorApplicationState(d.status);
+						if(st.action)
+							var xml ="<span onclick=\"openDialogView('流程追踪', '${ctx}/externalUnit/capitalDemand/getDemandProcess?id=" + d.id + "','95%','95%')\" class=\"status-label status-label-" + st.label + "\" >" + st.status + "</span>";
+						else
+							var xml = "<span style=\"cursor:default;\" class=\"status-label status-label-" + st.label + "\" >" + st.status + "</span>";
+						return xml;
+					}}
+				,{field:'op',align:'center',title:"操作",minWidth:130,templet:function(d){
+						////对操作进行初始化
+						var xml="<div class=\"layui-btn-group\">";
+						if(d.canedits != undefined && d.canedits =="1")
+						{
+							xml+="<a href=\"#\" onclick=\"openDialogre('调整申请', '${ctx}/externalUnit/capitalDemand/demandForm?id=" + d.id + "&status="+d.status+"&projectId="+d.projectId+"','95%', '95%','','inputForm','layui-border-box')\" class=\"layui-btn layui-btn-xs layui-bg-green\" > 修改</a>";
+						}
+						if(d.canedit != undefined && d.canedit =="1")
+						{
+							xml+="<a href=\"#\" onclick=\"openDialogre('调整申请', '${ctx}/externalUnit/capitalDemand/demandForm?id=" + d.id + "&status="+d.status+"&projectId="+d.projectId+"','95%', '95%','','inputForm','layui-border-box')\" class=\"layui-btn layui-btn-xs layui-bg-green\" > 修改</a>";
+						}
+						if(d.candel != undefined && d.candel =="1")
+						{
+							xml+="<a href=\"${ctx}/externalUnit/capitalDemand/delete?id=" + d.id + "\" onclick=\"return subConfirmx('确认要删除该提资需求申请吗?', this.href)\" class=\"layui-btn layui-btn-xs layui-bg-red\"> 删除</a>";
+						}
+						if(d.cancancel != undefined && d.cancancel =="1")
+						{
+							xml+="<a href=\"${ctx}/externalUnit/capitalDemand/revoke?id=" + d.id + "&processInstanceId=" + d.procId + "&status="+d.status+"\" onclick=\"return subConfirmx('确认要撤回该提资需求审批吗?', this.href)\" class=\"layui-btn layui-btn-xs layui-bg-red\" > 撤回</a>";
+						}
+						xml+="</div>"
+						return xml;
+
+					}}
+			]]
+			,data: [
+				<c:if test="${ not empty page.list}">
+				<c:forEach items="${page.list}" var="demand" varStatus="index">
+				<c:if test="${index.index != 0}">,</c:if>
+				{
+					"index":"${index.index+1}"
+					,"id":"${demand.id}"
+					,"projectId":"${demand.projectId}"
+					,"createName":"${demand.createBy.name}"
+					,"status":"${demand.status}"
+					,"remarks":"${demand.remarks}"
+					,"projectName":"<c:out value="${demand.project.name}" escapeXml="true"/>"
+					,"packTime":"<fmt:formatDate value="${demand.createDate}" pattern="yyyy-MM-dd"/>"
+					<c:choose><c:when test="${flag == '1' or fns:getUser().id == demand.createBy.id}">
+					,"candel":	<c:choose><c:when test="${(demand.status == 1 || demand.status == 3) && fns:getUser().id == demand.createBy.id}">"1"</c:when><c:otherwise>"0"</c:otherwise></c:choose>
+					<c:if test="${(demand.status == 1) && fns:getUser().id == demand.createBy.id}">,"canedit":"1"</c:if>
+					<c:if test="${(demand.status == 3 or demand.status == 4) && fns:getUser().id == demand.createBy.id}">,"canedits":"1"</c:if>
+					,"cancancel":<c:choose><c:when test="${demand.status == 2 && fns:getUser().id == demand.createBy.id}">"1"</c:when><c:otherwise>"0"</c:otherwise></c:choose>
+					</c:when>
+					<c:otherwise>
+					,"candel":"0"
+					,"canedit":"0"
+					,"canedits":"0"
+					,"cancancel":"0"
+					/*,"deleteAdmin":"0"*/
+					</c:otherwise>
+					</c:choose>
+				}
+				</c:forEach>
+				</c:if>
+			]
+			// ,even: true
+			// ,height: 315
+		});
+	})
+
+	resizeListTable();
+	$("a").on("click",addLinkVisied);
+
+</script>
+<script>
+	resizeListWindow2();
+	$(window).resize(function(){
+		resizeListWindow2();
+	});
+</script>
+</body>
+</html>

+ 354 - 0
src/main/webapp/webpage/modules/externalUnit/externalUnitFeedbackList.jsp

@@ -0,0 +1,354 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<%
+	String param = request.getParameter("param");
+
+%>
+<html>
+<head>
+	<title>意见反馈</title>
+	<meta name="decorator" content="default"/>
+	<script type="text/javascript" src="${ctxStatic}/layui/layui.js"></script>
+	<link rel='stylesheet' type="text/css" href="${ctxStatic}/layui/css/layui.css"/>
+	<script src="${ctxStatic}/layer-v2.3/layui/xmSelect.js" charset="utf-8"></script>
+
+	<link href="${ctxStatic}/bootstrap-select-1.12.4/css/bootstrap-select.min.css" rel="stylesheet" />
+	<style>
+
+		.list-form-tab li.current {
+			background-color: #007BFF; /* 蓝色背景 */
+			color: white; /* 白色字体 */
+		}
+	</style>
+	<script src="${ctxStatic}/bootstrap-select-1.12.4/js/bootstrap-select.min.js"></script>
+	<script type="text/javascript">
+		var validateForm;
+		var exitName = true;
+		function doSubmit(){//回调函数,在编辑和保存动作时,供openDialog调用提交表单。
+			if(validateForm.form()) {
+				$("#inputForm").submit();
+				return true;
+			}
+		}
+
+		$(document).ready(function() {
+			layui.use(['form', 'layer'], function () {
+				var form = layui.form;
+			});
+
+			validateForm = $("#inputForm").validate({
+				submitHandler: function(form){
+					loading('正在提交,请稍等...');
+					form.submit();
+				},
+			});
+			function reset() {
+				$("#searchForm").resetForm();
+			}
+			$(".list-tabs li").click(function(){
+				$(".list-tabs li").each(function(){
+					$(this).removeAttr("class","active");
+					var id='#'+$(this).find("span").html();
+					$(id).attr("class","hide");
+				})
+				$(this).attr("class","active");
+				var id='#'+$(this).find("span").html();
+				$(id).removeAttr("class","hide");
+
+			})
+
+		});
+		function openDialogre(title,url,width,height,target,formId,tableId){
+			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: false, //开启最大化最小化按钮
+				content: url ,
+				skin:"three-btns",
+				btn: ['送审','暂存','关闭'],
+				btn1: 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中展示
+					inputForm.attr("action","${ctx}/externalUnit/feedback/save");//表单提交成功后,从服务器返回的url在当前tab中展示
+					var $document = iframeWin.contentWindow.document;
+
+					formSubmit2($document,formId,index,tableId);
+				},
+				btn2: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中展示
+					inputForm.attr("action","${ctx}/externalUnit/feedback/store");//表单提交成功后,从服务器返回的url在当前tab中展示
+
+					var $document = iframeWin.contentWindow.document;
+
+					formSubmit2($document,formId,index,tableId);
+				},
+				btn3: function(index){
+				}
+			});
+
+		}
+		function formSubmit2($document,inputForm,index,tableId){
+
+			var validateForm = $($document.getElementById(inputForm)).validate({
+				submitHandler: function(form){
+					loading('正在提交,请稍等...');
+					form.submit();
+				},
+				errorContainer: "#messageBox",
+				errorPlacement: function(error, element) {
+					$($document.getElementById("#messageBox")).text("输入有误,请先更正。");
+					if (element.is(":checkbox")||element.is(":radio")||element.parent().is(".input-append")){
+						error.appendTo(element.parent().parent());
+					} else {
+						error.insertAfter(element);
+					}
+				}
+			});
+			if(validateForm.form()){
+				$($document.getElementById(inputForm)).ajaxSubmit({
+					success:function(data) {
+						var d = data;
+						//输出提示信息
+						if(d.str.length>0){
+							parent.layer.msg(d.str,{icon:1});
+						}
+						window.location.reload();
+						//关闭当前页
+						top.layer.close(index)
+					}
+				});
+			}
+		}
+		function subConfirmx(mess, href, closed){
+			console.log('12132')
+			top.layer.confirm(mess, {icon: 3, title:'系统提示'}, function(index){
+				//do something
+				if (typeof href == 'function') {
+					href();
+				}else{
+					$.ajax({
+						type:"post",
+						url:href,
+						dataType:"json",
+						success:function(data){
+							if(data.success) {
+								top.layer.msg(data.str, {icon: 1});
+								window.location.reload();
+							}else {
+								top.layer.msg(data.str, {icon: 0});
+							}
+						}
+					})
+				}
+				top.layer.close(index);
+			});
+			return false;
+		}
+
+	</script>
+
+</head>
+<body>
+<div class="single-form">
+	<div class="tapfixed">
+		<div class="list-form-tab contentShadow shadowLTR" id="tabDiv">
+			<ul class="list-tabs" >
+				<li ><a href="${ctx}/externalUnit/externalUnit/projectFile?id=${projectRecords.id}">文件管理</a></li>
+				<li ><a href="${ctx}/externalUnit/capitalDemand/capitalDemand?id=${projectRecords.id}">提资需求</a></li>
+				<li class="active"><a href="${ctx}/externalUnit/feedback/list?id=${projectRecords.id}">意见反馈</a></li>
+			</ul>
+		</div>
+	</div>
+	<div class="layui-row" style="margin-top: 60px;">
+		<div class="full-width fl">
+			<div class="layui-row contentShadow shadowLR" id="queryDiv">
+				<form:form id="searchForm" modelAttribute="projectRecords" action="${ctx}/externalUnit/feedback/list?id=${projectRecords.id}" method="post" class="form-inline">
+					<input id="parentProId" type="hidden" value="${parentProId}"/>
+					<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 lw6">--%>
+<%--						<div class="layui-item query athird">--%>
+<%--							<label class="layui-form-label">文件名称:</label>--%>
+<%--							<div class="layui-input-block">--%>
+<%--								<form:input path="name" htmlEscape="false" maxlength="64"  class=" form-control  layui-input"/>--%>
+<%--							</div>--%>
+<%--						</div>--%>
+<%--						<div class="layui-item query athird ">--%>
+<%--							<label class="layui-form-label">提交人:</label>--%>
+<%--							<div class="layui-input-block">--%>
+<%--								<form:input path="createBy.name" htmlEscape="false" maxlength="255"  class=" form-control layui-input"/>--%>
+<%--							</div>--%>
+<%--						</div>--%>
+<%--						<div class="layui-item fr">--%>
+<%--							<div class="input-group">--%>
+<%--								<a href="#" id="moresee"><i class="glyphicon glyphicon-menu-down"></i></a>--%>
+<%--								<div class="layui-btn-group search-spacing">--%>
+<%--									<button id="searchQuery" class="layui-btn layui-btn-sm  layui-bg-blue" onclick="search()">查询</button>--%>
+<%--									<button id="searchReset" class="layui-btn layui-btn-sm" onclick="resetSearch()">重置</button>--%>
+<%--								</div>--%>
+<%--							</div>--%>
+<%--						</div>--%>
+<%--						<div style="    clear:both;"></div>--%>
+<%--					</div>--%>
+<%--					<div id="moresees" style="clear:both;display:none;" class="lw6">--%>
+
+
+<%--						<div class="layui-item query athird ">--%>
+<%--							<label class="layui-form-label">打包时间:</label>--%>
+<%--							<div class="layui-input-block">--%>
+<%--								<input id="beginDate" name="beginDate" placeholder="开始时间" type="text" readonly="readonly" maxlength="20" class="laydate-icondate form-control layer-date layui-input laydate-icon query-group"--%>
+<%--									   value="<fmt:formatDate value="${subProjectInfo.beginDate}" pattern="yyyy-MM-dd"/>"/>--%>
+<%--								</input>--%>
+<%--								<span class="group-sep">-</span>--%>
+<%--								<input id="endDate" name="endDate" placeholder="结束时间" type="text" readonly="readonly" maxlength="20" class="laydate-icondate form-control layer-date layui-input laydate-icon query-group"--%>
+<%--									   value="<fmt:formatDate value="${subProjectInfo.endDate}" pattern="yyyy-MM-dd"/>"/>--%>
+<%--								</input>--%>
+<%--							</div>--%>
+<%--						</div>--%>
+<%--						<div style="clear:both;"></div>--%>
+<%--					</div>--%>
+				</form:form>
+			</div>
+		</div>
+		<div class="full-width fl">
+			<div class="layui-form contentDetails contentShadow shadowLBR">
+				<div class="nav-btns">
+					<div class="layui-btn-group">
+						<table:feedbackAddRow url="${ctx}/externalUnit/feedback/form?projectId=${projectRecords.id}" title="意见反馈"></table:feedbackAddRow><!-- 增加按钮 -->
+<%--						<button class="layui-btn layui-btn-sm layui-bg-blue" title="意见反馈" onclick="openDialogre('意见反馈','${ctx}/externalUnit/feedback/form?projectId=${projectRecords.id}','95%','95%','inputForm',' layui-border-box')">添加</button>--%>
+						<button class="layui-btn layui-btn-sm" data-toggle="tooltip" data-placement="left" onclick="sortOrRefresh()" title="刷新"> 刷新</button>
+					</div>
+					<div style="clear: both;"></div>
+				</div>
+				<table class="oa-table layui-table" id="contentTable1"></table>
+
+				<!-- 分页代码 -->
+				<table:page page="${page}"></table:page>
+				<div style="clear: both;"></div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script src="${ctxStatic}/layer-v2.3/layui/layui.all.js" charset="utf-8"></script>
+<script>
+	layui.use('table', function(){
+		layui.table.render({
+			limit:${ page.pageSize }
+			,elem: '#contentTable1'
+			,page: false
+			,cols: [[
+				// {checkbox: true, fixed: true},
+				{field:'index',align:'center', title: '序号',width:80}
+				,{field:'projectName',align:'center', title: '项目名称',minWidth:200,templet:function(d){
+						return "<a class=\"attention-info\" title=\"" + d.projectName + "\" href=\"javascript:void(0);\" onclick=\"openDialogView('查看意见反馈信息', '${ctx}/externalUnit/feedback/detail?id=" + d.id +"','95%', '95%','inputForm',' layui-border-box')\">" + d.projectName + "</a>";
+					}}
+				,{field:'createName',align:'center', title: '创建人', minWidth:150,templet:function(d){
+						return "<span title=\"" + d.createName + "\">" + d.createName + "</span>";
+					}}
+				,{field:'packTime',align:'center', title: '创建时间', minWidth:150}
+				,{field:'status',align:'center', title: '状态', minWidth:150,templet:function(d){
+						var st = directorApplicationState(d.status);
+						if(st.action)
+							var xml ="<span onclick=\"openDialogView('流程追踪', '${ctx}/externalUnit/feedback/getProcess?id=" + d.id + "','95%','95%')\" class=\"status-label status-label-" + st.label + "\" >" + st.status + "</span>";
+						else
+							var xml = "<span style=\"cursor:default;\" class=\"status-label status-label-" + st.label + "\" >" + st.status + "</span>";
+						return xml;
+					}}
+				,{field:'op',align:'center',title:"操作",minWidth:130,templet:function(d){
+						////对操作进行初始化
+						var xml="<div class=\"layui-btn-group\">";
+						if(d.canedits != undefined && d.canedits =="1")
+						{
+							xml+="<a href=\"#\" onclick=\"openDialogre('调整申请', '${ctx}/externalUnit/feedback/form?id=" + d.id + "&status="+d.status+"&projectId="+d.projectId+"','95%', '95%','','inputForm','layui-border-box')\" class=\"layui-btn layui-btn-xs layui-bg-green\" > 修改</a>";
+						}
+						if(d.canedit != undefined && d.canedit =="1")
+						{
+							xml+="<a href=\"#\" onclick=\"openDialogre('调整申请', '${ctx}/externalUnit/feedback/form?id=" + d.id + "&status="+d.status+"&projectId="+d.projectId+"','95%', '95%','','inputForm','layui-border-box')\" class=\"layui-btn layui-btn-xs layui-bg-green\" > 修改</a>";
+						}
+						if(d.candel != undefined && d.candel =="1")
+						{
+							xml+="<a href=\"${ctx}/externalUnit/feedback/delete?id=" + d.id + "\" onclick=\"return subConfirmx('确认要删除该意见反馈申请吗?', this.href)\" class=\"layui-btn layui-btn-xs layui-bg-red\"> 删除</a>";
+						}
+						if(d.cancancel != undefined && d.cancancel =="1")
+						{
+							xml+="<a href=\"${ctx}/externalUnit/feedback/revoke?id=" + d.id + "&processInstanceId=" + d.procId + "&status="+d.status+"\" onclick=\"return subConfirmx('确认要撤回该意见反馈审批吗?', this.href)\" class=\"layui-btn layui-btn-xs layui-bg-red\" > 撤回</a>";
+						}
+						xml+="</div>"
+						return xml;
+
+					}}
+			]]
+			,data: [
+				<c:if test="${ not empty page.list}">
+				<c:forEach items="${page.list}" var="feedback" varStatus="index">
+				<c:if test="${index.index != 0}">,</c:if>
+				{
+					"index":"${index.index+1}"
+					,"id":"${feedback.id}"
+					,"projectId":"${feedback.projectId}"
+					,"createName":"${feedback.createBy.name}"
+					,"status":"${feedback.status}"
+					,"remarks":"${feedback.remarks}"
+					,"projectName":"<c:out value="${feedback.project.name}" escapeXml="true"/>"
+					,"packTime":"<fmt:formatDate value="${feedback.createDate}" pattern="yyyy-MM-dd"/>"
+					<c:choose><c:when test="${flag == '1' or fns:getUser().id == feedback.createBy.id}">
+					,"candel":	<c:choose><c:when test="${(feedback.status == 1 || feedback.status == 3) && fns:getUser().id == feedback.createBy.id}">"1"</c:when><c:otherwise>"0"</c:otherwise></c:choose>
+					<c:if test="${(feedback.status == 1) && fns:getUser().id == feedback.createBy.id}">,"canedit":"1"</c:if>
+					<c:if test="${(feedback.status == 3 or feedback.status == 4) && fns:getUser().id == feedback.createBy.id}">,"canedits":"1"</c:if>
+					,"cancancel":<c:choose><c:when test="${feedback.status == 2 && fns:getUser().id == feedback.createBy.id}">"1"</c:when><c:otherwise>"0"</c:otherwise></c:choose>
+					</c:when>
+					<c:otherwise>
+					,"candel":"0"
+					,"canedit":"0"
+					,"canedits":"0"
+					,"cancancel":"0"
+					/*,"deleteAdmin":"0"*/
+					</c:otherwise>
+					</c:choose>
+				}
+				</c:forEach>
+				</c:if>
+			]
+			// ,even: true
+			// ,height: 315
+		});
+	})
+
+	resizeListTable();
+	$("a").on("click",addLinkVisied);
+
+</script>
+<script>
+	resizeListWindow2();
+	$(window).resize(function(){
+		resizeListWindow2();
+	});
+</script>
+</body>
+</html>

+ 338 - 0
src/main/webapp/webpage/modules/externalUnit/externalUnitFileForm.jsp

@@ -0,0 +1,338 @@
+<%@ 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" src="${ctxStatic}/helloweba_editable-select/jquery.editable-select.min.js"></script>
+	<link rel='stylesheet' type="text/css" href="${ctxStatic}/helloweba_editable-select/jquery.editable-select.min.css"/>
+	<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);
+					}
+				}
+			});
+			$("#attachment_btn_conciliationRecords").click(function () {
+				$("#attachment_file_conciliationRecords").click();
+			});
+		});
+		function insertTitle(tValue){
+			console.log('insertTitle')
+			var list = "${projectRecords.workAttachments}";
+			var size = (list.split('url')).length-1;
+			var files = $("#attachment_file_conciliationRecords")[0].files;
+			for(var i = 0;i<files.length;i++) {
+				var file = files[i];
+				var attachmentId = "";
+				var attachmentFlag = "160";
+				console.log(file);
+				var timestamp = new Date().getTime();
+				var description = ""
+				var storeAs = "externalUnit";
+				var uploadPath = "http://gangwan-app.oss-cn-hangzhou.aliyuncs.com/" + storeAs;
+				/*将这段字符串存到数据库即可*/
+				var divId = "_exterNoProcess";
+				$("#addFile" + divId).show();
+				multipartUploadWithSts(storeAs, file, attachmentId, attachmentFlag, uploadPath, divId, size);
+			}
+			console.log('list',files)
+		}
+		function addFile() {
+			$("#attachment_file_conciliationRecords").click();
+		}
+
+
+
+	</script>
+</head>
+<body>
+<div class="single-form">
+	<div class="container">
+		<form:form id="inputForm" modelAttribute="projectRecords" action="${ctx}/externalUnit/externalUnit/saveFile" method="post" class="form-horizontal">
+		<form:hidden path="id"/>
+			<div class="form-group-label"><h2>文件管理</h2></div>
+			<div class="layui-item nav-btns">
+				<a id="attachment_btn_conciliationRecords" class="nav-btn nav-btn-add" title="上传文件"><i class="fa fa-plus"></i>&nbsp;添加附件</a>
+
+			</div>
+			<div id="addFile_exterNoProcess" style="display: none" class="upload-progress">
+				<span id="fileName_exterNoProcess"></span>
+				<b><span id="baifenbi_exterNoProcess"></span></b>
+				<div class="progress">
+						<%--进度条--%>
+					<div id="jindutiao_exterNoProcess" class="progress-bar" style="width: 0%" aria-valuenow="0">
+					</div>
+				</div>
+			</div>
+			<input id="attachment_file_conciliationRecords" type="file" multiple="multiple"
+				   style="display: none;" onChange="if(this.value)insertTitle(this.value);"/>
+			<span id="attachment_title_conciliationRecords"></span>
+			<div class="layui-item layui-col-xs12" style="padding:0 16px;">
+				<table id="upTable_conciliationRecords" class="table table-bordered table-condensed details">
+					<thead>
+					<tr>
+							<%-- <th>序号</th>--%>
+						<th width="30%">文件预览</th>
+						<th width="80px">上传人</th>
+						<th width="160px">上传时间</th>
+<%--						<th width="30%" >文件描述</th>--%>
+						<th width="200px">操作</th>
+					</tr>
+					</thead>
+					<tbody id="file_exterNoProcess">
+					<c:forEach items="${projectRecords.workAttachments}" var="workClientAttachment"
+							   varStatus="status">
+						<tr>
+								<%-- <td>${status.index + 1}</td>--%>
+							<c:choose>
+								<c:when test="${projectRecords.uploadMode == 2}">
+									<c:choose>
+										<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpg')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'png')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'gif')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'bmp')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpeg')}">
+											<td><img src="${workClientAttachment.temporaryUrl}" width="50" height="50" onclick="openDialogView('预览','${ctx}/sys/picturepreview/picturePreview?url=${workClientAttachment.temporaryUrl}','90%','90%')" alt="${workClientAttachment.attachmentName}">
+										</c:when>
+										<c:otherwise>
+											<c:choose>
+												<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+													<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',1)">${workClientAttachment.attachmentName}</a></td>
+												</c:when>
+												<c:otherwise>
+													<c:choose>
+														<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'rar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'zip')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'7z')}">
+															<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',3)">${workClientAttachment.attachmentName}</a></td>
+														</c:when>
+														<c:otherwise>
+															<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',2)">${workClientAttachment.attachmentName}</a></td>
+														</c:otherwise>
+													</c:choose>
+												</c:otherwise>
+											</c:choose>
+										</c:otherwise>
+									</c:choose>
+								</c:when>
+								<c:otherwise>
+									<c:choose>
+										<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpg')
+                                             or fn:containsIgnoreCase(workClientAttachment.attachmentName,'png')
+                                             or fn:containsIgnoreCase(workClientAttachment.attachmentName,'gif')
+                                             or fn:containsIgnoreCase(workClientAttachment.attachmentName,'bmp')
+                                             or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpeg')}">
+											<td><img src="${workClientAttachment.url}" width="50" height="50" onclick="openDialogView('预览','${ctx}/sys/picturepreview/picturePreview?url=${workClientAttachment.url}','90%','90%')" alt="${workClientAttachment.attachmentName}">
+										</c:when>
+										<c:otherwise>
+											<c:choose>
+												<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+													<td><a class="attention-info" href="javascript:void(0)"
+														   onclick="openPreview('${workClientAttachment.url}',1)">${workClientAttachment.attachmentName}</a>
+													</td>
+												</c:when>
+												<c:otherwise>
+													<c:choose>
+														<c:when test="${projectRecords.uploadMode == 2}">
+															<c:choose>
+																<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpg')
+                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'png')
+                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'gif')
+                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'bmp')
+                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpeg')}">
+																	<td><img src="${workClientAttachment.temporaryUrl}" width="50" height="50" onclick="openDialogView('预览','${ctx}/sys/picturepreview/picturePreview?url=${workClientAttachment.temporaryUrl}','90%','90%')" alt="${workClientAttachment.attachmentName}">
+																</c:when>
+																<c:otherwise>
+																	<c:choose>
+																		<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+																			<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',1)">${workClientAttachment.attachmentName}</a></td>
+																		</c:when>
+																		<c:otherwise>
+																			<c:choose>
+																				<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'rar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'zip')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'7z')}">
+																					<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',3)">${workClientAttachment.attachmentName}</a></td>
+																				</c:when>
+																				<c:otherwise>
+																					<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',2)">${workClientAttachment.attachmentName}</a></td>
+																				</c:otherwise>
+																			</c:choose>
+																		</c:otherwise>
+																	</c:choose>
+																</c:otherwise>
+															</c:choose>
+														</c:when>
+														<c:otherwise>
+															<c:choose>
+																<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpg')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'png')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'gif')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'bmp')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpeg')}">
+																	<td><img src="${workClientAttachment.url}" width="50" height="50" onclick="openDialogView('预览','${ctx}/sys/picturepreview/picturePreview?url=${workClientAttachment.url}','90%','90%')" alt="${workClientAttachment.attachmentName}">
+																</c:when>
+																<c:otherwise>
+																	<c:choose>
+																		<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+																			<td><a href="javascript:void(0)" onclick="openPreview('${workClientAttachment.url}',1)">${workClientAttachment.attachmentName}</a></td>
+																		</c:when>
+																		<c:otherwise>
+																			<c:choose>
+																				<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'rar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'zip')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'7z')}">
+																					<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.url}',3)">${workClientAttachment.attachmentName}</a></td>
+																				</c:when>
+																				<c:otherwise>
+																					<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.url}',2)">${workClientAttachment.attachmentName}</a></td>
+																				</c:otherwise>
+																			</c:choose>
+																		</c:otherwise>
+																	</c:choose>
+																</c:otherwise>
+															</c:choose>
+														</c:otherwise>
+													</c:choose>
+												</c:otherwise>
+											</c:choose>
+										</c:otherwise>
+									</c:choose>
+								</c:otherwise>
+							</c:choose>
+
+
+
+							<td>${workClientAttachment.createBy.name}</td>
+							<td><fmt:formatDate value="${workClientAttachment.createDate}" type="both"/></td>
+<%--							<td style="padding:0px"><input id="workAttachments${status.index + 1}_description" name="workAttachments[${status.index + 1}].description" type="text" value="${workClientAttachment.description}"  class="form-control layui-input" placeholder="请输入文件描述" style="width: 100%;height: 100%;padding:0px;background-color: #FFFFFF;"></td>--%>
+							<td class="op-td">
+								<div class="op-btn-box">
+
+										<%--附件下载删除--%>
+									<c:choose>
+										<c:when test="${projectRecords.uploadMode == 2}">
+											<c:choose>
+												<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+													<a href="${workClientAttachment.temporaryUrl}" target="_blank" class="op-btn op-btn-download"><i class="fa fa-download"></i>&nbsp;下载</a>
+												</c:when>
+												<c:otherwise>
+													<a href="${workClientAttachment.temporaryUrl}" class="op-btn op-btn-download"><i class="fa fa-download"></i>&nbsp;下载</a>
+												</c:otherwise>
+											</c:choose>
+										</c:when>
+										<c:otherwise>
+											<a href="javascript:location.href='${ctx}/workfullmanage/workFullManage/downLoadAttach?file='+encodeURIComponent('${workClientAttachment.url}');" class="op-btn op-btn-download"><i class="fa fa-download"></i>&nbsp;下载</a>
+										</c:otherwise>
+									</c:choose>
+									<c:if test="${workClientAttachment.createBy.id eq fns:getUser().id}">
+										<a href="javascript:void(0)"
+										   onclick="deleteFileFromAliyun(this,'${ctx}/sys/workattachment/deleteFileFromAliyun?url=${workClientAttachment.url}&id=${workClientAttachment.id}&type=2','addFile')"
+										   class="op-btn op-btn-delete"><i class="fa fa-trash"></i>&nbsp;删除</a>
+									</c:if>
+									<c:if test="${workClientAttachment.collectFlag != 1}">
+										<a href="javascript:void(0)" onclick="collectingAccessory(this,'${ctx}/projectAccessory/projectAccessory/saveCollectAccessory','${workClientAttachment.url}','${workClientAttachment.createBy.id}','${workClientAttachment.fileSize}')" class="op-btn layui-btn-warm" >&nbsp;收藏</a>
+									</c:if>
+								</div>
+							</td>
+						</tr>
+					</c:forEach>
+					</tbody>
+				</table>
+			</div>
+
+
+	</form:form>
+	</div>
+</div>
+<script>
+	//上传
+	function upload_image_button(index){
+		$("#upload_file_"+index).click();
+	}
+	function upload_show_image(index){
+		var image =$("#upload_file_"+index)[0].files[0];
+		var url = window.URL.createObjectURL(image);
+		if(image.name.indexOf("jpg") != -1
+				|| image.name.indexOf("png") != -1
+				|| image.name.indexOf("jpeg") != -1
+				|| image.name.indexOf("gif") != -1
+				|| image.name.indexOf("PNG") != -1){
+			url = window.URL.createObjectURL(image);
+		}else if(image.name.indexOf("pdf") != -1 || image.name.indexOf("PDF") != -1){
+			url = "${ctxStatic}/common/img/pdf5.png";
+		}else if(image.name.indexOf("doc") != -1 || image.name.indexOf("DOC") != -1
+				|| image.name.indexOf("docx") != -1 || image.name.indexOf("DOCX") != -1){
+			url = "${ctxStatic}/common/img/word.png";
+		}else if(image.name.indexOf("xlsx") != -1 || image.name.indexOf("XLSX") != -1
+				|| image.name.indexOf("xls") != -1 || image.name.indexOf("XLSX") != -1){
+			url = "${ctxStatic}/common/img/excel.png";
+		}else{
+			url = "${ctxStatic}/common/img/file.jpg";
+		}
+		$("#upload_image_"+index).attr("src",url);
+		var length = $("#upload_image_div :file").length;
+		if( index == length &&  length < 5 ){
+			upload_image_append(index);
+			add_x(index);
+		}else if(index == length && length ==5){
+			var span = '<span id="upload_close_'+index+'" class="close_ico" style="cursor:pointer; position: absolute;top:-1px;right: -2px; display:inline-block;z-index:1;" onclick="close_img('+index+');"><i class="fa fa-close"></i></span>';
+			$("#upload_image_5").before(span);
+		}
+	}
+	function upload_image_append(index){
+		var div1 = "<div id='upload_div_"+(index+1)+"' style='float:left;position:relative;width: 64px;height: 57px;margin-left:5px;'>";
+		var img = '<img id="upload_image_'+(index+1)+'" class="upload_ico" width="50px" height="50px"  onclick="upload_image_button('+(index+1)+')" src = "${pageContext.request.contextPath}/static/uploadify/upload_ico.png" style="cursor:pointer;width:50px;height:50px;"/>';
+		var input = '<input id="upload_file_'+(index+1)+'" type="file" style="display:none;" name="upload_files" onChange="upload_show_image('+(index+1)+')" /><br>';
+		var div2 = "</div>";
+		$("#upload_image_div").append(div1+img+input+div2);
+	}
+	function close_img(index) {
+		$("#upload_div_"+index).remove();
+		var length = $("#upload_image_div :file").length;
+		if(length == 0){
+			add_div();
+		}else if(length == 1){
+			var x = $("#upload_image_div").find("span").text();
+			if("x" != x){
+				add_div();
+			}
+		}
+	}
+	function add_x(index) {
+		var span = '<span id="upload_close_'+index+'" class="close_ico" style="cursor:pointer; position: absolute;top:-1px;right: -2px; display:inline-block;z-index:1;" onclick="close_img('+index+');"><i class="fa fa-close"></i></span>';
+		$("img:eq(-2)").before(span);
+	}
+	function add_div() {
+		var upload_div_1 =
+				'<div id="upload_div_1" style="float: left;position:relative;width: 64px;height: 57px;margin-left:5px;" >'+
+				'<img  id="upload_image_1" class="upload_ico" style="cursor:pointer;width:50px;height:50px;"  src="${pageContext.request.contextPath}/static/uploadify/upload_ico.png"  onclick="upload_image_button(1)"/>'+
+				'<input id="upload_file_1" type="file" style="display:none"  name="upload_files"  onchange="upload_show_image(1)" /><br>'+
+				'</div>';
+		$("#upload_image_div").html("").append(upload_div_1);
+	}
+</script>
+</body>
+</html>

+ 245 - 0
src/main/webapp/webpage/modules/externalUnit/externalUnitProjectFile.jsp

@@ -0,0 +1,245 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<%
+	String param = request.getParameter("param");
+
+%>
+<html>
+<head>
+	<title>文件管理</title>
+	<meta name="decorator" content="default"/>
+	<script type="text/javascript" src="${ctxStatic}/layui/layui.js"></script>
+	<link rel='stylesheet' type="text/css" href="${ctxStatic}/layui/css/layui.css"/>
+	<script src="${ctxStatic}/layer-v2.3/layui/xmSelect.js" charset="utf-8"></script>
+
+	<link href="${ctxStatic}/bootstrap-select-1.12.4/css/bootstrap-select.min.css" rel="stylesheet" />
+	<style>
+
+		.list-form-tab li.current {
+			background-color: #007BFF; /* 蓝色背景 */
+			color: white; /* 白色字体 */
+		}
+	</style>
+	<script src="${ctxStatic}/bootstrap-select-1.12.4/js/bootstrap-select.min.js"></script>
+	<script type="text/javascript">
+		var validateForm;
+		var exitName = true;
+		function doSubmit(){//回调函数,在编辑和保存动作时,供openDialog调用提交表单。
+			if(validateForm.form()) {
+				$("#inputForm").submit();
+				return true;
+			}
+		}
+
+		$(document).ready(function() {
+			layui.use(['form', 'layer'], function () {
+				var form = layui.form;
+			});
+			//搜索框收放
+			$('#moresee').click(function(){
+				if($('#moresees').is(':visible'))
+				{
+					$('#moresees').slideUp(0,resizeListWindow2);
+					$('#moresee i').removeClass("glyphicon glyphicon-menu-up").addClass("glyphicon glyphicon-menu-down");
+				}else{
+					$('#moresees').slideDown(0,resizeListWindow2);
+					$('#moresee i').removeClass("glyphicon glyphicon-menu-down").addClass("glyphicon glyphicon-menu-up");
+				}
+			});
+			laydate.render({
+				elem: '#beginDate', //目标元素。由于laydate.js封装了一个轻量级的选择器引擎,因此elem还允许你传入class、tag但必须按照这种方式 '#id .class'
+				event: 'focus', //响应事件。如果没有传入event,则按照默认的click
+				type : 'date'
+				, trigger: 'click'
+			});
+			laydate.render({
+				elem: '#endDate', //目标元素。由于laydate.js封装了一个轻量级的选择器引擎,因此elem还允许你传入class、tag但必须按照这种方式 '#id .class'
+				event: 'focus', //响应事件。如果没有传入event,则按照默认的click
+				type : 'date'
+				, trigger: 'click'
+			});
+			validateForm = $("#inputForm").validate({
+				submitHandler: function(form){
+					loading('正在提交,请稍等...');
+					form.submit();
+				},
+			});
+
+			$(".list-tabs li").click(function(){
+				$(".list-tabs li").each(function(){
+					$(this).removeAttr("class","active");
+					var id='#'+$(this).find("span").html();
+					$(id).attr("class","hide");
+				})
+				$(this).attr("class","active");
+				var id='#'+$(this).find("span").html();
+				$(id).removeAttr("class","hide");
+
+			})
+
+		});
+
+
+		function insertTitle(tValue){
+			console.log('insertTitle')
+			var list = "${projectRecords.workAttachments}";
+			var size = (list.split('url')).length-1;
+			var files = $("#attachment_file_conciliationRecords")[0].files;
+			for(var i = 0;i<files.length;i++) {
+				var file = files[i];
+				var attachmentId = "";
+				var attachmentFlag = "120";
+				console.log(file);
+				var timestamp = new Date().getTime();
+
+				var storeAs = "externalUnit";
+				var uploadPath = "http://gangwan-app.oss-cn-hangzhou.aliyuncs.com/" + storeAs;
+				/*将这段字符串存到数据库即可*/
+				var divId = "_attachment_conciliationRecords";
+				$("#addFile" + divId).show();
+				multipartUploadWithSts(storeAs, file, attachmentId, attachmentFlag, uploadPath, divId, size);
+			}
+			console.log('list',files)
+		}
+		function addFile() {
+			$("#attachment_file_conciliationRecords").click();
+		}
+
+	</script>
+
+</head>
+<body>
+<div class="single-form">
+	<div class="tapfixed">
+		<div class="list-form-tab contentShadow shadowLTR" id="tabDiv">
+			<ul class="list-tabs" >
+				<li class="active"><a href="${ctx}/externalUnit/externalUnit/projectFile?id=${projectRecords.id}">文件管理</a></li>
+				<li><a href="${ctx}/externalUnit/capitalDemand/capitalDemand?id=${projectRecords.id}">提资需求</a></li>
+				<li><a href="${ctx}/externalUnit/feedback/list?id=${projectRecords.id}">意见反馈</a></li>
+			</ul>
+		</div>
+	</div>
+	<div class="layui-row" style="margin-top: 60px;">
+		<div class="full-width fl">
+			<div class="layui-row contentShadow shadowLR" id="queryDiv">
+				<form:form id="searchForm" modelAttribute="externalUnitProjectRecords" action="${ctx}/externalUnit/externalUnit/projectFile?id=${externalUnitProjectRecords.id}" 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 lw6">
+						<div class="layui-item query athird">
+							<label class="layui-form-label">文件名称:</label>
+							<div class="layui-input-block">
+								<form:input path="fileName" htmlEscape="false" maxlength="64"  class=" form-control  layui-input"/>
+							</div>
+						</div>
+						<div class="layui-item query athird ">
+							<label class="layui-form-label">提交人:</label>
+							<div class="layui-input-block">
+								<form:input path="fileSubmiter" htmlEscape="false" maxlength="255"  class=" form-control layui-input"/>
+							</div>
+						</div>
+						<div class="layui-item fr">
+							<div class="input-group">
+								<a href="#" id="moresee"><i class="glyphicon glyphicon-menu-down"></i></a>
+								<div class="layui-btn-group search-spacing">
+									<button id="searchQuery" class="layui-btn layui-btn-sm  layui-bg-blue" onclick="search()">查询</button>
+									<button id="searchReset" class="layui-btn layui-btn-sm" onclick="resetSearch()">重置</button>
+								</div>
+							</div>
+						</div>
+						<div style="    clear:both;"></div>
+					</div>
+					<div id="moresees" style="clear:both;display:none;" class="lw6">
+
+
+						<div class="layui-item query athird ">
+							<label class="layui-form-label">上传时间:</label>
+							<div class="layui-input-block">
+								<input id="beginDate" name="fileBeginDate" placeholder="开始时间" type="text" maxlength="20" readonly="readonly" class="laydate-icondate form-control layer-date layui-input laydate-icon query-group"
+									   value="<fmt:formatDate value="${externalUnitProjectRecords.fileBeginDate}" pattern="yyyy-MM-dd"/>"/>
+								</input>
+								<span class="group-sep">-</span>
+								<input id="endDate" name="fileEndDate" placeholder="结束时间" type="text" maxlength="20" readonly="readonly" class="laydate-icondate form-control layer-date layui-input laydate-icon query-group"
+									   value="<fmt:formatDate value="${externalUnitProjectRecords.fileEndDate}" pattern="yyyy-MM-dd"/>"/>
+								</input>
+							</div>
+						</div>
+						<div style="clear:both;"></div>
+					</div>
+				</form:form>
+			</div>
+		</div>
+		<div class="full-width fl">
+			<div class="layui-form contentDetails contentShadow shadowLBR">
+				<div class="nav-btns">
+					<div class="layui-btn-group">
+						<table:addRow url="${ctx}/externalUnit/externalUnit/fileForm?id=${projectRecords.id}" title="文件上传"></table:addRow><!-- 增加按钮 -->
+						<button class="layui-btn layui-btn-sm" data-toggle="tooltip" data-placement="left" onclick="sortOrRefresh()" title="刷新"> 刷新</button>
+					</div>
+					<div style="clear: both;"></div>
+				</div>
+				<table class="oa-table layui-table" id="contentTable1"></table>
+
+				<!-- 分页代码 -->
+				<table:page page="${page}"></table:page>
+				<div style="clear: both;"></div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script src="${ctxStatic}/layer-v2.3/layui/layui.all.js" charset="utf-8"></script>
+<script>
+	layui.use('table', function(){
+		layui.table.render({
+			limit:${ page.pageSize }
+			,elem: '#contentTable1'
+			,page: false
+			,cols: [[
+				// {checkbox: true, fixed: true},
+				{field:'index',align:'center', title: '序号',width:60}
+				,{field:'attachmentName',align:'center', title: '文件名称', width:500}
+				,{field:'type',align:'center', title: '文件类型', width:200}
+				,{field:'createName', align:'center',title: '上传人', width:200}
+				,{field:'createDate',align:'center', title: '上传时间', width:200}
+				,{field:'remarks', align:'center',title: '备注', width:200}
+				,{field:'status', align:'center',title: '状态', width:210}
+			]]
+			,data: [
+				<c:if test="${ not empty page.list}">
+				<c:forEach items="${page.list}" var="file" varStatus="index">
+				<c:if test="${index.index != 0}">,</c:if>
+				{
+					"index":"${index.index+1}"
+					,"id":"${file.id}"
+					,"attachmentName":"${file.attachmentName}"
+					,"type":"${file.type}"
+					,"createName":"${file.createName}"
+					,"createDate":"<fmt:formatDate value="${file.createDate}" pattern="yyyy-MM-dd"/>"
+					,"status":
+							<c:choose>
+							<c:when test="${file.divIdType == '_exterNoProcess'}">"无流程"</c:when>
+					<c:otherwise>"有流程"</c:otherwise>
+					</c:choose>
+				}
+				</c:forEach>
+				</c:if>
+			]
+			// ,even: true
+			// ,height: 315
+		});
+	})
+
+	resizeListTable();
+	$("a").on("click",addLinkVisied);
+
+</script>
+<script>
+	resizeListWindow2();
+	$(window).resize(function(){
+		resizeListWindow2();
+	});
+</script>
+</body>
+</html>

+ 234 - 0
src/main/webapp/webpage/modules/externalUnit/externalUnitProjectRecordsForm.jsp

@@ -0,0 +1,234 @@
+<%@ 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" src="${ctxStatic}/helloweba_editable-select/jquery.editable-select.min.js"></script>
+	<link rel='stylesheet' type="text/css" href="${ctxStatic}/helloweba_editable-select/jquery.editable-select.min.css"/>
+	<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);
+					}
+				}
+			});
+		});
+
+		function changeUser(ids,names) {
+            $.ajax({
+                type:'POST',
+                dataType:'json',
+                url:'${ctx}/externalUnit/externalUnit/getProjectRecordUsers',
+                data:{"ids":ids},
+                cache:false,
+                success: function(data) {
+                    var str = "";
+					var userIds = $("#hiddenMemberIds").val()
+					console.log('userIds',userIds)
+
+					var msgInfo = "";
+                    for (var i=0; i<data.length; i++) {
+                        var msg = data[i].msg;
+                        if(msg == "del") {
+                            var id = data[i].id;
+                            $("#delFlag"+id).val("正常");
+                            $("#del"+id).css("display","inline-block");
+                        } else if (msg == "msg") {
+                            var id = data[i].id;
+                            var name = data[i].name;
+                            var office = data[i].officeId;
+                            var no = data[i].no;
+                            var mobile = data[i].mobile;
+                            var email = data[i].email;
+							if (userIds === undefined || userIds === null) {
+								userIds = "";
+							}
+							if (userIds && !userIds.endsWith(',')) {
+								userIds += ",";
+							}
+							userIds += id + ",";
+							str += '<tr id="'+id+'">' +
+                                '<td>' +
+                                no +
+                                '</td>' +
+                                '<td>' +
+                                name +
+                                '</td>' +
+                                '<td>' +
+                                office +
+                                '</td>' +
+                                '<td>' +
+                                mobile +
+                                '</td>' +
+                                '<td>' +
+                                email +
+                                '</td>' +
+                                '<td>' +
+                                '<span id="del'+id+'" onclick="delRow(this,\''+id+'\')" title="移除" class="op-btn op-btn-delete"><i class="fa fa-trash"></i>&nbsp;移除</span>' +
+                                '</td>' +
+                                '</tr>';
+                        } else {
+                            msgInfo = msg;
+                        }
+                    }
+                    $("#hiddenMemberIds").val(userIds)
+					console.log('ids',$("#hiddenMemberIds").val())
+                    $("#usersList").append(str);
+                    if (msgInfo!= null && msgInfo != '' && msgInfo!= undefined){
+                        parent.layer.msg("新增项目成员成功!"+msgInfo,{icon:1});
+                    }else {
+                        parent.layer.msg("新增项目成员成功!",{icon:1});
+                    }
+                },
+                error:function () {
+                    parent.layer.msg("获取用户信息失败!!!",{icon:2});
+                    parent.layer.close(loadingMessage);
+                }
+            });
+        }
+
+        function delRow(obj,id){
+			$(obj).parent().parent().remove();
+			// 从hiddenMemberIds数组中移除对应的id
+			var idsStr = $("#hiddenMemberIds").val();
+			console.log('idsStr',idsStr)
+
+			if (idsStr) {
+				// 将字符串转换为数组
+				var ids = idsStr.split(',');
+
+				// 从数组中移除对应的id
+				var index = ids.indexOf(id.toString()); // 确保id是字符串,与ids数组中的格式一致
+				if (index > -1) {
+					ids.splice(index, 1);
+					var newIds = ids.join(',')
+					if (newIds && !newIds.endsWith(',')) {
+						newIds += ",";
+					}
+					// 将数组转换回字符串,并更新隐藏输入元素的值
+					$("#hiddenMemberIds").val(newIds);
+
+				}
+			}
+			console.log('123',$("#hiddenMemberIds").val())
+		}
+        function getSelectUserIds() {
+            return "";
+        }
+	</script>
+</head>
+<body>
+<div class="single-form">
+	<div class="container">
+		<form:form id="inputForm" modelAttribute="projectRecords" action="${ctx}/externalUnit/externalUnit/save" method="post" class="form-horizontal">
+		<form:hidden path="id"/>
+			<div class="form-group layui-row first">
+				<div class="form-group-label"><h2>项目基本信息</h2></div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>项目名称:</label>
+					<div class="layui-input-block">
+						<form:input path="name" placeholder="请输入项目名称" htmlEscape="false"  class="form-control layui-input required"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>建设方:</label>
+					<div class="layui-input-block">
+						<form:input path="projectBuilder" placeholder="请输入建设方" htmlEscape="false"  class="form-control layui-input required"/>
+
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>建设地点:</label>
+					<div class="layui-input-block">
+						<form:input path="buildPlace" placeholder="请输入建设地点" htmlEscape="false"  class="form-control layui-input required"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw7">
+					<label class="layui-form-label">创建人:</label>
+					<div class="layui-input-block">
+						<form:input path="createBy.name" htmlEscape="false"  readonly="true"  class="form-control  layui-input"/>
+						<form:hidden path="createBy.id" htmlEscape="false"   readonly="true"  class="form-control  layui-input"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm12 lw7 with-textarea">
+					<label class="layui-form-label ">备注:</label>
+					<div class="layui-input-block">
+						<form:textarea placeholder="请输入备注" path="remarks" htmlEscape="false" rows="4"  maxlength="255"  class="form-control "/>
+					</div>
+				</div>
+			</div>
+
+	<div class="form-group layui-row">
+		<div class="form-group-label"><h2>成员明细</h2></div>
+		<input type="hidden" id="hiddenMemberIds" name="memberIds" value="${projectRecords.memberIds}">
+		<div class="layui-item nav-btns">
+			<sys:inquiretreeselectusers id="members" name="projectMembers" value="${projectRecords.memberIds}" labelName="memberNameStr" labelValue="${projectRecords.memberNameStr}"
+								 title="用户" url="/sys/office/treeDataAll?type=3" checked="true" cssClass="form-control required" allowClear="true" notAllowSelectParent="true"/>
+			<%--<a class="nav-btn nav-btn-add" onclick="addRow('#workAccountList', workAccountListRowIdx, workAccountListTpl);workAccountListRowIdx = workAccountListRowIdx + 1;" title="新增"><i class="fa fa-plus"></i>&nbsp;新增</a>--%>
+		</div>
+		<div class="layui-item layui-col-xs12 form-table-container" >
+			<table  class="table table-bordered table-condensed no-bottom-margin details">
+				<thead>
+				<tr>
+					<th>工号</th>
+					<th>姓名</th>
+					<th>部门</th>
+					<th>手机号</th>
+					<th>邮箱</th>
+					<th>操作</th>
+				</tr>
+				</thead>
+				<tbody id="usersList">
+				<c:if test="${not empty projectRecords.projectMembers}">
+					<c:forEach items="${projectRecords.projectMembers}" var="user">
+						<tr id="${user.id}">
+							<td>
+									${user.no}
+							</td>
+							<td>
+									${user.name}
+							</td>
+							<td>
+									${user.office.name}
+							</td>
+							<td>
+									${user.mobile}
+							</td>
+							<td>
+									${user.email}
+							</td>
+							<td>
+								<span id="del${user.id}" onclick="delRow(this,'${user.id}')" title="移除" class="op-btn op-btn-delete"><i class="fa fa-trash"></i>&nbsp;移除</span>
+							</td>
+						</tr>
+					</c:forEach>
+				</c:if>
+				</tbody>
+			</table>
+		</div>
+		<div class="form-group layui-row page-end"></div>
+	</div>
+	</form:form>
+	</div>
+</div>
+</body>
+</html>

+ 310 - 0
src/main/webapp/webpage/modules/externalUnit/externalUnitProjectRecordsList.jsp

@@ -0,0 +1,310 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ page isELIgnored="false"%>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<html>
+<head>
+    <title>外部单位项目列表管理</title>
+    <meta name="decorator" content="default"/>
+    <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%;
+        }*/
+        .layui-layer-btn1:hover{
+            color: #c2c2c2;
+        }
+    </style>
+    <script type="text/javascript">
+        $(document).ready(function() {
+            $("#cus_name").show();
+            $("#cus_name").siblings().hide();
+            //搜索框收放
+            $('#moresee').click(function(){
+                if($('#moresees').is(':visible'))
+                {
+                    $('#moresees').slideUp(0,resizeListWindow1);
+                    $('#moresee i').removeClass("glyphicon glyphicon-menu-up").addClass("glyphicon glyphicon-menu-down");
+                }else{
+                    $('#moresees').slideDown(0,resizeListWindow1);
+                    $('#moresee i').removeClass("glyphicon glyphicon-menu-down").addClass("glyphicon glyphicon-menu-up");
+                }
+            });
+            laydate.render({
+                elem: '#beginDate', //目标元素。由于laydate.js封装了一个轻量级的选择器引擎,因此elem还允许你传入class、tag但必须按照这种方式 '#id .class'
+                event: 'focus', //响应事件。如果没有传入event,则按照默认的click
+                type : 'date'
+                , trigger: 'click'
+            });
+            laydate.render({
+                elem: '#endDate', //目标元素。由于laydate.js封装了一个轻量级的选择器引擎,因此elem还允许你传入class、tag但必须按照这种方式 '#id .class'
+                event: 'focus', //响应事件。如果没有传入event,则按照默认的click
+                type : 'date'
+                , trigger: 'click'
+            });
+        });
+        function switchInput(obj){
+            $("#"+obj).show();
+            $("#"+obj).siblings().hide();
+        }
+        //打开对话框(查看)
+        function openDialogNow(title,url,width,height){
+            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 ,
+                btn: ['关闭'],
+                cancel: function(index){
+                }
+            });
+        }
+
+
+        //打开对话框(查看)
+        function deleteFun(url){
+            if(navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)){//如果是移动端,就使用自适应大小弹窗
+                width='auto';
+                height='auto';
+            }else{//如果是PC端,根据用户设置的width和height显示。
+
+            }
+
+            layer.confirm('确定要删除该客户信息吗?', {
+                title: "删除",
+                btn: ['确定','关闭'] //可以无限个按钮
+            },function(index, layero){
+                $.ajax({
+                    type: 'post',
+                    url:url,
+                    dataType: "json",
+                    cache: false,
+                    processData: false,
+                    contentType: false,
+                }).success(function (result) {
+                    if(result.result == "1"){
+                        layer.close(index);
+                        top.layer.msg(result.msg, {icon: 1});
+                        window.location.reload();
+                    }else{
+                        layer.close(index);
+                        top.layer.msg(result.msg, {icon: 2});
+                    }
+                });
+            }, function(index){
+                layer.close(index);
+            });
+        }
+
+        function cBlur(obj) {
+            var id = $("#createId").val();
+            if(undefined != obj.value && null != obj.value && '' != obj.value){
+                $.ajax({
+                    url:'${ctx}/sys/user/getUserByName?name='+obj.value,
+                    type:"post",
+                    success:function(data){
+                        var user = data.body.data;
+                        if(undefined == user || null == user || '' == user){
+                            $("#createId").val("");
+                        }else{
+                            if(data.body.data.id != id){
+                                if(undefined != id && null != id && '' != id){
+                                    $("#createId").val("");
+                                }
+                            }
+                        }
+                    }
+                });
+            }else{
+                $("#createId").val("");
+            }
+
+        }
+    </script>
+</head>
+<body class="gray-bg">
+<div class="wrapper wrapper-content">
+    <sys:message content="${message}"/>
+    <div class="layui-row">
+        <div class="full-width fl">
+            <div class="layui-row contentShadow shadowLR" id="queryDiv">
+                <form:form id="searchForm" modelAttribute="externalUnitProjectRecords" action="${ctx}/externalUnit/externalUnit/list" 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}"/>
+                    <input id="toflag" name="toflag" type="hidden" value="1"/>
+                    <%--<table:sortColumn id="orderBy" name="orderBy" value="${page.orderBy}" callback="sortOrRefresh();"/><!-- 支持排序 -->--%>
+                    <div class="commonQuery lw7">
+                        <div class="layui-item query athird">
+                            <label class="layui-form-label">项目名称:</label>
+                            <div class="layui-input-block">
+                                <form:input path="name" htmlEscape="false" maxlength="255"  class=" form-control layui-input"/>
+                            </div>
+                        </div>
+                        <div class="layui-item query athird">
+                            <label class="layui-form-label">建设方:</label>
+                            <div class="layui-input-block">
+                                <form:input path="projectBuilder" htmlEscape="false" maxlength="255"  class=" form-control layui-input"/>
+                            </div>
+                        </div>
+                        <div class="layui-item athird">
+                            <div class="input-group">
+                                <a href="#" id="moresee"><i class="glyphicon glyphicon-menu-down"></i></a>
+                                <div class="layui-btn-group search-spacing">
+                                    <button id="searchQuery" class="layui-btn layui-btn-sm layui-bg-blue" onclick="search()">查询</button>
+                                    <button id="searchReset" class="layui-btn layui-btn-sm " onclick="resetSearch()">重置</button>
+                                </div>
+                                    <%--								<a href="#" id="moresee"><i class="glyphicon glyphicon-menu-down"></i></a>--%>
+                                    <%--								<button id="searchReset" 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>
+                    <div id="moresees" style="clear:both;display:none;" class="lw7">
+                        <div class="layui-item query athird">
+                            <label class="layui-form-label">创建时间:</label>
+                            <div class="layui-input-block readOnlyFFF">
+                                <input id="beginDate" placeholder="开始时间" name="beginDate" type="text" readonly="readonly" maxlength="20" class="laydate-icondate form-control layer-date layui-input laydate-icon query-group"
+                                       value="<fmt:formatDate value="${workClientInfo.beginDate}" pattern="yyyy-MM-dd"/>"/>
+                                </input>
+                                <span class="group-sep">-</span>
+                                <input id="endDate" placeholder="结束时间" name="endDate" type="text" readonly="readonly" maxlength="20" class="laydate-icondate form-control layer-date layui-input laydate-icon query-group"
+                                       value="<fmt:formatDate value="${workClientInfo.endDate}" pattern="yyyy-MM-dd"/>"/>
+                                </input>
+                            </div>
+                        </div>
+
+                        <div class="layui-item query athird">
+                            <label class="layui-form-label">建设地点:</label>
+                            <div class="layui-input-block">
+                                <form:input path="buildPlace" htmlEscape="false"  class="form-control layui-input"/>
+                            </div>
+                        </div>
+                        <div class="layui-item query athird">
+                            <label class="layui-form-label">创建人:</label>
+                            <div class="layui-input-block  with-icon">
+                                <sys:inquireselectUserNotReadolny id="create" name="createId" value="${createId}" labelName="createNameStr" labelValue="${createName}"
+                                                                  title="用户" url="/sys/office/treeDataAll?type=3" cssClass="form-control required layui-input" allowClear="true" notAllowSelectParent="true"/>
+                            </div>
+                        </div>
+                    </div>
+                </form:form>
+            </div>
+        </div>
+
+        <div class="full-width fl">
+            <div class="contentShadow layui-form contentDetails">
+                <div class="nav-btns">
+                    <%--此处按钮样式包括 nav-btn-add nav-btn-refresh nav-btn-import nav-btn-export nav-btn-query nav-btn-reset--%>
+                    <div class="layui-btn-group">
+                        <shiro:hasPermission name="externalUnit:externalUnit:add">
+                            <table:addRow url="${ctx}/externalUnit/externalUnit/form" title="项目管理"></table:addRow><!-- 增加按钮 -->
+                        </shiro:hasPermission>
+<%--                        <shiro:hasPermission name="externalUnit:externalUnit:import">--%>
+<%--                            <table:importExcel url="${ctx}/workclientinfo/workClientInfo/import"></table:importExcel><!-- 导入按钮 -->--%>
+<%--                        </shiro:hasPermission>--%>
+
+<%--                        <shiro:hasPermission name="workclientinfo:workClientInfo:export">--%>
+<%--                            <table:exportExcel url="${ctx}/workclientinfo/workClientInfo/export"></table:exportExcel><!-- 导出按钮 -->--%>
+<%--                        </shiro:hasPermission>--%>
+                        <button class="layui-btn layui-btn-sm" data-toggle="tooltip" data-placement="left" onclick="sortOrRefresh()" title="刷新"> 刷新</button>
+                    </div>
+
+                    <div style="clear: both;"></div>
+                </div>
+                <table class="oa-table layui-table" id="contentTable"></table>
+
+                <!-- 分页代码 -->
+                <table:page page="${page}"></table:page>
+                <div style="clear: both;"></div>
+            </div>
+        </div>
+    </div>
+    <div id="changewidth"></div>
+</div>
+<script src="${ctxStatic}/layer-v2.3/layui/layui.all.js" charset="utf-8"></script>
+<script>
+    layui.use('table', function(){
+        layui.table.render({
+            limit:${ page.pageSize }
+            ,elem: '#contentTable'
+            ,page: false
+            ,cols: [[
+                {field:'index',align:'center', title: '序号',width:40}
+                ,{field:'name',align:'center', title: '项目名称',minWidth:150,templet:function(d){
+                        var xml = "<a class=\"attention-info\" href=\"javascript:void(0);\" onclick=\"openDialogView('查看项目信息', '${ctx}/externalUnit/externalUnit/detail?id=" + d.id +"','95%','95%')\">" +
+                            "<span title=" + d.name + ">" + d.name + "</span></a>";
+                        return xml;
+                    }}
+                ,{field:'projectBuilder',align:'center', title: '建设方',minWidth:120}
+                ,{field:'buildPlace',align:'center', title: '建设地点', minWidth:120}
+                ,{field:'userName',align:'center', title: '创建人', minWidth:120}
+                ,{field:'createDate',align:'center', title: '创建时间', minWidth:120}
+                ,{field:'op',align:'center',title:"操作",minWidth:130,templet:function(d){
+                        ////对操作进行初始化
+                        var xml = "<div class=\"layui-btn-group\">";
+
+                        if(d.canedit != undefined && d.canedit == "1")
+                            xml +="<a href=\"javascript:void(0)\" onclick=\"openDialog('修改项目信息', '${ctx}/externalUnit/externalUnit/form?id=" + d.id + "','95%','95%')\" class=\"layui-btn layui-btn-xs layui-bg-green\" > 修改</a>"
+
+                        if(d.candelete != undefined && d.candelete == "1")
+                            xml +="<a href=\"javascript:void(0)\" onclick=\"deleteFun('${ctx}/workclientinfo/workClientInfo/delete?id=" + d.id + "')\"   class=\"layui-btn layui-btn-xs layui-bg-red\"> 删除</a>";
+
+                        if (d.isMember != undefined && d.isMember == "1")
+                            xml +="<a href=\"javascript:void(0)\" onclick=\"openDialogNow('查看项目-"+d.name+"', '${ctx}/externalUnit/externalUnit/projectFile?id=" + d.id + "','95%','95%')\" class=\"layui-btn layui-btn-xs layui-bg-blue\" >项目文件</a>"
+
+
+                        xml+="</div>"
+                        return xml;
+                    }}
+            ]]
+            ,data: [
+                <c:if test="${ not empty page.list}">
+                <c:forEach items="${page.list}" var="externalUnitProjectRecords" varStatus="index">
+                <c:if test="${index.index != 0}">,</c:if>
+                {
+                    "index":"${index.index+1}"
+                    ,"id":"${externalUnitProjectRecords.id}"
+                    ,"name":"${externalUnitProjectRecords.name}"
+                    ,"projectBuilder":"${externalUnitProjectRecords.projectBuilder}"
+                    ,"buildPlace":"${externalUnitProjectRecords.buildPlace}"
+                    ,"userName":"${externalUnitProjectRecords.createName}"
+                    ,"createDate":"<fmt:formatDate value="${externalUnitProjectRecords.createDate}" pattern="yyyy-MM-dd"/>"
+                    <c:if test="${flag == '1' or fns:getUser().id == externalUnitProjectRecords.createBy.id}">
+                    <shiro:hasPermission name="externalUnit:externalUnit:edit">,"canedit":"1"</shiro:hasPermission>
+                    <shiro:hasPermission name="externalUnit:externalUnit:del">,"candelete":"1"</shiro:hasPermission>
+                    </c:if>
+                    <c:if test="${externalUnitProjectRecords.isProjectMember == 'true' or fns:getUser().id == externalUnitProjectRecords.createBy.id}">
+                            ,"isMember":"1"
+                    </c:if>
+                }
+                </c:forEach>
+                </c:if>
+            ]
+        });
+
+    })
+
+    resizeListTable();/*消除由于有竖向滚动条造成table出现横向滚动条*/
+    $("a").on("click",addLinkVisied);
+</script>
+
+<script type="text/javascript">
+    resizeListWindow1();
+    $(window).resize(function(){
+        resizeListWindow1();
+    });
+</script>
+</body>
+
+</html>
+

+ 222 - 0
src/main/webapp/webpage/modules/externalUnit/externalUnitProjectRecordsView.jsp

@@ -0,0 +1,222 @@
+<%@ 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" src="${ctxStatic}/helloweba_editable-select/jquery.editable-select.min.js"></script>
+	<link rel='stylesheet' type="text/css" href="${ctxStatic}/helloweba_editable-select/jquery.editable-select.min.css"/>
+	<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);
+					}
+				}
+			});
+		});
+
+		function changeUser(ids,names) {
+            $.ajax({
+                type:'POST',
+                dataType:'json',
+                url:'${ctx}/externalUnit/externalUnit/getProjectRecordUsers',
+                data:{"ids":ids},
+                cache:false,
+                success: function(data) {
+                    var str = "";
+                    var userIds = "";
+                    var msgInfo = "";
+                    for (var i=0; i<data.length; i++) {
+                        var msg = data[i].msg;
+                        if(msg == "del") {
+                            var id = data[i].id;
+                            $("#delFlag"+id).val("正常");
+                            $("#del"+id).css("display","inline-block");
+                        } else if (msg == "msg") {
+                            var id = data[i].id;
+                            var name = data[i].name;
+                            var office = data[i].officeId;
+                            var no = data[i].no;
+                            var mobile = data[i].mobile;
+                            var email = data[i].email;
+                            userIds += id + ",";
+                            str += '<tr id="'+id+'">' +
+                                '<td>' +
+                                no +
+                                '</td>' +
+                                '<td>' +
+                                name +
+                                '</td>' +
+                                '<td>' +
+                                office +
+                                '</td>' +
+                                '<td>' +
+                                mobile +
+                                '</td>' +
+                                '<td>' +
+                                email +
+                                '</td>' +
+                                '<td>' +
+                                '<span id="del'+id+'" onclick="delRow(this,\''+id+'\')" title="移除" class="op-btn op-btn-delete"><i class="fa fa-trash"></i>&nbsp;移除</span>' +
+                                '</td>' +
+                                '</tr>';
+                        } else {
+                            msgInfo = msg;
+                        }
+                    }
+                    $("#hiddenMemberIds").val(userIds)
+					console.log('ids',$("#hiddenMemberIds").val())
+                    $("#usersList").append(str);
+                    if (msgInfo!= null && msgInfo != '' && msgInfo!= undefined){
+                        parent.layer.msg("新增项目成员成功!"+msgInfo,{icon:1});
+                    }else {
+                        parent.layer.msg("新增项目成员成功!",{icon:1});
+                    }
+                },
+                error:function () {
+                    parent.layer.msg("获取用户信息失败!!!",{icon:2});
+                    parent.layer.close(loadingMessage);
+                }
+            });
+        }
+
+        function delRow(obj,id){
+			$(obj).parent().parent().remove();
+			// 从hiddenMemberIds数组中移除对应的id
+			var idsStr = $("#hiddenMemberIds").val();
+			if (idsStr) {
+				// 将字符串转换为数组
+				var ids = idsStr.split(',');
+
+				// 从数组中移除对应的id
+				var index = ids.indexOf(id.toString()); // 确保id是字符串,与ids数组中的格式一致
+				if (index > -1) {
+					ids.splice(index, 1);
+
+					// 将数组转换回字符串,并更新隐藏输入元素的值
+					$("#hiddenMemberIds").val(ids.join(','));
+				}
+			}
+			console.log('123',$("#hiddenMemberIds").val())
+		}
+        function getSelectUserIds() {
+            return "";
+        }
+	</script>
+</head>
+<body>
+<div class="single-form">
+	<div class="container">
+		<form:form id="inputForm" modelAttribute="projectRecords" action="${ctx}/externalUnit/externalUnit/save" method="post" class="form-horizontal">
+		<form:hidden path="id"/>
+			<div class="form-group layui-row first">
+				<div class="form-group-label"><h2>项目基本信息</h2></div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>项目名称:</label>
+					<div class="layui-input-block">
+						<input value="${projectRecords.name}" readonly="true" placeholder="请输入项目名称" htmlEscape="false"  class="form-control layui-input required"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>建设方:</label>
+					<div class="layui-input-block">
+						<input value="${projectRecords.projectBuilder}" readonly="true" placeholder="请输入建设方" htmlEscape="false"  class="form-control layui-input required"/>
+
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>建设地点:</label>
+					<div class="layui-input-block">
+						<input value="${projectRecords.buildPlace}" readonly="true" placeholder="请输入建设地点" htmlEscape="false"  class="form-control layui-input required"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw7">
+					<label class="layui-form-label">创建人:</label>
+					<div class="layui-input-block">
+						<form:input path="createBy.name" htmlEscape="false"  readonly="true"  class="form-control  layui-input"/>
+						<form:hidden path="createBy.id" htmlEscape="false"   readonly="true"  class="form-control  layui-input"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm12 lw7 with-textarea">
+					<label class="layui-form-label ">备注:</label>
+					<div class="layui-input-block">
+						<form:textarea placeholder="请输入备注" readonly="true" path="remarks" htmlEscape="false" rows="4"  maxlength="255"  class="form-control "/>
+					</div>
+				</div>
+			</div>
+
+	<div class="form-group layui-row">
+		<div class="form-group-label"><h2><span class="require-item">*</span>成员明细</h2></div>
+		<input type="hidden" id="hiddenMemberIds" name="memberIds" value="">
+		<div class="layui-item layui-col-xs12 form-table-container" >
+			<table  class="table table-bordered table-condensed no-bottom-margin details">
+				<thead>
+				<tr>
+					<th>工号</th>
+					<th>姓名</th>
+					<th>部门</th>
+					<th>手机号</th>
+					<th>邮箱</th>
+					<th width="25%">状态</th>
+				</tr>
+				</thead>
+				<tbody id="usersList">
+				<c:if test="${not empty projectRecords.projectMembers}">
+					<c:forEach items="${projectRecords.projectMembers}" var="user">
+						<tr id="${user.id}">
+							<td>
+									${user.no}
+							</td>
+							<td>
+									${user.name}
+							</td>
+							<td>
+									${user.office.name}
+							</td>
+							<td>
+									${user.mobile}
+							</td>
+							<td>
+									${user.email}
+							</td>
+							<td>
+								<c:choose>
+									<c:when test="${user.delFlag == 0}">
+										正常
+									</c:when>
+									<c:otherwise>
+										移除
+									</c:otherwise>
+								</c:choose>
+							</td>
+						</tr>
+					</c:forEach>
+				</c:if>
+				</tbody>
+			</table>
+		</div>
+		<div class="form-group layui-row page-end"></div>
+	</div>
+	</form:form>
+	</div>
+</div>
+</body>
+</html>

+ 422 - 0
src/main/webapp/webpage/modules/externalUnit/feedbackFormAdd.jsp

@@ -0,0 +1,422 @@
+<%@ 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" src="${ctxStatic}/helloweba_editable-select/jquery.editable-select.min.js"></script>
+	<link rel='stylesheet' type="text/css" href="${ctxStatic}/helloweba_editable-select/jquery.editable-select.min.css"/>
+	<script src="${ctxStatic}/layer-v2.3/layui/xmSelect.js" charset="utf-8"></script>
+	<link rel='stylesheet' type="text/css" href="${ctxStatic}/layui/css/layui.css"/>
+	<script type="text/javascript" src="${ctxStatic}/layui/layui.js"></script>
+
+	<script type="text/javascript">
+		var validateForm;
+		function doSubmit(obj){//回调函数,在编辑和保存动作时,供openDialog调用提交表单。
+			console.log('obj',validateForm.form())
+			console.log('obj1',obj)
+		  if(validateForm.form()){
+			  if(obj == 1){
+				  var shr = $("#examiners").val();
+				  if(shr.length == 0){
+					  parent.layer.msg("请选择审核人!", {icon: 5});
+					  return false;
+				  }
+
+			  }else if(obj ==2){
+				  //暂存
+				  $("#inputForm").attr("action","${ctx}/externalUnit/feedback/store");
+			  }else if(obj ==3){
+				  console.log('1111')
+				  //暂存
+				  $("#inputForm").attr("action","${ctx}/externalUnit/feedback/store");
+			  }
+			  $("#inputForm").submit();
+			  return true;
+		  }else {
+			  parent.layer.msg("信息未填写完整!", {icon: 5});
+		  }
+		  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);
+					}
+				}
+			});
+			getProjectMembers();
+			$("#attachment_btn_conciliationRecords").click(function () {
+				$("#attachment_file_conciliationRecords").click();
+			});
+		});
+		function insertTitle(tValue){
+			console.log('insertTitle')
+			var list = "${feedback.workAttachments}";
+			var size = (list.split('url')).length-1;
+			var files = $("#attachment_file_conciliationRecords")[0].files;
+			for(var i = 0;i<files.length;i++) {
+				var file = files[i];
+				var attachmentId = "";
+				var attachmentFlag = "160";
+				console.log(file);
+				var timestamp = new Date().getTime();
+				var remarks = ""
+				var storeAs = "externalUnit";
+				var uploadPath = "http://gangwan-app.oss-cn-hangzhou.aliyuncs.com/" + storeAs;
+				/*将这段字符串存到数据库即可*/
+				var divId = "_exterFeedback";
+				$("#addFile" + divId).show();
+				multipartUploadWithSts(storeAs, file, attachmentId, attachmentFlag, uploadPath, divId, size);
+			}
+			console.log('list',files)
+		}
+		function addFile() {
+			$("#attachment_file_conciliationRecords").click();
+		}
+	</script>
+</head>
+<body>
+<div class="single-form">
+	<div class="container">
+		<form:form id="inputForm" modelAttribute="feedback" action="${ctx}/externalUnit/feedback/save" method="post" class="form-horizontal">
+		<form:hidden path="project.id" id="projectId"/>
+		<form:hidden path="id"/>
+		<input type="hidden" id="examiners" name="examinerList"/>
+			<div class="form-group layui-row first">
+				<div class="form-group-label"><h2>项目基本信息</h2></div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>项目名称:</label>
+					<div class="layui-input-block">
+						<form:input readonly="true" path="project.name" placeholder="请输入项目名称" htmlEscape="false"  class="form-control layui-input "/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>建设方:</label>
+					<div class="layui-input-block">
+						<form:input readonly="true" path="project.projectBuilder" placeholder="请输入建设方" htmlEscape="false"  class="form-control layui-input "/>
+
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>建设地点:</label>
+					<div class="layui-input-block">
+						<form:input readonly="true" path="project.buildPlace" placeholder="请输入建设地点" htmlEscape="false"  class="form-control layui-input "/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw7">
+					<label class="layui-form-label">创建人:</label>
+					<div class="layui-input-block">
+						<form:input path="project.createBy.name" htmlEscape="false"  readonly="true"  class="form-control  layui-input"/>
+						<form:hidden path="project.createBy.id" htmlEscape="false"   readonly="true"  class="form-control  layui-input"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm12 lw7 with-textarea">
+					<label class="layui-form-label ">备注:</label>
+					<div class="layui-input-block">
+						<form:textarea disabled="true" placeholder="请输入备注" readonly="true" path="project.remarks" htmlEscape="false" rows="4"  maxlength="255"  class="form-control "/>
+					</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="shr" class="xm-select-demo" tabindex="0" contenteditable="true"></div>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm12 lw7 with-textarea">
+					<label class="layui-form-label ">备注:</label>
+					<div class="layui-input-block">
+						<form:textarea placeholder="请输入备注" path="remarks" htmlEscape="false" rows="4"  maxlength="255"  class="form-control "/>
+					</div>
+				</div>
+			</div>
+			<div class="form-group-label"><h2>文件管理</h2></div>
+			<div class="layui-item nav-btns">
+				<a id="attachment_btn_conciliationRecords" class="nav-btn nav-btn-add" title="上传文件"><i class="fa fa-plus"></i>&nbsp;添加附件</a>
+
+			</div>
+			<div id="addFile_exterFeedback" style="display: none" class="upload-progress">
+				<span id="fileName_exterFeedback"></span>
+				<b><span id="baifenbi_exterFeedback"></span></b>
+				<div class="progress">
+						<%--进度条--%>
+					<div id="jindutiao_exterFeedback" class="progress-bar" style="width: 0%" aria-valuenow="0">
+					</div>
+				</div>
+			</div>
+			<input id="attachment_file_conciliationRecords" type="file" multiple="multiple"
+				   style="display: none;" onChange="if(this.value)insertTitle(this.value);"/>
+			<span id="attachment_title_conciliationRecords"></span>
+			<div class="layui-item layui-col-xs12" style="padding:0 16px;">
+				<table id="upTable_conciliationRecords" class="table table-bordered table-condensed details">
+					<thead>
+					<tr>
+							<%-- <th>序号</th>--%>
+						<th>文件</th>
+						<th>上传人</th>
+						<th>上传时间</th>
+						<th width="200px">操作</th>
+					</tr>
+					</thead>
+					<tbody id="file_exterFeedback">
+					<c:forEach items="${feedback.workAttachments}" var="workClientAttachment"
+							   varStatus="status">
+						<tr>
+								<%-- <td>${status.index + 1}</td>--%>
+							<c:choose>
+								<c:when test="${feedback.uploadMode == 2}">
+									<c:choose>
+										<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpg')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'png')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'gif')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'bmp')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpeg')}">
+											<td><img src="${workClientAttachment.temporaryUrl}" width="50" height="50" onclick="openDialogView('预览','${ctx}/sys/picturepreview/picturePreview?url=${workClientAttachment.temporaryUrl}','90%','90%')" alt="${workClientAttachment.attachmentName}">
+										</c:when>
+										<c:otherwise>
+											<c:choose>
+												<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+													<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',1)">${workClientAttachment.attachmentName}</a></td>
+												</c:when>
+												<c:otherwise>
+													<c:choose>
+														<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'rar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'zip')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'7z')}">
+															<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',3)">${workClientAttachment.attachmentName}</a></td>
+														</c:when>
+														<c:otherwise>
+															<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',2)">${workClientAttachment.attachmentName}</a></td>
+														</c:otherwise>
+													</c:choose>
+												</c:otherwise>
+											</c:choose>
+										</c:otherwise>
+									</c:choose>
+								</c:when>
+								<c:otherwise>
+									<c:choose>
+										<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpg')
+                                             or fn:containsIgnoreCase(workClientAttachment.attachmentName,'png')
+                                             or fn:containsIgnoreCase(workClientAttachment.attachmentName,'gif')
+                                             or fn:containsIgnoreCase(workClientAttachment.attachmentName,'bmp')
+                                             or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpeg')}">
+											<td><img src="${workClientAttachment.url}" width="50" height="50" onclick="openDialogView('预览','${ctx}/sys/picturepreview/picturePreview?url=${workClientAttachment.url}','90%','90%')" alt="${workClientAttachment.attachmentName}">
+										</c:when>
+										<c:otherwise>
+											<c:choose>
+												<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+													<td><a class="attention-info" href="javascript:void(0)"
+														   onclick="openPreview('${workClientAttachment.url}',1)">${workClientAttachment.attachmentName}</a>
+													</td>
+												</c:when>
+												<c:otherwise>
+													<c:choose>
+														<c:when test="${feedback.uploadMode == 2}">
+															<c:choose>
+																<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpg')
+                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'png')
+                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'gif')
+                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'bmp')
+                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpeg')}">
+																	<td><img src="${workClientAttachment.temporaryUrl}" width="50" height="50" onclick="openDialogView('预览','${ctx}/sys/picturepreview/picturePreview?url=${workClientAttachment.temporaryUrl}','90%','90%')" alt="${workClientAttachment.attachmentName}">
+																</c:when>
+																<c:otherwise>
+																	<c:choose>
+																		<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+																			<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',1)">${workClientAttachment.attachmentName}</a></td>
+																		</c:when>
+																		<c:otherwise>
+																			<c:choose>
+																				<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'rar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'zip')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'7z')}">
+																					<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',3)">${workClientAttachment.attachmentName}</a></td>
+																				</c:when>
+																				<c:otherwise>
+																					<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',2)">${workClientAttachment.attachmentName}</a></td>
+																				</c:otherwise>
+																			</c:choose>
+																		</c:otherwise>
+																	</c:choose>
+																</c:otherwise>
+															</c:choose>
+														</c:when>
+														<c:otherwise>
+															<c:choose>
+																<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpg')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'png')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'gif')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'bmp')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpeg')}">
+																	<td><img src="${workClientAttachment.url}" width="50" height="50" onclick="openDialogView('预览','${ctx}/sys/picturepreview/picturePreview?url=${workClientAttachment.url}','90%','90%')" alt="${workClientAttachment.attachmentName}">
+																</c:when>
+																<c:otherwise>
+																	<c:choose>
+																		<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+																			<td><a href="javascript:void(0)" onclick="openPreview('${workClientAttachment.url}',1)">${workClientAttachment.attachmentName}</a></td>
+																		</c:when>
+																		<c:otherwise>
+																			<c:choose>
+																				<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'rar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'zip')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'7z')}">
+																					<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.url}',3)">${workClientAttachment.attachmentName}</a></td>
+																				</c:when>
+																				<c:otherwise>
+																					<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.url}',2)">${workClientAttachment.attachmentName}</a></td>
+																				</c:otherwise>
+																			</c:choose>
+																		</c:otherwise>
+																	</c:choose>
+																</c:otherwise>
+															</c:choose>
+														</c:otherwise>
+													</c:choose>
+												</c:otherwise>
+											</c:choose>
+										</c:otherwise>
+									</c:choose>
+								</c:otherwise>
+							</c:choose>
+
+
+
+							<td>${workClientAttachment.createBy.name}</td>
+							<td><fmt:formatDate value="${workClientAttachment.createDate}" type="both"/></td>
+							<td class="op-td">
+								<div class="op-btn-box">
+
+										<%--附件下载删除--%>
+									<c:choose>
+										<c:when test="${feedback.uploadMode == 2}">
+											<c:choose>
+												<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+													<a href="${workClientAttachment.temporaryUrl}" target="_blank" class="op-btn op-btn-download"><i class="fa fa-download"></i>&nbsp;下载</a>
+												</c:when>
+												<c:otherwise>
+													<a href="${workClientAttachment.temporaryUrl}" class="op-btn op-btn-download"><i class="fa fa-download"></i>&nbsp;下载</a>
+												</c:otherwise>
+											</c:choose>
+										</c:when>
+										<c:otherwise>
+											<a href="javascript:location.href='${ctx}/workfullmanage/workFullManage/downLoadAttach?file='+encodeURIComponent('${workClientAttachment.url}');" class="op-btn op-btn-download"><i class="fa fa-download"></i>&nbsp;下载</a>
+										</c:otherwise>
+									</c:choose>
+									<c:if test="${workClientAttachment.createBy.id eq fns:getUser().id}">
+										<a href="javascript:void(0)"
+										   onclick="deleteFileFromAliyun(this,'${ctx}/sys/workattachment/deleteFileFromAliyun?url=${workClientAttachment.url}&id=${workClientAttachment.id}&type=2','addFile')"
+										   class="op-btn op-btn-delete"><i class="fa fa-trash"></i>&nbsp;删除</a>
+									</c:if>
+									<c:if test="${workClientAttachment.collectFlag != 1}">
+										<a href="javascript:void(0)" onclick="collectingAccessory(this,'${ctx}/projectAccessory/projectAccessory/saveCollectAccessory','${workClientAttachment.url}','${workClientAttachment.createBy.id}','${workClientAttachment.fileSize}')" class="op-btn layui-btn-warm" >&nbsp;收藏</a>
+									</c:if>
+								</div>
+							</td>
+						</tr>
+					</c:forEach>
+					</tbody>
+				</table>
+			</div>
+	</form:form>
+	</div>
+</div>
+<script src="${ctxStatic}/layer-v2.3/layui/layui.all.js" charset="utf-8"></script>
+<script>
+	function getProjectMembers() {
+		$.ajax({
+			type:'post',
+			url:'${ctx}/externalUnit/externalUnit/getProjectMembers',
+			data:{
+				"projectId":$("#projectId").val()
+			},
+			success:function(data){
+				if(data.success) {
+					var data = data.body.list;
+					var newDataList = data;
+					var showList = [];
+					var id = $("#id").val();
+					if(id == ""){
+						xmSelect.render({
+							el: '#shr',
+							language: 'zn',
+							data:data
+						})
+					}else{
+						$.ajax({
+							type:'post',
+							url:'${ctx}/externalUnit/feedback/getAuditerById',
+							data:{
+								"id":$("#id").val()
+							},
+							success:function(dataListById){
+
+								if(dataListById.success) {
+									var showDataList = dataListById.body.list;
+									var lists = [];
+									for (i in newDataList) {
+										for (j in showDataList) {
+											if (newDataList[i].value == showDataList[j].value) {
+												var newData = {
+													"name": newDataList[i].name,
+													"value": newDataList[i].value,
+													"selected": true
+
+												}
+												lists.push(newDataList[i].value);
+												showList.push(newData);
+												data.splice(i,1,newData);
+											}
+										}
+									}
+
+									$("#examiners").val(lists);
+									xmSelect.render({
+										el: '#shr',
+										language: 'zn',
+										data:data
+									})
+								}
+							}
+						})
+					}
+
+				}
+			}
+		})
+	}
+
+	var shr = xmSelect.render({
+		el: '#shr',
+		language: 'zn',
+		data: [
+		]
+	})
+
+
+	document.getElementById('shr').onblur=function(){
+		var list = [];
+		//获取当前多选选中的值
+		var selectArr = shr.getValue();
+		for (var i in selectArr){
+			list.push(selectArr[i].value);
+		}
+		$("#examiners").val(list);
+		console.log(list);
+	}
+</script>
+</body>
+</html>

+ 431 - 0
src/main/webapp/webpage/modules/externalUnit/feedbackFormAudit.jsp

@@ -0,0 +1,431 @@
+<%@ 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" src="${ctxStatic}/helloweba_editable-select/jquery.editable-select.min.js"></script>
+	<link rel='stylesheet' type="text/css" href="${ctxStatic}/helloweba_editable-select/jquery.editable-select.min.css"/>
+	<script src="${ctxStatic}/layer-v2.3/layui/xmSelect.js" charset="utf-8"></script>
+	<link rel='stylesheet' type="text/css" href="${ctxStatic}/layui/css/layui.css"/>
+	<script type="text/javascript" src="${ctxStatic}/layui/layui.js"></script>
+
+	<script type="text/javascript">
+		var validateForm;
+		function doSubmit(obj){//回调函数,在编辑和保存动作时,供openDialog调用提交表单。
+			console.log('obj',validateForm.form())
+			console.log('obj1',obj)
+		  if(validateForm.form()){
+			  if(validateForm.form()){
+				  if(obj == 1) {
+					  $("#flag").val("yes");
+				  }else {
+					  $("#flag").val("no");
+					  var comment = $("#comment").val();
+					  if (comment == ''){
+						  parent.layer.msg("请填写驳回意见!", {icon: 5});
+						  return false;
+					  }
+				  }
+				  }
+				  $("#inputForm").submit();
+				  return true;
+			  }
+		  return false;
+		}
+		$(document).ready(function() {
+			getProjectMembers();
+			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);
+					}
+				}
+			});
+			$("#attachment_btn_conciliationRecords").click(function () {
+				$("#attachment_file_conciliationRecords").click();
+			});
+		});
+		function insertTitle(tValue){
+			console.log('insertTitle')
+			var list = "${feedback.workAttachments}";
+			var size = (list.split('url')).length-1;
+			var files = $("#attachment_file_conciliationRecords")[0].files;
+			for(var i = 0;i<files.length;i++) {
+				var file = files[i];
+				var attachmentId = "";
+				var attachmentFlag = "160";
+				console.log(file);
+				var timestamp = new Date().getTime();
+				var remarks = ""
+				var storeAs = "externalUnit";
+				var uploadPath = "http://gangwan-app.oss-cn-hangzhou.aliyuncs.com/" + storeAs;
+				/*将这段字符串存到数据库即可*/
+				var divId = "_exterFeedback";
+				$("#addFile" + divId).show();
+				multipartUploadWithSts(storeAs, file, attachmentId, attachmentFlag, uploadPath, divId, size);
+			}
+			console.log('list',files)
+		}
+		function addFile() {
+			$("#attachment_file_conciliationRecords").click();
+		}
+	</script>
+</head>
+<body>
+<div class="single-form">
+	<div class="container">
+		<form:form id="inputForm" modelAttribute="feedback" action="${ctx}/externalUnit/feedback/saveAudit" method="post" class="form-horizontal">
+		<form:hidden path="project.id" id="projectId"/>
+		<form:hidden path="id"/>
+			<form:hidden path="home"/>
+			<form:hidden path="act.taskId"/>
+			<form:hidden path="act.taskName"/>
+			<form:hidden path="act.taskDefKey"/>
+			<form:hidden path="act.procInsId"/>
+			<form:hidden path="act.procDefId"/>
+			<form:hidden id="flag" path="act.flag"/>
+		<input type="hidden" id="examiners" name="examinerList"/>
+			<div class="form-group layui-row first">
+				<div class="form-group-label"><h2>项目基本信息</h2></div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>项目名称:</label>
+					<div class="layui-input-block">
+						<form:input readonly="true" path="project.name" placeholder="请输入项目名称" htmlEscape="false"  class="form-control layui-input "/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>建设方:</label>
+					<div class="layui-input-block">
+						<form:input readonly="true" path="project.projectBuilder" placeholder="请输入建设方" htmlEscape="false"  class="form-control layui-input "/>
+
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>建设地点:</label>
+					<div class="layui-input-block">
+						<form:input readonly="true" path="project.buildPlace" placeholder="请输入建设地点" htmlEscape="false"  class="form-control layui-input "/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw7">
+					<label class="layui-form-label">创建人:</label>
+					<div class="layui-input-block">
+						<form:input path="project.createBy.name" htmlEscape="false"  readonly="true"  class="form-control  layui-input"/>
+						<form:hidden path="project.createBy.id" htmlEscape="false"   readonly="true"  class="form-control  layui-input"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm12 lw7 with-textarea">
+					<label class="layui-form-label ">备注:</label>
+					<div class="layui-input-block">
+						<form:textarea disabled="true" placeholder="请输入备注" readonly="true" path="project.remarks" htmlEscape="false" rows="4"  maxlength="255"  class="form-control "/>
+					</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="shr" style="pointer-events: none; background-color: #fff" class="xm-select-demo" tabindex="0"  contenteditable="true"></div>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm12 lw7 with-textarea">
+					<label class="layui-form-label ">备注:</label>
+					<div class="layui-input-block">
+						<form:textarea readonly="true" placeholder="请输入备注" path="remarks" htmlEscape="false" rows="4"  maxlength="255"  class="form-control "/>
+					</div>
+				</div>
+			</div>
+			<div class="form-group-label"><h2>文件管理</h2></div>
+			<div class="layui-item nav-btns">
+<%--				<a id="attachment_btn_conciliationRecords" class="nav-btn nav-btn-add" title="上传文件"><i class="fa fa-plus"></i>&nbsp;添加附件</a>--%>
+
+			</div>
+			<div id="addFile_exterFeedback" style="display: none" class="upload-progress">
+				<span id="fileName_exterFeedback"></span>
+				<b><span id="baifenbi_exterFeedback"></span></b>
+				<div class="progress">
+						<%--进度条--%>
+					<div id="jindutiao_exterFeedback" class="progress-bar" style="width: 0%" aria-valuenow="0">
+					</div>
+				</div>
+			</div>
+			<input id="attachment_file_conciliationRecords" type="file" multiple="multiple"
+				   style="display: none;" onChange="if(this.value)insertTitle(this.value);"/>
+			<span id="attachment_title_conciliationRecords"></span>
+			<div class="layui-item layui-col-xs12" style="padding:0 16px;">
+				<table id="upTable_conciliationRecords" class="table table-bordered table-condensed details">
+					<thead>
+					<tr>
+							<%-- <th>序号</th>--%>
+						<th>文件</th>
+						<th>上传人</th>
+						<th>上传时间</th>
+						<th width="200px">操作</th>
+					</tr>
+					</thead>
+					<tbody id="file_exterFeedback">
+					<c:forEach items="${feedback.workAttachments}" var="workClientAttachment"
+							   varStatus="status">
+						<tr>
+								<%-- <td>${status.index + 1}</td>--%>
+							<c:choose>
+								<c:when test="${feedback.uploadMode == 2}">
+									<c:choose>
+										<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpg')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'png')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'gif')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'bmp')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpeg')}">
+											<td><img src="${workClientAttachment.temporaryUrl}" width="50" height="50" onclick="openDialogView('预览','${ctx}/sys/picturepreview/picturePreview?url=${workClientAttachment.temporaryUrl}','90%','90%')" alt="${workClientAttachment.attachmentName}">
+										</c:when>
+										<c:otherwise>
+											<c:choose>
+												<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+													<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',1)">${workClientAttachment.attachmentName}</a></td>
+												</c:when>
+												<c:otherwise>
+													<c:choose>
+														<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'rar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'zip')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'7z')}">
+															<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',3)">${workClientAttachment.attachmentName}</a></td>
+														</c:when>
+														<c:otherwise>
+															<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',2)">${workClientAttachment.attachmentName}</a></td>
+														</c:otherwise>
+													</c:choose>
+												</c:otherwise>
+											</c:choose>
+										</c:otherwise>
+									</c:choose>
+								</c:when>
+								<c:otherwise>
+									<c:choose>
+										<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpg')
+                                             or fn:containsIgnoreCase(workClientAttachment.attachmentName,'png')
+                                             or fn:containsIgnoreCase(workClientAttachment.attachmentName,'gif')
+                                             or fn:containsIgnoreCase(workClientAttachment.attachmentName,'bmp')
+                                             or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpeg')}">
+											<td><img src="${workClientAttachment.url}" width="50" height="50" onclick="openDialogView('预览','${ctx}/sys/picturepreview/picturePreview?url=${workClientAttachment.url}','90%','90%')" alt="${workClientAttachment.attachmentName}">
+										</c:when>
+										<c:otherwise>
+											<c:choose>
+												<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+													<td><a class="attention-info" href="javascript:void(0)"
+														   onclick="openPreview('${workClientAttachment.url}',1)">${workClientAttachment.attachmentName}</a>
+													</td>
+												</c:when>
+												<c:otherwise>
+													<c:choose>
+														<c:when test="${feedback.uploadMode == 2}">
+															<c:choose>
+																<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpg')
+                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'png')
+                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'gif')
+                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'bmp')
+                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpeg')}">
+																	<td><img src="${workClientAttachment.temporaryUrl}" width="50" height="50" onclick="openDialogView('预览','${ctx}/sys/picturepreview/picturePreview?url=${workClientAttachment.temporaryUrl}','90%','90%')" alt="${workClientAttachment.attachmentName}">
+																</c:when>
+																<c:otherwise>
+																	<c:choose>
+																		<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+																			<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',1)">${workClientAttachment.attachmentName}</a></td>
+																		</c:when>
+																		<c:otherwise>
+																			<c:choose>
+																				<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'rar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'zip')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'7z')}">
+																					<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',3)">${workClientAttachment.attachmentName}</a></td>
+																				</c:when>
+																				<c:otherwise>
+																					<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',2)">${workClientAttachment.attachmentName}</a></td>
+																				</c:otherwise>
+																			</c:choose>
+																		</c:otherwise>
+																	</c:choose>
+																</c:otherwise>
+															</c:choose>
+														</c:when>
+														<c:otherwise>
+															<c:choose>
+																<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpg')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'png')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'gif')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'bmp')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpeg')}">
+																	<td><img src="${workClientAttachment.url}" width="50" height="50" onclick="openDialogView('预览','${ctx}/sys/picturepreview/picturePreview?url=${workClientAttachment.url}','90%','90%')" alt="${workClientAttachment.attachmentName}">
+																</c:when>
+																<c:otherwise>
+																	<c:choose>
+																		<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+																			<td><a href="javascript:void(0)" onclick="openPreview('${workClientAttachment.url}',1)">${workClientAttachment.attachmentName}</a></td>
+																		</c:when>
+																		<c:otherwise>
+																			<c:choose>
+																				<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'rar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'zip')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'7z')}">
+																					<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.url}',3)">${workClientAttachment.attachmentName}</a></td>
+																				</c:when>
+																				<c:otherwise>
+																					<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.url}',2)">${workClientAttachment.attachmentName}</a></td>
+																				</c:otherwise>
+																			</c:choose>
+																		</c:otherwise>
+																	</c:choose>
+																</c:otherwise>
+															</c:choose>
+														</c:otherwise>
+													</c:choose>
+												</c:otherwise>
+											</c:choose>
+										</c:otherwise>
+									</c:choose>
+								</c:otherwise>
+							</c:choose>
+
+
+
+							<td>${workClientAttachment.createBy.name}</td>
+							<td><fmt:formatDate value="${workClientAttachment.createDate}" type="both"/></td>
+							<td class="op-td">
+								<div class="op-btn-box">
+
+										<%--附件下载删除--%>
+									<c:choose>
+										<c:when test="${feedback.uploadMode == 2}">
+											<c:choose>
+												<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+													<a href="${workClientAttachment.temporaryUrl}" target="_blank" class="op-btn op-btn-download"><i class="fa fa-download"></i>&nbsp;下载</a>
+												</c:when>
+												<c:otherwise>
+													<a href="${workClientAttachment.temporaryUrl}" class="op-btn op-btn-download"><i class="fa fa-download"></i>&nbsp;下载</a>
+												</c:otherwise>
+											</c:choose>
+										</c:when>
+										<c:otherwise>
+											<a href="javascript:location.href='${ctx}/workfullmanage/workFullManage/downLoadAttach?file='+encodeURIComponent('${workClientAttachment.url}');" class="op-btn op-btn-download"><i class="fa fa-download"></i>&nbsp;下载</a>
+										</c:otherwise>
+									</c:choose>
+									<c:if test="${workClientAttachment.createBy.id eq fns:getUser().id}">
+										<a href="javascript:void(0)"
+										   onclick="deleteFileFromAliyun(this,'${ctx}/sys/workattachment/deleteFileFromAliyun?url=${workClientAttachment.url}&id=${workClientAttachment.id}&type=2','addFile')"
+										   class="op-btn op-btn-delete"><i class="fa fa-trash"></i>&nbsp;删除</a>
+									</c:if>
+									<c:if test="${workClientAttachment.collectFlag != 1}">
+										<a href="javascript:void(0)" onclick="collectingAccessory(this,'${ctx}/projectAccessory/projectAccessory/saveCollectAccessory','${workClientAttachment.url}','${workClientAttachment.createBy.id}','${workClientAttachment.fileSize}')" class="op-btn layui-btn-warm" >&nbsp;收藏</a>
+									</c:if>
+								</div>
+							</td>
+						</tr>
+					</c:forEach>
+					</tbody>
+				</table>
+			</div>
+			<div class="form-group layui-row">
+				<div class="form-group-label"><h2>审批意见</h2></div>
+				<div class="layui-item layui-col-sm12 lw6 with-textarea">
+					<label class="layui-form-label">审批意见:</label>
+					<div class="layui-input-block">
+						<form:textarea id="comment" path="act.comment" class="form-control" rows="4" maxlength="127" />
+						<input type="file" name="upload_files" style="display: none;">
+					</div>
+				</div>
+			</div>
+
+	</form:form>
+		<div class="form-group layui-row">
+			<div class="form-group-label"><h2>${projectNotifyType}审批流程</h2></div>
+			<div class="layui-item layui-col-xs12 form-table-container" >
+				<act:flowChart procInsId="${processInstanceId}"/>
+				<act:histoicFlow procInsId="${processInstanceId}"/>
+			</div>
+		</div>
+	</div>
+</div>
+<script src="${ctxStatic}/layer-v2.3/layui/layui.all.js" charset="utf-8"></script>
+<script>
+	function getProjectMembers() {
+		$.ajax({
+			type:'post',
+			url:'${ctx}/externalUnit/externalUnit/getProjectMembers',
+			data:{
+				"projectId":$("#projectId").val()
+			},
+			success:function(data){
+				if(data.success) {
+					var data = data.body.list;
+					var newDataList = data;
+					var showList = [];
+					$.ajax({
+						type:'post',
+						url:'${ctx}/externalUnit/feedback/getAuditerById',
+						data:{
+							"id":$("#id").val()
+						},
+						success:function(dataListById){
+
+							if(dataListById.success) {
+								var showDataList = dataListById.body.list;
+								var lists = [];
+								for (i in newDataList) {
+									for (j in showDataList) {
+										if (newDataList[i].value == showDataList[j].value) {
+											var newData = {
+												"name": newDataList[i].name,
+												"value": newDataList[i].value,
+												"selected": true
+
+											}
+											lists.push(newDataList[i].value);
+											showList.push(newData);
+											data.splice(i,1,newData);
+										}
+									}
+								}
+
+								$("#examiners").val(lists);
+								xmSelect.render({
+									el: '#shr',
+									language: 'zn',
+									data:data
+								})
+							}
+						}
+					})
+				}
+			}
+		})
+	}
+
+	var shr = xmSelect.render({
+		el: '#shr',
+		language: 'zn',
+		data: [
+		]
+	})
+
+
+	document.getElementById('shr').onblur=function(){
+		var list = [];
+		//获取当前多选选中的值
+		var selectArr = shr.getValue();
+		for (var i in selectArr){
+			list.push(selectArr[i].value);
+		}
+		$("#examiners").val(list);
+		console.log(list);
+	}
+</script>
+</body>
+</html>

+ 417 - 0
src/main/webapp/webpage/modules/externalUnit/feedbackFormModify.jsp

@@ -0,0 +1,417 @@
+<%@ 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" src="${ctxStatic}/helloweba_editable-select/jquery.editable-select.min.js"></script>
+	<link rel='stylesheet' type="text/css" href="${ctxStatic}/helloweba_editable-select/jquery.editable-select.min.css"/>
+	<script src="${ctxStatic}/layer-v2.3/layui/xmSelect.js" charset="utf-8"></script>
+	<link rel='stylesheet' type="text/css" href="${ctxStatic}/layui/css/layui.css"/>
+	<script type="text/javascript" src="${ctxStatic}/layui/layui.js"></script>
+
+	<script type="text/javascript">
+		var validateForm;
+		function doSubmit(obj){//回调函数,在编辑和保存动作时,供openDialog调用提交表单。
+			console.log('obj',validateForm.form())
+			console.log('obj1',obj)
+		  if(validateForm.form()){
+			  if(obj == 1){
+				  if($("#examiners").val() == ""){
+					  parent.layer.msg("请选择审核人!", {icon: 5});
+					  return false;
+				  }
+
+			  }else if(obj ==2){
+				  //暂存
+				  $("#inputForm").attr("action","${ctx}/externalUnit/feedback/store");
+			  }else if(obj ==3){
+				  console.log('1111')
+				  //暂存
+				  $("#inputForm").attr("action","${ctx}/externalUnit/feedback/store");
+			  }
+			  $("#inputForm").submit();
+			  return true;
+		  }else {
+			  parent.layer.msg("信息未填写完整!", {icon: 5});
+		  }
+		  return false;
+		}
+		$(document).ready(function() {
+			getProjectMembers();
+			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);
+					}
+				}
+			});
+			$("#attachment_btn_conciliationRecords").click(function () {
+				$("#attachment_file_conciliationRecords").click();
+			});
+		});
+		function insertTitle(tValue){
+			console.log('insertTitle')
+			var list = "${feedback.workAttachments}";
+			var size = (list.split('url')).length-1;
+			var files = $("#attachment_file_conciliationRecords")[0].files;
+			for(var i = 0;i<files.length;i++) {
+				var file = files[i];
+				var attachmentId = "";
+				var attachmentFlag = "160";
+				console.log(file);
+				var timestamp = new Date().getTime();
+				var remarks = ""
+				var storeAs = "externalUnit";
+				var uploadPath = "http://gangwan-app.oss-cn-hangzhou.aliyuncs.com/" + storeAs;
+				/*将这段字符串存到数据库即可*/
+				var divId = "_exterFeedback";
+				$("#addFile" + divId).show();
+				multipartUploadWithSts(storeAs, file, attachmentId, attachmentFlag, uploadPath, divId, size);
+			}
+			console.log('list',files)
+		}
+		function addFile() {
+			$("#attachment_file_conciliationRecords").click();
+		}
+	</script>
+</head>
+<body>
+<div class="single-form">
+	<div class="container">
+		<form:form id="inputForm" modelAttribute="feedback" action="${ctx}/externalUnit/feedback/save" method="post" class="form-horizontal">
+		<form:hidden path="project.id" id="projectId"/>
+		<form:hidden path="id"/>
+			<form:hidden path="home"/>
+			<form:hidden path="act.taskId"/>
+			<form:hidden path="act.taskName"/>
+			<form:hidden path="act.taskDefKey"/>
+			<form:hidden path="act.procInsId"/>
+			<form:hidden path="act.procDefId"/>
+			<form:hidden id="flag" path="act.flag"/>
+		<input type="hidden" id="examiners" name="examinerList"/>
+			<div class="form-group layui-row first">
+				<div class="form-group-label"><h2>项目基本信息</h2></div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>项目名称:</label>
+					<div class="layui-input-block">
+						<form:input readonly="true" path="project.name" placeholder="请输入项目名称" htmlEscape="false"  class="form-control layui-input "/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>建设方:</label>
+					<div class="layui-input-block">
+						<form:input readonly="true" path="project.projectBuilder" placeholder="请输入建设方" htmlEscape="false"  class="form-control layui-input "/>
+
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>建设地点:</label>
+					<div class="layui-input-block">
+						<form:input readonly="true" path="project.buildPlace" placeholder="请输入建设地点" htmlEscape="false"  class="form-control layui-input "/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw7">
+					<label class="layui-form-label">创建人:</label>
+					<div class="layui-input-block">
+						<form:input path="project.createBy.name" htmlEscape="false"  readonly="true"  class="form-control  layui-input"/>
+						<form:hidden path="project.createBy.id" htmlEscape="false"   readonly="true"  class="form-control  layui-input"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm12 lw7 with-textarea">
+					<label class="layui-form-label ">备注:</label>
+					<div class="layui-input-block">
+						<form:textarea disabled="true" placeholder="请输入备注" readonly="true" path="project.remarks" htmlEscape="false" rows="4"  maxlength="255"  class="form-control "/>
+					</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="shr" class="xm-select-demo" tabindex="0" contenteditable="true"></div>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm12 lw7 with-textarea">
+					<label class="layui-form-label ">备注:</label>
+					<div class="layui-input-block">
+						<form:textarea placeholder="请输入备注" path="remarks" htmlEscape="false" rows="4"  maxlength="255"  class="form-control "/>
+					</div>
+				</div>
+			</div>
+			<div class="form-group-label"><h2>文件管理</h2></div>
+			<div class="layui-item nav-btns">
+				<a id="attachment_btn_conciliationRecords" class="nav-btn nav-btn-add" title="上传文件"><i class="fa fa-plus"></i>&nbsp;添加附件</a>
+
+			</div>
+			<div id="addFile_exterFeedback" style="display: none" class="upload-progress">
+				<span id="fileName_exterFeedback"></span>
+				<b><span id="baifenbi_exterFeedback"></span></b>
+				<div class="progress">
+						<%--进度条--%>
+					<div id="jindutiao_exterFeedback" class="progress-bar" style="width: 0%" aria-valuenow="0">
+					</div>
+				</div>
+			</div>
+			<input id="attachment_file_conciliationRecords" type="file" multiple="multiple"
+				   style="display: none;" onChange="if(this.value)insertTitle(this.value);"/>
+			<span id="attachment_title_conciliationRecords"></span>
+			<div class="layui-item layui-col-xs12" style="padding:0 16px;">
+				<table id="upTable_conciliationRecords" class="table table-bordered table-condensed details">
+					<thead>
+					<tr>
+							<%-- <th>序号</th>--%>
+						<th>文件</th>
+						<th>上传人</th>
+						<th>上传时间</th>
+						<th width="200px">操作</th>
+					</tr>
+					</thead>
+					<tbody id="file_exterFeedback">
+					<c:forEach items="${feedback.workAttachments}" var="workClientAttachment"
+							   varStatus="status">
+						<tr>
+								<%-- <td>${status.index + 1}</td>--%>
+							<c:choose>
+								<c:when test="${feedback.uploadMode == 2}">
+									<c:choose>
+										<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpg')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'png')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'gif')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'bmp')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpeg')}">
+											<td><img src="${workClientAttachment.temporaryUrl}" width="50" height="50" onclick="openDialogView('预览','${ctx}/sys/picturepreview/picturePreview?url=${workClientAttachment.temporaryUrl}','90%','90%')" alt="${workClientAttachment.attachmentName}">
+										</c:when>
+										<c:otherwise>
+											<c:choose>
+												<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+													<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',1)">${workClientAttachment.attachmentName}</a></td>
+												</c:when>
+												<c:otherwise>
+													<c:choose>
+														<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'rar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'zip')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'7z')}">
+															<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',3)">${workClientAttachment.attachmentName}</a></td>
+														</c:when>
+														<c:otherwise>
+															<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',2)">${workClientAttachment.attachmentName}</a></td>
+														</c:otherwise>
+													</c:choose>
+												</c:otherwise>
+											</c:choose>
+										</c:otherwise>
+									</c:choose>
+								</c:when>
+								<c:otherwise>
+									<c:choose>
+										<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpg')
+                                             or fn:containsIgnoreCase(workClientAttachment.attachmentName,'png')
+                                             or fn:containsIgnoreCase(workClientAttachment.attachmentName,'gif')
+                                             or fn:containsIgnoreCase(workClientAttachment.attachmentName,'bmp')
+                                             or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpeg')}">
+											<td><img src="${workClientAttachment.url}" width="50" height="50" onclick="openDialogView('预览','${ctx}/sys/picturepreview/picturePreview?url=${workClientAttachment.url}','90%','90%')" alt="${workClientAttachment.attachmentName}">
+										</c:when>
+										<c:otherwise>
+											<c:choose>
+												<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+													<td><a class="attention-info" href="javascript:void(0)"
+														   onclick="openPreview('${workClientAttachment.url}',1)">${workClientAttachment.attachmentName}</a>
+													</td>
+												</c:when>
+												<c:otherwise>
+													<c:choose>
+														<c:when test="${feedback.uploadMode == 2}">
+															<c:choose>
+																<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpg')
+                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'png')
+                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'gif')
+                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'bmp')
+                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpeg')}">
+																	<td><img src="${workClientAttachment.temporaryUrl}" width="50" height="50" onclick="openDialogView('预览','${ctx}/sys/picturepreview/picturePreview?url=${workClientAttachment.temporaryUrl}','90%','90%')" alt="${workClientAttachment.attachmentName}">
+																</c:when>
+																<c:otherwise>
+																	<c:choose>
+																		<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+																			<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',1)">${workClientAttachment.attachmentName}</a></td>
+																		</c:when>
+																		<c:otherwise>
+																			<c:choose>
+																				<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'rar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'zip')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'7z')}">
+																					<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',3)">${workClientAttachment.attachmentName}</a></td>
+																				</c:when>
+																				<c:otherwise>
+																					<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',2)">${workClientAttachment.attachmentName}</a></td>
+																				</c:otherwise>
+																			</c:choose>
+																		</c:otherwise>
+																	</c:choose>
+																</c:otherwise>
+															</c:choose>
+														</c:when>
+														<c:otherwise>
+															<c:choose>
+																<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpg')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'png')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'gif')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'bmp')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpeg')}">
+																	<td><img src="${workClientAttachment.url}" width="50" height="50" onclick="openDialogView('预览','${ctx}/sys/picturepreview/picturePreview?url=${workClientAttachment.url}','90%','90%')" alt="${workClientAttachment.attachmentName}">
+																</c:when>
+																<c:otherwise>
+																	<c:choose>
+																		<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+																			<td><a href="javascript:void(0)" onclick="openPreview('${workClientAttachment.url}',1)">${workClientAttachment.attachmentName}</a></td>
+																		</c:when>
+																		<c:otherwise>
+																			<c:choose>
+																				<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'rar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'zip')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'7z')}">
+																					<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.url}',3)">${workClientAttachment.attachmentName}</a></td>
+																				</c:when>
+																				<c:otherwise>
+																					<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.url}',2)">${workClientAttachment.attachmentName}</a></td>
+																				</c:otherwise>
+																			</c:choose>
+																		</c:otherwise>
+																	</c:choose>
+																</c:otherwise>
+															</c:choose>
+														</c:otherwise>
+													</c:choose>
+												</c:otherwise>
+											</c:choose>
+										</c:otherwise>
+									</c:choose>
+								</c:otherwise>
+							</c:choose>
+
+
+
+							<td>${workClientAttachment.createBy.name}</td>
+							<td><fmt:formatDate value="${workClientAttachment.createDate}" type="both"/></td>
+							<td class="op-td">
+								<div class="op-btn-box">
+
+										<%--附件下载删除--%>
+									<c:choose>
+										<c:when test="${feedback.uploadMode == 2}">
+											<c:choose>
+												<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+													<a href="${workClientAttachment.temporaryUrl}" target="_blank" class="op-btn op-btn-download"><i class="fa fa-download"></i>&nbsp;下载</a>
+												</c:when>
+												<c:otherwise>
+													<a href="${workClientAttachment.temporaryUrl}" class="op-btn op-btn-download"><i class="fa fa-download"></i>&nbsp;下载</a>
+												</c:otherwise>
+											</c:choose>
+										</c:when>
+										<c:otherwise>
+											<a href="javascript:location.href='${ctx}/workfullmanage/workFullManage/downLoadAttach?file='+encodeURIComponent('${workClientAttachment.url}');" class="op-btn op-btn-download"><i class="fa fa-download"></i>&nbsp;下载</a>
+										</c:otherwise>
+									</c:choose>
+									<c:if test="${workClientAttachment.createBy.id eq fns:getUser().id}">
+										<a href="javascript:void(0)"
+										   onclick="deleteFileFromAliyun(this,'${ctx}/sys/workattachment/deleteFileFromAliyun?url=${workClientAttachment.url}&id=${workClientAttachment.id}&type=2','addFile')"
+										   class="op-btn op-btn-delete"><i class="fa fa-trash"></i>&nbsp;删除</a>
+									</c:if>
+									<c:if test="${workClientAttachment.collectFlag != 1}">
+										<a href="javascript:void(0)" onclick="collectingAccessory(this,'${ctx}/projectAccessory/projectAccessory/saveCollectAccessory','${workClientAttachment.url}','${workClientAttachment.createBy.id}','${workClientAttachment.fileSize}')" class="op-btn layui-btn-warm" >&nbsp;收藏</a>
+									</c:if>
+								</div>
+							</td>
+						</tr>
+					</c:forEach>
+					</tbody>
+				</table>
+			</div>
+	</form:form>
+	</div>
+</div>
+<script src="${ctxStatic}/layer-v2.3/layui/layui.all.js" charset="utf-8"></script>
+<script>
+	function getProjectMembers() {
+		$.ajax({
+			type:'post',
+			url:'${ctx}/externalUnit/externalUnit/getProjectMembers',
+			data:{
+				"projectId":$("#projectId").val()
+			},
+			success:function(data){
+				if(data.success) {
+					var data = data.body.list;
+					var newDataList = data;
+					var showList = [];
+					$.ajax({
+						type:'post',
+						url:'${ctx}/externalUnit/feedback/getAuditerById',
+						data:{
+							"id":$("#id").val()
+						},
+						success:function(dataListById){
+
+							if(dataListById.success) {
+								var showDataList = dataListById.body.list;
+								var lists = [];
+								for (i in newDataList) {
+									for (j in showDataList) {
+										if (newDataList[i].value == showDataList[j].value) {
+											var newData = {
+												"name": newDataList[i].name,
+												"value": newDataList[i].value,
+												"selected": true
+
+											}
+											lists.push(newDataList[i].value);
+											showList.push(newData);
+											data.splice(i,1,newData);
+										}
+									}
+								}
+
+								$("#examiners").val(lists);
+								xmSelect.render({
+									el: '#shr',
+									language: 'zn',
+									data:data
+								})
+							}
+						}
+					})
+				}
+			}
+		})
+	}
+
+	var shr = xmSelect.render({
+		el: '#shr',
+		language: 'zn',
+		data: [
+		]
+	})
+
+
+	document.getElementById('shr').onblur=function(){
+		var list = [];
+		//获取当前多选选中的值
+		var selectArr = shr.getValue();
+		for (var i in selectArr){
+			list.push(selectArr[i].value);
+		}
+		$("#examiners").val(list);
+		console.log(list);
+	}
+</script>
+</body>
+</html>

+ 410 - 0
src/main/webapp/webpage/modules/externalUnit/feedbackFormView.jsp

@@ -0,0 +1,410 @@
+<%@ 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" src="${ctxStatic}/helloweba_editable-select/jquery.editable-select.min.js"></script>
+	<link rel='stylesheet' type="text/css" href="${ctxStatic}/helloweba_editable-select/jquery.editable-select.min.css"/>
+	<script src="${ctxStatic}/layer-v2.3/layui/xmSelect.js" charset="utf-8"></script>
+	<link rel='stylesheet' type="text/css" href="${ctxStatic}/layui/css/layui.css"/>
+	<script type="text/javascript" src="${ctxStatic}/layui/layui.js"></script>
+
+	<script type="text/javascript">
+		var validateForm;
+		function doSubmit(obj){//回调函数,在编辑和保存动作时,供openDialog调用提交表单。
+			console.log('obj',validateForm.form())
+			console.log('obj1',obj)
+		  if(validateForm.form()){
+			  if(obj == 1){
+				  if($("#examiners").val() == ""){
+					  parent.layer.msg("请选择审核人!", {icon: 5});
+					  return false;
+				  }
+
+			  }else if(obj ==2){
+				  //暂存
+				  $("#inputForm").attr("action","${ctx}/externalUnit/feedback/store");
+			  }else if(obj ==3){
+				  console.log('1111')
+				  //暂存
+				  $("#inputForm").attr("action","${ctx}/externalUnit/feedback/store");
+			  }
+			  $("#inputForm").submit();
+			  return true;
+		  }else {
+			  parent.layer.msg("信息未填写完整!", {icon: 5});
+		  }
+		  return false;
+		}
+		$(document).ready(function() {
+			getProjectMembers();
+			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);
+					}
+				}
+			});
+			$("#attachment_btn_conciliationRecords").click(function () {
+				$("#attachment_file_conciliationRecords").click();
+			});
+		});
+		function insertTitle(tValue){
+			console.log('insertTitle')
+			var list = "${feedback.workAttachments}";
+			var size = (list.split('url')).length-1;
+			var files = $("#attachment_file_conciliationRecords")[0].files;
+			for(var i = 0;i<files.length;i++) {
+				var file = files[i];
+				var attachmentId = "";
+				var attachmentFlag = "160";
+				console.log(file);
+				var timestamp = new Date().getTime();
+				var remarks = ""
+				var storeAs = "externalUnit";
+				var uploadPath = "http://gangwan-app.oss-cn-hangzhou.aliyuncs.com/" + storeAs;
+				/*将这段字符串存到数据库即可*/
+				var divId = "_exterFeedback";
+				$("#addFile" + divId).show();
+				multipartUploadWithSts(storeAs, file, attachmentId, attachmentFlag, uploadPath, divId, size);
+			}
+			console.log('list',files)
+		}
+		function addFile() {
+			$("#attachment_file_conciliationRecords").click();
+		}
+	</script>
+</head>
+<body>
+<div class="single-form">
+	<div class="container">
+		<form:form id="inputForm" modelAttribute="feedback" action="${ctx}/externalUnit/feedback/save" method="post" class="form-horizontal">
+		<form:hidden path="project.id" id="projectId"/>
+		<form:hidden path="id"/>
+		<input type="hidden" id="examiners" name="examinerList"/>
+			<div class="form-group layui-row first">
+				<div class="form-group-label"><h2>项目基本信息</h2></div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>项目名称:</label>
+					<div class="layui-input-block">
+						<form:input readonly="true" path="project.name" placeholder="请输入项目名称" htmlEscape="false"  class="form-control layui-input "/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>建设方:</label>
+					<div class="layui-input-block">
+						<form:input readonly="true" path="project.projectBuilder" placeholder="请输入建设方" htmlEscape="false"  class="form-control layui-input "/>
+
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw6">
+					<label class="layui-form-label"><span class="require-item">*</span>建设地点:</label>
+					<div class="layui-input-block">
+						<form:input readonly="true" path="project.buildPlace" placeholder="请输入建设地点" htmlEscape="false"  class="form-control layui-input "/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6 lw7">
+					<label class="layui-form-label">创建人:</label>
+					<div class="layui-input-block">
+						<form:input path="project.createBy.name" htmlEscape="false"  readonly="true"  class="form-control  layui-input"/>
+						<form:hidden path="project.createBy.id" htmlEscape="false"   readonly="true"  class="form-control  layui-input"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm12 lw7 with-textarea">
+					<label class="layui-form-label ">备注:</label>
+					<div class="layui-input-block">
+						<form:textarea disabled="true" placeholder="请输入备注" readonly="true" path="project.remarks" htmlEscape="false" rows="4"  maxlength="255"  class="form-control "/>
+					</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="shr"  style="pointer-events: none; background-color: #fff" class="xm-select-demo" tabindex="0" contenteditable="true"></div>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm12 lw7 with-textarea">
+					<label class="layui-form-label ">备注:</label>
+					<div class="layui-input-block">
+						<form:textarea placeholder="请输入备注" path="remarks" htmlEscape="false" rows="4"  maxlength="255"  class="form-control "/>
+					</div>
+				</div>
+			</div>
+			<div class="form-group-label"><h2>文件管理</h2></div>
+			<div class="layui-item nav-btns">
+				<a id="attachment_btn_conciliationRecords" class="nav-btn nav-btn-add" title="上传文件"><i class="fa fa-plus"></i>&nbsp;添加附件</a>
+
+			</div>
+			<div id="addFile_exterFeedback" style="display: none" class="upload-progress">
+				<span id="fileName_exterFeedback"></span>
+				<b><span id="baifenbi_exterFeedback"></span></b>
+				<div class="progress">
+						<%--进度条--%>
+					<div id="jindutiao_exterFeedback" class="progress-bar" style="width: 0%" aria-valuenow="0">
+					</div>
+				</div>
+			</div>
+			<input id="attachment_file_conciliationRecords" type="file" multiple="multiple"
+				   style="display: none;" onChange="if(this.value)insertTitle(this.value);"/>
+			<span id="attachment_title_conciliationRecords"></span>
+			<div class="layui-item layui-col-xs12" style="padding:0 16px;">
+				<table id="upTable_conciliationRecords" class="table table-bordered table-condensed details">
+					<thead>
+					<tr>
+							<%-- <th>序号</th>--%>
+						<th>文件</th>
+						<th>上传人</th>
+						<th>上传时间</th>
+						<th width="200px">操作</th>
+					</tr>
+					</thead>
+					<tbody id="file_exterFeedback">
+					<c:forEach items="${feedback.workAttachments}" var="workClientAttachment"
+							   varStatus="status">
+						<tr>
+								<%-- <td>${status.index + 1}</td>--%>
+							<c:choose>
+								<c:when test="${feedback.uploadMode == 2}">
+									<c:choose>
+										<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpg')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'png')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'gif')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'bmp')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpeg')}">
+											<td><img src="${workClientAttachment.temporaryUrl}" width="50" height="50" onclick="openDialogView('预览','${ctx}/sys/picturepreview/picturePreview?url=${workClientAttachment.temporaryUrl}','90%','90%')" alt="${workClientAttachment.attachmentName}">
+										</c:when>
+										<c:otherwise>
+											<c:choose>
+												<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+													<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',1)">${workClientAttachment.attachmentName}</a></td>
+												</c:when>
+												<c:otherwise>
+													<c:choose>
+														<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'rar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'zip')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'7z')}">
+															<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',3)">${workClientAttachment.attachmentName}</a></td>
+														</c:when>
+														<c:otherwise>
+															<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',2)">${workClientAttachment.attachmentName}</a></td>
+														</c:otherwise>
+													</c:choose>
+												</c:otherwise>
+											</c:choose>
+										</c:otherwise>
+									</c:choose>
+								</c:when>
+								<c:otherwise>
+									<c:choose>
+										<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpg')
+                                             or fn:containsIgnoreCase(workClientAttachment.attachmentName,'png')
+                                             or fn:containsIgnoreCase(workClientAttachment.attachmentName,'gif')
+                                             or fn:containsIgnoreCase(workClientAttachment.attachmentName,'bmp')
+                                             or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpeg')}">
+											<td><img src="${workClientAttachment.url}" width="50" height="50" onclick="openDialogView('预览','${ctx}/sys/picturepreview/picturePreview?url=${workClientAttachment.url}','90%','90%')" alt="${workClientAttachment.attachmentName}">
+										</c:when>
+										<c:otherwise>
+											<c:choose>
+												<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+													<td><a class="attention-info" href="javascript:void(0)"
+														   onclick="openPreview('${workClientAttachment.url}',1)">${workClientAttachment.attachmentName}</a>
+													</td>
+												</c:when>
+												<c:otherwise>
+													<c:choose>
+														<c:when test="${feedback.uploadMode == 2}">
+															<c:choose>
+																<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpg')
+                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'png')
+                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'gif')
+                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'bmp')
+                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpeg')}">
+																	<td><img src="${workClientAttachment.temporaryUrl}" width="50" height="50" onclick="openDialogView('预览','${ctx}/sys/picturepreview/picturePreview?url=${workClientAttachment.temporaryUrl}','90%','90%')" alt="${workClientAttachment.attachmentName}">
+																</c:when>
+																<c:otherwise>
+																	<c:choose>
+																		<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+																			<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',1)">${workClientAttachment.attachmentName}</a></td>
+																		</c:when>
+																		<c:otherwise>
+																			<c:choose>
+																				<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'rar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'zip')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'7z')}">
+																					<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',3)">${workClientAttachment.attachmentName}</a></td>
+																				</c:when>
+																				<c:otherwise>
+																					<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.temporaryUrl}',2)">${workClientAttachment.attachmentName}</a></td>
+																				</c:otherwise>
+																			</c:choose>
+																		</c:otherwise>
+																	</c:choose>
+																</c:otherwise>
+															</c:choose>
+														</c:when>
+														<c:otherwise>
+															<c:choose>
+																<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpg')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'png')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'gif')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'bmp')
+                                                   or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jpeg')}">
+																	<td><img src="${workClientAttachment.url}" width="50" height="50" onclick="openDialogView('预览','${ctx}/sys/picturepreview/picturePreview?url=${workClientAttachment.url}','90%','90%')" alt="${workClientAttachment.attachmentName}">
+																</c:when>
+																<c:otherwise>
+																	<c:choose>
+																		<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+																			<td><a href="javascript:void(0)" onclick="openPreview('${workClientAttachment.url}',1)">${workClientAttachment.attachmentName}</a></td>
+																		</c:when>
+																		<c:otherwise>
+																			<c:choose>
+																				<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'rar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'zip')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'jar')
+                                                       or fn:containsIgnoreCase(workClientAttachment.attachmentName,'7z')}">
+																					<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.url}',3)">${workClientAttachment.attachmentName}</a></td>
+																				</c:when>
+																				<c:otherwise>
+																					<td><a class="attention-info" href="javascript:void(0)" onclick="openPreview('${workClientAttachment.url}',2)">${workClientAttachment.attachmentName}</a></td>
+																				</c:otherwise>
+																			</c:choose>
+																		</c:otherwise>
+																	</c:choose>
+																</c:otherwise>
+															</c:choose>
+														</c:otherwise>
+													</c:choose>
+												</c:otherwise>
+											</c:choose>
+										</c:otherwise>
+									</c:choose>
+								</c:otherwise>
+							</c:choose>
+
+
+
+							<td>${workClientAttachment.createBy.name}</td>
+							<td><fmt:formatDate value="${workClientAttachment.createDate}" type="both"/></td>
+							<td class="op-td">
+								<div class="op-btn-box">
+
+										<%--附件下载删除--%>
+									<c:choose>
+										<c:when test="${feedback.uploadMode == 2}">
+											<c:choose>
+												<c:when test="${fn:containsIgnoreCase(workClientAttachment.attachmentName,'pdf')}">
+													<a href="${workClientAttachment.temporaryUrl}" target="_blank" class="op-btn op-btn-download"><i class="fa fa-download"></i>&nbsp;下载</a>
+												</c:when>
+												<c:otherwise>
+													<a href="${workClientAttachment.temporaryUrl}" class="op-btn op-btn-download"><i class="fa fa-download"></i>&nbsp;下载</a>
+												</c:otherwise>
+											</c:choose>
+										</c:when>
+										<c:otherwise>
+											<a href="javascript:location.href='${ctx}/workfullmanage/workFullManage/downLoadAttach?file='+encodeURIComponent('${workClientAttachment.url}');" class="op-btn op-btn-download"><i class="fa fa-download"></i>&nbsp;下载</a>
+										</c:otherwise>
+									</c:choose>
+									<c:if test="${workClientAttachment.createBy.id eq fns:getUser().id}">
+										<a href="javascript:void(0)"
+										   onclick="deleteFileFromAliyun(this,'${ctx}/sys/workattachment/deleteFileFromAliyun?url=${workClientAttachment.url}&id=${workClientAttachment.id}&type=2','addFile')"
+										   class="op-btn op-btn-delete"><i class="fa fa-trash"></i>&nbsp;删除</a>
+									</c:if>
+									<c:if test="${workClientAttachment.collectFlag != 1}">
+										<a href="javascript:void(0)" onclick="collectingAccessory(this,'${ctx}/projectAccessory/projectAccessory/saveCollectAccessory','${workClientAttachment.url}','${workClientAttachment.createBy.id}','${workClientAttachment.fileSize}')" class="op-btn layui-btn-warm" >&nbsp;收藏</a>
+									</c:if>
+								</div>
+							</td>
+						</tr>
+					</c:forEach>
+					</tbody>
+				</table>
+			</div>
+	</form:form>
+	</div>
+</div>
+<script src="${ctxStatic}/layer-v2.3/layui/layui.all.js" charset="utf-8"></script>
+<script>
+	function getProjectMembers() {
+		$.ajax({
+			type:'post',
+			url:'${ctx}/externalUnit/externalUnit/getProjectMembers',
+			data:{
+				"projectId":$("#projectId").val()
+			},
+			success:function(data){
+				if(data.success) {
+					var data = data.body.list;
+					var newDataList = data;
+					var showList = [];
+					$.ajax({
+						type:'post',
+						url:'${ctx}/externalUnit/feedback/getAuditerById',
+						data:{
+							"id":$("#id").val()
+						},
+						success:function(dataListById){
+
+							if(dataListById.success) {
+								var showDataList = dataListById.body.list;
+								var lists = [];
+								for (i in newDataList) {
+									for (j in showDataList) {
+										if (newDataList[i].value == showDataList[j].value) {
+											var newData = {
+												"name": newDataList[i].name,
+												"value": newDataList[i].value,
+												"selected": true
+
+											}
+											lists.push(newDataList[i].value);
+											showList.push(newData);
+											data.splice(i,1,newData);
+										}
+									}
+								}
+
+								$("#examiners").val(lists);
+								xmSelect.render({
+									el: '#shr',
+									language: 'zn',
+									data:data
+								})
+							}
+						}
+					})
+				}
+			}
+		})
+	}
+
+	var shr = xmSelect.render({
+		el: '#shr',
+		language: 'zn',
+		data: [
+		]
+	})
+
+
+	document.getElementById('shr').onblur=function(){
+		var list = [];
+		//获取当前多选选中的值
+		var selectArr = shr.getValue();
+		for (var i in selectArr){
+			list.push(selectArr[i].value);
+		}
+		$("#examiners").val(list);
+		console.log(list);
+	}
+</script>
+</body>
+</html>

+ 15 - 0
src/main/webapp/webpage/modules/externalUnit/feedbackTask.jsp

@@ -0,0 +1,15 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<html>
+<head>
+	<title>流程追踪</title>
+	<meta name="decorator" content="default"/>
+</head>
+<body class="gray-bg">
+<div class="container form layui-form">
+	<act:flowChart procInsId="${processInstanceId}"/>
+	<act:histoicFlow procInsId="${processInstanceId}"/>
+</div>
+</body>
+</html>
+