瀏覽代碼

Merge branch 'master' of http://47.100.37.243:10080/wutt/manHourHousekeeper

cs 2 年之前
父節點
當前提交
6fd617de6a
共有 67 個文件被更改,包括 1852 次插入143 次删除
  1. 881 0
      fhKeeper/formulahousekeeper/inva_4_tivo/css/customer.css
  2. 419 0
      fhKeeper/formulahousekeeper/inva_4_tivo/customer.html
  3. 1 0
      fhKeeper/formulahousekeeper/inva_4_tivo/followup.html
  4. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/Aim.png
  5. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/bannar.jpg
  6. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/beijing.jpg
  7. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/five.jpg
  8. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/four.jpg
  9. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/funLeft.png
  10. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/hezuo.png
  11. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/kehu1.png
  12. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/kehu2.jpg
  13. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/kehu3.jpg
  14. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/kehu4.jpg
  15. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/kind.jpg
  16. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/li1.png
  17. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/li10.png
  18. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/li11.png
  19. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/li2.png
  20. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/li3.png
  21. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/li4.png
  22. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/li5.png
  23. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/li6.png
  24. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/li7.png
  25. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/li8.png
  26. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/li9.png
  27. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/logo.png
  28. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/one.jpg
  29. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/onn1.jpg
  30. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/onn2.jpg
  31. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/onn3.jpg
  32. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/onn4.jpg
  33. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/onn5.jpg
  34. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/onn6.jpg
  35. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/rightOne.png
  36. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/rightThree.png
  37. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/rightTwo.png
  38. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/six.jpg
  39. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/specialShow.png
  40. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/three.jpg
  41. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/two.jpg
  42. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/xiaojianto.png
  43. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/you.png
  44. 二進制
      fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/zuo.png
  45. 3 2
      fhKeeper/formulahousekeeper/inva_4_tivo/index.html
  46. 134 0
      fhKeeper/formulahousekeeper/inva_4_tivo/js/customer.js
  47. 1 0
      fhKeeper/formulahousekeeper/inva_4_tivo/project.html
  48. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  49. 10 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java
  50. 5 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  51. 140 57
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  52. 7 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  53. 3 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  54. 3 0
      fhKeeper/formulahousekeeper/octopus/src/views/customer/list.vue
  55. 5 1
      fhKeeper/formulahousekeeper/timesheet/src/i18n/en.json
  56. 5 1
      fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json
  57. 5 0
      fhKeeper/formulahousekeeper/timesheet/src/main.js
  58. 4 0
      fhKeeper/formulahousekeeper/timesheet/src/permissions.js
  59. 15 2
      fhKeeper/formulahousekeeper/timesheet/src/views/Login.vue
  60. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/centerManage/centerManage.vue
  61. 70 9
      fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue
  62. 10 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  63. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  64. 25 10
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/expense/details.vue
  65. 100 40
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/expense/index.vue
  66. 2 2
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/index/index.vue
  67. 1 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/my/children/center.vue

+ 881 - 0
fhKeeper/formulahousekeeper/inva_4_tivo/css/customer.css

@@ -0,0 +1,881 @@
+@charset "utf-8";
+
+html {font-size: 10px; -webkit-text-size-adjust:none; -webkit-tap-highlight-color: rgba(0,0,0,0);}
+@media screen and (min-width:320px){html{font-size:    10px;}}
+@media screen and (min-width:360px){html{font-size: 11.25px;}}
+@media screen and (min-width:375px){html{font-size: 11.7px;}}
+@media screen and (min-width:480px){html{font-size:    15px;}}
+@media screen and (min-width:414px){html{font-size:  13px;}}
+@media screen and (min-width:560px){html{font-size:  17.5px;}}
+@media screen and (min-width:640px){html{font-size:    20px;}}
+
+.contentes {
+    width: 81.25rem;
+    margin: auto;
+    position: relative;
+}
+.contentes img {
+    width: 100%;
+    height: 100%;
+}
+/* 质询图标 */
+.consulting {
+    width: 3.125rem;
+    height: 3.125rem;
+    border-radius: 50%;
+    background: #fff;
+    position: fixed;
+    bottom: 3.75rem;
+    right: 6.25rem;
+    z-index: 4;
+    box-shadow: 0 0 1.25rem 0px #cbcbcb;
+    cursor:pointer;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+.consulting:hover {
+    background: #3396FB;
+}
+.conImgConImg {
+    width: 2.5rem;
+    height: 2.5rem;
+    position: relative;
+    margin-top: 1.5625rem;
+    margin-left: 1.125rem;
+}
+.conImgConImg img{
+    width: 100%;
+}
+/* 咨询 */
+.zhixun {
+    display: block;
+    position: fixed;
+    bottom: 7.5rem;
+    right: 2.5rem;
+    padding: 1rem;
+    background: #fff;
+    box-shadow: .1875rem .1875rem .625rem #ccc;
+    z-index: 99999999;
+    text-align: center;
+}
+.zhixun p {
+    margin: 8px 0;
+}
+.zhixun img {
+    width: 8rem;
+}
+
+.tabOn {
+    background: #fff;
+    color: #20a0ff !important;
+}
+.white{
+    background: #fff !important;
+}
+/* 产品介绍 */
+.product {
+    width: 100%;
+    position: fixed;
+    z-index: 10;
+    top: 6.25rem;
+    left: 0;
+    background: #fff;
+    height: 18.75rem;
+    border-top: .0625rem solid rgb(163, 163, 163);
+    box-shadow: 1px 3px 5px 0px #ddd;
+}
+.connont {
+    width: 81.25rem;
+    margin: auto;
+}
+
+.tils::before {
+    content:"";
+    height: .125rem;
+    width: 100%;
+    bottom: 0;
+    left: 0;
+    background: #37B8FF;
+    position: absolute;
+}
+/* 导航下拉 */
+.management {
+    margin-top: 1.25rem;
+    width: 33.75rem;
+    font-size: 1rem;
+}
+.management h3 {
+    width: 100%;
+    font-size: 1rem;
+    font-weight: normal;
+    color: #333333;
+    line-height: 2.5rem;
+    border-bottom: .0625rem solid rgb(180, 180, 180);
+    margin-left: 1.25rem;
+}
+.management ul {
+    margin-top: .625rem;
+    width: 11.25rem;
+}
+.management li{
+    margin-top: .625rem;
+    line-height: 2.5rem;
+    cursor:pointer;
+    padding-left: 1.25rem;
+}
+.management a {
+    color: #333;
+}
+.management li:hover {
+    background: #F0F4FF;
+    border-radius: .625rem;
+    color: #3370FF;
+}
+
+/* js锁添加的样式 */
+.tils::before {
+    content:"";
+    height: .125rem;
+    width: 100%;
+    bottom: 0;
+    left: 0;
+    background: #37B8FF;
+    position: absolute;
+}
+.hanAll {
+    background: #fff !important;
+    box-shadow: .0625rem .1875rem .3125rem 0px #ddd;
+}
+.abc .til {
+    color: #fff !important;
+}
+.abc .til a{
+    color: #fff !important;
+}
+.navigationBarBack {
+    /* background: #f6fef9; */
+    background-color:transparent !important;
+}
+.navigationBar {
+    box-shadow:none;
+}
+.navigationTitle a {
+    color: #333 !important;
+}
+.navigationTitle {
+    color: #333 !important;
+}
+
+/* bannar */
+.bannar {
+    width: 100%;
+    height: 100vh;
+    margin: auto;
+    position: relative;
+    overflow: hidden;
+    display: flex;
+    justify-content: center;
+}
+.bannar img {
+    /* width: 100%; */
+    height: 100%;
+}
+.bannarCon {
+    position: absolute;
+    z-index: 1;
+    top: 15.625rem;
+    left:  50%;
+    width: 81.25rem;
+    margin-left: -40.625rem;
+}
+.bannarConTil {
+    font-size: 7.625rem;
+    font-weight: bold;
+    color: #fff;
+    letter-spacing: .9375rem;
+}
+.bannarConTilP  {
+    font-size: 1.5rem;
+    color: #fefeff;
+    letter-spacing: .375rem;
+    margin-top: 2.5rem;
+    margin-bottom: 10.3125rem;
+    font-style: italic;
+}
+.bannBtn {
+    width: 12.5rem;
+    height: 3.875rem;
+    border-radius: 3.875rem;
+    border: .125rem solid #fff;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    font-size: 1.375rem;
+}
+.bannarCon a {
+    color: #fff;
+    letter-spacing: .1875rem;
+}
+
+/* 客户管家 */
+.collaborationTeam {
+    width: 100%;
+    background: #ffffff;
+    height: 250vh;
+}
+.collTeam {
+    height: 100vh;
+    box-sizing: border-box;
+    position: sticky;
+    top: 6.375rem;
+    background: url(../image/customer/beijing.jpg) no-repeat center;
+    /* background-size: 100% 114%; */
+}
+.collCent {
+    display: flex;
+    justify-content: center;
+    flex-wrap: wrap;
+    box-sizing: border-box;
+    padding-top: 12.5rem;
+}
+.collCentDiv {
+
+}
+.collCentImg {
+    width: 8.125rem;
+    height: 8.125rem;
+    position: relative;
+    z-index: 2;
+}
+.collCentFonts {
+    font-size: 2.25rem;
+    color: #333;
+    overflow: hidden;
+    width: 100%;
+    /* padding-left: 2.5rem; */
+    text-align: center;
+    padding-top: 1.5625rem;
+}
+.collCentFonts span {
+    color: #5e95f8;
+}
+
+/* 核心功能 */
+.coreFunctionTiyle {
+    margin: auto;
+}
+.coreFunctionTiyle h2 {
+    font-size: 50px;
+    color: #5e5e5e;
+    text-align: center;
+    margin: auto;
+    /* font-weight: normal; */
+    padding: 5.3125rem 0 1rem 0;
+}
+.coreFunctionTiyle span {
+    color: #5e95f8;
+}
+.coreFunctionTiyle p {
+    font-size: 1.25rem;
+    color: #cdc1aa;
+    text-align: center;
+    margin: auto;
+    padding-bottom: 2.625rem;
+}
+.coreFunctionCon {
+    display: flex;
+    width: 95rem;
+    justify-content: center;
+}
+.coreFunctionConLeft {
+    display: inline-block;
+    width: 21.875rem;
+    background: #f5f6f8;
+    border-radius: .625rem;
+    box-sizing: border-box;
+    padding: 0 2.1875rem;
+}
+.coreFunctionConLeft h3 { 
+    font-weight: normal;
+    color: #a9acfa;
+    font-size: 2.625rem;
+    padding: 2.8125rem 0 4.0625rem 0;
+}
+.coreFunctionConLeft span {
+    display: block;
+    margin: auto;
+    width: 10.9375rem;
+    height: 10.9375rem;
+}
+.coreFunctionConLeft span img {
+    width: 100%;
+    height: 100%;
+}
+.coreFunctionConLeft p {
+    font-size: 1.375rem;
+    color: #a0a0a2;
+    text-align: center;
+    line-height: 1.75rem;
+    padding: 2.25rem 0 2.375rem 0;
+}
+.coreFunctionConRiht {
+    display: inline-block;
+    margin-left: 3.75rem;
+}
+.coreFunctionConRihtCon {
+    width: 21.25rem;
+    font-family: '宋体';
+    margin-bottom: 2.1875rem;
+    display: flex;
+}
+.coreFunctionConRihtCon:last-child {
+    margin-bottom: 0;
+}
+.coreImg {
+    width: 6.5625rem;
+    display: inline-block;
+    height: 6.5625rem;
+    margin-right: 1.375rem;
+}
+.coreImg img{
+    width: 100%;
+    height: 100%;
+    display: inline-block;
+}
+.coreFunctionConRihtCon h4 {
+    font-weight: normal;
+    font-size: 1.5625rem;
+    color: #a9acfa;
+    padding-bottom: 1.125rem;
+}
+.coreFunctionConRihtCon p {
+    font-size: 1.25rem;
+    color: #595959;
+    line-height: 1.375rem;
+}
+.coreFunctionConRihtCon span {
+    display: inline-block;
+    font-size: 1.0625rem;
+    color: #3830a6;
+    margin-top: 1.5rem;
+}
+
+.coreLeft {
+    box-shadow: 0 0 8px 4px #dfdfdf;
+}
+
+/* 各类需求 */
+.kindsNeeds {
+    margin-top: 9.6875rem;
+    display: flex;
+    width: 95rem;
+    justify-content: center;
+}
+.kindsNeedsLeft {
+    position: relative;
+    width: 66.875rem;
+    height: 38.125rem;
+}
+.kindsNeedsLeft img {
+    width: 100%;
+    height: 100%;
+}
+.kindsNeedsRight {
+    width: 8rem;
+    padding-left: 1rem;
+    font-family: '黑体';
+    font-weight: 600;
+}
+.kindsNeedsRight p {
+    font-size: 2.625rem;
+    width: 3.125rem;
+    color: #5e5e5e;
+    line-height: 2.875rem;
+}
+.kindsNeedsRight span {
+    display: block;
+    width: 3.125rem;
+    color: #5e95f8;
+    font-size: 3.125rem;
+    line-height: 3.625rem;
+}
+
+.kindsNeedsPointTil {
+    font-size: 1.375rem;
+    color: #3e4045;
+    display: flex;
+    align-items: center;
+    margin-bottom: 1.5rem;
+    letter-spacing: .125rem;
+}
+.kindsNeedsPointTil span {
+    width: .75rem;
+    height: 2.25rem;
+    border-radius: .75rem;
+    display: inline-block;
+    margin-right: .625rem;
+}
+.kindsNeedsPointCon {
+    font-size: 1.0625rem;
+    color: #b4a281;
+    display: flex;
+    align-items: center;
+    margin-bottom: 1.125rem;
+    letter-spacing: .125rem;
+}
+.kindsNeedsPointCon span {
+    width: .75rem;
+    height: .75rem;
+    border-radius: .75rem;
+    display: inline-block;
+    margin-right: .625rem;
+}
+.green {
+    position: absolute;
+    top: 8.625rem;
+    left: 7.9375rem;
+}
+.green span {
+    background: #6ecd7c;
+}
+.yellow {
+    position: absolute;
+    top: 8.625rem;
+    left: 25.3125rem; 
+}
+.yellow span {
+    background: #fccd4b;
+}
+.red {
+    position: absolute;
+    top: 21.125rem;
+    left: 7.9375rem;
+}
+.red span {
+    background: #ed6a70;
+}
+.blue {
+    position: absolute;
+    top: 21.125rem;
+    left: 25.3125rem; 
+}
+.blue span {
+    background: #5e95f8;
+}
+.purple {
+    position: absolute;
+    top: 15rem;
+    right: 6rem; 
+}
+.purple span {
+    background: #a7ade8;
+}
+
+/* 渐变色 */
+.gradient {
+    background: linear-gradient(#fff, #ece7ea);
+    padding: 4.875rem 0 2.5rem 0      ;
+}
+
+/* 特色展示 */
+.specialShow {
+    width: 75rem;
+    margin: auto;
+}
+.specialShowTil {
+    position: relative;
+    height: 7rem;
+    margin-left: 6.5rem;
+}
+.specialShowTil h2 {
+    font-size: 3.125rem;
+    font-weight: normal;
+    font-family: '黑体';
+    color: #5e5e5e;
+    letter-spacing: 8px;
+}
+.specialShowTil h2 span {
+    color: #5e95f8;
+}
+.specialShowProgressbar {
+    position: absolute;
+    left: 7.5rem;
+    top: 5.3125rem;
+}
+.specialShowProgressbar div {
+    width: 15.9375rem;
+    height: .1875rem;
+    background: #d6d6d6;
+    position: relative;
+}
+.specialShowProgressbar span {
+    display: inline-block;
+    width: 13.75rem;
+    height: .1875rem;
+    background: #20a0ff;
+    position: absolute;
+    top: 0;
+    left: 0;
+}
+.specialShowProgressbar p {
+    font-size: 1rem;
+    position: absolute;
+    top: .625rem;
+    left: 11.25rem;
+}
+.specialShowCon {
+    display: flex;
+    justify-content: space-between;
+}
+.specialShowConLeft {
+    width: 14rem;
+    text-align: center;
+    margin-left: 1.5rem;
+}
+.specialShowConLeft li{
+    display: flex;
+    justify-content: center;
+    flex-wrap: wrap;
+    width: 100%;
+    height: 2rem;
+    font-size: 1.25rem;
+    color: #a0a0a2;
+    margin-bottom: 1.4375rem;
+    cursor: pointer;
+}
+.specialShowConLeft div {
+    position: relative;
+    width: 100%;
+    height: .25rem;
+    background: #efefef;
+}
+.specialShowConLeft span {
+    display: inline-block;
+    width: 12.625rem;
+    height: .25rem;
+    position: absolute;
+    top: 0;
+    left: 0;
+    background: #eae5db;
+}
+.specialShowConLeft .on {
+    color: #5e95f8;
+}
+.specialShowConLeft .on span {
+    background: #c4d8fc;
+    width: 12.625rem;
+    height: .25rem;
+}
+.specialShowConright {
+    position: relative;
+    width: 57.1875rem;
+    box-sizing: border-box;
+    padding-top: 1.25rem;
+}
+.specialShowConrightImg {
+    width: 46.25rem;
+    height: 28.125rem;
+}
+.specialShowConrightImg img, .dynamicImg img, .indusIonImg img {
+    width: 100%;
+    height: 100%;
+}
+.dynamicImg {
+    width: 49.375rem;
+    height: 27.8125rem;
+    position: absolute;
+    top: 5.625rem;
+    right: 0;
+}
+
+/* 行业解决方案 */
+.industry {
+    margin-top: 3.4375rem;
+}
+.industry h2 {
+    font-size: 3.125rem;
+    color: #5e5e5e;
+    text-align: center;
+    margin-bottom: 1.875rem;
+    font-weight: normal;
+    letter-spacing: .875rem;
+}
+.industry h2 span {
+    color: #5e95f8;
+}
+.industryCon {
+    display: flex;
+    justify-content: space-between;
+    width: 75rem;
+    margin: auto;
+}
+.industryConLeft {
+    width: 28.4375rem;
+    height: 34.0625rem;
+    background: #fff;
+    border-radius: .625rem;
+    box-sizing: border-box;
+    display: flex;
+    padding: 1.125rem 4.375rem 2.25rem 4.375rem;
+    flex-wrap: wrap;
+    justify-content: space-between;
+    align-content: space-between;
+}
+.industryConRight {
+    display: flex;
+    flex-wrap: wrap;
+    width: 43.4375rem;;
+    align-content: space-between;
+}
+.industryConRight .industryConRightCon {
+    width: 43.4375rem;
+    height: 15.3125rem;
+    background: #fff;
+    border-radius: .625rem;
+    box-sizing: border-box;
+    padding: 4.25rem 6.875rem 3.75rem 7.5rem;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+}
+.indusIon {
+    display: flex;
+    width: 6.875rem;
+    flex-wrap: wrap;
+    justify-content: center;
+}
+.indusIon .indusIonImg {
+    width: 6.25rem;
+    height: 4.875rem;
+}
+.indusIon p{
+    font-size: 22px;
+    color: #595959;
+    margin-top: .875rem;
+    letter-spacing: .25rem;
+}
+.industRightConIon {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    flex-wrap: wrap;
+    width: 4.8125rem;
+    height: 7rem;
+}
+.indusConIonImg {
+    width: 4.8125rem;
+    height: 4.8125rem;
+}
+.indusConIonImg img {
+    width: 100%;
+    height: 100%;
+}
+.industRightConIon p {
+    font-size: 1.375rem;
+    color: #595959;
+    letter-spacing: .25rem;
+}
+.industryConLeft, .industryConRightCon {
+    box-shadow: 0px .1875rem .625rem .25rem #cfcfcf;
+}
+
+/* 客户评价 */
+.evaluation {
+    width: 79.375rem;
+    background: #fff;
+    margin: auto;
+    position: relative;
+    padding-bottom: 6.875rem;
+}
+.evaluationLogo {
+    width: 75.8125rem;
+    height: 5.375rem;
+    margin: auto;
+    margin-top: .625rem;
+    margin-bottom: 3.125rem;
+}
+.evaluationLogo img {
+    width: 100%;
+    height: 100%;
+}
+.evaluationC {
+    position: relative;
+    width: 79.375rem;
+    margin: auto;
+}
+.evaluationCon {
+    width: 68.75rem;
+    overflow: hidden;
+    margin: auto;
+}
+.evaluationConIkun {
+    width: 275rem;
+    display: flex;
+    position: relative;
+}
+.evaluationConLi {
+    width: 68.75rem;
+    /* display: inline-block; */
+    display: flex;
+    justify-content: space-between;
+}
+.evaluationConLiLeft .evaluationConLiRight {
+    display: inline-block;
+}
+.evaluationConLi .evaluationConLiLeft {
+    width: 38rem;
+    height: 24.9375rem;
+}
+.evaluationConLiLeft img {
+    width: 100%;
+    height: 100%;
+}
+.evaluationConLiRight {
+    width: 22.75rem;
+}
+.evaluationConLiRight h3 {
+    font-weight: normal;
+    font-size: 3.125rem;
+    color: #474747;
+    letter-spacing: .25rem;
+    padding: 1.75rem 0 3.4375rem 0;
+    position: relative;
+}
+.evaluationConLiRight p {
+    line-height: 1.875rem;
+    font-size: 1rem;
+    color: #3e4045;
+}
+.evaluationConLiRightBtn {
+    display: flex;
+    align-items: center;
+    width: 13rem;
+    background: #b4a281;
+    margin-top: 2rem;
+    height: 3.4375rem;
+    color: #fff;
+    cursor: pointer;
+}
+.evaluationConLiRightBtn span {
+    text-align: center;
+    width: 10.25rem;
+    border-right: 2px solid #fff;
+    line-height: 3.4375rem;
+    font-size: 1.375rem;
+    letter-spacing: .25rem;
+}
+.evaluationConLiRightBtn img {
+    display: inline-block;
+    width: .8125rem;
+    height: .9375rem;
+    margin-left: .875rem;
+}
+.zuo {
+    position: absolute;
+    top: 6.875rem;
+    left: 0;
+}
+.you {
+    position: absolute;
+    top: 6.875rem;
+    right: 0;
+}
+.zuo, .you {
+    width: 1.875rem;
+    height: 2.625rem;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    background: #3e4045;
+    cursor: pointer;
+}
+.zuo img, .you img {
+    width: .5rem;
+    height: 1.0625rem;
+}
+.zuo:hover, .you:hover{
+    background: #b3a280;
+}
+.zhis {
+    cursor: not-allowed;
+}
+
+/* 底部 */
+.footer-frame {
+	width: 100%;
+	height: 24px;
+}
+
+.footer {
+	padding-top: 48px;
+	padding-bottom: 8px;
+	background-color: #20a0ff;
+    margin-top: -0.125rem;
+}
+
+.footer .footer-col {
+	margin-bottom: 36px;
+}
+
+.footer h4 {
+	margin-bottom: 10px;
+	color: #fff;
+}
+
+.footer .list-unstyled,
+.footer p {
+	color: #f3f7fd;
+}
+
+.footer .footer-col.middle .list-unstyled .fas {
+	color: #fff;
+	font-size: 8px;
+	line-height: 24px;
+}
+
+.footer .footer-col.middle .list-unstyled .media-body {
+	margin-left: 8px;
+}
+
+.footer .footer-col.last .list-unstyled .fas {
+	color: #fff;
+	font-size: 14px;
+	line-height: 24px;
+}
+
+.footer .footer-col.last .list-unstyled .media-body {
+	margin-left: 10px;
+}
+
+.footer .footer-col.last .list-unstyled .fas.fa-globe {
+	margin-left: 16px;
+	margin-right: 10px;
+}
+
+.navbar {
+    padding: 0 !important;
+}
+
+.ulss {
+    display: inline-block;
+}
+.alss {
+    display: flex;
+    justify-content: space-around;
+    width: 87.5rem;
+    margin: auto;
+}
+.footsst {
+    background: #fff;
+}
+
+.copyright {
+    width: 100%;
+    text-align: center;
+    line-height: 2.5rem;
+    color: #fff;
+    font-size: 1rem;
+    background: #20a0ff;
+    border-top: 1px solid #565656;
+}

文件差異過大導致無法顯示
+ 419 - 0
fhKeeper/formulahousekeeper/inva_4_tivo/customer.html


+ 1 - 0
fhKeeper/formulahousekeeper/inva_4_tivo/followup.html

@@ -60,6 +60,7 @@
                         <a href="./index.html"><li>工时管家</li></a>
                         <a href="./followup.html"><li>随访管家</li></a>
                         <a href="./project.html"><li>项目管家</li></a> 
+                        <a href="./customer.html"><li>客户管家</li></a> 
                     </ul>
                 </div>
                 <div></div>

二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/Aim.png


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/bannar.jpg


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/beijing.jpg


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/five.jpg


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/four.jpg


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/funLeft.png


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/hezuo.png


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/kehu1.png


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/kehu2.jpg


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/kehu3.jpg


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/kehu4.jpg


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/kind.jpg


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/li1.png


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/li10.png


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/li11.png


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/li2.png


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/li3.png


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/li4.png


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/li5.png


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/li6.png


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/li7.png


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/li8.png


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/li9.png


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/logo.png


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/one.jpg


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/onn1.jpg


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/onn2.jpg


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/onn3.jpg


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/onn4.jpg


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/onn5.jpg


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/onn6.jpg


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/rightOne.png


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/rightThree.png


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/rightTwo.png


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/six.jpg


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/specialShow.png


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/three.jpg


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/two.jpg


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/xiaojianto.png


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/you.png


二進制
fhKeeper/formulahousekeeper/inva_4_tivo/image/customer/zuo.png


+ 3 - 2
fhKeeper/formulahousekeeper/inva_4_tivo/index.html

@@ -15,8 +15,8 @@
     <script src="js/jquery1.42.min.js"></script>
     <script src="js/jquery.SuperSlide.2.1.3.js"></script>
     <!-- 统计文件 -->
-    <script charset="UTF-8" id="LA_COLLECT" src="//sdk.51.la/js-sdk-pro.min.js"></script>
-    <script>LA.init({id: "Jk62Sh8gvUhl1xcU",ck: "Jk62Sh8gvUhl1xcU"})</script>
+    <!-- <script charset="UTF-8" id="LA_COLLECT" src="//sdk.51.la/js-sdk-pro.min.js"></script>
+    <script>LA.init({id: "Jk62Sh8gvUhl1xcU",ck: "Jk62Sh8gvUhl1xcU"})</script> -->
 </head>
 
 <body data-spy="scroll" data-target=".fixed-top" id="body">
@@ -78,6 +78,7 @@
                         <a href="./index.html"><li>工时管家</li></a>
                         <a href="./followup.html"><li>随访管家</li></a>
                         <a href="./project.html"><li>项目管家</li></a> 
+                        <a href="./customer.html"><li>客户管家</li></a> 
                     </ul>
                 </div>
                 <div></div>

+ 134 - 0
fhKeeper/formulahousekeeper/inva_4_tivo/js/customer.js

@@ -0,0 +1,134 @@
+// 屏幕试图的高度
+let screenHeight = $(window).height()
+
+// 客户管家
+let collaborationTeamHight =  $('#collaborationTeam').offset().top
+
+$(window).scroll(function () {
+    // 当前滚动的高度
+    let currentTop = $(window).scrollTop()
+    if(currentTop < 2) {
+        $('#all').removeClass('hanAll')
+        $('#abc').addClass('abc')
+        $('#navigationBar').removeClass('white')
+    } else {
+        $("#all").addClass("hanAll");
+        $("#abc").removeClass("abc");
+        $("#navigationBar").addClass("white");
+    }
+
+    // 客户管家滚动计算
+    if(currentTop > collaborationTeamHight && currentTop < (collaborationTeamHight + screenHeight)) {
+        let teamOffset = (currentTop - collaborationTeamHight) / screenHeight
+        console.log(teamOffset, '透明度')
+        $('#collCentImg').css({'transform': `translate(0, ${(1 - teamOffset) * 250}px)`})
+        $('#collCentFonts').css({'opacity': teamOffset})
+    }
+})
+
+// 导航下划线
+$('.aus li').hover(function () {
+    let i = $(this).index()
+    $(".aus li").eq(i).addClass('tils')
+},function () {
+    let i = $(this).index()
+    $(".aus li").eq(i).removeClass('tils')
+
+})
+
+$('.auss li').hover(function () {
+    let i = $(this).index()
+    $(".auss li").eq(i).addClass('tils')
+},function () {
+    let i = $(this).index()
+    $(".auss li").eq(i).removeClass('tils')
+})
+
+// 客服hover
+$('#zhixun').hover(function () {
+    $("#zhixun").show()
+    $("#consultigImg").attr("src", './image/ions/kefu1.png')
+},function () {
+    $("#zhixun").hide()
+    $("#consultigImg").attr("src", './image/ions/kefu2.png')
+})
+$('#consulting').hover(function () {
+    $("#zhixun").show()
+    $("#consultigImg").attr("src", './image/ions/kefu1.png')
+},function () {
+    $("#zhixun").hide()
+    $("#consultigImg").attr("src", './image/ions/kefu2.png')
+})
+
+// 产品鼠标移入移出
+let fls = true
+$('#productHov').hover(function () {$("#product").show()},function () {
+    setTimeout(function() {
+        if(fls) {
+            $("#product").hide()
+        }
+    }, 200)
+})
+$('#product').hover(function () {
+    fls = false
+    $("#product").show()
+},function () {
+    fls = true
+    $("#product").hide()
+})
+
+// 特色展示 
+$('#specialShowConLeftUL li').click(function () {
+    let index = $(this).index()
+    let arr = $('#specialShowConLeftUL li')
+    // if(index != '1' && index != '7') {
+       for(let i in arr) {
+            $('#specialShowConLeftUL li').removeClass('on')
+       }
+       $(this).addClass("on")
+       $('#easyManBoxConImg').attr("src", './image/customer/li'+(+index + 1)+'.png')
+    // }
+})
+
+// 用户评价点击事件
+let numberClick = 0
+// 移动的距离
+let mobiledistance = 0
+
+$(function() {
+    kehuFlg()
+    $('#kehuRight').click(function() {
+        if(numberClick < 3) {
+            numberClick++
+            zuoyouClick()
+        }
+    })
+    $('#kehuLeft').click(function() {
+        if(numberClick > 0 && numberClick <= 3) {
+            numberClick--
+            zuoyouClick()
+        }
+    })
+})
+
+function zuoyouClick() {
+    console.log(numberClick)
+    mobiledistance = '-' + (numberClick * 68.75) + 'rem'
+    $('.evaluationConIkun').stop(true,false).animate({
+        'left': mobiledistance
+    }, 400)
+    kehuFlg()
+}
+
+function kehuFlg() {
+    if(numberClick == 0) {
+        $('#kehuLeft').addClass("zhis")
+    } else {
+        $('#kehuLeft').removeClass("zhis")
+    }
+    if(numberClick >= 3) {
+        $('#kehuRight').addClass("zhis")
+    } else {
+        $('#kehuRight').removeClass("zhis")
+    }
+} 

+ 1 - 0
fhKeeper/formulahousekeeper/inva_4_tivo/project.html

@@ -70,6 +70,7 @@
                         <a href="./index.html"><li>工时管家</li></a>
                         <a href="./followup.html"><li>随访管家</li></a>
                         <a href="./project.html"><li>项目管家</li></a> 
+                        <a href="./customer.html"><li>客户管家</li></a> 
                     </ul>
                 </div>
                 <div></div>

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -1362,7 +1362,7 @@ public class ReportController {
                 LocalDate localEndDate = LocalDate.parse(endDate, dateTimeFormatter);
                 TimeType timeType = timeTypeMapper.selectById(byId.getCompanyId());
                 //时间间隔不得超过365天
-                long until = localStartDate.until(localEndDate, ChronoUnit.DAYS);
+                long until = localStartDate.until(localEndDate, ChronoUnit.DAYS) + 1;
                 if (until > 365) {
                     //msg.setError("日期间隔不得超过365天");
                     msg.setError(MessageUtils.message("date.dateThan365"));

+ 10 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java

@@ -68,6 +68,8 @@ public class TaskController {
     @Resource
     private TaskExecutorMapper taskExecutorMapper;
     @Resource
+    private ParticipationMapper participationMapper;
+    @Resource
     private TaskExecutorService taskExecutorService;
     @Resource
     private CompanyDingdingService companyDingdingService;
@@ -122,6 +124,7 @@ public class TaskController {
             task.setPlanHours(executorList.stream().mapToInt(TaskExecutor::getPlanHours).sum());
             //检查执行人是否在当前分组的参与人当中
             List<GroupParticipator> groupParticipatorList = groupParticipatorMapper.selectList(new QueryWrapper<GroupParticipator>().eq("group_id", task.getGroupId()));
+            List<Participation> participationList = participationMapper.selectList(new QueryWrapper<Participation>().eq("project_id", task.getProjectId()));
             for (TaskExecutor executor : executorList) {
                 if(executor.getExecutorId()!=null){
                     boolean b = groupParticipatorList.stream().anyMatch(gp -> gp.getUserId() != null && gp.getUserId().equals(executor.getExecutorId()));
@@ -131,6 +134,13 @@ public class TaskController {
                         g.setUserId(executor.getExecutorId());
                         groupParticipatorMapper.insert(g);
                     }
+                    boolean b1 = participationList.stream().anyMatch(pl -> pl.getUserId() != null && pl.getUserId().equals(executor.getExecutorId()));
+                    if(!b1){
+                        Participation participation=new Participation();
+                        participation.setUserId(executor.getExecutorId());
+                        participation.setProjectId(task.getProjectId());
+                        participationMapper.insert(participation);
+                    }
                 }
             }
         }

+ 5 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -912,12 +912,13 @@ public class WeiXinCorpController {
                     data.setAuthUsername(authUserInfo.getString("name"));
                     String userId = authUserInfo.getString("userid");//授权人的userid
 
-                    //检查公司名称是否存在
-                    List<Company> cpList = companyMapper.selectList(new QueryWrapper<Company>().eq("company_name", corpName).or().eq("company_name", data.getCorpFullName()));
+                    //检查公司名称是否存在,按照corpid比对
+                    WxCorpInfo findCorp = wxCorpInfoMapper.selectById(corpId);
+
                     Company company = null;
                     SysRole managerRole = null;
-                    if (cpList.size() > 0) {
-                        company = cpList.get(0);
+                    if (findCorp != null) {
+                        company = companyMapper.selectById(findCorp.getCompanyId());
                         managerRole = sysRoleMapper.selectOne(new QueryWrapper<SysRole>().eq("company_id", company.getId()).eq("rolename", com.management.platform.constant.Constant.ROLE_SUPER_MANAGER));
                     } else {
                         //首先生成一个新公司,增加会员的试用一个月
@@ -1010,7 +1011,6 @@ public class WeiXinCorpController {
                     data.setSaasSyncContact(enableNewVersion?1:0);
                     wxCorpInfoMapper.insert(data);
                     //默认普通员工的角色
-                    SysRole defaultUserRole = sysRoleService.getOne(new QueryWrapper<SysRole>().eq("company_id", company.getId()).eq("is_default", 1));
                     JSONObject userDetail = getUserInfo(curCorpAccessToken, userId);
                     //检查授权人是否存在
                     int cnt = userMapper.selectCount(new QueryWrapper<User>().eq("corpwx_userid", userId));

+ 140 - 57
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -56,6 +56,8 @@ import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
 import java.util.stream.Collectors;
 
+import static org.springframework.boot.system.SystemProperties.get;
+
 /**
  * <p>
  * 服务实现类
@@ -594,7 +596,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                 r.setGroupName(optinal.get().getName());
                             }
                         }
-                    } else {
+                    } else if (reportAuditType == 1 || reportAuditType == 2){
                         List<GroupParticipator> groupParticipatorList = groupParticipatorMapper.selectList(new QueryWrapper<GroupParticipator>());
                         if (groupParticipatorList.size() > 0) {
                             List<Integer> groupIds = groupParticipatorList.stream().map(GroupParticipator::getGroupId).collect(Collectors.toList());
@@ -1387,41 +1389,53 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 for (Integer rid : ids) {
                     Report r = new Report();
                     r.setId(rid);
-                    ReportAuditorSetting auditorItem = auditorSettingList.stream().filter(a -> a.getReportId().equals(rid)).findFirst().get();
-                    switch (auditorItem.getCurAuditLevel()) {
-                        case 1:
-                            if (auditorItem.getAuditorSec() != null) {
-                                //进入到第二审批人
-                                r.setProjectAuditorId(auditorItem.getAuditorSec());
-                                auditorItem.setCurAuditLevel(2);
-                                updateReportAuditorSettingList.add(auditorItem);
-                            } else {
-                                r.setProjectAuditState(1);
-                                r.setProjectAuditTime(LocalDateTime.now());
-                                r.setState(1);
-                            }
-                            updateReportList.add(r);
-                            break;
-                        case 2:
-                            if (auditorItem.getAuditorThird() != null) {
-                                //进入到第三审批人
-                                r.setProjectAuditorId(auditorItem.getAuditorThird());
-                                auditorItem.setCurAuditLevel(3);
-                                updateReportAuditorSettingList.add(auditorItem);
-                            } else {
+                    Optional<ReportAuditorSetting> first = auditorSettingList.stream().filter(a -> a.getReportId().equals(rid)).findFirst();
+                    if (first.isPresent()) {
+                        //存在员工提交的审批流记录
+                        ReportAuditorSetting auditorItem = first.get();
+                        switch (auditorItem.getCurAuditLevel()) {
+                            case 1:
+                                //第二审批人存在,并且和第一审批人不一样
+                                if (auditorItem.getAuditorSec() != null && !auditorItem.getAuditorSec().equals(auditorItem.getAuditorFirst())) {
+                                    //进入到第二审批人
+                                    r.setProjectAuditorId(auditorItem.getAuditorSec());
+                                    auditorItem.setCurAuditLevel(2);
+                                    updateReportAuditorSettingList.add(auditorItem);
+                                } else {
+                                    r.setProjectAuditState(1);
+                                    r.setProjectAuditTime(LocalDateTime.now());
+                                    r.setState(1);
+                                }
+                                updateReportList.add(r);
+                                break;
+                            case 2:
+                                //第三审批人存在,并且和第二审批人不一样
+                                if (auditorItem.getAuditorThird() != null && !auditorItem.getAuditorThird().equals(auditorItem.getAuditorSec())) {
+                                    //进入到第三审批人
+                                    r.setProjectAuditorId(auditorItem.getAuditorThird());
+                                    auditorItem.setCurAuditLevel(3);
+                                    updateReportAuditorSettingList.add(auditorItem);
+                                } else {
+                                    r.setProjectAuditState(1);
+                                    r.setProjectAuditTime(LocalDateTime.now());
+                                    r.setState(1);
+                                }
+                                updateReportList.add(r);
+                                break;
+                            case 3:
+                                //目前最多三层,第三个审批人审批后结束
                                 r.setProjectAuditState(1);
                                 r.setProjectAuditTime(LocalDateTime.now());
                                 r.setState(1);
-                            }
-                            updateReportList.add(r);
-                            break;
-                        case 3:
-                            //目前最多三层,第三个审批人审批后结束
-                            r.setProjectAuditState(1);
-                            r.setProjectAuditTime(LocalDateTime.now());
-                            r.setState(1);
-                            updateReportList.add(r);
-                            break;
+                                updateReportList.add(r);
+                                break;
+                        }
+                    } else {
+                        //是之前项目审核人直接审核的情况,还没切换到员工自行选择审核人的情况
+                        r.setProjectAuditState(1);
+                        r.setProjectAuditTime(LocalDateTime.now());
+                        r.setState(1);
+                        updateReportList.add(r);
                     }
                 }
                 if (updateReportList.size() > 0) {
@@ -1616,7 +1630,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 for (Report report : reportList) {
                     if(report.getState()==1){
                         ReportAuditorSetting reportAuditorSetting = reportAuditorSettingMapper.selectById(report.getId());
-                        if(reportAuditorSetting.getCcUserid() != null){
+                        if(reportAuditorSetting != null && reportAuditorSetting.getCcUserid() != null){
                             Optional<User> first = userList.stream().filter(ul -> ul.getId().equals(reportAuditorSetting.getCcUserid())).findFirst();
                             //取到抄送人
                             User u = first.get();
@@ -2269,35 +2283,58 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 updateBatchById(reportList);
             } else if (timeType.getReportAuditType() == 3) {
                 //员工自由选择的审批人
+                allUsers = userMapper.selectList(new QueryWrapper<User>().select("id, name, department_id").eq("company_id", company.getId()));
+                List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().select("id, state, project_id, project_audit_state, creator_id, create_date, company_id").in("id", ids));
+                allReports = reportList;
                 String auditorId = user.getId();
                 List<ReportAuditorSetting> auditorSettingList = reportAuditorSettingMapper.selectList(new QueryWrapper<ReportAuditorSetting>().in("report_id", ids));
                 List<Report> updateReportList = new ArrayList<>();
+                List<ReportAuditorSetting> updateReportAuditorSettingList = new ArrayList<>();
                 for (Integer rid : ids) {
                     Report r = new Report();
                     r.setId(rid);
-                    ReportAuditorSetting auditorItem = auditorSettingList.stream().filter(a -> a.getReportId().equals(rid)).findFirst().get();
-                    if (auditorId.equals(auditorItem.getAuditorFirst())) {
-                        if (auditorItem.getAuditorSec() != null) {
-                            //进入到第二审批人
-                            r.setProjectAuditorId(auditorItem.getAuditorSec());
-                        } else {
-                            r.setProjectAuditState(1);
-                            r.setProjectAuditTime(LocalDateTime.now());
-                            r.setState(1);
-                        }
-                        updateReportList.add(r);
-                    } else if (auditorId.equals(auditorItem.getAuditorSec())) {
-                        if (auditorItem.getAuditorThird() != null) {
-                            //进入到第三审批人
-                            r.setProjectAuditorId(auditorItem.getAuditorThird());
-                        } else {
-                            r.setProjectAuditState(1);
-                            r.setProjectAuditTime(LocalDateTime.now());
-                            r.setState(1);
+                    Optional<ReportAuditorSetting> first = auditorSettingList.stream().filter(a -> a.getReportId().equals(rid)).findFirst();
+                    if (first.isPresent()) {
+                        ReportAuditorSetting auditorItem = first.get();
+                        switch (auditorItem.getCurAuditLevel()) {
+                            case 1:
+                                //第二审批人存在,并且和第一审批人不一样
+                                if (auditorItem.getAuditorSec() != null && !auditorItem.getAuditorSec().equals(auditorItem.getAuditorFirst())) {
+                                    //进入到第二审批人
+                                    r.setProjectAuditorId(auditorItem.getAuditorSec());
+                                    auditorItem.setCurAuditLevel(2);
+                                    updateReportAuditorSettingList.add(auditorItem);
+                                } else {
+                                    r.setProjectAuditState(1);
+                                    r.setProjectAuditTime(LocalDateTime.now());
+                                    r.setState(1);
+                                }
+                                updateReportList.add(r);
+                                break;
+                            case 2:
+                                //第三审批人存在,并且和第二审批人不一样
+                                if (auditorItem.getAuditorThird() != null && !auditorItem.getAuditorThird().equals(auditorItem.getAuditorSec())) {
+                                    //进入到第三审批人
+                                    r.setProjectAuditorId(auditorItem.getAuditorThird());
+                                    auditorItem.setCurAuditLevel(3);
+                                    updateReportAuditorSettingList.add(auditorItem);
+                                } else {
+                                    r.setProjectAuditState(1);
+                                    r.setProjectAuditTime(LocalDateTime.now());
+                                    r.setState(1);
+                                }
+                                updateReportList.add(r);
+                                break;
+                            case 3:
+                                //目前最多三层,第三个审批人审批后结束
+                                r.setProjectAuditState(1);
+                                r.setProjectAuditTime(LocalDateTime.now());
+                                r.setState(1);
+                                updateReportList.add(r);
+                                break;
                         }
-                        updateReportList.add(r);
-                    } else if (auditorId.equals(auditorItem.getAuditorThird())) {
-                        //目前最多三层,第三个审批人审批后结束
+                    } else {
+                        //老版本的数据,直接审核通过
                         r.setProjectAuditState(1);
                         r.setProjectAuditTime(LocalDateTime.now());
                         r.setState(1);
@@ -2306,6 +2343,10 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 }
                 if (updateReportList.size() > 0) {
                     updateBatchById(updateReportList);
+                    //更新审核人的审批流程
+                    if (updateReportAuditorSettingList.size() > 0) {
+                        reportAuditorSettingService.updateBatchById(updateReportAuditorSettingList);
+                    }
                 }
             } else {
                 List<AuditWorkflowTimeSetting> settings = auditWorkflowTimeSettingMapper.selectList(
@@ -2555,6 +2596,48 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     }
                 }
             }
+
+            if (timeType.getReportAuditType() == 3) {
+                //审核通过的话,给抄送人发送审核通过提醒
+                List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().in("id", ids));
+                for (Report report : reportList) {
+                    if(report.getState()==1){
+                        ReportAuditorSetting reportAuditorSetting = reportAuditorSettingMapper.selectById(report.getId());
+                        if(reportAuditorSetting != null && reportAuditorSetting.getCcUserid() != null){
+                            Optional<User> first = userList.stream().filter(ul -> ul.getId().equals(reportAuditorSetting.getCcUserid())).findFirst();
+                            //取到抄送人
+                            User u = first.get();
+                            if(u.getCorpwxUserid()!=null){
+                                if(wxCorpInfoList.size()>0){
+                                    JSONObject json=new JSONObject();
+                                    JSONArray dataJson=new JSONArray();
+                                    JSONObject item=new JSONObject();
+                                    item.put("key","审核结果");
+                                    item.put("value","通过");
+                                    dataJson.add(item);
+                                    JSONObject item1=new JSONObject();
+                                    item1.put("key","项目名称");
+                                    item1.put("value",projectList.stream().filter(pro->pro.getId().equals(report.getProjectId())).findFirst().get().getProjectName());
+                                    dataJson.add(item1);
+                                    JSONObject item2=new JSONObject();
+                                    item2.put("key","填报人员");
+                                    item2.put("value",userList.stream().filter(curU->curU.getId().equals(report.getCreatorId())).findFirst().get().getName());
+                                    dataJson.add(item2);
+                                    JSONObject item3=new JSONObject();
+                                    item3.put("key","工作日期");
+                                    item3.put("value",report.getCreateDate());
+                                    dataJson.add(item3);
+                                    json.put("template_id","tty9TkCAAAwOgmzwS2uFogWgOmPDdIRQ");
+                                    json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
+                                    json.put("content_item",dataJson);
+                                    wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfoList.get(0),u.getCorpwxUserid(),json);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
             //需要进行审核记录保存
             ReportAuditLog log = new ReportAuditLog();
             log.setAuditChannel(channel);
@@ -4756,7 +4839,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             array.add(object);
         });
         String username = "WPG_GS";
-        String password = "Sys_GS@12345";
+        String password = "Sap_GS@12345";
         String authorization =username + ":" + password;
         JSONObject header=new JSONObject();
         String s = "Basic "+Base64.getEncoder().encodeToString(authorization.getBytes());

+ 7 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -602,7 +602,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                     }
                     userCorpwxTime.setWeekDayTxt(DateTimeUtil.getWeekDayTxt(userCorpwxTime.getWeekDay()));
                     BigDecimal bigDecimal=new BigDecimal(Duration.between(LocalTime.parse(minTime,df).plusHours(8),LocalTime.parse(maxTime,df).plusHours(8)).toMinutes());
-                    bigDecimal=bigDecimal.divide(BigDecimal.valueOf(60),1,BigDecimal.ROUND_HALF_UP).subtract(new BigDecimal(restTime));
+                    bigDecimal=bigDecimal.divide(BigDecimal.valueOf(60),0,BigDecimal.ROUND_HALF_UP).subtract(new BigDecimal(restTime));
                     userCorpwxTime.setWorkHours(bigDecimal.doubleValue());
                     System.out.println(userCorpwxTime);
                     UserCorpwxTime item;
@@ -1118,8 +1118,12 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                             .eq("create_date", localDate));
                     if (item != null) {
                         ct.setId(item.getId());
-                        //已存在记录,进行更新
-                        userCorpwxTimeMapper.updateById(ct);
+                        //已存在记录,但是如果老记录有工作时长,新记录无工作时长,也没有请假外出和打卡时长,说明新的记录是没有取到考勤的。 老记录是通过当天打卡数据获取到的,包含外出的时间
+                        if (item.getWorkHours() > 0 && ct.getWorkHours() == 0 && ct.getCardTime() == 0 && ct.getAskLeaveTime() == 0 && ct.getOutdoorTime() == 0) {
+                            //不处理
+                        } else {
+                            userCorpwxTimeMapper.updateById(ct);
+                        }
                     } else {
                         userCorpwxTimeMapper.insert(ct);
                     }

+ 3 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java

@@ -194,7 +194,7 @@ public class TimingTask {
         if (isDev) return;
         List<TimeType> timeTypeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_fanwei", 1));
         List<Integer> compIds = timeTypeList.stream().map(TimeType::getCompanyId).collect(Collectors.toList());
-        if(compIds.size()<0){
+        if(compIds.isEmpty()){
             return;
         }
         DockWithMLD dockWithMLD=new DockWithMLD();
@@ -492,7 +492,7 @@ public class TimingTask {
     }
 
     public static void main(String[] args) {
-        /*int passwordLength = 30;
+        int passwordLength = 30;
         List<String> stringList=new ArrayList<>();
         new SecureRandom().ints(passwordLength, 0, VALID_TOKEN_CHARS.size())
                 .map(VALID_TOKEN_CHARS::get).forEach(v->stringList.add(String.valueOf((char) v)));
@@ -500,10 +500,7 @@ public class TimingTask {
         for (String s : stringList) {
             token+=s;
         }
-        System.out.println(token);*/
-        LocalDateTime start = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
-        LocalDateTime end = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
-        System.out.println(start+"  "+end);
+        System.out.println(token);
     }
 
     //发送上周填写的工时统计

+ 3 - 0
fhKeeper/formulahousekeeper/octopus/src/views/customer/list.vue

@@ -209,6 +209,7 @@
                 <el-form-item><el-checkbox v-model="dialogData.notAllowedNoAttendance">是否开启考勤为0不可填报</el-checkbox></el-form-item>
                 <el-form-item><el-checkbox v-model="dialogData.stageHasEvtime">是否开启预估工时</el-checkbox></el-form-item>
                 <el-form-item><el-checkbox v-model="dialogData.financeAudit">财务导入是否需要审核</el-checkbox></el-form-item>
+                <el-form-item><el-checkbox v-model="dialogData.includeWeekends">批量填报是否包含周末</el-checkbox></el-form-item>
                 <el-form-item>
                     日报审核模式:
                     <el-select v-model="dialogData.reportAuditType" size="small">
@@ -371,6 +372,7 @@
                             this.$set(this.dialogData,'notAllowedNoAttendance',res.data.notAllowedNoAttendance ? true : false)
                             this.$set(this.dialogData,'stageHasEvtime',res.data.stageHasEvtime ? true : false)
                             this.$set(this.dialogData,'financeAudit',res.data.financeAudit ? true : false)
+                            this.$set(this.dialogData,'includeWeekends',res.data.includeWeekends ? true : false)
                             this.$set(this.dialogData,'reportAuditType',res.data.reportAuditType)
                         }else{
                             this.$message({
@@ -646,6 +648,7 @@
                     reportAutoApprove: this.dialogData.reportAutoApprove ? 1 : 0,
                     notAllowedNoAttendance: this.dialogData.notAllowedNoAttendance ? 1 : 0,
                     stageHasEvtime: this.dialogData.stageHasEvtime ? 1 : 0,
+                    includeWeekends: this.dialogData.includeWeekends ? 1 : 0,
                     reportAuditType: this.dialogData.reportAuditType
                 },res => {
                     if(res.code == 'ok'){

+ 5 - 1
fhKeeper/formulahousekeeper/timesheet/src/i18n/en.json

@@ -1440,5 +1440,9 @@
   "chu-cha": "evection",
   "xuan-xiang-1": "Option 1",
   "xuan-xiang-2": "Option 2",
-  "zi-yuan-xu-qiu-dao-chu": "Exporting Resource Requirements"
+  "zi-yuan-xu-qiu-dao-chu": "Exporting Resource Requirements",
+  "bumenchanyuqingkuang": "Project information of the departments involved",
+  "can-yu-de-xiang-mu-de-shu-liang": "number of projects involved",
+  "can-yu-ren-ci": "Number of participants",
+  "chu-cha-de-tian-shu": "Days of business trip"
 }

+ 5 - 1
fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json

@@ -1440,5 +1440,9 @@
   "xuan-xiang-1": "选项1",
   "xuan-xiang-2": "选项2",
   "zi-yuan-xu-qiu-dao-chu": "资源需求导出",
-  "chu-cha": "出差"
+  "chu-cha": "出差",
+  "bumenchanyuqingkuang": "部门参与项目情况表",
+  "can-yu-de-xiang-mu-de-shu-liang": "参与的项目的数量",
+  "can-yu-ren-ci": "参与人次",
+  "chu-cha-de-tian-shu": "出差的天数"
 }

+ 5 - 0
fhKeeper/formulahousekeeper/timesheet/src/main.js

@@ -151,6 +151,11 @@ router.beforeEach((to, from, next) => {
                         let customDeg = filterRouter.filter(r=>{return r.name == '研究中心管理'});
                         if(customDeg.length > 0){
                             customDeg[0].children[0].name = user.timeType.customDegreeName + '管理'
+                            if(localStorage.getItem('lang') == 'en') {
+                                customDeg[0].meta.text = user.timeType.customDegreeName + ' management'
+                            } else {
+                                customDeg[0].meta.text = user.timeType.customDegreeName + '管理'
+                            }
                         }
                     }
                     

+ 4 - 0
fhKeeper/formulahousekeeper/timesheet/src/permissions.js

@@ -72,6 +72,8 @@ const StringUtil = {
         reportOutputValue: false, // 负责项目成本基线表 //
         reportMonthlyPersonnel: false, // 全部人员月度工时表 //
         reportResponsiblePersonnel: false, // 负责部门月度工时表   //
+        reportAllDepartmentParticipation: false, // 全部部门参与项目情况表 //
+        reportResponsibleDepartmentParticipation: false, // 负责部门参与项目情况表 //
 
         // 请假模块
         leaveFil : false, // 请假填报 // 
@@ -193,6 +195,8 @@ const StringUtil = {
         arr[i] == '删除出差' ? obj.awayOfficeDelete = true : ''
         arr[i] == '全部人员月度工时表' ? obj.reportMonthlyPersonnel = true : ''
         arr[i] == '负责部门月度工时表' ? obj.reportResponsiblePersonnel = true : ''
+        arr[i] == '全部部门参与项目情况表' ? obj.reportAllDepartmentParticipation = true : ''
+        arr[i] == '负责部门参与项目情况表' ? obj.reportResponsibleDepartmentParticipation = true : ''
     }
 
     return obj

+ 15 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/Login.vue

@@ -67,7 +67,7 @@
             };
         },
         created() {
-            this.langChange()
+            // this.langChange()
             if (localStorage.userInfo != null) {
                 var user = JSON.parse(localStorage.userInfo);
                 if(user.moduleList.length > 0) {
@@ -141,8 +141,21 @@
                     } 
                 }
             }
+            let urls = window.location.href
+            console.log(urls, '连接')
+            if(urls.indexOf('english=1') != '-1' && localStorage.getItem('lang') != 'en') {
+                this.setlangChange()
+                location.reload()
+            } 
+            if(urls.indexOf('english=1') == '-1' && localStorage.getItem('lang') != 'zh') {
+                localStorage.setItem("lang", 'zh')
+                location.reload()
+            }
         },
         methods: {
+            setlangChange() {
+                localStorage.setItem("lang", 'en')
+            },
             langChange() {
                 let jsSrc =(navigator.language || navigator.browserLanguage).toLowerCase();
                 let str =  localStorage.getItem("lang")
@@ -157,7 +170,7 @@
                 }
                 if(str != localStorage.getItem("lang")) {
                     // this.reloads()
-                    location. reload()
+                    location.reload()
                 }
                 console.log(str, localStorage.getItem("lang"))
             },

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/centerManage/centerManage.vue

@@ -58,7 +58,7 @@
                 <el-button type="primary" @click="showImportResult=false">{{ $t('btn.determine') }}</el-button>
             </span> 
         </el-dialog>
-        <span>{{ $t('importTemplate') }}</span>
+        <!-- <span>{{ $t('importTemplate') }}</span> -->
         <el-dialog :title="$t('dao-ru') + user.timeType.customDegreeName + $t('shu-ju')" v-if="intoCenterDialog" :visible.sync="intoCenterDialog" customClass="customWidth" width="500px">
             <p>1. {{ $t('other.download') }}
             <el-link type="primary" style="margin-left:5px;" :underline="false" href="./upload/研究中心导入模板.xlsx" :download="user.timeType.customDegreeName+ $t('importTemplate') +'.xlsx'">{{user.timeType.customDegreeName + $t('importTemplate')}}.xlsx</el-link>

+ 70 - 9
fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue

@@ -35,6 +35,7 @@
                   <el-menu-item index="1-11" v-if="permissions.reportAuditRate"><p @click="ssl(10)">{{ $t('dailyreporttobereviewedstatistics') }}</p></el-menu-item>
                   <el-menu-item index="1-12" v-if="permissions.reportPersonnel || permissions.reportResponsible"><p @click="ssl(11)">{{ $t('statisticsofpersonnelhours') }}</p></el-menu-item>
                   <el-menu-item index="1-15" v-if="permissions.reportMonthlyPersonnel || permissions.reportResponsiblePersonnel"><p @click="ssl(14)">{{ $t('ren-yuan-yue-du-gong-shi-biao') }}</p></el-menu-item>
+                  <el-menu-item index="1-16" v-if="permissions.reportAllDepartmentParticipation || permissions.reportResponsibleDepartmentParticipation"><p @click="ssl(15)">{{ $t('bumenchanyuqingkuang') }}</p></el-menu-item>
                   <!-- <el-menu-item index="1-12"><p @click="ssl(11)">人员工时统计表</p></el-menu-item> -->
                 </el-submenu>
               </el-menu>
@@ -68,9 +69,11 @@
           </el-select>
         </template>
         <!-- 时间段筛选 -->
-          <template v-if="ins == 6 || ins == 8 || ins == 9 || ins == 10 || ins == 11 || ins == 12">
-            <span class="demonstration" style="color:#999;padding:0 10px">{{ $t('message.period') }}</span>
-            <el-date-picker v-model="rangeDatas" type="daterange" value-format="yyyy-MM-dd" :placeholder="$t('selectstartdate')" @change="picks()" :range-separator="$t('other.to')" :start-placeholder="$t('time.startDate')" :end-placeholder="$t('time.endDate')" style="width:300px" :clearable="false" size="small"> </el-date-picker>
+          <template v-if="ins == 6 || ins == 8 || ins == 9 || ins == 10 || ins == 11 || ins == 12 || ins == 15">
+            <span>
+              <span class="demonstration" style="color:#999;padding:0 10px">{{ $t('message.period') }}</span>
+              <el-date-picker v-model="rangeDatas" type="daterange" value-format="yyyy-MM-dd" :placeholder="$t('selectstartdate')" @change="picks()" :range-separator="$t('other.to')" :start-placeholder="$t('time.startDate')" :end-placeholder="$t('time.endDate')" style="width:300px" :clearable="ins == 15" size="small"> </el-date-picker>
+            </span>
           </template>
 
         <!-- 按部门/项目筛选 -->
@@ -79,23 +82,23 @@
           <el-option label="查看部门审核人" :value="0"></el-option>
         </el-select> -->
         <!-- 项目筛选 -->
-        <el-select v-if="ins != 4 && ins != 8 && ins != 9 && ins != 10 && ins != 11 && ins != 14" v-model="proJuctId" :placeholder="$t('defaultText.pleaseSelectSnItem')" clearable filterable size="small" @change="selcts()" style="margin-left:10px">
+        <el-select v-if="ins != 4 && ins != 8 && ins != 9 && ins != 10 && ins != 11 && ins != 14 && ins != 15" v-model="proJuctId" :placeholder="$t('defaultText.pleaseSelectSnItem')" clearable filterable size="small" @change="selcts()" style="margin-left:10px">
           <el-option v-for="(item) in proListOvertime" :key="item.id" :label="item.projectName + (item.projectCode ? item.projectCode : '')" :value="item.id">
             <span style="float: left;color: #8492a6;">{{ item.projectCode }}</span>
             <span style="float: right;font-size: 13px;margin-left: 20px">{{ item.projectName }}</span>
           </el-option>
         </el-select>
         <!-- 月份选择 -->
-        <el-date-picker v-if="ins == 14" value-format="yyyy-MM" v-model="monthPersonnel" type="month" :placeholder="$t('Selectmonth')" @change="selcts()" size="small"></el-date-picker>
+        <el-date-picker v-if="ins == 14" value-format="yyyy-MM" v-model="monthPersonnel" type="month" :placeholder="$t('Selectmonth')" :clearable="false" @change="selcts()" size="small"></el-date-picker>
           
           <!-- 部门筛选 -->
-          <el-cascader v-if="((ins == 9 && permissions.reportAllTimely) || (ins == 8 && permissions.reportAllTimeDivide) || (ins == 6 && permissions.reportAllOvertime) || (ins == 11 && permissions.reportPersonnel) || (ins == 14)) && user.userNameNeedTranslate != 1" v-model="departmentIdArray" :options="departmentList" :placeholder="$t('qing-xuan-ze-bu-men')"
+          <el-cascader v-if="(ins == 15 || (ins == 9 && permissions.reportAllTimely) || (ins == 8 && permissions.reportAllTimeDivide) || (ins == 6 && permissions.reportAllOvertime) || (ins == 11 && permissions.reportPersonnel) || (ins == 14)) && user.userNameNeedTranslate != 1" v-model="departmentIdArray" :options="departmentList" :placeholder="$t('qing-xuan-ze-bu-men')"
             :props="{ checkStrictly: true,expandTrigger: 'hover' }" :show-all-levels="false" clearable
             @change="selcts(9)" size="small" style="margin-left:10px"
           ></el-cascader>
 
           <!-- 部门筛选 -->
-          <vueCascader :size="'small'" :widthStr="'125'" :clearable="true" :subject="departmentList" :radios="true" :distinction="'1'" @vueCasader="vueCasader" v-if="(((ins == 9 && permissions.reportAllTimely) || (ins == 8 && permissions.reportAllTimeDivide) || (ins == 6 && permissions.reportAllOvertime) || (ins == 11 && permissions.reportPersonnel) || (ins == 14)) && user.userNameNeedTranslate == 1)" :selectNameChuan="$t('qing-xuan-ze-bu-men')"></vueCascader>
+          <vueCascader :size="'small'" :widthStr="'125'" :clearable="true" :subject="departmentList" :radios="true" :distinction="'1'" @vueCasader="vueCasader" v-if="((ins == 15 || (ins == 9 && permissions.reportAllTimely) || (ins == 8 && permissions.reportAllTimeDivide) || (ins == 6 && permissions.reportAllOvertime) || (ins == 11 && permissions.reportPersonnel) || (ins == 14)) && user.userNameNeedTranslate == 1)" :selectNameChuan="$t('qing-xuan-ze-bu-men')"></vueCascader>
 
           <!-- 任务筛选 -->
           <el-select v-if="ins == 1" v-model="taskTypeId" :placeholder="$t('pleaseselecttype')" clearable filterable size="small" @change="selcts()" style="margin-left:10px">
@@ -716,6 +719,15 @@
                   </template>
                 </el-table-column>
             </el-table>
+
+            <!-- 部门参与项目情况表 -->
+            <el-table v-if="ins == 15"  key="15" border :data="tableList" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
+                <el-table-column align="center" prop="deptName" :label="$t('departmentname')" min-width="150"></el-table-column>
+                <el-table-column align="center" prop="projectCount" :label="$t('can-yu-de-xiang-mu-de-shu-liang')" min-width="150"></el-table-column>
+                <el-table-column align="center" prop="peopleCount" :label="$t('can-yu-ren-ci')" min-width="150"></el-table-column>
+                <el-table-column align="center" prop="tripCount" :label="$t('chu-cha-de-tian-shu')" min-width="150"></el-table-column>
+            </el-table>
+
         <!--工具条-->
         <el-col :span="24" class="toolbar" v-if="ins != 6">
           <el-pagination
@@ -1008,7 +1020,9 @@ export default {
       timelyDetailDialog: false,
 
       monthlyPersonnelList: [],
-      monthPersonnel: ''
+      monthPersonnel: '',
+
+      tableList: []
     };
   },
   computed: {},
@@ -1063,7 +1077,7 @@ export default {
         if (rs < 0) {  
             rs = s.length;  
             s += '.';  
-        }  
+        }  15
         while (s.length <= rs + 1) {  
             s += '0';  
         }  
@@ -1087,6 +1101,7 @@ export default {
       if(this.permissions.reportAuditRate) {this.ssl(10);this.defaultActive = '1-11';return} else 
       if(this.permissions.reportPersonnel || this.permissions.reportResponsible) {this.ssl(11);this.defaultActive = '1-12';return}
       if(this.permissions.reportMonthlyPersonnel || this.permissions.reportResponsiblePersonnel) {this.ssl(14);this.defaultActive = '1-15';return}
+      if(this.permissions.reportAllDepartmentParticipation || this.permissions.reportResponsibleDepartmentParticipation) {this.ssl(15);this.defaultActive = '1-16';return}
       {this.allWrong = false}
     },
     rowspan(spanArr,position,spanName){
@@ -1283,6 +1298,11 @@ export default {
                 this.getGroupWorktimeAll()
             },
             getList() {
+              if(this.ins == 15) {
+                this.rangeDatas = null
+              } else {
+                this.rangeDatas = this.getCurrentRangeTime()
+              }
                 if (this.ins == 0) {
                     this.getProjectList();
                 } else if (this.ins == 1) {
@@ -1318,6 +1338,8 @@ export default {
                   this.getOutputValueList()
                 } else if(this.ins == 14) {
                   this.getMonthlyPersonnel()
+                } else if(this.ins == 15) {
+                  this.getDepartmentsInvolved()
                 }
             },
       exportExcel() {
@@ -1407,6 +1429,12 @@ export default {
           sl.departmentId = this.departmentIdArray.length > 0 ? this.departmentIdArray[this.departmentIdArray.length - 1] : '',
           sl.month = this.monthPersonnel + '-01',
           sl.whether = this.whether
+        } else if(this.ins == 15) {
+          fName = this.$t('bumenchanyuqingkuang') + '.xls'
+          url += "/exportDeptPartInProjects"
+          sl.startDate= this.rangeDatas ? this.rangeDatas[0] : '',
+          sl.endDate = this.rangeDatas ? this.rangeDatas[1] : '',
+          sl.departmentId = this.departmentIdArray.length > 0 ? this.departmentIdArray[this.departmentIdArray.length - 1] : ''
         }
           this.http.post(url, sl,
             res => {
@@ -1609,6 +1637,36 @@ export default {
         })
       })
     },
+    // 部门参与项目情况表
+    getDepartmentsInvolved() {
+      let parameter = {
+        pageIndex: this.page,
+        pageSize: this.size,
+        startDate: this.rangeDatas ? this.rangeDatas[0] : '',
+        endDate: this.rangeDatas ? this.rangeDatas[1] : '',
+        departmentId: this.departmentIdArray.length > 0 ? this.departmentIdArray[this.departmentIdArray.length - 1] : '',
+      }
+      this.listLoading = true
+      this.http.post('/project/deptPartInProjects',parameter,
+      res => {
+      this.listLoading = false
+        if(res.code == 'ok'){
+          this.tableList = res.data.resultList
+          this.total = res.data.total
+        }else {
+          this.$message({
+            message: res.msg,
+            type: 'error'
+          })
+        }
+      },err => {
+        this.listLoading = false
+        this.$message({
+          message: err,
+          type: 'error'
+        })
+      })
+    },
     overTime() {
       this.listLoading = true;
       var obj = {
@@ -2144,6 +2202,9 @@ export default {
         this.proJuctId = ''
         this.getList()
       }
+      if(this.ins == 15) {
+        this.getDepartmentsInvolved()
+      }
     },
     // 日期
     getCurrentRangeTime() {

+ 10 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

@@ -2213,8 +2213,17 @@ a {
                     });
             },
             exportProjectData() {
+                let param = {
+                    status: this.status,
+                }
+                if(this.keyword){param.searchField = this.searchField;param.keyword = this.keyword}
+                if(this.projectMainId){param.projectMainId = this.projectMainId}
+                if(this.statusClf){param.category = this.statusClf}
+                if(this.deptId.length){param.deptId = this.deptId[this.deptId.length-1]}
+                if(this.inchagerId){param.inchagerId = this.inchagerId}
+                if(this.participationId){param.participation = this.participationId}
                 //导出项目
-                this.http.post('/project/exportData',{},
+                this.http.post('/project/exportData',param,
                 res => {
                     if (res.code == "ok") {
                         var filePath = res.data;

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -1090,7 +1090,7 @@
             <el-table-column prop="label" :label="$t('lable.name')" >
                 <template slot-scope="scope">
                     <div>
-                        <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='departmentName' :openid='scope.row.label'></ww-open-data></span>
+                        <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='scope.row.label'></ww-open-data></span>
                         <span v-if="user.userNameNeedTranslate != '1'">{{scope.row.label}}</span>
                     </div>
                 </template>

+ 25 - 10
fhKeeper/formulahousekeeper/timesheet_h5/src/views/expense/details.vue

@@ -11,9 +11,12 @@
                 clickable
                 required
             >
-                <template #input>{{ formshowText.name }}</template>
+                <template #input>
+                    <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='formshowText.name'></ww-open-data></span>
+                    <span v-else>{{formshowText.name}}</span>
+                </template>
             </van-field>
-            <van-popup v-model="ownerIdShow" position="bottom" v-if="canEdit && canExamine">
+            <van-popup v-model="ownerIdShow" position="bottom" v-if="false">
                 <van-picker
                     value-key="name"
                     show-toolbar
@@ -150,9 +153,8 @@
                     ></van-field>
                     <van-field
                         label="税额:"
-                        v-model="item.taxValue"
-                        :readonly="!canEdit"
-                    ></van-field>
+                        readonly
+                    ><template #input>¥{{getTaxValue(item.amount,item.taxPercent)}}</template></van-field>
                     <van-field label="备注:" v-model="item.remark" :readonly="!canEdit"></van-field>
                     <van-field
                         label="报销凭证:"
@@ -167,7 +169,7 @@
                                 @delete="item.pic = null"
                                 :max-count="1"
                                 :disabled="!canEdit"
-                                :deletable="!canEdit"
+                                :deletable="canEdit"
                             />
                         </template>
                     </van-field>
@@ -311,9 +313,9 @@ export default {
         
         this.getDetail()
         if(this.canEdit){
-            if(this.canExamine){
-                this.getUserList()
-            }
+            // if(this.canExamine){
+            //     this.getUserList()
+            // }
             this.getProjectList()
         }
     },
@@ -325,6 +327,11 @@ export default {
             let mon = date.getMonth() + 1
             return `${date.getFullYear()}-${mon<10?'0'+mon:mon}-${date.getDate()<10?'0'+date.getDate():date.getDate()}`;
         },
+        getTaxValue(amount,percent){
+            let per = percent / 100
+            let amo = amount / (1 + per)*per
+            return amo.toFixed(2)
+        },
         costCount(){
             let costnum = 0
             for(let i in this.invoiceList){
@@ -430,7 +437,12 @@ export default {
                     this.invoiceList = res.data.invoiceList
                     for(let i in res.data.invoiceList){
                         this.formshowText.inProjectName.push(res.data.invoiceList[i].projectName)
-                        this.uploader[i] = [{url:'/upload/' + res.data.invoiceList[i].pic}]
+                        if(res.data.invoiceList[i].pic){
+                            this.uploader[i] = [{url:'/upload/' + res.data.invoiceList[i].pic}]
+                        }else{
+                            this.uploader[i] = []
+                        }
+                        
                     }
                 } else {
                     this.$toast.fail('获取失败');
@@ -480,6 +492,9 @@ export default {
         z-index: 1000;
     }
     .edit_form{
+        .userCheckbox {
+            padding: 10px;
+        }
         padding-bottom: 46px;
         .invoice{
             border: 0.5px solid rgb(135, 195, 255);

+ 100 - 40
fhKeeper/formulahousekeeper/timesheet_h5/src/views/expense/index.vue

@@ -12,15 +12,23 @@
             <van-form class="edit_form" label-width="140">
                 <!-- 报销人 -->
                 <van-field v-model="editForm.ownerId" label="报销人" @click="ownerIdShow = true" readonly clickable required>
-                    <template #input>{{formshowText.name}}</template>
+                    <template #input>
+                        <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='formshowText.name'></ww-open-data></span>
+                        <span v-else>{{formshowText.name}}</span>
+                    </template>
                 </van-field>
                 <van-popup v-model="ownerIdShow" position="bottom" v-if="canExamine">
-                    <van-picker
-                    value-key="name"
-                    show-toolbar
-                    :columns="userList"
-                    @confirm="ownerIdChange"
-                    @cancel="ownerIdShow = false;$forceUpdate();"/>
+                    <div style="minHeight:300px;">
+                        <van-radio-group v-model="userRadio" v-if="user.userNameNeedTranslate == '1'">
+                            <van-radio v-for="item in userList" :key="item.id" :name="item" class="userCheckbox">
+                                <ww-open-data type='userName' :openid='item.name'></ww-open-data>
+                            </van-radio>
+                        </van-radio-group>
+                        <van-radio-group v-model="userRadio" v-else>
+                            <van-radio v-for="item in userList" :key="item.id" :name="item" class="userCheckbox">{{item.name}}</van-radio>
+                        </van-radio-group>
+                        <van-button style="width:100%;position: -webkit-sticky;position: sticky;bottom: 0;" @click="ownerIdChange()">确定</van-button>
+                    </div>
                 </van-popup>
                 <!-- 填报日期 -->
                 <van-field v-model="editForm.createDate" label="填报日期" @click="createDateShow = true" readonly clickable required></van-field>
@@ -71,7 +79,9 @@
                         <van-field label="费用金额(含税):" v-model="item.amount" type="number" @input="costCount"></van-field>
                         <van-field label="发票号:" v-model="item.invoiceNo"></van-field>
                         <van-field label="税率%:" v-model="item.taxPercent"></van-field>
-                        <van-field label="税额:" v-model="item.taxValue"></van-field>
+                        <van-field label="税额:" readonly>
+                            <template #input>¥{{getTaxValue(item.amount,item.taxPercent)}}</template>
+                        </van-field>
                         <van-field label="备注:" v-model="item.remark" autosize></van-field>
                         <van-field label="报销凭证:" @click="invoiceIndex = index" clickable>
                             <template #input>
@@ -80,7 +90,7 @@
                         </van-field>
                     </div>
                 </div>
-                <div class="addinvoice"><van-button size="mini" icon="plus" type="info" plain hairline @click="addInvoice">添加发票</van-button></div>
+                <div class="addinvoice"><van-button size="small" icon="plus" type="info" plain hairline @click="addInvoice">添加发票</van-button></div>
                 <!-- 发票-popup -->
                 <span>
                     <!-- 所属项目 -->
@@ -136,14 +146,20 @@
                 <van-collapse-item v-for="item in billList" :key="item.id" title="标题1" :name="item.id">
                     <template #title>
                         <div class="collapse_label_l">票据编号:{{item.code}}</div>
-                        <div class="collapse_label_r">报销人:{{item.ownerName}}</div>
+                        <div class="collapse_label_r">报销人:
+                            <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='item.ownerName'></ww-open-data></span>
+                            <span v-else>{{item.ownerName}}</span>
+                        </div>
                         <div class="collapse_label_l">金额: ¥{{item.totalAmount | numtosum}}</div>
                         <div class="collapse_label_r">状态:<span :class="statusClass[item.status]">{{statusList[item.status]}}</span></div>
                     </template>
                     <div class="wrapper">
                         <div><span>票据编号:</span><span>{{item.code}}</span></div>
                         <div><span>金额:</span><span>¥{{item.totalAmount | numtosum}}</span></div>
-                        <div><span>报销人:</span><span>{{item.ownerName}}</span></div>
+                        <div><span>报销人:</span>
+                            <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='item.ownerName'></ww-open-data></span>
+                            <span v-else>{{item.ownerName}}</span>
+                        </div>
                         <div><span>填报日期:</span><span>{{item.createDate}}</span></div>
                         <div><span>发票张数:</span><span>{{item.ticketNum}}</span></div>
                         <div><span>费用类型:</span><span>{{typeList[item.type]}}</span></div>
@@ -165,7 +181,10 @@
                 <van-collapse-item v-for="item in examineList" :key="item.id" title="标题2" :name="item.id">
                     <template #title>
                         <div class="collapse_label_l">票据编号:{{item.code}}</div>
-                        <div class="collapse_label_r">报销人:{{item.ownerName}}</div>
+                        <div class="collapse_label_r">报销人:
+                            <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='item.ownerName'></ww-open-data></span>
+                            <span v-else>{{item.ownerName}}</span>
+                        </div>
                         <div class="collapse_label_l">金额: ¥{{item.totalAmount | numtosum}}</div>
                         <div class="collapse_label_r">状态:<span :class="statusClass[item.status]">{{statusList[item.status]}}</span></div>
                         <div class="operation">
@@ -176,7 +195,10 @@
                     <div class="wrapper">
                         <div><span>票据编号:</span><span>{{item.code}}</span></div>
                         <div><span>金额:</span><span>¥{{item.totalAmount | numtosum}}</span></div>
-                        <div><span>报销人:</span><span>{{item.ownerName}}</span></div>
+                        <div><span>报销人:</span>
+                            <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='item.ownerName'></ww-open-data></span>
+                            <span v-else>{{item.ownerName}}</span>
+                        </div>
                         <div><span>填报日期:</span><span>{{item.createDate}}</span></div>
                         <div><span>发票张数:</span><span>{{item.ticketNum}}</span></div>
                         <div><span>费用类型:</span><span>{{typeList[item.type]}}</span></div>
@@ -198,7 +220,7 @@
 export default {
     data() {
         return {
-            active: 0,
+            active: sessionStorage.page ? JSON.parse(sessionStorage.page) : 0,
             user: JSON.parse(localStorage.userInfo),
             userList: [],
             canExamine: false,
@@ -217,6 +239,7 @@ export default {
                 type: 0,
                 remark: ''
             },
+            userRadio: null,
             ownerIdShow: false,
             createDateShow: false,
             typeShow: false,
@@ -278,6 +301,7 @@ export default {
         },
     },
     mounted() {
+        this.activeChange()
         for(let i in this.user.functionList){
             if(this.user.functionList[i].name == '费用审核'){
                 this.canExamine = true
@@ -286,20 +310,28 @@ export default {
         if(!this.canExamine){
             this.editForm.ownerId = this.user.id
             this.formshowText.name = this.user.name
+        }else{
+            this.getUserList()
         }
-        this.getUserList()
         this.getProjectList()
         this.getExTypeList()
     },
     methods: {
         back(){
+            sessionStorage.removeItem("page");
             history.back();
         },
         formatDate(date) {
             let mon = date.getMonth() + 1
             return `${date.getFullYear()}-${mon<10?'0'+mon:mon}-${date.getDate()<10?'0'+date.getDate():date.getDate()}`;
         },
+        getTaxValue(amount,percent){
+            let per = percent / 100
+            let amo = amount / (1 + per)*per
+            return amo.toFixed(2)
+        },
         activeChange(){
+            sessionStorage.setItem('page',JSON.stringify(this.active))
             if(this.active == 1){
                 this.getBillList()
             }
@@ -316,9 +348,9 @@ export default {
         },
 
     // #region 费用报销
-        ownerIdChange(value,key){
-            this.editForm.ownerId = value.id
-            this.formshowText.name = value.name
+        ownerIdChange(){
+            this.editForm.ownerId = this.userRadio.id
+            this.formshowText.name = this.userRadio.name
             this.ownerIdShow = false
         },
         createDateChange(value,key){
@@ -407,39 +439,64 @@ export default {
                 this.$toast.fail('请添加发票')
                 return
             }
+            for(let i in this.invoiceList){
+                this.invoiceList[i].taxValue = this.getTaxValue(this.invoiceList[i].amount,this.invoiceList[i].taxPercent)
+            }
             this.editForm.items = JSON.stringify(this.invoiceList)
             this.editForm.totalAmount = this.totalCost
-            this.$axios.post("/expense-sheet/add", this.editForm)
+            // 获取新的票据编号
+            this.$axios.post("/expense-sheet/getNextCode", {})
             .then(res => {
                 if(res.code == "ok") {
-                    this.$toast.success('填报成功')
-                    this.editForm = {
-                        ownerId: '',
-                        createDate: '',
-                        ticketNum: 0,
-                        type: 0,
-                        remark: ''
-                    }
-                    this.invoiceList = []
-                    this.uploader = []
+                    this.editForm.code = res.data
+                    // 提交
+                    this.$axios.post("/expense-sheet/add", this.editForm)
+                    .then(res => {
+                        if(res.code == "ok") {
+                            this.$toast.success('填报成功')
+                            this.editForm = {
+                                ownerId: '',
+                                createDate: '',
+                                ticketNum: 0,
+                                type: 0,
+                                remark: ''
+                            }
+                            this.invoiceList = []
+                            this.uploader = []
+                        } else {
+                            this.$toast.fail('获取失败');
+                        }
+                    }).catch(err=> {this.$toast.clear();console.log(err)});
                 } else {
                     this.$toast.fail('获取失败');
                 }
             }).catch(err=> {this.$toast.clear();console.log(err)});
+
+            
         },
     // #endregion
 
         // 单据列表
         deleteBill(pid){
-            this.$axios.post("/expense-sheet/delete", {id: pid})
-            .then(res => {
-                if(res.code == "ok") {
-                    this.$toast.success('删除成功')
-                    this.getBillList()
-                } else {
-                    this.$toast.fail('获取失败');
-                }
-            }).catch(err=> {this.$toast.clear();console.log(err)});
+            this.$dialog.confirm({
+                message: '确认删除?',
+            })
+            .then(() => {
+                // on confirm
+                this.$axios.post("/expense-sheet/delete", {id: pid})
+                .then(res => {
+                    if(res.code == "ok") {
+                        this.$toast.success('删除成功')
+                        this.getBillList()
+                    } else {
+                        this.$toast.fail('获取失败');
+                    }
+                }).catch(err=> {this.$toast.clear();console.log(err)});
+            })
+            .catch(() => {
+                // on cancel
+            });
+            
         },
 
         // 单据审核
@@ -541,6 +598,9 @@ export default {
     margin-top: 46px;
     overflow: auto;
     .edit{
+        .userCheckbox {
+            padding: 10px;
+        }
         padding-bottom: 46px;
         .form_btn{
             z-index: 1000;
@@ -574,12 +634,12 @@ export default {
         }
         .list_collapse{
             .collapse_label_l{
-                width: 60%;
+                width: 50%;
                 padding: 4px;
                 display: inline-block;
             }
             .collapse_label_r{
-                width: 40%;
+                width: 50%;
                 padding: 4px;
                 display: inline-block;
                 .waiting {

+ 2 - 2
fhKeeper/formulahousekeeper/timesheet_h5/src/views/index/index.vue

@@ -11,9 +11,9 @@
             :to="item.url">
             </van-grid-item>
         </van-grid>
-        <div class="tip"  v-if="isCorpWX">
+        <!-- <div class="tip"  v-if="isCorpWX">
             工时报表统计等更多功能,请从PC端企业微信进入
-        </div>
+        </div> -->
         <div class="tip"  v-if="!isCorpWX">
             体验报表统计等更多功能,尽在PC端<br>
             网页用户访问http://worktime.ttkuaiban.com,钉钉用户直接从钉钉PC端进入工时管家

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet_h5/src/views/my/children/center.vue

@@ -16,7 +16,7 @@
                 <van-cell title="账号" :title-style="'flex: 0.5;'" :value="userInfo.phone"></van-cell>
                 <van-cell title="工号" :title-style="'flex: 0.5;'" :value="userInfo.jobNumber"></van-cell>
                 <van-cell title="公司" :title-style="'flex: 0.5;'" :value="userInfo.companyName"></van-cell>
-                <van-cell title="修改密码" isLink to="/my/set"></van-cell>
+                <!-- <van-cell title="修改密码" isLink to="/my/set"></van-cell> -->
             </div>
             <van-cell :title="'绑定'+(isCorpWX?'企业':'')+'微信'" v-if="isCorpWX || isWX" @click="bindWeiXin" style="margin-top:10px;" :title-style="'flex: 2.5;'" label="绑定微信后可接收工时填报提醒">
                 <template>