whx пре 2 месеци
родитељ
комит
6898e5e01b
64 измењених фајлова са 1559 додато и 207 уклоњено
  1. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/index.html
  2. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/css/1014.a712c729.css
  3. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/css/1409.2c640c4f.css
  4. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/css/2891.db305beb.css
  5. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/css/3142.40e63305.css
  6. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/css/7828.87cf10c8.css
  7. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/css/4407.1e502bea.css
  8. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/css/app.857f62c7.css
  9. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/css/app.b7db26df.css
  10. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/1014.e33c8420.js
  11. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/1274.69e59d63.js
  12. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/1316.75c8cf2a.js
  13. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/1409.9fa8435b.js
  14. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/1953.80767bf2.js
  15. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/2352.f8497ca2.js
  16. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/254.93784e4e.js
  17. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/2891.087e881d.js
  18. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/2925.47d56aeb.js
  19. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/2429.e7424d9e.js
  20. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/3142.a42c617c.js
  21. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/4136.81508f7c.js
  22. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/4334.0f16564a.js
  23. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/4407.a7679f53.js
  24. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/5306.d1aa294b.js
  25. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/5895.50d7286b.js
  26. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/6523.09ba00ee.js
  27. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/7788.377b00fb.js
  28. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/7817.a270862d.js
  29. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/7828.b1b80657.js
  30. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/7883.f9173a04.js
  31. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/7908.031a95b1.js
  32. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/8018.be328368.js
  33. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/8083.3915cf18.js
  34. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/8083.43738b4f.js
  35. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/8375.60794c7b.js
  36. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/9073.a67fb3c6.js
  37. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/9381.68592995.js
  38. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/9396.56f75c26.js
  39. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/9396.edd37017.js
  40. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/9709.06553d29.js
  41. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/app.ba82d42b.js
  42. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/app.fe6b0c92.js
  43. 408 0
      virgo.wzfrontend/workark/src/api/datacenter.js
  44. 32 0
      virgo.wzfrontend/workark/src/api/message.js
  45. 33 0
      virgo.wzfrontend/workark/src/api/serve.js
  46. 65 4
      virgo.wzfrontend/workark/src/assets/css/common.scss
  47. 2 2
      virgo.wzfrontend/workark/src/components/flow/batchForm.vue
  48. 2 2
      virgo.wzfrontend/workark/src/components/flow/flowAction.vue
  49. 2 2
      virgo.wzfrontend/workark/src/components/flow/flowForm.vue
  50. 57 0
      virgo.wzfrontend/workark/src/components/message/detail.vue
  51. 110 0
      virgo.wzfrontend/workark/src/components/message/modules/datacenterDetail.vue
  52. 66 0
      virgo.wzfrontend/workark/src/components/work/organization/announcement/dialogDetail.vue
  53. 1 1
      virgo.wzfrontend/workark/src/layout/components/topNav.vue
  54. 1 1
      virgo.wzfrontend/workark/src/loading/loading.vue
  55. 2 2
      virgo.wzfrontend/workark/src/router/index.js
  56. 16 0
      virgo.wzfrontend/workark/src/router/modules/work/message.js
  57. 2 2
      virgo.wzfrontend/workark/src/router/permission.js
  58. 256 0
      virgo.wzfrontend/workark/src/uitls/datacenter.js
  59. 2 2
      virgo.wzfrontend/workark/src/uitls/message.js
  60. 121 0
      virgo.wzfrontend/workark/src/views/message/list.vue
  61. 107 0
      virgo.wzfrontend/workark/src/views/message/notice.vue
  62. 3 1
      virgo.wzfrontend/workark/src/views/website/serveDetail.vue
  63. 244 169
      virgo.wzfrontend/workark/src/views/work/index.vue
  64. 1 1
      virgo.wzfrontend/workark/src/views/work/organization/announcement.vue

Разлика између датотеке није приказан због своје велике величине
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/index.html


virgo.wzfrontend/src/main/resources/static/workark/static/css/254.a712c729.css → virgo.wzfrontend/src/main/resources/static/workark/static/css/1014.a712c729.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/css/1409.2c640c4f.css


virgo.wzfrontend/src/main/resources/static/workark/static/css/9709.db305beb.css → virgo.wzfrontend/src/main/resources/static/workark/static/css/2891.db305beb.css


virgo.wzfrontend/src/main/resources/static/workark/static/css/7788.40e63305.css → virgo.wzfrontend/src/main/resources/static/workark/static/css/3142.40e63305.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/css/7828.87cf10c8.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/css/4407.1e502bea.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/css/app.857f62c7.css


Разлика између датотеке није приказан због своје велике величине
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/css/app.b7db26df.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/1014.e33c8420.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/1274.69e59d63.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/1316.75c8cf2a.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/1409.9fa8435b.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/1953.80767bf2.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/2352.f8497ca2.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/254.93784e4e.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/2891.087e881d.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/2925.47d56aeb.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/2429.e7424d9e.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/3142.a42c617c.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/4136.81508f7c.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/4334.cfd2e522.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/4334.0f16564a.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/4407.a7679f53.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/5306.d1aa294b.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/5895.5c450dfa.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/5895.50d7286b.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/6523.09ba00ee.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/7788.377b00fb.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/7817.a270862d.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/7828.b1b80657.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/7883.84d909fe.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/7883.f9173a04.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/7908.031a95b1.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/8018.be328368.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/8083.3915cf18.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/8083.43738b4f.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/8375.60794c7b.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/9073.74c430a1.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/9073.a67fb3c6.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/9381.68592995.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/9396.56f75c26.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/9396.edd37017.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/9709.06553d29.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/app.ba82d42b.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/app.fe6b0c92.js


+ 408 - 0
virgo.wzfrontend/workark/src/api/datacenter.js

@@ -0,0 +1,408 @@
+import request from '@/axios'
+/* 
+ * 上传base64文件
+ * 
+ */
+export function uploadBase64(data) {
+	return request({
+		url: `/file/filenode/base64`,
+		method: 'post',
+		data: data
+	});
+}
+/* 
+ * 获取目录列表
+ * 
+ */
+export function getDirList(parentId) {
+	return request({
+		url: `/file/dir/${parentId}`,
+		method: 'get'
+	});
+}
+/* 
+ * 新增目录
+ * @param {Object} data = {}
+ * 
+ */
+export function insertDir(data) {
+	return request({
+		url: `/file/dir/${data.parentId}`,
+		method: 'post',
+		data: data
+	});
+}
+/* 
+ * 编辑目录
+ * @param {Object} data = {}
+ * 
+ */
+export function updateDir(data) {
+	return request({
+		url: `/file/dir`,
+		method: 'put',
+		data: data
+	});
+}
+/* 
+ * 删除目录
+ * 
+ */
+export function deleteDir(id) {
+	return request({
+		url: `/file/dir/${id}`,
+		method: 'delete'
+	});
+}
+/* 
+ * 获取多个文档目录列表
+ * 
+ */
+export function getDirListByids(data) {
+	return request({
+		url: `/file/dir/folder`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 生成项目目录
+ * 
+ */
+export function generateFileNodeProject(projectId) {
+	return request({
+		url: `/file/fileNodeProject/${projectId}`,
+		method: 'get'
+	});
+}
+/* 
+ * 生成企业中心目录
+ * 
+ */
+export function generateFileNodeOrganization(projectId, organizationId, organizationTypeId) {
+	return request({
+		url: `/file/fileNodeOrganization/${projectId}/${organizationId}/${organizationTypeId}`,
+		method: 'get'
+	});
+}
+/* 
+ * 获取多个项目中心目录列表
+ * 
+ */
+export function getProjectDirListByids(data) {
+	return request({
+		url: `/file/fileNodeProject/folder`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 获取多个企业中心目录列表
+ * 
+ */
+export function getOrganizationDirListByids(data) {
+	return request({
+		url: `/file/fileNodeOrganization/folder`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 获取项目目录
+ * 
+ */
+export function getProjectDirList(parentId) {
+	return request({
+		url: `/file/listFileNodeProject/${parentId}`,
+		method: 'get'
+	});
+}
+/* 
+ * 获取企业中心目录
+ * 
+ */
+export function getOrganizationDirList(parentId) {
+	return request({
+		url: `/file/listFileNodeOrganization/${parentId}`,
+		method: 'get'
+	});
+}
+/*
+ * 获取文件夹或者文件权限
+ * @param {String} 
+ * 
+ */
+export function getProjectPermission(parentId, organizationId) {
+	return request({
+		url: `/file/permissions/${parentId}/${organizationId}`,
+		method: 'get'
+	});
+}
+/*
+ * 获取文件夹或者文件权限详情
+ * @param {String} 
+ * 
+ */
+export function getProjectPermissionDetail(parentId, organizationId) {
+	return request({
+		url: `/file/permissions/show/${parentId}/${organizationId}`,
+		method: 'get'
+	});
+}
+
+/*
+ * 获取成员在项目目录的权限
+ * 
+ * 
+ */
+export function getUserProjectPermissions(parentId, userId) {
+	return request({
+		url: `/file/userPermissions/project/${parentId}/${userId}`,
+		method: 'get'
+	});
+}
+/*
+ * 获取成员在企业中心目录的权限
+ * @param {Object} data = {}
+ * 
+ */
+export function getUserOrganizationPermissions(id, userId) {
+	return request({
+		url: `/file/userPermissions/organization/${id}/${userId}`,
+		method: 'get'
+	});
+}
+/*
+ * 获取成员在项目组织目录的权限
+ * @param {Object} data = {}
+ * 
+ */
+export function insertUserPermissions(data) {
+	return request({
+		url: `/file/userPermissions`,
+		method: 'post',
+		data: data
+	})
+}
+/*
+ * 修改成员在项目组织目录的权限
+ * @param {Object} data = {}
+ * 
+ */
+export function putUserPermissions(data) {
+	return request({
+		url: `/file/userPermissions`,
+		method: 'put',
+		data: data
+	})
+}
+/*
+ * 新增项目目录权限
+ * @param {Object} data = {}
+ * 
+ */
+export function insertProjectPermission(data) {
+	return request({
+		url: `/file/permissions`,
+		method: 'post',
+		data: data
+	})
+}
+/*
+ * 修改项目目录权限
+ * @param {Object} data = {}
+ * 
+ */
+export function updateProjectPermission(data) {
+	return request({
+		url: `/file/permissions`,
+		method: 'put',
+		data: data
+	})
+}
+/*
+ * 验证项目目录密码
+ * @param {Object} data = {}
+ * 
+ */
+export function validationProjectPermission(id, password) {
+	return request({
+		url: `/file/permissions/validation/${id}/${password}`,
+		method: 'get',
+	})
+}
+/*
+ * 验证项目组织目录密码
+ * @param {Object} data = {}
+ * 
+ */
+export function validationOrganizationPermission(id, password) {
+	return request({
+		url: `/file/fileNodeOrganization/${id}/${password}`,
+		method: 'get',
+	});
+}
+/*
+ * 下载文件
+ * @param {Object} data = {}
+ * 
+ */
+export function downloadFile(isFileNodeOrganization, id) {
+	return request({
+		method: 'get',
+		url: `/file/filenode/${isFileNodeOrganization}/${id}`,
+		responseType: 'arraybuffer'
+	})
+}
+/*
+ * 新增项目目录
+ * @param {Object} data = {}
+ * 
+ */
+export function insertProjectDir(data) {
+	return request({
+		url: `/file/fileNodeProject/dir/${data.parentId}`,
+		method: 'post',
+		data: data
+	})
+}
+/*
+ * 新增企业中心目录
+ * @param {Object} data = {}
+ * 
+ */
+export function insertOrganizationDir(data) {
+	return request({
+		url: `/file/fileNodeOrganization/dir/${data.parentId}`,
+		method: 'post',
+		data: data
+	})
+}
+/*
+ * 修改项目目录
+ * @param {Object} data = {}
+ * 
+ */
+export function updateProjectDir(data) {
+	return request({
+		url: `/file/fileNodeProject`,
+		method: 'put',
+		data: data
+	})
+}
+
+/*
+ * 修改企业中心目录
+ * @param {Object} data = {}
+ * 
+ */
+export function updateOrganizationDir(data) {
+	return request({
+		url: `/file/fileNodeOrganization`,
+		method: 'put',
+		data: data
+	})
+}
+/*
+ * 删除项目目录
+ * @param {Object} data = {}
+ * 
+ */
+export function deleteProjectDir(id) {
+	return request({
+		url: `/file/fileNodeProject/dir/${id}`,
+		method: 'delete'
+	})
+}
+/*
+ * 删除企业中心目录
+ * @param {Object} data = {}
+ * 
+ */
+export function deleteOrganizationDir(id) {
+	return request({
+		url: `/file/fileNodeOrganization/dir/${id}`,
+		method: 'delete'
+	})
+}
+/*
+ * 删除项目文件
+ * @param {Object} data = {}
+ * 
+ */
+export function deleteProjectFile(id) {
+	return request({
+		url: `/file/fileNodeProject/${id}`,
+		method: 'delete'
+	})
+}
+/*
+ * 删除企业中心文件
+ * @param {Object} data = {}
+ * 
+ */
+export function deleteOrganizationFile(id) {
+	return request({
+		url: `/file/fileNodeOrganization/${id}`,
+		method: 'delete'
+	})
+}
+/*
+ * 获取审核设置
+ * @param {Object} data = {}
+ * 
+ */
+export function getSetApprove(data) {
+	return request({
+		url: `/api/reviewerSet/set/query`,
+		method: 'post',
+		data: data
+	})
+}
+/*
+ * 新增审核设置
+ * @param {Object} data = {}
+ * 
+ */
+export function insertSetApprove(data) {
+	return request({
+		url: `/api/reviewerSet/set`,
+		method: 'post',
+		data: data
+	})
+}
+/*
+ * 编辑审核设置
+ * @param {Object} data = {}
+ * 
+ */
+export function updateSetApprove(data) {
+	return request({
+		url: `/api/reviewerSet/set`,
+		method: 'put',
+		data: data
+	})
+}
+/*
+ * 新增luckysheet数据
+ * @param {Object} data = {}
+ * 
+ */
+export function insertExcel(data) {
+	return request({
+		url: `/api/luckySheet`,
+		method: 'post',
+		data: data
+	})
+}
+/*
+ * 获取luckysheet数据
+ * @param {Object} data = {}
+ * 
+ */
+export function getExcelById(id) {
+	return request({
+		url: `/api/luckySheet/${id}`,
+		method: 'get'
+	})
+}

+ 32 - 0
virgo.wzfrontend/workark/src/api/message.js

@@ -0,0 +1,32 @@
+import request from '@/axios'
+/* 
+ * 获取消息分页列表
+ * 
+ */
+export function getMessagePageListByQuery(currPage, pageSize, data) {
+	return request({
+		url: `/manager/message/${currPage}/${pageSize}`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 按照类型获取未读消息统计
+ * 
+ */
+export function getMessageTest(userId) {
+	return request({
+		url: `/manager/message/countUnread/messageType/${userId}`,
+		method: 'get'
+	})
+}
+/* 
+ * 获取消息列表
+ * 
+ */
+export function getMessageList(userId, messageType) {
+	return request({
+		url: `/manager/message/messageType/${userId}/${messageType}`,
+		method: 'get'
+	})
+}

+ 33 - 0
virgo.wzfrontend/workark/src/api/serve.js

@@ -161,4 +161,37 @@ export function changeOrderStatus(data) {
 		method: 'post',
 		data: data
 	})
+}
+/* 
+ * 服务数据
+ * 
+ * 
+ */
+export function getOrdeCount(organizationId) {
+	return request({
+		url: `/api/workarkOrderInfo/count/${organizationId}`,
+		method: 'get'
+	})
+}
+/* 
+ * 订单统计
+ * 
+ * 
+ */
+export function getOrdeCountByDate(organizationId, startTime, endTime) {
+	return request({
+		url: `/api/workarkOrderInfo/count/${organizationId}/${startTime}/${endTime}`,
+		method: 'get'
+	})
+}
+/* 
+ * 购买排行
+ * 
+ * 
+ */
+export function getOrdeCountPay(organizationId) {
+	return request({
+		url: `/api/workarkOrderInfo/countPay/${organizationId}`,
+		method: 'get'
+	})
 }

+ 65 - 4
virgo.wzfrontend/workark/src/assets/css/common.scss

@@ -105,10 +105,7 @@
 			.table-operation {
 				padding-left: 10px;
 				cursor: pointer;
-				color: $--color-primary;
-				&:hover{
-					
-				}
+				color: $--color-primary;
 			}
 
 			.table-operation:first-child {
@@ -593,4 +590,68 @@
 	.el-tabs__nav-wrap::after{
 		height: 1;
 	}
+}
+.hui-tag {
+	display: inline-block;
+	border: 1px solid $--color-primary;
+	padding: 0 5px;
+	border-radius: 2px;
+	color: $--color-primary;
+	overflow: hidden;
+	position: relative;
+	font-size: 12px;
+	line-height: 18px;
+	box-sizing: border-box;
+}
+
+.hui-table-tag {
+	display: flex;
+	align-items: center;
+}
+
+.hui-tag::before {
+	content: '';
+	width: 100%;
+	height: 100%;
+	background: $--color-primary;
+	opacity: 0.1;
+	position: absolute;
+	left: 0;
+	top: 0;
+}
+
+.hui-tag.hui-tag-success {
+	border-color: $--color-success;
+	color: $--color-success;
+}
+
+.hui-tag.hui-tag-success::before {
+	background: $--color-success;
+}
+
+.hui-tag.hui-tag-warning {
+	border-color: $--color-warning;
+	color: $--color-warning;
+}
+
+.hui-tag.hui-tag-warning::before {
+	background: $--color-warning;
+}
+
+.hui-tag.hui-tag-error {
+	border-color: $--color-danger;
+	color: $--color-danger;
+}
+
+.hui-tag.hui-tag-error::before {
+	background: $--color-danger;
+}
+
+.hui-tag.hui-tag-info {
+	border-color: $--color-info;
+	color: $--color-info;
+}
+
+.hui-tag.hui-tag-info::before {
+	background: $--color-info;
 }

+ 2 - 2
virgo.wzfrontend/workark/src/components/flow/batchForm.vue

@@ -21,8 +21,8 @@
 			</div>
 		</div>
 		<div class="hui-dialog-submit">
-			<el-button size="medium" @click="$emit('callback')">取 消</el-button>
-			<el-button size="medium" type="primary" @click="submit" :loading="loading">批量保存</el-button>
+			<el-button size="small" @click="$emit('callback')">取 消</el-button>
+			<el-button size="small" type="primary" @click="submit" :loading="loading">批量保存</el-button>
 		</div>
 	</div>
 </template>

+ 2 - 2
virgo.wzfrontend/workark/src/components/flow/flowAction.vue

@@ -12,8 +12,8 @@
 			</el-form>
 		</div>
 		<div class="hui-dialog-submit">
-			<el-button size="medium" @click="$emit('callback')">取 消</el-button>
-			<el-button size="medium" type="primary" @click="submit" :loading="loading">确 定</el-button>
+			<el-button size="small" @click="$emit('callback')">取 消</el-button>
+			<el-button size="small" type="primary" @click="submit" :loading="loading">确 定</el-button>
 		</div>
 	</div>
 </template>

+ 2 - 2
virgo.wzfrontend/workark/src/components/flow/flowForm.vue

@@ -25,8 +25,8 @@
 			</div>
 		</div>
 		<div class="hui-dialog-submit">
-			<el-button size="medium" @click="$emit('callback')">取 消</el-button>
-			<el-button size="medium" type="primary" @click="submit" :loading="loading">保 存</el-button>
+			<el-button size="small" @click="$emit('callback')">取 消</el-button>
+			<el-button size="small" type="primary" @click="submit" :loading="loading">保 存</el-button>
 		</div>
 	</div>
 </template>

+ 57 - 0
virgo.wzfrontend/workark/src/components/message/detail.vue

@@ -0,0 +1,57 @@
+<template>
+	<div class="message-detail">
+		<flow-detail v-if="type === 2" :detailId="detail.dataId"></flow-detail>
+		<datacenter-detail v-else-if="type === 5" :detail="detail"></datacenter-detail>
+		<div class="common-message" v-else>
+			<div class="message-title">{{detail.title}}</div>
+			<div class="message-date"><span>发布时间:</span><span>{{detail.sentTime}}</span></div>
+			<div class="message-content">
+				{{detail.message}}
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	const flowDetail = () => import('@/components/flow/flowDetail');
+	const datacenterDetail = () => import('./modules/datacenterDetail');
+	export default {
+		props: ['type', 'detail'],
+		components: {
+			flowDetail,
+			datacenterDetail
+		}
+	}
+</script>
+
+<style lang="scss">
+	.message-detail {
+		width: 100%;
+		height: 100%;
+
+		.message-title {
+			font-size: 22px;
+			font-weight: 450;
+		}
+
+		.common-message {
+			padding: 10px;
+		}
+
+		.message-date {
+			color: $--color-text-secondary;
+			padding-bottom: 15px;
+			border-bottom: 1px solid $--border-color-lighter;
+			font-size: $--font-size-small;
+			padding-top: 5px;
+		}
+
+		.message-content {
+			margin-top: 15px;
+		}
+
+		.color-blue {
+			cursor: pointer;
+		}
+	}
+</style>

+ 110 - 0
virgo.wzfrontend/workark/src/components/message/modules/datacenterDetail.vue

@@ -0,0 +1,110 @@
+<template>
+	<div class="hui-flex">
+		<div class="hui-flex-box">
+			<div class="hui-detail">
+				<div class="hui-detail-title">基本信息</div>
+				<div class="hui-detail-content">
+					<div class="hui-detail-item">
+						<div class="hui-detail-label">申请日期</div>
+						<div class="hui-detail-value">{{detail.date}}</div>
+					</div>
+					<div class="hui-detail-item">
+						<div class="hui-detail-label">目录名称</div>
+						<div class="hui-detail-value">{{detail.data && detail.data[1]}}</div>
+					</div>
+					<div class="hui-detail-item">
+						<div class="hui-detail-label">数据类型</div>
+						<div class="hui-detail-value">{{detail.fileType === 'access'?'访问文件夹':'下载文件'}}</div>
+					</div>
+					<div class="hui-detail-item">
+						<div class="hui-detail-label">数据操作</div>
+						<div class="hui-detail-value">
+							<el-button v-if="detail.fileType === 'fileDownload'" size="small" type="primary"
+								@click="download">
+								<i class="iconfont huifont-xiazai"></i>下载
+							</el-button>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+		<div class="hui-drawer-submit" v-if="!permissions[detail.fileType] && load">
+			<el-button size="medium" type="primary" @click="success">通过</el-button>
+		</div>
+	</div>
+</template>
+
+<script>
+	import {
+		getUserProjectPermissions,
+		getUserOrganizationPermissions,
+		insertUserPermissions,
+		putUserPermissions,
+		downloadFile
+	} from '@/api/datacenter'
+	
+	import {
+		downloadFileDom
+	} from '@/uitls/datacenter'
+	export default {
+		props: ['detail'],
+		data() {
+			return {
+				show: false,
+				permissions: {},
+				load: false
+			}
+		},
+		mounted() {
+			let reg1 = /(?<=\【)(.+?)(?=\】)/g; // {} 花括号,大括号
+			this.detail['data'] = this.detail.message.match(reg1);
+			let data = this.$msg.messageType.filter(node => node.id === this.detail.messageType)[0].dataType.filter(node =>
+				node.id === this.detail.dataType)[0];
+			this.detail['fileType'] = data.type;
+			this.init();
+		},
+		methods: {
+			init() {
+				if (this.detail.dataType === 1 || this.detail.dataType === 2) {
+					getUserProjectPermissions(this.detail.dataId, this.detail.sender).then(this.privacySuccessFunc)
+				} else if (this.detail.dataType === 3 || this.detail.dataType === 4) {
+					getUserOrganizationPermissions(this.detail.dataId, this.detail.sender).then(this.privacySuccessFunc)
+				}
+			},
+			privacySuccessFunc(res, option, callback) {
+				if (res.state) {
+					this.permissions = res.data || {};
+					this.load = true;
+				}
+			},
+			success() {
+				this.$confirm('是否通过该申请?', () => {
+					let postData = {
+						userId: this.detail.sender
+					}
+					postData[this.detail.fileType] = true;
+					if (this.permissions.id) postData['id'] = this.permissions.id;
+					if (this.detail.data[0] === '企业中心') postData['fileNodeOrganizationId'] = this.detail.dataId;
+					if (this.detail.data[0] === '项目中心') postData['fileNodeProjectId'] = this.detail.dataId;
+					postData.id ? putUserPermissions(postData).then(this.successFunc) : insertUserPermissions(
+						postData).then(this.successFunc);
+				})
+			},
+			successFunc(res) {
+				if (res.state) {
+					this.$message.success('操作成功');
+					this.init();
+				}
+			},
+			download() {
+				downloadFile(this.detail.data[0] === '项目中心' ? 0 : 1, this.detail.dataId).then(res => {
+					let fileName = this.detail.data[1].split('-');
+					downloadFileDom(res, fileName[fileName.length - 1]);
+				});
+			}
+		},
+	}
+</script>
+
+<style>
+</style>

+ 66 - 0
virgo.wzfrontend/workark/src/components/work/organization/announcement/dialogDetail.vue

@@ -0,0 +1,66 @@
+<template>
+	<div class="notice-dialog-detail">
+		<div class="message-title">{{detail.title}}</div>
+		<div class="message-date"><span>发布时间:</span><span>{{detail.publishTime}}</span></div>
+		<div class="message-content">
+			{{detail.content}}
+		</div>
+	</div>
+</template>
+
+<script>
+	import {
+		getAnnouncementDetail
+	} from '@/api/organization'
+	export default {
+		props: ['detailId'],
+		data() {
+			return {
+				detail: {}
+			}
+		},
+		mounted() {
+			this.init();
+		},
+		methods: {
+			init() {
+				this.activeList = [];
+				getAnnouncementDetail(this.detailId).then(res => {
+					if (res.state) {
+						this.detail = res.data;
+					}
+				})
+			}
+		},
+	}
+</script>
+<style lang="scss">
+	.notice-dialog-detail {
+		padding: 20px;
+
+		.message-title {
+			font-size: 22px;
+			font-weight: 450;
+		}
+
+		.common-message {
+			padding: 10px;
+		}
+
+		.message-date {
+			color: $--color-text-secondary;
+			padding-bottom: 15px;
+			border-bottom: 1px solid $--border-color-lighter;
+			font-size: $--font-size-small;
+			padding-top: 5px;
+		}
+
+		.message-content {
+			margin-top: 15px;
+		}
+
+		.color-blue {
+			cursor: pointer;
+		}
+	}
+</style>

+ 1 - 1
virgo.wzfrontend/workark/src/layout/components/topNav.vue

@@ -11,7 +11,7 @@
 			</div>
 		</div>
 		<div class="work-layout-right">
-			<div class="work-layout-badge">
+			<div class="work-layout-badge" @click="$router.push('/work/message')">
 				<el-badge :is-dot="systemCountStatus">
 					<i class="iconfont huifont-xiaoxi"></i>
 				</el-badge>

+ 1 - 1
virgo.wzfrontend/workark/src/loading/loading.vue

@@ -29,7 +29,7 @@
 					if (!this.percent) {
 						this.showTimer = setTimeout(() => {
 							this.show = false;
-						}, 5000)
+						}, 10000)
 					}
 				} else {
 					if (this.showTimer) {

+ 2 - 2
virgo.wzfrontend/workark/src/router/index.js

@@ -1,5 +1,5 @@
 import Vue from 'vue'
-import Router from 'vue-router'
+import Router from 'vue-router'
 import indexLayout from '@/layout/indexLayout'
 import loginRouter from './modules/login'
 import workRouter from './modules/work'
@@ -21,7 +21,7 @@ export default new Router({
 			meta: {
 				title: '首页'
 			}
-		},{
+		}, {
 			path: '/website/serveDetail',
 			component: () => import('@/views/website/serveDetail'),
 			name: '服务详情',

+ 16 - 0
virgo.wzfrontend/workark/src/router/modules/work/message.js

@@ -0,0 +1,16 @@
+const message = [{
+	path: 'message',
+	component: () => import('@/views/message/list'),
+	name: '消息列表',
+	meta: {
+		title: '消息列表'
+	}
+}, {
+	path: 'notice',
+	component: () => import('@/views/message/notice'),
+	name: '公告通知',
+	meta: {
+		title: '公告通知'
+	}
+}]
+export default message;

+ 2 - 2
virgo.wzfrontend/workark/src/router/permission.js

@@ -16,8 +16,8 @@ NProgress.configure({
 	showSpinner: false
 })
 
-const baseUrl = ['/work', '/message','/work/discount/userCoupon'];
-const noTokenUrl = ['/', '/401', '/404', '/loginRegister/login','/website/serveDetail'];
+const baseUrl = ['/work', '/work/message', '/work/notice', '/work/discount/userCoupon'];
+const noTokenUrl = ['/', '/401', '/404', '/loginRegister/login', '/website/serveDetail'];
 
 const testBaseUrl = path => { //判断公共路由
 	return baseUrl.filter((item) => {

+ 256 - 0
virgo.wzfrontend/workark/src/uitls/datacenter.js

@@ -0,0 +1,256 @@
+import {
+	getProjectPermission,
+	getUserProjectPermissions,
+	getUserOrganizationPermissions,
+	validationProjectPermission,
+	validationOrganizationPermission,
+	getSetApprove
+} from '@/api/datacenter'
+import store from '../store';
+import {
+	MessageBox,
+	Message
+} from 'element-ui';
+import message from './message.js';
+let organization, project, user;
+let checker = []; //审核人
+const initData = () => {
+	organization = store.getters.organization;
+	project = store.getters.project;
+	user = store.getters.user;
+}
+//permission:1-公开 2-私密 3-密码
+const permission = (option, callback) => {
+	switch (option.permissions) {
+		case '1':
+			callback();
+			break;
+		case '2':
+			privacy(option, callback);
+			break;
+		case '3':
+			password(option, callback);
+			break;
+		default:
+			break;
+	}
+}
+//私密操作
+const privacy = (option, callback) => {
+	if (option.approveType === 1) {
+		getUserProjectPermissions(option.id, user.userId).then(res => {
+			privacySuccessFunc(res, option, callback)
+		})
+	} else if (option.approveType === 2) {
+		getUserOrganizationPermissions(option.id, user.userId).then(res => {
+			privacySuccessFunc(res, option, callback)
+		})
+	}
+}
+
+const privacySuccessFunc = (res, option, callback) => {
+	if (res.state) {
+		let data = res.data || {};
+		//权限通过
+		if (data[option.type]) return callback();
+		//权限不通过,是否申请权限
+		approveUser(option, callback);
+	}
+}
+
+const approveUser = (option, callback) => {
+	getSetApprove({
+		projectId: project.id,
+		operationOrganizationId: option.operationOrganizationId,
+		type: option.approveType
+	}).then(res => {
+		if (res.state) {
+			let obj = res.data[0] || {};
+			if (obj.checker) checker = JSON.parse(obj.checker).map(node => -node[node.length - 1]);
+			if (checker.filter(id => id === user.userId).length > 0) return callback();
+			//仅申请文件夹访问和文件下载
+			approveTip(option)
+		}
+	})
+}
+
+const operationName = (type) => {
+	let str = '';
+	switch (type) {
+		case 'access':
+			str = '访问';
+			break;
+		case 'create':
+			str = '创建';
+			break;
+		case 'delete':
+			str = '删除';
+			break;
+		case 'edit':
+			str = '编辑';
+			break;
+		case 'fileDelete':
+			str = '删除';
+			break;
+		case 'fileDownload':
+			str = '下载';
+			break;
+		case 'fileUpload':
+			str = '上传';
+			break;
+		case 'fileView':
+			str = '预览';
+			break;
+		default:
+			break;
+	}
+	return str;
+}
+
+const approveTip = (option) => {
+	let title = `该文件是私密文件夹,是否申请${operationName(option.type)}?`;
+	MessageBox.confirm(title, '系统提示', {
+		confirmButtonText: '确定',
+		cancelButtonText: '取消',
+		cancelButtonClass: 'cancel',
+		confirmButtonClass: 'confirm',
+		type: 'warning'
+	}).then(() => {
+		if (checker.length === 0) return Message.warning('暂未设置审核人');
+		let folder = '';
+		for (let i = 0; i < option.folderList.length; i++) {
+			folder += ('-' + option.folderList[i].name);
+		}
+		let folderName = `【${option.typeName}${folder}-${option.name}】`;
+		let title = `申请${operationName(option.type)}${folderName}`;
+		message.sendFlowMessage({}, {
+			operation: title,
+			receiver: checker.join(','),
+			messageType: 5,
+			dataType: returnType(option)[option.type],
+			dataId: option.id
+		}).then(res => {
+			if (res.state) Message.success('申请成功,请等待审核');
+		})
+	}).catch(() => {});
+}
+
+const returnType = (option) => {
+	let obj = {};
+	switch (option.approveType) {
+		case 1:
+			obj = {
+				access: 1,
+				create: 2,
+				delete: 3,
+				edit: 4,
+				fileDelete: 5,
+				fileDownload: 6,
+				fileUpload: 7,
+				fileView: 8
+			}
+			break;
+		case 2:
+			obj = {
+				access: 9,
+				create: 10,
+				delete: 11,
+				edit: 12,
+				fileDelete: 13,
+				fileDownload: 14,
+				fileUpload: 15,
+				fileView: 16
+			}
+			break;
+		default:
+			break;
+	}
+	return obj;
+}
+//密码验证
+const password = (option, callback) => {
+	let title = `该文件是加密文件夹,请输入密码${operationName(option.type)}?`;
+	MessageBox.prompt(title, '系统提示', {
+		confirmButtonText: '确定',
+		cancelButtonText: '取消',
+		cancelButtonClass: 'cancel',
+		confirmButtonClass: 'confirm',
+		type: 'warning',
+		inputType: 'password',
+		customClass: 'input-message'
+	}).then(({
+		value
+	}) => {
+		if (option.approveType === 1) {
+			validationProjectPermission(option.permissionsId, value).then(res => {
+				passwordSuccessFunc(res, callback)
+			})
+		} else if (option.approveType === 2) {
+			validationOrganizationPermission(option.id, value).then(res => {
+				passwordSuccessFunc(res, callback)
+			})
+		}
+	}).catch(() => {});
+}
+const passwordSuccessFunc = (res, callback) => {
+	if (res.state) {
+		if (res.data) return callback();
+		Message.warning('密码错误');
+	}
+}
+/* 
+ * 项目中心文件夹以及文件权限
+ * option['type'] = access-访问/create创建/delete-删除/edit-修改/fileDelete-文件删除/fileDownload-文件下载/fileUpload-文件上传/fileView-文件预览
+ */
+export function projectPermission(option, callback) {
+	if (!user) initData();
+	//获取最新权限
+	option['dataType'] = 'project';
+	option['typeName'] = '项目中心';
+	option['approveType'] = 1;
+	option['operationOrganizationId'] = -1;
+	getProjectPermission(option.id, -1).then(res => {
+		if (res.state) {
+			option['permissions'] = res.data == null ? option.oldPermission : res.data.permissions;
+			if (res.data) option['permissionsId'] = res.data.id;
+			permission(option, callback);
+		}
+	})
+}
+/* 
+ * 企业中心文件夹以及文件权限
+ * 
+ */
+export function organizationPermission(option, callback) {
+	if (!user) initData();
+	option['dataType'] = 'organization';
+	option['typeName'] = '企业中心';
+	option['approveType'] = 2;
+	option['operationOrganizationId'] = organization.id;
+	permission(option, callback);
+}
+/* 
+ * 下载文件
+ * 
+ */
+export function downloadFileDom(data, fileName) {
+	let blob = new Blob([data], {
+		type: 'application/octet-stream'
+	}); // 转化为blob对象
+	if (typeof window.navigator.msSaveBlob !== 'undefined') {
+		window.navigator.msSaveBlob(blob, fileName);
+	} else {
+		var blobURL = window.URL.createObjectURL(blob); // 将blob对象转为一个URL
+		var tempLink = document.createElement('a'); // 创建一个a标签
+		tempLink.style.display = 'none';
+		tempLink.href = blobURL;
+		tempLink.setAttribute('download', fileName); // 给a标签添加下载属性
+		if (typeof tempLink.download === 'undefined') {
+			tempLink.setAttribute('target', '_blank');
+		}
+		document.body.appendChild(tempLink); // 将a标签添加到body当中
+		tempLink.click(); // 启动下载
+		document.body.removeChild(tempLink); // 下载完毕删除a标签
+		window.URL.revokeObjectURL(blobURL);
+	}
+}

+ 2 - 2
virgo.wzfrontend/workark/src/uitls/message.js

@@ -194,7 +194,7 @@ export default {
 		let message = '';
 		if (params.messageType === 6) {
 			message =
-				`【项目邀请】${store.getters.user.name}在${dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss')}邀请加入<${store.getters.project.name}>项目,请及时处理。`
+				`【项目邀请】${store.getters.user.userName}在${dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss')}邀请加入<${store.getters.project.name}>项目,请及时处理。`
 		}
 		return message;
 	},
@@ -212,7 +212,7 @@ export default {
 			obj['projectItemTargetId'] = data.projectItemTargetId;
 		}
 		let message =
-			`【${type.title}】${store.getters.user.name}在${dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss')}${params.operation}${msg}${type.content}`
+			`【${type.title}】${store.getters.user.userName}在${dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss')}${params.operation}${msg}${type.content}`
 		if (params.isCC === 1) message += ',并抄送给你';
 		return {
 			message: message,

+ 121 - 0
virgo.wzfrontend/workark/src/views/message/list.vue

@@ -0,0 +1,121 @@
+<template>
+	<div class="hui-flex hui-content border-box">
+		<div class="hui-content-title">
+			<div class="hui-title-item active">消息通知</div>
+		</div>
+		<div class="hui-flex-box hui-flex hui-table">
+			<div class="hui-flex-box">
+				<el-table :data="tableData" height="100%">
+					<el-table-column label="序号" width="50">
+						<template slot-scope="scope">
+							{{scope.$index + 1}}
+						</template>
+					</el-table-column>
+					<el-table-column label="消息内容">
+						<template slot-scope="scope">
+							<div class="hui-ellipsis">
+								{{scope.row.message}}
+							</div>
+						</template>
+					</el-table-column>
+					<el-table-column label="是否已读" width="180">
+						<template slot-scope="scope">
+							<div class="hui-table-tag">
+								<div class="hui-tag hui-tag-info" v-if="scope.row.viewed">已读</div>
+								<div class="hui-tag hui-tag-warning" v-else>未读</div>
+							</div>
+						</template>
+					</el-table-column>
+					<el-table-column label="时间" prop="sentTime" width="180"></el-table-column>
+					<el-table-column label="消息类型" prop="messageType" width="150">
+						<template slot-scope="scope">
+							<div class="hui-table-tag">
+								<div class="hui-tag">
+									<div>{{messageType(scope.row.messageType).name}}</div>
+								</div>
+							</div>
+						</template>
+					</el-table-column>
+					<el-table-column width="150" label="操作">
+						<template slot-scope="scope">
+							<div class="hui-table-operation">
+								<span class="table-operation" @click="detail(scope.row)">
+									详情
+								</span>
+							</div>
+						</template>
+					</el-table-column>
+					<template slot="empty">
+						<el-empty description="暂无消息"></el-empty>
+					</template>
+				</el-table>
+			</div>
+			<div class="hui-content-pagination">
+				<el-pagination :page-size="pageSize" :pager-count="9" layout="prev, pager, next" :total="totalCount"
+					@current-change="currentChange">
+				</el-pagination>
+			</div>
+		</div>
+		<el-drawer title="消息详情" :visible.sync="drawer" :size="400" :append-to-body="true">
+			<detail v-if="drawer" :type="item.messageType" :detail="item" @close="drawer = false">
+			</detail>
+		</el-drawer>
+	</div>
+</template>
+
+<script>
+	import {
+		getMessagePageListByQuery
+	} from '@/api/message'
+	const detail = () => import('@/components/message/detail');
+	export default {
+		data() {
+			return {
+				tableData: [],
+				pageIndex: 1,
+				pageSize: 15,
+				totalCount: 0,
+				item: {},
+				drawer: false
+			}
+		},
+		mounted() {
+			this.init();
+		},
+		methods: {
+			init() {
+				let data = {
+					projectId: this.$store.getters.project.id,
+					organizationId: this.$store.getters.organization.id,
+					userId: this.$store.getters.user.userId
+				}
+				getMessagePageListByQuery(this.pageIndex, this.pageSize, data).then(res => {
+					if (res.state) {
+						this.tableData = res.data.dataList.map(node => {
+							return Object.assign(node, JSON.parse(node.json));
+						});
+						this.totalCount = res.data.totalCount;
+					}
+				})
+			},
+			detail(item) {
+				if (!item.viewed) this.$msg.viewed(item.id, this.init);
+				this.item = item;
+				this.drawer = true;
+			},
+			messageType(type) {
+				return this.$msg.messageType.filter(item => item.id === type)[0];
+			},
+			currentChange(pageIndex) {
+				this.pageIndex = pageIndex;
+				this.init();
+			}
+		},
+		components: {
+			detail
+		},
+	}
+</script>
+
+<style lang="scss">
+</style>

+ 107 - 0
virgo.wzfrontend/workark/src/views/message/notice.vue

@@ -0,0 +1,107 @@
+<template>
+	<div class="hui-flex hui-content border-box">
+		<div class="hui-content-title">
+			<div class="hui-title-item active">公告管理</div>
+		</div>
+		<div class="hui-flex-box hui-flex hui-table">
+			<div class="hui-flex-box">
+				<el-table :data="tableData" row-key="id" height="100%" v-loading="loading">
+					<el-table-column label="序号" width="50">
+						<template slot-scope="scope">
+							<div style="text-align: center;">{{scope.$index + 1}}</div>
+						</template>
+					</el-table-column>
+					<el-table-column label="公告标题" prop="title"></el-table-column>
+					<el-table-column label="公告分类">
+						<template slot-scope="scope">
+							<span>{{$field.findTypeName('announcementType',scope.row.category)}}</span>
+						</template>
+					</el-table-column>
+					<el-table-column label="优先级">
+						<template slot-scope="scope">
+							<span>{{$field.findTypeName('announcementPriority',scope.row.priority)}}</span>
+						</template>
+					</el-table-column>
+					<el-table-column label="发布时间" prop="publishTime"></el-table-column>
+					<el-table-column label="操作" width="150">
+						<template slot-scope="scope">
+							<div class="hui-table-operation">
+								<span class="table-operation" @click="lookItem(scope.row)">
+									详情
+								</span>
+							</div>
+						</template>
+					</el-table-column>
+					<template slot="empty">
+						<el-empty description="暂无数据"></el-empty>
+					</template>
+				</el-table>
+			</div>
+			<div class="hui-content-pagination">
+				<el-pagination :pager-count="9" layout="prev, pager, next" :page-size="pageSize" :total="totalCount"
+					@current-change="currentChange" background>
+				</el-pagination>
+			</div>
+		</div>
+		<el-dialog :close-on-click-modal="false" title="公告详情" :visible.sync="visible" width="900px"
+			:append-to-body="true">
+			<dialog-detail v-if="visible" :detailId="detailId"></dialog-detail>
+		</el-dialog>
+	</div>
+</template>
+
+<script>
+	import {
+		getAnnouncementListByQueryAndPage
+	} from '@/api/organization'
+	const dialogDetail = () => import('@/components/work/organization/announcement/dialogDetail');
+	export default {
+		data() {
+			return {
+				tableData: [],
+				currPage: 1,
+				pageSize: 10,
+				totalCount: 0,
+				detailId: '',
+				filterOption: {},
+				loading: false,
+				visible: false
+			}
+		},
+		mounted() {
+			this.init();
+		},
+		methods: {
+			init() {
+				let filterOption = {
+					organizationId: this.$store.getters.organization.id,
+					projectId: this.$store.getters.id,
+					status: 1
+				};
+				filterOption = Object.assign(filterOption, this.filterOption);
+				this.loading = true;
+				getAnnouncementListByQueryAndPage(this.currPage, this.pageSize, filterOption).then(res => {
+					if (res.state) {
+						this.tableData = res.data.dataList;
+						this.totalCount = res.data.totalCount;
+					}
+					this.loading = false;
+				})
+			},
+			currentChange(currPage) {
+				this.currPage = currPage;
+				this.init();
+			},
+			lookItem(val) {
+				this.detailId = val.id;
+				this.visible = true;
+			}
+		},
+		components: {
+			dialogDetail
+		}
+	}
+</script>
+
+<style>
+</style>

+ 3 - 1
virgo.wzfrontend/workark/src/views/website/serveDetail.vue

@@ -109,9 +109,11 @@
 				this.detail = this.list[val];
 				if (this.detail.rotatingImages) {
 					this.rotatingImages = JSON.parse(this.detail.rotatingImages);
-					this.detailedImage = JSON.parse(this.detail.detailedImage);
 					this.initSwiper();
 				}
+				if (this.detail.detailedImage) {
+					this.detailedImage = JSON.parse(this.detail.detailedImage);
+				}
 			},
 			initSwiper() {
 				this.$nextTick(() => {

+ 244 - 169
virgo.wzfrontend/workark/src/views/work/index.vue

@@ -1,228 +1,284 @@
 <template>
 	<div class="work-index">
-		<div class="work-left">
-			<div class="work-box">
-				<div class="title">
-					<div class="label">个人信息</div>
-				</div>
-				<div class="content user-content">
-					<div class="user-avatar">
-						<div class="user-avatar-img">
-							<avatar :user="user" :size="20"></avatar>
-						</div>
-						<div class="user-avatar-name">{{user.userName}}</div>
+		<div class="work-index-content">
+			<div class="work-left">
+				<div class="work-box">
+					<div class="title">
+						<div class="label">个人信息</div>
 					</div>
-					<div class="user-list">
-						<div class="user-item">
-							<div class="user-key">公司名称</div>
-							<div class="user-value">{{organization.name}}</div>
-						</div>
-						<div class="user-item">
-							<div class="user-key">公司部门</div>
-							<div class="user-value">智慧城市事业部</div>
+					<div class="content user-content">
+						<div class="user-avatar">
+							<div class="user-avatar-img">
+								<avatar :user="user" :size="20"></avatar>
+							</div>
+							<div class="user-avatar-name">{{user.userName}}</div>
 						</div>
-						<div class="user-item">
-							<div class="user-key">联系方式</div>
-							<div class="user-value">{{user.phone}}</div>
+						<div class="user-list">
+							<div class="user-item">
+								<div class="user-key">公司名称</div>
+								<div class="user-value">{{organization.name}}</div>
+							</div>
+							<div class="user-item">
+								<div class="user-key">公司部门</div>
+								<div class="user-value">智慧城市事业部</div>
+							</div>
+							<div class="user-item">
+								<div class="user-key">联系方式</div>
+								<div class="user-value">{{user.phone}}</div>
+							</div>
 						</div>
 					</div>
 				</div>
-			</div>
-			<div class="work-box">
-				<div class="title">
-					<div class="label">公司公告</div>
-				</div>
-				<div class="content notice-content">
-					<div class="notice-item">
-						<div class="notice-dage"></div>
-						<div class="notice-label hui-ellipsis">
-							为提升系统稳定性及优化服务体验,我司计划于 2023年10月25日(周三)凌晨00:00至06:00
-							进行系统升级维护。期间以下服务将暂时无法访问
-						</div>
-						<div class="notice-date alibaba">2021-01-01</div>
+				<div class="work-box">
+					<div class="title">
+						<div class="label">公告</div>
+						<div class="more" @click="$router.push('/work/notice')">查看更多>></div>
 					</div>
-					<div class="notice-item">
-						<div class="notice-dage"></div>
-						<div class="notice-label hui-ellipsis">
-							为提升系统稳定性及优化服务体验,我司计划于 2023年10月25日(周三)凌晨00:00至06:00
-							进行系统升级维护。期间以下服务将暂时无法访问
+					<div class="content notice-content" v-if="noticeList.length >0">
+						<div class="notice-item" v-for="(item,index) in noticeList" :key="item.id"
+							@click="openNotice(item)">
+							<div class="notice-dage"></div>
+							<div class="notice-label hui-ellipsis">{{item.content}}</div>
+							<div class="notice-date alibaba">{{$dayjs(item.publishTime).format('YYYY-MM-DD')}}</div>
 						</div>
-						<div class="notice-date alibaba">2021-01-01</div>
 					</div>
-					<div class="notice-item">
-						<div class="notice-dage ready"></div>
-						<div class="notice-label hui-ellipsis">
-							为提升系统稳定性及优化服务体验,我司计划于 2023年10月25日(周三)凌晨00:00至06:00
-							进行系统升级维护。期间以下服务将暂时无法访问
-						</div>
-						<div class="notice-date alibaba">2021-01-01</div>
+					<div class="content notice-content" v-else>
+						<el-empty description="暂无公告" :image-size="80"></el-empty>
 					</div>
-					<div class="notice-item">
-						<div class="notice-dage ready"></div>
-						<div class="notice-label hui-ellipsis">
-							为提升系统稳定性及优化服务体验,我司计划于 2023年10月25日(周三)凌晨00:00至06:00
-							进行系统升级维护。期间以下服务将暂时无法访问
-						</div>
-						<div class="notice-date alibaba">2021-01-01</div>
+				</div>
+				<div class="work-box message-work-box">
+					<div class="title">
+						<div class="label">消息通知</div>
+						<div class="more" @click="$router.push('/work/message')">查看更多>></div>
 					</div>
-					<div class="notice-item">
-						<div class="notice-dage ready"></div>
-						<div class="notice-label hui-ellipsis">
-							为提升系统稳定性及优化服务体验,我司计划于 2023年10月25日(周三)凌晨00:00至06:00
-							进行系统升级维护。期间以下服务将暂时无法访问
+					<div class="content message-content" v-if="messageList.length >0">
+						<div class="message-item hui-ellipsis" v-for="(item,index) in messageList" :key="item.id">
+							{{item.message}}
 						</div>
-						<div class="notice-date alibaba">2021-01-01</div>
 					</div>
-					<div class="notice-item">
-						<div class="notice-dage ready"></div>
-						<div class="notice-label hui-ellipsis">
-							为提升系统稳定性及优化服务体验,我司计划于 2023年10月25日(周三)凌晨00:00至06:00
-							进行系统升级维护。期间以下服务将暂时无法访问
-						</div>
-						<div class="notice-date alibaba">2021-01-01</div>
+					<div class="content message-content" v-else>
+						<el-empty description="暂无消息通知" :image-size="80"></el-empty>
 					</div>
 				</div>
 			</div>
-			<div class="work-box message-work-box">
-				<div class="title">
-					<div class="label">消息通知</div>
-				</div>
-				<div class="content message-content">
-					<div class="message-item hui-ellipsis">【资产登记】vincent在2025-03-15 07:19:14提交了测试3号楼-2层的资产登记流程</div>
-					<div class="message-item hui-ellipsis">【资产登记】vincent在2025-03-15 07:18:50提交了测试3号楼-2层的资产登记流程</div>
-					<div class="message-item hui-ellipsis">【资产登记】vincent在2025-03-15 07:18:27提交了测试3号楼-2层的资产登记流程</div>
-					<div class="message-item hui-ellipsis">【资产登记】vincent在2025-03-03 15:44:56提交了2号楼-6F的资产登记流程</div>
-					<div class="message-item hui-ellipsis">【资产登记】vincent在2025-03-03 09:44:52提交了2号楼-6F的资产登记流程</div>
-					<div class="message-item hui-ellipsis">【资产登记】vincent在2025-03-03 09:44:52提交了2号楼-6F的资产登记流程</div>
-					<div class="message-item hui-ellipsis">【资产登记】vincent在2025-03-03 09:44:52提交了2号楼-6F的资产登记流程</div>
-					<div class="message-item hui-ellipsis">【资产登记】vincent在2025-03-03 09:44:52提交了2号楼-6F的资产登记流程</div>
-				</div>
-			</div>
-		</div>
-		<div class="work-right">
-			<div class="work-box">
-				<div class="title">
-					<div class="label">服务数据</div>
-					<div class="title-option">
-						<div v-for="(item,index) in versionList"
-							:class="nowVersion.id === item.id ?'option-item active':'option-item'"
-							@click="nowVersion = item">
-							{{item.name}}
+			<div class="work-right">
+				<div class="work-box message-work-box">
+					<div class="title">
+						<div class="label">服务数据</div>
+						<div class="title-option">
+							<div v-for="(item,index) in versionList"
+								:class="nowVersion.id === item.id ?'option-item active':'option-item'"
+								@click="changeVersion(item)">
+								{{item.name}}
+							</div>
 						</div>
 					</div>
-				</div>
-				<div class="content count-serve-content">
-					<div class="count-serve-item color-primary">
-						<div class="count-serve-title hanyiyaku">{{nowVersion.id === 1 ? '消费金额' : '成交金额'}}</div>
-						<div class="count-serve-value alibaba">7293</div>
-					</div>
-					<div class="count-serve-item color-success">
-						<div class="count-serve-title hanyiyaku">订单数</div>
-						<div class="count-serve-value alibaba">1</div>
-					</div>
-					<div class="count-serve-item color-warning">
-						<div class="count-serve-title hanyiyaku">发票数</div>
-						<div class="count-serve-value alibaba">1</div>
+					<div class="content count-serve-content">
+						<div class="count-serve-item color-primary">
+							<div class="count-serve-title hanyiyaku">{{nowVersion.id === 1 ? '消费金额' : '成交金额'}}</div>
+							<div class="count-serve-value alibaba">{{orderCountNumber[nowVersion.type].totalFee}}</div>
+						</div>
+						<div class="count-serve-item color-success">
+							<div class="count-serve-title hanyiyaku">订单数</div>
+							<div class="count-serve-value alibaba">{{orderCountNumber[nowVersion.type].orders}}</div>
+						</div>
+						<div class="count-serve-item color-warning">
+							<div class="count-serve-title hanyiyaku">发票数</div>
+							<div class="count-serve-value alibaba">{{orderCountNumber[nowVersion.type].invoice}}</div>
+						</div>
+						<div class="count-serve-item color-warning">
+							<div class="count-serve-title hanyiyaku">合同数</div>
+							<div class="count-serve-value alibaba">{{orderCountNumber[nowVersion.type].contract}}</div>
+						</div>
 					</div>
-					<div class="count-serve-item color-warning">
-						<div class="count-serve-title hanyiyaku">合同数</div>
-						<div class="count-serve-value alibaba">1</div>
+					<div class="title">
+						<div class="label">订单统计</div>
+						<div>
+							<el-date-picker size="small" v-model="timeData" type="daterange" range-separator="至"
+								start-placeholder="开始日期" end-placeholder="结束日期" @change="initOrderByTime"
+								value-format="yyyy-MM-dd" :clearable="false" align="center">
+							</el-date-picker>
+						</div>
 					</div>
-				</div>
-				<div class="title">
-					<div class="label">订单统计</div>
-				</div>
-				<div ref="chart1" class="content order-count"></div>
-				<div class="title">
-					<div class="label">{{nowVersion.id === 1 ? '购买排行' : '销量排行'}}</div>
-				</div>
-				<div class="content pay-count">
-					<div class="pay-header tr">
-						<div class="td td-150">排名</div>
-						<div class="td td-flex">产品</div>
-						<div class="td td-150">单价</div>
-						<div class="td td-150">{{nowVersion.id === 1 ? '购买次数' : '销量'}}</div>
+					<div ref="chart1" class="content order-count"></div>
+					<div class="title">
+						<div class="label">{{nowVersion.id === 1 ? '购买排行' : '销量排行'}}</div>
 					</div>
-					<div class="pay-table">
-						<div class="pay-tr tr">
-							<div class="td td-150">1</div>
-							<div class="td td-flex">
-								<div class="serve-item">
-									<img src="https://file-node.oss-cn-shanghai.aliyuncs.com/youji/6f7cab1df442463ba88c4e26e541ec99"
-										alt="payment.png">
-									<span>高新技术企业</span>
-								</div>
-							</div>
-							<div class="td td-150">¥1200</div>
-							<div class="td td-150">32</div>
+					<div class="content pay-count">
+						<div class="pay-header tr">
+							<div class="td td-150">排名</div>
+							<div class="td td-flex">产品</div>
+							<div class="td td-150">单价</div>
+							<div class="td td-150">{{nowVersion.id === 1 ? '购买次数' : '销量'}}</div>
 						</div>
-						<div class="pay-tr tr">
-							<div class="td td-150">2</div>
-							<div class="td td-flex">
-								<div class="serve-item">
-									<img src="https://file-node.oss-cn-shanghai.aliyuncs.com/youji/6f7cab1df442463ba88c4e26e541ec99"
-										alt="payment.png">
-									<span>高新技术企业</span>
+						<div class="pay-table" v-if="orderCount[nowVersion.type].length>0">
+							<div class="pay-tr tr" v-for="(item,index) in orderCount[nowVersion.type]" :key="item.id">
+								<div class="td td-150">{{index+1}}</div>
+								<div class="td td-flex">
+									<div class="serve-item">
+										<img :src="imageUrl(item.rotatingImages)" alt="payment.png">
+										<span>{{item.name}}</span>
+									</div>
 								</div>
+								<div class="td td-150">¥{{item.price}}</div>
+								<div class="td td-150">{{item.orders}}</div>
 							</div>
-							<div class="td td-150">¥1200</div>
-							<div class="td td-150">32</div>
 						</div>
-						<div class="pay-tr tr">
-							<div class="td td-150">3</div>
-							<div class="td td-flex">
-								<div class="serve-item">
-									<img src="https://file-node.oss-cn-shanghai.aliyuncs.com/youji/6f7cab1df442463ba88c4e26e541ec99"
-										alt="payment.png">
-									<span>高新技术企业</span>
-								</div>
-							</div>
-							<div class="td td-150">¥1200</div>
-							<div class="td td-150">32</div>
+						<div class="pay-table" v-else>
+							<el-empty description="暂无记录" :image-size="80"></el-empty>
 						</div>
 					</div>
 				</div>
 			</div>
 		</div>
+		<el-dialog :close-on-click-modal="false" title="公告详情" :visible.sync="visible" width="900px"
+			:append-to-body="true">
+			<dialog-detail v-if="visible" :detailId="detailId"></dialog-detail>
+		</el-dialog>
 	</div>
 </template>
 
 <script>
+	import {
+		getAnnouncementListByQueryAndPage
+	} from '@/api/organization'
+	import {
+		getMessagePageListByQuery
+	} from '@/api/message'
+	import {
+		getOrdeCount,
+		getOrdeCountByDate,
+		getOrdeCountPay
+	} from '@/api/serve'
+	const dialogDetail = () => import('@/components/work/organization/announcement/dialogDetail');
 	export default {
+		components: {
+			dialogDetail
+		},
 		data() {
 			return {
 				user: {},
 				organization: {},
 				versionList: [{
 					id: 1,
+					type: 'payOrganization',
 					name: '企业版'
 				}, {
 					id: 2,
+					type: 'organization',
 					name: '商业版'
 				}],
 				nowVersion: {
 					id: 1,
+					type: 'payOrganization',
 					name: '企业版'
-				}
+				},
+				noticeList: [],
+				messageList: [],
+				orderCount: {
+					organization: [],
+					payOrganization: []
+				},
+				orderCountNumber: {
+					organization: {
+						totalFee: 0,
+						contract: 0,
+						orders: 0,
+						invoice: 0
+					},
+					payOrganization: {
+						totalFee: 0,
+						contract: 0,
+						orders: 0,
+						invoice: 0
+					}
+				},
+				timeData: [],
+				visible: false,
+				detailId: ''
 			}
 		},
 		mounted() {
 			this.user = this.$store.getters.user;
 			this.organization = this.$store.getters.organization;
-			this.chart(this.$refs.chart1, [
-				[1, 3, 2, 6, 1, 1, 3, 2, 6, 1]
-			], ['#32a0ff'], ['04/11', '04/12', '04/13', '04/14', '04/15', '04/16', '04/17', '04/18', '04/19',
-				'04/20'
-			], [new echarts.graphic.LinearGradient(0,
-				0, 0, 1, [{
-					offset: 0,
-					color: 'rgba(50,160,255, 0.35)'
-				}, {
-					offset: 1,
-					color: 'rgba(50,160,255, 0)'
-				}])])
+			this.timeData = [this.$dayjs().subtract(1, 'month').format('YYYY-MM-DD'), this.$dayjs().format('YYYY-MM-DD')];
+			this.init();
 		},
 		methods: {
+			init() {
+				this.initNotice();
+				this.initMessage();
+				this.initOrder();
+				this.initOrderByTime();
+			},
+			initNotice() {
+				getAnnouncementListByQueryAndPage(1, 6, {
+					organizationId: this.$store.getters.organization.id,
+					projectId: this.$store.getters.id,
+					status: 1
+				}).then(res => {
+					if (res.state) {
+						this.noticeList = res.data.dataList;
+					}
+				})
+			},
+			initMessage() {
+				getMessagePageListByQuery(1, 10, {
+					organizationId: this.$store.getters.organization.id,
+					projectId: this.$store.getters.id,
+					userId: this.$store.getters.user.userId
+				}).then(res => {
+					if (res.state) {
+						this.messageList = res.data.dataList.map(node => {
+							return Object.assign(node, JSON.parse(node.json));
+						});
+					}
+				})
+			},
+			initOrder() {
+				getOrdeCountPay(this.$store.getters.organization.id).then(res => {
+					if (res.state) {
+						this.orderCount = res.data;
+					}
+				});
+				getOrdeCount(this.$store.getters.organization.id).then(res => {
+					if (res.state) {
+						this.orderCountNumber = res.data;
+					}
+				});
+			},
+			initOrderByTime() {
+				getOrdeCountByDate(this.$store.getters.organization.id, this.timeData[0], this.timeData[1]).then(res => {
+					if (res.state) {
+						let data = res.data[this.nowVersion.type];
+						this.chart(this.$refs.chart1, [data.map(node => node.orders)], ['#32a0ff'], data.map(
+							node => node.day), [new echarts.graphic.LinearGradient(0,
+							0, 0, 1, [{
+								offset: 0,
+								color: 'rgba(50,160,255, 0.35)'
+							}, {
+								offset: 1,
+								color: 'rgba(50,160,255, 0)'
+							}])])
+					}
+				});
+			},
+			imageUrl(data) {
+				if (!data) return 'https://assets.api.uizard.io/api/cdn/stream/c05650d2-192b-4a56-ae97-05638f53804c.png';
+				let imgData = JSON.parse(data)[0];
+				if (!imgData) {
+					return 'https://assets.api.uizard.io/api/cdn/stream/c05650d2-192b-4a56-ae97-05638f53804c.png';
+				}
+				return imgData.url;
+			},
+			changeVersion(item) {
+				this.nowVersion = item;
+				this.initOrderByTime();
+			},
+			openNotice(item) {
+				this.detailId = item.id;
+				this.visible = true;
+			},
 			chart(elem, data, color, x, areaColor) {
 				let chart = echarts.init(elem);
 				let series = [];
@@ -327,7 +383,12 @@
 	.work-index {
 		width: 100%;
 		height: 100%;
-		display: flex;
+		overflow-y: auto;
+
+		.work-index-content {
+			display: flex;
+			min-height: 100%;
+		}
 
 		.work-left {
 			width: 420px;
@@ -348,6 +409,10 @@
 			border-radius: 4px;
 			margin-bottom: 15px;
 
+			&:last-child {
+				margin-bottom: 0;
+			}
+
 			&.message-work-box {
 				flex: 1;
 				height: 0;
@@ -364,6 +429,16 @@
 				justify-content: space-between;
 				align-items: center;
 
+				.more {
+					color: $--color-text-secondary;
+					cursor: pointer;
+					font-size: $--font-size-small;
+
+					&:hover {
+						color: $--color-primary;
+					}
+				}
+
 				.label {
 					font-size: $--font-size-large;
 					font-weight: bold;

+ 1 - 1
virgo.wzfrontend/workark/src/views/work/organization/announcement.vue

@@ -50,7 +50,7 @@
 								<span class="table-operation" @click="lookItem(scope.row)">
 									详情
 								</span>
-								<span class="table-operation" @click="updateItem(scope.row)">
+								<span class="table-operation" v-if="!scope.row.status" @click="updateItem(scope.row)">
 									编辑
 								</span>
 								<span class="table-operation" @click="deleteItem(scope.row)">