lizhenhao 2 vuotta sitten
vanhempi
commit
b833473c73
100 muutettua tiedostoa jossa 38190 lisäystä ja 679 poistoa
  1. 2 1
      package.json
  2. 1 0
      src/api/AppPath.js
  3. 96 0
      src/api/finance/invoice/FinanceInvoiceService.js
  4. 109 0
      src/api/materialManagement/CollectService.js
  5. 39 0
      src/api/materialManagement/ContractService.js
  6. 54 0
      src/api/materialManagement/MaterialManagementService.js
  7. 46 0
      src/api/materialManagement/MaterialTypeService.js
  8. 39 0
      src/api/materialManagement/SupplierService.js
  9. 144 0
      src/api/materialManagement/WareHouseService.js
  10. 39 0
      src/api/program/ProgramFileDictService.js
  11. 205 0
      src/api/program/ProgramProjectListInfoService.js
  12. 39 0
      src/api/program/ProgramServiceTypeService.js
  13. 39 0
      src/api/program/ProgramTypeDictService.js
  14. 39 0
      src/api/program/ProgramTypeFileDictService.js
  15. 61 0
      src/api/roster/RosterService.js
  16. 46 0
      src/api/sys/KnowledgeShareInfoService.js
  17. 32 0
      src/api/sys/KnowledgeShareTypeService.js
  18. 5 2
      src/api/sys/OSSService.js
  19. 70 0
      src/api/sys/ProjectService.js
  20. 25 0
      src/api/sys/ProofreadInfoService.js
  21. 32 0
      src/api/sys/ProofreadIssuedService.js
  22. 32 0
      src/api/sys/ProofreadTypeService.js
  23. 68 0
      src/api/sys/ReimbursementService.js
  24. 32 0
      src/api/sys/ReimbursementTypeService.js
  25. 95 0
      src/api/sys/WorkClientService.js
  26. 60 0
      src/api/sys/WorkContractBorrowService.js
  27. 32 0
      src/api/sys/WorkContractFileService.js
  28. 39 0
      src/api/sys/WorkContractService.js
  29. 132 111
      src/components/editor/WangEditor.vue
  30. 129 0
      src/components/editor/WangEditorNoMenu.vue
  31. 304 0
      src/components/treeSelect/treeSelect.vue
  32. 431 449
      src/components/userSelect/UserSelectDialog.vue
  33. 95 114
      src/components/userSelect/index.vue
  34. 356 0
      src/components/workClientInfoSelect/WorkClientInfoSelectDialog.vue
  35. 92 0
      src/components/workClientInfoSelect/index.vue
  36. 408 0
      src/views/common/RosterSelectDialog.vue
  37. 148 0
      src/views/common/RosterSelectForm.vue
  38. 2 2
      src/views/common/UpLoadComponent.vue
  39. 1227 0
      src/views/finance/invoice/InvoiceForm.vue
  40. 1467 0
      src/views/finance/invoice/InvoiceFormTask.vue
  41. 1241 0
      src/views/finance/invoice/InvoiceFormTaskInvalid.vue
  42. 889 0
      src/views/finance/invoice/InvoiceList.vue
  43. 155 0
      src/views/finance/invoice/KnowledgeShareTypePageForm.vue
  44. 656 0
      src/views/finance/invoice/ProgramForm.vue
  45. 326 0
      src/views/finance/invoice/ProgramPageForm.vue
  46. 129 0
      src/views/finance/invoice/ReimbursementTypePullForm.vue
  47. 140 0
      src/views/finance/invoice/UserPullForm.vue
  48. 204 0
      src/views/program/configuration/fileDict/FileDictForm.vue
  49. 172 0
      src/views/program/configuration/fileDict/FileDictList.vue
  50. 129 0
      src/views/program/configuration/proofreadType/BrowseTypeForm.vue
  51. 143 0
      src/views/program/configuration/proofreadType/BrowseTypeList.vue
  52. 129 0
      src/views/program/configuration/proofreadType/TypeForm.vue
  53. 143 0
      src/views/program/configuration/proofreadType/TypeList.vue
  54. 126 0
      src/views/program/configuration/typeDict/TypeDictForm.vue
  55. 171 0
      src/views/program/configuration/typeDict/TypeDictList.vue
  56. 145 0
      src/views/program/configuration/typeFileDict/TypeFileDictForm.vue
  57. 195 0
      src/views/program/configuration/typeFileDict/TypeFileDictList.vue
  58. 154 0
      src/views/program/registered/ContactForm.vue
  59. 183 0
      src/views/program/registered/ContractForm.vue
  60. 1058 0
      src/views/program/registered/ProjectArchiveForm.vue
  61. 941 0
      src/views/program/registered/ProjectArchiveFormDialog.vue
  62. 1258 0
      src/views/program/registered/ProjectForm.vue
  63. 1068 0
      src/views/program/registered/ProjectForm2022.vue
  64. 1101 0
      src/views/program/registered/ProjectForm2022Tab.vue
  65. 1179 0
      src/views/program/registered/ProjectFormUpdate.vue
  66. 1445 0
      src/views/program/registered/ProjectList.vue
  67. 1058 0
      src/views/program/registered/ProjectList2022.vue
  68. 636 0
      src/views/program/registered/ProjectThreeAuditForm.vue
  69. 316 0
      src/views/program/registered/ProjectThreeAuditFormDialog.vue
  70. 408 0
      src/views/program/registered/ProofreadBrowseForm.vue
  71. 421 0
      src/views/program/registered/ProofreadBrowseFormComponent.vue
  72. 747 0
      src/views/program/registered/ProofreadForm.vue
  73. 768 0
      src/views/program/registered/ProofreadFormComponent.vue
  74. 593 0
      src/views/program/registered/ProofreadIssuedForm.vue
  75. 1578 0
      src/views/program/registered/RegisItemForm.vue
  76. 222 0
      src/views/program/registered/WorkClientForm.vue
  77. 133 0
      src/views/program/serviceType/ProgramServiceTypeForm.vue
  78. 159 0
      src/views/program/serviceType/ProgramServiceTypeList.vue
  79. 628 0
      src/views/project/AssessForm.vue
  80. 381 0
      src/views/project/AssessList.vue
  81. 652 0
      src/views/project/ConsultationForm.vue
  82. 382 0
      src/views/project/ConsultationList.vue
  83. 1078 0
      src/views/reimbursement/ReimbursementFormCcpm.vue
  84. 1117 0
      src/views/reimbursement/info/InfoForm.vue
  85. 577 0
      src/views/reimbursement/info/InfoList.vue
  86. 85 0
      src/views/reimbursement/info/ProgramForm.vue
  87. 1712 0
      src/views/reimbursement/info/ReimbursementForm.vue
  88. 133 0
      src/views/reimbursement/type/TypeForm.vue
  89. 143 0
      src/views/reimbursement/type/TypeList.vue
  90. 288 0
      src/views/utils/treeUserSelect.vue
  91. 979 0
      src/views/workClient/WorkClientForm.vue
  92. 334 0
      src/views/workClient/WorkClientList.vue
  93. 202 0
      src/views/workContract/InputNumber.vue
  94. 230 0
      src/views/workContract/WorkContractBorrowForm.vue
  95. 89 0
      src/views/workContract/WorkContractBorrowMessageForm.vue
  96. 173 0
      src/views/workContract/WorkContractChooseCom.vue
  97. 898 0
      src/views/workContract/WorkContractFileForm.vue
  98. 726 0
      src/views/workContract/WorkContractForm.vue
  99. 553 0
      src/views/workContract/WorkContractForm2.vue
  100. 0 0
      src/views/workContract/WorkContractList.vue

+ 2 - 1
package.json

@@ -71,7 +71,8 @@
     "xe-utils": "^3.5.4",
     "xgplayer": "2.31.4",
     "xgplayer-hls": "2.4.32-3",
-    "@vueuse/core": "^8.5.0"
+    "@vueuse/core": "^8.5.0",
+  	"ali-oss": "^6.17.1"
   },
   "devDependencies": {
     "@vitejs/plugin-vue": "^3.0.3",

+ 1 - 0
src/api/AppPath.js

@@ -6,3 +6,4 @@ export const FILE_PATH = "/file-server";
 export const UREPORT_PATH = "/ureport-server";
 export const WPS_PATH = "/wps-server";
 export const TEST_PATH = "/test-server";
+export const ASSESS_PATH = "/assess-server";

+ 96 - 0
src/api/finance/invoice/FinanceInvoiceService.js

@@ -0,0 +1,96 @@
+import request from '@/utils/httpRequest'
+
+export default class FinanceInvoiceService {
+  list (params) {
+    return request({
+      url: '/finance/invoice/list',
+      method: 'get',
+      params: params
+    })
+  }
+  queryById (id) {
+    return request({
+      url: '/finance/invoice/queryById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  queryByNumber (number, id) {
+    return request({
+      url: '/finance/invoice/queryByNumber',
+      method: 'get',
+      params: {number: number, id: id}
+    })
+  }
+  save (inputForm) {
+    return request({
+      url: `/finance/invoice/save`,
+      method: 'post',
+      data: inputForm
+    })
+  }
+  delete (ids) {
+    return request({
+      url: '/finance/invoice/delete',
+      method: 'delete',
+      params: {ids: ids}
+    })
+  }
+  updateStatusById (data) {
+    return request({
+      url: '/finance/invoice/updateStatusById',
+      method: 'post',
+      data: data
+    })
+  }
+  isReceivables (data) {
+    return request({
+      url: '/finance/invoice/isReceivables',
+      method: 'post',
+      data: data
+    })
+  }
+  saveForm (inputForm) {
+    return request({
+      url: `/finance/invoice/saveForm`,
+      method: 'post',
+      data: inputForm
+    })
+  }
+  saveFormInvalid (inputForm) {
+    return request({
+      url: `/finance/invoice/saveFormInvalid`,
+      method: 'post',
+      data: inputForm
+    })
+  }
+  queryIdByInvalidId (id) {
+    return request({
+      url: '/finance/invoice/queryIdByInvalidId',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  importDetail (data) {
+    return request({
+      url: '/finance/invoice/importDetail',
+      method: 'post',
+      data: data
+    })
+  }
+  exportTemplate () {
+    return request({
+      url: '/finance/invoice/importDetail/template',
+      method: 'get',
+      responseType: 'blob'
+    })
+  }
+  exportFile (params) {
+    return request({
+      url: '/finance/invoice/export',
+      method: 'get',
+      params: params,
+      responseType: 'blob'
+    })
+  }
+}

+ 109 - 0
src/api/materialManagement/CollectService.js

@@ -0,0 +1,109 @@
+import request from '@/utils/httpRequest'
+
+export default class CollectService {
+  updateStatusById (param) {
+    return request({
+      url: '/material/collect/updateStatusById',
+      method: 'post',
+      data: param
+    })
+  }
+  remove (id) {
+    return request({
+      url: '/material/collect/remove',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  save (param) {
+    return request({
+      url: '/material/collect/save',
+      method: 'post',
+      data: param
+    })
+  }
+  findById (id) {
+    return request({
+      url: '/material/collect/findById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  list (param) {
+    return request({
+      url: '/material/collect/list',
+      method: 'get',
+      params: param
+    })
+  }
+  wareHouseList (params) {
+    return request({
+      url: '/material/collect/wareHouseList',
+      method: 'get',
+      params: params
+    })
+  }
+  createReturnData (param) {
+    return request({
+      url: '/material/collect/createReturnData',
+      method: 'post',
+      data: param
+    })
+  }
+  saveReturn (param) {
+    return request({
+      url: '/material/collect/saveReturn',
+      method: 'post',
+      data: param
+    })
+  }
+  saveReturnAgree (param) {
+    return request({
+      url: '/material/collect/saveReturnAgree',
+      method: 'post',
+      data: param
+    })
+  }
+  updateStatusByIdReturn (param) {
+    return request({
+      url: '/material/collect/updateStatusByIdReturn',
+      method: 'post',
+      data: param
+    })
+  }
+  findByReturnId (id) {
+    return request({
+      url: '/material/collect/findByReturnId',
+      method: 'get',
+      params: {returnId: id}
+    })
+  }
+  returnRequest (param) {
+    return request({
+      url: '/material/collect/returnRequest',
+      method: 'post',
+      data: param
+    })
+  }
+  findHiById (id) {
+    return request({
+      url: '/material/collect/findHiById',
+      method: 'get',
+      params: {collectId: id}
+    })
+  }
+  findHiByHiId (id) {
+    return request({
+      url: '/material/collect/findHiByHiId',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  findLastHiByid (id) {
+    return request({
+      url: '/material/collect/findLastHiByid',
+      method: 'get',
+      params: {collectId: id}
+    })
+  }
+}

+ 39 - 0
src/api/materialManagement/ContractService.js

@@ -0,0 +1,39 @@
+import request from '@/utils/httpRequest'
+
+export default class ContractService {
+  save (param) {
+    return request({
+      url: '/material/contract/save',
+      method: 'post',
+      data: param
+    })
+  }
+  list (param) {
+    return request({
+      url: '/material/contract/list',
+      method: 'get',
+      params: param
+    })
+  }
+  findById (id) {
+    return request({
+      url: '/material/contract/findById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  updateStatusById (param) {
+    return request({
+      url: '/material/contract/updateStatusById',
+      method: 'post',
+      data: param
+    })
+  }
+  remove (id) {
+    return request({
+      url: '/material/contract/remove',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+}

+ 54 - 0
src/api/materialManagement/MaterialManagementService.js

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

+ 46 - 0
src/api/materialManagement/MaterialTypeService.js

@@ -0,0 +1,46 @@
+import request from '@/utils/httpRequest'
+
+export default class MaterialTypeService {
+  list (param) {
+    return request({
+      url: '/material/materialType/list',
+      method: 'get',
+      params: param
+    })
+  }
+  bxList (param) {
+    return request({
+      url: '/material/materialType/bxList',
+      method: 'get',
+      params: param
+    })
+  }
+  cgList (param) {
+    return request({
+      url: '/material/materialType/cgList',
+      method: 'get',
+      params: param
+    })
+  }
+  save (param) {
+    return request({
+      url: '/material/materialType/save',
+      method: 'post',
+      data: param
+    })
+  }
+  findById (id) {
+    return request({
+      url: '/material/materialType/findById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  remove (id) {
+    return request({
+      url: '/material/materialType/deleteById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+}

+ 39 - 0
src/api/materialManagement/SupplierService.js

@@ -0,0 +1,39 @@
+import request from '@/utils/httpRequest'
+
+export default class SupplierService {
+  save (param) {
+    return request({
+      url: '/material/supplier/save',
+      method: 'post',
+      data: param
+    })
+  }
+  queryById (id) {
+    return request({
+      url: '/material/supplier/queryById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  list (param) {
+    return request({
+      url: '/material/supplier/list',
+      method: 'get',
+      params: param
+    })
+  }
+  delete (ids) {
+    return request({
+      url: '/material/supplier/delete',
+      method: 'delete',
+      params: {ids: ids}
+    })
+  }
+  findByName (name) {
+    return request({
+      url: '/material/supplier/findByName',
+      method: 'get',
+      params: {name: name}
+    })
+  }
+}

+ 144 - 0
src/api/materialManagement/WareHouseService.js

@@ -0,0 +1,144 @@
+import request from '@/utils/httpRequest'
+
+export default class WareHouseService {
+  list (params) {
+    return request({
+      url: '/material/management/wareHouse/list',
+      method: 'get',
+      params: params
+    })
+  }
+  reimbursementList (params) {
+    return request({
+      url: '/material/management/wareHouse/reimbursementList',
+      method: 'get',
+      params: params
+    })
+  }
+  wareHouseList (param) {
+    return request({
+      url: '/material/management/wareHouse/wareHouseList',
+      method: 'get',
+      params: param
+    })
+  }
+  wareHouseHistoryList (param) {
+    return request({
+      url: '/material/management/wareHouse/wareHouseHistoryList',
+      method: 'get',
+      params: param
+    })
+  }
+  collectHistoryList (param) {
+    return request({
+      url: '/material/management/wareHouse/collectHistoryList',
+      method: 'get',
+      params: param
+    })
+  }
+  wareHouseSummaryList (param) {
+    return request({
+      url: '/material/management/wareHouse/wareHouseSummaryList',
+      method: 'get',
+      params: param
+    })
+  }
+  wareHouseSummaryList2 (param) {
+    return request({
+      url: '/material/management/wareHouse/wareHouseSummaryList2',
+      method: 'get',
+      params: param
+    })
+  }
+  save (param) {
+    return request({
+      url: '/material/management/wareHouse/save',
+      method: 'post',
+      data: param
+    })
+  }
+  findById (id, status) {
+    return request({
+      url: '/material/management/wareHouse/findById',
+      method: 'get',
+      params: {id: id, status: status}
+    })
+  }
+  remove (id) {
+    return request({
+      url: '/material/management/wareHouse/remove',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  findRequestId (purchaseNo) {
+    return request({
+      url: '/material/management/wareHouse/findRequestId',
+      method: 'get',
+      params: {purchaseNo: purchaseNo}
+    })
+  }
+  updateStatusById (data) {
+    return request({
+      url: '/material/management/wareHouse/updateStatusById',
+      method: 'post',
+      data: data
+    })
+  }
+  backSourceData (id) {
+    return request({
+      url: '/material/management/wareHouse/backSourceData',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  findHiById (id) {
+    return request({
+      url: '/material/management/wareHouse/findHiById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  findHiByHiId (id) {
+    return request({
+      url: '/material/management/wareHouse/findHiByHiId',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  findLastHiByid (id) {
+    return request({
+      url: '/material/management/wareHouse/findLastHiByid',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  updateWarnFlagByTradeNameAndType (tradeName, wareHouseType) {
+    return request({
+      url: `/material/management/wareHouse/updateWarnFlagByTradeNameAndType`,
+      method: 'post',
+      data: {tradeName: tradeName, wareHouseType: wareHouseType}
+    })
+  }
+  updateWarnNumByTradeNameAndType (tradeName, wareHouseType, warnNum) {
+    return request({
+      url: `/material/management/wareHouse/updateWarnNumByTradeNameAndType`,
+      method: 'post',
+      data: {tradeName: tradeName, wareHouseType: wareHouseType, warnNum: warnNum}
+    })
+  }
+  saveTradeName (oldTradeName, tradeName, type) {
+    return request({
+      url: `/material/management/wareHouse/saveTradeName`,
+      method: 'post',
+      data: {oldTradeName: oldTradeName, tradeName: tradeName, wareHouseType: type}
+    })
+  }
+  findTradeByTypeId (typeId) {
+    return request({
+      url: '/material/management/wareHouse/findTradeByTypeId',
+      method: 'get',
+      params: {typeId: typeId}
+    })
+  }
+}

+ 39 - 0
src/api/program/ProgramFileDictService.js

@@ -0,0 +1,39 @@
+import request from '@/utils/httpRequest'
+
+export default class ProgramFileDictService {
+  list (params) {
+    return request({
+      url: '/program/configuration/file/list',
+      method: 'get',
+      params: params
+    })
+  }
+  queryById (id) {
+    return request({
+      url: '/program/configuration/file/queryById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  getAllFileType () {
+    return request({
+      url: '/program/configuration/file/getAllFileType',
+      method: 'get',
+      params: {}
+    })
+  }
+  save (inputForm) {
+    return request({
+      url: `/program/configuration/file/save`,
+      method: 'post',
+      data: inputForm
+    })
+  }
+  delete (ids) {
+    return request({
+      url: '/program/configuration/file/delete',
+      method: 'delete',
+      params: {ids: ids}
+    })
+  }
+}

+ 205 - 0
src/api/program/ProgramProjectListInfoService.js

@@ -0,0 +1,205 @@
+import request from '@/utils/httpRequest'
+
+export default class ProgramProjectListInfoService {
+  list (params) {
+    return request({
+      url: '/program/projectList/list',
+      method: 'get',
+      params: params
+    })
+  }
+  list2 (params) {
+    return request({
+      url: '/program/projectList/list2',
+      method: 'get',
+      params: params
+    })
+  }
+  list2022 (params) {
+    return request({
+      url: '/program/projectList/list2022',
+      method: 'get',
+      params: params
+    })
+  }
+  exportFile (params) {
+    return request({
+      url: '/program/projectList/exportFile',
+      method: 'get',
+      params: params,
+      responseType: 'blob'
+    })
+  }
+  queryById (id) {
+    return request({
+      url: '/program/projectList/findById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  findByIdAudit (id) {
+    return request({
+      url: '/program/projectList/findByIdAudit',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  findByIdArchive (id) {
+    return request({
+      url: '/program/projectList/findByIdArchive',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  save (inputForm) {
+    return request({
+      url: `/program/projectList/save`,
+      method: 'post',
+      data: inputForm
+    })
+  }
+  save2022 (inputForm) {
+    return request({
+      url: `/program/projectList/save2022`,
+      method: 'post',
+      data: inputForm
+    })
+  }
+  saveForm (inputForm) {
+    return request({
+      url: `/program/projectList/saveForm`,
+      method: 'post',
+      data: inputForm
+    })
+  }
+  saveFormThree (inputForm) {
+    return request({
+      url: `/program/projectList/saveFormThree`,
+      method: 'post',
+      data: inputForm
+    })
+  }
+  saveFormArchive (inputForm) {
+    return request({
+      url: `/program/projectList/saveFormArchive`,
+      method: 'post',
+      data: inputForm
+    })
+  }
+  delete (ids) {
+    return request({
+      url: '/program/projectList/deleteById',
+      method: 'get',
+      params: {id: ids}
+    })
+  }
+  deleteAll (ids) {
+    return request({
+      url: '/program/projectList/delete',
+      method: 'delete',
+      params: {ids: ids}
+    })
+  }
+  findContractPageList (params) {
+    return request({
+      url: '/program/projectList/findContractPageList',
+      method: 'get',
+      params: params
+    })
+  }
+  updateStatusById (data) {
+    return request({
+      url: '/program/projectList/updateStatusById',
+      method: 'post',
+      data: data
+    })
+  }
+  updateStatusByAuditId (data) {
+    return request({
+      url: '/program/projectList/updateStatusByAuditId',
+      method: 'post',
+      data: data
+    })
+  }
+  updateStatusByArchiveId (data) {
+    return request({
+      url: '/program/projectList/updateStatusByArchiveId',
+      method: 'post',
+      data: data
+    })
+  }
+  saveReportNo (id) {
+    return request({
+      url: '/program/projectList/saveReportNo',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  /* 一级校审文档下载 */
+  downloadFirstAuditTpl (id, auditId1) {
+    return request({
+      url: '/program/projectList/downloadFirstAuditTpl',
+      method: 'get',
+      params: {id: id, auditId1: auditId1},
+      responseType: 'blob'
+    })
+  }
+  /* 二级校审文档下载 */
+  downloadSecondAuditTpl (id, auditId2) {
+    return request({
+      url: '/program/projectList/downloadSecondAuditTpl',
+      method: 'get',
+      params: {id: id, auditId2: auditId2},
+      responseType: 'blob'
+    })
+  }
+  /* 三级校审文档下载 */
+  downloadThirdlyAuditTpl (id, auditId3) {
+    return request({
+      url: '/program/projectList/downloadThirdlyAuditTpl',
+      method: 'get',
+      params: {id: id, auditId3: auditId3},
+      responseType: 'blob'
+    })
+  }
+  /* 三级校审文档下载 */
+  downloadProofreadAuditTpl (id) {
+    return request({
+      url: '/program/projectList/downloadProofreadAuditTpl',
+      method: 'get',
+      params: {id: id},
+      responseType: 'blob'
+    })
+  }
+  /* 三级校审文档下载 */
+  downloadAuditRecordFormAfterBindingTpl (id) {
+    return request({
+      url: '/program/projectList/downloadAuditRecordFormAfterBindingTpl',
+      method: 'get',
+      params: {id: id},
+      responseType: 'blob'
+    })
+  }
+  /* 三级校审文档下载 */
+  downloadReportAusstellungTpl (id) {
+    return request({
+      url: '/program/projectList/downloadReportAusstellungTpl',
+      method: 'get',
+      params: {id: id},
+      responseType: 'blob'
+    })
+  }
+  getHaveProjectIds () {
+    return request({
+      url: '/program/projectList/getHaveProjectIds',
+      method: 'get'
+    })
+  }
+  findByProIdAndLevel (programId, auditLevel) {
+    return request({
+      url: '/program/projectList/findByProIdAndLevel',
+      method: 'get',
+      params: {programId: programId, auditLevel: auditLevel}
+    })
+  }
+}

+ 39 - 0
src/api/program/ProgramServiceTypeService.js

@@ -0,0 +1,39 @@
+import request from '@/utils/httpRequest'
+
+export default class ProgramServiceTypeService {
+  list (params) {
+    return request({
+      url: '/program/service_type/list',
+      method: 'get',
+      params: params
+    })
+  }
+  queryById (id) {
+    return request({
+      url: '/program/service_type/queryById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  save (inputForm) {
+    return request({
+      url: `/program/service_type/save`,
+      method: 'post',
+      data: inputForm
+    })
+  }
+  delete (ids) {
+    return request({
+      url: '/program/service_type/delete',
+      method: 'delete',
+      params: {ids: ids}
+    })
+  }
+  getList () {
+    return request({
+      url: '/program/service_type/getList',
+      method: 'get',
+      params: {}
+    })
+  }
+}

+ 39 - 0
src/api/program/ProgramTypeDictService.js

@@ -0,0 +1,39 @@
+import request from '@/utils/httpRequest'
+
+export default class ProgramTypeDictService {
+  list (params) {
+    return request({
+      url: '/program/configuration/type/list',
+      method: 'get',
+      params: params
+    })
+  }
+  queryById (id) {
+    return request({
+      url: '/program/configuration/type/queryById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  getList () {
+    return request({
+      url: '/program/configuration/type/getList',
+      method: 'get',
+      params: {}
+    })
+  }
+  save (inputForm) {
+    return request({
+      url: `/program/configuration/type/save`,
+      method: 'post',
+      data: inputForm
+    })
+  }
+  delete (ids) {
+    return request({
+      url: '/program/configuration/type/delete',
+      method: 'delete',
+      params: {ids: ids}
+    })
+  }
+}

+ 39 - 0
src/api/program/ProgramTypeFileDictService.js

@@ -0,0 +1,39 @@
+import request from '@/utils/httpRequest'
+
+export default class ProgramTypeDictService {
+  list (params) {
+    return request({
+      url: '/program/project/list',
+      method: 'post',
+      data: params
+    })
+  }
+  queryById (id) {
+    return request({
+      url: '/program/project/findByFileId',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  getFileList (inputForm) {
+    return request({
+      url: '/program/project/getFileList',
+      method: 'post',
+      data: inputForm
+    })
+  }
+  save (inputForm) {
+    return request({
+      url: `/program/project/save`,
+      method: 'post',
+      data: inputForm
+    })
+  }
+  delete (ids) {
+    return request({
+      url: '/program/project/deleteById',
+      method: 'delete',
+      params: {id: ids}
+    })
+  }
+}

+ 61 - 0
src/api/roster/RosterService.js

@@ -0,0 +1,61 @@
+import request from '@/utils/httpRequest'
+
+export default class RosterService {
+  list (params) {
+    return request({
+      url: '/roster/base/list',
+      method: 'get',
+      params: params
+    })
+  }
+  queryById (id) {
+    return request({
+      url: '/roster/base/queryById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  queryAllSupervisor () {
+    return request({
+      url: '/roster/base/queryAllSupervisor',
+      method: 'get',
+      params: {}
+    })
+  }
+  save (inputForm) {
+    return request({
+      url: `/roster/base/save`,
+      method: 'post',
+      data: inputForm
+    })
+  }
+  delete (ids) {
+    return request({
+      url: '/roster/base/delete',
+      method: 'delete',
+      params: {ids: ids}
+    })
+  }
+  template () {
+    return request({
+      url: '/roster/base/import/template',
+      method: 'get',
+      responseType: 'blob'
+    })
+  }
+  importExcel (data) {
+    return request({
+      url: '/roster/base/import',
+      method: 'post',
+      data: data
+    })
+  }
+  exportFile (params) {
+    return request({
+      url: '/roster/base/exportFile',
+      method: 'get',
+      params: params,
+      responseType: 'blob'
+    })
+  }
+}

+ 46 - 0
src/api/sys/KnowledgeShareInfoService.js

@@ -0,0 +1,46 @@
+import request from '@/utils/httpRequest'
+
+export default class KnowledgeShareInfoService {
+  list (param) {
+    return request({
+      url: '/knowledgeShare/info/list',
+      method: 'get',
+      params: param
+    })
+  }
+  save (param) {
+    return request({
+      url: '/knowledgeShare/info/save',
+      method: 'post',
+      data: param
+    })
+  }
+  findById (id, method) {
+    return request({
+      url: '/knowledgeShare/info/findById',
+      method: 'get',
+      params: {id: id, method: method}
+    })
+  }
+  remove (id) {
+    return request({
+      url: '/knowledgeShare/info/removeById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  addComment (param) {
+    return request({
+      url: '/knowledgeShare/info/addComment',
+      method: 'post',
+      data: param
+    })
+  }
+  delComment (id) {
+    return request({
+      url: '/knowledgeShare/info/delComment',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+}

+ 32 - 0
src/api/sys/KnowledgeShareTypeService.js

@@ -0,0 +1,32 @@
+import request from '@/utils/httpRequest'
+
+export default class KnowledgeShareTypeService {
+  list (param) {
+    return request({
+      url: '/knowledgeShare/type/list',
+      method: 'get',
+      params: param
+    })
+  }
+  save (param) {
+    return request({
+      url: '/knowledgeShare/type/save',
+      method: 'post',
+      data: param
+    })
+  }
+  findById (id) {
+    return request({
+      url: '/knowledgeShare/type/findById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  remove (id) {
+    return request({
+      url: '/knowledgeShare/type/remove',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+}

+ 5 - 2
src/api/sys/OSSService.js

@@ -1,5 +1,5 @@
 import OSS from 'ali-oss'
-import { Message } from 'element-ui'
+import { ElMessage } from 'element-plus'
 import request from '@/utils/httpRequest'
 
 export default class OSSSerive {
@@ -132,7 +132,10 @@ export function exnameFix (file, isShow, names) {
   const exname = file.name.substring(tmpcnt + 1) // 获取后缀名
   if (names.indexOf(exname) < 0) {
     if (isShow === '1') {
-      Message.error('不支持的格式!')
+		ElMessage({
+			message: '不支持的格式!',
+			type: 'error',
+		})
     }
     return false
   }

+ 70 - 0
src/api/sys/ProjectService.js

@@ -0,0 +1,70 @@
+import request from '@/utils/httpRequest'
+import { ASSESS_PATH as prefix } from "../AppPath";
+
+export default class PostService {
+  list (params) {
+    return request({
+      url: prefix + '/sys/project/list',
+      method: 'get',
+      params: params
+    })
+  }
+  queryById (id) {
+    return request({
+      url: prefix + '/sys/project/queryById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  save (inputForm) {
+    return request({
+      url: prefix + '/sys/project/save',
+      method: 'post',
+      data: inputForm
+    })
+  }
+  delete (ids) {
+    return request({
+      url: prefix + '/sys/project/delete',
+      method: 'delete',
+      params: {ids: ids}
+    })
+  }
+  importExcel (data) {
+    return request({
+      url: prefix + '/sys/project/import',
+      method: 'post',
+      data: data
+    })
+  }
+  exportTemplate () {
+    return request({
+      url: prefix + '/sys/project/import/template',
+      method: 'get',
+      responseType: 'blob'
+    })
+  }
+  exportExcel (params) {
+    return request({
+      url: prefix + '/sys/project/export',
+      method: 'get',
+      params: params,
+      responseType: 'blob'
+    })
+  }
+  proportion (params) {
+    return request({
+      url: prefix + '/sys/project/proportion',
+      method: 'get',
+      params: params
+    })
+  }
+  fileUploadList (params) {
+    return request({
+      url: prefix + '/sys/project/exportFileUploadList',
+      method: 'get',
+      params: params,
+      responseType: 'blob'
+    })
+  }
+}

+ 25 - 0
src/api/sys/ProofreadInfoService.js

@@ -0,0 +1,25 @@
+import request from '@/utils/httpRequest'
+
+export default class ProofreadInfoService {
+  save (param) {
+    return request({
+      url: '/proofread/info/save',
+      method: 'post',
+      data: param
+    })
+  }
+  findById (id, type) {
+    return request({
+      url: '/proofread/info/findById',
+      method: 'get',
+      params: {id: id, type: type}
+    })
+  }
+  list (type) {
+    return request({
+      url: '/proofread/info/list',
+      method: 'get',
+      params: {type: type}
+    })
+  }
+}

+ 32 - 0
src/api/sys/ProofreadIssuedService.js

@@ -0,0 +1,32 @@
+import request from '@/utils/httpRequest'
+
+export default class ProofreadIssuedService {
+  save (param) {
+    return request({
+      url: '/proofread/issued/save',
+      method: 'post',
+      data: param
+    })
+  }
+  findById (id) {
+    return request({
+      url: '/proofread/issued/findById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  findProjectInfoById (id) {
+    return request({
+      url: '/proofread/issued/findProjectInfoById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  updateStatus (param) {
+    return request({
+      url: '/proofread/issued/updateStatusById',
+      method: 'post',
+      data: param
+    })
+  }
+}

+ 32 - 0
src/api/sys/ProofreadTypeService.js

@@ -0,0 +1,32 @@
+import request from '@/utils/httpRequest'
+
+export default class ProofreadTypeService {
+  list (param) {
+    return request({
+      url: '/proofread/type/list',
+      method: 'get',
+      params: param
+    })
+  }
+  save (param) {
+    return request({
+      url: '/proofread/type/save',
+      method: 'post',
+      data: param
+    })
+  }
+  findById (id) {
+    return request({
+      url: '/proofread/type/findById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  remove (id) {
+    return request({
+      url: '/proofread/type/deleteById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+}

+ 68 - 0
src/api/sys/ReimbursementService.js

@@ -0,0 +1,68 @@
+import request from '@/utils/httpRequest'
+
+export default class ReimbursementService {
+  list (param) {
+    return request({
+      url: '/reimbursement/info/list',
+      method: 'get',
+      params: param
+    })
+  }
+  save (param) {
+    return request({
+      url: '/reimbursement/info/save',
+      method: 'post',
+      data: param
+    })
+  }
+  findById (id) {
+    return request({
+      url: '/reimbursement/info/findById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  remove (id) {
+    return request({
+      url: '/reimbursement/info/remove',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  updateStatusById (param) {
+    return request({
+      url: '/reimbursement/info/updateStatusById',
+      method: 'post',
+      data: param
+    })
+  }
+  checkNumber (number) {
+    return request({
+      url: '/reimbursement/info/checkNumber',
+      method: 'get',
+      params: {number: number}
+    })
+  }
+  userTree (name) {
+    return request({
+      url: '/reimbursement/info/userTree',
+      method: 'get',
+      params: {name: name}
+    })
+  }
+  exportFile (params) {
+    return request({
+      url: '/reimbursement/info/exportFile',
+      method: 'get',
+      params: params,
+      responseType: 'blob'
+    })
+  }
+  queryByProIds (ids) {
+    return request({
+      url: '/reimbursement/info/queryByProIds',
+      method: 'get',
+      params: {ids: ids}
+    })
+  }
+}

+ 32 - 0
src/api/sys/ReimbursementTypeService.js

@@ -0,0 +1,32 @@
+import request from '@/utils/httpRequest'
+
+export default class ReimbursementTypeService {
+  list (param) {
+    return request({
+      url: '/reimbursement/type/list',
+      method: 'get',
+      params: param
+    })
+  }
+  save (param) {
+    return request({
+      url: '/reimbursement/type/save',
+      method: 'post',
+      data: param
+    })
+  }
+  findById (id) {
+    return request({
+      url: '/reimbursement/type/findById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  remove (id) {
+    return request({
+      url: '/reimbursement/type/deleteById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+}

+ 95 - 0
src/api/sys/WorkClientService.js

@@ -0,0 +1,95 @@
+import request from '@/utils/httpRequest'
+
+export default class WorkClientService {
+  list (param) {
+    return request({
+      url: '/workClientInfo/workClientInfo/list',
+      method: 'get',
+      params: param
+    })
+  }
+  componentList (param) {
+    return request({
+      url: '/workClientInfo/workClientInfo/componentList',
+      method: 'get',
+      params: param
+    })
+  }
+  componentById (id) {
+    return request({
+      url: '/workClientInfo/workClientInfo/componentById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  save (param) {
+    return request({
+      url: '/workClientInfo/workClientInfo/save',
+      method: 'post',
+      data: param
+    })
+  }
+  remove (url) {
+    return request({
+      url: '/workClientInfo/workClientInfo/remove',
+      method: 'get',
+      params: {id: url}
+    })
+  }
+  findById (id) {
+    return request({
+      url: '/workClientInfo/workClientInfo/findById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  update (param) {
+    return request({
+      url: '/workClientInfo/workClientInfo/update',
+      method: 'post',
+      data: param
+    })
+  }
+  findListByName (name) {
+    return request({
+      url: '/workClientInfo/workClientInfo/findListByName',
+      method: 'get',
+      params: {name: name}
+    })
+  }
+  enterpriseSearchByName (name) {
+    return request({
+      url: '/workClientInfo/workClientInfo/enterpriseSearchByName',
+      method: 'post',
+      params: {keyword: name}
+    })
+  }
+  enterpriseTicketInfo (name) {
+    return request({
+      url: '/workClientInfo/workClientInfo/enterpriseTicketInfo',
+      method: 'post',
+      params: {id: name}
+    })
+  }
+  isExist (param) {
+    return request({
+      url: '/workClientInfo/workClientInfo/isExist',
+      method: 'get',
+      params: {param: param}
+    })
+  }
+  haveUscCode (id, uscCode) {
+    return request({
+      url: '/workClientInfo/workClientInfo/haveUscCode',
+      method: 'get',
+      params: {id: id, uscCode: uscCode}
+    })
+  }
+  haveWorkClient (id, name) {
+    return request({
+      url: '/workClientInfo/workClientInfo/haveWorkClient',
+      method: 'get',
+      params: {id: id, name: name}
+    })
+  }
+}

+ 60 - 0
src/api/sys/WorkContractBorrowService.js

@@ -0,0 +1,60 @@
+import request from '@/utils/httpRequest'
+
+export default class WorkContractService {
+  save (param) {
+    return request({
+      url: '/workContract/workContractBorrow/save',
+      method: 'post',
+      data: param
+    })
+  }
+  updateStatusById (param) {
+    return request({
+      url: '/workContract/workContractBorrow/updateStatusById',
+      method: 'post',
+      data: param
+    })
+  }
+  updateStatusByContractInfoId (param) {
+    return request({
+      url: '/workContract/workContractBorrow/updateStatusByContractInfoId',
+      method: 'post',
+      data: param
+    })
+  }
+  findById (id) {
+    return request({
+      url: '/workContract/workContractBorrow/findById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  findByContractInfoId (id) {
+    return request({
+      url: '/workContract/workContractBorrow/findByContractInfoId',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  updateMessageStatusById (param) {
+    return request({
+      url: '/workContract/workContractBorrow/updateMessageStatusById',
+      method: 'post',
+      data: param
+    })
+  }
+  deleteById (id) {
+    return request({
+      url: '/workContract/workContractBorrow/deleteById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  findMessageList (id) {
+    return request({
+      url: '/workContract/workContractBorrow/findMessageList',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+}

+ 32 - 0
src/api/sys/WorkContractFileService.js

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

+ 39 - 0
src/api/sys/WorkContractService.js

@@ -0,0 +1,39 @@
+import request from '@/utils/httpRequest'
+
+export default class WorkContractService {
+  list (param) {
+    return request({
+      url: '/workContract/workContractInfo/list',
+      method: 'get',
+      params: param
+    })
+  }
+  save (param) {
+    return request({
+      url: '/workContract/workContractInfo/save',
+      method: 'post',
+      data: param
+    })
+  }
+  remove (url) {
+    return request({
+      url: '/workContract/workContractInfo/remove',
+      method: 'get',
+      params: {id: url}
+    })
+  }
+  findById (id) {
+    return request({
+      url: '/workContract/workContractInfo/findById',
+      method: 'get',
+      params: {id: id}
+    })
+  }
+  updateStatusById (param) {
+    return request({
+      url: '/workContract/workContractInfo/updateStatusById',
+      method: 'post',
+      data: param
+    })
+  }
+}

+ 132 - 111
src/components/editor/WangEditor.vue

@@ -1,116 +1,137 @@
-<template>
-	<div style="border: 1px solid #ccc">
-		<Toolbar
-			style="border-bottom: 1px solid #ccc"
-			:editor="editorRef"
-			:defaultConfig="toolbarConfig"
-			:mode="mode"
-		/>
-		<Editor
-			style="height: 500px; overflow-y: hidden"
-			v-model="valueHtml"
-			:defaultConfig="editorConfig"
-			:mode="mode"
-			@onCreated="handleCreated"
-		/>
-	</div>
+<template lang="html">
+  <div class="editor" style="min-width:700px; padding-right:10px">
+    <div ref="toolbar" class="toolbar">
+    </div>
+    <div ref="editor" class="wtext">
+    </div>
+  </div>
 </template>
 
 <script>
-import "@wangeditor/editor/dist/css/style.css"; // 引入 css
-
-import { onBeforeUnmount, ref, shallowRef, watch } from "vue";
-import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
-import config from "@/config/upload";
-import { ElMessage } from "element-plus";
-import { ElLoading } from "element-plus";
-
+import E from 'wangeditor'
 export default {
-	components: { Editor, Toolbar },
-	props: {
-		modelValue: {
-			type: String,
-			default: "",
-		},
-	},
-	setup(props, { emit }) {
-		// 编辑器实例,必须用 shallowRef
-		const editorRef = shallowRef();
-
-		// 内容 HTML
-		const valueHtml = ref("");
-
-		const toolbarConfig = {};
-		const editorConfig = { placeholder: "请输入内容..." };
-
-		editorConfig.MENU_CONF = {
-			// 上传图片的配置
-		};
-
-		editorConfig.MENU_CONF.uploadImage = {
-			maxFileSize: 2 * 1024 * 1024, // 2M
-			// base64LimitSize: 1024 * 1024, // 1M 以下插入 base64
-			customUpload(file, insertFn) {
-				const maxSize = file.size / 1024 / 1024 < config.maxSize;
-				if (!maxSize) {
-					ElMessage({
-						message: `上传文件大小不能超过 ${config.maxSize}MB!`,
-						type: "warning",
-					});
-					return false;
-				}
-				const obj = new FormData();
-				obj.append("file", file);
-				var apiObj = config.apiObj;
-				const loading = ElLoading.service({
-					lock: true,
-					text: "图片上传中...",
-					background: "rgba(0, 0, 0, 0.7)",
-				});
-				apiObj
-					.upload(obj)
-					.then((res) => {
-						insertFn(res, "", res);
-						// 以服务的方式调用的 Loading 需要异步关闭
-						loading.close();
-					})
-					.catch((err) => {
-						// 以服务的方式调用的 Loading 需要异步关闭
-						loading.close();
-						console.log(err);
-					});
-			},
-		};
-
-		// 组件销毁时,也及时销毁编辑器
-		onBeforeUnmount(() => {
-			const editor = editorRef.value;
-			if (editor == null) return;
-			editor.destroy();
-		});
-
-		watch(valueHtml, (newValue) => {
-			emit("update:modelValue", newValue);
-		});
-		watch(
-			() => props.modelValue,
-			(newValue) => {
-				valueHtml.value = newValue;
-			}
-		);
-
-		const handleCreated = (editor) => {
-			editorRef.value = editor; // 记录 editor 实例,重要!
-		};
-
-		return {
-			editorRef,
-			valueHtml,
-			mode: "default", // 或 'simple'
-			toolbarConfig,
-			editorConfig,
-			handleCreated,
-		};
-	},
-};
+  name: 'WangEditor',
+  data () {
+    return {
+      editor: null,
+      info_: null
+    }
+  },
+  model: {
+    prop: 'value',
+    event: 'change'
+  },
+  props: {
+    isClear: {
+      type: Boolean,
+      default: false
+    },
+    index: {
+      type: Number,
+      default: 0
+    }
+  },
+  watch: {
+    isClear (val) {
+      // 触发清除文本域内容
+      if (val) {
+        this.editor.txt.clear()
+        this.info_ = null
+      }
+    }
+  },
+  mounted () {
+    this.seteditor()
+  },
+  methods: {
+    clear () {
+      this.editor.txt.clear()
+    },
+    init (val) {
+      // 使用 v-model 时,设置初始值
+      this.editor.txt.html(val)
+    },
+    seteditor () {
+      this.editor = new E(this.$refs.toolbar, this.$refs.editor)
+      this.editor.customConfig.uploadImgShowBase64 = true // base 64 存储图片
+      // eslint-disable-next-line no-template-curly-in-string
+      this.editor.customConfig.uploadImgServer = `${this.$http.BASE_URL}/oss/file/webUpload/upload`// 配置服务器端地址
+      this.editor.customConfig.uploadImgHeaders = { }// 自定义 header
+      this.editor.customConfig.uploadFileName = 'file' // 后端接受上传文件的参数名
+      this.editor.customConfig.uploadImgMaxSize = 2 * 1024 * 1024 // 将图片大小限制为 2M
+      this.editor.customConfig.uploadImgMaxLength = 1 // 限制一次最多上传 3 张图片
+      this.editor.customConfig.uploadImgTimeout = 3 * 60 * 1000 // 设置超时时间
+      this.editor.customConfig.menus = [
+        'head', // 标题
+        'bold', // 粗体
+        'fontSize', // 字号
+        'fontName', // 字体
+        'italic', // 斜体
+        'underline', // 下划线
+        'strikeThrough', // 删除线
+        'foreColor', // 文字颜色
+        'backColor', // 背景颜色
+        'link', // 插入链接
+        'list', // 列表
+        'justify', // 对齐方式
+        'quote', // 引用
+        'emoticon', // 表情
+        'image', // 插入图片
+        'table', // 表格
+        'video', // 插入视频
+        'code', // 插入代码
+        'undo', // 撤销
+        'redo' // 重复
+      ]
+      this.editor.customConfig.uploadImgHooks = {
+        fail: (xhr, editor, result) => {
+          // 插入图片失败回调
+        },
+        success: (xhr, editor, result) => {
+          // 图片上传成功回调
+          // editor.txt.append('<img style="max-width: 650px" src=' + result.lsUrl + '></img>')
+          editor.uploadImg.insertLinkImg(result.lsUrl)
+          this.$emit('getUrl', result.url, result.lsUrl, this.index)
+        },
+        timeout: (xhr, editor) => {
+          // 网络超时的回调
+        },
+        error: (xhr, editor) => {
+          // 图片上传错误的回调
+        },
+        customInsert: (insertImg, result, editor) => {
+          // 图片上传成功,插入图片的回调
+        }
+      }
+      this.editor.customConfig.onchange = (html) => {
+        this.info_ = html // 绑定当前逐渐地值
+        this.$emit('change', this.info_) // 将内容同步到父组件中
+      }
+      // 创建富文本编辑器
+      this.editor.create()
+    },
+    disable () {
+      // 禁用编辑功能
+      this.editor.$textElem.attr('contenteditable', false)
+    },
+    enable () {
+      // 开启编辑功能
+      this.editor.$textElem.attr('contenteditable', true)
+    }
+  }
+}
 </script>
+
+<style lang="css">
+.editor {
+  width: 100%;
+  margin: 0 auto;
+}
+.toolbar {
+  border: 1px solid #ccc;
+}
+.wtext {
+  border: 1px solid #ccc;
+  height: 500px;
+}
+</style>

+ 129 - 0
src/components/editor/WangEditorNoMenu.vue

@@ -0,0 +1,129 @@
+<template lang="html">
+  <div class="editor" style="min-width:700px; padding-right:10px">
+    <div ref="toolbar" class="toolbar">
+    </div>
+    <div ref="editor" class="wtext">
+    </div>
+  </div>
+</template>
+
+<script>
+import E from 'wangeditor'
+export default {
+  name: 'WangEditor',
+  data () {
+    return {
+      editor: null,
+      info_: null
+    }
+  },
+  model: {
+    prop: 'value',
+    event: 'change'
+  },
+  props: {
+    isClear: {
+      type: Boolean,
+      default: false
+    }
+  },
+  watch: {
+    isClear (val) {
+      // 触发清除文本域内容
+      if (val) {
+        this.editor.txt.clear()
+        this.info_ = null
+      }
+    }
+  },
+  mounted () {
+    this.seteditor()
+  },
+  methods: {
+    clear () {
+      this.editor.txt.clear()
+    },
+    init (val) {
+      // 使用 v-model 时,设置初始值
+      this.editor.txt.html(val)
+    },
+    seteditor () {
+      this.editor = new E(this.$refs.toolbar, this.$refs.editor)
+      this.editor.customConfig.uploadImgShowBase64 = true // base 64 存储图片
+      this.editor.customConfig.uploadImgServer = ''// 配置服务器端地址
+      this.editor.customConfig.uploadImgHeaders = { }// 自定义 header
+      this.editor.customConfig.uploadFileName = '' // 后端接受上传文件的参数名
+      this.editor.customConfig.uploadImgMaxSize = 2 * 1024 * 1024 // 将图片大小限制为 2M
+      this.editor.customConfig.uploadImgMaxLength = 6 // 限制一次最多上传 3 张图片
+      this.editor.customConfig.uploadImgTimeout = 3 * 60 * 1000 // 设置超时时间
+      this.editor.customConfig.menus = [
+        // 'head', // 标题
+        // 'bold', // 粗体
+        // 'fontSize', // 字号
+        // 'fontName', // 字体
+        // 'italic', // 斜体
+        // 'underline', // 下划线
+        // 'strikeThrough', // 删除线
+        // 'foreColor', // 文字颜色
+        // 'backColor', // 背景颜色
+        // 'link', // 插入链接
+        // 'list', // 列表
+        // 'justify', // 对齐方式
+        // 'quote', // 引用
+        // 'emoticon', // 表情
+        // 'image', // 插入图片
+        // 'table', // 表格
+        // 'video', // 插入视频
+        // 'code', // 插入代码
+        // 'undo', // 撤销
+        // 'redo' // 重复
+      ]
+      this.editor.customConfig.uploadImgHooks = {
+        fail: (xhr, editor, result) => {
+          // 插入图片失败回调
+        },
+        success: (xhr, editor, result) => {
+          // 图片上传成功回调
+        },
+        timeout: (xhr, editor) => {
+          // 网络超时的回调
+        },
+        error: (xhr, editor) => {
+          // 图片上传错误的回调
+        },
+        customInsert: (insertImg, result, editor) => {
+          // 图片上传成功,插入图片的回调
+        }
+      }
+      this.editor.customConfig.onchange = (html) => {
+        this.info_ = html // 绑定当前逐渐地值
+        this.$emit('change', this.info_) // 将内容同步到父组件中
+      }
+      // 创建富文本编辑器
+      this.editor.create()
+    },
+    disable () {
+      // 禁用编辑功能
+      this.editor.$textElem.attr('contenteditable', false)
+    },
+    enable () {
+      // 开启编辑功能
+      this.editor.$textElem.attr('contenteditable', true)
+    }
+  }
+}
+</script>
+
+<style lang="css">
+.editor {
+  width: 100%;
+  margin: 0 auto;
+}
+.toolbar {
+  border: 1px solid #ccc;
+}
+.wtext {
+  border: 1px solid #ccc;
+  height: 500px;
+}
+</style>

+ 304 - 0
src/components/treeSelect/treeSelect.vue

@@ -0,0 +1,304 @@
+<template>
+  <el-select :value="valueTitle" :size="size"  :disabled="disabled" :clearable="clearable" :placeholder="placeholderText" @clear="clearHandle">
+    <el-option :value="valueTitle"  :label="valueTitle" class="options">
+      <el-tree  id="tree-option"
+        ref="selectTree"
+        :accordion="accordion"
+        :data="optionData"
+        :show-checkbox="showCheckbox"
+        :props="props"
+        highlight-current
+        :check-strictly="checkStrictly"
+        :check-on-click-node="checkOnClickNode"
+        :node-key="props.value"
+        :default-expanded-keys="defaultExpandedKey"
+        @check-change="handleCheckChange"
+        @node-click="handleNodeClick">
+      </el-tree>
+    </el-option>
+  </el-select>
+</template>
+
+<script>
+export default {
+  name: 'el-tree-select',
+  props: {
+    /* 配置项 */
+    props: {
+      type: Object,
+      default: () => {
+        return {
+          value: 'id',             // ID字段名
+          label: 'label',         // 显示名称
+          children: 'children'    // 子级字段名
+        }
+      }
+    },
+    /* 选项列表数据(树形结构的对象数组) */
+    data: {
+      type: Array,
+      default: () => { return [] }
+    },
+     /* 选项列表数据(树形结构的对象数组) */
+    list: {
+      type: Array,
+      default: () => { return null }
+    },
+    /* 初始值 */
+    value: {
+      type: String,
+      default: () => { return null }
+    },
+        /* 初始值 */
+    url: {
+      type: String,
+      default: () => { return null }
+    },
+    disabled: {
+      type: Boolean,
+      dafault: () => { return false }
+    },
+    showCheckbox: {
+      type: Boolean,
+      dafault: () => { return false }
+    },
+    /* 初始值 */
+    label: {
+      type: String,
+      default: () => { return null }
+    },
+    /* 可清空选项 */
+    clearable: {
+      type: Boolean,
+      default: () => { return true }
+    },
+    /* 自动收起 */
+    accordion: {
+      type: Boolean,
+      default: () => { return false }
+    },
+    size: {
+      type: String,
+      default: () => { return 'small' }
+    },
+    placeholder: {
+      type: String,
+      default: () => { return '请选择' }
+    },
+    isOnlySelectLeaf: {
+      type: Boolean,
+      default: () => {
+        return false
+      }
+    },
+    // 在显示复选框的情况下,是否严格的遵循父子不互相关联的做法,默认为 false
+    checkStrictly: {
+      type: Boolean,
+      default: () => {
+        return false
+      }
+    },
+    // 是否在点击节点的时候选中节点,默认值为 false,即只有在点击复选框时才会选中节点。
+    checkOnClickNode: {
+      type: Boolean,
+      default: () => {
+        return false
+      }
+    }
+  },
+  data () {
+    return {
+      valueId: this.value,    // 初始值
+      valueTitle: this.label,
+      defaultExpandedKey: [],
+      placeholderText: this.placeholder,
+      treeList: [],
+      valueData: this.data
+    }
+  },
+  created () {
+    if (this.url !== null) {
+      this.placeholderText = '加载数据中...'
+      let interval = setInterval(() => {
+        this.placeholderText = this.placeholderText + '.'
+      }, 500)
+      this.$http({
+        url: this.url,
+        method: 'get'
+      }).then(({data}) => {
+        this.valueData = data
+        this.setTreeList(this.valueData)
+        this.$nextTick(() => {
+          this.initHandle()
+          this.placeholderText = this.placeholder
+          clearInterval(interval)
+        })
+      })
+    } else {
+      this.valueData = this.data
+      this.setTreeList(this.valueData)
+    }
+  },
+  methods: {
+    setTreeList (datas) { // 遍历树  获取id数组
+      for (var i in datas) {
+        this.treeList.push(datas[i])
+        if (datas[i].children) {
+          this.setTreeList(datas[i].children)
+        }
+      }
+    },
+    // 初始化值
+    initHandle () {
+      if (this.valueId) {
+        if (this.showCheckbox) {
+          let ids = this.valueId.split(',')
+          this.$refs.selectTree.setCheckedKeys(ids)
+          let titles = []
+          ids.forEach((id) => {
+            this.treeList.forEach((d) => {
+              if (id === d[this.props.value]) {
+                titles.push(d[this.props.label])
+              }
+            })
+          })
+
+          this.valueTitle = titles.join(',')
+        } else if (this.$refs.selectTree.getNode(this.valueId)) {
+          this.valueTitle = this.$refs.selectTree.getNode(this.valueId).data[this.props.label]     // 初始化显示
+          this.$refs.selectTree.setCurrentKey(this.valueId)       // 设置默认选中
+          this.defaultExpandedKey = [this.valueId]      // 设置默认展开
+        }
+      }
+      this.initScroll()
+    },
+    getNode (id) {
+      return this.$refs.selectTree.getNode(id)
+    },
+    // 初始化滚动条
+    initScroll () {
+      this.$nextTick(() => {
+        let scrollWrap = document.querySelectorAll('.el-scrollbar .el-select-dropdown__wrap')[0]
+        let scrollBar = document.querySelectorAll('.el-scrollbar .el-scrollbar__bar')
+        if (scrollWrap) { scrollWrap.style.cssText = 'margin: 0px; max-height: none; overflow: hidden;' }
+        if (scrollBar) {
+          scrollBar.forEach(ele => {
+          // eslint-disable-next-line no-return-assign
+            return ele.style.width = 0
+          })
+        }
+      })
+    },
+    // 切换选项
+    handleNodeClick (node) {
+      if (this.showCheckbox) {
+        return
+      }
+      if (node['disabled']) {
+        // this.$message.warning('节点(' + node[this.props.label] + ')被禁止选择,请重新选择。')
+        return
+      }
+      if (this.isOnlySelectLeaf && node.children.length > 0) {
+        this.$message.warning('不能选择根节点(' + node[this.props.label] + ')请重新选择。')
+        return
+      }
+      this.valueTitle = node[this.props.label]
+      this.valueId = node[this.props.value]
+      this.$emit('getValue', this.valueId, this.valueTitle, node)
+    },
+    handleCheckChange (data, checked, indeterminate) {
+      let nodes = this.$refs.selectTree.getCheckedNodes()
+      this.valueTitle = nodes.map((node) => {
+        return node[this.props.label]
+      }).join(',')
+      this.valueId = nodes.map((node) => {
+        return node[this.props.value]
+      }).join(',')
+      this.$emit('getValue', this.valueId, this.valueTitle)
+    },
+    // 清除选中
+    clearHandle () {
+      this.valueTitle = ''
+      this.valueId = null
+      this.defaultExpandedKey = []
+      this.clearSelected()
+      this.$emit('getValue', null, null, null)
+    },
+    /* 清空选中样式 */
+    clearSelected () {
+      let allNode = document.querySelectorAll('#tree-option .el-tree-node')
+      allNode.forEach((element) => element.classList.remove('is-current'))
+    }
+  },
+  watch: {
+    value () {
+      this.valueId = this.value
+      if (this.value === '' || this.value === null || this.value === undefined) {
+        this.clearHandle()
+      } else {
+        this.initHandle()
+      }
+    },
+    data () {
+      this.valueData = this.data
+    }
+  },
+  computed: {
+    optionData () {
+      if (this.list) {
+        let cloneData = JSON.parse(JSON.stringify(this.list))      // 对源数据深度克隆
+        return cloneData.filter(father => {                      // 循环所有项,并添加children属性
+          let branchArr = cloneData.filter(child => father.id === child.parentId)       // 返回每一项的子级数组
+            // eslint-disable-next-line no-unused-expressions
+          branchArr.length > 0 ? father.children = branchArr : ''   // 给父级添加一个children属性,并赋值
+          return father.parentId === '0'      // 返回第一层
+        })
+      } else {
+        return this.valueData
+      }
+    }
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style scoped>
+  .el-select{
+    width: 100%;
+  }
+  .el-scrollbar .el-scrollbar__view .el-select-dropdown__item{
+    height: auto;
+    max-height: 274px;
+    padding: 0;
+    overflow: hidden;
+    overflow-y: auto;
+  }
+  .el-select-dropdown__item.selected{
+    font-weight: normal;
+  }
+  ul li >>>.el-tree .el-tree-node__content{
+    height:auto;
+    padding: 0 20px;
+  }
+  .el-tree-node__label{
+    font-weight: normal;
+  }
+  .el-tree >>>.is-current .el-tree-node__label{
+    color: #409EFF;
+    font-weight: 700;
+  }
+  .el-tree >>>.is-current .el-tree-node__children .el-tree-node__label{
+    color:#606266;
+    font-weight: normal;
+  }
+  /* 开发禁用 */
+  /* .el-tree-node:focus>.el-tree-node__content{
+    background-color:transparent;
+    background-color: #f5f7fa;
+    color: #c0c4cc;
+    cursor: not-allowed;
+  }
+  .el-tree-node__content:hover{
+    background-color: #f5f7fa;
+  } */
+</style>

+ 431 - 449
src/components/userSelect/UserSelectDialog.vue

@@ -1,460 +1,442 @@
 <template>
-	<el-dialog
-		v-model="dialogVisible"
-		title="人员选择"
-		:width="type == 1 ? 680 : 460"
-		destroy-on-close
-		append-to-body
-		@closed="$emit('closed')"
-		draggable
-	>
-		<template v-if="type == 1">
-			<div class="user-select">
-				<div class="user-select__left">
-					<div class="user-select__search">
-						<el-input
-							v-model="searchForm.name"
-							prefix-icon="search"
-							placeholder="搜索成员"
-						>
-							<template #append>
-								<el-button
-									icon="search"
-									@click="search"
-								></el-button>
-							</template>
-						</el-input>
-					</div>
-					<div class="user-select__select">
-						<div
-							class="user-select__tree"
-							v-loading="showGrouploading"
-						>
-							<el-scrollbar>
-								<el-tree
-									class="menu"
-									ref="groupTree"
-									:data="group"
-									node-key="id"
-									:props="{
-										label: 'name',
-										children: 'children',
-									}"
-									highlight-current
-									:expand-on-click-node="false"
-									:current-node-key="groupId"
-									@node-click="groupClick"
-								>
-									<template #default="{ node, data }">
-										<span
-											class="custom-tree-node el-tree-node__label"
-										>
-											<span class="label">
-												<el-icon
-													:size="16"
-													class="m-r-5"
-												>
-													<qiye
-														v-if="data.type === '1'"
-														:style="{
-															color:
-																$TOOL.data.get(
-																	'IS_PRIMARY_TENANT'
-																) &&
-																data.tenantDTO &&
-																$utils.getTenantColorById(
-																	data
-																		.tenantDTO
-																		.id
-																),
-														}"
-													></qiye>
-													<bumen
-														v-else
-														:style="{
-															color:
-																$TOOL.data.get(
-																	'IS_PRIMARY_TENANT'
-																) &&
-																data.tenantDTO &&
-																$utils.getTenantColorById(
-																	data
-																		.tenantDTO
-																		.id
-																),
-														}"
-													></bumen>
-												</el-icon>
-												{{ node.label }}
-											</span>
-										</span>
-									</template>
-								</el-tree>
-							</el-scrollbar>
-						</div>
-						<div
-							class="user-select__user"
-							v-loading="showUserloading"
-						>
-							<div class="user-select__user__list">
-								<el-scrollbar ref="userScrollbar">
-									<el-tree
-										class="menu"
-										ref="userTree"
-										:data="user"
-										node-key="id"
-										highlight-current
-										:props="{
-											key: 'id',
-											label: 'name',
-											children: 'children',
-										}"
-										:default-checked-keys="selectedIds"
-										:show-checkbox="limit > 1"
-										check-on-click-node
-										@check-change="userClick"
-									></el-tree>
-								</el-scrollbar>
-							</div>
-							<footer>
-								<el-pagination
-									background
-									layout="prev,next"
-									small
-									:total="total"
-									:page-size="pageSize"
-									v-model:currentPage="currentPage"
-									@current-change="paginationChange"
-								></el-pagination>
-							</footer>
-						</div>
-					</div>
-				</div>
-				<div class="user-select__toicon">
-					<el-icon><arrow-right /></el-icon>
-				</div>
-				<div class="user-select__selected">
-					<header>已选 ({{ selected.length }})</header>
-					<ul>
-						<el-scrollbar>
-							<li
-								v-for="(item, index) in selected"
-								:key="item.id"
-							>
-								<span class="name">
-									<el-avatar
-										v-if="
-											$TOOL.data.get('IS_PRIMARY_TENANT')
-										"
-										:size="30"
-										:style="{
-											background:
-												$utils.getTenantColorById(
-													item.tenantId
-												) + '!important',
-										}"
-										>{{
-											item.name.substring(0, 1)
-										}}</el-avatar
-									>
-									<el-avatar v-else>{{
-										item.name.substring(0, 1)
-									}}</el-avatar>
-									<label>{{ item.name }}</label>
-								</span>
-								<span class="delete">
-									<el-button
-										text
-										type="primary"
-										icon="del-filled"
-										circle
-										size="small"
-										@click="deleteSelected(index)"
-									></el-button>
-								</span>
-							</li>
-						</el-scrollbar>
-					</ul>
-				</div>
-			</div>
-		</template>
+  <div>
+    <el-dialog
+    title="用户选择"
+    width="1000px"
+    :close-on-click-modal="false"
+    :append-to-body="true"
+     v-dialogDrag
+     class="userDialog"
+    :visible.sync="visible">
+    <el-container style="height: 500px">
+      <el-aside width="200px">
 
-		<template #footer>
-			<el-button @click="dialogVisible = false">取 消</el-button>
-			<el-button type="primary" @click="save">确 认</el-button>
-		</template>
-	</el-dialog>
-</template>
+        <el-card class="org">
+          <div slot="header" class="clearfix">
+            <el-input
+              placeholder="请输入组织机构过滤"
+              size="small"
+              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>
 
-<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,
-		},
-	},
-	data() {
-		return {
-			searchForm: {
-				loginName: "",
-				companyDTO: {
-					id: "",
-				},
-				officeDTO: {
-					id: "",
-				},
-				name: "",
-			},
+    <el-container>
+      <el-header style="text-align: left; font-size: 12px;height:30px">
+        <el-form size="small" :inline="true" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+            <el-form-item prop="loginName">
+              <el-input size="small" v-model="searchForm.loginName" placeholder="登录名" clearable></el-input>
+            </el-form-item>
 
-			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);
-		},
-	},
-	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({
-						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.$emit("doSubmit", this.value);
-			this.dialogVisible = false;
-		},
-	},
-};
-</script>
+            <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>
+      </el-header>
 
-<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;
-}
+      <el-main>
+        <el-table
+          :data="dataList"
+          v-loading="loading"
+          size="small"
+          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 slot-scope="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 slot-scope="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 slot-scope="scope">
+              <el-tag v-if="scope.row.loginFlag === '1'" size="small" type="success">正常</el-tag>
+              <el-tag v-else-if="scope.row.loginFlag === '0'" size="small" 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>
 
-.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);
-}
+    <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>
+     <span slot="footer" class="dialog-footer">
+      <el-button size="small" @click="visible = false" icon="el-icon-circle-close">关闭</el-button>
+      <el-button size="small" type="primary" icon="el-icon-circle-check" @click="doSubmit()">确定</el-button>
+    </span>
+    </el-dialog>
 
-.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;
-}
+  </div>
+</template>
 
-.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;
+<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 (
+              <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: '/sys/user/list',
+          method: 'get',
+          params: {
+            'current': this.pageNo,
+            'size': this.pageSize,
+            'orders': this.orders,
+            ...this.searchForm
+          }
+        }).then(({data}) => {
+          this.searchForm.selectAll = ''
+          this.dataList = data.records
+          this.total = data.total
+          this.pageNo = data.current
+          this.loading = false
+          this.$nextTick(() => {
+            this.setSelectRow()
+          })
+        })
+      },
+      refreshTree () {
+        this.$http({
+          url: `/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.visible = false
+        this.$emit('doSubmit', this.dataListAllSelections)
+      }
+    }
+  }
+</script>
+<style lang="scss">
+.org {
+  height: 100%;
+  .el-card__header {
+    padding: 10px;
+  }
+  .el-card__body {
+    padding: 10px;
+    max-height: 520px;
+    overflow: auto;
+  }
 }
-.user-select-role .user-select__tree {
-	border: none;
-	height: 343px;
+.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>

+ 95 - 114
src/components/userSelect/index.vue

@@ -1,121 +1,102 @@
 <template>
-	<template v-if="printRead">
-		<label>{{ name }}</label>
-	</template>
-	<template v-else>
-		<el-input
-			placeholder="请选择"
-			readonly
-			:clearable="clearable"
-			:disabled="disabled"
-			style="line-hight: 40px"
-			v-model="name"
-		>
-			<template #append>
-				<el-button
-					:disabled="disabled"
-					:readonly="readonly"
-					@click="showUserSelect"
-					icon="search"
-				></el-button>
-			</template>
-		</el-input>
-		<user-select
-			ref="userSelect"
-			@doSubmit="selectUsersToInput"
-			:tenantId="tenantId"
-			:limit="limit"
-		></user-select>
-	</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-button slot="append" :disabled="disabled"  :readonly="readonly" @click="showUserSelect" icon="el-icon-search"></el-button>
+    </el-input>
+    <user-select ref="userSelect" @doSubmit="selectUsersToInput" :limit="limit" :selectData="selectData"></user-select>
+</div>
 </template>
 <script>
-import userSelect from "./UserSelectDialog";
-import userService from "@/api/sys/userService";
+import userSelect from './UserSelectDialog'
+import UserService from '@/api/sys/UserService'
 export default {
-	data() {
-		return {
-			name: "",
-			selectData: [],
-		};
-	},
-	props: {
-		limit: Number,
-		modelValue: { type: String, default: "" },
-		tenantId: { type: String, default: null },
-		printRead: {
-			type: Boolean,
-			default: () => {
-				return false;
-			},
-		},
-		clearable: {
-			type: Boolean,
-			default: () => {
-				return true;
-			},
-		},
-		readonly: {
-			type: Boolean,
-			default: () => {
-				return false;
-			},
-		},
-		disabled: {
-			type: Boolean,
-			default: () => {
-				return false;
-			},
-		},
-	},
-	components: {
-		userSelect,
-	},
-	watch: {
-		modelValue: {
-			handler(newVal) {
-				this.selectData = [];
-				if (newVal) {
-					newVal.split(",").forEach((id) => {
-						userService.queryById(id).then((data) => {
-							if (data && data.id !== "") {
-								this.selectData.push(data);
-								this.name = this.selectData
-									.map((user) => {
-										return user.name;
-									})
-									.join(",");
-							}
-						});
-					});
-				} else {
-					this.name = "";
-				}
-			},
-			immediate: true,
-			deep: false,
-		},
-	},
-	methods: {
-		selectUsersToInput(users) {
-			let selectIds = users
-				.map((user) => {
-					return user.id;
-				})
-				.join(",");
-			this.$emit("update:modelValue", selectIds);
-		},
-		showUserSelect() {
-			this.$refs.userSelect.open(this.selectData);
-		},
-	},
-};
+  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
+  },
+  userService: null,
+  beforeCreate () {
+    this.userService = new UserService()
+  },
+  watch: {
+    value: {
+      handler (newVal) {
+        this.selectData = []
+        if (newVal) {
+          newVal.split(',').forEach((id) => {
+            this.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;
-}
+  .el-form-item__content .el-input-group {
+      vertical-align: middle;
+  }
+ .el-tag + .el-tag {
+    margin-left: 5px;
+    margin-bottom: 5px;
+  }
 </style>
+
+

+ 356 - 0
src/components/workClientInfoSelect/WorkClientInfoSelectDialog.vue

@@ -0,0 +1,356 @@
+<template>
+  <div>
+    <el-dialog
+    title="客户选择"
+    width="1000px"
+    :close-on-click-modal="false"
+    :append-to-body="true"
+     v-dialogDrag
+     class="clientDialog"
+    :visible.sync="visible">
+    <el-container style="height: 500px">
+      <el-header style="text-align: left; font-size: 12px; height: auto; line-height: 30px">
+        <el-form size="small" height="30px" :inline="true" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+            <el-form-item prop="name">
+              <el-input size="small" v-model="searchForm.name" placeholder="客户姓名" clearable></el-input>
+            </el-form-item>
+            <el-form-item prop="uscCode">
+              <el-input size="small" v-model="searchForm.uscCode" placeholder="统一社会信用代码" clearable></el-input>
+            </el-form-item>
+            <el-form-item prop="areaId">
+              <SelectTree
+                ref="area"
+                :props="{
+                        value: 'id',             // ID字段名
+                        label: 'name',         // 显示名称
+                        children: 'children'    // 子级字段名
+                      }"
+                placeholder="请选择所在区域"
+                size="small"
+                url="/sys/area/treeData"
+                :value="searchForm.areaId"
+                :clearable="true"
+                :accordion="true"
+                @getValue="(value) => {searchForm.areaId=value}"/>
+            </el-form-item>
+            <el-form-item prop="companyType">
+              <el-select size="small" 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 prop="companyIndustry">
+              <el-select size="small" 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>
+              <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>
+      </el-header>
+
+      <el-main style="padding-top: 0px">
+        <el-table
+          :stripe="true"
+          :data="dataList"
+          v-loading="loading"
+          size="small"
+          border
+          ref="clientTable"
+          @selection-change="selectionChangeHandle"
+          @sort-change="sortChangeHandle"
+          height="calc(100% - 75px)"
+          max-height="calc(100%)">
+          <el-table-column
+            header-align="center"
+            align="center"
+            width="50">
+              <template slot-scope="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
+            prop="name"
+            header-align="center"
+            align="center"
+            label="客户姓名">
+          </el-table-column>
+          <el-table-column
+            prop="uscCode"
+            header-align="center"
+            align="center"
+            label="统一社会信用代码">
+          </el-table-column>
+          <el-table-column
+            prop="areaName"
+            header-align="center"
+            align="center"
+            label="归属区域">
+          </el-table-column>
+          <el-table-column
+            prop="companyType"
+            header-align="center"
+            align="center"
+            label="客户性质">
+            <template scope="scope">
+              {{ $dictUtils.getDictLabel("customer_nature", scope.row.companyType, '-') }}
+            </template>
+          </el-table-column>
+          <el-table-column
+            prop="companyIndustry"
+            header-align="center"
+            align="center"
+            label="所在行业">
+            <template scope="scope">
+              {{ $dictUtils.getDictLabel("industry", scope.row.companyIndustry, '-') }}
+            </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>
+     <span slot="footer" class="dialog-footer">
+      <el-button size="small" @click="visible = false" icon="el-icon-circle-close">关闭</el-button>
+      <el-button size="small" type="primary" icon="el-icon-circle-check" @click="doSubmit()">确定</el-button>
+    </span>
+    </el-dialog>
+
+  </div>
+</template>
+
+<script>
+  import SelectTree from '@/components/treeSelect/treeSelect.vue'
+  export default {
+    data () {
+      return {
+        searchForm: {
+          name: '',
+          areaId: '',
+          uscCode: '',
+          companyType: '',
+          companyIndustry: ''
+        },
+        filterText: '',
+        dataListAllSelections: [],   // 所有选中的数据包含跨页数据
+        dataListSelections: [],
+        idKey: 'id', // 标识列表数据中每一行的唯一键的名称(需要按自己的数据改一下)
+        dataList: [],
+        dynamicTags: [],
+        pageNo: 1,
+        pageSize: 10,
+        total: 0,
+        orders: [],
+        loading: false,
+        visible: false
+      }
+    },
+    props: {
+      selectData: {
+        type: Array,
+        default: () => { return [] }
+      }
+    },
+    components: {
+      SelectTree
+    },
+    watch: {
+    },
+    methods: {
+      init () {
+        this.visible = true
+        this.$nextTick(() => {
+          this.dataListAllSelections = JSON.parse(JSON.stringify(this.selectData))
+          this.resetSearch()
+        })
+      },
+      getTemplateRow (index, row) { // 获取选中数据
+        this.dataListSelections = [row]
+        this.$nextTick(() => {
+          this.changePageCoreRecordData()
+        })
+      },
+           // 设置选中的方法
+      setSelectRow () {
+        if (!this.dataListAllSelections || this.dataListAllSelections.length <= 0) {
+          this.$refs.clientTable.clearSelection()
+          return
+        }
+                // 标识当前行的唯一键的名称
+        let idKey = this.idKey
+        let selectAllIds = []
+        this.dataListAllSelections.forEach(row => {
+          selectAllIds.push(row[idKey])
+        })
+        this.$refs.clientTable.clearSelection()
+        for (var i = 0; i < this.dataList.length; i++) {
+          if (selectAllIds.indexOf(this.dataList[i][idKey]) >= 0) {
+                        // 设置选中,记住table组件需要使用ref="table"
+            this.$refs.clientTable.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()
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        this.$http({
+          url: '/workClientInfo/workClientInfo/componentList',
+          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()
+          })
+        })
+      },
+      // 每页数
+      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) {
+        this.orders = []
+        if (column.order != null) {
+          this.orders.push({column: this.$utils.toLine(column.prop), asc: column.order === 'ascending'})
+        }
+        this.refreshList()
+      },
+      handleNodeClick (data) {
+        this.refreshList()
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      },
+      doSubmit () {
+        this.visible = false
+        this.$emit('doSubmit', this.dataListAllSelections)
+      }
+    }
+  }
+</script>
+<style lang="scss">
+.org {
+  height: 100%;
+  .el-card__header {
+    padding: 10px;
+  }
+  .el-card__body {
+    padding: 10px;
+    max-height: 520px;
+    overflow: auto;
+  }
+}
+.clientDialog{
+  .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>

+ 92 - 0
src/components/workClientInfoSelect/index.vue

@@ -0,0 +1,92 @@
+<template>
+  <div>
+    <el-input  placeholder="请选择" :size="size" :disabled="disabled"  :readonly="true" style="line-hight:40px;width: 100%" v-model="name" class="input-with-select">
+      <el-button slot="append" :disabled="disabled"  :readonly="readonly" @click="openClient">查询</el-button>
+    </el-input>
+    <work-client-info-select-dialog ref="workClientInfoSelect" @doSubmit="selectClientToInput" :selectData="selectData"></work-client-info-select-dialog>
+  </div>
+</template>
+<script>
+  import WorkClientInfoSelectDialog from './WorkClientInfoSelectDialog'
+  import WorkClientService from '@/api/sys/WorkClientService'
+  export default {
+    data () {
+      return {
+        name: '',
+        labelValue: this.value,
+        selectData: [],
+        rosterData: []
+      }
+    },
+    props: {
+      limit: Number,
+      value: String,
+      size: {
+        type: String,
+        default: () => { return 'small' }
+      },
+      readonly: {
+        type: Boolean,
+        default: () => { return false }
+      },
+      disabled: {
+        type: Boolean,
+        default: () => { return false }
+      }
+    },
+    components: {
+      WorkClientInfoSelectDialog
+    },
+    workClientService: null,
+    beforeCreate () {
+      this.workClientService = new WorkClientService()
+    },
+    watch: {
+      value: {
+        handler (newVal) {
+          this.selectData = []
+          if (newVal) {
+            newVal.split(',').forEach((id) => {
+              this.workClientService.componentById(id).then(({data}) => {
+                if (data && data.id !== '') {
+                  this.selectData.push(data)
+                }
+              })
+            })
+          }
+        },
+        immediate: true,
+        deep: false
+      },
+      selectData: {
+        handler (newVal) {
+          this.name = newVal.map(client => { return client.name }).join(',')
+        },
+        immediate: false,
+        deep: false
+      }
+    },
+    methods: {
+      selectClientToInput (clientList) {
+        this.selectData = clientList
+        this.labelValue = clientList.map(client => { return client.id }).join(',')
+        this.name = clientList.map(client => { return client.name }).join(',')
+        this.$emit('getValue', this.labelValue, this.name)
+      },
+      openClient () {
+        this.$refs.workClientInfoSelect.init()
+      }
+    }
+  }
+</script>
+<style>
+  .el-form-item__content .el-input-group {
+    vertical-align: middle;
+  }
+  .el-tag + .el-tag {
+    margin-left: 5px;
+    margin-bottom: 5px;
+  }
+</style>
+
+

+ 408 - 0
src/views/common/RosterSelectDialog.vue

@@ -0,0 +1,408 @@
+<!--花名册-人员选择  dialog 组件-->
+<template>
+  <div>
+    <el-dialog
+    title="花名册-人员选择"
+    width="1000px"
+    :close-on-click-modal="false"
+    :append-to-body="true"
+     v-dialogDrag
+     class="rosterDialog"
+    :visible.sync="visible">
+    <el-container style="height: 500px">
+      <el-aside width="200px">
+
+        <el-card class="org">
+          <div slot="header" class="clearfix">
+            <el-input
+              placeholder="请输入组织机构过滤"
+              size="small"
+              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 size="small" :inline="true" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+            <el-form-item 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="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>
+      </el-header>
+
+      <el-main>
+        <el-table
+          :stripe="true"
+          :data="dataList"
+          v-loading="loading"
+          size="small"
+          border
+          ref="rosterTable"
+          @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 slot-scope="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="headshotLsUrl"
+            header-align="center"
+            align="center"
+            label="头像">
+            <template slot-scope="scope">
+              <img :src="scope.row.headshotLsUrl === ''?'/static/img/avatar.png':scope.row.headshotLsUrl" style="height:35px"/>
+            </template>
+          </el-table-column>
+          <el-table-column
+            prop="name"
+            header-align="center"
+            align="center"
+            sortable="custom"
+            min-width="90"
+            label="姓名">
+          </el-table-column>
+          <el-table-column
+            prop="officeName"
+            header-align="center"
+            align="center"
+            sortable="custom"
+            min-width="110"
+            label="所属部门">
+          </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>
+     <span slot="footer" class="dialog-footer">
+      <el-button size="small" @click="visible = false" icon="el-icon-circle-close">关闭</el-button>
+      <el-button size="small" type="primary" icon="el-icon-circle-check" @click="doSubmit()">确定</el-button>
+    </span>
+    </el-dialog>
+
+  </div>
+</template>
+
+<script>
+  export default {
+    data () {
+      return {
+        searchForm: {
+          name: '',
+          companyId: '',
+          officeId: ''
+        },
+        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 (
+              <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.rosterTable.clearSelection()
+          return
+        }
+                // 标识当前行的唯一键的名称
+        let idKey = this.idKey
+        let selectAllIds = []
+        this.dataListAllSelections.forEach(row => {
+          selectAllIds.push(row[idKey])
+        })
+        this.$refs.rosterTable.clearSelection()
+        for (var i = 0; i < this.dataList.length; i++) {
+          if (selectAllIds.indexOf(this.dataList[i][idKey]) >= 0) {
+                        // 设置选中,记住table组件需要使用ref="table"
+            this.$refs.rosterTable.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 () {
+        this.loading = true
+        this.$http({
+          url: '/roster/base/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: `/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.companyId = data.id
+          this.searchForm.officeId = ''
+        } else {
+          this.searchForm.companyId = ''
+          this.searchForm.officeId = data.id
+        }
+        this.refreshList()
+      },
+      resetSearch () {
+        this.searchForm.companyId = ''
+        this.searchForm.officeId = ''
+        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.visible = false
+        this.$emit('doSubmit', this.dataListAllSelections)
+      }
+    }
+  }
+</script>
+<style lang="scss">
+.org {
+  height: 100%;
+  .el-card__header {
+    padding: 10px;
+  }
+  .el-card__body {
+    padding: 10px;
+    max-height: 520px;
+    overflow: auto;
+  }
+}
+.rosterDialog{
+  .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>

+ 148 - 0
src/views/common/RosterSelectForm.vue

@@ -0,0 +1,148 @@
+<template>
+  <div>
+    <el-autocomplete
+      style="width: 100%"
+      popper-class="my-autocomplete"
+      :disabled="disabled"  :readonly="readonly"
+      v-model="name"
+      :fetch-suggestions="querySearchAsync"
+      placeholder="请输入内容"
+      @blur="handleBlur"
+      @select="handleSelect">
+      <el-button slot="append" :disabled="disabled"  :readonly="readonly" @click="openRoster" icon="el-icon-search"></el-button>
+      <template slot-scope="{ item }">
+        <div class="name">{{ item.name }}</div>
+        <span class="office-name">{{ commonJS.isEmpty(item.officeName) ? '部门:- - -' : '部门:' + item.officeName}}</span>
+      </template>
+    </el-autocomplete>
+    <RosterSelectDialog ref="rosterSelect" @doSubmit="selectRosterToInput" :limit="limit" :selectData="selectData"></RosterSelectDialog>
+  </div>
+</template>
+<script>
+  import RosterSelectDialog from './RosterSelectDialog'
+  import RosterService from '@/api/roster/RosterService'
+  export default {
+    data () {
+      return {
+        name: '',
+        labelValue: this.value,
+        selectData: [],
+        rosterData: []
+      }
+    },
+    props: {
+      limit: Number,
+      value: String,
+      size: {
+        type: String,
+        default: () => { return 'small' }
+      },
+      readonly: {
+        type: Boolean,
+        default: () => { return false }
+      },
+      disabled: {
+        type: Boolean,
+        default: () => { return false }
+      }
+    },
+    components: {
+      RosterSelectDialog
+    },
+    rosterService: null,
+    beforeCreate () {
+      this.rosterService = new RosterService()
+    },
+    watch: {
+      value: {
+        handler (newVal) {
+          this.selectData = []
+          if (newVal) {
+            newVal.split(',').forEach((id) => {
+              this.rosterService.queryById(id).then(({data}) => {
+                if (data && data.id !== '') {
+                  this.selectData.push(data)
+                }
+              })
+            })
+          }
+        },
+        immediate: true,
+        deep: false
+      },
+      selectData: {
+        handler (newVal) {
+          this.name = newVal.map(roster => { return roster.name }).join(',')
+        },
+        immediate: false,
+        deep: false
+      }
+    },
+    mounted () {
+      this.getRosterData()
+    },
+    methods: {
+      selectRosterToInput (rosterList) {
+        this.selectData = rosterList
+        this.labelValue = rosterList.map(roster => { return roster.id }).join(',')
+        this.name = rosterList.map(roster => { return roster.name }).join(',')
+        this.$emit('getValue', this.labelValue)
+      },
+      openRoster () {
+        this.$refs.rosterSelect.init()
+      },
+      handleSelect (item) {
+        this.$emit('getValue', item.id)
+        this.name = item.name
+      },
+      handleBlur (item) {
+        this.$emit('getValue', item.id)
+        this.name = item.name
+      },
+      getRosterData () {
+        this.rosterService.list({
+          'current': '1',
+          'size': '-1'
+        }).then(({data}) => {
+          this.rosterData = JSON.parse(JSON.stringify(data.records))
+        })
+      },
+      querySearchAsync (queryString, cb) {
+        let rosterDataList = this.rosterData
+        let results = queryString ? rosterDataList.filter(this.createFilter(queryString)) : rosterDataList
+        cb(results)
+      },
+      createFilter (queryString) {
+        return (item) => {
+          return (item.name.toLowerCase().indexOf(queryString.toLowerCase()) === 0)
+        }
+      }
+    }
+  }
+</script>
+<style>
+  .el-form-item__content .el-input-group {
+    vertical-align: middle;
+  }
+  .el-tag + .el-tag {
+    margin-left: 5px;
+    margin-bottom: 5px;
+  }
+  .my-autocomplete li {
+    line-height: normal;
+    padding: 7px;
+  }
+  .my-autocomplete li .name {
+    text-overflow: ellipsis;
+    overflow: hidden;
+  }
+  .my-autocomplete li .office-name {
+    font-size: 12px;
+    color: #b4b4b4;
+  }
+  .my-autocomplete li .highlighted .office-name {
+    color: #ddd;
+  }
+</style>
+
+

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

@@ -71,7 +71,7 @@
     // eslint-disable-next-line no-unused-vars
     toHref
   } from '@/api/sys/OSSService'
-  import ElImageViewer from 'element-ui/packages/image/src/image-viewer'
+  // import ElImageViewer from 'element-ui/packages/image/src/image-viewer'
   import moment from 'moment'
   export default {
     data () {
@@ -104,7 +104,7 @@
       this.ossService = new OSSSerivce()
     },
     components: {
-      ElImageViewer
+      // ElImageViewer
     },
     mounted () {
       window.onPreview = this.onPreview

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1227 - 0
src/views/finance/invoice/InvoiceForm.vue


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1467 - 0
src/views/finance/invoice/InvoiceFormTask.vue


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1241 - 0
src/views/finance/invoice/InvoiceFormTaskInvalid.vue


+ 889 - 0
src/views/finance/invoice/InvoiceList.vue

@@ -0,0 +1,889 @@
+<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-row :gutter="0">
+        <el-form-item prop="no" label="发票申请编号">
+          <el-input size="small" v-model="searchForm.no" placeholder="请输入发票申请编号" clearable></el-input>
+        </el-form-item>
+        <el-form-item prop="number" label="发票号">
+          <el-input size="small" v-model="searchForm.number" placeholder="请输入发票号" clearable></el-input>
+        </el-form-item>
+        <el-form-item v-if="showHideItem" prop="programName" label="项目名称">
+          <el-input size="small" 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
+            size="small"
+            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
+            size="small"
+            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="`/sys/office/treeData?type=2`"
+            :value="searchForm.operatorOffice"
+            :clearable="true"
+            :accordion="true"
+            @getValue="(value) => {searchForm.operatorOffice=value}"/>
+        </el-form-item>
+        <el-form-item v-if="showHideItem" prop="billingWorkplaceReal" label="开票单位">
+          <el-input size="small" 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="/sys/area/treeData"
+            :value="searchForm.reconciliationArea"
+            :clearable="true"
+            :accordion="true"
+            @getValue="(value) => {searchForm.reconciliationArea=value}"/>
+        </el-form-item>
+
+        <el-form-item v-if="showHideItem" prop="billingDateList" label="开票日期">
+          <el-date-picker
+            size="small"
+            @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
+            size="small"
+            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" size="small" :icon="showHideIcon">{{showHideName}}</el-button>
+          <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-row>
+    </el-form>
+    <div class="bg-white top" style="">
+      <vxe-toolbar :refresh="{query: refreshList}" export custom>
+        <template #buttons>
+          <el-button v-if="hasPermission('finance:invoice:add')" type="primary" size="small" icon="el-icon-plus" @click="start()">新建</el-button>
+<!--          <el-button v-if="hasPermission('finance:invoice:del')" type="danger"   size="small" icon="el-icon-delete" @click="del()" :disabled="$refs.invoiceTable && $refs.invoiceTable.getCheckboxRecords().length === 0" plain>删除</el-button>-->
+        </template>
+      </vxe-toolbar>
+      <div style="height: calc(100% - 80px)">
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="auto"
+          :loading="loading"
+          size="small"
+          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 slot-scope="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 slot-scope="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 slot-scope="scope">
+              {{$dictUtils.getDictLabel('invoice_billing_content', scope.row.billingContent, '-')}}
+            </template>
+          </vxe-column>
+          <vxe-column min-width="100" title="收款类型"align="center" field="receivablesType">
+            <template slot-scope="scope">
+              {{$dictUtils.getDictLabel('invoice_receivables_type', scope.row.receivablesType, '-')}}
+            </template>
+          </vxe-column>
+          <vxe-column min-width="100" title="发票类型"align="center" field="type">
+            <template slot-scope="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 slot-scope="scope">
+              {{$dictUtils.getDictLabel('collect_not', scope.row.receivablesStatus, '-')}}
+            </template>
+          </vxe-column>
+          <vxe-column min-width="110" fixed="right"align="center" title="是否作废" field="invalidStatus">
+            <template slot-scope="scope">
+              {{scope.row.invalidStatus === '1'?'已作废':'未作废'}}
+            </template>
+          </vxe-column>
+          <vxe-column  min-width="110px" fixed="right"align="center" title="状态" field="status" >
+            <template slot-scope="scope">
+              <el-button  type="text" @click="invoiceDetail(scope.row)" :type="$dictUtils.getDictLabel('invoice_status_info', scope.row.status, '-')" effect="dark" size="mini">{{$dictUtils.getDictLabel("invoice_status", scope.row.status, '-')}} </el-button>
+            </template>
+          </vxe-column>
+          <vxe-column min-width="300" title="操作"  fixed="right" align="center">
+            <template  slot-scope="scope">
+              <el-button v-if="hasPermission('finance:invoice:edit')&&scope.row.status === '1'||scope.row.status === '3'" type="text"  size="small" @click="invoicePush(scope.row)">修改</el-button>
+              <el-button v-if="hasPermission('finance:invoice:edit')&&scope.row.status === '2'" type="text"  size="small" @click="invoiceReback(scope.row)">撤回</el-button>
+              <el-button v-if="scope.row.status==='2' && checkIsAudit(scope.row)" type="text"  size="small" @click="examine(scope.row)">审核</el-button>
+              <el-button v-if="hasPermission('finance:invoice:edit')&&scope.row.status === '4'" type="text"  size="small" @click="adjust(scope.row)">驳回调整</el-button>
+
+              <el-button v-if="hasPermission('finance:invoice:edit:detail')&&scope.row.status === '5'&&scope.row.receivablesStatus !== '1'" type="text"  size="small" @click="editDetail(scope.row.id)">修改发票明细</el-button>
+              <el-button v-if="hasPermission('finance:invoice:edit:receivables')&&scope.row.status === '5'&&scope.row.receivablesStatus !== '1'" type="text"   size="small" @click="view(true, scope.row.id)">收款</el-button>
+              <el-button v-if="hasPermission('finance:invoice:edit:is_receivables')&&scope.row.status === '5'&&scope.row.receivablesStatus !== '1'" type="text"   size="small" @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'" type="text"   size="small" @click="recallReceivables(scope.row)">撤回收款</el-button>
+              <el-button v-if="hasPermission('finance:invoice:edit:invalid')&&scope.row.status === '5'||scope.row.status === '7'" type="text"  size="small" @click="invoiceInvalidPush(scope.row)">作废</el-button>
+              <el-button v-if="hasPermission('finance:invoice:edit:invalid')&&scope.row.status === '6'" type="text"  size="small" @click="invoiceInvalidReBack(scope.row)">作废撤回</el-button>
+              <el-button v-if="scope.row.status==='6' && checkIsAuditInvalid(scope.row)" type="text"  size="small" @click="examineInvalid(scope.row)">作废审核</el-button>
+              <el-button v-if="hasPermission('finance:invoice:edit:invalid')&&scope.row.status === '8'" type="text"  size="small" @click="adjustInvalid(scope.row)">驳回调整</el-button>
+
+              <el-button v-if="hasPermission('finance:invoice:edit')&&scope.row.status === '1'||scope.row.status === '3'" 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>
+    <InvoiceForm  ref="invoiceForm" @refreshDataList="refreshList"></InvoiceForm>
+    <ProgramPageForm ref="programPageForm" @getProgram="getProgram"></ProgramPageForm>
+    <ProgramForm ref="programForm"></ProgramForm>
+  </div>
+</template>
+
+<script>
+  import FinanceInvoiceService from '@/api/finance/invoice/FinanceInvoiceService'
+  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 SelectUserTree from '@/views/utils/treeUserSelect'
+  import SelectTree from '@/components/treeSelect/treeSelect.vue'
+  import ProgramPageForm from '@/views/finance/invoice/ProgramPageForm'
+  export default {
+    data () {
+      return {
+        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: ''
+      }
+    },
+    financeInvoiceService: null,
+    taskService: null,
+    processService: null,
+    userService: null,
+    computed: {
+      userName () {
+        return JSON.parse(localStorage.getItem('user')).name
+      }
+    },
+    created () {
+      this.financeInvoiceService = new FinanceInvoiceService()
+      this.taskService = new TaskService()
+      this.processService = new ProcessService()
+      this.userService = new UserService()
+    },
+    components: {
+      InvoiceForm,
+      UserSelect,
+      SelectUserTree,
+      SelectTree,
+      ProgramPageForm,
+      ProgramForm
+    },
+    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.invoiceForm.init('add', '')
+      },
+      // 修改发票明细
+      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 = ''
+        }
+        this.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.processService.getByName('评估-发票申请').then(({data}) => {
+          if (!this.commonJS.isEmpty(data.id)) {
+            this.processDefinitionId = data.id
+            this.procDefKey = data.key
+          }
+        })
+        this.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
+          this.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')} 发起了 [评估-发票申请]`
+        this.taskService.getTaskDef({ procDefId: this.processDefinitionId,
+          status: 'startAndHold'}).then((data) => {
+            this.$router.push({
+              path: '/flowable/task/TaskForm',
+              query: {
+                ...pick(data.data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                procDefId: this.processDefinitionId,
+                procDefKey: this.procDefKey,
+                status: 'startAndHold',
+                title: tabTitle,
+                formType: data.data.formType,
+                formUrl: data.data.formUrl,
+                formTitle: processTitle,
+                businessId: 'false',
+                isShow: false,
+                routePath: '/finance/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'
+        }
+        this.taskService.getTaskDef({ procDefId: this.processDefinitionId,
+          businessId: row.id,
+          businessTable: 'finance_invoice'}).then((data) => {
+            this.$router.push({
+              path: '/flowable/task/TaskForm',
+              query: {
+                ...pick(data.data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                procDefId: this.processDefinitionId,
+                procDefKey: this.procDefKey,
+                title: title,
+                formType: data.data.formType,
+                formUrl: data.data.formUrl,
+                formTitle: processTitle,
+                businessTable: 'finance_invoice',
+                businessId: row.id,
+                isShow: 'false',
+                status: status,
+                routePath: '/finance/invoice/InvoiceList'
+              }
+            })
+          })
+      },
+      // 发起发票作废审批
+      invoiceInvalidPush (row) {
+        // 读取流程表单
+        let title = `发起流程【评估-发票作废】`
+        let processTitle = `${this.userName} 在 ${this.moment(new Date()).format('YYYY-MM-DD HH:mm')} 发起了[评估-发票作废]`
+        let status = 'startAndHold'
+        if (row.status === '7') {
+          status = 'startAndClose'
+        } else if (row.status === '8') {
+          status = 'reapplyFlag'
+        }
+        this.taskService.getTaskDef({ procDefId: this.processDefinitionInvalidId,
+          businessId: row.financeInvoiceInvalidDTO.id,
+          businessTable: 'finance_invoice_invalid'}).then((data) => {
+            this.$router.push({
+              path: '/flowable/task/TaskForm',
+              query: {
+                ...pick(data.data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                procDefId: this.processDefinitionInvalidId,
+                procDefKey: this.procDefInvalidKey,
+                title: title,
+                formType: data.data.formType,
+                formUrl: data.data.formUrl,
+                formTitle: processTitle,
+                businessTable: 'finance_invoice_invalid',
+                businessId: row.financeInvoiceInvalidDTO.id,
+                isShow: 'false',
+                status: status,
+                routePath: '/finance/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 {
+            this.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) {
+        this.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 this.financeInvoiceService.queryById(row.id).then(({data}) => {
+            if (data.status !== '2') { // status的值不等于“审核中”,就弹出提示
+              this.$message.error('数据已发生改变或不存在,请刷新数据')
+              this.refreshList()
+            } else {
+              this.processService.revokeProcIns(row.procInsId).then(async ({data}) => {
+                let form = {status: '3', id: row.id}
+                await this.financeInvoiceService.updateStatusById(form)
+                this.$message.success(data)
+                this.refreshList()
+              })
+            }
+          })
+        })
+      },
+      invoiceInvalidReBack (row) {
+        this.$confirm(`确定要撤回该申请吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(async () => {
+          await this.financeInvoiceService.queryById(row.id).then(({data}) => {
+            if (data.status !== '6') { // status的值不等于“审核中”,就弹出提示
+              this.$message.error('数据已发生改变或不存在,请刷新数据')
+              this.refreshList()
+            } else {
+              this.processService.revokeProcIns(row.financeInvoiceInvalidDTO.procInsId).then(async ({data}) => {
+                let form = {status: '5', id: row.id}
+                await this.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'}
+          this.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.data.map(item => item.id) : [],
+          exportFields: options.columns.map(column => column.property)
+        }
+        return this.financeInvoiceService.exportFile(params).then((res) => {
+          // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(res.data, options.filename)
+        }).catch(function (err) {
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      },
+      recallReceivables (row) {
+        this.$confirm(`确定要撤回收款吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          let param = {id: row.id, receivablesStatus: '0'}
+          this.financeInvoiceService.isReceivables(param).then(({data}) => {
+            this.$message.success(data)
+            this.refreshList()
+          })
+        })
+      },
+      // 驳回后调整
+      adjust (row) {
+        this.financeInvoiceService.queryById(row.id).then(({data}) => {
+          if (data.status !== '4') { // status的值不等于“驳回”,就弹出提示
+            this.$message.error('数据已发生改变或不存在,请刷新数据')
+            this.refreshList()
+          } else {
+            this.todo(row)
+          }
+        })
+      },
+      // 审核
+      examine (row) {
+        this.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
+        this.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: '/finance/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) {
+        this.financeInvoiceService.queryById(row.id).then(({data}) => {
+          if (data.status !== '8') { // status的值不等于“驳回”,就弹出提示
+            this.$message.error('数据已发生改变或不存在,请刷新数据')
+            this.refreshList()
+          } else {
+            this.todoInvalid(row)
+          }
+        })
+      },
+      // 审核
+      examineInvalid (row) {
+        this.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
+        this.taskService.getTaskDefInfo({
+          taskId: row.taskIdInvalid
+        }).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: '/finance/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>

+ 155 - 0
src/views/finance/invoice/KnowledgeShareTypePageForm.vue

@@ -0,0 +1,155 @@
+<template>
+  <div>
+    <el-dialog
+      title="知识分享类型"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      width="1100px"
+      height="500px"
+      @close="close"
+      @keyup.enter.native=""
+      :append-to-body="true"
+      :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="klgsType">
+            <el-input size="small" v-model="searchForm.klgsType" 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="programTable"
+          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="40"></vxe-column>
+          <vxe-column type="checkbox" width="40px"></vxe-column>
+
+          <vxe-column title="分享类型" field="klgsType" align="left"></vxe-column>
+          <vxe-column width="200" title="分享类型key值" field="klgsKey" align="left"></vxe-column>
+          <vxe-column width="100" title="序号" field="klgsSort"></vxe-column>
+          <vxe-column width="100" title="创建人" field="createBy"></vxe-column>
+          <vxe-column width="100" 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="getProgram()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+    </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import KnowledgeShareTypeService from '@/api/sys/KnowledgeShareTypeService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        dataList: [],
+        searchForm: {
+          klgsType: ''
+        },
+        checkType: '',
+        detail: '',
+        isShow: true,
+        num: true // num为true是多选,false是单选
+      }
+    },
+    knowledgeShareTypeService: null,
+    created () {
+      this.knowledgeShareTypeService = new KnowledgeShareTypeService()
+    },
+    components: {
+    },
+    methods: {
+      init () {
+        this.num = true
+        this.visible = true
+        this.list()
+      },
+      // 表单提交
+      getProgram () {
+        let rows
+        if (this.$refs.programTable.getCheckboxRecords().length > 1) {
+          this.$message.error('最多选择一条数据')
+          return
+        }
+        rows = this.$refs.programTable.getCheckboxRecords()
+        this.close()
+        this.$emit('getProgram', rows)
+      },
+      list () {
+        this.loading = true
+        this.knowledgeShareTypeService.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>
+  .messageZindex {
+    z-index:9999 !important;
+  }
+</style>

+ 656 - 0
src/views/finance/invoice/ProgramForm.vue

@@ -0,0 +1,656 @@
+<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      width="1300px"
+      @close="close"
+      @keyup.enter.native="doSubmit"
+      :visible.sync="visible">
+      <el-form size="middle" :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">
+          <vxe-table
+            border
+            show-overflow
+            show-footer
+            ref="baseTable"
+            class="vxe-table-element"
+            :data="inputForm.financeInvoiceBaseDTOList"
+            style="margin-left: 5em"
+            @cell-click=""
+            @edit-closed=""
+            highlight-current-row
+            :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+          >
+            <vxe-table-column field="programName" align="center" title="项目名称">
+              <template slot-scope="scope">
+                <el-link type="primary" :underline="false" @click="openProjectForm(scope.row)" >{{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-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>
+      <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'||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>
+    </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/finance/invoice/FinanceInvoiceService'
+  import WorkClientService from '@/api/sys/WorkClientService'
+  import ProjectForm from '@/views/program/registered/ProjectForm'
+  import ProgramPageForm from '@/views/finance/invoice/ProgramPageForm'
+  import UpLoadComponent from '@/views/common/UpLoadComponent'
+  import ContractForm from '@/views/program/registered/ContractForm'
+  import WorkClientForm from '@/views/program/registered/WorkClientForm'
+  import SelectUserTree from '@/views/utils/treeUserSelect'
+  import SelectTree from '@/components/treeSelect/treeSelect.vue'
+  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: JSON.parse(localStorage.getItem('user')).name,
+          billingPeopleId: JSON.parse(localStorage.getItem('user')).id,
+          billingDate: '',
+          collectDate: '',
+          billingPeopleReal: JSON.parse(localStorage.getItem('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: ''
+      }
+    },
+    financeInvoiceService: null,
+    workClientService: null,
+    created () {
+      this.financeInvoiceService = new FinanceInvoiceService()
+      this.workClientService = new WorkClientService()
+    },
+    components: {
+      ProgramPageForm,
+      ContractForm,
+      WorkClientForm,
+      SelectUserTree,
+      SelectTree,
+      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: JSON.parse(localStorage.getItem('user')).name,
+          billingPeopleId: JSON.parse(localStorage.getItem('user')).id,
+          billingDate: '',
+          collectDate: '',
+          billingPeopleReal: JSON.parse(localStorage.getItem('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
+          this.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)) {
+              this.workClientService.findById(this.inputForm.billingWorkplaceRealId).then((data) => {
+                this.bankList = data.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 (row) {
+        this.$refs.projectForm.init('view', row.programId, row.auditId1, row.auditId2, row.auditId3, row.archiveId)
+      },
+      // 表单提交
+      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 this.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()
+            this.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()
+              }
+            }
+          })
+          this.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
+        this.financeInvoiceService.exportTemplate().then((res) => {
+          // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(res.data, '发票明细导入模板')
+          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
+        this.financeInvoiceService.importDetail(formBody).then(async (result) => {
+          if (this.commonJS.isEmpty(result.data)) {
+            this.importVisible = false
+            this.loading = false
+            throw new Error()
+          }
+          for await (let item of result.data) {
+            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.data)
+          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
+        this.financeInvoiceService.importDetail(formBody).then(async result => {
+          if (this.commonJS.isEmpty(result.data)) {
+            this.importVisible = false
+            this.loading = false
+            throw new Error()
+          }
+          for await (let item of result.data) {
+            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.data)
+          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>

+ 326 - 0
src/views/finance/invoice/ProgramPageForm.vue

@@ -0,0 +1,326 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      width="1200px"
+      height="500px"
+      @close="close"
+      @keyup.enter.native=""
+      :visible.sync="visible">
+      <el-container>
+        <el-main style="padding-top: 0;padding-bottom: 0">
+          <div v-if="isShow">
+            <el-radio v-model="checkType" label="1" size="small" style="margin-right: 20px">项目</el-radio>
+            <el-radio v-model="checkType" label="2" size="small" style="margin-right: 20px">其他</el-radio>
+          </div>
+          <div v-if="checkType === '1'">
+            <el-form style="margin-bottom: 0" 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="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>
+            <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"
+              size="small"
+              ref="programTable"
+              show-header-overflow
+              show-overflow
+              highlight-hover-row
+              @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="40px"></vxe-column>
+
+              <vxe-column min-width="300px" title="项目名称" field="name" align="center"></vxe-column>
+              <vxe-column min-width="110px" title="项目编号" field="no" align="center"></vxe-column>
+    <!--          <vxe-column width="150px" title="报告号" field="clientName"></vxe-column>-->
+              <vxe-column min-width="100px" title="登记人" field="createBy" align="center"></vxe-column>
+    <!--          <vxe-column width="150px" title="责任人" field="createDate"></vxe-column>-->
+              <vxe-column min-width="200px" title="委托方" field="clientName" align="center"></vxe-column>
+              <vxe-column min-width="100px" title="是否开票" field="isInvoice" align="center"></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 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.name.length>20?tag.name.substring(0,20)+'...':tag.name}}
+          </el-tag>
+        </el-aside>
+      </el-container>
+      <span slot="footer" class="dialog-footer">
+      <el-button size="small" @click="close()">关闭</el-button>
+      <el-button size="small" type="primary" v-if="method != 'view'" @click="getProgram()" v-noMoreClick>({{dataListAllSelections.length}}) 确定</el-button>
+    </span>
+    </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: {
+          name: '',
+          no: '',
+          createBy: ''
+        },
+        checkType: '',
+        detail: '',
+        dataListAllSelections: [],
+        rowId: 'id',
+        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.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 = [{name: this.detail}]
+        }
+        this.close()
+        this.$emit('getProgram', rows)
+      },
+      list () {
+        this.loading = true
+        this.searchForm.showInvoiceFlag = '1'  // showInvoiceFlag = '1'时,查询关联发票的开票状态。showInvoiceFlag为其他值或者为空时,不查询
+        this.programProjectListInfoService.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 = {
+          name: '',
+          no: '',
+          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>

+ 129 - 0
src/views/finance/invoice/ReimbursementTypePullForm.vue

@@ -0,0 +1,129 @@
+<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="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="500px"
+          :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'}"
+          :checkbox-config="{}">
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="checkbox" width="40" ></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>
+      <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="getProgramForType" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+    </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import ReimbursementTypeService from '@/api/sys/ReimbursementTypeService'
+  export default {
+    data () {
+      return {
+        searchForm: {
+          name: ''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        title: '',
+        method: '',
+        visible: false,
+        loading: false
+      }
+    },
+    reimbursementTypeService: null,
+    created () {
+      this.reimbursementTypeService = new ReimbursementTypeService()
+    },
+    components: {
+    },
+    methods: {
+      init () {
+        this.visible = true
+        this.list()
+      },
+      // 表单提交
+      getProgramForType () {
+        let rows
+        if (this.commonJS.isEmpty(this.$refs.typeTable.getCheckboxRecords()) || this.$refs.typeTable.getCheckboxRecords().length > 1) {
+          this.$message.error('请选择一条数据')
+          return
+        }
+        rows = this.$refs.typeTable.getCheckboxRecords()
+        if (rows[0].level !== '3' && rows[0].id !== '3') {
+          this.$message.error('请选择子集数据')
+          return
+        }
+        this.$emit('getProgramForType', rows)
+        this.close()
+      },
+      list () {
+        this.loading = 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>

+ 140 - 0
src/views/finance/invoice/UserPullForm.vue

@@ -0,0 +1,140 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      width="500px"
+      height="500px"
+      @close="close"
+      @keyup.enter.native=""
+      append-to-body
+      :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="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="300px"
+          :loading="loading"
+          size="small"
+          ref="userTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :row-config="{isCurrent: true}"
+          :radio-config="{trigger: 'row'}"
+          :tree-config="{transform: true, rowField: 'id', parentField: 'parentId',expandAll: true}"
+          :checkbox-config="{}">
+<!--          <vxe-column type="seq" width="60" title="序号"></vxe-column>-->
+          <vxe-column type="radio" width="40" ></vxe-column>
+
+          <vxe-column title="姓名" min-width="180" field="name" align="left" tree-node></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="getProgramForUser()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+    </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import ReimbursementService from '@/api/sys/ReimbursementService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        dataList: [],
+        searchForm: {
+          name: ''
+        }
+      }
+    },
+    reimbursementService: null,
+    created () {
+      this.reimbursementService = new ReimbursementService()
+    },
+    components: {
+    },
+    methods: {
+      init () {
+        this.title = '人员选择'
+        this.visible = true
+        this.list()
+      },
+      // 表单提交
+      getProgramForUser () {
+        let rows = []
+        if (this.commonJS.isEmpty(this.$refs.userTable.getRadioRecord())) {
+          this.$message.error('请选择一条数据')
+          return
+        }
+        // if (this.$refs.userTable.getCheckboxRecords().length > 1) {
+        //   this.$message.error('最多选择一条数据')
+        //   return
+        // }
+        let row = this.$refs.userTable.getRadioRecord()
+        if (!row.isUser) {
+          this.$message.error('请选择子集数据')
+          return
+        }
+        this.close()
+        rows.push(row)
+        this.$emit('getProgramForUser', rows)
+      },
+      list () {
+        this.loading = true
+        this.reimbursementService.userTree(this.searchForm.name).then(({data}) => {
+          this.dataList = data
+          this.loading = false
+          this.$nextTick(() => {
+            this.$refs.userTable.setAllTreeExpand(true)
+          })
+        })
+      },
+      // 当前页
+      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>
+<style scoped>
+  /deep/ .el-dialog__body {
+    padding-top: 0px;
+  }
+</style>

+ 204 - 0
src/views/program/configuration/fileDict/FileDictForm.vue

@@ -0,0 +1,204 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      width="500px"
+      @close="close"
+      @keyup.enter.native="doSubmit"
+      :visible.sync="visible">
+      <el-form size="middle" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'||method==='viewChild'?'readonly':''"  :disabled="method==='view'||method==='viewChild'"
+               label-width="120px" @submit.native.prevent>
+        <el-row  :gutter="15">
+          <el-col v-if="method === 'addChild'||method === 'editChild'||method === 'viewChild'" :span="21">
+            <el-form-item label="附件类型" prop="parentId"
+                          :rules="[
+                          {required: true, message:'附件类型不能为空', trigger:'blur'}
+                 ]">
+              <el-select v-model="inputForm.parentId" style="width:100%" placeholder="请选择附件类型">
+                <el-option
+                  v-for="item in fileTypes"
+                  :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="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" v-if="method === 'addChild'||method === 'editChild'||method === 'viewChild'">
+            <el-form-item label="文件类型" prop="type"
+                          :rules="[
+                          {required: true, message:'文件类型不能为空', trigger:'blur'},{required: true, message:'文件类型不能为空', trigger:'change'}
+                 ]">
+              <el-select v-model="inputForm.type" collapse-tags style="width:100%" multiple placeholder="请选择文件类型">
+                <el-checkbox style="margin-left: 20px;" v-model="checked" @change='selectAll'>全选</el-checkbox>
+                <el-option
+                  v-for="item in $dictUtils.getDictList('file_type')"
+                  :key="item.label"
+                  :label="item.label"
+                  :value="item.label">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="21" v-if="method === 'addChild'||method === 'editChild'||method === 'viewChild'">
+            <el-form-item label="文件大小(MB)" prop="size"
+                          :rules="[
+                          {required: true, message:'文件大小不能为空', trigger:'blur'}
+                 ]">
+              <el-input v-model="inputForm.size" 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>
+      <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'&&method != 'viewChild'" @click="doSubmit()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+    </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import ProgramFileDictService from '@/api/program/ProgramFileDictService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          name: '',
+          size: '',
+          type: [],
+          sort: '',
+          remarks: '',
+          parentId: ''
+        },
+        fileTypes: [],
+        check: false
+      }
+    },
+    programFileDictService: null,
+    created () {
+      this.programFileDictService = new ProgramFileDictService()
+    },
+    methods: {
+      init (method, id) {
+        this.method = method
+        this.getAllFileType()
+        this.inputForm = {
+          name: '',
+          size: '',
+          type: [],
+          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
+        } else if (method === 'editChild') {
+          this.title = '修改附件结构'
+          this.inputForm.id = id
+        } else if (method === 'viewChild') {
+          this.title = '查看附件结构'
+          this.inputForm.id = id
+        }
+        this.visible = true
+        this.loading = false
+        this.$nextTick(() => {
+          this.$refs.inputForm.resetFields()
+          if (method === 'edit' || method === 'view' || method === 'editChild' || method === 'viewChild') { // 修改或者查看
+            this.loading = true
+            this.programFileDictService.queryById(this.inputForm.id).then(({data}) => {
+              this.inputForm = this.recover(this.inputForm, data)
+              this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+              this.inputForm.type = this.inputForm.type.split(',')
+              this.loading = false
+            })
+          }
+          if (method === 'addChild') {
+            this.inputForm.parentId = id
+          }
+        })
+      },
+      // 表单提交
+      doSubmit () {
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            if (!this.commonJS.isEmpty(this.inputForm.type)) {
+              this.inputForm.type = this.inputForm.type.join(',')
+            } else {
+              this.inputForm.type = ''
+            }
+            this.programFileDictService.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.$refs.inputForm.parentId = ''
+        this.checked = false
+        this.visible = false
+      },
+      getAllFileType () {
+        this.programFileDictService.getAllFileType().then(({data}) => {
+          this.fileTypes = data
+        })
+      },
+      selectAll () {
+        this.inputForm.type = []
+        if (this.checked) {
+          this.$dictUtils.getDictList('file_type').forEach((item) => {
+            this.inputForm.type.push(item.label)
+          })
+        } else {
+          this.inputForm.type = []
+        }
+      }
+    }
+  }
+</script>

+ 172 - 0
src/views/program/configuration/fileDict/FileDictList.vue

@@ -0,0 +1,172 @@
+<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 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="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:file:add')" type="primary" size="small" icon="el-icon-plus" @click="add()">新建</el-button>
+          <el-button v-if="hasPermission('program:configuration:file:del')" type="danger"   size="small" icon="el-icon-delete" @click="del()" :disabled="$refs.fileDictTable && $refs.fileDictTable.getCheckboxRecords().length === 0" plain>删除</el-button>
+        </template>
+      </vxe-toolbar>
+      <div style="height: calc(100% - 50px)">
+        <vxe-table
+          :key="tableKey"
+          border="inner"
+          auto-resize
+          resizable
+          height="auto"
+          :loading="loading"
+          size="small"
+          ref="fileDictTable"
+          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="40" ></vxe-column>
+          <vxe-column width="160" title="附件结构名称" field="name" align="left" tree-node></vxe-column>
+          <vxe-column  title="类型" field="type"></vxe-column>
+          <vxe-column width="110" title="最大容量(MB)" field="size"></vxe-column>
+          <vxe-column width="70" title="序号" field="sort"></vxe-column>
+          <vxe-column title="操作" width="230px" fixed="right" align="center">
+            <template  slot-scope="scope">
+              <el-button v-if="hasPermission('program:configuration:file:edit')&&scope.row.parentId === '0'" type="text"  size="small" @click="addChild(scope.row.id)">新建子类型</el-button>
+              <el-button v-if="hasPermission('program:configuration:file:edit')&&scope.row.parentId === '0'" type="text"  size="small" @click="edit(scope.row.id)">修改</el-button>
+              <el-button v-if="hasPermission('program:configuration:file:edit')&&scope.row.parentId !== '0'" type="text"  size="small" @click="editChild(scope.row.id)">修改</el-button>
+              <el-button v-if="hasPermission('program:configuration:file:del')" type="text"   size="small" @click="del(scope.row.id)">删除</el-button>
+            </template>
+          </vxe-column>
+        </vxe-table>
+      </div>
+    </div>
+    <FileDictForm  ref="fileDictForm" @refreshDataList="refreshList"></FileDictForm>
+  </div>
+</template>
+
+<script>
+  import ProgramFileDictService from '@/api/program/ProgramFileDictService'
+  import FileDictForm from './FileDictForm'
+  export default {
+    data () {
+      return {
+        searchForm: {
+          type: '',
+          sort: ''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        tableKey: '',
+        loading: false
+      }
+    },
+    programFileDictService: null,
+    created () {
+      this.programFileDictService = new ProgramFileDictService()
+    },
+    components: {
+      FileDictForm
+    },
+    mounted () {
+      this.refreshList()
+    },
+    methods: {
+      // 新增
+      add () {
+        this.$refs.fileDictForm.init('add', '')
+      },
+      addChild (id) {
+        this.$refs.fileDictForm.init('addChild', id)
+      },
+      // 修改
+      edit (id) {
+        id = id || this.$refs.fileDictTable.getCheckboxRecords().map(item => {
+          return item.id
+        })[0]
+        this.$refs.fileDictForm.init('edit', id)
+      },
+      editChild (id) {
+        id = id || this.$refs.fileDictTable.getCheckboxRecords().map(item => {
+          return item.id
+        })[0]
+        this.$refs.fileDictForm.init('editChild', id)
+      },
+      // 查看
+      view (id) {
+        this.$refs.fileDictForm.init('view', id)
+      },
+      viewChild (id) {
+        this.$refs.fileDictForm.init('viewChild', id)
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        this.programFileDictService.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()
+      },
+      // 删除
+      del (id) {
+        let ids = id || this.$refs.fileDictTable.getCheckboxRecords().map(item => {
+          return item.id
+        }).join(',')
+        this.$confirm(`确定删除所选项吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.loading = true
+          this.programFileDictService.delete(ids).then(({data}) => {
+            this.$message.success(data)
+            this.refreshList()
+            this.loading = false
+          })
+        })
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      }
+    }
+  }
+</script>

+ 129 - 0
src/views/program/configuration/proofreadType/BrowseTypeForm.vue

@@ -0,0 +1,129 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      width="500px"
+      @close="close"
+      @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="/proofread/type/treeData?type=2"
+                :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>
+      <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 ProofreadTypeService from '@/api/sys/ProofreadTypeService'
+  import SelectTree from '@/components/treeSelect/treeSelect.vue'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          name: '',
+          parentId: '',
+          type: ''
+        }
+      }
+    },
+    proofreadTypeService: null,
+    created () {
+      this.proofreadTypeService = new ProofreadTypeService()
+    },
+    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.proofreadTypeService.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 = '2'
+            this.proofreadTypeService.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>

+ 143 - 0
src/views/program/configuration/proofreadType/BrowseTypeList.vue

@@ -0,0 +1,143 @@
+<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>
+        <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('proofread:type:add')" type="primary" size="small" icon="el-icon-plus" @click="add()">新建</el-button>
+          <el-button v-if="hasPermission('proofread: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 title="浏览审核类型名称" field="name" align="left" tree-node></vxe-column>
+
+          <vxe-column title="操作" width="230px" fixed="right" align="center">
+            <template  slot-scope="scope">
+              <el-button v-if="hasPermission('proofread:type:edit')" type="text"  size="small" @click="addChild(scope.row.id)">添加下级结构</el-button>
+              <el-button v-if="hasPermission('proofread:type:edit')" type="text"  size="small" @click="edit(scope.row.id)">修改</el-button>
+              <el-button v-if="hasPermission('proofread:type:remove')" type="text"   size="small" @click="del(scope.row.id)">删除</el-button>
+            </template>
+          </vxe-column>
+        </vxe-table>
+
+      </div>
+    </div>
+    <BrowseTypeForm  ref="browseTypeForm" @refreshDataList="refreshList"></BrowseTypeForm>
+  </div>
+</template>
+
+<script>
+  import ProofreadTypeService from '@/api/sys/ProofreadTypeService'
+  import BrowseTypeForm from './BrowseTypeForm'
+  export default {
+    data () {
+      return {
+        searchForm: {
+          name: '',
+          type: ''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        loading: false
+      }
+    },
+    proofreadTypeService: null,
+    created () {
+      this.proofreadTypeService = new ProofreadTypeService()
+    },
+    components: {
+      BrowseTypeForm
+    },
+    mounted () {
+      this.refreshList()
+    },
+    methods: {
+      // 新增
+      add () {
+        this.$refs.browseTypeForm.init('add', '')
+      },
+      addChild (id) {
+        this.$refs.browseTypeForm.init('addChild', id)
+      },
+      // 修改
+      edit (id) {
+        id = id || this.$refs.typeTable.getCheckboxRecords().map(item => {
+          return item.id
+        })[0]
+        this.$refs.browseTypeForm.init('edit', id)
+      },
+      // 查看
+      view (id) {
+        this.$refs.browseTypeForm.init('view', id)
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        this.searchForm.type = '2'
+        this.proofreadTypeService.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.proofreadTypeService.remove(ids).then(({data}) => {
+            this.$message.success(data)
+            this.refreshList()
+            this.loading = false
+          })
+        })
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      }
+    }
+  }
+</script>

+ 129 - 0
src/views/program/configuration/proofreadType/TypeForm.vue

@@ -0,0 +1,129 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      width="500px"
+      @close="close"
+      @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="/proofread/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>
+      <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 ProofreadTypeService from '@/api/sys/ProofreadTypeService'
+  import SelectTree from '@/components/treeSelect/treeSelect.vue'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          name: '',
+          parentId: '',
+          type: ''
+        }
+      }
+    },
+    proofreadTypeService: null,
+    created () {
+      this.proofreadTypeService = new ProofreadTypeService()
+    },
+    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.proofreadTypeService.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.proofreadTypeService.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>

+ 143 - 0
src/views/program/configuration/proofreadType/TypeList.vue

@@ -0,0 +1,143 @@
+<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>
+        <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('proofread:type:add')" type="primary" size="small" icon="el-icon-plus" @click="add()">新建</el-button>
+          <el-button v-if="hasPermission('proofread: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 title="自检内容名称" field="name" align="left" tree-node></vxe-column>
+
+          <vxe-column title="操作" width="230px" fixed="right" align="center">
+            <template  slot-scope="scope">
+              <el-button v-if="hasPermission('proofread:type:edit')" type="text"  size="small" @click="addChild(scope.row.id)">添加下级结构</el-button>
+              <el-button v-if="hasPermission('proofread:type:edit')" type="text"  size="small" @click="edit(scope.row.id)">修改</el-button>
+              <el-button v-if="hasPermission('proofread: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 ProofreadTypeService from '@/api/sys/ProofreadTypeService'
+  import TypeForm from './TypeForm'
+  export default {
+    data () {
+      return {
+        searchForm: {
+          name: '',
+          type: ''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        loading: false
+      }
+    },
+    proofreadTypeService: null,
+    created () {
+      this.proofreadTypeService = new ProofreadTypeService()
+    },
+    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.proofreadTypeService.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.proofreadTypeService.remove(ids).then(({data}) => {
+            this.$message.success(data)
+            this.refreshList()
+            this.loading = false
+          })
+        })
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      }
+    }
+  }
+</script>

+ 126 - 0
src/views/program/configuration/typeDict/TypeDictForm.vue

@@ -0,0 +1,126 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      width="500px"
+      @close="close"
+      @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="type"
+                          :rules="[
+                          {required: true, message:'项目类型不能为空', trigger:'blur'}
+                 ]">
+              <el-input v-model="inputForm.type" 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>
+      <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 ProgramTypeDictService from '@/api/program/ProgramTypeDictService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          type: '',
+          sort: '',
+          remarks: '',
+          parentId: ''
+        }
+      }
+    },
+    programTypeDictService: null,
+    created () {
+      this.programTypeDictService = new ProgramTypeDictService()
+    },
+    methods: {
+      init (method, id) {
+        this.method = method
+        this.inputForm = {
+          type: '',
+          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.programTypeDictService.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
+            this.programTypeDictService.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>

+ 171 - 0
src/views/program/configuration/typeDict/TypeDictList.vue

@@ -0,0 +1,171 @@
+<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 prop="type">
+        <el-input size="small" v-model="searchForm.type" 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.typeDictTable && $refs.typeDictTable.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="typeDictTable"
+          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="40" ></vxe-column>
+          <vxe-column min-width="350" title="项目类型名称" field="type" 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="remarks"></vxe-column>
+          <vxe-column title="操作" width="230px" fixed="right" align="center">
+            <template  slot-scope="scope">
+              <el-button v-if="hasPermission('program:configuration:type:edit')&&scope.row.parentId === '0'" type="text"  size="small" @click="addChild(scope.row.id)">新建子类型</el-button>
+              <el-button v-if="hasPermission('program:configuration:type:edit')" type="text"  size="small" @click="edit(scope.row.id)">修改</el-button>
+              <el-button v-if="hasPermission('program:configuration:type:del')" 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>
+    <TypeDictForm  ref="typeDictForm" @refreshDataList="refreshList"></TypeDictForm>
+  </div>
+</template>
+
+<script>
+  import ProgramTypeDictService from '@/api/program/ProgramTypeDictService'
+  import TypeDictForm from './TypeDictForm'
+  export default {
+    data () {
+      return {
+        searchForm: {
+          type: '',
+          sort: ''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        loading: false
+      }
+    },
+    programTypeDictService: null,
+    created () {
+      this.programTypeDictService = new ProgramTypeDictService()
+    },
+    components: {
+      TypeDictForm
+    },
+    mounted () {
+      this.refreshList()
+    },
+    methods: {
+      // 新增
+      add () {
+        this.$refs.typeDictForm.init('add', '')
+      },
+      addChild (id) {
+        this.$refs.typeDictForm.init('addChild', id)
+      },
+      // 修改
+      edit (id) {
+        id = id || this.$refs.typeDictTable.getCheckboxRecords().map(item => {
+          return item.id
+        })[0]
+        this.$refs.typeDictForm.init('edit', id)
+      },
+      // 查看
+      view (id) {
+        this.$refs.typeDictForm.init('view', id)
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        this.programTypeDictService.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.typeDictTable.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.typeDictTable.getCheckboxRecords().map(item => {
+          return item.id
+        }).join(',')
+        this.$confirm(`确定删除所选项吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.loading = true
+          this.programTypeDictService.delete(ids).then(({data}) => {
+            this.$message.success(data)
+            this.refreshList()
+            this.loading = false
+          })
+        })
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      }
+    }
+  }
+</script>

+ 145 - 0
src/views/program/configuration/typeFileDict/TypeFileDictForm.vue

@@ -0,0 +1,145 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      width="500px"
+      @close="close"
+      @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="fileId"
+                          :rules="[
+                          {required: true, message:'附件名称不能为空', trigger:'blur'}
+                 ]">
+              <el-select v-model="inputForm.fileId" placeholder="请选择附件名称" style="width:100%;" clearable>
+                <el-option
+                  v-for="item in fileDictList"
+                  :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="requiredStage"
+                          :rules="[
+                 ]">
+              <el-select v-model="inputForm.requiredStage" placeholder="请选择必填阶段" style="width:100%;" clearable>
+                <el-option
+                  v-for="item in $dictUtils.getDictList('program_required_stage')"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </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 ProgramTypeFileDictService from '@/api/program/ProgramTypeFileDictService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          fileId: '',
+          requiredStage: '',
+          attachmentProjectType: '',
+          attachmentProjectSort: ''
+        },
+        fileDictList: []
+      }
+    },
+    programTypeFileDictService: null,
+    created () {
+      this.programTypeFileDictService = new ProgramTypeFileDictService()
+    },
+    methods: {
+      init (method, id, attachmentProjectType, attachmentProjectSort, fileId) {
+        this.method = method
+        this.getFileList(attachmentProjectType, attachmentProjectSort, fileId)
+        this.inputForm = {
+          fileId: '',
+          requiredStage: '',
+          attachmentProjectType: '',
+          attachmentProjectSort: ''
+        }
+        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()
+          this.inputForm.attachmentProjectType = attachmentProjectType
+          this.inputForm.attachmentProjectSort = attachmentProjectSort
+          if (method === 'edit' || method === 'view') { // 修改或者查看
+            this.loading = true
+            this.programTypeFileDictService.queryById(this.inputForm.id).then(({data}) => {
+              this.inputForm = this.recover(this.inputForm, data)
+              this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+              if (this.inputForm.requiredStage === '0') {
+                this.inputForm.requiredStage = ''
+              }
+              this.inputForm.attachmentProjectType = attachmentProjectType
+              this.inputForm.attachmentProjectSort = attachmentProjectSort
+              this.loading = false
+            })
+          }
+        })
+      },
+      // 表单提交
+      doSubmit () {
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            if (this.commonJS.isEmpty(this.inputForm.requiredStage)) {
+              this.inputForm.requiredStage = '0'
+            }
+            this.programTypeFileDictService.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
+      },
+      getFileList (attachmentProjectType, attachmentProjectSort, fileId) {
+        this.programTypeFileDictService.getFileList({'attachmentProjectType': attachmentProjectType, 'attachmentProjectSort': attachmentProjectSort, 'fileId': fileId}).then(({data}) => {
+          this.fileDictList = data
+        })
+      }
+    }
+  }
+</script>

+ 195 - 0
src/views/program/configuration/typeFileDict/TypeFileDictList.vue

@@ -0,0 +1,195 @@
+<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 prop="attachmentProjectType">
+        <el-select v-model="searchForm.attachmentProjectType" placeholder="请选择项目类型" style="width:100%;">
+          <el-option
+            v-for="item in $dictUtils.getDictList('program_type')"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item prop="attachmentProjectSort">
+        <el-select v-model="searchForm.attachmentProjectSort" placeholder="请选择项目类型项目类别" style="width:100%;">
+          <el-option
+            v-if="searchForm.attachmentProjectType === '1'"
+            v-for="item in $dictUtils.getDictList('program_cost_audit_type')"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+          <el-option
+            v-if="searchForm.attachmentProjectType === '2'"
+            v-for="item in $dictUtils.getDictList('program_engineering_consultation_type')"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </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_file:del')" type="danger"   size="small" icon="el-icon-delete" @click="del()" :disabled="$refs.typeFileDictTable && $refs.typeFileDictTable.getCheckboxRecords().length === 0" plain>删除</el-button>-->
+        </template>
+      </vxe-toolbar>
+      <div style="height: calc(100% - 50px)">
+        <vxe-table
+          :key="tableKey"
+          border="inner"
+          auto-resize
+          resizable
+          height="auto"
+          :loading="loading"
+          size="small"
+          ref="typeFileDictTable"
+          show-header-overflow
+          show-overflow
+          highlight-hover-row
+          :menu-config="{}"
+          @sort-change="sortChangeHandle"
+          :sort-config="{remote:true}"
+          :data="dataList"
+          :tree-config="{transform: true, rowField: 'fileId', 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 width="180" title="附件名称" field="name" align="left" tree-node></vxe-column>
+          <vxe-column title="必填阶段" field="requiredStage">
+            <template slot-scope="scope">
+              {{$dictUtils.getDictLabel("program_required_stage", scope.row.requiredStage, "")}}
+            </template>
+          </vxe-column>
+          <vxe-column title="操作" width="230px" fixed="right" align="center">
+            <template  slot-scope="scope">
+              <el-button v-if="hasPermission('program:configuration:type_file:edit')&&scope.row.parentId === '0'" type="text"  size="small" @click="add(scope.row)">新建子类型</el-button>
+              <el-button v-if="hasPermission('program:configuration:type_file:edit')&&scope.row.parentId !== '0'" type="text"  size="small" @click="edit(scope.row)">修改</el-button>
+              <el-button v-if="hasPermission('program:configuration:type_file:del')&&scope.row.parentId !== '0'" type="text"   size="small" @click="del(scope.row)">删除</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>
+    <TypeFileDictForm  ref="typeFileDictForm" @refreshDataList="refreshList"></TypeFileDictForm>
+  </div>
+</template>
+
+<script>
+  import ProgramTypeFileDictService from '@/api/program/ProgramTypeFileDictService'
+  import TypeFileDictForm from './TypeFileDictForm'
+  export default {
+    data () {
+      return {
+        searchForm: {
+          attachmentProjectSort: '',
+          attachmentProjectType: ''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        loading: false,
+        tableKey: ''
+      }
+    },
+    programTypeFileDictService: null,
+    created () {
+      this.programTypeFileDictService = new ProgramTypeFileDictService()
+    },
+    components: {
+      TypeFileDictForm
+    },
+    mounted () {
+      this.refreshList()
+    },
+    methods: {
+      // 新增
+      add (row) {
+        console.log(this.searchForm)
+        this.$refs.typeFileDictForm.init('add', null, this.searchForm.attachmentProjectType, this.searchForm.attachmentProjectSort, row.fileId)
+      },
+      // 修改
+      edit (row) {
+        row.id = row.id || this.$refs.typeFileDictTable.getCheckboxRecords().map(item => {
+          return item.id
+        })[0]
+        this.$refs.typeFileDictForm.init('edit', row.id, this.searchForm.attachmentProjectType, this.searchForm.attachmentProjectSort, row.fileId)
+      },
+      // 查看
+      view (row) {
+        this.$refs.typeFileDictForm.init('view', row.id, this.searchForm.attachmentProjectType, this.searchForm.attachmentProjectSort, row.fileId)
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        this.programTypeFileDictService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then(({data}) => {
+          this.dataList = data
+          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()
+      },
+      // 删除
+      del (row) {
+        let ids = row.id || this.$refs.typeFileDictTable.getCheckboxRecords().map(item => {
+          return item.id
+        }).join(',')
+        this.$confirm(`确定删除所选项吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.loading = true
+          this.programTypeFileDictService.delete(ids).then(({data}) => {
+            this.$message.success(data)
+            this.refreshList()
+            this.loading = false
+          })
+        })
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      }
+    }
+  }
+</script>

+ 154 - 0
src/views/program/registered/ContactForm.vue

@@ -0,0 +1,154 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      width="1100px"
+      height="500px"
+      @close="close"
+      @keyup.enter.native="getContact"
+      :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>-->
+<!--          &lt;!&ndash; 搜索框&ndash;&gt;-->
+<!--          <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="400px"
+          :loading="loading"
+          size="small"
+          ref="contactTable"
+          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="40"></vxe-column>
+          <vxe-column type="checkbox" width="40px"></vxe-column>
+
+          <vxe-column width="" title="联系人姓名" field="name"></vxe-column>
+          <vxe-column width="" title="联系方式1" field="linkPhone"></vxe-column>
+          <vxe-column width="" title="联系方式2" field="linkMobile"></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="getContact()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+    </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import InputNumber from '@/views/workContract/InputNumber.vue'
+  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: {
+          ids: [],
+          id: '',
+          name: '',
+          deputy: ''
+        },
+        rowId: ''
+      }
+    },
+    workClientService: null,
+    created () {
+      this.workClientService = new WorkClientService()
+    },
+    components: {
+      SelectUserTree,
+      InputNumber
+    },
+    methods: {
+      init (ids, deputy) {
+        // if (!this.commonJS.isEmpty(id)) {
+        //   this.$refs.workContractTable.setCurrentRow(id)
+        // }
+        this.searchForm.ids = ids
+        this.searchForm.deputy = deputy
+        this.visible = true
+        this.list()
+      },
+      // 表单提交
+      getContact () {
+        let rows = this.$refs.contactTable.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,
+              contacts: item.name,
+              linkMobilePhoneFirst: item.linkPhone,
+              linkMobilePhoneSecoed: item.linkMobile,
+              job: '',
+              remarks: ''
+            }
+            list.push(p)
+          })
+        }
+        this.close()
+        this.$emit('getContact', list, this.searchForm.deputy)
+      },
+      list () {
+        this.dataList = []
+        this.searchForm.ids.forEach((item) => {
+          this.workClientService.findById(item).then((data) => {
+            console.log(data.data.workClientLinkman)
+            data.data.workClientLinkman.forEach(i => {
+              this.dataList.push(i)
+            })
+          })
+        })
+      },
+      // 当前页
+      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>

+ 183 - 0
src/views/program/registered/ContractForm.vue

@@ -0,0 +1,183 @@
+<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="name">
+            <el-input size="small" v-model="searchForm.name" placeholder="请输入合同名称" clearable></el-input>
+          </el-form-item>
+          <el-form-item label="委派方" prop="clientName">
+            <el-input size="small" v-model="searchForm.clientName" 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="`/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()" 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 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 slot-scope="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
+          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 WorkContractService from '@/api/sys/WorkContractService'
+  import SelectUserTree from '@/views/utils/treeUserSelect'
+  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: ''
+      }
+    },
+    workContractService: null,
+    programProjectListInfoService: null,
+    created () {
+      this.workContractService = new WorkContractService()
+      this.programProjectListInfoService = new ProgramProjectListInfoService()
+    },
+    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.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>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1058 - 0
src/views/program/registered/ProjectArchiveForm.vue


+ 941 - 0
src/views/program/registered/ProjectArchiveFormDialog.vue

@@ -0,0 +1,941 @@
+<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      width="1300px"
+      @close="close"
+      @keyup.enter.native=""
+      :visible.sync="visible">
+      <el-form size="middle" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="formReadOnly"
+               label-width="170px" @submit.native.prevent>
+        <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="programProjectListInfo.name"
+              >
+                <el-input size="medium" :disabled="true" v-model="inputForm.programProjectListInfo.name" placeholder="请输入项目名称" clearable></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="评估基准日" prop="programProjectListInfo.assessmentDate"
+              >
+                <el-date-picker
+                  :disabled="true"
+                  v-model="inputForm.programProjectListInfo.assessmentDate"
+                  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="reportNo"
+              >
+                <el-input size="medium" :disabled="true" v-model="inputForm.reportNo" placeholder="请输入报告号" clearable></el-input>
+              </el-form-item>
+            </el-col>
+
+            <el-col :span="12">
+              <el-form-item label="项目负责人" prop="programProjectListInfo.projectManager"
+              >
+                <SelectUserTree
+                  ref="companyTree"
+                  size="medium"
+                  :props="{
+                  value: 'id',             // ID字段名
+                  label: 'name',         // 显示名称
+                  children: 'children'    // 子级字段名
+                }"
+                  :url="`/sys/user/treeUserDataAllOffice?type=2`"
+                  :value="inputForm.programProjectListInfo.projectManager"
+                  :disabled="true"
+                  :clearable="true"
+                  :accordion="true"
+                  @getValue="(value) => {inputForm.programProjectListInfo.projectManager=value}"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="所属部门" prop="programProjectListInfo.officeId"
+              >
+                <el-input size="medium" :disabled="true" v-model="inputForm.programProjectListInfo.officeId" placeholder="请输入所属部门" clearable></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="年份" prop="year"
+                            :rules="[
+
+                 ]">
+                <el-input size="medium" :disabled="true" v-model="inputForm.year" placeholder="请输入年份" clearable></el-input>
+<!--                <el-date-picker-->
+<!--                  v-model="inputForm.year"-->
+<!--                  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="programType"-->
+<!--                            :rules="[-->
+<!--                        {required: true, message:'项目类型不能为空', trigger:'blur'}-->
+<!--                 ]">-->
+<!--                <el-input v-model="inputForm.programType" maxlength="64" placeholder="请填写项目类型"    clearable ></el-input>-->
+<!--              </el-form-item>-->
+<!--            </el-col>-->
+            <el-col :span="12">
+              <el-form-item label="项目类型" prop="programProjectListInfo.projectMould"
+                            :rules="[
+                 ]">
+                <el-select v-model="inputForm.programProjectListInfo.projectMould" :disabled="true" placeholder="请选择项目类型" clearable style="width: 100%;">
+                  <el-option
+                    v-for="item in $dictUtils.getDictList('program_registered_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="programProjectListInfo.contractNo"
+                            :rules="[
+                 ]">
+                <el-input :disabled="true" v-model="inputForm.programProjectListInfo.contractNo" maxlength="64" placeholder="请填写合同编号"   clearable  ></el-input>
+              </el-form-item>
+            </el-col>
+
+
+
+            <el-col :span="12">
+              <el-form-item label="签字评估师1" prop="signatureEvaluatorFirst"
+                            :rules=" [
+                        {required: true, message:'签字评估师1不能为空', trigger:'blur'},{required: true, message:'签字评估师1不能为空', trigger:'change'}
+                        ]" >
+                <UserSelect size="medium" :disabled="formReadOnly" :readonly="true" :limit='1' :value="inputForm.signatureEvaluatorFirst" @getValue='(value) => {inputForm.signatureEvaluatorFirst = value}'></UserSelect>
+              </el-form-item>
+            </el-col>
+
+
+            <el-col :span="12">
+              <el-form-item label="签字评估师2" prop="signatureEvaluatorSecond"
+                            :rules=" [
+                        {required: true, message:'签字评估师2不能为空', trigger:'blur'},{required: true, message:'签字评估师2不能为空', trigger:'change'}
+                        ]" >
+                <UserSelect size="medium" :disabled="formReadOnly" :readonly="true" :limit='1' :value="inputForm.signatureEvaluatorSecond" @getValue='(value) => {inputForm.signatureEvaluatorSecond = value}'></UserSelect>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="评估报告日" prop="evaluationReportDate"
+                            :rules="[
+                        {required: true, message:'评估报告日不能为空', trigger:'blur'}
+                 ]">
+                <el-date-picker
+                  style="width:100%;"
+                  v-model="inputForm.evaluationReportDate"
+                  type="date"
+                  placement="bottom-start"
+                  value-format="yyyy-MM-dd"
+                  placeholder="选择日期"clearable>
+                </el-date-picker>
+              </el-form-item>
+            </el-col>
+
+            <el-col :span="12">
+              <el-form-item label="废旧物资评估(万元)" prop="waystEvaluation"
+                            :rules="[
+                        {required: true, message:'废旧物资评估不能为空', trigger:'blur'}
+                 ]">
+                <el-input-number
+                  v-model="inputForm.waystEvaluation"
+                  controls-position="right"
+                  :controls="false"
+                  :max="999999999999999"
+                  style="width:100%;"
+                  :precision="2"
+                  placeholder="请填写废旧物资评估"
+                  :step="0.01"
+                  :min="0"
+                  clearable>
+                </el-input-number>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="固定资产评估(万元)" prop="fixedAssetsEvaluation"
+                            :rules="[
+                        {required: true, message:'固定资产评估不能为空', trigger:'blur'}
+                 ]">
+                <el-input-number
+                  v-model="inputForm.fixedAssetsEvaluation"
+                  controls-position="right"
+                  :controls="false"
+                  :max="999999999999999"
+                  style="width:100%;"
+                  :precision="2"
+                  placeholder="请填写固定资产评估"
+                  :step="0.01"
+                  :min="0"
+                  clearable>
+                </el-input-number>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="净资产评估" prop="netAssetsEvaluation"
+                            :rules="[
+                        {required: true, message:'净资产评估不能为空', trigger:'blur'}
+                 ]">
+                <el-input-number
+                  v-model="inputForm.netAssetsEvaluation"
+                  controls-position="right"
+                  :controls="false"
+                  :max="999999999999999"
+                  style="width:100%;"
+                  :precision="2"
+                  placeholder="请填写净资产评估"
+                  :step="0.01"
+                  :min="0"
+                  clearable>
+                </el-input-number>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="租金评估(万/年)" prop="rentEvaluation"
+                            :rules="[
+                        {required: true, message:'租金评估不能为空', trigger:'blur'}
+                 ]">
+                <el-input-number
+                  v-model="inputForm.rentEvaluation"
+                  controls-position="right"
+                  :controls="false"
+                  :max="999999999999999"
+                  style="width:100%;"
+                  :precision="2"
+                  placeholder="请填写租金评估"
+                  :step="0.01"
+                  :min="0"
+                  clearable>
+                </el-input-number>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="预估/实际收费(万元)" prop="actualCharges"
+                            :rules="[
+                        {required: true, message:'预估/实际收费不能为空', trigger:'blur'}
+                 ]">
+                <el-input-number
+                  v-model="inputForm.actualCharges"
+                  controls-position="right"
+                  :controls="false"
+                  :max="999999999999999"
+                  style="width:100%;"
+                  :precision="2"
+                  placeholder="请填写预估/实际收费"
+                  :step="0.01"
+                  :min="0"
+                  clearable>
+                </el-input-number>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="报告收费(元)" prop="reportCharges"
+                            :rules="[
+                        {required: true, message:'报告收费不能为空', trigger:'blur'}
+                 ]">
+                <el-input-number
+                  v-model="inputForm.reportCharges"
+                  controls-position="right"
+                  :controls="false"
+                  :max="999999999999999"
+                  style="width:100%;"
+                  :precision="2"
+                  placeholder="请填写报告收费"
+                  :step="0.01"
+                  :min="0"
+                  clearable>
+                </el-input-number>
+              </el-form-item>
+            </el-col>
+
+            <el-col :span="12">
+              <el-form-item label="当前处理人" prop="currentDisposePerson"
+                            :rules=" [
+                        {required: true, message:'当前处理人不能为空', trigger:'blur'},{required: true, message:'当前处理人不能为空', trigger:'change'}
+                        ]" >
+                <UserSelect size="medium" :disabled="formReadOnly" :readonly="true" :limit='1' :value="inputForm.currentDisposePerson" @getValue='(value) => {inputForm.currentDisposePerson = value}'></UserSelect>
+              </el-form-item>
+            </el-col>
+
+            <el-col :span="12">
+              <el-form-item label="是否开票" prop="isInvoice"
+                            :rules="[
+                        {required: true, message:'是否开票不能为空', trigger:'blur'}
+                 ]">
+                <el-radio-group v-model="inputForm.isInvoice">
+                  <el-radio v-for="item in $dictUtils.getDictList('yes_no')" :label="item.value" :key="item.id">{{item.label}}</el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="开票日期" prop="invoiceDate"
+                            :rules="[
+                 ]">
+                <el-date-picker
+                  style="width:100%;"
+                  placement="bottom-start"
+                  v-model="inputForm.invoiceDate"
+                  type="date"
+                  value-format="yyyy-MM-dd"
+                  placeholder="选择日期时间"clearable>
+                </el-date-picker>
+              </el-form-item>
+            </el-col>
+
+            <el-col :span="12">
+              <el-form-item label="合同是否存档" prop="isContractArchive"
+                            :rules="[
+                        {required: true, message:'合同是否存档不能为空', trigger:'blur'}
+                 ]">
+                <el-radio-group v-model="inputForm.isContractArchive">
+                  <el-radio v-for="item in $dictUtils.getDictList('yes_no')" :label="item.value" :key="item.id">{{item.label}}</el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="底稿是否完好" prop="isPapersIntact"
+                            :rules="[
+                        {required: true, message:'底稿是否完好不能为空', trigger:'blur'}
+                 ]">
+                <el-radio-group v-model="inputForm.isPapersIntact">
+                  <el-radio v-for="item in $dictUtils.getDictList('yes_no')" :label="item.value" :key="item.id">{{item.label}}</el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="底稿是否归档" prop="isPapersArchive"
+                            :rules="[
+                        {required: true, message:'底稿是否归档不能为空', trigger:'blur'}
+                 ]">
+                <el-radio-group v-model="inputForm.isPapersArchive">
+                  <el-radio v-for="item in $dictUtils.getDictList('yes_no')" :label="item.value" :key="item.id">{{item.label}}</el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+
+            <el-col :span="12">
+              <el-form-item label="外勤是否已经报销" prop="isOpsReimbursement"
+                            :rules="[
+                        {required: true, message:'外勤是否已经报销不能为空', trigger:'blur'}
+                 ]">
+                <el-radio-group v-model="inputForm.isOpsReimbursement">
+                  <el-radio v-for="item in $dictUtils.getDictList('yes_no')" :label="item.value" :key="item.id">{{item.label}}</el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="报销外勤天数" prop="opsAmount"
+                            :rules="[
+                        {required: true, message:'报销外勤天数不能为空', trigger:'blur'}
+                 ]">
+                <el-input-number
+                  v-model="inputForm.opsAmount"
+                  controls-position="right"
+                  :controls="false"
+                  :max="999999"
+                  style="width:100%;"
+                  :precision="1"
+                  placeholder="请填写报销外勤天数"
+                  :step="0.1"
+                  :min="0"
+                  clearable>
+                </el-input-number>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="已报销金额" prop="reimbursementAmount"
+                            :rules="[
+                        {required: true, message:'已报销金额不能为空', trigger:'blur'}
+                 ]">
+                <el-input-number
+                  v-model="inputForm.reimbursementAmount"
+                  controls-position="right"
+                  :controls="false"
+                  :max="999999999999999"
+                  style="width:100%;"
+                  :precision="2"
+                  placeholder="请填写已报销金额"
+                  :step="0.01"
+                  :min="0"
+                  clearable>
+                </el-input-number>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="未报销金额" prop="unreimbursedAmount"
+                            :rules="[
+                        {required: true, message:'未报销金额不能为空', trigger:'blur'}
+                 ]">
+                <el-input-number
+                  v-model="inputForm.unreimbursedAmount"
+                  controls-position="right"
+                  :controls="false"
+                  :max="999999999999999"
+                  style="width:100%;"
+                  :precision="2"
+                  placeholder="请填写未报销金额"
+                  :step="0.01"
+                  :min="0"
+                  clearable>
+                </el-input-number>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="报销单号" prop="reimbursementNum"
+                            :rules="[
+                 ]">
+                <el-input v-model="inputForm.reimbursementNum" maxlength="64" placeholder="请填写报销单号"   clearable  ></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="报销日期" prop="reimbursementDate"
+                            :rules="[
+                 ]">
+                <el-date-picker
+                  placement="bottom-start"
+                  style="width:100%;"
+                  v-model="inputForm.reimbursementDate"
+                  type="date"
+                  value-format="yyyy-MM-dd"
+                  placeholder="选择日期时间"clearable>
+                </el-date-picker>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <!--              原司法鉴定-->
+              <el-form-item label="其他" prop="forensics"
+                            :rules="[
+                 ]">
+                <el-input v-model="inputForm.forensics" maxlength="64" placeholder="请填写其他"    clearable ></el-input>
+              </el-form-item>
+            </el-col>
+
+            <!--<el-col :span="12">
+              <el-form-item label="签字评估师1" prop="signatureEvaluatorFirst"
+              >
+                <SelectUserTree
+                  ref="companyTree"
+                  size="medium"
+                  :props="{
+                  value: 'id',             // ID字段名
+                  label: 'name',         // 显示名称
+                  children: 'children'    // 子级字段名
+                }"
+                  :url="`/sys/user/treeUserDataAllOffice?type=2`"
+                  :value="inputForm.signatureEvaluatorFirst"
+                  :disabled="true"
+                  :clearable="true"
+                  :accordion="true"
+                  @getValue="(value) => {inputForm.signatureEvaluatorFirst=value}"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="签字评估师2" prop="signatureEvaluatorSecond"
+              >
+                <SelectUserTree
+                  ref="companyTree"
+                  size="medium"
+                  :props="{
+                  value: 'id',             // ID字段名
+                  label: 'name',         // 显示名称
+                  children: 'children'    // 子级字段名
+                }"
+                  :url="`/sys/user/treeUserDataAllOffice?type=2`"
+                  :value="inputForm.signatureEvaluatorSecond"
+                  :disabled="true"
+                  :clearable="true"
+                  :accordion="true"
+                  @getValue="(value) => {inputForm.signatureEvaluatorSecond=value}"/>
+              </el-form-item>
+            </el-col>-->
+          </el-row>
+          <!--附件信息 - 评估报告-->
+          <UpLoadComponent ref="uploadComponentReport"></UpLoadComponent>
+          <!--附件信息 - 评估说明-->
+          <UpLoadComponent ref="uploadComponentExplain"></UpLoadComponent>
+          <!--附件信息 - 评估明细表-->
+          <UpLoadComponent ref="uploadComponentDetail"></UpLoadComponent>
+          <!--附件信息 - 评估操作计算底稿-->
+          <UpLoadComponent ref="uploadComponentPapers"></UpLoadComponent>
+          <!--附件信息 - 其他-->
+          <UpLoadComponent ref="uploadComponentOther"></UpLoadComponent>
+
+
+      </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"  @click="doSubmit('agree')" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import UpLoadComponent from '@/views/common/UpLoadComponent'
+  import UserSelect from '@/components/userSelect'
+  import SelectUserTree from '@/views/utils/treeUserSelect'
+  import RosterSelectForm from '@/views/common/RosterSelectForm'
+  import ProgramProjectListInfoService from '@/api/program/ProgramProjectListInfoService'
+  import WangEditor from '@/components/editor/WangEditorNoMenu'
+  export default {
+    props: {
+      businessId: {
+        type: String,
+        default: ''
+      },
+      formReadOnly: {
+        type: Boolean,
+        default: false
+      }
+    },
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          id: '',
+          remarks: '',
+          programId: '',
+          year: '',
+          programType: '',
+          evaluationReportDate: '',
+          protocolNum: '',
+          waystEvaluation: '',
+          fixedAssetsEvaluation: '',
+          netAssetsEvaluation: '',
+          rentEvaluation: '',
+          forensics: '',
+          reportCharges: '',
+          currentDisposePerson: '',
+          isInvoice: '',
+          invoiceDate: '',
+          actualCharges: '',
+          isContractArchive: '',
+          isPapersIntact: '',
+          isPapersArchive: '',
+          opsAmount: '',
+          isOpsReimbursement: '',
+          reimbursementAmount: '',
+          unreimbursedAmount: '',
+          reimbursementNum: '',
+          reimbursementDate: '',
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          programProjectListInfo: {},
+          reportFileList: [],
+          explainFileList: [],
+          detailFileList: [],
+          papersFileList: [],
+          otherFileList: [],
+          auditUserId: '',
+          signatureEvaluatorFirst: '',
+          signatureEvaluatorSecond: '',
+          reportNo: '',
+          contractNo: ''
+        },
+        programId: '',
+        supervisorList: [],
+        keyWatch: ''
+      }
+    },
+    programProjectListInfoService: null,
+    created () {
+      this.programProjectListInfoService = new ProgramProjectListInfoService()
+    },
+    computed: {
+      bus: {
+        get () {
+          this.$refs.uploadComponentReport.setDividerName('评估报告')
+          this.$refs.uploadComponentExplain.setDividerName('评估说明')
+          this.$refs.uploadComponentDetail.setDividerName('评估明细表')
+          this.$refs.uploadComponentPapers.setDividerName('评估操作计算底稿')
+          this.$refs.uploadComponentOther.setDividerName('其他')
+          return this.businessId
+        },
+        set (val) {
+          this.businessId = val
+        }
+      }
+    },
+    watch: {
+      'keyWatch': {
+        handler (newVal) {
+          if (this.bus) {
+            if (this.bus !== 'false') {
+              this.init('', this.bus)
+            }
+          } else {
+            this.$nextTick(() => {
+              this.$refs.inputForm.resetFields()
+            })
+          }
+        }
+      }
+    },
+    components: {
+      UpLoadComponent,
+      RosterSelectForm,
+      UserSelect,
+      WangEditor,
+      SelectUserTree
+    },
+    methods: {
+      getKeyWatch (keyWatch) {
+        this.keyWatch = keyWatch
+      },
+      init (method, id) {
+        if (method === 'formReadOnly') {
+          this.formReadOnly = true
+        }
+        this.method = method
+        this.title = '项目归档'
+        this.inputForm = {
+          id: '',
+          remarks: '',
+          programId: '',
+          year: '',
+          programType: '',
+          evaluationReportDate: '',
+          protocolNum: '',
+          waystEvaluation: '',
+          fixedAssetsEvaluation: '',
+          netAssetsEvaluation: '',
+          rentEvaluation: '',
+          forensics: '',
+          reportCharges: '',
+          currentDisposePerson: '',
+          isInvoice: '',
+          invoiceDate: '',
+          actualCharges: '',
+          isContractArchive: '',
+          isPapersIntact: '',
+          isPapersArchive: '',
+          opsAmount: '',
+          isOpsReimbursement: '',
+          reimbursementAmount: '',
+          unreimbursedAmount: '',
+          reimbursementNum: '',
+          reimbursementDate: '',
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          programProjectListInfo: {},
+          reportFileList: [],
+          explainFileList: [],
+          detailFileList: [],
+          papersFileList: [],
+          otherFileList: [],
+          auditUserId: '',
+          signatureEvaluatorFirst: '',
+          signatureEvaluatorSecond: '',
+          reportNo: '',
+          contractNo: ''
+        }
+        if (this.commonJS.isEmpty(id)) {
+          this.inputForm = {
+            id: '',
+            remarks: '',
+            programId: '',
+            year: '',
+            programType: '',
+            evaluationReportDate: '',
+            protocolNum: '',
+            waystEvaluation: '',
+            fixedAssetsEvaluation: '',
+            netAssetsEvaluation: '',
+            rentEvaluation: '',
+            forensics: '',
+            reportCharges: '',
+            currentDisposePerson: '',
+            isInvoice: '',
+            invoiceDate: '',
+            actualCharges: '',
+            isContractArchive: '',
+            isPapersIntact: '',
+            isPapersArchive: '',
+            opsAmount: '',
+            isOpsReimbursement: '',
+            reimbursementAmount: '',
+            unreimbursedAmount: '',
+            reimbursementNum: '',
+            reimbursementDate: '',
+            procInsId: '',
+            processDefinitionId: '',
+            status: '',
+            programProjectListInfo: {},
+            reportFileList: [],
+            explainFileList: [],
+            detailFileList: [],
+            papersFileList: [],
+            otherFileList: [],
+            auditUserId: '',
+            signatureEvaluatorFirst: '',
+            signatureEvaluatorSecond: '',
+            reportNo: '',
+            contractNo: ''
+          }
+          return
+        }
+        this.inputForm.id = id
+        this.visible = true
+        this.loading = false
+        this.$nextTick(() => {
+          this.$refs.inputForm.resetFields()
+          this.loading = true
+          this.programProjectListInfoService.findByIdArchive(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.year)) {
+              if (this.commonJS.isNotEmpty(this.inputForm.reportNo)) {
+                let arr1 = this.inputForm.reportNo.split('【')
+                let arr2 = arr1[1].split('】')
+                this.inputForm.year = arr2[0]
+              }
+            }
+            this.$refs.uploadComponentReport.clearUpload()
+            this.$refs.uploadComponentExplain.clearUpload()
+            this.$refs.uploadComponentDetail.clearUpload()
+            this.$refs.uploadComponentPapers.clearUpload()
+            this.$refs.uploadComponentOther.clearUpload()
+            if (this.formReadOnly === true) {
+              method = 'view'
+            }
+            if (this.commonJS.isEmpty(this.inputForm.reportFileList)) {
+              this.inputForm.reportFileList = []
+            }
+            if (this.commonJS.isEmpty(this.inputForm.explainFileList)) {
+              this.inputForm.explainFileList = []
+            }
+            if (this.commonJS.isEmpty(this.inputForm.detailFileList)) {
+              this.inputForm.detailFileList = []
+            }
+            if (this.commonJS.isEmpty(this.inputForm.papersFileList)) {
+              this.inputForm.papersFileList = []
+            }
+            if (this.commonJS.isEmpty(this.inputForm.otherFileList)) {
+              this.inputForm.otherFileList = []
+            }
+            this.$refs.uploadComponentReport.newUpload(method, this.inputForm.reportFileList, 'program', null, '评估报告')
+            this.$refs.uploadComponentExplain.newUpload(method, this.inputForm.explainFileList, 'program', null, '评估说明')
+            this.$refs.uploadComponentDetail.newUpload(method, this.inputForm.detailFileList, 'program', null, '评估明细表')
+            this.$refs.uploadComponentPapers.newUpload(method, this.inputForm.papersFileList, 'program', null, '评估操作计算底稿')
+            this.$refs.uploadComponentOther.newUpload(method, this.inputForm.otherFileList, 'program', null, '其他')
+            this.loading = false
+          })
+        })
+      },
+      saveForm (callback) {
+        this.doSubmit('save', callback)
+      },
+      startForm (callback) {
+        this.doSubmit('start', callback)
+      },
+      async agreeForm (callback) {
+        await this.programProjectListInfoService.findByIdArchive(this.inputForm.id).then(({data}) => {
+          if (data.status !== '2') { // status的值不等于“审核中”,就弹出提示
+            this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+            throw new Error()
+          } else {
+            this.doSubmit('agree', callback)
+          }
+        })
+      },
+      // 表单提交
+      async doSubmit (status, callback) {
+        if (await this.$refs.uploadComponentReport.checkProgress()) {
+          this.loading = false
+          throw new Error()
+        }
+        if (await this.$refs.uploadComponentExplain.checkProgress()) {
+          this.loading = false
+          throw new Error()
+        }
+        if (await this.$refs.uploadComponentDetail.checkProgress()) {
+          this.loading = false
+          throw new Error()
+        }
+        if (await this.$refs.uploadComponentPapers.checkProgress()) {
+          this.loading = false
+          throw new Error()
+        }
+        if (await this.$refs.uploadComponentOther.checkProgress()) {
+          this.loading = false
+          throw new Error()
+        }
+        if (status === 'save') {
+          // 暂存
+          this.loading = true
+          this.inputForm.status = '1'
+          this.inputForm.reportFileList = this.$refs.uploadComponentReport.getDataList()
+          this.inputForm.explainFileList = this.$refs.uploadComponentExplain.getDataList()
+          this.inputForm.detailFileList = this.$refs.uploadComponentDetail.getDataList()
+          this.inputForm.papersFileList = this.$refs.uploadComponentPapers.getDataList()
+          this.inputForm.otherFileList = this.$refs.uploadComponentOther.getDataList()
+          this.programProjectListInfoService.saveFormArchive(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.status = '5'
+          this.inputForm.auditUserId = JSON.parse(localStorage.getItem('user')).id
+          this.inputForm.auditDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+        }
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            this.inputForm.reportFileList = this.$refs.uploadComponentReport.getDataList()
+            this.inputForm.explainFileList = this.$refs.uploadComponentExplain.getDataList()
+            this.inputForm.detailFileList = this.$refs.uploadComponentDetail.getDataList()
+            this.inputForm.papersFileList = this.$refs.uploadComponentPapers.getDataList()
+            this.inputForm.otherFileList = this.$refs.uploadComponentOther.getDataList()
+            this.programProjectListInfoService.saveFormArchive(this.inputForm).then(({data}) => {
+              this.close()
+              this.$message.success(data.msg)
+              this.$emit('refreshDataList')
+              this.loading = false
+              // callback(data.businessTable, data.businessId, this.inputForm)
+            }).catch(() => {
+              this.loading = false
+            })
+          }
+        })
+      },
+      async updateStatusById (type) {
+        if (await this.$refs.uploadComponentReport.checkProgress()) {
+          this.loading = false
+          throw new Error()
+        }
+        if (await this.$refs.uploadComponentExplain.checkProgress()) {
+          this.loading = false
+          throw new Error()
+        }
+        if (await this.$refs.uploadComponentDetail.checkProgress()) {
+          this.loading = false
+          throw new Error()
+        }
+        if (await this.$refs.uploadComponentPapers.checkProgress()) {
+          this.loading = false
+          throw new Error()
+        }
+        if (await this.$refs.uploadComponentOther.checkProgress()) {
+          this.loading = false
+          throw new Error()
+        }
+        await this.programProjectListInfoService.findByIdArchive(this.inputForm.id).then(({data}) => {
+          if (data.status !== '2') { // status的值不等于“审核中”,就弹出提示
+            this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+            throw new Error()
+          } else {
+            // if (type === 'agree') {
+            //   // 同意
+            //   this.inputForm.status = '5'
+            // }
+            if (type === 'reject') {
+              // 驳回
+              this.inputForm.status = '4'
+            }
+            if (type === 'reback') {
+              // 撤回
+              this.inputForm.status = '3'
+            }
+            if (type === 'reback' || type === 'reject') {
+              let param = {status: this.inputForm.status, id: this.inputForm.id}
+              this.programProjectListInfoService.updateStatusByArchiveId(param)
+            }
+          }
+        })
+      },
+      close () {
+        this.$refs.uploadComponentReport.clearUpload()
+        this.$refs.uploadComponentExplain.clearUpload()
+        this.$refs.uploadComponentDetail.clearUpload()
+        this.$refs.uploadComponentPapers.clearUpload()
+        this.$refs.uploadComponentOther.clearUpload()
+        this.inputForm = {
+          id: '',
+          remarks: '',
+          programId: '',
+          year: '',
+          programType: '',
+          evaluationReportDate: '',
+          protocolNum: '',
+          waystEvaluation: '',
+          fixedAssetsEvaluation: '',
+          netAssetsEvaluation: '',
+          rentEvaluation: '',
+          forensics: '',
+          reportCharges: '',
+          currentDisposePerson: '',
+          isInvoice: '',
+          invoiceDate: '',
+          actualCharges: '',
+          isContractArchive: '',
+          isPapersIntact: '',
+          isPapersArchive: '',
+          opsAmount: '',
+          isOpsReimbursement: '',
+          reimbursementAmount: '',
+          unreimbursedAmount: '',
+          reimbursementNum: '',
+          reimbursementDate: '',
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          programProjectListInfo: {},
+          reportFileList: [],
+          explainFileList: [],
+          detailFileList: [],
+          papersFileList: [],
+          otherFileList: [],
+          auditUserId: '',
+          signatureEvaluatorFirst: '',
+          signatureEvaluatorSecond: '',
+          reportNo: '',
+          contractNo: ''
+        }
+        this.$refs.inputForm.resetFields()
+        this.visible = false
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .w-e-text-container {
+    z-index: 1 !important;
+  }
+  /deep/ .wtext {
+    height: 200px
+  }
+  /deep/ .el-input-number .el-input__inner {
+    text-align: left;
+  }
+  .el-divider__text {
+    font-size: 16px;
+    font-weight: bold;
+  }
+</style>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1258 - 0
src/views/program/registered/ProjectForm.vue


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1068 - 0
src/views/program/registered/ProjectForm2022.vue


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1101 - 0
src/views/program/registered/ProjectForm2022Tab.vue


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1179 - 0
src/views/program/registered/ProjectFormUpdate.vue


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1445 - 0
src/views/program/registered/ProjectList.vue


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1058 - 0
src/views/program/registered/ProjectList2022.vue


+ 636 - 0
src/views/program/registered/ProjectThreeAuditForm.vue

@@ -0,0 +1,636 @@
+<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
+  <div>
+    <div>
+      <div v-if="inputForm.status === '5'&&(tabName === '一级校审'||tabName === '二级校审'||tabName === '三级校审')">
+        <el-row type="flex" justify="end">
+          <el-button @click="downloadFirstAuditTpl">下载</el-button>
+        </el-row>
+        <el-divider content-position="left"><i class="el-icon-document"></i> 项目校审</el-divider>
+      </div>
+      <el-form size="middle" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="status === 'audit' || status === 'taskFormDetail'"
+               label-width="125px" @submit.native.prevent>
+          <el-row  :gutter="15">
+            <el-col :span="12">
+              <el-form-item label="项目名称" prop="programProjectListInfo.name"
+              >
+                <el-input size="medium" :disabled="true" v-model="inputForm.programProjectListInfo.name" placeholder="请输入项目名称" clearable></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="评估基准日" prop="programProjectListInfo.assessmentDate"
+              >
+                <el-date-picker
+                  :disabled="true"
+                  v-model="inputForm.programProjectListInfo.assessmentDate"
+                  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="auditPeopleList"
+                            :rules="[{required: true, message: '专业评估人员不能为空', trigger: 'blur'},{required: true, message: '专业评估人员不能为空', trigger: 'change'}]"
+              >
+                <UserSelect size="medium" :disabled="status === 'audit' || status === 'taskFormDetail'" :readonly="true" :limit='10' :value="inputForm.auditPeopleList" @getValue='(value) => {inputForm.auditPeopleList = value}'></UserSelect>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="项目负责人" prop="programProjectListInfo.projectManager"
+              >
+                <SelectUserTree
+                  ref="companyTree"
+                  size="medium"
+                  :props="{
+                  value: 'id',             // ID字段名
+                  label: 'name',         // 显示名称
+                  children: 'children'    // 子级字段名
+                }"
+                  :url="`/sys/user/treeUserDataAllOffice?type=2`"
+                  :value="inputForm.programProjectListInfo.projectManager"
+                  :disabled="true"
+                  :clearable="true"
+                  :accordion="true"
+                  @getValue="(value) => {inputForm.programProjectListInfo.projectManager=value}"/>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="15">
+            <el-col :span="12">
+              <el-form-item label="选择项目审核人" prop="auditPeople"
+                            :rules="[{required: true, message: '审批人不能为空', trigger: 'blur'},{required: true, message: '审批人不能为空', trigger: 'change'}]"
+              >
+                <UserSelect size="medium" :disabled="status === 'audit' || status === 'taskFormDetail'" :readonly="true" :limit='1' :value="inputForm.auditPeople" @getValue='(value) => {inputForm.auditPeople = value}'></UserSelect>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-divider content-position="left">
+            <i class="el-icon-document"></i> 审核意见及回复
+            <el-link  v-if="commonJS.isEmpty(tabName) && (inputForm.auditLevel === '2' || inputForm.auditLevel === '3')"
+                      @click="openAuditDetail(inputForm.programId, '1')" type="primary" style="font-weight: bold;font-size: 15px;margin-left: 20px"><i class="el-icon-document"></i>
+              一级校审详情
+            </el-link>
+            <el-link v-if="commonJS.isEmpty(tabName) && inputForm.auditLevel === '3'"
+                     @click="openAuditDetail(inputForm.programId, '2')" type="primary" style="font-weight: bold;font-size: 15px;margin-left: 20px"><i class="el-icon-document"></i>
+              二级校审详情
+            </el-link>
+          </el-divider>
+          <el-row>
+            <el-col :span="24">
+              <el-form-item label="明细表" prop="detailOpinion"
+              >
+                <!--            <el-input type="textarea" style="width:100%" maxlength="1000" v-model="inputForm.detailOpinion" placeholder="请填写明细表"     ></el-input>-->
+                <WangEditor ref="contents1Editor" v-model="inputForm.detailOpinion"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="评估报告" prop="reportOpinion"
+              >
+                <!--            <el-input type="textarea" style="width:100%" maxlength="1000" v-model="inputForm.reportOpinion" placeholder="请填写评估报告"     ></el-input>-->
+                <WangEditor ref="contents2Editor" v-model="inputForm.reportOpinion"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="技术说明" prop="remarksOpinion"
+              >
+                <!--            <el-input type="textarea" style="width:100%" maxlength="1000" v-model="inputForm.remarksOpinion" placeholder="请填写技术说明"     ></el-input>-->
+                <WangEditor ref="contents3Editor" v-model="inputForm.remarksOpinion"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="工作底稿" prop="workOpinion"
+              >
+                <!--            <el-input type="textarea" style="width:100%" maxlength="1000" v-model="inputForm.workOpinion" placeholder="请填写工作底稿"     ></el-input>-->
+                <WangEditor ref="contents4Editor" v-model="inputForm.workOpinion"/>
+              </el-form-item>
+            </el-col>
+            <el-form size="middle" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"
+                     label-width="125px" @submit.native.prevent>
+              <el-col :span="24">
+                <el-form-item label="执行人员保留意见" prop="retainOpinion"
+                              :rules="[
+                 ]">
+                  <el-input type="textarea" :rows="5" maxlength="500" v-model="inputForm.retainOpinion" placeholder="请填写执行人员保留意见"     ></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="24">
+                <el-form-item label="审核人员审核未修改意见" prop="changeOpinion"
+                              :rules="[
+                 ]">
+                  <el-input type="textarea" :rows="5"  maxlength="500" v-model="inputForm.changeOpinion" placeholder="请填写审核人员审核未修改意见"     ></el-input>
+                </el-form-item>
+              </el-col>
+            </el-form>
+          </el-row>
+
+
+      </el-form>
+      <!--        附件-->
+      <UpLoadComponent ref="uploadComponent"></UpLoadComponent>
+
+    </div>
+    <ProjectThreeAuditFormDialog ref="threeAuditDetail"></ProjectThreeAuditFormDialog>
+  </div>
+</template>
+
+<script>
+  import UpLoadComponent from '@/views/common/UpLoadComponent'
+  import UserSelect from '@/components/userSelect'
+  import SelectUserTree from '@/views/utils/treeUserSelect'
+  import RosterSelectForm from '@/views/common/RosterSelectForm'
+  import ProgramProjectListInfoService from '@/api/program/ProgramProjectListInfoService'
+  import WangEditor from '@/components/editor/WangEditorNoMenu'
+  import ProjectThreeAuditFormDialog from './ProjectThreeAuditFormDialog'
+  export default {
+    props: {
+      businessId: {
+        type: String,
+        default: ''
+      },
+      formReadOnly: {
+        type: Boolean,
+        default: false
+      },
+      status: {
+        type: String,
+        default: ''
+      }
+    },
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          id: '',
+          remarks: '',
+          programId: '',
+          auditLevel: '',
+          auditPeople: '',
+          auditDate: '',
+          retainOpinion: '',
+          changeOpinion: '',
+          detailOpinion: '',
+          reportOpinion: '',
+          remarksOpinion: '',
+          workOpinion: '',
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          programProjectListInfo: {},
+          programAuditAssessPeopleDtoList: [],
+          workAttachmentDtoList: [],
+          auditPeopleList: ''
+        },
+        programId: '',
+        supervisorList: [],
+        keyWatch: '',
+        tabName: ''
+      }
+    },
+    programProjectListInfoService: null,
+    created () {
+      this.programProjectListInfoService = new ProgramProjectListInfoService()
+    },
+    computed: {
+      bus: {
+        get () {
+          this.$refs.uploadComponent.setDividerName('附件')
+          return this.businessId
+        },
+        set (val) {
+          this.businessId = val
+        }
+      }
+    },
+    watch: {
+      'keyWatch': {
+        handler (newVal) {
+          if (this.bus) {
+            if (this.bus !== 'false') {
+              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,
+      RosterSelectForm,
+      UserSelect,
+      WangEditor,
+      SelectUserTree,
+      ProjectThreeAuditFormDialog
+    },
+    methods: {
+      getKeyWatch (keyWatch) {
+        this.keyWatch = keyWatch
+      },
+      init (method, id, tabName) {
+        this.tabName = tabName
+        this.method = method
+        this.inputForm = {
+          id: '',
+          remarks: '',
+          programId: '',
+          auditLevel: '',
+          auditPeople: '',
+          auditDate: '',
+          retainOpinion: '',
+          changeOpinion: '',
+          detailOpinion: '',
+          reportOpinion: '',
+          remarksOpinion: '',
+          workOpinion: '',
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          programProjectListInfo: {
+            id: ''
+          },
+          programAuditAssessPeopleDtoList: [],
+          workAttachmentDtoList: [],
+          auditPeopleList: ''
+        }
+        this.inputForm.id = id
+        this.visible = true
+        this.loading = false
+        this.$nextTick(() => {
+          this.$refs.inputForm.resetFields()
+          this.loading = true
+          this.programProjectListInfoService.findByIdAudit(this.inputForm.id).then(({data}) => {
+            this.inputForm = this.recover(this.inputForm, data)
+            this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+            this.$refs.contents1Editor.clear()
+            this.$refs.contents2Editor.clear()
+            this.$refs.contents3Editor.clear()
+            this.$refs.contents4Editor.clear()
+            this.$refs.uploadComponent.clearUpload()
+            if (this.commonJS.isNotEmpty(this.inputForm.detailOpinion)) {
+              this.$refs.contents1Editor.init(this.inputForm.detailOpinion)
+            }
+            if (this.commonJS.isNotEmpty(this.inputForm.reportOpinion)) {
+              this.$refs.contents2Editor.init(this.inputForm.reportOpinion)
+            }
+            if (this.commonJS.isNotEmpty(this.inputForm.remarksOpinion)) {
+              this.$refs.contents3Editor.init(this.inputForm.remarksOpinion)
+            }
+            if (this.commonJS.isNotEmpty(this.inputForm.workOpinion)) {
+              this.$refs.contents4Editor.init(this.inputForm.workOpinion)
+            }
+
+            if (this.commonJS.isEmpty(this.inputForm.workAttachmentDtoList)) {
+              this.inputForm.workAttachmentDtoList = []
+            }
+            if (this.commonJS.isNotEmpty(this.inputForm.programAuditAssessPeopleDtoList)) {
+              let p = ''
+              this.inputForm.programAuditAssessPeopleDtoList.forEach((item, index) => {
+                if (this.inputForm.programAuditAssessPeopleDtoList.length === parseInt(parseInt(index) + parseInt(1))) {
+                  p = p + item.assessPeople
+                } else {
+                  p = p + item.assessPeople + ','
+                }
+              })
+              this.inputForm.auditPeopleList = p
+            } else {
+              this.inputForm.auditPeopleList = ''
+            }
+            if (this.status === 'taskFormDetail') {
+              this.$refs.uploadComponent.newUpload('view', this.inputForm.workAttachmentDtoList, 'program_audit')
+            } else if (this.status === 'audit') {
+              this.$refs.uploadComponent.newUpload('view', this.inputForm.workAttachmentDtoList, 'program_audit', null, null, true, JSON.parse(localStorage.getItem('user')).name)
+            } else if (this.method === 'view') {
+              this.$refs.uploadComponent.newUpload('view', this.inputForm.workAttachmentDtoList, 'program_audit')
+            } else {
+              this.$refs.uploadComponent.newUpload('view', this.inputForm.workAttachmentDtoList, 'program_audit', null, null, true, JSON.parse(localStorage.getItem('user')).name)
+            }
+            this.loading = false
+          })
+        })
+      },
+      reapplyForm (callback) {
+        this.loading = true
+        this.programProjectListInfoService.findByIdAudit(this.inputForm.id).then(({data}) => {
+          if (data.status !== '4') { // 审核状态不是“驳回”,就弹出提示
+            this.loading = false
+            this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+            throw new Error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+          } else {
+            this.startFormTrue(callback)
+          }
+        })
+      },
+      saveForm (callback) {
+        this.doSubmit('save', callback)
+      },
+      startForm (callback) {
+        this.loading = true
+        if (this.commonJS.isNotEmpty(this.inputForm.id)) {
+          this.programProjectListInfoService.findByIdAudit(this.inputForm.id).then(({data}) => {
+            if (this.commonJS.isNotEmpty(data.status) && data.status !== '0' && data.status !== '1' && data.status !== '3') { // 审核状态不是“未发起”或“暂存”或“撤回”,就弹出提示
+              this.loading = false
+              this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+              throw new Error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+            } else {
+              this.startFormTrue(callback)
+            }
+          })
+        } else {
+          this.startFormTrue(callback)
+        }
+      },
+      startFormTrue (callback) {
+        this.doSubmit('start', callback)
+      },
+      async agreeForm (callback) {
+        this.loading = true
+        await this.programProjectListInfoService.findByIdAudit(this.inputForm.id).then(({data}) => {
+          if (data.status !== '2') { // status的值不等于“审核中”,就弹出提示
+            this.loading = false
+            this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+            throw new Error()
+          } else {
+            this.doSubmit('agree', callback)
+          }
+        })
+      },
+      // 表单提交
+      async doSubmit (status, callback) {
+        this.loading = true
+        if (await this.$refs.uploadComponent.checkProgress()) {
+          this.loading = false
+          throw new Error()
+        }
+        if (status === 'save') {
+          // 暂存
+          this.loading = true
+          this.inputForm.status = '1'
+          this.inputForm.workAttachmentDtoList = this.$refs.uploadComponent.getDataList()
+          if (this.commonJS.isNotEmpty(this.inputForm.auditPeopleList)) {
+            this.inputForm.programAuditAssessPeopleDtoList = []
+            this.inputForm.auditPeopleList.split(',').forEach(item => {
+              let i = {assessPeople: item, auditId: this.inputForm.id}
+              this.inputForm.programAuditAssessPeopleDtoList.push(i)
+            })
+          } else {
+            this.inputForm.programAuditAssessPeopleDtoList = []
+          }
+          this.programProjectListInfoService.saveFormThree(this.inputForm).then(({data}) => {
+            this.inputForm.assignee = this.inputForm.auditPeople
+            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.status = '5'
+          this.inputForm.auditDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+        }
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            if (this.commonJS.isNotEmpty(this.inputForm.auditPeopleList)) {
+              this.inputForm.programAuditAssessPeopleDtoList = []
+              this.inputForm.auditPeopleList.split(',').forEach(item => {
+                let i = {assessPeople: item, auditId: this.inputForm.id}
+                this.inputForm.programAuditAssessPeopleDtoList.push(i)
+              })
+            } else {
+              this.inputForm.programAuditAssessPeopleDtoList = []
+            }
+            this.inputForm.workAttachmentDtoList = this.$refs.uploadComponent.getDataList()
+            this.programProjectListInfoService.saveFormThree(this.inputForm).then(({data}) => {
+              this.inputForm.assignee = this.inputForm.auditPeople
+              this.inputForm.id = data.businessId
+              callback(data.businessTable, data.businessId, this.inputForm)
+              this.loading = false
+            }).catch(() => {
+              this.loading = false
+            })
+          } 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.programProjectListInfoService.findByIdAudit(this.inputForm.id).then(({data}) => {
+              if (data.status !== '2') { // status的值不等于“审核中”,就弹出提示
+                this.loading = false
+                this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+                throw new Error()
+              } else {
+                // if (type === 'agree') {
+                //   // 同意
+                //   this.inputForm.status = '5'
+                // }
+                if (type === 'reject') {
+                  // 驳回
+                  this.inputForm.status = '4'
+                  this.loading = true
+                  this.inputForm.workAttachmentDtoList = this.$refs.uploadComponent.getDataList()
+                  if (this.commonJS.isNotEmpty(this.inputForm.auditPeopleList)) {
+                    this.inputForm.programAuditAssessPeopleDtoList = []
+                    this.inputForm.auditPeopleList.split(',').forEach(item => {
+                      let i = {assessPeople: item, auditId: this.inputForm.id}
+                      this.inputForm.programAuditAssessPeopleDtoList.push(i)
+                    })
+                  } else {
+                    this.inputForm.programAuditAssessPeopleDtoList = []
+                  }
+                  this.programProjectListInfoService.saveFormThree(this.inputForm).then(({data}) => {
+                    this.loading = false
+                  }).catch(() => {
+                    this.loading = false
+                  })
+                  // return
+                }
+                if (type === 'reback') {
+                  // 撤回
+                  this.inputForm.status = '3'
+                }
+                if (type === 'reject' || type === 'reback') {
+                  let param = {status: this.inputForm.status, id: this.inputForm.id}
+                  this.loading = true
+                  this.programProjectListInfoService.updateStatusByAuditId(param).then(() => {
+                    this.loading = false
+                    callback()
+                  })
+                }
+              }
+            })
+          } else if (type === 'hold') {
+            this.programProjectListInfoService.findByIdAudit(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.programProjectListInfoService.updateStatusByAuditId(param).then(() => {
+                  this.loading = false
+                  callback()
+                })
+              }
+            })
+          }
+        }
+      },
+      // async updateStatusById (type) {
+      //   if (await this.$refs.uploadComponent.checkProgress()) {
+      //     this.loading = false
+      //     throw new Error()
+      //   }
+      //   await this.programProjectListInfoService.findByIdAudit(this.inputForm.id).then(({data}) => {
+      //     if (data.status !== '2') { // status的值不等于“审核中”,就弹出提示
+      //       this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+      //       throw new Error()
+      //     } else {
+      //       // if (type === 'agree') {
+      //       //   // 同意
+      //       //   this.inputForm.status = '5'
+      //       // }
+      //       if (type === 'reject') {
+      //         // 驳回
+      //         this.inputForm.status = '4'
+      //         this.loading = true
+      //         this.inputForm.workAttachmentDtoList = this.$refs.uploadComponent.getDataList()
+      //         if (this.commonJS.isNotEmpty(this.inputForm.auditPeopleList)) {
+      //           this.inputForm.programAuditAssessPeopleDtoList = []
+      //           this.inputForm.auditPeopleList.split(',').forEach(item => {
+      //             let i = {assessPeople: item, auditId: this.inputForm.id}
+      //             this.inputForm.programAuditAssessPeopleDtoList.push(i)
+      //           })
+      //         } else {
+      //           this.inputForm.programAuditAssessPeopleDtoList = []
+      //         }
+      //         this.programProjectListInfoService.saveFormThree(this.inputForm).then(({data}) => {
+      //           this.loading = false
+      //         }).catch(() => {
+      //           this.loading = false
+      //         })
+      //         return
+      //       }
+      //       if (type === 'reback') {
+      //         // 撤回
+      //         this.inputForm.status = '3'
+      //       }
+      //       if (type === 'reback') {
+      //         let param = {status: this.inputForm.status, id: this.inputForm.id}
+      //         this.programProjectListInfoService.updateStatusByAuditId(param)
+      //       }
+      //     }
+      //   })
+      // },
+      close () {
+        this.$refs.uploadComponent.clearUpload()
+        this.inputForm = {
+          id: '',
+          remarks: '',
+          programId: '',
+          auditLevel: '',
+          auditPeople: '',
+          auditDate: '',
+          retainOpinion: '',
+          changeOpinion: '',
+          detailOpinion: '',
+          reportOpinion: '',
+          remarksOpinion: '',
+          workOpinion: '',
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          programProjectListInfo: {},
+          programAuditAssessPeopleDtoList: [],
+          workAttachmentDtoList: []
+        }
+        this.$refs.inputForm.resetFields()
+        this.visible = false
+      },
+      // 下载一级校审
+      downloadFirstAuditTpl () {
+        // this.$utils.downloadExcel('/sys/project/import/template')
+        this.loading = true
+        if (this.tabName === '一级校审') {
+          this.programProjectListInfoService.downloadFirstAuditTpl(this.inputForm.programProjectListInfo.id, this.inputForm.id).then((res) => {
+            // 将二进制流文件写入excel表,以下为重要步骤
+            this.$utils.downloadWord(res.data, this.tabName)
+            this.loading = false
+          }).catch(function (err) {
+            this.loading = false
+            if (err.response) {
+              console.log(err.response)
+            }
+          })
+        }
+        if (this.tabName === '二级校审') {
+          this.programProjectListInfoService.downloadSecondAuditTpl(this.inputForm.programProjectListInfo.id, this.inputForm.id).then((res) => {
+            // 将二进制流文件写入excel表,以下为重要步骤
+            this.$utils.downloadWord(res.data, this.tabName)
+            this.loading = false
+          }).catch(function (err) {
+            this.loading = false
+            if (err.response) {
+              console.log(err.response)
+            }
+          })
+        }
+        if (this.tabName === '三级校审') {
+          this.programProjectListInfoService.downloadThirdlyAuditTpl(this.inputForm.programProjectListInfo.id, this.inputForm.id).then((res) => {
+            // 将二进制流文件写入excel表,以下为重要步骤
+            this.$utils.downloadWord(res.data, this.tabName)
+            this.loading = false
+          }).catch(function (err) {
+            this.loading = false
+            if (err.response) {
+              console.log(err.response)
+            }
+          })
+        }
+      },
+      // 根据项目id以及校审级别查询校审详情
+      // 打开校审明细页面
+      openAuditDetail (programId, auditLevel) {
+        this.$refs.threeAuditDetail.init(programId, auditLevel)
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .w-e-text-container {
+    z-index: 1 !important;
+  }
+  /deep/ .wtext {
+    height: 200px
+  }
+  /deep/  .el-divider__text {
+    font-size: 16px;
+    font-weight: bold;
+  }
+</style>

+ 316 - 0
src/views/program/registered/ProjectThreeAuditFormDialog.vue

@@ -0,0 +1,316 @@
+<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      width="1200px"
+      @close="close"
+      @keyup.enter.native=""
+      append-to-body
+      :visible.sync="visible">
+      <el-form size="middle" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="true"
+               label-width="125px" @submit.native.prevent>
+          <el-row  :gutter="15">
+            <el-col :span="12">
+              <el-form-item label="项目名称" prop="programProjectListInfo.name"
+              >
+                <el-input size="medium" :disabled="true" v-model="inputForm.programProjectListInfo.name" placeholder="请输入项目名称" clearable></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="评估基准日" prop="programProjectListInfo.assessmentDate"
+              >
+                <el-date-picker
+                  :disabled="true"
+                  v-model="inputForm.programProjectListInfo.assessmentDate"
+                  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="auditPeopleList"
+                            :rules="[{required: true, message: '专业评估人员不能为空', trigger: 'blur'},{required: true, message: '专业评估人员不能为空', trigger: 'change'}]"
+              >
+                <UserSelect size="medium" :disabled="true" :readonly="true" :limit='10' :value="inputForm.auditPeopleList" @getValue='(value) => {inputForm.auditPeopleList = value}'></UserSelect>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="项目负责人" prop="programProjectListInfo.projectManager"
+              >
+                <SelectUserTree
+                  ref="companyTree"
+                  size="medium"
+                  :props="{
+                  value: 'id',             // ID字段名
+                  label: 'name',         // 显示名称
+                  children: 'children'    // 子级字段名
+                }"
+                  :url="`/sys/user/treeUserDataAllOffice?type=2`"
+                  :value="inputForm.programProjectListInfo.projectManager"
+                  :disabled="true"
+                  :clearable="true"
+                  :accordion="true"
+                  @getValue="(value) => {inputForm.programProjectListInfo.projectManager=value}"/>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="15">
+            <el-col :span="12">
+              <el-form-item label="选择项目审核人" prop="auditPeople"
+                            :rules="[{required: true, message: '审批人不能为空', trigger: 'blur'},{required: true, message: '审批人不能为空', trigger: 'change'}]"
+              >
+                <UserSelect size="medium" :disabled="true" :readonly="true" :limit='1' :value="inputForm.auditPeople" @getValue='(value) => {inputForm.auditPeople = value}'></UserSelect>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-divider content-position="left"><i class="el-icon-document"></i> 审核意见及回复</el-divider>
+          <el-row>
+            <el-col :span="24">
+              <el-form-item label="明细表" prop="detailOpinion"
+              >
+                <!--            <el-input type="textarea" style="width:100%" maxlength="1000" v-model="inputForm.detailOpinion" placeholder="请填写明细表"     ></el-input>-->
+                <WangEditor ref="contents1Editor" v-model="inputForm.detailOpinion"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="评估报告" prop="reportOpinion"
+              >
+                <!--            <el-input type="textarea" style="width:100%" maxlength="1000" v-model="inputForm.reportOpinion" placeholder="请填写评估报告"     ></el-input>-->
+                <WangEditor ref="contents2Editor" v-model="inputForm.reportOpinion"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="技术说明" prop="remarksOpinion"
+              >
+                <!--            <el-input type="textarea" style="width:100%" maxlength="1000" v-model="inputForm.remarksOpinion" placeholder="请填写技术说明"     ></el-input>-->
+                <WangEditor ref="contents3Editor" v-model="inputForm.remarksOpinion"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="工作底稿" prop="workOpinion"
+              >
+                <!--            <el-input type="textarea" style="width:100%" maxlength="1000" v-model="inputForm.workOpinion" placeholder="请填写工作底稿"     ></el-input>-->
+                <WangEditor ref="contents4Editor" v-model="inputForm.workOpinion"/>
+              </el-form-item>
+            </el-col>
+            <el-form size="middle" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"
+                     label-width="125px" @submit.native.prevent>
+              <el-col :span="24">
+                <el-form-item label="执行人员保留意见" prop="retainOpinion"
+                              :rules="[
+                 ]">
+                  <el-input type="textarea" :rows="5" maxlength="500" v-model="inputForm.retainOpinion" placeholder="请填写执行人员保留意见"     ></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="24">
+                <el-form-item label="审核人员审核未修改意见" prop="changeOpinion"
+                              :rules="[
+                 ]">
+                  <el-input type="textarea" :rows="5"  maxlength="500" v-model="inputForm.changeOpinion" placeholder="请填写审核人员审核未修改意见"     ></el-input>
+                </el-form-item>
+              </el-col>
+            </el-form>
+          </el-row>
+
+
+      </el-form>
+      <!--        附件-->
+      <UpLoadComponent ref="uploadComponent"></UpLoadComponent>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="small" @click="close()" icon="el-icon-circle-close">关闭</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import UpLoadComponent from '@/views/common/UpLoadComponent'
+  import UserSelect from '@/components/userSelect'
+  import SelectUserTree from '@/views/utils/treeUserSelect'
+  import RosterSelectForm from '@/views/common/RosterSelectForm'
+  import ProgramProjectListInfoService from '@/api/program/ProgramProjectListInfoService'
+  import WangEditor from '@/components/editor/WangEditorNoMenu'
+  export default {
+    props: {
+    },
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          id: '',
+          remarks: '',
+          programId: '',
+          auditLevel: '',
+          auditPeople: '',
+          auditDate: '',
+          retainOpinion: '',
+          changeOpinion: '',
+          detailOpinion: '',
+          reportOpinion: '',
+          remarksOpinion: '',
+          workOpinion: '',
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          programProjectListInfo: {},
+          programAuditAssessPeopleDtoList: [],
+          workAttachmentDtoList: [],
+          auditPeopleList: ''
+        },
+        programId: '',
+        supervisorList: [],
+        keyWatch: '',
+        tabName: ''
+      }
+    },
+    programProjectListInfoService: null,
+    created () {
+      this.programProjectListInfoService = new ProgramProjectListInfoService()
+    },
+    computed: {
+    },
+    watch: {
+      'loading': {
+        handler (newVal) {
+          // this.$emit('changeLoading', newVal)
+          this.$refs.uploadComponent.changeLoading(newVal)
+        }
+      }
+    },
+    components: {
+      UpLoadComponent,
+      RosterSelectForm,
+      UserSelect,
+      WangEditor,
+      SelectUserTree
+    },
+    methods: {
+      init (programId, auditLevel) {
+        if (auditLevel === '1') {
+          this.title = '一级校审详情'
+        } else if (auditLevel === '2') {
+          this.title = '二级校审详情'
+        } else {
+          this.title = '校审详情'
+        }
+        this.inputForm = {
+          id: '',
+          remarks: '',
+          programId: '',
+          auditLevel: '',
+          auditPeople: '',
+          auditDate: '',
+          retainOpinion: '',
+          changeOpinion: '',
+          detailOpinion: '',
+          reportOpinion: '',
+          remarksOpinion: '',
+          workOpinion: '',
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          programProjectListInfo: {
+            id: ''
+          },
+          programAuditAssessPeopleDtoList: [],
+          workAttachmentDtoList: [],
+          auditPeopleList: ''
+        }
+        this.visible = true
+        this.loading = false
+        this.$nextTick(() => {
+          this.$refs.inputForm.resetFields()
+          this.loading = true
+          this.programProjectListInfoService.findByProIdAndLevel(programId, auditLevel).then(({data}) => {
+            this.$refs.uploadComponent.clearUpload()
+            this.inputForm = this.recover(this.inputForm, data)
+            this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+            this.$refs.contents1Editor.clear()
+            this.$refs.contents2Editor.clear()
+            this.$refs.contents3Editor.clear()
+            this.$refs.contents4Editor.clear()
+            this.$refs.uploadComponent.clearUpload()
+            if (this.commonJS.isNotEmpty(this.inputForm.detailOpinion)) {
+              this.$refs.contents1Editor.init(this.inputForm.detailOpinion)
+            }
+            if (this.commonJS.isNotEmpty(this.inputForm.reportOpinion)) {
+              this.$refs.contents2Editor.init(this.inputForm.reportOpinion)
+            }
+            if (this.commonJS.isNotEmpty(this.inputForm.remarksOpinion)) {
+              this.$refs.contents3Editor.init(this.inputForm.remarksOpinion)
+            }
+            if (this.commonJS.isNotEmpty(this.inputForm.workOpinion)) {
+              this.$refs.contents4Editor.init(this.inputForm.workOpinion)
+            }
+
+            if (this.commonJS.isEmpty(this.inputForm.workAttachmentDtoList)) {
+              this.inputForm.workAttachmentDtoList = []
+            }
+            if (this.commonJS.isNotEmpty(this.inputForm.programAuditAssessPeopleDtoList)) {
+              let p = ''
+              this.inputForm.programAuditAssessPeopleDtoList.forEach((item, index) => {
+                if (this.inputForm.programAuditAssessPeopleDtoList.length === parseInt(parseInt(index) + parseInt(1))) {
+                  p = p + item.assessPeople
+                } else {
+                  p = p + item.assessPeople + ','
+                }
+              })
+              this.inputForm.auditPeopleList = p
+            } else {
+              this.inputForm.auditPeopleList = ''
+            }
+            this.$refs.uploadComponent.newUpload('view', this.inputForm.workAttachmentDtoList, 'program_audit')
+            this.loading = false
+          })
+        })
+      },
+      close () {
+        this.$refs.uploadComponent.clearUpload()
+        this.inputForm = {
+          id: '',
+          remarks: '',
+          programId: '',
+          auditLevel: '',
+          auditPeople: '',
+          auditDate: '',
+          retainOpinion: '',
+          changeOpinion: '',
+          detailOpinion: '',
+          reportOpinion: '',
+          remarksOpinion: '',
+          workOpinion: '',
+          procInsId: '',
+          processDefinitionId: '',
+          status: '',
+          programProjectListInfo: {},
+          programAuditAssessPeopleDtoList: [],
+          workAttachmentDtoList: []
+        }
+        this.$refs.inputForm.resetFields()
+        this.visible = false
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .w-e-text-container {
+    z-index: 1 !important;
+  }
+  /deep/ .wtext {
+    height: 200px
+  }
+  .el-divider__text {
+    font-size: 16px;
+    font-weight: bold;
+  }
+</style>

+ 408 - 0
src/views/program/registered/ProofreadBrowseForm.vue

@@ -0,0 +1,408 @@
+<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
+  <div>
+    <el-dialog
+      title="评估报告装订后浏览审核记录表"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      width="1300px"
+      @close="close"
+      @keyup.enter.native=""
+      :visible.sync="visible">
+      <el-form size="middle" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''" :disabled="method==='view'"
+               label-width="220px" @submit.native.prevent>
+
+        <el-row :gutter="15">
+          <el-col :span="24">
+            <el-form-item label="项目名称" prop="projectName">
+              <el-input :disabled="true" v-model="inputForm.projectName"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="评估基准日" prop="assessmentDate">
+              <el-input :disabled="true" v-model="inputForm.assessmentDate"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="项目负责人" prop="projectManagerName">
+              <el-input :disabled="true" v-model="inputForm.projectManagerName"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="项目审核人" prop="processUserName">
+              <el-input :disabled="true" v-model="inputForm.processUserName"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="审核日期" prop="processDate">
+              <el-date-picker
+                placement="bottom-start"
+                v-model="inputForm.processDate"
+                type="date"
+                :disabled="true"
+                style="width: 100%"
+                placeholder="选择日期">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-divider content-position="left"><i class="el-icon-document"></i>报告、说明、明细表一致性</el-divider>
+        <el-row :gutter="15" >
+          <vxe-table
+            border
+            show-overflow
+            ref="detailFor40"
+            class="vxe-table-element"
+            :data="inputForm.detailFor40"
+            style="margin-left: 5em"
+            @cell-click=""
+            @edit-closed=""
+            highlight-current-row
+            :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+          >
+            <vxe-table-column field="typeName" title="审核要点" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input :disabled="true" v-model="scope.row.typeName" ></el-input>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="reviewComments" title="审核情况(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.reviewComments" transfer>
+                  <vxe-option
+                    v-for="item in yesOrNo"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="replyComments" title="改正情况(√/×)" :edit-render="{name: '$select', options: yesOrNo}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.replyComments" transfer>
+                  <vxe-option
+                    v-for="item in yesOrNo"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+          </vxe-table>
+        </el-row>
+
+        <el-divider content-position="left"><i class="el-icon-document"></i>评估报告</el-divider>
+        <el-row :gutter="15" >
+          <vxe-table
+            border
+            show-overflow
+            ref="detailFor50"
+            class="vxe-table-element"
+            :data="inputForm.detailFor50"
+            style="margin-left: 5em"
+            @cell-click=""
+            @edit-closed=""
+            highlight-current-row
+            :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+          >
+            <vxe-table-column field="typeName" title="审核要点" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input :disabled="true" v-model="scope.row.typeName" ></el-input>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="reviewComments" title="审核情况(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.reviewComments" transfer>
+                  <vxe-option
+                    v-for="item in yesOrNo"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="replyComments" title="改正情况(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.replyComments" transfer>
+                  <vxe-option
+                    v-for="item in yesOrNo"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+          </vxe-table>
+        </el-row>
+
+        <el-divider content-position="left"><i class="el-icon-document"></i>评估说明</el-divider>
+        <el-row :gutter="15" >
+          <vxe-table
+            border
+            show-overflow
+            ref="detailFor60"
+            class="vxe-table-element"
+            :data="inputForm.detailFor60"
+            style="margin-left: 5em"
+            @cell-click=""
+            @edit-closed=""
+            highlight-current-row
+            :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+          >
+            <vxe-table-column field="typeName" title="审核要点" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input :disabled="true" v-model="scope.row.typeName" ></el-input>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="reviewComments" title="审核情况(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.reviewComments" transfer>
+                  <vxe-option
+                    v-for="item in yesOrNo"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="replyComments" title="改正情况(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.replyComments" transfer>
+                  <vxe-option
+                    v-for="item in yesOrNo"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+          </vxe-table>
+        </el-row>
+
+        <el-divider content-position="left"><i class="el-icon-document"></i>评估明细表</el-divider>
+        <el-row :gutter="15" >
+          <vxe-table
+            border
+            show-overflow
+            ref="detailFor70"
+            class="vxe-table-element"
+            :data="inputForm.detailFor70"
+            style="margin-left: 5em"
+            @cell-click=""
+            @edit-closed=""
+            highlight-current-row
+            :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+          >
+            <vxe-table-column field="typeName" title="审核要点" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input :disabled="true" v-model="scope.row.typeName" ></el-input>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="reviewComments" title="审核情况(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.reviewComments" transfer>
+                  <vxe-option
+                    v-for="item in yesOrNo"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="replyComments" title="改正情况(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.replyComments" transfer>
+                  <vxe-option
+                    v-for="item in yesOrNo"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+          </vxe-table>
+        </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 ProofreadInfoService from '@/api/sys/ProofreadInfoService'
+  import ProofreadTypeService from '@/api/sys/ProofreadTypeService'
+  import ProgramProjectListInfoService from '@/api/program/ProgramProjectListInfoService'
+  import UserService from '@/api/sys/UserService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          projectId: '',
+          projectName: '',
+          assessmentDate: '',
+          projectManagerName: '',
+          processUserId: '',
+          processUserName: '',
+          processDate: '',
+          reservations: '',
+          unmodifiedComments: '',
+          details: [],
+          detailFor40: [],
+          detailFor50: [],
+          detailFor60: [],
+          detailFor70: []
+        },
+        yesOrNo: [
+          {value: 0, label: '×'},
+          {value: 1, label: '√'}
+        ]
+      }
+    },
+    proofreadInfoService: null,
+    proofreadTypeService: null,
+    programProjectListInfoService: null,
+    UserService: null,
+    created () {
+      this.proofreadInfoService = new ProofreadInfoService()
+      this.programProjectListInfoService = new ProgramProjectListInfoService()
+      this.userService = new UserService()
+      this.proofreadTypeService = new ProofreadTypeService()
+    },
+    components: {
+    },
+    computed: {
+      name () {
+        return JSON.parse(localStorage.getItem('user')).name
+      },
+      userId () {
+        return JSON.parse(localStorage.getItem('user')).id
+      }
+    },
+    methods: {
+      init (id) {
+        this.inputForm = {
+          projectId: '',
+          projectName: '',
+          assessmentDate: '',
+          projectManagerName: '',
+          processUserId: '',
+          processUserName: '',
+          processDate: '',
+          reservations: '',
+          unmodifiedComments: '',
+          details: [],
+          detailFor40: [],
+          detailFor50: [],
+          detailFor60: [],
+          detailFor70: []
+        }
+        this.visible = true
+        this.loading = false
+        this.$nextTick(() => {
+          this.loading = true
+          this.proofreadInfoService.findById(id, '2').then(({data}) => {
+            if (!this.commonJS.isEmpty(data.projectId)) {
+              this.$refs.inputForm.resetFields()
+              this.inputForm = this.recover(this.inputForm, data)
+              this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+              this.inputForm.processDate = data.processDate
+              this.detailDivide(data.details)
+            } else {
+              // 初始化
+              this.programProjectListInfoService.queryById(id).then(({data}) => {
+                this.inputForm.projectId = data.id
+                this.inputForm.projectName = data.name
+                this.inputForm.assessmentDate = data.assessmentDate
+                this.userService.queryById(data.projectManager).then(({data}) => {
+                  this.inputForm.projectManagerName = data.name
+                })
+              })
+              this.inputForm.processUserId = this.userId
+              this.inputForm.processUserName = this.name
+              this.inputForm.processDate = new Date()
+              this.proofreadInfoService.list('2').then(({data}) => { this.detailDivide(data) })
+            }
+            this.loading = false
+          })
+        })
+      },
+      // 表单提交
+      doSubmit () {
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            // 列表处理
+            this.inputForm.details = []
+            this.inputForm.detailFor40.forEach(item => { this.inputForm.details.push(item) })
+            this.inputForm.detailFor50.forEach(item => { this.inputForm.details.push(item) })
+            this.inputForm.detailFor60.forEach(item => { this.inputForm.details.push(item) })
+            this.inputForm.detailFor70.forEach(item => { this.inputForm.details.push(item) })
+            this.inputForm.type = '2'
+            this.proofreadInfoService.save(this.inputForm).then(({data}) => {
+              this.close()
+              this.$message.success(data)
+              this.loading = false
+            }).catch(() => {
+              this.loading = false
+            })
+          }
+        })
+      },
+      close () {
+        this.$refs.inputForm.resetFields()
+        this.visible = false
+      },
+      detailDivide (details) {
+        this.inputForm.detailFor40 = []
+        this.inputForm.detailFor50 = []
+        this.inputForm.detailFor60 = []
+        this.inputForm.detailFor70 = []
+        details.forEach(item => {
+          if (item.sort.startsWith('40')) {
+            this.inputForm.detailFor40.push(item)
+          }
+          if (item.sort.startsWith('50')) {
+            this.inputForm.detailFor50.push(item)
+          }
+          if (item.sort.startsWith('60')) {
+            this.inputForm.detailFor60.push(item)
+          }
+          if (item.sort.startsWith('70')) {
+            this.inputForm.detailFor70.push(item)
+          }
+        })
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-input-number .el-input__inner {
+    text-align: left;
+  }
+</style>
+
+<style>
+  .vxe-select--panel {
+    z-index: 9997 !important
+  }
+  .vxe-input--panel.type--date, .vxe-input--panel.type--month, .vxe-input--panel.type--week, .vxe-input--panel.type--year {
+    z-index: 9998 !important
+  }
+</style>

+ 421 - 0
src/views/program/registered/ProofreadBrowseFormComponent.vue

@@ -0,0 +1,421 @@
+<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
+  <div>
+    <div v-if="showDownload">
+      <el-row type="flex" justify="end">
+        <el-button @click="downloadAuditRecordFormAfterBindingTpl">下载</el-button>
+      </el-row>
+      <el-divider content-position="left"><i class="el-icon-document"></i> 浏览审核</el-divider>
+    </div>
+      <el-form size="middle" :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="24">
+            <el-form-item label="项目名称" prop="projectName">
+              <el-input :disabled="true" v-model="inputForm.projectName"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="评估基准日" prop="assessmentDate">
+              <el-input :disabled="true" v-model="inputForm.assessmentDate"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="项目负责人" prop="projectManagerName">
+              <el-input :disabled="true" v-model="inputForm.projectManagerName"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="项目审核人" prop="processUserName">
+              <el-input :disabled="true" v-model="inputForm.processUserName"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="审核日期" prop="processDate">
+              <el-date-picker
+                placement="bottom-start"
+                v-model="inputForm.processDate"
+                type="date"
+                :disabled="true"
+                style="width: 100%"
+                placeholder="选择日期">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-divider content-position="left"><i class="el-icon-document"></i>报告、说明、明细表一致性</el-divider>
+        <el-row :gutter="15" >
+          <vxe-table
+            border
+            show-overflow
+            ref="detailFor40"
+            class="vxe-table-element"
+            :data="inputForm.detailFor40"
+            style="margin-left: 5em"
+            @cell-click=""
+            @edit-closed=""
+            highlight-current-row
+            :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+          >
+            <vxe-table-column field="typeName" title="审核要点" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input :disabled="true" v-model="scope.row.typeName" ></el-input>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="reviewComments" title="审核情况(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select :disabled="true" v-model="scope.row.reviewComments" transfer>
+                  <vxe-option
+                    v-for="item in yesOrNo"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="replyComments" title="改正情况(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select :disabled="true" v-model="scope.row.replyComments" transfer>
+                  <vxe-option
+                    v-for="item in yesOrNo"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+          </vxe-table>
+        </el-row>
+
+        <el-divider content-position="left"><i class="el-icon-document"></i>评估报告</el-divider>
+        <el-row :gutter="15" >
+          <vxe-table
+            border
+            show-overflow
+            ref="detailFor50"
+            class="vxe-table-element"
+            :data="inputForm.detailFor50"
+            style="margin-left: 5em"
+            @cell-click=""
+            @edit-closed=""
+            highlight-current-row
+            :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+          >
+            <vxe-table-column field="typeName" title="审核要点" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input :disabled="true" v-model="scope.row.typeName" ></el-input>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="reviewComments" title="审核情况(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select :disabled="true" v-model="scope.row.reviewComments" transfer>
+                  <vxe-option
+                    v-for="item in yesOrNo"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="replyComments" title="改正情况(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select :disabled="true" v-model="scope.row.replyComments" transfer>
+                  <vxe-option
+                    v-for="item in yesOrNo"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+          </vxe-table>
+        </el-row>
+
+        <el-divider content-position="left"><i class="el-icon-document"></i>评估说明</el-divider>
+        <el-row :gutter="15" >
+          <vxe-table
+            border
+            show-overflow
+            ref="detailFor60"
+            class="vxe-table-element"
+            :data="inputForm.detailFor60"
+            style="margin-left: 5em"
+            @cell-click=""
+            @edit-closed=""
+            highlight-current-row
+            :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+          >
+            <vxe-table-column field="typeName" title="审核要点" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input :disabled="true" v-model="scope.row.typeName" ></el-input>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="reviewComments" title="审核情况(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select :disabled="true" v-model="scope.row.reviewComments" transfer>
+                  <vxe-option
+                    v-for="item in yesOrNo"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="replyComments" title="改正情况(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select :disabled="true" v-model="scope.row.replyComments" transfer>
+                  <vxe-option
+                    v-for="item in yesOrNo"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+          </vxe-table>
+        </el-row>
+
+        <el-divider content-position="left"><i class="el-icon-document"></i>评估明细表</el-divider>
+        <el-row :gutter="15" >
+          <vxe-table
+            border
+            show-overflow
+            ref="detailFor70"
+            class="vxe-table-element"
+            :data="inputForm.detailFor70"
+            style="margin-left: 5em"
+            @cell-click=""
+            @edit-closed=""
+            highlight-current-row
+            :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+          >
+            <vxe-table-column field="typeName" title="审核要点" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input :disabled="true" v-model="scope.row.typeName" ></el-input>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="reviewComments" title="审核情况(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select :disabled="true" v-model="scope.row.reviewComments" transfer>
+                  <vxe-option
+                    v-for="item in yesOrNo"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="replyComments" title="改正情况(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select :disabled="true" v-model="scope.row.replyComments" transfer>
+                  <vxe-option
+                    v-for="item in yesOrNo"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+          </vxe-table>
+        </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>-->
+
+  </div>
+</template>
+
+<script>
+  import ProofreadInfoService from '@/api/sys/ProofreadInfoService'
+  import ProofreadTypeService from '@/api/sys/ProofreadTypeService'
+  import ProgramProjectListInfoService from '@/api/program/ProgramProjectListInfoService'
+  import UserService from '@/api/sys/UserService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          projectId: '',
+          projectName: '',
+          assessmentDate: '',
+          projectManagerName: '',
+          processUserId: '',
+          processUserName: '',
+          processDate: '',
+          reservations: '',
+          unmodifiedComments: '',
+          details: [],
+          detailFor40: [],
+          detailFor50: [],
+          detailFor60: [],
+          detailFor70: []
+        },
+        yesOrNo: [
+          {value: 0, label: '×'},
+          {value: 1, label: '√'}
+        ],
+        showDownload: false
+      }
+    },
+    proofreadInfoService: null,
+    proofreadTypeService: null,
+    programProjectListInfoService: null,
+    UserService: null,
+    created () {
+      this.proofreadInfoService = new ProofreadInfoService()
+      this.programProjectListInfoService = new ProgramProjectListInfoService()
+      this.userService = new UserService()
+      this.proofreadTypeService = new ProofreadTypeService()
+    },
+    components: {
+    },
+    computed: {
+      name () {
+        return JSON.parse(localStorage.getItem('user')).name
+      },
+      userId () {
+        return JSON.parse(localStorage.getItem('user')).id
+      }
+    },
+    methods: {
+      init (method, id) {
+        this.showDownload = false
+        this.inputForm = {
+          projectId: '',
+          projectName: '',
+          assessmentDate: '',
+          projectManagerName: '',
+          processUserId: '',
+          processUserName: '',
+          processDate: '',
+          reservations: '',
+          unmodifiedComments: '',
+          details: [],
+          detailFor40: [],
+          detailFor50: [],
+          detailFor60: [],
+          detailFor70: []
+        }
+        this.method = method
+        this.visible = true
+        this.loading = false
+        this.$nextTick(() => {
+          this.loading = true
+          this.proofreadInfoService.findById(id, '2').then(({data}) => {
+            if (this.commonJS.isNotEmpty(data)) {
+              this.showDownload = true
+            }
+            if (!this.commonJS.isEmpty(data.projectId)) {
+              this.$refs.inputForm.resetFields()
+              this.inputForm = this.recover(this.inputForm, data)
+              this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+              this.inputForm.processDate = data.processDate
+              this.detailDivide(data.details)
+            } else {
+              // 初始化
+              this.programProjectListInfoService.queryById(id).then(({data}) => {
+                this.inputForm.projectId = data.id
+                this.inputForm.projectName = data.name
+                this.inputForm.assessmentDate = data.assessmentDate
+                this.userService.queryById(data.projectManager).then(({data}) => {
+                  this.inputForm.projectManagerName = data.name
+                })
+              })
+              this.inputForm.processUserId = this.userId
+              this.inputForm.processUserName = this.name
+              this.inputForm.processDate = new Date()
+              this.proofreadInfoService.list('2').then(({data}) => { this.detailDivide(data) })
+            }
+            this.loading = false
+          })
+        })
+      },
+      // 表单提交
+      doSubmit () {
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            // 列表处理
+            this.inputForm.details = []
+            this.inputForm.detailFor40.forEach(item => { this.inputForm.details.push(item) })
+            this.inputForm.detailFor50.forEach(item => { this.inputForm.details.push(item) })
+            this.inputForm.detailFor60.forEach(item => { this.inputForm.details.push(item) })
+            this.inputForm.detailFor70.forEach(item => { this.inputForm.details.push(item) })
+            this.inputForm.type = '2'
+            this.proofreadInfoService.save(this.inputForm).then(({data}) => {
+              this.close()
+              this.$message.success(data)
+              this.loading = false
+            }).catch(() => {
+              this.loading = false
+            })
+          }
+        })
+      },
+      close () {
+        this.$refs.inputForm.resetFields()
+        this.visible = false
+      },
+      detailDivide (details) {
+        this.inputForm.detailFor40 = []
+        this.inputForm.detailFor50 = []
+        this.inputForm.detailFor60 = []
+        this.inputForm.detailFor70 = []
+        details.forEach(item => {
+          if (item.sort.startsWith('40')) {
+            this.inputForm.detailFor40.push(item)
+          }
+          if (item.sort.startsWith('50')) {
+            this.inputForm.detailFor50.push(item)
+          }
+          if (item.sort.startsWith('60')) {
+            this.inputForm.detailFor60.push(item)
+          }
+          if (item.sort.startsWith('70')) {
+            this.inputForm.detailFor70.push(item)
+          }
+        })
+      },
+      // 下载评估报告装订后浏览审核记录表
+      downloadAuditRecordFormAfterBindingTpl () {
+        // this.$utils.downloadExcel('/sys/project/import/template')
+        this.loading = true
+        this.programProjectListInfoService.downloadAuditRecordFormAfterBindingTpl(this.inputForm.projectId).then((res) => {
+          // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(res.data, '评估报告装订后浏览审核记录表.xls')
+          this.loading = false
+        }).catch(function (err) {
+          this.loading = false
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-input-number .el-input__inner {
+    text-align: left;
+  }
+  .el-divider__text {
+    font-size: 16px;
+    font-weight: bold;
+  }
+</style>

+ 747 - 0
src/views/program/registered/ProofreadForm.vue

@@ -0,0 +1,747 @@
+<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
+  <div>
+    <el-dialog
+      title="资产评估项目(校对)审核记录表"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      width="1500px"
+      @close="close"
+      @keyup.enter.native=""
+      :visible.sync="visible">
+      <el-form size="middle" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''" :disabled="method==='view'"
+               label-width="220px" @submit.native.prevent>
+
+        <el-row :gutter="15">
+          <el-col :span="24">
+            <el-form-item label="项目名称" prop="projectName">
+              <el-input :disabled="true" v-model="inputForm.projectName"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="评估基准日" prop="assessmentDate">
+              <el-input :disabled="true" v-model="inputForm.assessmentDate"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="项目负责人" prop="projectManagerName">
+              <el-input :disabled="true" v-model="inputForm.projectManagerName"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="项目审核人" prop="processUserName">
+              <el-input :disabled="true" v-model="inputForm.processUserName"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="审核日期" prop="processDate">
+              <el-date-picker
+                placement="bottom-start"
+                v-model="inputForm.processDate"
+                type="date"
+                :disabled="true"
+                style="width: 100%"
+                placeholder="选择日期">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-divider content-position="left"><i class="el-icon-document"></i>明细表</el-divider>
+        <el-row :gutter="15" >
+          <vxe-table
+            border
+            show-overflow
+            ref="detailFor1010"
+            class="vxe-table-element"
+            :data="inputForm.detailFor1010"
+            style="margin-left: 5em"
+            @cell-click=""
+            @edit-closed=""
+            highlight-current-row
+            :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+          >
+            <vxe-table-column field="typeName" title="审核要点" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input :disabled="true" v-model="scope.row.typeName" ></el-input>
+              </template>
+            </vxe-table-column>
+<!--            <vxe-table-column width="150px" field="reviewComments" title="审核意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.reviewComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+<!--            <vxe-table-column width="150px" field="replyComments" title="回复意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.replyComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+            <vxe-table-column width="150px" field="reviewComments" title="审核意见(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.reviewComments" transfer>
+                  <vxe-option
+                    v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="isApply" title="是否适用(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.isApply" transfer>
+                  <vxe-option
+                    v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="350px" field="replyComments" title="回复意见" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input v-model="scope.row.replyComments" ></el-input>
+              </template>
+            </vxe-table-column>
+          </vxe-table>
+        </el-row>
+
+        <el-divider content-position="left"><i class="el-icon-document"></i>评估说明</el-divider>
+        <el-row></el-row>
+        <el-divider content-position="left">封面至评估范围</el-divider>
+        <el-row :gutter="15">
+          <vxe-table
+            border
+            show-overflow
+            ref="details"
+            class="vxe-table-element"
+            :data="inputForm.detailFor2010"
+            style="margin-left: 5em"
+            @cell-click=""
+            @edit-closed=""
+            highlight-current-row
+            :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+          >
+            <vxe-table-column field="typeName" title="审核要点" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input :disabled="true" v-model="scope.row.typeName" ></el-input>
+              </template>
+            </vxe-table-column>
+<!--            <vxe-table-column width="150px" field="reviewComments" title="审核意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.reviewComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+<!--            <vxe-table-column width="150px" field="replyComments" title="回复意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.replyComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+            <vxe-table-column width="150px" field="reviewComments" title="审核意见(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.reviewComments" transfer>
+                  <vxe-option
+                    v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="isApply" title="是否适用(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.isApply" transfer>
+                  <vxe-option
+                    v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="350px" field="replyComments" title="回复意见" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input v-model="scope.row.replyComments" ></el-input>
+              </template>
+            </vxe-table-column>
+          </vxe-table>
+        </el-row>
+
+        <el-divider content-position="left">资产核实情况总体说明</el-divider>
+        <el-row :gutter="15">
+          <vxe-table
+            border
+            show-overflow
+            ref="details"
+            class="vxe-table-element"
+            :data="inputForm.detailFor2020"
+            style="margin-left: 5em"
+            @cell-click=""
+            @edit-closed=""
+            highlight-current-row
+            :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+          >
+            <vxe-table-column field="typeName" title="审核要点" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input :disabled="true" v-model="scope.row.typeName" ></el-input>
+              </template>
+            </vxe-table-column>
+<!--            <vxe-table-column width="150px" field="reviewComments" title="审核意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.reviewComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+<!--            <vxe-table-column width="150px" field="replyComments" title="回复意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.replyComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+            <vxe-table-column width="150px" field="reviewComments" title="审核意见(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.reviewComments" transfer>
+                  <vxe-option
+                    v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="isApply" title="是否适用(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.isApply" transfer>
+                  <vxe-option
+                    v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="350px" field="replyComments" title="回复意见" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input v-model="scope.row.replyComments" ></el-input>
+              </template>
+            </vxe-table-column>
+          </vxe-table>
+        </el-row>
+
+        <el-divider content-position="left">资产基础法/成本法评估技术说明</el-divider>
+        <el-row :gutter="15">
+          <vxe-table
+            border
+            show-overflow
+            ref="details"
+            class="vxe-table-element"
+            :data="inputForm.detailFor2030"
+            style="margin-left: 5em"
+            @cell-click=""
+            @edit-closed=""
+            highlight-current-row
+            :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+          >
+            <vxe-table-column field="typeName" title="审核要点" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input :disabled="true" v-model="scope.row.typeName" ></el-input>
+              </template>
+            </vxe-table-column>
+<!--            <vxe-table-column width="150px" field="reviewComments" title="审核意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.reviewComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+<!--            <vxe-table-column width="150px" field="replyComments" title="回复意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.replyComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+            <vxe-table-column width="150px" field="reviewComments" title="审核意见(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.reviewComments" transfer>
+                  <vxe-option
+                    v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="isApply" title="是否适用(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.isApply" transfer>
+                  <vxe-option
+                    v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="350px" field="replyComments" title="回复意见" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input v-model="scope.row.replyComments" ></el-input>
+              </template>
+            </vxe-table-column>
+          </vxe-table>
+        </el-row>
+
+        <el-divider content-position="left">评估结论及分析</el-divider>
+        <el-row :gutter="15">
+          <vxe-table
+            border
+            show-overflow
+            ref="details"
+            class="vxe-table-element"
+            :data="inputForm.detailFor2040"
+            style="margin-left: 5em"
+            @cell-click=""
+            @edit-closed=""
+            highlight-current-row
+            :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+          >
+            <vxe-table-column field="typeName" title="审核要点" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input :disabled="true" v-model="scope.row.typeName" ></el-input>
+              </template>
+            </vxe-table-column>
+<!--            <vxe-table-column width="150px" field="reviewComments" title="审核意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.reviewComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+<!--            <vxe-table-column width="150px" field="replyComments" title="回复意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.replyComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+            <vxe-table-column width="150px" field="reviewComments" title="审核意见(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.reviewComments" transfer>
+                  <vxe-option
+                    v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="isApply" title="是否适用(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.isApply" transfer>
+                  <vxe-option
+                    v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="350px" field="replyComments" title="回复意见" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input v-model="scope.row.replyComments" ></el-input>
+              </template>
+            </vxe-table-column>
+          </vxe-table>
+        </el-row>
+
+        <el-divider content-position="left">关于评估有关事项的说明</el-divider>
+        <el-row :gutter="15">
+          <vxe-table
+            border
+            show-overflow
+            ref="details"
+            class="vxe-table-element"
+            :data="inputForm.detailFor2050"
+            style="margin-left: 5em"
+            @cell-click=""
+            @edit-closed=""
+            highlight-current-row
+            :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+          >
+            <vxe-table-column field="typeName" title="审核要点" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input :disabled="true" v-model="scope.row.typeName" ></el-input>
+              </template>
+            </vxe-table-column>
+<!--            <vxe-table-column width="150px" field="reviewComments" title="审核意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.reviewComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+<!--            <vxe-table-column width="150px" field="replyComments" title="回复意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.replyComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+            <vxe-table-column width="150px" field="reviewComments" title="审核意见(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.reviewComments" transfer>
+                  <vxe-option
+                    v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="isApply" title="是否适用(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.isApply" transfer>
+                  <vxe-option
+                    v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="350px" field="replyComments" title="回复意见" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input v-model="scope.row.replyComments" ></el-input>
+              </template>
+            </vxe-table-column>
+          </vxe-table>
+        </el-row>
+
+        <el-divider content-position="left">其他问题</el-divider>
+        <el-row :gutter="15">
+          <vxe-table
+            border
+            show-overflow
+            ref="details"
+            class="vxe-table-element"
+            :data="inputForm.detailFor2060"
+            style="margin-left: 5em"
+            @cell-click=""
+            @edit-closed=""
+            highlight-current-row
+            :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+          >
+            <vxe-table-column field="typeName" title="审核要点" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input :disabled="true" v-model="scope.row.typeName" ></el-input>
+              </template>
+            </vxe-table-column>
+<!--            <vxe-table-column width="150px" field="reviewComments" title="审核意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.reviewComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+<!--            <vxe-table-column width="150px" field="replyComments" title="回复意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.replyComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+            <vxe-table-column width="150px" field="reviewComments" title="审核意见(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.reviewComments" transfer>
+                  <vxe-option
+                    v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="isApply" title="是否适用(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.isApply" transfer>
+                  <vxe-option
+                    v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="350px" field="replyComments" title="回复意见" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input v-model="scope.row.replyComments" ></el-input>
+              </template>
+            </vxe-table-column>
+          </vxe-table>
+        </el-row>
+
+        <el-divider content-position="left"><i class="el-icon-document"></i>评估报告</el-divider>
+        <el-row :gutter="15">
+          <vxe-table
+            border
+            show-overflow
+            ref="details"
+            class="vxe-table-element"
+            :data="inputForm.detailFor30"
+            style="margin-left: 5em"
+            @cell-click=""
+            @edit-closed=""
+            highlight-current-row
+            :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+          >
+            <vxe-table-column field="typeName" title="审核要点" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input :disabled="true" v-model="scope.row.typeName" ></el-input>
+              </template>
+            </vxe-table-column>
+<!--            <vxe-table-column width="150px" field="reviewComments" title="审核意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.reviewComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+<!--            <vxe-table-column width="150px" field="replyComments" title="回复意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.replyComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+            <vxe-table-column width="150px" field="reviewComments" title="审核意见(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.reviewComments" transfer>
+                  <vxe-option
+                    v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="isApply" title="是否适用(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.isApply" transfer>
+                  <vxe-option
+                    v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="350px" field="replyComments" title="回复意见" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input v-model="scope.row.replyComments" ></el-input>
+              </template>
+            </vxe-table-column>
+          </vxe-table>
+        </el-row>
+
+        <el-divider content-position="left"><i class="el-icon-document"></i>保留意见</el-divider>
+        <el-input v-model="inputForm.reservations"
+                  type="textarea"
+                  :rows="5"
+                  maxlength="2000"
+                  placeholder="请输入保留意见"
+                  show-word-limit>
+        </el-input>
+
+        <el-divider content-position="left"><i class="el-icon-document"></i>未修改意见</el-divider>
+        <el-input v-model="inputForm.unmodifiedComments"
+                  type="textarea"
+                  :rows="5"
+                  maxlength="2000"
+                  placeholder="请输入未修改意见"
+                  show-word-limit>
+        </el-input>
+
+      </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 ProofreadInfoService from '@/api/sys/ProofreadInfoService'
+  import ProofreadTypeService from '@/api/sys/ProofreadTypeService'
+  import ProgramProjectListInfoService from '@/api/program/ProgramProjectListInfoService'
+  import UserService from '@/api/sys/UserService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          projectId: '',
+          projectName: '',
+          assessmentDate: '',
+          projectManagerName: '',
+          processUserId: '',
+          processUserName: '',
+          processDate: '',
+          reservations: '',
+          unmodifiedComments: '',
+          details: [],
+          detailFor1010: [],
+          detailFor2010: [],
+          detailFor2020: [],
+          detailFor2030: [],
+          detailFor2040: [],
+          detailFor2050: [],
+          detailFor2060: [],
+          detailFor30: []
+        }
+      }
+    },
+    proofreadInfoService: null,
+    proofreadTypeService: null,
+    programProjectListInfoService: null,
+    UserService: null,
+    created () {
+      this.proofreadInfoService = new ProofreadInfoService()
+      this.programProjectListInfoService = new ProgramProjectListInfoService()
+      this.userService = new UserService()
+      this.proofreadTypeService = new ProofreadTypeService()
+    },
+    components: {
+    },
+    computed: {
+      name () {
+        return JSON.parse(localStorage.getItem('user')).name
+      },
+      userId () {
+        return JSON.parse(localStorage.getItem('user')).id
+      }
+    },
+    methods: {
+      init (id) {
+        this.inputForm = {
+          projectId: '',
+          projectName: '',
+          assessmentDate: '',
+          projectManagerName: '',
+          processUserId: '',
+          processUserName: '',
+          processDate: '',
+          reservations: '',
+          unmodifiedComments: '',
+          details: [],
+          detailFor1010: [],
+          detailFor2010: [],
+          detailFor2020: [],
+          detailFor2030: [],
+          detailFor2040: [],
+          detailFor2050: [],
+          detailFor2060: [],
+          detailFor30: []
+        }
+        this.visible = true
+        this.loading = false
+        this.$nextTick(() => {
+          this.loading = true
+          this.proofreadInfoService.findById(id, '1').then(({data}) => {
+            if (!this.commonJS.isEmpty(data.projectId)) {
+              this.$refs.inputForm.resetFields()
+              this.inputForm = this.recover(this.inputForm, data)
+              this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+              this.inputForm.processDate = data.processDate
+              this.detailDivide(data.details)
+            } else {
+              // 初始化
+              this.programProjectListInfoService.queryById(id).then(({data}) => {
+                this.inputForm.projectId = data.id
+                this.inputForm.projectName = data.name
+                this.inputForm.assessmentDate = data.assessmentDate
+                this.userService.queryById(data.projectManager).then(({data}) => {
+                  this.inputForm.projectManagerName = data.name
+                })
+              })
+              this.inputForm.processUserId = this.userId
+              this.inputForm.processUserName = this.name
+              this.inputForm.processDate = new Date()
+              this.proofreadInfoService.list('1').then(({data}) => { this.detailDivide(data) })
+            }
+            this.loading = false
+          })
+        })
+      },
+      // 表单提交
+      doSubmit () {
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            // 列表处理
+            this.inputForm.details = []
+            this.inputForm.detailFor1010.forEach(item => { this.inputForm.details.push(item) })
+            this.inputForm.detailFor2010.forEach(item => { this.inputForm.details.push(item) })
+            this.inputForm.detailFor2020.forEach(item => { this.inputForm.details.push(item) })
+            this.inputForm.detailFor2030.forEach(item => { this.inputForm.details.push(item) })
+            this.inputForm.detailFor2040.forEach(item => { this.inputForm.details.push(item) })
+            this.inputForm.detailFor2050.forEach(item => { this.inputForm.details.push(item) })
+            this.inputForm.detailFor2060.forEach(item => { this.inputForm.details.push(item) })
+            this.inputForm.detailFor30.forEach(item => { this.inputForm.details.push(item) })
+            this.inputForm.type = '1'
+            this.proofreadInfoService.save(this.inputForm).then(({data}) => {
+              this.close()
+              this.$message.success(data)
+              this.loading = false
+            }).catch(() => {
+              this.loading = false
+            })
+          }
+        })
+      },
+      close () {
+        this.$refs.inputForm.resetFields()
+        this.visible = false
+      },
+      detailDivide (details) {
+        this.inputForm.detailFor1010 = []
+        this.inputForm.detailFor2010 = []
+        this.inputForm.detailFor2020 = []
+        this.inputForm.detailFor2030 = []
+        this.inputForm.detailFor2040 = []
+        this.inputForm.detailFor2050 = []
+        this.inputForm.detailFor2060 = []
+        this.inputForm.detailFor30 = []
+        details.forEach(item => {
+          if (item.sort.startsWith('1010')) {
+            this.inputForm.detailFor1010.push(item)
+          }
+          if (item.sort.startsWith('2010')) {
+            this.inputForm.detailFor2010.push(item)
+          }
+          if (item.sort.startsWith('2020')) {
+            this.inputForm.detailFor2020.push(item)
+          }
+          if (item.sort.startsWith('2030')) {
+            this.inputForm.detailFor2030.push(item)
+          }
+          if (item.sort.startsWith('2040')) {
+            this.inputForm.detailFor2040.push(item)
+          }
+          if (item.sort.startsWith('2050')) {
+            this.inputForm.detailFor2050.push(item)
+          }
+          if (item.sort.startsWith('2060')) {
+            this.inputForm.detailFor2060.push(item)
+          }
+          if (item.sort.startsWith('30')) {
+            this.inputForm.detailFor30.push(item)
+          }
+        })
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-input-number .el-input__inner {
+    text-align: left;
+  }
+</style>

+ 768 - 0
src/views/program/registered/ProofreadFormComponent.vue

@@ -0,0 +1,768 @@
+<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
+  <div>
+    <div v-if="showDownload">
+      <el-row type="flex" justify="end">
+        <el-button @click="downloadProofreadAuditTpl">下载</el-button>
+      </el-row>
+      <el-divider content-position="left"><i class="el-icon-document"></i> 校对</el-divider>
+    </div>
+      <el-form size="middle" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''" :disabled="true"
+               label-width="120px" @submit.native.prevent>
+
+        <el-row :gutter="15">
+          <el-col :span="24">
+            <el-form-item label="项目名称" prop="projectName">
+              <el-input :disabled="true" v-model="inputForm.projectName"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="评估基准日" prop="assessmentDate">
+              <el-input :disabled="true" v-model="inputForm.assessmentDate"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="项目负责人" prop="projectManagerName">
+              <el-input :disabled="true" v-model="inputForm.projectManagerName"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="项目审核人" prop="processUserName">
+              <el-input :disabled="true" v-model="inputForm.processUserName"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="审核日期" prop="processDate">
+              <el-date-picker
+                placement="bottom-start"
+                v-model="inputForm.processDate"
+                type="date"
+                :disabled="true"
+                style="width: 100%"
+                placeholder="选择日期">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-divider content-position="left"><i class="el-icon-document"></i>明细表</el-divider>
+        <el-row :gutter="15" >
+          <vxe-table
+            border
+            show-overflow
+            ref="detailFor1010"
+            class="vxe-table-element"
+            :data="inputForm.detailFor1010"
+            style="margin-left: 5em"
+            @cell-click=""
+            @edit-closed=""
+            highlight-current-row
+            :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+          >
+            <vxe-table-column field="typeName" title="审核要点" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input :disabled="true" v-model="scope.row.typeName" ></el-input>
+              </template>
+            </vxe-table-column>
+<!--            <vxe-table-column width="150px" field="reviewComments" title="审核意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.reviewComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+<!--            <vxe-table-column width="150px" field="replyComments" title="回复意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.replyComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+            <vxe-table-column width="150px" field="reviewComments" title="审核意见(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.reviewComments" transfer>
+                  <vxe-option
+                          v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                          :key="item.value"
+                          :value="item.label"
+                          :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="isApply" title="是否适用(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.isApply" transfer>
+                  <vxe-option
+                    v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="350px" field="replyComments" title="回复意见" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input v-model="scope.row.replyComments" ></el-input>
+              </template>
+            </vxe-table-column>
+          </vxe-table>
+        </el-row>
+
+        <el-divider content-position="left"><i class="el-icon-document"></i>评估说明</el-divider>
+        <el-row></el-row>
+        <el-divider content-position="left">封面至评估范围</el-divider>
+        <el-row :gutter="15">
+          <vxe-table
+            border
+            show-overflow
+            ref="details"
+            class="vxe-table-element"
+            :data="inputForm.detailFor2010"
+            style="margin-left: 5em"
+            @cell-click=""
+            @edit-closed=""
+            highlight-current-row
+            :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+          >
+            <vxe-table-column field="typeName" title="审核要点" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input :disabled="true" v-model="scope.row.typeName" ></el-input>
+              </template>
+            </vxe-table-column>
+<!--            <vxe-table-column width="150px" field="reviewComments" title="审核意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.reviewComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+<!--            <vxe-table-column width="150px" field="replyComments" title="回复意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.replyComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+            <vxe-table-column width="150px" field="reviewComments" title="审核意见(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.reviewComments" transfer>
+                  <vxe-option
+                          v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                          :key="item.value"
+                          :value="item.label"
+                          :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="isApply" title="是否适用(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.isApply" transfer>
+                  <vxe-option
+                    v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="350px" field="replyComments" title="回复意见" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input v-model="scope.row.replyComments" ></el-input>
+              </template>
+            </vxe-table-column>
+          </vxe-table>
+        </el-row>
+
+        <el-divider content-position="left">资产核实情况总体说明</el-divider>
+        <el-row :gutter="15">
+          <vxe-table
+            border
+            show-overflow
+            ref="details"
+            class="vxe-table-element"
+            :data="inputForm.detailFor2020"
+            style="margin-left: 5em"
+            @cell-click=""
+            @edit-closed=""
+            highlight-current-row
+            :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+          >
+            <vxe-table-column field="typeName" title="审核要点" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input :disabled="true" v-model="scope.row.typeName" ></el-input>
+              </template>
+            </vxe-table-column>
+<!--            <vxe-table-column width="150px" field="reviewComments" title="审核意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.reviewComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+<!--            <vxe-table-column width="150px" field="replyComments" title="回复意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.replyComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+            <vxe-table-column width="150px" field="reviewComments" title="审核意见(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.reviewComments" transfer>
+                  <vxe-option
+                          v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                          :key="item.value"
+                          :value="item.label"
+                          :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="isApply" title="是否适用(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.isApply" transfer>
+                  <vxe-option
+                    v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="350px" field="replyComments" title="回复意见" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input v-model="scope.row.replyComments" ></el-input>
+              </template>
+            </vxe-table-column>
+          </vxe-table>
+        </el-row>
+
+        <el-divider content-position="left">资产基础法/成本法评估技术说明</el-divider>
+        <el-row :gutter="15">
+          <vxe-table
+            border
+            show-overflow
+            ref="details"
+            class="vxe-table-element"
+            :data="inputForm.detailFor2030"
+            style="margin-left: 5em"
+            @cell-click=""
+            @edit-closed=""
+            highlight-current-row
+            :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+          >
+            <vxe-table-column field="typeName" title="审核要点" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input :disabled="true" v-model="scope.row.typeName" ></el-input>
+              </template>
+            </vxe-table-column>
+<!--            <vxe-table-column width="150px" field="reviewComments" title="审核意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.reviewComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+<!--            <vxe-table-column width="150px" field="replyComments" title="回复意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.replyComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+            <vxe-table-column width="150px" field="reviewComments" title="审核意见(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.reviewComments" transfer>
+                  <vxe-option
+                          v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                          :key="item.value"
+                          :value="item.label"
+                          :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="isApply" title="是否适用(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.isApply" transfer>
+                  <vxe-option
+                    v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="350px" field="replyComments" title="回复意见" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input v-model="scope.row.replyComments" ></el-input>
+              </template>
+            </vxe-table-column>
+          </vxe-table>
+        </el-row>
+
+        <el-divider content-position="left">评估结论及分析</el-divider>
+        <el-row :gutter="15">
+          <vxe-table
+            border
+            show-overflow
+            ref="details"
+            class="vxe-table-element"
+            :data="inputForm.detailFor2040"
+            style="margin-left: 5em"
+            @cell-click=""
+            @edit-closed=""
+            highlight-current-row
+            :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+          >
+            <vxe-table-column field="typeName" title="审核要点" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input :disabled="true" v-model="scope.row.typeName" ></el-input>
+              </template>
+            </vxe-table-column>
+<!--            <vxe-table-column width="150px" field="reviewComments" title="审核意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.reviewComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+<!--            <vxe-table-column width="150px" field="replyComments" title="回复意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.replyComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+            <vxe-table-column width="150px" field="reviewComments" title="审核意见(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.reviewComments" transfer>
+                  <vxe-option
+                          v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                          :key="item.value"
+                          :value="item.label"
+                          :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="isApply" title="是否适用(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.isApply" transfer>
+                  <vxe-option
+                    v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="350px" field="replyComments" title="回复意见" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input v-model="scope.row.replyComments" ></el-input>
+              </template>
+            </vxe-table-column>
+          </vxe-table>
+        </el-row>
+
+        <el-divider content-position="left">关于评估有关事项的说明</el-divider>
+        <el-row :gutter="15">
+          <vxe-table
+            border
+            show-overflow
+            ref="details"
+            class="vxe-table-element"
+            :data="inputForm.detailFor2050"
+            style="margin-left: 5em"
+            @cell-click=""
+            @edit-closed=""
+            highlight-current-row
+            :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+          >
+            <vxe-table-column field="typeName" title="审核要点" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input :disabled="true" v-model="scope.row.typeName" ></el-input>
+              </template>
+            </vxe-table-column>
+<!--            <vxe-table-column width="150px" field="reviewComments" title="审核意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.reviewComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+<!--            <vxe-table-column width="150px" field="replyComments" title="回复意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.replyComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+            <vxe-table-column width="150px" field="reviewComments" title="审核意见(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.reviewComments" transfer>
+                  <vxe-option
+                          v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                          :key="item.value"
+                          :value="item.label"
+                          :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="isApply" title="是否适用(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.isApply" transfer>
+                  <vxe-option
+                    v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="350px" field="replyComments" title="回复意见" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input v-model="scope.row.replyComments" ></el-input>
+              </template>
+            </vxe-table-column>
+          </vxe-table>
+        </el-row>
+
+        <el-divider content-position="left">其他问题</el-divider>
+        <el-row :gutter="15">
+          <vxe-table
+            border
+            show-overflow
+            ref="details"
+            class="vxe-table-element"
+            :data="inputForm.detailFor2060"
+            style="margin-left: 5em"
+            @cell-click=""
+            @edit-closed=""
+            highlight-current-row
+            :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+          >
+            <vxe-table-column field="typeName" title="审核要点" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input :disabled="true" v-model="scope.row.typeName" ></el-input>
+              </template>
+            </vxe-table-column>
+<!--            <vxe-table-column width="150px" field="reviewComments" title="审核意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.reviewComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+<!--            <vxe-table-column width="150px" field="replyComments" title="回复意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.replyComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+            <vxe-table-column width="150px" field="reviewComments" title="审核意见(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.reviewComments" transfer>
+                  <vxe-option
+                          v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                          :key="item.value"
+                          :value="item.label"
+                          :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="isApply" title="是否适用(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.isApply" transfer>
+                  <vxe-option
+                    v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="350px" field="replyComments" title="回复意见" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input v-model="scope.row.replyComments" ></el-input>
+              </template>
+            </vxe-table-column>
+          </vxe-table>
+        </el-row>
+
+        <el-divider content-position="left"><i class="el-icon-document"></i>评估报告</el-divider>
+        <el-row :gutter="15">
+          <vxe-table
+            border
+            show-overflow
+            ref="details"
+            class="vxe-table-element"
+            :data="inputForm.detailFor30"
+            style="margin-left: 5em"
+            @cell-click=""
+            @edit-closed=""
+            highlight-current-row
+            :edit-config="{trigger: 'click', mode: 'cell', showStatus: true, autoClear: true}"
+          >
+            <vxe-table-column field="typeName" title="审核要点" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input :disabled="true" v-model="scope.row.typeName" ></el-input>
+              </template>
+            </vxe-table-column>
+<!--            <vxe-table-column width="150px" field="reviewComments" title="审核意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.reviewComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+<!--            <vxe-table-column width="150px" field="replyComments" title="回复意见" :edit-render="{}">-->
+<!--              <template v-slot:edit="scope">-->
+<!--                <el-input v-model="scope.row.replyComments" ></el-input>-->
+<!--              </template>-->
+<!--            </vxe-table-column>-->
+            <vxe-table-column width="150px" field="reviewComments" title="审核意见(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.reviewComments" transfer>
+                  <vxe-option
+                          v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                          :key="item.value"
+                          :value="item.label"
+                          :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="150px" field="isApply" title="是否适用(√/×)" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <vxe-select v-model="scope.row.isApply" transfer>
+                  <vxe-option
+                    v-for="item in $dictUtils.getDictList('yes_no_flag')"
+                    :key="item.value"
+                    :value="item.label"
+                    :label="item.label">
+                  </vxe-option>
+                </vxe-select>
+              </template>
+            </vxe-table-column>
+            <vxe-table-column width="350px" field="replyComments" title="回复意见" :edit-render="{}">
+              <template v-slot:edit="scope">
+                <el-input v-model="scope.row.replyComments" ></el-input>
+              </template>
+            </vxe-table-column>
+          </vxe-table>
+        </el-row>
+
+        <el-divider content-position="left"><i class="el-icon-document"></i>保留意见</el-divider>
+        <el-input v-model="inputForm.reservations"
+                  type="textarea"
+                  :rows="5"
+                  maxlength="2000"
+                  placeholder="请输入保留意见"
+                  show-word-limit>
+        </el-input>
+
+        <el-divider content-position="left"><i class="el-icon-document"></i>未修改意见</el-divider>
+        <el-input v-model="inputForm.unmodifiedComments"
+                  type="textarea"
+                  :rows="5"
+                  maxlength="2000"
+                  placeholder="请输入未修改意见"
+                  show-word-limit>
+        </el-input>
+
+      </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>-->
+
+  </div>
+</template>
+
+<script>
+  import ProofreadInfoService from '@/api/sys/ProofreadInfoService'
+  import ProofreadTypeService from '@/api/sys/ProofreadTypeService'
+  import ProgramProjectListInfoService from '@/api/program/ProgramProjectListInfoService'
+  import UserService from '@/api/sys/UserService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          projectId: '',
+          projectName: '',
+          assessmentDate: '',
+          projectManagerName: '',
+          processUserId: '',
+          processUserName: '',
+          processDate: '',
+          reservations: '',
+          unmodifiedComments: '',
+          details: [],
+          detailFor1010: [],
+          detailFor2010: [],
+          detailFor2020: [],
+          detailFor2030: [],
+          detailFor2040: [],
+          detailFor2050: [],
+          detailFor2060: [],
+          detailFor30: []
+        },
+        showDownload: false
+      }
+    },
+    proofreadInfoService: null,
+    proofreadTypeService: null,
+    programProjectListInfoService: null,
+    UserService: null,
+    created () {
+      this.proofreadInfoService = new ProofreadInfoService()
+      this.programProjectListInfoService = new ProgramProjectListInfoService()
+      this.userService = new UserService()
+      this.proofreadTypeService = new ProofreadTypeService()
+    },
+    components: {
+    },
+    computed: {
+      name () {
+        return JSON.parse(localStorage.getItem('user')).name
+      },
+      userId () {
+        return JSON.parse(localStorage.getItem('user')).id
+      }
+    },
+    methods: {
+      init (id) {
+        this.showDownload = false
+        this.inputForm = {
+          projectId: '',
+          projectName: '',
+          assessmentDate: '',
+          projectManagerName: '',
+          processUserId: '',
+          processUserName: '',
+          processDate: '',
+          reservations: '',
+          unmodifiedComments: '',
+          details: [],
+          detailFor1010: [],
+          detailFor2010: [],
+          detailFor2020: [],
+          detailFor2030: [],
+          detailFor2040: [],
+          detailFor2050: [],
+          detailFor2060: [],
+          detailFor30: []
+        }
+        this.visible = true
+        this.loading = false
+        this.$nextTick(() => {
+          this.loading = true
+          this.proofreadInfoService.findById(id, '1').then(({data}) => {
+            if (this.commonJS.isNotEmpty(data)) {
+              this.showDownload = true
+            }
+            if (!this.commonJS.isEmpty(data.projectId)) {
+              this.$refs.inputForm.resetFields()
+              this.inputForm = this.recover(this.inputForm, data)
+              this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+              this.inputForm.processDate = data.processDate
+              this.detailDivide(data.details)
+            } else {
+              // 初始化
+              this.programProjectListInfoService.queryById(id).then(({data}) => {
+                this.inputForm.projectId = data.id
+                this.inputForm.projectName = data.name
+                this.inputForm.assessmentDate = data.assessmentDate
+                this.userService.queryById(data.projectManager).then(({data}) => {
+                  this.inputForm.projectManagerName = data.name
+                })
+              })
+              this.inputForm.processUserId = this.userId
+              this.inputForm.processUserName = this.name
+              this.inputForm.processDate = new Date()
+              this.proofreadInfoService.list('1').then(({data}) => { this.detailDivide(data) })
+            }
+            this.loading = false
+          })
+        })
+      },
+      // 表单提交
+      doSubmit () {
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            // 列表处理
+            this.inputForm.details = []
+            this.inputForm.detailFor1010.forEach(item => { this.inputForm.details.push(item) })
+            this.inputForm.detailFor2010.forEach(item => { this.inputForm.details.push(item) })
+            this.inputForm.detailFor2020.forEach(item => { this.inputForm.details.push(item) })
+            this.inputForm.detailFor2030.forEach(item => { this.inputForm.details.push(item) })
+            this.inputForm.detailFor2040.forEach(item => { this.inputForm.details.push(item) })
+            this.inputForm.detailFor2050.forEach(item => { this.inputForm.details.push(item) })
+            this.inputForm.detailFor2060.forEach(item => { this.inputForm.details.push(item) })
+            this.inputForm.detailFor30.forEach(item => { this.inputForm.details.push(item) })
+            this.inputForm.type = '1'
+            this.proofreadInfoService.save(this.inputForm).then(({data}) => {
+              this.close()
+              this.$message.success(data)
+              this.loading = false
+            }).catch(() => {
+              this.loading = false
+            })
+          }
+        })
+      },
+      close () {
+        this.$refs.inputForm.resetFields()
+        this.visible = false
+      },
+      detailDivide (details) {
+        this.inputForm.detailFor1010 = []
+        this.inputForm.detailFor2010 = []
+        this.inputForm.detailFor2020 = []
+        this.inputForm.detailFor2030 = []
+        this.inputForm.detailFor2040 = []
+        this.inputForm.detailFor2050 = []
+        this.inputForm.detailFor2060 = []
+        this.inputForm.detailFor30 = []
+        details.forEach(item => {
+          if (item.sort.startsWith('1010')) {
+            this.inputForm.detailFor1010.push(item)
+          }
+          if (item.sort.startsWith('2010')) {
+            this.inputForm.detailFor2010.push(item)
+          }
+          if (item.sort.startsWith('2020')) {
+            this.inputForm.detailFor2020.push(item)
+          }
+          if (item.sort.startsWith('2030')) {
+            this.inputForm.detailFor2030.push(item)
+          }
+          if (item.sort.startsWith('2040')) {
+            this.inputForm.detailFor2040.push(item)
+          }
+          if (item.sort.startsWith('2050')) {
+            this.inputForm.detailFor2050.push(item)
+          }
+          if (item.sort.startsWith('2060')) {
+            this.inputForm.detailFor2060.push(item)
+          }
+          if (item.sort.startsWith('30')) {
+            this.inputForm.detailFor30.push(item)
+          }
+        })
+      },
+      // 下载资产评估项目(校对)审核记录表
+      downloadProofreadAuditTpl () {
+        // this.$utils.downloadExcel('/sys/project/import/template')
+        this.loading = true
+        this.programProjectListInfoService.downloadProofreadAuditTpl(this.inputForm.projectId).then((res) => {
+          // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(res.data, '资产评估项目(校对)审核记录表.xls')
+          this.loading = false
+        }).catch(function (err) {
+          this.loading = false
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .el-input-number .el-input__inner {
+    text-align: left;
+  }
+  .el-divider__text {
+    font-size: 16px;
+    font-weight: bold;
+  }
+</style>

+ 593 - 0
src/views/program/registered/ProofreadIssuedForm.vue

@@ -0,0 +1,593 @@
+<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
+  <div>
+    <div v-if="inputForm.status === '5'&&tabName === '报告签发单'">
+      <el-row type="flex" justify="end">
+        <el-button @click="downloadReportAusstellungTpl">下载</el-button>
+      </el-row>
+      <el-divider content-position="left"><i class="el-icon-document"></i> 报告签发单</el-divider>
+    </div>
+    <el-form size="middle" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="status === 'audit' || status === 'taskFormDetail'|| isDisabled === 'view'"
+             label-width="150px" @submit.native.prevent>
+      <el-row  :gutter="15">
+        <el-col :span="24">
+          <el-form-item label="项目名称" prop="projectName">
+            <el-input size="medium" :disabled="true" v-model="inputForm.projectName" clearable></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="评估基准日" prop="assessmentDate">
+            <el-input size="medium" :disabled="true" v-model="inputForm.assessmentDate" clearable></el-input>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="报告文号" prop="reportNo">
+            <el-input size="medium" :disabled="true" v-model="inputForm.reportNo" clearable></el-input>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="项目负责人" prop="projectManager">
+            <SelectUserTree
+              ref="companyTree"
+              size="medium"
+              :props="{
+                  value: 'id',             // ID字段名
+                  label: 'name',         // 显示名称
+                  children: 'children'    // 子级字段名
+                }"
+              :url="`/sys/user/treeUserDataAllOffice?type=2`"
+              :value="inputForm.projectManager"
+              :disabled="true"
+              :clearable="true"
+              :accordion="true"
+              @getValue="(value) => {inputForm.projectManager=value}"/>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="所属部门" prop="department">
+            <el-input size="medium" :disabled="true" v-model="inputForm.department" clearable></el-input>
+          </el-form-item>
+        </el-col>
+
+       </el-row>
+
+      <el-divider content-position="left"><span style="font-size: 17px;margin-left: 0px"><b>业务类型</b></span></el-divider>
+      <el-row v-for="(item, index) in typeList">
+      <el-divider content-position="left"><span style="font-size: 17px;margin-left: 10px">{{item.name}}</span></el-divider>
+        <vxe-table
+          border="inner"
+          show-overflow
+          ref="table"
+          class="vxe-table-element"
+          :data="item.childrenList"
+          style="margin-left: 5em"
+          @cell-click=""
+          @edit-closed=""
+          :show-header="false"
+          :row-config="{isHover: true,keyField: 'id'}"
+          @radio-change="radioChangeEvent($event, index)"
+          :radio-config="{trigger: 'row',labelField: 'name'}"
+        >
+          <vxe-column type="radio" align="left"></vxe-column>
+<!--          <vxe-column align="left" field="name"></vxe-column>-->
+        </vxe-table>
+      </el-row>
+
+      <el-row :gutter="15" style="margin-top: 40px">
+
+        <el-col :span="12">
+          <el-form-item label="是否已完善项目信息" prop="isTxtz" :rules="[{required: true, message:'请选择是否已完善项目信息', trigger:'blur'}]">
+            <el-radio-group v-model="inputForm.isTxtz">
+              <el-radio v-for="item in $dictUtils.getDictList('yes_no')" :label="item.value" >{{item.label}}</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="报告电子版是否归档" prop="isBgdzdgd" :rules="[{required: true, message:'请选择报告电子版是否归档', trigger:'blur'}]">
+            <el-radio-group v-model="inputForm.isBgdzdgd">
+              <el-radio v-for="item in $dictUtils.getDictList('yes_no')" :label="item.value" >{{item.label}}</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="是否需要备案" prop="isXyba" :rules="[{required: true, message:'请选择是否需要备案', trigger:'blur'}]">
+            <el-radio-group v-model="inputForm.isXyba">
+              <el-radio v-for="item in $dictUtils.getDictList('yes_no')" :label="item.value" >{{item.label}}</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="是否完成备案" prop="isWcba" :rules="[{required: true, message:'请选择是否完成备案', trigger:'blur'}]">
+            <el-radio-group v-model="inputForm.isWcba">
+              <el-radio v-for="item in $dictUtils.getDictList('yes_no')" :label="item.value" >{{item.label}}</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
+<!--        评估报告-->
+        <div v-if="inputForm.reportType === '1'">
+          <el-col :span="12">
+            <el-form-item label="评估报告(份)" prop="assessmentReport" :rules="[{required: true, message:'请输入评估报告(份)', trigger:'blur'}]">
+              <el-input size="medium" v-model="inputForm.assessmentReport" clearable></el-input>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="评估说明(份)" prop="assessmentExplain" :rules="[{required: true, message:'请输入评估说明(份)', trigger:'blur'}]">
+              <el-input size="medium" v-model="inputForm.assessmentExplain" clearable></el-input>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="评估明细表(份)" prop="assessmentDetail" :rules="[{required: true, message:'请输入评估明细表(份)', trigger:'blur'}]">
+              <el-input size="medium" v-model="inputForm.assessmentDetail" clearable></el-input>
+            </el-form-item>
+          </el-col>
+        </div>
+<!--        咨询报告-->
+        <div v-if="inputForm.reportType === '2'">
+
+          <el-col :span="12">
+            <el-form-item label="咨询报告(份)" prop="consultingReport" :rules="[{required: true, message:'请输入咨询报告(份)', trigger:'blur'}]">
+              <el-input size="medium" v-model="inputForm.consultingReport" clearable></el-input>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="评估说明(份)" prop="assessmentExplain" :rules="[]">
+              <el-input size="medium" v-model="inputForm.assessmentExplain" clearable></el-input>
+            </el-form-item>
+          </el-col>
+
+        </div>
+
+
+        <el-col :span="12">
+          <el-form-item label="用印类型" prop="sealType" :rules="[{required: true, message:'请输入用印类型', trigger:'blur'}]">
+            <el-input size="medium" v-model="inputForm.sealType" clearable></el-input>
+          </el-form-item>
+        </el-col>
+
+      </el-row>
+
+    </el-form>
+  </div>
+</template>
+
+<script>
+  import SelectUserTree from '@/views/utils/treeUserSelect'
+  import ProofreadIssuedService from '@/api/sys/ProofreadIssuedService'
+  import ProgramProjectListInfoService from '@/api/program/ProgramProjectListInfoService'
+  import ProgramServiceTypeService from '@/api/program/ProgramServiceTypeService'
+  export default {
+    props: {
+      businessId: {
+        type: String,
+        default: ''
+      },
+      formReadOnly: {
+        type: Boolean,
+        default: false
+      },
+      status: {
+        type: String,
+        default: ''
+      }
+    },
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          id: '',
+          projectId: '',
+          projectName: '',
+          assessmentDate: '',
+          reportNo: '',
+          projectManager: '',
+          department: '',
+          isTxtz: '',
+          isBgdzdgd: '',
+          isXyba: '',
+          isWcba: '',
+          assessmentReport: '',
+          assessmentExplain: '',
+          assessmentDetail: '',
+          consultingReport: '',
+          sealType: '',
+          status: '',
+          agreeTime: '',
+          agreeUserId: '',
+          reportType: '',
+          serviceType: ''
+        },
+        keyWatch: '',
+        yesOrNo: [
+          {value: 0, label: '否'},
+          {value: 1, label: '是'}
+        ],
+        typeList: [],
+        tabName: '',
+        chooseTableIndex: '',
+        isDisabled: ''
+      }
+    },
+    proofreadIssuedService: null,
+    programProjectListInfoService: null,
+    programServiceTypeService: null,
+    created () {
+      this.programServiceTypeService = new ProgramServiceTypeService()
+      this.proofreadIssuedService = new ProofreadIssuedService()
+      this.programProjectListInfoService = new ProgramProjectListInfoService()
+      this.proofreadIssuedService.findProjectInfoById(this.businessId).then(({data}) => {
+        this.inputForm = this.recover(this.inputForm, data)
+        this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+      })
+      // this.getTypeList() // 获取业务类型数据
+    },
+    computed: {
+      bus: {
+        get () {
+          return this.businessId
+        },
+        set (val) {
+          this.businessId = val
+        }
+      }
+    },
+    watch: {
+      'keyWatch': {
+        handler (newVal) {
+          if (this.bus) {
+            if (this.bus !== 'false') {
+              this.init('', this.bus)
+            }
+          } else {
+            this.$nextTick(() => {
+              this.$refs.inputForm.resetFields()
+            })
+          }
+        }
+      },
+      'loading': {
+        handler (newVal) {
+          this.$emit('changeLoading', newVal)
+        }
+      }
+    },
+    components: {
+      SelectUserTree
+    },
+    methods: {
+      getKeyWatch (keyWatch) {
+        this.keyWatch = keyWatch
+      },
+      init (method, id, tabName) {
+        this.tabName = tabName
+        this.method = method
+        if (method === 'view') {
+          this.isDisabled = 'view'
+        }
+        this.inputForm = {
+          id: '',
+          projectId: '',
+          projectName: '',
+          assessmentDate: '',
+          reportNo: '',
+          projectManager: '',
+          department: '',
+          isTxtz: '',
+          isBgdzdgd: '',
+          isXyba: '',
+          isWcba: '',
+          assessmentReport: '',
+          assessmentExplain: '',
+          assessmentDetail: '',
+          consultingReport: '',
+          sealType: '',
+          status: '',
+          agreeTime: '',
+          agreeUserId: '',
+          reportType: '',
+          serviceType: ''
+        }
+        this.inputForm.projectId = id
+        this.visible = true
+        this.loading = false
+        // this.getTypeList()  // 获取业务类型数据
+        this.$nextTick(() => {
+          this.loading = true
+          this.programServiceTypeService.getList().then(({data}) => {
+            this.typeList = data
+            this.proofreadIssuedService.findById(this.inputForm.projectId).then(({data}) => {
+              if (!this.commonJS.isEmpty(data.id)) {
+                this.$refs.inputForm.resetFields()
+                this.inputForm = this.recover(this.inputForm, data)
+                this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+                this.chooseRow() // 选中行
+                this.loading = false
+              } else {
+                this.proofreadIssuedService.findProjectInfoById(this.inputForm.projectId).then(({data}) => {
+                  this.inputForm = this.recover(this.inputForm, data)
+                  this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+                  this.chooseRow() // 选中行
+                  this.loading = false
+                })
+              }
+            })
+          })
+        })
+      },
+      // 获取业务类型数据
+      getTypeList () {
+        this.programServiceTypeService.getList().then(({data}) => {
+          this.typeList = data
+        })
+      },
+      reapplyForm (callback) {
+        this.loading = true
+        this.proofreadIssuedService.findById(this.inputForm.id).then(({data}) => {
+          if (data.status !== '4') { // 审核状态不是“驳回”,就弹出提示
+            this.loading = false
+            this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+            throw new Error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+          } else {
+            this.startFormTrue(callback)
+          }
+        })
+      },
+      startForm (callback) {
+        this.loading = true
+        if (this.commonJS.isNotEmpty(this.inputForm.id)) {
+          this.proofreadIssuedService.findById(this.inputForm.id).then(({data}) => {
+            if (this.commonJS.isNotEmpty(data.status) && data.status !== '0' && data.status !== '1' && data.status !== '3') { // 审核状态不是“未发起”或“暂存”或“撤回”,就弹出提示
+              this.loading = false
+              this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+              throw new Error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+            } else {
+              this.startFormTrue(callback)
+            }
+          })
+        } else {
+          this.startFormTrue(callback)
+        }
+      },
+      saveForm (callback) {
+        this.loading = true
+        this.inputForm.status = '1'
+        this.proofreadIssuedService.save(this.inputForm).then(({data}) => {
+          callback(data.businessTable, data.businessId, this.inputForm)
+          this.loading = false
+        }).catch(() => {
+          this.loading = false
+        })
+      },
+      startFormTrue (callback) {
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            this.inputForm.status = '2'
+            this.proofreadIssuedService.save(this.inputForm).then(({data}) => {
+              this.inputForm.id = data.businessId
+              callback(data.businessTable, data.businessId, this.inputForm)
+              this.loading = false
+            }).catch(() => {
+              this.loading = false
+            })
+          } else {
+            this.loading = false
+          }
+        })
+      },
+      async agreeForm (callback) {
+        this.loading = true
+        await this.proofreadIssuedService.findById(this.inputForm.id).then(({data}) => {
+          if (data.status !== '2') { // status的值不等于“审核中”,就弹出提示
+            this.loading = false
+            this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+            throw new Error()
+          } else {
+            this.$refs['inputForm'].validate((valid) => {
+              if (valid) {
+                this.loading = true
+                this.inputForm.status = '5'
+                this.inputForm.agreeTime = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+                let userId = JSON.parse(localStorage.getItem('user')).id
+                this.inputForm.agreeUserId = userId
+                this.proofreadIssuedService.save(this.inputForm).then(({data}) => {
+                  callback(data.businessTable, data.businessId, this.inputForm)
+                  this.loading = false
+                }).catch(() => {
+                  this.loading = false
+                })
+              } else {
+                this.loading = false
+              }
+            })
+          }
+        })
+      },
+      async updateStatusById (type, callback) {
+        this.loading = true
+        if (type === 'reject' || type === 'reback') {
+          this.proofreadIssuedService.findById(this.inputForm.id).then(({data}) => {
+            if (data.status !== '2') { // status的值不等于“审核中”,就弹出提示
+              this.loading = false
+              this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+              throw new Error()
+            } else {
+              // if (type === 'agree') {
+              //   // 同意
+              //   this.inputForm.status = '5'
+              // }
+              if (type === 'reject') {
+                // 驳回
+                this.inputForm.status = '4'
+                // this.proofreadIssuedService.updateStatus(this.inputForm)
+              }
+              if (type === 'reback') {
+                // 撤回
+                this.inputForm.status = '3'
+                // this.proofreadIssuedService.updateStatus(this.inputForm)
+              }
+              if (type === 'reject' || type === 'reback') {
+                let param = {status: this.inputForm.status, id: this.inputForm.id}
+                this.proofreadIssuedService.updateStatus(param).then(() => {
+                  this.loading = false
+                  callback()
+                })
+              }
+            }
+          })
+        } else if (type === 'hold') {
+          this.proofreadIssuedService.findById(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.proofreadIssuedService.updateStatus(param).then(() => {
+                this.loading = false
+                callback()
+              })
+            }
+          })
+        }
+      },
+      // async updateStatusById (type) {
+      //   await this.proofreadIssuedService.findById(this.inputForm.id).then(({data}) => {
+      //     if (data.status !== '2') { // status的值不等于“审核中”,就弹出提示
+      //       this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+      //       throw new Error()
+      //     } else {
+      //       if (type === 'reject') {
+      //         // 驳回
+      //         this.inputForm.status = '4'
+      //         this.proofreadIssuedService.updateStatus(this.inputForm)
+      //       }
+      //       if (type === 'reback') {
+      //         // 撤回
+      //         this.inputForm.status = '3'
+      //         this.proofreadIssuedService.updateStatus(this.inputForm)
+      //       }
+      //     }
+      //   })
+      // },
+      close () {
+        this.inputForm = {
+          id: '',
+          projectId: '',
+          projectName: '',
+          assessmentDate: '',
+          reportNo: '',
+          projectManager: '',
+          department: '',
+          isTxtz: '',
+          isBgdzdgd: '',
+          isXyba: '',
+          isWcba: '',
+          assessmentReport: '',
+          assessmentExplain: '',
+          assessmentDetail: '',
+          consultingReport: '',
+          sealType: '',
+          status: '',
+          agreeTime: '',
+          agreeUserId: '',
+          reportType: '',
+          serviceType: ''
+        }
+        this.chooseTableIndex = ''
+        this.typeList = []
+        this.$refs.inputForm.resetFields()
+        this.visible = false
+      },
+      // 下载报告签发单
+      downloadReportAusstellungTpl () {
+        // this.$utils.downloadExcel('/sys/project/import/template')
+        this.loading = true
+        this.programProjectListInfoService.downloadReportAusstellungTpl(this.inputForm.projectId).then((res) => {
+          // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadWord(res.data, '报告签发单')
+          this.loading = false
+        }).catch(function (err) {
+          this.loading = false
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      },
+      // 业务类别表格值改变事件
+      radioChangeEvent (event, tableIndex) {
+        if (this.status === 'audit' || this.status === 'taskFormDetail' || this.isDisabled === 'view') {  // 数据审核页面或详情页面  不允许修改数据时
+          if (this.commonJS.isNotEmpty(this.chooseTableIndex)) { // chooseTableIndex有值,说明数据有默认值
+            if (tableIndex === this.chooseTableIndex) { // 选中行是默认数据所属的表,不允许切换
+              this.$refs.table[tableIndex].setRadioRow(event.oldValue) // 将表中的选择重新赋值上一个选择,达到未切换的目的
+            } else {  // 选中行不是默认数据所属的表,不允许切换
+              this.$refs.table[tableIndex].clearRadioRow() // 清空表中的选项,达到未切换数据的目的
+            }
+          } else {  // chooseTableIndex没有值,说明数据没有默认值,清空表中的选项
+            this.$refs.table[tableIndex].clearRadioRow()
+          }
+        } else {  // 允许修改数据时
+          // 清除其他表格的选择
+          this.typeList.forEach((item, index) => {
+            if (index !== tableIndex) {
+              this.$refs.table[index].clearRadioRow()
+            }
+          })
+          // 绑定表格的选择
+          this.inputForm.serviceType = event.row.id
+        }
+      },
+      // 单选框是否禁用
+      // tableCheckMethod () {
+      //   console.log('禁用')
+      //   if (this.status === 'audit' || this.status === 'taskFormDetail') {
+      //     return false
+      //   }
+      //   return true
+      // },
+      chooseRow () {
+        if (this.commonJS.isNotEmpty(this.inputForm.serviceType)) {
+          if (this.commonJS.isNotEmpty(this.typeList)) {
+            this.typeList.forEach((item, index) => {   // 遍历出表格(A类、B类等表格)
+              if (this.commonJS.isNotEmpty(item.childrenList)) {  // 每个表格中的数据遍历出来(A类表格中的数据、B类表格中的数据等等...)
+                item.childrenList.forEach((child) => {
+                  if (child.id === this.inputForm.serviceType) { // 如果表格中的数据等于查询到的业务类型,说明要将这条数据选中
+                    this.$refs.table[index].setRadioRow(child) // 将数据改为选中状态
+                    this.chooseTableIndex = index // 获取选中数据属于哪个表格
+                  }
+                })
+              }
+            })
+          }
+        }
+      },
+      // 关闭父页面时调用此方法
+      closeThis () {
+        this.close()
+      }
+    }
+  }
+</script>
+<style scoped>
+  /deep/ .w-e-text-container {
+    z-index: 1 !important;
+  }
+  /deep/ .wtext {
+    height: 200px
+  }
+  .el-divider__text {
+    font-size: 16px;
+    font-weight: bold;
+  }
+</style>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1578 - 0
src/views/program/registered/RegisItemForm.vue


+ 222 - 0
src/views/program/registered/WorkClientForm.vue

@@ -0,0 +1,222 @@
+<template>
+  <div>
+    <el-dialog
+      :title="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="list()" @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="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 size="small" 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="`/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()" 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="workClientTable"
+          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 width="300px"  title="客户名称" field="name">
+          </vxe-column>
+<!--          <vxe-column width="200px"  title="代表方" field="deputy" ></vxe-column>-->
+          <vxe-column width="100px"  title="客户性质" field="companyType" >
+            <template slot-scope="scope">
+              {{ $dictUtils.getDictLabel("customer_nature", scope.row.companyType, '-') }}
+            </template>
+          </vxe-column>
+          <vxe-column width="100px"  title="客户行业" field="companyIndustry" >
+            <template slot-scope="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
+          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/sys/WorkClientService'
+  import SelectUserTree from '@/views/utils/treeUserSelect'
+  import SelectTree from '@/components/treeSelect/treeSelect.vue'
+  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,
+      SelectTree
+    },
+    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>

+ 133 - 0
src/views/program/serviceType/ProgramServiceTypeForm.vue

@@ -0,0 +1,133 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      width="500px"
+      @close="close"
+      @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="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>
+      <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 ProgramServiceTypeService from '@/api/program/ProgramServiceTypeService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          type: '',
+          sort: '',
+          remarks: '',
+          parentId: ''
+        }
+      }
+    },
+    programServiceTypeService: null,
+    created () {
+      this.programServiceTypeService = new ProgramServiceTypeService()
+    },
+    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.programServiceTypeService.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.programServiceTypeService.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>

+ 159 - 0
src/views/program/serviceType/ProgramServiceTypeList.vue

@@ -0,0 +1,159 @@
+<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 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="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_service_type:add')" type="primary" size="small" icon="el-icon-plus" @click="add()">新建</el-button>
+          <el-button v-if="hasPermission('program_service_type:del')" type="danger"   size="small" icon="el-icon-delete" @click="del()" :disabled="$refs.serviceTypeTable && $refs.serviceTypeTable.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="serviceTypeTable"
+          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'}"
+          :checkbox-config="{}">
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="checkbox" 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-column title="操作" width="230px" fixed="right" align="center">
+            <template  slot-scope="scope">
+              <el-button v-if="hasPermission('program_service_type:edit')&&scope.row.level === 1" type="text"  size="small" @click="addChild(scope.row.id)">新建子类型</el-button>
+              <el-button v-if="hasPermission('program_service_type:edit')" type="text"  size="small" @click="edit(scope.row.id)">修改</el-button>
+              <el-button v-if="hasPermission('program_service_type:del')" type="text"   size="small" @click="del(scope.row.id)">删除</el-button>
+            </template>
+          </vxe-column>
+        </vxe-table>
+      </div>
+    </div>
+    <ProgramServiceTypeForm  ref="programServiceTypeForm" @refreshDataList="refreshList"></ProgramServiceTypeForm>
+  </div>
+</template>
+
+<script>
+  import ProgramServiceTypeService from '@/api/program/ProgramServiceTypeService'
+  import ProgramServiceTypeForm from './ProgramServiceTypeForm'
+  export default {
+    data () {
+      return {
+        searchForm: {
+          name: '',
+          sort: ''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        loading: false
+      }
+    },
+    programServiceTypeService: null,
+    created () {
+      this.programServiceTypeService = new ProgramServiceTypeService()
+    },
+    components: {
+      ProgramServiceTypeForm
+    },
+    mounted () {
+      this.refreshList()
+    },
+    methods: {
+      // 新增
+      add () {
+        this.$refs.programServiceTypeForm.init('add', '')
+      },
+      addChild (id) {
+        this.$refs.programServiceTypeForm.init('addChild', id)
+      },
+      // 修改
+      edit (id) {
+        id = id || this.$refs.serviceTypeTable.getCheckboxRecords().map(item => {
+          return item.id
+        })[0]
+        this.$refs.programServiceTypeForm.init('edit', id)
+      },
+      // 查看
+      view (id) {
+        this.$refs.programServiceTypeForm.init('view', id)
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        this.programServiceTypeService.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.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.serviceTypeTable.getCheckboxRecords().map(item => {
+          return item.id
+        }).join(',')
+        this.$confirm(`确定删除所选项吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.loading = true
+          this.programServiceTypeService.delete(ids).then(({data}) => {
+            this.$message.success(data)
+            this.refreshList()
+            this.loading = false
+          })
+        })
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      }
+    }
+  }
+</script>

+ 628 - 0
src/views/project/AssessForm.vue

@@ -0,0 +1,628 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      width="800px"
+      @close="close"
+      @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="150px">
+        <el-row  :gutter="15">
+          <el-col :span="12">
+            <el-form-item label="客户名称" prop="customerName"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.customerName" placeholder="请填写客户名称"     ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="项目名称" prop="projectName"
+                          :rules="[
+                  {required: true, message:'项目名称不能为空', trigger:'blur'}
+                 ]">
+              <el-input v-model="inputForm.projectName" placeholder="请填写项目名称"     ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="年份" prop="year"
+                          :rules="[
+                  {required: true, message:'年份不能为空', trigger:'blur'}
+                 ]">
+              <el-input v-model="inputForm.year" placeholder="请填写年份"     ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="评估目的" prop="evaluationObjective"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.evaluationObjective" placeholder="请填写评估目的"     ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="项目类型" prop="projectType"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.projectType" placeholder="请填写项目类型"     ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="评估基准日" prop="evaluationBaseDateUi"
+                          :rules="[
+
+                 ]">
+              <!--              {required: true, message:'评估基准日不能为空', trigger:'blur'}-->
+              <!--              <el-input v-model="inputForm.evaluationBaseDate" placeholder="请填写评估基准日"     ></el-input>-->
+              <el-date-picker
+                style="width:100%;"
+                v-model="inputForm.evaluationBaseDateUi"
+                type="datetime"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                placeholder="选择日期时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="评估报告日" prop="evaluationReportDateUi"
+                          :rules="[
+
+                 ]">
+              <!--              {required: true, message:'评估报告日不能为空', trigger:'blur'}-->
+              <!--              <el-input v-model="inputForm.evaluationReportDate" placeholder="请填写评估报告日"     ></el-input>-->
+              <el-date-picker
+                style="width:100%;"
+                v-model="inputForm.evaluationReportDateUi"
+                type="datetime"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                placeholder="选择日期时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="协议号" prop="protocolNum"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.protocolNum" placeholder="请填写协议号"     ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="文号" prop="documentNum"
+                          :rules="[
+                  {required: true, message:'文号不能为空', trigger:'blur'}
+                 ]">
+              <el-input v-model="inputForm.documentNum" placeholder="请填写文号"     ></el-input>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item prop="projectHead" :rules=" [{required: true, message: '项目负责人不能为空', trigger: 'blur'}]" label="项目负责人">
+              <SelectUserTree
+                ref="companyTree"
+                :props="{
+                    value: 'id',             // ID字段名
+                    label: 'name',         // 显示名称
+                    children: 'children'    // 子级字段名
+                  }"
+                :url="`/sys/user/treeUserDataAllOffice?type=2`"
+                :value="inputForm.projectHead"
+                :clearable="true"
+                :accordion="true"
+                :disabled="method==='view'"
+                @getValue="(value) => {inputForm.projectHead=value}"/>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="废旧物资评估(万元)" prop="waystEvaluation"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.waystEvaluation" placeholder="请填写废旧物资评估" @keyup.native="inputForm.waystEvaluation = twoDecimalPlaces(inputForm.waystEvaluation)"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="固定资产评估(万元)" prop="fixedAssetsEvaluation"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.fixedAssetsEvaluation" placeholder="请填写固定资产评估" @keyup.native="inputForm.fixedAssetsEvaluation = twoDecimalPlaces(inputForm.fixedAssetsEvaluation)"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="净资产评估" prop="netAssetsEvaluation"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.netAssetsEvaluation" placeholder="请填写净资产评估" @keyup.native="inputForm.netAssetsEvaluation = twoDecimalPlaces(inputForm.netAssetsEvaluation)"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="租金评估(万/年)" prop="rentEvaluation"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.rentEvaluation" placeholder="请填写租金评估" @keyup.native="inputForm.rentEvaluation = twoDecimalPlaces(inputForm.rentEvaluation)"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="司法鉴定" prop="forensics"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.forensics" placeholder="请填写司法鉴定"     ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="报告收费(元)" prop="reportCharges"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.reportCharges" placeholder="请填写报告收费" @keyup.native="inputForm.reportCharges = twoDecimalPlaces(inputForm.reportCharges)"></el-input>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item prop="currentDisposePerson" :rules=" [{trigger: 'blur'}]" label="当前处理人">
+              <SelectUserTree
+                ref="companyTree"
+                :props="{
+                    value: 'id',             // ID字段名
+                    label: 'name',         // 显示名称
+                    children: 'children'    // 子级字段名
+                  }"
+                :url="`/sys/user/treeUserDataAllOffice?type=2`"
+                :value="inputForm.currentDisposePerson"
+                :clearable="true"
+                :accordion="true"
+                :disabled="method==='view'"
+                @getValue="(value) => {inputForm.currentDisposePerson=value}"/>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="是否开票" prop="isInvoice"
+                          :rules="[
+                 ]">
+              <el-radio-group v-model="inputForm.isInvoice">
+                <el-radio v-for="item in $dictUtils.getDictList('yes_no')" :label="item.value" :key="item.id">{{item.label}}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="开票日期" prop="invoiceDateUi"
+                          :rules="[
+                 ]">
+              <!--              {required: true, message:'开票日期不能为空', trigger:'blur'}-->
+              <!--              <el-input v-model="inputForm.invoiceDate" placeholder="请填写开票日期"     ></el-input>-->
+              <el-date-picker
+                style="width:100%;"
+                v-model="inputForm.invoiceDateUi"
+                type="datetime"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                placeholder="选择日期时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="预估/实际收费(万元)" prop="actualCharges"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.actualCharges" placeholder="请填写预估/实际收费" @keyup.native="inputForm.actualCharges = twoDecimalPlaces(inputForm.actualCharges)"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="合同是否存档" prop="isContractArchive"
+                          :rules="[
+                 ]">
+              <!--              <el-input v-model="inputForm.isContractArchive" placeholder="请填写合同是否存档"     ></el-input>-->
+              <el-radio-group v-model="inputForm.isContractArchive">
+                <el-radio v-for="item in $dictUtils.getDictList('yes_no')" :label="item.value" :key="item.id">{{item.label}}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="底稿是否完好" prop="isPapersIntact"
+                          :rules="[
+                 ]">
+              <!--              <el-input v-model="inputForm.isPapersIntact" placeholder="请填写底稿是否完好"     ></el-input>-->
+              <el-radio-group v-model="inputForm.isPapersIntact">
+                <el-radio v-for="item in $dictUtils.getDictList('yes_no')" :label="item.value" :key="item.id">{{item.label}}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="底稿是否归档" prop="isPapersArchive"
+                          :rules="[
+                 ]">
+              <!--              <el-input v-model="inputForm.isPapersArchive" placeholder="请填写底稿是否归档"     ></el-input>-->
+              <el-radio-group v-model="inputForm.isPapersArchive">
+                <el-radio v-for="item in $dictUtils.getDictList('yes_no')" :label="item.value" :key="item.id">{{item.label}}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="报销外勤天数" prop="opsAmount"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.opsAmount" placeholder="请填写报销外勤天数" @keyup.native="inputForm.opsAmount = positiveInteger(inputForm.opsAmount)"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="外勤是否已经报销" prop="isOpsReimbursement"
+                          :rules="[
+                 ]">
+              <!--              <el-input v-model="inputForm.isOpsReimbursement" placeholder="请填写外勤是否已经报销"     ></el-input>-->
+              <el-radio-group v-model="inputForm.isOpsReimbursement">
+                <el-radio v-for="item in $dictUtils.getDictList('yes_no')" :label="item.value" :key="item.id">{{item.label}}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="是否已经报销提成" prop="isCommissionReimbursement"
+                          :rules="[
+                 ]">
+              <!--              <el-input v-model="inputForm.isCommissionReimbursement" placeholder="请填写是否已经报销提成"     ></el-input>-->
+              <el-radio-group v-model="inputForm.isCommissionReimbursement">
+                <el-radio v-for="item in $dictUtils.getDictList('yes_no')" :label="item.value" :key="item.id">{{item.label}}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="已报销金额" prop="reimbursementAmount"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.reimbursementAmount" placeholder="请填写已报销金额" @keyup.native="inputForm.reimbursementAmount = twoDecimalPlaces(inputForm.reimbursementAmount)"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="未报销金额" prop="unreimbursedAmount"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.unreimbursedAmount" placeholder="请填写未报销金额" @keyup.native="inputForm.unreimbursedAmount = twoDecimalPlaces(inputForm.unreimbursedAmount)"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="报销单号" prop="reimbursementNum"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.reimbursementNum" placeholder="请填写报销单号"     ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="报销日期" prop="reimbursementDateUi"
+                          :rules="[
+                 ]">
+              <!--              <el-input v-model="inputForm.reimbursementDate" placeholder="请填写报销日期"     ></el-input>-->
+              <el-date-picker
+                style="width:100%;"
+                v-model="inputForm.reimbursementDateUi"
+                type="datetime"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                placeholder="选择日期时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="签字评估师1" prop="evaluationPersonOne"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.evaluationPersonOne" placeholder="请填写签字评估师1"     ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="签字评估师2" prop="evaluationPersonTwo"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.evaluationPersonTwo" placeholder="请填写签字评估师2"     ></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <!--        附件-->
+        <UpLoadComponent ref="uploadComponent"></UpLoadComponent>
+      </el-form>
+      <el-image-viewer
+        v-if="showViewer"
+        :on-close="closeViewer"
+        :url-list="[url]"
+        zIndex="9999"/>
+      <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="doSubmit()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+    </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import ProjectService from '@/api/sys/ProjectService'
+  import SelectUserTree from '@/views/utils/treeUserSelect'
+  import UpLoadComponent from '@/views/common/UpLoadComponent'
+  import OSSSerive from '@/api/sys/OSSService'
+  // import ElImageViewer from 'element-ui/packages/image/src/image-viewer'
+  export default {
+    data () {
+      return {
+        dataList: [],
+        dataListNew: [],
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          permissionFlag: '', // 判断是否为当前登录人参数
+          customerName: '',
+          projectName: '',
+          year: '',
+          evaluationObjective: '',
+          projectType: '',
+          evaluationBaseDate: '',
+          evaluationBaseDateUi: '',
+          evaluationReportDate: '',
+          evaluationReportDateUi: '',
+          protocolNum: '',
+          documentNum: '',
+          projectHead: '',
+          waystEvaluation: '',
+          fixedAssetsEvaluation: '',
+          netAssetsEvaluation: '',
+          rentEvaluation: '',
+          forensics: '',
+          reportCharges: '',
+          currentDisposePerson: '',
+          isInvoice: '',
+          invoiceDate: '',
+          invoiceDateUi: '',
+          actualCharges: '',
+          isContractArchive: '',
+          isPapersIntact: '',
+          isPapersArchive: '',
+          opsAmount: '',
+          isOpsReimbursement: '',
+          reimbursementAmount: '',
+          unreimbursedAmount: '',
+          reimbursementNum: '',
+          reimbursementDate: '',
+          reimbursementDateUi: '',
+          evaluationPersonOne: '',
+          evaluationPersonTwo: '',
+          status: '',
+          assessReportMessage: '',
+          assessBaseMessage: '',
+          invoiceMessage: '',
+          isCommissionReimbursement: '',
+          itemType: '',
+          workAttachments: []
+        },
+        filesArra2: [],
+        fileList: [],
+        isFlag: true,
+        showViewer: false, // 显示查看器
+        url: '',
+        rowurl: '',
+        src: '',
+        showVi: true,
+        loadProgress: 0, // 动态显示进度条
+        progressFlag: false // 关闭进度条
+      }
+    },
+    components: {
+      // ElImageViewer,
+      SelectUserTree,
+      UpLoadComponent
+    },
+    projectService: null,
+    ossService: null,
+    created () {
+      this.ossService = new OSSSerive()
+      this.projectService = new ProjectService()
+    },
+    mounted () {
+    },
+    methods: {
+      // 关闭查看器
+      closeViewer () {
+        this.url = ''
+        this.showViewer = false
+      },
+      async init (method, id) {
+        this.dataList = []
+        this.dataListNew = []
+        await this.ossService.findFileList(id).then(({data}) => {
+          data.forEach((item) => {
+            item.name = item.attachmentName
+            // item.createBy = item.createBy
+            // item.createDate = item.createDate
+            // item.description = item.description
+            this.dataList.push(item)
+            this.dataListNew.push(item)
+          })
+        })
+        this.method = method
+        this.inputForm = {
+          customerName: '',
+          projectName: '',
+          year: '',
+          evaluationObjective: '',
+          projectType: '',
+          evaluationBaseDate: '',
+          evaluationBaseDateUi: '',
+          evaluationReportDate: '',
+          evaluationReportDateUi: '',
+          protocolNum: '',
+          documentNum: '',
+          projectHead: '',
+          waystEvaluation: '',
+          fixedAssetsEvaluation: '',
+          netAssetsEvaluation: '',
+          rentEvaluation: '',
+          forensics: '',
+          reportCharges: '',
+          currentDisposePerson: '',
+          isInvoice: '',
+          invoiceDate: '',
+          invoiceDateUi: '',
+          actualCharges: '',
+          isContractArchive: '',
+          isPapersIntact: '',
+          isPapersArchive: '',
+          opsAmount: '',
+          isOpsReimbursement: '',
+          reimbursementAmount: '',
+          unreimbursedAmount: '',
+          reimbursementNum: '',
+          reimbursementDate: '',
+          reimbursementDateUi: '',
+          evaluationPersonOne: '',
+          evaluationPersonTwo: '',
+          status: '',
+          assessReportMessage: '',
+          assessBaseMessage: '',
+          invoiceMessage: '',
+          isCommissionReimbursement: '',
+          itemType: '',
+          workAttachments: []
+        }
+        this.inputForm.id = id
+        if (method === 'add') {
+          this.inputForm.permissionFlag = true
+          this.title = `新建项目`
+        } else if (method === 'edit') {
+          this.title = '修改项目信息'
+        } else if (method === 'view') {
+          this.showVi = false
+          this.title = '查看项目详情'
+        }
+        this.visible = true
+        this.loading = false
+        this.$nextTick(() => {
+          this.$refs.inputForm.resetFields()
+          if (method === 'edit' || method === 'view') { // 修改或者查看
+            this.loading = true
+            this.projectService.queryById(this.inputForm.id).then(({data}) => {
+              this.inputForm = this.recover(this.inputForm, data)
+              this.inputForm.evaluationBaseDateUi = data.evaluationBaseDate
+              this.inputForm.evaluationReportDateUi = data.evaluationReportDate
+              this.inputForm.invoiceDateUi = data.invoiceDate
+              this.inputForm.reimbursementDateUi = data.reimbursementDate
+              this.inputForm.permissionFlag = data.permissionFlag
+              this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+              this.$refs.uploadComponent.newUpload(method, this.dataListNew, 'projectRecords', 1024)
+              this.loading = false
+            })
+          }
+          if (method !== 'edit' && method !== 'view') {
+            this.$refs.uploadComponent.newUpload(method, [], 'projectRecords', 1024)
+          }
+        })
+      },
+      // 表单提交
+      doSubmit () {
+        if (this.$refs.uploadComponent.checkProgress()) {
+          this.loading = false
+          return
+        }
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            this.inputForm.itemType = '1'
+            this.inputForm.workAttachments = []
+            this.dataListNew = this.$refs.uploadComponent.getDataList()
+            this.dataListNew.forEach((item) => {
+              if (item.id === null || item.id === undefined || item.id === '') {
+                item.url = item.raw.url
+              }
+              item.attachmentFlag = 'projectRecords'
+              item.fileSize = item.size
+              item.attachmentName = item.name
+              item.createBy = null
+              this.inputForm.workAttachments.push(item)
+            })
+            if (this.inputForm.evaluationReportDateUi === null || this.inputForm.evaluationReportDateUi === undefined || this.inputForm.evaluationReportDateUi === '') {
+              this.inputForm.status = '1'
+            } else {
+              this.inputForm.status = '5'
+            }
+            this.projectService.save(this.inputForm).then(({data}) => {
+              this.close()
+              this.$message.success(data)
+              this.$emit('refreshDataList')
+              this.loading = false
+            }).catch(() => {
+              this.loading = false
+            })
+          }
+        })
+      },
+      close () {
+        this.$refs.uploadComponent.clearUpload()
+        this.$refs.inputForm.resetFields()
+        this.showVi = true
+        this.visible = false
+        this.$emit('refreshDataList')
+      },
+      // 排序
+      sortChangeHandle (column) {
+        this.orders = []
+        if (column.order != null) {
+          this.orders.push({column: this.$utils.toLine(column.prop), asc: column.order === 'ascending'})
+        }
+        this.refreshList()
+      },
+      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 > 4) {
+            this.$message.warning(`金额小数点后只能输入四位,请正确输入!`)
+            return (str = '')
+          }
+        }
+        // eslint-disable-next-line no-useless-escape
+        str = str.replace(/[^\d^\.]+/g, '') // 保留数字和小数点
+        return str
+      },
+      positiveInteger (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 no-useless-escape
+        str = str.replace(/[^\d^]+/g, '') // 保留数字
+        return str
+      }
+    }
+  }
+</script>
+<style scoped>
+  .avatar{
+    height: 100px;
+  }
+  .el-divider__text {
+    font-weight: bold;
+    font-size: 16px;
+  }
+</style>

+ 381 - 0
src/views/project/AssessList.vue

@@ -0,0 +1,381 @@
+<template>
+  <div class="page">
+      <el-form :inline="true" class="query-form" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+            <!-- 搜索框-->
+        <el-form-item prop="projectHead" :rules=" [{trigger: 'blur'}]" label="项目负责人">
+          <SelectUserTree
+            ref="companyTree"
+            :props="{
+                  value: 'id',             // ID字段名
+                  label: 'name',         // 显示名称
+                  children: 'children'    // 子级字段名
+                }"
+            :url="`/sys/user/treeUserDataAllOffice?type=2`"
+            :value="searchForm.projectHead"
+            :clearable="true"
+            :accordion="true"
+            @getValue="(value) => {searchForm.projectHead=value}"/>
+        </el-form-item>
+         <el-form-item prop="projectName" label="项目名称">
+                <el-input size="small" v-model="searchForm.projectName" placeholder="项目名称" clearable></el-input>
+         </el-form-item>
+        <el-form-item prop="year" v-if="showHideItem" label="年份">
+          <el-date-picker
+            placement="bottom-start"
+            v-model="searchForm.year"
+            type="year"
+            value-format="yyyy"
+            placeholder="选择年份">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item prop="documentNum" v-if="showHideItem" label="文号">
+          <el-input size="small" v-model="searchForm.documentNum" placeholder="文号" clearable></el-input>
+        </el-form-item>
+        <el-form-item prop="protocolNum" v-if="showHideItem" label="协议号">
+          <el-input size="small" v-model="searchForm.protocolNum" placeholder="协议号" clearable></el-input>
+        </el-form-item>
+        <el-form-item prop="customerName" v-if="showHideItem" label="客户名称">
+          <el-input size="small" v-model="searchForm.customerName" placeholder="客户名称" clearable></el-input>
+        </el-form-item>
+        <el-form-item prop="fileUploadType" v-if="showHideItem" label="上传状态">
+          <el-select v-model="searchForm.fileUploadType" placeholder="请选择上传状态" style="width:100%;">
+            <el-option
+              v-for="item in $dictUtils.getDictList('file_upload_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" size="small" :icon="showHideIcon">{{showHideName}}</el-button>
+            <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">
+        <vxe-toolbar :refresh="{query: refreshList}" import export print custom>
+          <template #buttons>
+            <el-button v-if="hasPermission('sys:project:add')" type="primary" size="small" icon="el-icon-plus" @click="add()">新建</el-button>
+<!--            <el-button v-if="hasPermission('sys:post:edit')" type="warning" size="small" icon="el-icon-edit-outline" @click="edit()" :disabled="$refs.projectTable && $refs.projectTable.getCheckboxRecords().length !== 1" plain>修改</el-button>-->
+            <el-button v-if="hasPermission('sys:project:del')" type="danger"   size="small" icon="el-icon-delete" @click="del()" :disabled="$refs.projectTable && $refs.projectTable.getCheckboxRecords().length === 0" plain>删除</el-button>
+            <el-button v-if="hasPermission('sys:project:import')"  type="default" @click="downloadTpl()" size="small">项目模板</el-button>
+            <el-button v-if="hasPermission('sys:project:exportFile')"  type="warning" plain @click="downloadFile()" size="small">完成比例</el-button>
+            <span style="margin-left:20px;color: #999999">文件上传比例 {{proport}}</span>
+          </template>
+        </vxe-toolbar>
+        <div style="height: calc(100% - 80px);">
+            <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="{}"
+                :print-config="{}"
+                :export-config="{
+                    remote: true,
+                    filename: `评估项目数据${moment(new Date()).format('YYYY-MM-DD')}`,
+                    sheetName: '评估项目数据',
+                    exportMethod: exportMethod,
+                    types: ['xlsx'],
+                    modes: ['current', 'selected', 'all']
+                  }"
+                @sort-change="sortChangeHandle"
+                :sort-config="{remote:true}"
+                :data="dataList"
+                :import-config="{
+                    importMethod: importMethod,
+                    types: ['xls', 'xlsx'],
+                    remote: true}"
+                :checkbox-config="{}">
+                <vxe-column type="seq" width="60" title="序号"></vxe-column>
+                <vxe-column type="checkbox"  width="40px"></vxe-column>
+                <vxe-column width="400px"  title="项目名称" field="projectName">
+                    <template #default="scope">
+                        <el-link  type="primary" :underline="false" v-if="hasPermission('sys:project:edit')" @click="view(scope.row.id)">{{scope.row.projectName}}</el-link>
+                        <el-link  type="primary" :underline="false" v-else-if="hasPermission('sys:project:view')"  @click="view(scope.row.id)">{{scope.row.projectName}}</el-link>
+                        <span v-else>{{scope.row.projectName}}</span>
+                    </template>
+                </vxe-column>
+                <vxe-column width="80px"  title="年份" field="year" > </vxe-column>
+                <vxe-column width="200px"  title="文号" field="documentNum" > </vxe-column>
+                <vxe-column width="110px"  title="协议号" field="protocolNum" > </vxe-column>
+                <vxe-column width="200px"  title="客户名称" field="customerName" > </vxe-column>
+                <vxe-column width="100px"  title="报告收费(元)" field="reportCharges" > </vxe-column>
+                <vxe-column width="110px" title="合同是否存档" field="isContractArchive" >
+                  <template #default="scope">
+                    {{ $dictUtils.getDictLabel("yes_no", scope.row.isContractArchive, '-') }}
+                  </template>
+                </vxe-column>
+                <vxe-column width="110px" title="底稿是否完好" field="isPapersIntact" >
+                  <template #default="scope">
+                    {{ $dictUtils.getDictLabel("yes_no", scope.row.isPapersIntact, '-') }}
+                  </template>
+                </vxe-column>
+                <vxe-column width="130px"  title="是否已经报销提成" field="isCommissionReimbursement" >
+                  <template #default="scope">
+                    {{ $dictUtils.getDictLabel("yes_no", scope.row.isCommissionReimbursement, '-') }}
+                  </template>
+                </vxe-column>
+                <vxe-column width="110px"  title="项目负责人" field="projectHead" > </vxe-column>
+                <vxe-column width="130px"  title="评估报告日" field="evaluationReportDate" >
+                  <template #default="scope">
+                    {{moment(scope.row.evaluationReportDate).format('YYYY-MM-DD')}}
+                  </template>
+                </vxe-column>
+                <vxe-column width="130px"  title="开票日期" field="invoiceDate" >
+                  <template #default="scope">
+                    {{moment(scope.row.invoiceDate).format('YYYY-MM-DD')}}
+                  </template></vxe-column>
+                <vxe-column width="50px"   title="状态" field="status" >
+                  <template #default="scope">
+                    {{ $dictUtils.getDictLabel("project_status", scope.row.status, '-') }}
+                  </template>
+                </vxe-column>
+                <vxe-column width="80px"   title="上传状态" field="fileUploadType" >
+                  <template #default="scope">
+                    {{ $dictUtils.getDictLabel("file_upload_type", scope.row.fileUploadType, '-') }}
+                  </template>
+                </vxe-column>
+
+
+                <!--<vxe-column  title="是否可用" field="status" sortable>
+                  <template slot-scope="scope">
+                    <el-tag v-if="scope.row.status==='1'" type="primary">
+                      {{ $dictUtils.getDictLabel("yes_no", scope.row.status, '-') }}
+                    </el-tag>
+                    <el-tag v-else type="danger">
+                      {{ $dictUtils.getDictLabel("yes_no", scope.row.status, '-') }}
+                    </el-tag>
+                  </template>
+                </vxe-column>-->
+                <vxe-column title="操作" width="200px" fixed="right" align="center">
+                    <template  #default="scope">
+                      <el-button v-if="hasPermission('sys:project:view')" type="text" icon="el-icon-view" size="small" @click="view(scope.row.id)">查看</el-button>
+                      <el-button v-if="hasPermission('sys:project:edit') && scope.row.permissionFlag" type="text" icon="el-icon-edit" size="small" @click="edit(scope.row.id)">修改</el-button>
+                      <el-button v-if="hasPermission('sys:project:del') && scope.row.permissionFlag" type="text"  icon="el-icon-delete" 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>
+        <!-- 弹窗, 新增 / 修改 -->
+    <AssessForm  ref="assessForm" @refreshDataList="refreshList"></AssessForm>
+  </div>
+</template>
+
+<script>
+  import AssessForm from './AssessForm'
+  import SelectUserTree from '@/views/utils/treeUserSelect'
+  import ProjectService from '@/api/sys/ProjectService'
+  export default {
+    data () {
+      return {
+        showHideItem: false,
+        showHideIcon: 'el-icon-arrow-down',
+        showHideName: '展示',
+        searchForm: {
+          customerName: '',
+          year: '',
+          projectName: '',
+          projectHead: '',
+          fileUploadType: ''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        loading: false,
+        proport: ''
+      }
+    },
+    projectService: null,
+    created () {
+      this.projectService = new ProjectService()
+    },
+    components: {
+      AssessForm,
+      SelectUserTree
+    },
+    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 = '展示'
+        }
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        this.projectService.proportion({
+          'itemType': '1',
+          ...this.searchForm
+        }).then((data) => {
+          this.proport = data
+        })
+        this.projectService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          'itemType': '1',
+          ...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.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()
+      },
+      // 新增
+      add () {
+        this.$refs.assessForm.init('add', '')
+      },
+      // 修改
+      edit (id) {
+        id = id || this.$refs.projectTable.getCheckboxRecords().map(item => {
+          return item.id
+        })[0]
+        this.$refs.assessForm.init('edit', id)
+      },
+      // 查看
+      view (id) {
+        this.$refs.assessForm.init('view', id)
+      },
+      // 删除
+      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.projectService.delete(ids).then(({data}) => {
+            this.$message.success(data)
+            this.refreshList()
+            this.loading = false
+          })
+        })
+      },
+      importMethod ({ file }) {
+        // 处理表单
+        const formBody = new FormData()
+        formBody.append('file', file)
+        this.loading = true
+        this.projectService.importExcel(formBody).then(result => {
+          this.$message.success(result.data)
+          this.refreshList()
+        }).catch(() => {
+          this.refreshList()
+          this.loading = false
+        })
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      },
+      // 下载模板
+      downloadTpl () {
+        // this.$utils.downloadExcel('/sys/project/import/template')
+        this.loading = true
+        this.projectService.exportTemplate().then((res) => {
+          // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(res.data, '项目导入模板')
+          this.loading = false
+        }).catch(function (err) {
+          this.loading = false
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      },
+      // 下载文档
+      downloadFile () {
+        this.loading = true
+        this.projectService.fileUploadList({
+          'itemType': '1',
+          ...this.searchForm
+        }).then((res) => {
+          // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(res.data, '评估项目上传比例报告')
+          this.loading = false
+        }).catch(function (err) {
+          this.loading = false
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      },
+      // 自定义服务端导出
+      exportMethod ({ options }) {
+        // 传给服务端的参数
+        const params = {
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          'itemType': '1',
+          ...this.searchForm,
+          filename: options.filename,
+          sheetName: options.sheetName,
+          isHeader: options.isHeader,
+          original: options.original,
+          mode: options.mode,
+          selectIds: options.mode === 'selected' ? options.data.map(item => item.id) : [],
+          exportFields: options.columns.map(column => column.property)
+        }
+        return this.projectService.exportExcel(params).then((res) => {
+          // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(res.data, options.filename)
+        }).catch(function (err) {
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      }
+    }
+  }
+</script>

+ 652 - 0
src/views/project/ConsultationForm.vue

@@ -0,0 +1,652 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      width="800px"
+      @close="close"
+      @keyup.enter.native="doSubmit"
+      :visible.sync="visible">
+      <el-form size="middle"
+               :model="inputForm"
+               ref="inputForm"
+               :class="method==='view'?'readonly':''"
+               :disabled="method==='view'"
+               v-loading="loading"
+               label-width="150px">
+        <el-row  :gutter="15">
+          <el-col :span="12">
+            <el-form-item label="客户名称" prop="customerName"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.customerName" placeholder="请填写客户名称"     ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="项目名称" prop="projectName"
+                          :rules="[
+                  {required: true, message:'项目名称不能为空', trigger:'blur'}
+                 ]">
+              <el-input v-model="inputForm.projectName" placeholder="请填写项目名称"     ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="年份" prop="year"
+                          :rules="[
+                  {required: true, message:'年份不能为空', trigger:'blur'}
+                 ]">
+              <el-input v-model="inputForm.year" placeholder="请填写年份"     ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="评估目的" prop="evaluationObjective"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.evaluationObjective" placeholder="请填写评估目的"     ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="项目类型" prop="projectType"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.projectType" placeholder="请填写项目类型"     ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="评估基准日" prop="evaluationBaseDateUi"
+                          :rules="[
+
+                 ]">
+<!--              {required: true, message:'评估基准日不能为空', trigger:'blur'}-->
+<!--              <el-input v-model="inputForm.evaluationBaseDate" placeholder="请填写评估基准日"     ></el-input>-->
+              <el-date-picker
+                style="width:100%;"
+                v-model="inputForm.evaluationBaseDateUi"
+                type="datetime"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                placeholder="选择日期时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="评估报告日" prop="evaluationReportDateUi"
+                          :rules="[
+
+                 ]">
+<!--              {required: true, message:'评估报告日不能为空', trigger:'blur'}-->
+<!--              <el-input v-model="inputForm.evaluationReportDate" placeholder="请填写评估报告日"     ></el-input>-->
+              <el-date-picker
+                style="width:100%;"
+                v-model="inputForm.evaluationReportDateUi"
+                type="datetime"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                placeholder="选择日期时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="协议号" prop="protocolNum"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.protocolNum" placeholder="请填写协议号"     ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="文号" prop="documentNum"
+                          :rules="[
+                  {required: true, message:'文号不能为空', trigger:'blur'}
+                 ]">
+              <el-input v-model="inputForm.documentNum" placeholder="请填写文号"     ></el-input>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item prop="projectHead" :rules=" [{required: true, message: '项目负责人不能为空', trigger: 'blur'}]" label="项目负责人">
+              <SelectUserTree
+                ref="companyTree"
+                :props="{
+                    value: 'id',             // ID字段名
+                    label: 'name',         // 显示名称
+                    children: 'children'    // 子级字段名
+                  }"
+                :url="`/sys/user/treeUserDataAllOffice?type=2`"
+                :value="inputForm.projectHead"
+                :clearable="true"
+                :accordion="true"
+                :disabled="method==='view'"
+                @getValue="(value) => {inputForm.projectHead=value}"/>
+            </el-form-item>
+          </el-col>
+
+
+          <el-col :span="12">
+            <el-form-item label="废旧物资评估(万元)" prop="waystEvaluation"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.waystEvaluation" placeholder="请填写废旧物资评估" @keyup.native="inputForm.waystEvaluation = twoDecimalPlaces(inputForm.waystEvaluation)"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="固定资产评估(万元)" prop="fixedAssetsEvaluation"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.fixedAssetsEvaluation" placeholder="请填写固定资产评估" @keyup.native="inputForm.fixedAssetsEvaluation = twoDecimalPlaces(inputForm.fixedAssetsEvaluation)"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="净资产评估" prop="netAssetsEvaluation"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.netAssetsEvaluation" placeholder="请填写净资产评估" @keyup.native="inputForm.netAssetsEvaluation = twoDecimalPlaces(inputForm.netAssetsEvaluation)"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="租金评估(万/年)" prop="rentEvaluation"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.rentEvaluation" placeholder="请填写租金评估" @keyup.native="inputForm.rentEvaluation = twoDecimalPlaces(inputForm.rentEvaluation)"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="司法鉴定" prop="forensics"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.forensics" placeholder="请填写司法鉴定"     ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="报告收费(元)" prop="reportCharges"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.reportCharges" placeholder="请填写报告收费" @keyup.native="inputForm.reportCharges = twoDecimalPlaces(inputForm.reportCharges)"></el-input>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item prop="currentDisposePerson" :rules=" [{trigger: 'blur'}]" label="当前处理人">
+              <SelectUserTree
+                ref="companyTree"
+                :props="{
+                    value: 'id',             // ID字段名
+                    label: 'name',         // 显示名称
+                    children: 'children'    // 子级字段名
+                  }"
+                :url="`/sys/user/treeUserDataAllOffice?type=2`"
+                :value="inputForm.currentDisposePerson"
+                :clearable="true"
+                :accordion="true"
+                :disabled="method==='view'"
+                @getValue="(value) => {inputForm.currentDisposePerson=value}"/>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="是否开票" prop="isInvoice"
+                          :rules="[
+                 ]">
+              <el-radio-group v-model="inputForm.isInvoice">
+                <el-radio v-for="item in $dictUtils.getDictList('yes_no')" :label="item.value" :key="item.id">{{item.label}}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="开票日期" prop="invoiceDateUi"
+                          :rules="[
+                 ]">
+<!--              {required: true, message:'开票日期不能为空', trigger:'blur'}-->
+              <!--              <el-input v-model="inputForm.invoiceDate" placeholder="请填写开票日期"     ></el-input>-->
+              <el-date-picker
+                style="width:100%;"
+                v-model="inputForm.invoiceDateUi"
+                type="datetime"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                placeholder="选择日期时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="预估/实际收费(万元)" prop="actualCharges"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.actualCharges" placeholder="请填写预估/实际收费" @keyup.native="inputForm.actualCharges = twoDecimalPlaces(inputForm.actualCharges)"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="合同是否存档" prop="isContractArchive"
+                          :rules="[
+                 ]">
+<!--              <el-input v-model="inputForm.isContractArchive" placeholder="请填写合同是否存档"     ></el-input>-->
+              <el-radio-group v-model="inputForm.isContractArchive">
+                <el-radio v-for="item in $dictUtils.getDictList('yes_no')" :label="item.value" :key="item.id">{{item.label}}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="底稿是否完好" prop="isPapersIntact"
+                          :rules="[
+                 ]">
+<!--              <el-input v-model="inputForm.isPapersIntact" placeholder="请填写底稿是否完好"     ></el-input>-->
+              <el-radio-group v-model="inputForm.isPapersIntact">
+                <el-radio v-for="item in $dictUtils.getDictList('yes_no')" :label="item.value" :key="item.id">{{item.label}}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="底稿是否归档" prop="isPapersArchive"
+                          :rules="[
+                 ]">
+<!--              <el-input v-model="inputForm.isPapersArchive" placeholder="请填写底稿是否归档"     ></el-input>-->
+              <el-radio-group v-model="inputForm.isPapersArchive">
+                <el-radio v-for="item in $dictUtils.getDictList('yes_no')" :label="item.value" :key="item.id">{{item.label}}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="报销外勤天数" prop="opsAmount"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.opsAmount" placeholder="请填写报销外勤天数" @keyup.native="inputForm.opsAmount = positiveInteger(inputForm.opsAmount)"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="外勤是否已经报销" prop="isOpsReimbursement"
+                          :rules="[
+                 ]">
+<!--              <el-input v-model="inputForm.isOpsReimbursement" placeholder="请填写外勤是否已经报销"     ></el-input>-->
+              <el-radio-group v-model="inputForm.isOpsReimbursement">
+                <el-radio v-for="item in $dictUtils.getDictList('yes_no')" :label="item.value" :key="item.id">{{item.label}}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="是否已经报销提成" prop="isCommissionReimbursement"
+                          :rules="[
+                 ]">
+<!--              <el-input v-model="inputForm.isCommissionReimbursement" placeholder="请填写是否已经报销提成"     ></el-input>-->
+              <el-radio-group v-model="inputForm.isCommissionReimbursement">
+                <el-radio v-for="item in $dictUtils.getDictList('yes_no')" :label="item.value" :key="item.id">{{item.label}}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="已报销金额" prop="reimbursementAmount"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.reimbursementAmount" placeholder="请填写已报销金额" @keyup.native="inputForm.reimbursementAmount = twoDecimalPlaces(inputForm.reimbursementAmount)"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="未报销金额" prop="unreimbursedAmount"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.unreimbursedAmount" placeholder="请填写未报销金额" @keyup.native="inputForm.unreimbursedAmount = twoDecimalPlaces(inputForm.unreimbursedAmount)"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="报销单号" prop="reimbursementNum"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.reimbursementNum" placeholder="请填写报销单号"     ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="报销日期" prop="reimbursementDateUi"
+                          :rules="[
+                 ]">
+<!--              <el-input v-model="inputForm.reimbursementDate" placeholder="请填写报销日期"     ></el-input>-->
+              <el-date-picker
+                style="width:100%;"
+                v-model="inputForm.reimbursementDateUi"
+                type="datetime"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                placeholder="选择日期时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="签字评估师1" prop="evaluationPersonOne"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.evaluationPersonOne" placeholder="请填写签字评估师1"     ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="签字评估师2" prop="evaluationPersonTwo"
+                          :rules="[
+                 ]">
+              <el-input v-model="inputForm.evaluationPersonTwo" placeholder="请填写签字评估师2"     ></el-input>
+            </el-form-item>
+          </el-col>
+
+          <!--<el-col :span="12">
+            <el-form-item label="项目状态" prop="status"
+                          :rules="[
+                 ]">
+&lt;!&ndash;              <el-input v-model="inputForm.status" placeholder="请填写项目状态"     ></el-input>&ndash;&gt;
+              <el-select v-model="inputForm.status" placeholder="请选择" style="width:100%;">
+                <el-option
+                  v-for="item in $dictUtils.getDictList('project_status')"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>-->
+
+        </el-row>
+        <!--        附件-->
+        <UpLoadComponent ref="uploadComponent"></UpLoadComponent>
+
+      </el-form>
+      <el-image-viewer
+        v-if="showViewer"
+        :on-close="closeViewer"
+        :url-list="[url]"
+        zIndex="9999"/>
+      <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="doSubmit()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+    </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import ProjectService from '@/api/sys/ProjectService'
+  import SelectUserTree from '@/views/utils/treeUserSelect'
+  import UpLoadComponent from '@/views/common/UpLoadComponent'
+  import OSSSerive from '@/api/sys/OSSService'
+  import ElImageViewer from 'element-ui/packages/image/src/image-viewer'
+  export default {
+    data () {
+      return {
+        dataList: [],
+        dataListNew: [],
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          permissionFlag: '', // 判断是否为当前登录人参数
+          customerName: '',
+          projectName: '',
+          year: '',
+          evaluationObjective: '',
+          projectType: '',
+          evaluationBaseDate: '',
+          evaluationBaseDateUi: '',
+          evaluationReportDate: '',
+          evaluationReportDateUi: '',
+          protocolNum: '',
+          documentNum: '',
+          projectHead: '',
+          waystEvaluation: '',
+          fixedAssetsEvaluation: '',
+          netAssetsEvaluation: '',
+          rentEvaluation: '',
+          forensics: '',
+          reportCharges: '',
+          currentDisposePerson: '',
+          isInvoice: '',
+          invoiceDate: '',
+          invoiceDateUi: '',
+          actualCharges: '',
+          isContractArchive: '',
+          isPapersIntact: '',
+          isPapersArchive: '',
+          opsAmount: '',
+          isOpsReimbursement: '',
+          reimbursementAmount: '',
+          unreimbursedAmount: '',
+          reimbursementNum: '',
+          reimbursementDate: '',
+          reimbursementDateUi: '',
+          evaluationPersonOne: '',
+          evaluationPersonTwo: '',
+          status: '',
+          assessReportMessage: '',
+          assessBaseMessage: '',
+          invoiceMessage: '',
+          isCommissionReimbursement: '',
+          itemType: '',
+          workAttachments: []
+        },
+        filesArra2: [],
+        fileList: [],
+        isFlag: true,
+        showViewer: false, // 显示查看器
+        url: '',
+        rowurl: '',
+        src: '',
+        showVi: true,
+        loadProgress: 0, // 动态显示进度条
+        progressFlag: false // 关闭进度条
+      }
+    },
+    components: {
+      ElImageViewer,
+      SelectUserTree,
+      UpLoadComponent
+    },
+    projectService: null,
+    ossService: null,
+    created () {
+      this.ossService = new OSSSerive()
+      this.projectService = new ProjectService()
+    },
+    mounted () {
+    },
+    methods: {
+      // 关闭查看器
+      closeViewer () {
+        this.url = ''
+        this.showViewer = false
+      },
+      async init (method, id) {
+        this.dataList = []
+        this.dataListNew = []
+        await this.ossService.findFileList(id).then(({data}) => {
+          data.forEach((item) => {
+            item.name = item.attachmentName
+            // item.createBy = item.createBy
+            // item.createDate = item.createDate
+            // item.description = item.description
+            this.dataList.push(item)
+            this.dataListNew.push(item)
+          })
+        })
+        this.method = method
+        this.inputForm = {
+          customerName: '',
+          projectName: '',
+          year: '',
+          evaluationObjective: '',
+          projectType: '',
+          evaluationBaseDate: '',
+          evaluationBaseDateUi: '',
+          evaluationReportDate: '',
+          evaluationReportDateUi: '',
+          protocolNum: '',
+          documentNum: '',
+          projectHead: '',
+          waystEvaluation: '',
+          fixedAssetsEvaluation: '',
+          netAssetsEvaluation: '',
+          rentEvaluation: '',
+          forensics: '',
+          reportCharges: '',
+          currentDisposePerson: '',
+          isInvoice: '',
+          invoiceDate: '',
+          invoiceDateUi: '',
+          actualCharges: '',
+          isContractArchive: '',
+          isPapersIntact: '',
+          isPapersArchive: '',
+          opsAmount: '',
+          isOpsReimbursement: '',
+          reimbursementAmount: '',
+          unreimbursedAmount: '',
+          reimbursementNum: '',
+          reimbursementDate: '',
+          reimbursementDateUi: '',
+          evaluationPersonOne: '',
+          evaluationPersonTwo: '',
+          status: '',
+          assessReportMessage: '',
+          assessBaseMessage: '',
+          invoiceMessage: '',
+          isCommissionReimbursement: '',
+          itemType: ''
+        }
+        this.inputForm.id = id
+        if (method === 'add') {
+          this.inputForm.permissionFlag = true
+          this.title = `新建项目`
+        } else if (method === 'edit') {
+          this.title = '修改项目信息'
+        } else if (method === 'view') {
+          this.showVi = false
+          this.title = '查看项目详情'
+        }
+        this.visible = true
+        this.loading = false
+        this.$nextTick(() => {
+          this.$refs.inputForm.resetFields()
+          if (method === 'edit' || method === 'view') { // 修改或者查看
+            this.loading = true
+            this.projectService.queryById(this.inputForm.id).then(({data}) => {
+              this.inputForm = this.recover(this.inputForm, data)
+              this.inputForm.evaluationBaseDateUi = data.evaluationBaseDate
+              this.inputForm.evaluationReportDateUi = data.evaluationReportDate
+              this.inputForm.invoiceDateUi = data.invoiceDate
+              this.inputForm.reimbursementDateUi = data.reimbursementDate
+              this.inputForm.permissionFlag = data.permissionFlag
+              this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+              this.$refs.uploadComponent.newUpload(method, this.dataListNew, 'projectRecords', 1024)
+              this.loading = false
+            })
+          }
+          if (method !== 'edit' && method !== 'view') {
+            this.$refs.uploadComponent.newUpload(method, [], 'projectRecords', 1024)
+          }
+        })
+      },
+      // 表单提交
+      doSubmit () {
+        if (this.$refs.uploadComponent.checkProgress()) {
+          this.loading = false
+          return
+        }
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            this.inputForm.itemType = '2'
+            this.inputForm.workAttachments = []
+            this.dataListNew = this.$refs.uploadComponent.getDataList()
+            this.dataListNew.forEach((item) => {
+              if (item.id === null || item.id === undefined || item.id === '') {
+                item.url = item.raw.url
+              }
+              item.attachmentFlag = 'projectRecords'
+              item.fileSize = item.size
+              item.attachmentName = item.name
+              item.createBy = null
+              this.inputForm.workAttachments.push(item)
+            })
+            if (this.inputForm.evaluationReportDateUi === null || this.inputForm.evaluationReportDateUi === undefined || this.inputForm.evaluationReportDateUi === '') {
+              this.inputForm.status = '1'
+            } else {
+              this.inputForm.status = '5'
+            }
+            this.projectService.save(this.inputForm).then(({data}) => {
+              this.close()
+              this.$message.success(data)
+              this.$emit('refreshDataList')
+              this.loading = false
+            }).catch(() => {
+              this.loading = false
+            })
+          }
+        })
+      },
+      close () {
+        this.$refs.uploadComponent.clearUpload()
+        this.$refs.inputForm.resetFields()
+        this.visible = false
+        this.showVi = true
+        this.$emit('refreshDataList')
+      },
+      // 排序
+      sortChangeHandle (column) {
+        this.orders = []
+        if (column.order != null) {
+          this.orders.push({column: this.$utils.toLine(column.prop), asc: column.order === 'ascending'})
+        }
+        this.refreshList()
+      },
+      deleteMsgById (row, index) {
+        this.dataListNew.splice(index, 1)
+        if (row.id !== null && row.id !== '' && row.id !== undefined) {
+          this.ossService.deleteMsgById(row.id)
+        }
+      },
+      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 > 4) {
+            this.$message.warning(`金额小数点后只能输入四位,请正确输入!`)
+            return (str = '')
+          }
+        }
+        // eslint-disable-next-line no-useless-escape
+        str = str.replace(/[^\d^\.]+/g, '') // 保留数字和小数点
+        return str
+      },
+      positiveInteger (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 no-useless-escape
+        str = str.replace(/[^\d^]+/g, '') // 保留数字
+        return str
+      }
+    }
+  }
+</script>
+<style scoped>
+  .avatar{
+    height: 100px;
+  }
+  .el-divider__text {
+    font-weight: bold;
+    font-size: 16px;
+  }
+</style>

+ 382 - 0
src/views/project/ConsultationList.vue

@@ -0,0 +1,382 @@
+<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 prop="projectHead" :rules=" [{trigger: 'blur'}]" label="项目负责人">
+          <SelectUserTree
+            ref="companyTree"
+            :props="{
+                  value: 'id',             // ID字段名
+                  label: 'name',         // 显示名称
+                  children: 'children'    // 子级字段名
+                }"
+            :url="`/sys/user/treeUserDataAllOffice?type=2`"
+            :value="searchForm.projectHead"
+            :clearable="true"
+            :accordion="true"
+            @getValue="(value) => {searchForm.projectHead=value}"/>
+        </el-form-item>
+         <el-form-item prop="projectName">
+                <el-input size="small" v-model="searchForm.projectName" placeholder="项目名称" clearable></el-input>
+         </el-form-item>
+        <el-form-item v-if="showHideItem" prop="year">
+          <el-date-picker
+            placement="bottom-start"
+            v-model="searchForm.year"
+            type="year"
+            value-format="yyyy"
+            placeholder="选择年份">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item v-if="showHideItem" prop="documentNum">
+          <el-input size="small" v-model="searchForm.documentNum" placeholder="文号" clearable></el-input>
+        </el-form-item>
+        <el-form-item v-if="showHideItem" prop="protocolNum">
+          <el-input size="small" v-model="searchForm.protocolNum" placeholder="协议号" clearable></el-input>
+        </el-form-item>
+        <el-form-item v-if="showHideItem" prop="customerName">
+          <el-input size="small" v-model="searchForm.customerName" placeholder="客户名称" clearable></el-input>
+        </el-form-item>
+        <el-form-item v-if="showHideItem" prop="fileUploadType">
+          <el-select v-model="searchForm.fileUploadType" placeholder="请选择上传状态" style="width:100%;">
+            <el-option
+              v-for="item in $dictUtils.getDictList('file_upload_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" size="small" :icon="showHideIcon">{{showHideName}}</el-button>
+            <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">
+        <vxe-toolbar :refresh="{query: refreshList}" import export print custom>
+          <template #buttons>
+            <el-button v-if="hasPermission('sys:project:add')" type="primary" size="small" icon="el-icon-plus" @click="add()">新建</el-button>
+<!--            <el-button v-if="hasPermission('sys:post:edit')" type="warning" size="small" icon="el-icon-edit-outline" @click="edit()" :disabled="$refs.projectTable && $refs.projectTable.getCheckboxRecords().length !== 1" plain>修改</el-button>-->
+            <el-button v-if="hasPermission('sys:project:del')" type="danger"   size="small" icon="el-icon-delete" @click="del()" :disabled="$refs.projectTable && $refs.projectTable.getCheckboxRecords().length === 0" plain>删除</el-button>
+            <el-button v-if="hasPermission('sys:project:import')"  type="default" @click="downloadTpl()" size="small">项目模板</el-button>
+            <el-button v-if="hasPermission('sys:project:exportFile')"  type="warning" plain @click="downloadFile()" size="small">完成比例</el-button>
+            <span style="margin-left:20px;color: #999999">文件上传比例 {{proport}}</span>
+          </template>
+        </vxe-toolbar>
+        <div style="height: calc(100% - 80px);">
+            <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="{}"
+                :print-config="{}"
+                :export-config="{
+                    remote: true,
+                    filename: `评估项目数据${moment(new Date()).format('YYYY-MM-DD')}`,
+                    sheetName: '评估项目数据',
+                    exportMethod: exportMethod,
+                    types: ['xlsx'],
+                    modes: ['current', 'selected', 'all']
+                  }"
+                @sort-change="sortChangeHandle"
+                :sort-config="{remote:true}"
+                :data="dataList"
+                :import-config="{
+                    importMethod: importMethod,
+                    types: ['xls', 'xlsx'],
+                    remote: true}"
+                :checkbox-config="{}">
+                <vxe-column type="seq" width="60" title="序号"></vxe-column>
+                <vxe-column type="checkbox"  width="40px"></vxe-column>
+              <vxe-column width="400px"  title="项目名称" field="projectName">
+                <template slot-scope="scope">
+                  <el-link  type="primary" :underline="false" v-if="hasPermission('sys:project:edit')" @click="view(scope.row.id)">{{scope.row.projectName}}</el-link>
+                  <el-link  type="primary" :underline="false" v-else-if="hasPermission('sys:project:view')"  @click="view(scope.row.id)">{{scope.row.projectName}}</el-link>
+                  <span v-else>{{scope.row.projectName}}</span>
+                </template>
+              </vxe-column>
+              <vxe-column width="80px"  title="年份" field="year" > </vxe-column>
+              <vxe-column width="200px"  title="文号" field="documentNum" > </vxe-column>
+              <vxe-column width="110px"  title="协议号" field="protocolNum" > </vxe-column>
+              <vxe-column width="200px"  title="客户名称" field="customerName" > </vxe-column>
+              <vxe-column width="100px"  title="报告收费(元)" field="reportCharges" > </vxe-column>
+              <vxe-column width="110px" title="合同是否存档" field="isContractArchive" >
+                <template slot-scope="scope">
+                  {{ $dictUtils.getDictLabel("yes_no", scope.row.isContractArchive, '-') }}
+                </template>
+              </vxe-column>
+              <vxe-column width="110px" title="底稿是否完好" field="isPapersIntact" >
+                <template slot-scope="scope">
+                  {{ $dictUtils.getDictLabel("yes_no", scope.row.isPapersIntact, '-') }}
+                </template>
+              </vxe-column>
+              <vxe-column width="130px"  title="是否已经报销提成" field="isCommissionReimbursement" >
+                <template slot-scope="scope">
+                  {{ $dictUtils.getDictLabel("yes_no", scope.row.isCommissionReimbursement, '-') }}
+                </template>
+              </vxe-column>
+              <vxe-column width="110px"  title="项目负责人" field="projectHead" > </vxe-column>
+              <vxe-column width="130px"  title="评估报告日" field="evaluationReportDate" >
+                <template slot-scope="scope">
+                  {{moment(scope.row.evaluationReportDate).format('YYYY-MM-DD')}}
+                </template>
+              </vxe-column>
+              <vxe-column width="130px"  title="开票日期" field="invoiceDate" >
+                <template slot-scope="scope">
+                  {{moment(scope.row.invoiceDate).format('YYYY-MM-DD')}}
+                </template>
+              </vxe-column>
+              <vxe-column width="50px"   title="状态" field="status" >
+                <template slot-scope="scope">
+                  {{ $dictUtils.getDictLabel("project_status", scope.row.status, '-') }}
+                </template>
+              </vxe-column>
+              <vxe-column width="80px"   title="上传状态" field="fileUploadType" >
+                <template slot-scope="scope">
+                  {{ $dictUtils.getDictLabel("file_upload_type", scope.row.fileUploadType, '-') }}
+                </template>
+              </vxe-column>
+
+
+                <!--<vxe-column  title="是否可用" field="status" sortable>
+                  <template slot-scope="scope">
+                    <el-tag v-if="scope.row.status==='1'" type="primary">
+                      {{ $dictUtils.getDictLabel("yes_no", scope.row.status, '-') }}
+                    </el-tag>
+                    <el-tag v-else type="danger">
+                      {{ $dictUtils.getDictLabel("yes_no", scope.row.status, '-') }}
+                    </el-tag>
+                  </template>
+                </vxe-column>-->
+                <vxe-column title="操作" width="200px" fixed="right" align="center">
+                    <template  slot-scope="scope">
+                      <el-button v-if="hasPermission('sys:project:view')" type="text" icon="el-icon-view" size="small" @click="view(scope.row.id)">查看</el-button>
+                      <el-button v-if="hasPermission('sys:project:edit') && scope.row.permissionFlag" type="text" icon="el-icon-edit" size="small" @click="edit(scope.row.id)">修改</el-button>
+                      <el-button v-if="hasPermission('sys:project:del') && scope.row.permissionFlag" type="text"  icon="el-icon-delete" 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>
+        <!-- 弹窗, 新增 / 修改 -->
+    <ConsultationForm  ref="consultationForm" @refreshDataList="refreshList"></ConsultationForm>
+  </div>
+</template>
+
+<script>
+  import ConsultationForm from './ConsultationForm'
+  import SelectUserTree from '@/views/utils/treeUserSelect'
+  import ProjectService from '@/api/sys/ProjectService'
+  export default {
+    data () {
+      return {
+        showHideItem: false,
+        showHideIcon: 'el-icon-arrow-down',
+        showHideName: '展示',
+        searchForm: {
+          customerName: '',
+          projectName: '',
+          year: '',
+          projectHead: '',
+          fileUploadType: ''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        loading: false,
+        proport: ''
+      }
+    },
+    projectService: null,
+    created () {
+      this.projectService = new ProjectService()
+    },
+    components: {
+      ConsultationForm,
+      SelectUserTree
+    },
+    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 = '展示'
+        }
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        this.projectService.proportion({
+          'itemType': '2',
+          ...this.searchForm
+        }).then(({data}) => {
+          this.proport = data
+        })
+        this.projectService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          'itemType': '2',
+          ...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.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()
+      },
+      // 新增
+      add () {
+        this.$refs.consultationForm.init('add', '')
+      },
+      // 修改
+      edit (id) {
+        id = id || this.$refs.projectTable.getCheckboxRecords().map(item => {
+          return item.id
+        })[0]
+        this.$refs.consultationForm.init('edit', id)
+      },
+      // 查看
+      view (id) {
+        this.$refs.consultationForm.init('view', id)
+      },
+      // 删除
+      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.projectService.delete(ids).then(({data}) => {
+            this.$message.success(data)
+            this.refreshList()
+            this.loading = false
+          })
+        })
+      },
+      importMethod ({ file }) {
+        // 处理表单
+        const formBody = new FormData()
+        formBody.append('file', file)
+        this.loading = true
+        this.projectService.importExcel(formBody).then(result => {
+          this.$message.success(result.data)
+          this.refreshList()
+        }).catch(() => {
+          this.refreshList()
+          this.loading = false
+        })
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      },
+      // 下载模板
+      downloadTpl () {
+        // this.$utils.downloadExcel('/sys/project/import/template')
+        this.loading = true
+        this.projectService.exportTemplate().then((res) => {
+          // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(res.data, '项目导入模板')
+          this.loading = false
+        }).catch(function (err) {
+          this.loading = false
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      },
+      // 下载文档
+      downloadFile () {
+        this.loading = true
+        this.projectService.fileUploadList({
+          'itemType': '2',
+          ...this.searchForm
+        }).then((res) => {
+          // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(res.data, '咨询项目上传比例报告')
+          this.loading = false
+        }).catch(function (err) {
+          this.loading = false
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      },
+      // 自定义服务端导出
+      exportMethod ({ options }) {
+        // 传给服务端的参数
+        const params = {
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          'itemType': '2',
+          ...this.searchForm,
+          filename: options.filename,
+          sheetName: options.sheetName,
+          isHeader: options.isHeader,
+          original: options.original,
+          mode: options.mode,
+          selectIds: options.mode === 'selected' ? options.data.map(item => item.id) : [],
+          exportFields: options.columns.map(column => column.property)
+        }
+        return this.projectService.exportExcel(params).then((res) => {
+          // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(res.data, options.filename)
+        }).catch(function (err) {
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      }
+    }
+  }
+</script>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1078 - 0
src/views/reimbursement/ReimbursementFormCcpm.vue


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1117 - 0
src/views/reimbursement/info/InfoForm.vue


+ 577 - 0
src/views/reimbursement/info/InfoList.vue

@@ -0,0 +1,577 @@
+<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="project">
+        <el-input size="small" 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"
+          format="yyyy-MM-dd HH:mm:ss"
+          value-format="yyyy-MM-dd HH:mm:ss"
+          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="`/sys/office/treeData?type=2`"
+          :value="searchForm.department"
+          :clearable="true"
+          :accordion="true"
+          @getValue="(value,label) => {searchForm.department=label}"/>
+      </el-form-item>
+      <el-form-item v-if="showHideItem" label="报销类别" prop="remiType">
+        <SelectTree
+          ref="areaTree"
+          :props="{
+                  value: 'id',             // ID字段名
+                  label: 'name',         // 显示名称
+                  children: 'children'    // 子级字段名
+                }"
+          url="/reimbursementApproval/type/treeData1?type=last"
+          :value="searchForm.remiType"
+          :clearable="true"
+          :accordion="true"
+          @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 size="small" v-model="searchForm.reportNumber" placeholder="请输入报告号" clearable></el-input>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="default" @click="showHide" size="small" :icon="showHideIcon">{{showHideName}}</el-button>
+        <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}" export custom>
+        <template #buttons>
+          <el-button v-if="hasPermission('reimbursement:info:add')" type="primary" size="small" icon="el-icon-plus" @click="add()">新建</el-button>
+          <el-button v-if="hasPermission('reimbursement:info:del')" type="danger" size="small" icon="el-icon-delete" @click="del()" :disabled="$refs.infoTable && $refs.infoTable.getCheckboxRecords().length === 0" plain>删除</el-button>
+        </template>
+      </vxe-toolbar>
+      <div style="height: calc(100% - 80px)">
+        <vxe-table
+          border="inner"
+          auto-resize
+          resizable
+          height="auto"
+          :loading="loading"
+          size="small"
+          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="40" ></vxe-column>
+          <vxe-column min-width="200" title="报销编号" field="no" align="center">
+            <template slot-scope="scope">
+              <el-link  type="primary" :underline="false" v-if="hasPermission('reimbursement:info:view')" @click="view(scope.row.id)">{{scope.row.no}}</el-link>
+              <el-link  type="primary" :underline="false" v-else-if="hasPermission('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 slot-scope="scope">
+              {{$dictUtils.getDictLabel('pg_reimbursement_source_type', scope.row.sourceType, '')}}
+            </template>
+          </vxe-column>
+          <vxe-column min-width="200" title="报销类别" field="typeName" align="center"></vxe-column>
+          <vxe-column min-width="200" title="报销项目" field="projectName"align="center">
+            <template slot-scope="scope">
+              <el-link  type="primary" :underline="false" v-if="hasPermission('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('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 slot-scope="scope">
+              <el-link  type="primary" :underline="false" v-if="hasPermission('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 min-width="200" title="报告号" field="reportNumber" align="center"></vxe-column>
+          <vxe-column min-width="100" title="经办人" field="userName" align="center"></vxe-column>
+          <vxe-column min-width="100" title="报销人" field="name" align="center"></vxe-column>
+          <vxe-column min-width="100" title="报销部门" field="deptName" align="center"></vxe-column>
+          <vxe-column min-width="100" title="报销日期" field="reimDate" align="center"></vxe-column>
+          <vxe-column min-width="150" title="报销金额(元)" field="number" align="center"></vxe-column>
+          <vxe-column min-width="100" title="状态" fixed="right" align="center" field="type">
+            <template slot-scope="scope">
+              <el-button type="text" @click="detail(scope.row)" :type="$dictUtils.getDictLabel('status_info', scope.row.type, '-')" effect="dark" size="mini">{{$dictUtils.getDictLabel("status", scope.row.type, '未开始')}} </el-button>
+            </template>
+          </vxe-column>
+
+          <vxe-column title="操作" min-width="130px" fixed="right" align="center">
+            <template  slot-scope="scope">
+              <el-button v-if="hasPermission('reimbursement:info:edit')&& scope.row.createId === $store.state.user.id && (scope.row.type === '1' || scope.row.type === '3')" type="text"  size="small" @click="edit(scope.row)">修改</el-button>
+              <el-button v-if="hasPermission('reimbursement:info:edit')&& scope.row.createId === $store.state.user.id && (scope.row.type === '2')" type="text"  size="small" @click="reback(scope.row)">撤回</el-button>
+              <el-button v-if="scope.row.type==='2' && checkIsAudit(scope.row)" type="text"  size="small" @click="examine(scope.row)">审核</el-button>
+              <el-button v-if="hasPermission('reimbursement:info:edit')&& scope.row.createId === $store.state.user.id && scope.row.type === '4'" type="text"  size="small" @click="adjust(scope.row)">驳回调整</el-button>
+              <el-button v-if="hasPermission('reimbursement:info:del')&& scope.row.createId === $store.state.user.id && (scope.row.type === '1')" 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>
+
+        <ProgramPageForm ref="programPageForm" @getProgram="getProgram"></ProgramPageForm>
+        <InfoForm ref="infoForm" @refreshDataList="refreshList"></InfoForm>
+        <ProjectForm ref="projectForm" @refreshDataList="refreshList"></ProjectForm>
+        <ContractNameForm ref="contractNameForm"></ContractNameForm>
+        <ProjectListForm ref="projectListForm"></ProjectListForm>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+  import ReimbursementService from '@/api/sys/ReimbursementService'
+  import InputNumber from '@/views/workContract/InputNumber.vue'
+  import SelectUserTree from '@/views/utils/treeUserSelect'
+  import UserSelect from '@/components/userSelect'
+  import SelectTree from '@/components/treeSelect/treeSelect.vue'
+  import ProgramPageForm from '@/views/finance/invoice/ProgramPageForm'
+  import InfoForm from './InfoForm'
+  import TaskService from '@/api/flowable/TaskService'
+  import ProcessService from '@/api/flowable/ProcessService'
+  import pick from 'lodash.pick'
+  import ProjectForm from '@/views/program/registered/ProjectForm'
+  import ContractNameForm from '@/views/workContract/WorkContractForm2'
+  import ProjectListForm from './ProgramForm'
+  export default {
+    data () {
+      return {
+        showHideItem: false,
+        showHideIcon: 'el-icon-arrow-down',
+        showHideName: '展示',
+        num: 0,
+        visable: false,
+        gridData: [],
+        searchForm: {
+          project: '',
+          dates: [],
+          handled: '',
+          reimBy: '',
+          type: [],
+          department: '',
+          remiType: '',
+          amounts: [],
+          reportNumber: ''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        loading: false
+      }
+    },
+    reimbursementService: null,
+    taskService: null,
+    processService: null,
+    created () {
+      this.reimbursementService = new ReimbursementService()
+      this.taskService = new TaskService()
+      this.processService = new ProcessService()
+    },
+    components: {
+      InputNumber,
+      SelectUserTree,
+      SelectTree,
+      ProgramPageForm,
+      InfoForm,
+      ProjectForm,
+      UserSelect,
+      ContractNameForm,
+      ProjectListForm
+    },
+    mounted () {
+      this.refreshList()
+    },
+    activated () {
+      this.refreshList()
+    },
+    computed: {
+      userName () {
+        return JSON.parse(localStorage.getItem('user')).name
+      },
+      user () {
+        this.create = JSON.parse(localStorage.getItem('user')).id
+        console.log('createId', this.create)
+        return JSON.parse(localStorage.getItem('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 = '展示'
+        }
+      },
+      // 新增
+      add () {
+        // 读取流程表单
+        let tabTitle = `发起流程【报销审批】`
+        let processTitle = `${this.userName} 在 ${this.moment(new Date()).format('YYYY-MM-DD HH:mm')} 发起了 [报销审批]`
+        this.taskService.getTaskDef({ procDefId: this.processDefinitionId,
+          status: 'startAndHold'}).then((data) => {
+            this.$router.push({
+              path: '/flowable/task/TaskForm',
+              query: {
+                ...pick(data.data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+                procDefId: this.processDefinitionId,
+                procDefKey: this.procDefKey,
+                status: 'startAndHold',
+                title: tabTitle,
+                formType: data.data.formType,
+                formUrl: data.data.formUrl,
+                formTitle: processTitle,
+                businessId: 'false',
+                isShow: false,
+                routePath: '/reimbursement/info/InfoList'
+              }
+            })
+          })
+      },
+      // 修改
+      edit (row) {
+        // 暂存修改
+        // let status = ''
+        // if (row.type === '1') {
+        //   status = 'startAndHold'
+        // }
+        // // 撤回或者驳回修改
+        // if (row.type === '3' || row.type === '4') {
+        //   status = 'startAndClose'
+        // }
+        // 读取流程表单
+        let tabTitle = `发起流程【评估-报销审批】`
+        let processTitle = `${this.userName} 在 ${this.moment(new Date()).format('YYYY-MM-DD HH:mm')} 发起了 [评估-报销审批]`
+        let status = 'startAndHold'
+        if (row.type === '3') {
+          status = 'startAndClose'
+        } else if (row.type === '4') {
+          status = 'reapplyFlag'
+        }
+        this.taskService.getTaskDef({ procDefId: this.processDefinitionId,
+          businessId: row.id,
+          businessTable: 'reimbursement_info',
+          status: status
+        }).then((data) => {
+          this.$router.push({
+            path: '/flowable/task/TaskForm',
+            query: {
+              ...pick(data.data, 'formType', 'formUrl', 'procDefKey', 'taskDefKey', 'procInsId', 'procDefId', 'taskId', 'status', 'title'),
+              procDefId: this.processDefinitionId,
+              procDefKey: this.procDefKey,
+              status: status,
+              title: tabTitle,
+              formType: data.data.formType,
+              formUrl: data.data.formUrl,
+              formTitle: processTitle,
+              businessTable: 'reimbursement_info',
+              businessId: row.id,
+              isShow: false,
+              routePath: '/reimbursement/info/InfoList'
+            }
+          })
+        })
+      },
+      // 撤回
+      reback (row) {
+        this.$confirm(`确定撤回流程吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          taskId: row.procInsId,
+          type: 'warning'
+        }).then(async () => {
+          await this.reimbursementService.findById(row.id).then(({data}) => {
+            if (data.type !== '2') { // status的值不等于“审核中”,就弹出提示
+              this.$message.error('数据已发生改变或不存在,请刷新数据')
+              this.refreshList()
+            } else {
+              this.processService.revokeProcIns(row.procInsId).then(({data}) => {
+                let form = {type: '3', id: row.id}
+                this.reimbursementService.updateStatusById(form)
+                this.$message.success(data)
+                this.refreshList()
+              })
+            }
+          })
+          // this.taskService.backNodes(row.taskId).then(({data}) => {
+          //   let backNodes = data
+          //   if (backNodes.length > 0) {
+          //     let backTaskDefKey = backNodes[0].taskDefKey
+          //     this.taskService.back({
+          //       taskId: row.taskId,
+          //       backTaskDefKey: backTaskDefKey,
+          //       isShow: false,
+          //       ...this.auditForm
+          //     }).then(({data}) => {
+          //       row.type = '3'
+          //       console.log('type', row)
+          //       this.reimbursementService.updateStatusById(row)
+          //       this.$message.success('回退成功')
+          //       this.refreshList()
+          //     })
+          //   }
+          // })
+        })
+      },
+      // 查看
+      view (id) {
+        this.$refs.infoForm.init('view', id)
+      },
+      // 查看报销项目
+      viewProject (id) {
+        this.$refs.projectListForm.init(id)
+      },
+      viewContract (id) {
+        this.$refs.contractNameForm.init('view', id)
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        this.reimbursementService.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.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.reimbursementService.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') {
+          this.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.programPageForm.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[0].name
+      },
+      // 下载文档
+      exportFile () {
+        this.loading = true
+        this.reimbursementService.exportFile({
+          'itemType': '1',
+          ...this.searchForm
+        }).then((res) => {
+          // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(res.data, '评估-报销审批列表信息')
+          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.data.map(item => item.id) : [],
+          exportFields: options.columns.map(column => column.property)
+        }
+        return this.reimbursementService.exportFile(params).then((res) => {
+          // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(res.data, options.filename)
+        }).catch(function (err) {
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      },
+      // 驳回后调整
+      adjust (row) {
+        this.reimbursementService.findById(row.id).then(({data}) => {
+          if (data.type !== '4') { // status的值不等于“驳回”,就弹出提示
+            this.$message.error('数据已发生改变或不存在,请刷新数据')
+            this.refreshList()
+          } else {
+            this.todo(row)
+          }
+        })
+      },
+      // 审核
+      examine (row) {
+        this.reimbursementService.findById(row.id).then(({data}) => {
+          if (data.type !== '2') { // status的值不等于“审核中”,就弹出提示
+            this.$message.error('数据已发生改变或不存在,请刷新数据')
+            this.refreshList()
+          } else {
+            this.todo(row)
+          }
+        })
+      },
+      // 审核或重新调整跳转
+      todo (row) {
+        let cUser = false
+        this.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: '/reimbursement/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>

+ 85 - 0
src/views/reimbursement/info/ProgramForm.vue

@@ -0,0 +1,85 @@
+<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      width="1000px"
+      @close="close"
+      append-to-body
+      @keyup.enter.native=""
+      :visible.sync="visible">
+      <vxe-table
+        border="inner"
+        show-overflow
+        show-footer
+        size="small"
+        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="name" align="left" title="项目名称">
+          <template slot-scope="scope">
+            <el-link type="primary" :underline="false" @click="openProjectForm(scope.row.id)" >{{scope.row.name}}</el-link>
+          </template>
+        </vxe-table-column>
+        <vxe-table-column width="150px" field="no" align="center" title="项目编号"></vxe-table-column>
+        <vxe-table-column width="250px" field="reportNo" align="center" title="报告号"></vxe-table-column>
+      </vxe-table>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="small" @click="close()" icon="el-icon-circle-close">关闭</el-button>
+      </span>
+    </el-dialog>
+    <ProjectForm ref="projectForm"></ProjectForm>
+  </div>
+</template>
+
+<script>
+  import ProjectForm from '@/views/program/registered/ProjectForm'
+  import ReimbursementApprovalService from '@/api/sys/ReimbursementService'
+  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.data
+        }
+        this.loading = false
+      },
+      openProjectForm (id) {
+        this.$refs.projectForm.init('view', id)
+      },
+      close () {
+        this.dataList = []
+        this.visible = false
+      }
+    }
+  }
+</script>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1712 - 0
src/views/reimbursement/info/ReimbursementForm.vue


+ 133 - 0
src/views/reimbursement/type/TypeForm.vue

@@ -0,0 +1,133 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      width="500px"
+      @close="close"
+      @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="/reimbursement/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="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 SelectTree from '@/components/treeSelect/treeSelect.vue'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          name: '',
+          no: '',
+          parentId: ''
+        }
+      }
+    },
+    reimbursementTypeService: null,
+    created () {
+      this.reimbursementTypeService = new ReimbursementTypeService()
+    },
+    components: {
+      SelectTree
+    },
+    methods: {
+      init (method, id) {
+        this.method = method
+        this.inputForm = {
+          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.visible = true
+        this.loading = false
+        this.$nextTick(() => {
+          if (method === 'edit' || method === 'view') { // 修改或者查看
+            this.loading = true
+            this.$refs.inputForm.resetFields()
+            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
+            })
+          }
+        })
+      },
+      // 表单提交
+      doSubmit () {
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            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>

+ 143 - 0
src/views/reimbursement/type/TypeList.vue

@@ -0,0 +1,143 @@
+<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'}"
+          :checkbox-config="{}">
+          <vxe-column type="seq" width="60" title="序号"></vxe-column>
+          <vxe-column type="checkbox" width="40" ></vxe-column>
+          <vxe-column title="报销内容名称" field="name" align="left" tree-node></vxe-column>
+          <vxe-column width="100" title="序号" field="sort"></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)">添加下级结构</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 TypeForm from './TypeForm'
+  export default {
+    data () {
+      return {
+        searchForm: {
+          name: '',
+          no: ''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        loading: false
+      }
+    },
+    reimbursementTypeService: null,
+    created () {
+      this.reimbursementTypeService = new ReimbursementTypeService()
+    },
+    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.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.reimbursementTypeService.remove(ids).then(({data}) => {
+            this.$message.success(data)
+            this.refreshList()
+            this.loading = false
+          })
+        })
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      }
+    }
+  }
+</script>

+ 288 - 0
src/views/utils/treeUserSelect.vue

@@ -0,0 +1,288 @@
+<template>
+  <el-select :value="valueTitle" :size="size"  :disabled="disabled" :clearable="clearable" :placeholder="placeholderText" @clear="clearHandle">
+    <el-option :value="valueTitle"  :label="valueTitle" class="options">
+      <el-tree  id="tree-option"
+        ref="selectTree"
+        :accordion="accordion"
+        :data="optionData"
+        :show-checkbox="showCheckbox"
+        :props="props"
+        highlight-current
+        :node-key="props.value"
+        :default-expanded-keys="defaultExpandedKey"
+        @check-change="handleCheckChange"
+        @node-click="handleNodeClick">
+      </el-tree>
+    </el-option>
+  </el-select>
+</template>
+
+<script>
+export default {
+  name: 'el-tree-select',
+  props: {
+    /* 配置项 */
+    props: {
+      type: Object,
+      default: () => {
+        return {
+          value: 'id',             // ID字段名
+          label: 'label',         // 显示名称
+          children: 'children'    // 子级字段名
+        }
+      }
+    },
+    /* 选项列表数据(树形结构的对象数组) */
+    data: {
+      type: Array,
+      default: () => { return [] }
+    },
+     /* 选项列表数据(树形结构的对象数组) */
+    list: {
+      type: Array,
+      default: () => { return null }
+    },
+    /* 初始值 */
+    value: {
+      type: String,
+      default: () => { return null }
+    },
+        /* 初始值 */
+    url: {
+      type: String,
+      default: () => { return null }
+    },
+    disabled: {
+      type: Boolean,
+      dafault: () => { return false }
+    },
+    showCheckbox: {
+      type: Boolean,
+      dafault: () => { return false }
+    },
+    /* 初始值 */
+    label: {
+      type: String,
+      default: () => { return null }
+    },
+    /* 可清空选项 */
+    clearable: {
+      type: Boolean,
+      default: () => { return true }
+    },
+    /* 自动收起 */
+    accordion: {
+      type: Boolean,
+      default: () => { return false }
+    },
+    size: {
+      type: String,
+      default: () => { return 'small' }
+    },
+    placeholder: {
+      type: String,
+      default: () => { return '请选择' }
+    },
+    isOnlySelectLeaf: {
+      type: Boolean,
+      default: () => {
+        return false
+      }
+    }
+  },
+  data () {
+    return {
+      valueId: this.value,    // 初始值
+      valueTitle: this.label,
+      defaultExpandedKey: [],
+      placeholderText: this.placeholder,
+      treeList: [],
+      valueData: this.data
+    }
+  },
+  created () {
+    if (this.url !== null) {
+      this.placeholderText = '加载数据中...'
+      let interval = setInterval(() => {
+        this.placeholderText = this.placeholderText + '.'
+      }, 500)
+      this.$http({
+        url: this.url,
+        method: 'get'
+      }).then(({data}) => {
+        this.valueData = data
+        this.setTreeList(this.valueData)
+        this.$nextTick(() => {
+          this.initHandle()
+          this.placeholderText = this.placeholder
+          clearInterval(interval)
+        })
+      })
+    } else {
+      this.valueData = this.data
+      this.setTreeList(this.valueData)
+    }
+  },
+  methods: {
+    setTreeList (datas) { // 遍历树  获取id数组
+      for (var i in datas) {
+        this.treeList.push(datas[i])
+        if (datas[i].children) {
+          this.setTreeList(datas[i].children)
+        }
+      }
+    },
+    // 初始化值
+    initHandle () {
+      if (this.valueId) {
+        if (this.showCheckbox) {
+          let ids = this.valueId.split(',')
+          this.$refs.selectTree.setCheckedKeys(ids)
+          let titles = []
+          ids.forEach((id) => {
+            this.treeList.forEach((d) => {
+              if (id === d[this.props.value]) {
+                titles.push(d[this.props.label])
+              }
+            })
+          })
+
+          this.valueTitle = titles.join(',')
+        } else if (this.$refs.selectTree.getNode(this.valueId)) {
+          this.valueTitle = this.$refs.selectTree.getNode(this.valueId).data[this.props.label]     // 初始化显示
+          this.$refs.selectTree.setCurrentKey(this.valueId)       // 设置默认选中
+          this.defaultExpandedKey = [this.valueId]      // 设置默认展开
+        }
+      }
+      this.initScroll()
+    },
+    getNode (id) {
+      return this.$refs.selectTree.getNode(id)
+    },
+    // 初始化滚动条
+    initScroll () {
+      this.$nextTick(() => {
+        let scrollWrap = document.querySelectorAll('.el-scrollbar .el-select-dropdown__wrap')[0]
+        let scrollBar = document.querySelectorAll('.el-scrollbar .el-scrollbar__bar')
+        if (scrollWrap) { scrollWrap.style.cssText = 'margin: 0px; max-height: none; overflow: hidden;' }
+        if (scrollBar) {
+          scrollBar.forEach(ele => {
+          // eslint-disable-next-line no-return-assign
+            return ele.style.width = 0
+          })
+        }
+      })
+    },
+    // 切换选项
+    handleNodeClick (node) {
+      if (this.showCheckbox) {
+        return
+      }
+      if (node['disabled'] || node['typeFlag']) {
+        // this.$message.warning('节点(' + node[this.props.label] + ')被禁止选择,请重新选择。')
+        return
+      }
+      if (this.isOnlySelectLeaf && node.children.length > 0) {
+        // this.$message.warning('不能选择根节点(' + node[this.props.label] + ')请重新选择。')
+        return
+      }
+      this.valueTitle = node[this.props.label]
+      this.valueId = node[this.props.value]
+      this.$emit('getValue', this.valueId, this.valueTitle, node)
+    },
+    handleCheckChange (data, checked, indeterminate) {
+      let nodes = this.$refs.selectTree.getCheckedNodes()
+      this.valueTitle = nodes.map((node) => {
+        return node[this.props.label]
+      }).join(',')
+      this.valueId = nodes.map((node) => {
+        return node[this.props.value]
+      }).join(',')
+      this.$emit('getValue', this.valueId, this.valueTitle)
+    },
+    // 清除选中
+    clearHandle () {
+      this.valueTitle = ''
+      this.valueId = null
+      this.defaultExpandedKey = []
+      this.clearSelected()
+      this.$emit('getValue', null, null, null)
+    },
+    /* 清空选中样式 */
+    clearSelected () {
+      let allNode = document.querySelectorAll('#tree-option .el-tree-node')
+      allNode.forEach((element) => element.classList.remove('is-current'))
+    }
+  },
+  watch: {
+    value () {
+      this.valueId = this.value
+      if (this.value === '' || this.value === null || this.value === undefined) {
+        this.clearHandle()
+      } else {
+        this.initHandle()
+      }
+    },
+    data () {
+      this.valueData = this.data
+    }
+  },
+  computed: {
+    optionData () {
+      if (this.list) {
+        let cloneData = JSON.parse(JSON.stringify(this.list))      // 对源数据深度克隆
+        return cloneData.filter(father => {                      // 循环所有项,并添加children属性
+          let branchArr = cloneData.filter(child => father.id === child.parentId)       // 返回每一项的子级数组
+            // eslint-disable-next-line no-unused-expressions
+          branchArr.length > 0 ? father.children = branchArr : ''   // 给父级添加一个children属性,并赋值
+          return father.parentId === '0'      // 返回第一层
+        })
+      } else {
+        return this.valueData
+      }
+    }
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style scoped>
+  .el-select{
+    width: 100%;
+  }
+  .el-scrollbar .el-scrollbar__view .el-select-dropdown__item{
+    height: auto;
+    max-height: 274px;
+    padding: 0;
+    overflow: hidden;
+    overflow-y: auto;
+  }
+  .el-select-dropdown__item.selected{
+    font-weight: normal;
+  }
+  ul li >>>.el-tree .el-tree-node__content{
+    height:auto;
+    padding: 0 20px;
+  }
+  .el-tree-node__label{
+    font-weight: normal;
+  }
+  .el-tree >>>.is-current .el-tree-node__label{
+    color: #409EFF;
+    font-weight: 700;
+  }
+  .el-tree >>>.is-current .el-tree-node__children .el-tree-node__label{
+    color:#606266;
+    font-weight: normal;
+  }
+  /* 开发禁用 */
+  /* .el-tree-node:focus>.el-tree-node__content{
+    background-color:transparent;
+    background-color: #f5f7fa;
+    color: #c0c4cc;
+    cursor: not-allowed;
+  }
+  .el-tree-node__content:hover{
+    background-color: #f5f7fa;
+  } */
+</style>

+ 979 - 0
src/views/workClient/WorkClientForm.vue

@@ -0,0 +1,979 @@
+<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      width="1200px"
+      @close="close(),closeXTable()"
+      @keyup.enter.native="doSubmit"
+      :visible.sync="visible">
+      <el-form size="middle" :model="inputForm" ref="inputForm" :rules="rules" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="method==='view'"
+               label-width="150px">
+        <el-row  :gutter="0">
+          <el-col :span="10">
+            <el-form-item label="客户名称" prop="workClientInfo.name">
+              <el-input maxlength="64" v-model="inputForm.workClientInfo.name" placeholder="请输入客户名称"></el-input>
+            </el-form-item>
+          </el-col>
+            <el-col :span="2">
+              <el-popover
+                v-model="visable"
+                placement="left"
+                width="400"
+                height="800"
+                trigger="click"
+                :popper-options="{ boundariesElement: 'viewport', removeOnDestroy: true }"
+                ref="pops">
+                <vxe-table
+                  border="inner"
+                  auto-resize
+                  resizable
+                  :row-config="{isHover: true}"
+                  :data="gridData"
+                  :checkbox-config="{}"
+                  :row-style="rowStyle"
+                  @cell-click="rowClick"
+                  :show-header="false"
+                >
+                  <vxe-column title="" field="entname" ></vxe-column>
+                </vxe-table>
+
+                <el-button type="info" slot="reference" @click="getPopTable" style="width: 100%" plain>查询</el-button>
+
+              </el-popover>
+            <el-form-item>
+
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="归属区域" prop="workClientInfo.areaId"
+                          :rules="[
+                   {required: true, message:'请选择归属区域', trigger:'blur'}
+                 ]">
+              <SelectTree
+                ref="areaTree"
+                :props="{
+                      value: 'id',             // ID字段名
+                      label: 'name',         // 显示名称
+                      children: 'children'    // 子级字段名
+                    }"
+                url="/sys/area/treeData"
+                :value="inputForm.workClientInfo.areaId"
+                :clearable="true"
+                :accordion="true"
+                v-if="visible"
+                @getValue="(value) => {inputForm.workClientInfo.areaId=value}"/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row  :gutter="15">
+
+          <el-col :span="12">
+
+            <el-form-item label="是否拥有信用代码" prop="workClientInfo.hasUscc"
+                 :rules="[
+                  {required: true, message:'请选择是否拥有信用代码', trigger:'blur'}
+                 ]">
+              <el-radio-group v-model="inputForm.workClientInfo.hasUscc">
+                  <el-radio v-for="item in $dictUtils.getDictList('yes_no')" :label="item.value" >{{item.label}}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="统一社会信用代码" prop="workClientInfo.uscCode" v-if="inputForm.workClientInfo.hasUscc === '1'">
+              <el-input maxlength="64" v-model="inputForm.workClientInfo.uscCode" placeholder="请输入统一社会信用代码"></el-input>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="客户性质" prop="workClientInfo.companyType"
+                :rules="[
+                  {required: true, message:'请选择客户性质', trigger:'blur'}
+                ]">
+              <el-select v-model="inputForm.workClientInfo.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-col>
+
+          <el-col :span="12">
+            <el-form-item label="所在行业" prop="workClientInfo.companyIndustry"
+                :rules="[
+                  {required: true, message:'请选择所在行业', trigger:'blur'}
+                ]">
+              <el-select v-model="inputForm.workClientInfo.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-col>
+
+          <el-col :span="12">
+            <el-form-item label="客户类型" prop="workClientInfo.clientType"
+                 :rules="[
+                    {required: true, message:'请选择客户类型', trigger:'blur'}
+                 ]">
+              <el-select v-model="inputForm.workClientInfo.clientType" placeholder="请选择" style="width:100%;">
+                <el-option
+                  v-for="item in $dictUtils.getDictList('customer_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="workClientInfo.deputyList"-->
+<!--                          :rules="[-->
+<!--                    {required: true, message:'请选择代表方', trigger:'blur'}-->
+<!--                 ]">-->
+<!--              <el-select v-model="inputForm.workClientInfo.deputyList" placeholder="请选择" multiple style="width:100%;">-->
+<!--                <el-option-->
+<!--                  v-for="item in $dictUtils.getDictList('representative')"-->
+<!--                  :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="workClientInfo.lawerPresint">
+              <el-input maxlength="64" v-model="inputForm.workClientInfo.lawerPresint" placeholder="请填写法人代表"></el-input>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="邮政编码" prop="workClientInfo.zipCode">
+              <el-input maxlength="64" v-model="inputForm.workClientInfo.zipCode" placeholder="请填写邮政编码"></el-input>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="传真" prop="workClientInfo.fax">
+              <el-input maxlength="64" v-model="inputForm.workClientInfo.fax" placeholder="请填写传真"></el-input>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="公司电话" prop="workClientInfo.telephone"
+                          :rules="[
+                   {validator: validatorXG.isPhoneOrMobile, trigger: 'change'},
+                   {validator: validatorXG.isPhoneOrMobile, trigger: 'blur'}
+                 ]">
+              <el-input v-model="inputForm.workClientInfo.telephone" placeholder="请填写公司电话"></el-input>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="公司网址" prop="workClientInfo.companyUrl">
+              <el-input maxlength="64" v-model="inputForm.workClientInfo.companyUrl" placeholder="请填写公司网址"></el-input>
+            </el-form-item>
+          </el-col>
+
+
+
+          <el-col :span="24">
+            <el-form-item label="注册地址" prop="workClientInfo.registerAddress">
+              <el-input maxlength="128" v-model="inputForm.workClientInfo.registerAddress" placeholder="请填写注册地址"></el-input>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="24">
+            <el-form-item label="详细地址" prop="workClientInfo.address">
+              <el-input maxlength="128" v-model="inputForm.workClientInfo.address" placeholder="请填写详细地址"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-form-item label="单位简介" prop="workClientInfo.remarks">
+          <el-input v-model="inputForm.workClientInfo.remarks"
+                    type="textarea"
+                    :rows="5"
+                    maxlength="500"
+                    placeholder="请输入单位简介"
+                    show-word-limit>
+          </el-input>
+        </el-form-item>
+
+        <el-form-item label="开票信息" prop="bankInfos">
+          <vxe-toolbar>
+            <template #buttons>
+              <vxe-button status="primary" :disabled="method==='view'" size="mini" @click="insertEvent('bank')">新增</vxe-button>
+            </template>
+          </vxe-toolbar>
+        </el-form-item>
+
+        <vxe-table
+          border
+          show-overflow
+          ref="xTable1"
+          class="vxe-table-element"
+          :data="bankInfos"
+          style="margin-left: 5em"
+          @cell-click="dbclickFun"
+          @edit-closed=""
+          highlight-current-row
+          :edit-config="{trigger: 'click', mode: 'row', showStatus: true, autoClear: true}"
+        >
+
+          <vxe-table-column field="ourBank" title="开票银行" :edit-render="{}">
+            <template v-slot:edit="scope" >
+              <el-input maxlength="64" v-model="scope.row.ourBank" ></el-input>
+            </template>
+          </vxe-table-column>
+          <vxe-table-column field="bankNumber" title="开票账号" :edit-render="{}">
+            <template v-slot:edit="scope" >
+              <el-input v-model="scope.row.bankNumber" @blur="checkBankNumber(scope.row)" maxlength="30"></el-input>
+            </template>
+          </vxe-table-column>
+          <vxe-table-column field="remarks" title="备注信息" :edit-render="{}">
+            <template v-slot:edit="scope" >
+              <el-input maxlength="64" v-model="scope.row.remarks" ></el-input>
+            </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,'bank')">删除</el-button>
+            </template>
+          </vxe-table-column>
+        </vxe-table>
+
+        <el-form-item style="margin-top: 20px" label="联系人信息" prop="linkmanInfos">
+          <vxe-toolbar >
+            <template #buttons>
+              <vxe-button status="primary" :disabled="method==='view'" size="mini" @click="insertEvent('linkman')">新增</vxe-button>
+            </template>
+          </vxe-toolbar>
+        </el-form-item>
+
+        <vxe-table
+          border
+          show-overflow
+          ref="xTable2"
+          class="vxe-table-element"
+          :data="linkmanInfos"
+          style="margin-left: 5em"
+          @cell-click="dbclickFun"
+          @edit-closed=""
+          highlight-current-row
+          :edit-config="{trigger: 'click', mode: 'row', showStatus: true, autoClear: true}"
+        >
+
+        <vxe-table-column field="name" title="联系人姓名" :edit-render="{}">
+          <template v-slot:edit="scope">
+            <el-input maxlength="10" v-model="scope.row.name" ></el-input>
+          </template>
+        </vxe-table-column>
+        <vxe-table-column field="office" title="部门" :edit-render="{}">
+          <template v-slot:edit="scope">
+            <el-input maxlength="10" v-model="scope.row.office" ></el-input>
+          </template>
+        </vxe-table-column>
+        <vxe-table-column field="position" title="职务" :edit-render="{}">
+          <template v-slot:edit="scope">
+            <el-input maxlength="10" v-model="scope.row.position" ></el-input>
+          </template>
+        </vxe-table-column>
+        <vxe-table-column field="qq" title="QQ" :edit-render="{}">
+          <template v-slot:edit="scope">
+            <el-input v-model="scope.row.qq" ></el-input>
+          </template>
+        </vxe-table-column>
+        <vxe-table-column field="linkPhone" title="联系方式1" :edit-render="{}">
+          <template v-slot:edit="scope">
+            <el-input v-model="scope.row.linkPhone"  maxlength="20"></el-input>
+          </template>
+        </vxe-table-column>
+        <vxe-table-column field="linkMobile" title="联系方式2" :edit-render="{}">
+          <template v-slot:edit="scope">
+            <el-input v-model="scope.row.linkMobile"  maxlength="20"></el-input>
+          </template>
+        </vxe-table-column>
+        <vxe-table-column field="email" title="E-mail" :edit-render="{}">
+          <template v-slot:edit="scope">
+            <el-input v-model="scope.row.email"  maxlength="64"></el-input>
+          </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,'linkman')">删除</el-button>
+          </template>
+        </vxe-table-column>
+        </vxe-table>
+        <!--        附件-->
+        <UpLoadComponent ref="uploadComponent"></UpLoadComponent>
+      </el-form>
+
+      <el-image-viewer
+        v-if="showViewer"
+        :on-close="closeViewer"
+        :url-list="[url]"
+        zIndex="9999"/>
+      <span slot="footer" class="dialog-footer">
+      <el-button size="small" @click="close(),closeXTable()" 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 WorkClientService from '@/api/sys/WorkClientService'
+  import SelectTree from '@/components/treeSelect/treeSelect.vue'
+  import UpLoadComponent from '@/views/common/UpLoadComponent'
+  import OSSSerive from '@/api/sys/OSSService'
+  import ElImageViewer from 'element-ui/packages/image/src/image-viewer'
+  export default {
+    data () {
+      let checkUscCode = (rule, value, callback) => {
+        this.haveUscCode(value, callback)
+      }
+      let checkWorkClient = (rule, value, callback) => {
+        this.haveWorkClient(value, callback)
+      }
+      return {
+        visable: false,
+        gridData: [],
+        radio: 0,
+        tableData: [],
+        dataList: [],
+        dataListNew: [],
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        returnForm: {
+          workClientInfo: {
+            name: '',
+            lawerPresintnamename: '',
+            lawerPresint: '',
+            orUnicode: '',
+            companyType: '',
+            companyIndustry: '',
+            clientType: '',
+            creditRank: '',
+            areaId: '',
+            zipCode: '',
+            fax: '',
+            taxId: '',
+            email: '',
+            address: '',
+            registerAddress: '',
+            companyUrl: '',
+            remarks: '',
+            companyId: '',
+            officeId: '',
+            areaParentIds: '',
+            telephone: '',
+            hasUscc: '',
+            uscCode: '',
+            number: '',
+            deputy: '',
+            deputyList: []
+          }
+        },
+        inputForm: {
+          workClientInfo: {
+            name: '',
+            lawerPresintnamename: '',
+            lawerPresint: '',
+            orUnicode: '',
+            companyType: '',
+            companyIndustry: '',
+            clientType: '',
+            creditRank: '',
+            areaId: '',
+            zipCode: '',
+            fax: '',
+            taxId: '',
+            email: '',
+            address: '',
+            registerAddress: '',
+            companyUrl: '',
+            remarks: '',
+            companyId: '',
+            officeId: '',
+            areaParentIds: '',
+            telephone: '',
+            hasUscc: '',
+            uscCode: '',
+            number: '',
+            deputy: '',
+            deputyList: []
+          },
+          deputyList: [],
+          permissionFlag: '', // 判断是否为当前登录人参数
+          name: '',
+          hasUscc: '',
+          uscCode: '',
+          companyType: '',
+          companyIndustry: '',
+          clientType: '',
+          deputy: '',
+          lawerPresint: '',
+          zipCode: '',
+          fax: '',
+          telephone: '',
+          companyUrl: '',
+          areaId: '',
+          registerAddress: '',
+          address: '',
+          remarks: ''
+        },
+        bankInfos: [],
+        bankInfo: {
+          ourBank: '',
+          bankNumber: '',
+          remarks: ''
+        },
+        linkmanInfos: [],
+        linkmanInfo: {
+          name: '',
+          office: '',
+          position: '',
+          qq: '',
+          linkPhone: '',
+          linkMobile: '',
+          email: ''
+        },
+        filesArra2: [],
+        fileList: [],
+        isFlag: true,
+        showViewer: false, // 显示查看器
+        url: '',
+        rowurl: '',
+        src: '',
+        showVi: true,
+        onedit: false,
+        type: '',
+        loadProgress: 0, // 动态显示进度条
+        progressFlag: false, // 关闭进度条
+        rules: {
+          'workClientInfo.uscCode': [
+            {required: true, validator: checkUscCode, trigger: 'blur'},
+            {required: true, validator: checkUscCode, trigger: 'change'}
+          ],
+          'workClientInfo.name': [
+            {required: true, validator: checkWorkClient, trigger: 'blur'},
+            {required: true, validator: checkWorkClient, trigger: 'change'}
+          ]
+        }
+      }
+    },
+    components: {
+      ElImageViewer,
+      SelectTree,
+      UpLoadComponent
+    },
+    ossService: null,
+    workClientService: null,
+    created () {
+      this.ossService = new OSSSerive()
+      this.workClientService = new WorkClientService()
+    },
+    mounted () {
+    },
+    methods: {
+      isExistByName () {
+        let value = this.inputForm.workClientInfo.name
+        if (value !== null && value !== undefined && value !== '') {
+          this.workClientService.isExist(value).then((data) => {
+            if (data.data !== 0) {
+              this.$message.error('该客户名称已存在')
+            }
+          })
+        }
+      },
+      isExistByUscCode () {
+        let value = this.inputForm.workClientInfo.uscCode
+        if (value !== null && value !== undefined && value !== '') {
+          this.workClientService.isExist(value).then((data) => {
+            if (data.data !== 0) {
+              this.$message.error('该统一社会信用代码已存在')
+            }
+          })
+        }
+      },
+      haveUscCode (value, callback) {
+        if (!this.commonJS.isEmpty(value)) {
+          this.workClientService.haveUscCode(this.inputForm.id, value).then((data) => {
+            if (!data.data) {
+              callback(new Error('该统一社会信用代码已存在'))
+            } else {
+              callback()
+            }
+          })
+        } else {
+          callback(new Error('统一社会信用代码不可以为空'))
+        }
+      },
+      haveWorkClient (value, callback) {
+        if (!this.commonJS.isEmpty(value)) {
+          this.workClientService.haveWorkClient(this.inputForm.id, value).then((data) => {
+            if (!data.data) {
+              callback(new Error('该客户名称已存在'))
+            } else {
+              callback()
+            }
+          })
+        } else {
+          callback(new Error('客户名称不可以为空'))
+        }
+      },
+      // 关闭查看器
+      closeViewer () {
+        this.url = ''
+        this.showViewer = false
+      },
+      async init (method, id) {
+        this.dataList = []
+        this.dataListNew = []
+        await this.ossService.findFileList(id).then(({data}) => {
+          data.forEach((item) => {
+            item.name = item.attachmentName
+            this.dataList.push(item)
+            this.dataListNew.push(item)
+          })
+        })
+        this.method = method
+        this.inputForm = {
+          deputyList: [],
+          name: '',
+          hasUscc: '',
+          uscCode: '',
+          companyType: '',
+          companyIndustry: '',
+          clientType: '',
+          deputy: '',
+          lawerPresint: '',
+          zipCode: '',
+          fax: '',
+          telephone: '',
+          companyUrl: '',
+          areaId: '',
+          registerAddress: '',
+          address: '',
+          remarks: '',
+          bankInfos: [],
+          bankInfo: {
+            ourBank: '',
+            bankNumber: '',
+            remarks: ''
+          },
+          linkmanInfos: [],
+          linkmanInfo: {
+            name: '',
+            office: '',
+            position: '',
+            qq: '',
+            linkPhone: '',
+            linkMobile: '',
+            email: ''
+          },
+          filesArra2: [],
+          fileList: [],
+          isFlag: true,
+          showViewer: false, // 显示查看器
+          url: '',
+          rowurl: '',
+          src: '',
+          showVi: true,
+          type: '',
+          workClientInfo: {
+            name: '',
+            lawerPresintnamename: '',
+            lawerPresint: '',
+            orUnicode: '',
+            companyType: '',
+            companyIndustry: '',
+            clientType: '',
+            creditRank: '',
+            areaId: '',
+            zipCode: '',
+            fax: '',
+            taxId: '',
+            email: '',
+            address: '',
+            registerAddress: '',
+            companyUrl: '',
+            remarks: '',
+            companyId: '',
+            officeId: '',
+            areaParentIds: '',
+            telephone: '',
+            hasUscc: '',
+            uscCode: '',
+            number: '',
+            deputy: '',
+            deputyList: []
+          }
+        }
+        this.inputForm.id = id
+        if (method === 'add') {
+          this.inputForm.workClientInfo.hasUscc = '1'
+          this.inputForm.permissionFlag = true
+          this.title = `新建客户信息`
+        } else if (method === 'edit') {
+          this.title = '修改客户信息'
+        } else if (method === 'view') {
+          this.showVi = false
+          this.title = '查看客户详情'
+        }
+        this.visible = true
+        this.loading = false
+        this.$nextTick(() => {
+          // this.$refs.upload.clearFiles()
+          this.$refs.inputForm.resetFields()
+          if (method === 'edit' || method === 'view') { // 修改或者查看
+            this.loading = true
+            this.workClientService.findById(this.inputForm.id).then(({data}) => {
+              // this.inputForm = this.recover(this.inputForm, data)
+              data.workClientBank.forEach(i => {
+                this.bankInfos.push(i)
+              })
+              data.workClientLinkman.forEach(i => {
+                this.linkmanInfos.push(i)
+              })
+              const deputyList = []
+              if (data.workClientInfo.deputy !== null && data.workClientInfo.deputy !== undefined && data.workClientInfo.deputy !== '') {
+                data.workClientInfo.deputy.split(',').forEach(item => {
+                  if (item !== null && item !== undefined && item !== '') {
+                    deputyList.push(item)
+                  }
+                })
+              }
+              this.inputForm.workClientInfo = JSON.parse(JSON.stringify(data.workClientInfo))
+              this.inputForm.permissionFlag = true
+              this.inputForm.workClientInfo.deputyList = deputyList
+              this.inputForm.workClientInfo = JSON.parse(JSON.stringify(this.inputForm.workClientInfo))
+              this.inputForm.workClientInfo.hasUscc = JSON.stringify(this.inputForm.workClientInfo.hasUscc)
+              this.$refs.uploadComponent.newUpload(method, this.dataListNew, 'workClient', 300)
+            })
+          }
+          if (method !== 'edit' && method !== 'view') {
+            this.$refs.uploadComponent.newUpload(method, [], 'workClient', 300)
+          }
+          this.loading = false
+        })
+      },
+      // 表单提交
+      doSubmit () {
+        if (!this.commonJS.isEmpty(this.inputForm.workClientInfo.uscCode)) {
+          this.workClientService.haveUscCode(this.inputForm.id, this.inputForm.workClientInfo.uscCode).then((data) => {
+            if (!data.data) {
+              this.$message.error('该统一社会信用代码已存在')
+            }
+          })
+        } else {
+          this.$message.error('统一社会信用代码为空')
+          return
+        }
+        if (!this.commonJS.isEmpty(this.inputForm.workClientInfo.name)) {
+          this.workClientService.haveWorkClient(this.inputForm.id, this.inputForm.workClientInfo.name).then((data) => {
+            if (!data.data) {
+              this.$message.error('该客户名称已存在')
+            }
+          })
+        } else {
+          this.$message.error('客户名称为空')
+          return
+        }
+        if (this.$refs.uploadComponent.checkProgress()) {
+          this.loading = false
+          return
+        }
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            this.inputForm.workAttachments = []
+            this.dataListNew = this.$refs.uploadComponent.getDataList()
+            this.dataListNew.forEach((item) => {
+              if (item.id === null || item.id === undefined || item.id === '') {
+                item.url = item.raw.url
+              }
+              item.attachmentFlag = 'workClient'
+              item.fileSize = item.size
+              item.attachmentName = item.name
+              item.createBy = null
+              this.inputForm.workAttachments.push(item)
+            })
+            this.inputForm.workClientBank = []
+            this.bankInfos.forEach((item) => {
+              this.inputForm.workClientBank.push(item)
+            })
+            this.inputForm.workClientLinkman = []
+            this.linkmanInfos.forEach((item) => {
+              this.inputForm.workClientLinkman.push(item)
+            })
+            // if (this.inputForm.workClientBank.length === 0) {
+            //   this.$message.error('开户行信息至少填写一条')
+            //   this.loading = false
+            //   return
+            // } else {
+            let flag = true
+            this.inputForm.workClientBank.forEach(item => {
+              if (item.ourBank === null || item.ourBank === undefined || item.ourBank === '') {
+                this.$message.error('开票银行未填写')
+                this.loading = false
+                flag = false
+                return
+              } else if (item.bankNumber === null || item.bankNumber === undefined || item.bankNumber === '') {
+                this.$message.error('开票账号未填写')
+                this.loading = false
+                flag = false
+                return
+              }
+              if (!this.validateXG.isBankNumber(item.bankNumber)) {
+                this.$message.error('请输入正确的开票账号')
+                this.loading = false
+                flag = false
+              }
+            })
+            if (flag === false) {
+              return
+            }
+            // }
+            if (this.inputForm.workClientLinkman.length === 0) {
+              this.$message.error('联系人信息至少填写一条')
+              this.loading = false
+              return
+            } else {
+              let flag = true
+              this.inputForm.workClientLinkman.forEach(item => {
+                if (item.name === null || item.name === undefined || item.name === '') {
+                  this.$message.error('联系人姓名未填写')
+                  this.loading = false
+                  flag = false
+                  return
+                }
+                if (!this.validateXG.isPhoneOrMobile(item.linkPhone)) {
+                  this.$message.error('联系人联系方式1填写不正确')
+                  this.loading = false
+                  flag = false
+                }
+              })
+              if (flag === false) {
+                return
+              }
+            }
+            if (this.inputForm.workClientLinkman.length !== 0) {
+              let flag = true
+              this.inputForm.workClientLinkman.forEach(item => {
+                if (!this.commonJS.isEmpty(item.email)) {
+                  if (!this.validateXG.isEmail(item.email)) {
+                    this.$message.error('联系人信息-Email填写不正确')
+                    this.loading = false
+                    flag = false
+                    return
+                  }
+                }
+                if (!this.commonJS.isEmpty(item.qq)) {
+                  if (!this.validate.isQq(item.qq)) {
+                    this.$message.error('联系人信息-qq填写不正确')
+                    this.loading = false
+                    flag = false
+                    return
+                  }
+                }
+                flag = true
+              })
+              if (flag === false) {
+                return
+              }
+            }
+
+            this.inputForm.workClientInfo.deputy = this.inputForm.workClientInfo.deputyList.join(',')
+
+            this.workClientService.save(this.inputForm).then(({data}) => {
+              this.close()
+              this.$message.success(data)
+              this.$emit('refreshDataList')
+              this.loading = false
+            }).catch(() => {
+              this.loading = false
+            })
+          }
+        })
+      },
+      checkBankNumber (row) {
+        if (!this.validateXG.isBankNumber(row.bankNumber)) {
+          this.$message.error('请输入正确的开票账号')
+          throw new Error('请输入正确的开票账号')
+        }
+      },
+      close () {
+        this.$refs.uploadComponent.clearUpload()
+        this.$refs.inputForm.resetFields()
+        this.visible = false
+        this.showVi = true
+      },
+      // 排序
+      sortChangeHandle (column) {
+        this.orders = []
+        if (column.order != null) {
+          this.orders.push({column: this.$utils.toLine(column.prop), asc: column.order === 'ascending'})
+        }
+        this.refreshList()
+      },
+      deleteMsgById (row, index) {
+        this.dataListNew.splice(index, 1)
+        if (row.id !== null && row.id !== '' && row.id !== undefined) {
+          this.ossService.deleteMsgById(row.id)
+        }
+      },
+      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 > 4) {
+            this.$message.warning(`金额小数点后只能输入四位,请正确输入!`)
+            return (str = '')
+          }
+        }
+        // eslint-disable-next-line no-useless-escape
+        str = str.replace(/[^\d^\.]+/g, '') // 保留数字和小数点
+        return str
+      },
+      positiveInteger (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 no-useless-escape
+        str = str.replace(/[^\d^]+/g, '') // 保留数字
+        return str
+      },
+      tableRowClassName ({row, rowIndex}) {
+        row.index = rowIndex
+      },
+      handleRadioChange (val) {
+        if (val) {
+          this.radio = val.index
+        }
+      },
+      // 点击修改
+      dbclickFun (cell) {
+        this.onedit = false
+      },
+      // 删除
+      removeEvent (row, rowIndex, type) {
+        if (type === 'bank') {
+          this.$refs.xTable1.remove(row)
+          this.bankInfos.splice(rowIndex, 1)
+        }
+        if (type === 'linkman') {
+          this.$refs.xTable2.remove(row)
+          this.linkmanInfos.splice(rowIndex, 1)
+        }
+      },
+      // 新增
+      // eslint-disable-next-line no-dupe-keys
+      async insertEvent (type) {
+        if (type === 'bank') {
+          await this.$refs.xTable1.insert().then((data) => {
+            this.bankInfos.push(data)
+          })
+        }
+        if (type === 'linkman') {
+          await this.$refs.xTable2.insert().then((data) => {
+            this.linkmanInfos.push(data)
+          })
+        }
+      },
+      // 关闭窗口时调用
+      closeXTable () {
+        this.bankInfos = []
+        this.linkmanInfos = []
+        this.closePop()
+      },
+      rowStyle (event) {
+        return 'cursor:pointer;'
+      },
+      async rowClick (event) {
+        let id = this.gridData[event.rowIndex].companyid
+        await this.workClientService.enterpriseTicketInfo(id).then((data) => {
+          this.inputForm.workClientInfo.name = data.data.ENTNAME
+          this.inputForm.workClientInfo.uscCode = data.data.UNCID
+          this.inputForm.workClientInfo.registerAddress = data.data.OPLOC
+        })
+        this.visable = false
+      },
+      async getPopTable () {
+        let name = this.inputForm.workClientInfo.name
+        if (name !== null && name !== undefined && name !== '') {
+          await this.workClientService.enterpriseSearchByName(name).then(({data}) => {
+            this.gridData = data.data.items
+          })
+        }
+        this.$refs.pops.updatePopper()
+      },
+      closePop () {
+        this.visable = false
+      }
+    }
+  }
+</script>
+
+<style>
+  .tid_40 .vxe-body--column .vxe-cell{
+    padding: 1px;
+    text-align: center;
+  }
+  .tid_40 .vxe-header--row .col--last{
+    text-align: center;
+  }
+  .tid_45 .vxe-body--column .vxe-cell{
+    padding: 1px;
+    text-align: center;
+  }
+  .tid_45 .vxe-header--row .col--last{
+    text-align: center;
+  }
+</style>
+
+<style scoped>
+  .avatar{
+    height: 100px;
+  }
+  .el-divider__text {
+    font-weight: bold;
+    font-size: 16px;
+  }
+</style>

+ 334 - 0
src/views/workClient/WorkClientList.vue

@@ -0,0 +1,334 @@
+<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="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 v-if="showHideItem" label="地区" prop="areaId">
+          <SelectTree
+            ref="area"
+            :props="{
+                      value: 'id',             // ID字段名
+                      label: 'name',         // 显示名称
+                      children: 'children'    // 子级字段名
+                    }"
+            placeholder="请选择所在区域"
+            size="small"
+            url="/sys/area/treeData"
+            :value="searchForm.areaId"
+            :clearable="true"
+            :accordion="true"
+            @getValue="(value) => {searchForm.areaId=value}"/>
+        </el-form-item>
+
+        <el-form-item v-if="showHideItem" 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 v-if="showHideItem" 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 v-if="showHideItem" label="客户类型" prop="clientType">
+          <el-select v-model="searchForm.clientType" placeholder="请选择" style="width:100%;">
+            <el-option
+              v-for="item in $dictUtils.getDictList('customer_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="uscCode">
+          <el-input size="small" v-model="searchForm.uscCode" placeholder="请输入统一社会信用代码" clearable></el-input>
+        </el-form-item>
+
+        <el-form-item v-if="showHideItem" label="创建人" prop="createBy">
+          <UserSelect :limit='1' :readonly="true" :userName="applyUserName" @getValue='(value, label) => {searchForm.createBy = value,applyUserName  = label}'></UserSelect>
+        </el-form-item>
+
+<!--        <el-form-item label="代表方" prop="deputy">-->
+<!--          <el-select v-model="searchForm.deputy" placeholder="请选择" style="width:100%;">-->
+<!--            <el-option-->
+<!--              v-for="item in $dictUtils.getDictList('representative')"-->
+<!--              :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" size="small" :icon="showHideIcon">{{showHideName}}</el-button>
+            <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">
+        <vxe-toolbar :refresh="{query: refreshList}" import export print custom>
+          <template #buttons>
+            <el-button v-if="hasPermission('sys:project:add')" type="primary" size="small" icon="el-icon-plus" @click="add()">新建</el-button>
+            <el-button v-if="hasPermission('sys:project:del')" type="danger"   size="small" icon="el-icon-delete" @click="del()" :disabled="$refs.workClientTable && $refs.workClientTable.getCheckboxRecords().length === 0" plain>删除</el-button>
+          </template>
+        </vxe-toolbar>
+        <div style="height: calc(100% - 80px);">
+            <vxe-table
+                border="inner"
+                auto-resize
+                resizable
+                height="auto"
+                :loading="loading"
+                size="small"
+                ref="workClientTable"
+                show-header-overflow
+                show-overflow
+                highlight-hover-row
+                :menu-config="{}"
+                :print-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="40px"></vxe-column>
+                <vxe-column  title="客户名称" field="name">
+                    <template slot-scope="scope">
+                        <el-link  type="primary" :underline="false" v-if="hasPermission('sys:project:edit')" @click="view(scope.row.id)">{{scope.row.name}}</el-link>
+                        <el-link  type="primary" :underline="false" v-else-if="hasPermission('sys:project:view')"  @click="view(scope.row.id)">{{scope.row.name}}</el-link>
+                        <span v-else>{{scope.row.name}}</span>
+                    </template>
+                </vxe-column>
+<!--                <vxe-column width="200px"  title="代表方" field="deputy" ></vxe-column>-->
+                <vxe-column width="100px"  title="客户性质" field="companyType" >
+                  <template slot-scope="scope">
+                    {{ $dictUtils.getDictLabel("customer_nature", scope.row.companyType, '-') }}
+                  </template>
+                </vxe-column>
+                <vxe-column width="100px"  title="客户行业" field="companyIndustry" >
+                  <template slot-scope="scope">
+                    {{ $dictUtils.getDictLabel("industry", scope.row.companyIndustry, '-') }}
+                  </template>
+                </vxe-column>
+                <vxe-column width="100px" title="所在地区" field="areaId" >
+                  <SelectTree
+                    ref="areaTree"
+                    :props="{
+                    value: 'areaId',             // ID字段名
+                    label: 'name',         // 显示名称
+                    children: 'children'    // 子级字段名
+                  }"
+                    url="/sys/area/treeData"
+                    :value="scope.row.areaId"
+                    :clearable="true"
+                    :accordion="true"
+                    v-if="visible"
+                    @getValue="(value) => {scope.row.areaId=value}"/>
+                </vxe-column>
+                <vxe-column width="150px" title="统一社会信用代码" field="uscCode" > </vxe-column>
+                <vxe-column width="80px" title="创建人" field="createBy" > </vxe-column>
+                <vxe-column width="100px" title="创建时间" field="createDate" > </vxe-column>
+
+                <vxe-column title="操作" width="200px" fixed="right" align="center">
+                    <template  slot-scope="scope">
+                      <el-button v-if="hasPermission('sys:work_client:view')" type="text" icon="el-icon-view" size="small" @click="view(scope.row.id)">查看</el-button>
+                      <el-button v-if="hasPermission('sys:work_client:edit') && scope.row.createFlag === '1'" type="text" icon="el-icon-edit" size="small" @click="edit(scope.row.id)">修改</el-button>
+                      <el-button v-if="hasPermission('sys:work_client:del')  && scope.row.createFlag === '1'" type="text"  icon="el-icon-delete" 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>
+        <!-- 弹窗, 新增 / 修改 -->
+    <WorkClientForm  ref="workClientForm" @refreshDataList="refreshList"></WorkClientForm>
+  </div>
+</template>
+
+<script>
+  import WorkClientForm from './WorkClientForm'
+  import WorkClientService from '@/api/sys/WorkClientService'
+  import SelectTree from '@/components/treeSelect/treeSelect.vue'
+  import SelectUserTree from '@/views/utils/treeUserSelect'
+  import UserSelect from '@/components/userSelect'
+  export default {
+    data () {
+      return {
+        applyUserName: '',
+        showHideItem: false,
+        showHideIcon: 'el-icon-arrow-down',
+        showHideName: '展示',
+        visible: false,
+        searchForm: {
+          name: '',
+          areaId: '',
+          createDates: [],
+          companyType: '',
+          companyIndustry: '',
+          clientType: '',
+          uscCode: '',
+          createBy: '',
+          deputy: ''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        loading: false
+      }
+    },
+    workClientService: null,
+    created () {
+      this.workClientService = new WorkClientService()
+    },
+    components: {
+      WorkClientForm,
+      SelectTree,
+      SelectUserTree,
+      UserSelect
+    },
+    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 = '展示'
+        }
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        this.workClientService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          'itemType': '1',
+          ...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.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()
+      },
+      // 新增
+      add () {
+        this.$refs.workClientForm.init('add', '')
+      },
+      // 修改
+      edit (id) {
+        id = id || this.$refs.workClientTable.getCheckboxRecords().map(item => {
+          return item.id
+        })[0]
+        this.$refs.workClientForm.init('edit', id)
+      },
+      // 查看
+      view (id) {
+        this.$refs.workClientForm.init('view', id)
+      },
+      // 删除
+      del (id) {
+        let ids = id || this.$refs.workClientTable.getCheckboxRecords().map(item => {
+          return item.id
+        }).join(',')
+        this.$confirm(`确定删除所选项吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.loading = true
+          this.workClientService.remove(ids).then(({data}) => {
+            if (data.success) {
+              this.$message.success(data.message)
+              this.refreshList()
+              this.loading = false
+            } else {
+              this.$message.error(data.message)
+              this.refreshList()
+              this.loading = false
+            }
+          })
+        })
+      },
+      importMethod ({file}) {
+        // 处理表单
+        const formBody = new FormData()
+        formBody.append('file', file)
+        this.loading = true
+        this.workClientService.importExcel(formBody).then(result => {
+          this.$message.success(result.data)
+          this.refreshList()
+        }).catch(() => {
+          this.refreshList()
+          this.loading = false
+        })
+      },
+      resetSearch () {
+        this.applyUserName = ''
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      }
+    }
+  }
+</script>

+ 202 - 0
src/views/workContract/InputNumber.vue

@@ -0,0 +1,202 @@
+<template>
+  <div>
+    <div class="input-number-range" :class="{ 'is-disabled': disabled }">
+      <div class="flex">
+        <div class="from">
+          <el-input
+            ref="input_from"
+            oninput="value=value.replace(/[^\d]/g,'')"
+            v-model="userInputForm"
+            :disabled="disabled"
+            placeholder="最小值"
+            @blur="handleBlurFrom"
+            @focus="handleFocusFrom"
+            @input="handleInputFrom"
+            @change="handleInputChangeFrom"
+          ></el-input>
+        </div>
+        <div class="center">
+          <span>至</span>
+        </div>
+        <div class="to">
+          <el-input
+            ref="input_to"
+            oninput="value=value.replace(/[^\d]/g,'')"
+            v-model="userInputTo"
+            :disabled="disabled"
+            placeholder="最大值"
+            @blur="handleBlurTo"
+            @focus="handleFocusTo"
+            @input="handleInputTo"
+            @change="handleInputChangeTo"
+          ></el-input>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'InputNumber',
+
+    props: {
+      // 初始化范围
+      value: { required: true },
+
+      // 是否禁用
+      disabled: {
+        type: Boolean,
+        default: false
+      },
+
+      // 精度参数
+      precision: {
+        type: Number,
+        default: 0,
+        validator (val) {
+          return val >= 0 && val === parseInt(val, 10)
+        }
+      }
+    },
+
+    data () {
+      return {
+        userInputForm: null,
+        userInputTo: null
+      }
+    },
+
+    watch: {
+      value: {
+        immediate: true,
+        handler (value) {
+          /** 初始化范围 */
+          if (value instanceof Array && this.precision !== undefined) {
+            this.userInputForm = typeof value[0] === 'number' ? value[0] : null
+            this.userInputTo = typeof value[1] === 'number' ? value[1] : null
+          }
+        }
+      }
+    },
+
+    methods: {
+      // 根据精度保留数字
+      toPrecision (num, precision) {
+        if (precision === undefined) precision = 0
+        return parseFloat(
+          Math.round(num * Math.pow(10, precision)) / Math.pow(10, precision)
+        )
+      },
+
+      handleBlurFrom (event) {
+        this.$emit('blurfrom', event)
+      },
+
+      handleFocusFrom (event) {
+        this.$emit('focusfrom', event)
+      },
+
+      handleBlurTo (event) {
+        this.$emit('blurto', event)
+      },
+
+      handleFocusTo (event) {
+        this.$emit('focusto', event)
+      },
+
+      handleInputFrom (value) {
+        this.$emit('inputfrom', value)
+      },
+
+      handleInputTo (value) {
+        this.$emit('inputto', value)
+      },
+
+      // from输入框change事件
+      handleInputChangeFrom (value) {
+        // 如果是非数字空返回null
+        if (isNaN(value) || value === '') {
+          this.$emit('input', [null, this.userInputTo])
+          this.$emit('changefrom', this.userInputForm)
+          return
+        }
+
+        // 初始化数字精度
+        this.userInputForm = this.setPrecisionValue(value)
+
+        // 如果from > to 将from值替换成to
+        if (typeof this.userInputTo === 'number') {
+          this.userInputForm =
+            parseFloat(this.userInputForm) <= parseFloat(this.userInputTo)
+              ? this.userInputForm
+              : this.userInputTo
+        }
+        this.$emit('input', [this.userInputForm, this.userInputTo])
+        this.$emit('changefrom', this.userInputForm)
+      },
+
+      // to输入框change事件
+      handleInputChangeTo (value) {
+        // 如果是非数字空返回null
+        if (isNaN(value) || value === '') {
+          this.$emit('input', [this.userInputForm, null])
+          this.$emit('changefrom', this.userInputTo)
+          return
+        }
+
+        // 初始化数字精度
+        this.userInputTo = this.setPrecisionValue(value)
+
+        // 如果to < tfrom 将to值替换成from
+        if (typeof this.userInputForm === 'number') {
+          this.userInputTo =
+            parseFloat(this.userInputTo) >= parseFloat(this.userInputForm)
+              ? this.userInputTo
+              : this.userInputForm
+        }
+        this.$emit('input', [this.userInputForm, this.userInputTo])
+        this.$emit('changeto', this.userInputTo)
+      },
+
+      // 设置成精度数字
+      setPrecisionValue (value) {
+        if (this.precision !== undefined) {
+          const val = this.toPrecision(value, this.precision)
+          return val
+        }
+        return null
+      }
+    }
+  }
+</script>
+<style lang="scss" scoped>
+  // 取消element原有的input框样式
+  ::v-deep .el-input--mini .el-input__inner {
+    border: 0px;
+    margin: 0;
+    padding: 0 15px;
+    background-color: transparent;
+  }
+  .input-number-range {
+    background-color: #fff;
+    /*border: 1px solid #dcdfe6;*/
+    border-radius: 4px;
+  }
+  .flex {
+    display: flex;
+    flex-direction: row;
+    width: 100%;
+    justify-content: center;
+    align-items: center;
+    .center {
+      margin-top: 1px;
+    }
+  }
+  .is-disabled {
+    background-color: #eef0f6;
+    border-color: #e4e7ed;
+    color: #c0c4cc;
+    cursor: not-allowed;
+  }
+</style>

+ 230 - 0
src/views/workContract/WorkContractBorrowForm.vue

@@ -0,0 +1,230 @@
+<template>
+<div>
+  <el-form size="middle" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="method==='view'"
+           label-width="150px">
+    <el-row  :gutter="0">
+      <el-col :span="12">
+        <el-form-item label="合同名称" prop="name">
+          <el-input :disabled="true" v-model="inputForm.name"></el-input>
+        </el-form-item>
+      </el-col>
+
+      <el-col :span="12">
+        <el-form-item label="合同编号" prop="no">
+          <el-input :disabled="true" v-model="inputForm.no"></el-input>
+        </el-form-item>
+      </el-col>
+
+      <el-col :span="12">
+        <el-form-item label="客户名称" prop="clientName">
+          <el-input :disabled="true" v-model="inputForm.clientName"></el-input>
+        </el-form-item>
+      </el-col>
+
+      <el-col :span="12">
+        <el-form-item label="借用人" prop="borrowName">
+          <el-input :disabled="true" v-model="inputForm.borrowName"></el-input>
+        </el-form-item>
+      </el-col>
+
+      <el-col :span="12">
+        <el-form-item label="借用日期" prop="borrowData" :rules="[
+                  {required: true, message:'请填写借用日期', trigger:'blur'}
+               ]">
+          <el-date-picker
+            style="width: 100%"
+            :disabled="this.inputForm.borrowType === '2'"
+            v-model="inputForm.borrowData"
+            value-format="yyyy-MM-dd"
+            placeholder="选择日期">
+          </el-date-picker>
+        </el-form-item>
+      </el-col>
+
+      <el-col :span="12">
+        <el-form-item label="大概归还日期" prop="borrowRetData" :rules="[
+                  {required: true, message:'请填写大概归还日期', trigger:'blur'}
+               ]">
+          <el-date-picker
+            style="width: 100%"
+            :disabled="this.inputForm.borrowType === '2'"
+            v-model="inputForm.borrowRetData"
+            value-format="yyyy-MM-dd"
+            placeholder="选择日期">
+          </el-date-picker>
+        </el-form-item>
+      </el-col>
+
+    </el-row>
+
+    <el-form-item label="备注" prop="remarks">
+      <el-input v-model="inputForm.remarks"
+                :disabled="this.inputForm.borrowType === '2'"
+                type="textarea"
+                :rows="5"
+                maxlength="500"
+                placeholder="请输入备注"
+                show-word-limit>
+      </el-input>
+    </el-form-item>
+
+  </el-form>
+</div>
+</template>
+
+<script>
+  import WorkContractService from '@/api/sys/WorkContractService'
+  import WorkContractBorrowService from '@/api/sys/WorkContractBorrowService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          id: '',
+          name: '',
+          no: '',
+          clientName: '',
+          borrowName: '',
+          borrowData: '',
+          borrowRetData: '',
+          remarks: '',
+          borrowType: '',
+          type: ''
+        }
+      }
+    },
+    props: {
+      businessId: {
+        type: String,
+        default: ''
+      },
+      formReadOnly: {
+        type: Boolean,
+        default: false
+      }
+    },
+    components: {
+    },
+    workContractBorrowService: null,
+    workContractService: null,
+    created () {
+      this.workContractBorrowService = new WorkContractBorrowService()
+      this.workContractService = new WorkContractService()
+    },
+    watch: {
+      'businessId': {
+        handler (newVal) {
+          if (this.businessId) {
+            this.init(this.businessId)
+          } else {
+            this.$nextTick(() => {
+              this.$refs.inputForm.resetFields()
+            })
+          }
+        },
+        immediate: true,
+        deep: false
+      }
+    },
+    computed: {
+      userName () {
+        return JSON.parse(localStorage.getItem('user')).name
+      }
+    },
+    methods: {
+      init (id) {
+        if (id) {
+          this.loading = true
+          this.inputForm.id = id
+          this.$nextTick(() => {
+            console.log('id', id)
+            this.$refs.inputForm.resetFields()
+            this.workContractBorrowService.findById(this.inputForm.id).then(({data}) => {
+              if (this.commonJS.isEmpty(data.id)) {
+                this.workContractService.findById(this.inputForm.id).then(({data}) => {
+                  this.inputForm = this.recover(this.inputForm, data)
+                  this.inputForm.borrowName = this.userName
+                  this.inputForm.borrowData = new Date()
+                  this.loading = false
+                })
+              } else {
+                this.inputForm = this.recover(this.inputForm, data)
+                this.inputForm.borrowName = this.userName
+                this.inputForm.borrowData = new Date()
+                this.loading = false
+              }
+            })
+          })
+        }
+      },
+      // 表单提交
+      startForm (callback) {
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            let id = this.inputForm.id
+            this.loading = true
+            this.inputForm.contractInfoId = id
+            this.inputForm.borrowType = '2'
+            console.log('dosubmit', this.inputForm)
+            this.workContractBorrowService.save(this.inputForm).then(({data}) => {
+              callback(data.businessTable, data.businessId, this.inputForm)
+              this.$refs.inputForm.resetFields()
+              this.loading = false
+            }).catch(() => {
+              this.$refs.inputForm.resetFields()
+              this.loading = false
+            })
+          }
+        })
+      },
+      // 同意
+      agreeForm (callback) {
+        this.inputForm.borrowType = '5'
+        this.workContractBorrowService.updateStatusById(this.inputForm).then(() => {
+          this.workContractBorrowService.updateMessageStatusById(this.inputForm).then(({data}) => {
+            callback(data.businessTable, data.businessId, this.inputForm)
+            this.$refs.inputForm.resetFields()
+            this.loading = false
+          }).catch(() => {
+            this.$refs.inputForm.resetFields()
+            this.loading = false
+          })
+        }).catch(() => {
+          this.$refs.inputForm.resetFields()
+          this.loading = false
+        })
+      },
+      // 关闭
+      close () {
+        this.$refs.inputForm.resetFields()
+        this.visible = false
+        this.businessId = ''
+      },
+      // 更改状态
+      updateStatusById (type) {
+        console.log('updateStatusById', this.inputForm)
+        if (type === 'agree') {
+          this.inputForm.borrowType = '5'
+          this.workContractBorrowService.updateStatusById(this.inputForm)
+        }
+        if (type === 'reject') {
+          this.inputForm.borrowType = '0'
+          this.workContractBorrowService.updateStatusById(this.inputForm).then(() => {
+            this.inputForm.borrowType = '3'
+            this.inputForm.type = 'reject'
+            this.workContractBorrowService.updateMessageStatusById(this.inputForm)
+          })
+        }
+        if (type === 'reback') {
+          this.inputForm.borrowType = '0'
+          this.workContractBorrowService.updateStatusById(this.inputForm)
+        }
+      }
+    }
+  }
+</script>
+
+

+ 89 - 0
src/views/workContract/WorkContractBorrowMessageForm.vue

@@ -0,0 +1,89 @@
+<template>
+  <el-dialog
+    :title="title"
+    :close-on-click-modal="false"
+    v-dialogDrag
+    width="1200px"
+    @close="close()"
+    :visible.sync="visible">
+  <div class="page">
+      <el-form size="small" :inline="true" @submit.native.prevent>
+        <div style="height: calc(100% - 80px);">
+            <vxe-table
+                border="inner"
+                auto-resize
+                resizable
+                height="500px"
+                :loading="loading"
+                size="small"
+                ref="workClientTable"
+                show-header-overflow
+                show-overflow
+                highlight-hover-row
+                :menu-config="{}"
+                :print-config="{}"
+                :sort-config="{remote:true}"
+                :data="dataList"
+                :checkbox-config="{}">
+
+                <vxe-column width="300px" title="合同名称" field="name"></vxe-column>
+                <vxe-column width="100px" title="借用人" field="borrowName" ></vxe-column>
+                <vxe-column width="100px" title="借用状态" field="borrowType" >
+                  <template slot-scope="scope">
+                    {{ $dictUtils.getDictLabel("borrow_type", scope.row.borrowType, '-') }}
+                  </template>
+                </vxe-column>
+                <vxe-column width="200px" title="借用时间" field="borrowData" ></vxe-column>
+                <vxe-column width="200px" title="大概归还时间" field="borrowRetData" ></vxe-column>
+                <vxe-column width="200px" title="实际归还时间" field="retData">
+                  <template slot-scope="scope">
+                    {{getRetData(scope.row.retData)}}
+                  </template>
+                </vxe-column>
+
+            </vxe-table>
+        </div>
+      </el-form>
+  </div>
+  </el-dialog>
+</template>
+
+<script>
+  import WorkContractBorrowService from '@/api/sys/WorkContractBorrowService'
+  export default {
+    data () {
+      return {
+        title: '',
+        visible: false,
+        loading: false,
+        dataList: []
+      }
+    },
+    workContractBorrowService: null,
+    created () {
+      this.workContractBorrowService = new WorkContractBorrowService()
+    },
+    methods: {
+      // 获取数据列表
+      findList (id) {
+        this.loading = true
+        this.visible = true
+        this.title = '合同借用详情'
+        this.workContractBorrowService.findMessageList(id).then(({data}) => {
+          this.dataList = data
+          this.loading = false
+        })
+      },
+      close () {
+        this.visible = false
+        this.dataList = []
+      },
+      getRetData (value) {
+        if (value) {
+          return value
+        }
+        return '--'
+      }
+    }
+  }
+</script>

+ 173 - 0
src/views/workContract/WorkContractChooseCom.vue

@@ -0,0 +1,173 @@
+<template>
+  <div>
+    <el-dialog
+      title="选择合同"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      width="1300px"
+      height="500px"
+      @close="close"
+      append-to-body
+      @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" @submit.native.prevent>
+          <!-- 搜索框-->
+          <el-form-item label="客户名称" prop="clientName">
+            <el-input size="small" v-model="searchForm.clientName" placeholder="请输入客户名称" clearable></el-input>
+          </el-form-item>
+
+          <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="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"
+          :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="200px" title="合同编号" field="no" align="center"></vxe-column>
+          <vxe-column min-width="200px" title="合同名称" field="name" align="center"></vxe-column>
+          <vxe-column min-width="100px" title="案卷号" field="filedNo" align="center"></vxe-column>
+          <vxe-column min-width="200px" title="客户名称" field="clientName" align="center"></vxe-column>
+          <vxe-column min-width="100px" title="合同金额(元)" field="contractAmount" align="center"></vxe-column>
+          <vxe-column min-width="100px" title="创建人" field="createBy" align="center"></vxe-column>
+          <vxe-column min-width="150px" title="签订日期" field="contractDate" align="center"></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 ContractInfoService from '@/api/sys/WorkContractService'
+  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: '',
+          procInsId: '',
+          processDefinitionId: ''
+        }
+      }
+    },
+    contractInfoService: null,
+    created () {
+      this.contractInfoService = new ContractInfoService()
+    },
+    components: {
+      SelectUserTree,
+      InputNumber
+    },
+    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.statusList = '2,3,4,5'
+        this.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>

+ 898 - 0
src/views/workContract/WorkContractFileForm.vue

@@ -0,0 +1,898 @@
+<template>
+  <div>
+    <el-form size="middle" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="formReadOnly"
+             label-width="150px">
+      <el-row  :gutter="0">
+        <el-col :span="12">
+          <el-form-item label="客户名称" prop="clientId" :rules="[
+                {required: true, message:'请输入客户名称', trigger:'blur'},
+                {required: true, message:'请输入客户名称', trigger:'change'}
+              ]">
+            <work-client-select
+              :size="'medium'"
+              :value="inputForm.clientId"
+              :disabled="method==='view'"
+              @getValue='(clientId,clientName) => {inputForm.clientId=clientId;inputForm.clientName=clientName}'
+            >
+            </work-client-select>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="合同名称" prop="name"
+                        :rules="[
+                 {required: true, message:'请输入合同名称', trigger:'blur'}
+               ]">
+            <el-input maxlength="64" v-model="inputForm.name" placeholder="请输入合同名称"></el-input>
+          </el-form-item>
+        </el-col>
+
+      </el-row>
+
+      <el-row  :gutter="0">
+
+        <el-col :span="12">
+          <el-form-item label="签订日期" prop="contractDate"
+                        :rules="[
+                {required: true, message:'请输入签订日期', trigger:'blur'}
+               ]">
+            <el-date-picker
+              placement="bottom-start"
+              value-format="yyyy-MM-dd"
+              v-model="inputForm.contractDate"
+              style="width: 100%"
+              placeholder="选择日期">
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="合同生效日期" prop="effectiveDate">
+            <el-date-picker
+              placement="bottom-start"
+              value-format="yyyy-MM-dd"
+              v-model="inputForm.effectiveDate"
+              style="width: 100%"
+              placeholder="选择日期">
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="合同终止日期" prop="closingDate">
+            <el-date-picker
+              @change="checkData"
+              placement="bottom-start"
+              value-format="yyyy-MM-dd"
+              v-model="inputForm.closingDate"
+              style="width: 100%"
+              placeholder="选择日期">
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="合同类型" prop="contractType"
+                        :rules="[
+                {required: true, message:'请选择合同类型', trigger:'blur'}
+              ]">
+            <el-select v-model="inputForm.contractType" placeholder="请选择" style="width:100%;">
+              <el-option
+                v-for="item in $dictUtils.getDictList('contract_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="contractAmountType"
+                        :rules="[
+                  {required: true, message:'请选择合同金额类别', trigger:'blur'}
+               ]">
+            <el-radio-group v-model="inputForm.contractAmountType">
+              <el-radio v-for="item in $dictUtils.getDictList('contract_amount_type')" :label="item.value" >{{item.label}}</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="合同/预计金额(元)" prop="contractAmount" v-if="inputForm.contractAmountType === '1'"
+                        :rules="[
+                  {required: true, message:'请输入合同/预计金额(元)', trigger:'blur'}
+               ]">
+            <el-input maxlength="15" v-model="inputForm.contractAmount" placeholder="请输入合同/预计金额(元)"
+                      @keyup.native="inputForm.contractAmount = twoDecimalPlaces(inputForm.contractAmount)"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="对方合同编号" prop="contractOpposite">
+            <el-input maxlength="64" v-model="inputForm.contractOpposite" placeholder="请填写对方合同编号"></el-input>
+          </el-form-item>
+        </el-col>
+
+      </el-row>
+
+      <el-row>
+        <el-col :span="24">
+          <el-form-item label="收费标准" prop="contractFees">
+            <el-checkbox-group v-model="inputForm.contractFees">
+              <el-checkbox @change="changeContractFee" v-for="item in $dictUtils.getDictList('contract_fee_pg')" :label="item.value">
+                {{item.label}}
+              </el-checkbox>
+            </el-checkbox-group>
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-row>
+        <el-col :span="24">
+          <el-form-item prop="contractFee">
+            <el-input style="width: 100%" placeholder="请选择收费标准" v-model="inputForm.contractFee"></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-row></el-row>
+
+      <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-row>
+        <el-col :span="12">
+          <el-form-item label="合同编号" prop="no">
+            <el-input :disabled="true" v-model="inputForm.no"></el-input>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="归档人" prop="fileCreateName">
+            <el-input :disabled="true" v-model="this.userName"></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+
+    <el-form size="middle" :model="inputForm" ref="inputForm2" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="status !== 'audit'"
+             label-width="150px">
+    <el-row v-if="this.inputForm.filedType === '2'">
+      <el-col :span="12">
+        <el-form-item label="案卷号" prop="filedNo" :rules="[
+                  {required: true, message:'请填写案卷号', trigger:'blur'}
+               ]">
+          <el-input v-model="inputForm.filedNo" placeholder="请填写案卷号"></el-input>
+        </el-form-item>
+      </el-col>
+
+      <el-col :span="12">
+        <el-form-item label="确认案卷号" prop="confirmFiledNo" :rules="[
+                  {required: true, message:'请填写确认案卷号', trigger:'blur'}
+               ]">
+          <el-input v-model="inputForm.confirmFiledNo" placeholder="请填写确认案卷号"></el-input>
+        </el-form-item>
+      </el-col>
+    </el-row>
+    </el-form>
+    <el-image-viewer
+      v-if="showViewer"
+      :on-close="closeViewer"
+      :url-list="[url]"
+      zIndex="9999"/>
+    <UpLoadComponent ref="uploadComponent"></UpLoadComponent>
+  </div>
+</template>
+
+<script>
+  import UpLoadComponent from '@/views/common/UpLoadComponent'
+  import WorkContractService from '@/api/sys/WorkContractService'
+  import WorkContractFileService from '@/api/sys/WorkContractFileService'
+  import WorkClientService from '@/api/sys/WorkClientService'
+  import WorkClientSelect from '@/components/workClientInfoSelect'
+  import UserService from '@/api/sys/UserService'
+  import OSSSerive, {
+    httpRequest,
+    toHref,
+    openWindowOnUrl,
+    handleRemove,
+    fileName
+  } from '@/api/sys/OSSService'
+  import moment from 'moment'
+  import ElImageViewer from 'element-ui/packages/image/src/image-viewer'
+  export default {
+    data () {
+      return {
+        visable: false,
+        gridData: [],
+        radio: 0,
+        tableData: [],
+        dataList: [],
+        dataListNew: [],
+        title: '',
+        method: '',
+        isSubmit: false,
+        isFiled: false,
+        isFileApproval: false,
+        visible: false,
+        loading: false,
+        returnForm: {
+          clientId: '',
+          name: '',
+          contractDate: '',
+          effectiveDate: '',
+          closingDate: '',
+          contractType: '',
+          contractAmountType: '',
+          contractAmount: '',
+          contractOpposite: '',
+          contractFees: [],
+          fees: '',
+          contractFee: '',
+          describes: '',
+          contractSpecial: '',
+          remarks: '',
+          clientName: '',
+          workAttachmentList: [],
+          status: ''
+        },
+        inputForm: {
+          clientId: '',
+          name: '',
+          contractDate: '',
+          effectiveDate: '',
+          closingDate: '',
+          contractType: '',
+          contractAmountType: '',
+          contractAmount: '',
+          contractOpposite: '',
+          contractFees: [],
+          fees: '',
+          contractFee: '',
+          describes: '',
+          contractSpecial: '',
+          remarks: '',
+          clientName: '',
+          permissionFlag: '',
+          showVi: true,
+          workAttachmentList: [],
+          status: '',
+          contractFileId: '',
+          contractInfoId: '',
+          filedType: '',
+          filedNo: '',
+          confirmFiledNo: ''
+        },
+        filesArra2: [],
+        fileList: [],
+        isFlag: true,
+        showViewer: false, // 显示查看器
+        url: '',
+        rowurl: '',
+        src: '',
+        onedit: false,
+        type: '',
+        loadProgress: 0, // 动态显示进度条
+        progressFlag: false, // 关闭进度条
+        promi: null
+      }
+    },
+    props: {
+      businessId: {
+        type: String,
+        default: ''
+      },
+      formReadOnly: {
+        type: Boolean,
+        default: false
+      },
+      status: {
+        type: String,
+        default: ''
+      }
+    },
+    components: {
+      ElImageViewer,
+      UpLoadComponent,
+      WorkClientSelect
+    },
+    computed: {
+      userName () {
+        return JSON.parse(localStorage.getItem('user')).name
+      }
+    },
+    ossService: null,
+    workContractService: null,
+    workContractFileService: null,
+    workClientService: null,
+    userService: null,
+    created () {
+      this.ossService = new OSSSerive()
+      this.workContractService = new WorkContractService()
+      this.workContractFileService = new WorkContractFileService()
+      this.workClientService = new WorkClientService()
+      this.userService = new UserService()
+    },
+    mounted () {
+      window.onPreview = this.onPreview
+    },
+    watch: {
+      'businessId': {
+        handler (newVal) {
+          if (this.status && this.status === 'startAndHoldFiled') {
+            this.isFiled = true
+          }
+          if (this.businessId && this.businessId !== 'false') {
+            this.ossService = new OSSSerive()
+            this.init('edit', this.businessId)
+          } else {
+            // this.$refs.inputForm.resetFields()
+            // this.visible = false
+            // this.showVi = true
+            // this.$refs.uploadComponent.clearUpload()
+            this.init('clean', '')
+          }
+        },
+        immediate: true,
+        deep: false
+      },
+      'loading': {
+        handler (newVal) {
+          this.$emit('changeLoading', newVal)
+          this.$refs.uploadComponent.changeLoading(newVal)
+        }
+      }
+    },
+    methods: {
+      uploadVideoProcess (event, file, fileList) {
+        this.progressFlag = true // 显示进度条
+        this.loadProgress = parseInt(event.percent) // 动态获取文件上传进度
+        if (this.loadProgress >= 100) {
+          this.loadProgress = 100
+          setTimeout(() => { this.progressFlag = false }, 1000) // 一秒后关闭进度条
+        }
+      },
+      async toHref (row) {
+        toHref(row)
+      },
+      onPreview (url) {
+        this.url = url
+        this.showViewer = true
+      },
+      // 关闭查看器
+      closeViewer () {
+        this.url = ''
+        this.showViewer = false
+      },
+      init (method, id) {
+        this.dataList = []
+        this.dataListNew = []
+        this.method = method
+        this.inputForm = {
+          clientId: '',
+          name: '',
+          contractDate: '',
+          effectiveDate: '',
+          closingDate: '',
+          contractType: '',
+          contractAmountType: '',
+          contractAmount: '',
+          contractOpposite: '',
+          contractFees: [],
+          fees: '',
+          contractFee: '',
+          describes: '',
+          contractSpecial: '',
+          remarks: '',
+          clientName: '',
+          filesArra2: [],
+          fileList: [],
+          isFlag: true,
+          showViewer: false, // 显示查看器
+          url: '',
+          rowurl: '',
+          src: '',
+          showVi: true,
+          workAttachmentList: [],
+          contractFileId: '',
+          status: '',
+          filedType: ''
+        }
+        this.inputForm.id = id
+        if (method === 'add') {
+          // this.inputForm.contractAmountType = '1'
+          this.title = `新建合同登记`
+        } else if (method === 'edit') {
+          this.title = '修改合同登记'
+        } else if (method === 'view') {
+          this.inputForm.showVi = false
+          this.title = '查看合同登记'
+        }
+        this.visible = true
+        this.loading = false
+        this.$nextTick(async () => {
+          this.$refs.inputForm.resetFields()
+          if (method === 'edit' || method === 'view') { // 修改或者查看
+            this.loading = true
+            await this.workContractService.findById(this.inputForm.id).then(async ({data}) => {
+              if (this.commonJS.isEmpty(data.id)) {
+                this.workContractFileService.findById(this.inputForm.id).then(({data}) => {
+                  this.workContractService.findById(data.contractInfoId).then(async ({data}) => {
+                    await this.saveData(data)
+                    if (this.formReadOnly) {
+                      method = 'view'
+                    }
+                    this.$refs.uploadComponent.newUpload(method, this.inputForm.workAttachmentList, 'workContract', 300, '合同文本、补充协议')
+                  })
+                })
+              } else {
+                await this.saveData(data)
+                if (this.formReadOnly) {
+                  method = 'view'
+                }
+                this.$refs.uploadComponent.newUpload(method, this.inputForm.workAttachmentList, 'workContract', 300, '合同文本、补充协议')
+              }
+              const f = []
+              if (data.fees !== null && data.fees !== undefined && data.fees !== '') {
+                data.fees.split(',').forEach(item => {
+                  if (item !== null && item !== undefined && item !== '') {
+                    f.push(item)
+                  }
+                })
+              }
+              this.inputForm.contractFees = f
+              this.loading = false
+            })
+            // setTimeout(() => {
+            //   console.log('123', this.inputForm.workAttachmentList)
+            //   this.$refs.uploadComponent.newUpload(method, this.inputForm.workAttachmentList, 'workContract', 300, '合同文本、补充协议')
+            // }, 500)
+          }
+        })
+      },
+      saveData (data) {
+        this.inputForm = this.recover(this.inputForm, data)
+        this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
+      },
+      // 表单提交
+      // 暂存
+      async saveForm (callback) {
+        // 合同登记暂存
+        if (this.status === 'startAndHold' || this.status === 'startAndHoldFiled') {
+          this.loading = true
+          this.inputForm.workAttachmentList = this.$refs.uploadComponent.getDataList()
+          this.inputForm.fees = this.inputForm.contractFees.join(',')
+          if (this.status === 'startAndHold') {
+            this.inputForm.status = '1'
+          }
+          if (this.status === 'startAndHoldFiled') {
+            this.inputForm.status = '5'
+          }
+          await this.workContractService.save(this.inputForm)
+        }
+        // 合同登记归档暂存
+        if (this.status === 'startAndHoldFiled') {
+          this.inputForm.filedType = '1'
+          this.inputForm.contractInfoId = this.businessId
+          this.workContractFileService.save(this.inputForm)
+        }
+        this.$refs.inputForm.resetFields()
+        this.loading = false
+        this.businessId = ''
+        callback()
+      },
+      startForm (callback) {
+        this.loading = true
+        if (this.commonJS.isNotEmpty(this.inputForm.contractFileId)) {
+          this.workContractFileService.findById(this.inputForm.contractFileId).then(({data}) => {
+            if (this.commonJS.isNotEmpty(data.filedType) && data.filedType !== '0' && data.filedType !== '1' && data.filedType !== '3') { // 审核状态不是“未发起”或“暂存”或“撤回”,就弹出提示
+              this.loading = false
+              this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+              throw new Error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+            } else {
+              this.startFormTrue(callback)
+            }
+          })
+        } else {
+          this.startFormTrue(callback)
+        }
+      },
+      // 送审
+      startFormTrue (callback) {
+        let id = this.inputForm.id
+        this.loading = true
+        this.inputForm.workAttachmentList = this.$refs.uploadComponent.getDataList()
+        this.inputForm.status = '5'
+        if (this.inputForm.contractFees !== undefined && this.inputForm.contractFees !== null) {
+          this.inputForm.fees = this.inputForm.contractFees.join(',')
+        }
+        this.workContractService.save(this.inputForm)
+        this.inputForm.filedType = '2'
+        this.inputForm.contractInfoId = id
+        this.workContractFileService.save(this.inputForm).then(({data}) => {
+          this.inputForm.contractFileId = data.businessId
+          callback(data.businessTable, data.businessId, this.inputForm)
+          this.$refs.inputForm.resetFields()
+          this.loading = false
+          this.businessId = ''
+        })
+      },
+      reapplyForm (callback) {
+        this.loading = true
+        this.workContractFileService.findById(this.inputForm.contractFileId).then(({data}) => {
+          if (data.filedType !== '4') { // 审核状态不是“驳回”,就弹出提示
+            this.loading = false
+            this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+            throw new Error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+          } else {
+            this.startFormTrue(callback)
+          }
+        })
+      },
+      // 通过
+      agreeForm (callback) {
+        this.loading = true
+        this.$refs['inputForm2'].validate(async (valid) => {
+          if (valid) {
+            await this.workContractFileService.findById(this.inputForm.contractFileId).then(({data}) => {
+              if (data.filedType !== '2') { // status的值不等于“审核中”,就弹出提示
+                this.loading = false
+                this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+                throw new Error()
+              } else {
+                let id = this.inputForm.id
+                this.loading = true
+                if (this.inputForm.filedNo !== this.inputForm.confirmFiledNo) {
+                  this.loading = false
+                  this.$message.warning(`案卷号和确认案卷号不一致`)
+                  throw new Error('案卷号和确认案卷号不一致')
+                }
+                this.inputForm.workAttachmentList = this.$refs.uploadComponent.getDataList()
+                this.inputForm.status = '5'
+                if (this.inputForm.contractFees !== undefined && this.inputForm.contractFees !== null) {
+                  this.inputForm.fees = this.inputForm.contractFees.join(',')
+                }
+                this.inputForm.filedType = '5'
+                this.workContractService.save(this.inputForm)
+                this.inputForm.contractInfoId = id
+                this.workContractFileService.save(this.inputForm).then(({data}) => {
+                  callback(data.businessTable, data.businessId, this.inputForm)
+                  this.$refs.inputForm.resetFields()
+                  this.loading = false
+                  this.businessId = ''
+                })
+              }
+            })
+            // let id = this.inputForm.id
+            // this.loading = true
+            // if (this.inputForm.filedNo !== this.inputForm.confirmFiledNo) {
+            //   this.loading = false
+            //   this.$message.warning(`案卷号和确认案卷号不一致`)
+            //   throw new Error('案卷号和确认案卷号不一致')
+            // }
+            // this.inputForm.workAttachmentList = this.$refs.uploadComponent.getDataList()
+            // this.inputForm.status = '5'
+            // if (this.inputForm.contractFees !== undefined && this.inputForm.contractFees !== null) {
+            //   this.inputForm.fees = this.inputForm.contractFees.join(',')
+            // }
+            // this.inputForm.filedType = '5'
+            // this.workContractService.save(this.inputForm)
+            // this.inputForm.contractInfoId = id
+            // this.workContractFileService.save(this.inputForm).then(({data}) => {
+            //   callback(data.businessTable, data.businessId, this.inputForm)
+            //   this.$refs.inputForm.resetFields()
+            //   this.loading = false
+            //   this.businessId = ''
+            // })
+          } else {
+            this.loading = false
+          }
+        })
+      },
+      close () {
+        this.$refs.inputForm.resetFields()
+        this.$refs.inputForm2.resetFields()
+        this.inputForm.clientName = ''
+        this.visible = false
+        this.showVi = true
+        this.businessId = ''
+        this.$refs.uploadComponent.clearUpload()
+      },
+      httpRequest (file) {
+        httpRequest(file, fileName(file), 'workContract')
+      },
+      handleRemove () {
+        this.fileList = handleRemove()
+      },
+      changes (file, fileList) {
+        this.dataListNew = []
+        this.dataList.forEach((item) => {
+          this.dataListNew.push(item)
+        })
+        fileList.forEach((item) => {
+          item.createDate = moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+          item.createBy = this.$store.state.user.name
+          this.dataListNew.push(item)
+        })
+        const isLt2M = file.size / 1024 / 1024 < 300
+        if (isLt2M === false) {
+          this.$message.error('文件大小不能超过 ' + 300 + 'M !')
+          this.fileList = []
+          this.filesArra2 = []
+        }
+      },
+      async showFile (row) {
+        await openWindowOnUrl(row)
+      },
+      // 排序
+      sortChangeHandle (column) {
+        this.orders = []
+        if (column.order != null) {
+          this.orders.push({column: this.$utils.toLine(column.prop), asc: column.order === 'ascending'})
+        }
+        this.refreshList()
+      },
+      deleteMsgById (row, index) {
+        this.dataListNew.splice(index, 1)
+        if (row.id !== null && row.id !== '' && row.id !== undefined) {
+          this.ossService.deleteMsgById(row.id)
+        }
+      },
+      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
+      },
+      positiveInteger (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 no-useless-escape
+        str = str.replace(/[^\d^]+/g, '') // 保留数字
+        return str
+      },
+      tableRowClassName ({row, rowIndex}) {
+        row.index = rowIndex
+      },
+      handleRadioChange (val) {
+        if (val) {
+          this.radio = val.index
+        }
+      },
+      // 关闭窗口时调用
+      closeXTable () {
+        this.closePop()
+      },
+      rowStyle (event) {
+        return 'cursor:pointer;'
+      },
+      async rowClick (event) {
+        let id = this.gridData[event.rowIndex].id
+        this.inputForm.clientId = id
+        await this.workClientService.findById(id).then((data) => {
+          this.inputForm.clientName = data.data.workClientInfo.name
+        })
+        this.visable = false
+      },
+      async getPopTable () {
+        let name = this.inputForm.clientName
+        await this.workClientService.list(name).then(({data}) => {
+          this.gridData = data.records
+        })
+        this.$refs.pops.updatePopper()
+      },
+      closePop () {
+        this.visable = false
+      },
+      changeContractFee () {
+        let fee = ''
+        let fees = this.inputForm.contractFees
+        if (fees.length > 0) {
+          fees.forEach(i => {
+            if (i === '1') {
+              i = '苏会协[2010]52号'
+              fee = fee + ';' + i
+            }
+            if (i === '2') {
+              i = '苏政办发[2010]101号'
+              fee = fee + ';' + i
+            }
+            if (i === '3') {
+              i = '苏价费[2010]284号'
+              fee = fee + ';' + i
+            }
+            if (i === '4') {
+              i = '发改价格[2010]196号'
+              fee = fee + ';' + i
+            }
+            if (i === '5') {
+              i = '其他'
+              fee = fee + ';' + i
+            }
+            this.inputForm.contractFee = fee.substring(1, fee.length)
+          })
+        } else {
+          this.inputForm.contractFee = ''
+        }
+        // if (fees.length > 0) {
+        //   fees.forEach(i => {
+        //     if (i === '1') {
+        //       i = '计价格(2002)1980号文下浮%'
+        //     }
+        //     if (i === '2') {
+        //       i = '苏价服(2014)383号文下浮%'
+        //     }
+        //     if (i === '3') {
+        //       i = '标段 元/标段'
+        //     }
+        //     if (i === '4') {
+        //       i = '其他'
+        //     }
+        //     fee = fee + ';' + i
+        //     this.inputForm.contractFee = fee.substring(1, fee.length)
+        //   })
+        // }
+      },
+      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.workContractFileService.findById(this.inputForm.contractFileId).then(({data}) => {
+              if (data.filedType !== '2') { // status的值不等于“审核中”,就弹出提示
+                this.loading = false
+                this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+                throw new Error()
+              } else {
+                // if (type === 'agree') {
+                //   // 同意
+                //   this.inputForm.status = '5'
+                // }
+                if (type === 'reject') {
+                  // 驳回
+                  this.inputForm.filedType = '4'
+                }
+                if (type === 'reback') {
+                  // 撤回
+                  this.inputForm.filedType = '3'
+                }
+                if (type === 'reject' || type === 'reback') {
+                  let param = {filedType: this.inputForm.filedType, id: this.inputForm.id}
+                  this.workContractFileService.updateStatusById(param).then(() => {
+                    this.loading = false
+                    callback()
+                  })
+                }
+              }
+            })
+          } else if (type === 'hold') {
+            this.workContractFileService.findById(this.inputForm.contractFileId).then(({data}) => {
+              if (data.filedType !== '4') { // status的值不等于“驳回”就弹出提示
+                this.loading = false
+                this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+                throw new Error()
+              } else {
+                // 终止
+                let param = {filedType: '1', id: this.inputForm.id}
+                this.workContractFileService.updateStatusById(param).then(() => {
+                  this.loading = false
+                  callback()
+                })
+              }
+            })
+          }
+        }
+      },
+      // updateStatusById (type) {
+      //   console.log('updateStatusById', this.inputForm)
+      //   if (type === 'agree') {
+      //     this.inputForm.filedType = '5'
+      //     this.workContractFileService.updateStatusById(this.inputForm)
+      //   }
+      //   if (type === 'reject') {
+      //     this.inputForm.filedType = '4'
+      //     this.workContractFileService.updateStatusById(this.inputForm)
+      //   }
+      //   if (type === 'reback') {
+      //     this.inputForm.filedType = '3'
+      //     this.workContractFileService.updateStatusById(this.inputForm)
+      //   }
+      // },
+      checkData () {
+        let begin = this.inputForm.effectiveDate
+        let close = this.inputForm.closingDate
+        if (close < begin) {
+          this.$message.warning(`合同终止日期要大于合同开始日期`)
+          this.inputForm.closingDate = ''
+        }
+      },
+      checkFiledNo () {
+        let filedNo = this.inputForm.filedNo
+        let confirmFiledNo = this.inputForm.confirmFiledNo
+        if (filedNo !== confirmFiledNo) {
+          this.$message.warning(`案卷号和确认案卷号不一致`)
+          this.inputForm.confirmFiledNo = ''
+        }
+      },
+      filedNoIsEmpty (callback) {
+        if (this.commonJS.isEmpty(this.inputForm.filedNo) || this.commonJS.isEmpty(this.inputForm.confirmFiledNo)) {
+          this.$message.warning(`请输入案卷号和确认案卷号`)
+          let i = 'false'
+          // callback(new Error('请输入案卷号和确认案卷号'))
+          callback(i)
+          return
+        }
+        callback()
+      }
+    }
+  }
+</script>
+
+<style>
+  .tid_40 .vxe-body--column .vxe-cell{
+    padding: 1px;
+    text-align: center;
+  }
+  .tid_40 .vxe-header--row .col--last{
+    text-align: center;
+  }
+  .tid_45 .vxe-body--column .vxe-cell{
+    padding: 1px;
+    text-align: center;
+  }
+  .tid_45 .vxe-header--row .col--last{
+    text-align: center;
+  }
+</style>
+
+<style scoped>
+  .avatar{
+    height: 100px;
+  }
+  .el-divider__text {
+    font-weight: bold;
+    font-size: 16px;
+  }
+</style>

+ 726 - 0
src/views/workContract/WorkContractForm.vue

@@ -0,0 +1,726 @@
+<template>
+  <div>
+    <el-form size="middle" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="formReadOnly"
+             label-width="150px">
+      <el-row  :gutter="0">
+        <el-col :span="12">
+          <el-form-item label="客户名称" prop="clientId" :rules="[
+                {required: true, message:'请输入客户名称', trigger:'blur'},
+                {required: true, message:'请输入客户名称', trigger:'change'}
+              ]">
+            <work-client-select
+              :size="'medium'"
+              :value="inputForm.clientId"
+              :disabled="method==='view'"
+              @getValue='(clientId,clientName) => {inputForm.clientId=clientId;inputForm.clientName=clientName}'
+            >
+            </work-client-select>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="合同名称" prop="name"
+                        :rules="[
+                 {required: true, message:'请输入合同名称', trigger:'blur'}
+               ]">
+            <el-input maxlength="64" v-model="inputForm.name" placeholder="请输入合同名称"></el-input>
+          </el-form-item>
+        </el-col>
+
+      </el-row>
+
+      <el-row  :gutter="0">
+
+        <el-col :span="12">
+          <el-form-item label="签订日期" prop="contractDate"
+               :rules="[
+                {required: true, message:'请输入签订日期', trigger:'blur'}
+               ]">
+            <el-date-picker
+              placement="bottom-start"
+              value-format="yyyy-MM-dd"
+              v-model="inputForm.contractDate"
+              style="width: 100%"
+              placeholder="选择日期">
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="合同生效日期" prop="effectiveDate">
+            <el-date-picker
+              placement="bottom-start"
+              value-format="yyyy-MM-dd"
+              v-model="inputForm.effectiveDate"
+              style="width: 100%"
+              placeholder="选择日期">
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="合同终止日期" prop="closingDate">
+            <el-date-picker
+              @change="checkData"
+              placement="bottom-start"
+              value-format="yyyy-MM-dd"
+              v-model="inputForm.closingDate"
+              style="width: 100%"
+              placeholder="选择日期">
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="合同类型" prop="contractType"
+              :rules="[
+                {required: true, message:'请选择合同类型', trigger:'blur'}
+              ]">
+            <el-select v-model="inputForm.contractType" placeholder="请选择" style="width:100%;">
+              <el-option
+                v-for="item in $dictUtils.getDictList('contract_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="contractAmountType"
+               :rules="[
+                  {required: true, message:'请选择合同金额类别', trigger:'blur'}
+               ]">
+            <el-radio-group v-model="inputForm.contractAmountType">
+              <el-radio v-for="item in $dictUtils.getDictList('contract_amount_type')" :label="item.value" >{{item.label}}</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="合同/预计金额(元)" prop="contractAmount" v-if="inputForm.contractAmountType === '1'"
+                        :rules="[
+                  {required: true, message:'请输入合同/预计金额(元)', trigger:'blur'}
+               ]">
+            <el-input maxlength="15" v-model="inputForm.contractAmount" placeholder="请输入合同/预计金额(元)"
+                      @keyup.native="inputForm.contractAmount = twoDecimalPlaces(inputForm.contractAmount)"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="对方合同编号" prop="contractOpposite">
+            <el-input maxlength="64" v-model="inputForm.contractOpposite" placeholder="请填写对方合同编号"></el-input>
+          </el-form-item>
+        </el-col>
+
+      </el-row>
+
+      <el-row>
+        <el-col :span="24">
+          <el-form-item label="收费标准" prop="contractFees">
+            <el-checkbox-group v-model="inputForm.contractFees">
+              <el-checkbox @change="changeContractFee(item.value,$dictUtils.getDictList('contract_fee_pg'))" v-for="item in $dictUtils.getDictList('contract_fee_pg')" :label="item.value">
+                {{item.label}}
+              </el-checkbox>
+            </el-checkbox-group>
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-row>
+        <el-col :span="24">
+          <el-form-item prop="contractFee">
+            <el-input style="width: 100%" placeholder="请选择收费标准" v-model="inputForm.contractFee"></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-row></el-row>
+
+      <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-form>
+      <el-image-viewer
+        v-if="showViewer"
+        :on-close="closeViewer"
+        :url-list="[url]"
+        zIndex="9999"/>
+    <UpLoadComponent ref="uploadComponent"></UpLoadComponent>
+  </div>
+</template>
+
+<script>
+  import UpLoadComponent from '@/views/common/UpLoadComponent'
+  import WorkContractService from '@/api/sys/WorkContractService'
+  import WorkClientService from '@/api/sys/WorkClientService'
+  import WorkClientSelect from '@/components/workClientInfoSelect'
+  import OSSSerive, {
+    httpRequest,
+    toHref,
+    openWindowOnUrl,
+    handleRemove,
+    fileName
+  } from '@/api/sys/OSSService'
+  import moment from 'moment'
+  import ElImageViewer from 'element-ui/packages/image/src/image-viewer'
+  export default {
+    data () {
+      return {
+        visable: false,
+        gridData: [],
+        radio: 0,
+        tableData: [],
+        dataList: [],
+        dataListNew: [],
+        title: '',
+        method: '',
+        isSubmit: false,
+        visible: false,
+        loading: false,
+        returnForm: {
+          clientId: '',
+          name: '',
+          contractDate: '',
+          effectiveDate: '',
+          closingDate: '',
+          contractType: '',
+          contractAmountType: '',
+          contractAmount: '',
+          contractOpposite: '',
+          contractFees: [],
+          fees: '',
+          contractFee: '',
+          describes: '',
+          contractSpecial: '',
+          remarks: '',
+          clientName: '',
+          workAttachmentList: [],
+          status: ''
+        },
+        inputForm: {
+          clientId: '',
+          name: '',
+          contractDate: '',
+          effectiveDate: '',
+          closingDate: '',
+          contractType: '',
+          contractAmountType: '',
+          contractAmount: '',
+          contractOpposite: '',
+          contractFees: [],
+          fees: '',
+          contractFee: '',
+          describes: '',
+          contractSpecial: '',
+          remarks: '',
+          clientName: '',
+          permissionFlag: '',
+          showVi: true,
+          workAttachmentList: [],
+          status: ''
+        },
+        filesArra2: [],
+        fileList: [],
+        isFlag: true,
+        showViewer: false, // 显示查看器
+        url: '',
+        rowurl: '',
+        src: '',
+        onedit: false,
+        type: '',
+        loadProgress: 0, // 动态显示进度条
+        progressFlag: false, // 关闭进度条
+        promi: null
+      }
+    },
+    props: {
+      businessId: {
+        type: String,
+        default: ''
+      },
+      formReadOnly: {
+        type: Boolean,
+        default: false
+      }
+    },
+    components: {
+      ElImageViewer,
+      UpLoadComponent,
+      WorkClientSelect
+    },
+    ossService: null,
+    workContractService: null,
+    workClientService: null,
+    created () {
+      this.ossService = new OSSSerive()
+      this.workContractService = new WorkContractService()
+      this.workClientService = new WorkClientService()
+    },
+    mounted () {
+      window.onPreview = this.onPreview
+    },
+    watch: {
+      'businessId': {
+        handler (newVal) {
+          if (this.businessId && this.businessId !== 'false') {
+            this.ossService = new OSSSerive()
+            this.init('edit', this.businessId)
+          } else {
+            // this.$refs.inputForm.resetFields()
+            // this.visible = false
+            // this.showVi = true
+            // this.$refs.uploadComponent.clearUpload()
+            this.init('clean', '')
+          }
+        },
+        immediate: true,
+        deep: false
+      },
+      'loading': {
+        handler (newVal) {
+          this.$emit('changeLoading', newVal)
+          this.$refs.uploadComponent.changeLoading(newVal)
+        }
+      }
+    },
+    methods: {
+      uploadVideoProcess (event, file, fileList) {
+        this.progressFlag = true // 显示进度条
+        this.loadProgress = parseInt(event.percent) // 动态获取文件上传进度
+        if (this.loadProgress >= 100) {
+          this.loadProgress = 100
+          setTimeout(() => { this.progressFlag = false }, 1000) // 一秒后关闭进度条
+        }
+      },
+      async toHref (row) {
+        toHref(row)
+      },
+      onPreview (url) {
+        this.url = url
+        this.showViewer = true
+      },
+      // 关闭查看器
+      closeViewer () {
+        this.url = ''
+        this.showViewer = false
+      },
+      init (method, id) {
+        this.dataList = []
+        this.dataListNew = []
+        this.method = method
+        this.inputForm = {
+          clientId: '',
+          name: '',
+          contractDate: '',
+          effectiveDate: '',
+          closingDate: '',
+          contractType: '',
+          contractAmountType: '',
+          contractAmount: '',
+          contractOpposite: '',
+          contractFees: [],
+          fees: '',
+          contractFee: '',
+          describes: '',
+          contractSpecial: '',
+          remarks: '',
+          clientName: '',
+          filesArra2: [],
+          fileList: [],
+          isFlag: true,
+          showViewer: false, // 显示查看器
+          url: '',
+          rowurl: '',
+          src: '',
+          showVi: true,
+          workAttachmentList: [],
+          status: ''
+        }
+        this.inputForm.id = id
+        if (method === 'add') {
+          // this.inputForm.contractAmountType = '1'
+          this.title = `新建合同登记`
+        } else if (method === 'edit') {
+          this.title = '修改合同登记'
+        } else if (method === 'view') {
+          this.inputForm.showVi = false
+          this.title = '查看合同登记'
+        }
+        this.visible = true
+        this.loading = false
+        this.$nextTick(() => {
+          this.$refs.inputForm.resetFields()
+          if (method === 'edit' || method === 'view') { // 修改或者查看
+            this.loading = true
+            this.workContractService.findById(this.inputForm.id).then(({data}) => {
+              this.inputForm = this.recover(this.inputForm, data)
+              const f = []
+              if (data.fees !== null && data.fees !== undefined && data.fees !== '') {
+                data.fees.split(',').forEach(item => {
+                  if (item !== null && item !== undefined && item !== '') {
+                    f.push(item)
+                  }
+                })
+              }
+              this.inputForm.contractFees = f
+              if (this.formReadOnly) {
+                method = 'view'
+              }
+              this.$refs.uploadComponent.newUpload(method, this.inputForm.workAttachmentList, 'workContract', 300, '合同文本、补充协议')
+              this.loading = false
+            })
+          }
+        })
+      },
+      // 表单提交
+      // 暂存
+      async saveForm (callback) {
+        this.loading = true
+        this.inputForm.workAttachmentList = this.$refs.uploadComponent.getDataList()
+        this.inputForm.fees = this.inputForm.contractFees.join(',')
+        this.inputForm.status = '1'
+        await this.workContractService.save(this.inputForm).then(({data}) => {
+          callback()
+          this.$refs.inputForm.resetFields()
+          this.loading = false
+        }).catch(() => {
+          this.$refs.inputForm.resetFields()
+          this.loading = false
+        })
+      },
+      startForm (callback) {
+        this.loading = true
+        if (this.commonJS.isNotEmpty(this.inputForm.id)) {
+          this.workContractService.findById(this.inputForm.id).then(({data}) => {
+            if (this.commonJS.isNotEmpty(data.status) && data.status !== '0' && data.status !== '1' && data.status !== '3') { // 审核状态不是“未发起”或“暂存”或“撤回”,就弹出提示
+              this.loading = false
+              this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+              throw new Error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+            } else {
+              this.startFormTrue(callback)
+            }
+          })
+        } else {
+          this.startFormTrue(callback)
+        }
+      },
+      // 送审
+      startFormTrue (callback) {
+        this.$refs['inputForm'].validate(async (valid) => {
+          if (valid) {
+            this.loading = true
+            this.inputForm.workAttachmentList = this.$refs.uploadComponent.getDataList()
+            this.inputForm.status = '2'
+            this.inputForm.fees = this.inputForm.contractFees.join(',')
+            await this.workContractService.save(this.inputForm).then(({data}) => {
+              this.inputForm.id = data.businessId
+              callback(data.businessTable, data.businessId, this.inputForm)
+              this.$refs.inputForm.resetFields()
+              this.loading = false
+            }).catch(() => {
+              this.$refs.inputForm.resetFields()
+              this.loading = false
+            })
+          } else {
+            this.loading = false
+          }
+        })
+      },
+      reapplyForm (callback) {
+        this.loading = true
+        this.workContractService.findById(this.inputForm.id).then(({data}) => {
+          if (data.status !== '4') { // 审核状态不是“驳回”,就弹出提示
+            this.loading = false
+            this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+            throw new Error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+          } else {
+            this.startFormTrue(callback)
+          }
+        })
+      },
+      // 通过
+      agreeForm (callback) {
+        this.loading = true
+        this.$refs['inputForm'].validate(async (valid) => {
+          if (valid) {
+            await this.workContractService.findById(this.inputForm.id).then(({data}) => {
+              if (data.status !== '2') { // status的值不等于“审核中”,就弹出提示
+                this.loading = false
+                this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+                throw new Error()
+              } else {
+                this.loading = true
+                this.inputForm.workAttachmentList = this.$refs.uploadComponent.getDataList()
+                this.inputForm.status = '5'
+                this.inputForm.fees = this.inputForm.contractFees.join(',')
+                this.workContractService.save(this.inputForm).then(({data}) => {
+                  callback(data.businessTable, data.businessId, this.inputForm)
+                  this.$refs.inputForm.resetFields()
+                  this.loading = false
+                }).catch(() => {
+                  this.$refs.inputForm.resetFields()
+                  this.loading = false
+                })
+              }
+            })
+          } else {
+            this.loading = false
+          }
+        })
+      },
+      close () {
+        this.$refs.inputForm.resetFields()
+        this.inputForm.clientName = ''
+        this.visible = false
+        this.showVi = true
+        this.$refs.uploadComponent.clearUpload()
+      },
+      httpRequest (file) {
+        httpRequest(file, fileName(file), 'workContract')
+      },
+      handleRemove () {
+        this.fileList = handleRemove()
+      },
+      changes (file, fileList) {
+        this.dataListNew = []
+        this.dataList.forEach((item) => {
+          this.dataListNew.push(item)
+        })
+        fileList.forEach((item) => {
+          item.createDate = moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+          item.createBy = this.$store.state.user.name
+          this.dataListNew.push(item)
+        })
+        const isLt2M = file.size / 1024 / 1024 < 300
+        if (isLt2M === false) {
+          this.$message.error('文件大小不能超过 ' + 300 + 'M !')
+          this.fileList = []
+          this.filesArra2 = []
+        }
+      },
+      async showFile (row) {
+        await openWindowOnUrl(row)
+      },
+      // 排序
+      sortChangeHandle (column) {
+        this.orders = []
+        if (column.order != null) {
+          this.orders.push({column: this.$utils.toLine(column.prop), asc: column.order === 'ascending'})
+        }
+        this.refreshList()
+      },
+      deleteMsgById (row, index) {
+        this.dataListNew.splice(index, 1)
+        if (row.id !== null && row.id !== '' && row.id !== undefined) {
+          this.ossService.deleteMsgById(row.id)
+        }
+      },
+      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
+      },
+      positiveInteger (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 no-useless-escape
+        str = str.replace(/[^\d^]+/g, '') // 保留数字
+        return str
+      },
+      tableRowClassName ({row, rowIndex}) {
+        row.index = rowIndex
+      },
+      handleRadioChange (val) {
+        if (val) {
+          this.radio = val.index
+        }
+      },
+      // 关闭窗口时调用
+      closeXTable () {
+        this.closePop()
+      },
+      rowStyle (event) {
+        return 'cursor:pointer;'
+      },
+      async rowClick (event) {
+        let id = this.gridData[event.rowIndex].id
+        this.inputForm.clientId = id
+        await this.workClientService.findById(id).then((data) => {
+          this.inputForm.clientName = data.data.workClientInfo.name
+        })
+        this.visable = false
+      },
+      async getPopTable () {
+        let name = this.inputForm.clientName
+        await this.workClientService.list(name).then(({data}) => {
+          this.gridData = data.records
+        })
+        this.$refs.pops.updatePopper()
+      },
+      closePop () {
+        this.visable = false
+      },
+      changeContractFee (val, items) {
+        let fee = ''
+        let fees = this.inputForm.contractFees
+        if (fees.length > 0) {
+          fees.forEach(i => {
+            items.forEach(item => {
+              if (i === item.value) {
+                var label = item.label
+                fee = fee + ';' + label
+              }
+            }
+            )
+            this.inputForm.contractFee = fee.substring(1, fee.length)
+          })
+        } else {
+          this.inputForm.contractFee = ''
+        }
+      },
+      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.workContractService.findById(this.inputForm.id).then(({data}) => {
+              if (data.status !== '2') { // status的值不等于“审核中”,就弹出提示
+                this.loading = false
+                this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
+                throw new Error()
+              } else {
+                // if (type === 'agree') {
+                //   // 同意
+                //   this.inputForm.status = '5'
+                // }
+                if (type === 'reject') {
+                  // 驳回
+                  this.inputForm.status = '4'
+                }
+                if (type === 'reback') {
+                  // 撤回
+                  this.inputForm.status = '3'
+                }
+                if (type === 'reject' || type === 'reback') {
+                  let param = {status: this.inputForm.status, id: this.inputForm.id}
+                  this.workContractService.updateStatusById(param).then(() => {
+                    this.loading = false
+                    callback()
+                  })
+                }
+              }
+            })
+          } else if (type === 'hold') {
+            this.workContractService.findById(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.workContractService.updateStatusById(param).then(() => {
+                  this.loading = false
+                  callback()
+                })
+              }
+            })
+          }
+        }
+      },
+      // updateStatusById (type) {
+      //   if (type === 'agree') {
+      //     this.inputForm.status = '5'
+      //     this.workContractService.updateStatusById(this.inputForm)
+      //   }
+      //   if (type === 'reject') {
+      //     this.inputForm.status = '4'
+      //     this.workContractService.updateStatusById(this.inputForm)
+      //   }
+      //   if (type === 'reback') {
+      //     this.inputForm.status = '3'
+      //     this.workContractService.updateStatusById(this.inputForm)
+      //   }
+      // },
+      checkData () {
+        let begin = this.inputForm.effectiveDate
+        let close = this.inputForm.closingDate
+        if (close < begin) {
+          this.$message.warning(`合同终止日期要大于合同开始日期`)
+          this.inputForm.closingDate = ''
+        }
+      }
+    }
+  }
+</script>
+
+<style>
+  .tid_40 .vxe-body--column .vxe-cell{
+    padding: 1px;
+    text-align: center;
+  }
+  .tid_40 .vxe-header--row .col--last{
+    text-align: center;
+  }
+  .tid_45 .vxe-body--column .vxe-cell{
+    padding: 1px;
+    text-align: center;
+  }
+  .tid_45 .vxe-header--row .col--last{
+    text-align: center;
+  }
+</style>
+
+<style scoped>
+  .avatar{
+    height: 100px;
+  }
+  .el-divider__text {
+    font-weight: bold;
+    font-size: 16px;
+  }
+</style>

+ 553 - 0
src/views/workContract/WorkContractForm2.vue

@@ -0,0 +1,553 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      width="1200px"
+      @close="close(),closeXTable()"
+      @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="150px">
+
+          <el-row  :gutter="0">
+            <el-col :span="12">
+              <el-form-item label="客户名称" prop="clientId" :rules="[
+                {required: true, message:'请输入客户名称', trigger:'blur'},
+                {required: true, message:'请输入客户名称', trigger:'change'}
+              ]">
+                <work-client-select
+                  :size="'medium'"
+                  :value="inputForm.clientId"
+                  :disabled="method==='view'"
+                  @getValue='(clientId,clientName) => {inputForm.clientId=clientId;inputForm.clientName=clientName}'
+                >
+                </work-client-select>
+              </el-form-item>
+            </el-col>
+
+            <el-col :span="12">
+              <el-form-item label="合同名称" prop="name"
+                            :rules="[
+                 {required: true, message:'请输入合同名称', trigger:'blur'}
+               ]">
+                <el-input maxlength="64" v-model="inputForm.name" placeholder="请输入合同名称"></el-input>
+              </el-form-item>
+            </el-col>
+
+          </el-row>
+
+          <el-row  :gutter="15">
+
+            <el-col :span="12">
+              <el-form-item label="签订日期" prop="contractDate"
+                   :rules="[
+                    {required: true, message:'请输入签订日期', trigger:'blur'}
+                   ]">
+                <el-date-picker
+                  v-model="inputForm.contractDate"
+                  value-format="yyyy-MM-dd"
+                  style="width: 418px"
+                  placeholder="选择日期">
+                </el-date-picker>
+              </el-form-item>
+            </el-col>
+
+            <el-col :span="12">
+              <el-form-item label="合同生效日期" prop="effectiveDate">
+                <el-date-picker
+                  v-model="inputForm.effectiveDate"
+                  value-format="yyyy-MM-dd"
+                  style="width: 418px"
+                  placeholder="选择日期">
+                </el-date-picker>
+              </el-form-item>
+            </el-col>
+
+            <el-col :span="12">
+              <el-form-item label="合同终止日期" prop="closingDate">
+                <el-date-picker
+                  @change="checkData"
+                  value-format="yyyy-MM-dd"
+                  v-model="inputForm.closingDate"
+                  style="width: 418px"
+                  placeholder="选择日期">
+                </el-date-picker>
+              </el-form-item>
+            </el-col>
+
+            <el-col :span="12">
+              <el-form-item label="合同类型" prop="contractType"
+                  :rules="[
+                    {required: true, message:'请选择合同类型', trigger:'blur'}
+                  ]">
+                <el-select v-model="inputForm.contractType" placeholder="请选择" style="width:100%;">
+                  <el-option
+                    v-for="item in $dictUtils.getDictList('contract_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="contractAmountType"
+                   :rules="[
+                      {required: true, message:'请选择合同金额类别', trigger:'blur'}
+                   ]">
+                <el-radio-group v-model="inputForm.contractAmountType">
+                  <el-radio v-for="item in $dictUtils.getDictList('contract_amount_type')" :label="item.value" >{{item.label}}</el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+
+            <el-col :span="12">
+              <el-form-item label="合同/预计金额(元)" prop="contractAmount" v-if="inputForm.contractAmountType === '1'"
+                            :rules="[
+                      {required: true, message:'请输入合同/预计金额(元)', trigger:'blur'}
+                   ]">
+                <el-input v-model="inputForm.contractAmount" placeholder="请输入合同/预计金额(元)"></el-input>
+              </el-form-item>
+            </el-col>
+
+            <el-col :span="12">
+              <el-form-item label="对方合同编号" prop="contractOpposite">
+                <el-input maxlength="64" v-model="inputForm.contractOpposite" placeholder="请填写对方合同编号"></el-input>
+              </el-form-item>
+            </el-col>
+
+          </el-row>
+
+          <el-row>
+            <el-col :span="24">
+              <el-form-item label="收费标准" prop="contractFees">
+                <el-checkbox-group v-model="inputForm.contractFees" @change="changeContractFee">
+                  <el-checkbox  v-for="item in $dictUtils.getDictList('contract_fee_pg')" :label="item.value" >{{item.label}}</el-checkbox>
+                </el-checkbox-group>
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row>
+            <el-col :span="12">
+              <el-form-item prop="contractFee">
+                <el-input style="width: 100%" placeholder="请选择收费标准" v-model="inputForm.contractFee"></el-input>
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row></el-row>
+
+
+          <el-form-item label="备注" prop="remarks">
+            <el-input v-model="inputForm.remarks"
+                      type="textarea"
+                      :rows="5"
+                      placeholder="请输入合同备注"
+                      show-word-limit>
+            </el-input>
+          </el-form-item>
+
+          </el-form>
+      <UpLoadComponent ref="uploadComponent"></UpLoadComponent>
+
+      <el-image-viewer
+        v-if="showViewer"
+        :on-close="closeViewer"
+        :url-list="[url]"
+        zIndex="9999"/>
+      <span slot="footer" class="dialog-footer">
+      <el-button size="small" @click="close(),closeXTable()" 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 UpLoadComponent from '@/views/common/UpLoadComponent'
+  import WorkContractService from '@/api/sys/WorkContractService'
+  import WorkClientService from '@/api/sys/WorkClientService'
+  import WorkClientSelect from '@/components/workClientInfoSelect'
+  import OSSSerive, {
+    httpRequest,
+    toHref,
+    openWindowOnUrl,
+    handleRemove,
+    fileName
+  } from '@/api/sys/OSSService'
+  import moment from 'moment'
+  import ElImageViewer from 'element-ui/packages/image/src/image-viewer'
+  export default {
+    data () {
+      return {
+        visable: false,
+        gridData: [],
+        radio: 0,
+        tableData: [],
+        dataList: [],
+        dataListNew: [],
+        title: '',
+        method: '',
+        isSubmit: false,
+        visible: false,
+        loading: false,
+        returnForm: {
+          clientId: '',
+          name: '',
+          contractDate: '',
+          effectiveDate: '',
+          closingDate: '',
+          contractType: '',
+          contractAmountType: '',
+          contractAmount: '',
+          contractOpposite: '',
+          contractFees: [],
+          contractFee: '',
+          describes: '',
+          contractSpecial: '',
+          remarks: '',
+          clientName: '',
+          permissionFlag: '',
+          showVi: true,
+          workAttachmentList: []
+        },
+        inputForm: {
+          clientId: '',
+          name: '',
+          contractDate: '',
+          effectiveDate: '',
+          closingDate: '',
+          contractType: '',
+          contractAmountType: '',
+          contractAmount: '',
+          contractOpposite: '',
+          contractFees: [],
+          contractFee: '',
+          describes: '',
+          contractSpecial: '',
+          remarks: '',
+          clientName: '',
+          permissionFlag: '',
+          showVi: true,
+          workAttachmentList: []
+        },
+        filesArra2: [],
+        fileList: [],
+        isFlag: true,
+        showViewer: false, // 显示查看器
+        url: '',
+        rowurl: '',
+        src: '',
+        showVi: true,
+        onedit: false,
+        type: '',
+        loadProgress: 0, // 动态显示进度条
+        progressFlag: false // 关闭进度条
+      }
+    },
+    components: {
+      ElImageViewer,
+      UpLoadComponent,
+      WorkClientSelect
+    },
+    ossService: null,
+    workContractService: null,
+    workClientService: null,
+    created () {
+      this.ossService = new OSSSerive()
+      this.workContractService = new WorkContractService()
+      this.workClientService = new WorkClientService()
+    },
+    mounted () {
+      window.onPreview = this.onPreview
+    },
+    methods: {
+      uploadVideoProcess (event, file, fileList) {
+        this.progressFlag = true // 显示进度条
+        this.loadProgress = parseInt(event.percent) // 动态获取文件上传进度
+        if (this.loadProgress >= 100) {
+          this.loadProgress = 100
+          setTimeout(() => { this.progressFlag = false }, 1000) // 一秒后关闭进度条
+        }
+      },
+      async toHref (row) {
+        toHref(row)
+      },
+      onPreview (url) {
+        this.url = url
+        this.showViewer = true
+      },
+      // 关闭查看器
+      closeViewer () {
+        this.url = ''
+        this.showViewer = false
+      },
+      init (method, id) {
+        this.dataList = []
+        this.dataListNew = []
+        this.method = method
+        this.inputForm = {
+          clientId: '',
+          name: '',
+          contractDate: '',
+          effectiveDate: '',
+          closingDate: '',
+          contractType: '',
+          contractAmountType: '',
+          contractAmount: '',
+          contractOpposite: '',
+          contractFees: [],
+          contractFee: '',
+          describes: '',
+          contractSpecial: '',
+          remarks: '',
+          clientName: '',
+          filesArra2: [],
+          fileList: [],
+          isFlag: true,
+          showViewer: false, // 显示查看器
+          url: '',
+          rowurl: '',
+          src: '',
+          showVi: true,
+          type: '',
+          workAttachmentList: []
+        }
+        this.inputForm.id = id
+        if (method === 'add') {
+          this.inputForm.contractAmountType = '1'
+          this.title = `新建合同登记`
+        } else if (method === 'edit') {
+          this.title = '修改合同登记'
+        } else if (method === 'view') {
+          this.inputForm.showVi = false
+          this.title = '查看合同登记'
+        }
+        this.visible = true
+        this.loading = false
+        this.$nextTick(() => {
+          // this.$refs.upload.clearFiles()
+          this.$refs.inputForm.resetFields()
+          if (method === 'edit' || method === 'view') { // 修改或者查看
+            this.loading = true
+            this.workContractService.findById(this.inputForm.id).then(({data}) => {
+              this.inputForm = this.recover(this.inputForm, data)
+              const f = []
+              if (data.fees !== null && data.fees !== undefined && data.fees !== '') {
+                data.fees.split(',').forEach(item => {
+                  if (item !== null && item !== undefined && item !== '') {
+                    f.push(item)
+                  }
+                })
+              }
+              this.inputForm.contractFees = f
+              this.$refs.uploadComponent.newUpload(method, this.inputForm.workAttachmentList, 'workContract', 300, '合同文本、补充协议')
+            })
+          }
+          this.loading = false
+        })
+      },
+      // 表单提交
+      doSubmit () {
+        if (this.progressFlag === true) {
+          this.$message.warning('文件正在上传中,请稍等')
+          return
+        }
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            this.inputForm.workAttachmentList = this.$refs.uploadComponent.getDataList()
+            this.dataListNew.forEach((item) => {
+              if (item.id === null || item.id === undefined || item.id === '') {
+                item.url = item.raw.url
+              }
+              item.attachmentFlag = 'workContract'
+              item.fileSize = item.size
+              item.attachmentName = item.name
+              this.inputForm.workAttachmentList.push(item)
+            })
+
+            this.workContractService.save(this.inputForm).then(({data}) => {
+              this.close()
+              this.$message.success(data.msg)
+              this.$emit('refreshDataList')
+              this.loading = false
+            }).catch(() => {
+              this.loading = false
+            })
+          }
+        })
+      },
+      close () {
+        this.$refs.inputForm.resetFields()
+        this.visible = false
+        this.inputForm.showVi = true
+        this.$refs.uploadComponent.clearUpload()
+      },
+      httpRequest (file) {
+        httpRequest(file, fileName(file), 'workContract')
+      },
+      handleRemove () {
+        this.fileList = handleRemove()
+      },
+      changes (file, fileList) {
+        this.dataListNew = []
+        this.dataList.forEach((item) => {
+          this.dataListNew.push(item)
+        })
+        fileList.forEach((item) => {
+          item.createDate = moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+          item.createBy = this.$store.state.user.name
+          this.dataListNew.push(item)
+        })
+        const isLt2M = file.size / 1024 / 1024 < 300
+        if (isLt2M === false) {
+          this.$message.error('文件大小不能超过 ' + 300 + 'M !')
+          this.fileList = []
+          this.filesArra2 = []
+        }
+      },
+      async showFile (row) {
+        await openWindowOnUrl(row)
+      },
+      // 排序
+      sortChangeHandle (column) {
+        this.orders = []
+        if (column.order != null) {
+          this.orders.push({column: this.$utils.toLine(column.prop), asc: column.order === 'ascending'})
+        }
+        this.refreshList()
+      },
+      deleteMsgById (row, index) {
+        this.dataListNew.splice(index, 1)
+        if (row.id !== null && row.id !== '' && row.id !== undefined) {
+          this.ossService.deleteMsgById(row.id)
+        }
+      },
+      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
+      },
+      tableRowClassName ({row, rowIndex}) {
+        row.index = rowIndex
+      },
+      handleRadioChange (val) {
+        if (val) {
+          this.radio = val.index
+        }
+      },
+      // 关闭窗口时调用
+      closeXTable () {
+        this.closePop()
+      },
+      rowStyle (event) {
+        return 'cursor:pointer;'
+      },
+      async rowClick (event) {
+        let id = this.gridData[event.rowIndex].companyid
+        await this.workClientService.enterpriseTicketInfo(id).then((data) => {
+          this.inputForm.clientName = data.data.ENTNAME
+          this.inputForm.clientId = data.data.COMPANYID
+        })
+        this.visable = false
+      },
+      async getPopTable () {
+        let name = this.inputForm.clientName
+        if (name !== null && name !== undefined && name !== '') {
+          await this.workClientService.enterpriseSearchByName(name).then(({data}) => {
+            this.gridData = data.data.items
+          })
+        }
+        this.$refs.pops.updatePopper()
+      },
+      closePop () {
+        this.visable = false
+      },
+      changeContractFee () {
+        let fee = ''
+        let fees = this.inputForm.contractFees
+        if (fees.length > 0) {
+          fees.forEach(i => {
+            if (i === '1') {
+              i = '计价格(2002)1980号文下浮%'
+            }
+            if (i === '2') {
+              i = '苏价服(2014)383号文下浮%'
+            }
+            if (i === '3') {
+              i = '标段 元/标段'
+            }
+            if (i === '4') {
+              i = '其他'
+            }
+            fee = fee + ';' + i
+            this.inputForm.contractFee = fee.substring(1, fee.length)
+          })
+        }
+      },
+      checkData () {
+        let begin = this.inputForm.effectiveDate
+        let close = this.inputForm.closingDate
+        if (close < begin) {
+          this.$message.warning(`合同终止日期异常,请重新选择`)
+          this.inputForm.closingDate = ''
+        }
+      }
+    }
+  }
+</script>
+
+<style>
+  .tid_40 .vxe-body--column .vxe-cell{
+    padding: 1px;
+    text-align: center;
+  }
+  .tid_40 .vxe-header--row .col--last{
+    text-align: center;
+  }
+  .tid_45 .vxe-body--column .vxe-cell{
+    padding: 1px;
+    text-align: center;
+  }
+  .tid_45 .vxe-header--row .col--last{
+    text-align: center;
+  }
+</style>
+
+<style scoped>
+  .avatar{
+    height: 100px;
+  }
+  .el-divider__text {
+    font-weight: bold;
+    font-size: 16px;
+  }
+</style>

+ 0 - 0
src/views/workContract/WorkContractList.vue


Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä