Przeglądaj źródła

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	src/api/sys/ReimbursementService.js
#	src/components/userSelect/index.vue
#	src/views/common/UpLoadComponentDialog.vue
#	src/views/finance/invoice/ProgramPageForm.vue
#	src/views/finance/invoice/UserPullForm.vue
lizhenhao 2 lat temu
rodzic
commit
f132b11f36
100 zmienionych plików z 44865 dodań i 309 usunięć
  1. 1 0
      src/api/AppPath.js
  2. 12 0
      src/api/cw/common/CommonApi.js
  3. 19 0
      src/api/cw/common/EnterpriseSearchService.js
  4. 118 0
      src/api/cw/invoice/CwFinanceInvoiceService.js
  5. 40 0
      src/api/cw/projectBusinessType/CwProjectBusinessTypeService.js
  6. 54 0
      src/api/cw/projectRecords/ManHourManagementService.js
  7. 96 0
      src/api/cw/projectRecords/ProjectRecordsService.js
  8. 21 0
      src/api/cw/projectRecords/ProjectReportArchiveDetailService.js
  9. 69 0
      src/api/cw/projectRecords/ProjectReportArchiveService.js
  10. 33 0
      src/api/cw/projectReportAuditSheet/CwProofreadTypeService.js
  11. 84 0
      src/api/cw/reimbursementApproval/ReimbursementApprovalService.js
  12. 47 0
      src/api/cw/reimbursementApproval/ReimbursementApprovalTypeService.js
  13. 54 0
      src/api/cw/reportCancellApply/ReportCancellApplyService.js
  14. 49 0
      src/api/cw/reportCancellApplyArchived/ReportCancellApplyArchivedService.js
  15. 163 0
      src/api/cw/reportManagement/ProjectReportService.js
  16. 54 0
      src/api/cw/reportManagement/ReportReviewService.js
  17. 40 0
      src/api/cw/workClientInfo/ManageLevelTypeService.js
  18. 40 0
      src/api/cw/workClientInfo/OrganizationTypeService.js
  19. 153 0
      src/api/cw/workClientInfo/WorkClientService.js
  20. 26 0
      src/api/cw/workContract/ContractFilePaperService.js
  21. 32 0
      src/api/cw/workContract/ContractFileService.js
  22. 61 0
      src/api/cw/workContract/CwWorkContractBorrowService.js
  23. 83 0
      src/api/cw/workContract/contractInfoService.js
  24. 8 8
      src/api/materialManagement/MaterialManagementService.js
  25. 254 254
      src/components/userSelect/UserSelectDialog.vue
  26. 100 0
      src/components/userSelectButton/DividerButton.vue
  27. 450 0
      src/components/userSelectButton/UserSelectDialog.vue
  28. 101 0
      src/components/userSelectButton/index.vue
  29. 2 2
      src/views/common/UpLoadComponentDialog.vue
  30. 33 25
      src/views/common/UpLoadComponentV2.1.vue
  31. 6 6
      src/views/common/UpLoadComponentV2.vue
  32. 18 14
      src/views/common/UpLoadComponentV3.1.vue
  33. 162 0
      src/views/cw/invoice/ContractForm.vue
  34. 1241 0
      src/views/cw/invoice/InvoiceForm.vue
  35. 1525 0
      src/views/cw/invoice/InvoiceFormTask.vue
  36. 1245 0
      src/views/cw/invoice/InvoiceFormTaskInvalid.vue
  37. 914 0
      src/views/cw/invoice/InvoiceList.vue
  38. 1597 0
      src/views/cw/invoice/InvoiceUpdateForm.vue
  39. 652 0
      src/views/cw/invoice/ProgramForm.vue
  40. 234 0
      src/views/cw/invoice/ProgramPageForm.vue
  41. 219 0
      src/views/cw/invoice/WorkClientForm.vue
  42. 135 0
      src/views/cw/projectBusinessType/CwProjectBusinessTypeForm.vue
  43. 184 0
      src/views/cw/projectBusinessType/CwProjectBusinessTypeList.vue
  44. 165 0
      src/views/cw/projectBusinessType/CwProjectBusinessTypeListForm.vue
  45. 177 0
      src/views/cw/projectRecords/CwClientPageForm.vue
  46. 182 0
      src/views/cw/projectRecords/ManHourManagementForm.vue
  47. 302 0
      src/views/cw/projectRecords/ManHourManagementList.vue
  48. 434 0
      src/views/cw/projectRecords/ProjectMembersEditForm.vue
  49. 249 0
      src/views/cw/projectRecords/ProjectMembersList.vue
  50. 1018 0
      src/views/cw/projectRecords/ProjectRecordsAddForm.vue
  51. 170 0
      src/views/cw/projectRecords/ProjectRecordsChooseCom.vue
  52. 1240 0
      src/views/cw/projectRecords/ProjectRecordsForm.vue
  53. 435 0
      src/views/cw/projectRecords/ProjectRecordsList.vue
  54. 907 0
      src/views/cw/projectRecords/ProjectRecordsTaskForm.vue
  55. 174 0
      src/views/cw/projectRecords/WorkContractChooseCom.vue
  56. 362 0
      src/views/cw/projectReportArchive/ProjectReportArchiveDetailList.vue
  57. 736 0
      src/views/cw/projectReportArchive/ProjectReportArchiveForm.vue
  58. 649 0
      src/views/cw/projectReportArchive/ProjectReportArchiveList.vue
  59. 844 0
      src/views/cw/projectReportArchive/ProjectReportArchiveTaskForm.vue
  60. 177 0
      src/views/cw/projectReportArchive/ReportChooseByProjectCom.vue
  61. 189 0
      src/views/cw/projectReportArchive/WorkClientChooseByProjectCom.vue
  62. 334 0
      src/views/cw/reimbursementApproval/info/CwProgramPageForm.vue
  63. 156 0
      src/views/cw/reimbursementApproval/info/CwReimbursementTypePullForm.vue
  64. 787 0
      src/views/cw/reimbursementApproval/info/InfoForm.vue
  65. 591 0
      src/views/cw/reimbursementApproval/info/InfoList.vue
  66. 1647 0
      src/views/cw/reimbursementApproval/info/InfoUpdateForm.vue
  67. 84 0
      src/views/cw/reimbursementApproval/info/ProgramForm.vue
  68. 1708 0
      src/views/cw/reimbursementApproval/info/ReimbursementForm.vue
  69. 192 0
      src/views/cw/reimbursementApproval/info/ReportNoChooseRadio.vue
  70. 224 0
      src/views/cw/reimbursementApproval/projectInfo/ProjectChooseForm.vue
  71. 181 0
      src/views/cw/reimbursementApproval/type/TypeForm.vue
  72. 158 0
      src/views/cw/reimbursementApproval/type/TypeList.vue
  73. 148 0
      src/views/cw/reportCancellApply/ReportCancellApplyChooseCom.vue
  74. 465 0
      src/views/cw/reportCancellApply/ReportCancellApplyForm.vue
  75. 468 0
      src/views/cw/reportCancellApply/ReportCancellApplyList.vue
  76. 1387 0
      src/views/cw/reportCancellApply/ReportCancellApplyTaskForm.vue
  77. 151 0
      src/views/cw/reportCancellApplyArchived/ReportCancellApplyArchivedChooseCom.vue
  78. 838 0
      src/views/cw/reportCancellApplyArchived/ReportCancellApplyArchivedForm.vue
  79. 708 0
      src/views/cw/reportCancellApplyArchived/ReportCancellApplyArchivedList.vue
  80. 833 0
      src/views/cw/reportCancellApplyArchived/ReportCancellApplyArchivedTaskForm.vue
  81. 179 0
      src/views/cw/reportManagement/ProjectInfoForm.vue
  82. 1125 0
      src/views/cw/reportManagement/ReportManagementAddForm.vue
  83. 1636 0
      src/views/cw/reportManagement/ReportManagementForm.vue
  84. 1043 0
      src/views/cw/reportManagement/ReportManagementList.vue
  85. 1584 0
      src/views/cw/reportManagement/ReportManagementSignatureForm.vue
  86. 775 0
      src/views/cw/reportManagement/ReportManagementTaskForm.vue
  87. 169 0
      src/views/cw/reportManagement/ReportServiceUnitForm.vue
  88. 131 0
      src/views/cw/reportManagement/auditSheet/TypeForm.vue
  89. 153 0
      src/views/cw/reportManagement/auditSheet/TypeList.vue
  90. 1300 0
      src/views/cw/reportManagement/reportReview/ReportReviewForm.vue
  91. 1667 0
      src/views/cw/workClientInfo/WorkClientAddForm.vue
  92. 149 0
      src/views/cw/workClientInfo/WorkClientBillingChooseRadio.vue
  93. 197 0
      src/views/cw/workClientInfo/WorkClientChooseForm.vue
  94. 183 0
      src/views/cw/workClientInfo/WorkClientChooseRadio.vue
  95. 1898 0
      src/views/cw/workClientInfo/WorkClientForm.vue
  96. 654 0
      src/views/cw/workClientInfo/WorkClientList.vue
  97. 180 0
      src/views/cw/workClientInfo/WorkClientListForm.vue
  98. 1797 0
      src/views/cw/workClientInfo/WorkClientTaskForm.vue
  99. 146 0
      src/views/cw/workClientInfo/WorkClientUpdateLog.vue
  100. 0 0
      src/views/cw/workClientInfo/clientUserSelect/UserSelectDialog.vue

+ 1 - 0
src/api/AppPath.js

@@ -7,4 +7,5 @@ export const UREPORT_PATH = "/ureport-server";
 export const WPS_PATH = "/wps-server";
 export const TEST_PATH = "/test-server";
 export const ASSESS_PATH = "/assess-server";
+export const FINANCE_PATH = "/finance-server";
 export const PUBLIC_MODULES_PATH = "/public-modules-server";

+ 12 - 0
src/api/cw/common/CommonApi.js

@@ -0,0 +1,12 @@
+import request from "@/utils/httpRequest";
+import { FLOW_PATH as prefix } from "../../AppPath";
+
+export default class CommonApi {
+  getTaskNameByProcInsId (procInsId) {
+    return request({
+      url: prefix + `/commonApi/getTaskNameByProcInsId`,
+      method: 'get',
+      params: {procInsId: procInsId}
+    })
+  }
+}

+ 19 - 0
src/api/cw/common/EnterpriseSearchService.js

@@ -0,0 +1,19 @@
+import request from '@/utils/httpRequest';
+import { FINANCE_PATH as prefix } from "../../AppPath";
+
+export default class EnterpriseSearchService {
+  enterpriseSearchByName (name) {
+    return request({
+      url: prefix +  `/enterprise_search_api/enterpriseSearchByName`,
+      method: 'post',
+      params: {keyword: name}
+    })
+  }
+  enterpriseTicketInfo (id) {
+    return request({
+      url: prefix +  `/enterprise_search_api/enterpriseTicketInfo`,
+      method: 'post',
+      params: {id: id}
+    })
+  }
+}

+ 118 - 0
src/api/cw/invoice/CwFinanceInvoiceService.js

@@ -0,0 +1,118 @@
+import request from "@/utils/httpRequest";
+import { FINANCE_PATH as prefix } from "../../AppPath";
+
+export default {
+	list: function (params) {
+		return request({
+			url: prefix + "/cw_finance/invoice/list",
+			method: "get",
+			params: params,
+		});
+	},
+	queryById: function (id) {
+		return request({
+			url: prefix + "/cw_finance/invoice/queryById",
+			method: "get",
+			params: { id: id },
+		});
+	},
+	queryByNumber: function (number, id) {
+		return request({
+			url: prefix + "/cw_finance/invoice/queryByNumber",
+			method: "get",
+			params: { number: number, id: id },
+		});
+	},
+	save: function (inputForm) {
+		return request({
+			url: prefix + `/cw_finance/invoice/save`,
+			method: "post",
+			data: inputForm,
+		});
+	},
+	delete: function (ids) {
+		return request({
+			url: prefix + "/cw_finance/invoice/delete",
+			method: "delete",
+			params: { ids: ids },
+		});
+	},
+	updateStatusById: function (data) {
+		return request({
+			url: prefix + "/cw_finance/invoice/updateStatusById",
+			method: "post",
+			data: data,
+		});
+	},
+	isReceivables: function (data) {
+		return request({
+			url: prefix + "/cw_finance/invoice/isReceivables",
+			method: "post",
+			data: data,
+		});
+	},
+	saveForm: function (inputForm) {
+		return request({
+			url: prefix + `/cw_finance/invoice/saveForm`,
+			method: "post",
+			data: inputForm,
+		});
+	},
+	saveFormInvalid: function (inputForm) {
+		return request({
+			url: prefix + `/cw_finance/invoice/saveFormInvalid`,
+			method: "post",
+			data: inputForm,
+		});
+	},
+	queryIdByInvalidId: function (id) {
+		return request({
+			url: prefix + "/cw_finance/invoice/queryIdByInvalidId",
+			method: "get",
+			params: { id: id },
+		});
+	},
+	importDetail: function (data) {
+		return request({
+			url: prefix + "/cw_finance/invoice/importDetail",
+			method: "post",
+			data: data,
+		});
+	},
+	exportTemplate: function () {
+		return request({
+			url: prefix + "/cw_finance/invoice/importDetail/template",
+			method: "get",
+			responseType: "blob",
+		});
+	},
+	getByIds: function (projectId, invoiceForm) {
+		return request({
+			url: prefix + "/cw_finance/invoice/getByIds",
+			method: "get",
+			params: { projectId: projectId, ...invoiceForm },
+		});
+	},
+	getByContractId: function (contractId, invoiceForm) {
+		return request({
+			url: prefix + "/cw_finance/invoice/getByContractId",
+			method: "get",
+			params: { contractId: contractId, ...invoiceForm },
+		});
+	},
+	getIdByClientId: function (clientId, invoiceForm) {
+		return request({
+			url: prefix + "/cw_finance/invoice/getIdByClientId",
+			method: "get",
+			params: { clientId: clientId, ...invoiceForm },
+		});
+	},
+	exportFile: function (params) {
+		return request({
+			url: prefix + "/cw_finance/invoice/export",
+			method: "get",
+			params: params,
+			responseType: "blob",
+		});
+	},
+};

+ 40 - 0
src/api/cw/projectBusinessType/CwProjectBusinessTypeService.js

@@ -0,0 +1,40 @@
+import request from "@/utils/httpRequest";
+import { FINANCE_PATH as prefix } from "../../AppPath";
+
+export default class CwProjectBusinessTypeService {
+  list (params) {
+    return request({
+      url: prefix +  '/projectRecords/cw_project_business_type/list',
+      method: 'get',
+      params: params
+    })
+  }
+  queryById (id) {
+    return request({
+      url: prefix +  '/projectRecords/cw_project_business_type/queryById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  getList () {
+    return request({
+      url: prefix +  '/projectRecords/cw_project_business_type/getList',
+      method: 'get',
+      params: {}
+    })
+  }
+  save (inputForm) {
+    return request({
+      url: prefix +  `/projectRecords/cw_project_business_type/save`,
+      method: 'post',
+      data: inputForm
+    })
+  }
+  delete (ids) {
+    return request({
+      url: prefix +  '/projectRecords/cw_project_business_type/delete',
+      method: 'delete',
+      params: {ids: ids}
+    })
+  }
+}

+ 54 - 0
src/api/cw/projectRecords/ManHourManagementService.js

@@ -0,0 +1,54 @@
+import request from "@/utils/httpRequest";
+import { FINANCE_PATH as prefix } from "../../AppPath";
+
+export default class ManHourManagementService {
+  list (params) {
+    return request({
+      url: prefix + '/manHourManagement/list',
+      method: 'get',
+      params: params
+    })
+  }
+  queryById (id) {
+    return request({
+      url: prefix + '/manHourManagement/queryById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  updateStatus (id) {
+    return request({
+      url: prefix + '/manHourManagement/updateStatus',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  save (inputForm) {
+    return request({
+      url: prefix + `/manHourManagement/save`,
+      method: 'post',
+      data: inputForm
+    })
+  }
+  delete (ids) {
+    return request({
+      url: prefix + '/manHourManagement/delete',
+      method: 'delete',
+      params: {ids: ids}
+    })
+  }
+  getByClientId (id, projectForm) {
+    return request({
+      url: prefix + '/cwProjectRecords/getByClientId',
+      method: 'get',
+      params: {clientId: id, ...projectForm}
+    })
+  }
+  getByContractId (id, projectForm) {
+    return request({
+      url: prefix + '/cwProjectRecords/getByContractId',
+      method: 'get',
+      params: {contractId: id, ...projectForm}
+    })
+  }
+}

+ 96 - 0
src/api/cw/projectRecords/ProjectRecordsService.js

@@ -0,0 +1,96 @@
+import request from "@/utils/httpRequest";
+import { FINANCE_PATH as prefix } from "../../AppPath";
+
+export default {
+	list: function (params) {
+		return request({
+			url: prefix + "/cwProjectRecords/list",
+			method: "get",
+			params: params,
+		});
+	},
+	list2: function (params) {
+		return request({
+			url: prefix + "/cwProjectRecords/list2",
+			method: "get",
+			params: params,
+		});
+	},
+	queryById: function (id) {
+		return request({
+			url: prefix + "/cwProjectRecords/queryById",
+			method: "get",
+			params: { id: id },
+		});
+	},
+	save: function (inputForm) {
+		return request({
+			url: prefix + `/cwProjectRecords/save`,
+			method: "post",
+			data: inputForm,
+		});
+	},
+	saveForm: function (inputForm) {
+		return request({
+			url: prefix + `/cwProjectRecords/saveForm`,
+			method: "post",
+			data: inputForm,
+		});
+	},
+	delete: function (ids) {
+		return request({
+			url: prefix + "/cwProjectRecords/delete",
+			method: "delete",
+			params: { ids: ids },
+		});
+	},
+	updateStatusById: function (data) {
+		return request({
+			url: prefix + "/cwProjectRecords/updateStatusById",
+			method: "post",
+			data: data,
+		});
+	},
+	exportFile: function (params) {
+		return request({
+			url: prefix + "/cwProjectRecords/export",
+			method: "get",
+			params: params,
+			responseType: "blob",
+		});
+	},
+	getByClientId: function (id, projectForm) {
+		return request({
+			url: prefix + "/cwProjectRecords/getByClientId",
+			method: "get",
+			params: { clientId: id, ...projectForm },
+		});
+	},
+	getByContractId: function (id, projectForm) {
+		return request({
+			url: prefix + "/cwProjectRecords/getByContractId",
+			method: "get",
+			params: { contractId: id, ...projectForm },
+		});
+	},
+	updateMembers: function (inputForm) {
+		return request({
+			url: prefix + `/cwProjectRecords/updateMembers`,
+			method: "post",
+			data: inputForm,
+		});
+	},
+	getHaveProjectIds: function () {
+		return request({
+			url: prefix + "/cwProjectRecords/getHaveProjectIds",
+			method: "get",
+		});
+	},
+	getContractClientList: function (params) {
+		return request({
+			url: prefix + "/cw_work_client/info/getContractClientList",
+			method: "get",
+			params: params,
+		});
+	},
+};

+ 21 - 0
src/api/cw/projectRecords/ProjectReportArchiveDetailService.js

@@ -0,0 +1,21 @@
+import request from "@/utils/httpRequest";
+import { FINANCE_PATH as prefix } from "../../AppPath";
+
+export default class ProjectReportArchiveDetailService {
+	list(params) {
+		return request({
+			url: prefix + "/cwProjectReportArchiveDetail/list",
+			method: "get",
+			params: params,
+		});
+	}
+
+	exportExcel(params) {
+		return request({
+			url: prefix + "/cwProjectReportArchiveDetail/export",
+			method: "get",
+			params: params,
+			responseType: "blob",
+		});
+	}
+}

+ 69 - 0
src/api/cw/projectRecords/ProjectReportArchiveService.js

@@ -0,0 +1,69 @@
+import request from "@/utils/httpRequest";
+import { FINANCE_PATH as prefix } from "../../AppPath";
+
+export default class ProjectReportArchiveService {
+  list (params) {
+    return request({
+      url: prefix + '/cwProjectReportArchive/list',
+      method: 'get',
+      params: params
+    })
+  }
+  reportList (params) {
+    return request({
+      url: prefix + '/cwProjectReportArchive/reportList',
+      method: 'get',
+      params: params
+    })
+  }
+  queryById (id) {
+    return request({
+      url: prefix + '/cwProjectReportArchive/queryById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  save (inputForm) {
+    return request({
+      url: prefix + `/cwProjectReportArchive/save`,
+      method: 'post',
+      data: inputForm
+    })
+  }
+  saveForm (inputForm) {
+    return request({
+      url: prefix + `/cwProjectReportArchive/saveForm`,
+      method: 'post',
+      data: inputForm
+    })
+  }
+  delete (ids) {
+    return request({
+      url: prefix + '/cwProjectReportArchive/delete',
+      method: 'delete',
+      params: {ids: ids}
+    })
+  }
+  updateStatusById (data) {
+    return request({
+      url: prefix + '/cwProjectReportArchive/updateStatusById',
+      method: 'post',
+      data: data
+    })
+  }
+  exportFile (params) {
+    return request({
+      url: prefix + '/cwProjectReportArchive/export',
+      method: 'get',
+      params: params,
+      responseType: 'blob'
+    })
+  }
+  findReportUse (reportNo) {
+    return request({
+      url: prefix + '/cwProjectReportArchive/findReportUse',
+      method: 'get',
+      params: {reportNo: reportNo}
+    })
+  }
+}

+ 33 - 0
src/api/cw/projectReportAuditSheet/CwProofreadTypeService.js

@@ -0,0 +1,33 @@
+import request from "@/utils/httpRequest";
+import { FINANCE_PATH as prefix } from "../../AppPath";
+
+export default class CwProofreadTypeService {
+  list (param) {
+    return request({
+      url: prefix + '/auditSheet/type/list',
+      method: 'get',
+      params: param
+    })
+  }
+  save (param) {
+    return request({
+      url: prefix + '/auditSheet/type/save',
+      method: 'post',
+      data: param
+    })
+  }
+  findById (id) {
+    return request({
+      url: prefix + '/auditSheet/type/findById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  remove (id) {
+    return request({
+      url: prefix + '/auditSheet/type/deleteById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+}

+ 84 - 0
src/api/cw/reimbursementApproval/ReimbursementApprovalService.js

@@ -0,0 +1,84 @@
+import request from "@/utils/httpRequest";
+import { FINANCE_PATH as prefix } from "../../AppPath";
+
+
+export default class ReimbursementApprovalService {
+  list (param) {
+    return request({
+      url: prefix + '/reimbursementApproval/info/list',
+      method: 'get',
+      params: param
+    })
+  }
+  reportNoList (param) {
+    return request({
+      url: prefix + '/reimbursementApproval/info/reportNoList',
+      method: 'get',
+      params: param
+    })
+  }
+  projectList (params) {
+    return request({
+      url: prefix + '/reimbursementApproval/info/projectList',
+      method: 'get',
+      params: params
+    })
+  }
+  save (param) {
+    return request({
+      url: prefix + '/reimbursementApproval/info/save',
+      method: 'post',
+      data: param
+    })
+  }
+  findById (id) {
+    return request({
+      url: prefix + '/reimbursementApproval/info/findById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  remove (id) {
+    return request({
+      url: prefix + '/reimbursementApproval/info/remove',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  updateStatusById (param) {
+    return request({
+      url: prefix + '/reimbursementApproval/info/updateStatusById',
+      method: 'post',
+      data: param
+    })
+  }
+  checkNumber (number) {
+    return request({
+      url: prefix + '/reimbursementApproval/info/checkNumber',
+      method: 'get',
+      params: {number: number}
+    })
+  }
+  userTree (name) {
+    return request({
+      url: prefix + '/reimbursementApproval/info/userTree',
+      method: 'get',
+      params: {name: name}
+    })
+  }
+  exportFile (params) {
+    return request({
+      url: prefix + '/reimbursementApproval/info/exportFile',
+      method: 'get',
+      params: params,
+      responseType: 'blob'
+    })
+  }
+  queryByProIds (ids) {
+    return request({
+      url: prefix + '/reimbursementApproval/info/queryByProIds',
+      method: 'get',
+      params: {ids: ids}
+    })
+  }
+}

+ 47 - 0
src/api/cw/reimbursementApproval/ReimbursementApprovalTypeService.js

@@ -0,0 +1,47 @@
+import request from '@/utils/httpRequest';
+import { FINANCE_PATH as prefix } from "../../AppPath";
+
+export default class ReimbursementApprovalTypeService {
+  list (param) {
+    return request({
+      url: prefix + '/reimbursementApproval/type/list',
+      method: 'get',
+      params: param
+    })
+  }
+  bxList (param) {
+    return request({
+      url: prefix + '/reimbursementApproval/type/bxList',
+      method: 'get',
+      params: param
+    })
+  }
+  cgList (param) {
+    return request({
+      url: prefix + '/reimbursementApproval/type/cgList',
+      method: 'get',
+      params: param
+    })
+  }
+  save (param) {
+    return request({
+      url: prefix + '/reimbursementApproval/type/save',
+      method: 'post',
+      data: param
+    })
+  }
+  findById (id) {
+    return request({
+      url: prefix + '/reimbursementApproval/type/findById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  remove (id) {
+    return request({
+      url: prefix + '/reimbursementApproval/type/deleteById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+}

+ 54 - 0
src/api/cw/reportCancellApply/ReportCancellApplyService.js

@@ -0,0 +1,54 @@
+import request from "@/utils/httpRequest";
+import { FINANCE_PATH as prefix } from "../../AppPath";
+
+export default class ReportCancellApplyService {
+  findList (params) {
+    return request({
+      url: prefix + '/cwProjectReportCancell/findList',
+      method: 'get',
+      params: params
+    })
+  }
+  list (params) {
+    return request({
+      url: prefix + '/cwProjectReportCancell/list',
+      method: 'get',
+      params: params
+    })
+  }
+  saveForm (inputForm) {
+    return request({
+      url: prefix + `/cwProjectReportCancell/saveForm`,
+      method: 'post',
+      data: inputForm
+    })
+  }
+  queryById (id) {
+    return request({
+      url: prefix + '/cwProjectReportCancell/queryById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  updateStatusById (data) {
+    return request({
+      url: prefix + '/cwProjectReportCancell/updateStatusById',
+      method: 'post',
+      data: data
+    })
+  }
+  delete (ids) {
+    return request({
+      url: prefix + '/cwProjectReportCancell/delete',
+      method: 'delete',
+      params: {ids: ids}
+    })
+  }
+  queryByNo (no) {
+    return request({
+      url: prefix + '/cwProjectReportCancell/queryByNo',
+      method: 'get',
+      params: {no: no}
+    })
+  }
+}

+ 49 - 0
src/api/cw/reportCancellApplyArchived/ReportCancellApplyArchivedService.js

@@ -0,0 +1,49 @@
+import request from "@/utils/httpRequest";
+import { FINANCE_PATH as prefix } from "../../AppPath";
+
+export default class ReportCancellApplyArchivedService {
+  findList (params) {
+    return request({
+      url: prefix + '/cwProjectReportArchivedCancell/findList',
+      method: 'get',
+      params: params
+    })
+  }
+  queryById (id) {
+    return request({
+      url: prefix + '/cwProjectReportArchivedCancell/queryById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  saveForm (inputForm) {
+    return request({
+      url: prefix + `/cwProjectReportArchivedCancell/saveForm`,
+      method: 'post',
+      data: inputForm
+    })
+  }
+  updateStatusById (data) {
+    return request({
+      url: prefix + '/cwProjectReportArchivedCancell/updateStatusById',
+      method: 'post',
+      data: data
+    })
+  }
+  findByContractInfoId (id) {
+    return request({
+      url: prefix + '/cwProjectReportArchivedCancell/findByContractInfoId',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+
+  exportExcel (params) {
+    return request({
+      url: prefix + '/cwProjectReportArchivedCancell/export',
+      method: 'get',
+      params: params,
+      responseType: 'blob'
+    })
+  }
+}

+ 163 - 0
src/api/cw/reportManagement/ProjectReportService.js

@@ -0,0 +1,163 @@
+import request from "@/utils/httpRequest";
+import { FINANCE_PATH as prefix } from "../../AppPath";
+
+export default {
+  list: function (params) {
+    return request({
+      url: prefix + '/cwProjectReport/list',
+      method: 'get',
+      params: params
+    })
+  },
+  saveForm: function (inputForm) {
+    return request({
+      url: prefix + `/cwProjectReport/saveForm`,
+      method: 'post',
+      data: inputForm
+    })
+  },
+  updateStatusById: function (data) {
+    return request({
+      url: prefix + '/cwProjectReport/updateStatusById',
+      method: 'post',
+      data: data
+    })
+  },
+  queryById: function (id) {
+    return request({
+      url: prefix + '/cwProjectReport/queryById',
+      method: 'get',
+      params: {id: id}
+    })
+  },
+  delete: function (ids) {
+    return request({
+      url: prefix + '/cwProjectReport/delete',
+      method: 'delete',
+      params: {ids: ids}
+    })
+  },
+  clineList: function (params) {
+    return request({
+      url: prefix + '/cwProjectReport/clineList',
+      method: 'get',
+      params: params
+    })
+  },
+  recordsList: function (params) {
+    return request({
+      url: prefix + '/cwProjectReport/recordsList',
+      method: 'get',
+      params: params
+    })
+  },
+  saveFlowableParam: function (inputForm) {
+    return request({
+      url: prefix + `/cwProjectReport/saveFlowableParam`,
+      method: 'post',
+      data: inputForm
+    })
+  },
+  updateSignatureStatusById: function (data) {
+    return request({
+      url: prefix + '/cwProjectReport/updateSignatureStatusById',
+      method: 'post',
+      data: data
+    })
+  },
+  queryBySignatureId: function (id) {
+    return request({
+      url: prefix + '/cwProjectReport/queryBySignatureId',
+      method: 'get',
+      params: {id: id}
+    })
+  },
+  findBySignatureId: function (id) {
+    return request({
+      url: prefix + '/cwProjectReport/findBySignatureId',
+      method: 'get',
+      params: {id: id}
+    })
+  },
+  saveData: function (inputForm) {
+    return request({
+      url: prefix + `/cwProjectReport/saveData`,
+      method: 'post',
+      data: inputForm
+    })
+  },
+
+  exportExcel: function (params) {
+    return request({
+      url: prefix + '/cwProjectReport/export',
+      method: 'get',
+      params: params,
+      responseType: 'blob'
+    })
+  },
+  getAuditNodeByReportId: function (id) {
+    return request({
+      url: prefix + '/cwProjectReport/getAuditNodeByReportId',
+      method: 'get',
+      params: {id: id}
+    })
+  },
+  getSignatureTypeById: function (id, signatureType) {
+    return request({
+      url: prefix + '/cwProjectReport/getSignatureTypeById',
+      method: 'get',
+      params: {id: id, signatureType: signatureType}
+    })
+  },
+  getIdByContractId: function (contractId, reportForm) {
+    return request({
+      url: prefix + '/cwProjectReport/getIdByContractId',
+      method: 'get',
+      params: {contractId: contractId, ...reportForm}
+    })
+  },
+  getIdByProjectId: function (projectId, reportForm) {
+    return request({
+      url: prefix + '/cwProjectReport/getIdByProjectId',
+      method: 'get',
+      params: {projectId: projectId, ...reportForm}
+    })
+  },
+  getIdByClientId: function (clientId, reportForm) {
+    return request({
+      url: prefix + '/cwProjectReport/getIdByClientId',
+      method: 'get',
+      params: {clientId: clientId, ...reportForm}
+    })
+  },
+  saveSignFiles: function (data) {
+    return request({
+      url: prefix + '/cwProjectReport/saveSignFiles',
+      method: 'post',
+      data: data
+    })
+  },
+  saveReportArchive: function (reportId) {
+    return request({
+      url: prefix + '/cwProjectReport/saveReportArchive',
+      method: 'get',
+      params: {reportId: reportId}
+    })
+  },
+  /* 三级校审文档下载 */
+  downloadCwReportAuditTpl: function (id) {
+    return request({
+      url: prefix + '/cwProjectReport/downloadCwReportAuditTpl',
+      method: 'get',
+      params: {id: id},
+      responseType: 'blob'
+    })
+  },
+  rebackSign: function (id) {
+    return request({
+      url: prefix + '/cwProjectReport/rebackSign',
+      method: 'get',
+      params: {reportId: id}
+    })
+  }
+}

+ 54 - 0
src/api/cw/reportManagement/ReportReviewService.js

@@ -0,0 +1,54 @@
+import request from '@/utils/httpRequest';
+import { FINANCE_PATH as prefix } from "../../AppPath";
+
+export default class ReportReviewService {
+  list (type) {
+    return request({
+      url: prefix + '/auditSheet/type/prooList',
+      method: 'get',
+      params: {type: type}
+    })
+  }
+  save (param) {
+    return request({
+      url: prefix + '/projectReport/review/saveForm',
+      method: 'post',
+      data: param
+    })
+  }
+  updateReviewStatysByReportId (data) {
+    return request({
+      url: prefix + '/projectReport/review/updateReviewStatysByReportId',
+      method: 'post',
+      data: data
+    })
+  }
+  queryByReportId (id) {
+    return request({
+      url: prefix + '/projectReport/review/queryByReportId',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  getProcessStatus (id) {
+    return request({
+      url: prefix + '/projectReport/review/getProcessStatus',
+      method: 'get',
+      params: {procInsId: id}
+    })
+  }
+  getHaveReportNo (id) {
+    return request({
+      url: prefix + '/projectReport/review/getHaveReportNo',
+      method: 'get',
+      params: {reportId: id}
+    })
+  }
+  saveReportNo (id) {
+    return request({
+      url: prefix + '/projectReport/review/saveReportNo',
+      method: 'get',
+      params: {reportId: id}
+    })
+  }
+}

+ 40 - 0
src/api/cw/workClientInfo/ManageLevelTypeService.js

@@ -0,0 +1,40 @@
+import request from "@/utils/httpRequest";
+import { FINANCE_PATH as prefix } from "../../AppPath";
+
+export default class ManageLevelTypeService {
+  list (params) {
+    return request({
+      url: prefix + '/cw_work_client/manage_level_type/list',
+      method: 'get',
+      params: params
+    })
+  }
+  queryById (id) {
+    return request({
+      url: prefix + '/cw_work_client/manage_level_type/queryById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  getList () {
+    return request({
+      url: prefix + '/cw_work_client/manage_level_type/getList',
+      method: 'get',
+      params: {}
+    })
+  }
+  save (inputForm) {
+    return request({
+      url: prefix + `/cw_work_client/manage_level_type/save`,
+      method: 'post',
+      data: inputForm
+    })
+  }
+  delete (ids) {
+    return request({
+      url: prefix + '/cw_work_client/manage_level_type/delete',
+      method: 'delete',
+      params: {ids: ids}
+    })
+  }
+}

+ 40 - 0
src/api/cw/workClientInfo/OrganizationTypeService.js

@@ -0,0 +1,40 @@
+import request from "@/utils/httpRequest";
+import { FINANCE_PATH as prefix } from "../../AppPath";
+
+export default class OrganizationTypeService {
+  list (params) {
+    return request({
+      url: prefix + '/cw_work_client/organization_type/list',
+      method: 'get',
+      params: params
+    })
+  }
+  queryById (id) {
+    return request({
+      url: prefix + '/cw_work_client/organization_type/queryById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  getList () {
+    return request({
+      url: prefix + '/cw_work_client/organization_type/getList',
+      method: 'get',
+      params: {}
+    })
+  }
+  save (inputForm) {
+    return request({
+      url: prefix + `/cw_work_client/organization_type/save`,
+      method: 'post',
+      data: inputForm
+    })
+  }
+  delete (ids) {
+    return request({
+      url: prefix + '/cw_work_client/organization_type/delete',
+      method: 'delete',
+      params: {ids: ids}
+    })
+  }
+}

+ 153 - 0
src/api/cw/workClientInfo/WorkClientService.js

@@ -0,0 +1,153 @@
+import request from "@/utils/httpRequest";
+import { FINANCE_PATH as prefix } from "../../AppPath";
+
+export default {
+	list: function (params) {
+		return request({
+			url: prefix + "/cw_work_client/info/list",
+			method: "get",
+			params: params,
+		});
+	},
+	listTree: function (params) {
+		return request({
+			url: prefix + "/cw_work_client/info/list_tree",
+			method: "get",
+			params: params,
+		});
+	},
+	queryById: function (id) {
+		return request({
+			url: prefix + "/cw_work_client/info/queryById",
+			method: "get",
+			params: { id: id },
+		});
+	},
+	save: function (inputForm) {
+		return request({
+			url: prefix + `/cw_work_client/info/save`,
+			method: "post",
+			data: inputForm,
+		});
+	},
+	saveForm: function (inputForm) {
+		return request({
+			url: prefix + `/cw_work_client/info/saveForm`,
+			method: "post",
+			data: inputForm,
+		});
+	},
+	delete: function (ids) {
+		return request({
+			url: prefix + "/cw_work_client/info/delete",
+			method: "delete",
+			params: { ids: ids },
+		});
+	},
+	updateStatusById: function (data) {
+		return request({
+			url: prefix + "/cw_work_client/info/updateStatusById",
+			method: "post",
+			data: data,
+		});
+	},
+	exportFile: function (params) {
+		return request({
+			url: prefix + "/cw_work_client/info/export",
+			method: "get",
+			params: params,
+			responseType: "blob",
+		});
+	},
+	pushUpdate: function (id) {
+		return request({
+			url: prefix + "/cw_work_client/info/pushUpdate",
+			method: "get",
+			params: { id: id },
+		});
+	},
+	stopUpdate: function (id) {
+		return request({
+			url: prefix + "/cw_work_client/info/stopUpdate",
+			method: "get",
+			params: { id: id },
+		});
+	},
+	rejectUpdate: function (id) {
+		return request({
+			url: prefix + "/cw_work_client/info/rebackOrAgreeUpdate",
+			method: "get",
+			params: { id: id, type: "reject" },
+		});
+	},
+	rebackUpdate: function (id) {
+		return request({
+			url: prefix + "/cw_work_client/info/rebackOrAgreeUpdate",
+			method: "get",
+			params: { id: id, type: "reback" },
+		});
+	},
+	rebackPushUpdate: function (id) {
+		return request({
+			url: prefix + "/cw_work_client/info/rebackOrAgreeUpdate",
+			method: "get",
+			params: { id: id, type: "reback_push" },
+		});
+	},
+	agreeUpdate: function (id) {
+		return request({
+			url: prefix + "/cw_work_client/info/rebackOrAgreeUpdate",
+			method: "get",
+			params: { id: id, type: "agree" },
+		});
+	},
+	reapplyUpdate: function (id) {
+		return request({
+			url: prefix + "/cw_work_client/info/rebackOrAgreeUpdate",
+			method: "get",
+			params: { id: id, type: "reapply" },
+		});
+	},
+	queryUscCodeIsUse: function (uscCode) {
+		return request({
+			url: prefix + "/cw_work_client/info/queryUscCodeIsUse",
+			method: "get",
+			params: { uscCode: uscCode },
+		});
+	},
+	queryUscCodeById: function (id) {
+		return request({
+			url: prefix + "/cw_work_client/info/queryUscCodeById",
+			method: "get",
+			params: { id: id },
+		});
+	},
+	queryNameIsUse: function (name) {
+		return request({
+			url: prefix + "/cw_work_client/info/queryNameIsUse",
+			method: "get",
+			params: { name: name },
+		});
+	},
+	queryNameById: function (id) {
+		return request({
+			url: prefix + "/cw_work_client/info/queryNameById",
+			method: "get",
+			params: { id: id },
+		});
+	},
+	queryUpdateLogList: function (params) {
+		return request({
+			url: prefix + "/cw_work_client/info/queryUpdateLogList",
+			method: "get",
+			params: params,
+		});
+	},
+	getBillingListByClientId: function (params) {
+		return request({
+			url: prefix + "/cw_work_client/info/getBillingListByClientId",
+			method: "get",
+			params: params,
+		});
+	},
+};

+ 26 - 0
src/api/cw/workContract/ContractFilePaperService.js

@@ -0,0 +1,26 @@
+import request from "@/utils/httpRequest";
+import { FINANCE_PATH as prefix } from "../../AppPath";
+
+export default class ContractFilePaperService {
+  save (param) {
+    return request({
+      url: prefix + '/contract/contractPaperFile/save',
+      method: 'post',
+      data: param
+    })
+  }
+  updateStatusById (param) {
+    return request({
+      url: prefix + '/contract/contractPaperFile/updateStatusById',
+      method: 'post',
+      data: param
+    })
+  }
+  findByContractInfoId (id) {
+    return request({
+      url: prefix + '/contract/contractPaperFile/findByContractInfoId',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+}

+ 32 - 0
src/api/cw/workContract/ContractFileService.js

@@ -0,0 +1,32 @@
+import request from '@/utils/httpRequest'
+
+export default class ContractFileService {
+  save (param) {
+    return request({
+      url: '/contract/contractFile/save',
+      method: 'post',
+      data: param
+    })
+  }
+  updateStatusById (param) {
+    return request({
+      url: '/contract/contractFile/updateStatusById',
+      method: 'post',
+      data: param
+    })
+  }
+  findById (id) {
+    return request({
+      url: '/contract/contractFile/findById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  findByContractInfoId (id) {
+    return request({
+      url: '/contract/contractFile/findByContractInfoId',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+}

+ 61 - 0
src/api/cw/workContract/CwWorkContractBorrowService.js

@@ -0,0 +1,61 @@
+import request from "@/utils/httpRequest";
+import { FINANCE_PATH as prefix } from "../../AppPath";
+
+export default class WorkContractService {
+  save (param) {
+    return request({
+      url: prefix + '/contract/workContractBorrow/save',
+      method: 'post',
+      data: param
+    })
+  }
+  updateStatusById (param) {
+    return request({
+      url: prefix + '/contract/workContractBorrow/updateStatusById',
+      method: 'post',
+      data: param
+    })
+  }
+  updateStatusByContractInfoId (param) {
+    return request({
+      url: prefix + '/contract/workContractBorrow/updateStatusByContractInfoId',
+      method: 'post',
+      data: param
+    })
+  }
+  findById (id) {
+    return request({
+      url: prefix + '/contract/workContractBorrow/findById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  findByContractInfoId (id) {
+    return request({
+      url: prefix + '/contract/workContractBorrow/findByContractInfoId',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  updateMessageStatusById (param) {
+    return request({
+      url: prefix + '/contract/workContractBorrow/updateMessageStatusById',
+      method: 'post',
+      data: param
+    })
+  }
+  deleteById (id) {
+    return request({
+      url: prefix + '/contract/workContractBorrow/deleteById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  findMessageList (id) {
+    return request({
+      url: prefix + '/contract/workContractBorrow/findMessageList',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+}

+ 83 - 0
src/api/cw/workContract/contractInfoService.js

@@ -0,0 +1,83 @@
+import request from "@/utils/httpRequest";
+import { FINANCE_PATH as prefix } from "../../AppPath";
+
+export default {
+	list: function (param) {
+		return request({
+			url: prefix + "/contract/registration/list",
+			method: "get",
+			params: param,
+		});
+	},
+	save: function (param) {
+		return request({
+			url: prefix + "/contract/registration/save",
+			method: "post",
+			data: param,
+		});
+	},
+	remove: function (url) {
+		return request({
+			url: prefix + "/contract/registration/remove",
+			method: "get",
+			params: { id: url },
+		});
+	},
+	findById: function (id) {
+		return request({
+			url: prefix + "/contract/registration/findById",
+			method: "get",
+			params: { id: id },
+		});
+	},
+	findFileInfoById: function (id) {
+		return request({
+			url: prefix + "/contract/registration/findFileInfoById",
+			method: "get",
+			params: { id: id },
+		});
+	},
+	findByContractId: function (id) {
+		return request({
+			url: prefix + "/contract/registration/findByContractId",
+			method: "get",
+			params: { id: id },
+		});
+	},
+	updateStatusById: function (param) {
+		return request({
+			url: prefix + "/contract/registration/updateStatusById",
+			method: "post",
+			data: param,
+		});
+	},
+	updateInfo: function (param) {
+		return request({
+			url: prefix + "/contract/registration/updateInfo",
+			method: "post",
+			data: param,
+		});
+	},
+	updatePaperInfo: function (param) {
+		return request({
+			url: prefix + "/contract/registration/updatePaperInfo",
+			method: "post",
+			data: param,
+		});
+	},
+	getByClientId: function (id, contractForm) {
+		return request({
+			url: prefix + "/contract/registration/getByClientId",
+			method: "get",
+			params: { contractId: id, ...contractForm },
+		});
+	},
+	exportFile: function (params) {
+		return request({
+			url: prefix + "/contract/registration/exportFile",
+			method: "get",
+			params: params,
+			responseType: "blob",
+		});
+	},
+};

+ 8 - 8
src/api/materialManagement/MaterialManagementService.js

@@ -1,44 +1,44 @@
-import request from '@/utils/httpRequest'
+import request from "@/utils/httpRequest";
 
 export default class MaterialManagementService {
   list (param) {
     return request({
-      url: '/material/management/list',
+      url: prefix + '/material/management/list',
       method: 'get',
       params: param
     })
   }
   save (param) {
     return request({
-      url: '/material/management/save',
+      url: prefix + '/material/management/save',
       method: 'post',
       data: param
     })
   }
   findById (id) {
     return request({
-      url: '/material/management/findById',
+      url: prefix + '/material/management/findById',
       method: 'get',
       params: {id: id}
     })
   }
   remove (id) {
     return request({
-      url: '/material/management/remove',
+      url: prefix + '/material/management/remove',
       method: 'get',
       params: {id: id}
     })
   }
   updateStatusById (param) {
     return request({
-      url: '/material/management/updateStatusById',
+      url: prefix + '/material/management/updateStatusById',
       method: 'post',
       data: param
     })
   }
   exportFile (params) {
     return request({
-      url: '/reimbursementApproval/info/exportFile',
+      url: prefix + '/reimbursementApproval/info/exportFile',
       method: 'get',
       params: params,
       responseType: 'blob'
@@ -46,7 +46,7 @@ export default class MaterialManagementService {
   }
   findTradeByTypeId (typeId) {
     return request({
-      url: '/material/management/findTradeByTypeId',
+      url: prefix + '/material/management/findTradeByTypeId',
       method: 'get',
       params: {typeId: typeId}
     })

+ 254 - 254
src/components/userSelect/UserSelectDialog.vue

@@ -153,7 +153,7 @@
 													item.tenantId
 												) + '!important',
 										}"
-									>{{
+										>{{
 											item.name.substring(0, 1)
 										}}</el-avatar
 									>
@@ -187,274 +187,274 @@
 </template>
 
 <script>
-	import userService from "@/api/sys/userService";
-	import officeService from "@/api/sys/officeService";
-	export default {
-		props: {
-			tenantId: { type: String, default: null },
-			limit: {
-				type: Number,
-				default: 999999,
-			},
+import userService from "@/api/sys/userService";
+import officeService from "@/api/sys/officeService";
+export default {
+	props: {
+		tenantId: { type: String, default: null },
+		limit: {
+			type: Number,
+			default: 999999,
 		},
-		data() {
-			return {
-				searchForm: {
-					loginName: "",
-					companyDTO: {
-						id: "",
-					},
-					officeDTO: {
-						id: "",
-					},
-					name: "",
+	},
+	data() {
+		return {
+			searchForm: {
+				loginName: "",
+				companyDTO: {
+					id: "",
+				},
+				officeDTO: {
+					id: "",
 				},
+				name: "",
+			},
 
-				dialogVisible: false,
-				showGrouploading: false,
-				showUserloading: false,
-				groupId: "",
-				pageSize: 10,
-				total: 0,
-				currentPage: 1,
-				group: [],
-				user: [],
-				role: [],
-				type: 1,
-				selected: [],
-				value: [],
-			};
+			dialogVisible: false,
+			showGrouploading: false,
+			showUserloading: false,
+			groupId: "",
+			pageSize: 10,
+			total: 0,
+			currentPage: 1,
+			group: [],
+			user: [],
+			role: [],
+			type: 1,
+			selected: [],
+			value: [],
+		};
+	},
+	computed: {
+		selectedIds() {
+			return this.selected.map((t) => t.id);
 		},
-		computed: {
-			selectedIds() {
-				return this.selected.map((t) => t.id);
-			},
+	},
+	methods: {
+		//打开赋值
+		open(data) {
+			this.value = data || [];
+			this.selected = JSON.parse(JSON.stringify(data || []));
+			this.dialogVisible = true;
+			this.getGroup();
+			this.getUser();
 		},
-		methods: {
-			//打开赋值
-			open(data) {
-				this.value = data || [];
-				this.selected = JSON.parse(JSON.stringify(data || []));
-				this.dialogVisible = true;
-				this.getGroup();
-				this.getUser();
-			},
-			//获取组织
-			async getGroup() {
-				this.showGrouploading = true;
-				// officeService.treeData().then((data) => {
-				// 	this.officeTreeData = data
-				// 	this.showGrouploading = false;
-				// })
-				var res = await officeService.treeData({ tenantId: this.tenantId });
-				this.showGrouploading = false;
-				var allNode = { id: "", type: "1", name: "所有" };
-				res.unshift(allNode);
-				this.group = res;
-			},
-			//获取用户
-			async getUser() {
-				this.showUserloading = true;
-				userService
-					.list({
-						current: this.currentPage,
-						size: this.pageSize,
-						...this.searchForm,
-						"tenantDTO.id": this.tenantId,
-					})
-					.then((data) => {
-						this.user = data.records;
-						this.total = data.total;
-						// this.pageNo = data.current
-						this.showUserloading = false;
-						this.$refs.userScrollbar.setScrollTop(0);
-					});
-			},
-			//组织点击
-			groupClick(data) {
-				if (data.type === "1") {
-					this.searchForm.companyDTO.id = data.id;
-					this.searchForm.officeDTO.id = "";
-				} else {
-					this.searchForm.companyDTO.id = "";
-					this.searchForm.officeDTO.id = data.id;
-				}
-				this.currentPage = 1;
-				this.groupId = data.id;
-				this.getUser();
-			},
-			//用户点击
-			userClick(data, checked) {
-				if (checked) {
-					if (this.limit === 1) {
-						this.selected = [
-							{
-								id: data.id,
-								name: data.name,
-								tenantId: data.tenantDTO?.id,
-							},
-						];
-					} else {
-						this.selected.push({
+		//获取组织
+		async getGroup() {
+			this.showGrouploading = true;
+			// officeService.treeData().then((data) => {
+			// 	this.officeTreeData = data
+			// 	this.showGrouploading = false;
+			// })
+			var res = await officeService.treeData({ tenantId: this.tenantId });
+			this.showGrouploading = false;
+			var allNode = { id: "", type: "1", name: "所有" };
+			res.unshift(allNode);
+			this.group = res;
+		},
+		//获取用户
+		async getUser() {
+			this.showUserloading = true;
+			userService
+				.list({
+					current: this.currentPage,
+					size: this.pageSize,
+					...this.searchForm,
+					"tenantDTO.id": this.tenantId,
+				})
+				.then((data) => {
+					this.user = data.records;
+					this.total = data.total;
+					// this.pageNo = data.current
+					this.showUserloading = false;
+					this.$refs.userScrollbar.setScrollTop(0);
+				});
+		},
+		//组织点击
+		groupClick(data) {
+			if (data.type === "1") {
+				this.searchForm.companyDTO.id = data.id;
+				this.searchForm.officeDTO.id = "";
+			} else {
+				this.searchForm.companyDTO.id = "";
+				this.searchForm.officeDTO.id = data.id;
+			}
+			this.currentPage = 1;
+			this.groupId = data.id;
+			this.getUser();
+		},
+		//用户点击
+		userClick(data, checked) {
+			if (checked) {
+				if (this.limit === 1) {
+					this.selected = [
+						{
 							id: data.id,
 							name: data.name,
 							tenantId: data.tenantDTO?.id,
-						});
-					}
+						},
+					];
 				} else {
-					this.selected = this.selected.filter(
-						(item) => item.id != data.id
-					);
-				}
-			},
-			//用户分页点击
-			paginationChange() {
-				this.getUser();
-			},
-			//用户搜索
-			search() {
-				// this.groupId = ''
-				// this.$refs.groupTree.setCurrentKey(this.groupId)
-				this.currentPage = 1;
-				this.getUser();
-			},
-			//删除已选
-			deleteSelected(index) {
-				this.selected.splice(index, 1);
-				console.log(this.selected);
-				if (this.type == 1) {
-					this.$refs.userTree.setCheckedKeys(this.selectedIds);
-				} else if (this.type == 2) {
-					this.$refs.groupTree.setCheckedKeys(this.selectedIds);
-				}
-			},
-			//提交保存
-			save() {
-				this.value.splice(0, this.value.length);
-				this.selected.map((item) => {
-					this.value.push(item);
-				});
-				if (this.limit < this.value.length) {
-					this.$message.error(`你最多只能选择${this.limit}个用户`);
-					return;
+					this.selected.push({
+						id: data.id,
+						name: data.name,
+						tenantId: data.tenantDTO?.id,
+					});
 				}
-				this.$emit("doSubmit", this.value);
-				this.dialogVisible = false;
-			},
+			} else {
+				this.selected = this.selected.filter(
+					(item) => item.id != data.id
+				);
+			}
+		},
+		//用户分页点击
+		paginationChange() {
+			this.getUser();
+		},
+		//用户搜索
+		search() {
+			// this.groupId = ''
+			// this.$refs.groupTree.setCurrentKey(this.groupId)
+			this.currentPage = 1;
+			this.getUser();
+		},
+		//删除已选
+		deleteSelected(index) {
+			this.selected.splice(index, 1);
+			console.log(this.selected);
+			if (this.type == 1) {
+				this.$refs.userTree.setCheckedKeys(this.selectedIds);
+			} else if (this.type == 2) {
+				this.$refs.groupTree.setCheckedKeys(this.selectedIds);
+			}
+		},
+		//提交保存
+		save() {
+			this.value.splice(0, this.value.length);
+			this.selected.map((item) => {
+				this.value.push(item);
+			});
+			if (this.limit < this.value.length) {
+				this.$message.error(`你最多只能选择${this.limit}个用户`);
+				return;
+			}
+			this.$emit("doSubmit", this.value);
+			this.dialogVisible = false;
 		},
-	};
+	},
+};
 </script>
 
 <style scoped>
-	.user-select {
-		display: flex;
-	}
-	.user-select__left {
-		width: 400px;
-	}
-	.user-select__right {
-		flex: 1;
-	}
-	.user-select__selected li .name .el-avatar {
-		margin-right: 2px;
-		height: 10;
-		width: 25px;
-		height: 25px;
-	}
-	.user-select__search {
-		padding-bottom: 10px;
-	}
+.user-select {
+	display: flex;
+}
+.user-select__left {
+	width: 400px;
+}
+.user-select__right {
+	flex: 1;
+}
+.user-select__selected li .name .el-avatar {
+	margin-right: 2px;
+	height: 10;
+	width: 25px;
+	height: 25px;
+}
+.user-select__search {
+	padding-bottom: 10px;
+}
 
-	.user-select__select {
-		display: flex;
-		border: 1px solid var(--el-border-color-light);
-		background: var(--el-color-white);
-	}
-	.user-select__tree {
-		width: 200px;
-		height: 300px;
-		border-right: 1px solid var(--el-border-color-light);
-	}
-	.user-select__user {
-		width: 200px;
-		height: 300px;
-		display: flex;
-		flex-direction: column;
-	}
-	.user-select__user__list {
-		flex: 1;
-		overflow: auto;
-	}
-	.user-select__user footer {
-		height: 36px;
-		padding-top: 5px;
-		border-top: 1px solid var(--el-border-color-light);
-	}
+.user-select__select {
+	display: flex;
+	border: 1px solid var(--el-border-color-light);
+	background: var(--el-color-white);
+}
+.user-select__tree {
+	width: 200px;
+	height: 300px;
+	border-right: 1px solid var(--el-border-color-light);
+}
+.user-select__user {
+	width: 200px;
+	height: 300px;
+	display: flex;
+	flex-direction: column;
+}
+.user-select__user__list {
+	flex: 1;
+	overflow: auto;
+}
+.user-select__user footer {
+	height: 36px;
+	padding-top: 5px;
+	border-top: 1px solid var(--el-border-color-light);
+}
 
-	.user-select__toicon {
-		display: flex;
-		justify-content: center;
-		align-items: center;
-		margin: 0 10px;
-	}
-	.user-select__toicon i {
-		display: flex;
-		justify-content: center;
-		align-items: center;
-		background: #ccc;
-		width: 20px;
-		height: 20px;
-		text-align: center;
-		line-height: 20px;
-		border-radius: 50%;
-		color: #fff;
-	}
+.user-select__toicon {
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	margin: 0 10px;
+}
+.user-select__toicon i {
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	background: #ccc;
+	width: 20px;
+	height: 20px;
+	text-align: center;
+	line-height: 20px;
+	border-radius: 50%;
+	color: #fff;
+}
 
-	.user-select__selected {
-		height: 345px;
-		width: 200px;
-		border: 1px solid var(--el-border-color-light);
-		background: var(--el-color-white);
-	}
-	.user-select__selected header {
-		height: 43px;
-		line-height: 43px;
-		border-bottom: 1px solid var(--el-border-color-light);
-		padding: 0 15px;
-		font-size: 16px;
-	}
-	.user-select__selected ul {
-		height: 300px;
-		overflow: auto;
-	}
-	.user-select__selected li {
-		display: flex;
-		align-items: center;
-		justify-content: space-between;
-		padding: 5px 5px 5px 15px;
-		height: 38px;
-	}
-	.user-select__selected li .name {
-		display: flex;
-		align-items: center;
-	}
-	.user-select__selected li .name .el-avatar {
-		margin-right: 10px;
-	}
-	.user-select__selected li .delete {
-		display: none;
-	}
-	.user-select__selected li:hover {
-		background: var(--el-color-primary-light-9);
-	}
-	.user-select__selected li:hover .delete {
-		display: inline-block;
-	}
-	.user-select-role .user-select__left {
-		width: 200px;
-	}
-	.user-select-role .user-select__tree {
-		border: none;
-		height: 343px;
-	}
+.user-select__selected {
+	height: 345px;
+	width: 200px;
+	border: 1px solid var(--el-border-color-light);
+	background: var(--el-color-white);
+}
+.user-select__selected header {
+	height: 43px;
+	line-height: 43px;
+	border-bottom: 1px solid var(--el-border-color-light);
+	padding: 0 15px;
+	font-size: 16px;
+}
+.user-select__selected ul {
+	height: 300px;
+	overflow: auto;
+}
+.user-select__selected li {
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 5px 5px 5px 15px;
+	height: 38px;
+}
+.user-select__selected li .name {
+	display: flex;
+	align-items: center;
+}
+.user-select__selected li .name .el-avatar {
+	margin-right: 10px;
+}
+.user-select__selected li .delete {
+	display: none;
+}
+.user-select__selected li:hover {
+	background: var(--el-color-primary-light-9);
+}
+.user-select__selected li:hover .delete {
+	display: inline-block;
+}
+.user-select-role .user-select__left {
+	width: 200px;
+}
+.user-select-role .user-select__tree {
+	border: none;
+	height: 343px;
+}
 </style>

+ 100 - 0
src/components/userSelectButton/DividerButton.vue

@@ -0,0 +1,100 @@
+<template>
+<div style="float: left">
+  <el-button style="margin-left: 20px" type="primary"  size="mini" :disabled="disabled" :readonly="readonly" @click="showUserSelect" plain>
+    选择
+  </el-button>
+    <user-select ref="userSelect" @doSubmit="selectUsersToInput" :limit="limit" ></user-select>
+</div>
+</template>
+<script>
+import userSelect from './UserSelectDialog'
+import userService from '@/api/sys/UserService'
+export default {
+  data () {
+    return {
+      name: '',
+      labelValue: this.value,
+      selectData: []
+    }
+  },
+  props: {
+    limit: Number,
+    value: String,
+    userName: String,
+    size: {
+      type: String,
+      default: () => { return 'small' }
+    },
+    readonly: {
+      type: Boolean,
+      default: () => { return false }
+    },
+    disabled: {
+      type: Boolean,
+      default: () => { return false }
+    }
+  },
+  components: {
+    userSelect
+  },
+  beforeCreate () {
+  },
+  watch: {
+    value: {
+      handler (newVal) {
+        this.selectData = []
+        if (newVal) {
+          newVal.split(',').forEach((id) => {
+            userService.queryById(id).then(({data}) => {
+              if (data && data.id !== '') {
+                this.selectData.push(data)
+              }
+            })
+          })
+        }
+      },
+      immediate: true,
+      deep: false
+    },
+    selectData: {
+      handler (newVal) {
+        this.name = newVal.map(user => { return user.name }).join(',')
+      },
+      immediate: false,
+      deep: false
+    },
+    userName: {
+      handler (newVal) {
+        this.name = newVal
+      },
+      immediate: false,
+      deep: false
+    }
+  },
+  methods: {
+    selectUsersToInput (users) {
+      this.selectData = users
+      this.labelValue = users.map(user => { return user.id }).join(',')
+      this.name = users.map(user => { return user.name }).join(',')
+      this.$emit('getValue', this.labelValue, this.name)
+    },
+    changeName () {
+      this.$emit('getValue', null, this.name)
+    },
+    showUserSelect () {
+      this.$refs.userSelect.init()
+    }
+  }
+}
+</script>
+<style>
+  .el-form-item__content .el-input-group {
+      vertical-align: middle;
+  }
+ .el-tag + .el-tag {
+    margin-left: 5px;
+    margin-bottom: 5px;
+  }
+</style>
+
+

+ 450 - 0
src/components/userSelectButton/UserSelectDialog.vue

@@ -0,0 +1,450 @@
+<template>
+  <div>
+    <el-dialog
+    title="用户选择"
+    width="1000px"
+    :close-on-click-modal="false"
+    :append-to-body="true"
+	draggable
+     class="userDialog"
+    v-model="visible">
+    <el-container style="height: 500px">
+      <el-aside width="200px">
+
+        <el-card class="org">
+          <div slot="header" class="clearfix">
+            <el-input
+              placeholder="请输入组织机构过滤"
+              v-model="filterText">
+            </el-input>
+          </div>
+           <el-tree
+            :data="officeTreeData"
+            :props="{
+                  value: 'id',             // ID字段名
+                  label: 'name',         // 显示名称
+                  children: 'children'    // 子级字段名
+                }"
+            default-expand-all
+            highlight-current
+            node-key="id"
+            :render-content="renderContent"
+            :filter-node-method="filterNode"
+            :expand-on-click-node="false"
+            @node-click="handleNodeClick"
+            ref="officeTree">
+          </el-tree>
+        </el-card>
+      </el-aside>
+
+    <el-container>
+      <el-header style="text-align: left; font-size: 12px;height:30px">
+        <el-form :inline="true" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+            <el-form-item prop="loginName">
+              <el-input v-model="searchForm.loginName" placeholder="登录名" clearable></el-input>
+            </el-form-item>
+
+            <el-form-item>
+              <el-button  type="primary" @click="refreshList()" icon="el-icon-search">查询</el-button>
+              <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>
+            </el-form-item>
+          </el-form>
+      </el-header>
+
+      <el-main>
+        <el-table
+          :data="dataList"
+          v-loading="loading"
+          border
+          ref="userTable"
+          @selection-change="selectionChangeHandle"
+          @sort-change="sortChangeHandle"
+          height="calc(100% - 40px)"
+          style="width: 100%;">
+          <el-table-column
+            header-align="center"
+            align="center"
+            v-if="limit <= 1"
+            width="50">
+              <template #default="scope">
+                  <el-radio :label="scope.row.id" :value="dataListAllSelections[0]&&dataListAllSelections[0].id" @change.native="getTemplateRow(scope.$index,scope.row)"><span></span></el-radio>
+              </template>
+          </el-table-column>
+          <el-table-column
+            type="selection"
+            header-align="center"
+            v-if="limit > 1"
+            align="center"
+            width="50">
+          </el-table-column>
+          <el-table-column
+            prop="photo"
+            header-align="center"
+            align="center"
+            label="头像">
+            <template #default="scope">
+              <img :src="scope.row.photo === ''?'/static/img/avatar.png':scope.row.photo" style="height:35px"/>
+            </template>
+          </el-table-column>
+          <el-table-column
+            prop="loginName"
+            header-align="center"
+            align="center"
+            sortable="custom"
+            min-width="90"
+            label="登录名">
+          </el-table-column>
+          <el-table-column
+            prop="name"
+            header-align="center"
+            align="真实姓名"
+            sortable="custom"
+            min-width="90"
+            label="用户名">
+          </el-table-column>
+          <el-table-column
+            prop="companyDTO.name"
+            header-align="center"
+            align="center"
+            sortable="custom"
+            min-width="110"
+            label="所属机构">
+          </el-table-column>
+          <el-table-column
+            prop="officeDTO.name"
+            header-align="center"
+            align="center"
+            sortable="custom"
+            min-width="110"
+            label="所属部门">
+          </el-table-column>
+          <el-table-column
+            prop="loginFlag"
+            header-align="center"
+            align="center"
+            min-width="100"
+            label="状态">
+            <template #default="scope">
+              <el-tag v-if="scope.row.loginFlag === '1'" type="success">正常</el-tag>
+              <el-tag v-else-if="scope.row.loginFlag === '0'" type="danger">禁用</el-tag>
+            </template>
+          </el-table-column>
+        </el-table>
+        <el-pagination
+          @size-change="sizeChangeHandle"
+          @current-change="currentChangeHandle"
+          :current-page="pageNo"
+          :page-sizes="[5, 10, 50, 100]"
+          :page-size="pageSize"
+          :total="total"
+          layout="total, sizes, prev, pager, next, jumper">
+        </el-pagination>
+      </el-main>
+    </el-container>
+
+    <el-aside width="200px">
+      <el-tag
+        :key="tag.id"
+        v-for="tag in dataListAllSelections"
+        closable
+        :disable-transitions="false"
+        @close="del(tag)">
+        {{tag.name}}
+      </el-tag>
+  </el-aside>
+</el-container>
+		<template #footer>
+			<span class="dialog-footer">
+			  <el-button @click="visible = false" icon="el-icon-circle-close">关闭</el-button>
+			  <el-button type="primary" icon="el-icon-circle-check" @click="doSubmit()">确定</el-button>
+			</span>
+		</template>
+    </el-dialog>
+
+  </div>
+</template>
+
+<script>
+  export default {
+    data () {
+      return {
+        searchForm: {
+          loginName: '',
+          companyDTO: {
+            id: ''
+          },
+          officeDTO: {
+            id: ''
+          },
+          name: ''
+        },
+        filterText: '',
+        dataListAllSelections: [],   // 所有选中的数据包含跨页数据
+        dataListSelections: [],
+        idKey: 'id', // 标识列表数据中每一行的唯一键的名称(需要按自己的数据改一下)
+        dataList: [],
+        dynamicTags: [],
+        officeTreeData: [],
+        pageNo: 1,
+        pageSize: 10,
+        total: 0,
+        orders: [],
+        loading: false,
+        visible: false
+      }
+    },
+    props: {
+      selectData: {
+        type: Array,
+        default: () => { return [] }
+      },
+      limit: {
+        type: Number,
+        default: 999999
+      }
+    },
+    watch: {
+      filterText (val) {
+        this.$refs.officeTree.filter(val)
+      }
+    },
+    methods: {
+      init () {
+        this.visible = true
+        this.$nextTick(() => {
+          this.dataListAllSelections = JSON.parse(JSON.stringify(this.selectData))
+          this.refreshTree()
+          this.resetSearch()
+        })
+      },
+      renderContent (h, { node, data, store }) {
+		  return h('span', { class: 'custom-tree-node' }, [
+			  data.type === '1' ? h('i', { class: 'fa fa-sitemap' }) : h('i', { class: 'fa fa-users' }),
+			  h('span', { class: 'text' }, node.label),
+		  ]);
+        // return (
+        //       <span class="custom-tree-node">
+        //         {
+        //           data.type === '1' ? <i class="fa fa-sitemap"></i> : <i class="fa fa-users"></i>
+        //         }
+        //         <span class="text">{node.label}</span>
+        //       </span>
+        // )
+      },
+      getTemplateRow (index, row) {                                 // 获取选中数据
+        this.dataListSelections = [row]
+        this.$nextTick(() => {
+          this.changePageCoreRecordData()
+        })
+      },
+           // 设置选中的方法
+      setSelectRow () {
+        if (!this.dataListAllSelections || this.dataListAllSelections.length <= 0) {
+          this.$refs.userTable.clearSelection()
+          return
+        }
+                // 标识当前行的唯一键的名称
+        let idKey = this.idKey
+        let selectAllIds = []
+        this.dataListAllSelections.forEach(row => {
+          selectAllIds.push(row[idKey])
+        })
+        this.$refs.userTable.clearSelection()
+        for (var i = 0; i < this.dataList.length; i++) {
+          if (selectAllIds.indexOf(this.dataList[i][idKey]) >= 0) {
+                        // 设置选中,记住table组件需要使用ref="table"
+            this.$refs.userTable.toggleRowSelection(this.dataList[i], true)
+          }
+        }
+      },
+            // 记忆选择核心方法
+      changePageCoreRecordData () {
+                // 标识当前行的唯一键的名称
+        let idKey = this.idKey
+        let that = this
+              // 如果总记忆中还没有选择的数据,那么就直接取当前页选中的数据,不需要后面一系列计算
+        if (this.dataListAllSelections.length <= 0) {
+          this.dataListSelections.forEach(row => {
+            that.dataListAllSelections.push(row)
+          })
+          return
+        }
+                // 总选择里面的key集合
+        let selectAllIds = []
+        this.dataListAllSelections.forEach(row => {
+          selectAllIds.push(row[idKey])
+        })
+        let selectIds = []
+                // 获取当前页选中的id
+        this.dataListSelections.forEach(row => {
+          selectIds.push(row[idKey])
+                  // 如果总选择里面不包含当前页选中的数据,那么就加入到总选择集合里
+          if (selectAllIds.indexOf(row[idKey]) < 0) {
+            that.dataListAllSelections.push(row)
+          }
+        })
+        let noSelectIds = []
+              // 得到当前页没有选中的id
+        this.dataList.forEach(row => {
+          if (selectIds.indexOf(row[idKey]) < 0) {
+            noSelectIds.push(row[idKey])
+          }
+        })
+        noSelectIds.forEach(id => {
+          if (selectAllIds.indexOf(id) >= 0) {
+            for (let i = 0; i < that.dataListAllSelections.length; i++) {
+              if (that.dataListAllSelections[i][idKey] === id) {
+                                // 如果总选择中有未被选中的,那么就删除这条
+                that.dataListAllSelections.splice(i, 1)
+                break
+              }
+            }
+          }
+        })
+      },
+     // 得到选中的所有数据
+      getAllSelectionData () {
+         // 再执行一次记忆勾选数据匹配,目的是为了在当前页操作勾选后直接获取选中数据
+        this.changePageCoreRecordData()
+      },
+      filterNode (value, data) {
+        if (!value) return true
+        return data.name.indexOf(value) !== -1
+      },
+      del (tag) {
+        this.dataListAllSelections.splice(this.dataListAllSelections.indexOf(tag), 1)
+        this.$nextTick(() => {
+          this.setSelectRow()
+        })
+      },
+      // 获取数据列表
+      refreshList () {
+        if (this.commonJS.isEmpty(this.searchForm.officeDTO.id) && this.commonJS.isEmpty(this.searchForm.companyDTO.id)) {
+          this.searchForm.selectAll = 'true'
+        }
+        this.loading = true
+        this.$http({
+          url: '/system-server/sys/user/list',
+          method: 'get',
+          params: {
+            'current': this.pageNo,
+            'size': this.pageSize,
+            'orders': this.orders,
+            ...this.searchForm
+          }
+        }).then((data) => {
+          this.dataList = data.records
+          this.total = data.total
+          this.pageNo = data.current
+          this.loading = false
+          this.$nextTick(() => {
+            this.setSelectRow()
+          })
+        })
+      },
+      refreshTree () {
+        this.$http({
+          url: `/system-server/sys/office/treeData`,
+          method: 'get'
+        }).then((data) => {
+          this.officeTreeData = data
+        })
+      },
+      // 每页数
+      sizeChangeHandle (val) {
+        this.pageSize = val
+        this.pageNo = 1
+        this.refreshList()
+        this.$nextTick(() => {
+          this.changePageCoreRecordData()
+        })
+      },
+      // 当前页
+      currentChangeHandle (val) {
+        this.pageNo = val
+        this.refreshList()
+        this.$nextTick(() => {
+          this.changePageCoreRecordData()
+        })
+      },
+      // 多选
+      selectionChangeHandle (val) {
+        this.dataListSelections = val
+        this.$nextTick(() => {
+          this.changePageCoreRecordData()
+        })
+      },
+       // 排序
+      sortChangeHandle (column) {
+        if (column.prop === 'officeDTO.name') {
+          column.prop = 'o.name'
+        }
+        if (column.prop === 'companyDTO.name') {
+          column.prop = 'c.name'
+        }
+        this.orders = []
+        if (column.order != null) {
+          this.orders.push({column: this.$utils.toLine(column.prop), asc: column.order === 'ascending'})
+        }
+        this.refreshList()
+      },
+      handleNodeClick (data) {
+        if (data.type === '1') {
+          this.searchForm.companyDTO.id = data.id
+          this.searchForm.officeDTO.id = ''
+        } else {
+          this.searchForm.companyDTO.id = ''
+          this.searchForm.officeDTO.id = data.id
+        }
+        this.refreshList()
+      },
+      resetSearch () {
+        this.searchForm.companyDTO.id = ''
+        this.searchForm.officeDTO.id = ''
+        this.$refs.officeTree.setCurrentKey(null)
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      },
+      doSubmit () {
+        if (this.limit < this.dataListAllSelections.length) {
+          this.$message.error(`你最多只能选择${this.limit}个用户`)
+          return
+        }
+        this.$emit('doSubmit', this.dataListAllSelections)
+        this.visible = false
+      },
+      close () {
+        this.$refs.userTable.clearSelection()
+        this.dataListAllSelections = []
+        this.visible = false
+      }
+    }
+  }
+</script>
+<style lang="scss">
+.org {
+  height: 100%;
+  .el-card__header {
+    padding: 10px;
+  }
+  .el-card__body {
+    padding: 10px;
+    max-height: 520px;
+    overflow: auto;
+  }
+}
+.userDialog{
+  .el-dialog__body {
+    padding: 10px 0px 0px 10px;
+    color: #606266;
+    font-size: 14px;
+    word-break: break-all;
+  }
+  .el-main {
+    padding: 20px 20px 5px 20px;
+    .el-pagination{
+      margin-top: 5px;
+    }
+  }
+}
+</style>

+ 101 - 0
src/components/userSelectButton/index.vue

@@ -0,0 +1,101 @@
+<template>
+<div>
+<!--    <el-input placeholder="请选择" :size="size" :disabled="disabled"  :readonly="readonly" style="line-hight:40px" @change="changeName" v-model="name" class="input-with-select">-->
+
+<!--    </el-input>-->
+    <el-button :disabled="disabled" type="primary" :readonly="readonly" @click="showUserSelect">人员选择</el-button>
+    <user-select ref="userSelect" @doSubmit="selectUsersToInput" :limit="limit" ></user-select>
+</div>
+</template>
+<script>
+import userSelect from './UserSelectDialog'
+import userService from '@/api/sys/UserService'
+export default {
+  data () {
+    return {
+      name: '',
+      labelValue: this.value,
+      selectData: []
+    }
+  },
+  props: {
+    limit: Number,
+    value: String,
+    userName: String,
+    size: {
+      type: String,
+      default: () => { return 'small' }
+    },
+    readonly: {
+      type: Boolean,
+      default: () => { return false }
+    },
+    disabled: {
+      type: Boolean,
+      default: () => { return false }
+    }
+  },
+  components: {
+    userSelect
+  },
+  beforeCreate () {
+  },
+  watch: {
+    value: {
+      handler (newVal) {
+        this.selectData = []
+        if (newVal) {
+          newVal.split(',').forEach((id) => {
+            userService.queryById(id).then((data) => {
+              if (data && data.id !== '') {
+                this.selectData.push(data)
+              }
+            })
+          })
+        }
+      },
+      immediate: true,
+      deep: false
+    },
+    selectData: {
+      handler (newVal) {
+        this.name = newVal.map(user => { return user.name }).join(',')
+      },
+      immediate: false,
+      deep: false
+    },
+    userName: {
+      handler (newVal) {
+        this.name = newVal
+      },
+      immediate: false,
+      deep: false
+    }
+  },
+  methods: {
+    selectUsersToInput (users) {
+      this.selectData = users
+      this.labelValue = users.map(user => { return user.id }).join(',')
+      this.name = users.map(user => { return user.name }).join(',')
+      this.$emit('getValue', this.labelValue, this.name)
+    },
+    changeName () {
+      this.$emit('getValue', null, this.name)
+    },
+    showUserSelect () {
+      this.$refs.userSelect.init()
+    }
+  }
+}
+</script>
+<style>
+  .el-form-item__content .el-input-group {
+      vertical-align: middle;
+  }
+ .el-tag + .el-tag {
+    margin-left: 5px;
+    margin-bottom: 5px;
+  }
+</style>
+
+

+ 2 - 2
src/views/common/UpLoadComponentDialog.vue

@@ -13,8 +13,8 @@
 	  v-model="visible">
       <UpLoadComponentV2 ref="upLoadComponentV2"></UpLoadComponentV2>
     <span slot="footer" class="dialog-footer">
-      <el-button size="small" @click="close()" icon="el-icon-circle-close">关闭</el-button>
-      <el-button size="small" type="primary" icon="el-icon-circle-check" @click="doSubmit()">确定</el-button>
+      <el-button @click="close()" icon="el-icon-circle-close">关闭</el-button>
+      <el-button type="primary" icon="el-icon-circle-check" @click="doSubmit()">确定</el-button>
     </span>
     </el-dialog>
 

+ 33 - 25
src/views/common/UpLoadComponentV2.1.vue

@@ -12,9 +12,9 @@
                :on-change="changes"
                :on-progress="uploadVideoProcess"
                :file-list="fileList">
-      <el-button :loading="loading" type="primary" size="mini" :slot="auth==='view'&&uploadFlag===false?'tip':'trigger'" @click="clickHandel" :disabled="auth==='view'&&uploadFlag===false">点击上传</el-button>
+      <el-button :loading="loading" type="primary" :slot="auth==='view'&&uploadFlag===false?'tip':'trigger'" @click="clickHandel" :disabled="auth==='view'&&uploadFlag===false">点击上传</el-button>
     </el-upload>
-    <el-button v-if="showSign" :loading="loading" type="info" size="mini" style="float: right;" @click="clickSign">签章</el-button>
+    <el-button v-if="showSign" :loading="loading" type="info" style="float: right;" @click="clickSign">签章</el-button>
     <div style="height: calc(100% - 80px);margin-top: 10px">
       <!-- 进度条 -->
       <el-progress style="margin-left: 5em" v-if="progressFlag" :percentage="loadProgress"></el-progress>
@@ -25,7 +25,7 @@
         :data="dataListNew">
         <el-table-column type="seq" width="40"></el-table-column>
         <el-table-column label="文件名称" prop="name" align="center">
-          <template scope="scope">
+          <template #default="scope">
             <div v-if="ifName(scope.row) === true">
               <el-image
                 style="width: 30px; height: 30px;padding-top: 4px"
@@ -39,18 +39,22 @@
           </template>
         </el-table-column>
         <el-table-column label="创建人" prop="createBy.name" align="center"></el-table-column>
-        <el-table-column label="创建时间" prop="createDate" align="center"></el-table-column>
+        <el-table-column label="创建时间" prop="createTime" align="center"></el-table-column>
         <el-table-column label="文件大小" prop="size" align="center">
-          <template slot-scope="scope">
+          <template #default="scope">
             {{getSize(scope.row.size)}}
           </template>
         </el-table-column>
         <el-table-column label="文件类型" prop="fileType" align="center">
-          <template slot="header" scope="scope">
-            <span style="color:red;font-size: 20px">* </span><span>文件类型</span>
-          </template>
-          <template slot-scope="scope">
-            <el-select v-if="auth !== 'view'" size="small" v-model="scope.row.fileType" placeholder="请选择">
+			<template #header="{ column }">
+				<span style="color: red; font-size: 20px">*</span>
+				<span>{{column.label}}</span>
+			</template>
+<!--          <template slot="header" scope="scope">-->
+<!--            <span style="color:red;font-size: 20px">* </span><span>文件类型</span>-->
+<!--          </template>-->
+          <template #default="scope">
+            <el-select v-if="auth !== 'view'" v-model="scope.row.fileType" placeholder="请选择">
               <el-option
                 v-for="item in $dictUtils.getDictList('cw_project_report_file_type')"
                 :key="item.value"
@@ -62,11 +66,15 @@
           </template>
         </el-table-column>
         <el-table-column label="盖章类型" prop="sealType" align="center">
-          <template slot="header" scope="scope">
-            <span style="color:red;font-size: 20px">* </span><span>盖章类型</span>
-          </template>
-          <template slot-scope="scope">
-            <el-select v-if="auth !== 'view'" @change="sealTypeChange(scope)" size="small" v-model="scope.row.sealType" placeholder="请选择">
+			<template #header="{ column }">
+				<span style="color: red; font-size: 20px">*</span>
+				<span>{{column.label}}</span>
+			</template>
+<!--          <template slot="header" scope="scope">-->
+<!--            <span style="color:red;font-size: 20px">* </span><span>盖章类型</span>-->
+<!--          </template>-->
+          <template #default="scope">
+            <el-select v-if="auth !== 'view'" @change="sealTypeChange(scope)" v-model="scope.row.sealType" placeholder="请选择">
               <el-option
                 v-for="item in $dictUtils.getDictList('cw_seal_type')"
                 :key="item.value"
@@ -77,17 +85,17 @@
             <span v-else>{{$dictUtils.getDictLabel("cw_seal_type", scope.row.sealType, '')}}</span>
           </template>
         </el-table-column>
-        <el-table-column label="备注" prop="remarks" align="center">
-          <template slot-scope="scope">
-            <el-input size="small" v-if="auth !== 'view'" v-model="scope.row.remarks" placeholder="请输入"></el-input>
+        <el-table-column  label="备注" prop="remarks" align="center">
+          <template #default="scope">
+            <el-input v-if="auth !== 'view'" v-model="scope.row.remarks" placeholder="请输入"></el-input>
             <span v-else>{{commonJS.isEmpty(scope.row.remarks)?'':scope.row.remarks}}</span>
           </template>
         </el-table-column>
         <el-table-column label="操作" width="200px" fixed="right" align="center">
-          <template  scope="scope">
-            <el-button type="text"  icon="el-icon-edit" size="small" @click="toHref(scope.row)" :disabled="false">下载</el-button>
-            <el-button type="text"  icon="el-icon-delete" size="small"  @click="deleteById(scope.row, scope.$index)" :disabled="auth==='view'&&delFlag === false&&createBy!==scope.row.createBy.name">删除</el-button>
-            <!--<el-button size="small" type="text" icon="el-icon-edit"
+          <template  #default="scope">
+            <el-button text type="primary"  icon="el-icon-edit" @click="toHref(scope.row)" :disabled="false">下载</el-button>
+            <el-button text type="primary"  icon="el-icon-delete"  @click="deleteById(scope.row, scope.$index)" :disabled="auth==='view'&&delFlag === false&&createBy!==scope.row.createBy.name">删除</el-button>
+            <!--<el-button text type="primary" icon="el-icon-edit"
                      @click="handleUpdate(scope.row, scope.$index)"
             >{{ scope.row.btn || "修改" }}</el-button>-->
           </template>
@@ -410,8 +418,8 @@
         for await (let item of fileList) {
           if (item.url) {
             await this.ossService.getFileSizeByUrl(item.url).then((data) => {
-              item.lsUrl = data.data.url
-              item.size = data.data.size
+              item.lsUrl = data.url
+              item.size = data.size
               this.dataList.push(item)
               this.dataListNew.push(item)
               if (this.dataListNew.length === fileList.length) {
@@ -492,7 +500,7 @@
             item.url = item.raw.url
             if (item.raw.url !== undefined && item.raw.url !== null && item.raw.url !== {}) {
               await this.ossService.getTemporaryUrl(item.raw.url).then((data) => {
-                item.lsUrl = data.data
+                item.lsUrl = data
               })
             }
           }

+ 6 - 6
src/views/common/UpLoadComponentV2.vue

@@ -42,12 +42,12 @@
         <el-table-column v-if="auth !== 'view'" label="创建人" prop="createBy.name" align="center"></el-table-column>
         <el-table-column v-if="auth !== 'view'" label="创建时间" prop="createDate" align="center"></el-table-column>
         <el-table-column label="文件大小" prop="size" align="center">
-          <template slot-scope="scope">
+          <template #default="scope">
             {{getSize(scope.row.size)}}
           </template>
         </el-table-column>
         <el-table-column label="文件类型" prop="fileType" align="center">
-          <template slot-scope="scope">
+          <template #default="scope">
             <component
               :is="scope.row.fileTypeComponent || 'fileTypeComponentA'"
               :options="$dictUtils.getDictList('cw_project_report_file_type')"
@@ -57,7 +57,7 @@
           </template>
         </el-table-column>
         <el-table-column label="盖章类型" prop="sealType" align="center">
-          <template slot-scope="scope">
+          <template #default="scope">
             <component
               :is="scope.row.sealTypeComponent || 'sealTypeComponentA'"
               :options="$dictUtils.getDictList('cw_seal_type')"
@@ -68,7 +68,7 @@
           </template>
         </el-table-column>
         <el-table-column label="备注" prop="remarks" align="center">
-          <template slot-scope="scope">
+          <template #default="scope">
             <component
               :is="scope.row.remarksComponent || 'remarksComponentA'"
               :value="scope.row.remarks"
@@ -78,8 +78,8 @@
         </el-table-column>
         <el-table-column label="操作" width="200px" fixed="right" align="center">
           <template  scope="scope">
-            <el-button type="text"  icon="el-icon-edit" size="small" @click="toHref(scope.row)" :disabled="false">下载</el-button>
-            <el-button type="text"  icon="el-icon-delete" size="small"  @click="deleteById(scope.row, scope.$index)" :disabled="auth==='view'&&delFlag === false&&createBy!==scope.row.createBy.name">删除</el-button>
+            <el-button text type="primary"  icon="el-icon-edit" size="small" @click="toHref(scope.row)" :disabled="false">下载</el-button>
+            <el-button text type="primary" icon="el-icon-delete" size="small"  @click="deleteById(scope.row, scope.$index)" :disabled="auth==='view'&&delFlag === false&&createBy!==scope.row.createBy.name">删除</el-button>
             <!--<el-button size="small" type="text" icon="el-icon-edit"
                      @click="handleUpdate(scope.row, scope.$index)"
             >{{ scope.row.btn || "修改" }}</el-button>-->

+ 18 - 14
src/views/common/UpLoadComponentV3.1.vue

@@ -12,7 +12,7 @@
                :on-change="changes"
                :on-progress="uploadVideoProcess"
                :file-list="fileList">
-      <el-button :loading="loading" type="primary" size="mini" :slot="auth==='view'&&uploadFlag===false?'tip':'trigger'" @click="clickHandel" :disabled="auth==='view'&&uploadFlag===false">点击上传</el-button>
+      <el-button :loading="loading" type="primary" :slot="auth==='view'&&uploadFlag===false?'tip':'trigger'" @click="clickHandel" :disabled="auth==='view'&&uploadFlag===false">点击上传</el-button>
     </el-upload>
     <div style="height: calc(100% - 80px);margin-top: 10px">
       <!-- 进度条 -->
@@ -24,7 +24,7 @@
         :data="dataListNew">
         <el-table-column type="seq" width="40"></el-table-column>
         <el-table-column label="文件名称" prop="name" align="center">
-          <template scope="scope">
+          <template #default="scope">
             <div v-if="ifName(scope.row) === true">
               <el-image
                 style="width: 30px; height: 30px;padding-top: 4px"
@@ -40,16 +40,20 @@
         <el-table-column label="创建人" prop="createBy.name" align="center"></el-table-column>
         <el-table-column label="创建时间" prop="createDate" align="center"></el-table-column>
         <el-table-column label="文件大小" prop="size" align="center">
-          <template slot-scope="scope">
+          <template #default="scope">
             {{getSize(scope.row.size)}}
           </template>
         </el-table-column>
         <el-table-column label="文件类型" prop="fileType" align="center">
-          <template slot="header" scope="scope">
-            <span style="color:red;font-size: 20px">* </span><span>文件类型</span>
-          </template>
-          <template slot-scope="scope">
-            <el-select v-if="auth !== 'view'" size="small" v-model="scope.row.fileType" placeholder="请选择">
+			<template #header="{ column }">
+				<span style="color: red; font-size: 20px">*</span>
+				<span>{{column.label}}</span>
+			</template>
+<!--          <template slot="header" scope="scope">-->
+<!--            <span style="color:red;font-size: 20px">* </span><span>文件类型</span>-->
+<!--          </template>-->
+          <template #default="scope">
+            <el-select v-if="auth !== 'view'" v-model="scope.row.fileType" placeholder="请选择">
               <el-option
                 v-for="item in $dictUtils.getDictList('cw_project_report_archive_file_type')"
                 :key="item.value"
@@ -61,16 +65,16 @@
           </template>
         </el-table-column>
         <el-table-column label="备注" prop="remarks" align="center">
-          <template slot-scope="scope">
-            <el-input size="small" v-if="auth !== 'view'" v-model="scope.row.remarks" placeholder="请输入"></el-input>
+          <template #default="scope">
+            <el-input v-if="auth !== 'view'" v-model="scope.row.remarks" placeholder="请输入"></el-input>
             <span v-else>{{commonJS.isEmpty(scope.row.remarks)?'':scope.row.remarks}}</span>
           </template>
         </el-table-column>
         <el-table-column label="操作" width="200px" fixed="right" align="center">
-          <template  scope="scope">
-            <el-button type="text"  icon="el-icon-edit" size="small" @click="toHref(scope.row)" :disabled="false">下载</el-button>
-            <el-button type="text"  icon="el-icon-delete" size="small"  @click="deleteById(scope.row, scope.$index)" :disabled="auth==='view'&&delFlag === false&&createBy!==scope.row.createBy.name">删除</el-button>
-            <!--<el-button size="small" type="text" icon="el-icon-edit"
+          <template  #default="scope">
+            <el-button text type="primary"  icon="el-icon-edit"  @click="toHref(scope.row)" :disabled="false">下载</el-button>
+            <el-button text type="primary"  icon="el-icon-delete"  @click="deleteById(scope.row, scope.$index)" :disabled="auth==='view'&&delFlag === false&&createBy!==scope.row.createBy.name">删除</el-button>
+            <!--<el-button type="text" icon="el-icon-edit"
                      @click="handleUpdate(scope.row, scope.$index)"
             >{{ scope.row.btn || "修改" }}</el-button>-->
           </template>

+ 162 - 0
src/views/cw/invoice/ContractForm.vue

@@ -0,0 +1,162 @@
+<template>
+  <div>
+    <el-dialog
+      title="选择合同"
+      :close-on-click-modal="false"
+	  draggable
+      width="1100px"
+      height="500px"
+      @close="close"
+      append-to-body
+      v-model="visible">
+      <div style="height: calc(100% - 80px);">
+        <el-form :inline="true" class="query-form" ref="searchForm" :model="searchForm" @submit.native.prevent>
+          <!-- 搜索框-->
+          <el-form-item label="合同名称" prop="name">
+            <el-input v-model="searchForm.name" placeholder="请输入合同名称" clearable></el-input>
+          </el-form-item>
+          <el-form-item label="委派方" prop="clientName">
+            <el-input v-model="searchForm.clientName" placeholder="请输入委派方" clearable></el-input>
+          </el-form-item>
+
+          <el-form-item>
+            <el-button type="primary" @click="list()" icon="el-icon-search">查询</el-button>
+            <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>
+          </el-form-item>
+        </el-form>
+
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="400px"
+          :loading="loading"
+          ref="workContractTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          :print-config="{}"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :row-config="{isCurrent: true}"
+          :radio-config="{trigger: 'row'}">
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="radio" width="40px"></vxe-column>
+
+          <vxe-column width="200px" title="合同编号" field="no"></vxe-column>
+          <vxe-column  title="合同名称" field="name"></vxe-column>
+          <vxe-column width="150px" title="委派方" field="clientName"></vxe-column>
+          <vxe-column width="150px" title="合同类型" field="contractType">
+            <template #default="scope">
+              {{ $dictUtils.getDictLabel("contract_type", scope.row.contractType, '-') }}
+            </template>
+          </vxe-column>
+          <vxe-column width="150px" title="创建时间" field="createDate"></vxe-column>
+          <vxe-column width="100px" title="创建人" field="createBy"></vxe-column>
+
+        </vxe-table>
+        <vxe-pager
+          background
+          :current-page="tablePage.currentPage"
+          :page-size="tablePage.pageSize"
+          :total="tablePage.total"
+          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+          @page-change="currentChangeHandle">
+        </vxe-pager>
+      </div>
+		<template #footer>
+			<span class="dialog-footer">
+			  <el-button @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			  <el-button type="primary" v-if="method != 'view'" @click="getContract()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+			</span>
+		</template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import ProgramProjectListInfoService from '@/api/program/ProgramProjectListInfoService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        dataList: [],
+        searchForm: {
+          clientName: '',
+          name: '',
+          contractDates: [],
+          type: '',
+          filedType: '',
+          contractAmounts: [],
+          createBy: this.$store.state.user.id,
+          procInsId: '',
+          processDefinitionId: ''
+        },
+        rowId: ''
+      }
+    },
+    programProjectListInfoService: null,
+    created () {
+      this.programProjectListInfoService = new ProgramProjectListInfoService()
+    },
+    components: {
+    },
+    methods: {
+      init (id) {
+        // if (!this.commonJS.isEmpty(id)) {
+        //   this.$refs.workContractTable.setCurrentRow(id)
+        // }
+        this.visible = true
+        this.list()
+      },
+      // 表单提交
+      getContract () {
+        let row = this.$refs.workContractTable.getRadioRecord()
+        if (this.commonJS.isEmpty(row)) {
+          this.$message.error('请选择一条数据')
+          return
+        }
+        this.close()
+        this.$emit('getContract', row)
+      },
+      list () {
+        this.loading = true
+        this.searchForm.createBy = this.$store.state.user.id
+        this.programProjectListInfoService.findContractPageList({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+        })
+      },
+      // 当前页
+      currentChangeHandle ({currentPage, pageSize}) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.list()
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.list()
+      },
+      close () {
+        this.visible = false
+      }
+    }
+  }
+</script>

Plik diff jest za duży
+ 1241 - 0
src/views/cw/invoice/InvoiceForm.vue


Plik diff jest za duży
+ 1525 - 0
src/views/cw/invoice/InvoiceFormTask.vue


Plik diff jest za duży
+ 1245 - 0
src/views/cw/invoice/InvoiceFormTaskInvalid.vue


+ 914 - 0
src/views/cw/invoice/InvoiceList.vue

@@ -0,0 +1,914 @@
+<template>
+  <div class="page">
+    <el-form :inline="true" class="query-form m-b-10" v-if="searchVisible" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+      <!-- 搜索框-->
+      <el-row :gutter="0">
+        <el-form-item prop="no" label="发票申请编号">
+          <el-input v-model="searchForm.no" placeholder="请输入发票申请编号" clearable></el-input>
+        </el-form-item>
+        <el-form-item prop="number" label="发票号">
+          <el-input v-model="searchForm.number" placeholder="请输入发票号" clearable></el-input>
+        </el-form-item>
+<!--        <el-form-item prop="programName" label="项目名称">-->
+<!--          <el-input  v-model="searchForm.programName" placeholder="请输入项目名称" clearable @clear="clearProgram">-->
+<!--            <el-button slot="append" @click="openProgramPageForm()" icon="el-icon-search"></el-button>-->
+<!--          </el-input>-->
+<!--        </el-form-item>-->
+        <el-form-item v-if="showHideItem" prop="accountBegin" label="开票总金额">
+          <el-input-number
+            v-model="searchForm.accountBegin"
+            controls-position="right"
+            :controls="false"
+            style="width:100%;"
+            :precision="2"
+            placeholder="请填写开票总金额"
+            :step="0.01"
+            :min="0"
+            clearable>
+          </el-input-number>
+        </el-form-item>
+        <el-form-item v-if="showHideItem" prop="accountEnd" label="-">
+          <el-input-number
+            v-model="searchForm.accountEnd"
+            controls-position="right"
+            :controls="false"
+            style="width:100%;"
+            :precision="2"
+            placeholder="请填写开票总金额"
+            :step="0.01"
+            :min="0"
+            clearable>
+          </el-input-number>
+        </el-form-item>
+        <el-form-item v-if="showHideItem" prop="reconciliationPeopleName" label="对账人">
+          <UserSelect :limit='1' :userName="searchForm.reconciliationPeopleName" @getValue='(value, label) => {searchForm.reconciliationPeopleName = label}'></UserSelect>
+        </el-form-item>
+        <el-form-item v-if="showHideItem" label="经办人" prop="operator">
+          <UserSelect :limit='1' :userName="searchForm.operator" @getValue='(value, label) => {searchForm.operator = label}'></UserSelect>
+        </el-form-item>
+        <el-form-item v-if="showHideItem" prop="operatorOffice" label="经办人部门">
+          <SelectTree
+            ref="officeTree"
+            :props="{
+                  value: 'id',             // ID字段名
+                  label: 'name',         // 显示名称
+                  children: 'children'    // 子级字段名
+                }"
+
+            :url="`/system-server/sys/office/treeData?type=2`"
+            :value="searchForm.operatorOffice"
+            :clearable="true"
+            :accordion="true"
+			size="default"
+            @getValue="(value) => {searchForm.operatorOffice=value}"/>
+        </el-form-item>
+        <el-form-item v-if="showHideItem" prop="billingWorkplaceReal" label="开票单位">
+          <el-input v-model="searchForm.billingWorkplaceReal" placeholder="请输入开票单位" clearable></el-input>
+        </el-form-item>
+        <el-form-item v-if="showHideItem" prop="receivablesStatus" label="是否收款">
+          <el-select v-model="searchForm.receivablesStatus" placeholder="请选择是否收款" clearable>
+            <el-option
+              v-for="item in this.$dictUtils.getDictList('collect_not')"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="showHideItem" prop="type" label="发票类型">
+          <el-select v-model="searchForm.type" placeholder="请选择发票类型" clearable>
+            <el-option
+              v-for="item in this.$dictUtils.getDictList('invoice_type')"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="showHideItem" prop="receivablesType" label="收款类型">
+          <el-select v-model="searchForm.receivablesType" placeholder="请选择收款类型" clearable>
+            <el-option
+              v-for="item in $dictUtils.getDictList('invoice_receivables_type')"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="showHideItem" prop="billingContent" label="开票内容">
+          <el-select v-model="searchForm.billingContent" placeholder="请选择开票内容" clearable>
+            <el-option
+              v-for="item in $dictUtils.getDictList('invoice_billing_content')"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="showHideItem" prop="reconciliationArea" label="对账地区">
+          <SelectTree
+            ref="areaTree"
+            :props="{
+                    value: 'id',             // ID字段名
+                    label: 'name',         // 显示名称
+                    children: 'children'    // 子级字段名
+                  }"
+            url="/system-server/sys/area/treeData"
+            :value="searchForm.reconciliationArea"
+            :clearable="true"
+            :accordion="true"
+			size="default"
+            @getValue="(value) => {searchForm.reconciliationArea=value}"/>
+        </el-form-item>
+
+        <el-form-item v-if="showHideItem" prop="billingDateList" label="开票日期">
+          <el-date-picker
+            @change="changeBillingDateList"
+            v-model="searchForm.billingDateList"
+            type="daterange"
+            value-format="yyyy-MM-dd"
+            range-separator="至"
+            style="width: 100%  "
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            placement="bottom-start"
+            clearabl>
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item v-if="showHideItem" prop="remittanceDateList" label="收款日期">
+          <el-date-picker
+            v-model="searchForm.remittanceDateList"
+            type="daterange"
+            value-format="yyyy-MM-dd"
+            range-separator="至"
+            style="width: 100%  "
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            placement="bottom-start"
+            clearable>
+          </el-date-picker>
+        </el-form-item>
+
+        <el-form-item>
+          <el-button type="default" @click="showHide" :icon="showHideIcon">{{showHideName}}</el-button>
+          <el-button type="primary" @click="refreshList()" icon="el-icon-search">查询</el-button>
+          <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>
+        </el-form-item>
+      </el-row>
+    </el-form>
+    <div class="jp-table top" style="">
+      <vxe-toolbar :refresh="{query: refreshList}" ref="toolbarRef" export custom>
+        <template #buttons>
+          <el-button v-if="hasPermission('cw_finance:invoice:add')" type="primary" icon="el-icon-plus" @click="start()">新建</el-button>
+<!--          <el-button v-if="hasPermission('cw_finance:invoice:del')" type="danger"   icon="el-icon-delete" @click="del()" :disabled="$refs.invoiceTable && $refs.invoiceTable.getCheckboxRecords().length === 0" plain>删除</el-button>-->
+        </template>
+		  <template #tools>
+			  <vxe-button
+				  text
+				  type="primary"
+				  :title="searchVisible ? '收起检索' : '展开检索'"
+				  icon="vxe-icon-search"
+				  class="tool-btn"
+				  @click="searchVisible = !searchVisible"
+			  ></vxe-button>
+		  </template>
+      </vxe-toolbar>
+      <div style="height: calc(100% - 80px)">
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="auto"
+          :loading="loading"
+          ref="invoiceTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          @sort-change="sortChangeHandle"
+          :export-config="{
+                    remote: true,
+                    filename: `兴光会计发票数据${moment(new Date()).format('YYYY-MM-DD')}`,
+                    sheetName: `兴光会计发票数据${moment(new Date()).format('YYYY-MM-DD')}`,
+                    exportMethod: exportMethod,
+                    types: ['xlsx'],
+                    modes: ['current', 'selected', 'all']
+                  }"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :checkbox-config="{}">
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="checkbox" width="40" ></vxe-column>
+          <vxe-column min-width="150" title="项目名称" align="center" field="programName">
+            <template #default="scope">
+              <el-link  type="primary" :underline="false" @click="viewProject(scope.row.id)">{{scope.row.programName}}</el-link>
+            </template>
+          </vxe-column>
+          <vxe-column min-width="150" title="发票申请编号" align="center" field="no">
+            <template #default="scope">
+              <el-link  type="primary" :underline="false" @click="view(false, scope.row.id)">{{scope.row.no}}</el-link>
+            </template>
+          </vxe-column>
+          <vxe-column min-width="150" title="发票号" align="center" field="number"></vxe-column>
+          <vxe-column min-width="150" title="实际开票单位" align="center" field="billingWorkplaceReal"></vxe-column>
+          <vxe-column min-width="150" title="经办人" align="center" field="operator"></vxe-column>
+          <vxe-column min-width="150" title="经办人部门" align="center" field="operatorOffice"></vxe-column>
+          <vxe-column min-width="150" title="开票总金额(元)" align="center" field="account"></vxe-column>
+          <vxe-column min-width="150" title="发票金额(元)" align="center" field="accountDetail"></vxe-column>
+          <vxe-column min-width="120" title="开票内容" align="center" field="billingContent">
+            <template #default="scope">
+              {{$dictUtils.getDictLabel('invoice_billing_content', scope.row.billingContent, '')}}
+            </template>
+          </vxe-column>
+          <vxe-column min-width="100" title="收款类型" align="center" field="receivablesType">
+            <template #default="scope">
+              {{$dictUtils.getDictLabel('invoice_receivables_type', scope.row.receivablesType, '')}}
+            </template>
+          </vxe-column>
+          <vxe-column min-width="100" title="发票类型" align="center" field="type">
+            <template #default="scope">
+              {{$dictUtils.getDictLabel('invoice_type', scope.row.type, '')}}
+            </template>
+          </vxe-column>
+          <vxe-column min-width="120" title="开票日期" align="center" field="billingDate"></vxe-column>
+          <vxe-column min-width="120" title="收款日期" align="center" field="receivablesDate"></vxe-column>
+          <vxe-column min-width="110" fixed="right" align="center" title="是否收款" field="receivablesStatus">
+            <template #default="scope">
+              {{$dictUtils.getDictLabel('collect_not', scope.row.receivablesStatus, '')}}
+            </template>
+          </vxe-column>
+          <vxe-column min-width="110" fixed="right" align="center" title="是否作废" field="invalidStatus">
+            <template #default="scope">
+              {{scope.row.invalidStatus === '1'?'已作废':'未作废'}}
+            </template>
+          </vxe-column>
+          <vxe-column  min-width="110px" fixed="right" align="center" title="状态" field="status" >
+            <template #default="scope">
+              <el-button @click="invoiceDetail(scope.row)" :type="$dictUtils.getDictLabel('invoice_status_info', scope.row.status, '')" effect="dark" >{{$dictUtils.getDictLabel("invoice_status", scope.row.status, '')}} </el-button>
+            </template>
+          </vxe-column>
+          <vxe-column min-width="300" title="操作"  fixed="right" align="center">
+            <template  #default="scope">
+              <div v-if="isAdmin">
+                <el-button v-if="(scope.row.status === '5')" text type="primary"  @click="editForm(scope.row.id)">修改</el-button>
+                <el-button v-if="(scope.row.status === '5')" text type="primary"  @click="del(scope.row.id)">删除</el-button>
+              </div>
+              <div v-else>
+              <el-button v-if="hasPermission('cw_finance:invoice:edit')&&scope.row.createBy.id === $store.state.user.id&&(scope.row.status === '1'||scope.row.status === '3')" text type="primary" @click="invoicePush(scope.row)">修改</el-button>
+              <el-button v-if="hasPermission('cw_finance:invoice:edit')&&scope.row.createBy.id === $store.state.user.id&&scope.row.status === '2'" text type="primary"  @click="invoiceReback(scope.row)">撤回</el-button>
+              <el-button v-if="hasPermission('cw_finance:invoice:edit:detail')&&scope.row.status === '5'&&scope.row.receivablesStatus !== '1'" text type="primary"  @click="editDetail(scope.row.id)">修改发票明细</el-button>
+              <el-button v-if="hasPermission('cw_finance:invoice:edit:receivables')&&scope.row.status === '5'&&scope.row.receivablesStatus !== '1'" text type="primary"  @click="view(true, scope.row.id)">收款</el-button>
+              <el-button v-if="hasPermission('cw_finance:invoice:edit:is_receivables')&&scope.row.status === '5'&&scope.row.receivablesStatus !== '1'" text type="primary"  @click="isReceivables(scope.row)">确认收款</el-button>
+              <el-button v-if="hasPermission('cw_finance:invoice:edit:is_receivables')&&scope.row.status === '5'&&scope.row.receivablesStatus === '1'" text type="primary" @click="recallReceivables(scope.row)">撤回收款</el-button>
+              <el-button v-if="hasPermission('cw_finance:invoice:edit')&&scope.row.createBy.id === $store.state.user.id&&(scope.row.status === '5'||scope.row.status === '7')" text type="primary"  @click="invoiceInvalidPush(scope.row)">作废</el-button>
+              <el-button v-if="hasPermission('cw_finance:invoice:edit')&&scope.row.createBy.id === $store.state.user.id&&scope.row.status === '6'" text type="primary" @click="invoiceInvalidReBack(scope.row)">作废撤回</el-button>
+              <el-button v-if="hasPermission('cw_finance:invoice:edit')&&scope.row.createBy.id === $store.state.user.id&&(scope.row.status === '1'||scope.row.status === '3')" text type="primary"  @click="del(scope.row.id)">删除</el-button>
+<!--              审核  发票申请-->
+              <el-button v-if="scope.row.status==='2' && checkIsAudit(scope.row)" text type="primary"  @click="examine(scope.row)">审核</el-button>
+<!--              被驳回后当前申请人重新调整  发票申请-->
+              <el-button v-if="scope.row.createBy.id === $store.state.user.id&&scope.row.status === '4'" text type="primary"  @click="adjust(scope.row)">驳回调整</el-button>
+<!--              审核  发票作废-->
+              <el-button v-if="scope.row.status==='6' && checkIsAuditInvalid(scope.row)" text type="primary"  @click="examineInvalid(scope.row)">作废审核</el-button>
+<!--              被驳回后当前申请人重新调整  发票作废-->
+              <el-button v-if="scope.row.createBy.id === $store.state.user.id&&scope.row.status === '8'" text type="primary" @click="adjustInvalid(scope.row)">驳回调整</el-button>
+              </div>
+            </template>
+          </vxe-column>
+        </vxe-table>
+        <vxe-pager
+          background
+          :current-page="tablePage.currentPage"
+          :page-size="tablePage.pageSize"
+          :total="tablePage.total"
+          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+          @page-change="currentChangeHandle">
+        </vxe-pager>
+      </div>
+    </div>
+    <InvoiceForm  ref="invoiceForm" @refreshDataList="refreshList"></InvoiceForm>
+    <ProgramPageForm ref="programPageForm" @getProgram="getProgram"></ProgramPageForm>
+    <ProgramForm ref="programForm"></ProgramForm>
+    <InvoiceUpdateForm ref="invoiceUpdateForm" @refreshDataList="refreshList"></InvoiceUpdateForm>
+  </div>
+</template>
+
+<script>
+  import financeInvoiceService from '@/api/cw/invoice/CwFinanceInvoiceService'
+  import ProgramForm from './ProgramForm'
+  import InvoiceForm from './InvoiceForm'
+  import pick from 'lodash.pick'
+  import taskService from '@/api/flowable/TaskService'
+  import processService from '@/api/flowable/ProcessService'
+  import userService from '@/api/sys/UserService'
+  import UserSelect from '@/components/userSelect'
+  import SelectTree from '@/components/treeSelect/treeSelect.vue'
+  import ProgramPageForm from '@/views/finance/invoice/ProgramPageForm'
+  import InvoiceUpdateForm from './InvoiceUpdateForm'
+  export default {
+    data () {
+      return {
+		searchVisible: true,
+        showHideItem: false,
+        showHideIcon: 'el-icon-arrow-down',
+        showHideName: '展示',
+        searchForm: {
+          number: '',
+          accountBegin: undefined,
+          accountEnd: undefined,
+          billingDateList: [],
+          billingDateBegin: '',
+          billingDateEnd: '',
+          remittanceDateList: [],
+          remittanceDateBegin: '',
+          remittanceDateEnd: '',
+          programName: '',
+          programId: '',
+          reconciliationPeopleName: '',
+          operator: '',
+          operatorOffice: ''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        loading: false,
+        processDefinitionId: '',
+        procDefKey: '',
+        processDefinitionInvalidId: '',
+        procDefInvalidKey: '',
+        isAdmin: false
+      }
+    },
+    computed: {
+      userName () {
+        return this.$store.state.user.name
+      }
+    },
+    created () {
+    },
+    components: {
+      InvoiceForm,
+      UserSelect,
+      SelectTree,
+      ProgramPageForm,
+      ProgramForm,
+      InvoiceUpdateForm
+    },
+    mounted () {
+		this.$nextTick(() => {
+			//将表格和工具栏进行关联
+			const $table = this.$refs.invoiceTable;
+			const $toolbar = this.$refs.toolbarRef;
+			$table.connect($toolbar);
+		})
+      this.refreshList()
+    },
+    activated () {
+      this.refreshList()
+    },
+    methods: {
+      showHide () {
+        if (this.showHideItem === false) {
+          this.showHideItem = true
+          this.showHideIcon = 'el-icon-arrow-up'
+          this.showHideName = '隐藏'
+        } else {
+          this.showHideItem = false
+          this.showHideIcon = 'el-icon-arrow-down'
+          this.showHideName = '展示'
+        }
+      },
+      // 查询当前用户是否是管理员用户
+      checkIsAdmin () {
+        userService.is().then((data) => {
+          this.isAdmin = data
+        })
+      },
+      // 新增
+      add () {
+        this.$refs.invoiceForm.init('add', '')
+      },
+      editForm (id) {
+        this.$refs.invoiceUpdateForm.init('edit', id)
+      },
+      // 修改发票明细
+      editDetail (id) {
+        id = id || this.$refs.invoiceTable.getCheckboxRecords().map(item => {
+          return item.id
+        })[0]
+        this.$refs.invoiceForm.init(false, id, true)
+      },
+      // 查看 flag为true时,弹窗为收款,其他值为查看发票详情
+      view (flag, id) {
+        this.$refs.invoiceForm.init(flag, id)
+      },
+      // 查看项目数据
+      viewProject (id) {
+        this.$refs.programForm.init(id)
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        if (!this.commonJS.isEmpty(this.searchForm.billingDateList)) {
+          if (!this.commonJS.isEmpty(this.searchForm.billingDateList[0]) && !this.commonJS.isEmpty(this.searchForm.billingDateList[1])) {
+            this.searchForm.billingDateBegin = this.searchForm.billingDateList[0]
+            this.searchForm.billingDateEnd = this.searchForm.billingDateList[1]
+          }
+        } else {
+          this.searchForm.billingDateBegin = ''
+          this.searchForm.billingDateEnd = ''
+        }
+        if (!this.commonJS.isEmpty(this.searchForm.remittanceDateList)) {
+          if (!this.commonJS.isEmpty(this.searchForm.remittanceDateList[0]) && !this.commonJS.isEmpty(this.searchForm.remittanceDateList[1])) {
+            this.searchForm.remittanceDateBegin = this.searchForm.remittanceDateList[0]
+            this.searchForm.remittanceDateEnd = this.searchForm.remittanceDateList[1]
+          }
+        } else {
+          this.searchForm.remittanceDateBegin = ''
+          this.searchForm.remittanceDateEnd = ''
+        }
+        financeInvoiceService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          this.dataList = data.records
+          this.dataList.forEach(item => {
+            item.account = parseFloat(item.account).toFixed(2)
+            if (!this.commonJS.isEmpty(item.financeInvoiceBaseDTOList)) {
+              let pName = ''
+              if (this.commonJS.isNotEmpty(item.financeInvoiceBaseDTOList)) {
+                if (item.financeInvoiceBaseDTOList.length === 1) {
+                  if (this.commonJS.isEmpty(item.financeInvoiceBaseDTOList[0].programId)) {
+                    pName = '其他: '
+                  }
+                }
+              }
+              item.financeInvoiceBaseDTOList.forEach((program, index) => {
+                if ((index + 1) !== item.financeInvoiceBaseDTOList.length) {
+                  pName = pName + program.programName + ','
+                } else {
+                  pName = pName + program.programName
+                }
+              })
+              item.programName = pName
+            } else {
+              item.programName = ''
+            }
+            // if (!this.commonJS.isEmpty(item.financeInvoiceDetailDTOList)) {
+            //   item.accountDetail = 0
+            //   let num = ''
+            //   item.financeInvoiceDetailDTOList.forEach((detail, index) => {
+            //     if (!this.commonJS.isEmpty(detail.account)) {
+            //       item.accountDetail = parseFloat(parseFloat(item.accountDetail) + parseFloat(detail.account)).toFixed(2)
+            //     }
+            //     if ((index + 1) !== item.financeInvoiceDetailDTOList.length) {
+            //       num = num + detail.number + ','
+            //     } else {
+            //       num = num + detail.number
+            //     }
+            //   })
+            //   item.number = num
+            // } else {
+            //   item.number = ''
+            //   item.accountDetail = ''
+            // }
+          })
+          this.tablePage.total = data.total
+          this.loading = false
+        })
+        this.checkIsAdmin()
+        processService.getByName('会计-发票申请').then((data) => {
+          if (!this.commonJS.isEmpty(data.id)) {
+            this.processDefinitionId = data.id
+            this.procDefKey = data.key
+          }
+        })
+        processService.getByName('会计-发票作废').then((data) => {
+          if (!this.commonJS.isEmpty(data.id)) {
+            this.processDefinitionInvalidId = data.id
+            this.procDefInvalidKey = data.key
+          }
+        })
+      },
+      // 当前页
+      currentChangeHandle ({ currentPage, pageSize }) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.refreshList()
+      },
+      // 排序
+      sortChangeHandle (column) {
+        this.tablePage.orders = []
+        if (column.order != null) {
+          this.tablePage.orders.push({column: this.$utils.toLine(column.property), asc: column.order === 'asc'})
+        }
+        this.refreshList()
+      },
+      // 删除
+      del (id) {
+        let ids = id || this.$refs.invoiceTable.getCheckboxRecords().map(item => {
+          return item.id
+        }).join(',')
+        this.$confirm(`确定删除所选项吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.loading = true
+          financeInvoiceService.delete(ids).then((data) => {
+            this.$message.success(data)
+            this.refreshList()
+            this.loading = false
+          })
+        })
+      },
+      resetSearch () {
+        this.searchForm = {
+          number: '',
+          accountBegin: undefined,
+          accountEnd: undefined,
+          billingDateList: [],
+          billingDateBegin: '',
+          billingDateEnd: '',
+          remittanceDateList: [],
+          remittanceDateBegin: '',
+          remittanceDateEnd: '',
+          programName: '',
+          programId: '',
+          reconciliationPeopleName: '',
+          operator: '',
+          operatorOffice: ''
+        }
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      },
+      start () {
+        // 读取流程表单
+        let tabTitle = `发起流程【会计-发票申请】`
+        let processTitle = `${this.userName} 在 ${this.moment(new Date()).format('YYYY-MM-DD HH:mm')} 发起了 [会计-发票申请]`
+        taskService.getTaskDef({ procDefId: this.processDefinitionId,
+          status: 'startAndHold'}).then((data) => {
+            this.$router.push({
+              path: '/flowable/task/TaskForm',
+              query: {
+                ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                procDefId: this.processDefinitionId,
+                procDefKey: this.procDefKey,
+                status: 'startAndHold',
+                title: tabTitle,
+                formType: data.formType,
+                formUrl: data.formUrl,
+                formTitle: processTitle,
+                businessId: 'false',
+                isShow: false,
+                routePath: '/cw/invoice/InvoiceList'
+              }
+            })
+          })
+      },
+      // 发起发票申请审批
+      invoicePush (row) {
+        // 读取流程表单
+        let title = `发起流程【会计-发票申请】`
+        let processTitle = `${this.userName} 在 ${this.moment(new Date()).format('YYYY-MM-DD HH:mm')} 发起了[会计-发票申请]`
+        let status = 'startAndHold'
+        if (row.status === '3') {
+          status = 'startAndClose'
+        } else if (row.status === '4') {
+          status = 'reapplyFlag'
+        }
+        taskService.getTaskDef({ procDefId: this.processDefinitionId,
+          businessId: row.id,
+          businessTable: 'cw_finance_invoice'}).then((data) => {
+            this.$router.push({
+              path: '/flowable/task/TaskForm',
+              query: {
+                ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                procDefId: this.processDefinitionId,
+                procDefKey: this.procDefKey,
+                title: title,
+                formType: data.formType,
+                formUrl: data.formUrl,
+                formTitle: processTitle,
+                businessTable: 'finance_invoice',
+                businessId: row.id,
+                isShow: 'false',
+                status: status,
+                routePath: '/cw/invoice/InvoiceList'
+              }
+            })
+          })
+      },
+      // 发起发票作废审批
+      invoiceInvalidPush (row) {
+        // 读取流程表单
+        let title = `发起流程【发票作废】`
+        let processTitle = `${this.userName} 发起了 ${row.no} [发票作废]`
+        let status = 'startAndHold'
+        if (row.status === '7') {
+          status = 'startAndClose'
+        } else if (row.status === '8') {
+          status = 'reapplyFlag'
+        }
+        taskService.getTaskDef({ procDefId: this.processDefinitionInvalidId,
+          businessId: row.financeInvoiceInvalidDTO.id,
+          businessTable: 'cw_finance_invoice_invalid'}).then((data) => {
+            this.$router.push({
+              path: '/flowable/task/TaskForm',
+              query: {
+                ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                procDefId: this.processDefinitionInvalidId,
+                procDefKey: this.procDefInvalidKey,
+                title: title,
+                formType: data.formType,
+                formUrl: data.formUrl,
+                formTitle: processTitle,
+                businessTable: 'cw_finance_invoice_invalid',
+                businessId: row.financeInvoiceInvalidDTO.id,
+                isShow: 'false',
+                status: status,
+                routePath: '/cw/invoice/InvoiceList'
+              }
+            })
+          })
+      },
+      // 查看发票申请审批流程结果
+      invoiceDetail (row) {
+        if (row.status !== '0' && row.status !== '1') {
+          if (row.status === '6' || row.status === '7' || row.status === '8' || row.status === '9') {
+            this.invoiceInvalidDetail(row)
+          } else {
+            taskService.getTaskDef({
+              procInsId: row.procInsId,
+              procDefId: this.processDefinitionId
+            }).then((data) => {
+              this.$router.push({
+                path: '/flowable/task/TaskFormDetail',
+                query: {
+                  ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                  isShow: 'false',
+                  readOnly: true,
+                  title: '会计-发票申请' + '流程详情',
+                  formTitle: '会计-发票申请' + '流程详情',
+                  businessId: row.id,
+                  status: 'reback'
+                }
+              })
+            })
+          }
+        }
+      },
+      // 查看发票作废审批流程结果
+      invoiceInvalidDetail (row) {
+        taskService.getTaskDef({
+          procInsId: row.financeInvoiceInvalidDTO.procInsId,
+          procDefId: this.processDefinitionInvalidId
+        }).then((data) => {
+          this.$router.push({
+            path: '/flowable/task/TaskFormDetail',
+            query: {
+              ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+              isShow: 'false',
+              readOnly: true,
+              title: '发票作废' + '流程详情',
+              formTitle: '发票作废' + '流程详情',
+              businessId: row.financeInvoiceInvalidDTO.id,
+              status: 'reback'
+            }
+          })
+        })
+      },
+      // 撤回发票申请审批
+      invoiceReback (row) {
+        this.$confirm(`确定要撤回该申请吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(async () => {
+          await financeInvoiceService.queryById(row.id).then((data) => {
+            if (data.status !== '2') { // status的值不等于“审核中”,就弹出提示
+              this.$message.error('数据已发生改变或不存在,请刷新数据')
+              this.refreshList()
+            } else {
+              processService.revokeProcIns(row.procInsId).then(async (data) => {
+                let form = {status: '3', id: row.id}
+                await financeInvoiceService.updateStatusById(form)
+                this.$message.success(data)
+                this.refreshList()
+              })
+            }
+          })
+        })
+      },
+      invoiceInvalidReBack (row) {
+        this.$confirm(`确定要撤回该申请吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(async () => {
+          await financeInvoiceService.queryById(row.id).then((data) => {
+            if (data.status !== '6') { // status的值不等于“审核中”,就弹出提示
+              this.$message.error('数据已发生改变或不存在,请刷新数据')
+              this.refreshList()
+            } else {
+              processService.revokeProcIns(row.financeInvoiceInvalidDTO.procInsId).then(async (data) => {
+                let form = {status: '5', id: row.id}
+                await financeInvoiceService.updateStatusById(form)
+                this.$message.success(data)
+                this.refreshList()
+              })
+            }
+          })
+        })
+      },
+      isReceivables (row) {
+        this.$confirm(`确定要确认收款吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          let param = {id: row.id, receivablesStatus: '1'}
+          financeInvoiceService.isReceivables(param).then((data) => {
+            this.$message.success(data)
+            this.refreshList()
+          })
+        })
+      },
+      recallReceivables (row) {
+        this.$confirm(`确定要撤回收款吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          let param = {id: row.id, receivablesStatus: '0'}
+          financeInvoiceService.isReceivables(param).then((data) => {
+            this.$message.success(data)
+            this.refreshList()
+          })
+        })
+      },
+      changeBillingDateList (event) {
+        if (this.commonJS.isNotEmpty(this.searchForm.billingDateList)) {
+          console.log('event', event)
+        }
+      },
+      openProgramPageForm () {
+        this.$refs.programPageForm.init('1', false)
+      },
+      getProgram (rows) {
+        if (this.commonJS.isNotEmpty(rows)) {
+          this.searchForm.programName = rows[0].name
+          this.searchForm.programId = rows[0].id
+        }
+      },
+      clearProgram () {
+        this.searchForm.programName = ''
+        this.searchForm.programId = ''
+      },
+      // 自定义服务端导出
+      exportMethod ({ options }) {
+        // 传给服务端的参数
+        const params = {
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm,
+          filename: options.filename,
+          sheetName: options.sheetName,
+          isHeader: options.isHeader,
+          original: options.original,
+          mode: options.mode,
+          selectIds: options.mode === 'selected' ? options.map(item => item.id) : [],
+          exportFields: options.columns.map(column => column.property)
+        }
+        return financeInvoiceService.exportFile(params).then((res) => {
+          // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(res, options.filename)
+        }).catch(function (err) {
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      },
+      // 驳回后调整
+      adjust (row) {
+        financeInvoiceService.queryById(row.id).then((data) => {
+          if (data.status !== '4') { // status的值不等于“驳回”,就弹出提示
+            this.$message.error('数据已发生改变或不存在,请刷新数据')
+            this.refreshList()
+          } else {
+            this.todo(row)
+          }
+        })
+      },
+      // 审核
+      examine (row) {
+        financeInvoiceService.queryById(row.id).then((data) => {
+          if (data.status !== '2') { // status的值不等于“审核中”,就弹出提示
+            this.$message.error('数据已发生改变或不存在,请刷新数据')
+            this.refreshList()
+          } else {
+            this.todo(row)
+          }
+        })
+      },
+      // 审核或重新调整跳转
+      todo (row) {
+        let cUser = false
+        taskService.getTaskDefInfo({
+          taskId: row.taskId
+        }).then((data) => {
+          this.$router.push({
+            path: '/flowable/task/TaskForm',
+            query: {
+              ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title', 'businessId'),
+              isShow: false,
+              formReadOnly: true,
+              formTitle: `${data.taskName}`,
+              cUser: cUser,
+              title: `审批【${data.taskName || ''}】`,
+              routePath: '/cw/invoice/InvoiceList'   // 数据处理后需要跳转的页面路径
+            }
+          })
+        })
+      },
+      // 查询当前登录人是否是数据的审核人
+      checkIsAudit (row) {
+        let loginUserId = this.$store.state.user.id  // 获取当前登录用户id
+        if (this.commonJS.isNotEmpty(row.auditUserIds)) {
+          for (const userId of row.auditUserIds) {
+            if (userId === loginUserId) {  // 当数据的审核人中包含当前登录人id时,返回true
+              return true
+            }
+          }
+        }
+        return false
+      },
+      // 驳回后调整
+      adjustInvalid (row) {
+        financeInvoiceService.queryById(row.id).then((data) => {
+          if (data.status !== '8') { // status的值不等于“驳回”,就弹出提示
+            this.$message.error('数据已发生改变或不存在,请刷新数据')
+            this.refreshList()
+          } else {
+            this.todoInvalid(row)
+          }
+        })
+      },
+      // 审核
+      examineInvalid (row) {
+        financeInvoiceService.queryById(row.id).then((data) => {
+          if (data.status !== '6') { // status的值不等于“审核中”,就弹出提示
+            this.$message.error('数据已发生改变或不存在,请刷新数据')
+            this.refreshList()
+          } else {
+            this.todoInvalid(row)
+          }
+        })
+      },
+      // 审核或重新调整跳转
+      todoInvalid (row) {
+        let cUser = false
+        taskService.getTaskDefInfo({
+          taskId: row.invalidTaskId
+        }).then((data) => {
+          this.$router.push({
+            path: '/flowable/task/TaskForm',
+            query: {
+              ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title', 'businessId'),
+              isShow: false,
+              formReadOnly: true,
+              formTitle: `${data.taskName}`,
+              cUser: cUser,
+              title: `审批【${data.taskName || ''}】`,
+              routePath: '/cw/invoice/InvoiceList'   // 数据处理后需要跳转的页面路径
+            }
+          })
+        })
+      },
+      // 查询当前登录人是否是数据的审核人
+      checkIsAuditInvalid (row) {
+        let loginUserId = this.$store.state.user.id  // 获取当前登录用户id
+        if (this.commonJS.isNotEmpty(row.auditUserIdsInvalid)) {
+          for (const userId of row.auditUserIdsInvalid) {
+            if (userId === loginUserId) {  // 当数据的审核人中包含当前登录人id时,返回true
+              return true
+            }
+          }
+        }
+        return false
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-input-number .el-input__inner {
+    text-align: left;
+  }
+</style>

Plik diff jest za duży
+ 1597 - 0
src/views/cw/invoice/InvoiceUpdateForm.vue


+ 652 - 0
src/views/cw/invoice/ProgramForm.vue

@@ -0,0 +1,652 @@
+<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+	  draggable
+      width="1300px"
+      @close="close"
+      append-to-body
+      @keyup.enter.native="doSubmit"
+      v-model="visible">
+      <el-form :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"
+               label-width="160px" @submit.native.prevent>
+        <el-row  :gutter="15" v-if="baseFlag !== true">
+          <el-col :span="24">
+			  <vxe-table
+				  border
+				  show-overflow
+				  show-footer
+				  ref="baseTable"
+				  class="vxe-table-element"
+				  :data="inputForm.financeInvoiceBaseDTOList"
+				  style="margin-left: 5em"
+				  highlight-current-row
+				  :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+			  >
+				  <vxe-table-column field="programName" align="center" title="项目名称">
+					  <template #default="scope">
+						  <el-link type="primary" :underline="false" @click="openProjectForm(scope.row.programId)" >{{scope.row.programName}}</el-link>
+					  </template>
+				  </vxe-table-column>
+				  <vxe-table-column field="contractName" align="center" title="合同名称"></vxe-table-column>
+				  <vxe-table-column field="programNo" align="center" title="项目编号"></vxe-table-column>
+				  <!--            <vxe-table-column field="clientName" align="center" title="委托方"></vxe-table-column>-->
+				  <!--            <vxe-table-column field="reportNo" title="报告号" :edit-render="{}">-->
+				  <!--              <template v-slot:edit="scope">-->
+				  <!--                <el-input v-model="scope.row.reportNo" placeholder="请填写报告号"/>-->
+				  <!--              </template>-->
+				  <!--            </vxe-table-column>-->
+				  <!--            <vxe-table-column title="操作" width="100">-->
+				  <!--              <template v-slot="scope">-->
+				  <!--                <el-button size="mini" type="danger" @click="removeEvent(scope.row,scope.$rowIndex,'base')">删除</el-button>-->
+				  <!--              </template>-->
+				  <!--            </vxe-table-column>-->
+			  </vxe-table>
+		  </el-col>
+        </el-row>
+        <el-row :gutter="15" v-if="baseFlag === true">
+          <el-form-item label="开票详情" prop="">
+          <el-input :readonly="true" type="textarea" maxlength="500" v-model="programName"></el-input>
+          </el-form-item>
+        </el-row>
+      </el-form>
+		<template #footer>
+			<span slot="footer" class="dialog-footer">
+			  <el-button @click="close()" icon="el-icon-circle-close">关闭</el-button>
+						<!--      <el-button size="small" type="primary" v-if="method != 'view'||receivablesFlag!==true" @click="doSubmit()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>-->
+						<!--      <el-button size="small" type="primary" v-if="receivablesFlag===true" @click="doSubmit()" icon="el-icon-circle-check" v-noMoreClick>保留</el-button>-->
+			</span>
+		</template>
+
+    </el-dialog>
+    <ProgramPageForm ref="programPageForm" @getProgram="getProgram"></ProgramPageForm>
+    <ContractForm  ref="contractForm" @getContract="getContract"></ContractForm>
+    <WorkClientForm  ref="workClientForm" @getWorkClient="getWorkClient"></WorkClientForm>
+    <ProjectForm ref="projectForm"></ProjectForm>
+  </div>
+</template>
+
+<script>
+  import financeInvoiceService from '@/api/cw/invoice/CwFinanceInvoiceService'
+  import workClientService from '@/api/cw/workClientInfo/WorkClientService'
+  import ProjectForm from '@/views/cw/projectRecords/ProjectRecordsForm'
+  import ProgramPageForm from '@/views/cw/invoice/ProgramPageForm'
+  import UpLoadComponent from '@/views/common/UpLoadComponent'
+  import ContractForm from '@/views/cw/invoice/ContractForm'
+  import WorkClientForm from '@/views/cw/invoice/WorkClientForm'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          id: '',
+          financeInvoiceBaseDTOList: [],
+          programName: '',
+          contractName: '',
+          programNo: '',
+          clientName: '',
+          reportNo: '',
+          type: '1',
+          no: '',
+          billingType: '1',
+          billingWorkplaceReal: '',
+          billingWorkplaceRealId: '',
+          taxpayerIdentificationNo: '',
+          address: '',
+          telPhone: '',
+          openBank: '',
+          bankAccount: '',
+          receivablesType: '2',
+          billingContent: '',
+          account: '',
+          billingContentTerms: '',
+          billingPeople: this.$store.state.user.name,
+          billingPeopleId: this.$store.state.user.id,
+          billingDate: '',
+          collectDate: '',
+          billingPeopleReal: this.$store.state.user.id,
+          reconciliationPeople: '',
+          reconciliationArea: '',
+          remarks: '',
+          name: '',
+          status: '',
+          procInsId: '',
+          processDefinitionId: '',
+          workAttachmentDtoList: [],
+          financeInvoiceDetailDTOList: [],
+          financeInvoiceReceivablesDTOList: [],
+          financeInvoiceInvalidDTO: {}
+        },
+        programRow: '',
+        bankList: [],
+        err: '',
+        receivablesFlag: '', // true为收款,false为非收款
+        detailFlag: '', // true为修改发票明细
+        importVisible: false,
+        baseFlag: false,
+        programName: ''
+      }
+    },
+    created () {
+    },
+    components: {
+      ProgramPageForm,
+      ContractForm,
+      WorkClientForm,
+      UpLoadComponent,
+      ProjectForm
+    },
+    methods: {
+      init (id) {
+        this.method = 'view'
+        this.title = '查看项目信息'
+        this.inputForm = {
+          id: '',
+          financeInvoiceBaseDTOList: [],
+          programName: '',
+          contractName: '',
+          programNo: '',
+          clientName: '',
+          reportNo: '',
+          type: '1',
+          no: '',
+          billingType: '1',
+          billingWorkplaceReal: '',
+          billingWorkplaceRealId: '',
+          taxpayerIdentificationNo: '',
+          address: '',
+          telPhone: '',
+          openBank: '',
+          bankAccount: '',
+          receivablesType: '2',
+          billingContent: '',
+          account: '',
+          billingContentTerms: '',
+          billingPeople: this.$store.state.user.name,
+          billingPeopleId: this.$store.state.user.id,
+          billingDate: '',
+          collectDate: '',
+          billingPeopleReal: this.$store.state.user.id,
+          reconciliationPeople: '',
+          reconciliationArea: '',
+          remarks: '',
+          name: '',
+          status: '',
+          procInsId: '',
+          processDefinitionId: '',
+          workAttachmentDtoList: [],
+          financeInvoiceDetailDTOList: [],
+          financeInvoiceReceivablesDTOList: [],
+          financeInvoiceInvalidDTO: {
+            id: '',
+            invalidStatus: '',
+            invoiceId: '',
+            remarks: ''
+          }
+        }
+        this.baseFlag = false
+        this.inputForm.id = id
+        this.visible = true
+        this.loading = false
+        this.$nextTick(() => {
+          this.$refs.inputForm.resetFields()
+          this.loading = true
+          financeInvoiceService.queryById(this.inputForm.id).then((data) => {
+            this.inputForm = this.recover(this.inputForm, data)
+            this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+            if (!this.commonJS.isEmpty(this.inputForm.billingWorkplaceRealId)) {
+              workClientService.queryById(this.inputForm.billingWorkplaceRealId).then((data) => {
+                this.bankList = data.workClientBank
+              })
+            }
+            if (this.commonJS.isEmpty(this.inputForm.financeInvoiceReceivablesDTOList) || this.inputForm.financeInvoiceReceivablesDTOList.length === 0) {
+              this.inputForm.financeInvoiceReceivablesDTOList = []
+            }
+            if (this.commonJS.isEmpty(this.inputForm.workAttachmentDtoList)) {
+              this.inputForm.workAttachmentDtoList = []
+            }
+            if (this.commonJS.isNotEmpty(this.inputForm.financeInvoiceBaseDTOList)) {
+              if (this.inputForm.financeInvoiceBaseDTOList.length === 1 && this.commonJS.isEmpty(this.inputForm.financeInvoiceBaseDTOList[0].programId)) {
+                this.baseFlag = true
+                this.programName = this.inputForm.financeInvoiceBaseDTOList[0].programName
+              }
+            }
+            this.loading = false
+          })
+        })
+      },
+      openProjectForm (id) {
+        this.$refs.projectForm.init('view', id)
+      },
+      // 表单提交
+      async doSubmit () {
+        if (this.commonJS.isEmpty(this.inputForm.financeInvoiceBaseDTOList)) {
+          this.$message.error('至少新增一条基本信息')
+          return
+        } else {
+          if (this.inputForm.financeInvoiceBaseDTOList.length === 0) {
+            this.$message.error('至少新增一条基本信息')
+            return
+          }
+        }
+        let acc = 0
+        this.inputForm.financeInvoiceDetailDTOList.forEach((item, index) => {
+          if (this.commonJS.isEmpty(item.number)) {
+            this.$message.warning('发票明细中第 ' + (index + 1) + ' 条数据的 “发票号” 为空')
+            throw new Error()
+          }
+          if (this.commonJS.isEmpty(item.account)) {
+            this.$message.warning('发票明细中第 ' + (index + 1) + ' 条数据的 “开票金额” 为空')
+            throw new Error()
+          }
+          acc = (acc + parseFloat(parseFloat(item.account).toFixed(2)))
+        })
+        if (acc !== this.inputForm.account) {
+          this.$message.warning('发票明细中 “开票金额”总和 与发票详情中 “发票金额” 不等')
+          return
+        }
+        this.inputForm.financeInvoiceDetailDTOList.forEach((item, index) => {
+          this.inputForm.financeInvoiceDetailDTOList.forEach((item2, index2) => {
+            if (index !== index2) {
+              if (item.number === item2.number) {
+                this.$message.warning('发票明细中第 ' + (index + 1) + ' 条数据的 “发票号” 存在重复')
+                throw new Error()
+              }
+            }
+          })
+        })
+        for await (let [index, item] of this.inputForm.financeInvoiceDetailDTOList.entries()) {
+          if (this.commonJS.isEmpty(item.number)) {
+            this.$message.warning('发票明细中第 ' + (index + 1) + ' 条数据的 “发票号” 为空')
+            this.err = true
+          }
+          await financeInvoiceService.queryByNumber(item.number, item.id).then((data) => {
+            if (data === true) {
+              this.$message.warning('发票明细中第 ' + (index + 1) + ' 条数据的 “发票号” 存在重复')
+              this.err = data
+            }
+          })
+        }
+        if (this.err === true) {
+          this.err = ''
+          return
+        }
+        if (this.receivablesFlag === true) {
+          this.inputForm.financeInvoiceReceivablesDTOList.forEach((item, index) => {
+            if (this.commonJS.isEmpty(item.remittanceUnit)) {
+              this.$message.warning('收款明细中第 ' + (index + 1) + ' 条数据的 “汇款单位” 为空,请重新输入')
+              throw new Error()
+            }
+            if (this.commonJS.isEmpty(item.remittanceAmount) || item.remittanceAmount === 0 || item.remittanceAmount === '0') {
+              this.$message.warning('收款明细中第 ' + (index + 1) + ' 条数据的 “汇款金额” 为空,请重新输入')
+              throw new Error()
+            }
+            if (this.commonJS.isEmpty(item.remittanceDate)) {
+              this.$message.warning('收款明细中第 ' + (index + 1) + ' 条数据的 “汇款时间” 为空,请重新输入')
+              throw new Error()
+            }
+          })
+        }
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            if (this.$refs.uploadComponent.checkProgress()) {
+              this.loading = false
+              return
+            }
+            this.inputForm.workAttachmentDtoList = this.$refs.uploadComponent.getDataList()
+            financeInvoiceService.save(this.inputForm).then((data) => {
+              this.close()
+              this.$message.success(data)
+              this.$emit('refreshDataList')
+              this.loading = false
+            }).catch(() => {
+              this.loading = false
+            })
+          }
+        })
+      },
+      close () {
+        this.$refs.inputForm.resetFields()
+        this.inputForm = {
+          id: '',
+          financeInvoiceBaseDTOList: [],
+          programName: '',
+          contractName: '',
+          programNo: '',
+          clientName: '',
+          reportNo: '',
+          type: '1',
+          no: '',
+          billingType: '1',
+          billingWorkplaceReal: '',
+          billingWorkplaceRealId: '',
+          taxpayerIdentificationNo: '',
+          address: '',
+          telPhone: '',
+          openBank: '',
+          bankAccount: '',
+          receivablesType: '2',
+          billingContent: '',
+          account: '',
+          billingContentTerms: '',
+          billingPeople: '',
+          billingPeopleId: '',
+          billingDate: '',
+          collectDate: '',
+          billingPeopleReal: '',
+          reconciliationPeople: '',
+          reconciliationArea: '',
+          remarks: '',
+          name: '',
+          workAttachmentDtoList: [],
+          financeInvoiceDetailDTOList: [],
+          financeInvoiceReceivablesDTOList: [],
+          financeInvoiceInvalidDTO: {}
+        }
+        this.bankList = []
+        this.detailFlag = false
+        this.visible = false
+      },
+      insertEvent (type) {
+        if (type === 'base') {
+          if (this.inputForm.financeInvoiceBaseDTOList.length >= 1) {
+            if (this.commonJS.isEmpty(this.inputForm.financeInvoiceBaseDTOList[0].programId)) {
+              this.$message.warning('非项目,只能有一条非项目数据')
+              return
+            }
+          }
+          this.$refs.baseTable.insert().then((data) => {
+            this.inputForm.financeInvoiceBaseDTOList.push(data)
+          })
+        }
+        if (type === 'detail') {
+          this.$refs.detailTable.insert().then((data) => {
+            this.inputForm.financeInvoiceDetailDTOList.push(data)
+          })
+        }
+        if (type === 'receivables') {
+          this.$refs.receivablesTable.insert().then((data) => {
+            this.inputForm.financeInvoiceReceivablesDTOList.push(data)
+          })
+        }
+      },
+      // 删除
+      removeEvent (row, rowIndex, type) {
+        if (type === 'base') {
+          this.$refs.baseTable.remove(row)
+          this.inputForm.financeInvoiceBaseDTOList.splice(rowIndex, 1)
+        }
+        if (type === 'detail') {
+          this.$refs.detailTable.remove(row)
+          this.inputForm.financeInvoiceDetailDTOList.splice(rowIndex, 1)
+        }
+        if (type === 'receivables') {
+          this.$refs.receivablesTable.remove(row)
+          this.inputForm.financeInvoiceReceivablesDTOList.splice(rowIndex, 1)
+        }
+      },
+      openProgramPageForm (rowIndex) {
+        if (this.commonJS.isEmpty(this.inputForm.financeInvoiceBaseDTOList[0].programName) || this.inputForm.financeInvoiceBaseDTOList.length === 1) {
+          this.$refs.programPageForm.init()
+        } else {
+          if (this.commonJS.isEmpty(this.inputForm.financeInvoiceBaseDTOList[0].programId)) {
+            this.$refs.programPageForm.init('s')
+          } else {
+            this.$refs.programPageForm.init(false)
+          }
+        }
+        this.programRow = rowIndex
+      },
+      getProgram (rows) {
+        rows.forEach((item, index) => {
+          if (index === 0) {
+            let r = this.inputForm.financeInvoiceBaseDTOList[this.programRow]
+            r.programName = item.name
+            r.contractName = item.contractName
+            r.programNo = item.no
+            r.clientName = item.clientName
+            r.client = item.client
+            r.programId = item.id
+            r.location = item.location // 项目所在地
+            this.inputForm.financeInvoiceBaseDTOList[this.programRow] = r
+          } else {
+            let r = {
+              programName: item.name,
+              contractName: item.contractName,
+              programNo: item.no,
+              clientName: item.clientName,
+              client: item.client,
+              programId: item.id,
+              location: item.location // 项目所在地
+            }
+            this.inputForm.financeInvoiceBaseDTOList.push(r)
+          }
+        })
+        this.$forceUpdate()
+        this.programRow = ''
+        this.inputForm.reconciliationArea = this.inputForm.financeInvoiceBaseDTOList[0].location
+      },
+      openContractForm () {
+        if (!this.commonJS.isEmpty(this.inputForm.financeInvoiceBaseDTOList[0])) {
+          if (this.commonJS.isEmpty(this.inputForm.financeInvoiceBaseDTOList[0].programId) && this.commonJS.isEmpty(this.inputForm.financeInvoiceBaseDTOList[0].programName)) {
+            this.$message.warning('请先选择项目')
+          } else if (this.commonJS.isEmpty(this.inputForm.financeInvoiceBaseDTOList[0].programId) && !this.commonJS.isEmpty(this.inputForm.financeInvoiceBaseDTOList[0].programName)) {
+            this.$refs.contractForm.init()
+          } else {
+            this.$message.warning('只有非项目开票可选择合同信息')
+          }
+        } else {
+          this.$message.warning('请选择项目信息')
+        }
+      },
+      getContract (row) {
+        this.inputForm.financeInvoiceBaseDTOList[0].contractName = row.name // 合同名称
+        this.inputForm.financeInvoiceBaseDTOList[0].client = row.clientId // 委托方
+        this.inputForm.financeInvoiceBaseDTOList[0].clientName = row.clientName // 委托方名称
+        this.$forceUpdate()
+      },
+      changeRadio () {
+        this.inputForm.address = ''
+        this.inputForm.telPhone = ''
+        this.inputForm.billingWorkplaceReal = ''
+        this.inputForm.billingWorkplaceRealId = ''
+        this.inputForm.taxpayerIdentificationNo = ''
+        this.bankList = []
+        this.inputForm.bankAccount = ''
+        this.inputForm.openBank = ''
+        this.inputForm.name = ''
+        this.$forceUpdate()
+      },
+      openWorkClientForm () {
+        this.$refs.workClientForm.init(null, '')
+      },
+      getWorkClient (row) {
+        this.inputForm.billingWorkplaceReal = row.name // 实际开票单位姓名
+        this.inputForm.billingWorkplaceRealId = row.id // 实际开票单位id ‘客户id’
+        this.inputForm.taxpayerIdentificationNo = row.uscCode // 纳税人识别号 ‘统一社会信用代码’
+        this.inputForm.address = row.registerAddress // 地址 ‘注册地址’
+        this.inputForm.telPhone = row.telephone // 电话
+        this.bankList = row.backs
+        this.inputForm.bankAccount = ''
+        this.inputForm.openBank = ''
+        this.$forceUpdate()
+      },
+      changeBank (value) {
+        this.bankList.forEach(item => {
+          if (item.id === value) {
+            this.inputForm.bankAccount = item.bankNumber
+          }
+        })
+      },
+      checkNumber (row, rowIndex) {
+        if (!this.commonJS.isEmpty(row.number)) {
+          if (parseInt(row.number) > 99999999) {
+            this.$message.warning('“发票号” 不可以大于 8 位,请重新输入')
+            row.number = undefined
+            return
+          }
+          this.inputForm.financeInvoiceDetailDTOList.forEach((item, index) => {
+            if (rowIndex !== index) {
+              if (row.number === item.number) {
+                row.number = ''
+                this.$message.warning('“发票号” 已存在,请重新输入')
+                throw new Error()
+              }
+            }
+          })
+          financeInvoiceService.queryByNumber(row.number, row.id).then((data) => {
+            if (data === true) {
+              row.number = ''
+              this.$message.warning('“发票号” 已存在,请重新输入')
+            }
+          })
+        }
+      },
+      checkAccount (row, rowIndex) {
+        if (this.commonJS.isEmpty(row.account)) {
+          row.account = undefined
+        }
+        this.getAmount(row)
+        this.getTax(row)
+      },
+      checkRate (row, rowIndex) {
+        if (!this.commonJS.isEmpty(row.rate)) {
+          if (parseFloat(row.rate) < 1 || parseFloat(row.rate) > 100) {
+            this.$message.warning('“税率” 请填写 1 到 100 之间的数字,请重新输入')
+            row.rate = undefined
+          }
+        }
+        this.getAmount(row)
+        this.getTax(row)
+      },
+      // 根据开票金额和税率计算出金额: 开票金额-税率*开票金额
+      getAmount (row) {
+        if (!this.commonJS.isEmpty(row.account) && !this.commonJS.isEmpty(row.rate)) {
+          row.amount = parseFloat((parseFloat(row.account) - parseFloat((parseFloat(row.account) * parseFloat((parseFloat(row.rate) / 100).toFixed(4))).toFixed(4))).toFixed(2))
+        } else {
+          row.amount = undefined
+        }
+      },
+      // 根据开票金额和税率计算出税额: 税率*开票金额
+      getTax (row) {
+        if (!this.commonJS.isEmpty(row.account) && !this.commonJS.isEmpty(row.rate)) {
+          row.tax = parseFloat((parseFloat(row.account) * parseFloat((parseFloat(row.rate) / 100).toFixed(4))).toFixed(2))
+        } else {
+          row.tax = undefined
+        }
+      },
+      // 下载模板
+      downloadTpl () {
+        this.loading = true
+        financeInvoiceService.exportTemplate().then((res) => {
+          // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(res, '发票明细导入模板')
+          this.loading = false
+        }).catch(function (err) {
+          this.loading = false
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      },
+      async detailPush (data) {
+        if (this.commonJS.isNotEmpty(data)) {
+          await data.forEach(item => {
+            this.getAmount(item)
+            this.getTax(item)
+            this.inputForm.financeInvoiceDetailDTOList.push(item)
+          })
+        }
+        this.$message.success('导入完成')
+      },
+      beforeUploadDetail (file) {
+        const formBody = new FormData()
+        formBody.append('file', file.raw)
+        this.loading = true
+        financeInvoiceService.importDetail(formBody).then(async (result) => {
+          if (this.commonJS.isEmpty(result)) {
+            this.importVisible = false
+            this.loading = false
+            throw new Error()
+          }
+          for await (let item of result) {
+            this.inputForm.financeInvoiceDetailDTOList.forEach(detail => {
+              if (item.number === detail.number) {
+                this.$message.error('上传的文件中存在与页面重复的发票号,请重新填写后上传')
+                this.importVisible = false
+                this.loading = false
+                throw new Error()
+              }
+            })
+          }
+          await this.detailPush(result)
+          this.importVisible = false
+          this.loading = false
+        }).catch(() => {
+          this.importVisible = false
+          this.loading = false
+        })
+      },
+      checkIdentificationNo () {
+        if (this.commonJS.isEmpty(this.inputForm.taxpayerIdentificationNo)) {
+          this.$message.error('当前纳税人识别号为空,导入失败')
+          throw new Error()
+        }
+      },
+      async beforeUploadDetailCode (file) {
+        console.log('110', this.inputForm.taxpayerIdentificationNo)
+        await this.checkIdentificationNo()
+        const formBody = new FormData()
+        formBody.append('file', file.raw)
+        this.loading = true
+        financeInvoiceService.importDetail(formBody).then(async result => {
+          if (this.commonJS.isEmpty(result)) {
+            this.importVisible = false
+            this.loading = false
+            throw new Error()
+          }
+          for await (let item of result) {
+            await this.inputForm.financeInvoiceDetailDTOList.forEach(detail => {
+              if (item.number === detail.number) {
+                this.$message.error('上传的文件中存在与页面重复的发票号,请重新填写后上传')
+                this.importVisible = false
+                this.loading = false
+                throw new Error()
+              }
+            })
+          }
+          this.detailPushCode(result)
+          this.importVisible = false
+          this.loading = false
+        }).catch(() => {
+          this.importVisible = false
+          this.loading = false
+        })
+      },
+      detailPushCode (data) {
+        if (this.commonJS.isNotEmpty(data)) {
+          data.forEach(item => {
+            if (this.commonJS.isNotEmpty(item.taxpayerIdentificationNo)) {
+              if (item.taxpayerIdentificationNo === this.inputForm.taxpayerIdentificationNo) {
+                this.getAmount(item)
+                this.getTax(item)
+                this.inputForm.financeInvoiceDetailDTOList.push(item)
+              }
+            }
+          })
+        }
+        this.$message.success('导入完成')
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-input-number .el-input__inner {
+    text-align: left;
+  }
+</style>

+ 234 - 0
src/views/cw/invoice/ProgramPageForm.vue

@@ -0,0 +1,234 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+	  draggable
+      width="1100px"
+      height="500px"
+      @close="close"
+      append-to-body
+      v-model="visible">
+      <div v-if="isShow">
+        <el-radio v-model="checkType" label="1" style="margin-right: 20px">项目</el-radio>
+        <el-radio v-model="checkType" label="2" style="margin-right: 20px">其他</el-radio>
+      </div>
+      <div v-if="checkType === '1'" style="height: calc(100% - 80px);">
+          <el-form :inline="true" class="query-form" ref="searchForm" :model="searchForm" @submit.native.prevent>
+            <!-- 搜索框-->
+            <el-form-item label="项目名称" prop="projectName">
+              <el-input v-model="searchForm.projectName" placeholder="请输入项目名称" clearable></el-input>
+            </el-form-item>
+            <el-form-item label="项目编号" prop="projectNumber">
+              <el-input v-model="searchForm.projectNumber" placeholder="请输入项目编号" clearable></el-input>
+            </el-form-item>
+            <el-form-item label="创建时间" prop="createDates">
+              <el-date-picker
+                placement="bottom-start"
+                format="yyyy-MM-dd HH:mm:ss"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                v-model="searchForm.createDates"
+                type="datetimerange"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期">
+              </el-date-picker>
+            </el-form-item>
+
+            <el-form-item>
+              <el-button type="primary" @click="list()"  icon="el-icon-search">查询</el-button>
+              <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>
+            </el-form-item>
+          </el-form>
+
+          <vxe-table
+            border="inner"
+            auto-resize
+            resizable
+            height="400px"
+            :loading="loading"
+            ref="projectTable"
+            show-header-overflow
+            show-overflow
+            highlight-hover-row
+            :menu-config="{}"
+            :print-config="{}"
+            :sort-config="{remote:true}"
+            :data="dataList"
+            :row-config="{isCurrent: true}"
+            :checkbox-config="{trigger: 'row'}"
+          >
+            <vxe-column type="seq" width="60" title="序号"></vxe-column>
+            <vxe-column type="checkbox" width="40px"></vxe-column>
+            <vxe-column min-width="230" align="center" title="项目名称" field="projectName"></vxe-column>
+            <vxe-column min-width="160" align="center" title="项目编号" field="projectNumber"></vxe-column>
+            <vxe-column min-width="160" align="center" title="合同名称" field="contractName"></vxe-column>
+            <vxe-column min-width="160" align="center" title="创建人" field="createBy.name"></vxe-column>
+            <vxe-column min-width="160" align="center" title="创建时间" field="createDate"></vxe-column>
+
+          </vxe-table>
+          <vxe-pager
+            background
+            :current-page="tablePage.currentPage"
+            :page-size="tablePage.pageSize"
+            :total="tablePage.total"
+            :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+            :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+            @page-change="currentChangeHandle">
+          </vxe-pager>
+        </div>
+      <div style="height: 500px;" v-if="checkType === '2'">
+        <el-form  label-width="80px" class="query-form" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+          <el-row  :gutter="15">
+            <el-col :span="21">
+              <el-form-item label="详情" prop="detail">
+                <el-input style="width: 100%" type="textarea" maxlength="500" v-model="detail" placeholder="请输入详情" show-word-limit></el-input>
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+      </div>
+		<template #footer>
+			<span class="dialog-footer">
+			  <el-button @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			  <el-button type="primary" v-if="method != 'view'" @click="getProgram()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+			</span>
+		</template>
+
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import projectRecordsService from '@/api/cw/projectRecords/ProjectRecordsService'
+  export default {
+    data () {
+      return {
+        title: '项目选择',
+        method: '',
+        visible: false,
+        loading: false,
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        dataList: [],
+        searchForm: {
+          name: '',
+          no: '',
+          createBy: '',
+          projectMasterName: '',
+          projectNumber: '',
+          projectName: '',
+          createDates: [],
+          status: ''
+        },
+        checkType: '',
+        detail: '',
+        isShow: true,
+        num: true // num为true是多选,false是单选
+      }
+    },
+    created () {
+    },
+    components: {
+    },
+    methods: {
+      /**
+       * @param isShow
+       *      isShow为空,则可以选择“项目”或填写“其他”
+       *      isShow为false,则只可以选择“项目”,并且弹出提示
+       *      isShow为‘1’,则只可以选择“项目”,不弹出提示
+       *      isShow为其他任何值,则只可以填写“其他”
+       * @param num
+       *      num为空或者true,则允许多选
+       *      num为其他任何值,则只可以单选
+       */
+      init (isShow, num) {
+        if (this.commonJS.isEmpty(isShow)) {
+          this.isShow = true
+          this.checkType = '1'
+        } else {
+          if (isShow === false || isShow === 'false') {
+            this.isShow = false
+            this.checkType = '1'
+            this.$message({message: '第一条为项目后面新增只能选择项目', type: 'warning', customClass: 'messageZindex'})
+          } else if (isShow === '1') {
+            this.isShow = false
+            this.checkType = '1'
+          } else {
+            this.isShow = false
+            this.checkType = '2'
+          }
+        }
+        if (this.commonJS.isEmpty(num) || num === true) {
+          this.num = true // num为true是多选,false是单选
+        } else {
+          this.num = false
+        }
+        this.visible = true
+        this.list()
+      },
+      // 表单提交
+      getProgram () {
+        let rows
+        if (this.checkType === '1') {
+          if (this.commonJS.isEmpty(this.$refs.projectTable.getCheckboxRecords())) {
+            this.$message.error('请至少选择一条数据')
+            return
+          }
+          if (this.num === false) {
+            if (this.$refs.projectTable.getCheckboxRecords().length > 1) {
+              this.$message.error('最多选择一条数据')
+              return
+            }
+          }
+          rows = this.$refs.projectTable.getCheckboxRecords()
+        } else {
+          if (this.commonJS.isEmpty(this.detail)) {
+            this.$message.error('请填写开票详情')
+            return
+          }
+          rows = [{projectName: this.detail}]
+        }
+        this.close()
+        this.$emit('getProgram', rows)
+      },
+      list () {
+        this.loading = true
+        this.searchForm.status = '5'
+        projectRecordsService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+        })
+      },
+      // 当前页
+      currentChangeHandle ({currentPage, pageSize}) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.list()
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.list()
+      },
+      close () {
+        this.detail = ''
+        this.visible = false
+      }
+    }
+  }
+</script>
+<style>
+  .messageZindex {
+    z-index:9999 !important;
+  }
+</style>

+ 219 - 0
src/views/cw/invoice/WorkClientForm.vue

@@ -0,0 +1,219 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+	  draggable
+      width="1100px"
+      height="500px"
+      @close="close"
+      append-to-body
+      v-model="visible">
+      <div style="height: calc(100% - 80px);">
+        <el-form :inline="true" class="query-form" ref="searchForm" :model="searchForm" @keyup.enter.native="list()" @submit.native.prevent>
+          <!-- 搜索框-->
+          <el-form-item label="客户名称" prop="name">
+            <el-input v-model="searchForm.name" placeholder="请输入客户名称" clearable></el-input>
+          </el-form-item>
+
+          <el-form-item label="创建时间" prop="createDates">
+            <el-date-picker
+              placement="bottom-start"
+              v-model="searchForm.createDates"
+              type="datetimerange"
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期">
+            </el-date-picker>
+          </el-form-item>
+
+          <el-form-item label="客户性质" prop="companyType">
+            <el-select v-model="searchForm.companyType" placeholder="请选择" style="width:100%;">
+              <el-option
+                v-for="item in $dictUtils.getDictList('customer_nature')"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+
+          <el-form-item label="客户行业" prop="companyIndustry">
+            <el-select v-model="searchForm.companyIndustry" placeholder="请选择" style="width:100%;">
+              <el-option
+                v-for="item in $dictUtils.getDictList('industry')"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+
+          <el-form-item label="统一社会信用代码" prop="uscCode">
+            <el-input v-model="searchForm.uscCode" placeholder="请输入统一社会信用代码" clearable></el-input>
+          </el-form-item>
+
+          <el-form-item label="创建人" prop="createBy">
+            <SelectUserTree
+              ref="companyTree"
+              :props="{
+                  value: 'id',             // ID字段名
+                  label: 'name',         // 显示名称
+                  children: 'children'    // 子级字段名
+                }"
+              :url="`/system-server/sys/user/treeUserDataAllOffice?type=2`"
+              :value="searchForm.createBy"
+              :clearable="true"
+              :accordion="true"
+              @getValue="(value) => {searchForm.createBy=value}"/>
+          </el-form-item>
+
+          <el-form-item>
+            <el-button type="primary" @click="list()" icon="el-icon-search">查询</el-button>
+            <el-button @click="resetSearch()"  icon="el-icon-refresh-right">重置</el-button>
+          </el-form-item>
+        </el-form>
+
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="400px"
+          :loading="loading"
+          ref="workClientTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          :print-config="{}"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :checkbox-config="{}">
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="radio" width="40px"></vxe-column>
+
+          <vxe-column width="300px"  title="客户名称" field="name">
+          </vxe-column>
+<!--          <vxe-column width="200px"  title="代表方" field="deputy" ></vxe-column>-->
+          <vxe-column width="100px"  title="客户性质" field="companyType" >
+            <template #default="scope">
+              {{ $dictUtils.getDictLabel("customer_nature", scope.row.companyType, '-') }}
+            </template>
+          </vxe-column>
+          <vxe-column width="100px"  title="客户行业" field="companyIndustry" >
+            <template #default="scope">
+              {{ $dictUtils.getDictLabel("industry", scope.row.companyIndustry, '-') }}
+            </template>
+          </vxe-column>
+          <vxe-column width="200px" title="统一社会信用代码" field="uscCode" > </vxe-column>
+          <vxe-column width="100px" title="创建人" field="createBy" > </vxe-column>
+          <vxe-column width="150px" title="创建时间" field="createDate" > </vxe-column>
+        </vxe-table>
+
+        <vxe-pager
+          background
+          :current-page="tablePage.currentPage"
+          :page-size="tablePage.pageSize"
+          :total="tablePage.total"
+          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+          @page-change="currentChangeHandle">
+        </vxe-pager>
+      </div>
+		<template #footer>
+			<span slot="footer" class="dialog-footer">
+			  <el-button @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			  <el-button type="primary" v-if="method != 'view'" @click="getWorkClient()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+			</span>
+		</template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import WorkClientService from '@/api/sys/WorkClientService'
+  import SelectUserTree from '@/views/utils/treeUserSelect'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        dataList: [],
+        searchForm: {
+          name: '',
+          areaId: '',
+          createDates: [],
+          companyType: '',
+          companyIndustry: '',
+          clientType: '',
+          uscCode: '',
+          createBy: '',
+          deputy: ''
+        },
+        rowId: '',
+        deputy: ''
+      }
+    },
+    workClientService: null,
+    created () {
+      this.workClientService = new WorkClientService()
+    },
+    components: {
+      SelectUserTree
+    },
+    methods: {
+      init (id, deputy) {
+        // if (!this.commonJS.isEmpty(id)) {
+        //   this.$refs.workContractTable.setCurrentRow(id)
+        // }
+        this.deputy = deputy
+        this.visible = true
+        this.list()
+      },
+      // 表单提交
+      getWorkClient () {
+        let row = this.$refs.workClientTable.getRadioRecord()
+        if (this.commonJS.isEmpty(row)) {
+          this.$message.error('请选择一条数据')
+          return
+        }
+        this.close()
+        this.$emit('getWorkClient', row, this.deputy)
+      },
+      list () {
+        this.loading = true
+        this.workClientService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+        })
+      },
+      // 当前页
+      currentChangeHandle ({currentPage, pageSize}) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.list()
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.list()
+      },
+      close () {
+        this.visible = false
+      }
+    }
+  }
+</script>

+ 135 - 0
src/views/cw/projectBusinessType/CwProjectBusinessTypeForm.vue

@@ -0,0 +1,135 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+	  draggable
+      width="500px"
+      @close="close"
+      @keyup.enter.native="doSubmit"
+      v-model="visible">
+      <el-form :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="method==='view'"
+               label-width="120px" @submit.native.prevent>
+        <el-row  :gutter="15">
+          <el-col :span="21">
+            <el-form-item label="业务类型" prop="name"
+                          :rules="[
+                          {required: true, message:'业务类型不能为空', trigger:'blur'}
+                 ]">
+              <el-input v-model="inputForm.name" placeholder="请填写业务类型"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="21">
+            <el-form-item label="排序" prop="sort"
+                          :rules="[
+                          {required: true, message:'排序不能为空', trigger:'blur'}
+                 ]">
+              <el-input v-model="inputForm.sort" placeholder="请填写排序"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="21">
+            <el-form-item label="备注" prop="remarks"
+                          :rules="[
+                 ]">
+              <el-input type="textarea" maxlength="200" v-model="inputForm.remarks" placeholder="请填写备注"  show-word-limit   ></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+		<template #footer>
+			<span class="dialog-footer">
+			  <el-button @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			  <el-button type="primary" v-if="method != 'view'" @click="doSubmit()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+			</span>
+		</template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import CwProjectBusinessTypeService from '@/api/cw/projectBusinessType/CwProjectBusinessTypeService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          type: '',
+          sort: '',
+          remarks: '',
+          parentId: ''
+        }
+      }
+    },
+    cwProjectBusinessTypeService: null,
+    created () {
+      this.cwProjectBusinessTypeService = new CwProjectBusinessTypeService()
+    },
+    methods: {
+      init (method, id) {
+        this.method = method
+        this.inputForm = {
+          name: '',
+          sort: '',
+          remarks: '',
+          parentId: ''
+        }
+        if (method === 'add') {
+          this.title = `新建业务类型`
+          this.inputForm.parentId = '0'
+        } else if (method === 'edit') {
+          this.inputForm.id = id
+          this.title = '修改业务类型'
+        } else if (method === 'view') {
+          this.inputForm.id = id
+          this.title = '查看业务类型'
+        } else if (method === 'addChild') {
+          this.title = '新建子业务类型'
+          this.inputForm.parentId = id
+        }
+        this.visible = true
+        this.loading = false
+        this.$nextTick(() => {
+          this.$refs.inputForm.resetFields()
+          if (method === 'edit' || method === 'view') { // 修改或者查看
+            this.loading = true
+            this.cwProjectBusinessTypeService.queryById(this.inputForm.id).then((data) => {
+              this.inputForm = this.recover(this.inputForm, data)
+              this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+              this.loading = false
+            })
+          }
+        })
+      },
+      // 表单提交
+      doSubmit () {
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            let numReg = /^[0-9]*$/
+            let numRe = new RegExp(numReg)
+            if (!numRe.test(this.inputForm.sort)) {
+              this.loading = false
+              this.$message.error('排序请输入数字')
+              return
+            }
+            this.cwProjectBusinessTypeService.save(this.inputForm).then((data) => {
+              this.close()
+              this.$message.success(data)
+              this.$emit('refreshDataList')
+              this.loading = false
+            }).catch(() => {
+              this.loading = false
+            })
+          }
+        })
+      },
+      close () {
+        this.$refs.inputForm.resetFields()
+        this.visible = false
+      }
+    }
+  }
+</script>

+ 184 - 0
src/views/cw/projectBusinessType/CwProjectBusinessTypeList.vue

@@ -0,0 +1,184 @@
+<template>
+  <div class="page">
+    <el-form :inline="true" class="query-form m-b-10" v-if="searchVisible" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+      <!-- 搜索框-->
+      <el-form-item prop="name">
+        <el-input v-model="searchForm.name" placeholder="请输入业务类型" clearable></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="refreshList()" icon="el-icon-search">查询</el-button>
+        <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <div class="jp-table top" style="">
+      <vxe-toolbar :refresh="{query: refreshList}" custom>
+        <template #buttons>
+          <el-button v-if="hasPermission('cw_project_business_type:add')" type="primary" icon="el-icon-plus" @click="add()">新建</el-button>
+          <el-button v-if="hasPermission('cw_project_business_type:del')" type="danger"  icon="el-icon-delete" @click="del()" :disabled="$refs.businessTypeTable && $refs.businessTypeTable.getCheckboxRecords().length === 0" plain>删除</el-button>
+        </template>
+		  <template #tools>
+			  <vxe-button
+				  text
+				  type="primary"
+				  :title="searchVisible ? '收起检索' : '展开检索'"
+				  icon="vxe-icon-search"
+				  class="tool-btn"
+				  @click="searchVisible = !searchVisible"
+			  ></vxe-button>
+		  </template>
+      </vxe-toolbar>
+      <div style="height: calc(100% - 50px)">
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="auto"
+          :loading="loading"
+          size="small"
+          ref="businessTypeTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          @sort-change="sortChangeHandle"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :tree-config="{transform: true, rowField: 'id', parentField: 'parentId',expandAll: true}"
+          :checkbox-config="{}">
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="checkbox" width="60" ></vxe-column>
+          <vxe-column min-width="350" title="业务类型" field="name" align="left" tree-node></vxe-column>
+          <vxe-column min-width="50" align="center" title="序号" field="sort"></vxe-column>
+          <vxe-column min-width="50" align="center" title="级别" field="level"></vxe-column>
+          <vxe-column min-width="50" align="center" title="备注" field="remarks"></vxe-column>
+          <vxe-column title="操作" width="230px" fixed="right" align="center">
+            <template  #default="scope">
+              <el-button v-if="hasPermission('cw_project_business_type:edit')" text type="primary"  size="small" @click="addChild(scope.row.id)">新建子类型</el-button>
+              <el-button v-if="hasPermission('cw_project_business_type:edit')" text type="primary"  size="small" @click="edit(scope.row.id)">修改</el-button>
+              <el-button v-if="hasPermission('cw_project_business_type:del')"  text type="primary"   size="small" @click="del(scope.row.id)">删除</el-button>
+            </template>
+<!--			  <template v-slot="{ row }">-->
+<!--				  <el-button v-if="hasPermission('cw_project_business_type:edit')" text type="primary" size="small" @click="addChild(row.id)">-->
+<!--					  新建子类型-->
+<!--				  </el-button>-->
+<!--				  <el-button v-if="hasPermission('cw_project_business_type:edit')" text type="primary" size="small" @click="edit(row.id)">-->
+<!--					  修改-->
+<!--				  </el-button>-->
+<!--				  <el-button v-if="hasPermission('cw_project_business_type:del')" text type="primary" size="small" @click="del(row.id)">-->
+<!--					  删除-->
+<!--				  </el-button>-->
+<!--			  </template>-->
+          </vxe-column>
+        </vxe-table>
+      </div>
+    </div>
+    <CwProjectBusinessTypeForm  ref="businessTypeForm" @refreshDataList="refreshList"></CwProjectBusinessTypeForm>
+  </div>
+</template>
+
+<script>
+  import CwProjectBusinessTypeService from '@/api/cw/projectBusinessType/CwProjectBusinessTypeService'
+  import CwProjectBusinessTypeForm from './CwProjectBusinessTypeForm'
+  export default {
+    data () {
+      return {
+		searchVisible: true,
+        searchForm: {
+          name: '',
+          sort: ''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        loading: false
+      }
+    },
+    cwProjectBusinessTypeService: null,
+    created () {
+      this.cwProjectBusinessTypeService = new CwProjectBusinessTypeService()
+    },
+    components: {
+      CwProjectBusinessTypeForm
+    },
+    mounted () {
+      this.refreshList()
+    },
+    methods: {
+      // 新增
+      add () {
+        this.$refs.businessTypeForm.init('add', '')
+      },
+      addChild (id) {
+        this.$refs.businessTypeForm.init('addChild', id)
+      },
+      // 修改
+      edit (id) {
+        id = id || this.$refs.businessTypeTable.getCheckboxRecords().map(item => {
+          return item.id
+        })[0]
+        this.$refs.businessTypeForm.init('edit', id)
+      },
+      // 查看
+      view (id) {
+        this.$refs.businessTypeForm.init('view', id)
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        this.cwProjectBusinessTypeService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+          this.$nextTick(() => {
+            this.$refs.businessTypeTable.setAllTreeExpand(true)
+          })
+        })
+      },
+      // 当前页
+      currentChangeHandle ({ currentPage, pageSize }) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.refreshList()
+      },
+      // 排序
+      sortChangeHandle (column) {
+        this.tablePage.orders = []
+        if (column.order != null) {
+          this.tablePage.orders.push({column: this.$utils.toLine(column.property), asc: column.order === 'asc'})
+        }
+        this.refreshList()
+      },
+      // 删除
+      del (id) {
+        let ids = id || this.$refs.businessTypeTable.getCheckboxRecords().map(item => {
+          return item.id
+        }).join(',')
+        this.$confirm(`确定删除所选项吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.loading = true
+          this.cwProjectBusinessTypeService.delete(ids).then((data) => {
+            this.$message.success(data)
+            this.refreshList()
+            this.loading = false
+          })
+        })
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      }
+    }
+  }
+</script>

+ 165 - 0
src/views/cw/projectBusinessType/CwProjectBusinessTypeListForm.vue

@@ -0,0 +1,165 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+	  draggable
+      width="850px"
+      height="500px"
+      append-to-body
+      @close="close"
+      @keyup.enter.native="getBusinessType"
+      v-model="visible">
+      <div style="height: calc(100% - 50px);">
+        <el-form size="small" :inline="true" class="query-form" ref="searchForm" :model="searchForm"  @submit.native.prevent>
+          <el-form-item label="业务类型" prop="name">
+            <el-input size="small" v-model="searchForm.name" placeholder="请输入业务类型" clearable></el-input>
+          </el-form-item>
+
+          <el-form-item>
+            <el-button type="primary" @click="list()" size="small" icon="el-icon-search">查询</el-button>
+            <el-button @click="resetSearch()" size="small" icon="el-icon-refresh-right">重置</el-button>
+          </el-form-item>
+        </el-form>
+
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="450px"
+          :loading="loading"
+          size="small"
+          ref="businessTypeTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :row-config="{isCurrent: true}"
+          :radio-config="{trigger: 'row'}"
+          :menu-config="{}"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :tree-config="{transform: true, rowField: 'id', parentField: 'parentId'}"
+          :checkbox-config="{}">
+          <vxe-column type="radio" width="40" ></vxe-column>
+          <vxe-column min-width="350" title="业务类型" field="name" align="left" tree-node></vxe-column>
+<!--          <vxe-column min-width="50" align="center" title="序号" field="sort"></vxe-column>-->
+<!--          <vxe-column min-width="50" align="center" title="级别" field="level"></vxe-column>-->
+<!--          <vxe-column min-width="50" align="center" title="备注" field="remarks"></vxe-column>-->
+        </vxe-table>
+<!--        <vxe-pager-->
+<!--          background-->
+<!--          size="small"-->
+<!--          :current-page="tablePage.currentPage"-->
+<!--          :page-size="tablePage.pageSize"-->
+<!--          :total="tablePage.total"-->
+<!--          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"-->
+<!--          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"-->
+<!--          @page-change="currentChangeHandle">-->
+<!--        </vxe-pager>-->
+      </div>
+      <span slot="footer" class="dialog-footer">
+      <el-button size="small" @click="close()" icon="el-icon-circle-close">关闭</el-button>
+      <el-button size="small" type="primary" v-if="method != 'view'" @click="getBusinessType()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+    </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import CwProjectBusinessTypeService from '@/api/cw/projectBusinessType/CwProjectBusinessTypeService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        dataList: [],
+        searchForm: {
+          name: ''
+        }
+      }
+    },
+    cwProjectBusinessTypeService: null,
+    created () {
+      this.cwProjectBusinessTypeService = new CwProjectBusinessTypeService()
+    },
+    components: {
+    },
+    methods: {
+      init (deputy) {
+        this.title = '业务类型选择'
+        this.visible = true
+        this.list()
+      },
+      // 表单提交
+      getBusinessType () {
+        let row = this.$refs.businessTypeTable.getRadioRecord()
+        if (this.commonJS.isEmpty(row)) {
+          this.$message.error('请至少选择一条数据')
+        } else {
+          let _this = this
+          const waitForEach = function () {
+            return new Promise(function (resolve, reject) {
+              _this.dataList.forEach((item) => {
+                if (item.parentId === row.id) {
+                  _this.$message.error('只可以选择最小节点的数据')
+                  throw new Error('只可以选择最小节点的数据')
+                }
+              })
+              resolve()
+            })
+          }
+          waitForEach().then(() => {
+            this.close()
+            this.$emit('getBusinessType', row)
+          }).catch((reject) => {
+            console.log('waitForEach.catch', reject)
+          })
+        }
+      },
+      list () {
+        this.dataList = []
+        this.loading = true
+        this.cwProjectBusinessTypeService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+        })
+      },
+      // 当前页
+      currentChangeHandle ({currentPage, pageSize}) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.list()
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.list()
+      },
+      close () {
+        this.$refs.searchForm.resetFields()
+        this.visible = false
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-dialog__body {
+    padding-top: 0;
+  }
+  /deep/ .el-form-item--mini.el-form-item, .el-form-item--small.el-form-item {
+    margin-bottom: 0px;
+  }
+</style>

+ 177 - 0
src/views/cw/projectRecords/CwClientPageForm.vue

@@ -0,0 +1,177 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+	  draggable
+      width="1100px"
+      height="500px"
+      @close="close"
+      v-model="visible">
+      <div style="height: calc(100% - 80px);">
+          <el-form size="small" :inline="true" class="query-form" ref="searchForm" :model="searchForm" @submit.native.prevent>
+            <!-- 搜索框-->
+            <el-form-item label="姓名" prop="name">
+              <el-input size="small" v-model="searchForm.name" placeholder="请输入姓名" clearable></el-input>
+            </el-form-item>
+            <el-form-item label="联系方式1" prop="contactFirst">
+              <el-input size="small" v-model="searchForm.contactFirst" placeholder="请输入联系方式1" clearable></el-input>
+            </el-form-item>
+            <el-form-item label="联系方式2" prop="contactSecond">
+              <el-input size="small" v-model="searchForm.contactSecond" placeholder="请输入联系方式2" clearable></el-input>
+            </el-form-item>
+
+            <el-form-item>
+              <el-button type="primary" @click="list()" size="small" icon="el-icon-search">查询</el-button>
+              <el-button @click="resetSearch()" size="small" icon="el-icon-refresh-right">重置</el-button>
+            </el-form-item>
+          </el-form>
+
+          <vxe-table
+            border="inner"
+            auto-resize
+            resizable
+            height="400px"
+            :loading="loading"
+            size="small"
+            ref="projectTable"
+            show-header-overflow
+            show-overflow
+            highlight-hover-row
+            :menu-config="{}"
+            :print-config="{}"
+            :sort-config="{remote:true}"
+            :data="dataList"
+            :row-config="{isCurrent: true}"
+            :checkbox-config="{trigger: 'row'}"
+          >
+            <vxe-column type="seq" width="60" title="序号"></vxe-column>
+            <vxe-column type="checkbox" width="40px"></vxe-column>
+            <vxe-column min-width="120" align="center" title="姓名" field="name"></vxe-column>
+            <vxe-column min-width="160" align="center" title="部门" field="officeId"></vxe-column>
+            <vxe-column min-width="160" align="center" title="职务" field="position"></vxe-column>
+            <vxe-column min-width="160" align="center" title="联系方式1" field="contactFirst"></vxe-column>
+            <vxe-column min-width="160" align="center" title="联系方式2" field="contactSecond"></vxe-column>
+
+          </vxe-table>
+          <vxe-pager
+            background
+            size="small"
+            :current-page="tablePage.currentPage"
+            :page-size="tablePage.pageSize"
+            :total="tablePage.total"
+            :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+            :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+            @page-change="currentChangeHandle">
+          </vxe-pager>
+        </div>
+		<template #footer>
+			<span class="dialog-footer">
+			  <el-button size="small" @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			  <el-button size="small" type="primary" v-if="method != 'view'" @click="getProgram()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+			</span>
+		</template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import projectRecordsService from '@/api/cw/projectRecords/ProjectRecordsService'
+  export default {
+    data () {
+      return {
+        title: '联系人选择',
+        method: '',
+        visible: false,
+        loading: false,
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        dataList: [],
+        searchForm: {
+          contractId: '', // 合同id
+          name: '',
+          sex: '',
+          officeId: '',
+          position: '',
+          contactFirst: '',
+          contactSecond: ''
+        },
+        checkType: '',
+        detail: '',
+        num: true // num为true是多选,false是单选
+      }
+    },
+    created () {
+    },
+    components: {
+    },
+    methods: {
+      /**
+       * @param contractId 合同id
+       */
+      init (contractId) {
+        console.log(contractId)
+        if (this.commonJS.isEmpty(contractId)) {
+          this.$message.error('请先选择合同信息')
+          return
+        }
+        this.searchForm.contractId = contractId
+        this.visible = true
+        this.list()
+      },
+      // 表单提交
+      getProgram () {
+        let rows
+        if (this.commonJS.isEmpty(this.$refs.projectTable.getCheckboxRecords())) {
+          this.$message.error('请至少选择一条数据')
+          return
+        }
+        if (this.num === false) {
+          if (this.$refs.projectTable.getCheckboxRecords().length > 1) {
+            this.$message.error('最多选择一条数据')
+            return
+          }
+        }
+        rows = this.$refs.projectTable.getCheckboxRecords()
+        this.close()
+        this.$emit('getProgram', rows)
+      },
+      list () {
+        this.loading = true
+        projectRecordsService.getContractClientList({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+        })
+      },
+      // 当前页
+      currentChangeHandle ({currentPage, pageSize}) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.list()
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.list()
+      },
+      close () {
+        this.detail = ''
+        this.visible = false
+      }
+    }
+  }
+</script>
+<style>
+  .messageZindex {
+    z-index:9999 !important;
+  }
+</style>

+ 182 - 0
src/views/cw/projectRecords/ManHourManagementForm.vue

@@ -0,0 +1,182 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+	  draggable
+      label-width="135px"
+      @close="close"
+      @keyup.enter.native="doSubmit"
+      v-model="visible">
+      <el-form :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="method==='view'"
+               label-width="120px" @submit.native.prevent>
+
+        <!--<el-divider content-position="left"><i class="el-icon-document"></i> 项目信息</el-divider>-->
+        <el-row  :gutter="0">
+          <el-col :span="12">
+            <el-form-item label="项目名称" prop="projectName"
+                          :rules="[
+                              {required: true, message:'项目名称不能为空', trigger:'blur'},
+                              {required: true, message:'项目名称不能为空', trigger:'change'}
+                   ]">
+              <el-input :readonly="true" @focus="openContractForm()" v-model="inputForm.projectName" placeholder="请选择项目名称">
+                <el-button slot="append" icon="el-icon-search" @click="openContractForm()"></el-button>
+              </el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="项目编号" prop="projectNumber"
+                          :rules="[
+                   ]">
+              <el-input :disabled="true" v-model="inputForm.projectNumber" placeholder="请填写项目编号" clearable></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="项目经理" prop="projectMasterName"
+                          :rules="[
+                   ]">
+              <el-input :disabled="true" v-model="inputForm.projectMasterName" placeholder="请填写项目经理" clearable></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="项目预计时间" prop="planDate"
+                          :rules="[
+                                {required: true, message:'项目预计时间不能为空', trigger:'blur'}
+                   ]">
+              <el-date-picker
+                style="width: 100%"
+                placement="bottom-start"
+                value-format="YYYY-MM-DD"
+                v-model="inputForm.planDate"
+                type="datetimerange"
+                range-separator="至"
+                start-placeholder="开始日期"
+                @change="forUpdate"
+                end-placeholder="结束日期">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+
+        </el-row>
+      </el-form>
+		<template #footer>
+			<span class="dialog-footer">
+			  <el-button @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			  <el-button type="primary" v-if="method != 'view'" @click="doSubmit()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+			</span>
+		</template>
+    </el-dialog>
+    <ProjectRecoredChooseCom  ref="projectRecoredChooseCom" @getProject="getContract"></ProjectRecoredChooseCom>
+  </div>
+</template>
+
+<script>
+  import ManHourManagementForm from '@/api/cw/projectRecords/ManHourManagementService'
+  import ProjectRecoredChooseCom from '../projectRecords/ProjectRecordsChooseCom'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          projectId: '',
+          projectName: '',
+          projectNumber: '',
+          planDate: [],
+          projectMasterName: ''
+        }
+      }
+    },
+    ManHourManagementForm: null,
+    created () {
+      this.manHourManagementForm = new ManHourManagementForm()
+    },
+
+    components: {
+      ProjectRecoredChooseCom
+    },
+    methods: {
+      forUpdate () {
+        this.$forceUpdate()
+      },
+      init (method, id) {
+        this.method = method
+        this.inputForm = {
+          projectId: '',
+          projectName: '',
+          projectNumber: '',
+          planDate: [],
+          projectMasterName: ''
+        }
+        if (method === 'add') {
+          this.title = `新增项目计划时间`
+        } else if (method === 'edit') {
+          this.inputForm.id = id
+          this.title = '修改项目计划时间'
+        } else if (method === 'view') {
+          this.inputForm.id = id
+          this.title = '查看项目计划时间'
+        }
+        this.visible = true
+        this.loading = false
+        this.$nextTick(() => {
+          this.$refs.inputForm.resetFields()
+          if (method === 'edit' || method === 'view') { // 修改或者查看
+            this.loading = true
+            this.manHourManagementForm.queryById(this.inputForm.id).then((data) => {
+              this.inputForm = this.recover(this.inputForm, data)
+              this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+              this.loading = false
+            })
+          }
+        })
+      },
+      openContractForm () {
+        if (!this.commonJS.isEmpty(this.inputForm.contractId)) {
+          // this.$refs.projectInfoForm.init(this.inputForm.contractId)
+          this.$refs.projectRecoredChooseCom.init(this.inputForm.contractId)
+        } else {
+          this.$refs.projectRecoredChooseCom.init()
+        }
+      },
+      getContract (row) {
+        this.inputForm.projectName = row.projectName // 项目名称
+        this.inputForm.projectId = row.id // 项目id
+        this.inputForm.projectNumber = row.projectNumber // 项目编号
+        this.inputForm.projectMasterName = row.projectMasterName // 项目经理
+        this.clearClientList()
+        this.$forceUpdate()
+        this.inputForm.cwProjectInfoList = []
+      },
+      clearClientList () {
+        // 项目直接对接联系人列表清除
+        this.inputForm.clientList = []
+        this.$forceUpdate()
+      },
+      // 表单提交
+      doSubmit () {
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            this.manHourManagementForm.save(this.inputForm).then((data) => {
+              this.close()
+              this.$message.success(data)
+              this.$emit('refreshDataList')
+              this.loading = false
+            }).catch(() => {
+              this.loading = false
+            })
+          }
+        })
+      },
+      close () {
+        this.$refs.inputForm.resetFields()
+        this.visible = false
+      }
+    }
+  }
+</script>

+ 302 - 0
src/views/cw/projectRecords/ManHourManagementList.vue

@@ -0,0 +1,302 @@
+<template>
+  <div class="page">
+    <el-form  :inline="true" class="query-form m-b-10" v-if="searchVisible" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+      <!-- 搜索框-->
+      <el-form-item label="项目名称" prop="projectName">
+        <el-input  v-model="searchForm.projectName" placeholder="请输入项目名称" clearable></el-input>
+      </el-form-item>
+      <!--<el-form-item label="项目编号" prop="projectNumber">
+        <el-input size="small" v-model="searchForm.projectNumber" placeholder="请输入项目编号" clearable></el-input>
+      </el-form-item>
+      <el-form-item label="项目经理" prop="projectMasterName">
+        <UserSelect :limit='1' :userName="searchForm.projectMasterName" @getValue='(value, label) => {searchForm.projectMasterName = label}'></UserSelect>
+      </el-form-item>-->
+      <!--<el-form-item label="开始时间" prop="createDates">
+        <el-date-picker
+          placement="bottom-start"
+          format="yyyy-MM-dd HH:mm:ss"
+          value-format="yyyy-MM-dd HH:mm:ss"
+          v-model="searchForm.createDates"
+          type="datetimerange"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="结束时间" prop="endDates">
+        <el-date-picker
+          placement="bottom-start"
+          format="yyyy-MM-dd HH:mm:ss"
+          value-format="yyyy-MM-dd HH:mm:ss"
+          v-model="searchForm.endDates"
+          type="datetimerange"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期">
+        </el-date-picker>
+      </el-form-item>-->
+
+      <el-form-item>
+        <el-button type="primary" @click="refreshList()" icon="el-icon-search">查询</el-button>
+        <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <div class="jp-table top" style="">
+      <vxe-toolbar :refresh="{query: refreshList}" ref="toolbarRef" export custom>
+        <template #buttons>
+          <el-button type="primary" icon="el-icon-plus" @click="add()">新建</el-button>
+        </template>
+		  <template #tools>
+			  <vxe-button
+				  text
+				  type="primary"
+				  :title="searchVisible ? '收起检索' : '展开检索'"
+				  icon="vxe-icon-search"
+				  class="tool-btn"
+				  @click="searchVisible = !searchVisible"
+			  ></vxe-button>
+		  </template>
+      </vxe-toolbar>
+      <div style="height: calc(100% - 90px)">
+        <vxe-table
+          :key="tableKey"
+          border="inner"
+          auto-resize
+          resizable
+          height="auto"
+          :loading="loading"
+          size="small"
+          ref="projectTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          @sort-change="sortChangeHandle"
+          :sort-config="{remote:true}"
+          :export-config="{
+                    remote: true,
+                    filename: `项目数据${moment(new Date()).format('YYYY-MM-DD')}`,
+                    sheetName: `项目数据${moment(new Date()).format('YYYY-MM-DD')}`,
+                    exportMethod: exportMethod,
+                    types: ['xlsx'],
+                    modes: ['current', 'selected', 'all']
+                  }"
+          :data="dataList"
+          :checkbox-config="{}">
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="checkbox" width="40" ></vxe-column>
+          <vxe-column min-width="230" align="center" title="项目名称" field="projectName">
+            <template #default="scope">
+              <el-link  type="primary" :underline="false" v-if="hasPermission('manHourManagement:view')" @click="view(scope.row.id)">{{scope.row.projectName}}</el-link>
+              <el-link  type="primary" :underline="false" v-else-if="hasPermission('manHourManagement:view')"  @click="view(scope.row.id,)">{{scope.row.projectName}}</el-link>
+              <span v-else>{{scope.row.projectName}}</span>
+            </template>
+          </vxe-column>
+          <vxe-column min-width="160" align="center" title="项目编号" field="projectNumber"></vxe-column>
+          <vxe-column min-width="160" align="center" title="项目经理" field="projectMasterName"></vxe-column>
+          <vxe-column min-width="160" align="center" title="计划开始时间" field="planStartDate"></vxe-column>
+          <vxe-column min-width="160" align="center" title="计划结束时间" field="planEndDate"></vxe-column>
+          <vxe-column min-width="160" align="center" title="创建人" field="createBy.name"></vxe-column>
+          <vxe-column min-width="160" align="center" title="创建时间" field="createTime"></vxe-column>
+          <vxe-column min-width="100" align="center" title="确认状态" field="statusStr"></vxe-column>
+          <vxe-column title="操作" width="200px" fixed="right" align="center">
+            <template  #default="scope">
+              <el-button v-if="hasPermission('manHourManagement:edit')&&scope.row.createBy.id === $store.state.user.id&&scope.row.status === '0'" type="text"  @click="edit(scope.row.id)">编辑</el-button>
+              <el-button v-if="hasPermission('manHourManagement:edit')&&scope.row.status === '0'" type="text"   @click="isReceivables(scope.row)">确认工时</el-button>
+              <el-button v-if="hasPermission('manHourManagement:del')&&scope.row.status === '0'" type="text"    @click="del(scope.row.id)">删除</el-button>
+            </template>
+          </vxe-column>
+        </vxe-table>
+        <vxe-pager
+          background
+          size="small"
+          :current-page="tablePage.currentPage"
+          :page-size="tablePage.pageSize"
+          :total="tablePage.total"
+          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+          @page-change="currentChangeHandle">
+        </vxe-pager>
+      </div>
+    </div>
+    <ManHourManagementForm ref="manHourManagementForm" @refreshDataList="refreshList"></ManHourManagementForm>
+  </div>
+</template>
+
+<script>
+  import ManHourManagementService from '@/api/cw/projectRecords/ManHourManagementService'
+  import processService from '@/api/flowable/ProcessService'
+  import ManHourManagementForm from './ManHourManagementForm'
+  import userService from '@/api/sys/UserService'
+  // import UserSelect from '@/components/userSelect'
+  export default {
+    data () {
+      return {
+		searchVisible: true,
+        searchForm: {
+          projectMasterName: '',
+          projectNumber: '',
+          projectName: '',
+          createDates: [],
+          endDates: []
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        tableKey: '',
+        loading: false,
+        processDefinitionAuditId: '',
+        procDefAuditKey: '',
+        isAdmin: false
+      }
+    },
+    manHourManagementService: null,
+    created () {
+      this.manHourManagementService = new ManHourManagementService()
+    },
+    components: {
+      ManHourManagementForm,
+      // UserSelect
+    },
+    computed: {
+      userName () {
+        return JSON.parse(localStorage.getItem('user')).name
+      },
+      user () {
+        this.createName = JSON.parse(localStorage.getItem('user')).name
+        return JSON.parse(localStorage.getItem('user'))
+      }
+    },
+    mounted () {
+		this.$nextTick(() => {
+			//将表格和工具栏进行关联
+			const $table = this.$refs.projectTable;
+			const $toolbar = this.$refs.toolbarRef;
+			$table.connect($toolbar);
+		})
+      this.refreshList()
+    },
+    activated () {
+      this.refreshList()
+    },
+    methods: {
+      // 新增
+      add () {
+        this.$refs.manHourManagementForm.init('add', '')
+      },
+      // 修改
+      edit (id) {
+        this.$refs.manHourManagementForm.init('edit', id)
+      },
+      // 查看
+      view (id) {
+        this.$refs.manHourManagementForm.init('view', id)
+      },
+      // 查询当前用户是否是管理员用户
+      checkIsAdmin () {
+        userService.is().then((data) => {
+          this.isAdmin = data
+        })
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        this.manHourManagementService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          // this.tableKey = Math.random()
+          this.loading = false
+        })
+        this.checkIsAdmin()
+        processService.getByName('财务-项目登记').then((data) => {
+          if (!this.commonJS.isEmpty(data.id)) {
+            this.processDefinitionAuditId = data.id
+            this.procDefAuditKey = data.key
+          }
+        })
+      },
+      // 当前页
+      currentChangeHandle ({ currentPage, pageSize }) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.refreshList()
+      },
+      // 排序
+      sortChangeHandle (column) {
+        this.tablePage.orders = []
+        if (column.order != null) {
+          this.tablePage.orders.push({column: this.$utils.toLine(column.property), asc: column.order === 'asc'})
+        }
+        this.refreshList()
+      },
+      isReceivables (row) {
+        this.$confirm(`是否确认工时?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.manHourManagementService.updateStatus(row.id).then((data) => {
+            this.$message.success(data)
+            this.refreshList()
+          })
+        })
+      },
+      // 删除
+      del (id) {
+        let ids = id || this.$refs.projectTable.getCheckboxRecords().map(item => {
+          return item.id
+        }).join(',')
+        this.$confirm(`确定删除所选项吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.loading = true
+          this.manHourManagementService.delete(ids).then((data) => {
+            this.$message.success(data)
+            this.refreshList()
+            this.loading = false
+          })
+        })
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      },
+      // 自定义服务端导出
+      exportMethod ({ options }) {
+        // 传给服务端的参数
+        const params = {
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm,
+          filename: options.filename,
+          sheetName: options.sheetName,
+          isHeader: options.isHeader,
+          original: options.original,
+          mode: options.mode,
+          selectIds: options.mode === 'selected' ? options.map(item => item.id) : [],
+          exportFields: options.columns.map(column => column.property)
+        }
+        return this.projectRecordsService.exportFile(params).then((res) => {
+          // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(res, options.filename)
+        }).catch(function (err) {
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      }
+    }
+  }
+</script>

+ 434 - 0
src/views/cw/projectRecords/ProjectMembersEditForm.vue

@@ -0,0 +1,434 @@
+<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+	  draggable
+      width="1100px"
+      height="500px"
+      @close="close"
+      append-to-body
+      v-model="visible">
+    <el-row>
+      <el-col :span="24">
+        <el-form :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="method==='view'"
+                     label-width="135px" @submit.native.prevent>
+              <el-divider content-position="left"><i class="el-icon-document"></i> 项目成员信息</el-divider>
+              <el-row  :gutter="15">
+                <el-col :span="24">
+                  <el-form-item label="项目名称" prop="projectName"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.projectName" placeholder="请填写项目名称" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="项目编号" prop="projectNumber"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.projectNumber" placeholder="请填写项目编号" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="现场负责人" prop="projectLeaderId"
+                                :rules="[
+                   ]">
+                    <UserSelect :disabled="true" :limit='1' :value="inputForm.projectLeaderId" @getValue='(value) => {inputForm.projectLeaderId = value}'></UserSelect>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="合同名称" prop="contractName"
+                                :rules="[
+                 ]">
+                    <el-input :disabled="true" v-model="inputForm.contractName" placeholder="请选择合同"></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="委托人" prop="clientContactsName"
+                                :rules="[
+                 ]">
+                    <el-input :disabled="true" v-model="inputForm.clientContactsName" placeholder="请填写委托人"></el-input>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+        </el-form>
+          <el-divider content-position="left"><i class="el-icon-document"></i> 项目组成员明细</el-divider>
+            <el-row :gutter="15">
+<!--              <el-button type="primary" style="margin-bottom: 15px" :disabled="method==='view'" @click="insertEvent('members')">-->
+<!--                选择成员-->
+<!--              </el-button>-->
+              <UserSelectButton ref="userSelectButton" @getValue="(value) => {addMembers(value)}"></UserSelectButton>
+            </el-row>
+            <el-row :gutter="15" style="margin-top: 15px">
+                  <el-form :disabled="method==='view'">
+                    <vxe-table
+                      border
+                      show-overflow
+                      show-footer
+                      :column-config="{resizable: true}"
+                      ref="membersTable"
+                      :key="tableKeyMembers"
+                      class="vxe-table-element"
+                      :data="inputForm.cwProjectMembersDTOList"
+                      style=""
+                      highlight-current-row
+                    >
+                      <vxe-table-column min-width="176" align="center" field="name" title="姓名"></vxe-table-column>
+                      <vxe-table-column min-width="176" align="center" field="officeName" title="部门"></vxe-table-column>
+                      <vxe-table-column min-width="176" align="center" field="roleName" title="角色"></vxe-table-column>
+                      <vxe-table-column min-width="176" align="center" field="mobile" title="手机号"></vxe-table-column>
+                      <vxe-table-column min-width="176" align="center" field="status" title="状态">
+                        <template #default="scope">
+                          <span v-if="scope.row.status === '0'" style="color: #67C23A">正常</span>
+                          <span v-else>移除</span>
+                        </template>
+                      </vxe-table-column>
+
+                      <vxe-table-column align="center" title="操作" min-width="176">
+                        <template #default="scope">
+                          <el-button v-if="scope.row.status === '0'" type="info" @click="removeDate(scope.$rowIndex)">移除</el-button>
+                          <el-button v-if="scope.row.status === '1'" type="primary" @click="aliveDate(scope.$rowIndex)">恢复</el-button>
+                          <el-button type="danger" @click="removeEvent(scope.row,scope.$rowIndex,'members')">删除</el-button>
+                        </template>
+                      </vxe-table-column>
+                    </vxe-table>
+                  </el-form>
+                </el-row>
+      </el-col>
+    </el-row>
+		<template #footer>
+			<span class="dialog-footer">
+			  <el-button @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			  <el-button v-if="method === 'edit' || method === 'add'" type="primary" icon="el-icon-circle-check" @click="save()">确定</el-button>
+			</span>
+		</template>
+    </el-dialog>
+    <WorkContractChooseCom ref="workContractChooseCom"></WorkContractChooseCom>
+    <WorkClientChooseForm ref="workClientChooseForm"></WorkClientChooseForm>
+    <CwProjectBusinessTypeListForm ref="cwProjectBusinessTypeListForm"></CwProjectBusinessTypeListForm>
+    <ContractNameForm ref="contractNameForm"></ContractNameForm>
+  </div>
+</template>
+
+<script>
+  import UserSelect from '@/components/userSelect'
+  import projectRecordsService from '@/api/cw/projectRecords/ProjectRecordsService'
+  import EnterpriseSearchService from '@/api/cw/common/EnterpriseSearchService'
+  import WorkClientChooseForm from '../workClientInfo/WorkClientChooseForm'
+  import WorkContractChooseCom from './WorkContractChooseCom'
+  import CwProjectBusinessTypeListForm from '@/views/cw/projectBusinessType/CwProjectBusinessTypeListForm'
+  import ContractNameForm from '../workContract/ContractNameForm'
+  import UserSelectButton from '@/components/userSelectButton'
+  import userService from '@/api/sys/UserService'
+  export default {
+    props: {
+      businessId: {
+        type: String,
+        default: ''
+      },
+      formReadOnly: {
+        type: Boolean,
+        default: false
+      }
+    },
+    data () {
+      return {
+        title: '',
+        method: '',
+        loading: false,
+        inputForm: {
+          id: '',
+          createDate: '',
+          createBy: {
+            id: '',
+            name: ''
+          },
+          remarks: '',
+          projectNumber: '',
+          projectName: '',
+          officeId: '',
+          projectMoney: '',
+          auditYear: '',
+          planStartDate: '',
+          planEndDate: '',
+          projectMasterId: '',
+          projectLeaderId: '',
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          workAttachmentDtoList: [],
+          cwProjectClientInfoDTOList: [],
+          contractName: '',
+          contractAmount: '',
+          contractNum: '',
+          payerSubject: '',
+          paymentMethod: '',
+          contractId: '',
+          businessType: '',
+          riskLevel: '',
+          businessTypeName: '',
+          planDate: [],
+          realHeader: '',
+          clientContactsName: '',
+          reportType: '',
+          cwProjectClientContactDTOList: [],
+          cwProjectMembersDTOList: []
+        },
+        keyWatch: '',
+        activeName: 'client',
+        tableKey: '',
+        tableKeyClient: '1',
+        tableKeyContact: '2',
+        tableKeyMembers: '3',
+        visible: false,
+        status: [
+          {label: '正常', value: '0'},
+          {label: '移除', value: '1'}
+        ]
+      }
+    },
+    enterpriseSearchService: null,
+    created () {
+      this.enterpriseSearchService = new EnterpriseSearchService()
+    },
+    computed: {
+      bus: {
+        get () {
+          return this.businessId
+        },
+        set (val) {
+          this.businessId = val
+        }
+      }
+    },
+    watch: {
+      'keyWatch': {
+        handler (newVal) {
+          if (this.commonJS.isNotEmpty(this.bus)) {
+            this.init('', this.bus)
+          } else {
+            this.$nextTick(() => {
+              this.$refs.inputForm.resetFields()
+            })
+          }
+        }
+      }
+    },
+    components: {
+      UserSelect,
+      WorkClientChooseForm,
+      WorkContractChooseCom,
+      CwProjectBusinessTypeListForm,
+      ContractNameForm,
+      UserSelectButton
+    },
+    methods: {
+      getKeyWatch (keyWatch) {
+        this.keyWatch = keyWatch
+      },
+      forUpdate () {
+        this.$forceUpdate()
+      },
+      init (method, id) {
+        if (method === 'view') {
+          this.title = '项目组成员详情'
+        } else if (method === 'edit') {
+          this.title = '项目组成员编辑'
+        }
+        this.visible = true
+        this.activeName = 'client'
+        this.method = method
+        this.inputForm = {
+          id: '',
+          createDate: '',
+          createBy: {
+            id: '',
+            name: this.$store.state.user.name
+          },
+          remarks: '',
+          projectNumber: '',
+          projectName: '',
+          officeId: '',
+          projectMoney: '',
+          auditYear: '',
+          planStartDate: '',
+          planEndDate: '',
+          projectMasterId: '',
+          projectLeaderId: '',
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          workAttachmentDtoList: [],
+          cwProjectClientInfoDTOList: [],
+          contractName: '',
+          contractAmount: '',
+          contractNum: '',
+          payerSubject: '',
+          paymentMethod: '',
+          contractId: '',
+          businessType: '',
+          riskLevel: '',
+          businessTypeName: '',
+          planDate: [],
+          realHeader: '',
+          clientContactsName: '',
+          reportType: '',
+          cwProjectClientContactDTOList: [],
+          cwProjectMembersDTOList: []
+        }
+        this.inputForm.id = id
+        this.loading = false
+        this.$nextTick(() => {
+          this.$refs.inputForm.resetFields()
+          this.loading = true
+          projectRecordsService.queryById(this.inputForm.id).then((data) => {
+            this.inputForm = this.recover(this.inputForm, data)
+            this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+            if (this.commonJS.isEmpty(this.inputForm.cwProjectMembersDTOList)) {
+              this.inputForm.cwProjectMembersDTOList = []
+            } else {
+              this.inputForm.cwProjectMembersDTOList.forEach((member, index) => {
+                userService.queryDetailById(member.userId).then((data) => {
+                  member.name = this.commonJS.isEmpty(data.name) ? '' : data.name
+                  member.mobile = this.commonJS.isEmpty(data.mobile) ? '' : data.mobile
+                  member.officeName = this.commonJS.isEmpty(data.officeDTO) ? '' : this.commonJS.isEmpty(data.officeDTO.name) ? '' : data.officeDTO.name
+                  member.roleName = this.commonJS.isEmpty(data.roleList) ? '' : data.roleList.map(role => { return this.commonJS.isEmpty(role.name) ? '' : role.name }).join(',')
+                  this.tableKeyMembers = Math.random()
+                })
+              })
+            }
+            this.loading = false
+          })
+        })
+      },
+      // 表单提交
+      save () {
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            projectRecordsService.updateMembers(this.inputForm).then((data) => {
+              this.$emit('refreshList')
+              this.loading = false
+              this.close()
+            }).catch(() => {
+              this.loading = false
+            })
+          }
+        })
+      },
+      close () {
+        this.inputForm = {
+          id: '',
+          createDate: '',
+          createBy: {
+            id: '',
+            name: ''
+          },
+          remarks: '',
+          projectNumber: '',
+          projectName: '',
+          officeId: '',
+          projectMoney: '',
+          auditYear: '',
+          planStartDate: '',
+          planEndDate: '',
+          projectMasterId: '',
+          projectLeaderId: '',
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          workAttachmentDtoList: [],
+          cwProjectClientInfoDTOList: [],
+          contractName: '',
+          contractAmount: '',
+          contractNum: '',
+          payerSubject: '',
+          paymentMethod: '',
+          contractId: '',
+          businessType: '',
+          riskLevel: '',
+          businessTypeName: '',
+          planDate: [],
+          realHeader: '',
+          clientContactsName: '',
+          reportType: '',
+          cwProjectClientContactDTOList: [],
+          cwProjectMembersDTOList: []
+        }
+        // this.$refs.uploadComponent.clearUpload()
+        this.$refs.inputForm.resetFields()
+        this.visible = false
+      },
+      tabHandleClick (event) {
+        // console.log(event)
+      },
+      // 新增
+      // eslint-disable-next-line no-dupe-keys
+      insertEvent (type) {
+        if (type === 'contact') {
+          let d = {
+            contactFirst: '',
+            contactSecond: '',
+            email: '',
+            fax: '',
+            name: '',
+            officeId: '',
+            position: '',
+            remarks: '',
+            sex: ''
+          }
+          if (this.commonJS.isEmpty(this.inputForm.cwProjectClientContactDTOList)) {
+            this.inputForm.cwProjectClientContactDTOList = []
+          }
+          this.$refs.contactTable.insertAt(d)
+          this.inputForm.cwProjectClientContactDTOList.push(d)
+          this.tableKeyContact = Math.random()
+        }
+      },
+      // 删除
+      removeEvent (row, rowIndex, type) {
+        if (type === 'members') {
+          this.$refs.membersTable.remove(row)
+          this.inputForm.cwProjectMembersDTOList.splice(rowIndex, 1)
+        }
+      },
+      removeDate (index) {
+        this.inputForm.cwProjectMembersDTOList[index].status = '1'
+      },
+      aliveDate (index) {
+        this.inputForm.cwProjectMembersDTOList[index].status = '0'
+      },
+      addMembers (value) {
+        if (this.commonJS.isNotEmpty(value)) {
+          userService.queryDetailList(value).then((data) => {
+            data.forEach(item => {
+              this.inputForm.cwProjectMembersDTOList.forEach(member => {
+                if (this.commonJS.isEmpty(item.name) || member.name === item.name) {
+                  this.$message.error('成员“ ' + item.name + ' ”已存在')
+                  throw new Error('成员“ ' + item.name + ' ”已存在')
+                }
+              })
+            })
+            data.forEach(item => {
+              let param = {
+                userId: item.id,
+                status: '0',
+                name: this.commonJS.isEmpty(item.name) ? '' : item.name,
+                mobile: this.commonJS.isEmpty(item.mobile) ? '' : item.mobile,
+                officeName: this.commonJS.isEmpty(item.officeDTO) ? '' : this.commonJS.isEmpty(item.officeDTO.name) ? '' : item.officeDTO.name,
+                roleName: this.commonJS.isEmpty(item.roleList) ? '' : item.roleList.map(role => { return this.commonJS.isEmpty(role.name) ? '' : role.name }).join(',')
+              }
+              this.inputForm.cwProjectMembersDTOList.push(param)
+			  this.tableKeyMembers = Math.random()
+            })
+          })
+        }
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-input-number .el-input__inner {
+    text-align: left;
+  }
+</style>

+ 249 - 0
src/views/cw/projectRecords/ProjectMembersList.vue

@@ -0,0 +1,249 @@
+<template>
+  <div class="page">
+    <el-form size="small"  v-if="searchVisible" :inline="true" class="query-form m-b-10"  ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+      <!-- 搜索框-->
+      <el-form-item label="项目名称" prop="projectName">
+        <el-input size="small" v-model="searchForm.projectName" placeholder="请输入项目名称" clearable></el-input>
+      </el-form-item>
+      <el-form-item label="项目编号" prop="projectNumber">
+        <el-input size="small" v-model="searchForm.projectNumber" placeholder="请输入项目编号" clearable></el-input>
+      </el-form-item>
+      <el-form-item label="创建时间" prop="createDates">
+        <el-date-picker
+          placement="bottom-start"
+          format="yyyy-MM-dd HH:mm:ss"
+          value-format="yyyy-MM-dd HH:mm:ss"
+          v-model="searchForm.createDates"
+          type="datetimerange"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期">
+        </el-date-picker>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="primary" @click="refreshList()" size="small" icon="el-icon-search">查询</el-button>
+        <el-button @click="resetSearch()" size="small" icon="el-icon-refresh-right">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <div class="jp-table top" style="">
+      <vxe-toolbar :refresh="{query: refreshList}"  ref="toolbarRef" custom>
+        <template #buttons>
+          <!--          <el-button v-if="hasPermission('cwProjectRecords:add')" type="primary" size="small" icon="el-icon-plus" @click="add()">新建</el-button>-->
+          <!--          <el-button v-if="hasPermission('klg:question:del')" type="danger"   size="small" icon="el-icon-delete" @click="del()" :disabled="$refs.questionsTable && $refs.questionsTable.getCheckboxRecords().length === 0" plain>删除</el-button>-->
+        </template>
+		  <template #tools>
+			  <vxe-button
+				  text
+				  type="primary"
+				  :title="searchVisible ? '收起检索' : '展开检索'"
+				  icon="vxe-icon-search"
+				  class="tool-btn"
+				  @click="searchVisible = !searchVisible"
+			  ></vxe-button>
+		  </template>
+      </vxe-toolbar>
+      <div style="height: calc(100% - 90px)">
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="auto"
+          :loading="loading"
+          size="small"
+          ref="projectTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          @sort-change="sortChangeHandle"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :checkbox-config="{}">
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="checkbox" width="40" ></vxe-column>
+          <vxe-column min-width="230" align="center" title="项目名称" field="projectName">
+            <template #default="scope">
+              <el-link  type="primary" :underline="false" v-if="hasPermission('cwProjectRecords:view')" @click="view(scope.row.id)">{{scope.row.projectName}}</el-link>
+              <el-link  type="primary" :underline="false" v-else-if="hasPermission('cwProjectRecords:view')"  @click="view(scope.row.id,)">{{scope.row.projectName}}</el-link>
+              <span v-else>{{scope.row.projectName}}</span>
+            </template>
+          </vxe-column>
+          <vxe-column min-width="160" align="center" title="项目编号" field="projectNumber"></vxe-column>
+          <vxe-column min-width="230" align="center" title="合同名称" field="contractName">
+            <template #default="scope">
+              <el-link  type="primary" :underline="false" v-if="commonJS.isNotEmpty(scope.row.contractId)&&commonJS.isNotEmpty(scope.row.contractName)" @click="viewContract(scope.row.contractId)">{{scope.row.contractName}}</el-link>
+              <span v-else style="color: red">暂无合同</span>
+            </template>
+          </vxe-column>
+          <vxe-column min-width="160" align="center" title="委托方" field="clientContactsName"></vxe-column>
+          <vxe-column min-width="160" align="center" title="成员数量" field="memberCount"></vxe-column>
+          <vxe-column min-width="160" align="center" title="创建人" field="createBy.name"></vxe-column>
+          <vxe-column min-width="160" align="center" title="创建时间" field="createTime"></vxe-column>
+          <vxe-column title="操作" width="70px" fixed="right" align="center">
+            <template  #default="scope">
+<!--              项目创建人、项目组成员、管理员可编辑-->
+<!--              <el-button v-if="hasPermission('cwProjectRecords:edit')&&(scope.row.createBy.id === $store.state.user.id||isAdmin||haveProjectIds.includes(scope.row.id))" type="text"  size="small" @click="edit(scope.row.id)">编辑</el-button>-->
+<!--              项目创建人、管理员、项目现场负责人、项目经理1、项目经理2可编辑-->
+              <el-button v-if="hasPermission('cwProjectRecords:edit')&&
+              (
+              isAdmin ||
+              $store.state.user.id === scope.row.createBy.id ||
+              $store.state.user.id === scope.row.projectLeaderId ||
+              $store.state.user.id === scope.row.projectMasterId ||
+              $store.state.user.id === scope.row.realHeader
+              )" text type="primary"  size="small" @click="edit(scope.row.id)">编辑</el-button>
+
+            </template>
+          </vxe-column>
+        </vxe-table>
+        <vxe-pager
+          background
+          size="small"
+          :current-page="tablePage.currentPage"
+          :page-size="tablePage.pageSize"
+          :total="tablePage.total"
+          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+          @page-change="currentChangeHandle">
+        </vxe-pager>
+      </div>
+    </div>
+    <ProjectRecordsForm ref="projectRecordsForm" @refreshList="refreshList"></ProjectRecordsForm>
+    <ContractNameForm ref="contractNameForm"></ContractNameForm>
+    <ProjectRecordsAddForm ref="projectRecordsAddForm" @refreshList="refreshList"></ProjectRecordsAddForm>
+    <ProjectMembersEditForm ref="projectMembersEditForm" @refreshList="refreshList"></ProjectMembersEditForm>
+  </div>
+</template>
+
+<script>
+  import projectRecordsService from '@/api/cw/projectRecords/ProjectRecordsService'
+  import ProjectRecordsForm from './ProjectRecordsForm'
+  import userService from '@/api/sys/UserService'
+  import ContractNameForm from '../workContract/ContractNameForm'
+  import ProjectRecordsAddForm from './ProjectRecordsAddForm'
+  import ProjectMembersEditForm from './ProjectMembersEditForm'
+  export default {
+    data () {
+      return {
+		  searchVisible: true,
+        searchForm: {
+          projectMasterName: '',
+          projectNumber: '',
+          projectName: '',
+          createDates: [],
+          status: ''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        loading: false,
+        processDefinitionAuditId: '',
+        procDefAuditKey: '',
+        isAdmin: false,
+        haveProjectIds: ''
+      }
+    },
+    created () {
+    },
+    components: {
+      ProjectRecordsForm,
+      ContractNameForm,
+      ProjectRecordsAddForm,
+      ProjectMembersEditForm
+    },
+    computed: {
+      userName () {
+        return this.$store.state.user.name
+      },
+      user () {
+        this.createName = this.$store.state.user.name
+        return this.$store.state.user
+      }
+    },
+    mounted () {
+		this.$nextTick(() => {
+			//将表格和工具栏进行关联
+			const $table = this.$refs.projectTable;
+			const $toolbar = this.$refs.toolbarRef;
+			$table.connect($toolbar);
+		})
+      this.refreshList()
+    },
+    activated () {
+      this.refreshList()
+    },
+    methods: {
+      // 新增
+      add () {
+        this.$refs.projectRecordsAddForm.init('add', 'false')
+      },
+      // 修改
+      edit (id) {
+        id = id || this.$refs.projectTable.getCheckboxRecords().map(item => {
+          return item.id
+        })[0]
+        this.$refs.projectMembersEditForm.init('edit', id)
+      },
+      // 查看
+      view (id) {
+        this.$refs.projectRecordsForm.init('view', id)
+      },
+      viewContract (id) {
+        this.$refs.contractNameForm.init('view', id)
+      },
+      // 查询当前用户是否是管理员用户
+      checkIsAdmin () {
+        userService.is().then((data) => {
+          this.isAdmin = data
+        })
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        projectRecordsService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          projectRecordsService.getHaveProjectIds().then((data) => {
+            if (this.commonJS.isNotEmpty(data)) {
+              this.haveProjectIds = data.map(i => {
+                if (this.commonJS.isNotEmpty(i)) {
+                  return i
+                }
+              }).join(',')
+            }
+          })
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+        })
+        this.checkIsAdmin()
+      },
+      // 当前页
+      currentChangeHandle ({ currentPage, pageSize }) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.refreshList()
+      },
+      // 排序
+      sortChangeHandle (column) {
+        this.tablePage.orders = []
+        if (column.order != null) {
+          this.tablePage.orders.push({column: this.$utils.toLine(column.property), asc: column.order === 'asc'})
+        }
+        this.refreshList()
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      }
+    }
+  }
+</script>

Plik diff jest za duży
+ 1018 - 0
src/views/cw/projectRecords/ProjectRecordsAddForm.vue


+ 170 - 0
src/views/cw/projectRecords/ProjectRecordsChooseCom.vue

@@ -0,0 +1,170 @@
+<template>
+  <div>
+    <el-dialog
+      title="选择项目"
+      :close-on-click-modal="false"
+	  draggable
+      width="1100px"
+      height="500px"
+      @close="close"
+      append-to-body
+      v-model="visible">
+      <div style="height: calc(100% - 80px);">
+        <el-form :inline="true" class="query-form" ref="searchForm" :model="searchForm" @submit.native.prevent>
+          <!-- 搜索框-->
+          <el-form-item label="项目名称" prop="projectName">
+            <el-input v-model="searchForm.projectName" placeholder="请输入项目名称" clearable></el-input>
+          </el-form-item>
+          <el-form-item label="项目编号" prop="projectNumber">
+            <el-input v-model="searchForm.projectNumber" placeholder="请输入项目编号" clearable></el-input>
+          </el-form-item>
+          <el-form-item label="项目经理" prop="projectMasterName">
+            <el-input v-model="searchForm.projectMasterName" placeholder="请输入项目经理" clearable></el-input>
+          </el-form-item>
+          <el-form-item label="创建时间" prop="createDates">
+            <el-date-picker
+              placement="bottom-start"
+              format="yyyy-MM-dd HH:mm:ss"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              v-model="searchForm.createDates"
+              type="datetimerange"
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期">
+            </el-date-picker>
+          </el-form-item>
+
+          <el-form-item>
+            <el-button type="primary" @click="list()" icon="el-icon-search">查询</el-button>
+            <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>
+          </el-form-item>
+        </el-form>
+
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="400px"
+          :loading="loading"
+          ref="projectTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          :print-config="{}"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :row-config="{isCurrent: true}"
+          :radio-config="{trigger: 'row'}"
+        >
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="radio" width="60px"></vxe-column>
+          <vxe-column min-width="230" align="center" title="项目名称" field="projectName"></vxe-column>
+          <vxe-column min-width="160" align="center" title="项目编号" field="projectNumber"></vxe-column>
+          <vxe-column min-width="160" align="center" title="项目经理" field="projectMasterName"></vxe-column>
+          <vxe-column min-width="160" align="center" title="创建人" field="createBy.name"></vxe-column>
+          <vxe-column min-width="160" align="center" title="创建时间" field="createTime"></vxe-column>
+
+        </vxe-table>
+        <vxe-pager
+          background
+          :current-page="tablePage.currentPage"
+          :page-size="tablePage.pageSize"
+          :total="tablePage.total"
+          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+          @page-change="currentChangeHandle">
+        </vxe-pager>
+      </div>
+		<template #footer>
+			<span class="dialog-footer">
+			  <el-button @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			  <el-button type="primary" v-if="method != 'view'" @click="getProject()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+			</span>
+		</template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import projectRecordsService from '@/api/cw/projectRecords/ProjectRecordsService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        dataList: [],
+        searchForm: {
+          projectMasterName: '',
+          projectNumber: '',
+          projectName: '',
+          createDates: [],
+          status: ''
+        }
+      }
+    },
+    created () {
+    },
+    components: {
+    },
+    methods: {
+      init () {
+        this.visible = true
+        this.list()
+      },
+      // 表单提交
+      getProject () {
+        let row = this.$refs.projectTable.getRadioRecord()
+        if (this.commonJS.isEmpty(row)) {
+          this.$message.error('请选择一条数据')
+          return
+        }
+        this.close()
+        this.$emit('getProject', row)
+      },
+      list () {
+        this.loading = true
+        // this.searchForm.createId = this.$store.state.user.id
+        this.searchForm.status = '5'
+        projectRecordsService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+        })
+      },
+      // 当前页
+      currentChangeHandle ({currentPage, pageSize}) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.list()
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.list()
+      },
+      close () {
+        this.$refs.searchForm.resetFields()
+        this.visible = false
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-dialog__body {
+    padding-top: 0px;
+    padding-bottom: 15px;
+  }
+</style>

Plik diff jest za duży
+ 1240 - 0
src/views/cw/projectRecords/ProjectRecordsForm.vue


+ 435 - 0
src/views/cw/projectRecords/ProjectRecordsList.vue

@@ -0,0 +1,435 @@
+<template>
+  <div class="page">
+    <el-form :inline="true" v-if="searchVisible" class="query-form m-b-10" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+      <!-- 搜索框-->
+      <el-form-item label="项目名称" prop="projectName">
+        <el-input v-model="searchForm.projectName" placeholder="请输入项目名称" clearable></el-input>
+      </el-form-item>
+      <el-form-item label="项目编号" prop="projectNumber">
+        <el-input v-model="searchForm.projectNumber" placeholder="请输入项目编号" clearable></el-input>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="项目经理1" prop="projectMasterName">
+<!--        <el-input v-model="searchForm.projectMasterName" placeholder="请输入项目经理" clearable></el-input>-->
+        <UserSelect :limit='1' :userName="searchForm.projectMasterName" @getValue='(value, label) => {searchForm.projectMasterName = label}'></UserSelect>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="项目经理2" prop="realHeaderName">
+        <!--        <el-input v-model="searchForm.projectMasterName" placeholder="请输入项目经理" clearable></el-input>-->
+        <UserSelect :limit='1' :userName="searchForm.realHeaderName" @getValue='(value, label) => {searchForm.realHeaderName = label}'></UserSelect>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="创建时间" prop="createDates">
+        <el-date-picker
+          placement="bottom-start"
+          format="yyyy-MM-dd HH:mm:ss"
+          value-format="yyyy-MM-dd HH:mm:ss"
+          v-model="searchForm.createDates"
+          type="datetimerange"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期">
+        </el-date-picker>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="default" @click="showHide" :icon="showHideIcon">{{showHideName}}</el-button>
+        <el-button type="primary" @click="refreshList()" icon="el-icon-search">查询</el-button>
+        <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <div class="jp-table top" style="">
+      <vxe-toolbar :refresh="{query: refreshList}" ref="toolbarRef" export custom>
+        <template #buttons>
+          <el-button v-if="hasPermission('cwProjectRecords:add')" type="primary" icon="el-icon-plus" @click="add()">新建</el-button>
+          <!--          <el-button v-if="hasPermission('klg:question:del')" type="danger" icon="el-icon-delete" @click="del()" :disabled="$refs.questionsTable && $refs.questionsTable.getCheckboxRecords().length === 0" plain>删除</el-button>-->
+        </template>
+		  <template #tools>
+			  <vxe-button
+				  text
+				  type="primary"
+				  :title="searchVisible ? '收起检索' : '展开检索'"
+				  icon="vxe-icon-search"
+				  class="tool-btn"
+				  @click="searchVisible = !searchVisible"
+			  ></vxe-button>
+		  </template>
+      </vxe-toolbar>
+      <div style="height: calc(100% - 90px)">
+        <vxe-table
+          :key="tableKey"
+          border="inner"
+          auto-resize
+          resizable
+          height="auto"
+          :loading="loading"
+          size="small"
+          ref="projectTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          @sort-change="sortChangeHandle"
+          :sort-config="{remote:true}"
+          :export-config="{
+                    remote: true,
+                    filename: `项目数据${moment(new Date()).format('YYYY-MM-DD')}`,
+                    sheetName: `项目数据${moment(new Date()).format('YYYY-MM-DD')}`,
+                    exportMethod: exportMethod,
+                    types: ['xlsx'],
+                    modes: ['current', 'selected', 'all']
+                  }"
+          :data="dataList"
+          :checkbox-config="{}">
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="checkbox" width="40" ></vxe-column>
+          <vxe-column min-width="230" align="center" title="项目名称" field="projectName">
+            <template #default="scope">
+              <el-link  type="primary" :underline="false" v-if="hasPermission('cwProjectRecords:view')" @click="view(scope.row.id)">{{scope.row.projectName}}</el-link>
+              <el-link  type="primary" :underline="false" v-else-if="hasPermission('cwProjectRecords:view')"  @click="view(scope.row.id,)">{{scope.row.projectName}}</el-link>
+              <span v-else>{{scope.row.projectName}}</span>
+            </template>
+          </vxe-column>
+          <vxe-column min-width="160" align="center" title="项目编号" field="projectNumber"></vxe-column>
+          <vxe-column min-width="230" align="center" title="合同名称" field="contractName">
+            <template #default="scope">
+              <el-link  type="primary" :underline="false" v-if="commonJS.isNotEmpty(scope.row.contractId)&&commonJS.isNotEmpty(scope.row.contractName)" @click="viewContract(scope.row.contractId)">{{scope.row.contractName}}</el-link>
+              <span v-else style="color: red">暂无合同</span>
+            </template>
+          </vxe-column>
+          <vxe-column min-width="160" align="center" title="客户名称" field="clientContactsName"></vxe-column>
+          <vxe-column min-width="160" align="center" title="项目经理1" field="projectMasterName"></vxe-column>
+          <vxe-column min-width="160" align="center" title="项目经理2" field="realHeaderName"></vxe-column>
+          <vxe-column min-width="160" align="center" title="创建人" field="createBy.name"></vxe-column>
+          <vxe-column min-width="160" align="center" title="创建时间" field="createTime"></vxe-column>
+          <vxe-column title="操作" width="150px" fixed="right" align="center">
+            <template  #default="scope">
+              <el-button v-if="hasPermission('cwProjectRecords:edit')&&scope.row.reportReview !== '1'&&(scope.row.createBy.id === $store.state.user.id||isAdmin||haveProjectIds.includes(scope.row.id))" text type="primary"  size="small" @click="edit(scope.row.id)">修改</el-button>
+<!--              <el-button v-else-if="hasPermission('cwProjectRecords:edit')&&isAdmin" type="text"  size="small" @click="edit(scope.row.id)">修改</el-button>-->
+<!--              <el-button v-if="hasPermission('cwProjectRecords:edit')&&scope.row.createBy.id === $store.state.user.id&&scope.row.status==='2'" type="text"  size="small" @click="reback(scope.row)">撤回</el-button>-->
+              <el-button v-if="hasPermission('cwProjectRecords:del')&&scope.row.reportReview !== '1'&&(scope.row.createBy.id === $store.state.user.id||isAdmin||haveProjectIds.includes(scope.row.id))" text type="primary"   size="small" @click="del(scope.row.id)">删除</el-button>
+<!--              <el-button v-else-if="hasPermission('cwProjectRecords:del')&&isAdmin&&(scope.row.status==='1'||scope.row.status==='3' ||scope.row.status==='5')" type="text"   size="small" @click="del(scope.row.id)">删除</el-button>-->
+            </template>
+          </vxe-column>
+        </vxe-table>
+        <vxe-pager
+          background
+          size="small"
+          :current-page="tablePage.currentPage"
+          :page-size="tablePage.pageSize"
+          :total="tablePage.total"
+          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+          @page-change="currentChangeHandle">
+        </vxe-pager>
+      </div>
+    </div>
+    <ProjectRecordsForm ref="projectRecordsForm" @refreshList="refreshList"></ProjectRecordsForm>
+    <ContractNameForm ref="contractNameForm"></ContractNameForm>
+    <ProjectRecordsAddForm ref="projectRecordsAddForm" @refreshList="refreshList"></ProjectRecordsAddForm>
+  </div>
+</template>
+
+<script>
+  import projectRecordsService from '@/api/cw/projectRecords/ProjectRecordsService'
+  import taskService from '@/api/flowable/TaskService'
+  import processService from '@/api/flowable/ProcessService'
+  import ProjectRecordsForm from './ProjectRecordsForm'
+  import pick from 'lodash.pick'
+  import userService from '@/api/sys/UserService'
+  import UserSelect from '@/views/cw/workClientInfo/clientUserSelect'
+  import ContractNameForm from '../workContract/ContractNameForm'
+  import ProjectRecordsAddForm from './ProjectRecordsAddForm'
+  export default {
+    data () {
+      return {
+		searchVisible: true,
+        showHideItem: false,
+        showHideIcon: 'el-icon-arrow-down',
+        showHideName: '展示',
+        searchForm: {
+          projectMasterName: '',
+          projectNumber: '',
+          projectName: '',
+          createDates: [],
+          status: '',
+          realHeaderName: ''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        tableKey: '',
+        loading: false,
+        processDefinitionAuditId: '',
+        procDefAuditKey: '',
+        isAdmin: false,
+        haveProjectIds: ''
+      }
+    },
+    created () {
+    },
+    components: {
+      ProjectRecordsForm,
+      UserSelect,
+      ContractNameForm,
+      ProjectRecordsAddForm
+    },
+    computed: {
+      userName () {
+        return this.$store.state.user.name
+      },
+      user () {
+        this.createName = this.$store.state.user.name
+        return this.$store.state.user
+      }
+    },
+    mounted () {
+		this.$nextTick(() => {
+			//将表格和工具栏进行关联
+			const $table = this.$refs.projectTable;
+			const $toolbar = this.$refs.toolbarRef;
+			$table.connect($toolbar);
+		})
+      this.refreshList()
+    },
+    activated () {
+      this.refreshList()
+    },
+    methods: {
+      showHide () {
+        if (this.showHideItem === false) {
+          this.showHideItem = true
+          this.showHideIcon = 'el-icon-arrow-up'
+          this.showHideName = '隐藏'
+        } else {
+          this.showHideItem = false
+          this.showHideIcon = 'el-icon-arrow-down'
+          this.showHideName = '展示'
+        }
+      },
+      // 新增
+      add () {
+        this.$refs.projectRecordsAddForm.init('add', 'false')
+      },
+      // 修改
+      edit (id) {
+        id = id || this.$refs.projectTable.getCheckboxRecords().map(item => {
+          return item.id
+        })[0]
+        this.$refs.projectRecordsAddForm.init('edit', id)
+      },
+      // 查看
+      view (id) {
+        this.$refs.projectRecordsForm.init('view', id)
+      },
+      viewContract (id) {
+        this.$refs.contractNameForm.init('view', id)
+      },
+      // 查询当前用户是否是管理员用户
+      checkIsAdmin () {
+        userService.is().then((data) => {
+          this.isAdmin = data
+        })
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        projectRecordsService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          projectRecordsService.getHaveProjectIds().then((data) => {
+            if (this.commonJS.isNotEmpty(data)) {
+              this.haveProjectIds = data.map(i => {
+                if (this.commonJS.isNotEmpty(i)) {
+                  return i
+                }
+              }).join(',')
+            }
+          })
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          // this.tableKey = Math.random()
+          this.loading = false
+        })
+        this.checkIsAdmin()
+        processService.getByName('财务-项目登记').then((data) => {
+          if (!this.commonJS.isEmpty(data.id)) {
+            this.processDefinitionAuditId = data.id
+            this.procDefAuditKey = data.key
+          }
+        })
+      },
+      // 当前页
+      currentChangeHandle ({ currentPage, pageSize }) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.refreshList()
+      },
+      // 排序
+      sortChangeHandle (column) {
+        this.tablePage.orders = []
+        if (column.order != null) {
+          this.tablePage.orders.push({column: this.$utils.toLine(column.property), asc: column.order === 'asc'})
+        }
+        this.refreshList()
+      },
+      // 删除
+      del (id) {
+        let ids = id || this.$refs.projectTable.getCheckboxRecords().map(item => {
+          return item.id
+        }).join(',')
+        this.$confirm(`确定删除所选项吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.loading = true
+          projectRecordsService.delete(ids).then((data) => {
+            if (data === '删除成功') {
+              this.$message.success(data)
+            } else {
+              this.$message.error(data)
+            }
+            this.refreshList()
+            this.loading = false
+          })
+        })
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      },
+      start () {
+        // 读取流程表单
+        let tabTitle = `发起流程【项目登记】`
+        let processTitle = `${this.userName} 在 ${this.moment(new Date()).format('YYYY-MM-DD HH:mm')} 发起了 [项目登记]`
+        taskService.getTaskDef({ procDefId: this.processDefinitionAuditId,
+          status: 'startAndHold'}).then((data) => {
+            this.$router.push({
+              path: '/flowable/task/TaskForm',
+              query: {
+                ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                procDefId: this.processDefinitionAuditId,
+                procDefKey: this.procDefAuditKey,
+                status: 'startAndHold',
+                title: tabTitle,
+                formType: data.formType,
+                formUrl: data.formUrl,
+                formTitle: processTitle,
+                businessId: 'false',
+                isShow: false,
+                routePath: '/cw/projectRecords/ProjectRecordsList'
+              }
+            })
+          })
+      },
+      // 发起项目登记
+      push (row) {
+        // 读取流程表单
+        let title = `发起流程【项目登记】`
+        let processTitle = `${this.userName} 在 ${this.moment(new Date()).format('YYYY-MM-DD HH:mm')} 发起了[项目登记]`
+        let status = 'startAndHold'
+        if (row.status === '3') {
+          status = 'startAndClose'
+        } else if (row.status === '4') {
+          status = 'reapplyFlag'
+        }
+        taskService.getTaskDef({ procDefId: this.processDefinitionAuditId,
+          businessId: row.id,
+          businessTable: 'cw_project_records'}).then((data) => {
+            this.$router.push({
+              path: '/flowable/task/TaskForm',
+              query: {
+                ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                procDefId: this.processDefinitionAuditId,
+                procDefKey: this.procDefAuditKey,
+                title: title,
+                formType: data.formType,
+                formUrl: data.formUrl,
+                formTitle: processTitle,
+                businessTable: 'cw_project_records',
+                businessId: row.id,
+                isShow: 'false',
+                status: status,
+                routePath: '/cw/projectRecords/ProjectRecordsList'
+              }
+            })
+          })
+      },
+      // 查看项目登记流程结果
+      detail (row) {
+        if (row.status !== '0' && row.status !== '1') {
+          // eslint-disable-next-line eqeqeq
+          taskService.getTaskDef({
+            procInsId: row.procInsId,
+            procDefId: this.processDefinitionAuditId
+          }).then((data) => {
+            this.$router.push({
+              path: '/flowable/task/TaskFormDetail',
+              query: {
+                ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                isShow: 'false',
+                readOnly: true,
+                title: '项目登记' + '流程详情',
+                formTitle: '项目登记' + '流程详情',
+                businessId: row.id,
+                status: 'reback'
+              }
+            })
+          })
+        }
+      },
+      // 撤回项目登记
+      reback (row) {
+        this.$confirm(`确定要撤回该申请吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(async () => {
+          await projectRecordsService.queryById(row.id).then((data) => {
+            if (data.status !== '2') { // status的值不等于“审核中”,就弹出提示
+              this.$message.error('数据已发生改变或不存在,请刷新数据')
+              this.refreshList()
+            } else {
+              processService.revokeProcIns(row.procInsId).then((data) => {
+                let form = {status: '3', id: row.id}
+                projectRecordsService.updateStatusById(form)
+                this.$message.success(data)
+                this.refreshList()
+              })
+            }
+          })
+        })
+      },
+      // 自定义服务端导出
+      exportMethod ({ options }) {
+        // 传给服务端的参数
+        const params = {
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm,
+          filename: options.filename,
+          sheetName: options.sheetName,
+          isHeader: options.isHeader,
+          original: options.original,
+          mode: options.mode,
+          selectIds: options.mode === 'selected' ? options.map(item => item.id) : [],
+          exportFields: options.columns.map(column => column.property)
+        }
+        return projectRecordsService.exportFile(params).then((res) => {
+          // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(res, options.filename)
+        }).catch(function (err) {
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      }
+    }
+  }
+</script>

+ 907 - 0
src/views/cw/projectRecords/ProjectRecordsTaskForm.vue

@@ -0,0 +1,907 @@
+<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
+  <div>
+    <el-row>
+      <el-col :span="24">
+        <el-form size="middle" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="status === 'audit' || status === 'taskFormDetail'"
+                     label-width="135px" @submit.native.prevent>
+          <el-divider v-if="commonJS.isNotEmpty(inputForm.contractId) && formReadOnly" content-position="left">
+            <el-link  type="primary" :underline="false" icon="el-icon-document" @click="viewContract(inputForm.contractId)"><b>查看合同详情</b></el-link>
+          </el-divider>
+          <el-divider v-else content-position="left"><i class="el-icon-document"></i> 选择合同</el-divider>
+          <el-row  :gutter="15">
+            <el-col :span="24">
+              <el-form-item label="合同名称" prop="contractName"
+                            :rules="[
+                 ]">
+                <el-input size="medium" :readonly="true" @focus="openContract()" v-model="inputForm.contractName" placeholder="请选择合同">
+                  <el-button slot="append" icon="el-icon-search" @click="openContract()"></el-button>
+                </el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="合同金额(元)" prop="contractAmount"
+                            :rules="[
+                 ]">
+                <el-input :disabled="true" v-model="inputForm.contractAmount" placeholder="请填写合同金额"></el-input>
+              </el-form-item>
+            </el-col>
+<!--            <el-col :span="12">-->
+<!--              <el-form-item label="合同份数" prop="contractNum"-->
+<!--                            :rules="[-->
+<!--                 ]">-->
+<!--                <el-input :disabled="true" v-model="inputForm.contractNum" placeholder="请填写合同份数"></el-input>-->
+<!--              </el-form-item>-->
+<!--            </el-col>-->
+            <el-col :span="12">
+              <el-form-item label="委托人" prop="clientContactsName"
+                            :rules="[
+                 ]">
+                <el-input :disabled="true" v-model="inputForm.clientContactsName" placeholder="请填写委托人"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="付款主体" prop="payerSubject"
+                            :rules="[
+                 ]">
+                <el-select :disabled="true" v-model="inputForm.payerSubject" placeholder="请选择付款主体" style="width:100%;">
+                  <el-option
+                    v-for="item in $dictUtils.getDictList('cw_payment_subject')"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value">
+                  </el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="付款方式" prop="paymentMethod"
+                            :rules="[
+                 ]">
+                <el-select :disabled="true" v-model="inputForm.paymentMethod" placeholder="请选择付款方式" style="width:100%;">
+                  <el-option
+                    v-for="item in $dictUtils.getDictList('cw_payment_method')"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value">
+                  </el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-divider content-position="left"><i class="el-icon-document"></i> 项目信息</el-divider>
+              <el-row  :gutter="15">
+                <el-col :span="12">
+                  <el-form-item label="项目名称" prop="projectName"
+                                :rules="[
+                                {required: true, message:'项目名称不能为空', trigger:'blur'}
+                   ]">
+                    <el-input v-model="inputForm.projectName" placeholder="请填写项目名称" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="项目编号" prop="projectNumber"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.projectNumber" placeholder="请填写项目编号" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="项目所属部门" prop="officeId"
+                                :rules="[
+                                {required: true, message:'项目所属部门不能为空', trigger:'blur'}
+                   ]">
+                    <SelectTree
+                      ref="officeTree"
+                      :props="{
+                          value: 'id',             // ID字段名
+                          label: 'name',         // 显示名称
+                          children: 'children'    // 子级字段名
+                        }"
+                      :url="`/sys/office/treeData?type=2`"
+                      :value="inputForm.officeId"
+                      :accordion="true"
+                      size="large"
+                      @getValue="(value) => {inputForm.officeId=value}"/>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="业务类型" prop="businessTypeName"
+                                :rules="[
+                   ]">
+                    <el-input :readonly="true" @focus="openBusinessTypeForm" v-model="inputForm.businessTypeName" placeholder="请填写业务类型" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="风险等级" prop="riskLevel"
+                                :rules="[
+                   ]">
+                    <el-select v-model="inputForm.riskLevel" placeholder="请选择风险等级" style="width:100%;">
+                      <el-option
+                        v-for="item in $dictUtils.getDictList('cw_project_risk_level')"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value">
+                      </el-option>
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="项目收费金额(元)" prop="projectMoney"
+                                :rules="[
+                   ]">
+                    <el-input-number
+                      v-model="inputForm.projectMoney"
+                      controls-position="right"
+                      style="width:100%"
+                      :precision="2"
+                      :max="9999999999"
+                      :step="0.01"
+                      :min="0"
+                      placeholder="请填写项目收费金额"
+                      :controls="false"
+                      clearable>
+                    </el-input-number>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="报备类型" prop="reportType"
+                                :rules="[
+                                 {required: true, message:'报备类型不能为空', trigger:'blur'}
+                  ]">
+                    <el-select v-model="inputForm.reportType" placeholder="请选择报备类型" clearable style="width: 100%;">
+                      <el-option
+                        v-for="item in $dictUtils.getDictList('cw_work_client_report_type')"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value">
+                      </el-option>
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="审计期间" prop="auditYear"
+                                :rules="[
+                   ]">
+                    <el-date-picker
+                      v-model="inputForm.auditYear"
+                      type="year"
+                      value-format="yyyy"
+                      placeholder="选择评审计期间"
+                      style="width:100%"
+                      placement="bottom-start"
+                      clearable>
+                    </el-date-picker>
+                  </el-form-item>
+                </el-col>
+<!--                <el-col :span="12">-->
+<!--                  <el-form-item label="项目预计开始时间" prop="planStartDate"-->
+<!--                                :rules="[-->
+<!--                                {required: true, message:'项目预计开始时间不能为空', trigger:'blur'}-->
+<!--                   ]">-->
+<!--                    <el-date-picker-->
+<!--                      v-model="inputForm.planStartDate"-->
+<!--                      type="date"-->
+<!--                      value-format="yyyy-MM-dd"-->
+<!--                      placeholder="选择项目预计开始时间"-->
+<!--                      style="width:100%"-->
+<!--                      placement="bottom-start"-->
+<!--                      clearable>-->
+<!--                    </el-date-picker>-->
+<!--                  </el-form-item>-->
+<!--                </el-col>-->
+<!--                <el-col :span="12">-->
+<!--                  <el-form-item label="项目预计结束时间" prop="planEndDate"-->
+<!--                                :rules="[-->
+<!--                                {required: true, message:'项目预计结束时间不能为空', trigger:'blur'}-->
+<!--                   ]">-->
+<!--                    <el-date-picker-->
+<!--                      v-model="inputForm.planEndDate"-->
+<!--                      type="date"-->
+<!--                      value-format="yyyy-MM-dd"-->
+<!--                      placeholder="选择项目预计结束时间"-->
+<!--                      style="width:100%"-->
+<!--                      placement="bottom-start"-->
+<!--                      clearable>-->
+<!--                    </el-date-picker>-->
+<!--                  </el-form-item>-->
+<!--                </el-col>-->
+                <el-col :span="12">
+                  <el-form-item label="项目预计时间" prop="planDate"
+                                :rules="[
+                                {required: true, message:'项目预计时间不能为空', trigger:'blur'}
+                   ]">
+                    <el-date-picker
+                      style="width: 100%"
+                      placement="bottom-start"
+                      format="yyyy-MM-dd HH:mm:ss"
+                      value-format="yyyy-MM-dd HH:mm:ss"
+                      v-model="inputForm.planDate"
+                      type="datetimerange"
+                      range-separator="至"
+                      start-placeholder="开始日期"
+                      @change="forUpdate"
+                      end-placeholder="结束日期">
+                    </el-date-picker>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="现场负责人" prop="projectLeaderId"
+                                :rules="[
+                   ]">
+                    <UserSelect size="medium" :readonly="true" :disabled="status === 'audit' || status === 'taskFormDetail'" :limit='1' :value="inputForm.projectLeaderId" @getValue='(value) => {inputForm.projectLeaderId = value}'></UserSelect>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="项目经理1" prop="projectMasterId"
+                                :rules="[
+                   ]">
+                    <UserSelectSignatory size="medium" ref="userSelect1" :disabled="status === 'audit' || status === 'taskFormDetail'" :readonly="true" :limit='1' :value="inputForm.projectMasterId" @getValue='(value) => {changeSignatory1(value)}'></UserSelectSignatory>
+
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="项目经理2" prop="realHeader"
+                                :rules="[
+                   ]">
+                    <UserSelectSignatory size="medium" ref="userSelect2" :disabled="status === 'audit' || status === 'taskFormDetail'" :readonly="true" :limit='1' :value="inputForm.realHeader" @getValue='(value) => {changeSignatory2(value)}'></UserSelectSignatory>
+                  </el-form-item>
+                </el-col>
+
+
+                <el-col :span="12">
+                  <el-form-item label="创建人" prop="createBy.name"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.createBy.name" placeholder="请填写创建人" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="创建时间" prop="createDate"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.createDate" placeholder="请填写创建时间" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+            </el-form>
+        <el-tabs v-model="activeName" type="border-card" @tab-click="tabHandleClick">
+          <el-tab-pane label="被服务单位" name="client">
+            <span slot="label"><span style="color: red;border-top: 20px">*</span> 被服务单位</span>
+            <el-row :gutter="15">
+              <el-button type="primary" style="margin-bottom: 15px" size="mini" :disabled="status === 'audit' || status === 'taskFormDetail'" @click="openWorkClient">
+                新增被服务单位
+              </el-button>
+            </el-row>
+            <el-row  :gutter="15">
+              <el-form :disabled="status === 'audit' || status === 'taskFormDetail'">
+                <vxe-table
+                  border
+                  show-overflow
+                  show-footer
+                  :column-config="{resizable: true}"
+                  ref="clientTable"
+                  :key="tableKeyClient"
+                  class="vxe-table-element"
+                  :data="inputForm.cwProjectClientInfoDTOList"
+                  style=""
+                  @cell-click=""
+                  @edit-closed=""
+                  highlight-current-row
+                  :edit-config="{trigger: 'click', mode: 'row', showStatus: false, autoClear: false}"
+                >
+                  <vxe-table-column align="center" field="name" title="客户名称" :edit-render="{}">
+                    <template v-slot:edit="scope">
+                      <el-input :readonly="true" v-model="scope.row.name" placeholder="客户名称" clearable></el-input>
+                    </template>
+                  </vxe-table-column>
+                  <vxe-table-column align="center" field="no" title="客户编号" :edit-render="{}">
+                    <template v-slot:edit="scope">
+                      <el-input :readonly="true" v-model="scope.row.no" placeholder="客户编号" clearable></el-input>
+                    </template>
+                  </vxe-table-column>
+<!--                  <vxe-table-column align="center" field="companyLevel" title="层级" :edit-render="{}">-->
+<!--                    <template v-slot:edit="scope">-->
+<!--                      <el-input :readonly="true" v-model="scope.row.companyLevel" placeholder="层级" clearable></el-input>-->
+<!--                    </template>-->
+<!--                  </vxe-table-column>-->
+                  <vxe-table-column align="center" title="操作" width="100">
+                    <template v-slot="scope">
+                      <el-button size="mini" type="danger" @click="removeEvent(scope.row,scope.$rowIndex,'client')">删除</el-button>
+                    </template>
+                  </vxe-table-column>
+                </vxe-table>
+              </el-form>
+            </el-row>
+          </el-tab-pane>
+          <el-tab-pane label="附件" name="files">
+            <!--        附件-->
+            <UpLoadComponent ref="uploadComponent"></UpLoadComponent>
+          </el-tab-pane>
+
+        </el-tabs>
+      </el-col>
+    </el-row>
+    <WorkContractChooseCom ref="workContractChooseCom" @getContract="getContract"></WorkContractChooseCom>
+    <WorkClientChooseForm ref="workClientChooseForm" @getWorkClientChoose="getWorkClientChoose"></WorkClientChooseForm>
+    <CwProjectBusinessTypeListForm ref="cwProjectBusinessTypeListForm" @getBusinessType="getBusinessType"></CwProjectBusinessTypeListForm>
+    <ContractNameForm ref="contractNameForm"></ContractNameForm>
+  </div>
+</template>
+
+<script>
+  import UpLoadComponent from '@/views/common/UpLoadComponent'
+  import SelectUserTree from '@/views/utils/treeUserSelect'
+  import SelectTree from '@/components/treeSelect/treeSelect.vue'
+  import UserSelect from '@/components/userSelect'
+  import ProjectRecordsService from '@/api/cw/projectRecords/ProjectRecordsService'
+  import EnterpriseSearchService from '@/api/cw/common/EnterpriseSearchService'
+  import WorkClientChooseForm from '../workClientInfo/WorkClientChooseForm'
+  import WorkContractChooseCom from './WorkContractChooseCom'
+  import CwProjectBusinessTypeListForm from '@/views/cw/projectBusinessType/CwProjectBusinessTypeListForm'
+  import ContractNameForm from '../workContract/ContractNameForm'
+  import WorkClientService from '@/api/cw/workClientInfo/WorkClientService'
+  import ContractInfoService from '@/api/cw/workContract/ContractInfoService'
+  import UserSelectSignatory from '../workClientInfo/clientUserSelect'
+  export default {
+    props: {
+      businessId: {
+        type: String,
+        default: ''
+      },
+      formReadOnly: {
+        type: Boolean,
+        default: false
+      },
+      status: {
+        type: String,
+        default: ''
+      }
+    },
+    data () {
+      return {
+        title: '',
+        method: '',
+        loading: false,
+        inputForm: {
+          id: '',
+          createDate: '',
+          createBy: {
+            id: '',
+            name: ''
+          },
+          remarks: '',
+          projectNumber: '',
+          projectName: '',
+          officeId: '',
+          projectMoney: '',
+          auditYear: '',
+          planStartDate: '',
+          planEndDate: '',
+          projectMasterId: '',
+          projectLeaderId: '',
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          workAttachmentDtoList: [],
+          cwProjectClientInfoDTOList: [],
+          contractName: '',
+          contractAmount: '',
+          contractNum: '',
+          payerSubject: '',
+          paymentMethod: '',
+          contractId: '',
+          businessType: '',
+          riskLevel: '',
+          businessTypeName: '',
+          planDate: [],
+          realHeader: '',
+          clientContactsName: '',
+          reportType: ''
+        },
+        keyWatch: '',
+        activeName: 'client',
+        tableKey: '',
+        tableKeyClient: '1'
+      }
+    },
+    projectRecordsService: null,
+    enterpriseSearchService: null,
+    workClientService: null,
+    contractInfoService: null,
+    created () {
+      this.enterpriseSearchService = new EnterpriseSearchService()
+      this.projectRecordsService = new ProjectRecordsService()
+      this.workClientService = new WorkClientService()
+      this.contractInfoService = new ContractInfoService()
+    },
+    computed: {
+      bus: {
+        get () {
+          this.$refs.uploadComponent.setDividerName('附件', false)
+          return this.businessId
+        },
+        set (val) {
+          this.businessId = val
+        }
+      }
+    },
+    watch: {
+      'keyWatch': {
+        handler (newVal) {
+          if (this.commonJS.isNotEmpty(this.bus)) {
+            this.init('', this.bus)
+          } else {
+            this.$nextTick(() => {
+              this.$refs.inputForm.resetFields()
+            })
+          }
+        }
+      }
+    },
+    components: {
+      SelectUserTree,
+      UpLoadComponent,
+      SelectTree,
+      UserSelect,
+      WorkClientChooseForm,
+      WorkContractChooseCom,
+      CwProjectBusinessTypeListForm,
+      ContractNameForm,
+      UserSelectSignatory
+    },
+    methods: {
+      getKeyWatch (keyWatch) {
+        this.keyWatch = keyWatch
+      },
+      forUpdate () {
+        this.$forceUpdate()
+      },
+      init (method, id) {
+        this.activeName = 'client'
+        this.projectRecordsService = new ProjectRecordsService()
+        this.method = method
+        this.inputForm = {
+          id: '',
+          createDate: '',
+          createBy: {
+            id: '',
+            name: JSON.parse(localStorage.getItem('user')).name
+          },
+          remarks: '',
+          projectNumber: '',
+          projectName: '',
+          officeId: '',
+          projectMoney: '',
+          auditYear: '',
+          planStartDate: '',
+          planEndDate: '',
+          projectMasterId: '',
+          projectLeaderId: '',
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          workAttachmentDtoList: [],
+          cwProjectClientInfoDTOList: [],
+          contractName: '',
+          contractAmount: '',
+          contractNum: '',
+          payerSubject: '',
+          paymentMethod: '',
+          contractId: '',
+          businessType: '',
+          riskLevel: '',
+          businessTypeName: '',
+          planDate: [],
+          realHeader: '',
+          clientContactsName: '',
+          reportType: ''
+        }
+        this.inputForm.id = id
+        this.loading = false
+        this.$nextTick(() => {
+          this.$refs.inputForm.resetFields()
+          this.loading = true
+          this.projectRecordsService.queryById(this.inputForm.id).then(({data}) => {
+            this.$refs.uploadComponent.clearUpload()
+            this.inputForm = this.recover(this.inputForm, data)
+            this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+            if (this.commonJS.isEmpty(this.inputForm.workAttachmentDtoList)) {
+              this.inputForm.workAttachmentDtoList = []
+            }
+            if (this.commonJS.isEmpty(this.inputForm.createDate)) {
+              this.inputForm.createDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+            }
+            if (this.commonJS.isEmpty(this.inputForm.createBy.name)) {
+              this.inputForm.createBy.name = JSON.parse(localStorage.getItem('user')).name
+            }
+            if (this.commonJS.isEmpty(this.inputForm.officeId)) {
+              this.inputForm.officeId = JSON.parse(localStorage.getItem('user')).officeDTO.id
+            }
+            if (this.status === 'audit' || this.status === 'taskFormDetail') {
+              this.method = 'view'
+            }
+            this.$refs.uploadComponent.newUpload(this.method, this.inputForm.workAttachmentDtoList, 'cw_project_records', null, null, null, null, false)
+            if (this.commonJS.isEmpty(this.inputForm.cwProjectClientInfoDTOList)) {
+              this.inputForm.cwProjectClientInfoDTOList = []
+            }
+            // if (this.commonJS.isEmpty(this.inputForm.projectMasterId)) {
+            //   this.inputForm.projectMasterId = JSON.parse(localStorage.getItem('user')).id
+            // }
+            if (this.commonJS.isEmpty(this.inputForm.projectLeaderId)) {
+              this.inputForm.projectLeaderId = JSON.parse(localStorage.getItem('user')).id
+            }
+            if (this.commonJS.isEmpty(this.inputForm.projectMoney)) {
+              this.inputForm.projectMoney = 0
+            }
+            this.loading = false
+          })
+        })
+      },
+      saveForm (callback) {
+        this.doSubmit('save', callback)
+      },
+      startForm (callback) {
+        // if (this.commonJS.isNotEmpty(this.inputForm.planEndDate) && this.commonJS.isNotEmpty(this.inputForm.planStartDate)) {
+        //   if (this.moment(this.inputForm.planEndDate).format('YYYY-MM-DD') < this.moment(this.inputForm.planStartDate).format('YYYY-MM-DD') || this.moment(this.inputForm.planEndDate).format('YYYY-MM-DD') === this.moment(this.inputForm.planStartDate).format('YYYY-MM-DD')) {
+        //     this.$message.error('项目预计开始时间要小于项目预计结束时间')
+        //     this.loading = false
+        //     throw new Error('项目预计开始时间要小于项目预计结束时间')
+        //   } else {
+        //     this.doSubmit('start', callback)
+        //   }
+        // } else {
+        //   this.doSubmit('start', callback)
+        // }
+        this.doSubmit('start', callback)
+      },
+      async agreeForm (callback) {
+        await this.projectRecordsService.queryById(this.inputForm.id).then(({data}) => {
+          if (data.status !== '2') { // 审核状态不是“待审核”,就弹出提示
+            this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+            throw new Error()
+          } else {
+            this.doSubmit('agree', callback)
+          }
+        })
+      },
+      reapplyForm (callback) {
+        this.projectRecordsService.queryById(this.inputForm.id).then(({data}) => {
+          if (data.status !== '4') { // 审核状态不是“驳回”,就弹出提示
+            this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+            throw new Error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+          } else {
+            this.doSubmit('reapply', callback)
+          }
+        })
+      },
+      // 表单提交
+      doSubmit (status, callback) {
+        if (status === 'save') {
+          // 暂存
+          this.inputForm.status = '1'
+          this.loading = true
+          if (this.$refs.uploadComponent.checkProgress()) {
+            this.loading = false
+            return
+          }
+          if (this.commonJS.isNotEmpty(this.inputForm.planDate)) {
+            this.inputForm.planStartDate = this.inputForm.planDate[0]
+            this.inputForm.planEndDate = this.inputForm.planDate[1]
+          } else {
+            this.inputForm.planStartDate = ''
+            this.inputForm.planEndDate = ''
+          }
+          this.inputForm.workAttachmentDtoList = this.$refs.uploadComponent.getDataList()
+          this.inputForm.createDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+          this.projectRecordsService.saveForm(this.inputForm).then(({data}) => {
+            callback(data.businessTable, data.businessId, this.inputForm)
+            this.loading = false
+          }).catch(() => {
+            this.loading = false
+          })
+          return
+        } else if (status === 'start') {
+          // 送审  待审核
+          this.inputForm.status = '2'
+        } else if (status === 'agree') {
+          // 审核同意
+          this.inputForm.agreeDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+          this.inputForm.agreeUserId = this.$store.state.user.id
+          this.inputForm.status = '5'
+        } else if (status === 'reapply') {
+          this.inputForm.status = '2'
+        }
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            if (this.commonJS.isEmpty(this.inputForm.projectMasterId) && this.commonJS.isEmpty(this.inputForm.realHeader)) {
+              this.loading = false
+              this.$message.error('“项目经理1”与“项目经理2”至少填写一项')
+              throw new Error('“项目经理1”与“项目经理2”至少填写一项')
+            }
+            if (this.commonJS.isEmpty(this.inputForm.cwProjectClientInfoDTOList)) {
+              this.loading = false
+              this.$message.error('“被服务单位”中至少填写一条信息')
+              throw new Error('“被服务单位”中至少填写一条信息')
+            }
+            if (this.$refs.uploadComponent.checkProgress()) {
+              this.loading = false
+              throw new Error()
+            }
+            this.inputForm.planStartDate = this.inputForm.planDate[0]
+            this.inputForm.planEndDate = this.inputForm.planDate[1]
+            this.inputForm.workAttachmentDtoList = this.$refs.uploadComponent.getDataList()
+            if (this.commonJS.isEmpty(this.inputForm.createDate)) {
+              this.inputForm.createDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+            }
+            this.projectRecordsService.saveForm(this.inputForm).then(({data}) => {
+              callback(data.businessTable, data.businessId, this.inputForm)
+              this.loading = false
+            }).catch(() => {
+              this.loading = false
+            })
+          }
+        })
+      },
+      async updateStatusById (type, callback) {
+        if (await this.$refs.uploadComponent.checkProgress()) {
+          this.loading = false
+          throw new Error()
+        } else {
+          if (type === 'reject' || type === 'reback') {
+            await this.projectRecordsService.queryById(this.inputForm.id).then(({data}) => {
+              if (data.status !== '2') { // status的值不等于“审核中”就弹出提示
+                this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+                throw new Error()
+              } else {
+                if (type === 'reject') {
+                  // 驳回
+                  this.inputForm.status = '4'
+                  let param = {status: '4', id: this.inputForm.id}
+                  this.projectRecordsService.updateStatusById(param).then(() => {
+                    callback()
+                  })
+                }
+                if (type === 'reback') {
+                  // 撤回
+                  let param = {status: '3', id: this.inputForm.id}
+                  this.projectRecordsService.updateStatusById(param)
+                }
+              }
+            })
+          } else if (type === 'hold') {
+            this.projectRecordsService.queryById(this.inputForm.id).then(({data}) => {
+              if (data.status !== '4') { // status的值不等于“驳回”就弹出提示
+                this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+                throw new Error()
+              } else {
+                // 终止
+                let param = {status: '1', id: this.inputForm.id}
+                this.projectRecordsService.updateStatusById(param).then(() => {
+                  callback()
+                })
+              }
+            })
+          }
+        }
+      },
+      close () {
+        this.inputForm = {
+          id: '',
+          createDate: '',
+          createBy: {
+            id: '',
+            name: ''
+          },
+          remarks: '',
+          projectNumber: '',
+          projectName: '',
+          officeId: '',
+          projectMoney: '',
+          auditYear: '',
+          planStartDate: '',
+          planEndDate: '',
+          projectMasterId: '',
+          projectLeaderId: '',
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          workAttachmentDtoList: [],
+          cwProjectClientInfoDTOList: [],
+          contractName: '',
+          contractAmount: '',
+          contractNum: '',
+          payerSubject: '',
+          paymentMethod: '',
+          contractId: '',
+          businessType: '',
+          riskLevel: '',
+          businessTypeName: '',
+          planDate: [],
+          realHeader: '',
+          clientContactsName: '',
+          reportType: ''
+        }
+        this.$refs.uploadComponent.clearUpload()
+        this.$refs.inputForm.resetFields()
+      },
+      tabHandleClick (event) {
+        // console.log(event)
+      },
+      // 新增
+      // eslint-disable-next-line no-dupe-keys
+      insertEvent (type) {
+        if (type === 'client') {
+          let d = {
+            no: '',
+            name: '',
+            companyLevel: ''
+          }
+          if (this.commonJS.isEmpty(this.inputForm.cwProjectClientInfoDTOList)) {
+            this.inputForm.cwProjectClientInfoDTOList = []
+          }
+          this.$refs.clientTable.insertAt(d)
+          this.inputForm.cwProjectClientInfoDTOList.push(d)
+          this.tableKeyClient = Math.random()
+        }
+      },
+      // 删除
+      removeEvent (row, rowIndex, type) {
+        if (type === 'client') {
+          this.$refs.clientTable.remove(row)
+          this.inputForm.cwProjectClientInfoDTOList.splice(rowIndex, 1)
+        }
+      },
+      // 打开客户选择组件
+      openWorkClient () {
+        this.$refs.workClientChooseForm.init()
+      },
+      getWorkClientChoose (list) {
+        if (this.commonJS.isEmpty(this.inputForm.cwProjectClientInfoDTOList)) {
+          this.inputForm.cwProjectClientInfoDTOList = []
+        }
+        let _this = this
+        let _list = list
+        const waitForEach = function () {
+          return new Promise(function (resolve, reject) {
+            _list.forEach((item) => {
+              _this.inputForm.cwProjectClientInfoDTOList.forEach(client => {
+                if (item.no === client.no) {
+                  _this.$message.error('已存在客户 “' + client.name + '”,请重新选择')
+                  throw new Error('已存在客户 “' + client.name + '”,请重新选择')
+                }
+              })
+            })
+            resolve()
+          })
+        }
+        waitForEach().then(() => {
+          list.forEach(item => {
+            this.$refs.clientTable.insertAt(item)
+            this.inputForm.cwProjectClientInfoDTOList.push(item)
+            this.tableKeyClient = Math.random()
+          })
+        })
+      },
+      getContract (row) {
+        console.log('111')
+        // 首先删除之前合同与被服务单位的关联(委托方联系人)
+        let _this = this
+        const waitDelClient = function () {
+          return new Promise(async (resolve, reject) => {
+            if (_this.commonJS.isNotEmpty(_this.inputForm.contractId)) {
+              // 根据合同id查询合同信息
+              _this.contractInfoService.findById(_this.inputForm.contractId).then(({data}) => {
+                if (_this.commonJS.isNotEmpty(data.customerId)) {
+                  // 根据合同的委托人联系人id查询客户信息
+                  _this.workClientService.queryById(data.customerId).then((client) => {
+                    if (_this.commonJS.isNotEmpty(client.data.no)) {
+                      // 将被服务单位中与合同委托人联系人相同删除
+                      _this.inputForm.cwProjectClientInfoDTOList.forEach((item, index) => {
+                        if (item.no === client.data.no) {
+                          _this.$refs.clientTable.remove(item)
+                          _this.inputForm.cwProjectClientInfoDTOList.splice(index, 1)
+                        }
+                      })
+                      setTimeout(() => {
+                        resolve()
+                      }, 400)
+                    } else {
+                      resolve()
+                    }
+                  })
+                } else {
+                  resolve()
+                }
+              })
+            } else {
+              resolve()
+            }
+          })
+        }
+        waitDelClient().then(() => {
+          this.inputForm.contractName = row.contractName
+          this.inputForm.contractAmount = row.contractAmount
+          this.inputForm.contractNum = row.contractNum
+          this.inputForm.payerSubject = row.payerSubject
+          this.inputForm.paymentMethod = row.paymentMethod
+          this.inputForm.contractId = row.id
+          this.inputForm.clientContactsName = row.clientContactsName
+          if (this.commonJS.isNotEmpty(row.clientContacts)) {
+            if (this.commonJS.isEmpty(this.inputForm.cwProjectClientInfoDTOList)) {
+              this.inputForm.cwProjectClientInfoDTOList = []
+            }
+            this.workClientService.queryById(row.clientContacts).then((data) => {
+              if (this.commonJS.isNotEmpty(data.data.id)) {
+                let _data = data.data
+                const waitForEach = function () {
+                  return new Promise(function (resolve, reject) {
+                    _this.inputForm.cwProjectClientInfoDTOList.forEach(client => {
+                      if (_data.no === client.no) {
+                        // _this.$message.error('已存在客户 “' + client.name + '”')
+                        throw new Error('已存在客户 “' + client.name + '”')
+                      }
+                    })
+                    resolve()
+                  })
+                }
+                waitForEach().then(() => {
+                  this.$refs.clientTable.insertAt(data.data)
+                  this.inputForm.cwProjectClientInfoDTOList.push(data.data)
+                  this.tableKeyClient = Math.random()
+                })
+              }
+            })
+          }
+        })
+      },
+      // 打开合同选择组件
+      openContract () {
+        this.$refs.workContractChooseCom.init()
+      },
+      getBusinessType (row) {
+        this.inputForm.businessType = row.id
+        this.inputForm.businessTypeName = row.name
+      },
+      // 打开业务类型选择组件
+      openBusinessTypeForm () {
+        this.$refs.cwProjectBusinessTypeListForm.init()
+      },
+      // 查看合同详情
+      viewContract (id) {
+        this.$refs.contractNameForm.init('view', id)
+      },
+      changeSignatory1 (value) {
+        if (this.inputForm.realHeader === value && this.commonJS.isNotEmpty(value)) {
+          this.$message.warning('项目经理1和项目经理2不可以相同')
+          this.$nextTick(() => {
+            this.inputForm.projectMasterId = ''
+            this.$refs.userSelect1.changeNameValue('')
+            this.$refs.userSelect1.clearSelectData()
+            this.$forceUpdate()
+          })
+        } else {
+          this.inputForm.projectMasterId = value
+        }
+      },
+      changeSignatory2 (value) {
+        if (this.inputForm.projectMasterId === value && this.commonJS.isNotEmpty(value)) {
+          this.$message.warning('项目经理1和项目经理2不可以相同')
+          this.$nextTick(() => {
+            this.inputForm.realHeader = ''
+            this.$refs.userSelect2.changeNameValue('')
+            this.$refs.userSelect2.clearSelectData()
+            this.$forceUpdate()
+          })
+        } else {
+          this.inputForm.realHeader = value
+        }
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-input-number .el-input__inner {
+    text-align: left;
+  }
+</style>

+ 174 - 0
src/views/cw/projectRecords/WorkContractChooseCom.vue

@@ -0,0 +1,174 @@
+<template>
+  <div>
+    <el-dialog
+      title="选择合同"
+      :close-on-click-modal="false"
+	  draggable
+      width="1300px"
+      height="500px"
+      @close="close"
+      append-to-body
+      v-model="visible">
+      <div style="height: calc(100% - 80px);">
+        <el-form  :inline="true" class="query-form" ref="searchForm" :model="searchForm" @submit.native.prevent>
+          <!-- 搜索框-->
+          <el-form-item label="合同编号" prop="contractNo">
+            <el-input v-model="searchForm.contractNo" placeholder="请输入客户名称" clearable></el-input>
+          </el-form-item>
+          <el-form-item label="合同名称" prop="contractName">
+            <el-input v-model="searchForm.contractName" placeholder="请输入合同名称" clearable></el-input>
+          </el-form-item>
+          <el-form-item label="委托方名称" prop="clientContactsName">
+            <el-input v-model="searchForm.clientContactsName" placeholder="请输入委托方名称" clearable></el-input>
+          </el-form-item>
+
+
+          <el-form-item>
+            <el-button type="primary" @click="list()" icon="el-icon-search">查询</el-button>
+            <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>
+          </el-form-item>
+        </el-form>
+
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="400px"
+          :loading="loading"
+          ref="workContractTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          :print-config="{}"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :row-config="{isCurrent: true}"
+          :radio-config="{trigger: 'row'}"
+        >
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="radio" width="60px"></vxe-column>
+          <vxe-column width="200px" title="合同编号" field="contractNo"></vxe-column>
+          <vxe-column width="200px" title="合同名称" field="contractName"></vxe-column>
+          <vxe-column width="200px" title="委托方" field="clientContactsName"></vxe-column>
+          <vxe-column width="200px" title="签约日期" field="signingDate"></vxe-column>
+          <vxe-column width="200px" title="合同金额(元)" field="contractAmount"></vxe-column>
+          <vxe-column width="200px" title="所属部门" field="departmentName"></vxe-column>
+          <vxe-column width="200px" title="创建人" field="createBy"></vxe-column>
+          <vxe-column width="200px" title="创建日期" field="createDate"></vxe-column>
+
+        </vxe-table>
+        <vxe-pager
+          background
+          :current-page="tablePage.currentPage"
+          :page-size="tablePage.pageSize"
+          :total="tablePage.total"
+          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+          @page-change="currentChangeHandle">
+        </vxe-pager>
+      </div>
+		<template #footer>
+			<span class="dialog-footer">
+			  <el-button @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			  <el-button type="primary" v-if="method != 'view'" @click="getContract()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+			</span>
+		</template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import contractInfoService from '@/api/cw/workContract/contractInfoService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        dataList: [],
+        searchForm: {
+          contractNo: '',
+          contractName: '',
+          clientContactsName: '',
+          contractAmount: '',
+          contractDates: [],
+          type: '',
+          filedType: '',
+          contractAmounts: [],
+          createBy: this.$store.state.user.id,
+          createId: '',
+          department: '',
+          status: '',
+          procInsId: '',
+          processDefinitionId: '',
+          rowIndex: ''
+        }
+      }
+    },
+    created () {
+    },
+    components: {
+    },
+    methods: {
+      init (rowIndex) {
+        // if (!this.commonJS.isEmpty(id)) {
+        //   this.$refs.workContractTable.setCurrentRow(id)
+        // }
+        this.visible = true
+        this.rowIndex = rowIndex
+        this.list()
+      },
+      projectInit (rowIndex) {
+        this.visible = true
+        this.rowIndex = rowIndex
+        this.projectList()
+      },
+      // 表单提交
+      getContract () {
+        let row = this.$refs.workContractTable.getRadioRecord()
+        if (this.commonJS.isEmpty(row)) {
+          this.$message.error('请选择一条数据')
+          return
+        }
+        this.close()
+        this.$emit('getContract', row, this.rowIndex)
+      },
+      list () {
+        this.loading = true
+        this.searchForm.status = '2,3,4,5'
+        contractInfoService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+        })
+      },
+      // 当前页
+      currentChangeHandle ({currentPage, pageSize}) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.list()
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.list()
+      },
+      close () {
+        this.$refs.searchForm.resetFields()
+        this.visible = false
+      }
+    }
+  }
+</script>

+ 362 - 0
src/views/cw/projectReportArchive/ProjectReportArchiveDetailList.vue

@@ -0,0 +1,362 @@
+<template>
+  <div class="page">
+    <el-form :inline="true" class="query-form m-b-10" v-if="searchVisible" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+      <!-- 搜索框-->
+      <el-form-item label="项目名称" prop="cwProjectRecordsDTO.projectName">
+        <el-input v-model="searchForm.cwProjectRecordsDTO.projectName" placeholder="请输入项目名称" clearable></el-input>
+      </el-form-item>
+      <el-form-item label="创建人" prop="cwProjectRecordsDTO.projectMasterId">
+        <SelectUserTree
+          ref="companyTree"
+          :props="{
+                  value: 'id',             // ID字段名
+                  label: 'name',         // 显示名称
+                  children: 'children'    // 子级字段名
+                }"
+          :url="`/system-server/sys/user/treeUserDataAllOffice?type=2`"
+          :value="searchForm.cwProjectRecordsDTO.projectMasterId"
+          :clearable="true"
+          :accordion="true"
+		  size="default"
+          @getValue="(value) => {searchForm.cwProjectRecordsDTO.projectMasterId=value}"/>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="案卷号" prop="number">
+        <el-input v-model="searchForm.number" placeholder="请输入案卷号" clearable></el-input>
+      </el-form-item>
+
+      <el-form-item v-if="showHideItem" label="报告文号" prop="reportNo">
+        <el-input v-model="searchForm.reportNo" placeholder="请输入报告文号" clearable></el-input>
+      </el-form-item>
+
+      <el-form-item v-if="showHideItem" label="报告时间" prop="reportDates">
+        <el-date-picker
+          placement="bottom-start"
+          format="yyyy-MM-dd HH:mm:ss"
+          value-format="yyyy-MM-dd HH:mm:ss"
+          v-model="searchForm.reportDates"
+          type="datetimerange"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          clearable>
+        </el-date-picker>
+      </el-form-item>
+
+      <el-form-item v-if="showHideItem" label="归档时间" prop="auditDates">
+        <el-date-picker
+          placement="bottom-start"
+          format="yyyy-MM-dd HH:mm:ss"
+          value-format="yyyy-MM-dd HH:mm:ss"
+          v-model="searchForm.auditDates"
+          type="datetimerange"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          clearable>
+        </el-date-picker>
+      </el-form-item>
+
+
+      <el-form-item v-if="showHideItem" label="归档状态" prop="status">
+        <el-select v-model="searchForm.status" placeholder="请选择归档状态" clearable style="width: 100%">
+          <el-option-group
+            v-for="(type,index) in typeDictList"
+            :key="type.key"
+            :label="type.label">
+            <el-option
+              v-for="item in typeDictList[index].childrenList"
+              :key="item.key"
+              :label="item.label"
+              :value="item.value">
+            </el-option>
+          </el-option-group>
+        </el-select>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="default" @click="showHide" :icon="showHideIcon">{{showHideName}}</el-button>
+        <el-button type="primary" @click="refreshList()" icon="el-icon-search">查询</el-button>
+        <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <div class="jp-table top" style="">
+      <vxe-toolbar :refresh="{query: refreshList}" ref="toolbarRef" export print custom>
+		  <template #tools>
+			  <vxe-button
+				  text
+				  type="primary"
+				  :title="searchVisible ? '收起检索' : '展开检索'"
+				  icon="vxe-icon-search"
+				  class="tool-btn"
+				  @click="searchVisible = !searchVisible"
+			  ></vxe-button>
+		  </template>
+      </vxe-toolbar>
+      <div style="height: calc(100% - 90px)">
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="auto"
+          :loading="loading"
+          ref="projectTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :print-config="{}"
+          :export-config="{
+                    remote: true,
+                    filename: `归档信息${moment(new Date()).format('YYYY-MM-DD')}`,
+                    sheetName: '归档信息',
+                    exportMethod: exportMethod,
+                    types: ['xlsx'],
+                    modes: ['current', 'selected', 'all']
+                  }"
+          :menu-config="{}"
+          @sort-change="sortChangeHandle"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :checkbox-config="{}">
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column min-width="230" align="center" title="项目名称" field="cwProjectRecordsDTO.projectName">
+            <template #default="scope">
+              <el-link  type="primary" :underline="false" v-if="hasPermission('cwProjectRecords:view')" @click="viewProject(scope.row.projectId)">{{commonJS.isNotEmpty(scope.row.cwProjectRecordsDTO)?scope.row.cwProjectRecordsDTO.projectName:''}}</el-link>
+              <span v-else>{{commonJS.isNotEmpty(scope.row.cwProjectRecordsDTO)?scope.row.cwProjectRecordsDTO.projectName:''}}</span>
+            </template>
+          </vxe-column>
+          <vxe-column min-width="150" align="center" title="项目经理" field="cwProjectRecordsDTO.projectMasterName"></vxe-column>
+          <vxe-column min-width="230" align="center" title="报告文号" field="reportNo"></vxe-column>
+          <vxe-column min-width="150" align="center" title="报告日期" :formatter="formatDate" field="reportDate"></vxe-column>
+          <vxe-column min-width="150" align="center" title="归档日期" :formatter="formatDate" field="auditDate"></vxe-column>
+          <vxe-column min-width="150" align="center" title="归档状态" field="status">
+            <template #default="scope">
+              <span style="color:#5bc0de; font-weight: bold;" v-if="scope.row.status === '暂时未归档'">暂时未归档</span>
+              <span style="color:#de6764; font-weight: bold;" v-if="scope.row.status === '超期未归档'">超期未归档</span>
+              <span style="color:#5cb85c; font-weight: bold;" v-if="scope.row.status === '已按时归档'">已按时归档</span>
+              <span style="color:#f0ad4e; font-weight: bold;" v-if="scope.row.status === '已超期归档'">已超期归档</span>
+            </template>
+          </vxe-column>
+          <vxe-column min-width="150" align="center" title="超期(天)" field="overdueDay">
+            <template #default="scope">
+              <span style="color:#5bc0de; font-weight: bold;" v-if="scope.row.status === '暂时未归档'">{{scope.row.overdueDay}}</span>
+              <span style="color:#de6764; font-weight: bold;" v-if="scope.row.status === '超期未归档'">{{scope.row.overdueDay}}</span>
+              <span style="color:#5cb85c; font-weight: bold;" v-if="scope.row.status === '已按时归档'">{{scope.row.overdueDay}}</span>
+              <span style="color:#f0ad4e; font-weight: bold;" v-if="scope.row.status === '已超期归档'">{{scope.row.overdueDay}}</span>
+            </template></vxe-column>
+          <vxe-column min-width="150" align="center" title="罚款金额(元)" field="fineMoney"></vxe-column>
+          <vxe-column min-width="150" align="center" title="签字注师1" field="signatureAnnotatorName1"></vxe-column>
+          <vxe-column min-width="150" align="center" title="签字注师2" field="signatureAnnotatorName2"></vxe-column>
+          <vxe-column min-width="230" align="center" title="案卷号" field="number"></vxe-column>
+        </vxe-table>
+        <vxe-pager
+          background
+          :current-page="tablePage.currentPage"
+          :page-size="tablePage.pageSize"
+          :total="tablePage.total"
+          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+          @page-change="currentChangeHandle">
+        </vxe-pager>
+      </div>
+      <ProjectRecordsForm ref="projectRecordsForm"></ProjectRecordsForm>
+      <ProjectReportArchiveForm ref="projectReportArchiveForm"></ProjectReportArchiveForm>
+    </div>
+  </div>
+</template>
+
+<script>
+  import ProjectReportArchiveDetailService from '@/api/cw/projectRecords/ProjectReportArchiveDetailService'
+  import userService from '@/api/sys/UserService'
+  import ProjectRecordsForm from '../projectRecords/ProjectRecordsForm'
+  import ProjectReportArchiveForm from './ProjectReportArchiveForm'
+  import SelectUserTree from '@/views/utils/treeUserSelect'
+  import XEUtils from 'xe-utils'
+  export default {
+    data () {
+      return {
+		searchVisible: true,
+        showHideItem: false,
+        showHideIcon: 'el-icon-arrow-down',
+        showHideName: '展示',
+        searchForm: {
+          name: '',
+          cwProjectRecordsDTO: {
+            id: '',
+            projectName: '',
+            projectMasterId: '',
+            projectMasterName: ''
+          },
+          year: '',
+          number: '',
+          auditDates: [],
+          status: '',
+          reportDates: [],
+          reportNo: '',
+          fileNumber: ''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        tableKey: '',
+        loading: false,
+        processDefinitionAuditId: '',
+        procDefAuditKey: '',
+        isAdmin: false,
+        typeDictList: [
+          {
+            key: '已归档',
+            label: '已归档',
+            childrenList: [
+              {
+                key: '已按时归档',
+                value: '已按时归档',
+                label: '已按时归档'
+              },
+              {
+                key: '已超期归档',
+                value: '已超期归档',
+                label: '已超期归档'
+              }
+            ]
+          }, {
+            key: '未归档',
+            label: '未归档',
+            childrenList: [
+              {
+                key: '暂时未归档',
+                value: '暂时未归档',
+                label: '暂时未归档'
+              },
+              {
+                key: '超期未归档',
+                value: '超期未归档',
+                label: '超期未归档'
+              }
+            ]
+          }
+        ]
+      }
+    },
+    projectReportArchiveDetailService: null,
+    created () {
+      this.projectReportArchiveDetailService = new ProjectReportArchiveDetailService()
+    },
+    components: {
+      ProjectRecordsForm,
+      ProjectReportArchiveForm,
+      SelectUserTree
+    },
+    computed: {
+      userName () {
+        return JSON.parse(localStorage.getItem('user')).name
+      },
+      user () {
+        this.createName = JSON.parse(localStorage.getItem('user')).name
+        return JSON.parse(localStorage.getItem('user'))
+      }
+    },
+    mounted () {
+		this.$nextTick(() => {
+			//将表格和工具栏进行关联
+			const $table = this.$refs.projectTable;
+			const $toolbar = this.$refs.toolbarRef;
+			$table.connect($toolbar);
+		})
+      this.refreshList()
+    },
+    activated () {
+      this.refreshList()
+    },
+    methods: {
+      showHide () {
+        if (this.showHideItem === false) {
+          this.showHideItem = true
+          this.showHideIcon = 'el-icon-arrow-up'
+          this.showHideName = '隐藏'
+        } else {
+          this.showHideItem = false
+          this.showHideIcon = 'el-icon-arrow-down'
+          this.showHideName = '展示'
+        }
+      },
+      formatDate ({ cellValue }) {
+        return XEUtils.toDateString(cellValue, 'yyyy-MM-dd')
+      },
+      // 查看
+      view (id) {
+        this.$refs.projectReportArchiveForm.init('view', id)
+      },
+      viewProject (id) {
+        this.$refs.projectRecordsForm.init('view', id)
+      },
+      // 查询当前用户是否是管理员用户
+      checkIsAdmin () {
+        userService.is().then((data) => {
+          this.isAdmin = data
+        })
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        this.projectReportArchiveDetailService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.tableKey = Math.random()
+          this.loading = false
+        })
+      },
+      // 当前页
+      currentChangeHandle ({ currentPage, pageSize }) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.refreshList()
+      },
+      // 排序
+      sortChangeHandle (column) {
+        this.tablePage.orders = []
+        if (column.order != null) {
+          this.tablePage.orders.push({column: this.$utils.toLine(column.property), asc: column.order === 'asc'})
+        }
+        this.refreshList()
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      },
+      // 自定义服务端导出
+      exportMethod ({ options }) {
+        // 传给服务端的参数
+        const params = {
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm,
+          filename: options.filename,
+          sheetName: options.sheetName,
+          isHeader: options.isHeader,
+          original: options.original,
+          mode: options.mode,
+          selectIds: options.mode === 'selected' ? options.map(item => item.id) : [],
+          exportFields: options.columns.map(column => column.property)
+        }
+        return this.projectReportArchiveDetailService.exportExcel(params).then((res) => {
+          // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(res, options.filename)
+        }).catch(function (err) {
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      }
+    }
+  }
+</script>

+ 736 - 0
src/views/cw/projectReportArchive/ProjectReportArchiveForm.vue

@@ -0,0 +1,736 @@
+<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+	  draggable
+      width="1200px"
+      height="500px"
+      @close="close"
+      v-model="visible">
+    <el-row>
+      <el-col :span="24">
+
+        <el-form :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="method === 'view'"
+                     label-width="110px" @submit.native.prevent>
+              <el-row  :gutter="15">
+<!--                <el-col :span="12">-->
+<!--                  <el-form-item label="档案名称" prop="name"-->
+<!--                                :rules="[-->
+<!--                                {required: true, message:'档案名称不能为空', trigger:'blur'}-->
+<!--                   ]">-->
+<!--                    <el-input v-model="inputForm.name" placeholder="请填写档案名称" clearable></el-input>-->
+<!--                  </el-form-item>-->
+<!--                </el-col>-->
+                <el-col :span="12">
+                  <el-form-item label="档案号" prop="fileNumber"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.fileNumber" placeholder="请填写档案号" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="项目名称" prop="cwProjectRecordsDTO.projectName"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.cwProjectRecordsDTO.projectName" placeholder="请填写项目名称" clearable>
+<!--                      <el-button slot="append" :disabled="method === 'view'" @click="openChooseProject" icon="el-icon-search"></el-button>-->
+                    </el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="项目编号" prop="cwProjectRecordsDTO.projectNumber"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.cwProjectRecordsDTO.projectNumber" placeholder="请填写项目编号" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="项目经理1" prop="cwProjectRecordsDTO.projectMasterName"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.cwProjectRecordsDTO.projectMasterName" placeholder="请填写项目经理1"></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="项目经理2" prop="cwProjectRecordsDTO.realHeaderName"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.cwProjectRecordsDTO.realHeaderName" placeholder="请填写项目经理2"></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="被审计单位" prop="auditedUnitsName"
+                                :rules="[
+                                {required: true, message:'被审计单位不能为空', trigger:'blur'},
+                                {required: true, message:'被审计单位不能为空', trigger:'change'}
+                   ]">
+                    <el-input :readonly="true" v-model="inputForm.auditedUnitsName" @focus="openChooseClient" placeholder="请填写被审计单位" clearable>
+                      <el-button slot="append" :disabled="method === 'view'" @click="openChooseClient" icon="el-icon-search"></el-button>
+                    </el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="报告册数" prop="reportNum"
+                                :rules="[
+                                {required: true, message:'报告册数不能为空', trigger:'blur'}
+                   ]">
+                    <el-input-number
+                      v-model="inputForm.reportNum"
+                      controls-position="right"
+                      style="width:100%"
+                      :precision="0"
+                      :max="9999999999"
+                      :step="1"
+                      :min="0"
+                      placeholder="请填写报告册数"
+                      :controls="false"
+                      clearable>
+                    </el-input-number>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="底稿册数" prop="papersNum"
+                                :rules="[
+                                {required: true, message:'底稿册数不能为空', trigger:'blur'}
+                   ]">
+                    <el-input-number
+                      v-model="inputForm.papersNum"
+                      controls-position="right"
+                      style="width:100%"
+                      :precision="0"
+                      :max="9999999999"
+                      :step="1"
+                      :min="0"
+                      placeholder="请填写底稿册数"
+                      :controls="false"
+                      clearable>
+                    </el-input-number>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="档案年度" prop="year"
+                                :rules="[
+                                {required: true, message:'档案年度不能为空', trigger:'blur'}
+                   ]">
+                    <el-date-picker
+                      v-model="inputForm.year"
+                      type="year"
+                      value-format="yyyy"
+                      placeholder="选择档案年度"
+                      style="width:100%"
+                      placement="bottom-start"
+                      :clearable="false">
+                    </el-date-picker>
+                  </el-form-item>
+                </el-col>
+                <el-col v-if="status !== 'audit'" :span="12">
+                  <el-form-item label="案卷号" prop="number"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.number" placeholder="请填写案卷号" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col v-if="status !== 'audit'" :span="12">
+                  <el-form-item label="确认案卷号" prop="isNumber"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.isNumber" placeholder="请填写确认案卷号" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-form v-if="status === 'audit'" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"
+                         label-width="135px" @submit.native.prevent>
+                <el-col  :span="12">
+                  <el-form-item label="案卷号" prop="number"
+                                :rules="[
+                                {required: true, message:'案卷号不能为空', trigger:'blur'}
+                   ]">
+                    <el-input :disabled="false" v-model="inputForm.number" placeholder="请填写案卷号" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col  :span="12">
+                  <el-form-item label="确认案卷号" prop="isNumber"
+                                :rules="[
+                                {required: true, message:'确认案卷号不能为空', trigger:'blur'}
+                   ]">
+                    <el-input :disabled="false" v-model="inputForm.isNumber" placeholder="请填写确认案卷号" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                </el-form>
+                <el-col :span="12">
+                  <el-form-item label="归档时间" prop="auditDate"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.auditDate" placeholder="请填写归档时间" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                  <el-form-item label="备注" prop="remarks"
+                                :rules="[
+                   ]">
+                    <el-input type="textarea" style="width:100%" maxlength="1000" v-model="inputForm.remarks" placeholder="请填写备注" show-word-limit></el-input>
+
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="申请人" prop="createBy.name"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.createBy.name" placeholder="请填写创建人" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="申请时间" prop="createDate"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.createDate" placeholder="请填写创建时间" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+          <el-divider content-position="left"><i class="el-icon-document"></i> 审计报告</el-divider>
+          <el-row :gutter="15">
+            <el-col :span="12">
+              <el-form-item label="报告文号" prop="reportNo"
+                            :rules="[
+                   ]">
+                <el-input :disabled="true" v-model="inputForm.reportNo" placeholder="请填写报告文号" clearable>
+<!--                  <el-button slot="append" :disabled="formReadOnly" @click="openReportChoose" icon="el-icon-search"></el-button>-->
+                </el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="报告日期" prop="reportDate"
+                            :rules="[
+                   ]">
+                <el-input :disabled="true" v-model="inputForm.reportDate" placeholder="请填写报告日期" clearable></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="签字注师1" prop="signatureAnnotator1Name"
+                            :rules="[
+                   ]">
+                <el-input :disabled="true" v-model="inputForm.signatureAnnotator1Name" placeholder="请填写签字注师1" clearable></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="签字注师2" prop="signatureAnnotator2Name"
+                            :rules="[
+                   ]">
+                <el-input :disabled="true" v-model="inputForm.signatureAnnotator2Name" placeholder="请填写签字注师2" clearable></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="报告主办人" prop="reportCreateName"
+                            :rules="[
+                   ]">
+                <el-input :disabled="true" v-model="inputForm.reportCreateName" placeholder="请填写报告主办人" clearable></el-input>
+              </el-form-item>
+            </el-col>
+            <el-form :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''" :disabled="status !== 'audit'"
+                     label-width="110px" @submit.native.prevent>
+              <el-col :span="24">
+                <el-form-item label="审计意见" prop="reportRemarks"
+                              :rules="[
+                   ]">
+                  <el-input type="textarea"  style="width:100%" maxlength="225" v-model="inputForm.reportRemarks" placeholder="请填写审计意见" show-word-limit></el-input>
+
+                </el-form-item>
+              </el-col>
+            </el-form>
+          </el-row>
+        </el-form>
+        <el-tabs v-model="activeName" type="border-card" @tab-click="tabHandleClick">
+          <el-tab-pane label="附件" name="files">
+            <!--        附件-->
+            <UpLoadComponent ref="uploadComponent"></UpLoadComponent>
+          </el-tab-pane>
+
+        </el-tabs>
+      </el-col>
+    </el-row>
+		<template #footer>
+			<span class="dialog-footer">
+			  <el-button  @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			  <el-button  v-if="method === 'edit'" type="primary" icon="el-icon-circle-check" @click="doSubmit('save')">确定</el-button>
+			</span>
+		</template>
+    <ProjectRecordsChooseCom ref="projectRecordsChooseCom" @getProject="getProject"></ProjectRecordsChooseCom>
+    <WorkClientChooseByProjectCom ref="workClientChooseByProjectCom" @getClient="getClient"></WorkClientChooseByProjectCom>
+    <ReportChooseByProjectCom ref="reportChooseByProjectCom" @getReport="getReport"></ReportChooseByProjectCom>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import UpLoadComponent from '@/views/common/UpLoadComponentV3.1'
+  import ProjectReportArchiveService from '@/api/cw/projectRecords/ProjectReportArchiveService'
+  import ProjectRecordsChooseCom from '@/views/cw/projectRecords/ProjectRecordsChooseCom'
+  import WorkClientChooseByProjectCom from '@/views/cw/projectReportArchive/WorkClientChooseByProjectCom'
+  import ReportChooseByProjectCom from '@/views/cw/projectReportArchive/ReportChooseByProjectCom'
+  export default {
+    props: {
+      businessId: {
+        type: String,
+        default: ''
+      },
+      formReadOnly: {
+        type: Boolean,
+        default: false
+      },
+      status: {
+        type: String,
+        default: ''
+      }
+    },
+    data () {
+      return {
+        title: '',
+        method: '',
+        loading: false,
+        inputForm: {
+          id: '',
+          createDate: '',
+          createBy: {
+            id: '',
+            name: ''
+          },
+          remarks: '',
+          projectId: '',
+          name: '',
+          auditedUnits: '',
+          reportNum: '',
+          papersNum: '',
+          year: '',
+          number: '',
+          isNumber: '',
+          auditDate: '',
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          workAttachmentDtoList: [],
+          cwProjectReportArchiveReportDTOList: [],
+          cwProjectRecordsDTO: {
+            remarks: '',
+            projectNumber: '',
+            projectName: '',
+            officeId: '',
+            projectMoney: '',
+            auditYear: '',
+            planStartDate: '',
+            planEndDate: '',
+            projectMasterId: '',
+            projectLeaderId: '',
+            procInsId: '',
+            processDefinitionId: '',
+            status: '',
+            contractId: ''
+          },
+          auditedUnitsName: '',
+          fileNumber: '',
+          reportDate: '',
+          reportNo: '',
+          signatureAnnotator1: '',
+          signatureAnnotator1Name: '',
+          signatureAnnotator2: '',
+          signatureAnnotator2Name: '',
+          reportCreateName: '',
+          reportId: '',
+          reportRemarks: ''
+        },
+        keyWatch: '',
+        activeName: 'files',
+        tableKeyReport: '',
+        visible: false
+      }
+    },
+    projectReportArchiveService: null,
+    created () {
+      this.projectReportArchiveService = new ProjectReportArchiveService()
+    },
+    computed: {
+      bus: {
+        get () {
+          this.$refs.uploadComponent.setDividerName('附件', false)
+          return this.businessId
+        },
+        set (val) {
+          this.businessId = val
+        }
+      }
+    },
+    watch: {
+      'keyWatch': {
+        handler (newVal) {
+          if (this.commonJS.isNotEmpty(this.bus)) {
+            this.init('', this.bus)
+          } else {
+            this.$nextTick(() => {
+              this.$refs.inputForm.resetFields()
+            })
+          }
+        }
+      }
+    },
+    components: {
+      UpLoadComponent,
+      ProjectRecordsChooseCom,
+      WorkClientChooseByProjectCom,
+      ReportChooseByProjectCom
+    },
+    methods: {
+      getKeyWatch (keyWatch) {
+        this.keyWatch = keyWatch
+      },
+      init (method, id) {
+        this.visible = true
+        if (method === 'edit') {
+          this.title = '项目报告归档修改'
+          this.method = method
+        } else {
+          this.title = '项目报告归档详情'
+          this.method = 'view'
+        }
+        this.activeName = 'files'
+        this.projectReportArchiveService = new ProjectReportArchiveService()
+        this.inputForm = {
+          id: '',
+          createDate: '',
+          createBy: {
+            id: '',
+            name: this.$store.state.user.name
+          },
+          remarks: '',
+          projectId: '',
+          name: '',
+          auditedUnits: '',
+          reportNum: '',
+          papersNum: '',
+          year: '',
+          number: '',
+          isNumber: '',
+          auditDate: '',
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          workAttachmentDtoList: [],
+          cwProjectReportArchiveReportDTOList: [],
+          cwProjectRecordsDTO: {
+            remarks: '',
+            projectNumber: '',
+            projectName: '',
+            officeId: '',
+            projectMoney: '',
+            auditYear: '',
+            planStartDate: '',
+            planEndDate: '',
+            projectMasterId: '',
+            projectLeaderId: '',
+            procInsId: '',
+            processDefinitionId: '',
+            status: '',
+            contractId: ''
+          },
+          auditedUnitsName: '',
+          fileNumber: '',
+          reportDate: '',
+          reportNo: '',
+          signatureAnnotator1: '',
+          signatureAnnotator1Name: '',
+          signatureAnnotator2: '',
+          signatureAnnotator2Name: '',
+          reportCreateName: '',
+          reportId: '',
+          reportRemarks: ''
+        }
+        this.inputForm.id = id
+        this.loading = false
+        this.$nextTick(() => {
+          this.$refs.inputForm.resetFields()
+          this.loading = true
+          this.projectReportArchiveService.queryById(this.inputForm.id).then((data) => {
+            this.$refs.uploadComponent.clearUpload()
+            this.inputForm = this.recover(this.inputForm, data)
+            this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+            if (this.commonJS.isEmpty(this.inputForm.workAttachmentDtoList)) {
+              this.inputForm.workAttachmentDtoList = []
+            }
+            if (this.commonJS.isEmpty(this.inputForm.createDate)) {
+              this.inputForm.createDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+            }
+            if (this.commonJS.isEmpty(this.inputForm.createBy.name)) {
+              this.inputForm.createBy.name = this.$store.state.user.name
+            }
+            if (this.commonJS.isEmpty(this.inputForm.officeId)) {
+              this.inputForm.officeId = this.$store.state.user.office.id
+            }
+            if (this.commonJS.isEmpty(this.inputForm.papersNum)) {
+              this.inputForm.papersNum = 0
+            }
+            if (this.commonJS.isEmpty(this.inputForm.reportNum)) {
+              this.inputForm.reportNum = 0
+            }
+            if (this.formReadOnly) {
+              this.method = 'view'
+            }
+            this.$refs.uploadComponent.newUpload(this.method, this.inputForm.workAttachmentDtoList, 'cw_project_archive', null, null, null, null, false)
+            this.loading = false
+          })
+        })
+      },
+      saveForm (callback) {
+        this.doSubmit('save', callback)
+      },
+      startForm (callback) {
+        this.doSubmit('start', callback)
+      },
+      async agreeForm (callback) {
+        await this.projectReportArchiveService.queryById(this.inputForm.id).then((data) => {
+          if (data.status !== '2') { // 审核状态不是“待审核”,就弹出提示
+            this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+            throw new Error()
+          } else {
+            this.doSubmit('agree', callback)
+          }
+        })
+      },
+      // 表单提交
+      doSubmit (status, callback) {
+        if (status === 'save') {
+          // 暂存
+          // this.inputForm.status = '1'
+          this.loading = true
+          if (this.$refs.uploadComponent.checkProgress()) {
+            this.loading = false
+            return
+          }
+          this.$refs.uploadComponent.getDataList().then((list) => {
+            // list为返回数据
+            this.inputForm.workAttachmentDtoList = list
+          })
+          // this.inputForm.createDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+          this.projectReportArchiveService.saveForm(this.inputForm).then((data) => {
+            // callback(data.businessTable, data.businessId, this.inputForm)
+            this.close()
+            this.$emit('refreshList')
+            this.loading = false
+          }).catch(() => {
+            this.loading = false
+          })
+          return
+        } else if (status === 'start') {
+          // 送审  待审核
+          this.inputForm.status = '2'
+        }
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            if (this.$refs.uploadComponent.checkProgress()) {
+              this.loading = false
+              throw new Error()
+            } else {
+              let _this = this
+              const wait = function () {
+                return new Promise((resolve, reject) => {
+                  if (status === 'agree') {
+                    // 审核同意
+                    _this.inputForm.auditDate = _this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+                    // this.inputForm.agreeUserId = this.$store.state.user.id
+                    _this.inputForm.status = '5'
+                    if (_this.inputForm.isNumber !== _this.inputForm.number) {
+                      _this.$message.error('“案卷号”与“确认案卷号”不一致,请重新填写')
+                      _this.loading = false
+                      throw new Error('“案卷号”与“确认案卷号”不一致,请重新填写')
+                    }
+                  }
+                  _this.$refs.uploadComponent.getDataList().then((list) => {
+                    // list为返回数据
+                    _this.inputForm.workAttachmentDtoList = list
+                    list.forEach(item => {
+                      if (_this.commonJS.isEmpty(item.fileType)) {
+                        _this.$message.error('附件中的文件类型不可以为空')
+                        throw new Error()
+                      }
+                    })
+                  })
+                  if (_this.commonJS.isEmpty(_this.inputForm.createDate)) {
+                    _this.inputForm.createDate = _this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+                  }
+                  resolve()
+                })
+              }
+              wait().then(() => {
+                this.projectReportArchiveService.saveForm(this.inputForm).then((data) => {
+                  callback(data.businessTable, data.businessId, this.inputForm)
+                  this.loading = false
+                }).catch(() => {
+                  this.loading = false
+                })
+              })
+            }
+          }
+        })
+      },
+      async updateStatusById (type) {
+        if (type === 'reject' || type === 'reback') {
+          if (await this.$refs.uploadComponent.checkProgress()) {
+            this.loading = false
+            throw new Error()
+          }
+          await this.projectReportArchiveService.queryById(this.inputForm.id).then((data) => {
+            if (data.status !== '2') { // status的值不等于“审核中”就弹出提示
+              this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+              throw new Error()
+            } else {
+              if (type === 'reject') {
+                // 驳回
+                this.inputForm.status = '4'
+                let param = {status: '4', id: this.inputForm.id}
+                this.projectReportArchiveService.updateStatusById(param)
+              }
+              if (type === 'reback') {
+                // 撤回
+                let param = {status: '3', id: this.inputForm.id}
+                this.projectReportArchiveService.updateStatusById(param)
+              }
+            }
+          })
+        }
+      },
+      close () {
+        this.inputForm = {
+          id: '',
+          createDate: '',
+          createBy: {
+            id: '',
+            name: ''
+          },
+          remarks: '',
+          projectId: '',
+          name: '',
+          auditedUnits: '',
+          reportNum: '',
+          papersNum: '',
+          year: '',
+          number: '',
+          isNumber: '',
+          auditDate: '',
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          workAttachmentDtoList: [],
+          cwProjectReportArchiveReportDTOList: [],
+          cwProjectRecordsDTO: {
+            remarks: '',
+            projectNumber: '',
+            projectName: '',
+            officeId: '',
+            projectMoney: '',
+            auditYear: '',
+            planStartDate: '',
+            planEndDate: '',
+            projectMasterId: '',
+            projectLeaderId: '',
+            procInsId: '',
+            processDefinitionId: '',
+            status: '',
+            contractId: ''
+          },
+          auditedUnitsName: '',
+          fileNumber: '',
+          reportDate: '',
+          reportNo: '',
+          signatureAnnotator1: '',
+          signatureAnnotator1Name: '',
+          signatureAnnotator2: '',
+          signatureAnnotator2Name: '',
+          reportCreateName: '',
+          reportId: '',
+          reportRemarks: ''
+        }
+        this.$refs.uploadComponent.clearUpload()
+        this.$refs.inputForm.resetFields()
+        this.inputForm.reportId = ''
+        this.inputForm.projectId = ''
+        this.visible = false
+      },
+      tabHandleClick (event) {
+        // console.log(event)
+      },
+      // 新增
+      // eslint-disable-next-line no-dupe-keys
+      insertEvent (type) {
+      },
+      // 删除
+      removeEvent (row, rowIndex, type) {
+        if (type === 'report') {
+          this.$refs.reportTable.remove(row)
+          this.inputForm.cwProjectReportArchiveReportDTOList.splice(rowIndex, 1)
+        }
+      },
+      // 打开项目选择组件
+      openChooseProject (event) {
+        if (this.commonJS.isNotEmpty(this.inputForm.auditedUnitsName) || this.commonJS.isNotEmpty(this.inputForm.auditedUnits) || this.commonJS.isNotEmpty(this.inputForm.cwProjectReportArchiveReportDTOList)) {
+          this.$confirm(`重新选择项目会清空"被审计单位"以及"审计报告"的数据,是否继续?`, '提示', {
+            confirmButtonText: '确定',
+            cancelButtonText: '取消',
+            type: 'warning'
+          }).then(() => {
+            this.$refs.projectRecordsChooseCom.init()
+          }).catch(() => {
+          })
+        } else {
+          this.$refs.projectRecordsChooseCom.init()
+        }
+      },
+      // 项目选择结果获取
+      getProject (row) {
+        this.inputForm.projectId = row.id
+        this.inputForm.cwProjectRecordsDTO.projectName = row.projectName
+        this.inputForm.cwProjectRecordsDTO.projectNumber = row.projectNumber
+        this.inputForm.cwProjectRecordsDTO.projectMasterId = row.projectMasterId
+        this.inputForm.auditedUnitsName = ''
+        this.inputForm.auditedUnits = ''
+        this.inputForm.cwProjectReportArchiveReportDTOList = []
+      },
+      // 打开被审计单位选择组件
+      openChooseClient () {
+        this.$refs.workClientChooseByProjectCom.init(this.inputForm.projectId)
+      },
+      // 被审计单位选择结果获取
+      getClient (row) {
+        this.inputForm.auditedUnitsName = row.name
+        this.inputForm.auditedUnits = row.id
+      },
+      // 打开审计报告选择组件
+      openReportChoose () {
+        this.$refs.reportChooseByProjectCom.init(this.inputForm.projectId, this.inputForm.id)
+      },
+      // 审计报告选择结果获取
+      getReport (row) {
+        if (this.commonJS.isNotEmpty(row)) {
+          if (this.commonJS.isNotEmpty(row.reportId)) {
+            this.projectReportArchiveService.findReportUse(row.reportId).then((data) => {
+              if (data === false) {
+                this.inputForm.reportDate = row.reportDate
+                this.inputForm.reportNo = row.reportNo
+                this.inputForm.signatureAnnotator1 = row.signatureAnnotator1
+                this.inputForm.signatureAnnotator1Name = row.signatureAnnotator1Name
+                this.inputForm.signatureAnnotator2 = row.signatureAnnotator2
+                this.inputForm.signatureAnnotator2Name = row.signatureAnnotator2Name
+                this.inputForm.reportCreateName = row.createName
+                this.inputForm.reportId = row.reportId
+              } else {
+                this.$message.error('此报告正在归档中或已归档,请重新选择')
+              }
+            })
+          }
+        }
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-input-number .el-input__inner {
+    text-align: left;
+  }
+</style>

+ 649 - 0
src/views/cw/projectReportArchive/ProjectReportArchiveList.vue

@@ -0,0 +1,649 @@
+<template>
+  <div class="page">
+    <el-form :inline="true" class="query-form m-b-10" v-if="searchVisible" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+      <!-- 搜索框-->
+<!--      <el-form-item label="档案名称" prop="name">-->
+<!--        <el-input v-model="searchForm.name" placeholder="请输入档案名称" clearable></el-input>-->
+<!--      </el-form-item>-->
+      <el-form-item label="档案号" prop="fileNumber">
+        <el-input v-model="searchForm.fileNumber" placeholder="请输入档案号" clearable></el-input>
+      </el-form-item>
+      <el-form-item label="项目名称" prop="cwProjectRecordsDTO.projectName">
+        <el-input v-model="searchForm.cwProjectRecordsDTO.projectName" placeholder="请输入项目名称" clearable></el-input>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="项目经理1" prop="cwProjectRecordsDTO.projectMasterName">
+<!--        <el-input v-model="searchForm.cwProjectRecordsDTO.projectMasterName" placeholder="请输入项目经理" clearable></el-input>-->
+        <UserSelect :limit='1' :userName="searchForm.cwProjectRecordsDTO.projectMasterName" @update:modelValue='(value, label) => {searchForm.cwProjectRecordsDTO.projectMasterName = label}'></UserSelect>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="项目经理2" prop="cwProjectRecordsDTO.realHeaderName">
+        <!--        <el-input v-model="searchForm.cwProjectRecordsDTO.projectMasterName" placeholder="请输入项目经理" clearable></el-input>-->
+        <UserSelect :limit='1' :userName="searchForm.cwProjectRecordsDTO.realHeaderName" @update:modelValue='(value, label) => {searchForm.cwProjectRecordsDTO.realHeaderName = label}'></UserSelect>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="档案年度" prop="year">
+        <el-date-picker
+          v-model="searchForm.year"
+          type="year"
+          value-format="yyyy"
+          placeholder="选择档案年度"
+          style="width:100%"
+          placement="bottom-start"
+          clearable>
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="案卷号" prop="number">
+        <el-input v-model="searchForm.number" placeholder="请输入案卷号" clearable></el-input>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="归档时间" prop="auditDates">
+        <el-date-picker
+          placement="bottom-start"
+          value-format="YYYY-MM-DD h:m:s"
+          v-model="searchForm.auditDates"
+          type="datetimerange"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          clearable>
+        </el-date-picker>
+      </el-form-item>
+
+      <el-form-item v-if="showHideItem" label="创建人" prop="createBy.name">
+<!--        <el-input  v-model="searchForm.createBy.name" placeholder="请输入创建人" clearable></el-input>-->
+        <UserSelect :limit='1' :userName="searchForm.createBy.name" @update:modelValue='(value, label) => {searchForm.createBy.name = label}'></UserSelect>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="创建时间" prop="createDates">
+        <el-date-picker
+          placement="bottom-start"
+          value-format="YYYY-MM-DD h:m:s"
+          v-model="searchForm.createDates"
+          type="datetimerange"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          clearable>
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="报告文号" prop="reportNo">
+        <el-input v-model="searchForm.reportNo" placeholder="请输入报告文号" clearable></el-input>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="状态" prop="status">
+        <el-select v-model="searchForm.status" placeholder="请选择" style="width:100%;" clearable>
+          <el-option
+            v-for="item in $dictUtils.getDictList('cw_status')"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="归档状态" prop="archiveSta">
+        <el-select v-model="searchForm.archiveSta" placeholder="请选择归档状态" clearable style="width: 100%">
+          <el-option-group
+            v-for="(type,index) in typeDictList"
+            :key="type.key"
+            :label="type.label">
+            <el-option
+              v-for="item in typeDictList[index].childrenList"
+              :key="item.key"
+              :label="item.label"
+              :value="item.value">
+            </el-option>
+          </el-option-group>
+        </el-select>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="default" @click="showHide" :icon="showHideIcon">{{showHideName}}</el-button>
+        <el-button type="primary" @click="refreshList()" icon="el-icon-search">查询</el-button>
+        <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <div class="jp-table top" style="">
+      <vxe-toolbar :refresh="{query: refreshList}" ref="toolbarRef" export custom>
+        <template #buttons>
+<!--          <el-button v-if="hasPermission('cwProjectReportArchive:add')" type="primary" icon="el-icon-plus" @click="start()">新建</el-button>-->
+        </template>
+		  <template #tools>
+			  <vxe-button
+				  text
+				  type="primary"
+				  :title="searchVisible ? '收起检索' : '展开检索'"
+				  icon="vxe-icon-search"
+				  class="tool-btn"
+				  @click="searchVisible = !searchVisible"
+			  ></vxe-button>
+		  </template>
+      </vxe-toolbar>
+      <div style="height: calc(100% - 90px)">
+        <vxe-table
+          :key="tableKey"
+          border="inner"
+          auto-resize
+          resizable
+          height="auto"
+          :loading="loading"
+          ref="projectTable"
+          show-header-overflow
+          show-overflow
+          :export-config="{
+                    remote: true,
+                    filename: `报告归档数据${moment(new Date()).format('YYYY-MM-DD')}`,
+                    sheetName: `报告归档数据${moment(new Date()).format('YYYY-MM-DD')}`,
+                    exportMethod: exportMethod,
+                    types: ['xlsx'],
+                    modes: ['current', 'selected', 'all']
+                  }"
+          highlight-hover-row
+          :menu-config="{}"
+          @sort-change="sortChangeHandle"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :checkbox-config="{}">
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="checkbox" width="60" ></vxe-column>
+          <vxe-column min-width="150" align="center" title="档案号" field="fileNumber">
+            <template #default="scope">
+              <el-link  type="primary" :underline="false" v-if="hasPermission('cwProjectReportArchive:view')" @click="view(scope.row.id)">{{scope.row.fileNumber}}</el-link>
+              <span v-else>{{scope.row.fileNumber}}</span>
+            </template>
+          </vxe-column>
+          <vxe-column min-width="230" align="center" title="项目名称" field="cwProjectRecordsDTO.projectName">
+            <template #default="scope">
+              <el-link  type="primary" :underline="false" v-if="hasPermission('cwProjectRecords:view')" @click="viewProject(scope.row.projectId)">{{commonJS.isNotEmpty(scope.row.cwProjectRecordsDTO)?scope.row.cwProjectRecordsDTO.projectName:''}}</el-link>
+              <span v-else>{{commonJS.isNotEmpty(scope.row.cwProjectRecordsDTO)?scope.row.cwProjectRecordsDTO.projectName:''}}</span>
+            </template>
+          </vxe-column>
+          <vxe-column min-width="220" align="center" title="报告文号" field="reportNo"></vxe-column>
+          <vxe-column min-width="150" align="center" title="项目经理1" field="cwProjectRecordsDTO.projectMasterName"></vxe-column>
+          <vxe-column min-width="150" align="center" title="项目经理2" field="cwProjectRecordsDTO.realHeaderName"></vxe-column>
+          <vxe-column min-width="230" align="center" title="被审计单位" field="auditedUnitsName"></vxe-column>
+          <vxe-column min-width="150" align="center" title="报告册数" field="reportNum"></vxe-column>
+          <vxe-column min-width="150" align="center" title="底稿册数" field="papersNum"></vxe-column>
+          <vxe-column min-width="150" align="center" title="档案年度" field="year"></vxe-column>
+          <vxe-column min-width="230" align="center" title="案卷号" field="number"></vxe-column>
+          <vxe-column min-width="150" align="center" title="报告日期" :formatter="formatDate" field="reportDate"></vxe-column>
+          <vxe-column min-width="200" align="center" title="归档时间" :formatter="formatDate" field="auditDate"></vxe-column>
+          <vxe-column min-width="150" align="center" title="归档状态" field="archiveSta">
+            <template #default="scope">
+              <span style="color:#5bc0de; font-weight: bold;" v-if="scope.row.archiveSta === '暂时未归档'">暂时未归档</span>
+              <span style="color:#de6764; font-weight: bold;" v-if="scope.row.archiveSta === '超期未归档'">超期未归档</span>
+              <span style="color:#5cb85c; font-weight: bold;" v-if="scope.row.archiveSta === '已按时归档'">已按时归档</span>
+              <span style="color:#f0ad4e; font-weight: bold;" v-if="scope.row.archiveSta === '已超期归档'">已超期归档</span>
+            </template>
+          </vxe-column>
+          <vxe-column min-width="150" align="center" title="超期(天)" field="overdueDay">
+            <template #default="scope">
+              <span style="color:#5bc0de; font-weight: bold;" v-if="scope.row.archiveSta === '暂时未归档'">{{scope.row.overdueDay}}</span>
+              <span style="color:#de6764; font-weight: bold;" v-if="scope.row.archiveSta === '超期未归档'">{{scope.row.overdueDay}}</span>
+              <span style="color:#5cb85c; font-weight: bold;" v-if="scope.row.archiveSta === '已按时归档'">{{scope.row.overdueDay}}</span>
+              <span style="color:#f0ad4e; font-weight: bold;" v-if="scope.row.archiveSta === '已超期归档'">{{scope.row.overdueDay}}</span>
+            </template></vxe-column>
+          <vxe-column min-width="150" align="center" title="罚款金额(元)" field="fineMoney"></vxe-column>
+          <vxe-column min-width="150" align="center" title="创建人" field="createBy.name"></vxe-column>
+          <vxe-column min-width="200" align="center" title="创建时间" field="createTime"></vxe-column>
+          <vxe-column  min-width="110px" align="center" fixed="right" title="状态" field="status" >
+            <template #default="scope">
+              <el-button @click="detail(scope.row)" effect="dark"
+                          :type="$dictUtils.getDictLabel('cw_status_flag', scope.row.status, '-')">
+                {{$dictUtils.getDictLabel("cw_status", scope.row.status, '-')}}
+              </el-button>
+            </template>
+          </vxe-column>
+          <vxe-column title="操作" width="100px" fixed="right" align="center">
+            <template  #default="scope">
+              <div v-if="isAdmin">
+                <el-button v-if="scope.row.status==='5'" text type="primary"   @click="edit(scope.row.id)">修改</el-button>
+              </div>
+              <div v-else>
+              <el-button v-if="hasPermission('cwProjectReportArchive:edit')&&(scope.row.createBy.id === $store.state.user.id||haveProjectIds.includes(scope.row.projectId))&&(scope.row.status==='0'||scope.row.status==='1'||scope.row.status==='3')" text type="primary" @click="push(scope.row)">归档</el-button>
+              <el-button v-if="hasPermission('cwProjectReportArchive:edit')&&(scope.row.createBy.id === $store.state.user.id||haveProjectIds.includes(scope.row.projectId))&&scope.row.status==='2'" text type="primary" @click="reback(scope.row)">撤回</el-button>
+<!--              <el-button v-if="hasPermission('cwProjectReportArchive:del')&&scope.row.createBy.id === $store.state.user.id&&(scope.row.status==='1'||scope.row.status==='3'||scope.row.status==='4')" text type="primary" @click="del(scope.row.id)">删除</el-button>-->
+<!--              <el-button v-else-if="hasPermission('cwProjectReportArchive:del')&&isAdmin&&(scope.row.status==='1'||scope.row.status==='3'||scope.row.status==='5'||scope.row.status==='4')" text type="primary" @click="del(scope.row.id)">删除</el-button>-->
+<!--              审核-->
+              <el-button v-if="scope.row.status==='2' && checkIsAudit(scope.row)" text type="primary"  @click="examine(scope.row)">审核</el-button>
+<!--              被驳回后当前申请人重新调整-->
+              <el-button v-if="scope.row.createBy.id === $store.state.user.id&&scope.row.status === '4'" text type="primary" @click="adjust(scope.row)">驳回调整</el-button>
+              </div>
+            </template>
+          </vxe-column>
+        </vxe-table>
+        <vxe-pager
+          background
+          :current-page="tablePage.currentPage"
+          :page-size="tablePage.pageSize"
+          :total="tablePage.total"
+          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+          @page-change="currentChangeHandle">
+        </vxe-pager>
+      </div>
+      <ProjectRecordsForm ref="projectRecordsForm"></ProjectRecordsForm>
+      <ProjectReportArchiveForm ref="projectReportArchiveForm" @refreshList="refreshList"></ProjectReportArchiveForm>
+    </div>
+  </div>
+</template>
+
+<script>
+  import ProjectReportArchiveService from '@/api/cw/projectRecords/ProjectReportArchiveService'
+  import taskService from '@/api/flowable/TaskService'
+  import processService from '@/api/flowable/ProcessService'
+  import pick from 'lodash.pick'
+  import userService from '@/api/sys/UserService'
+  import ProjectRecordsForm from '../projectRecords/ProjectRecordsForm'
+  import ProjectReportArchiveForm from './ProjectReportArchiveForm'
+  import UserSelect from '@/components/userSelect'
+  import projectRecordsService from '@/api/cw/projectRecords/ProjectRecordsService'
+  import XEUtils from 'xe-utils'
+  import officeService from '@/api/sys/OfficeService'
+  export default {
+    data () {
+      return {
+		  searchVisible: true,
+        showHideItem: false,
+        showHideIcon: 'el-icon-arrow-down',
+        showHideName: '展示',
+        searchForm: {
+          name: '',
+          cwProjectRecordsDTO: {
+            projectName: '',
+            projectMasterName: '',
+            realHeaderName: ''
+          },
+          year: '',
+          number: '',
+          auditDates: [],
+          status: '',
+          createBy: {
+            name: ''
+          },
+          createDates: [],
+          reportNo: '',
+          fileNumber: '',
+          archiveSta: ''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        tableKey: '',
+        loading: false,
+        processDefinitionAuditId: '',
+        procDefAuditKey: '',
+        processDefinitionAuditIdSZ: '',
+        procDefAuditKeySZ: '',
+        isAdmin: false,
+        haveProjectIds: '',
+        typeDictList: [
+          {
+            key: '已归档',
+            label: '已归档',
+            childrenList: [
+              {
+                key: '已按时归档',
+                value: '已按时归档',
+                label: '已按时归档'
+              },
+              {
+                key: '已超期归档',
+                value: '已超期归档',
+                label: '已超期归档'
+              }
+            ]
+          }, {
+            key: '未归档',
+            label: '未归档',
+            childrenList: [
+              {
+                key: '暂时未归档',
+                value: '暂时未归档',
+                label: '暂时未归档'
+              },
+              {
+                key: '超期未归档',
+                value: '超期未归档',
+                label: '超期未归档'
+              }
+            ]
+          }
+        ]
+      }
+    },
+    projectReportArchiveService: null,
+    created () {
+      this.projectReportArchiveService = new ProjectReportArchiveService()
+    },
+    components: {
+      ProjectRecordsForm,
+      ProjectReportArchiveForm,
+      UserSelect
+    },
+    computed: {
+      userName () {
+        return this.$store.state.user.name
+      },
+      user () {
+        this.createName = this.$store.state.user.name
+        return this.$store.state.user
+      }
+    },
+    mounted () {
+		this.$nextTick(() => {
+			//将表格和工具栏进行关联
+			const $table = this.$refs.projectTable;
+			const $toolbar = this.$refs.toolbarRef;
+			$table.connect($toolbar);
+		})
+      this.refreshList()
+    },
+    activated () {
+      this.refreshList()
+    },
+    methods: {
+      showHide () {
+        if (this.showHideItem === false) {
+          this.showHideItem = true
+          this.showHideIcon = 'el-icon-arrow-up'
+          this.showHideName = '隐藏'
+        } else {
+          this.showHideItem = false
+          this.showHideIcon = 'el-icon-arrow-down'
+          this.showHideName = '展示'
+        }
+      },
+      formatDate ({ cellValue }) {
+        return XEUtils.toDateString(cellValue, 'yyyy-MM-dd')
+      },
+      // 新增
+      add () {
+        // this.$refs.projectRecordsForm.init('add', '')
+      },
+      // 修改
+      edit (id) {
+        id = id || this.$refs.projectTable.getCheckboxRecords().map(item => {
+          return item.id
+        })[0]
+        this.$refs.projectReportArchiveForm.init('edit', id)
+      },
+      // 查看
+      view (id) {
+        this.$refs.projectReportArchiveForm.init('view', id)
+      },
+      viewProject (id) {
+        this.$refs.projectRecordsForm.init('view', id)
+      },
+      // 查询当前用户是否是管理员用户
+      checkIsAdmin () {
+        userService.is().then((data) => {
+          this.isAdmin = data
+        })
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        this.projectReportArchiveService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          projectRecordsService.getHaveProjectIds().then((data) => {
+            if (this.commonJS.isNotEmpty(data)) {
+              this.haveProjectIds = data.map(i => {
+                if (this.commonJS.isNotEmpty(i)) {
+                  return i
+                }
+              }).join(',')
+            }
+          })
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          // this.tableKey = Math.random()
+          this.loading = false
+        })
+        this.checkIsAdmin()
+        processService.getByName('会计-项目报告归档').then((data) => {
+          if (!this.commonJS.isEmpty(data.id)) {
+            this.processDefinitionAuditId = data.id
+            this.procDefAuditKey = data.key
+          }
+        })
+        processService.getByName('会计-项目报告归档-苏州分部').then((data) => {
+          if (!this.commonJS.isEmpty(data.id)) {
+            this.processDefinitionAuditIdSZ = data.id
+            this.procDefAuditKeySZ = data.key
+          }
+        })
+      },
+      // 当前页
+      currentChangeHandle ({ currentPage, pageSize }) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.refreshList()
+      },
+      // 排序
+      sortChangeHandle (column) {
+        this.tablePage.orders = []
+        if (column.order != null) {
+          this.tablePage.orders.push({column: this.$utils.toLine(column.property), asc: column.order === 'asc'})
+        }
+        this.refreshList()
+      },
+      // 删除
+      del (id) {
+        let ids = id || this.$refs.projectTable.getCheckboxRecords().map(item => {
+          return item.id
+        }).join(',')
+        this.$confirm(`确定删除所选项吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.loading = true
+          this.projectReportArchiveService.delete(ids).then((data) => {
+            this.$message.success(data)
+            this.refreshList()
+            this.loading = false
+          })
+        })
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      },
+      start () {
+        // 读取流程表单
+        let tabTitle = `发起流程【会计-项目报告归档】`
+        let processTitle = `${this.$store.state.user.name} 在 ${this.moment(new Date()).format('YYYY-MM-DD HH:mm')} 发起了 [会计-项目报告归档]`
+        taskService.getTaskDef({ procDefId: this.processDefinitionAuditId,
+          status: 'startAndHold'}).then((data) => {
+            this.$router.push({
+              path: '/flowable/task/TaskForm',
+              query: {
+                ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                procDefId: this.processDefinitionAuditId,
+                procDefKey: this.procDefAuditKey,
+                status: 'startAndHold',
+                title: tabTitle,
+                formType: data.formType,
+                formUrl: data.formUrl,
+                formTitle: processTitle,
+                businessId: 'false',
+                isShow: false,
+                routePath: '/cw/projectReportArchive/ProjectReportArchiveList'
+              }
+            })
+          })
+      },
+      // 发起项目归档
+      push (row) {
+        // 读取流程表单
+        let title = `发起流程【会计-项目报告归档】`
+        let processTitle = `${this.$store.state.user.name} 发起了 ${row.reportNo} - ${row.projectName} [会计-项目报告归档]`
+        let status = 'startAndHold'
+        if (row.status === '3' || row.status === '4') {
+          status = 'startAndClose'
+        }
+        taskService.getTaskDef({ procDefId: this.processDefinitionAuditId,
+          businessId: row.id,
+          businessTable: 'cw_project_archive'}).then((data) => {
+            this.$router.push({
+              path: '/flowable/task/TaskForm',
+              query: {
+                ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                procDefId: this.processDefinitionAuditId,
+                procDefKey: this.procDefAuditKey,
+                title: title,
+                formType: data.formType,
+                formUrl: data.formUrl,
+                formTitle: processTitle,
+                businessTable: 'cw_project_archive',
+                businessId: row.id,
+                isShow: 'false',
+                status: status,
+                routePath: '/cw/projectReportArchive/ProjectReportArchiveList'
+              }
+            })
+          })
+      },
+      // 查看项目归档流程结果
+      detail (row) {
+        if (row.status !== '0' && row.status !== '1') {
+          let procInsId = row.procInsId
+          let procDefId = this.processDefinitionAuditId
+          officeService.queryById(this.$store.state.user.office.id).then((byId) => {
+            // 判断当前人的所属部门是否为苏州分部,根据部门的机构编码(szfb)来判断是不是苏州分部
+            if (byId.code === 'szfb') {
+              procDefId = this.processDefinitionAuditIdSZ
+              this.getTaskDef(row, procInsId, procDefId)
+            } else {
+              this.getTaskDef(row, procInsId, procDefId)
+            }
+          })
+        }
+      },
+      getTaskDef (row, procInsId, procDefId) {
+        // eslint-disable-next-line eqeqeq
+        taskService.getTaskDef({
+          procInsId: procInsId,
+          procDefId: procDefId
+        }).then((data) => {
+          this.$router.push({
+            path: '/flowable/task/TaskFormDetail',
+            query: {
+              ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+              isShow: 'false',
+              readOnly: true,
+              title: '会计-项目报告归档' + '流程详情',
+              formTitle: '会计-项目报告归档' + '流程详情',
+              businessId: row.id,
+              status: 'reback'
+            }
+          })
+        })
+      },
+      // 撤回项目归档
+      reback (row) {
+        this.$confirm(`确定要撤回该申请吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(async () => {
+          await this.projectReportArchiveService.queryById(row.id).then((data) => {
+            if (data.status !== '2') { // status的值不等于“审核中”,就弹出提示
+              this.$message.error('数据已发生改变或不存在,请刷新数据')
+              this.refreshList()
+            } else {
+              processService.revokeProcIns(row.procInsId).then((data) => {
+                let form = {status: '3', id: row.id}
+                this.projectReportArchiveService.updateStatusById(form)
+                this.$message.success(data)
+                this.refreshList()
+              })
+            }
+          })
+        })
+      },
+      // 自定义服务端导出
+      exportMethod ({ options }) {
+        // 传给服务端的参数
+        const params = {
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm,
+          filename: options.filename,
+          sheetName: options.sheetName,
+          isHeader: options.isHeader,
+          original: options.original,
+          mode: options.mode,
+          selectIds: options.mode === 'selected' ? options.map(item => item.id) : [],
+          exportFields: options.columns.map(column => column.property)
+        }
+        return this.projectReportArchiveService.exportFile(params).then((res) => {
+          // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(res, options.filename)
+        }).catch(function (err) {
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      },
+      // 驳回后调整
+      adjust (row) {
+        this.projectReportArchiveService.queryById(row.id).then((data) => {
+          if (data.status !== '4') { // status的值不等于“驳回”,就弹出提示
+            this.$message.error('数据已发生改变或不存在,请刷新数据')
+            this.refreshList()
+          } else {
+            this.todo(row)
+          }
+        })
+      },
+      // 审核
+      examine (row) {
+        this.projectReportArchiveService.queryById(row.id).then((data) => {
+          if (data.status !== '2') { // status的值不等于“审核中”,就弹出提示
+            this.$message.error('数据已发生改变或不存在,请刷新数据')
+            this.refreshList()
+          } else {
+            this.todo(row)
+          }
+        })
+      },
+      // 审核或重新调整跳转
+      todo (row) {
+        let cUser = false
+        taskService.getTaskDefInfo({
+          taskId: row.taskId
+        }).then((data) => {
+          this.$router.push({
+            path: '/flowable/task/TaskForm',
+            query: {
+              ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title', 'businessId'),
+              isShow: false,
+              formReadOnly: true,
+              formTitle: `${data.taskName}`,
+              cUser: cUser,
+              title: `审批【${data.taskName || ''}】`,
+              routePath: '/cw/projectReportArchive/ProjectReportArchiveList'   // 数据处理后需要跳转的页面路径
+            }
+          })
+        })
+      },
+      // 查询当前登录人是否是数据的审核人
+      checkIsAudit (row) {
+        let loginUserId = this.$store.state.user.id  // 获取当前登录用户id
+        if (this.commonJS.isNotEmpty(row.auditUserIds)) {
+          for (const userId of row.auditUserIds) {
+            if (userId === loginUserId) {  // 当数据的审核人中包含当前登录人id时,返回true
+              return true
+            }
+          }
+        }
+        return false
+      }
+    }
+  }
+</script>

+ 844 - 0
src/views/cw/projectReportArchive/ProjectReportArchiveTaskForm.vue

@@ -0,0 +1,844 @@
+<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
+  <div>
+    <el-row>
+      <el-col :span="24">
+
+        <el-form :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="status === 'audit' || status === 'taskFormDetail'"
+                     label-width="110px" @submit.native.prevent>
+              <el-row  :gutter="15">
+<!--                <el-col :span="12">-->
+<!--                  <el-form-item label="档案名称" prop="name"-->
+<!--                                :rules="[-->
+<!--                                {required: true, message:'档案名称不能为空', trigger:'blur'}-->
+<!--                   ]">-->
+<!--                    <el-input v-model="inputForm.name" placeholder="请填写档案名称" clearable></el-input>-->
+<!--                  </el-form-item>-->
+<!--                </el-col>-->
+                <el-col :span="12">
+                  <el-form-item label="档案号" prop="fileNumber"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.fileNumber" placeholder="请填写档案号" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="项目名称" prop="cwProjectRecordsDTO.projectName"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.cwProjectRecordsDTO.projectName" placeholder="请填写项目名称" clearable>
+<!--                      <el-button slot="append" :disabled="status === 'audit' || status === 'taskFormDetail'" @click="openChooseProject" icon="el-icon-search"></el-button>-->
+                    </el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="项目编号" prop="cwProjectRecordsDTO.projectNumber"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.cwProjectRecordsDTO.projectNumber" placeholder="请填写项目编号" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="项目经理1" prop="cwProjectRecordsDTO.projectMasterName"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.cwProjectRecordsDTO.projectMasterName" placeholder="请填写项目经理1"></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="项目经理2" prop="cwProjectRecordsDTO.realHeaderName"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.cwProjectRecordsDTO.realHeaderName" placeholder="请填写项目经理2"></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="被审计单位" prop="auditedUnitsName"
+                                :rules="[
+                                {required: true, message:'被审计单位不能为空', trigger:'blur'},
+                                {required: true, message:'被审计单位不能为空', trigger:'change'}
+                   ]">
+                    <el-input :readonly="true" v-model="inputForm.auditedUnitsName" @focus="openChooseClient" placeholder="请填写被审计单位" clearable>
+                      <el-button slot="append" :disabled="status === 'audit' || status === 'taskFormDetail'" @click="openChooseClient" icon="el-icon-search"></el-button>
+                    </el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="报告册数" prop="reportNum"
+                                :rules="[
+                                {required: true, message:'报告册数不能为空', trigger:'blur'}
+                   ]">
+                    <el-input-number
+                      v-model="inputForm.reportNum"
+                      controls-position="right"
+                      style="width:100%"
+                      :precision="0"
+                      :max="9999999999"
+                      :step="1"
+                      :min="0"
+                      placeholder="请填写报告册数"
+                      :controls="false"
+                      clearable>
+                    </el-input-number>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="底稿册数" prop="papersNum"
+                                :rules="[
+                                {required: true, message:'底稿册数不能为空', trigger:'blur'}
+                   ]">
+                    <el-input-number
+                      v-model="inputForm.papersNum"
+                      controls-position="right"
+                      style="width:100%"
+                      :precision="0"
+                      :max="9999999999"
+                      :step="1"
+                      :min="0"
+                      placeholder="请填写底稿册数"
+                      :controls="false"
+                      clearable>
+                    </el-input-number>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="档案年度" prop="year"
+                                :rules="[
+                                {required: true, message:'档案年度不能为空', trigger:'blur'}
+                   ]">
+                    <el-date-picker
+                      v-model="inputForm.year"
+                      type="year"
+                      value-format="YYYY"
+                      placeholder="选择档案年度"
+                      style="width:100%"
+                      placement="bottom-start"
+                      :clearable="false">
+                    </el-date-picker>
+                  </el-form-item>
+                </el-col>
+                <el-col v-if="status !== 'audit'" :span="12">
+                  <el-form-item label="案卷号" prop="number"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.number" placeholder="请填写案卷号" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col v-if="status !== 'audit'" :span="12">
+                  <el-form-item label="确认案卷号" prop="isNumber"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.isNumber" placeholder="请填写确认案卷号" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-form v-if="status === 'audit'" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"
+                         label-width="110px" @submit.native.prevent>
+                <el-col  :span="12">
+                  <el-form-item label="案卷号" prop="number"
+                                :rules="[
+                                {required: true, message:'案卷号不能为空', trigger:'blur'}
+                   ]">
+                    <el-input style="width: 480px" :disabled="false" v-model="inputForm.number" placeholder="请填写案卷号" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col  :span="12">
+                  <el-form-item label="确认案卷号" prop="isNumber"
+                                :rules="[
+                                {required: true, message:'确认案卷号不能为空', trigger:'blur'}
+                   ]">
+                    <el-input :disabled="false" style="width: 480px" v-model="inputForm.isNumber" placeholder="请填写确认案卷号" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                </el-form>
+                <el-col :span="12">
+                  <el-form-item label="归档时间" prop="auditDate"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.auditDate" placeholder="请填写归档时间" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                  <el-form-item label="备注" prop="remarks"
+                                :rules="[
+                   ]">
+                    <el-input type="textarea" style="width:100%" maxlength="1000" v-model="inputForm.remarks" placeholder="请填写备注" show-word-limit></el-input>
+
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="申请人" prop="createBy.name"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.createBy.name" placeholder="请填写创建人" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="申请时间" prop="createDate"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.createDate" placeholder="请填写创建时间" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+          <el-divider content-position="left"><i class="el-icon-document"></i> 审计报告</el-divider>
+            <el-row :gutter="15">
+              <el-col :span="12">
+                <el-form-item label="报告文号" prop="reportNo"
+                              :rules="[
+                   ]">
+                  <el-input :disabled="true" v-model="inputForm.reportNo" placeholder="请填写报告文号" clearable>
+<!--                    <el-button slot="append" :disabled="status === 'audit' || status === 'taskFormDetail'" @click="openReportChoose" icon="el-icon-search"></el-button>-->
+                  </el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="报告日期" prop="reportDate"
+                              :rules="[
+                   ]">
+                  <el-input :disabled="true" v-model="inputForm.reportDate" placeholder="请填写报告日期" clearable></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="签字注师1" prop="signatureAnnotator1Name"
+                              :rules="[
+                   ]">
+                  <el-input :disabled="true" v-model="inputForm.signatureAnnotator1Name" placeholder="请填写签字注师1" clearable></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="签字注师2" prop="signatureAnnotator2Name"
+                              :rules="[
+                   ]">
+                  <el-input :disabled="true" v-model="inputForm.signatureAnnotator2Name" placeholder="请填写签字注师2" clearable></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="报告主办人" prop="reportCreateName"
+                              :rules="[
+                   ]">
+                  <el-input :disabled="true" v-model="inputForm.reportCreateName" placeholder="请填写报告主办人" clearable></el-input>
+                </el-form-item>
+              </el-col>
+              <el-form :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''" :disabled="status !== 'audit'"
+                       label-width="110px" @submit.native.prevent>
+              <el-col :span="24">
+                <el-form-item label="审计意见" prop="reportRemarks"
+                              :rules="[
+                   ]">
+                  <el-input type="textarea"  style="width:100%" maxlength="225" v-model="inputForm.reportRemarks" placeholder="请填写审计意见" show-word-limit></el-input>
+
+                </el-form-item>
+              </el-col>
+              </el-form>
+            </el-row>
+        </el-form>
+        <el-tabs v-model="activeName" type="border-card" @tab-click="tabHandleClick">
+          <el-tab-pane label="附件" name="files">
+            <!--        附件-->
+            <UpLoadComponent ref="uploadComponent"></UpLoadComponent>
+          </el-tab-pane>
+
+        </el-tabs>
+      </el-col>
+    </el-row>
+    <ProjectRecordsChooseCom ref="projectRecordsChooseCom" @getProject="getProject"></ProjectRecordsChooseCom>
+    <WorkClientChooseByProjectCom ref="workClientChooseByProjectCom" @getClient="getClient"></WorkClientChooseByProjectCom>
+    <ReportChooseByProjectCom ref="reportChooseByProjectCom" @getReport="getReport"></ReportChooseByProjectCom>
+  </div>
+</template>
+
+<script>
+  import UpLoadComponent from '@/views/common/UpLoadComponentV3.1'
+  import ProjectReportArchiveService from '@/api/cw/projectRecords/ProjectReportArchiveService'
+  import ProjectRecordsChooseCom from '@/views/cw/projectRecords/ProjectRecordsChooseCom'
+  import WorkClientChooseByProjectCom from '@/views/cw/projectReportArchive/WorkClientChooseByProjectCom'
+  import ReportChooseByProjectCom from '@/views/cw/projectReportArchive/ReportChooseByProjectCom'
+  import officeService from '@/api/sys/officeService'
+  import processService from '@/api/flowable/processService'
+  export default {
+    props: {
+      businessId: {
+        type: String,
+        default: ''
+      },
+      formReadOnly: {
+        type: Boolean,
+        default: false
+      },
+      status: {
+        type: String,
+        default: ''
+      }
+    },
+    data () {
+      return {
+        title: '',
+        method: '',
+        loading: false,
+        inputForm: {
+          id: '',
+          createDate: '',
+          createBy: {
+            id: '',
+            name: ''
+          },
+          remarks: '',
+          projectId: '',
+          name: '',
+          auditedUnits: '',
+          reportNum: '',
+          papersNum: '',
+          year: '',
+          number: '',
+          isNumber: '',
+          auditDate: '',
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          workAttachmentDtoList: [],
+          cwProjectReportArchiveReportDTOList: [],
+          cwProjectRecordsDTO: {
+            remarks: '',
+            projectNumber: '',
+            projectName: '',
+            officeId: '',
+            projectMoney: '',
+            auditYear: '',
+            planStartDate: '',
+            planEndDate: '',
+            projectMasterId: '',
+            projectLeaderId: '',
+            procInsId: '',
+            processDefinitionId: '',
+            status: '',
+            contractId: ''
+          },
+          auditedUnitsName: '',
+          fileNumber: '',
+          reportDate: '',
+          reportNo: '',
+          signatureAnnotator1: '',
+          signatureAnnotator1Name: '',
+          signatureAnnotator2: '',
+          signatureAnnotator2Name: '',
+          reportCreateName: '',
+          reportId: '',
+          reportRemarks: '',
+          procDefId: '',
+          procDefKey: '',
+          formTitle: '',
+          title: ''
+        },
+        keyWatch: '',
+        activeName: 'files',
+        tableKeyReport: ''
+      }
+    },
+    projectReportArchiveService: null,
+    created () {
+      this.projectReportArchiveService = new ProjectReportArchiveService()
+    },
+    computed: {
+      bus: {
+        get () {
+          this.$refs.uploadComponent.setDividerName('附件', false)
+          return this.businessId
+        },
+        set (val) {
+          this.businessId = val
+        }
+      }
+    },
+    watch: {
+      'keyWatch': {
+        handler (newVal) {
+          if (this.commonJS.isNotEmpty(this.bus)) {
+            this.init('', this.bus)
+          } else {
+            this.$nextTick(() => {
+              this.$refs.inputForm.resetFields()
+            })
+          }
+        }
+      },
+      'loading': {
+        handler (newVal) {
+          console.log(newVal)
+          this.$emit('changeLoading', newVal)
+          this.$refs.uploadComponent.changeLoading(newVal)
+        }
+      }
+    },
+    components: {
+      UpLoadComponent,
+      ProjectRecordsChooseCom,
+      WorkClientChooseByProjectCom,
+      ReportChooseByProjectCom
+    },
+    methods: {
+      getKeyWatch (keyWatch) {
+        this.keyWatch = keyWatch
+      },
+      init (method, id) {
+        this.activeName = 'files'
+        this.projectReportArchiveService = new ProjectReportArchiveService()
+        this.method = method
+        this.inputForm = {
+          id: '',
+          createDate: '',
+          createBy: {
+            id: '',
+            name: this.$store.state.user.name
+          },
+          remarks: '',
+          projectId: '',
+          name: '',
+          auditedUnits: '',
+          reportNum: '',
+          papersNum: '',
+          year: '',
+          number: '',
+          isNumber: '',
+          auditDate: '',
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          workAttachmentDtoList: [],
+          cwProjectReportArchiveReportDTOList: [],
+          cwProjectRecordsDTO: {
+            remarks: '',
+            projectNumber: '',
+            projectName: '',
+            officeId: '',
+            projectMoney: '',
+            auditYear: '',
+            planStartDate: '',
+            planEndDate: '',
+            projectMasterId: '',
+            projectLeaderId: '',
+            procInsId: '',
+            processDefinitionId: '',
+            status: '',
+            contractId: ''
+          },
+          auditedUnitsName: '',
+          fileNumber: '',
+          reportDate: '',
+          reportNo: '',
+          signatureAnnotator1: '',
+          signatureAnnotator1Name: '',
+          signatureAnnotator2: '',
+          signatureAnnotator2Name: '',
+          reportCreateName: '',
+          reportId: '',
+          reportRemarks: '',
+          procDefId: '',
+          procDefKey: '',
+          formTitle: '',
+          title: ''
+        }
+        this.inputForm.id = id
+        this.loading = false
+        this.$nextTick(() => {
+          this.$refs.inputForm.resetFields()
+          this.loading = true
+          this.projectReportArchiveService.queryById(this.inputForm.id).then((data) => {
+            this.$refs.uploadComponent.clearUpload()
+            this.inputForm = this.recover(this.inputForm, data)
+            this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+            if (this.commonJS.isEmpty(this.inputForm.workAttachmentDtoList)) {
+              this.inputForm.workAttachmentDtoList = []
+            }
+            if (this.commonJS.isEmpty(this.inputForm.createDate)) {
+              this.inputForm.createDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+            }
+            if (this.commonJS.isEmpty(this.inputForm.createBy.name)) {
+              this.inputForm.createBy.name = this.$store.state.user.name
+            }
+            if (this.commonJS.isEmpty(this.inputForm.officeId)) {
+              this.inputForm.officeId = this.$store.state.user.office.id
+            }
+            if (this.commonJS.isEmpty(this.inputForm.papersNum)) {
+              this.inputForm.papersNum = 0
+            }
+            if (this.commonJS.isEmpty(this.inputForm.reportNum)) {
+              this.inputForm.reportNum = 0
+            }
+            if (this.status === 'audit' || this.status === 'taskFormDetail') {
+              this.method = 'view'
+            }
+            this.$refs.uploadComponent.newUpload(this.method, this.inputForm.workAttachmentDtoList, 'cw_project_archive', null, null, null, null, false)
+            this.loading = false
+          })
+        })
+      },
+      saveForm (callback) {
+        if (this.commonJS.isNotEmpty(this.inputForm.id)) {
+          this.projectReportArchiveService.queryById(this.inputForm.id).then((data) => {
+            if (data.status !== '0' && data.status !== '1' && data.status !== '3') { // 审核状态不是“未发起”或“暂存”,就弹出提示
+              this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+              throw new Error()
+            } else {
+              this.doSubmit('save', callback)
+            }
+          })
+        } else {
+          this.doSubmit('save', callback)
+        }
+      },
+      startForm (callback) {
+        if (this.commonJS.isNotEmpty(this.inputForm.id)) {
+          this.projectReportArchiveService.queryById(this.inputForm.id).then((data) => {
+            if (data.status !== '0' && data.status !== '1' && data.status !== '3') { // 审核状态不是“未发起”或“暂存”或“撤回”,就弹出提示
+              this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+              throw new Error()
+            } else {
+              this.doSubmit('start', callback)
+            }
+          })
+        } else {
+          this.doSubmit('start', callback)
+        }
+      },
+      async agreeForm (callback) {
+        await this.projectReportArchiveService.queryById(this.inputForm.id).then((data) => {
+          if (data.status !== '2') { // 审核状态不是“待审核”,就弹出提示
+            this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+            throw new Error()
+          } else {
+            this.doSubmit('agree', callback)
+          }
+        })
+      },
+      reapplyForm (callback) {
+        this.projectReportArchiveService.queryById(this.inputForm.id).then((data) => {
+          if (data.status !== '4') { // 审核状态不是“驳回”,就弹出提示
+            this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+            throw new Error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+          } else {
+            this.doSubmit('reapply', callback)
+          }
+        })
+      },
+      // 表单提交
+      doSubmit (status, callback) {
+        if (status === 'save') {
+          // 暂存
+          this.inputForm.status = '1'
+          this.loading = true
+          if (this.$refs.uploadComponent.checkProgress()) {
+            this.loading = false
+            return
+          }
+          this.$refs.uploadComponent.getDataList().then((list) => {
+            // list为返回数据
+            this.inputForm.workAttachmentDtoList = list
+          })
+          this.inputForm.createDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+          this.projectReportArchiveService.saveForm(this.inputForm).then((data) => {
+            this.inputForm.id = data.businessId
+            callback(data.businessTable, data.businessId, this.inputForm)
+            this.loading = false
+          }).catch(() => {
+            this.loading = false
+          })
+          return
+        } else if (status === 'start') {
+          // 送审  待审核
+          this.inputForm.status = '2'
+        } else if (status === 'reapply') {
+          this.inputForm.status = '2'
+        }
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            if (this.$refs.uploadComponent.checkProgress()) {
+              this.loading = false
+              throw new Error()
+            } else {
+              if (status === 'agree') {
+                // 审核同意
+                this.inputForm.auditDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+                // this.inputForm.agreeUserId = this.$store.state.user.id
+                this.inputForm.status = '5'
+                if (this.inputForm.isNumber !== this.inputForm.number) {
+                  this.$message.error('“案卷号”与“确认案卷号”不一致,请重新填写')
+                  this.loading = false
+                  throw new Error('“案卷号”与“确认案卷号”不一致,请重新填写')
+                }
+              }
+              if (this.commonJS.isEmpty(this.inputForm.createDate)) {
+                this.inputForm.createDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+              }
+              this.$refs.uploadComponent.getDataList().then((list) => {
+                // list为返回数据
+                this.inputForm.workAttachmentDtoList = list
+                list.forEach(item => {
+                  if (this.commonJS.isEmpty(item.fileType)) {
+                    this.$message.error('附件中的文件类型不可以为空')
+                    this.loading = false
+                    throw new Error('附件中的文件类型不可以为空')
+                  }
+                })
+                this.projectReportArchiveService.saveForm(this.inputForm).then((saveDate) => {
+                  officeService.queryById(this.$store.state.user.office.id).then((byId) => {
+                    // 判断当前人的所属部门是否为苏州分部,根据部门的机构编码(szfb)来判断是不是苏州分部
+                    if (byId.code === 'szfb') { // 当前人的所属部门为苏州分部
+                      processService.getByName('会计-项目报告归档-苏州分部').then((data) => {
+                        if (!this.commonJS.isEmpty(data.id)) {
+                          if (status === 'start' || status === 'reapply') {
+                            if (status === 'start') {
+                              this.inputForm.procDefId = data.id
+                              this.inputForm.procDefKey = data.key
+                            }
+                            let processTitle = `${this.$store.state.user.name} 发起了 ${this.inputForm.reportNo} - ${this.inputForm.cwProjectRecordsDTO.projectName} ` + `[会计-项目报告归档-苏州分部]`
+                            this.inputForm.formTitle = processTitle
+                            this.inputForm.title = `发起流程【会计-项目报告归档-苏州分部】`
+                          }
+                          callback(saveDate.businessTable, saveDate.businessId, this.inputForm)
+                          this.loading = false
+                        }
+                      })
+                    } else {
+                      processService.getByName('会计-项目报告归档').then((data) => {
+                        if (!this.commonJS.isEmpty(data.id)) {
+                          if (status === 'start' || status === 'reapply') {
+                            if (status === 'start') {
+                              this.inputForm.procDefId = data.id
+                              this.inputForm.procDefKey = data.key
+                            }
+                            let processTitle = `${this.$store.state.user.name} 发起了 ${this.inputForm.reportNo} - ${this.inputForm.cwProjectRecordsDTO.projectName} ` + `[会计-项目报告归档]`
+                            this.inputForm.formTitle = processTitle
+                            this.inputForm.title = `发起流程【会计-项目报告归档】`
+                          }
+                          callback(saveDate.businessTable, saveDate.businessId, this.inputForm)
+                          this.loading = false
+                        }
+                      })
+                    }
+                  })
+                }).catch(() => {
+                  this.loading = false
+                  throw new Error()
+                })
+              })
+            }
+          }
+        })
+      },
+      async updateStatusById (type, callback) {
+        this.loading = true
+        if (this.$refs.uploadComponent.checkProgress()) {
+          this.loading = false
+          throw new Error()
+        } else {
+          if (type === 'reject' || type === 'reback') {
+            await this.projectReportArchiveService.queryById(this.inputForm.id).then((data) => {
+              if (data.status !== '2') { // status的值不等于“审核中”就弹出提示
+                this.loading = false
+                this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+                throw new Error()
+              } else {
+                if (type === 'reject') {
+                  if (this.inputForm.isNumber !== this.inputForm.number) {
+                    this.$message.error('“案卷号”与“确认案卷号”不一致,请重新填写')
+                    this.loading = false
+                    throw new Error('“案卷号”与“确认案卷号”不一致,请重新填写')
+                  } else {
+                    // 驳回
+                    let _this = this
+                    const wait = function () {
+                      return new Promise(function (resolve, reject) {
+                        _this.inputForm.status = '4'
+                        _this.loading = true
+                        if (_this.$refs.uploadComponent.checkProgress()) {
+                          _this.loading = false
+                          reject(new Error())
+                        }
+                        _this.$refs.uploadComponent.getDataList().then((list) => {
+                          // list为返回数据
+                          _this.inputForm.workAttachmentDtoList = list
+                        })
+                        resolve()
+                      })
+                    }
+                    wait().then(() => {
+                      this.projectReportArchiveService.saveForm(this.inputForm).then((data) => {
+                        callback()
+                        this.loading = false
+                      }).catch(() => {
+                        this.loading = false
+                      })
+                    }).catch(() => {
+                      this.loading = false
+                    })
+                  }
+                }
+                if (type === 'reback') {
+                  // 撤回
+                  let param = {status: '3', id: this.inputForm.id}
+                  this.projectReportArchiveService.updateStatusById(param).then(() => {
+                    this.loading = false
+                    callback()
+                  })
+                }
+              }
+            })
+          } else if (type === 'hold') {
+            this.projectReportArchiveService.queryById(this.inputForm.id).then((data) => {
+              if (data.status !== '4') { // status的值不等于“驳回”就弹出提示
+                this.loading = false
+                this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+                throw new Error()
+              } else {
+                // 终止
+                let param = {status: '1', id: this.inputForm.id}
+                this.projectReportArchiveService.updateStatusById(param).then(() => {
+                  this.loading = false
+                  callback()
+                })
+              }
+            })
+          }
+        }
+      },
+      close () {
+        this.inputForm = {
+          id: '',
+          createDate: '',
+          createBy: {
+            id: '',
+            name: ''
+          },
+          remarks: '',
+          projectId: '',
+          name: '',
+          auditedUnits: '',
+          reportNum: '',
+          papersNum: '',
+          year: '',
+          number: '',
+          isNumber: '',
+          auditDate: '',
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          workAttachmentDtoList: [],
+          cwProjectReportArchiveReportDTOList: [],
+          cwProjectRecordsDTO: {
+            remarks: '',
+            projectNumber: '',
+            projectName: '',
+            officeId: '',
+            projectMoney: '',
+            auditYear: '',
+            planStartDate: '',
+            planEndDate: '',
+            projectMasterId: '',
+            projectLeaderId: '',
+            procInsId: '',
+            processDefinitionId: '',
+            status: '',
+            contractId: ''
+          },
+          auditedUnitsName: '',
+          fileNumber: '',
+          reportDate: '',
+          reportNo: '',
+          signatureAnnotator1: '',
+          signatureAnnotator1Name: '',
+          signatureAnnotator2: '',
+          signatureAnnotator2Name: '',
+          reportCreateName: '',
+          reportId: '',
+          reportRemarks: '',
+          procDefId: '',
+          procDefKey: '',
+          formTitle: '',
+          title: ''
+        }
+        this.$refs.uploadComponent.clearUpload()
+        this.$refs.inputForm.resetFields()
+        this.inputForm.reportId = ''
+        this.inputForm.projectId = ''
+      },
+      tabHandleClick (event) {
+        // console.log(event)
+      },
+      // 新增
+      // eslint-disable-next-line no-dupe-keys
+      insertEvent (type) {
+      },
+      // 删除
+      removeEvent (row, rowIndex, type) {
+        if (type === 'report') {
+          this.$refs.reportTable.remove(row)
+          this.inputForm.cwProjectReportArchiveReportDTOList.splice(rowIndex, 1)
+        }
+      },
+      // 打开项目选择组件
+      openChooseProject (event) {
+        if (this.commonJS.isNotEmpty(this.inputForm.auditedUnitsName) || this.commonJS.isNotEmpty(this.inputForm.auditedUnits) || this.commonJS.isNotEmpty(this.inputForm.cwProjectReportArchiveReportDTOList)) {
+          this.$confirm(`重新选择项目会清空"被审计单位"以及"审计报告"的数据,是否继续?`, '提示', {
+            confirmButtonText: '确定',
+            cancelButtonText: '取消',
+            type: 'warning'
+          }).then(() => {
+            this.$refs.projectRecordsChooseCom.init()
+          }).catch(() => {
+          })
+        } else {
+          this.$refs.projectRecordsChooseCom.init()
+        }
+      },
+      // 项目选择结果获取
+      getProject (row) {
+        this.inputForm.projectId = row.id
+        this.inputForm.cwProjectRecordsDTO.projectName = row.projectName
+        this.inputForm.cwProjectRecordsDTO.projectNumber = row.projectNumber
+        this.inputForm.cwProjectRecordsDTO.projectMasterId = row.projectMasterId
+        this.inputForm.auditedUnitsName = ''
+        this.inputForm.auditedUnits = ''
+        this.inputForm.cwProjectReportArchiveReportDTOList = []
+      },
+      // 打开被审计单位选择组件
+      openChooseClient () {
+        this.$refs.workClientChooseByProjectCom.init(this.inputForm.projectId)
+      },
+      // 被审计单位选择结果获取
+      getClient (row) {
+        this.inputForm.auditedUnitsName = row.name
+        this.inputForm.auditedUnits = row.id
+      },
+      // 打开审计报告选择组件
+      openReportChoose () {
+        this.$refs.reportChooseByProjectCom.init(this.inputForm.projectId, this.inputForm.id)
+      },
+      // 审计报告选择结果获取
+      getReport (row) {
+        if (this.commonJS.isNotEmpty(row)) {
+          if (this.commonJS.isNotEmpty(row.reportId)) {
+            this.projectReportArchiveService.findReportUse(row.reportId).then((data) => {
+              if (data === false) {
+                this.inputForm.reportDate = row.reportDate
+                this.inputForm.reportNo = row.reportNo
+                this.inputForm.signatureAnnotator1 = row.signatureAnnotator1
+                this.inputForm.signatureAnnotator1Name = row.signatureAnnotator1Name
+                this.inputForm.signatureAnnotator2 = row.signatureAnnotator2
+                this.inputForm.signatureAnnotator2Name = row.signatureAnnotator2Name
+                this.inputForm.reportCreateName = row.createName
+                this.inputForm.reportId = row.reportId
+              } else {
+                this.$message.error('此报告正在归档中或已归档,请重新选择')
+              }
+            })
+          }
+        }
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-input-number .el-input__inner {
+    text-align: left;
+  }
+</style>

+ 177 - 0
src/views/cw/projectReportArchive/ReportChooseByProjectCom.vue

@@ -0,0 +1,177 @@
+<template>
+  <div>
+    <el-dialog
+      title="审计报告选择"
+      :close-on-click-modal="false"
+	  draggable
+      width="1100px"
+      height="500px"
+      @close="close"
+      append-to-body
+	  v-model="visible">
+      <div style="height: calc(100% - 80px);">
+        <el-form :inline="true" class="query-form" ref="searchForm" :model="searchForm" @submit.native.prevent>
+          <!-- 搜索框-->
+          <el-form-item label="报告文号" prop="reportNo">
+            <el-input v-model="searchForm.reportNo" placeholder="请输入报告文号" clearable></el-input>
+          </el-form-item>
+
+          <el-form-item>
+            <el-button type="primary" @click="list()" icon="el-icon-search">查询</el-button>
+            <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>
+          </el-form-item>
+        </el-form>
+
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="400px"
+          :loading="loading"
+          ref="reportTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          :print-config="{}"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :row-config="{isCurrent: true}"
+          :radio-config="{trigger: 'row'}"
+        >
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="radio" width="40px"></vxe-column>
+          <vxe-column min-width="230" align="center" title="报告文号" field="reportNo"></vxe-column>
+          <vxe-column min-width="180" align="center" title="报告日期" field="reportDate"></vxe-column>
+          <vxe-column min-width="150" align="center" title="签字注师1" field="signatureAnnotator1Name"></vxe-column>
+          <vxe-column min-width="150" align="center" title="签字注师2" field="signatureAnnotator2Name"></vxe-column>
+          <vxe-column min-width="150" align="center" title="报告主办人" field="createName"></vxe-column>
+        </vxe-table>
+        <vxe-pager
+          background
+          :current-page="tablePage.currentPage"
+          :page-size="tablePage.pageSize"
+          :total="tablePage.total"
+          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+          @page-change="currentChangeHandle">
+        </vxe-pager>
+      </div>
+      <span slot="footer" class="dialog-footer">
+      <el-button @click="close()" icon="el-icon-circle-close">关闭</el-button>
+      <el-button type="primary" v-if="method != 'view'" @click="getReport()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+    </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import ProjectReportArchiveService from '@/api/cw/projectRecords/ProjectReportArchiveService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        dataList: [],
+        searchForm: {
+          reportNo: '',
+          projectId: '',
+          achiveId: ''
+        },
+        projectId: '',
+        achiveId: ''
+      }
+    },
+    projectReportArchiveService: null,
+    created () {
+      this.projectReportArchiveService = new ProjectReportArchiveService()
+    },
+    components: {
+    },
+    methods: {
+      init (projectId, achiveId) {
+        this.projectId = projectId
+        if (this.commonJS.isNotEmpty(achiveId)) {
+          this.achiveId = achiveId
+        } else {
+          this.achiveId = ''
+          this.searchForm.achiveId = ''
+        }
+        this.visible = true
+        this.list()
+      },
+      // 表单提交
+      getReport () {
+        let row = this.$refs.reportTable.getRadioRecord()
+        if (this.commonJS.isEmpty(row)) {
+          this.$message.error('请选择一条数据')
+          return
+        }
+        if (this.commonJS.isNotEmpty(row)) {
+          if (this.commonJS.isNotEmpty(row.reportId)) {
+            this.projectReportArchiveService.findReportUse(row.reportId).then((data) => {
+              if (data === false) {
+                this.close()
+                this.$emit('getReport', row)
+              } else {
+                this.$message.error('此报告正在归档中或已归档,请重新选择')
+              }
+            })
+          }
+        }
+      },
+      list () {
+        this.loading = true
+        if (this.commonJS.isNotEmpty(this.projectId)) {
+          this.searchForm.projectId = this.projectId
+          if (this.commonJS.isNotEmpty(this.achiveId)) {
+            this.searchForm.achiveId = this.achiveId
+          }
+          this.projectReportArchiveService.reportList({
+            'current': this.tablePage.currentPage,
+            'size': this.tablePage.pageSize,
+            'orders': this.tablePage.orders,
+            ...this.searchForm
+          }).then((data) => {
+            this.dataList = data.records
+            this.tablePage.total = data.total
+            this.loading = false
+          })
+        } else {
+          this.dataList = []
+          this.tablePage.total = 0
+          this.loading = false
+        }
+      },
+      // 当前页
+      currentChangeHandle ({currentPage, pageSize}) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.list()
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.list()
+      },
+      close () {
+        this.searchForm.achiveId = ''
+        this.$refs.searchForm.resetFields()
+        this.visible = false
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-dialog__body {
+    padding-top: 0px;
+    padding-bottom: 15px;
+  }
+</style>

+ 189 - 0
src/views/cw/projectReportArchive/WorkClientChooseByProjectCom.vue

@@ -0,0 +1,189 @@
+<template>
+  <div>
+    <el-dialog
+      title="被审计单位选择"
+      :close-on-click-modal="false"
+	  draggable
+      width="1100px"
+      height="500px"
+      @close="close"
+      append-to-body
+	  v-model="visible">
+      <div style="height: calc(100% - 80px);">
+        <el-form :inline="true" class="query-form" ref="searchForm" :model="searchForm" @submit.native.prevent>
+          <!-- 搜索框-->
+          <el-form-item label="客户名称" prop="name">
+            <el-input v-model="searchForm.name" placeholder="请输入客户名称" clearable></el-input>
+          </el-form-item>
+          <el-form-item label="客户编号" prop="no">
+            <el-input v-model="searchForm.no" placeholder="请输入客户编号" clearable></el-input>
+          </el-form-item>
+          <el-form-item label="统一社会信用代码" prop="uscCode">
+            <el-input v-model="searchForm.uscCode" placeholder="请输入统一社会信用代码" clearable></el-input>
+          </el-form-item>
+          <el-form-item label="所属行业" prop="industry">
+            <el-select v-model="searchForm.industry" placeholder="请选择" style="width:100%;" clearable>
+              <el-option
+                v-for="item in $dictUtils.getDictList('cw_work_client_industry')"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+
+          <el-form-item>
+            <el-button type="primary" @click="list()" icon="el-icon-search">查询</el-button>
+            <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>
+          </el-form-item>
+        </el-form>
+
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="400px"
+          :loading="loading"
+          ref="clientTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          :print-config="{}"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :row-config="{isCurrent: true}"
+          :radio-config="{trigger: 'row'}"
+        >
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="radio" width="60px"></vxe-column>
+          <vxe-column min-width="230" align="center" title="客户名称" field="name"></vxe-column>
+          <vxe-column min-width="160" align="center" title="客户编号" field="no"></vxe-column>
+          <vxe-column min-width="160" align="center" title="客户类型" field="type">
+            <template #default="scope">
+              {{$dictUtils.getDictLabel('cw_work_client_type', scope.row.type, '-')}}
+            </template>
+          </vxe-column>
+          <vxe-column min-width="160" align="center" title="统一社会信用代码" field="uscCode"></vxe-column>
+          <vxe-column min-width="160" align="center" title="所属行业" field="industry">
+            <template #default="scope">
+              {{$dictUtils.getDictLabel('cw_work_client_industry', scope.row.industry, '-')}}
+            </template>
+          </vxe-column>
+
+        </vxe-table>
+        <vxe-pager
+          background
+          :current-page="tablePage.currentPage"
+          :page-size="tablePage.pageSize"
+          :total="tablePage.total"
+          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+          @page-change="currentChangeHandle">
+        </vxe-pager>
+      </div>
+		<template #footer>
+			<span class="dialog-footer">
+			  <el-button @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			  <el-button type="primary" v-if="method != 'view'" @click="getClient()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+			</span>
+		</template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import workClientService from '@/api/cw/workClientInfo/WorkClientService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        dataList: [],
+        searchForm: {
+          name: '',
+          no: '',
+          uscCode: '',
+          affiliation: '',
+          cwWorkClientTypeDTO: {
+            ownershipType: ''
+          },
+          industry: '',
+          createDates: [],
+          status: ''
+        },
+        projectId: ''
+      }
+    },
+    created () {
+    },
+    components: {
+    },
+    methods: {
+      init (projectId) {
+        this.projectId = projectId
+        this.visible = true
+        this.list()
+      },
+      // 表单提交
+      getClient () {
+        let row = this.$refs.clientTable.getRadioRecord()
+        if (this.commonJS.isEmpty(row)) {
+          this.$message.error('请选择一条数据')
+          return
+        }
+        this.close()
+        this.$emit('getClient', row)
+      },
+      list () {
+        this.loading = true
+        if (this.commonJS.isNotEmpty(this.projectId)) {
+          this.searchForm.projectId = this.projectId
+          this.searchForm.isTrue = '1'
+          workClientService.list({
+            'current': this.tablePage.currentPage,
+            'size': this.tablePage.pageSize,
+            'orders': this.tablePage.orders,
+            ...this.searchForm
+          }).then((data) => {
+            this.dataList = data.records
+            this.tablePage.total = data.total
+            this.loading = false
+          })
+        } else {
+          this.dataList = []
+          this.tablePage.total = 0
+          this.loading = false
+        }
+      },
+      // 当前页
+      currentChangeHandle ({currentPage, pageSize}) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.list()
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.list()
+      },
+      close () {
+        this.$refs.searchForm.resetFields()
+        this.visible = false
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-dialog__body {
+    padding-top: 0px;
+    padding-bottom: 15px;
+  }
+</style>

+ 334 - 0
src/views/cw/reimbursementApproval/info/CwProgramPageForm.vue

@@ -0,0 +1,334 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+	  draggable
+      width="1200px"
+      height="500px"
+      @close="close"
+      append-to-body
+      v-model="visible">
+      <el-container>
+        <el-main style="padding-top: 0;padding-bottom: 0">
+          <div v-if="isShow">
+            <el-radio v-model="checkType" label="1"  style="margin-right: 20px">项目</el-radio>
+            <el-radio v-model="checkType" label="2"  style="margin-right: 20px">其他</el-radio>
+          </div>
+          <div  v-if="checkType === '1'">
+            <el-form style="margin-bottom: 0"  :inline="true" class="query-form" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+              <!-- 搜索框-->
+              <el-form-item label="项目名称" prop="name">
+                <el-input  v-model="searchForm.projectName" placeholder="请输入项目名称" clearable></el-input>
+              </el-form-item>
+              <el-form-item label="项目编号" prop="no">
+                <el-input v-model="searchForm.projectNumber" placeholder="请输入项目编号" clearable></el-input>
+              </el-form-item>
+
+              <el-form-item>
+                <el-button type="primary" @click="list()" icon="el-icon-search">查询</el-button>
+                <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>
+              </el-form-item>
+            </el-form>
+            <div v-if="num" style="margin-bottom: 10px"><span style="color: #F56C6C">注:最多选择 10 条数据</span></div>
+            <vxe-table
+              border="inner"
+              auto-resize
+              resizable
+              height="400px"
+              :loading="loading"
+              ref="programTable"
+              show-header-overflow
+              show-overflow
+              highlight-hover-row
+              :menu-config="{}"
+              :print-config="{}"
+              @checkbox-all="selectAllEvent"
+              @checkbox-change="selectionChangeHandle"
+              :row-id="rowId"
+              :checkbox-config="{reserve: true}"
+              :sort-config="{remote:true}"
+              :data="dataList">
+              <vxe-column type="seq" width="60" title="序号"></vxe-column>
+              <vxe-column type="checkbox" width="60px"></vxe-column>
+              <vxe-column min-width="230" align="center" title="项目名称" field="projectName"></vxe-column>
+              <vxe-column min-width="160" align="center" title="项目编号" field="projectNumber"></vxe-column>
+              <vxe-column min-width="160" align="center" title="合同名称" field="contractName"></vxe-column>
+              <vxe-column min-width="160" align="center" title="创建人" field="createBy.name"></vxe-column>
+              <vxe-column min-width="160" align="center" title="创建时间" field="createDate"></vxe-column>
+              <!--          <vxe-column  title="项目名称" field="name"></vxe-column>-->
+              <!--          <vxe-column width="200px" title="项目编号" field="no"></vxe-column>-->
+              <!--          <vxe-column width="150px" title="登记人" field="createBy"></vxe-column>-->
+              <!--          <vxe-column width="100px" title="委托方" field="clientName"></vxe-column>-->
+
+            </vxe-table>
+            <vxe-pager
+              background
+              :current-page="tablePage.currentPage"
+              :page-size="tablePage.pageSize"
+              :total="tablePage.total"
+              :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+              :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+              @page-change="currentChangeHandle">
+            </vxe-pager>
+          </div>
+          <div style="height: 500px;" v-if="checkType === '2'">
+            <el-form  label-width="80px" class="query-form" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+              <el-row  :gutter="15">
+                <el-col :span="21">
+                  <el-form-item label="详情" prop="detail">
+                    <el-input style="width: 100%" type="textarea" maxlength="500" v-model="detail" placeholder="请输入详情" show-word-limit></el-input>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+            </el-form>
+          </div>
+        </el-main>
+        <el-aside width="300px" v-if="checkType === '1' && commonJS.isNotEmpty(dataListAllSelections.length) && dataListAllSelections.length > 0">
+          <el-tag
+            style="margin: 10px 0 0 0"
+            :key="tag.id"
+            v-for="(tag, index) in dataListAllSelections"
+            closable
+            :disable-transitions="false"
+            @close="del(tag, index)">
+            {{tag.projectName.length>20?tag.projectName.substring(0,20)+'...':tag.projectName}}
+          </el-tag>
+        </el-aside>
+      </el-container>
+		<template #footer>
+			<span class="dialog-footer">
+			  <el-button  @click="close()">关闭</el-button>
+			  <el-button  type="primary" v-if="method != 'view'" @click="getProgram()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+			</span>
+		</template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+	import { ref } from "vue";
+  import projectRecordsService from '@/api/cw/projectRecords/ProjectRecordsService'
+  // import ProgramProjectListInfoService from '@/api/program/ProgramProjectListInfoService'
+  // import ReimbursementApprovalService from '@/api/cw/reimbursementApproval/ReimbursementApprovalService'
+  export default {
+    data () {
+      return {
+        title: '项目选择',
+        method: '',
+        visible: false,
+        loading: false,
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        dataList: [],
+        searchForm: {
+          projectName: '',
+          projectNumber: '',
+          createBy: ''
+        },
+        checkType: '',
+        detail: '',
+        isShow: true,
+        dataListAllSelections: [],
+        rowId: 'id',
+        num: true // num为true是多选,false是单选
+      }
+    },
+    // programProjectListInfoService: null,
+    // reimbursementApprovalService: null,
+    created () {
+      // this.programProjectListInfoService = new ProgramProjectListInfoService()
+      // this.reimbursementApprovalService = new ReimbursementApprovalService()
+    },
+    components: {
+    },
+    methods: {
+      init (isShow, num) {
+        if (this.commonJS.isEmpty(isShow)) {
+          this.isShow = true
+          this.checkType = '1'
+        } else {
+          if (isShow === false || isShow === 'false') {
+            this.isShow = false
+            this.checkType = '1'
+            this.$message({message: '第一条为项目后面新增只能选择项目', type: 'warning', customClass: 'messageZindex'})
+          } else if (isShow === '1') {
+            this.isShow = false
+            this.checkType = '1'
+          } else {
+            this.isShow = false
+            this.checkType = '2'
+          }
+        }
+        if (this.commonJS.isEmpty(num) || num === true) {
+          this.num = true // num为true是多选,false是单选
+        } else {
+          this.num = false
+        }
+        this.visible = true
+        this.dataListAllSelections = []
+        this.tablePage.currentPage = 1
+        this.tablePage.pageSize = 10
+        this.searchForm = {
+          projectName: '',
+          projectNumber: '',
+          createBy: ''
+        }
+        this.list()
+      },
+      // 表单提交
+      getProgram () {
+        let rows
+        if (this.checkType === '1') {
+          if (this.commonJS.isEmpty(this.dataListAllSelections)) {
+            this.$message.error('请至少选择一条数据')
+            return
+          }
+          if (this.num === false) {
+            if (this.dataListAllSelections.length > 1) {
+              this.$message.error('最多选择一条数据')
+              return
+            }
+          } else {
+            if (this.dataListAllSelections.length > 10) {
+              this.$message.error('最多选择10条数据')
+              return
+            }
+          }
+          rows = this.dataListAllSelections
+        } else {
+          if (this.commonJS.isEmpty(this.detail)) {
+            this.$message.error('请填写开票详情')
+            return
+          }
+          rows = [{projectName: this.detail}]
+        }
+        this.close()
+        this.$emit('getProgram', rows)
+      },
+      list () {
+        this.loading = true
+        this.searchForm.status = '5'
+        projectRecordsService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then(async (data) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+          // 在切换页后,将页面不需要勾选的数据取消勾选
+          let isCheck = []
+          for (let i = 0; i < this.tablePage.pageSize; i++) {
+            for (let j = 0; j < this.dataListAllSelections.length; j++) {
+              if (this.commonJS.isNotEmpty(this.dataList[i]) && this.commonJS.isNotEmpty(this.dataListAllSelections[j])) {
+                if (this.dataList[i].id === this.dataListAllSelections[j].id) { // 符合条件的数据勾选
+                  isCheck.push(this.dataList[i].id)
+                }
+              }
+            }
+          }
+          if (this.commonJS.isNotEmpty(isCheck)) {
+            for (let i = 0; i < this.tablePage.pageSize; i++) {
+              if (isCheck.includes(this.dataList[i].id)) {
+                await this.$refs.programTable.setCheckboxRow([this.dataList[i]], true)
+              } else {
+                await this.$refs.programTable.setCheckboxRow([this.dataList[i]], false)
+              }
+            }
+          } else {
+            for (let i = 0; i < this.tablePage.pageSize; i++) {
+              await this.$refs.programTable.setCheckboxRow([this.dataList[i]], false)
+            }
+          }
+        })
+      },
+      // 当前页
+      currentChangeHandle ({currentPage, pageSize}) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.list()
+      },
+      resetSearch () {
+        this.dataListAllSelections = []
+        this.searchForm = {
+          projectName: '',
+          projectNumber: '',
+          createBy: ''
+        }
+        // this.$refs.programTable.clearCheckboxReserve() // 清除全部页的勾选
+        this.$refs.searchForm.resetFields()
+        this.list()
+      },
+      close () {
+        // this.$refs.programTable.clearCheckboxReserve()
+        this.dataListAllSelections = []
+        this.detail = ''
+        this.visible = false
+      },
+      // 全选/取消全选 时,右侧tag标签同步新增或删除改变
+      async selectAllEvent (event) {
+        this.dataListAllSelections = []
+        let thisPageDate = await this.$refs.programTable.getCheckboxRecords()
+        let otherPageDate = await this.$refs.programTable.getCheckboxReserveRecords()
+        if (this.commonJS.isNotEmpty(otherPageDate)) {
+          for (let i = 0; i < otherPageDate.length; i++) {
+            this.dataListAllSelections.push(otherPageDate[i])
+          }
+        }
+        if (this.commonJS.isNotEmpty(thisPageDate)) {
+          for (let i = 0; i < thisPageDate.length; i++) {
+            this.dataListAllSelections.push(thisPageDate[i])
+          }
+        }
+      },
+      // 当前页“选中/取消选中”数据时,“新增/删除”右侧tag标签
+      selectionChangeHandle (event) {
+        if (event.checked) { // 选中触发
+          let delIndex = -1
+          for (let i = 0; i < this.dataListAllSelections.length; i++) {
+            if (this.dataListAllSelections[i].id === event.row.id) {
+              delIndex = i
+            }
+          }
+          if (this.commonJS.isNotEmpty(delIndex) && delIndex === -1) {
+            this.dataListAllSelections.push(event.row)
+          }
+        } else { // 取消选中触发
+          let delIndex = -1
+          for (let i = 0; i < this.dataListAllSelections.length; i++) {
+            if (this.dataListAllSelections[i].id === event.row.id) {
+              delIndex = i
+            }
+          }
+          if (this.commonJS.isNotEmpty(delIndex) && delIndex !== -1) {
+            this.dataListAllSelections.splice(delIndex, 1)
+          }
+        }
+      },
+      // 删除tag标签时,取消勾选当前页对应的数据
+      async del (tag, index) {
+        this.dataListAllSelections.splice(index, 1)
+        let rows = await this.$refs.programTable.getCheckboxRecords()
+        await this.$refs.programTable.clearCheckboxRow()
+        for (let i = 0; i < this.dataList.length; i++) {
+          for (let j = 0; j < rows.length; j++) {
+            if (this.dataList[i].id !== tag.id && this.dataList[i].id === rows[j].id) {
+              await this.$refs.programTable.setCheckboxRow([this.dataList[i]], true)
+            }
+          }
+        }
+      }
+    }
+  }
+</script>
+<style>
+  .messageZindex {
+    z-index:9999 !important;
+  }
+</style>

+ 156 - 0
src/views/cw/reimbursementApproval/info/CwReimbursementTypePullForm.vue

@@ -0,0 +1,156 @@
+<template>
+  <div>
+    <el-dialog
+      title="报销类型选择"
+      :close-on-click-modal="false"
+	  draggable
+      width="1100px"
+      height="500px"
+      append-to-body
+      @close="close"
+      v-model="visible">
+      <div style="height: calc(100% - 80px);">
+        <el-form :inline="true" class="query-form" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+          <!-- 搜索框-->
+          <el-form-item label="报销类型名称" prop="name">
+            <el-input v-model="searchForm.name" placeholder="请输入报销类型名称" clearable></el-input>
+          </el-form-item>
+
+          <el-form-item>
+            <el-button type="primary" @click="list()" icon="el-icon-search">查询</el-button>
+            <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>
+          </el-form-item>
+        </el-form>
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="500px"
+          :loading="loading"
+          ref="typeTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :tree-config="{transform: true, rowField: 'id', parentField: 'parentId',expandAll: true}"
+          :row-config="{isCurrent: true}"
+          :radio-config="{trigger: 'row'}">
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="radio" width="60" ></vxe-column>
+          <vxe-column title="报销内容名称" field="name" align="left" tree-node></vxe-column>
+          <vxe-column width="100" title="序号" field="sort"></vxe-column>
+        </vxe-table>
+      </div>
+		<template #footer>
+			<span class="dialog-footer">
+			  <el-button @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			  <el-button type="primary" v-if="method != 'view'" @click="getProgramForType" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+			</span>
+		</template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  // import ReimbursementTypeService from '@/api/sys/ReimbursementTypeService'
+  import ReimbursementApprovalTypeService from '@/api/cw/reimbursementApproval/ReimbursementApprovalTypeService'
+  export default {
+    data () {
+      return {
+        searchForm: {
+          name: ''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        like: '',
+        officeId: ''
+      }
+    },
+    // reimbursementTypeService: null,
+    reimbursementApprovalTypeService: null,
+    created () {
+      // this.reimbursementTypeService = new ReimbursementTypeService()
+      this.reimbursementApprovalTypeService = new ReimbursementApprovalTypeService()
+    },
+    components: {
+    },
+    methods: {
+      init (like, deptName) {
+        console.log('进来了')
+        console.log('like', like)
+        if (like === '1') {
+          this.like = '1'
+        } else {
+          this.like = ''
+        }
+        this.officeId = deptName
+        console.log('this.officeId', this.officeId)
+        this.visible = true
+        this.list()
+      },
+      // 表单提交
+      getProgramForType () {
+        let rows
+        if (this.commonJS.isEmpty(this.$refs.typeTable.getRadioRecord())) {
+          this.$message.error('请选择一条数据')
+          return
+        }
+        rows = this.$refs.typeTable.getRadioRecord()
+        this.dataList.forEach((item) => {
+          if (item.parentId === rows.id) {
+            this.$message.error('只可以选择最小节点的数据')
+            throw new Error('只可以选择最小节点的数据')
+          }
+        })
+        this.$emit('getProgramForType', rows)
+        this.close()
+      },
+      list () {
+        this.loading = true
+        this.searchForm.like = this.like
+        this.searchForm.officeId = this.officeId
+        this.reimbursementApprovalTypeService.bxList({...this.searchForm}).then((data) => {
+          this.dataList = data
+          this.loading = false
+          this.$nextTick(() => {
+            this.$refs.typeTable.setAllTreeExpand(true)
+          })
+        })
+        // this.reimbursementTypeService.list({...this.searchForm}).then((data) => {
+        //   this.dataList = data
+        //   this.loading = false
+        // })
+      },
+      // 当前页
+      currentChangeHandle ({currentPage, pageSize}) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.list()
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.list()
+      },
+      close () {
+        this.detail = ''
+        this.visible = false
+      }
+    }
+  }
+</script>
+<style>
+  .messageZindex {
+    z-index:9999 !important;
+  }
+</style>

+ 787 - 0
src/views/cw/reimbursementApproval/info/InfoForm.vue

@@ -0,0 +1,787 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+	  draggable
+      width="1200px"
+      @close="close"
+      append-to-body
+      @keyup.enter.native="doSubmit"
+      v-model="visible">
+      <el-form :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="method==='view'"
+               label-width="100px" @submit.native.prevent>
+
+        <el-divider content-position="left"><i class="el-icon-document"></i> 基础信息</el-divider>
+        <el-row :gutter="26">
+          <el-col :span="12">
+            <el-form-item label="经办人" prop="userName">
+              <el-input v-model="inputForm.userName" :disabled="true"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="报销编号" prop="no">
+              <el-input v-model="inputForm.no" :disabled="true"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="所属部门" prop="departmentName">
+              <el-input v-model="inputForm.departmentName" :disabled="true"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="报销日期" prop="reimDate">
+              <el-date-picker
+                v-model="inputForm.reimDate"
+                type="date"
+                value-format="yyyy-MM-dd"
+                style="width: 100%"
+                placeholder="选择日期">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="报销类型" prop="sourceType">
+              <el-select v-model="inputForm.sourceType" placeholder="请选择报销类型" style="width:100%;">
+                <el-option
+                  v-for="item in $dictUtils.getDictList('cw_reimbursement_source_type')"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12" v-if="inputForm.sourceType === '5'">
+            <el-form-item label="采购编号" prop="purchaseNo"
+                          :rules="[{required: true, message:'采购编号不能为空', trigger:'blur'},
+                              {required: true, message:'采购编号不能为空', trigger:'change'}]">
+              <el-input :readonly="true" @focus="openPurForm()" v-model="inputForm.purchaseNo" placeholder="请选择采购编号">
+                <el-button slot="append" icon="el-icon-search" @click="openPurForm()"></el-button>
+              </el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="备注" prop="remarks">
+              <el-input v-model="inputForm.remarks"
+                        type="textarea"
+                        :rows="5"
+                        maxlength="500"
+                        placeholder="请输入简介"
+                        show-word-limit>
+              </el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <div v-if="inputForm.sourceType === '5'">
+          <el-divider content-position="left"><i class="el-icon-document"></i>
+            采购详情
+          </el-divider>
+          <el-row  :gutter="15" >
+            <el-col :span="24">
+				<vxe-table
+					border
+					show-footer
+					show-overflow
+					:footer-method="footerMethod555"
+					ref="preTable"
+					class="vxe-table-element"
+					:data="inputForm.preList"
+					style="margin-left: 5em"
+					keep-source
+					highlight-current-row
+				>
+					<vxe-table-column field="purchaserAgent" title="采购人" :edit-render="{}" :rules="[{required: true, message:'请选择采购人', trigger:'blur'}]"></vxe-table-column>
+					<vxe-table-column field="procurementOffice" title="采购部门" :edit-render="{}"></vxe-table-column>
+					<vxe-table-column field="procurementType" title="采购类型" :edit-render="{}" :rules="[{required: true, message:'请选择采购类型', trigger:'blur'}]"></vxe-table-column>
+					<vxe-table-column field="tradeName" title="商品名称" :edit-render="{}" :rules="[{required: true, message:'请填写商品名称', trigger:'blur'}]"></vxe-table-column>
+					<vxe-table-column field="tradePrice" title="商品单价(元)" :edit-render="{}" :rules="[{required: true, message:'请输入商品单价', trigger:'blur'}]"></vxe-table-column>
+					<vxe-table-column field="tradeNumber" title="商品数量" :edit-render="{}"></vxe-table-column>
+					<vxe-table-column field="priceSum" title="商品总价" :edit-render="{}"></vxe-table-column>
+					<vxe-table-column field="company" title="单位" :edit-render="{}"></vxe-table-column>
+					<vxe-table-column field="remarks" title="备注" :edit-render="{}"></vxe-table-column>
+					<vxe-table-column title="操作">
+						<template #default="scope">
+							<el-button type="primary" :disabled="false" @click="seeFileInfo(scope.$rowIndex)">文件详情</el-button>
+						</template>
+					</vxe-table-column>
+				</vxe-table>
+			</el-col>
+          </el-row>
+        </div>
+        <div v-if="inputForm.sourceType === '1'">
+          <el-divider content-position="left"><i class="el-icon-document"></i>
+            项目报销详情
+            <el-button style="margin-left: 20px" size="small" type="primary" :disabled="method==='view' || this.formReadOnly" @click="insertEvent('detail')" plain>
+              新增
+            </el-button>
+          </el-divider>
+          <el-row  :gutter="15" >
+            <el-col :span="24">
+				<vxe-table
+					border
+					show-footer
+					show-overflow
+					:footer-method="footerMethod"
+					ref="detailTable"
+					class="vxe-table-element"
+					:data="inputForm.detailInfos"
+					style="margin-left: 5em"
+					keep-source
+					highlight-current-row
+					:edit-config="{trigger: 'click', mode: 'row', showStatus: true, autoClear: true, icon:'_'}"
+				>
+					<vxe-table-column field="userName" title="报销人" :edit-render="{}" :rules="[{required: true, message:'请选择报销人', trigger:'blur'}]">
+						<template #default="scope">
+							<el-input v-model="scope.row.userName" @focus="userPullListForm(scope.$rowIndex)"></el-input>
+							<!--              <UserSelectV2 :limit='1' :userName="scope.row.userName" @getValue='(value, label) => {scope.row.userName = label}'></UserSelectV2>-->
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="deptName" title="报销部门" :edit-render="{}">
+						<template #default="scope">
+							<el-input :disabled='true' v-model="scope.row.deptName" ></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="typeName" title="报销类别" :edit-render="{}" :rules="[{required: true, message:'请选择报销类别', trigger:'blur'}]">
+						<template #default="scope">
+							<el-input v-model="scope.row.typeName" @focus="typePullForm(scope.$rowIndex)"></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="projectName" title="报销项目" :edit-render="{}" :rules="[{required: true, message:'请选择报销项目', trigger:'blur'}]">
+						<template #default="scope">
+							<el-input v-model="scope.row.projectName" @focus="openProgramPageForm(scope.$rowIndex, scope.row)"></el-input>
+						</template>
+					</vxe-table-column>
+					<!--            <vxe-table-column field="reportNumber" title="报告号" :edit-render="{}">-->
+					<!--              <template v-slot:edit="scope">-->
+					<!--                <el-input :readonly="true" v-model="scope.row.reportNumber" @focus="openReportNoPageForm(scope.$rowIndex, scope.row)"></el-input>-->
+					<!--              </template>-->
+					<!--            </vxe-table-column>-->
+					<vxe-table-column field="number" title="费用(元)" :edit-render="{}" :rules="[{required: true, message:'请输入费用', trigger:'blur'}]">
+						<template #default="scope">
+							<el-input maxlength="15" v-model="scope.row.number" @keyup.native="scope.row.number = twoDecimalPlaces(scope.row.number)"></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="receiptNumber" title="收据张数" :edit-render="{}">
+						<template #default="scope">
+							<el-input v-model="scope.row.receiptNumber" oninput ="value=value.replace(/\D|^0/g,'')" maxlength="10"></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="days" title="出差天数" :edit-render="{}">
+						<template #default="scope">
+							<el-input v-model="scope.row.days" oninput ="value=value.replace(/\D|^0/g,'')" maxlength="10"></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="content" title="内容" :edit-render="{}">
+						<template #default="scope">
+							<el-input v-model="scope.row.content" ></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column title="操作" width="100">
+						<template #default="scope">
+							<el-button type="danger" @click="removeEvent(scope.row,scope.$rowIndex,'detail')">删除</el-button>
+						</template>
+					</vxe-table-column>
+				</vxe-table>
+			</el-col>
+          </el-row>
+        </div>
+        <div v-if="inputForm.sourceType === '2'">
+          <el-divider content-position="left"><i class="el-icon-document"></i>
+            合同报销详情
+            <el-button style="margin-left: 20px" size="small" type="primary" :disabled="method==='view' || this.formReadOnly" @click="insertEvent('contract_detail')" plain>
+              新增
+            </el-button>
+          </el-divider>
+          <el-row  :gutter="15" >
+            <el-col :span="24">
+				<vxe-table
+					border
+					show-footer
+					show-overflow
+					:footer-method="footerMethod"
+					ref="detailTableContract"
+					:key="detailKeyContract"
+					class="vxe-table-element"
+					:data="inputForm.detailInfoContracts"
+					style="margin-left: 5em"
+					keep-source
+					highlight-current-row
+					:edit-config="{trigger: 'click', mode: 'row', showStatus: true, autoClear: true, icon:'_'}"
+				>
+					<vxe-table-column field="userName" title="报销人" :edit-render="{}" :rules="[{required: true, message:'请选择报销人', trigger:'blur'}]">
+						<template #default="scope">
+							<el-input v-model="scope.row.userName" @focus="userPullListForm2(scope.$rowIndex)"></el-input>
+							<!--              <UserSelectV2 :limit='1' :userName="scope.row.userName" @getValue='(value, label) => {scope.row.userName = label}'></UserSelectV2>-->
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="deptName" title="报销部门" :edit-render="{}">
+						<template #default="scope">
+							<el-input :disabled='true' v-model="scope.row.deptName" ></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="typeName" title="报销类别" :edit-render="{}" :rules="[{required: true, message:'请选择报销类别', trigger:'blur'}]">
+						<template #default="scope">
+							<el-input v-model="scope.row.typeName" @focus="typePullForm2(scope.$rowIndex)"></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="contractName" title="报销合同" :edit-render="{}" :rules="[{required: true, message:'请选择报销合同', trigger:'blur'}]">
+						<template #default="scope">
+							<el-input v-model="scope.row.contractName" @focus="openContractForm(scope.$rowIndex, scope.row)"></el-input>
+						</template>
+					</vxe-table-column>
+					<!--            <vxe-table-column field="reportNumber" title="报告号" :edit-render="{}">-->
+					<!--              <template v-slot:edit="scope">-->
+					<!--                <el-input :readonly="true" v-model="scope.row.reportNumber" @focus="openReportNoPageForm(scope.$rowIndex, scope.row)"></el-input>-->
+					<!--              </template>-->
+					<!--            </vxe-table-column>-->
+					<vxe-table-column field="number" title="费用(元)" :edit-render="{}" :rules="[{required: true, message:'请输入费用', trigger:'blur'}]">
+						<template #default="scope">
+							<el-input maxlength="15" v-model="scope.row.number" @keyup.native="scope.row.number = twoDecimalPlaces(scope.row.number)"></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="receiptNumber" title="收据张数" :edit-render="{}">
+						<template #default="scope">
+							<el-input v-model="scope.row.receiptNumber" oninput ="value=value.replace(/\D|^0/g,'')" maxlength="10"></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="days" title="出差天数" :edit-render="{}">
+						<template #default="scope">
+							<el-input v-model="scope.row.days" oninput ="value=value.replace(/\D|^0/g,'')" maxlength="10"></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="content" title="内容" :edit-render="{}">
+						<template #default="scope">
+							<el-input v-model="scope.row.content" ></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column title="操作" width="100">
+						<template #default="scope">
+							<el-button type="danger" @click="removeEvent(scope.row,scope.$rowIndex,'detail')">删除</el-button>
+						</template>
+					</vxe-table-column>
+				</vxe-table>
+			</el-col>
+          </el-row>
+        </div>
+        <div v-if="inputForm.sourceType === '3'">
+          <el-divider content-position="left"><i class="el-icon-document"></i>
+            报告报销详情
+            <el-button style="margin-left: 20px" type="primary" size="small" :disabled="method==='view' || this.formReadOnly" @click="insertEvent('report_detail')" plain>
+              新增
+            </el-button>
+          </el-divider>
+          <el-row  :gutter="15" >
+            <el-col :span="24">
+				<vxe-table
+					border
+					show-footer
+					show-overflow
+					:footer-method="footerMethod"
+					ref="detailTableReport"
+					:key="detailKeyReport"
+					class="vxe-table-element"
+					:data="inputForm.detailInfoReports"
+					style="margin-left: 5em"
+					keep-source
+					highlight-current-row
+					:edit-config="{trigger: 'click', mode: 'row', showStatus: true, autoClear: true, icon:'_'}"
+				>
+					<vxe-table-column field="userName" title="报销人" :edit-render="{}" :rules="[{required: true, message:'请选择报销人', trigger:'blur'}]">
+						<template #default="scope">
+							<el-input v-model="scope.row.userName" @focus="userPullListForm3(scope.$rowIndex)"></el-input>
+							<!--              <UserSelectV2 :limit='1' :userName="scope.row.userName" @getValue='(value, label) => {scope.row.userName = label}'></UserSelectV2>-->
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="deptName" title="报销部门" :edit-render="{}">
+						<template #default="scope">
+							<el-input :disabled='true' v-model="scope.row.deptName" ></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="typeName" title="报销类别" :edit-render="{}" :rules="[{required: true, message:'请选择报销类别', trigger:'blur'}]">
+						<template #default="scope">
+							<el-input v-model="scope.row.typeName" @focus="typePullForm3(scope.$rowIndex)"></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="projectName" title="报销项目" :edit-render="{}" :rules="[{required: true, message:'请选择报销项目', trigger:'blur'}]">
+						<template #default="scope">
+							<el-input v-model="scope.row.projectName" @focus="openProgramPageForm3(scope.$rowIndex, scope.row)"></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="reportNumber" title="报告号" :edit-render="{}">
+						<template #default="scope">
+							<el-input :readonly="true" v-model="scope.row.reportNumber" @focus="openReportNoPageForm(scope.$rowIndex, scope.row)"></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="number" title="费用(元)" :edit-render="{}" :rules="[{required: true, message:'请输入费用', trigger:'blur'}]">
+						<template #default="scope">
+							<el-input maxlength="15" v-model="scope.row.number" @keyup.native="scope.row.number = twoDecimalPlaces(scope.row.number)"></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="receiptNumber" title="收据张数" :edit-render="{}">
+						<template #default="scope">
+							<el-input v-model="scope.row.receiptNumber" oninput ="value=value.replace(/\D|^0/g,'')" maxlength="10"></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="days" title="出差天数" :edit-render="{}">
+						<template #default="scope">
+							<el-input v-model="scope.row.days" oninput ="value=value.replace(/\D|^0/g,'')" maxlength="10"></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="content" title="内容" :edit-render="{}">
+						<template #default="scope">
+							<el-input v-model="scope.row.content" ></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column title="操作" width="100">
+						<template #default="scope">
+							<el-button type="danger" @click="removeEvent(scope.row,scope.$rowIndex,'report_detail')">删除</el-button>
+						</template>
+					</vxe-table-column>
+				</vxe-table>
+			</el-col>
+          </el-row>
+        </div>
+        <div v-if="inputForm.sourceType === '4'">
+          <el-divider content-position="left"><i class="el-icon-document"></i>
+            其他报销详情
+            <el-button style="margin-left: 20px" type="primary" size="small" :disabled="method==='view' || this.formReadOnly" @click="insertEvent('others')" plain>
+              新增
+            </el-button>
+          </el-divider>
+          <el-row  :gutter="15" >
+            <el-col :span="24">
+				<vxe-table
+					border
+					show-footer
+					show-overflow
+					:footer-method="footerMethod"
+					ref="detailTableOthers"
+					class="vxe-table-element"
+					:data="inputForm.detailInfoOthers"
+					style="margin-left: 5em"
+					keep-source
+					:key="detailKeyOthers"
+					highlight-current-row
+					:edit-config="{trigger: 'click', mode: 'row', showStatus: true, autoClear: true, icon:'_'}"
+				>
+					<vxe-table-column field="userName" title="报销人" :edit-render="{}" :rules="[{required: true, message:'请选择报销人', trigger:'blur'}]">
+						<template #default="scope">
+							<el-input v-model="scope.row.userName" @focus="userPullListForm4(scope.$rowIndex)"></el-input>
+							<!--              <UserSelectV2 :limit='1' :userName="scope.row.userName" @getValue='(value, label) => {scope.row.userName = label}'></UserSelectV2>-->
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="deptName" title="报销部门" :edit-render="{}">
+						<template #default="scope">
+							<el-input :disabled='true' v-model="scope.row.deptName" ></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="typeName" title="报销类别" :edit-render="{}" :rules="[{required: true, message:'请选择报销类别', trigger:'blur'}]">
+						<template #default="scope">
+							<el-input v-model="scope.row.typeName" @focus="typePullForm4(scope.$rowIndex)"></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="projectName" title="报销详情" :edit-render="{}" :rules="[{required: true, message:'请田小娥报销详情', trigger:'blur'}]">
+						<template #default="scope">
+							<el-input v-model="scope.row.projectName" @focus="openProgramPageForm4(scope.$rowIndex, scope.row)"></el-input>
+						</template>
+					</vxe-table-column>
+					<!--            <vxe-table-column field="reportNumber" title="报告号" :edit-render="{}">-->
+					<!--              <template v-slot:edit="scope">-->
+					<!--                <el-input :readonly="true" v-model="scope.row.reportNumber" @focus="openReportNoPageForm(scope.$rowIndex, scope.row)"></el-input>-->
+					<!--              </template>-->
+					<!--            </vxe-table-column>-->
+					<vxe-table-column field="number" title="费用(元)" :edit-render="{}" :rules="[{required: true, message:'请输入费用', trigger:'blur'}]">
+						<template #default="scope">
+							<el-input maxlength="15" v-model="scope.row.number" @keyup.native="scope.row.number = twoDecimalPlaces(scope.row.number)"></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="receiptNumber" title="收据张数" :edit-render="{}">
+						<template #default="scope">
+							<el-input v-model="scope.row.receiptNumber" oninput ="value=value.replace(/\D|^0/g,'')" maxlength="10"></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="days" title="出差天数" :edit-render="{}">
+						<template #default="scope">
+							<el-input v-model="scope.row.days" oninput ="value=value.replace(/\D|^0/g,'')" maxlength="10"></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="content" title="内容" :edit-render="{}">
+						<template #default="scope">
+							<el-input v-model="scope.row.content" ></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column title="操作" width="100">
+						<template #default="scope">
+							<el-button type="danger" @click="removeEvent(scope.row,scope.$rowIndex,'others')">删除</el-button>
+						</template>
+					</vxe-table-column>
+				</vxe-table>
+			</el-col>
+          </el-row>
+        </div>
+        <div v-if="inputForm.sourceType === '5'">
+          <el-divider content-position="left"><i class="el-icon-document"></i>
+            采购报销详情
+            <el-button style="margin-left: 20px" type="primary" size="small" :disabled="method==='view' || this.formReadOnly" @click="insertEvent('procured')" plain>
+              新增
+            </el-button>
+          </el-divider>
+          <el-row  :gutter="15" >
+            <el-col :span="24">
+				<vxe-table
+					border
+					show-footer
+					show-overflow
+					:footer-method="footerMethod"
+					ref="detailTableProcured"
+					class="vxe-table-element"
+					:data="inputForm.detailInfoProcured"
+					style="margin-left: 5em"
+					keep-source
+					:key="detailKeyProcured"
+					highlight-current-row
+					:edit-config="{trigger: 'click', mode: 'row', showStatus: true, autoClear: true, icon:'_'}"
+				>
+					<vxe-table-column field="userName" title="报销人" :edit-render="{}" :rules="[{required: true, message:'请选择报销人', trigger:'blur'}]">
+						<template #default="scope">
+							<el-input v-model="scope.row.userName" @focus="userPullListForm5(scope.$rowIndex)"></el-input>
+							<!--              <UserSelectV2 :limit='1' :userName="scope.row.userName" @getValue='(value, label) => {scope.row.userName = label}'></UserSelectV2>-->
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="deptName" title="报销部门" :edit-render="{}">
+						<template #default="scope">
+							<el-input :disabled='true' v-model="scope.row.deptName" ></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="typeName" title="报销类别" :edit-render="{}" :rules="[{required: true, message:'请选择报销类别', trigger:'blur'}]">
+						<template #default="scope">
+							<el-input v-model="scope.row.typeName" @focus="typePullForm5(scope.$rowIndex)"></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="projectName" title="报销详情" :edit-render="{}" :rules="[{required: true, message:'请填写报销详情', trigger:'blur'}]">
+						<template #default="scope">
+							<el-input v-model="scope.row.projectName" @focus="openProgramPageForm5(scope.$rowIndex, scope.row)"></el-input>
+						</template>
+					</vxe-table-column>
+					<!--            <vxe-table-column field="reportNumber" title="报告号" :edit-render="{}">-->
+					<!--              <template v-slot:edit="scope">-->
+					<!--                <el-input :readonly="true" v-model="scope.row.reportNumber" @focus="openReportNoPageForm(scope.$rowIndex, scope.row)"></el-input>-->
+					<!--              </template>-->
+					<!--            </vxe-table-column>-->
+					<vxe-table-column field="number" title="费用(元)" :edit-render="{}" :rules="[{required: true, message:'请输入费用', trigger:'blur'}]">
+						<template #default="scope">
+							<el-input maxlength="15" v-model="scope.row.number" @keyup.native="scope.row.number = twoDecimalPlaces(scope.row.number)"></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="receiptNumber" title="收据张数" :edit-render="{}">
+						<template #default="scope">
+							<el-input v-model="scope.row.receiptNumber" oninput ="value=value.replace(/\D|^0/g,'')" maxlength="10"></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="days" title="出差天数" :edit-render="{}">
+						<template #default="scope">
+							<el-input v-model="scope.row.days" oninput ="value=value.replace(/\D|^0/g,'')" maxlength="10"></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column field="content" title="内容" :edit-render="{}">
+						<template #default="scope">
+							<el-input v-model="scope.row.content" ></el-input>
+						</template>
+					</vxe-table-column>
+					<vxe-table-column title="操作" width="100">
+						<template #default="scope">
+							<el-button type="danger" @click="removeEvent(scope.row,scope.$rowIndex,'procured')">删除</el-button>
+						</template>
+					</vxe-table-column>
+				</vxe-table>
+			</el-col>
+          </el-row>
+        </div>
+
+        <el-divider content-position="left"><i class="el-icon-document"></i>
+          专用发票信息
+          <el-button style="margin-left: 20px" type="primary" size="small" :disabled="method==='view'" @click="insertEvent('amount')" plain>
+            新增
+          </el-button>
+        </el-divider>
+        <el-row  :gutter="15" >
+          <el-col :span="24">
+			  <vxe-table
+				  border
+				  show-overflow
+				  ref="amountTable"
+				  class="vxe-table-element"
+				  :data="inputForm.amountInfos"
+				  style="margin-left: 5em"
+				  keep-source
+				  highlight-current-row
+				  :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+			  >
+				  <vxe-table-column field="code" title="发票代码" :edit-render="{}">
+					  <template #default="scope">
+						  <el-input v-model="scope.row.code" ></el-input>
+					  </template>
+				  </vxe-table-column>
+				  <vxe-table-column field="number" title="发票号" :edit-render="{}">
+					  <template #default="scope">
+						  <el-input v-model="scope.row.number" ></el-input>
+					  </template>
+				  </vxe-table-column>
+				  <vxe-table-column field="amount" title="金额" :edit-render="{}">
+					  <template #default="scope">
+						  <el-input v-model="scope.row.amount" ></el-input>
+					  </template>
+				  </vxe-table-column>
+				  <vxe-table-column field="taxAmount" title="税额" :edit-render="{}">
+					  <template #default="scope">
+						  <el-input v-model="scope.row.taxAmount" ></el-input>
+					  </template>
+				  </vxe-table-column>
+				  <vxe-table-column field="count" title="价税合计" :edit-render="{}">
+					  <template #default="scope">
+						  <el-input v-model="scope.row.count" ></el-input>
+					  </template>
+				  </vxe-table-column>
+				  <vxe-table-column title="操作" width="100">
+					  <template #default="scope">
+						  <el-button type="danger" @click="removeEvent(scope.row,scope.$rowIndex,'amount')">删除</el-button>
+					  </template>
+				  </vxe-table-column>
+			  </vxe-table>
+		  </el-col>
+        </el-row>
+
+        <!-- 附件 -->
+        <UpLoadComponent ref="uploadComponent"></UpLoadComponent>
+      </el-form>
+		<template #footer>
+			<span class="dialog-footer">
+			  <el-button @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			  <el-button type="primary" v-if="method != 'view'" @click="doSubmit()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+			</span>
+		</template>
+<!--      <MaterialManagementDialog ref="materialManagementDialog" @getUpload="getUpload"></MaterialManagementDialog>-->
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import ReimbursementApprovalService from '@/api/cw/reimbursementApproval/ReimbursementApprovalService'
+  import UpLoadComponent from '@/views/common/UpLoadComponent'
+  import XEUtils from 'xe-utils'
+  // import MaterialManagementService from '@/api/materialManagement/MaterialManagementService'
+  // import MaterialManagementDialog from '../../../materialManagement/file/MaterialManagementDialog'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          userName: '',
+          no: '',
+          department: '',
+          reimDate: '',
+          remarks: '',
+          detailInfos: [],
+          detailInfoContracts: [],
+          detailInfoReports: [],
+          detailInfoOthers: [],
+          detailInfoProcured: [],
+          amountInfos: [],
+          files: [], // 附件信息
+          sourceType: '',
+          preList: [],
+          purchaseNo: '',
+          tradeTotalPrice: '',
+          purchaseId: '',
+          departmentName: ''
+        }
+      }
+    },
+    reimbursementApprovalService: null,
+    // materialManagementService: null,
+    created () {
+      this.reimbursementApprovalService = new ReimbursementApprovalService()
+      // this.materialManagementService = new MaterialManagementService()
+    },
+    components: {
+      UpLoadComponent,
+      // MaterialManagementDialog
+    },
+    methods: {
+      init (method, id) {
+        this.method = method
+        this.inputForm = {
+          userName: '',
+          no: '',
+          department: '',
+          reimDate: '',
+          remarks: '',
+          detailInfos: [],
+          amountInfos: [],
+          files: [], // 附件信息
+          detailInfoContracts: [],
+          detailInfoReports: [],
+          detailInfoOthers: [],
+          detailInfoProcured: [],
+          sourceType: '',
+          preList: [],
+          purchaseNo: '',
+          tradeTotalPrice: '',
+          purchaseId: '',
+          departmentName: ''
+        }
+        if (method === 'add') {
+          this.title = `新建报销`
+        } else if (method === 'edit') {
+          this.inputForm.id = id
+          this.title = '报销修改'
+        } else if (method === 'view') {
+          this.inputForm.id = id
+          this.title = '报销详情'
+        } else if (method === 'addChild') {
+          this.title = '添加下级结构'
+          this.inputForm.parentId = id
+        }
+        this.visible = true
+        this.loading = false
+        this.$nextTick(() => {
+          if (method === 'edit' || method === 'view') { // 修改或者查看
+            this.loading = true
+            this.$refs.inputForm.resetFields()
+            this.reimbursementApprovalService.findById(this.inputForm.id).then((data) => {
+              this.inputForm = this.recover(this.inputForm, data)
+              this.$refs.uploadComponent.newUpload(method, this.inputForm.files, 'reimbursement')
+              this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+              if (this.commonJS.isNotEmpty(this.inputForm.purchaseId)) {
+                this.startPur(this.inputForm.purchaseId)
+              }
+              this.loading = false
+            })
+          }
+        })
+      },
+      footerMethod ({ columns, data }) {
+        const footerData = [
+          columns.map((column, columnIndex) => {
+            if (columnIndex === 0) {
+              return '总报销费用'
+            }
+            if (['number'].includes(column.property)) {
+              // eslint-disable-next-line no-undef
+              return XEUtils.sum(data, column.property)
+            }
+            return null
+          })
+        ]
+        return footerData
+      },
+      // 表单提交
+      doSubmit () {
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            if (this.$refs.uploadComponent.checkProgress()) {
+              this.loading = false
+              return
+            }
+            if (this.commonJS.isEmpty(this.inputForm.files)) {
+              this.inputForm.files = []
+            }
+            this.inputForm.files = this.$refs.uploadComponent.getDataList()
+            this.reimbursementApprovalTypeService.save(this.inputForm).then((data) => {
+              this.close()
+              this.$message.success(data)
+              this.$emit('refreshDataList')
+              this.loading = false
+            }).catch(() => {
+              this.loading = false
+            })
+          }
+        })
+      },
+      close () {
+        this.$refs.inputForm.resetFields()
+        this.inputForm.detailInfos = []
+        this.inputForm.detailInfoContracts = []
+        this.inputForm.detailInfoReports = []
+        this.inputForm.detailInfoOthers = []
+        this.inputForm.detailInfoProcured = []
+        this.inputForm.purchaseNo = ''
+        this.inputForm.preList = ''
+        this.inputForm.purchaseId = ''
+        this.inputForm.amountInfos = []
+        this.$refs.uploadComponent.clearUpload()
+        this.visible = false
+      },
+      // 删除
+      removeEvent (row, rowIndex, type) {
+        if (type === 'detail') {
+          this.$refs.detailTable.remove(row)
+          this.inputForm.detailInfos.splice(rowIndex, 1)
+        }
+        if (type === 'amount') {
+          this.$refs.amountTable.remove(row)
+          this.inputForm.amountInfos.splice(rowIndex, 1)
+        }
+      },
+      // 新增
+      async insertEvent (type) {
+        if (type === 'detail') {
+          await this.$refs.detailTable.insert().then((data) => {
+            this.inputForm.detailInfos.push(data)
+          })
+        }
+        if (type === 'amount') {
+          await this.$refs.amountTable.insert().then((data) => {
+            this.inputForm.amountInfos.push(data)
+          })
+        }
+      },
+      startPur (id) {
+        // this.materialManagementService.findById(id).then((data) => {
+        //   this.inputForm.preList = data.detailInfos
+        //   this.inputForm.purchaseNo = data.purchaseNo
+        //   let i = this.inputForm.preList.length
+        //   for (let j = 0; j < i; j++) {
+        //     if (this.commonJS.isNotEmpty(this.inputForm.preList[j].tradePrice)) {
+        //       if (this.commonJS.isNotEmpty(this.inputForm.preList[j].tradeNumber)) {
+        //         this.inputForm.preList[j].priceSum = this.inputForm.preList[j].tradePrice * this.inputForm.preList[j].tradeNumber
+        //       }
+        //     }
+        //   }
+        // })
+        this.$forceUpdate()
+      },
+      getPurChoose (row) {
+        this.inputForm.purchaseId = row.id
+        this.startPur(row.id)
+      },
+      footerMethod555 ({ columns, data }) {
+        const footerData = [
+          columns.map((column, columnIndex) => {
+            if (columnIndex === 0) {
+              return '商品总价'
+            }
+            if (['priceSum'].includes(column.property)) {
+              // eslint-disable-next-line no-undef
+              this.inputForm.tradeTotalPrice = XEUtils.sum(data, column.property)
+              return XEUtils.sum(data, column.property)
+            }
+            return null
+          })
+        ]
+        return footerData
+      },
+      seeFileInfo (index) {
+        if (this.commonJS.isEmpty(this.inputForm.preList[index].fileInfoLost)) {
+          this.inputForm.preList[index].fileInfoLost = []
+        }
+        // this.$refs.materialManagementDialog.newUpload('view', this.inputForm.preList[index].fileInfoLost, null, null, null, null, null, false, index)
+      }
+    }
+  }
+</script>

+ 591 - 0
src/views/cw/reimbursementApproval/info/InfoList.vue

@@ -0,0 +1,591 @@
+<template>
+  <div class="page">
+    <el-form :inline="true" class="query-form m-b-10" v-if="searchVisible" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+      <!-- 搜索框-->
+      <el-form-item label="报销项目" prop="project">
+        <el-input v-model="searchForm.project" placeholder="请输入报销项目" clearable>
+          <el-button icon="el-icon-search" slot="append" @click="openProgramPageForm"></el-button>
+        </el-input>
+      </el-form-item>
+      <el-form-item label="报销时间" prop="dates">
+        <el-date-picker
+          style=""
+          placement="bottom-start"
+          value-format="YYYY-MM-DD h:m:s"
+          v-model="searchForm.dates"
+          type="datetimerange"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="经办人" prop="handled">
+        <UserSelect :limit='1' :userName="searchForm.handled" @getValue='(value, label) => {searchForm.handled = label}'></UserSelect>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="报销人" prop="reimBy">
+        <UserSelect :limit='1' :userName="searchForm.reimBy" @getValue='(value, label) => {searchForm.reimBy = label}'></UserSelect>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="报销状态" prop="type">
+        <el-select v-model="searchForm.type" placeholder="请选择" style="width:100%;">
+          <el-option
+            v-for="item in $dictUtils.getDictList('status')"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="报销部门" prop="department">
+        <SelectTree
+          ref="officeTree"
+          :props="{
+                value: 'id',             // ID字段名
+                label: 'name',         // 显示名称
+                children: 'children'    // 子级字段名
+              }"
+          :url="`/system-server/sys/office/treeData?type=2`"
+          :value="searchForm.department"
+          :clearable="true"
+          :accordion="true"
+		  size="default"
+          @getValue="(value,label) => {searchForm.department=label}"/>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="报销类型" prop="sourceType">
+        <el-select v-model="searchForm.sourceType" placeholder="请选择报销类型">
+          <el-option
+            v-for="item in $dictUtils.getDictList('cw_reimbursement_source_type')"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="报销类别" prop="remiType">
+        <SelectTree
+          ref="areaTree"
+          :props="{
+                  value: 'id',             // ID字段名
+                  label: 'name',         // 显示名称
+                  children: 'children'    // 子级字段名
+                }"
+          url="/finance-server/reimbursementApproval/type/treeData1?type=last"
+          :value="searchForm.remiType"
+          :clearable="true"
+          :accordion="true"
+		  size="default"
+          @getValue="(value, label) => {searchForm.remiType=label}"/>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="报销金额" prop="amounts">
+        <InputNumber :disabled="false" :precision="num" v-model="searchForm.amounts"></InputNumber>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="报告号" prop="reportNumber">
+        <el-input v-model="searchForm.reportNumber" placeholder="请输入报告号" clearable></el-input>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="default" @click="showHide" :icon="showHideIcon">{{showHideName}}</el-button>
+        <el-button type="primary" @click="refreshList()" icon="el-icon-search">查询</el-button>
+        <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <div class="jp-table top" style="">
+      <vxe-toolbar :refresh="{query: refreshList}" ref="toolbarRef" export custom>
+        <template #buttons>
+          <el-button v-if="hasPermission('cw:reimbursement:info:add')" type="primary" icon="el-icon-plus" @click="add()">新建</el-button>
+          <el-button v-if="hasPermission('cw:reimbursement:info:del')" type="danger"  icon="el-icon-delete" @click="del()" :disabled="$refs.infoTable && $refs.infoTable.getCheckboxRecords().length === 0" plain>删除</el-button>
+        </template>
+		  <template #tools>
+			  <vxe-button
+				  text
+				  type="primary"
+				  :title="searchVisible ? '收起检索' : '展开检索'"
+				  icon="vxe-icon-search"
+				  class="tool-btn"
+				  @click="searchVisible = !searchVisible"
+			  ></vxe-button>
+		  </template>
+      </vxe-toolbar>
+      <div style="height: calc(100% - 80px)">
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="auto"
+          :loading="loading"
+          ref="infoTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          :sort-config="{remote:true}"
+          :export-config="{
+                    remote: true,
+                    filename: `会计报销数据${moment(new Date()).format('YYYY-MM-DD')}`,
+                    sheetName: `会计报销数据${moment(new Date()).format('YYYY-MM-DD')}`,
+                    exportMethod: exportMethod,
+                    types: ['xlsx'],
+                    modes: ['current', 'selected', 'all']
+                  }"
+          :data="dataList"
+          :checkbox-config="{}">
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="checkbox" width="60" ></vxe-column>
+          <vxe-column width="130" title="报销编号" field="no" align="center">
+            <template #default="scope">
+              <el-link  type="primary" :underline="false" v-if="hasPermission('cw:reimbursement:info:view')" @click="view(scope.row.id)">{{scope.row.no}}</el-link>
+              <el-link  type="primary" :underline="false" v-else-if="hasPermission('cw:reimbursement:info:view')" @click="view(scope.row.id)">{{scope.row.no}}</el-link>
+              <span v-else>{{scope.row.no}}</span>
+            </template>
+          </vxe-column>
+          <vxe-column width="130" title="报销类型" field="sourceType" align="center">
+            <template #default="scope">
+              {{$dictUtils.getDictLabel('cw_reimbursement_source_type', scope.row.sourceType, '')}}
+            </template>
+          </vxe-column>
+          <vxe-column width="130" title="报销类别" field="typeName" align="center"></vxe-column>
+          <vxe-column width="180" title="报销项目" field="projectName" align="center">
+            <template #default="scope">
+              <el-link  type="primary" :underline="false" v-if="hasPermission('cw:reimbursement:info:view') && scope.row.projectId != undefined" @click="viewProject(scope.row.projectId)">{{scope.row.sourceType === '2' ? '' : scope.row.projectName}}</el-link>
+              <el-link  type="primary" :underline="false" v-else-if="hasPermission('cw:reimbursement:info:view') && scope.row.projectId != undefined" @click="viewProject(scope.row.projectId)">{{scope.row.sourceType === '2' ? '' : scope.row.projectName}}</el-link>
+              <span v-else>{{scope.row.sourceType === '2' ? '' : scope.row.projectName}}</span>
+            </template>
+          </vxe-column>
+          <vxe-column width="180" title="报销合同" field="projectName" align="center">
+            <template #default="scope">
+              <el-link  type="primary" :underline="false" v-if="hasPermission('cw:reimbursement:info:view') && scope.row.projectId != undefined" @click="viewContract(scope.row.projectId)">{{scope.row.sourceType === '2' ? scope.row.projectName : ''}}</el-link>
+              <span v-else>{{scope.row.sourceType === '2' ? scope.row.projectName : ''}}</span>
+            </template>
+          </vxe-column>
+          <vxe-column width="180" title="报告号" field="reportNumber" align="center"></vxe-column>
+          <vxe-column width="100" title="经办人" field="userName" align="center"></vxe-column>
+          <vxe-column width="100" title="报销人" field="name" align="center"></vxe-column>
+          <vxe-column width="100" title="报销部门" field="deptName" align="center"></vxe-column>
+          <vxe-column width="100" title="报销日期" field="reimDate" align="center"></vxe-column>
+          <vxe-column width="100" title="报销金额(元)" field="number" fixed="right" align="center"></vxe-column>
+          <vxe-column width="100" title="状态" fixed="right" align="center" field="type">
+            <template #default="scope">
+              <el-button text @click="detail(scope.row)" :type="$dictUtils.getDictLabel('status_info', scope.row.type, '')" effect="dark" >{{$dictUtils.getDictLabel("status", scope.row.type, '未开始')}} </el-button>
+            </template>
+          </vxe-column>
+
+          <vxe-column title="操作" width="130px" fixed="right" align="center">
+            <template  #default="scope">
+              <div v-if="isAdmin">
+                <el-button v-if=" (scope.row.type === '5' )" text type="primary" @click="editForm(scope.row)">修改</el-button>
+                <el-button v-if=" (scope.row.type === '5')" text type="primary"  @click="del(scope.row.id)">删除</el-button>
+              </div>
+              <div v-else>
+              <el-button v-if="hasPermission('cw:reimbursement:info:edit') && scope.row.createId === $store.state.user.id && (scope.row.type === '1' || scope.row.type === '3' )" text type="primary"   @click="edit(scope.row)">修改</el-button>
+              <el-button v-if="hasPermission('cw:reimbursement:info:edit') && scope.row.createId === $store.state.user.id && (scope.row.type === '2')" text type="primary"  @click="reback(scope.row)">撤回</el-button>
+              <el-button v-if="hasPermission('cw:reimbursement:info:del') && scope.row.createId === $store.state.user.id && (scope.row.type === '1')" text type="primary"  @click="del(scope.row.id)">删除</el-button>
+<!--              审核-->
+              <el-button v-if="scope.row.type==='2' && checkIsAudit(scope.row)" text type="primary"  @click="examine(scope.row)">审核</el-button>
+<!--              被驳回后当前申请人重新调整-->
+              <el-button v-if="scope.row.createId === $store.state.user.id&&scope.row.type === '4'" text type="primary"  @click="adjust(scope.row)">驳回调整</el-button>
+              </div>
+            </template>
+          </vxe-column>
+        </vxe-table>
+        <vxe-pager
+          background
+          :current-page="tablePage.currentPage"
+          :page-size="tablePage.pageSize"
+          :total="tablePage.total"
+          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+          @page-change="currentChangeHandle">
+        </vxe-pager>
+
+        <ProjectChooseForm ref="projectChooseForm" @getProgram="getProgram"></ProjectChooseForm>
+        <InfoForm ref="infoForm" @refreshDataList="refreshList"></InfoForm>
+        <ProjectRecordsForm ref="projectRecordsForm" @refreshDataList="refreshList"></ProjectRecordsForm>
+        <ContractNameForm ref="contractNameForm"></ContractNameForm>
+        <InfoUpdateForm ref="infoUpdateForm" @refreshDataList="refreshList"></InfoUpdateForm>
+        <ProjectListForm ref="projectListForm"></ProjectListForm>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+  import ReimbursementApprovalService from '@/api/cw/reimbursementApproval/ReimbursementApprovalService'
+  import InputNumber from '@/views/workContract/InputNumber.vue'
+  import UserSelect from '@/components/userSelect'
+  import SelectTree from '@/components/treeSelect/treeSelect.vue'
+  import ProjectChooseForm from '../projectInfo/ProjectChooseForm'
+  import InfoForm from './InfoForm'
+  import taskService from '@/api/flowable/TaskService'
+  import processService from '@/api/flowable/ProcessService'
+  import pick from 'lodash.pick'
+  import ProjectRecordsForm from '../../projectRecords/ProjectRecordsForm'
+  import ContractNameForm from '../../workContract/ContractNameForm'
+  import userService from '@/api/sys/UserService'
+  import InfoUpdateForm from './InfoUpdateForm'
+  import ProjectListForm from './ProgramForm'
+  export default {
+    data () {
+      return {
+		searchVisible: true,
+        showHideItem: false,
+        showHideIcon: 'el-icon-arrow-down',
+        showHideName: '展示',
+        num: 0,
+        visable: false,
+        gridData: [],
+        searchForm: {
+          project: '',
+          dates: [],
+          handled: '',
+          reimBy: '',
+          type: [],
+          department: '',
+          remiType: '',
+          amounts: [],
+          reportNumber: '',
+          sourceType: ''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        loading: false,
+        isAdmin: false
+      }
+    },
+    reimbursementApprovalService: null,
+    created () {
+      this.reimbursementApprovalService = new ReimbursementApprovalService()
+    },
+    components: {
+      InputNumber,
+      SelectTree,
+      ProjectChooseForm,
+      InfoForm,
+      ProjectRecordsForm,
+      UserSelect,
+      ContractNameForm,
+      InfoUpdateForm,
+      ProjectListForm
+    },
+    mounted () {
+		this.$nextTick(() => {
+			//将表格和工具栏进行关联
+			const $table = this.$refs.infoTable;
+			const $toolbar = this.$refs.toolbarRef;
+			$table.connect($toolbar);
+		})
+      this.refreshList()
+    },
+    activated () {
+      this.refreshList()
+    },
+    computed: {
+      userName () {
+        return this.$store.state.user.name
+      },
+      user () {
+        this.create = this.$store.state.user.id
+        console.log('createId', this.create)
+        return this.$store.state.user
+      }
+    },
+    methods: {
+      showHide () {
+        if (this.showHideItem === false) {
+          this.showHideItem = true
+          this.showHideIcon = 'el-icon-arrow-up'
+          this.showHideName = '隐藏'
+        } else {
+          this.showHideItem = false
+          this.showHideIcon = 'el-icon-arrow-down'
+          this.showHideName = '展示'
+        }
+      },
+      // 查询当前用户是否是管理员用户
+      checkIsAdmin () {
+        userService.is().then((data) => {
+          this.isAdmin = data
+        })
+      },
+      viewContract (id) {
+        this.$refs.contractNameForm.init('view', id)
+      },
+      // 新增
+      add () {
+        // 读取流程表单
+        let tabTitle = `发起流程【会计-报销审批】`
+        let processTitle = `${this.userName} 在 ${this.moment(new Date()).format('YYYY-MM-DD HH:mm')} 发起了 [会计-报销审批]`
+        taskService.getTaskDef({ procDefId: this.processDefinitionId,
+          status: 'startAndHold'}).then((data) => {
+            this.$router.push({
+              path: '/flowable/task/TaskForm',
+              query: {
+                ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                procDefId: this.processDefinitionId,
+                procDefKey: this.procDefKey,
+                status: 'startAndHold',
+                title: tabTitle,
+                formType: data.formType,
+                formUrl: data.formUrl,
+                formTitle: processTitle,
+                businessId: 'false',
+                isShow: false,
+                routePath: '/cw/reimbursementApproval/info/InfoList'
+              }
+            })
+          })
+      },
+      // 修改
+      edit (row) {
+        // 暂存修改
+        let status = ''
+        if (row.type === '1') {
+          status = 'startAndHold'
+        }
+        // 撤回或者驳回修改
+        if (row.type === '3') {
+          status = 'startAndClose'
+        } else if (row.status === '4') {
+          status = 'reapplyFlag'
+        }
+        // 读取流程表单
+        let tabTitle = `发起流程【会计-报销审批】`
+        let processTitle = `${this.userName} 在 ${this.moment(new Date()).format('YYYY-MM-DD HH:mm')} 发起了 [会计-报销审批]`
+        taskService.getTaskDef({ procDefId: this.processDefinitionId,
+          businessId: row.id,
+          businessTable: 'cw_reimbursement_info',
+          status: status
+        }).then((data) => {
+          this.$router.push({
+            path: '/flowable/task/TaskForm',
+            query: {
+              ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+              procDefId: this.processDefinitionId,
+              procDefKey: this.procDefKey,
+              status: status,
+              title: tabTitle,
+              formType: data.formType,
+              formUrl: data.formUrl,
+              formTitle: processTitle,
+              businessTable: 'cw_reimbursement_info',
+              businessId: row.id,
+              isShow: false,
+              routePath: '/cw/reimbursementApproval/info/InfoList'
+            }
+          })
+        })
+      },
+      // 撤回
+      reback (row) {
+        this.$confirm(`确定撤回流程吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          processService.revokeProcIns(row.procInsId).then((data) => {
+            let param = {type: '3', id: row.id}
+            this.reimbursementApprovalService.updateStatusById(param)
+            this.$message.success('回退成功')
+            this.refreshList()
+          })
+        })
+      },
+      // 查看
+      view (id) {
+        this.$refs.infoForm.init('view', id)
+      },
+      editForm (row) {
+        this.$refs.infoUpdateForm.init('edit', row.id)
+      },
+      // 查看报销项目
+      viewProject (id) {
+        this.$refs.projectListForm.init(id)
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        this.reimbursementApprovalService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+        })
+        this.checkIsAdmin()
+        processService.getByName('会计-报销审批').then((data) => {
+          if (!this.commonJS.isEmpty(data.id)) {
+            this.processDefinitionId = data.id
+            this.procDefKey = data.key
+          }
+        })
+      },
+      // 删除
+      del (id) {
+        let ids = id || this.$refs.infoTable.getCheckboxRecords().map(item => {
+          return item.id
+        }).join(',')
+        this.$confirm(`确定删除所选项吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.loading = true
+          this.reimbursementApprovalService.remove(ids).then((data) => {
+            this.$message.success(data)
+            this.refreshList()
+            this.loading = false
+          })
+        })
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      },
+      // 流程详情
+      detail (row) {
+        if (!this.commonJS.isEmpty(row.type) && row.type !== '1') {
+          taskService.getTaskDef({
+            procInsId: row.procInsId,
+            procDefId: row.processDefinitionId
+          }).then((data) => {
+            this.$router.push({
+              path: '/flowable/task/TaskFormDetail',
+              query: {
+                ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                isShow: 'false',
+                readOnly: true,
+                title: '流程详情',
+                formTitle: '流程详情',
+                businessId: row.id,
+                status: 'reback'
+              }
+            })
+          })
+        }
+      },
+      openProgramPageForm (rowIndex) {
+        // 打开单选组件
+        this.$refs.projectChooseForm.init(null, false)
+      },
+      getProgram (rows) {
+        // rows[0].name // 项目名称、开票详情
+        // rows[0].contractName // 合同名称
+        // rows[0].no // 项目编号
+        // rows[0].clientName // 客户名称
+        // rows[0].client // 客户id
+        // rows[0].id // 项目id
+        // rows[0].location // 项目所在地
+        this.searchForm.project = rows.projectName
+      },
+      // 下载文档
+      exportFile () {
+        this.loading = true
+        this.reimbursementApprovalService.exportFile({
+          'itemType': '1',
+          ...this.searchForm
+        }).then((res) => {
+          // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(res, '会计-报销审批列表信息')
+          this.loading = false
+        }).catch(function (err) {
+          this.loading = false
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      },
+      // 当前页
+      currentChangeHandle ({ currentPage, pageSize }) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.refreshList()
+      },
+      // 自定义服务端导出
+      exportMethod ({ options }) {
+        // 传给服务端的参数
+        const params = {
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm,
+          filename: options.filename,
+          sheetName: options.sheetName,
+          isHeader: options.isHeader,
+          original: options.original,
+          mode: options.mode,
+          selectIds: options.mode === 'selected' ? options.map(item => item.id) : [],
+          exportFields: options.columns.map(column => column.property)
+        }
+        return this.reimbursementApprovalService.exportFile(params).then((res) => {
+          // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(res, options.filename)
+        }).catch(function (err) {
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      },
+      // 驳回后调整
+      adjust (row) {
+        this.reimbursementApprovalService.findById(row.id).then((data) => {
+          if (data.type !== '4') { // status的值不等于“驳回”,就弹出提示
+            this.$message.error('数据已发生改变或不存在,请刷新数据')
+            this.refreshList()
+          } else {
+            this.todo(row)
+          }
+        })
+      },
+      // 审核
+      examine (row) {
+        this.reimbursementApprovalService.findById(row.id).then((data) => {
+          if (data.type !== '2') { // status的值不等于“审核中”,就弹出提示
+            this.$message.error('数据已发生改变或不存在,请刷新数据')
+            this.refreshList()
+          } else {
+            this.todo(row)
+          }
+        })
+      },
+      // 审核或重新调整跳转
+      todo (row) {
+        let cUser = false
+        taskService.getTaskDefInfo({
+          taskId: row.taskId
+        }).then((data) => {
+          this.$router.push({
+            path: '/flowable/task/TaskForm',
+            query: {
+              ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title', 'businessId'),
+              isShow: false,
+              formReadOnly: true,
+              formTitle: `${data.taskName}`,
+              cUser: cUser,
+              title: `审批【${data.taskName || ''}】`,
+              routePath: '/cw/reimbursementApproval/info/InfoList'   // 数据处理后需要跳转的页面路径
+            }
+          })
+        })
+      },
+      // 查询当前登录人是否是数据的审核人
+      checkIsAudit (row) {
+        let loginUserId = this.$store.state.user.id  // 获取当前登录用户id
+        if (this.commonJS.isNotEmpty(row.auditUserIds)) {
+          for (const userId of row.auditUserIds) {
+            if (userId === loginUserId) {  // 当数据的审核人中包含当前登录人id时,返回true
+              return true
+            }
+          }
+        }
+        return false
+      }
+    }
+  }
+</script>

Plik diff jest za duży
+ 1647 - 0
src/views/cw/reimbursementApproval/info/InfoUpdateForm.vue


+ 84 - 0
src/views/cw/reimbursementApproval/info/ProgramForm.vue

@@ -0,0 +1,84 @@
+<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+	  draggable
+      width="900px"
+      @close="close"
+      append-to-body
+      v-model="visible">
+      <vxe-table
+        border="inner"
+        show-overflow
+        show-footer
+        ref="baseTable"
+        class="vxe-table-element"
+        :data="dataList"
+      >
+        <vxe-table-column type="seq" width="50" title="序号" align="center"></vxe-table-column>
+        <vxe-table-column min-width="300px" field="projectName" align="left" title="项目名称">
+          <template #default="scope">
+            <el-link type="primary" :underline="false" @click="openProjectForm(scope.row.id)" >{{scope.row.projectName}}</el-link>
+          </template>
+        </vxe-table-column>
+        <vxe-table-column width="250px" field="projectNumber" align="center" title="项目编号"></vxe-table-column>
+      </vxe-table>
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			</span>
+		</template>
+    </el-dialog>
+    <ProjectForm ref="projectForm"></ProjectForm>
+  </div>
+</template>
+
+<script>
+  import ProjectForm from '@/views/cw/projectRecords/ProjectRecordsForm'
+  import ReimbursementApprovalService from '@/api/cw/reimbursementApproval/ReimbursementApprovalService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        dataList: ''
+      }
+    },
+    reimbursementApprovalService: null,
+    created () {
+      this.reimbursementApprovalService = new ReimbursementApprovalService()
+    },
+    components: {
+      ProjectForm
+    },
+    methods: {
+      init (id) {
+        this.method = 'view'
+        this.title = '查看项目信息'
+        this.visible = true
+        this.dataList = []
+        if (this.commonJS.isNotEmpty(id)) {
+          this.list(id)
+        }
+      },
+      async list (ids) {
+        this.loading = true
+        let resp = await this.reimbursementApprovalService.queryByProIds(ids)
+        if (resp) {
+          this.dataList = resp
+        }
+        this.loading = false
+      },
+      openProjectForm (id) {
+        this.$refs.projectForm.init('view', id)
+      },
+      close () {
+        this.dataList = []
+        this.visible = false
+      }
+    }
+  }
+</script>

Plik diff jest za duży
+ 1708 - 0
src/views/cw/reimbursementApproval/info/ReimbursementForm.vue


+ 192 - 0
src/views/cw/reimbursementApproval/info/ReportNoChooseRadio.vue

@@ -0,0 +1,192 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+	  draggable
+      width="1400px"
+      append-to-body
+      height="500px"
+      @close="close"
+      @keyup.enter.native="getWorkClient"
+      v-model="visibleChoose">
+      <div style="height: calc(100%);">
+<!--        <el-form :inline="true" class="query-form" ref="searchForm" :model="searchForm" @submit.native.prevent>-->
+<!--          &lt;!&ndash; 搜索框&ndash;&gt;-->
+<!--          <el-form-item label="客户名称" prop="name">-->
+<!--            <el-input  v-model="searchForm.name" placeholder="客户名称" clearable></el-input>-->
+<!--          </el-form-item>-->
+<!--          <el-form-item label="客户编号" prop="no">-->
+<!--            <el-input v-model="searchForm.no" placeholder="客户编号" clearable></el-input>-->
+<!--          </el-form-item>-->
+<!--          <el-form-item label="客户类型" prop="type">-->
+<!--            <el-select v-model="searchForm.type" placeholder="请选择" style="width:100%;"clearable>-->
+<!--              <el-option-->
+<!--                v-for="item in $dictUtils.getDictList('cw_work_client_type')"-->
+<!--                :key="item.value"-->
+<!--                :label="item.label"-->
+<!--                :value="item.value">-->
+<!--              </el-option>-->
+<!--            </el-select>-->
+<!--          </el-form-item>-->
+<!--          <el-form-item label="所属行业" prop="industry">-->
+<!--            <el-select v-model="searchForm.industry" placeholder="请选择" style="width:100%;"clearable>-->
+<!--              <el-option-->
+<!--                v-for="item in $dictUtils.getDictList('cw_work_client_industry')"-->
+<!--                :key="item.value"-->
+<!--                :label="item.label"-->
+<!--                :value="item.value">-->
+<!--              </el-option>-->
+<!--            </el-select>-->
+<!--          </el-form-item>-->
+
+
+<!--          <el-form-item>-->
+<!--            <el-button type="primary" @click="list()" icon="el-icon-search">查询</el-button>-->
+<!--            <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>-->
+<!--          </el-form-item>-->
+<!--        </el-form>-->
+
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="400px"
+          :loading="loading"
+          ref="clientTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          :print-config="{}"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :row-config="{isCurrent: true}"
+          :radio-config="{trigger: 'row'}">
+          <vxe-column type="seq" width="40"></vxe-column>
+          <vxe-column type="radio" width="40px"></vxe-column>
+          <vxe-column width="" title="报告号" align="center" field="reportNo" ></vxe-column>
+        </vxe-table>
+        <vxe-pager
+          background
+          :current-page="tablePage.currentPage"
+          :page-size="tablePage.pageSize"
+          :total="tablePage.total"
+          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+          @page-change="currentChangeHandle">
+        </vxe-pager>
+      </div>
+		<template #footer>
+			<span class="dialog-footer">
+			  <el-button @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			  <el-button type="primary" v-if="method != 'view'" @click="getWorkClient()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+			</span>
+		</template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  // import WorkClientService from '@/api/cw/workClientInfo/WorkClientService'
+  import ReimbursementApprovalService from '@/api/cw/reimbursementApproval/ReimbursementApprovalService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visibleChoose: false,
+        loading: false,
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        dataList: [],
+        searchForm: {
+          projectName: '',
+          name: '',
+          no: '',
+          type: '',
+          industry: ''
+        },
+        projectId: ''
+      }
+    },
+    // workClientService: null,
+    reimbursementApprovalService: null,
+    created () {
+      // this.workClientService = new WorkClientService()
+      this.reimbursementApprovalService = new ReimbursementApprovalService()
+    },
+    components: {
+    },
+    methods: {
+      init (deputy) {
+        this.title = '报告号选择'
+        this.visibleChoose = true
+        this.projectId = deputy
+        this.list()
+      },
+      // 表单提交
+      getWorkClient () {
+        let row = this.$refs.clientTable.getRadioRecord()
+        if (this.commonJS.isEmpty(row)) {
+          this.$message.error('请至少选择一条数据')
+        } else {
+          this.close()
+          this.$emit('getWorkClientRadioChoose', row)
+        }
+      },
+      list () {
+        this.dataList = []
+        this.loading = true
+        this.searchForm.status = '5'
+        this.searchForm.projectId = this.projectId
+        this.reimbursementApprovalService.reportNoList({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+        })
+        // this.workClientService.reportNoList({
+        //   'current': 1,
+        //   'size': -1,
+        //   'orders': this.tablePage.orders,
+        //   ...this.searchForm
+        // }).then((data) => {
+        //   this.dataList = data.records
+        //   this.tablePage.total = data.total
+        //   this.loading = false
+        // })
+      },
+      // 当前页
+      currentChangeHandle ({currentPage, pageSize}) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.list()
+      },
+      resetSearch () {
+        // this.$refs.searchForm.resetFields()
+        this.list()
+      },
+      close () {
+        // this.$refs.searchForm.resetFields()
+        this.visibleChoose = false
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-dialog__body {
+    padding-top: 0;
+  }
+  /deep/ .el-form-item--mini.el-form-item, .el-form-item--small.el-form-item {
+    margin-bottom: 0px;
+  }
+</style>

+ 224 - 0
src/views/cw/reimbursementApproval/projectInfo/ProjectChooseForm.vue

@@ -0,0 +1,224 @@
+<template>
+  <div>
+    <el-dialog
+      title="选择项目"
+      :close-on-click-modal="false"
+	  draggable
+      width="1100px"
+      height="500px"
+      @close="close"
+      append-to-body
+      v-model="visible">
+      <div style="height: calc(100% - 80px);">
+        <el-form :inline="true" class="query-form" ref="searchForm" :model="searchForm" @submit.native.prevent>
+          <!-- 搜索框-->
+          <el-form-item label="项目名称" prop="projectName">
+            <el-input v-model="searchForm.projectName" placeholder="请输入项目名称" clearable></el-input>
+          </el-form-item>
+          <el-form-item label="项目编号" prop="projectNumber">
+            <el-input v-model="searchForm.projectNumber" placeholder="请输入项目编号" clearable></el-input>
+          </el-form-item>
+          <el-form-item label="项目经理" prop="projectMasterName">
+            <el-input v-model="searchForm.projectMasterName" placeholder="请输入项目经理" clearable></el-input>
+          </el-form-item>
+          <el-form-item label="创建时间" prop="createDates">
+            <el-date-picker
+              placement="bottom-start"
+              value-format="YYYY-MM-DD h:m:s"
+              v-model="searchForm.createDates"
+              type="datetimerange"
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期">
+            </el-date-picker>
+          </el-form-item>
+
+          <el-form-item>
+            <el-button type="primary" @click="list()" icon="el-icon-search">查询</el-button>
+            <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>
+          </el-form-item>
+        </el-form>
+
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="400px"
+          :loading="loading"
+          ref="projectTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          :print-config="{}"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :row-config="{isCurrent: true}"
+          :radio-config="{trigger: 'row'}"
+        >
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="radio" width="40px"></vxe-column>
+          <vxe-column min-width="230" align="center" title="项目名称" field="projectName"></vxe-column>
+          <vxe-column min-width="160" align="center" title="项目编号" field="projectNumber"></vxe-column>
+          <vxe-column min-width="160" align="center" title="项目经理" field="projectMasterName"></vxe-column>
+          <vxe-column min-width="160" align="center" title="创建人" field="createBy.name"></vxe-column>
+          <vxe-column min-width="160" align="center" title="创建时间" field="createDate"></vxe-column>
+
+        </vxe-table>
+        <vxe-pager
+          background
+          :current-page="tablePage.currentPage"
+          :page-size="tablePage.pageSize"
+          :total="tablePage.total"
+          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+          @page-change="currentChangeHandle">
+        </vxe-pager>
+      </div>
+      <span slot="footer" class="dialog-footer">
+      <el-button @click="close()" icon="el-icon-circle-close">关闭</el-button>
+      <el-button type="primary" v-if="method != 'view'" @click="getProgram()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+    </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import ProgramProjectListInfoService from '@/api/program/ProgramProjectListInfoService'
+  import projectRecordsService from '@/api/cw/projectRecords/ProjectRecordsService'
+  export default {
+    data () {
+      return {
+        title: '项目选择',
+        method: '',
+        visible: false,
+        loading: false,
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        dataList: [],
+        searchForm: {
+          projectMasterName: '',
+          projectNumber: '',
+          projectName: '',
+          createDates: [],
+          status: ''
+        },
+        checkType: '',
+        detail: '',
+        isShow: true,
+        num: true // num为true是多选,false是单选
+      }
+    },
+    programProjectListInfoService: null,
+    created () {
+      this.programProjectListInfoService = new ProgramProjectListInfoService()
+    },
+    components: {
+    },
+    methods: {
+      init (isShow, num) {
+        if (this.commonJS.isEmpty(isShow)) {
+          this.isShow = true
+          this.checkType = '1'
+        } else {
+          if (isShow === false || isShow === 'false') {
+            this.isShow = false
+            this.checkType = '1'
+            this.$message({message: '第一条为项目后面新增只能选择项目', type: 'warning', customClass: 'messageZindex'})
+          } else if (isShow === '1') {
+            this.isShow = false
+            this.checkType = '1'
+          } else {
+            this.isShow = false
+            this.checkType = '2'
+          }
+        }
+        if (this.commonJS.isEmpty(num) || num === true) {
+          this.num = true // num为true是多选,false是单选
+        } else {
+          this.num = false
+        }
+        this.visible = true
+        this.list()
+      },
+      // 表单提交
+      getProgram () {
+        let row = this.$refs.projectTable.getRadioRecord()
+        if (this.commonJS.isEmpty(row)) {
+          this.$message.error('请选择一条数据')
+          return
+        }
+        this.close()
+        this.$emit('getProgram', row)
+        // let rows
+        // if (this.checkType === '1') {
+        //   if (this.commonJS.isEmpty(this.$refs.programTable.getCheckboxRecords())) {
+        //     this.$message.error('请至少选择一条数据')
+        //     return
+        //   }
+        //   if (this.num === false) {
+        //     if (this.$refs.programTable.getCheckboxRecords().length > 1) {
+        //       this.$message.error('最多选择一条数据')
+        //       return
+        //     }
+        //   }
+        //   rows = this.$refs.programTable.getCheckboxRecords()
+        // } else {
+        //   if (this.commonJS.isEmpty(this.detail)) {
+        //     this.$message.error('请填写开票详情')
+        //     return
+        //   }
+        //   rows = [{name: this.detail}]
+        // }
+        // this.close()
+        // this.$emit('getProgram', rows)
+      },
+      list () {
+        this.loading = true
+        projectRecordsService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+        })
+        // this.programProjectListInfoService.list({
+        //   'current': this.tablePage.currentPage,
+        //   'size': this.tablePage.pageSize,
+        //   'orders': this.tablePage.orders,
+        //   ...this.searchForm
+        // }).then((data) => {
+        //   this.dataList = data.records
+        //   this.tablePage.total = data.total
+        //   this.loading = false
+        // })
+      },
+      // 当前页
+      currentChangeHandle ({currentPage, pageSize}) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.list()
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.list()
+      },
+      close () {
+        this.detail = ''
+        this.visible = false
+      }
+    }
+  }
+</script>
+<style>
+  .messageZindex {
+    z-index:9999 !important;
+  }
+</style>

+ 181 - 0
src/views/cw/reimbursementApproval/type/TypeForm.vue

@@ -0,0 +1,181 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      width="500px"
+      @close="close"
+      append-to-body
+      @keyup.enter.native="doSubmit"
+      :visible.sync="visible">
+      <el-form size="middle" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="method==='view'"
+               label-width="100px" @submit.native.prevent>
+        <el-row  :gutter="15">
+          <el-col :span="21">
+            <el-form-item label="上级节点" prop="parentId">
+              <SelectTree
+                ref="areaTree"
+                :props="{
+                      value: 'id',             // ID字段名
+                      label: 'name',         // 显示名称
+                      children: 'children'    // 子级字段名
+                    }"
+                url="/reimbursementApproval/type/treeData?type=3"
+                :value="inputForm.parentId"
+                :clearable="true"
+                :accordion="true"
+                @getValue="(value) => {inputForm.parentId=value}"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="21">
+            <el-form-item label="报销内容名称" prop="name"
+                          :rules="[
+                          {required: true, message:'报销内容名称不能为空', trigger:'blur'}
+                 ]">
+              <el-input v-model="inputForm.name" placeholder="请填写报销内容名称"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="21">
+            <el-form-item label="关联部门" prop="officeIdList">
+              <el-select v-model="inputForm.officeIdList" style="width:100%" multiple placeholder="请选择">
+                <el-option
+                  v-for="item in officeList"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="21">
+            <el-form-item label="序号" prop="no">
+              <el-input v-model="inputForm.no" :disabled="true" show-word-limit></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+      <el-button size="small" @click="close()" icon="el-icon-circle-close">关闭</el-button>
+      <el-button size="small" type="primary" v-if="method != 'view'" @click="doSubmit()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+    </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  // import ReimbursementTypeService from '@/api/sys/ReimbursementTypeService'
+  import ReimbursementApprovalTypeService from '@/api/cw/reimbursementApproval/ReimbursementApprovalTypeService'
+  import SelectTree from '@/components/treeSelect/treeSelect.vue'
+  import OfficeService from '@/api/sys/OfficeService'
+  export default {
+    data () {
+      return {
+        disabled: false,
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        officeList: [],
+        inputForm: {
+          businessType: '',
+          name: '',
+          no: '',
+          parentId: '',
+          officeIdList: []
+        }
+      }
+    },
+    // reimbursementTypeService: null,
+    reimbursementApprovalTypeService: null,
+    OfficeService: null,
+    created () {
+      // this.reimbursementTypeService = new ReimbursementTypeService()
+      this.reimbursementApprovalTypeService = new ReimbursementApprovalTypeService()
+      this.officeService = new OfficeService()
+    },
+    components: {
+      SelectTree
+    },
+    methods: {
+      init (method, id, businessType) {
+        this.method = method
+        this.inputForm = {
+          businessType: '',
+          name: '',
+          no: '',
+          parentId: ''
+        }
+        if (method === 'add') {
+          this.title = `新建报销类型`
+        } else if (method === 'edit') {
+          this.inputForm.id = id
+          this.title = '修改报销类型'
+        } else if (method === 'view') {
+          this.inputForm.id = id
+          this.title = '查看报销类型'
+        } else if (method === 'addChild') {
+          this.title = '添加下级结构'
+          this.inputForm.parentId = id
+          this.inputForm.businessType = businessType
+        }
+        this.visible = true
+        this.loading = false
+        this.$nextTick(() => {
+          if (method === 'edit' || method === 'view') { // 修改或者查看
+            this.loading = true
+            this.$refs.inputForm.resetFields()
+            this.reimbursementApprovalTypeService.findById(this.inputForm.id).then(({data}) => {
+              this.inputForm = this.recover(this.inputForm, data)
+              this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+              this.loading = false
+            })
+            // this.reimbursementTypeService.findById(this.inputForm.id).then(({data}) => {
+            //   this.inputForm = this.recover(this.inputForm, data)
+            //   this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+            //   this.loading = false
+            // })
+          }
+          this.officeService.getSecondLevelData().then(({data}) => {
+            this.officeList = data
+          })
+        })
+      },
+      // 表单提交
+      doSubmit () {
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            this.reimbursementApprovalTypeService.save(this.inputForm).then(({data}) => {
+              if (data === false) {
+                this.close()
+                this.$message.error('报销内容名重复,请重新填写')
+                this.$emit('refreshDataList')
+                this.loading = false
+              } else {
+                this.close()
+                this.$message.success(data)
+                this.$emit('refreshDataList')
+                this.loading = false
+              }
+            }).catch(() => {
+              this.loading = false
+            })
+            // this.reimbursementTypeService.save(this.inputForm).then(({data}) => {
+            //   this.close()
+            //   this.$message.success(data)
+            //   this.$emit('refreshDataList')
+            //   this.loading = false
+            // }).catch(() => {
+            //   this.loading = false
+            // })
+          }
+        })
+      },
+      close () {
+        this.$refs.inputForm.resetFields()
+        this.visible = false
+      }
+    }
+  }
+</script>

+ 158 - 0
src/views/cw/reimbursementApproval/type/TypeList.vue

@@ -0,0 +1,158 @@
+<template>
+  <div class="page">
+    <el-form size="small" :inline="true" class="query-form" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+      <!-- 搜索框-->
+      <el-form-item label="报销内容名称" prop="name">
+        <el-input size="small" v-model="searchForm.name" placeholder="请输入报销内容名称" clearable></el-input>
+      </el-form-item>
+<!--      <el-form-item label="序号" prop="sort">-->
+<!--        <el-input size="small" v-model="searchForm.sort" placeholder="请输入序号" clearable></el-input>-->
+<!--      </el-form-item>-->
+
+      <el-form-item>
+        <el-button type="primary" @click="refreshList()" size="small" icon="el-icon-search">查询</el-button>
+        <el-button @click="resetSearch()" size="small" icon="el-icon-refresh-right">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <div class="bg-white top" style="">
+      <vxe-toolbar :refresh="{query: refreshList}" custom>
+        <template #buttons>
+          <el-button v-if="hasPermission('program:configuration:type:add')" type="primary" size="small" icon="el-icon-plus" @click="add()">新建</el-button>
+<!--          <el-button v-if="hasPermission('program:configuration:type:del')" type="danger"   size="small" icon="el-icon-delete" @click="del()" :disabled="$refs.typeTable && $refs.typeTable.getCheckboxRecords().length === 0" plain>删除</el-button>-->
+        </template>
+      </vxe-toolbar>
+      <div style="height: calc(100% - 50px)">
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="auto"
+          :loading="loading"
+          size="small"
+          ref="typeTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :tree-config="{transform: true, rowField: 'id', parentField: 'parentId',expandAll: true}"
+          :checkbox-config="{}">
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="checkbox" width="40" ></vxe-column>
+          <vxe-column min-width="200" title="报销内容名称" field="name" align="left" tree-node></vxe-column>
+          <vxe-column min-width="200" title="关联部门" field="relateDepartment" align="center"></vxe-column>
+          <vxe-column min-width="100" title="序号" field="sort" align="center"></vxe-column>
+
+          <vxe-column title="操作" width="230px" fixed="right" align="center">
+            <template  slot-scope="scope">
+              <el-button v-if="hasPermission('reimbursement:type:edit')&&(scope.row.level === '1' || scope.row.level === '2')" type="text"  size="small" @click="addChild(scope.row.id,scope.row.businessType)">添加下级结构</el-button>
+              <el-button v-if="hasPermission('reimbursement:type:edit')" type="text"  size="small" @click="edit(scope.row.id)">修改</el-button>
+              <el-button v-if="hasPermission('reimbursement:type:remove')" type="text"   size="small" @click="del(scope.row.id)">删除</el-button>
+            </template>
+          </vxe-column>
+        </vxe-table>
+
+      </div>
+    </div>
+    <TypeForm  ref="typeForm" @refreshDataList="refreshList"></TypeForm>
+  </div>
+</template>
+
+<script>
+  // import ReimbursementTypeService from '@/api/sys/ReimbursementTypeService'
+  import ReimbursementApprovalTypeService from '@/api/cw/reimbursementApproval/ReimbursementApprovalTypeService'
+  import TypeForm from './TypeForm'
+  export default {
+    data () {
+      return {
+        searchForm: {
+          name: ''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        loading: false
+      }
+    },
+    // reimbursementTypeService: null,
+    reimbursementApprovalTypeService: null,
+    created () {
+      // this.reimbursementTypeService = new ReimbursementTypeService()
+      this.reimbursementApprovalTypeService = new ReimbursementApprovalTypeService()
+    },
+    components: {
+      TypeForm
+    },
+    mounted () {
+      this.refreshList()
+    },
+    methods: {
+      // 新增
+      add () {
+        this.$refs.typeForm.init('add', '')
+      },
+      addChild (id, businessType) {
+        this.$refs.typeForm.init('addChild', id, businessType)
+      },
+      // 修改
+      edit (id) {
+        id = id || this.$refs.typeTable.getCheckboxRecords().map(item => {
+          return item.id
+        })[0]
+        this.$refs.typeForm.init('edit', id)
+      },
+      // 查看
+      view (id) {
+        this.$refs.typeForm.init('view', id)
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        this.reimbursementApprovalTypeService.list({...this.searchForm}).then(({data}) => {
+          this.dataList = data
+          this.loading = false
+          this.$nextTick(() => {
+            this.$refs.typeTable.setAllTreeExpand(true)
+          })
+        })
+        // this.reimbursementTypeService.list({...this.searchForm}).then(({data}) => {
+        //   this.dataList = data
+        //   this.loading = false
+        // })
+      },
+      // 删除
+      del (id) {
+        let ids = id || this.$refs.typeTable.getCheckboxRecords().map(item => {
+          return item.id
+        }).join(',')
+        this.$confirm(`确定删除所选项吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.loading = true
+          this.reimbursementApprovalTypeService.remove(ids).then(({data}) => {
+            this.$message.success(data)
+            this.refreshList()
+            this.loading = false
+          })
+          // this.reimbursementTypeService.remove(ids).then(({data}) => {
+          //   this.$message.success(data)
+          //   this.refreshList()
+          //   this.loading = false
+          // })
+        })
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      }
+    }
+  }
+</script>

+ 148 - 0
src/views/cw/reportCancellApply/ReportCancellApplyChooseCom.vue

@@ -0,0 +1,148 @@
+<template>
+  <div>
+    <el-dialog
+      title="选择报告申请信息"
+      :close-on-click-modal="false"
+	  draggable
+      width="1100px"
+      height="500px"
+      @close="close"
+      append-to-body
+      v-model="visible">
+      <div style="height: calc(100% - 80px);">
+        <el-form :inline="true" class="query-form" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+          <!-- 搜索框-->
+          <el-form-item label="项目名称" prop="projectName">
+            <el-input v-model="searchForm.projectName" placeholder="请输入项目名称" clearable></el-input>
+          </el-form-item>
+
+          <el-form-item>
+            <el-button type="primary" @click="list()" icon="el-icon-search">查询</el-button>
+            <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>
+          </el-form-item>
+        </el-form>
+
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="400px"
+          :loading="loading"
+          ref="projectTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          :print-config="{}"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :row-config="{isCurrent: true}"
+          :radio-config="{trigger: 'row'}"
+        >
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="radio" width="60px"></vxe-column>
+          <vxe-column min-width="230" align="center" title="报告文号" field="reportNo"></vxe-column>
+          <vxe-column min-width="230" align="center" title="单据状态" field="documentStatus"></vxe-column>
+          <vxe-column min-width="230" align="center" title="项目名称" field="projectName"></vxe-column>
+          <vxe-column min-width="160" align="center" title="报告申请单号" field="documentNo"></vxe-column>
+
+        </vxe-table>
+        <vxe-pager
+          background
+          :current-page="tablePage.currentPage"
+          :page-size="tablePage.pageSize"
+          :total="tablePage.total"
+          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+          @page-change="currentChangeHandle">
+        </vxe-pager>
+      </div>
+		<template #footer>
+			<span class="dialog-footer">
+			  <el-button @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			  <el-button type="primary" v-if="method != 'view'" @click="getProject()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+			</span>
+		</template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import ReportCancellApplyService from '@/api/cw/reportCancellApply/ReportCancellApplyService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        dataList: [],
+        searchForm: {
+          projectName: ''
+        }
+      }
+    },
+    reportCancellApplyService: null,
+    created () {
+      this.reportCancellApplyService = new ReportCancellApplyService()
+    },
+    components: {
+    },
+    methods: {
+      init () {
+        this.visible = true
+        this.list()
+      },
+      // 表单提交
+      getProject () {
+        let row = this.$refs.projectTable.getRadioRecord()
+        if (this.commonJS.isEmpty(row)) {
+          this.$message.error('请选择一条数据')
+          return
+        }
+        this.close()
+        this.$emit('getProject', row)
+      },
+      list () {
+        this.loading = true
+        this.searchForm.createId = this.$store.state.user.id
+        this.searchForm.status = '5'
+        this.reportCancellApplyService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+        })
+      },
+      // 当前页
+      currentChangeHandle ({currentPage, pageSize}) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.list()
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.list()
+      },
+      close () {
+        this.visible = false
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-dialog__body {
+    padding-top: 0px;
+    padding-bottom: 15px;
+  }
+</style>

+ 465 - 0
src/views/cw/reportCancellApply/ReportCancellApplyForm.vue

@@ -0,0 +1,465 @@
+<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+	  draggable
+      width="1200px"
+      height="500px"
+      @close="close"
+      v-model="visible">
+      <el-row>
+        <el-row>
+          <el-col :span="24">
+
+            <el-form :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="method==='view'"
+                     label-width="135px" @submit.native.prevent>
+              <el-row  :gutter="15">
+                <el-col :span="12">
+                  <el-form-item label="报告文号" prop="reportNo"
+                                :rules="[
+
+                   ]">
+                    <el-input :readonly="true" @focus="openContractForm()" v-model="inputForm.reportNo" placeholder="请填写报告文号">
+                      	<template #append>
+							<el-button icon="el-icon-search" @click="openContractForm()"></el-button>
+						</template>
+                    </el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="项目名称" prop="projectName"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.projectName" placeholder="请填写项目名称" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="报告主办人" prop="reportSponsor"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.reportSponsor" placeholder="请填写报告主办人" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="项目经理1" prop="projectMasterName"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.projectMasterName" placeholder="请填写项目经理1" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="项目经理2" prop="projectMaster2Name"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.projectMaster2Name" placeholder="请填写项目经理2" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+
+                <el-col :span="12">
+                  <el-form-item label="创建人" prop="createBy.name"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.createBy.name" placeholder="请填写创建人" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="创建时间" prop="createDate"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.createDate" placeholder="请填写创建时间" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="作废原因" prop="cancellateReason"
+                                :rules="[
+                   ]">
+                    <el-input v-model="inputForm.cancellateReason" placeholder="请填写作废原因" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+
+              </el-row>
+            </el-form>
+          </el-col>
+        </el-row>
+      </el-row>
+		<template #footer>
+			<span class="dialog-footer">
+			  <el-button @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			  <el-button v-if="method === 'edit'" type="primary" icon="el-icon-circle-check" @click="doSubmit('save')">确定</el-button>
+			</span>
+		</template>
+
+      <ReportCancellApplyChooseCom  ref="reportCancellApplyChooseCom" @getProject="getContract"></ReportCancellApplyChooseCom>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import ReportCancellApplyService from '@/api/cw/reportCancellApply/ReportCancellApplyService'
+  import projectReportService from '@/api/cw/reportManagement/ProjectReportService'
+  import ReportCancellApplyChooseCom from './ReportCancellApplyChooseCom'
+  export default {
+    props: {
+      businessId: {
+        type: String,
+        default: ''
+      },
+      formReadOnly: {
+        type: Boolean,
+        default: false
+      },
+      status: {
+        type: String,
+        default: ''
+      }
+    },
+    data () {
+      return {
+        title: '',
+        method: '',
+        loading: false,
+        inputForm: {
+          projectId: '',
+          reportNewLineId: '',
+          id: '',
+          createDate: '',
+          createBy: {
+            id: '',
+            name: this.$store.state.user.name
+          },
+          remarks: '',
+          reportNo: '',
+          projectName: '',
+          cancellateReason: '',
+          reportSponsor: '',
+          projectMasterName: '',
+          projectMaster2Name: '',
+          cwFileInfoList: [],
+          servedUnitId: '',
+          status: ''
+        },
+        keyWatch: '',
+        activeName: 'newRow',
+        tableKey: '',
+        tableKeyClient: '1',
+        visible: false
+      }
+    },
+    ReportCancellApplyService: null,
+    created () {
+      this.reportCancellApplyService = new ReportCancellApplyService()
+    },
+    computed: {
+      bus: {
+        get () {
+          return this.businessId
+        },
+        set (val) {
+          this.businessId = val
+        }
+      }
+    },
+    watch: {
+      'keyWatch': {
+        handler (newVal) {
+          if (this.commonJS.isNotEmpty(this.bus)) {
+            this.init('', this.bus)
+          } else {
+            this.$nextTick(() => {
+              this.$refs.inputForm.resetFields()
+            })
+          }
+        }
+      }
+    },
+    components: {
+      ReportCancellApplyChooseCom
+    },
+    methods: {
+      openContractForm () {
+        if (!this.commonJS.isEmpty(this.inputForm.contractId)) {
+          this.$refs.reportCancellApplyChooseCom.init()
+        } else {
+          this.$refs.reportCancellApplyChooseCom.init()
+        }
+      },
+      getUpload (p, index) {
+        p.then((list) => {
+          // list为返回数据
+          this.inputForm.cwProjectInfoList[index].cwFileInfoList = list
+          this.inputForm.cwProjectInfoList[index].fileNumber = list.length
+          this.tableKeyClient = Math.random()
+          // console.log('this.inputForm.cwFileInfoList', this.inputForm.cwFileInfoList)
+          // console.log('list.length', list.length)
+          // console.log(list)
+        })
+      },
+      getKeyWatch (keyWatch) {
+        this.keyWatch = keyWatch
+      },
+      init (method, id) {
+        this.visible = true
+        if (method === 'edit') {
+          this.title = '项目信息修改'
+          this.method = method
+        } else {
+          this.title = '项目详情'
+          this.method = 'view'
+        }
+        this.activeName = 'newRow'
+        this.reportCancellApplyService = new ReportCancellApplyService()
+        this.method = method
+        this.inputForm = {
+          projectId: '',
+          reportNewLineId: '',
+          id: '',
+          createDate: '',
+          createBy: {
+            id: '',
+            name: this.$store.state.user.name
+          },
+          remarks: '',
+          reportNo: '',
+          projectName: '',
+          cancellateReason: '',
+          reportSponsor: '',
+          projectMaster2Name: '',
+          projectMasterName: ''
+        }
+        this.inputForm.id = id
+        this.loading = false
+        this.$nextTick(() => {
+          this.$refs.inputForm.resetFields()
+          this.loading = true
+          this.reportCancellApplyService.queryById(this.inputForm.id).then(({data}) => {
+            this.inputForm = this.recover(this.inputForm, data)
+            this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+            if (this.commonJS.isEmpty(this.inputForm.createDate)) {
+              this.inputForm.createDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+            }
+            this.loading = false
+          })
+        })
+      },
+      saveForm (callback) {
+        this.doSubmit('save', callback)
+      },
+      startForm (callback) {
+        this.doSubmit('start', callback)
+      },
+      async agreeForm (callback) {
+        await this.reportCancellApplyService.queryById(this.inputForm.id).then(({data}) => {
+          if (this.inputForm.status !== '2') { // 审核状态不是“待审核”,就弹出提示
+            this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+            throw new Error()
+          } else {
+            this.doSubmit('agree', callback)
+          }
+        })
+      },
+      // 表单提交
+      // 表单提交
+      doSubmit (status, callback) {
+        if (status === 'save') {
+          // 暂存
+          // this.inputForm.status = '1'
+          this.loading = true
+          this.reportCancellApplyService.saveForm(this.inputForm).then(({data}) => {
+            // callback(data.businessTable, data.businessId, this.inputForm)
+            this.close()
+            this.loading = false
+          }).catch(() => {
+            this.loading = false
+          })
+          return
+        } else if (status === 'start') {
+          // 送审  待审核
+          this.inputForm.status = '2'
+        } else if (status === 'agree') {
+          // 审核同意
+          this.inputForm.agreeDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+          this.inputForm.agreeUserId = this.$store.state.user.id
+          this.inputForm.status = '5'
+        }
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            if (this.commonJS.isEmpty(this.inputForm.createDate)) {
+              this.inputForm.createDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+            }
+            this.inputForm.cwProjectInfoList.forEach((item, index) => {
+              if (this.commonJS.isEmpty(this.inputForm.cwProjectInfoList[index].reportDate)) {
+                this.$message.error('报告日期不能为空')
+                this.loading = false
+                throw new Error('报告日期不能为空')
+              }
+              if (this.commonJS.isEmpty(this.inputForm.cwProjectInfoList[index].reportType)) {
+                this.$message.error('报告类型不能为空')
+                this.loading = false
+                throw new Error('报告类型不能为空')
+              }
+              if (this.commonJS.isEmpty(this.inputForm.cwProjectInfoList[index].opinionType)) {
+                this.$message.error('意见类型不能为空')
+                this.loading = false
+                throw new Error('意见类型不能为空')
+              }
+            })
+            projectReportService.saveForm(this.inputForm).then(({data}) => {
+              callback(data.businessTable, data.businessId, this.inputForm)
+              this.loading = false
+            }).catch(() => {
+              this.loading = false
+            })
+          }
+        })
+      },
+      async updateStatusById (type) {
+        if (type === 'reject' || type === 'reback') {
+          await this.reportCancellApplyService.queryById(this.inputForm.id).then(({data}) => {
+            if (data.status !== '2') { // status的值不等于“审核中”就弹出提示
+              this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+              throw new Error()
+            } else {
+              if (type === 'reject') {
+                // 驳回
+                this.inputForm.status = '4'
+                let param = {status: '4', id: this.inputForm.id}
+                this.reportCancellApplyService.updateStatusById(param)
+              }
+              if (type === 'reback') {
+                // 撤回
+                let param = {status: '3', id: this.inputForm.id}
+                this.reportCancellApplyService.updateStatusById(param)
+              }
+            }
+          })
+        }
+      },
+      close () {
+        this.inputForm = {
+          id: '',
+          createDate: '',
+          createBy: {
+            id: '',
+            name: ''
+          },
+          remarks: '',
+          projectNumber: '',
+          projectName: '',
+          officeId: '',
+          projectMoney: '',
+          auditYear: '',
+          planStartDate: '',
+          planEndDate: '',
+          projectMasterId: '',
+          projectLeaderId: '',
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          workAttachmentDtoList: [],
+          cwProjectClientInfoDTOList: [],
+          contractName: '',
+          contractAmount: '',
+          contractNum: '',
+          payerSubject: '',
+          paymentMethod: '',
+          contractId: '',
+          projectMaster2Name: '',
+          projectMasterName: ''
+        }
+        this.$refs.inputForm.resetFields()
+        this.visible = false
+      },
+      tabHandleClick (event) {
+        // console.log(event)
+      },
+      // 新增
+      // eslint-disable-next-line no-dupe-keys
+      // insertEvent (type) {
+      //   if (type === 'client') {
+      //     let d = {
+      //       no: '',
+      //       name: '',
+      //       companyLevel: ''
+      //     }
+      //     if (this.commonJS.isEmpty(this.inputForm.cwProjectClientInfoDTOList)) {
+      //       this.inputForm.cwProjectClientInfoDTOList = []
+      //     }
+      //     this.$refs.clientTable.insertAt(d)
+      //     this.inputForm.cwProjectClientInfoDTOList.push(d)
+      //     this.tableKeyClient = Math.random()
+      //   }
+      // },
+      clearClientList () {
+        // 项目直接对接联系人列表清除
+        this.inputForm.clientList = []
+        this.$forceUpdate()
+      },
+      // 删除
+      removeEvent (row, rowIndex, type) {
+        if (type === 'client') {
+          this.$refs.clientTable.remove(row)
+          // this.inputForm.cwProjectClientInfoDTOList.splice(rowIndex, 1)
+          this.inputForm.cwProjectInfoList.splice(rowIndex, 1)
+        }
+      },
+      getWorkClientChoose (list) {
+        if (this.commonJS.isEmpty(this.inputForm.cwProjectInfoList)) {
+          this.inputForm.cwProjectInfoList = []
+        }
+        let _this = this
+        let _list = list
+        const waitForEach = function () {
+          return new Promise(function (resolve, reject) {
+            _list.forEach((item) => {
+              _this.inputForm.cwProjectInfoList.forEach(client => {
+                if (item.id === client.servedUnitId) {
+                  // _this.$message.error('已存在客户 “' + client.servedUnitName + '”,请重新选择')
+                  // throw new Error('已存在客户 “' + client.servedUnitName + '”,请重新选择')
+                }
+              })
+            })
+            resolve()
+          })
+        }
+        waitForEach().then(() => {
+          list.forEach(item => {
+            // eslint-disable-next-line no-unused-vars
+            let d = {
+              servedUnitName: item.name, // 被服务单位名称
+              reportNumber: this.inputForm.projectNumber + '-0' + (this.inputForm.cwProjectInfoList.length + 1), // 报告流水号
+              issueReport: '是',
+              sealType: '未盖章',
+              id: this.uuid,
+              servedUnitId: item.id
+            }
+            // console.log('新增行数据填入')
+            // console.log('item', item)
+            // console.log('d', d)
+            this.$refs.clientTable.insertAt(d)
+            this.inputForm.cwProjectInfoList.push(d)
+            // console.log('this.inputForm.cwProjectInfoList', this.inputForm.cwProjectInfoList)
+            this.tableKeyClient = Math.random()
+          })
+        })
+      },
+      getContract (row) {
+        // console.log('row', row)
+        this.inputForm.projectName = row.projectName // 项目名称
+        this.inputForm.projectId = row.id // 项目id
+        this.inputForm.projectMasterName = row.projectMasterName // 项目经理1
+        this.inputForm.projectMaster2Name = row.projectMaster2Name // 项目经理2
+        this.inputForm.reportNo = row.reportNo // 报告文号
+        this.inputForm.reportNewLineId = row.reportNewLineId // 新建行id
+        this.clearClientList()
+        this.$forceUpdate()
+      },
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-input-number .el-input__inner {
+    text-align: left;
+  }
+</style>

+ 468 - 0
src/views/cw/reportCancellApply/ReportCancellApplyList.vue

@@ -0,0 +1,468 @@
+<template>
+  <div class="page">
+    <el-form :inline="true" class="query-form m-b-10" v-if="searchVisible" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+      <!-- 搜索框-->
+      <el-form-item label="项目编号" prop="projectNumber">
+        <el-input v-model="searchForm.projectNumber" placeholder="请输入项目编号" clearable></el-input>
+      </el-form-item>
+      <el-form-item label="项目名称" prop="projectName">
+        <el-input v-model="searchForm.projectName" placeholder="请输入项目名称" clearable></el-input>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="项目经理1" prop="projectMasterName">
+        <UserSelect :limit='1' :userName="searchForm.projectMasterName" @getValue='(value, label) => {searchForm.projectMasterName = label}'></UserSelect>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="项目经理2" prop="projectMaster2Name">
+        <UserSelect :limit='1' :userName="searchForm.projectMaster2Name" @getValue='(value, label) => {searchForm.projectMaster2Name = label}'></UserSelect>
+      </el-form-item>
+<!--      <el-form-item label="创建人" prop="createBy">-->
+<!--        <el-input v-model="searchForm.createBy" placeholder="请输入创建人" clearable></el-input>-->
+<!--      </el-form-item>-->
+      <el-form-item v-if="showHideItem" label="创建人" prop="createBy">
+        <SelectUserTree
+          ref="companyTree"
+          :props="{
+                  value: 'id',             // ID字段名
+                  label: 'name',         // 显示名称
+                  children: 'children'    // 子级字段名
+                }"
+          :url="`/sys/user/treeUserDataAllOffice?type=2`"
+          :value="searchForm.createBy"
+          :clearable="true"
+          :accordion="true"
+          @getValue="(value) => {searchForm.createBy=value}"/>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="创建时间" prop="contractDates">
+        <el-date-picker
+          placement="bottom-start"
+          format="yyyy-MM-dd HH:mm:ss"
+          value-format="yyyy-MM-dd HH:mm:ss"
+          v-model="searchForm.contractDates"
+          type="datetimerange"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期">
+        </el-date-picker>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="default" @click="showHide" :icon="showHideIcon">{{showHideName}}</el-button>
+        <el-button type="primary" @click="refreshList()" icon="el-icon-search">查询</el-button>
+        <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <div class="jp-table top" style="">
+      <vxe-toolbar :refresh="{query: refreshList}" custom>
+        <template #buttons>
+          <el-button v-if="hasPermission('cw_work_client:info:add')" type="primary" icon="el-icon-plus" @click="start()">新建</el-button>
+        </template>
+		  <template #tools>
+			  <vxe-button
+				  text
+				  type="primary"
+				  :title="searchVisible ? '收起检索' : '展开检索'"
+				  icon="vxe-icon-search"
+				  class="tool-btn"
+				  @click="searchVisible = !searchVisible"
+			  ></vxe-button>
+		  </template>
+      </vxe-toolbar>
+      <div style="height: calc(100% - 90px)">
+        <vxe-table
+          :key="tableKey"
+          border="inner"
+          auto-resize
+          resizable
+          height="auto"
+          :loading="loading"
+          ref="clientTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          @sort-change="sortChangeHandle"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :checkbox-config="{}">
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column min-width="160" align="center" title="单据编号" field="documentNo"></vxe-column>
+          <vxe-column min-width="160" align="center" title="报告文号" field="reportNo">
+            <template #default="scope">
+              <el-link  type="primary" :underline="false" v-if="hasPermission('cwProjectReport:list')&&commonJS.isNotEmpty(scope.row.reportId)" @click="viewReport(scope.row.reportId)">{{scope.row.reportNo}}</el-link>
+              <el-link  type="primary" :underline="false" v-else-if="hasPermission('cwProjectReport:list')&&commonJS.isNotEmpty(scope.row.reportId)"  @click="viewReport(scope.row.reportId)">{{scope.row.reportNo}}</el-link>
+              <span v-else>{{scope.row.reportNo}}</span>
+            </template>
+          </vxe-column>
+          <vxe-column min-width="160" align="center" title="项目编号" field="projectNumber"></vxe-column>
+          <vxe-column min-width="160" align="center" title="项目名称" field="projectName"></vxe-column>
+          <vxe-column min-width="160" align="center" title="报告所属部门" field="departmentName"></vxe-column>
+          <vxe-column min-width="160" align="center" title="项目经理1" field="projectMasterName"></vxe-column>
+          <vxe-column min-width="160" align="center" title="项目经理2" field="projectMaster2Name"></vxe-column>
+          <vxe-column min-width="160" align="center" title="报告主办人" field="reportSponsor"></vxe-column>
+          <vxe-column min-width="160" align="center" title="创建人" field="userName"></vxe-column>
+          <vxe-column min-width="160" align="center" title="创建时间" field="createTime"></vxe-column>
+          <vxe-column  min-width="150px" align="center" fixed="right" title="状态" field="status" >
+            <template #default="scope">
+              <el-button  @click="detail(scope.row)" effect="dark"
+						  text
+                          :type="$dictUtils.getDictLabel('cw_status_flag', scope.row.status, '-')">
+                {{$dictUtils.getDictLabel("cw_status", scope.row.status, '-')}}
+              </el-button>
+            </template>
+          </vxe-column>
+
+          <vxe-column title="操作" width="150px" fixed="right" align="center">
+            <template  #default="scope">
+              <el-button v-if="hasPermission('cwProjectReport:edit')&&scope.row.createById === $store.state.user.id&&(scope.row.status==='1'||scope.row.status==='3')" text type="primary" @click="push(scope.row)">修改</el-button>
+              <el-button v-else-if="hasPermission('cwProjectReport:edit')&&isAdmin&&(scope.row.status==='1'||scope.row.status==='3'||scope.row.status==='5')" text type="primary"  @click="edit(scope.row.id)">修改</el-button>
+              <el-button v-if="hasPermission('cwProjectReport:edit')&&scope.row.createById === $store.state.user.id&&scope.row.status==='2'" text type="primary" @click="reback(scope.row)">撤回</el-button>
+              <el-button v-if="hasPermission('cwProjectReport:del')&&scope.row.createById === $store.state.user.id&&(scope.row.status==='1'||scope.row.status==='3')" text type="primary" @click="del(scope.row.id)">删除</el-button>
+              <el-button v-else-if="hasPermission('cwProjectReport:del')&&isAdmin&&(scope.row.status==='1'||scope.row.status==='3'||scope.row.status==='5')" text type="primary" @click="del(scope.row.id)">删除</el-button>
+<!--              审核-->
+              <el-button v-if="scope.row.status==='2' && checkIsAudit(scope.row)" text type="primary"  @click="examine(scope.row)">审核</el-button>
+<!--              被驳回后当前申请人重新调整-->
+              <el-button v-if="scope.row.createById === $store.state.user.id&&scope.row.status === '4'" text type="primary" @click="adjust(scope.row)">驳回调整</el-button>
+            </template>
+          </vxe-column>
+        </vxe-table>
+        <vxe-pager
+          background
+          :current-page="tablePage.currentPage"
+          :page-size="tablePage.pageSize"
+          :total="tablePage.total"
+          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+          @page-change="currentChangeHandle">
+        </vxe-pager>
+      </div>
+    </div>
+    <ReportManagementForm ref="reportManagementForm"></ReportManagementForm>
+    <ReportCancellApplyForm ref="reportCancellApplyForm"></ReportCancellApplyForm>
+  </div>
+</template>
+
+<script>
+  import ReportCancellApplyService from '@/api/cw/reportCancellApply/ReportCancellApplyService'
+  import taskService from '@/api/flowable/TaskService'
+  import processService from '@/api/flowable/ProcessService'
+  import ReportManagementForm from '../reportManagement/ReportManagementForm'
+  import ReportCancellApplyForm from './ReportCancellApplyForm'
+  import pick from 'lodash.pick'
+  import userService from '@/api/sys/UserService'
+  import SelectUserTree from '@/views/utils/treeUserSelect'
+  import UserSelect from '@/views/cw/workClientInfo/clientUserSelect'
+  export default {
+    data () {
+      return {
+      	searchVisible: true,
+        showHideItem: false,
+        showHideIcon: 'el-icon-arrow-down',
+        showHideName: '展示',
+        searchForm: {
+          projectNumber: '',
+          projectName: '',
+          projectMasterId: '',
+          projectMaster2Id: '',
+          createBy: '',
+          contractDates: [],
+          projectMasterName: '', // 项目经理1
+          projectMaster2Name: '' // 项目经理2
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        tableKey: '',
+        loading: false,
+        processDefinitionAuditId: '',
+        procDefAuditKey: '',
+        isAdmin: false,
+        create: ''
+      }
+    },
+    reportCancellApplyService: null,
+    created () {
+      this.reportCancellApplyService = new ReportCancellApplyService()
+    },
+    components: {
+      ReportManagementForm,
+      ReportCancellApplyForm,
+      SelectUserTree,
+      UserSelect
+    },
+    computed: {
+      userName () {
+        return this.$store.state.user.name
+      },
+      user () {
+        this.createName = this.$store.state.user.name
+        return this.$store.state.user
+      }
+    },
+    mounted () {
+      this.refreshList()
+    },
+    activated () {
+      this.refreshList()
+    },
+    methods: {
+      showHide () {
+        if (this.showHideItem === false) {
+          this.showHideItem = true
+          this.showHideIcon = 'el-icon-arrow-up'
+          this.showHideName = '隐藏'
+        } else {
+          this.showHideItem = false
+          this.showHideIcon = 'el-icon-arrow-down'
+          this.showHideName = '展示'
+        }
+      },
+      // 新增
+      add () {
+        // this.$refs.reportManagementForm.init('add', '')
+        this.$refs.reportCancellApplyForm.init('add', '')
+      },
+      // 修改
+      edit (id) {
+        id = id || this.$refs.clientTable.getCheckboxRecords().map(item => {
+          return item.id
+        })[0]
+        // this.$refs.reportManagementForm.init('edit', id)
+        this.$refs.reportCancellApplyForm.init('edit', id)
+      },
+      // 查看
+      view (id) {
+        // this.$refs.reportManagementForm.init('view', id)
+        this.$refs.reportCancellApplyForm.init('view', id)
+      },
+      // 根据报告id查看报告详情
+      viewReport (id) {
+        this.$refs.reportManagementForm.init('view', id)
+        // this.$refs.reportCancellApplyForm.init('view', id)
+      },
+      // 查询当前用户是否是管理员用户
+      checkIsAdmin () {
+        userService.is().then((data) => {
+          this.isAdmin = data
+        })
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        this.reportCancellApplyService.findList({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.tableKey = Math.random()
+          this.loading = false
+        })
+        this.checkIsAdmin()
+        processService.getByName('会计-报告作废申请').then((data) => {
+          if (!this.commonJS.isEmpty(data.id)) {
+            this.processDefinitionAuditId = data.id
+            this.procDefAuditKey = data.key
+          }
+        })
+      },
+      // 当前页
+      currentChangeHandle ({ currentPage, pageSize }) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.refreshList()
+      },
+      // 排序
+      sortChangeHandle (column) {
+        this.tablePage.orders = []
+        if (column.order != null) {
+          this.tablePage.orders.push({column: this.$utils.toLine(column.property), asc: column.order === 'asc'})
+        }
+        this.refreshList()
+      },
+      // 删除
+      del (id) {
+        let ids = id || this.$refs.clientTable.getCheckboxRecords().map(item => {
+          return item.id
+        }).join(',')
+        this.$confirm(`确定删除所选项吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.loading = true
+          this.reportCancellApplyService.delete(ids).then((data) => {
+            this.$message.success(data)
+            this.refreshList()
+            this.loading = false
+          })
+        })
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      },
+      start () {
+        // 读取流程表单
+        let tabTitle = `发起流程【会计-报告作废申请】`
+        let processTitle = `${this.userName} 在 ${this.moment(new Date()).format('YYYY-MM-DD HH:mm')} 发起了 [会计-报告作废申请]`
+        taskService.getTaskDef({ procDefId: this.processDefinitionAuditId,
+          status: 'startAndHold'}).then((data) => {
+            this.$router.push({
+              path: '/flowable/task/TaskForm',
+              query: {
+                ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                procDefId: this.processDefinitionAuditId,
+                procDefKey: this.procDefAuditKey,
+                status: 'startAndHold',
+                title: tabTitle,
+                formType: data.formType,
+                formUrl: data.formUrl,
+                formTitle: processTitle,
+                businessId: 'false',
+                isShow: false,
+                routePath: '/cw/reportCancellApply/ReportCancellApplyList'
+              }
+            })
+          })
+      },
+      // 发起客户登记
+      push (row) {
+        // 读取流程表单
+        let title = `发起流程【会计-报告作废申请】`
+        let processTitle = `${this.userName} 在 ${this.moment(new Date()).format('YYYY-MM-DD HH:mm')} 发起了[会计-报告作废申请]`
+        let status = 'startAndHold'
+        if (row.status === '3') {
+          status = 'startAndClose'
+        } else if (row.status === '4') {
+          status = 'reapplyFlag'
+        }
+        taskService.getTaskDef({ procDefId: this.processDefinitionAuditId,
+          businessId: row.id,
+          businessTable: 'cw_project_report_cancell_apply'}).then((data) => {
+            this.$router.push({
+              path: '/flowable/task/TaskForm',
+              query: {
+                ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                procDefId: this.processDefinitionAuditId,
+                procDefKey: this.procDefAuditKey,
+                title: title,
+                formType: data.formType,
+                formUrl: data.formUrl,
+                formTitle: processTitle,
+                businessTable: 'cw_project_report_cancell_apply',
+                businessId: row.id,
+                isShow: 'false',
+                status: status,
+                routePath: '/cw/reportCancellApply/ReportCancellApplyList'
+              }
+            })
+          })
+      },
+      // 查看客户登记流程结果
+      detail (row) {
+        if (row.status !== '0' && row.status !== '1') {
+          // eslint-disable-next-line eqeqeq
+          taskService.getTaskDef({
+            procInsId: row.procInsId,
+            procDefId: this.processDefinitionAuditId
+          }).then((data) => {
+            this.$router.push({
+              path: '/flowable/task/TaskFormDetail',
+              query: {
+                ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                isShow: 'false',
+                readOnly: true,
+                title: '质控管理' + '流程详情',
+                formTitle: '质控管理' + '流程详情',
+                businessId: row.id,
+                status: 'reback',
+                ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'title', 'businessId')
+              }
+            })
+          })
+        }
+      },
+      // 撤回报告流程
+      reback (row) {
+        this.$confirm(`确定要撤回该申请吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(async () => {
+          await this.reportCancellApplyService.queryById(row.id).then((data) => {
+            if (data.status !== '2') { // status的值不等于“审核中”,就弹出提示
+              this.$message.error('数据已发生改变或不存在,请刷新数据')
+              this.refreshList()
+            } else {
+              processService.revokeProcIns(row.procInsId).then((data) => {
+                let form = {status: '3', id: row.id}
+                this.reportCancellApplyService.updateStatusById(form)
+                this.$message.success(data)
+                this.refreshList()
+              })
+            }
+          })
+        })
+      },
+      // 驳回后调整
+      adjust (row) {
+        this.reportCancellApplyService.queryById(row.id).then((data) => {
+          if (data.status !== '4') { // status的值不等于“驳回”,就弹出提示
+            this.$message.error('数据已发生改变或不存在,请刷新数据')
+            this.refreshList()
+          } else {
+            this.todo(row)
+          }
+        })
+      },
+      // 审核
+      examine (row) {
+        this.reportCancellApplyService.queryById(row.id).then((data) => {
+          if (data.status !== '2') { // status的值不等于“审核中”,就弹出提示
+            this.$message.error('数据已发生改变或不存在,请刷新数据')
+            this.refreshList()
+          } else {
+            this.todo(row)
+          }
+        })
+      },
+      // 审核或重新调整跳转
+      todo (row) {
+        let cUser = false
+        taskService.getTaskDefInfo({
+          taskId: row.taskId
+        }).then((data) => {
+          this.$router.push({
+            path: '/flowable/task/TaskForm',
+            query: {
+              ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title', 'businessId'),
+              isShow: false,
+              formReadOnly: true,
+              formTitle: `${data.taskName}`,
+              cUser: cUser,
+              title: `审批【${data.taskName || ''}】`,
+              routePath: '/cw/reportCancellApply/ReportCancellApplyList'   // 数据处理后需要跳转的页面路径
+            }
+          })
+        })
+      },
+      // 查询当前登录人是否是数据的审核人
+      checkIsAudit (row) {
+        let loginUserId = this.$store.state.user.id  // 获取当前登录用户id
+        if (this.commonJS.isNotEmpty(row.auditUserIds)) {
+          for (const userId of row.auditUserIds) {
+            if (userId === loginUserId) {  // 当数据的审核人中包含当前登录人id时,返回true
+              return true
+            }
+          }
+        }
+        return false
+      }
+    }
+  }
+</script>

Plik diff jest za duży
+ 1387 - 0
src/views/cw/reportCancellApply/ReportCancellApplyTaskForm.vue


+ 151 - 0
src/views/cw/reportCancellApplyArchived/ReportCancellApplyArchivedChooseCom.vue

@@ -0,0 +1,151 @@
+<template>
+  <div>
+    <el-dialog
+      title="选择报告申请信息"
+      :close-on-click-modal="false"
+	  draggable
+      width="1100px"
+      height="500px"
+      @close="close"
+      append-to-body
+      v-model="visible">
+      <div style="height: calc(100% - 80px);">
+        <el-form :inline="true" class="query-form" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+          <!-- 搜索框-->
+          <el-form-item label="项目名称" prop="projectName">
+            <el-input v-model="searchForm.projectName" placeholder="请输入项目名称" clearable></el-input>
+          </el-form-item>
+
+          <el-form-item>
+            <el-button type="primary" @click="list()"  icon="el-icon-search">查询</el-button>
+            <el-button @click="resetSearch()"  icon="el-icon-refresh-right">重置</el-button>
+          </el-form-item>
+        </el-form>
+
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="400px"
+          :loading="loading"
+          ref="projectTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          :print-config="{}"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :row-config="{isCurrent: true}"
+          :radio-config="{trigger: 'row'}"
+        >
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="radio" width="40px"></vxe-column>
+          <vxe-column min-width="230" align="center" title="报告文号" field="reportNo"></vxe-column>
+          <vxe-column min-width="230" align="center" title="单据状态" field="documentStatus"></vxe-column>
+          <vxe-column min-width="230" align="center" title="项目名称" field="projectName"></vxe-column>
+          <vxe-column min-width="160" align="center" title="报告申请单号" field="documentNo"></vxe-column>
+
+        </vxe-table>
+        <vxe-pager
+          background
+          :current-page="tablePage.currentPage"
+          :page-size="tablePage.pageSize"
+          :total="tablePage.total"
+          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+          @page-change="currentChangeHandle">
+        </vxe-pager>
+      </div>
+		<template #footer>
+			<span class="dialog-footer">
+			  <el-button @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			  <el-button type="primary" v-if="method != 'view'" @click="getProject()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+			</span>
+		</template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  // import ProjectRecordsService from '@/api/cw/projectRecords/ProjectRecordsService'
+  import ReportCancellApplyService from '@/api/cw/reportCancellApply/ReportCancellApplyService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        dataList: [],
+        searchForm: {
+          projectName: ''
+        }
+      }
+    },
+    // projectRecordsService: null,
+    reportCancellApplyService: null,
+    created () {
+      // this.projectRecordsService = new ProjectRecordsService()
+      this.reportCancellApplyService = new ReportCancellApplyService()
+    },
+    components: {
+    },
+    methods: {
+      init () {
+        this.visible = true
+        this.list()
+      },
+      // 表单提交
+      getProject () {
+        let row = this.$refs.projectTable.getRadioRecord()
+        if (this.commonJS.isEmpty(row)) {
+          this.$message.error('请选择一条数据')
+          return
+        }
+        this.close()
+        this.$emit('getProject', row)
+      },
+      list () {
+        this.loading = true
+        this.searchForm.createId = this.$store.state.user.id
+        this.searchForm.status = '5'
+        this.reportCancellApplyService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+        })
+      },
+      // 当前页
+      currentChangeHandle ({currentPage, pageSize}) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.list()
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.list()
+      },
+      close () {
+        this.visible = false
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-dialog__body {
+    padding-top: 0px;
+    padding-bottom: 15px;
+  }
+</style>

+ 838 - 0
src/views/cw/reportCancellApplyArchived/ReportCancellApplyArchivedForm.vue

@@ -0,0 +1,838 @@
+<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+	  draggable
+      width="1200px"
+      height="500px"
+      @close="close"
+      v-model="visible">
+      <el-row>
+        <el-row>
+          <el-col :span="24">
+            <el-form :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="method==='view'"
+                     label-width="135px" @submit.native.prevent>
+              <el-row  :gutter="15">
+                <!--            <el-col :span="12">-->
+                <!--              <el-form-item label="档案名称" prop="name"-->
+                <!--                            :rules="[-->
+                <!--                                {required: true, message:'档案名称不能为空', trigger:'blur'}-->
+                <!--                   ]">-->
+                <!--                <el-input v-model="inputForm.name" placeholder="请填写档案名称" clearable></el-input>-->
+                <!--              </el-form-item>-->
+                <!--            </el-col>-->
+                <!--            <el-col :span="12">-->
+                <!--              <el-form-item label="档案号" prop="fileNumber"-->
+                <!--                            :rules="[-->
+                <!--                   ]">-->
+                <!--                <el-input :disabled="true" v-model="inputForm.fileNumber" placeholder="请填写档案号" clearable></el-input>-->
+                <!--              </el-form-item>-->
+                <!--            </el-col>-->
+                <el-col :span="12">
+                  <el-form-item label="项目名称" prop="cwProjectRecordsDTO.projectName"
+                                :rules="[
+                                {required: true, message:'项目名称不能为空', trigger:'blur'},
+                                {required: true, message:'项目名称不能为空', trigger:'change'}
+                   ]">
+                    <el-input :disabled="true" :readonly="true" v-model="inputForm.cwProjectRecordsDTO.projectName" placeholder="请填写项目名称" clearable>
+                      <el-button slot="append" :disabled="true" @click="openChooseProject" icon="el-icon-search"></el-button>
+                    </el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="项目编号" prop="cwProjectRecordsDTO.projectNumber"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.cwProjectRecordsDTO.projectNumber" placeholder="请填写项目编号" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="项目经理1" prop="cwProjectRecordsDTO.projectMasterId"
+                                :rules="[
+                   ]">
+                    <!--                    <el-input v-model="inputForm.projectMasterId" placeholder="请填写项目经理" clearable></el-input>-->
+                    <UserSelect :disabled="true" :limit='1' :value="inputForm.cwProjectRecordsDTO.projectMasterId" @getValue='(value) => {inputForm.cwProjectRecordsDTO.projectMasterId = value}'></UserSelect>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="项目经理2" prop="cwProjectRecordsDTO.realHeader"
+                                :rules="[
+                   ]">
+                    <!--                    <el-input v-model="inputForm.projectMasterId" placeholder="请填写项目经理" clearable></el-input>-->
+                    <UserSelect :disabled="true" :limit='1' :value="inputForm.cwProjectRecordsDTO.realHeader" @getValue='(value) => {inputForm.cwProjectRecordsDTO.realHeader = value}'></UserSelect>
+                  </el-form-item>
+                </el-col>
+                <!--            <el-col :span="12">-->
+                <!--              <el-form-item label="被审计单位" prop="auditedUnitsName"-->
+                <!--                            :rules="[-->
+                <!--                                {required: true, message:'被审计单位不能为空', trigger:'blur'},-->
+                <!--                                {required: true, message:'被审计单位不能为空', trigger:'change'}-->
+                <!--                   ]">-->
+                <!--                <el-input :readonly="true" v-model="inputForm.auditedUnitsName" @focus="openChooseClient" placeholder="请填写被审计单位" clearable>-->
+                <!--                  <el-button slot="append" :disabled="formReadOnly" @click="openChooseClient" icon="el-icon-search"></el-button>-->
+                <!--                </el-input>-->
+                <!--              </el-form-item>-->
+                <!--            </el-col>-->
+                <el-col :span="12">
+                  <el-form-item label="报告册数" prop="reportNum"
+                                :rules="[
+                                {required: true, message:'报告册数不能为空', trigger:'blur'}
+                   ]">
+                    <el-input-number
+                      v-model="inputForm.reportNum"
+                      controls-position="right"
+                      style="width:100%"
+                      :precision="0"
+                      :max="9999999999"
+                      :step="1"
+                      :min="0"
+                      placeholder="请填写报告册数"
+                      :controls="false"
+                      clearable>
+                    </el-input-number>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="底稿册数" prop="papersNum"
+                                :rules="[
+                                {required: true, message:'底稿册数不能为空', trigger:'blur'}
+                   ]">
+                    <el-input-number
+                      v-model="inputForm.papersNum"
+                      controls-position="right"
+                      style="width:100%"
+                      :precision="0"
+                      :max="9999999999"
+                      :step="1"
+                      :min="0"
+                      placeholder="请填写底稿册数"
+                      :controls="false"
+                      clearable>
+                    </el-input-number>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="档案年度" prop="year"
+                                :rules="[
+                                {required: true, message:'档案年度不能为空', trigger:'blur'}
+                   ]">
+                    <el-date-picker
+                      v-model="inputForm.year"
+                      type="year"
+                      value-format="YYYY"
+                      placeholder="选择档案年度"
+                      style="width:100%"
+                      placement="bottom-start"
+                      :clearable="false">
+                    </el-date-picker>
+                  </el-form-item>
+                </el-col>
+                <el-col v-if="status !== 'audit'" :span="12">
+                  <el-form-item label="案卷号" prop="number"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.number" placeholder="请填写案卷号" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col v-if="status !== 'audit'" :span="12">
+                  <el-form-item label="确认案卷号" prop="isNumber"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.isNumber" placeholder="请填写确认案卷号" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-form v-if="status === 'audit'" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"
+                         label-width="135px" @submit.native.prevent>
+                  <el-col  :span="12">
+                    <el-form-item label="案卷号" prop="number"
+                                  :rules="[
+                                {required: true, message:'案卷号不能为空', trigger:'blur'}
+                   ]">
+                      <el-input :disabled="false" v-model="inputForm.number" placeholder="请填写案卷号" clearable></el-input>
+                    </el-form-item>
+                  </el-col>
+                  <el-col  :span="12">
+                    <el-form-item label="确认案卷号" prop="isNumber"
+                                  :rules="[
+                                {required: true, message:'确认案卷号不能为空', trigger:'blur'}
+                   ]">
+                      <el-input :disabled="false" v-model="inputForm.isNumber" placeholder="请填写确认案卷号" clearable></el-input>
+                    </el-form-item>
+                  </el-col>
+                </el-form>
+                <el-col :span="12">
+                  <el-form-item label="归档时间" prop="auditDate"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.auditDate" placeholder="请填写归档时间" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="归档类型" prop="carchivedType"
+                                :rules="[
+                   ]">
+                    <el-select v-model="inputForm.carchivedType" placeholder="请选择归档类型" style="width:100%;">
+                      <el-option
+                        v-for="item in $dictUtils.getDictList('cw_carchived_type')"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value">
+                      </el-option>
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                  <el-form-item label="备注" prop="remarks"
+                                :rules="[
+                   ]">
+                    <el-input type="textarea" style="width:100%" maxlength="1000" v-model="inputForm.remarks" placeholder="请填写备注" show-word-limit></el-input>
+
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="申请人" prop="createBy.name"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.createBy.name" placeholder="请填写创建人" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="申请时间" prop="createDate"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.createDate" placeholder="请填写创建时间" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+              <el-divider content-position="left"><i class="el-icon-document"></i> 审计报告</el-divider>
+              <el-row :gutter="15">
+                <el-col :span="12">
+                  <el-form-item label="报告文号" prop="reportNo"
+                                :rules="[
+                                {required: true, message:'报告文号不能为空', trigger:'blur'},
+                                {required: true, message:'报告文号不能为空', trigger:'change'}
+                   ]">
+                    <el-input :disabled="true" :readonly="true" v-model="inputForm.reportNo" placeholder="请填写报告文号" clearable>
+                      <el-button :disabled="true" slot="append" @click="openReportChoose" icon="el-icon-search"></el-button>
+                    </el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="报告日期" prop="reportDate"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.reportDate" placeholder="请填写报告日期" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="签字注师1" prop="signatureAnnotator1Name"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.signatureAnnotator1Name" placeholder="请填写签字注师1" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="签字注师2" prop="signatureAnnotator2Name"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.signatureAnnotator2Name" placeholder="请填写签字注师2" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="报告主办人" prop="reportCreateName"
+                                :rules="[
+                   ]">
+                    <el-input :disabled="true" v-model="inputForm.reportCreateName" placeholder="请填写报告主办人" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-form :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''" :disabled="status !== 'audit'"
+                         label-width="135px" @submit.native.prevent>
+                  <el-col :span="24">
+                    <el-form-item label="审计意见" prop="reportRemarks"
+                                  :rules="[
+                   ]">
+                      <el-input type="textarea"  style="width:100%" maxlength="225" v-model="inputForm.reportRemarks" placeholder="请填写审计意见" show-word-limit></el-input>
+
+                    </el-form-item>
+                  </el-col>
+                </el-form>
+              </el-row>
+            </el-form>
+            <el-tabs v-model="activeName" type="border-card" @tab-click="tabHandleClick">
+              <el-tab-pane label="附件" name="files">
+                <!--        附件-->
+                <UpLoadComponent ref="uploadComponent"></UpLoadComponent>
+              </el-tab-pane>
+
+            </el-tabs>
+          </el-col>
+        </el-row>
+      </el-row>
+		<template #footer>
+			<span slot="footer" class="dialog-footer">
+			  <el-button @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			  <el-button v-if="method === 'edit'" type="primary" icon="el-icon-circle-check" @click="doSubmit('save')">确定</el-button>
+			</span>
+		</template>
+      <ReportChooseByProjectCom ref="reportChooseByProjectCom" @getReport="getReport"></ReportChooseByProjectCom>
+      <ProjectRecordsChooseCom ref="projectRecordsChooseCom" @getProject="getProject"></ProjectRecordsChooseCom>
+      <ReportCancellApplyChooseCom  ref="reportCancellApplyChooseCom" @getProject="getContract"></ReportCancellApplyChooseCom>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import ProjectReportArchiveService from '@/api/cw/projectRecords/ProjectReportArchiveService'
+  import ReportCancellApplyArchivedService from '@/api/cw/reportCancellApplyArchived/ReportCancellApplyArchivedService'
+  import ReportCancellApplyService from '@/api/cw/reportCancellApply/ReportCancellApplyService'
+  import UpLoadComponent from '@/views/common/UpLoadComponent'
+  import UserSelect from '@/components/userSelect'
+  import ProjectRecordsChooseCom from '@/views/cw/projectRecords/ProjectRecordsChooseCom'
+  import EnterpriseSearchService from '@/api/cw/common/EnterpriseSearchService'
+  import projectReportService from '@/api/cw/reportManagement/ProjectReportService'
+  import ReportCancellApplyChooseCom from './ReportCancellApplyArchivedChooseCom'
+  import ReportChooseByProjectCom from '@/views/cw/projectReportArchive/ReportChooseByProjectCom'
+  export default {
+    props: {
+      businessId: {
+        type: String,
+        default: ''
+      },
+      formReadOnly: {
+        type: Boolean,
+        default: false
+      },
+      status: {
+        type: String,
+        default: ''
+      }
+    },
+    data () {
+      return {
+        title: '',
+        method: '',
+        loading: false,
+        inputForm: {
+          id: '',
+          createDate: '',
+          createBy: {
+            id: '',
+            name: ''
+          },
+          remarks: '',
+          projectId: '',
+          auditedUnits: '',
+          reportNum: '',
+          papersNum: '',
+          year: '',
+          number: '',
+          isNumber: '',
+          auditDate: '',
+          carchivedType: '',
+          archiveId: '',  // 报告作废id
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          workAttachmentDtoList: [],
+          // cwProjectReportArchiveReportDTOList: [],
+          cwProjectRecordsDTO: {
+            remarks: '',
+            projectNumber: '',
+            projectName: '',
+            officeId: '',
+            projectMoney: '',
+            auditYear: '',
+            planStartDate: '',
+            planEndDate: '',
+            projectMasterId: '',
+            projectLeaderId: '',
+            procInsId: '',
+            processDefinitionId: '',
+            status: '',
+            contractId: '',
+            realHeader: ''
+          },
+          fileNumber: '',
+          reportDate: '',
+          reportNo: '',
+          signatureAnnotator1: '',
+          signatureAnnotator1Name: '',
+          signatureAnnotator2: '',
+          signatureAnnotator2Name: '',
+          reportCreateName: '',
+          reportId: ''
+        },
+        keyWatch: '',
+        activeName: 'newRow',
+        tableKey: '',
+        tableKeyClient: '1',
+        visible: false
+      }
+    },
+    projectReportArchiveService: null,
+    reportCancellApplyArchivedService: null,
+    ReportCancellApplyService: null,
+    enterpriseSearchService: null,
+    created () {
+      this.projectReportArchiveService = new ProjectReportArchiveService()
+      this.reportCancellApplyArchivedService = new ReportCancellApplyArchivedService()
+      this.enterpriseSearchService = new EnterpriseSearchService()
+      this.reportCancellApplyService = new ReportCancellApplyService()
+    },
+    computed: {
+      bus: {
+        get () {
+          this.$refs.uploadComponent.setDividerName('附件', false)
+          return this.businessId
+        },
+        set (val) {
+          this.businessId = val
+        }
+      }
+    },
+    watch: {
+      'keyWatch': {
+        handler (newVal) {
+          if (this.commonJS.isNotEmpty(this.bus)) {
+            this.init('', this.bus)
+          } else {
+            this.$nextTick(() => {
+              this.$refs.inputForm.resetFields()
+            })
+          }
+        }
+      }
+    },
+    components: {
+      ProjectRecordsChooseCom,
+      UpLoadComponent,
+      UserSelect,
+      ReportCancellApplyChooseCom,
+      ReportChooseByProjectCom
+    },
+    methods: {
+      openContractForm () {
+        if (!this.commonJS.isEmpty(this.inputForm.contractId)) {
+          this.$refs.reportCancellApplyChooseCom.init()
+        } else {
+          this.$refs.reportCancellApplyChooseCom.init()
+        }
+      },
+      getUpload (p, index) {
+        p.then((list) => {
+          // list为返回数据
+          this.inputForm.cwProjectInfoList[index].cwFileInfoList = list
+          this.inputForm.cwProjectInfoList[index].fileNumber = list.length
+          this.tableKeyClient = Math.random()
+          // console.log('this.inputForm.cwFileInfoList', this.inputForm.cwFileInfoList)
+          // console.log('list.length', list.length)
+          // console.log(list)
+        })
+      },
+      getKeyWatch (keyWatch) {
+        this.keyWatch = keyWatch
+      },
+      init (method, id) {
+        this.visible = true
+        if (method === 'edit') {
+          this.title = '报告作废归档修改'
+          this.method = method
+        } else {
+          this.title = '报告作废归档详情'
+          this.method = 'view'
+        }
+        this.activeName = 'files'
+        this.projectReportArchiveService = new ProjectReportArchiveService()
+        this.reportCancellApplyArchivedService = new ReportCancellApplyArchivedService()
+        this.method = method
+        this.inputForm = {
+          id: '',
+          createDate: '',
+          createBy: {
+            id: '',
+            name: this.$store.state.user.name
+          },
+          remarks: '',
+          projectId: '',
+          auditedUnits: '',
+          reportNum: '',
+          papersNum: '',
+          year: '',
+          number: '',
+          isNumber: '',
+          auditDate: '',
+          carchivedType: '',
+          archiveId: '',  // 报告作废id
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          workAttachmentDtoList: [],
+          // cwProjectReportArchiveReportDTOList: [],
+          cwProjectRecordsDTO: {
+            remarks: '',
+            projectNumber: '',
+            projectName: '',
+            officeId: '',
+            projectMoney: '',
+            auditYear: '',
+            planStartDate: '',
+            planEndDate: '',
+            projectMasterId: '',
+            projectLeaderId: '',
+            procInsId: '',
+            processDefinitionId: '',
+            status: '',
+            contractId: '',
+            realHeader: ''
+          },
+          fileNumber: '',
+          reportDate: '',
+          reportNo: '',
+          signatureAnnotator1: '',
+          signatureAnnotator1Name: '',
+          signatureAnnotator2: '',
+          signatureAnnotator2Name: '',
+          reportCreateName: '',
+          reportId: ''
+        }
+        this.inputForm.id = id
+        this.loading = false
+        this.$nextTick(() => {
+          this.$refs.inputForm.resetFields()
+          this.loading = true
+          this.reportCancellApplyArchivedService.queryById(this.inputForm.id).then((data) => {
+            this.inputForm.id = id
+            this.$refs.uploadComponent.clearUpload()
+            this.inputForm = this.recover(this.inputForm, data)
+            this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+            if (this.commonJS.isEmpty(this.inputForm.workAttachmentDtoList)) {
+              this.inputForm.workAttachmentDtoList = []
+            }
+            if (this.commonJS.isEmpty(this.inputForm.createDate)) {
+              this.inputForm.createDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+            }
+            if (this.commonJS.isEmpty(this.inputForm.createBy.name)) {
+              this.inputForm.createBy.name = this.$store.state.user.name
+            }
+            if (this.commonJS.isEmpty(this.inputForm.officeId)) {
+              this.inputForm.officeId = this.$store.state.user.office.id
+            }
+            if (this.commonJS.isEmpty(this.inputForm.papersNum)) {
+              this.inputForm.papersNum = 0
+            }
+            if (this.commonJS.isEmpty(this.inputForm.reportNum)) {
+              this.inputForm.reportNum = 0
+            }
+            if (this.formReadOnly) {
+              this.method = 'view'
+            }
+            console.log('this.inputForm.id', data)
+            this.$refs.uploadComponent.newUpload(this.method, this.inputForm.workAttachmentDtoList, 'cw_project_archive', null, null, null, null, false)
+            this.loading = false
+          })
+        })
+      },
+      saveForm (callback) {
+        this.doSubmit('save', callback)
+      },
+      startForm (callback) {
+        this.doSubmit('start', callback)
+      },
+      async agreeForm (callback) {
+        await this.reportCancellApplyService.queryById(this.inputForm.id).then((data) => {
+          if (this.inputForm.status !== '2') { // 审核状态不是“待审核”,就弹出提示
+            this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+            throw new Error()
+          } else {
+            this.doSubmit('agree', callback)
+          }
+        })
+      },
+      // 表单提交
+      // 表单提交
+      doSubmit (status, callback) {
+        if (status === 'save') {
+          // 暂存
+          // this.inputForm.status = '1'
+          this.loading = true
+          // if (this.$refs.uploadComponent.checkProgress()) {
+          //   this.loading = false
+          //   return
+          // }
+          // this.inputForm.workAttachmentDtoList = this.$refs.uploadComponent.getDataList()
+          // this.inputForm.createDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+          let _this = this
+          if (_this.inputForm.isNumber !== _this.inputForm.number) {
+            _this.$message.error('“案卷号”与“确认案卷号”不一致,请重新填写')
+            _this.loading = false
+            throw new Error('“案卷号”与“确认案卷号”不一致,请重新填写')
+          }
+          _this.inputForm.workAttachmentDtoList = _this.$refs.uploadComponent.getDataList()
+          this.reportCancellApplyArchivedService.saveForm(this.inputForm).then((data) => {
+            // callback(data.businessTable, data.businessId, this.inputForm)
+            this.close()
+            this.loading = false
+          }).catch(() => {
+            this.loading = false
+          })
+          return
+        } else if (status === 'start') {
+          // 送审  待审核
+          this.inputForm.status = '2'
+        } else if (status === 'agree') {
+          // 审核同意
+          this.inputForm.agreeDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+          this.inputForm.agreeUserId = this.$store.state.user.id
+          this.inputForm.status = '5'
+        }
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            // if (this.$refs.uploadComponent.checkProgress()) {
+            //   this.loading = false
+            //   return
+            // }
+            // this.inputForm.workAttachmentDtoList = this.$refs.uploadComponent.getDataList()
+            if (this.commonJS.isEmpty(this.inputForm.createDate)) {
+              this.inputForm.createDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+            }
+            this.inputForm.cwProjectInfoList.forEach((item, index) => {
+              if (this.commonJS.isEmpty(this.inputForm.cwProjectInfoList[index].reportDate)) {
+                this.$message.error('报告日期不能为空')
+                this.loading = false
+                throw new Error('报告日期不能为空')
+              }
+              if (this.commonJS.isEmpty(this.inputForm.cwProjectInfoList[index].reportType)) {
+                this.$message.error('报告类型不能为空')
+                this.loading = false
+                throw new Error('报告类型不能为空')
+              }
+              if (this.commonJS.isEmpty(this.inputForm.cwProjectInfoList[index].opinionType)) {
+                this.$message.error('意见类型不能为空')
+                this.loading = false
+                throw new Error('意见类型不能为空')
+              }
+            })
+            projectReportService.saveForm(this.inputForm).then((data) => {
+              callback(data.businessTable, data.businessId, this.inputForm)
+              this.loading = false
+            }).catch(() => {
+              this.loading = false
+            })
+          }
+        })
+      },
+      async updateStatusById (type) {
+        if (type === 'reject' || type === 'reback') {
+          // if (await this.$refs.uploadComponent.checkProgress()) {
+          //   this.loading = false
+          //   throw new Error()
+          // }
+          await this.reportCancellApplyService.queryById(this.inputForm.id).then((data) => {
+            if (data.status !== '2') { // status的值不等于“审核中”就弹出提示
+              this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+              throw new Error()
+            } else {
+              if (type === 'reject') {
+                // 驳回
+                this.inputForm.status = '4'
+                let param = {status: '4', id: this.inputForm.id}
+                this.reportCancellApplyService.updateStatusById(param)
+              }
+              if (type === 'reback') {
+                // 撤回
+                let param = {status: '3', id: this.inputForm.id}
+                this.reportCancellApplyService.updateStatusById(param)
+              }
+            }
+          })
+        }
+      },
+      close () {
+        this.inputForm = {
+          id: '',
+          createDate: '',
+          createBy: {
+            id: '',
+            name: ''
+          },
+          remarks: '',
+          projectId: '',
+          auditedUnits: '',
+          reportNum: '',
+          papersNum: '',
+          year: '',
+          number: '',
+          isNumber: '',
+          auditDate: '',
+          carchivedType: '',
+          archiveId: '',  // 报告作废id
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          workAttachmentDtoList: [],
+          // cwProjectReportArchiveReportDTOList: [],
+          cwProjectRecordsDTO: {
+            remarks: '',
+            projectNumber: '',
+            projectName: '',
+            officeId: '',
+            projectMoney: '',
+            auditYear: '',
+            planStartDate: '',
+            planEndDate: '',
+            projectMasterId: '',
+            projectLeaderId: '',
+            procInsId: '',
+            processDefinitionId: '',
+            status: '',
+            contractId: '',
+            realHeader: ''
+          },
+          fileNumber: '',
+          reportDate: '',
+          reportNo: '',
+          signatureAnnotator1: '',
+          signatureAnnotator1Name: '',
+          signatureAnnotator2: '',
+          signatureAnnotator2Name: '',
+          reportCreateName: '',
+          reportId: ''
+        }
+        this.$refs.uploadComponent.clearUpload()
+        this.$refs.inputForm.resetFields()
+        this.inputForm.reportId = ''
+        this.inputForm.projectId = ''
+        this.visible = false
+      },
+      tabHandleClick (event) {
+        // console.log(event)
+      },
+      // 新增
+      // eslint-disable-next-line no-dupe-keys
+      // insertEvent (type) {
+      //   if (type === 'client') {
+      //     let d = {
+      //       no: '',
+      //       name: '',
+      //       companyLevel: ''
+      //     }
+      //     if (this.commonJS.isEmpty(this.inputForm.cwProjectClientInfoDTOList)) {
+      //       this.inputForm.cwProjectClientInfoDTOList = []
+      //     }
+      //     this.$refs.clientTable.insertAt(d)
+      //     this.inputForm.cwProjectClientInfoDTOList.push(d)
+      //     this.tableKeyClient = Math.random()
+      //   }
+      // },
+      clearClientList () {
+        // 项目直接对接联系人列表清除
+        this.inputForm.clientList = []
+        this.$forceUpdate()
+      },
+      // 删除
+      removeEvent (row, rowIndex, type) {
+        if (type === 'client') {
+          this.$refs.clientTable.remove(row)
+          // this.inputForm.cwProjectClientInfoDTOList.splice(rowIndex, 1)
+          this.inputForm.cwProjectInfoList.splice(rowIndex, 1)
+        }
+      },
+      getWorkClientChoose (list) {
+        if (this.commonJS.isEmpty(this.inputForm.cwProjectInfoList)) {
+          this.inputForm.cwProjectInfoList = []
+        }
+        let _this = this
+        let _list = list
+        const waitForEach = function () {
+          return new Promise(function (resolve, reject) {
+            _list.forEach((item) => {
+              _this.inputForm.cwProjectInfoList.forEach(client => {
+                if (item.id === client.servedUnitId) {
+                  // _this.$message.error('已存在客户 “' + client.servedUnitName + '”,请重新选择')
+                  // throw new Error('已存在客户 “' + client.servedUnitName + '”,请重新选择')
+                }
+              })
+            })
+            resolve()
+          })
+        }
+        waitForEach().then(() => {
+          list.forEach(item => {
+            // eslint-disable-next-line no-unused-vars
+            let d = {
+              servedUnitName: item.name, // 被服务单位名称
+              reportNumber: this.inputForm.projectNumber + '-0' + (this.inputForm.cwProjectInfoList.length + 1), // 报告流水号
+              issueReport: '是',
+              sealType: '未盖章',
+              id: this.uuid,
+              servedUnitId: item.id
+            }
+            // console.log('新增行数据填入')
+            // console.log('item', item)
+            // console.log('d', d)
+            this.$refs.clientTable.insertAt(d)
+            this.inputForm.cwProjectInfoList.push(d)
+            // console.log('this.inputForm.cwProjectInfoList', this.inputForm.cwProjectInfoList)
+            this.tableKeyClient = Math.random()
+          })
+        })
+      },
+      getContract (row) {
+        // console.log('row', row)
+        this.inputForm.projectName = row.projectName // 项目名称
+        this.inputForm.projectId = row.id // 项目id
+        this.inputForm.projectMasterName = row.projectMasterName // 项目经理
+        this.inputForm.reportNo = row.reportNo // 报告文号
+        this.inputForm.reportNewLineId = row.reportNewLineId // 新建行id
+        this.clearClientList()
+        this.$forceUpdate()
+      },
+      // 打开项目选择组件
+      openChooseProject (event) {
+        this.$refs.projectRecordsChooseCom.init()
+      },
+      // 项目选择结果获取
+      getProject (row) {
+        this.inputForm.projectId = row.id
+        this.inputForm.cwProjectRecordsDTO.projectName = row.projectName
+        this.inputForm.cwProjectRecordsDTO.projectNumber = row.projectNumber
+        this.inputForm.cwProjectRecordsDTO.projectMasterId = row.projectMasterId
+        this.inputForm.auditedUnitsName = ''
+        this.inputForm.auditedUnits = ''
+        this.inputForm.cwProjectReportArchiveReportDTOList = []
+      },
+      // 打开审计报告选择组件
+      openReportChoose () {
+        this.$refs.reportChooseByProjectCom.init(this.inputForm.projectId, this.inputForm.id)
+      },
+      // 审计报告选择结果获取
+      getReport (row) {
+        if (this.commonJS.isNotEmpty(row)) {
+          if (this.commonJS.isNotEmpty(row.reportId)) {
+            this.projectReportArchiveService.findReportUse(row.reportId).then((data) => {
+              if (data === false) {
+                this.inputForm.reportDate = row.reportDate
+                this.inputForm.reportNo = row.reportNo
+                this.inputForm.signatureAnnotator1 = row.signatureAnnotator1
+                this.inputForm.signatureAnnotator1Name = row.signatureAnnotator1Name
+                this.inputForm.signatureAnnotator2 = row.signatureAnnotator2
+                this.inputForm.signatureAnnotator2Name = row.signatureAnnotator2Name
+                this.inputForm.reportCreateName = row.createName
+                this.inputForm.reportId = row.reportId
+              } else {
+                this.$message.error('此报告正在归档中或已归档,请重新选择')
+              }
+            })
+          }
+        }
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-input-number .el-input__inner {
+    text-align: left;
+  }
+</style>

+ 708 - 0
src/views/cw/reportCancellApplyArchived/ReportCancellApplyArchivedList.vue

@@ -0,0 +1,708 @@
+<template>
+  <div class="page">
+    <el-form :inline="true" class="query-form m-b-10" v-if="searchVisible" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+      <!-- 搜索框-->
+      <el-form-item label="项目编号" prop="projectNumber">
+        <el-input v-model="searchForm.projectNumber" placeholder="请输入项目编号" clearable></el-input>
+      </el-form-item>
+      <el-form-item label="项目名称" prop="projectName">
+        <el-input v-model="searchForm.projectName" placeholder="请输入项目名称" clearable></el-input>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="项目经理1" prop="projectMasterName">
+        <UserSelect :limit='1' :userName="searchForm.projectMasterName" @getValue='(value, label) => {searchForm.projectMasterName = label}'></UserSelect>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="项目经理2" prop="projectMaster2Name">
+        <UserSelect :limit='1' :userName="searchForm.projectMaster2Name" @getValue='(value, label) => {searchForm.projectMaster2Name = label}'></UserSelect>
+      </el-form-item>
+<!--      <el-form-item label="创建人" prop="createBy">-->
+<!--        <el-input v-model="searchForm.createBy" placeholder="请输入创建人" clearable></el-input>-->
+<!--      </el-form-item>-->
+      <el-form-item v-if="showHideItem" label="创建人" prop="createBy">
+        <SelectUserTree
+          ref="companyTree"
+          :props="{
+                  value: 'id',             // ID字段名
+                  label: 'name',         // 显示名称
+                  children: 'children'    // 子级字段名
+                }"
+          :url="`/system-server/sys/user/treeUserDataAllOffice?type=2`"
+          :value="searchForm.createBy"
+          :clearable="true"
+          :accordion="true"
+		  size="default"
+          @getValue="(value) => {searchForm.createBy=value}"/>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="创建时间" prop="contractDates">
+        <el-date-picker
+          placement="bottom-start"
+          value-format="YYYY-MM-DD h:m:s"
+          v-model="searchForm.contractDates"
+          type="datetimerange"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期">
+        </el-date-picker>
+      </el-form-item>
+
+      <el-form-item label="作废归档状态" prop="status">
+        <el-select v-model="searchForm.applyFileType" placeholder="请选择报告作废归档状态" style="width:100%;" clearable>
+          <el-option
+            v-for="item in $dictUtils.getDictList('filed_type')"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="default" @click="showHide" :icon="showHideIcon">{{showHideName}}</el-button>
+        <el-button type="primary" @click="refreshList()" icon="el-icon-search">查询</el-button>
+        <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <div class="jp-table top" style="">
+      <vxe-toolbar :refresh="{query: refreshList}" ref="toolbarRef" export custom>
+<!--        <template #buttons>-->
+<!--          <el-button v-if="hasPermission('cw_work_client:info:add')" type="primary" icon="el-icon-plus" @click="start()">新建</el-button>-->
+<!--        </template>-->
+		  <template #tools>
+			  <vxe-button
+				  text
+				  type="primary"
+				  :title="searchVisible ? '收起检索' : '展开检索'"
+				  icon="vxe-icon-search"
+				  class="tool-btn"
+				  @click="searchVisible = !searchVisible"
+			  ></vxe-button>
+		  </template>
+      </vxe-toolbar>
+      <div style="height: calc(100% - 90px)">
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="auto"
+          :loading="loading"
+          ref="clientTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :print-config="{}"
+          :export-config="{
+                    remote: true,
+                    filename: `报告作废归档信息${moment(new Date()).format('YYYY-MM-DD')}`,
+                    sheetName: '报告作废归档信息',
+                    exportMethod: exportMethod,
+                    types: ['xlsx'],
+                    modes: ['current', 'selected', 'all']
+                  }"
+          :menu-config="{}"
+          @sort-change="sortChangeHandle"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :checkbox-config="{}">
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column min-width="160" align="center" title="单据编号" field="documentNo">
+            <template #default="scope">
+              <el-link  type="primary" :underline="false" v-if="hasPermission('cwProjectReport:list')" @click="view(scope.row.id)">{{scope.row.documentNo}}</el-link>
+              <el-link  type="primary" :underline="false" v-else-if="hasPermission('cwProjectReport:list')"  @click="view(scope.row.id,)">{{scope.row.documentNo}}</el-link>
+              <span v-else>{{scope.row.documentNo}}</span>
+            </template>
+          </vxe-column>
+          <vxe-column min-width="160" align="center" title="项目编号" field="projectNumber"></vxe-column>
+          <vxe-column min-width="160" align="center" title="项目名称" field="projectName"></vxe-column>
+          <vxe-column min-width="160" align="center" title="报告文号" field="reportNo">
+            <template #default="scope">
+              <el-link  type="primary" :underline="false" v-if="hasPermission('cwProjectReport:list')&&commonJS.isNotEmpty(scope.row.reportId)" @click="viewReport(scope.row.reportId)">{{scope.row.reportNo}}</el-link>
+              <el-link  type="primary" :underline="false" v-else-if="hasPermission('cwProjectReport:list')&&commonJS.isNotEmpty(scope.row.reportId)"  @click="viewReport(scope.row.reportId)">{{scope.row.reportNo}}</el-link>
+              <span v-else>{{scope.row.reportNo}}</span>
+            </template>
+          </vxe-column>
+          <vxe-column min-width="160" align="center" title="报告所属部门" field="departmentName"></vxe-column>
+          <vxe-column min-width="160" align="center" title="项目经理1" field="projectMasterName"></vxe-column>
+          <vxe-column min-width="160" align="center" title="项目经理2" field="projectMaster2Name"></vxe-column>
+          <vxe-column min-width="160" align="center" title="报告主办人" field="reportSponsor"></vxe-column>
+          <vxe-column min-width="160" align="center" title="创建人" field="userName"></vxe-column>
+          <vxe-column min-width="160" align="center" title="创建时间" field="createTime"></vxe-column>
+<!--          <vxe-column  min-width="150px"align="center" fixed="right" title="状态" field="status" >-->
+<!--            <template #default="scope">-->
+<!--              <el-button  text type="primary" @click="detail(scope.row)" effect="dark" -->
+<!--                          :type="$dictUtils.getDictLabel('cw_status_flag', scope.row.status, '-')">-->
+<!--                {{$dictUtils.getDictLabel("cw_status", scope.row.status, '-')}}-->
+<!--              </el-button>-->
+<!--            </template>-->
+<!--          </vxe-column>-->
+          <vxe-column  min-width="150px" align="center" fixed="right" title="作废归档状态" field="applyFileType" >
+            <template #default="scope">
+              <el-button  @click="detail(scope.row)" effect="dark"
+						  text
+                          :type="$dictUtils.getDictLabel('filed_type_status', scope.row.applyFileType, '')">
+                {{$dictUtils.getDictLabel("filed_type", scope.row.applyFileType, '-')}}
+              </el-button>
+<!--              <template slot-scope="scope">-->
+<!--                <el-button  text type="primary" @click="detailPaperFiled(scope.row)" :type="$dictUtils.getDictLabel('filed_type_status', scope.row.applyFileType, '-')" effect="dark" >{{$dictUtils.getDictLabel("filed_type", scope.row.applyFileType, '未归档')}} </el-button>-->
+<!--              </template>-->
+            </template>
+          </vxe-column>
+
+          <vxe-column title="操作" width="150px" fixed="right" align="center">
+            <template  #default="scope">
+              <el-button v-if="hasPermission('cw:cwProjectReport:filed')&&scope.row.createById === $store.state.user.id&&scope.row.status==='5'&& (scope.row.applyFileType === undefined || scope.row.applyFileType === '0')" text type="primary" @click="archived(scope.row)">归档</el-button>
+              <!--归档暂存修改-->
+              <el-button v-if="hasPermission('cw:cwProjectReport:filed') && scope.row.status === '5'  && scope.row.createId === $store.state.user.id && scope.row.applyFileType === '1'" text type="primary" @click="archived(scope.row)">修改</el-button>
+              <el-button v-else-if="hasPermission('cw:cwProjectReport:edit')&&isAdmin&&(scope.row.applyFileType==='1'||scope.row.applyFileType==='3'||scope.row.applyFileType==='5')" text type="primary"  @click="edit(scope.row.id)">修改</el-button>
+              <!--纸质归档撤回驳回修改-->
+              <el-button v-if="hasPermission('cw:cwProjectReport:filed') && scope.row.status === '5'  && scope.row.createId === $store.state.user.id && (scope.row.applyFileType === '3' )" text type="primary" @click="paperFiledAndClose(scope.row.id)">修改</el-button>
+              <!--纸质归档撤回-->
+              <el-button v-if="hasPermission('cw:cwProjectReport:back') && scope.row.status === '5' && scope.row.createId === $store.state.user.id && scope.row.applyFileType === '2'" text type="primary"  @click="rebackPaperFiled(scope.row)">撤回</el-button>
+<!--              <el-button v-else-if="hasPermission('cw:cwProjectReport:del')&&isAdmin&&(scope.row.applyFileType==='1'||scope.row.applyFileType==='3'||scope.row.applyFileType==='4'||scope.row.applyFileType==='5')" text type="primary"   @click="del(scope.row.id)">删除</el-button>-->
+<!--              审核-->
+              <el-button v-if="scope.row.applyFileType==='2' && checkIsAudit(scope.row)" text type="primary"  @click="examine(scope.row)">审核</el-button>
+<!--              被驳回后当前申请人重新调整-->
+              <el-button v-if="scope.row.createId === $store.state.user.id&&scope.row.applyFileType === '4'" text type="primary" @click="adjust(scope.row)">驳回调整</el-button>
+            </template>
+          </vxe-column>
+        </vxe-table>
+        <vxe-pager
+          background
+          :current-page="tablePage.currentPage"
+          :page-size="tablePage.pageSize"
+          :total="tablePage.total"
+          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+          @page-change="currentChangeHandle">
+        </vxe-pager>
+      </div>
+    </div>
+    <ReportManagementForm ref="reportManagementForm"></ReportManagementForm>
+    <ReportCancellApplyForm ref="reportCancellApplyForm"></ReportCancellApplyForm>
+  </div>
+</template>
+
+<script>
+  // import ProjectReportService from '@/api/cw/reportManagement/ProjectReportService'
+  // import ReportCancellApplyService from '@/api/cw/reportCancellApply/ReportCancellApplyService'
+  import ReportCancellApplyArchivedService from '@/api/cw/reportCancellApplyArchived/ReportCancellApplyArchivedService'
+  import taskService from '@/api/flowable/taskService'
+  import processService from '@/api/flowable/processService'
+  import ReportManagementForm from '../reportManagement/ReportManagementForm'
+  import ReportCancellApplyForm from './ReportCancellApplyArchivedForm'
+  // eslint-disable-next-line no-unused-vars
+  import pick from 'lodash.pick'
+  import userService from '@/api/sys/userService'
+  import SelectUserTree from '@/views/utils/treeUserSelect'
+  import UserSelect from '@/views/cw/workClientInfo/clientUserSelect'
+
+  export default {
+    data () {
+      return {
+		searchVisible: true,
+        showHideItem: false,
+        showHideIcon: 'el-icon-arrow-down',
+        showHideName: '展示',
+        searchForm: {
+          projectNumber: '',
+          projectName: '',
+          projectMasterId: '',
+          projectMaster2Id: '',
+          createBy: '',
+          contractDates: [],
+          projectMasterName: '', // 项目经理1
+          projectMaster2Name: '' // 项目经理2
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        tableKey: '',
+        loading: false,
+        processDefinitionAuditId: '',
+        procDefAuditKey: '',
+        isAdmin: false,
+        create: ''
+      }
+    },
+    // projectReportService: null,
+    reportCancellApplyService: null,
+    reportCancellApplyArchivedService: null,
+    created () {
+      // this.projectReportService = new ProjectReportService()
+      // this.reportCancellApplyService = new ReportCancellApplyService()
+      this.reportCancellApplyArchivedService = new ReportCancellApplyArchivedService()
+    },
+    components: {
+      ReportManagementForm,
+      ReportCancellApplyForm,
+      SelectUserTree,
+      UserSelect
+    },
+    computed: {
+      userName () {
+        return this.$store.state.user.name
+      },
+      user () {
+        this.createName = this.$store.state.user.name
+        return this.$store.state.user
+      }
+    },
+    mounted () {
+		this.$nextTick(() => {
+			//将表格和工具栏进行关联
+			const $table = this.$refs.clientTable;
+			const $toolbar = this.$refs.toolbarRef;
+			$table.connect($toolbar);
+		})
+      this.refreshList()
+    },
+    activated () {
+      this.refreshList()
+    },
+    methods: {
+      showHide () {
+        if (this.showHideItem === false) {
+          this.showHideItem = true
+          this.showHideIcon = 'el-icon-arrow-up'
+          this.showHideName = '隐藏'
+        } else {
+          this.showHideItem = false
+          this.showHideIcon = 'el-icon-arrow-down'
+          this.showHideName = '展示'
+        }
+      },
+      // 新增
+      add () {
+        // this.$refs.reportManagementForm.init('add', '')
+        this.$refs.reportCancellApplyForm.init('add', '')
+      },
+      // 修改
+      edit (id) {
+        id = id || this.$refs.clientTable.getCheckboxRecords().map(item => {
+          return item.id
+        })[0]
+        // this.$refs.reportManagementForm.init('edit', id)
+        this.$refs.reportCancellApplyForm.init('edit', id)
+      },
+      // 查看
+      view (id) {
+        // this.$refs.reportManagementForm.init('view', id)
+        this.$refs.reportCancellApplyForm.init('view', id)
+      },
+      // 根据报告id查看报告详情
+      viewReport (id) {
+        this.$refs.reportManagementForm.init('view', id)
+        // this.$refs.reportCancellApplyForm.init('view', id)
+      },
+      // 查询当前用户是否是管理员用户
+      checkIsAdmin () {
+        userService.is().then((data) => {
+          this.isAdmin = data
+        })
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        this.reportCancellApplyArchivedService.findList({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.tableKey = Math.random()
+          this.loading = false
+        })
+        // this.reportCancellApplyService.findList({
+        //   'current': this.tablePage.currentPage,
+        //   'size': this.tablePage.pageSize,
+        //   'orders': this.tablePage.orders,
+        //   ...this.searchForm
+        // }).then((data) => {
+        //   this.dataList = data.records
+        //   this.tablePage.total = data.total
+        //   this.tableKey = Math.random()
+        //   this.loading = false
+        // })
+        this.checkIsAdmin()
+        processService.getByName('会计-报告作废归档').then((data) => {
+          if (!this.commonJS.isEmpty(data.id)) {
+            this.processDefinitionAuditId = data.id
+            this.procDefAuditKey = data.key
+          }
+        })
+      },
+      // 当前页
+      currentChangeHandle ({ currentPage, pageSize }) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.refreshList()
+      },
+      // 排序
+      sortChangeHandle (column) {
+        this.tablePage.orders = []
+        if (column.order != null) {
+          this.tablePage.orders.push({column: this.$utils.toLine(column.property), asc: column.order === 'asc'})
+        }
+        this.refreshList()
+      },
+      // 删除
+      del (id) {
+        let ids = id || this.$refs.clientTable.getCheckboxRecords().map(item => {
+          return item.id
+        }).join(',')
+        this.$confirm(`确定删除所选项吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.loading = true
+          this.reportCancellApplyArchivedService.delete(ids).then((data) => {
+            this.$message.success(data)
+            this.refreshList()
+            this.loading = false
+          })
+          // this.reportCancellApplyService.delete(ids).then((data) => {
+          //   this.$message.success(data)
+          //   this.refreshList()
+          //   this.loading = false
+          // })
+        })
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      },
+      /* start () {
+        // 读取流程表单
+        let tabTitle = `发起流程【报告作废归档】`
+        let processTitle = `${this.userName} 在 ${this.moment(new Date()).format('YYYY-MM-DD HH:mm')} 发起了 [报告作废归档]`
+        taskService.getTaskDef({ procDefId: this.processDefinitionAuditId,
+          status: 'startAndHold'}).then((data) => {
+            this.$router.push({
+              path: '/flowable/task/TaskForm',
+              query: {
+                ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                procDefId: this.processDefinitionAuditId,
+                procDefKey: this.procDefAuditKey,
+                status: 'startAndHold',
+                title: tabTitle,
+                formType: data.formType,
+                formUrl: data.formUrl,
+                formTitle: processTitle,
+                businessId: 'false',
+                isShow: false,
+                routePath: '/cw/reportCancellApply/ReportCancellApplyList'
+              }
+            })
+          })
+      }, */
+      // 发起客户登记
+      /* push (row) {
+        // 读取流程表单
+        let title = `发起流程【报告作废归档】`
+        let processTitle = `${this.userName} 在 ${this.moment(new Date()).format('YYYY-MM-DD HH:mm')} 发起了[报告作废归档]`
+        let status = 'startAndHold'
+        if (row.status === '3' || row.status === '4') {
+          status = 'startAndClose'
+        }
+        taskService.getTaskDef({ procDefId: this.processDefinitionAuditId,
+          businessId: row.id,
+          businessTable: 'cw_project_report_cancell_apply'}).then((data) => {
+            this.$router.push({
+              path: '/flowable/task/TaskForm',
+              query: {
+                ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                procDefId: this.processDefinitionAuditId,
+                procDefKey: this.procDefAuditKey,
+                title: title,
+                formType: data.formType,
+                formUrl: data.formUrl,
+                formTitle: processTitle,
+                businessTable: 'cw_project_report_cancell_apply',
+                businessId: row.id,
+                isShow: 'false',
+                status: status,
+                routePath: '/cw/reportCancellApply/ReportCancellApplyList'
+              }
+            })
+          })
+      }, */
+      // 查看流程结果
+      detail (row) {
+        console.log('row', row)
+        if (row.applyFileType !== '0' && row.applyFileType !== '1') {
+          this.reportCancellApplyArchivedService.findByContractInfoId(row.id).then((data) => {
+            if (!this.commonJS.isEmpty(data.id)) {
+              console.log('data', data)
+              taskService.getTaskDef({
+                procInsId: data.cwProcInsId,
+                procDefId: data.cwProDefId
+              }).then((data) => {
+                this.$router.push({
+                  path: '/flowable/task/TaskFormDetail',
+                  query: {
+                    ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                    readOnly: true,
+                    title: '会计-报告作废归档流程详情',
+                    formTitle: '会计-报告作废归档流程详情',
+                    businessId: row.id
+                  }
+                })
+              })
+            }
+          })
+          // eslint-disable-next-line eqeqeq
+          // taskService.getTaskDef({
+          //   procInsId: row.cwProcInsId,
+          //   procDefId: row.cwProDefId
+          // }).then((data) => {
+          //   this.$router.push({
+          //     path: '/flowable/task/TaskFormDetail',
+          //     query: {
+          //       ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+          //       isShow: 'false',
+          //       readOnly: true,
+          //       title: '质控管理' + '流程详情',
+          //       formTitle: '质控管理' + '流程详情',
+          //       businessId: row.id,
+          //       status: 'reback'
+          //     }
+          //   })
+          // })
+        }
+      },
+      // 撤回报告流程
+      /* reback (row) {
+        this.$confirm(`确定要撤回该申请吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(async () => {
+          await this.reportCancellApplyService.queryById(row.id).then((data) => {
+            if (data.status !== '2') { // status的值不等于“审核中”,就弹出提示
+              this.$message.error('数据已发生改变或不存在,请刷新数据')
+              this.refreshList()
+            } else {
+              processService.revokeProcIns(row.procInsId).then((data) => {
+                let form = {status: '3', id: row.id}
+                this.reportCancellApplyService.updateStatusById(form)
+                this.$message.success(data)
+                this.refreshList()
+              })
+            }
+          })
+          // await this.projectReportService.queryById(row.id).then((data) => {
+          //   if (data.status !== '2') { // status的值不等于“审核中”,就弹出提示
+          //     this.$message.error('数据已发生改变或不存在,请刷新数据')
+          //     this.refreshList()
+          //   } else {
+          //     processService.revokeProcIns(row.procInsId).then((data) => {
+          //       let form = {status: '3', id: row.id}
+          //       this.projectReportService.updateStatusById(form)
+          //       this.$message.success(data)
+          //       this.refreshList()
+          //     })
+          //   }
+          // })
+        })
+      } */
+      // 报告作废归档
+      archived (row) {
+        processService.getByName('会计-报告作废归档').then((data) => {
+          if (!this.commonJS.isEmpty(data.id)) {
+            // console.log('data', data)
+            // 读取流程表单
+            let tabTitle = ' ' + row.reportNo + ' - ' + row.projectName
+            let processTitle = `${this.userName} 在 ${this.moment(new Date()).format('YYYY-MM-DD HH:mm')} 发起了 ` + tabTitle + '[会计-报告作废归档]'
+            taskService.getTaskDef({ procDefId: data.id,
+              businessId: row.id,
+              businessTable: 'cw_project_report_cancell_apply_archived',
+              status: 'startAndHoldFiled'}).then((reture) => {
+                this.$router.push({
+                  path: '/flowable/task/TaskForm',
+                  query: {
+                    ...pick(reture, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                    procDefId: data.id,
+                    procDefKey: data.key,
+                    status: 'startAndHoldFiled',
+                    title: tabTitle,
+                    formType: reture.formType,
+                    formUrl: reture.formUrl,
+                    formTitle: processTitle,
+                    businessTable: 'cw_project_report_cancell_apply_archived',
+                    businessId: row.id,
+                    isShow: false,
+                    routePath: '/cw/reportCancellApplyArchived/ReportCancellApplyArchivedList'
+                  }
+                })
+              })
+          }
+        })
+      },
+      // 归档撤回驳回修改
+      paperFiledAndClose (id) {
+        processService.getByName('会计-报告作废归档').then((data) => {
+          if (!this.commonJS.isEmpty(data.id)) {
+            // console.log('data', data)
+            // 读取流程表单
+            let tabTitle = `发起流程【会计-报告作废归档】`
+            let processTitle = `${this.userName} 在 ${this.moment(new Date()).format('YYYY-MM-DD HH:mm')} 发起了 [会计-报告作废归档]`
+            taskService.getTaskDef({ procDefId: data.id,
+              businessId: id,
+              businessTable: 'cw_project_report_cancell_apply_archived',
+              status: 'startAndCloseFiled'}).then((reture) => {
+                this.$router.push({
+                  path: '/flowable/task/TaskForm',
+                  query: {
+                    ...pick(reture, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                    procDefId: data.id,
+                    procDefKey: data.key,
+                    status: 'startAndCloseFiled',
+                    title: tabTitle,
+                    formType: reture.formType,
+                    formUrl: reture.formUrl,
+                    formTitle: processTitle,
+                    businessTable: 'cw_project_report_cancell_apply_archived',
+                    businessId: id,
+                    isShow: false,
+                    routePath: '/cw/reportCancellApplyArchived/ReportCancellApplyArchivedList'
+                  }
+                })
+              })
+          }
+        })
+      },
+      // 归档撤回
+      rebackPaperFiled (row) {
+        // console.log('row.taskFiledProcInsId' + row.taskFiledProcInsId)
+        this.$confirm(`确定撤回流程吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          processService.revokeProcIns(row.cwProcInsId).then((data) => {
+            // let form = {filedType: '3', id: row.id}
+            this.updateStatusById(row, 'rebackFiledPaper')
+            this.$message.success(data)
+            this.refreshList()
+          })
+        })
+      },
+      updateStatusById (row, type) {
+        if (type === 'rebackFiledPaper') {
+          row.applyFileType = '3'
+          this.reportCancellApplyArchivedService.updateStatusById(row)
+        }
+      },
+      // 归档详情
+      // detailPaperFiled (row) {
+      //   // console.log('row.id', row.id)
+      //   // eslint-disable-next-line eqeqeq
+      //   if (!this.commonJS.isEmpty(row.applyFileType) && row.applyFileType != '1') {
+      //     this.reportCancellApplyService.findByContractInfoId(row.id).then((data) => {
+      //       if (!this.commonJS.isEmpty(data.id)) {
+      //         // console.log('data', data)
+      //         taskService.getTaskDef({
+      //           procInsId: data.cwProcInsId,
+      //           procDefId: data.cwProDefId
+      //         }).then((data) => {
+      //           this.$router.push({
+      //             path: '/flowable/task/TaskFormDetail',
+      //             query: {
+      //               readOnly: true,
+      //               title: '纸质归档流程详情',
+      //               formTitle: '纸质归档流程详情',
+      //               businessId: row.id,
+      //               ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title')}
+      //           })
+      //         })
+      //       }
+      //     })
+      //   }
+      // }
+      // 驳回后调整
+      adjust (row) {
+        this.reportCancellApplyArchivedService.queryById(row.id).then((data) => {
+          if (data.applyFileType !== '4') { // status的值不等于“驳回”,就弹出提示
+            this.$message.error('数据已发生改变或不存在,请刷新数据')
+            this.refreshList()
+          } else {
+            this.todo(row)
+          }
+        })
+      },
+      // 审核
+      examine (row) {
+        this.reportCancellApplyArchivedService.queryById(row.id).then((data) => {
+          if (data.applyFileType !== '2') { // status的值不等于“审核中”,就弹出提示
+            this.$message.error('数据已发生改变或不存在,请刷新数据')
+            this.refreshList()
+          } else {
+            this.todo(row)
+          }
+        })
+      },
+      // 审核或重新调整跳转
+      todo (row) {
+        let cUser = false
+        taskService.getTaskDefInfo({
+          taskId: row.archivedTaskId
+        }).then((data) => {
+          this.$router.push({
+            path: '/flowable/task/TaskForm',
+            query: {
+              ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title', 'businessId'),
+              isShow: false,
+              formReadOnly: true,
+              formTitle: `${data.taskName}`,
+              cUser: cUser,
+              title: `审批【${data.taskName || ''}】`,
+              routePath: '/cw/reportCancellApplyArchived/ReportCancellApplyArchivedList'   // 数据处理后需要跳转的页面路径
+            }
+          })
+        })
+      },
+      // 查询当前登录人是否是数据的审核人
+      checkIsAudit (row) {
+        let loginUserId = this.$store.state.user.id  // 获取当前登录用户id
+        if (this.commonJS.isNotEmpty(row.auditUserIdsArchived)) {
+          for (const userId of row.auditUserIdsArchived) {
+            if (userId === loginUserId) {  // 当数据的审核人中包含当前登录人id时,返回true
+              return true
+            }
+          }
+        }
+        return false
+      },
+      // 自定义服务端导出
+      exportMethod ({ options }) {
+        // 传给服务端的参数
+        const params = {
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm,
+          filename: options.filename,
+          sheetName: options.sheetName,
+          isHeader: options.isHeader,
+          original: options.original,
+          mode: options.mode,
+          selectIds: options.mode === 'selected' ? options.map(item => item.id) : [],
+          exportFields: options.columns.map(column => column.property)
+        }
+        return this.reportCancellApplyArchivedService.exportExcel(params).then((res) => {
+          // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(res, options.filename)
+        }).catch(function (err) {
+          if (err.response) {
+            // console.log(err.response)
+          }
+        })
+      }
+    }
+  }
+</script>

+ 833 - 0
src/views/cw/reportCancellApplyArchived/ReportCancellApplyArchivedTaskForm.vue

@@ -0,0 +1,833 @@
+<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
+  <div>
+    <el-row>
+      <el-col :span="24">
+
+        <el-form :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="status === 'audit' || status === 'taskFormDetail'"
+                 label-width="135px" @submit.native.prevent>
+          <el-row  :gutter="15">
+<!--            <el-col :span="12">-->
+<!--              <el-form-item label="档案名称" prop="name"-->
+<!--                            :rules="[-->
+<!--                                {required: true, message:'档案名称不能为空', trigger:'blur'}-->
+<!--                   ]">-->
+<!--                <el-input v-model="inputForm.name" placeholder="请填写档案名称" clearable></el-input>-->
+<!--              </el-form-item>-->
+<!--            </el-col>-->
+<!--            <el-col :span="12">-->
+<!--              <el-form-item label="档案号" prop="fileNumber"-->
+<!--                            :rules="[-->
+<!--                   ]">-->
+<!--                <el-input :disabled="true" v-model="inputForm.fileNumber" placeholder="请填写档案号" clearable></el-input>-->
+<!--              </el-form-item>-->
+<!--            </el-col>-->
+            <el-col :span="12">
+              <el-form-item label="项目名称" prop="cwProjectRecordsDTO.projectName"
+                            :rules="[
+                                {required: true, message:'项目名称不能为空', trigger:'blur'},
+                                {required: true, message:'项目名称不能为空', trigger:'change'}
+                   ]">
+                <el-input :disabled="true" :readonly="true" v-model="inputForm.cwProjectRecordsDTO.projectName" placeholder="请填写项目名称" clearable>
+                  <el-button :disabled="true" slot="append" @click="openChooseProject" icon="el-icon-search"></el-button>
+                </el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="项目编号" prop="cwProjectRecordsDTO.projectNumber"
+                            :rules="[
+                   ]">
+                <el-input :disabled="true" v-model="inputForm.cwProjectRecordsDTO.projectNumber" placeholder="请填写项目编号" clearable></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="项目经理1" prop="cwProjectRecordsDTO.projectMasterId"
+                            :rules="[
+                   ]">
+                <!--                    <el-input v-model="inputForm.projectMasterId" placeholder="请填写项目经理" clearable></el-input>-->
+                <UserSelect :disabled="true" :limit='1' :modelValue="inputForm.cwProjectRecordsDTO.projectMasterId" @update:modelValue='(value) => {inputForm.cwProjectRecordsDTO.projectMasterId = value}'></UserSelect>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="项目经理2" prop="cwProjectRecordsDTO.realHeader"
+                            :rules="[
+                   ]">
+                <!--                    <el-input v-model="inputForm.projectMasterId" placeholder="请填写项目经理" clearable></el-input>-->
+                <UserSelect :disabled="true" :limit='1' :modelValue="inputForm.cwProjectRecordsDTO.realHeader" @update:modelValue='(value) => {inputForm.cwProjectRecordsDTO.realHeader = value}'></UserSelect>
+              </el-form-item>
+            </el-col>
+<!--            <el-col :span="12">-->
+<!--              <el-form-item label="被审计单位" prop="auditedUnitsName"-->
+<!--                            :rules="[-->
+<!--                                {required: true, message:'被审计单位不能为空', trigger:'blur'},-->
+<!--                                {required: true, message:'被审计单位不能为空', trigger:'change'}-->
+<!--                   ]">-->
+<!--                <el-input :readonly="true" v-model="inputForm.auditedUnitsName" @focus="openChooseClient" placeholder="请填写被审计单位" clearable>-->
+<!--                  <el-button slot="append" :disabled="status === 'audit' || status === 'taskFormDetail'" @click="openChooseClient" icon="el-icon-search"></el-button>-->
+<!--                </el-input>-->
+<!--              </el-form-item>-->
+<!--            </el-col>-->
+            <el-col :span="12">
+              <el-form-item label="报告册数" prop="reportNum"
+                            :rules="[
+                                {required: true, message:'报告册数不能为空', trigger:'blur'}
+                   ]">
+                <el-input-number
+                  v-model="inputForm.reportNum"
+                  controls-position="right"
+                  style="width:100%"
+                  :precision="0"
+                  :max="9999999999"
+                  :step="1"
+                  :min="0"
+                  placeholder="请填写报告册数"
+                  :controls="false"
+                  clearable>
+                </el-input-number>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="底稿册数" prop="papersNum"
+                            :rules="[
+                                {required: true, message:'底稿册数不能为空', trigger:'blur'}
+                   ]">
+                <el-input-number
+                  v-model="inputForm.papersNum"
+                  controls-position="right"
+                  style="width:100%"
+                  :precision="0"
+                  :max="9999999999"
+                  :step="1"
+                  :min="0"
+                  placeholder="请填写底稿册数"
+                  :controls="false"
+                  clearable>
+                </el-input-number>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="档案年度" prop="year"
+                            :rules="[
+                                {required: true, message:'档案年度不能为空', trigger:'blur'}
+                   ]">
+                <el-date-picker
+                  v-model="inputForm.year"
+                  type="year"
+                  value-format="YYYY"
+                  placeholder="选择档案年度"
+                  style="width:100%"
+                  placement="bottom-start"
+                  :clearable="false">
+                </el-date-picker>
+              </el-form-item>
+            </el-col>
+            <el-col v-if="status !== 'audit'" :span="12">
+              <el-form-item label="案卷号" prop="number"
+                            :rules="[
+                   ]">
+                <el-input :disabled="true" v-model="inputForm.number" placeholder="请填写案卷号" clearable></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col v-if="status !== 'audit'" :span="12">
+              <el-form-item label="确认案卷号" prop="isNumber"
+                            :rules="[
+                   ]">
+                <el-input :disabled="true" v-model="inputForm.isNumber" placeholder="请填写确认案卷号" clearable></el-input>
+              </el-form-item>
+            </el-col>
+            <el-form v-if="status === 'audit'" style="width: 100%;" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"
+                     label-width="135px" @submit.native.prevent>
+              <el-col :span="12">
+                <el-form-item label="案卷号" prop="number"
+                              :rules="[
+                   ]">
+                  <el-input :disabled="false" v-model="inputForm.number" placeholder="请填写案卷号" clearable></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="确认案卷号" prop="isNumber"
+                              :rules="[
+                   ]">
+                  <el-input :disabled="false" v-model="inputForm.isNumber" placeholder="请填写确认案卷号" clearable></el-input>
+                </el-form-item>
+              </el-col>
+            </el-form>
+            <el-col :span="12">
+              <el-form-item label="归档时间" prop="auditDate"
+                            :rules="[
+                   ]">
+                <el-input :disabled="true" v-model="inputForm.auditDate" placeholder="请填写归档时间" clearable></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="归档类型" prop="carchivedType"
+                            :rules="[
+                   ]">
+                <el-select v-model="inputForm.carchivedType" placeholder="请选择归档类型" style="width:100%;">
+                  <el-option
+                    v-for="item in $dictUtils.getDictList('cw_carchived_type')"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value">
+                  </el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="备注" prop="remarks"
+                            :rules="[
+                   ]">
+                <el-input type="textarea" style="width:100%" maxlength="1000" v-model="inputForm.remarks" placeholder="请填写备注" show-word-limit></el-input>
+
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="申请人" prop="createBy.name"
+                            :rules="[
+                   ]">
+                <el-input :disabled="true" v-model="inputForm.createBy.name" placeholder="请填写创建人" clearable></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="申请时间" prop="createDate"
+                            :rules="[
+                   ]">
+                <el-input :disabled="true" v-model="inputForm.createDate" placeholder="请填写创建时间" clearable></el-input>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-divider content-position="left"><i class="el-icon-document"></i> 审计报告</el-divider>
+          <el-row :gutter="15">
+            <el-col :span="12">
+              <el-form-item label="报告文号" prop="reportNo"
+                            :rules="[
+                                {required: true, message:'报告文号不能为空', trigger:'blur'},
+                                {required: true, message:'报告文号不能为空', trigger:'change'}
+                   ]">
+                <el-input :disabled="true" :readonly="true" v-model="inputForm.reportNo" placeholder="请填写报告文号" clearable>
+                  <el-button :disabled="true" slot="append" @click="openReportChoose" icon="el-icon-search"></el-button>
+                </el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="报告日期" prop="reportDate"
+                            :rules="[
+                   ]">
+                <el-input :disabled="true" v-model="inputForm.reportDate" placeholder="请填写报告日期" clearable></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="签字注师1" prop="signatureAnnotator1Name"
+                            :rules="[
+                   ]">
+                <el-input :disabled="true" v-model="inputForm.signatureAnnotator1Name" placeholder="请填写签字注师1" clearable></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="签字注师2" prop="signatureAnnotator2Name"
+                            :rules="[
+                   ]">
+                <el-input :disabled="true" v-model="inputForm.signatureAnnotator2Name" placeholder="请填写签字注师2" clearable></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="报告主办人" prop="reportCreateName"
+                            :rules="[
+                   ]">
+                <el-input :disabled="true" v-model="inputForm.reportCreateName" placeholder="请填写报告主办人" clearable></el-input>
+              </el-form-item>
+            </el-col>
+            <el-form :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''" :disabled="status !== 'audit'"
+                     label-width="135px" @submit.native.prevent>
+              <el-col :span="24">
+                <el-form-item label="审计意见" prop="reportRemarks"
+                              :rules="[
+                   ]">
+                  <el-input type="textarea"  style="width:100%" maxlength="225" v-model="inputForm.reportRemarks" placeholder="请填写审计意见" show-word-limit></el-input>
+
+                </el-form-item>
+              </el-col>
+            </el-form>
+          </el-row>
+        </el-form>
+        <el-tabs v-model="activeName" type="border-card" @tab-click="tabHandleClick">
+          <el-tab-pane label="附件" name="files">
+            <!--        附件-->
+            <UpLoadComponent ref="uploadComponent"></UpLoadComponent>
+          </el-tab-pane>
+
+        </el-tabs>
+      </el-col>
+    </el-row>
+    <ProjectRecordsChooseCom ref="projectRecordsChooseCom" @getProject="getProject"></ProjectRecordsChooseCom>
+<!--    <WorkClientChooseByProjectCom ref="workClientChooseByProjectCom" @getClient="getClient"></WorkClientChooseByProjectCom>-->
+    <ReportChooseByProjectCom ref="reportChooseByProjectCom" @getReport="getReport"></ReportChooseByProjectCom>
+  </div>
+</template>
+
+<script>
+  import UpLoadComponent from '@/views/common/UpLoadComponent'
+  import UserSelect from '@/components/userSelect'
+  import ProjectReportArchiveService from '@/api/cw/projectRecords/ProjectReportArchiveService'
+  import ReportCancellApplyArchivedService from '@/api/cw/reportCancellApplyArchived/ReportCancellApplyArchivedService'
+  import ProjectRecordsChooseCom from '@/views/cw/projectRecords/ProjectRecordsChooseCom'
+  // import WorkClientChooseByProjectCom from '@/views/modules/cw/projectReportArchive/WorkClientChooseByProjectCom'
+  import ReportChooseByProjectCom from '@/views/cw/projectReportArchive/ReportChooseByProjectCom'
+  export default {
+    props: {
+      businessId: {
+        type: String,
+        default: ''
+      },
+      formReadOnly: {
+        type: Boolean,
+        default: false
+      },
+      status: {
+        type: String,
+        default: ''
+      }
+    },
+    data () {
+      return {
+        title: '',
+        method: '',
+        loading: false,
+        inputForm: {
+          reportRemarks: '',
+          id: '',
+          createDate: '',
+          createBy: {
+            id: '',
+            name: ''
+          },
+          remarks: '',
+          projectId: '',
+          auditedUnits: '',
+          reportNum: '',
+          papersNum: '',
+          year: '',
+          number: '',
+          isNumber: '',
+          auditDate: '',
+          carchivedType: '',
+          archiveId: '',  // 报告作废id
+          procInsId: '',
+          processDefinitionId: '',
+          applyFileType: '',
+          workAttachmentDtoList: [],
+          // cwProjectReportArchiveReportDTOList: [],
+          cwProjectRecordsDTO: {
+            remarks: '',
+            projectNumber: '',
+            projectName: '',
+            officeId: '',
+            projectMoney: '',
+            auditYear: '',
+            planStartDate: '',
+            planEndDate: '',
+            projectMasterId: '',
+            projectLeaderId: '',
+            procInsId: '',
+            processDefinitionId: '',
+            applyFileType: '',
+            contractId: '',
+            realHeader: ''
+          },
+          fileNumber: '',
+          reportDate: '',
+          reportNo: '',
+          signatureAnnotator1: '',
+          signatureAnnotator1Name: '',
+          signatureAnnotator2: '',
+          signatureAnnotator2Name: '',
+          reportCreateName: '',
+          reportId: ''
+        },
+        keyWatch: '',
+        activeName: 'files',
+        tableKeyReport: ''
+      }
+    },
+    projectReportArchiveService: null,
+    reportCancellApplyArchivedService: null,
+    created () {
+      this.projectReportArchiveService = new ProjectReportArchiveService()
+      this.reportCancellApplyArchivedService = new ReportCancellApplyArchivedService()
+    },
+    computed: {
+      bus: {
+        get () {
+          this.$refs.uploadComponent.setDividerName('附件', false)
+          return this.businessId
+        },
+        set (val) {
+          this.businessId = val
+        }
+      }
+    },
+    watch: {
+      'keyWatch': {
+        handler (newVal) {
+          if (this.commonJS.isNotEmpty(this.bus)) {
+            this.init('', this.bus)
+          } else {
+            this.$nextTick(() => {
+              this.$refs.inputForm.resetFields()
+            })
+          }
+        }
+      },
+      'loading': {
+        handler (newVal) {
+          this.$emit('changeLoading', newVal)
+          this.$refs.uploadComponent.changeLoading(newVal)
+        }
+      }
+    },
+    components: {
+      UpLoadComponent,
+      UserSelect,
+      ProjectRecordsChooseCom,
+      // WorkClientChooseByProjectCom,
+      ReportChooseByProjectCom
+    },
+    methods: {
+      getKeyWatch (keyWatch) {
+        this.keyWatch = keyWatch
+      },
+      init (method, id) {
+        this.activeName = 'files'
+        this.projectReportArchiveService = new ProjectReportArchiveService()
+        this.reportCancellApplyArchivedService = new ReportCancellApplyArchivedService()
+        this.method = method
+        this.inputForm = {
+          reportRemarks: '',
+          id: '',
+          createDate: '',
+          createBy: {
+            id: '',
+            name: this.$store.state.user.name
+          },
+          remarks: '',
+          projectId: '',
+          auditedUnits: '',
+          reportNum: '',
+          papersNum: '',
+          year: '',
+          number: '',
+          isNumber: '',
+          auditDate: '',
+          carchivedType: '',
+          archiveId: '',  // 报告作废id
+          procInsId: '',
+          processDefinitionId: '',
+          applyFileType: '',
+          workAttachmentDtoList: [],
+          // cwProjectReportArchiveReportDTOList: [],
+          cwProjectRecordsDTO: {
+            remarks: '',
+            projectNumber: '',
+            projectName: '',
+            officeId: '',
+            projectMoney: '',
+            auditYear: '',
+            planStartDate: '',
+            planEndDate: '',
+            projectMasterId: '',
+            projectLeaderId: '',
+            procInsId: '',
+            processDefinitionId: '',
+            applyFileType: '',
+            contractId: '',
+            realHeader: ''
+          },
+          fileNumber: '',
+          reportDate: '',
+          reportNo: '',
+          signatureAnnotator1: '',
+          signatureAnnotator1Name: '',
+          signatureAnnotator2: '',
+          signatureAnnotator2Name: '',
+          reportCreateName: '',
+          reportId: ''
+        }
+        this.inputForm.id = id
+        this.loading = false
+        this.$nextTick(() => {
+          this.$refs.inputForm.resetFields()
+          this.loading = true
+          this.reportCancellApplyArchivedService.queryById(this.inputForm.id).then((data) => {
+            // this.inputForm.id = id
+            this.$refs.uploadComponent.clearUpload()
+            this.inputForm = this.recover(this.inputForm, data)
+            this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+            this.inputForm.id = id
+            if (this.commonJS.isEmpty(this.inputForm.workAttachmentDtoList)) {
+              this.inputForm.workAttachmentDtoList = []
+            }
+            if (this.commonJS.isEmpty(this.inputForm.createDate)) {
+              this.inputForm.createDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+            }
+            if (this.commonJS.isEmpty(this.inputForm.createBy.name)) {
+              this.inputForm.createBy.name = this.$store.state.user.name
+            }
+            if (this.commonJS.isEmpty(this.inputForm.officeId)) {
+              this.inputForm.officeId = this.$store.state.user.office.id
+            }
+            if (this.commonJS.isEmpty(this.inputForm.papersNum)) {
+              this.inputForm.papersNum = 0
+            }
+            if (this.commonJS.isEmpty(this.inputForm.reportNum)) {
+              this.inputForm.reportNum = 0
+            }
+            if (this.status === 'audit' || this.status === 'taskFormDetail') {
+              this.method = 'view'
+            }
+            this.$refs.uploadComponent.newUpload(this.method, this.inputForm.workAttachmentDtoList, 'cw_project_archive', null, null, null, null, false)
+            this.loading = false
+          })
+        })
+      },
+      saveForm (callback) {
+        this.doSubmit('save', callback)
+      },
+      startForm (callback) {
+        this.loading = true
+        this.reportCancellApplyArchivedService.queryById(this.inputForm.id).then((data) => {
+          if (this.commonJS.isNotEmpty(data.applyFileType) && data.applyFileType !== '0' && data.applyFileType !== '1' && data.applyFileType !== '3') { // 审核状态不是“未发起”或“暂存”或“撤回”,就弹出提示
+            this.loading = false
+            this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+            throw new Error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+          } else {
+            this.doSubmit('start', callback)
+          }
+        })
+      },
+      async agreeForm (callback) {
+        this.loading = true
+        await this.reportCancellApplyArchivedService.queryById(this.inputForm.id).then((data) => {
+          if (data.applyFileType !== '2') { // 审核状态不是“待审核”,就弹出提示
+            this.loading = false
+            this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+            throw new Error()
+          } else {
+            this.doSubmit('agree', callback)
+          }
+        })
+      },
+      reapplyForm (callback) {
+        this.loading = true
+        this.reportCancellApplyArchivedService.queryById(this.inputForm.id).then((data) => {
+          if (data.applyFileType !== '4') { // 审核状态不是“驳回”,就弹出提示
+            this.loading = false
+            this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+            throw new Error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+          } else {
+            this.doSubmit('reapply', callback)
+          }
+        })
+      },
+      // 表单提交
+      doSubmit (status, callback) {
+        if (status === 'save') {
+          // 暂存
+          this.inputForm.applyFileType = '1'
+          this.loading = true
+          if (this.$refs.uploadComponent.checkProgress()) {
+            this.loading = false
+            return
+          }
+          this.inputForm.workAttachmentDtoList = this.$refs.uploadComponent.getDataList()
+          // this.$refs.uploadComponent.getDataList().then((list) => {
+          //   // list为返回数据
+          //   this.inputForm.workAttachmentDtoList = list
+          // })
+          this.inputForm.createDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+          this.reportCancellApplyArchivedService.saveForm(this.inputForm).then((data) => {
+            callback(data.businessTable, data.businessId, this.inputForm)
+            this.loading = false
+          }).catch(() => {
+            this.loading = false
+          })
+          return
+        } else if (status === 'start') {
+          // 送审  待审核
+          this.inputForm.applyFileType = '2'
+        } else if (status === 'reapply') {
+          this.inputForm.applyFileType = '2'
+        }
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            if (this.$refs.uploadComponent.checkProgress()) {
+              this.loading = false
+              throw new Error()
+            } else {
+              let _this = this
+              const wait = function () {
+                return new Promise(async (resolve, reject) => {
+                  if (status === 'agree') {
+                    // 审核同意
+                    _this.inputForm.auditDate = _this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+                    // this.inputForm.agreeUserId = this.$store.state.user.id
+                    _this.inputForm.applyFileType = '5'
+                    if (_this.inputForm.isNumber !== _this.inputForm.number) {
+                      _this.$message.error('“案卷号”与“确认案卷号”不一致,请重新填写')
+                      _this.loading = false
+                      throw new Error('“案卷号”与“确认案卷号”不一致,请重新填写')
+                    }
+                  }
+                  _this.inputForm.workAttachmentDtoList = _this.$refs.uploadComponent.getDataList()
+                  // await _this.$refs.uploadComponent.getDataList().then((list) => {
+                  //   // list为返回数据
+                  //   _this.inputForm.workAttachmentDtoList = list
+                  //   list.forEach(item => {
+                  //     if (_this.commonJS.isEmpty(item.fileType)) {
+                  //       _this.$message.error('附件中的文件类型不可以为空')
+                  //       _this.loading = false
+                  //       throw new Error('附件中的文件类型不可以为空')
+                  //     }
+                  //   })
+                  // })
+                  if (_this.commonJS.isEmpty(_this.inputForm.createDate)) {
+                    _this.inputForm.createDate = _this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+                  }
+                  resolve()
+                })
+              }
+              wait().then(() => {
+                this.reportCancellApplyArchivedService.saveForm(this.inputForm).then((data) => {
+                  callback(data.businessTable, data.businessId, this.inputForm)
+                  this.loading = false
+                }).catch(() => {
+                  this.loading = false
+                  throw new Error()
+                })
+              })
+            }
+          } else {
+            this.loading = false
+          }
+        })
+      },
+      async updateStatusById (type, callback) {
+        this.loading = true
+        if (await this.$refs.uploadComponent.checkProgress()) {
+          this.loading = false
+          throw new Error()
+        } else {
+          if (type === 'reject' || type === 'reback') {
+            this.reportCancellApplyArchivedService.queryById(this.inputForm.id).then((data) => {
+              if (data.applyFileType !== '2') { // status的值不等于“审核中”就弹出提示
+                this.loading = false
+                this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+                throw new Error()
+              } else {
+                if (type === 'reject') {
+                  // 驳回
+                  this.inputForm.applyFileType = '4'
+                  let param = {applyFileType: '4', id: this.inputForm.id}
+                  this.reportCancellApplyArchivedService.updateStatusById(param).then(() => {
+                    this.loading = false
+                    callback()
+                  })
+                  // this.projectRecordsService.updateStatusById(param)
+                }
+                // if (type === 'reject') {
+                //   if (this.inputForm.isNumber !== this.inputForm.number) {
+                //     this.$message.error('“案卷号”与“确认案卷号”不一致,请重新填写')
+                //     this.loading = false
+                //     throw new Error('“案卷号”与“确认案卷号”不一致,请重新填写')
+                //   } else {
+                //     // 驳回
+                //     let _this = this
+                //     const wait = function () {
+                //       return new Promise(function (resolve, reject) {
+                //         _this.inputForm.applyFileType = '4'
+                //         _this.loading = true
+                //         if (_this.$refs.uploadComponent.checkProgress()) {
+                //           _this.loading = false
+                //           reject(new Error())
+                //         }
+                //         _this.$refs.uploadComponent.getDataList().then((list) => {
+                //           // list为返回数据
+                //           _this.inputForm.workAttachmentDtoList = list
+                //         })
+                //         resolve()
+                //       })
+                //     }
+                //     wait().then(() => {
+                //       this.reportCancellApplyArchivedService.saveForm(this.inputForm).then((data) => {
+                //         this.loading = false
+                //       }).catch(() => {
+                //         this.loading = false
+                //       })
+                //     }).catch(() => {
+                //       this.loading = false
+                //     })
+                //   }
+                // }
+                if (type === 'reback') {
+                  // 撤回
+                  let param = {applyFileType: '3', id: this.inputForm.id}
+                  this.projectReportArchiveService.updateStatusById(param)
+                }
+              }
+            })
+          } else if (type === 'hold') {
+            this.reportCancellApplyArchivedService.queryById(this.inputForm.id).then((data) => {
+              if (data.applyFileType !== '4') { // status的值不等于“驳回”就弹出提示
+                this.loading = false
+                this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+                throw new Error()
+              } else {
+                // 终止
+                let param = {applyFileType: '1', id: this.inputForm.id}
+                this.reportCancellApplyArchivedService.updateStatusById(param).then(() => {
+                  this.loading = false
+                  callback()
+                })
+              }
+            })
+          }
+        }
+      },
+      close () {
+        this.inputForm = {
+          reportRemarks: '',
+          id: '',
+          createDate: '',
+          createBy: {
+            id: '',
+            name: ''
+          },
+          remarks: '',
+          projectId: '',
+          auditedUnits: '',
+          reportNum: '',
+          papersNum: '',
+          year: '',
+          number: '',
+          isNumber: '',
+          auditDate: '',
+          carchivedType: '',
+          archiveId: '',  // 报告作废id
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          workAttachmentDtoList: [],
+          // cwProjectReportArchiveReportDTOList: [],
+          cwProjectRecordsDTO: {
+            remarks: '',
+            projectNumber: '',
+            projectName: '',
+            officeId: '',
+            projectMoney: '',
+            auditYear: '',
+            planStartDate: '',
+            planEndDate: '',
+            projectMasterId: '',
+            projectLeaderId: '',
+            procInsId: '',
+            processDefinitionId: '',
+            status: '',
+            contractId: '',
+            realHeader: ''
+          },
+          fileNumber: '',
+          reportDate: '',
+          reportNo: '',
+          signatureAnnotator1: '',
+          signatureAnnotator1Name: '',
+          signatureAnnotator2: '',
+          signatureAnnotator2Name: '',
+          reportCreateName: '',
+          reportId: ''
+        }
+        this.$refs.uploadComponent.clearUpload()
+        this.$refs.inputForm.resetFields()
+        this.inputForm.reportId = ''
+        this.inputForm.projectId = ''
+      },
+      tabHandleClick (event) {
+        // console.log(event)
+      },
+      // 新增
+      // eslint-disable-next-line no-dupe-keys
+      insertEvent (type) {
+      },
+      // 删除
+      removeEvent (row, rowIndex, type) {
+        if (type === 'report') {
+          this.$refs.reportTable.remove(row)
+          // this.inputForm.cwProjectReportArchiveReportDTOList.splice(rowIndex, 1)
+        }
+      },
+      // 打开项目选择组件
+      openChooseProject (event) {
+        this.$refs.projectRecordsChooseCom.init()
+        // if (this.commonJS.isNotEmpty(this.inputForm.auditedUnitsName) || this.commonJS.isNotEmpty(this.inputForm.auditedUnits) || this.commonJS.isNotEmpty(this.inputForm.cwProjectReportArchiveReportDTOList)) {
+        //   this.$confirm(`重新选择项目会清空"被审计单位"以及"审计报告"的数据,是否继续?`, '提示', {
+        //     confirmButtonText: '确定',
+        //     cancelButtonText: '取消',
+        //     type: 'warning'
+        //   }).then(() => {
+        //     this.$refs.projectRecordsChooseCom.init()
+        //   }).catch(() => {
+        //   })
+        // } else {
+        //   this.$refs.projectRecordsChooseCom.init()
+        // }
+      },
+      // 项目选择结果获取
+      getProject (row) {
+        this.inputForm.projectId = row.id
+        this.inputForm.cwProjectRecordsDTO.projectName = row.projectName
+        this.inputForm.cwProjectRecordsDTO.projectNumber = row.projectNumber
+        this.inputForm.cwProjectRecordsDTO.projectMasterId = row.projectMasterId
+        this.inputForm.auditedUnitsName = ''
+        this.inputForm.auditedUnits = ''
+        this.inputForm.cwProjectReportArchiveReportDTOList = []
+      },
+      // 打开被审计单位选择组件
+      // openChooseClient () {
+      //   this.$refs.workClientChooseByProjectCom.init(this.inputForm.projectId)
+      // },
+      // 被审计单位选择结果获取
+      // getClient (row) {
+      //   this.inputForm.auditedUnitsName = row.name
+      //   this.inputForm.auditedUnits = row.id
+      // },
+      // 打开审计报告选择组件
+      openReportChoose () {
+        this.$refs.reportChooseByProjectCom.init(this.inputForm.projectId, this.inputForm.id)
+      },
+      // 审计报告选择结果获取
+      getReport (row) {
+        if (this.commonJS.isNotEmpty(row)) {
+          if (this.commonJS.isNotEmpty(row.reportId)) {
+            this.projectReportArchiveService.findReportUse(row.reportId).then((data) => {
+              if (data === false) {
+                this.inputForm.reportDate = row.reportDate
+                this.inputForm.reportNo = row.reportNo
+                this.inputForm.signatureAnnotator1 = row.signatureAnnotator1
+                this.inputForm.signatureAnnotator1Name = row.signatureAnnotator1Name
+                this.inputForm.signatureAnnotator2 = row.signatureAnnotator2
+                this.inputForm.signatureAnnotator2Name = row.signatureAnnotator2Name
+                this.inputForm.reportCreateName = row.createName
+                this.inputForm.reportId = row.reportId
+              } else {
+                this.$message.error('此报告正在归档中或已归档,请重新选择')
+              }
+            })
+          }
+        }
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-input-number .el-input__inner {
+    text-align: left;
+  }
+</style>

+ 179 - 0
src/views/cw/reportManagement/ProjectInfoForm.vue

@@ -0,0 +1,179 @@
+<template>
+  <div>
+    <el-dialog
+      title="选择项目"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      width="1100px"
+      height="500px"
+      @close="close"
+      @keyup.enter.native=""
+      :visible.sync="visible">
+      <div style="height: calc(100% - 80px);">
+        <el-form size="small" :inline="true" class="query-form" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+          <!-- 搜索框-->
+          <el-form-item label="项目名称" prop="projectName">
+            <el-input size="small" v-model="searchForm.projectName" placeholder="请输入项目名称" clearable></el-input>
+          </el-form-item>
+          <el-form-item label="项目编号" prop="projectNumber">
+            <el-input size="small" v-model="searchForm.projectNumber" placeholder="请输入项目编号" clearable></el-input>
+          </el-form-item>
+
+          <el-form-item>
+            <el-button type="primary" @click="list()" size="small" icon="el-icon-search">查询</el-button>
+            <el-button @click="resetSearch()" size="small" icon="el-icon-refresh-right">重置</el-button>
+          </el-form-item>
+        </el-form>
+
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="400px"
+          :loading="loading"
+          size="small"
+          ref="workContractTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          :print-config="{}"
+          @sort-change=""
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :checkbox-config="{}">
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="radio" width="40px"></vxe-column>
+          <vxe-column min-width="230" align="center" title="项目名称" field="projectName"></vxe-column>
+          <vxe-column min-width="160" align="center" title="项目编号" field="projectNumber"></vxe-column>
+          <vxe-column min-width="160" align="center" title="项目经理" field="projectMasterName"></vxe-column>
+          <vxe-column min-width="160" align="center" title="创建人" field="createBy.name"></vxe-column>
+          <vxe-column min-width="160" align="center" title="创建时间" field="createDate"></vxe-column>
+
+        </vxe-table>
+        <vxe-pager
+          background
+          size="small"
+          :current-page="tablePage.currentPage"
+          :page-size="tablePage.pageSize"
+          :total="tablePage.total"
+          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+          @page-change="currentChangeHandle">
+        </vxe-pager>
+      </div>
+      <span slot="footer" class="dialog-footer">
+      <el-button size="small" @click="close()" icon="el-icon-circle-close">关闭</el-button>
+      <el-button size="small" type="primary" v-if="method != 'view'" @click="getContract()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+    </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import InputNumber from '@/views/workContract/InputNumber.vue'
+  import SelectUserTree from '@/views/utils/treeUserSelect'
+  // import ProgramProjectListInfoService from '@/api/program/ProgramProjectListInfoService'
+  import ProjectRecordsService from '@/api/cw/projectRecords/ProjectRecordsService'
+  import ProjectReportService from '@/api/cw/reportManagement/ProjectReportService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        dataList: [],
+        searchForm: {
+          clientName: '',
+          projectNumber: '',
+          projectName: '',
+          contractDates: [],
+          type: '',
+          filedType: '',
+          contractAmounts: [],
+          createBy: this.$store.state.user.id,
+          procInsId: '',
+          processDefinitionId: ''
+        },
+        rowId: ''
+      }
+    },
+    // programProjectListInfoService: null,
+    projectRecordsService: null,
+    projectReportService: null,
+    created () {
+      // this.programProjectListInfoService = new ProgramProjectListInfoService()
+      this.projectRecordsService = new ProjectRecordsService()
+      this.projectReportService = new ProjectReportService()
+    },
+    components: {
+      SelectUserTree,
+      InputNumber
+    },
+    methods: {
+      init (id) {
+        // if (!this.commonJS.isEmpty(id)) {
+        //   this.$refs.workContractTable.setCurrentRow(id)
+        // }
+        this.visible = true
+        this.list()
+      },
+      // 表单提交
+      getContract () {
+        let row = this.$refs.workContractTable.getRadioRecord()
+        if (this.commonJS.isEmpty(row)) {
+          this.$message.error('请选择一条数据')
+          return
+        }
+        this.close()
+        this.$emit('getContract', row)
+      },
+      list () {
+        this.loading = true
+        // this.searchForm.createBy = this.$store.state.user.id
+        this.projectReportService.recordsList({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then(({data}) => {
+          // console.log('data2', data)
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+        })
+        // this.projectRecordsService.list({
+        //   'current': this.tablePage.currentPage,
+        //   'size': this.tablePage.pageSize,
+        //   'orders': this.tablePage.orders,
+        //   ...this.searchForm
+        // }).then(({data}) => {
+        //   console.log('data2', data)
+        //   this.dataList = data.records
+        //   this.tablePage.total = data.total
+        //   this.loading = false
+        // })
+      },
+      // 当前页
+      currentChangeHandle ({currentPage, pageSize}) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.list()
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.list()
+      },
+      close () {
+        this.visible = false
+      }
+    }
+  }
+</script>

Plik diff jest za duży
+ 1125 - 0
src/views/cw/reportManagement/ReportManagementAddForm.vue


Plik diff jest za duży
+ 1636 - 0
src/views/cw/reportManagement/ReportManagementForm.vue


Plik diff jest za duży
+ 1043 - 0
src/views/cw/reportManagement/ReportManagementList.vue


Plik diff jest za duży
+ 1584 - 0
src/views/cw/reportManagement/ReportManagementSignatureForm.vue


+ 775 - 0
src/views/cw/reportManagement/ReportManagementTaskForm.vue

@@ -0,0 +1,775 @@
+<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
+  <div>
+    <el-row>
+      <el-form size="middle" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="status === 'audit' || status === 'taskFormDetail'"
+               label-width="135px" @submit.native.prevent>
+
+        <el-divider content-position="left"><i class="el-icon-document"></i> 项目信息</el-divider>
+        <el-row  :gutter="0">
+          <el-col :span="12">
+            <el-form-item label="项目名称" prop="projectName"
+                          :rules="[
+                              {required: true, message:'项目名称不能为空', trigger:'blur'},
+                              {required: true, message:'项目名称不能为空', trigger:'change'}
+                   ]">
+              <!--                <el-input v-model="inputForm.projectName" placeholder="请填写项目名称" clearable></el-input>-->
+              <el-input size="medium" :readonly="true" @focus="openContractForm()" v-model="inputForm.projectName" placeholder="请选择项目名称">
+                <el-button slot="append" icon="el-icon-search" @click="openContractForm()"></el-button>
+              </el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="项目编号" prop="projectNumber"
+                          :rules="[
+                   ]">
+              <el-input :disabled="true" v-model="inputForm.projectNumber" placeholder="请填写项目编号" clearable></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="项目经理" prop="projectMasterName"
+                          :rules="[
+                   ]">
+              <el-input :disabled="true" v-model="inputForm.projectMasterName" placeholder="请填写项目经理" clearable></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-divider content-position="left"><i class="el-icon-document"></i> 基础信息</el-divider>
+        <el-row  :gutter="0">
+          <el-col :span="12">
+            <el-form-item label="单据编号" prop="documentNo"
+                          :rules="[
+
+                   ]">
+              <el-input :disabled="true" v-model="inputForm.documentNo" placeholder="自动生成" clearable></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="报告所属部门" prop="officeId"
+                          :rules="[
+                   ]">
+              <SelectTree
+                ref="officeTree"
+                :props="{
+                  value: 'id',             // ID字段名
+                  label: 'name',         // 显示名称
+                  children: 'children'    // 子级字段名
+                }"
+
+                :url="`/sys/office/treeData?type=2`"
+                :value="inputForm.officeId"
+                size="medium"
+                :accordion="true"
+                @getValue="(value) => {inputForm.officeId=value}"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="盖章类型" prop="signatureType"
+                          :rules="[
+                              {required: true, message: '盖章类型不能为空', trigger: 'change'}
+                   ]">
+              <!--                <el-input v-model="inputForm.signatureType" placeholder="请填写盖章类型" clearable></el-input>-->
+              <el-select v-model="inputForm.signatureType" placeholder="请选择盖章类型" clearable style="width: 100%;">
+                <el-option
+                  v-for="item in $dictUtils.getDictList('cw_signature_type')"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+
+          <el-col v-if="inputForm.signatureType === '1' || commonJS.isEmpty(inputForm.signatureType)" :span="12">
+            <el-form-item label="签字注师1" prop="signatureAnnotator1"
+                          :rules="[
+                   ]">
+              <!--                <el-input v-model="inputForm.signatureAnnotator1" placeholder="请填写签字注师1" clearable></el-input>-->
+              <UserSelect size="medium" ref="userSelect1" :disabled="status === 'audit' || status === 'taskFormDetail'" :readonly="true" :limit='1' :value="inputForm.signatureAnnotator1" @getValue='(value) => {changeSignatory1(value)}'></UserSelect>
+            </el-form-item>
+          </el-col>
+
+          <el-col v-if="inputForm.signatureType === '1' || commonJS.isEmpty(inputForm.signatureType)" :span="12">
+            <el-form-item label="签字注师2" prop="signatureAnnotator2"
+                          :rules="[
+                   ]">
+              <!--                <el-input v-model="inputForm.signatureAnnotator2" placeholder="请填写签字注师2" clearable></el-input>-->
+              <UserSelect size="medium" ref="userSelect2" :disabled="status === 'audit' || status === 'taskFormDetail'" :readonly="true" :limit='1' :value="inputForm.signatureAnnotator2" @getValue='(value) => {changeSignatory2(value)}'></UserSelect>
+            </el-form-item>
+          </el-col>
+
+          <el-col v-if="inputForm.signatureType === '2'" :span="12">
+            <el-form-item label="签字注师1" prop="signatureAnnotator1"
+                          :rules="[
+                              {required: true, message:'签字注师1不能为空', trigger:'blur'}
+                   ]">
+              <!--                <el-input v-model="inputForm.signatureAnnotator1" placeholder="请填写签字注师1" clearable></el-input>-->
+              <UserSelect size="medium" ref="userSelect1" :disabled="status === 'audit' || status === 'taskFormDetail'" :readonly="true" :limit='1' :value="inputForm.signatureAnnotator1" @getValue='(value) => {changeSignatory1(value)}'></UserSelect>
+            </el-form-item>
+          </el-col>
+
+          <el-col v-if="inputForm.signatureType === '2'" :span="12">
+            <el-form-item label="签字注师2" prop="signatureAnnotator2"
+                          :rules="[
+                              {required: true, message:'签字注师2不能为空', trigger:'blur'}
+                   ]">
+              <!--                <el-input v-model="inputForm.signatureAnnotator2" placeholder="请填写签字注师2" clearable></el-input>-->
+              <UserSelect size="medium" ref="userSelect2" :disabled="status === 'audit' || status === 'taskFormDetail'" :readonly="true" :limit='1' :value="inputForm.signatureAnnotator2" @getValue='(value) => {changeSignatory2(value)}'></UserSelect>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="审计收费(税前、元)" prop="auditFees"
+                          :rules="[
+                   ]">
+              <el-input v-model="inputForm.auditFees" placeholder="请填写审计收费(税前、元)" clearable
+                        @keyup.native="inputForm.auditFees = twoDecimalPlaces(inputForm.auditFees)"
+              ></el-input>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="报告实际制作人" prop="realCreate"
+                          :rules="[
+                   ]">
+              <UserSelectAll size="medium" :readonly="true" :disabled="status === 'audit' || status === 'taskFormDetail'" :limit='1' :value="inputForm.realCreate" @getValue='(value) => {inputForm.realCreate = value}'></UserSelectAll>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="创建时间" prop="createDate"
+                          :rules="[
+                   ]">
+              <el-input :disabled="true" v-model="inputForm.createDate" placeholder="请填写创建时间" clearable></el-input>
+            </el-form-item>
+          </el-col>
+
+        </el-row>
+        <el-divider content-position="left"><i class="el-icon-document"></i> 报告信息</el-divider>
+        <el-row  :gutter="0">
+          <el-col :span="12">
+            <el-form-item label="被服务单位" prop="servedUnitName"
+                          :rules="[
+                            {required: true, message:'被服务单位不能为空', trigger:'blur'},
+                            {required: true, message:'被服务单位不能为空', trigger:'change'}
+                   ]">
+              <el-input :readonly="true" @focus="openWorkClient()" v-model="inputForm.servedUnitName" placeholder="请填写被服务单位" clearable>
+                <el-button slot="append" icon="el-icon-search" @click="openWorkClient()"></el-button>
+              </el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="报告日期" prop="reportDate"
+                          :rules="[
+                            {required: true, message:'报告日期不能为空', trigger:'blur'}
+                   ]">
+              <el-date-picker
+                placement="bottom-start"
+                value-format="yyyy-MM-dd"
+                v-model="inputForm.reportDate"
+                style="width: 100%"
+                placeholder="选择日期">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="报告类型" prop="reportType"
+                          :rules="[
+                            {required: true, message:'报告类型不能为空', trigger:'change'}
+                   ]">
+              <el-select v-model="inputForm.reportType" placeholder="请选择报告类型" style="width:100%;">
+                <el-option
+                  v-for="item in $dictUtils.getDictList('cw_report_type')"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="报告流水号" prop="reportNumber"
+                          :rules="[
+                   ]">
+              <el-input :disabled="true" v-model="inputForm.reportNumber" placeholder="自动生成" clearable></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="报告文号" prop="reportNo"
+                          :rules="[
+                   ]">
+              <el-input :disabled="true" v-model="inputForm.reportNo" placeholder="自动生成" clearable></el-input>
+            </el-form-item>
+          </el-col>
+          <el-form size="middle" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="status !== 'audit' && status !== 'taskFormDetail'"
+                   label-width="135px" @submit.native.prevent>
+            <el-col :span="12">
+              <el-form-item label="意见类型" prop="opinionType"
+                            :rules="[
+                              {required: true, message:'意见类型不能为空', trigger:'blur'}
+                     ]">
+                <el-select v-model="inputForm.opinionType" placeholder="请选择意见类型" style="width:100%;">
+                  <el-option
+                    v-for="item in $dictUtils.getDictList('cw_opinion_type')"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value">
+                  </el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-form>
+<!--          <el-col :span="12">-->
+<!--            <el-form-item label="盖章状态" prop="sealType"-->
+<!--                          :rules="[-->
+<!--                   ]">-->
+<!--              <el-input :disabled="true" v-model="inputForm.sealType" placeholder="请填写盖章状态" clearable></el-input>-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
+        </el-row>
+
+      </el-form>
+      <el-tabs v-model="activeName" type="border-card" @tab-click="tabHandleClick">
+<!--        <el-tab-pane label="报告信息列表" name="newRow">-->
+<!--          <el-button type="primary" style="margin-bottom: 15px" size="mini" :disabled="formReadOnly" @click="sss"-->
+<!--          >-->
+<!--            新增行-->
+<!--          </el-button>-->
+<!--        </el-tab-pane>-->
+        <el-tab-pane label="签章文件" name="archiveFile">
+          <!--        签章文件-->
+          <UpLoadComponent ref="archiveFile"></UpLoadComponent>
+        </el-tab-pane>
+
+
+      </el-tabs>
+    </el-row>
+<!--    <UpLoadComponentDialog ref="upLoadComponentDialog" @getUpload="getUpload"></UpLoadComponentDialog>-->
+<!--    <ProjectInfoForm  ref="projectInfoForm" @getContract="getContract"></ProjectInfoForm>-->
+    <ProjectRecoredChooseCom  ref="projectRecoredChooseCom" @getProject="getContract"></ProjectRecoredChooseCom>
+    <ReportServiceUnitForm ref="reportServiceUnitForm" @getWorkClientChoose="getWorkClientChoose"></ReportServiceUnitForm>
+  </div>
+</template>
+
+<script>
+  // import UpLoadComponent from '@/views/common/UpLoadComponent'
+  import UpLoadComponent from '@/views/common/UpLoadComponentV2.1'
+  import SelectUserTree from '@/views/utils/treeUserSelect'
+  import SelectTree from '@/components/treeSelect/treeSelect.vue'
+  import UserSelect from '../workClientInfo/clientUserSelect'
+  import ProjectRecordsService from '@/api/cw/projectRecords/ProjectRecordsService'
+  import ProjectReportService from '@/api/cw/reportManagement/ProjectReportService'
+  import EnterpriseSearchService from '@/api/cw/common/EnterpriseSearchService'
+  // import WorkClientChooseForm from '../workClientInfo/WorkClientChooseForm'
+  import ReportServiceUnitForm from './ReportServiceUnitForm'
+  import UserSelectAll from '@/components/userSelect'
+  // import UpLoadComponentDialog from '@/views/common/UpLoadComponentDialog'
+  // import ProjectInfoForm from './ProjectInfoForm'
+  import ProjectRecoredChooseCom from '../projectRecords/ProjectRecordsChooseCom'
+  export default {
+    props: {
+      businessId: {
+        type: String,
+        default: ''
+      },
+      formReadOnly: {
+        type: Boolean,
+        default: false
+      },
+      status: {
+        type: String,
+        default: ''
+      }
+    },
+    data () {
+      return {
+        title: '',
+        method: '',
+        loading: false,
+        inputForm: {
+          opinionType: '',
+          reportNo: '',
+          reportNumber: '',
+          reportType: '',
+          reportDate: '',
+          servedUnitName: '', // 被服务单位
+          auditFees: '',
+          projectId: '',
+          id: '',
+          createDate: '',
+          createBy: {
+            id: '',
+            name: JSON.parse(localStorage.getItem('user')).name
+          },
+          remarks: '',
+          documentNo: '',
+          projectName: '',
+          projectNumber: '',
+          officeId: '',
+          signatureAnnotator1: '',
+          signatureAnnotator2: '',
+          signatureType: '',
+          projectMasterName: '',
+          cwProjectInfoList: [],
+          cwFileInfoList: [],
+          servedUnitId: '',
+          status: '',
+          realCreate: ''
+        },
+        keyWatch: '',
+        activeName: 'archiveFile',
+        tableKey: '',
+        tableKeyClient: '1'
+      }
+    },
+    projectRecordsService: null,
+    ProjectReportService: null,
+    enterpriseSearchService: null,
+    created () {
+      this.enterpriseSearchService = new EnterpriseSearchService()
+      this.projectRecordsService = new ProjectRecordsService()
+      this.projectReportService = new ProjectReportService()
+    },
+    computed: {
+      bus: {
+        get () {
+          this.$refs.archiveFile.setDividerName('签章文件', false)
+          // this.$refs.uploadComponent.setDividerName('附件', false)
+          return this.businessId
+        },
+        set (val) {
+          this.businessId = val
+        }
+      }
+    },
+    watch: {
+      'keyWatch': {
+        handler (newVal) {
+          if (this.commonJS.isNotEmpty(this.bus)) {
+            this.init('', this.bus)
+          } else {
+            this.$nextTick(() => {
+              this.$refs.inputForm.resetFields()
+            })
+          }
+        }
+      }
+    },
+    components: {
+      SelectUserTree,
+      UpLoadComponent,
+      SelectTree,
+      UserSelect,
+      ReportServiceUnitForm,
+      // ProjectInfoForm,
+      ProjectRecoredChooseCom,
+      UserSelectAll
+      // UpLoadComponentDialog
+    },
+    methods: {
+      // seeFileInfo (index) {
+      //   if (this.commonJS.isEmpty(this.inputForm.cwProjectInfoList[index].cwFileInfoList)) {
+      //     this.inputForm.cwProjectInfoList[index].cwFileInfoList = []
+      //   }
+      //   this.$refs.upLoadComponentDialog.newUpload('view', this.inputForm.cwProjectInfoList[index].cwFileInfoList, null, null, null, null, null, false, index)
+      // },
+      // sss (index) {
+      //   if (this.commonJS.isEmpty(this.inputForm.cwProjectInfoList[index].cwFileInfoList)) {
+      //     this.inputForm.cwProjectInfoList[index].cwFileInfoList = []
+      //   }
+      //   this.$refs.upLoadComponentDialog.newUpload(null, this.inputForm.cwProjectInfoList[index].cwFileInfoList, null, null, null, null, null, false, index)
+      // },
+      // getUpload (p, index) {
+      //   p.then((list) => {
+      //     // list为返回数据
+      //     this.inputForm.cwProjectInfoList[index].cwFileInfoList = list
+      //     this.inputForm.cwProjectInfoList[index].fileNumber = list.length
+      //     this.tableKeyClient = Math.random()
+      //     // console.log('this.inputForm.cwFileInfoList', this.inputForm.cwFileInfoList)
+      //     // console.log('list.length', list.length)
+      //     // console.log(list)
+      //   })
+      // },
+      getKeyWatch (keyWatch) {
+        this.keyWatch = keyWatch
+      },
+      // 删除
+      // del (id) {
+      //   let ids = id || this.$refs.clientTable.getCheckboxRecords().map(item => {
+      //     return item.id
+      //   }).join(',')
+      //   this.$confirm(`确定删除所选项吗?`, '提示', {
+      //     confirmButtonText: '确定',
+      //     cancelButtonText: '取消',
+      //     type: 'warning'
+      //   }).then(() => {
+      //     this.$refs.clientTable.remove(ids)
+      //     // this.inputForm.cwProjectClientInfoDTOList.splice(ids, 1)
+      //   })
+      // },
+      changeSignatory1 (value) {
+        if (this.inputForm.signatureAnnotator2 === value && this.commonJS.isNotEmpty(value)) {
+          this.$message.warning('首次发行签字注师1和首次发行签字注师2不可以相同')
+          this.$nextTick(() => {
+            this.inputForm.signatureAnnotator1 = ''
+            this.$refs.userSelect1.changeNameValue('')
+            this.$refs.userSelect1.clearSelectData()
+            this.$forceUpdate()
+          })
+        } else {
+          this.inputForm.signatureAnnotator1 = value
+        }
+      },
+      changeSignatory2 (value) {
+        if (this.inputForm.signatureAnnotator1 === value && this.commonJS.isNotEmpty(value)) {
+          this.$message.warning('首次发行签字注师1和首次发行签字注师2不可以相同')
+          this.$nextTick(() => {
+            this.inputForm.signatureAnnotator2 = ''
+            this.$refs.userSelect2.changeNameValue('')
+            this.$refs.userSelect2.clearSelectData()
+            this.$forceUpdate()
+          })
+        } else {
+          this.inputForm.signatureAnnotator2 = value
+        }
+      },
+      init (method, id) {
+        this.activeName = 'archiveFile'
+        this.projectRecordsService = new ProjectRecordsService()
+        this.projectReportService = new ProjectReportService()
+        this.method = method
+        this.inputForm = {
+          servedUnitId: '',  // 被服务单位id
+          opinionType: '',
+          reportNo: '',
+          reportNumber: '',
+          reportType: '',
+          reportDate: '',
+          servedUnitName: '', // 被服务单位
+          auditFees: '',
+          projectId: '',
+          id: '',
+          createDate: '',
+          createBy: {
+            id: '',
+            name: JSON.parse(localStorage.getItem('user')).name
+          },
+          remarks: '',
+          documentNo: '',
+          projectName: '',
+          officeId: '',
+          projectNumber: '',
+          signatureAnnotator1: '',
+          signatureAnnotator2: '',
+          signatureType: '',
+          projectMasterName: '',
+          cwProjectInfoList: [],
+          realCreate: ''
+        }
+        this.inputForm.id = id
+        this.loading = false
+        this.$nextTick(() => {
+          this.$refs.archiveFile.clearUpload()
+          this.$refs.inputForm.resetFields()
+          this.loading = true
+          this.projectReportService.queryById(this.inputForm.id).then(({data}) => {
+            this.inputForm.status = data.status
+            console.log('this.inputForm.servedUnitName', data)
+            // console.log('this.inputForm.status', this.inputForm.status)
+            // this.$refs.uploadComponent.clearUpload()
+            this.inputForm = this.recover(this.inputForm, data)
+            this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+            if (this.commonJS.isEmpty(this.inputForm.createDate)) {
+              this.inputForm.createDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+            }
+            if (this.commonJS.isEmpty(this.inputForm.officeId)) {
+              this.inputForm.officeId = JSON.parse(localStorage.getItem('user')).officeDTO.id
+            }
+            if (this.commonJS.isEmpty(this.inputForm.realCreate)) {
+              this.inputForm.realCreate = JSON.parse(localStorage.getItem('user')).id
+            }
+            if (this.status === 'audit' || this.status === 'taskFormDetail') {
+              this.method = 'view'
+            }
+            if (this.commonJS.isEmpty(this.inputForm.signatureType) && this.method !== 'view') {
+              this.inputForm.signatureType = '1'
+            }
+            this.$refs.archiveFile.newUpload(this.method, data.cwFileInfoList, 'cwWorkContract', null, null, null, null, false)
+            this.loading = false
+          })
+        })
+      },
+      openContractForm () {
+        if (!this.commonJS.isEmpty(this.inputForm.contractId)) {
+          // this.$refs.projectInfoForm.init(this.inputForm.contractId)
+          this.$refs.projectRecoredChooseCom.init(this.inputForm.contractId)
+        } else {
+          this.$refs.projectRecoredChooseCom.init()
+          // this.$refs.projectInfoForm.init()
+        }
+      },
+      getContract (row) {
+        // console.log('row', row)
+        this.inputForm.projectName = row.projectName // 项目名称
+        this.inputForm.projectId = row.id // 项目id
+        this.inputForm.projectNumber = row.projectNumber // 项目编号
+        this.inputForm.projectMasterName = row.projectMasterName // 项目经理
+        this.clearClientList()
+        this.$forceUpdate()
+        this.inputForm.cwProjectInfoList = []
+      },
+      clearClientList () {
+        // 项目直接对接联系人列表清除
+        this.inputForm.clientList = []
+        this.$forceUpdate()
+      },
+      saveForm (callback) {
+        this.doSubmit('save', callback)
+      },
+      startForm (callback) {
+        this.doSubmit('start', callback)
+      },
+      reapplyForm (callback) {
+        this.projectReportService.queryById(this.inputForm.id).then(({data}) => {
+          if (data.status !== '4') { // 审核状态不是“驳回”,就弹出提示
+            this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+            throw new Error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+          } else {
+            this.doSubmit('reapply', callback)
+          }
+        })
+      },
+      async agreeForm (callback) {
+        await this.projectReportService.queryById(this.inputForm.id).then(({data}) => {
+          // console.log('进来了看看data', data)
+          if (data.status !== '2') { // 审核状态不是“待审核”,就弹出提示
+            this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+            throw new Error()
+          } else {
+            this.doSubmit('agree', callback)
+          }
+        })
+      },
+      // 表单提交
+      doSubmit (status, callback) {
+        if (status === 'save') {
+          // 暂存
+          this.inputForm.status = '1'
+          this.loading = true
+          this.$refs.archiveFile.getDataList().then((data) => {
+            this.inputForm.cwFileInfoList = data
+          })
+          // console.log('this.inputForm.cwFileInfoList', this.inputForm.cwFileInfoList)
+          this.inputForm.createDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+          // 验证报告 日期报告 类型是否出具报告 意见类型 是否为空
+          // eslint-disable-next-line no-unused-expressions
+          this.projectReportService.saveForm(this.inputForm).then(({data}) => {
+            callback(data.businessTable, data.businessId, this.inputForm)
+            this.loading = false
+          }).catch(() => {
+            this.loading = false
+          })
+          return
+        } else if (status === 'start') {
+          // 送审  待审核
+          this.inputForm.status = '2'
+        } else if (status === 'agree') {
+          // 审核同意
+          this.inputForm.agreeDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+          this.inputForm.agreeUserId = this.$store.state.user.id
+          this.inputForm.status = '5'
+        } else if (status === 'reapply') {
+          this.inputForm.status = '2'
+        }
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            let _this = this
+            let _num = 0
+            const wait = function () {
+              return new Promise((resolve, reject) => {
+                _this.$refs.archiveFile.getDataList().then((data) => {
+                  _this.inputForm.cwFileInfoList = data
+                  if (_this.commonJS.isNotEmpty(_this.inputForm.cwFileInfoList)) {
+                    _this.inputForm.cwFileInfoList.forEach((item, index) => {
+                      if (_this.commonJS.isEmpty(item.fileType)) {
+                        _this.$message.error('签章文件中,第' + (index + 1) + '条数据的“文件类型”未填写')
+                        _num = 1
+                        _this.loading = false
+                        throw new Error('签章文件中,第' + (index + 1) + '条数据的“文件类型”未填写')
+                      } else if (_this.commonJS.isEmpty(item.sealType)) {
+                        _this.$message.error('签章文件中,第' + (index + 1) + '条数据的“盖章类型”未填写')
+                        _num = 1
+                        _this.loading = false
+                        throw new Error('签章文件中,第' + (index + 1) + '条数据的“盖章类型”未填写')
+                      }
+                    })
+                  } else {
+                    _this.$message.error('最少有一条签章文件数据!')
+                    _num = 1
+                    _this.loading = false
+                  }
+                })
+                resolve()
+              })
+            }
+            wait().then(() => {
+              if (_num !== 1) {
+                if (this.commonJS.isEmpty(this.inputForm.createDate)) {
+                  this.inputForm.createDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+                }
+                if (status === 'agree' && this.commonJS.isEmpty(this.inputForm.opinionType)) {
+                  this.$message.error('意见类型不能为空')
+                  this.loading = false
+                  throw new Error('意见类型不能为空')
+                }
+                this.projectReportService.saveForm(this.inputForm).then(({data}) => {
+                  callback(data.businessTable, data.businessId, this.inputForm)
+                  this.loading = false
+                }).catch(() => {
+                  this.loading = false
+                })
+              }
+            })
+          }
+        })
+      },
+      async updateStatusById (type, callback) {
+        if (await this.$refs.archiveFile.checkProgress()) {
+          this.loading = false
+          throw new Error()
+        } else {
+          if (type === 'reject' || type === 'reback') {
+            await this.projectReportService.queryById(this.inputForm.id).then(({data}) => {
+              if (data.status !== '2') { // status的值不等于“审核中”就弹出提示
+                this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+                throw new Error()
+              } else {
+                if (type === 'reject') {
+                  // 驳回
+                  this.inputForm.status = '4'
+                  let param = {status: '4', id: this.inputForm.id}
+                  this.projectReportService.updateStatusById(param).then(() => {
+                    callback()
+                  })
+                  // this.projectRecordsService.updateStatusById(param)
+                }
+                if (type === 'reback') {
+                  // 撤回
+                  let param = {status: '3', id: this.inputForm.id}
+                  // this.projectRecordsService.updateStatusById(param)
+                  this.projectReportService.updateStatusById(param)
+                }
+              }
+            })
+            // await this.projectRecordsService.queryById(this.inputForm.id).then(({data}) => {
+            //   if (data.status !== '2') { // status的值不等于“审核中”就弹出提示
+            //     this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+            //     throw new Error()
+            //   } else {
+            //     if (type === 'reject') {
+            //       // 驳回
+            //       this.inputForm.status = '4'
+            //       let param = {status: '4', id: this.inputForm.id}
+            //       this.projectRecordsService.updateStatusById(param)
+            //     }
+            //     if (type === 'reback') {
+            //       // 撤回
+            //       let param = {status: '3', id: this.inputForm.id}
+            //       // this.projectRecordsService.updateStatusById(param)
+            //       this.projectReportService.updateStatusById(param)
+            //     }
+            //   }
+            // })
+          } else if (type === 'hold') {
+            this.projectReportService.queryById(this.inputForm.id).then(({data}) => {
+              if (data.status !== '4') { // status的值不等于“驳回”就弹出提示
+                this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+                throw new Error()
+              } else {
+                // 终止
+                let param = {status: '1', id: this.inputForm.id}
+                this.projectReportService.updateStatusById(param).then(() => {
+                  callback()
+                })
+              }
+            })
+          }
+        }
+      },
+      close () {
+        this.inputForm = {
+          id: '',
+          createDate: '',
+          createBy: {
+            id: '',
+            name: JSON.parse(localStorage.getItem('user')).name
+          },
+          remarks: '',
+          documentNo: '',
+          projectName: '',
+          officeId: '',
+          projectNumber: '',
+          signatureAnnotator1: '',
+          signatureAnnotator2: '',
+          signatureType: '',
+          projectMasterName: '',
+          realCreate: ''
+        }
+        // this.$refs.uploadComponent.clearUpload()
+        this.$refs.inputForm.resetFields()
+      },
+      tabHandleClick (event) {
+        // console.log(event)
+      },
+      // 删除
+      removeEvent (row, rowIndex, type) {
+        if (type === 'client') {
+          // this.$refs.clientTable.remove(row)
+          // this.inputForm.cwProjectInfoList.splice(rowIndex, 1)
+        }
+      },
+      openWorkClient () {
+        this.$refs.reportServiceUnitForm.init(this.inputForm.projectId)
+      },
+      getWorkClientChoose (row) {
+        this.inputForm.servedUnitName = row.name
+        this.inputForm.servedUnitId = row.id
+        this.inputForm.sealType = '未盖章'
+        // this.tableKeyClient = Math.random()
+      },
+      // 两位小数数字验证
+      twoDecimalPlaces (num) {
+        let str = num.toString()
+        var len1 = str.substr(0, 1)
+        var len2 = str.substr(1, 1)
+        // eslint-disable-next-line eqeqeq
+        if (str.length > 1 && len1 == 0 && len2 != '.') {
+          str = str.substr(1, 1)
+        }
+        // eslint-disable-next-line eqeqeq
+        if (len1 == '.') {
+          str = ''
+        }
+        // eslint-disable-next-line eqeqeq
+        if (str.indexOf('.') != -1) {
+          var str_ = str.substr(str.indexOf('.') + 1)
+          // eslint-disable-next-line eqeqeq
+          if (str_.indexOf('.') != -1) {
+            str = str.substr(0, str.indexOf('.') + str_.indexOf('.') + 1)
+          }
+          if (str_.length > 2) {
+            this.$message.warning(`金额小数点后只能输入两位,请正确输入!`)
+            return (str = '')
+          }
+        }
+        // eslint-disable-next-line no-useless-escape
+        str = str.replace(/[^\d^\.]+/g, '') // 保留数字和小数点
+        return str
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-input-number .el-input__inner {
+    text-align: left;
+  }
+</style>

+ 169 - 0
src/views/cw/reportManagement/ReportServiceUnitForm.vue

@@ -0,0 +1,169 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+	  draggable
+      width="1100px"
+      append-to-body
+      height="500px"
+      @close="close"
+      @keyup.enter.native="getWorkClient"
+      v-model="visibleChoose">
+      <div style="height: calc(100%);">
+        <el-form :inline="true" class="query-form" ref="searchForm" :model="searchForm" @submit.native.prevent>
+          <!-- 搜索框-->
+          <el-form-item label="客户名称" prop="name">
+            <el-input v-model="searchForm.name" placeholder="请输入客户名称" clearable></el-input>
+          </el-form-item>
+          <el-form-item label="客户编号" prop="no">
+            <el-input v-model="searchForm.no" placeholder="请输入客户编号" clearable></el-input>
+          </el-form-item>
+
+          <el-form-item>
+            <el-button type="primary" @click="list()" icon="el-icon-search">查询</el-button>
+            <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>
+          </el-form-item>
+        </el-form>
+
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="400px"
+          :loading="loading"
+          ref="clientTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          :print-config="{}"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :row-config="{isCurrent: true}"
+          :radio-config="{trigger: 'row'}">
+          <vxe-column type="seq" align="center" width="80" title="序号"></vxe-column>
+          <vxe-column type="radio" width="40px"></vxe-column>
+          <vxe-column width="" title="客户名称" align="center" field="name" tree-node></vxe-column>
+          <vxe-column width="" title="客户编号" align="center" field="no"></vxe-column>
+          <vxe-column width="" title="公司级次" align="center" field="companyLevel"></vxe-column>
+        </vxe-table>
+        <vxe-pager
+          background
+          :current-page="tablePage.currentPage"
+          :page-size="tablePage.pageSize"
+          :total="tablePage.total"
+          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+          @page-change="currentChangeHandle">
+        </vxe-pager>
+      </div>
+		<template #footer>
+			<span class="dialog-footer">
+			  <el-button @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			  <el-button type="primary" v-if="method != 'view'" @click="getWorkClient()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+			</span>
+		</template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import projectReportService from '@/api/cw/reportManagement/ProjectReportService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visibleChoose: false,
+        loading: false,
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        dataList: [],
+        searchForm: {
+          name: '',
+          no: ''
+        },
+        projectId: ''
+      }
+    },
+    // workClientService: null,
+    created () {
+      // this.workClientService = new WorkClientService()
+    },
+    components: {
+    },
+    methods: {
+      init (id) {
+        // console.log('projectID', id)
+        this.projectId = id
+        this.title = '客户选择'
+        this.visibleChoose = true
+        this.list()
+      },
+      // 表单提交
+      getWorkClient () {
+        let row = this.$refs.clientTable.getRadioRecord()
+        if (this.commonJS.isEmpty(row)) {
+          this.$message.error('请至少选择一条数据')
+        } else {
+          this.close()
+          this.$emit('getWorkClientChoose', row)
+        }
+      },
+      list () {
+        this.dataList = []
+        this.loading = true
+        projectReportService.clineList({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          'projectId': this.projectId,
+          ...this.searchForm
+        }).then((data) => {
+          // console.log('进来了projectReportService', data)
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+        })
+        // this.workClientService.list({
+        //   'current': this.tablePage.currentPage,
+        //   'size': this.tablePage.pageSize,
+        //   'orders': this.tablePage.orders,
+        //   ...this.searchForm
+        // }).then(({data}) => {
+        //   console.log('进来了', data)
+        //   this.dataList = data.records
+        //   this.tablePage.total = data.total
+        //   this.loading = false
+        // })
+      },
+      // 当前页
+      currentChangeHandle ({currentPage, pageSize}) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.list()
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.list()
+      },
+      close () {
+        this.$refs.searchForm.resetFields()
+        this.visibleChoose = false
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-dialog__body {
+    padding-top: 0;
+  }
+  /deep/ .el-form-item--mini.el-form-item, .el-form-item--small.el-form-item {
+    margin-bottom: 0px;
+  }
+</style>

+ 131 - 0
src/views/cw/reportManagement/auditSheet/TypeForm.vue

@@ -0,0 +1,131 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+	  draggable
+      width="500px"
+      @close="close"
+      @keyup.enter.native="doSubmit"
+      v-model="visible">
+      <el-form :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="method==='view'"
+               label-width="100px" @submit.native.prevent>
+        <el-row  :gutter="15">
+          <el-col :span="21">
+            <el-form-item label="上级节点" prop="parentId">
+              <SelectTree
+                ref="areaTree"
+                :props="{
+                      value: 'id',             // ID字段名
+                      label: 'name',         // 显示名称
+                      children: 'children'    // 子级字段名
+                    }"
+                url="/finance-server/auditSheet/type/treeData?type=1"
+                :value="inputForm.parentId"
+                :clearable="true"
+                :accordion="true"
+                @getValue="(value) => {inputForm.parentId=value}"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="21">
+            <el-form-item label="自检名称" prop="name"
+                          :rules="[
+                          {required: true, message:'自检名称不能为空', trigger:'blur'}
+                 ]">
+              <el-input v-model="inputForm.name" placeholder="请填写自检名称"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+		<template #footer>
+			<span class="dialog-footer">
+			  <el-button @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			  <el-button type="primary" v-if="method != 'view'" @click="doSubmit()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+			</span>
+		</template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import CwProofreadTypeService from '@/api/cw/projectReportAuditSheet/CwProofreadTypeService'
+  import SelectTree from '@/components/treeSelect/treeSelect.vue'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          name: '',
+          parentId: '',
+          type: ''
+        }
+      }
+    },
+    cwProofreadTypeService: null,
+    created () {
+      this.cwProofreadTypeService = new CwProofreadTypeService()
+    },
+    components: {
+      SelectTree
+    },
+    methods: {
+      init (method, id) {
+        this.method = method
+        this.inputForm = {
+          name: '',
+          parentId: '',
+          type: ''
+        }
+        if (method === 'add') {
+          this.title = `新建自检类型`
+        } else if (method === 'edit') {
+          this.inputForm.id = id
+          this.title = '修改自检类型'
+        } else if (method === 'view') {
+          this.inputForm.id = id
+          this.title = '查看自检类型'
+        } else if (method === 'addChild') {
+          this.title = '添加下级结构'
+          this.inputForm.parentId = id
+        }
+        this.visible = true
+        this.loading = false
+        this.$nextTick(() => {
+          if (method === 'edit' || method === 'view') { // 修改或者查看
+            this.loading = true
+            this.$refs.inputForm.resetFields()
+            this.cwProofreadTypeService.findById(this.inputForm.id).then((data) => {
+              this.inputForm = this.recover(this.inputForm, data)
+              this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+              this.loading = false
+            })
+          }
+        })
+      },
+      // 表单提交
+      doSubmit () {
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            this.inputForm.type = '1'
+            this.cwProofreadTypeService.save(this.inputForm).then((data) => {
+              this.close()
+              this.$message.success(data)
+              this.$emit('refreshDataList')
+              this.loading = false
+            }).catch(() => {
+              this.loading = false
+            })
+          }
+        })
+      },
+      close () {
+        this.$refs.inputForm.resetFields()
+        this.visible = false
+      }
+    }
+  }
+</script>

+ 153 - 0
src/views/cw/reportManagement/auditSheet/TypeList.vue

@@ -0,0 +1,153 @@
+<template>
+  <div class="page">
+    <el-form :inline="true" class="query-form m-b-10" v-if="searchVisible" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+      <!-- 搜索框-->
+      <el-form-item label="自检名称" prop="name">
+        <el-input v-model="searchForm.name" placeholder="请输入自检名称" clearable></el-input>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="primary" @click="refreshList()" icon="el-icon-search">查询</el-button>
+        <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <div class="jp-table top" style="">
+      <vxe-toolbar :refresh="{query: refreshList}" custom>
+        <template #buttons>
+          <el-button v-if="hasPermission('proofread:type:add')" type="primary" icon="el-icon-plus" @click="add()">新建</el-button>
+          <el-button v-if="hasPermission('proofread:type:del')" type="danger"  icon="el-icon-delete" @click="del()" :disabled="$refs.typeTable && $refs.typeTable.getCheckboxRecords().length === 0" plain>删除</el-button>
+        </template>
+		  <template #tools>
+			  <vxe-button
+				  text
+				  type="primary"
+				  :title="searchVisible ? '收起检索' : '展开检索'"
+				  icon="vxe-icon-search"
+				  class="tool-btn"
+				  @click="searchVisible = !searchVisible"
+			  ></vxe-button>
+		  </template>
+      </vxe-toolbar>
+      <div style="height: calc(100% - 50px)">
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="auto"
+          :loading="loading"
+          ref="typeTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :tree-config="{transform: true, rowField: 'id', parentField: 'parentId',expandAll: true}"
+          :checkbox-config="{}">
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="checkbox" width="60" ></vxe-column>
+          <vxe-column title="自检内容名称" field="name" align="left" tree-node></vxe-column>
+
+          <vxe-column title="操作" width="230px" fixed="right" align="center">
+            <template  #default="scope">
+              <el-button v-if="hasPermission('proofread:type:edit')" text type="primary"  @click="addChild(scope.row.id)">添加下级结构</el-button>
+              <el-button v-if="hasPermission('proofread:type:edit')" text type="primary"  @click="edit(scope.row.id)">修改</el-button>
+              <el-button v-if="hasPermission('proofread:type:remove')" text type="primary" @click="del(scope.row.id)">删除</el-button>
+            </template>
+          </vxe-column>
+        </vxe-table>
+
+      </div>
+    </div>
+    <TypeForm  ref="typeForm" @refreshDataList="refreshList"></TypeForm>
+  </div>
+</template>
+
+<script>
+  import CwProofreadTypeService from '@/api/cw/projectReportAuditSheet/CwProofreadTypeService'
+  import TypeForm from './TypeForm'
+  export default {
+    data () {
+      return {
+      	searchVisible: true,
+        searchForm: {
+          name: '',
+          type: ''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        loading: false
+      }
+    },
+    cwProofreadTypeService: null,
+    created () {
+      this.cwProofreadTypeService = new CwProofreadTypeService()
+    },
+    components: {
+      TypeForm
+    },
+    mounted () {
+      this.refreshList()
+    },
+    methods: {
+      // 新增
+      add () {
+        this.$refs.typeForm.init('add', '')
+      },
+      addChild (id) {
+        this.$refs.typeForm.init('addChild', id)
+      },
+      // 修改
+      edit (id) {
+        id = id || this.$refs.typeTable.getCheckboxRecords().map(item => {
+          return item.id
+        })[0]
+        this.$refs.typeForm.init('edit', id)
+      },
+      // 查看
+      view (id) {
+        this.$refs.typeForm.init('view', id)
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        this.searchForm.type = '1'
+        this.cwProofreadTypeService.list({...this.searchForm}).then((data) => {
+          this.dataList = data
+          this.loading = false
+          this.$nextTick(() => {
+            this.$refs.typeTable.setAllTreeExpand(true)
+          })
+        })
+      },
+      // 删除
+      del (id) {
+        let ids = id || this.$refs.typeTable.getCheckboxRecords().map(item => {
+          return item.id
+        }).join(',')
+        this.$confirm(`确定删除所选项吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.loading = true
+          this.cwProofreadTypeService.remove(ids).then((data) => {
+            this.$message.success(data)
+            this.refreshList()
+            this.loading = false
+          })
+        })
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      }
+    }
+  }
+</script>

Plik diff jest za duży
+ 1300 - 0
src/views/cw/reportManagement/reportReview/ReportReviewForm.vue


Plik diff jest za duży
+ 1667 - 0
src/views/cw/workClientInfo/WorkClientAddForm.vue


+ 149 - 0
src/views/cw/workClientInfo/WorkClientBillingChooseRadio.vue

@@ -0,0 +1,149 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+      draggable
+      width="1000px"
+      append-to-body
+      height="500px"
+      @close="close"
+      @keyup.enter.native="getBilling"
+      v-model="visibleChoose">
+      <div style="height: calc(100%);">
+        <el-form :inline="true" class="query-form" ref="searchForm" :model="searchForm" @submit.native.prevent>
+          <!-- 搜索框-->
+          <el-form-item label="公司名称" prop="companyName">
+            <el-input v-model="searchForm.companyName" placeholder="公司名称" clearable></el-input>
+          </el-form-item>
+          <el-form-item label="纳税人识别号" prop="taxpayerIdentificationNo">
+            <el-input  v-model="searchForm.taxpayerIdentificationNo" placeholder="纳税人识别号" clearable></el-input>
+          </el-form-item>
+
+          <el-form-item>
+            <el-button type="primary" @click="list()" icon="el-icon-search">查询</el-button>
+            <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>
+          </el-form-item>
+        </el-form>
+
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="auto"
+          max-height="400"
+          :loading="loading"
+          ref="billingTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          :print-config="{}"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :row-config="{isCurrent: true}"
+          :radio-config="{trigger: 'row'}">
+          <vxe-column type="seq" width="40"></vxe-column>
+          <vxe-column type="radio" width="40px"></vxe-column>
+          <vxe-column min-width="150" title="公司名称" align="center" field="companyName" tree-node></vxe-column>
+<!--          <vxe-column min-width="150" title="是否有纳税人识别号" align="center" field="isTaxpayerIdentificationNo">-->
+<!--            <template slot-scope="scope">-->
+<!--              {{$dictUtils.getDictLabel('yes_no', scope.row.isTaxpayerIdentificationNo, '-')}}-->
+<!--            </template>-->
+<!--          </vxe-column>-->
+<!--          <vxe-column min-width="150" title="纳税人识别号" align="center" field="taxpayerIdentificationNo"></vxe-column>-->
+          <vxe-column min-width="150" title="开户行" align="center" field="accountHolder"></vxe-column>
+          <vxe-column min-width="150" title="银行账号" align="center" field="account"></vxe-column>
+          <vxe-column min-width="150" title="电话" align="center" field="phone"></vxe-column>
+          <vxe-column min-width="150" title="地址" align="center" field="address"></vxe-column>
+        </vxe-table>
+      </div>
+		<template #footer>
+			<span class="dialog-footer">
+			  <el-button @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			  <el-button type="primary" v-if="method != 'view'" @click="getBilling()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+			</span>
+		</template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import workClientService from '@/api/cw/workClientInfo/WorkClientService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visibleChoose: false,
+        loading: false,
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        dataList: [],
+        searchForm: {
+          clientId: '',
+          companyName: '',
+          taxpayerIdentificationNo: ''
+        },
+        clientId: ''
+      }
+    },
+    created () {
+    },
+    components: {
+    },
+    methods: {
+      init (id) {
+        this.title = '开票信息选择'
+        this.visibleChoose = true
+        this.clientId = id
+        this.list()
+      },
+      // 表单提交
+      getBilling () {
+        let row = this.$refs.billingTable.getRadioRecord()
+        if (this.commonJS.isEmpty(row)) {
+          this.$message.error('请至少选择一条数据')
+        } else {
+          this.close()
+          this.$emit('getBilling', row)
+        }
+      },
+      list () {
+        this.dataList = []
+        this.loading = true
+        this.searchForm.clientId = this.clientId
+        workClientService.getBillingListByClientId(this.searchForm).then(({data}) => {
+          this.dataList = data
+          this.loading = false
+        })
+      },
+      // 当前页
+      currentChangeHandle ({currentPage, pageSize}) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.list()
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.list()
+      },
+      close () {
+        this.$refs.searchForm.resetFields()
+        this.visibleChoose = false
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-dialog__body {
+    padding-top: 0;
+  }
+  /deep/ .el-form-item--mini.el-form-item, .el-form-item--small.el-form-item {
+    margin-bottom: 0px;
+  }
+</style>

+ 197 - 0
src/views/cw/workClientInfo/WorkClientChooseForm.vue

@@ -0,0 +1,197 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+	  draggable
+      width="1400px"
+      append-to-body
+      height="500px"
+      @close="close"
+      @keyup.enter.native="getWorkClient"
+      v-model="visibleChoose">
+      <div style="height: calc(100%);">
+        <el-form size="small" :inline="true" class="query-form m-b-10" ref="searchForm" :model="searchForm" @submit.native.prevent>
+          <!-- 搜索框-->
+          <el-form-item label="客户名称" prop="name">
+            <el-input size="small" v-model="searchForm.name" placeholder="客户名称" clearable></el-input>
+          </el-form-item>
+          <el-form-item label="客户编号" prop="no">
+            <el-input size="small" v-model="searchForm.no" placeholder="客户编号" clearable></el-input>
+          </el-form-item>
+          <el-form-item label="客户类型" prop="type">
+            <el-select v-model="searchForm.type" placeholder="请选择" style="width:100%" clearable>
+              <el-option
+                v-for="item in $dictUtils.getDictList('cw_work_client_type')"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="所属行业" prop="industry">
+            <el-select v-model="searchForm.industry" placeholder="请选择" style="width:100%" clearable>
+              <el-option
+                v-for="item in $dictUtils.getDictList('cw_work_client_industry')"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+
+
+          <el-form-item>
+            <el-button type="primary" @click="list()" size="small" icon="el-icon-search">查询</el-button>
+            <el-button @click="resetSearch()" size="small" icon="el-icon-refresh-right">重置</el-button>
+          </el-form-item>
+        </el-form>
+
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="400px"
+          :loading="loading"
+          size="small"
+          ref="clientTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          :print-config="{}"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :row-config="{isCurrent: true}"
+          :tree-config="{transform: true, rowField: 'id', parentField: 'oneUpCompany'}"
+          :checkbox-config="{trigger: 'row', checkStrictly: true}">
+          <vxe-column type="seq" width="40"></vxe-column>
+          <vxe-column type="checkbox" width="60px"></vxe-column>
+          <vxe-column width="" title="客户名称" align="center" field="name" tree-node></vxe-column>
+          <vxe-column width="" title="客户编号" align="center" field="no"></vxe-column>
+          <vxe-column width="" title="客户类型" align="center" field="type">
+            <template #default="scope">
+              {{$dictUtils.getDictLabel('cw_work_client_type', scope.row.type, '-')}}
+            </template>
+          </vxe-column>
+          <vxe-column width="" title="所属行业" align="center" field="industry">
+            <template #default="scope">
+              {{$dictUtils.getDictLabel('cw_work_client_industry', scope.row.industry, '-')}}
+            </template>
+          </vxe-column>
+          <vxe-column width="" title="联系电话" align="center" field="mobile"></vxe-column>
+          <vxe-column width="" title="公司级次" align="center" field="companyLevel"></vxe-column>
+        </vxe-table>
+      </div>
+<!--      <span slot="footer" class="dialog-footer">-->
+<!--      <el-button size="small" @click="close()" icon="el-icon-circle-close">关闭</el-button>-->
+<!--      <el-button size="small" type="primary" v-if="method != 'view'" @click="getWorkClient()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>-->
+<!--    </span>-->
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button size="small" @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			<el-button size="small" type="primary" v-if="method != 'view'" @click="getWorkClient()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+			</span>
+		</template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import workClientService from '@/api/cw/workClientInfo/WorkClientService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visibleChoose: false,
+        loading: false,
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        dataList: [],
+        searchForm: {
+          name: '',
+          no: '',
+          type: '',
+          industry: ''
+        }
+      }
+    },
+    created () {
+    },
+    components: {
+    },
+    methods: {
+      init (deputy) {
+        this.title = '客户选择'
+        this.visibleChoose = true
+        this.list()
+      },
+      // 表单提交
+      getWorkClient () {
+        let rows = this.$refs.clientTable.getCheckboxRecords()
+        if (this.commonJS.isEmpty(rows)) {
+          this.$message.error('请至少选择一条数据')
+          return
+        }
+        let list = []
+        if (!this.commonJS.isEmpty(rows)) {
+          rows.forEach(item => {
+            let p = {
+              id: item.id,
+              name: item.name,
+              no: item.no,
+              type: item.type,
+              industry: item.industry,
+              companyLevel: item.companyLevel
+            }
+            list.push(p)
+          })
+        }
+        this.close()
+        this.$emit('getWorkClientChoose', list)
+      },
+      list () {
+        this.dataList = []
+        this.loading = true
+        this.searchForm.isTrue = '1'
+        workClientService.listTree({
+          'current': 1,
+          'size': -1,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+        })
+      },
+      // 当前页
+      currentChangeHandle ({currentPage, pageSize}) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.list()
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.list()
+      },
+      close () {
+        this.$refs.searchForm.resetFields()
+        this.visibleChoose = false
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-dialog__body {
+    padding-top: 0;
+  }
+  /deep/ .el-form-item--mini.el-form-item, .el-form-item--small.el-form-item {
+    margin-bottom: 0px;
+  }
+</style>

+ 183 - 0
src/views/cw/workClientInfo/WorkClientChooseRadio.vue

@@ -0,0 +1,183 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+	  draggable
+      width="1400px"
+      append-to-body
+      height="500px"
+      @close="close"
+      @keyup.enter.native="getWorkClient"
+	  v-model="visibleChoose">
+      <div style="height: calc(100%);">
+		<el-form size="small" :inline="true" class="query-form m-b-10" ref="searchForm" :model="searchForm" @submit.native.prevent>
+          <!-- 搜索框-->
+          <el-form-item label="客户名称" prop="name">
+            <el-input size="small" v-model="searchForm.name" placeholder="客户名称" clearable></el-input>
+          </el-form-item>
+          <el-form-item label="客户编号" prop="no">
+            <el-input size="small" v-model="searchForm.no" placeholder="客户编号" clearable></el-input>
+          </el-form-item>
+          <el-form-item label="客户类型" prop="type">
+            <el-select v-model="searchForm.type" placeholder="请选择" style="width:100%" clearable>
+              <el-option
+                v-for="item in $dictUtils.getDictList('cw_work_client_type')"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="所属行业" prop="industry">
+            <el-select v-model="searchForm.industry" placeholder="请选择" style="width:100%;" clearable>
+              <el-option
+                v-for="item in $dictUtils.getDictList('cw_work_client_industry')"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+
+
+          <el-form-item>
+            <el-button type="primary" @click="list()" size="small" icon="el-icon-search">查询</el-button>
+            <el-button @click="resetSearch()" size="small" icon="el-icon-refresh-right">重置</el-button>
+          </el-form-item>
+        </el-form>
+
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="400px"
+          :loading="loading"
+          size="small"
+          ref="clientTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          :print-config="{}"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :row-config="{isCurrent: true}"
+          :tree-config="{transform: true, rowField: 'id', parentField: 'oneUpCompany'}"
+          :radio-config="{trigger: 'row'}">
+          <vxe-column type="seq" width="40"></vxe-column>
+          <vxe-column type="radio" width="60px"></vxe-column>
+          <vxe-column width="" title="客户名称" align="center" field="name" tree-node></vxe-column>
+          <vxe-column width="" title="客户编号" align="center" field="no"></vxe-column>
+          <vxe-column width="" title="客户类型" align="center" field="type">
+            <template #default="scope">
+              {{$dictUtils.getDictLabel('cw_work_client_type', scope.row.type, '-')}}
+            </template>
+          </vxe-column>
+          <vxe-column width="" title="所属行业" align="center" field="industry">
+            <template #default="scope">
+              {{$dictUtils.getDictLabel('cw_work_client_industry', scope.row.industry, '-')}}
+            </template>
+          </vxe-column>
+          <vxe-column width="" title="联系电话" align="center" field="mobile"></vxe-column>
+          <vxe-column width="" title="公司级次" align="center" field="companyLevel"></vxe-column>
+        </vxe-table>
+      </div>
+<!--      <span slot="footer" class="dialog-footer">-->
+<!--      <el-button size="small" @click="close()" icon="circle-close">关闭</el-button>-->
+<!--      <el-button size="small" type="primary" v-if="method != 'view'" @click="getWorkClient()" icon="circle-check" v-noMoreClick>确定</el-button>-->
+<!--    </span>-->
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button size="small" @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			<el-button size="small" type="primary" v-if="method != 'view'" @click="getWorkClient()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+			</span>
+		</template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import workClientService from '@/api/cw/workClientInfo/WorkClientService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visibleChoose: false,
+        loading: false,
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        dataList: [],
+        searchForm: {
+          name: '',
+          no: '',
+          type: '',
+          industry: ''
+        }
+      }
+    },
+    created () {
+    },
+    components: {
+    },
+    methods: {
+      init (deputy) {
+        this.title = '客户选择'
+        this.visibleChoose = true
+        this.list()
+      },
+      // 表单提交
+      getWorkClient () {
+        let row = this.$refs.clientTable.getRadioRecord()
+        if (this.commonJS.isEmpty(row)) {
+          this.$message.error('请至少选择一条数据')
+        } else {
+          this.close()
+          this.$emit('getWorkClientRadioChoose', row)
+        }
+      },
+      list () {
+        this.dataList = []
+        this.loading = true
+        this.searchForm.isTrue = '1'
+        workClientService.listTree({
+          'current': 1,
+          'size': -1,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+        })
+      },
+      // 当前页
+      currentChangeHandle ({currentPage, pageSize}) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.list()
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.list()
+      },
+      close () {
+        this.$refs.searchForm.resetFields()
+        this.visibleChoose = false
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-dialog__body {
+    padding-top: 0;
+  }
+  /deep/ .el-form-item--mini.el-form-item, .el-form-item--small.el-form-item {
+    margin-bottom: 0px;
+  }
+</style>

Plik diff jest za duży
+ 1898 - 0
src/views/cw/workClientInfo/WorkClientForm.vue


+ 654 - 0
src/views/cw/workClientInfo/WorkClientList.vue

@@ -0,0 +1,654 @@
+<template>
+  <div class="page">
+    <el-form :inline="true" v-if="searchVisible" class="query-form m-b-10" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+      <!-- 搜索框-->
+      <el-form-item label="客户名称" prop="name">
+        <el-input  v-model="searchForm.name" placeholder="请输入客户名称" clearable></el-input>
+      </el-form-item>
+      <el-form-item label="客户编号" prop="no">
+        <el-input  v-model="searchForm.no" placeholder="请输入客户编号" clearable></el-input>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="统一社会信用代码" prop="uscCode">
+        <el-input v-model="searchForm.uscCode" placeholder="请输入统一社会信用代码" clearable></el-input>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="企业隶属关系划分" prop="affiliation">
+        <el-select v-model="searchForm.affiliation" placeholder="请选择" style="width:100%;" clearable>
+          <el-option
+            v-for="item in $dictUtils.getDictList('cw_work_client_affiliation')"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="按所有制性质分类" prop="cwWorkClientTypeDTO.ownershipType">
+        <el-select v-model="searchForm.cwWorkClientTypeDTO.ownershipType" placeholder="请选择" style="width:100%;" clearable>
+          <el-option
+            v-for="item in $dictUtils.getDictList('cw_work_client_ownership_type')"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="所属行业" prop="industry">
+        <el-select v-model="searchForm.industry" placeholder="请选择" style="width:100%;" clearable>
+          <el-option
+            v-for="item in $dictUtils.getDictList('cw_work_client_industry')"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="创建时间" prop="createDates">
+        <el-date-picker
+          placement="bottom-start"
+          format="yyyy-MM-dd HH:mm:ss"
+          value-format="yyyy-MM-dd HH:mm:ss"
+          v-model="searchForm.createDates"
+          type="datetimerange"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="状态" prop="status">
+        <el-select v-model="searchForm.status" placeholder="请选择" style="width:100%;" clearable>
+          <el-option
+            v-for="item in $dictUtils.getDictList('cw_status')"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <!--<el-form-item label="拥有人" prop="updateUserName">
+        <el-input size="small" v-model="searchForm.updateUserName" placeholder="请输入拥有人" clearable></el-input>
+      </el-form-item>-->
+      <el-form-item>
+        <el-button type="default" @click="showHide"  :icon="showHideIcon">{{showHideName}}</el-button>
+        <el-button type="primary" @click="refreshList()"  icon="el-icon-search">查询</el-button>
+        <el-button @click="resetSearch()"  icon="el-icon-refresh-right">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <div class="jp-table top" style="">
+      <vxe-toolbar :refresh="{query: refreshList}" ref="toolbarRef" export custom>
+        <template #buttons>
+          <el-button v-if="hasPermission('cw_work_client:info:add')" type="primary"  icon="el-icon-plus" @click="add()">新建</el-button>
+<!--          <el-button v-if="hasPermission('cw_work_client:info:view')" size="small" @click="viewUpdateLog()">修改申请记录</el-button>-->
+
+          <!--          <el-button v-if="hasPermission('klg:question:del')" type="danger"   size="small" icon="el-icon-delete" @click="del()" :disabled="$refs.questionsTable && $refs.questionsTable.getCheckboxRecords().length === 0" plain>删除</el-button>-->
+<!--          <el-button type="warning" size="small" icon="el-icon-download" @click="exportFile()" plain>导出</el-button>-->
+		</template>
+		  <template #tools>
+			  <vxe-button
+				  type="text"
+				  :title="searchVisible ? '收起检索' : '展开检索'"
+				  icon="vxe-icon-search"
+				  class="tool-btn"
+				  @click="searchVisible = !searchVisible"
+			  ></vxe-button>
+		  </template>
+      </vxe-toolbar>
+      <div style="height: calc(100% - 90px)">
+        <vxe-table
+          :key="tableKey"
+          border="inner"
+          auto-resize
+          resizable
+          height="auto"
+          :loading="loading"
+          size="small"
+          ref="clientTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          @sort-change="sortChangeHandle"
+          :export-config="{
+                    remote: true,
+                    filename: `客户信息数据${moment(new Date()).format('YYYY-MM-DD')}`,
+                    sheetName: `客户信息数据${moment(new Date()).format('YYYY-MM-DD')}`,
+                    exportMethod: exportMethod,
+                    types: ['xlsx'],
+                    modes: ['current', 'selected', 'all']
+                  }"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :checkbox-config="{}">
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="checkbox" width="40" ></vxe-column>
+          <vxe-column min-width="230" align="center" title="客户名称" field="name">
+            <template #default="scope">
+              <el-link  type="primary" :underline="false" v-if="hasPermission('cw_work_client:info:view')" @click="view(scope.row.id)">{{scope.row.name}}</el-link>
+              <el-link  type="primary" :underline="false" v-else-if="hasPermission('cw_work_client:info:view')"  @click="view(scope.row.id)">{{scope.row.name}}</el-link>
+              <span v-else>{{scope.row.name}}</span>
+            </template>
+          </vxe-column>
+          <vxe-column min-width="160" align="center" title="客户编号" field="no"></vxe-column>
+          <vxe-column min-width="160" align="center" title="客户类型" field="type">
+            <template #default="scope">
+              {{$dictUtils.getDictLabel('cw_work_client_type', scope.row.type, '-')}}
+            </template>
+          </vxe-column>
+          <vxe-column min-width="160" align="center" title="统一社会信用代码" field="uscCode"></vxe-column>
+<!--          <vxe-column min-width="160" align="center" title="英文名称" field="englishName"></vxe-column>-->
+          <vxe-column min-width="160" align="center" title="所属行业" field="industry">
+            <template #default="scope">
+              {{$dictUtils.getDictLabel('cw_work_client_industry', scope.row.industry, '-')}}
+            </template>
+          </vxe-column>
+          <vxe-column min-width="160" align="center" title="是否上市" field="cwWorkClientTypeDTO.isListed">
+            <template #default="scope">
+              {{$dictUtils.getDictLabel('yes_no', scope.row.cwWorkClientTypeDTO.isListed, '-')}}
+            </template>
+          </vxe-column>
+          <vxe-column min-width="160" align="center" title="企业隶属关系划分" field="affiliation">
+            <template #default="scope">
+              {{$dictUtils.getDictLabel('cw_work_client_affiliation', scope.row.affiliation, '-')}}
+            </template>
+          </vxe-column>
+          <vxe-column min-width="160" align="center" title="按所有制性质分类" field="cwWorkClientTypeDTO.ownershipType">
+            <template #default="scope">
+              {{$dictUtils.getDictLabel('cw_work_client_ownership_type', scope.row.cwWorkClientTypeDTO.ownershipType, '-')}}
+            </template>
+          </vxe-column>
+          <vxe-column min-width="160" align="center" title="按最终地位分类" field="cwWorkClientTypeDTO.finalStatusType"></vxe-column>
+<!--          <vxe-column min-width="160" align="center" title="客户报备类型" field="reportType">-->
+<!--            <template #default="scope">-->
+<!--              {{$dictUtils.getDictLabel('cw_work_client_report_type', scope.row.reportType, '-')}}-->
+<!--            </template>-->
+<!--          </vxe-column>-->
+          <vxe-column min-width="160" align="center" title="创建人" field="createBy.name"></vxe-column>
+          <vxe-column min-width="160" align="center" title="创建时间" field="createTime"></vxe-column>
+          <vxe-column min-width="120" align="center" title="拥有人" fixed="right" field="updateUserName">
+            <template #default="scope">
+              <el-link  type="primary" :underline="false" v-if="hasPermission('cw_work_client:info:view')" @click="updateLog(scope.row.id)">{{scope.row.updateUserName}}</el-link>
+              <span v-else>{{scope.row.updateUserName}}</span>
+            </template>
+          </vxe-column>
+          <vxe-column  min-width="100px" align="center" fixed="right" title="修改申请状态" field="status" >
+            <template #default="scope">
+              <el-button @click="detail(scope.row)" effect="dark" size="small"
+                          :type="$dictUtils.getDictLabel('cw_status_flag', scope.row.status, '-')">
+                {{$dictUtils.getDictLabel("cw_status", scope.row.status, '-')}}
+              </el-button>
+            </template>
+          </vxe-column>
+          <vxe-column title="操作" width="140px" fixed="right" align="center">
+            <template  #default="scope">
+              <div v-if="isAdmin">
+                <el-button v-if="(scope.row.status==='0'||scope.row.status==='5')" type="primary"  size="small" @click="edit(scope.row.id)">修改</el-button>
+                <el-button v-if="(scope.row.status==='0'||scope.row.status==='5')" type="primary"   size="small" @click="del(scope.row.id)">删除</el-button>
+              </div>
+              <div v-else>
+                <!--              拥有人修改-->
+                <el-button v-if="hasPermission('cw_work_client:info:edit')&&scope.row.updateUser === $store.state.user.id&&(scope.row.status==='0'||scope.row.status==='5')" text type="primary"  size="small" @click="edit(scope.row.id)">修改</el-button>
+                <!--              其他人修改-->
+                <el-button v-if="hasPermission('cw_work_client:info:edit')&&scope.row.updateUser !== $store.state.user.id&&(scope.row.status==='0'||scope.row.status==='5')" text type="primary"  size="small" @click="push(scope.row)">申请修改</el-button>
+                <!--              审核-->
+                <el-button v-if="scope.row.status==='2' && checkIsAudit(scope.row)" text type="primary"  size="small" @click="examine(scope.row)">审核</el-button>
+                <!--              被驳回后当前申请人重新调整-->
+                <el-button v-if="hasPermission('cw_work_client:info:edit')&&scope.row.requestUserId === $store.state.user.id&&scope.row.status === '4'" text type="primary"  size="small" @click="adjust(scope.row)">驳回调整</el-button>
+                <!--              当前申请人撤回-->
+                <el-button v-if="hasPermission('cw_work_client:info:edit')&&scope.row.requestUserId === $store.state.user.id&&scope.row.status==='2'" text type="primary"  size="small" @click="reback(scope.row)">撤回</el-button>
+                <!--              当前申请人撤回后->申请修改-->
+                <el-button v-if="hasPermission('cw_work_client:info:edit')&&scope.row.requestUserId === $store.state.user.id&&scope.row.status==='3'" text type="primary"  size="small" @click="push(scope.row)">申请修改</el-button>
+                <!--              当前申请人撤回后->取消修改申请-->
+                <el-button v-if="hasPermission('cw_work_client:info:edit')&&scope.row.requestUserId === $store.state.user.id&&scope.row.status==='3'" text type="primary"  size="small" @click="stopUpdate(scope.row.id)">取消修改</el-button>
+                <!--              拥有人删除-->
+                <el-button v-if="hasPermission('cw_work_client:info:del')&&scope.row.updateUser === $store.state.user.id&&(scope.row.status==='0'||scope.row.status==='5')" text type="primary"   size="small" @click="del(scope.row.id)">删除</el-button>
+              </div>
+            </template>
+          </vxe-column>
+        </vxe-table>
+        <vxe-pager
+          background
+          size="small"
+          :current-page="tablePage.currentPage"
+          :page-size="tablePage.pageSize"
+          :total="tablePage.total"
+          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+          @page-change="currentChangeHandle">
+        </vxe-pager>
+      </div>
+
+    </div>
+    <WorkClientForm ref="workClientForm" @refreshList="refreshList"></WorkClientForm>
+    <WorkClientAddForm ref="workClientAddForm" @refreshList="refreshList" @updateDialogData="updateDialogData" @updateFlowAbleData="updateFlowAbleData"></WorkClientAddForm>
+    <WorkClientUpdateLog ref="workClientUpdateLog" @refreshList=""></WorkClientUpdateLog>
+  </div>
+</template>
+
+<script>
+  import workClientService from '@/api/cw/workClientInfo/WorkClientService'
+  import taskService from '@/api/flowable/TaskService'
+  import processService from '@/api/flowable/ProcessService'
+  import WorkClientForm from './WorkClientForm'
+  import pick from 'lodash.pick'
+  import userService from '@/api/sys/UserService'
+  import WorkClientAddForm from './WorkClientAddForm'
+  import WorkClientUpdateLog from './WorkClientUpdateLog'
+  export default {
+    data () {
+      return {
+		searchVisible: true,
+        showHideItem: false,
+        showHideIcon: 'el-icon-arrow-down',
+        showHideName: '展示',
+        searchForm: {
+          name: '',
+          no: '',
+          uscCode: '',
+          affiliation: '',
+          cwWorkClientTypeDTO: {
+            ownershipType: ''
+          },
+          industry: '',
+          createDates: [],
+          status: '',
+          updateUserName: ''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        tableKey: '',
+        loading: false,
+        processDefinitionAuditId: '',
+        procDefAuditKey: '',
+        isAdmin: false
+      }
+    },
+    created () {
+    },
+    components: {
+      WorkClientForm,
+      WorkClientAddForm,
+      WorkClientUpdateLog
+    },
+    computed: {
+      userName () {
+        return this.$store.state.user.name
+      },
+      user () {
+        this.createName = this.$store.state.user.name
+        return this.$store.state.user
+      }
+    },
+    mounted () {
+      this.refreshList();
+		this.$nextTick(() => {
+			//将表格和工具栏进行关联
+			const $table = this.$refs.clientTable;
+			const $toolbar = this.$refs.toolbarRef;
+			$table.connect($toolbar);
+		})
+    },
+    activated () {
+      let query = this.$route.query
+      if (this.commonJS.isNotEmpty(query.methodName)) {
+        if (query.methodName === 'updateFlowAbleData') {
+          this.updateFlowAbleData(query.dataId)
+        }
+        if (query.methodName === 'updateDialogData') {
+          this.updateDialogData(query.dataId)
+        }
+      }
+      this.refreshList()
+    },
+    methods: {
+      showHide () {
+        if (this.showHideItem === false) {
+          this.showHideItem = true
+          this.showHideIcon = 'el-icon-arrow-up'
+          this.showHideName = '隐藏'
+        } else {
+          this.showHideItem = false
+          this.showHideIcon = 'el-icon-arrow-down'
+          this.showHideName = '展示'
+        }
+      },
+      // 修改申请日志
+      viewUpdateLog () {
+        this.$refs.workClientUpdateLog.init()
+      },
+      // 修改申请日志
+      updateLog (id) {
+        this.$refs.workClientUpdateLog.init(id)
+      },
+      // 新增
+      add () {
+        this.$refs.workClientAddForm.init('add', 'false')
+      },
+      // 修改
+      edit (id) {
+        id = id || this.$refs.clientTable.getCheckboxRecords().map(item => {
+          return item.id
+        })[0]
+        this.$refs.workClientAddForm.init('edit', id)
+      },
+      updateDialogData (id) {
+        this.$refs.workClientAddForm.init('edit', id)
+        this.$store.dispatch('tagsView/delView', {fullPath: this.$route.fullPath})
+        this.$router.push({query: {}})
+      },
+      // 查看
+      view (id) {
+        this.$refs.workClientForm.init('view', id)
+      },
+      // 查询当前用户是否是管理员用户
+      checkIsAdmin () {
+        userService.is().then((data) => {
+          this.isAdmin = data
+        })
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        workClientService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+        })
+        this.checkIsAdmin()
+        processService.getByName('会计-客户修改').then(async (data) => {
+          if (!this.commonJS.isEmpty(data.id)) {
+            this.processDefinitionAuditId = data.id
+            this.procDefAuditKey = data.key
+          }
+        })
+      },
+      // 当前页
+      currentChangeHandle ({ currentPage, pageSize }) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.refreshList()
+      },
+      // 排序
+      sortChangeHandle (column) {
+        this.tablePage.orders = []
+        if (column.order != null) {
+          this.tablePage.orders.push({column: this.$utils.toLine(column.property), asc: column.order === 'asc'})
+        }
+        this.refreshList()
+      },
+      // 删除
+      del (id) {
+        let ids = id || this.$refs.clientTable.getCheckboxRecords().map(item => {
+          return item.id
+        }).join(',')
+        this.$confirm(`确定删除所选项吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.loading = true
+          workClientService.delete(ids).then((data) => {
+            if (data === '删除成功') {
+              this.$message.success(data)
+            } else {
+              this.$message.error(data)
+            }
+            this.refreshList()
+            this.loading = false
+          })
+        })
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      },
+      start () {
+        // 读取流程表单
+        let tabTitle = `发起流程【会计-客户修改】`
+        let processTitle = `${this.userName} 在 ${this.moment(new Date()).format('YYYY-MM-DD HH:mm')} 发起了 [会计-客户修改]`
+        taskService.getTaskDef({ procDefId: this.processDefinitionAuditId,
+          status: 'startAndHold'}).then((data) => {
+            this.$router.push({
+              path: '/flowable/task/TaskForm',
+              query: {
+                ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                procDefId: this.processDefinitionAuditId,
+                procDefKey: this.procDefAuditKey,
+                status: 'startAndHold',
+                title: tabTitle,
+                formType: data.formType,
+                formUrl: data.formUrl,
+                formTitle: processTitle,
+                businessId: 'false',
+                isShow: false,
+                routePath: '/cw/workClientInfo/WorkClientList'
+              }
+            })
+          })
+      },
+      updateFlowAbleData (id) {
+        workClientService.queryById(id).then((data) => {
+          this.$store.dispatch('tagsView/delView', {fullPath: this.$route.fullPath})
+          this.$router.push({query: {}})
+          // 读取流程表单
+          let title = `发起流程【会计-客户修改】`
+          let processTitle = `${this.userName} 发起了 ${data.no} - ${data.name} [会计-客户修改]`
+          let status = 'startAndClose'
+          if (data.status === '3') {
+            status = 'startAndClose'
+          } else if (data.status === '4') {
+            status = 'reapplyFlag'
+          }
+          taskService.getTaskDef({ procDefId: this.processDefinitionAuditId,
+            businessId: data.id,
+            businessTable: 'cw_work_client_base'}).then((task) => {
+              this.$router.push({
+                path: '/flowable/task/TaskForm',
+                query: {
+                  ...pick(task, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                  procDefId: this.processDefinitionAuditId,
+                  procDefKey: this.procDefAuditKey,
+                  title: title,
+                  formType: task.formType,
+                  formUrl: task.formUrl,
+                  formTitle: processTitle,
+                  businessTable: 'cw_work_client_base',
+                  businessId: data.id,
+                  isShow: 'false',
+                  status: status,
+                  routePath: '/cw/workClientInfo/WorkClientList'
+                }
+              })
+            })
+        })
+      },
+      // 发起客户修改
+      push (row) {
+        workClientService.queryById(row.id).then((data) => {
+          if (data.status !== row.status) { // status的值不等于“审核中”,就弹出提示
+            this.$message.error('数据已发生改变或不存在,请刷新数据')
+            this.refreshList()
+          } else {
+            // 读取流程表单
+            let title = `发起流程【会计-客户修改】`
+            let processTitle = `${this.userName} 发起了 ${row.no} - ${row.name} [会计-客户修改]`
+            let status = 'startAndClose'
+            if (row.status === '3') {
+              status = 'startAndClose'
+            } else if (row.status === '4') {
+              status = 'reapplyFlag'
+            }
+            taskService.getTaskDef({ procDefId: this.processDefinitionAuditId,
+              businessId: row.id,
+              businessTable: 'cw_work_client_base'}).then((data) => {
+                this.$router.push({
+                  path: '/flowable/task/TaskForm',
+                  query: {
+                    ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                    procDefId: this.processDefinitionAuditId,
+                    procDefKey: this.procDefAuditKey,
+                    title: title,
+                    formType: data.formType,
+                    formUrl: data.formUrl,
+                    formTitle: processTitle,
+                    businessTable: 'cw_work_client_base',
+                    businessId: row.id,
+                    isShow: 'false',
+                    status: status,
+                    routePath: '/cw/workClientInfo/WorkClientList'
+                  }
+                })
+              })
+          }
+        })
+      },
+      // 查看客户修改流程结果
+      detail (row) {
+        if (row.status !== '0' && row.status !== '1') {
+          // eslint-disable-next-line eqeqeq
+          taskService.getTaskDef({
+            procInsId: row.procInsId,
+            procDefId: this.processDefinitionAuditId
+          }).then((data) => {
+            this.$router.push({
+              path: '/flowable/task/TaskFormDetail',
+              query: {
+                ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                isShow: 'false',
+                readOnly: true,
+                title: '会计-客户修改' + '流程详情',
+                formTitle: '会计-客户修改' + '流程详情',
+                businessId: row.id,
+                status: 'reback'
+              }
+            })
+          })
+        }
+      },
+      // 撤回客户修改
+      reback (row) {
+        this.$confirm(`确定要撤回该申请吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          workClientService.queryById(row.id).then((data) => {
+            if (data.status !== '2') { // status的值不等于“审核中”,就弹出提示
+              this.$message.error('数据已发生改变或不存在,请刷新数据')
+              this.refreshList()
+            } else {
+              processService.revokeProcIns(row.procInsId).then((data) => {
+                let form = {status: '3', id: row.id}
+                workClientService.updateStatusById(form).then(() => {
+                  workClientService.rebackUpdate(row.id).then(() => {
+                    this.$message.success(data)
+                    this.refreshList()
+                  })
+                })
+              })
+            }
+          })
+        })
+      },
+      // 取消修改申请
+      stopUpdate (id) {
+        this.$confirm(`确定要取消修改申请?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          workClientService.stopUpdate(id).then(() => {
+            this.$message.success('修改申请已取消')
+            this.refreshList()
+          })
+        })
+      },
+      // 自定义服务端导出
+      exportMethod ({ options }) {
+        // 传给服务端的参数
+        const params = {
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm,
+          filename: options.filename,
+          sheetName: options.sheetName,
+          isHeader: options.isHeader,
+          original: options.original,
+          mode: options.mode,
+          selectIds: options.mode === 'selected' ? options.map(item => item.id) : [],
+          exportFields: options.columns.map(column => column.property)
+        }
+        return workClientService.exportFile(params).then((res) => {
+          // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(res, options.filename)
+        }).catch(function (err) {
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      },
+      // 驳回后调整
+      adjust (row) {
+        workClientService.queryById(row.id).then((data) => {
+          if (data.status !== '4') { // status的值不等于“驳回”,就弹出提示
+            this.$message.error('数据已发生改变或不存在,请刷新数据')
+            this.refreshList()
+          } else {
+            this.todo(row)
+          }
+        })
+      },
+      // 审核
+      examine (row) {
+        workClientService.queryById(row.id).then((data) => {
+          if (data.status !== '2') { // status的值不等于“审核中”,就弹出提示
+            this.$message.error('数据已发生改变或不存在,请刷新数据')
+            this.refreshList()
+          } else {
+            this.todo(row)
+          }
+        })
+      },
+      // 审核或重新调整跳转
+      todo (row) {
+        let cUser = false
+        taskService.getTaskDefInfo({
+          taskId: row.taskId
+        }).then((data) => {
+          this.$router.push({
+            path: '/flowable/task/TaskForm',
+            query: {
+              ...pick(data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title', 'businessId'),
+              isShow: false,
+              formReadOnly: true,
+              formTitle: `${data.taskName}`,
+              cUser: cUser,
+              title: `审批【${data.taskName || ''}】`,
+              routePath: '/cw/workClientInfo/WorkClientList'   // 数据处理后需要跳转的页面路径
+            }
+          })
+        })
+      },
+      // 查询当前登录人是否是数据的审核人
+      checkIsAudit (row) {
+        let loginUserId = this.$store.state.user.id  // 获取当前登录用户id
+        if (this.commonJS.isNotEmpty(row.auditUserIds)) {
+          for (const userId of row.auditUserIds) {
+            if (userId === loginUserId) {  // 当数据的审核人中包含当前登录人id时,返回true
+              return true
+            }
+          }
+        }
+        return false
+      }
+    }
+  }
+</script>

+ 180 - 0
src/views/cw/workClientInfo/WorkClientListForm.vue

@@ -0,0 +1,180 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+	  draggable
+      width="1100px"
+      height="500px"
+      @close="close"
+      append-to-body
+      @keyup.enter.native="getWorkClient"
+      v-model="visible">
+      <div style="height: calc(100%);">
+        <el-form size="small" :inline="true" class="query-form" ref="searchForm" :model="searchForm" @submit.native.prevent>
+          <!-- 搜索框-->
+          <el-form-item label="客户姓名" prop="name">
+            <el-input size="small" v-model="searchForm.name" placeholder="请输入客户姓名" clearable></el-input>
+          </el-form-item>
+          <el-form-item label="客户编号" prop="no">
+            <el-input size="small" v-model="searchForm.no" placeholder="请输入客户编号" clearable></el-input>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" @click="list()" size="small" icon="el-icon-search">查询</el-button>
+            <el-button @click="resetSearch()" size="small" icon="el-icon-refresh-right">重置</el-button>
+          </el-form-item>
+        </el-form>
+
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="400px"
+          :loading="loading"
+          size="small"
+          ref="clientTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          :print-config="{}"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :row-config="{isCurrent: true}"
+          :checkbox-config="{trigger: 'row'}">
+          <vxe-column type="seq" width="40"></vxe-column>
+          <vxe-column type="checkbox" width="40px"></vxe-column>
+          <vxe-column width="" title="客户名称" align="center" field="name"></vxe-column>
+          <vxe-column width="" title="客户编号" align="center" field="no"></vxe-column>
+          <vxe-column width="" title="客户类型" align="center" field="type">
+            <template slot-scope="scope">
+              {{$dictUtils.getDictLabel('cw_work_client_type', scope.row.type, '-')}}
+            </template>
+          </vxe-column>
+          <vxe-column width="" title="所属行业" align="center" field="industry">
+            <template slot-scope="scope">
+              {{$dictUtils.getDictLabel('cw_work_client_industry', scope.row.industry, '-')}}
+            </template>
+          </vxe-column>
+          <vxe-column width="" title="公司级次" align="center" field="companyLevel"></vxe-column>
+        </vxe-table>
+        <vxe-pager
+          background
+          size="small"
+          :current-page="tablePage.currentPage"
+          :page-size="tablePage.pageSize"
+          :total="tablePage.total"
+          :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+          :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+          @page-change="currentChangeHandle">
+        </vxe-pager>
+      </div>
+      <span slot="footer" class="dialog-footer">
+      <el-button size="small" @click="close()" icon="el-icon-circle-close">关闭</el-button>
+      <el-button size="small" type="primary" v-if="method != 'view'" @click="getWorkClient()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+    </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import workClientService from '@/api/cw/workClientInfo/WorkClientService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        dataList: [],
+        searchForm: {
+          name: '',
+          no: ''
+        }
+      }
+    },
+    created () {
+    },
+    components: {
+    },
+    methods: {
+      init (deputy) {
+        this.title = '客户选择'
+        this.visible = true
+        this.list()
+      },
+      // 表单提交
+      getWorkClient () {
+        let rows = this.$refs.clientTable.getCheckboxRecords()
+        if (this.commonJS.isEmpty(rows)) {
+          this.$message.error('请至少选择一条数据')
+          return
+        }
+        let list = []
+        if (!this.commonJS.isEmpty(rows)) {
+          if (rows.length !== 1) {
+            this.$message.error('最多只可以选择一条数据')
+            return
+          } else {
+            rows.forEach(item => {
+              let p = {
+                id: item.id,
+                name: item.name,
+                no: item.no,
+                type: item.type,
+                industry: item.industry,
+                companyLevel: item.companyLevel
+              }
+              list.push(p)
+            })
+          }
+        }
+        this.close()
+        this.$emit('getWorkClient', list)
+      },
+      list () {
+        this.dataList = []
+        this.loading = true
+        this.searchForm.isTrue = '1'
+        workClientService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+        })
+      },
+      // 当前页
+      currentChangeHandle ({currentPage, pageSize}) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.list()
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.list()
+      },
+      close () {
+        this.$refs.searchForm.resetFields()
+        this.visible = false
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-dialog__body {
+    padding-top: 0;
+  }
+  /deep/ .el-form-item--mini.el-form-item, .el-form-item--small.el-form-item {
+    margin-bottom: 0px;
+  }
+</style>

Plik diff jest za duży
+ 1797 - 0
src/views/cw/workClientInfo/WorkClientTaskForm.vue


+ 146 - 0
src/views/cw/workClientInfo/WorkClientUpdateLog.vue

@@ -0,0 +1,146 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+	  draggable
+      width="880px"
+      append-to-body
+      height="500px"
+      @close="close"
+      v-model="visibleChoose">
+      <div style="height: calc(100%);">
+        <el-form :inline="true" class="query-form" ref="searchForm" :model="searchForm" @submit.native.prevent>
+          <!-- 搜索框-->
+          <el-form-item label="" prop="clientNo">
+            <el-input v-model="searchForm.clientNo" @keyup.enter.native="list" placeholder="客户编号" clearable></el-input>
+          </el-form-item>
+          <el-form-item label="" prop="createName">
+            <el-input v-model="searchForm.createName" @keyup.enter.native="list" placeholder="修改申请发起人" clearable></el-input>
+          </el-form-item>
+
+          <el-form-item label="" prop="status">
+            <el-select v-model="searchForm.status" placeholder="申请状态" clearable>
+              <el-option
+                v-for="item in $dictUtils.getDictList('cw_work_client_temp_status')"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+
+          <el-form-item>
+            <el-button type="primary" @click="list()" icon="el-icon-search">查询</el-button>
+            <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>
+          </el-form-item>
+        </el-form>
+
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          max-height="400px"
+          :loading="loading"
+          ref="clientTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          :print-config="{}"
+          :sort-config="{remote:true}"
+          :data="dataList">
+          <vxe-column type="seq" width="40"></vxe-column>
+          <vxe-column min-width="150" title="客户编号" align="center" field="clientNo"></vxe-column>
+          <vxe-column min-width="150" title="修改申请发起人" align="center" field="createName"></vxe-column>
+          <vxe-column min-width="150" title="修改申请发起时间" align="center" field="createTime"></vxe-column>
+          <vxe-column min-width="150" title="申请状态" align="center" field="status">
+            <template #default="scope">
+              <span v-if="scope.row.status === '2'" style="color: #409EFF"><b>{{$dictUtils.getDictLabel('cw_work_client_temp_status', scope.row.status, '-')}}</b></span>
+              <span v-if="scope.row.status === '3'" style="color: #E6A23C"><b>{{$dictUtils.getDictLabel('cw_work_client_temp_status', scope.row.status, '-')}}</b></span>
+              <span v-if="scope.row.status === '4'" style="color: #F56C6C"><b>{{$dictUtils.getDictLabel('cw_work_client_temp_status', scope.row.status, '-')}}</b></span>
+              <span v-if="scope.row.status === '5'" style="color: #67C23A"><b>{{$dictUtils.getDictLabel('cw_work_client_temp_status', scope.row.status, '-')}}</b></span>
+              <span v-if="scope.row.status === '6'" style="color: #909399">{{$dictUtils.getDictLabel('cw_work_client_temp_status', scope.row.status, '-')}}</span>
+            </template>
+          </vxe-column>
+        </vxe-table>
+      </div>
+		<template #footer>
+			<span class="dialog-footer">
+			  <el-button @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			</span>
+		</template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import workClientService from '@/api/cw/workClientInfo/WorkClientService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visibleChoose: false,
+        loading: false,
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        dataList: [],
+        searchForm: {
+          createName: '',
+          status: '',
+          clientNo: ''
+        },
+        clientId: ''
+      }
+    },
+    created () {
+    },
+    components: {
+    },
+    methods: {
+      init (clientId) {
+        this.title = '客户修改申请记录'
+        this.visibleChoose = true
+        this.clientId = clientId
+        this.list()
+      },
+      list () {
+        this.dataList = []
+        this.loading = true
+        this.searchForm.clientId = this.clientId
+        workClientService.queryUpdateLogList(this.searchForm).then((data) => {
+          this.dataList = data
+          this.loading = false
+        })
+      },
+      // 当前页
+      currentChangeHandle ({currentPage, pageSize}) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.list()
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.list()
+      },
+      close () {
+        this.$refs.searchForm.resetFields()
+        this.visibleChoose = false
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-dialog__body {
+    padding-top: 0;
+    padding-bottom: 0;
+  }
+  /deep/ .el-form-item--mini.el-form-item, .el-form-item--small.el-form-item {
+    margin-bottom: 0px;
+  }
+</style>

+ 0 - 0
src/views/cw/workClientInfo/clientUserSelect/UserSelectDialog.vue


Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików