Переглянути джерело

Merge remote-tracking branch 'origin/master'

yusm 4 місяців тому
батько
коміт
4ee61beff0
93 змінених файлів з 886 додано та 297 видалено
  1. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/chongqi.png
  2. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/components/common/foldingPanel.vue
  3. 0 4
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/moduleList/moduleList.vue
  4. 2 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/business/addEditor.vue
  5. 3 3
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/business/businessInfo.vue
  6. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/business/businessOpportunityStage.vue
  7. 7 0
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/business/detail.vue
  8. 2 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/contacts/addEditor.vue
  9. 3 3
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/contacts/contactsInfo.vue
  10. 7 0
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/contacts/detail.vue
  11. 4 3
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/contract/addEditor.vue
  12. 13 7
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/contract/detail.vue
  13. 2 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/customer/addEditor.vue
  14. 3 3
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/customer/customerInfo.vue
  15. 7 0
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/customer/detail.vue
  16. 2 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/order/addEditor.vue
  17. 13 2
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/order/detail.vue
  18. 3 3
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/order/orderInfo.vue
  19. 7 4
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/order/paymentCollection.vue
  20. 2 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/product/addEditor.vue
  21. 7 0
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/product/detail.vue
  22. 6 4
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/product/newAndModifiedRelatedProducts.vue
  23. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/product/productInfo.vue
  24. 2 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/tasks/addEditor.vue
  25. 6 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/tasks/detail.vue
  26. 2 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/thread/addEditor.vue
  27. 6 0
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/thread/detail.vue
  28. 2 2
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/thread/threadInfo.vue
  29. 12 3
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/component/businessEcharts.vue
  30. 4 4
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/component/dataSummary.vue
  31. 14 4
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/component/filterItem.vue
  32. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/component/salesBriefings.vue
  33. 4 3
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/visitorProgram/addEditorVisitor.vue
  34. 43 0
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/utility/commonUtil.js
  35. 2 2
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/utility/generalVariables.js
  36. 3 3
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/vite.config.js
  37. 1 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/team/api.ts
  38. 5 6
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/team/index.vue
  39. 2 2
      fhKeeper/formulahousekeeper/customerBuler-crm/vite.config.ts
  40. 43 10
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/SalesOrderController.java
  41. 2 2
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/VisitPlanController.java
  42. 3 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/SalesOrderMapper.java
  43. 19 16
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ContactsServiceImpl.java
  44. 2 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ContractServiceImpl.java
  45. 12 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/SalesOrderServiceImpl.java
  46. 5 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  47. 1 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/VisitPlanServiceImpl.java
  48. 20 20
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/ClueMapper.xml
  49. 3 1
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/CustomMapper.xml
  50. 17 0
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/SalesOrderMapper.xml
  51. 4 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  52. 5 3
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskMapper.xml
  53. 9 2
      fhKeeper/formulahousekeeper/timesheet/build/utils.js
  54. 4 0
      fhKeeper/formulahousekeeper/timesheet/build/webpack.base.conf.js
  55. 12 12
      fhKeeper/formulahousekeeper/timesheet/config/index.js
  56. 35 2
      fhKeeper/formulahousekeeper/timesheet/src/App.vue
  57. 0 0
      fhKeeper/formulahousekeeper/timesheet/src/assets/scss/_common.scss
  58. 40 0
      fhKeeper/formulahousekeeper/timesheet/src/assets/scss/_handle.scss
  59. 15 0
      fhKeeper/formulahousekeeper/timesheet/src/assets/scss/_themes.scss
  60. 2 1
      fhKeeper/formulahousekeeper/timesheet/src/components/cascadeSelection.vue
  61. 3 3
      fhKeeper/formulahousekeeper/timesheet/src/components/cascader.vue
  62. 2 2
      fhKeeper/formulahousekeeper/timesheet/src/components/cascaderOption.vue
  63. 3 2
      fhKeeper/formulahousekeeper/timesheet/src/components/select.vue
  64. 14 10
      fhKeeper/formulahousekeeper/timesheet/src/components/taskComponent.vue
  65. 140 0
      fhKeeper/formulahousekeeper/timesheet/src/components/themeCom.vue
  66. 13 0
      fhKeeper/formulahousekeeper/timesheet/src/utils/commonMethod.js
  67. 2 1
      fhKeeper/formulahousekeeper/timesheet/src/views/Expire.vue
  68. 8 3
      fhKeeper/formulahousekeeper/timesheet/src/views/Home.vue
  69. 16 10
      fhKeeper/formulahousekeeper/timesheet/src/views/Login.vue
  70. 4 2
      fhKeeper/formulahousekeeper/timesheet/src/views/Register.vue
  71. 11 4
      fhKeeper/formulahousekeeper/timesheet/src/views/awayOffice/awayOffice.vue
  72. 6 1
      fhKeeper/formulahousekeeper/timesheet/src/views/centerManage/centerManage.vue
  73. 17 8
      fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue
  74. 3 2
      fhKeeper/formulahousekeeper/timesheet/src/views/desktop/detail.vue
  75. 3 2
      fhKeeper/formulahousekeeper/timesheet/src/views/desktop/index.vue
  76. 9 4
      fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue
  77. 18 8
      fhKeeper/formulahousekeeper/timesheet/src/views/leave/list.vue
  78. 2 1
      fhKeeper/formulahousekeeper/timesheet/src/views/message.vue
  79. 7 2
      fhKeeper/formulahousekeeper/timesheet/src/views/project/detail.vue
  80. 7 2
      fhKeeper/formulahousekeeper/timesheet/src/views/project/detailDep.vue
  81. 13 6
      fhKeeper/formulahousekeeper/timesheet/src/views/project/fileCenter.vue
  82. 2 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/gantt.vue
  83. 0 4
      fhKeeper/formulahousekeeper/timesheet/src/views/project/info.vue
  84. 15 5
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  85. 6 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/projectForm.vue
  86. 25 16
      fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue
  87. 9 3
      fhKeeper/formulahousekeeper/timesheet/src/views/projectApproval/projectApproval.vue
  88. 23 17
      fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue
  89. 6 5
      fhKeeper/formulahousekeeper/timesheet/src/views/task/list.vue
  90. 9 4
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
  91. 17 13
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  92. 7 2
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue
  93. 8 3
      fhKeeper/formulahousekeeper/timesheet/src/views/workflow/report.vue

BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/chongqi.png


+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/components/common/foldingPanel.vue

@@ -80,7 +80,7 @@ const handleBox = () => {
     }
 
     .expand {
-      max-height: 800px;
+      max-height: 900px;
     }
   }
 

+ 0 - 4
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/moduleList/moduleList.vue

@@ -465,10 +465,6 @@ async function getListData(flag = false) {
     pageFrom: listData.value.pageSize,
     [queryParameters.value?.searchFiled?.search]: searchVal.value,
   }
-
-  if(queryParameters.value?.key == 'product') {
-    formVal.status = 1
-  }
   const res = await requests.post(url, { ...formVal }).finally(() => {
     if (flag) {
       loadingList.value = false

+ 2 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/business/addEditor.vue

@@ -42,6 +42,7 @@ import CustomerForm from '@components/common/formForm/formView.vue'
 import FoldingPanel from '@components/common/foldingPanel.vue';
 import NewAndModifiedRelatedProducts from '@pages/pageComponents/product/newAndModifiedRelatedProducts.vue'
 import useRouterStore from "@store/useRouterStore.js";
+import commonUtil from "@utility/commonUtil"
 
 const router = useRouterStore()
 const props = defineProps({
@@ -81,7 +82,7 @@ function onSubmit() {
       businessItemProductList: newList ? JSON.stringify(newList) : []
     }
     toastLoading('保存中', 0)
-    requests.post(NEW_BUSINESS_OPPORTUNITY_EDITING, { ...newForm }).then(() => {
+    requests.post(NEW_BUSINESS_OPPORTUNITY_EDITING, { ...commonUtil.getFromValue({ ...newForm }) }).then(() => {
       toastSuccess('保存成功')
       setTimeout(() => {
         router.navigateBack({

+ 3 - 3
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/business/businessInfo.vue

@@ -51,11 +51,11 @@
 
     <!-- select 选择器 -->
     <van-popup v-model:show="showSelect" destroy-on-close position="bottom" :style="{ height: '80%' }">
-      <PullDownSelector @change="selectChange" />
+      <PullDownSelector :showElement="showSelect" @change="selectChange" />
     </van-popup>
 
     <van-popup v-model:show="showContactSelect" destroy-on-close position="bottom" :style="{ height: '80%' }">
-      <PullDownSelector :options="allContactsList" :doYouNeedTranslation="false" @change="selectChange" />
+      <PullDownSelector :showElement="showContactSelect" :options="allContactsList" :doYouNeedTranslation="false" @change="selectChange" />
     </van-popup>
   </div>
 </template>
@@ -76,7 +76,7 @@ import { routingInfos } from "@utility/generalVariables"
 const router = useRouterStore()
 const fixedData = useFixedData()
 const userInfo = useInfoStore()
-const { toastSuccess, toastFail, toastText } = useShowToast()
+const { toastSuccess, toastLoading, toastFail, toastText, clearToast } = useShowToast()
 const props = defineProps({
   info: {
     type: Object,

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/business/businessOpportunityStage.vue

@@ -120,7 +120,7 @@ function completionStage(type) {
 
 function enterReason() {
   const { id, reason } = transitionalData.value
-  requests.post(PROMOTION_STAGE, {
+  requests.post(STAGE_NOTES, {
     id, reason
   }).then((res) => {
     getBusinessOpportunityDetails(id)

+ 7 - 0
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/business/detail.vue

@@ -26,7 +26,9 @@ import RelatedProducts from '../product/relatedProducts.vue';
 import BusinessInfo from './businessInfo.vue';
 import RelatedTasks from '../tasks/relatedTasks.vue';
 import BusinessOpportunityStage from './businessOpportunityStage.vue';
+import useShowToast from '@hooks/useToast'
 
+const { toastSuccess, toastLoading, toastFail, toastText, clearToast } = useShowToast()
 const props = defineProps({
   info: {
     type: Object,
@@ -54,11 +56,16 @@ function getBusinessOpportunityDetails(id) {
     infoData.value = data
     relatedProductsList.value = data.businessItemProducts || []
     relatedTasksList.value = data.taskList || []
+  }).finally(() => {
+    setTimeout(() => {
+      clearToast()
+    }, 200)
   })
 }
 
 function processingData(id) {
   clearTimeout(timeout.value);
+  toastLoading('加载中...', 0)
   timeout.value = setTimeout(() => {
     getBusinessOpportunityDetails(id)
   }, 100);

+ 2 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/contacts/addEditor.vue

@@ -19,6 +19,7 @@ import requests from "@common/requests";
 import useToast from "@hooks/useToast"
 import { CONTACT_PERSON_ADDITION_EDITOR, CUSTOMER_ADDED_EDITOR } from "@hooks/useApi"
 import useRouterStore from "@store/useRouterStore.js";
+import commonUtil from "@utility/commonUtil"
 const router = useRouterStore()
 
 const { toastText, toastSuccess, toastFail, toastLoading } = useToast()
@@ -38,7 +39,7 @@ function onSubmit() {
     }
     toastLoading('保存中', 0)
     const url = props.formValue.id ? '/contacts/updateContacts' : CONTACT_PERSON_ADDITION_EDITOR
-    requests.post(url, { ...props.formValue, ...res.data }).then(() => {
+    requests.post(url, { ...commonUtil.getFromValue({ ...props.formValue, ...res.data }) }).then(() => {
       toastSuccess('保存成功')
       setTimeout(() => {
         router.navigateBack({

+ 3 - 3
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/contacts/contactsInfo.vue

@@ -21,19 +21,19 @@
     </div>
 
     <!-- 转移弹窗 -->
-    <van-dialog v-model:show="showDialog" :title="`转移线索`" show-cancel-button @confirm="confirmTransfer"
+    <van-dialog v-model:show="showDialog" :title="`转移联系人`" show-cancel-button @confirm="confirmTransfer"
       :before-close="dialogCloseBefo">
       <van-cell title="转移至" is-link @click="showSelect = true">
         <template #value>
           {{ dialogSelection.label }}
         </template>
       </van-cell>
-      <div class="themeTextColor text-size-small pl-4 pt-2 pb-2">转移后,将看不到此线索了</div>
+      <div class="themeTextColor text-size-small pl-4 pt-2 pb-2">转移后,将看不到此联系人了</div>
     </van-dialog>
 
     <!-- select 选择器 -->
     <van-popup v-model:show="showSelect" destroy-on-close position="bottom" :style="{ height: '80%' }">
-      <PullDownSelector @change="selectChange" />
+      <PullDownSelector :showElement="showSelect" @change="selectChange" />
     </van-popup>
   </div>
 </template>

+ 7 - 0
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/contacts/detail.vue

@@ -22,7 +22,9 @@ import requests from "@common/requests";
 import ContactsInfo from './contactsInfo.vue';
 import RelatedTasks from '../tasks/relatedTasks.vue';
 import RelatedBusinessOpportunities from '../business/relatedBusinessOpportunities.vue';
+import useShowToast from '@hooks/useToast'
 
+const { toastSuccess, toastLoading, toastFail, toastText, clearToast } = useShowToast()
 const props = defineProps({
   info: {
     type: Object,
@@ -46,11 +48,16 @@ function getDetailedData(id) {
     infoData.value = data || {}
     relatedBusinessOpportunitiesList.value = data.businessOpportunityList || []
     relatedTasksList.value = data.taskList || []
+  }).finally(() => {
+    setTimeout(() => {
+      clearToast()
+    }, 200)
   })
 }
 
 function processingData(id) {
   clearTimeout(timeout.value);
+  toastLoading('加载中...', 0)
   timeout.value = setTimeout(() => {
     getDetailedData(id)
   }, 100);

+ 4 - 3
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/contract/addEditor.vue

@@ -58,6 +58,7 @@ import { CONTRACT_ADDITION_EDITING, CONTRACT_EDITING, OBTAIN_THE_CONTRACT_REMITT
 import useRouterStore from "@store/useRouterStore.js";
 import FoldingPanel from '@components/common/foldingPanel.vue';
 import dayjs from 'dayjs';
+import commonUtil from "@utility/commonUtil"
 
 const router = useRouterStore()
 const { toastText, toastSuccess, toastFail, toastLoading } = useToast()
@@ -106,7 +107,7 @@ function onSubmit() {
     }
 
     toastLoading('保存中', 0)
-    requests.post(props.formValue?.id ? CONTRACT_EDITING : CONTRACT_ADDITION_EDITING, { ...props.formValue, ...res.data, paymentListStr: JSON.stringify(paymentPlanList.value) }).then(() => {
+    requests.post(props.formValue?.id ? CONTRACT_EDITING : CONTRACT_ADDITION_EDITING, { ...commonUtil.getFromValue({ ...props.formValue, ...res.data, paymentListStr: JSON.stringify(paymentPlanList.value) }) }).then(() => {
       toastSuccess('保存成功')
       setTimeout(() => {
         router.navigateBack({
@@ -115,8 +116,8 @@ function onSubmit() {
           }
         })
       }, 2000)
-    }).catch(() => {
-      toastFail('保存失败')
+    }).catch((err) => {
+      toastFail('保存失败:' + err.msg)
     })
   })
 }

+ 13 - 7
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/contract/detail.vue

@@ -25,9 +25,10 @@
           {{ infoData.nextPaymentDate ? infoData.nextPaymentDate : '-' }}
         </template>
       </van-cell>
-      <van-cell title="下笔回款金额" :value="infoData.payment">
+      <van-cell title="下笔回款金额">
         <template #default>
-          <span class="text-[#FF8B32]" v-if="infoData.payment">¥ {{ infoData.payment.toFixed(2) }}</span>
+          <span class="text-[#FF8B32]" v-if="infoData.nextPaymentAmount">¥ {{ infoData.
+            nextPaymentAmount?.toFixed(2) }}</span>
         </template>
       </van-cell>
       <van-cell title="合同类型" :value="infoData.typeName" />
@@ -51,7 +52,7 @@
     </div>
 
     <!-- 驳回弹窗 -->
-    <van-dialog v-model:show="showDialog" :title="`转移线索`" show-cancel-button @confirm="confirmTransfer"
+    <van-dialog v-model:show="showDialog" :title="`驳回合同`" show-cancel-button @confirm="confirmTransfer"
       :before-close="dialogCloseBefo">
       <template #default>
         <van-field v-model.trim="dialogSelection" type="textarea" rows="3" label="驳回原因" placeholder="请输入驳回原因" />
@@ -77,7 +78,7 @@ import useFixedData from "@store/useFixedData.js"
 const fixedData = useFixedData()
 const router = useRouterStore()
 const userInfo = useInfoStore()
-const { toastSuccess, toastFail, toastText } = useShowToast()
+const { toastSuccess, toastLoading, toastFail, toastText, clearToast } = useShowToast()
 const props = defineProps({
   info: {
     type: Object,
@@ -128,7 +129,7 @@ function confirmTransfer() {
     title: `合同驳回`,
     message: `确认驳回吗?,驳回后合同基本信息无法修改`,
   }).then(() => {
-    requests.post(CONTRACT_APPROVED, { id, status: 0, msg: dialogSelection.value }).then((res) => {
+    requests.post(CONTRACT_APPROVED, { id, status: 2, msg: dialogSelection.value }).then((res) => {
       toastSuccess('操作成功')
       showDialog.value = false
       processingData(id)
@@ -147,7 +148,7 @@ function dialogCloseBefo(val) {
 function deleteRow() {
   const { name = '', searchFiled = {}, deteleFiled = '' } = routingInformation
   const row = props.info
-  const foemVal = { [routingInformation.key == 'tasks' ? 'taskIds' : 'ids']: row.id }
+  const foemVal = { [routingInformation.key == 'tasks' ? 'taskIds' : 'id']: row.id }
   showConfirmDialog({
     title: `删除${name}`,
     message: `确定删除【${row[searchFiled?.search]}】${name}吗?`,
@@ -170,7 +171,7 @@ function deleteRow() {
 function jumpEdit() {
   const formJson = fixedData.formJson[routingInformation.key] || []
   const formList = resetListData(formJson?.list)
-  const filedObj = getListFieldKey(formList, props.info)
+  const filedObj = getListFieldKey(formList, infoData.value)
   const formVal = { ...filedObj, id: props.info.id }
 
   router.navigateTo({
@@ -187,10 +188,15 @@ function jumpEdit() {
 function getDetails(id) {
   requests.post(OBTAIN_CONTRACT_DETAILS, { id }).then((res) => {
     infoData.value = res.data || {}
+  }).finally(() => {
+    setTimeout(() => {
+      clearToast()
+    }, 200)
   })
 }
 function processingData(id) {
   clearTimeout(timeout.value);
+  toastLoading('加载中...', 0)
   timeout.value = setTimeout(() => {
     getDetails(id)
   }, 100);

+ 2 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/customer/addEditor.vue

@@ -19,6 +19,7 @@ import requests from "@common/requests";
 import useToast from "@hooks/useToast"
 import { CUSTOMER_ADDED_EDITOR } from "@hooks/useApi"
 import useRouterStore from "@store/useRouterStore.js";
+import commonUtil from "@utility/commonUtil"
 
 const router = useRouterStore()
 const { toastText, toastSuccess, toastFail, toastLoading } = useToast()
@@ -37,7 +38,7 @@ function onSubmit() {
       return
     }
     toastLoading('保存中', 0)
-    requests.post(CUSTOMER_ADDED_EDITOR, { ...props.formValue, ...res.data }).then(() => {
+    requests.post(CUSTOMER_ADDED_EDITOR, { ...commonUtil.getFromValue({ ...props.formValue, ...res.data }) }).then(() => {
       toastSuccess('保存成功')
       setTimeout(() => {
         router.navigateBack({

+ 3 - 3
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/customer/customerInfo.vue

@@ -25,19 +25,19 @@
     </div>
 
     <!-- 转移弹窗 -->
-    <van-dialog v-model:show="showDialog" :title="`转移线索`" show-cancel-button @confirm="confirmTransfer"
+    <van-dialog v-model:show="showDialog" :title="`转移客户`" show-cancel-button @confirm="confirmTransfer"
       :before-close="dialogCloseBefo">
       <van-cell title="转移至" is-link @click="showSelect = true">
         <template #value>
           {{ dialogSelection.label }}
         </template>
       </van-cell>
-      <div class="themeTextColor text-size-small pl-4 pt-2 pb-2">转移后,将看不到此线索了</div>
+      <div class="themeTextColor text-size-small pl-4 pt-2 pb-2">转移后,将看不到此客户了</div>
     </van-dialog>
 
     <!-- select 选择器 -->
     <van-popup v-model:show="showSelect" destroy-on-close position="bottom" :style="{ height: '80%' }">
-      <PullDownSelector @change="selectChange" />
+      <PullDownSelector :showElement="showSelect" @change="selectChange" />
     </van-popup>
   </div>
 </template>

+ 7 - 0
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/customer/detail.vue

@@ -30,7 +30,9 @@ import RelatedTasks from '../tasks/relatedTasks.vue';
 import RelatedContacts from '../contacts/relatedContacts.vue';
 import RelatedBusinessOpportunities from '../business/relatedBusinessOpportunities.vue';
 import RelatedSalesOrders from '../order/relatedSalesOrders.vue';
+import useShowToast from '@hooks/useToast'
 
+const { toastSuccess, toastLoading, toastFail, toastText, clearToast } = useShowToast()
 const props = defineProps({
   info: {
     type: Object,
@@ -58,11 +60,16 @@ function getDetailedData(id) {
     relatedContactsList.value = data.contacts || []
     relatedBusinessOpportunitiesList.value = data.businessOpportunitys || []
     relatedSalesOrdersList.value = data.salesOrders || []
+  }).finally(() => {
+    setTimeout(() => {
+      clearToast()
+    }, 200)
   })
 }
 
 function processingData(id) {
   clearTimeout(timeout.value);
+  toastLoading('加载中...', 0)
   timeout.value = setTimeout(() => {
     getDetailedData(id)
   }, 100);

+ 2 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/order/addEditor.vue

@@ -47,6 +47,7 @@ import FoldingPanel from '@components/common/foldingPanel.vue';
 import CustomerForm from '@components/common/formForm/formView.vue'
 import NewAndModifiedRelatedProducts from '@pages/pageComponents/product/newAndModifiedRelatedProducts.vue'
 import useRouterStore from "@store/useRouterStore.js";
+import commonUtil from "@utility/commonUtil"
 
 const router = useRouterStore()
 
@@ -81,7 +82,7 @@ function onSubmit() {
       orderProductDetailString: JSON.stringify(newList),
     }
     toastLoading('保存中', 0)
-    requests.post(ORDER_ADDITION_EDITING, { ...formVal }).then(() => {
+    requests.post(ORDER_ADDITION_EDITING, { ...commonUtil.getFromValue({ ...formVal }) }).then(() => {
       toastSuccess('保存成功')
       setTimeout(() => {
         router.navigateBack({

+ 13 - 2
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/order/detail.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="w-full h-full">
-    <van-tabs v-model:active="tabActive">
+    <van-tabs v-model:active="tabActive" :swipe-threshold="3">
       <van-tab title="销售订单信息" name="销售订单信息">
         <OrderInfo :info="infoData" />
       </van-tab>
@@ -11,7 +11,7 @@
         <RelatedProducts :infoList="relatedProductsList" />
       </van-tab>
       <van-tab title="回款" name="回款">
-        <PaymentCollection :info="infoData" />
+        <PaymentCollection :info="infoData" @changePaymentCollection="changePaymentCollection" />
       </van-tab> 
     </van-tabs>
   </div>
@@ -26,7 +26,9 @@ import OrderInfo from './orderInfo.vue';
 import RelatedTasks from '../tasks/relatedTasks.vue';
 import RelatedProducts from '../product/relatedProducts.vue';
 import PaymentCollection from './paymentCollection.vue';
+import useShowToast from '@hooks/useToast'
 
+const { toastSuccess, toastLoading, toastFail, toastText, clearToast } = useShowToast()
 const props = defineProps({
   info: {
     type: Object,
@@ -65,11 +67,20 @@ function getDetailedData(id) {
       }
     })
     relatedProductsList.value = list
+  }).finally(() => {
+    setTimeout(() => {
+      clearToast()
+    }, 200)
   })
 }
 
+function changePaymentCollection(id) {
+  getDetailedData(id)
+}
+
 function processingData(id) {
   clearTimeout(timeout.value);
+  toastLoading('加载中...', 0)
   timeout.value = setTimeout(() => {
     getDetailedData(id)
   }, 100);

+ 3 - 3
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/order/orderInfo.vue

@@ -53,19 +53,19 @@
     </div>
 
     <!-- 转移弹窗 -->
-    <van-dialog v-model:show="showDialog" :title="`转移线索`" show-cancel-button
+    <van-dialog v-model:show="showDialog" :title="`转移销售订单`" show-cancel-button
       @confirm="confirmTransfer" :before-close="dialogCloseBefo">
       <van-cell title="转移至" is-link @click="showSelect = true">
         <template #value>
           {{ dialogSelection.label }}
         </template>
       </van-cell>
-      <div class="themeTextColor text-size-small pl-4 pt-2 pb-2">转移后,将看不到此线索了</div>
+      <div class="themeTextColor text-size-small pl-4 pt-2 pb-2">转移后,将看不到此销售订单了</div>
     </van-dialog>
 
     <!-- select 选择器 -->
     <van-popup v-model:show="showSelect" destroy-on-close position="bottom" :style="{ height: '80%' }">
-      <PullDownSelector @change="selectChange" />
+      <PullDownSelector :showElement="showSelect" @change="selectChange" />
     </van-popup>
   </div>
 </template>

+ 7 - 4
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/order/paymentCollection.vue

@@ -2,7 +2,7 @@
   <div class="flex flex-col h-full paymentCollection">
     <div class="info flex-1 overflow-y-auto cellnormall">
       <template v-if="paymentPlanList.length">
-        <div class="bg-white py-2 mb-4" v-for="item in paymentPlanList" :key="item.id">
+        <div class="bg-white py-2 mb-4" v-for="(item, index) in paymentPlanList" :key="item.id">
           <van-cell-group inset>
             <van-cell title="回款时间" :value="item.createTime" />
             <van-cell title="操作人">
@@ -15,8 +15,8 @@
             <van-cell title="操作">
               <template #default>
                 <div class="flex justify-end">
-                  <div class="mr-3 themeTextColor" @click="editPaymentCollection(item)">编辑</div>
-                  <div class="text-[red]" @click="deletePaymentCollection(item)">删除</div>
+                  <div class="mr-3 themeTextColor" v-if="index == 0" @click="editPaymentCollection(item)">编辑</div>
+                  <div class="text-[red]" v-if="index == 0" @click="deletePaymentCollection(item)">删除</div>
                 </div>
               </template>
             </van-cell>
@@ -48,6 +48,7 @@ import requests from "@common/requests";
 import useShowToast from '@hooks/useToast'
 
 const { toastSuccess, toastFail, toastText } = useShowToast()
+const emit = defineEmits()
 const props = defineProps({
   info: {
     type: Object,
@@ -72,6 +73,7 @@ function deletePaymentCollection(row) {
   }).then(() => {
     requests.post(DELETE_SALES_ORDER_PAYMENT_RECORDS, { paymentId: row.id }).then(() => {
       toastSuccess('操作成功')
+      emit('changePaymentCollection', props.info.id)
       processingData(props.info.id)
     }).catch((err) => {
       toastFail(err.msg ? err.msg : '删除失败')
@@ -93,12 +95,13 @@ function addEditReceipt() {
     [rowId ? 'paymentId' : 'orderId']: rowId ? rowId : props.info.id,
     money: val,
   }
-  if ((+totalMoney + val) > orderAmount) {
+  if ((+totalMoney + +val) > orderAmount) {
     toastText('回款金额不能大于订单金额')
     return
   }
   requests.post(url, formVal).then(() => {
     toastSuccess('操作成功')
+    emit('changePaymentCollection', props.info.id)
     processingData(props.info.id)
     showDialog.value = false
   })

+ 2 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/product/addEditor.vue

@@ -19,6 +19,7 @@ import requests from "@common/requests";
 import useToast from "@hooks/useToast"
 import { PRODUCT_ADD_EDITOR } from "@hooks/useApi"
 import useRouterStore from "@store/useRouterStore.js";
+import commonUtil from "@utility/commonUtil"
 
 const router = useRouterStore()
 const { toastText, toastSuccess, toastFail, toastLoading } = useToast()
@@ -37,7 +38,7 @@ function onSubmit() {
       return
     }
     toastLoading('保存中', 0)
-    requests.post(PRODUCT_ADD_EDITOR, { ...props.formValue, ...res.data }).then(() => {
+    requests.post(PRODUCT_ADD_EDITOR, { ...commonUtil.getFromValue({ ...props.formValue, ...res.data }) }).then(() => {
       toastSuccess('保存成功')
       setTimeout(() => {
         router.navigateBack({

+ 7 - 0
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/product/detail.vue

@@ -22,7 +22,9 @@ import requests from "@common/requests";
 import ProductInfo from './productInfo.vue';
 import RelatedSalesOrders from '../order/relatedSalesOrders.vue';
 import RelatedBusinessOpportunities from '../business/relatedBusinessOpportunities.vue';
+import useShowToast from '@hooks/useToast'
 
+const { toastSuccess, toastLoading, toastFail, toastText, clearToast } = useShowToast()
 const props = defineProps({
   info: {
     type: Object,
@@ -44,6 +46,10 @@ watch(() => props.info, (newValue) => {
 function getDetailedData(id) {
   requests.post(GET_PRODUCT_DETAILS, { id }).then(({ data }) => {
     infoData.value = data || {}
+  }).finally(() => {
+    setTimeout(() => {
+      clearToast()
+    }, 200)
   })
   requests.post(OBTAIN_PRODUCT_RELATED_BUSINESS_OPPORTUNITIES, { id }).then(({ data }) => {
     relatedBusinessOpportunitiesList.value = data || []
@@ -55,6 +61,7 @@ function getDetailedData(id) {
 
 function processingData(id) {
   clearTimeout(timeout.value);
+  toastLoading('加载中...', 0)
   timeout.value = setTimeout(() => {
     getDetailedData(id)
   }, 100);

+ 6 - 4
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/product/newAndModifiedRelatedProducts.vue

@@ -100,6 +100,7 @@
       :style="{ height: '80%' }"
     >
       <PullDownSelector
+        :showElement="showPicker"
         :options="productsList"
         :doYouNeedTranslation="false"
         @change="selectChange"
@@ -150,7 +151,7 @@ function selectChange(value, label) {
       productType: typeName,
       price,
       inventory,
-      unitName,
+      unit: unitName,
       sellingPrice: 0,
       quantity: 0,
       discount: 0,
@@ -175,16 +176,17 @@ function inputNumberChange(field) {
 
 function getAllProducts() {
   requests
-    .post(GET_PRODUCT_LIST, { pageIndex: -1, pageSize: -1 })
+    .post(GET_PRODUCT_LIST, { pageIndex: -1, pageSize: -1, status: 1 })
     .then(({ data = {} }) => {
       const { record = [] } = data;
-      productsList.value = record.map(item => {
+      const list = record.map(item => {
         return {
           label: item.productName,
           value: item.id
         }
       })
-      allProducts.value = record;
+      productsList.value = list?.length > 0 ? list : [{}];
+      allProducts.value = record?.length > 0 ? record : [{}];
     });
 }
 

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/product/productInfo.vue

@@ -43,7 +43,7 @@
 
     <!-- select 选择器 -->
     <van-popup v-model:show="showSelect" destroy-on-close position="bottom" :style="{ height: '80%' }">
-      <PullDownSelector @change="selectChange" />
+      <PullDownSelector :showElement="showSelect" @change="selectChange" />
     </van-popup>
   </div>
 </template>

+ 2 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/tasks/addEditor.vue

@@ -194,6 +194,7 @@ import PullDownSelector from '@components/common/pullDownSelector.vue'
 import CustomerForm from '@components/common/formForm/formView.vue'
 import TranslationComponent from '@components/common/translationComponent.vue';
 import useRouterStore from "@store/useRouterStore.js";
+import commonUtil from "@utility/commonUtil"
 
 const router = useRouterStore()
 const { toastText, toastSuccess, toastFail, toastLoading } = useToast()
@@ -258,7 +259,7 @@ function onSubmit() {
     console.log('formValue', formValue)
     toastLoading('保存中')
     const url = formValue.id ? MODIFY_TASK : TASK_ADD_EDIT
-    requests.post(url, { ...formValue }).then(() => {
+    requests.post(url, { ...commonUtil.getFromValue({ ...formValue }) }).then(() => {
       toastSuccess('保存成功')
       setTimeout(() => {
         router.navigateBack({

+ 6 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/tasks/detail.vue

@@ -52,7 +52,7 @@ import useRouterStore from "@store/useRouterStore.js";
 const router = useRouterStore()
 const fixedData = useFixedData()
 const userInfo = useInfoStore()
-const { toastSuccess, toastFail, toastText } = useShowToast()
+const { toastSuccess, toastLoading, toastFail, toastText, clearToast } = useShowToast()
 const props = defineProps({
   info: {
     type: Object,
@@ -102,11 +102,16 @@ function deleteTask() {
 function getTaskDetails(id) {
   requests.post(GET_TASK_DETAILS, { id }).then(({ data }) => {
     infoData.value = data
+  }).finally(() => {
+    setTimeout(() => {
+      clearToast()
+    }, 200)
   })
 }
 
 function initializeData(id) {
   clearTimeout(timeout.value);
+  toastLoading('加载中...', 0)
   timeout.value = setTimeout(() => {
     getTaskDetails(id)
   }, 100);

+ 2 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/thread/addEditor.vue

@@ -19,6 +19,7 @@ import requests from "@common/requests";
 import useToast from "@hooks/useToast"
 import { NEW_CLUE_EDITING } from "@hooks/useApi"
 import useRouterStore from "@store/useRouterStore.js";
+import commonUtil from "@utility/commonUtil"
 
 const router = useRouterStore()
 const { toastText, toastSuccess, toastFail, toastLoading } = useToast()
@@ -37,7 +38,7 @@ function onSubmit() {
       return
     }
     toastLoading('保存中', 0)
-    requests.post(NEW_CLUE_EDITING, { ...props.formValue, ...res.data }).then(() => {
+    requests.post(NEW_CLUE_EDITING, { ...commonUtil.getFromValue({ ...props.formValue, ...res.data }) }).then(() => {
       toastSuccess('保存成功')
       setTimeout(() => {
         router.navigateBack({

+ 6 - 0
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/thread/detail.vue

@@ -18,7 +18,9 @@ import { GET_CLUE_DETAILS } from "@hooks/useApi"
 import requests from "@common/requests";
 import ThreadInfo from './threadInfo.vue';
 import RelatedTasks from '../tasks/relatedTasks.vue';
+import useShowToast from '@hooks/useToast'
 
+const { toastSuccess, toastLoading, toastFail, toastText, clearToast } = useShowToast()
 const props = defineProps({
   info: {
     type: Object,
@@ -45,11 +47,15 @@ function getDetails(id) {
     setTimeout(() => {
       componentKey.value++
     }, 10)
+    setTimeout(() => {
+      clearToast()
+    }, 200)
   })
 }
 
 function processingData(id) {
   clearTimeout(timeout.value);
+  toastLoading('加载中...', 0)
   timeout.value = setTimeout(() => {
     getDetails(id)
   }, 100);

+ 2 - 2
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/thread/threadInfo.vue

@@ -16,7 +16,7 @@
       <van-cell title="备注" :value="info.remark" />
     </div>
     <div class="bottomButton">
-      <van-button type="primary" class="w-full block" v-if="info.inchargerName"  @click="transformBusinessOpportunities()">线索转商机</van-button>
+      <van-button type="primary" class="w-full block" v-if="info.inchargerName && info.isBo != 1"  @click="transformBusinessOpportunities()">线索转商机</van-button>
       <van-button type="warning" class="w-full block" v-if="info.inchargerName"  @click="showDialogCli()">转移线索</van-button>
       <van-button type="primary" class="w-full block" v-if="!info.inchargerName" @click="claimAndClaim()">认领线索</van-button>
       <van-button type="default" class="w-full block" v-permission="[routingInformation.jurisdiction.edit]" @click="jumpEdit()">编辑线索</van-button>
@@ -36,7 +36,7 @@
 
     <!-- select 选择器 -->
     <van-popup v-model:show="showSelect" destroy-on-close position="bottom" :style="{ height: '80%' }">
-      <PullDownSelector @change="selectChange" />
+      <PullDownSelector :showElement="showSelect" @change="selectChange" />
     </van-popup>
   </div>
 </template>

+ 12 - 3
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/component/businessEcharts.vue

@@ -78,9 +78,18 @@ function processChartData(yAxisData = [], seriesData = []) {
   }
   echartsOption.value = {
     tooltip: {
-      trigger: 'axis',
-      axisPointer: {
-        type: 'shadow'
+      // trigger: 'axis',
+      // axisPointer: {
+      //   type: 'shadow'
+      // }
+      trigger: 'item',
+      formatter: function (params) {
+          return `
+              <div class="tooltip-content">
+                  <div>${params.name}</div>
+                  <div>${params.data} 个</div>
+              </div>
+          `;
       }
     },
     legend: {

+ 4 - 4
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/component/dataSummary.vue

@@ -37,7 +37,7 @@
             <div class="text-size-small text-[#999]" style="width: 40%;">
               新增商机 <span class="ml-1 text-[#51C2FF]">
                 {{ dataSummary?.businessOpportunityDataSummary?.newNum || 0 }}
-              </span> 
+              </span> 
             </div>
             <div class="text-size-small text-[#999]" style="width: 60%;">
               商机赢单 <span class="ml-1 text-[#51C2FF]">
@@ -49,7 +49,7 @@
             <div class="text-size-small text-[#999]" style="width: 40%;">
               输单商机 <span class="ml-1 text-[#51C2FF]">
                 {{ dataSummary?.businessOpportunityDataSummary?.winning || 0 }}
-              </span> 
+              </span> 
             </div>
             <div class="text-size-small text-[#999]" style="width: 60%;">
               商机总金额 <span class="ml-1 text-[#51C2FF]">
@@ -68,12 +68,12 @@
             <div class="w-1/2 text-size-small text-[#999]">
               新增线索 <span class="ml-1 text-[#28C67E]">
                 {{ dataSummary?.clueDataSummary?.newNum || 0 }}
-              </span> 
+              </span> 
             </div>
             <div class="w-1/2 text-size-small text-[#999]">
               线索转商机 <span class="ml-1 text-[#28C67E]">
                 {{ dataSummary?.clueDataSummary?.changeNum || 0 }}
-              </span> 
+              </span> 
             </div>
           </div>
         </div>

+ 14 - 4
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/component/filterItem.vue

@@ -3,9 +3,14 @@
     <div class="flex-1 overflow-x-auto">
       <div class="filterCriteria-title">范围选择</div>
       <div class="flex flex-wrap">
-        <template v-for="(item, index) in fixedFieldPermissionOptions">
-          <div :class="`${dataFilter.scopeSelection == item.value && 'selected'} item item-special`"
-            @click="scopeSelectionCli(item)">{{ item.label }}</div>
+        <template v-if="dataAnalysisFlag.length > 0">
+          <template v-for="(item, index) in fixedFieldPermissionOptions">
+            <div :class="`${dataFilter.scopeSelection == item.value && 'selected'} item item-special`"
+              @click="scopeSelectionCli(item)">{{ item.label }}</div>
+          </template>
+        </template>
+        <template v-else>
+          <div :class="`selected item item-special`">仅本人</div>
         </template>
       </div>
       <div class="filterCriteria-title">时间选择</div>
@@ -51,7 +56,9 @@ import { useLifecycle } from '@hooks/useCommon.js';
 import { fixedFieldPermissionOptions, fixedFieldDateOptions } from '@utility/defaultData.js';
 import dayjs from 'dayjs';
 import useShowToast from "@hooks/useToast";
+import useInfoStore from '@store/useInfoStore'
 
+const user = useInfoStore()
 const { toastText } = useShowToast();
 const emit = defineEmits()
 const props = defineProps({
@@ -71,6 +78,7 @@ const dataFilter = ref({
   dateSelection: 0,
   customTime: []
 })
+const dataAnalysisFlag = user.userInfo?.moduleList?.filter(item => item.path == '/analysis') || []
 
 watch(() => props.dataFilters, (newValue) => {
   dataFilter.value = newValue
@@ -92,10 +100,12 @@ function showPickerConfirm({ selectedValues }) {
 function showDate(index) {
   if (index == 0) {
     maxDate.value = dataFilter.value.customTime[1] ? new Date(dataFilter.value.customTime[1]) : new Date(dayjs().add(2, 'year'))
+    minDate.value = new Date(dayjs().add(-2, 'year'))
   }
 
   if (index == 1) {
     minDate.value = dataFilter.value.customTime[0] ? new Date(dataFilter.value.customTime[0]) : new Date(dayjs().add(-2, 'year'))
+    maxDate.value = new Date(dayjs().add(2, 'year'))
   }
   const dateVal = dataFilter.value.customTime[index] || '';
   const todaySDate = dayjs().format("YYYY-MM-DD");
@@ -117,7 +127,7 @@ function timeSelectionCli(item) {
 
 useLifecycle({
   load: () => {
-    // 添加加载逻辑
+
   }
 });
 </script>

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/component/salesBriefings.vue

@@ -78,7 +78,7 @@
             <div>商机金额</div>
             <div class="flex items-end">
               <span class="text-[#EED116] text-size-in font-bold mr-1">
-                {{ salesBriefings?.businessOpportunityPrice?.businessOpportunityCount || 0 }}
+                {{ salesBriefings?.businessOpportunityPrice?.businessOpportunityPrice || 0 }}
               </span>元
             </div>
           </div>

+ 4 - 3
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/visitorProgram/addEditorVisitor.vue

@@ -37,7 +37,7 @@
               {{ form.customName }}
             </template>
           </van-field>
-          <van-field
+          <!-- <van-field
             v-model="form.inchargerId"
             is-link
             readonly
@@ -51,7 +51,7 @@
             <template #input v-if="form.inchargerId">
               {{ form.inchargerName }}
             </template>
-          </van-field>
+          </van-field> -->
           <van-field
             v-model="form.visitGoal"
             is-link
@@ -81,12 +81,13 @@
           </van-field>
           <van-field
             v-model="form.remindType"
-            class="resetStyles"
             is-link
             readonly
+            required
             name="remindType"
             label="提醒"
             placeholder="请选择"
+            :rules="[{ required: true, message: '' }]"
             @click="remindShowPicker = true"
           >
             <template #input v-if="form.remindType">

+ 43 - 0
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/utility/commonUtil.js

@@ -77,4 +77,47 @@ commonUtil.isJsonStr = (str) => {
     }
 };
 
+/**
+ * 判断值是否为空
+ * @param value 值
+ * @returns {boolean}
+ */
+commonUtil.isValueEmpty = (value) => {
+    if (value === null || value === undefined) {
+        return true;
+    }
+    if (typeof value === "string" && value.trim() === "") {
+        return true;
+    }
+    if (Array.isArray(value) && value.length === 0) {
+        return true;
+    }
+    if (
+        typeof value === "object" &&
+        !Array.isArray(value) &&
+        Object.keys(value).length === 0
+    ) {
+        return true;
+    }
+    if (typeof value === "symbol" && value.toString() === "Symbol()") {
+        return true;
+    }
+    return false;
+}
+
+/**
+ * 获取表单数据中有值的数据
+ * @param formData 表单数据
+ * @returns {T}
+ */
+commonUtil.getFromValue = (formData) => {
+    const result = {};
+    for (const key in formData) {
+        if (!commonUtil.isValueEmpty(formData[key])) {
+            result[key] = formData[key];
+        }
+    }
+    return result;
+}
+
 export default commonUtil;

Різницю між файлами не показано, бо вона завелика
+ 2 - 2
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/utility/generalVariables.js


+ 3 - 3
fhKeeper/formulahousekeeper/customerBuler-crm-h5/vite.config.js

@@ -5,10 +5,10 @@ import Components from "unplugin-vue-components/vite";
 import { VantResolver } from "unplugin-vue-components/resolvers";
 import { postcssConfig } from "./postcss.config.js";
 
-const target = 'http://192.168.2.7:10010';
+// const target = 'http://192.168.2.7:10010';
 // const target = 'http://192.168.2.3:10010';
-// const target = 'http://192.168.2.17:10010';
-// const target = 'http://47.101.180.183:10010';
+const target = 'http://192.168.2.17:10010';
+// const target = 'http://47.101.180.183:10014';
 
 export default defineConfig({
   define: {

+ 1 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/team/api.ts

@@ -4,6 +4,7 @@ export const GET_ROUTELIST = '/permission/getFrontRoleList'
 export const GET_DEPTLIST = '/department/list'
 export const GET_USERLIST = '/user/getSimpleActiveUserList'
 export const GET_ADDDEPT = '/department/add'
+export const EDIT_ADDDEPT = '/department/edit'
 export const DETELE_DEPT = '/department/delete'
 export const ADD_USER = '/user/insertUser'
 export const GET_USERINFO = '/user/getUserInfo'

+ 5 - 6
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/team/index.vue

@@ -259,7 +259,7 @@ import { UploadRequestOptions, dayjs } from 'element-plus'
 import { Search, CirclePlusFilled, Edit, CirclePlus, Delete } from '@element-plus/icons-vue'
 import { FormInstance, FormRules, ElMessageBox } from 'element-plus'
 import { useStore } from '@/store/index'
-import { GET_DATA_LIST, DETELE_DEPT, MOD, GET_USERINFO, GET_ROUTELIST, DEACTIVEUSER, SETACTIVE, GET_DEPTLIST, BACTHSERROLE, GET_USERLIST, GET_ADDDEPT, ADD_USER, SETRESETPWD, EXPOERTUSER } from './api'
+import { GET_DATA_LIST, DETELE_DEPT, MOD, GET_USERINFO, GET_ROUTELIST, DEACTIVEUSER, SETACTIVE, GET_DEPTLIST, BACTHSERROLE, GET_USERLIST, GET_ADDDEPT, ADD_USER, SETRESETPWD, EXPOERTUSER, EDIT_ADDDEPT } from './api'
 import { post, uploadFile } from "@/utils/request";
 import { getFromValue, updateDepTreeData, resetFromValue, confirmAction, downloadFile } from '@/utils/tools'
 
@@ -464,24 +464,23 @@ async function personnelModalConfirm(data: any, modelType: string) {
     globalPopup?.showSuccess('添加成功')
     getTableData()
   }).catch(_err => {
-    dialogFrom[modelType] = false
+    dialogFrom[modelType] = false 
   })
 }
 
 function createDepartment(formEl: FormInstance | undefined) {
   if (!formEl) return
   let data = getFromValue(deptForm)
-  console.log(data, '<==== 对应的数据')
-  return
   loadingFrom.deptDialogVisibleLoading = true
-  post(GET_ADDDEPT, { ...deptForm, otherManagerIds: data.otherManagerIds && data.otherManagerIds.join(',') }).then(res => {
+  EDIT_ADDDEPT
+  post(data.id ? EDIT_ADDDEPT : GET_ADDDEPT, { ...deptForm, otherManagerIds: data.otherManagerIds && data.otherManagerIds.join(',') }).then(res => {
     if (res.code != 'ok') {
       loadingFrom.deptDialogVisibleLoading = false
       globalPopup?.showError(res.msg)
       return
     }
     loadingFrom.deptDialogVisibleLoading = false
-    globalPopup?.showSuccess('创建成功')
+    globalPopup?.showSuccess(data.id ? '修改成功' : '创建成功')
     getDeptList()
     dialogFrom.addDeptDialogVisible = false
   }).catch(_err => {

+ 2 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/vite.config.ts

@@ -5,9 +5,9 @@ import { resolve } from 'path';
 
 // const target = 'http://192.168.2.28:10010';
 // const target = 'http://192.168.2.17:10010';
-const target = "http://127.0.0.1:10010";
+// const target = "http://127.0.0.1:10010";
 // const target = "http://192.168.2.178:10010";
-// const target = 'http://47.101.180.183:10010';
+const target = 'http://47.101.180.183:10014';
 
 export default defineConfig({
   plugins: [vue({

+ 43 - 10
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/SalesOrderController.java

@@ -8,6 +8,7 @@ import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.*;
 import com.management.platform.util.BeanChangeUtil;
 import com.management.platform.util.HttpRespMsg;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -448,8 +449,19 @@ public class SalesOrderController {
         //订单未回款金额
         BigDecimal unReceivedPayment = salesOrder.getUnReceivedPayment();
         //更新订单数据
-        receivedPayment=receivedPayment.add(new BigDecimal(money));
-        unReceivedPayment=unReceivedPayment.subtract(new BigDecimal(money));
+        if(CollectionUtils.isEmpty(list)){
+            //第一张订单,覆盖数据
+            receivedPayment = new BigDecimal(money);
+            unReceivedPayment = salesOrder.getPrice().subtract(receivedPayment);
+        }else{
+            //更新数据
+//            receivedPayment=receivedPayment.add(new BigDecimal(money));
+//            unReceivedPayment=unReceivedPayment.subtract(new BigDecimal(money));
+
+            receivedPayment=new BigDecimal(sum).add(new BigDecimal(money));
+            unReceivedPayment=salesOrder.getPrice().subtract(receivedPayment);
+        }
+
         salesOrder.setReceivedPayment(receivedPayment);
         salesOrder.setUnReceivedPayment(unReceivedPayment);
         if(money>0){
@@ -538,21 +550,25 @@ public class SalesOrderController {
                 return msg;
             }
             double sum = list.stream().mapToDouble(s -> s.getMoney().doubleValue()).sum();
-            if((sum)>salesOrder.getPrice().doubleValue()){
-                msg.setError("总回款金额不能大于订单金额");
-                return msg;
-            }
             //找到原回款数据
             BigDecimal nowMoney = new BigDecimal(money);
             BigDecimal oldMoney = payment.getMoney();
+
+            BigDecimal tmpSum = new BigDecimal(sum);
+            tmpSum = tmpSum.subtract(oldMoney).add(nowMoney);
+            if(tmpSum.compareTo(salesOrder.getPrice()) > 0){
+                msg.setError("总回款金额不能大于订单金额");
+                return msg;
+            }
+
             //离当前回款数据最近一次回款的未回款数据作为依据
             BigDecimal unReceivedPayment = new BigDecimal(0);
             if(i ==0){
-                unReceivedPayment = salesOrder.getPrice().subtract(payment.getMoney());
+                unReceivedPayment = salesOrder.getPrice().subtract(nowMoney);
             }else{
                 SalesOrderPayment salesOrderPayment =list.size()>1?list.get(i-1):list.get(i);
                 unReceivedPayment = salesOrderPayment.getUnReceivedPayment();
-                unReceivedPayment=unReceivedPayment.add(oldMoney).subtract(nowMoney);
+                unReceivedPayment=unReceivedPayment.subtract(nowMoney);
             }
             payment.setMoney(new BigDecimal(money));
             payment.setUnReceivedPayment(unReceivedPayment);
@@ -590,6 +606,7 @@ public class SalesOrderController {
     * @Date: 2024/5/31
     */
     @RequestMapping("/deletePayment")
+    @Transactional
     public HttpRespMsg deletePayment(Integer paymentId){
         HttpRespMsg msg=new HttpRespMsg();
         SalesOrderPayment payment = salesOrderPaymentService.getById(paymentId);
@@ -597,11 +614,27 @@ public class SalesOrderController {
         BigDecimal oldMoney = payment.getMoney();
         //订单上的已回款金额
         BigDecimal receivedPayment = salesOrder.getReceivedPayment();
-        receivedPayment=receivedPayment.subtract(oldMoney);
+//        receivedPayment=receivedPayment.subtract(oldMoney);
         BigDecimal unReceivedPayment = salesOrder.getUnReceivedPayment();
-        unReceivedPayment=unReceivedPayment.add(oldMoney);
+//        unReceivedPayment=unReceivedPayment.add(oldMoney);
+//        salesOrder.setReceivedPayment(receivedPayment);
+//        salesOrder.setUnReceivedPayment(unReceivedPayment);
+
+        List<SalesOrderPayment> list = salesOrderPaymentService.list(new LambdaQueryWrapper<SalesOrderPayment>()
+                .eq(SalesOrderPayment::getOrderId, salesOrder.getId()));
+        BigDecimal oldSum = new BigDecimal(0);
+        for (SalesOrderPayment orderPayment : list) {
+            oldSum = oldSum.add(orderPayment.getMoney());
+        }
+        //已回款金额
+        //price-原总金额+删掉的单子的回款金额
+        receivedPayment = oldSum.subtract(payment.getMoney());
+        //未回款金额
+        //price-已回款
+        unReceivedPayment = salesOrder.getPrice().subtract(receivedPayment);
         salesOrder.setReceivedPayment(receivedPayment);
         salesOrder.setUnReceivedPayment(unReceivedPayment);
+
         if(unReceivedPayment.doubleValue()>0){
             salesOrder.setReceivedStatus(1);
         }

+ 2 - 2
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/VisitPlanController.java

@@ -39,7 +39,7 @@ public class VisitPlanController {
             @RequestParam(value = "planId",required = false) Long planId,
             @RequestParam("planName") String planName,
             @RequestParam("customId") Integer customId,
-            @RequestParam("inchargerId") String inchargerId,
+//            @RequestParam("inchargerId") String inchargerId,
             @RequestParam("visitGoal") Integer visitGoal,
             @RequestParam("visitTime") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")Date visitTime,
             @RequestParam("remark") String remark,
@@ -51,7 +51,7 @@ public class VisitPlanController {
         visitPlan.setId(planId);
         visitPlan.setPlanName(planName);
         visitPlan.setCustomId(customId);
-        visitPlan.setInchargerId(inchargerId);
+//        visitPlan.setInchargerId(inchargerId);
         visitPlan.setVisitGoal(visitGoal);
         visitPlan.setVisitTime(visitTime);
         visitPlan.setRemark(remark);

+ 3 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/SalesOrderMapper.java

@@ -3,6 +3,7 @@ package com.management.platform.mapper;
 import com.management.platform.entity.SalesOrder;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.management.platform.entity.User;
+import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 
 import java.util.List;
@@ -19,4 +20,6 @@ public interface SalesOrderMapper extends BaseMapper<SalesOrder> {
 
     @Select("select * from `sales_order` WHERE company_id = #{companyId} AND is_delete = 0 ")
     List<SalesOrder> getList(User user);
+
+    Integer getNewCloseDealNum(Integer companyId, String startDate, String endDate, String userId, @Param("list")List<String> targetUserIds);
 }

+ 19 - 16
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ContactsServiceImpl.java

@@ -17,6 +17,7 @@ import com.management.platform.service.SysFunctionService;
 import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.ss.usermodel.CellType;
 import org.apache.poi.xssf.usermodel.XSSFCell;
@@ -358,23 +359,25 @@ public class ContactsServiceImpl extends ServiceImpl<ContactsMapper, Contacts> i
             List<BusinessOpportunity> opportunityList = businessOpportunityMapper.selectList(bLqw);
             LambdaQueryWrapper<Stage> stageLQW = new LambdaQueryWrapper<>();
             List<Stage> stages = stageMapper.selectList(stageLQW);
+            if(CollectionUtils.isNotEmpty(opportunityList)){
+                opportunityList.forEach(businessOpportunity -> {
+                    Custom custom = customMapper.selectById(businessOpportunity.getCustomerId());
+                    businessOpportunity.setCustomerName(custom.getCustomName());
+                    if (StringUtils.isNotBlank(businessOpportunity.getInchargerId())){
+                        User chargeUser = userMapper.selectById(businessOpportunity.getInchargerId());
+                        businessOpportunity.setInchargerName(chargeUser.getName());
+                    }
+                    if (StringUtils.isNotBlank(businessOpportunity.getCreatorId())){
+                        User creatorUser = userMapper.selectById(businessOpportunity.getCreatorId());
+                        businessOpportunity.setCreatorName(creatorUser.getName());
+                    }
+                    if (businessOpportunity.getStageId()!=null){
+                        Optional<Stage> first = stages.stream().filter(s -> s.getId().equals(businessOpportunity.getStageId())).findFirst();
+                        first.ifPresent(stage -> businessOpportunity.setStageValue(stage.getName()));
+                    }
+                });
+            }
 
-            opportunityList.forEach(businessOpportunity -> {
-                Custom custom = customMapper.selectById(businessOpportunity.getCustomerId());
-                businessOpportunity.setCustomerName(custom.getCustomName());
-                if (businessOpportunity.getInchargerId()!=null){
-                    User chargeUser = userMapper.selectById(businessOpportunity.getInchargerId());
-                    businessOpportunity.setInchargerName(chargeUser.getName());
-                }
-                if (businessOpportunity.getCreatorId()!=null){
-                    User creatorUser = userMapper.selectById(businessOpportunity.getCreatorId());
-                    businessOpportunity.setCreatorName(creatorUser.getName());
-                }
-                if (businessOpportunity.getStageId()!=null){
-                    Optional<Stage> first = stages.stream().filter(s -> s.getId().equals(businessOpportunity.getStageId())).findFirst();
-                    first.ifPresent(stage -> businessOpportunity.setStageValue(stage.getName()));
-                }
-            });
 
             //附件信息查询
             LambdaQueryWrapper<ContactsDocument> cDLqw = new LambdaQueryWrapper<>();

+ 2 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ContractServiceImpl.java

@@ -447,7 +447,7 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
             }
             //合同编号不可重复
             if (StringUtils.isNotBlank(contract.getNumber()) && user.getCompanyId() != 4215){
-                Contract number = contractMapper.selectOne(new QueryWrapper<Contract>().eq("number", contract.getNumber()).eq("company_id", contract.getCompanyId()));
+                Contract number = contractMapper.selectOne(new QueryWrapper<Contract>().eq("number", contract.getNumber()).eq("company_id", user.getCompanyId()));
                 if (number != null && !number.getId().equals(contract.getId())){
                     httpRespMsg.setError("[" + contract.getNumber() + "]" + MessageUtils.message("contract.numberRepeat"));
                     return httpRespMsg;
@@ -1180,6 +1180,7 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
      * @return
      */
     @Override
+    @Transactional
     public HttpRespMsg deleteContract(HttpServletRequest request, Integer id) {
         HttpRespMsg msg = new HttpRespMsg();
         String token = request.getHeader("TOKEN");

+ 12 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/SalesOrderServiceImpl.java

@@ -1035,6 +1035,11 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
         }
         Map<String,Object> resultMap=new HashMap<>();
 
+        customLambdaQueryWrapper.ne(Custom::getIsDelete,1);
+        contactsLambdaQueryWrapper.ne(Contacts::getIsDelete,1);
+        businessOpportunityLambdaQueryWrapper.ne(BusinessOpportunity::getIsDelete,1);
+        salesOrderLambdaQueryWrapper.ne(SalesOrder::getIsDelete,1);
+        clueLambdaQueryWrapper.ne(Clue::getIsDelete,1);
         int customCount = customService.count(customLambdaQueryWrapper);
         int contactsCount = contactsService.count(contactsLambdaQueryWrapper);
         int businessOpportunityCount = businessOpportunityService.count(businessOpportunityLambdaQueryWrapper);
@@ -1045,6 +1050,11 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
         double salesOrdersPrice = salesOrders.stream().filter(i->i.getPrice()!=null).mapToDouble(s -> s.getPrice().doubleValue()).sum();
         Integer clueCount = clueMapper.selectCount(clueLambdaQueryWrapper);
 
+        customLambdaQueryWrapper1.ne(Custom::getIsDelete,1);
+        contactsLambdaQueryWrapper1.ne(Contacts::getIsDelete,1);
+        businessOpportunityLambdaQueryWrapper1.ne(BusinessOpportunity::getIsDelete,1);
+        salesOrderLambdaQueryWrapper1.ne(SalesOrder::getIsDelete,1);
+        clueLambdaQueryWrapper1.ne(Clue::getIsDelete,1);
         int customCount1 = customService.count(customLambdaQueryWrapper1);
         int contactsCount1 = contactsService.count(contactsLambdaQueryWrapper1);
         int businessOpportunityCount1 = businessOpportunityService.count(businessOpportunityLambdaQueryWrapper1);
@@ -1154,6 +1164,8 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
             }
         }
         Map<String, Object> customDataSummary = customService.getDataSummary(companyId, startDate, endDate, userId, targetUserIds);
+        Integer newCloseDealNum = salesOrderMapper.getNewCloseDealNum(companyId,startDate,endDate,userId,targetUserIds);
+        customDataSummary.put("closeDealNum",newCloseDealNum);
         Map<String, Object> businessOpportunityDataSummary =businessOpportunityService.getDataSummary(companyId, startDate, endDate, userId, targetUserIds);
         Map<String, Object> clueDataSummary =clueMapper.getDataSummary(companyId, startDate, endDate, userId, targetUserIds);
         Map<String,Object> resultMap=new HashMap<>();

+ 5 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java

@@ -1070,7 +1070,10 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
             return msg;
         }
         LambdaUpdateWrapper<Task> luw = new LambdaUpdateWrapper<>();
-        luw.set(Task::getStatus,taskDto.getStatus()).eq(Task::getId,taskDto.getId());
+        luw.set(Task::getStatus,taskDto.getStatus())
+                .set(Task::getStartDate,taskDto.getStartDate())
+                .set(Task::getEndDate,taskDto.getEndDate())
+                .eq(Task::getId,taskDto.getId());
         taskMapper.update(null,luw);
         TaskLog taskLog = new TaskLog();
         taskLog.setUserId(user.getId()).setTaskId(taskDto.getId()).setUserName(user.getName())
@@ -1301,6 +1304,7 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                 Contacts contacts = contactsMapper.selectById(task.getContactsId());
                 if (contacts!=null){
                     tasKVo.setContactsName(contacts.getName());
+                    tasKVo.setContactsPhone(contacts.getPhone());
                 }
             }
             if (task.getClueId()!=null){

+ 1 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/VisitPlanServiceImpl.java

@@ -148,6 +148,7 @@ public class VisitPlanServiceImpl extends ServiceImpl<VisitPlanMapper, VisitPlan
 
         }else{
             //新增
+            visitPlan.setInchargerId(user.getId());
             visitPlan.setCompanyId(user.getCompanyId());
             visitPlan.setCorpwxUserid(user.getCorpwxUserid());
 //            Long delayTime = 0L;

+ 20 - 20
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/ClueMapper.xml

@@ -59,7 +59,7 @@
         from clue c
         left join sys_dict sd on c.customer_level_id = sd.id
         where
-            c.company_id = #{companyId} and is_delete = #{isDelete} and c.is_bo = 0
+            c.company_id = #{companyId} and is_delete = #{isDelete}
         <if test="inchargerId != null and inchargerId != ''  ">
            and c.incharger_id =#{inchargerId}
         </if>
@@ -104,7 +104,7 @@
     <select id="list1" resultType="com.management.platform.entity.Clue">
         select c.id,
         c.company_id,
-        (select company_name from company where company_id = c.id) companyName,
+        (select company.company_name from company where c.company_id = company.id) companyName,
         c.clue_name,
         c.clue_source_id,
         c.phone,
@@ -130,7 +130,7 @@
         from clue c
         left join sys_dict sd on c.customer_level_id = sd.id
         where
-        c.company_id = #{clue.companyId} and c.is_delete = #{clue.isDelete} and c.is_bo = 0
+        c.company_id = #{clue.companyId} and c.is_delete = #{clue.isDelete}
         and (c.incharger_id in
         (SELECT id from `user` WHERE department_id = (SELECT department_id from `user` WHERe id = #{userId}))
         or c.incharger_id is null)
@@ -160,13 +160,13 @@
         </if>
         ORDER BY
         <choose>
-            <when test="isDesc == null">
+            <when test="clue.isDesc == null">
                 c.id DESC
             </when>
-            <when test="isDesc == 0">
+            <when test="clue.isDesc == 0">
                 sd.seq ASC, c.id DESC
             </when>
-            <when test="isDesc == 1">
+            <when test="clue.isDesc == 1">
                 sd.seq DESC, c.id DESC
             </when>
             <otherwise>
@@ -178,7 +178,7 @@
     <select id="list2" resultType="com.management.platform.entity.Clue">
         select c.id,
         c.company_id,
-        (select company_name from company where c.company_id = c.id) companyName,
+        (select company_name from company where c.company_id = company.id) companyName,
         c.clue_name,
         c.clue_source_id,
         c.phone,
@@ -204,7 +204,7 @@
         from clue c
         left join sys_dict sd on c.customer_level_id = sd.id
         where
-        c.company_id = #{clue.companyId} and c.is_delete = #{clue.isDelete} and c.is_bo = 0
+        c.company_id = #{clue.companyId} and c.is_delete = #{clue.isDelete}
         and (c.incharger_id = #{userId} or c.incharger_id is null)
         <if test="clue.inchargerId != null and clue.inchargerId != ''  ">
           and c.incharger_id =#{clue.inchargerId}
@@ -251,7 +251,7 @@
         select count(*)
         from clue c
         where
-        company_id = #{companyId} and is_delete = #{isDelete} and is_bo = 0
+        company_id = #{companyId} and is_delete = #{isDelete}
         <if test="inchargerId != null and inchargerId != ''  ">
             and incharger_id = #{inchargerId}
         </if>
@@ -282,7 +282,7 @@
         COUNT(c.id)
         from clue c
         where
-        c.company_id = #{clue.companyId} and c.is_delete = #{clue.isDelete} and c.is_bo = 0
+        c.company_id = #{clue.companyId} and c.is_delete = #{clue.isDelete}
         and c.incharger_id in
         (SELECT id from `user` WHERE department_id = (SELECT department_id from `user` WHERe id = #{userId}))
         and c.incharger_id is null
@@ -316,7 +316,7 @@
             count(c.id)
         from clue c
         where
-        c.company_id = #{clue.companyId} and c.is_delete = #{clue.isDelete} and c.is_bo = 0
+        c.company_id = #{clue.companyId} and c.is_delete = #{clue.isDelete}
         and (c.incharger_id = #{userId} or c.incharger_id is null)
         <if test="clue.inchargerId != null and clue.inchargerId != ''  ">
             and c.incharger_id =#{clue.inchargerId}
@@ -369,8 +369,8 @@
         where company_id =#{companyId}
     </select>
     <select id="getAlllist1" resultType="com.management.platform.entity.Clue">
-        select id,
-               clue_name
+        select c.id,
+               c.clue_name
         from clue c
                  left join sys_dict sd on c.customer_level_id = sd.id
         where
@@ -408,7 +408,7 @@
         c.plate5,
         c.create_time,
         c.create_id,c.need_pin,c.pin_time,
-        (select company_name from company where c.company_id = id) companyName,
+        (select company.company_name from company where c.company_id = company.id) companyName,
         (select name from `user` where id = c.incharger_id) inchargerName,
         (select name from `user` where id = c.create_id) createName,
         (select name from sys_dict where c.clue_source_id = id and code = 'ClueSources') clueSourceValue,
@@ -417,7 +417,7 @@
         from clue c
         left join sys_dict sd on c.customer_level_id = sd.id
         where
-        c.company_id = #{companyId} and is_delete = #{isDelete} and c.is_bo = 0
+        c.company_id = #{companyId} and is_delete = #{isDelete}
         <if test="inchargerId != null and inchargerId != ''  ">
             and c.incharger_id =#{inchargerId}
         </if>
@@ -462,7 +462,7 @@
     <select id="list1ByPin" resultType="com.management.platform.entity.Clue">
         select c.id,
         c.company_id,
-        (select company_name from company where company_id = c.id) companyName,
+        (select company.company_name from company where c.company_id = company.id) companyName,
         c.clue_name,
         c.clue_source_id,
         c.phone,
@@ -488,9 +488,9 @@
         from clue c
         left join sys_dict sd on c.customer_level_id = sd.id
         where
-        c.company_id = #{clue.companyId} and c.is_delete = #{clue.isDelete} and c.is_bo = 0
+        c.company_id = #{clue.companyId} and c.is_delete = #{clue.isDelete}
         and (c.incharger_id in
-        (SELECT id from `user` WHERE department_id = (SELECT department_id from `user` WHERe id = #{userId}))
+        (SELECT id from `user` WHERE department_id = (SELECT department_id from `user` where id = #{userId}))
         or c.incharger_id is null)
         <if test="clue.inchargerId != null and clue.inchargerId != ''  ">
             and  c.incharger_id =#{clue.inchargerId}
@@ -536,7 +536,7 @@
     <select id="list2ByPin" resultType="com.management.platform.entity.Clue">
         select c.id,
         c.company_id,
-        (select company_name from company where c.company_id = c.id) companyName,
+        (select company.company_name from company where c.company_id = company.id) companyName,
         c.clue_name,
         c.clue_source_id,
         c.phone,
@@ -562,7 +562,7 @@
         from clue c
         left join sys_dict sd on c.customer_level_id = sd.id
         where
-        c.company_id = #{clue.companyId} and c.is_delete = #{clue.isDelete} and c.is_bo = 0
+        c.company_id = #{clue.companyId} and c.is_delete = #{clue.isDelete}
         and (c.incharger_id = #{userId} or c.incharger_id is null)
         <if test="clue.inchargerId != null and clue.inchargerId != ''  ">
             and c.incharger_id =#{clue.inchargerId}

+ 3 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/CustomMapper.xml

@@ -369,7 +369,9 @@
     </select>
 
     <select id="getDataSummary" resultType="java.util.Map">
-        SELECT COUNT(*) newNum,SUM(close_deal=1) closeDealNum FROM custom
+        SELECT COUNT(*) newNum
+             <!-- ,SUM(close_deal=1) closeDealNum  -->
+        FROM custom
         WHERE company_id=#{companyId} and is_delete=0
         <if test="startDate!=null and startDate!='' and endDate!=null and endDate!=''">
             and DATE_FORMAT(create_time,'%Y-%m-%d') BETWEEN #{startDate} AND #{endDate}

+ 17 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/SalesOrderMapper.xml

@@ -39,5 +39,22 @@
     <sql id="Base_Column_List">
         id, company_id, order_name, order_code, custom_id, business_opportunity_id, price, contacts_id, type, place_time, order_start_date, order_end_date, received_payment, un_received_payment, received_status, custom_signer, company_signer, incharger_id, remark, create_time, creator_id, is_delete, status, plate1, plate2, plate3, plate4, plate5, update_time
     </sql>
+    <select id="getNewCloseDealNum" resultType="java.lang.Integer">
+        select count(distinct custom_id)
+        from sales_order
+        WHERE company_id=#{companyId} and is_delete=0
+        <if test="startDate!=null and startDate!='' and endDate!=null and endDate!=''">
+            and DATE_FORMAT(create_time,'%Y-%m-%d') BETWEEN #{startDate} AND #{endDate}
+        </if>
+        <if test="userId!=null and userId!=''">
+            and incharger_id=#{userId}
+        </if>
+        <if test="list!=null and list.size()>0">
+            and incharger_id in
+            <foreach collection="list" separator="," open="(" close=")" item="item">
+                #{item}
+            </foreach>
+        </if>
+    </select>
 
 </mapper>

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

@@ -482,8 +482,10 @@ public class ReportController {
                 projectAuditorId[i] = null;
             }
         } else if (projectAuditorId.length < projectId.length) {
-            //自动扩充数组大小
-            projectAuditorId = Arrays.copyOf(projectAuditorId, projectId.length);
+            //数组大小不对,后端无法确定项目和审核人的对应关系,必须前端全部传递过来
+            HttpRespMsg msg = new HttpRespMsg();
+            msg.setError("请检查每个项目的审核人是否设置");
+            return msg;
         }
 
         if (overtimeHours == null) {

+ 5 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskMapper.xml

@@ -235,7 +235,7 @@
     </select>
     <select id="getTaskPlanRealData" resultType="java.util.Map">
         SELECT task.id,task.`name`,task_executor.id as teId, DATE_FORMAT(task.`end_date`, '%Y-%m-%d') as endDate, task_executor.`plan_hours` as planHours,task.plan_cost as planCost,
-        (SELECT IFNULL(SUM(working_time),0) FROM report WHERE report.`task_id` = task.id AND report.`state` = 1) AS realHours,
+        (SELECT IFNULL(SUM(working_time),0) FROM report WHERE report.`task_id` = task.id AND report.`state` = 1  and report.creator_id = task_executor.executor_id) AS realHours,
         task_executor.executor_id as executorId,task_executor.executor_name AS executorName,
         IF(task_executor.real_cost = 0, task.plan_cost, task_executor.real_cost) AS realCost,
         task.`task_status` as taskStatus, task.`task_type` as taskType,
@@ -709,7 +709,8 @@
     <select id="getProjectAllTaskTimeCost"
             resultType="com.management.platform.entity.vo.ProjectTaskTimeCostVO">
         SELECT task.id as taskId,ifnull(task_executor.`plan_hours`,0) as planHours,
-        (SELECT IFNULL(SUM(working_time),0) FROM report WHERE report.`task_id` = task.id AND report.`state` = 1) AS realHours,
+        (SELECT IFNULL(SUM(working_time),0) FROM report WHERE report.`task_id` = task.id AND report.`state` = 1
+                                                          and report.creator_id = task_executor.executor_id) AS realHours,
         task_executor.executor_id as executorId
         FROM task
         LEFT JOIN project ON project.id = task.`project_id`
@@ -722,7 +723,8 @@
         from
             (
                 SELECT task.project_id,task.id as taskId,ifnull(task_executor.`plan_hours`,0) as planHours,
-                       (SELECT IFNULL(SUM(working_time),0) FROM report WHERE report.`task_id` = task.id AND report.`state` = 1) AS realHours,
+                       (SELECT IFNULL(SUM(working_time),0) FROM report
+                        WHERE report.`task_id` = task.id AND report.`state` = 1 and report.creator_id = task_executor.executor_id) AS realHours,
                        task_executor.executor_id as executorId
                 FROM task
                          LEFT JOIN project ON project.id = task.`project_id`

+ 9 - 2
fhKeeper/formulahousekeeper/timesheet/build/utils.js

@@ -51,9 +51,16 @@ exports.cssLoaders = function (options) {
         postcss: generateLoaders(),
         less: generateLoaders('less'),
         sass: generateLoaders('sass', { indentedSyntax: true }),
-        scss: generateLoaders('sass'),
+        // scss: generateLoaders('sass'),
         stylus: generateLoaders('stylus'),
-        styl: generateLoaders('stylus')
+        styl: generateLoaders('stylus'),
+        scss: generateLoaders('sass').concat({
+            loader: 'sass-resources-loader',
+            options: {
+                //你自己的scss全局文件的路径
+                resources: path.resolve(__dirname, '../src/assets/scss/_common.scss')
+            }
+        })
     }
 }
 

+ 4 - 0
fhKeeper/formulahousekeeper/timesheet/build/webpack.base.conf.js

@@ -68,6 +68,10 @@ module.exports = {
                 limit: 10000,
                 name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
                 }
+            },
+            {
+                test: /\.scss$/,
+                loaders: ['style', 'css', 'sass']
             }
         ]
     }

+ 12 - 12
fhKeeper/formulahousekeeper/timesheet/config/index.js

@@ -1,20 +1,20 @@
 var path = require('path')
 
 //  var ip = '192.168.2.12'
-// var ip = '47.101.180.183'
+var ip = '47.101.180.183'
 // var ip = '47.100.37.243'
 // var ip = '192.168.10.2'
-// var ip = '192.168.2.3' 
+// var ip = '192.168.2.11' 
 
-var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
-for (var i in ifaces) {
-    for (var j in ifaces[i]) {
-        var val = ifaces[i][j]
-        if (val.family === 'IPv4' && val.address !== '127.0.0.1') {
-            ip = val.address
-        }
-    }
-}
+// var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
+// for (var i in ifaces) {
+//     for (var j in ifaces[i]) {
+//         var val = ifaces[i][j]
+//         if (val.family === 'IPv4' && val.address !== '127.0.0.1') {
+//             ip = val.address
+//         }
+//     }
+// }
 // 1196735749
 module.exports = {
   build: {
@@ -73,5 +73,5 @@ module.exports = {
         // },
     },
     cssSourceMap: false
-  }
+  },
 }

+ 35 - 2
fhKeeper/formulahousekeeper/timesheet/src/App.vue

@@ -7,13 +7,18 @@
             </keep-alive> -->
             <router-view v-if="isRouterAlive"/>
 		</transition>
+
+        <themeCom :color="color" @color-update="colorChange" v-show="false" />
 	</div>
 </template>
 
 <script>
+    import themeCom from "@/components/themeCom";
     export default {
         name: 'app',
-        components: {},
+        components: {
+            themeCom
+        },
         //父组件中返回要传给下级的数据
 	  	provide() {
 	    	return {
@@ -23,15 +28,40 @@
 		data(){
 			return{
 				isRouterAlive:true,
-                firstTourFalse: false
+                firstTourFalse: false,
+                color: '#409EFF'
 			}
 		},
+        created() {
+            const windowsUrl = location.href
+            if(windowsUrl.indexOf('style=new') > 0) {
+                localStorage.setItem('themes', 'dark')
+            }
+            const themes = localStorage.getItem('themes') || 'default'
+            this.switchThemes(themes)
+        },
         mounted() {
             this.firstTourFalse = localStorage.getItem('firstTourFalse') | true
             // 监听页面刷新事件
 			window.addEventListener('unload', this.setItemFirstTourFalse)
         },
 		methods:{
+            switchThemes(type) {
+                const colorType = { 
+                    'default': '#409EFF',
+                    'dark': '#075985',
+                }
+                setTimeout(() => {
+                    this.colorChange(colorType[type])
+                }, 0)
+                if(type == 'dark') {
+                    document.title = '临床工时通'
+                }
+                window.document.documentElement.setAttribute( "data-theme", type );
+            },
+            colorChange(color) {
+                this.color = color;
+            },
             setItemFirstTourFalse() {
                 localStorage.setItem('firstTourFalse', firstTourFalse)
             },
@@ -48,6 +78,9 @@
     .v-tour__target--highlighted {
         box-shadow: 0 0 0 99999px rgba(0,0,0,.4) !important;
     }
+    .el-tree-resetStyles .el-tree-node__content {
+        height: auto !important;
+    }
 </style>
 
 <style lang="scss">

+ 0 - 0
fhKeeper/formulahousekeeper/timesheet/src/assets/scss/_common.scss


+ 40 - 0
fhKeeper/formulahousekeeper/timesheet/src/assets/scss/_handle.scss

@@ -0,0 +1,40 @@
+@import "./_themes.scss";
+
+//遍历主题map
+@mixin themeify {
+  @each $theme-name, $theme-map in $themes {
+    //!global 把局部变量强升为全局变量
+    $theme-map: $theme-map !global;
+    //判断html的data-theme的属性值  #{}是sass的插值表达式
+    //& sass嵌套里的父容器标识   @content是混合器插槽,像vue的slot
+    [data-theme="#{$theme-name}"] & {
+      @content;
+    }
+  }
+}
+
+//声明一个根据Key获取颜色的function
+@function themed($key) {
+  @return map-get($theme-map, $key);
+}
+
+//获取背景颜色
+@mixin background_color($color) {
+  @include themeify {
+    background-color: themed($color) !important;
+  }
+}
+
+//获取字体颜色
+@mixin font_color($color) {
+  @include themeify {
+    color: themed($color) !important;
+  }
+}
+
+//获取边框颜色
+@mixin border_color($color) {
+  @include themeify {
+    border-color: themed($color) !important;
+  }
+}

+ 15 - 0
fhKeeper/formulahousekeeper/timesheet/src/assets/scss/_themes.scss

@@ -0,0 +1,15 @@
+$themes: (
+  default: (
+    background_color: #409EFF,
+    color: #409EFF,
+    color1: #9ED0FF,
+    border_color: #409EFF,
+  ),
+
+  dark: (
+    background_color: #075985,
+    color: #075985,
+    color1: #4f85a1,
+    border_color: #075985,
+  ),
+);

+ 2 - 1
fhKeeper/formulahousekeeper/timesheet/src/components/cascadeSelection.vue

@@ -144,6 +144,7 @@ export default {
 }
 </script>
 <style scoped lang='scss'>
+@import "../assets/scss/handle";
 .cascadeSelection {
     position: relative;
     max-height: 40px;
@@ -186,7 +187,7 @@ export default {
     }
 
     .input:focus {
-        border-color: #409EFF;
+        @include border_color("border_color");
     }
 
     .placeholderColor {

+ 3 - 3
fhKeeper/formulahousekeeper/timesheet/src/components/cascader.vue

@@ -386,8 +386,9 @@ export default {
 </script>
 
 <style scoped lang="scss">
+    @import "../assets/scss/handle";
     .selectDiv {
-        border-color: #409EFF !important;
+        @include background_color("background_color");
     }
     .disabledTrue {
         background: #F5F7FA !important;
@@ -480,10 +481,9 @@ export default {
     }
     .liHover {
         background-color: #F5F7FA;
-        // color: #409eff !important;
     }
     .liHover .idxspan {
-        color: #409eff !important;
+        @include font_color("color");
         font-weight: 700;
     }
     .idxspan span{

+ 2 - 2
fhKeeper/formulahousekeeper/timesheet/src/components/cascaderOption.vue

@@ -138,6 +138,7 @@ export default {
 </script>
 
 <style scoped lang="scss">
+    @import "../assets/scss/handle";
     .childComponents {
         width: 200px;
         position: absolute;
@@ -186,10 +187,9 @@ export default {
     }
     .liHover {
         background-color: #F5F7FA;
-        // color: #409eff !important;
     }
     .liHover .idxspan {
-        color: #409eff !important;
+        @include font_color("color");
         font-weight: 700;
     }
     .transitionBoxUl span {

+ 3 - 2
fhKeeper/formulahousekeeper/timesheet/src/components/select.vue

@@ -581,6 +581,7 @@ export default {
 </script>
 
 <style scoped lang="scss">
+    @import "../assets/scss/handle";
     .selectBox {
         position: fixed;
         z-index: 999;
@@ -595,7 +596,7 @@ export default {
         display: inline-block;
     }
     .selectDiv {
-        border-color: #409EFF !important;
+        @include border_color("border_color");
     }
     .disabledTrue {
         background: #F5F7FA !important;
@@ -713,7 +714,7 @@ export default {
         justify-content: space-between;
     }
     .hoverSpanHover {
-        color: #409eff;
+        @include font_color("color");
         font-weight: 700;
     }
     .spanFllat {

+ 14 - 10
fhKeeper/formulahousekeeper/timesheet/src/components/taskComponent.vue

@@ -125,7 +125,7 @@
                 <!-- 任务进展 -->
                 <template v-if="!timelabel || isRelationItem">
                 
-                <p ><i class="iconfont firerock-icontree" style="color:#20A0ff;margin-left:10px;">{{ $t('taskprogress') }}</i>
+                <p ><i class="iconfont firerock-icontree themeFontColor" style="margin-left:10px;">{{ $t('taskprogress') }}</i>
                     <span ref="addPro" style="display: block; float:right;"><el-link @click="addprogress">{{ $t('addtaskprogress') }}</el-link></span>
                 </p>
                 <!-- 任务进展展示 -->
@@ -145,7 +145,7 @@
                     style="margin:10px 0 0 0">
                     </el-input>
                     <h4 style="font-weight: normal;">{{ $t('tixiang') }}{{checkLists.length}}</h4>
-                    <i class="el-icon-circle-plus pron_i" style="font-size: 28px;color: #409EFF;" @click="addI(0)"></i>
+                    <i class="el-icon-circle-plus pron_i themeFontColor" style="font-size: 28px;" @click="addI(0)"></i>
                     <div class="remind" ref="addRem" style="display: none">
                         <el-checkbox-group v-model="checkboxGrounp" v-for="item in users" :key="item.id">
                             <p>
@@ -241,7 +241,7 @@
                 </el-dialog>
                 </template>
                 <!-- 子任务/关联任务 -->
-                <p ><i class="iconfont firerock-icontree" style="color:#20A0ff;margin-left:10px;">{{timelabel && !isRelationItem ? $t('guanlian') : $t('zirwu')}}</i>
+                <p ><i class="iconfont firerock-icontree themeFontColor" style="margin-left:10px;">{{timelabel && !isRelationItem ? $t('guanlian') : $t('zirwu')}}</i>
                     <el-link style="float:right;" @click="addRelation" v-if="timelabel && !isRelationItem">{{ $t('associatedTask') }}</el-link>
                     <el-link style="float:right;" @click="addSubTask" v-else>{{ $t('addingsubtask') }}</el-link>
                 </p>
@@ -259,7 +259,7 @@
                     </el-table-column>
                     <el-table-column prop="taskName" :label="$t('biao-ti')" >
                         <template slot-scope="scope">
-                            <el-tooltip class="item" effect="dark" :content="scope.row.taskName" placement="top" style="cursor:pointer;color:#409eff;">
+                            <el-tooltip class="item themeFontColor" effect="dark" :content="scope.row.taskName" placement="top" style="cursor:pointer;">
                                 <span style="overflow: hidden;text-overflow:ellipsis;white-space: nowrap;" > {{scope.row.taskName}}</span>
                             </el-tooltip>
                         </template>
@@ -318,7 +318,7 @@
         <!-- 关联文件列表 -->
         <template v-if="isEditFile">
             <div style="width:100%;margin:1em 0;">
-                <i class="iconfont firerock-icontree" style="color:#20A0ff;margin-left:10px;">{{ $t('jiafuchengguo') }}</i>
+                <i class="iconfont firerock-icontree themeFontColor" style="margin-left:10px;">{{ $t('jiafuchengguo') }}</i>
                 <el-link @click="relationFileClick()" style="float:right;margin-left:10px">{{ $t('associatedfiles') }}</el-link>
                 <el-upload style="float:right;" action="#" :http-request="uploadFileClick" :show-file-list="false" :multiple="false">
                     <el-link>{{ $t('uoloadFiles') }}</el-link>
@@ -666,6 +666,7 @@ import 'quill/dist/quill.snow.css'
 import 'quill/dist/quill.bubble.css'
 // 导入富文本
 import { quillEditor } from 'vue-quill-editor'
+import { getThemeColor } from '@/utils/commonMethod.js'
 
 export default {
   props: {
@@ -685,7 +686,7 @@ export default {
     selectPersonnel
   },
   data() {
-    return {
+    return { 
         startNum: 0,
         endNum: 5,
         shownumber: 5,
@@ -720,7 +721,7 @@ export default {
         {id:5,name:this.$t('createdthetask')},{id:6,name:this.$t('missionIwason')},{id:7,name:this.$t('todaytask')},{id:8,name:this.$t('taskthatisoverdue')}],
         importanceList:[{id:0,name:this.$t('yi-ban')},{id:1,name:this.$t('zhong-yao')},{id:2,name:this.$t('jin-ji')},],
         taskTypeList:[{id:0,name:this.$t('other.task'), icon:"iconfont firerock-iconrenwu"},{id:1,name:this.$t('other.milestone'),icon:"iconfont firerock-iconicon-"},{id:2,name:this.$t('risk'),icon:"iconfont firerock-iconfengxian"}],
-        taskTypeColor:['#20A0FF','#8613ad','#bf0404'],
+        taskTypeColor:[getThemeColor(),'#8613ad','#bf0404'],
         taskTypeIcon:['iconfont firerock-iconrenwu','iconfont firerock-iconicon-','iconfont firerock-iconfengxian'],
         taskStatusList:[this.$t('ongoing'),this.$t('state.completed'),this.$t('state.undone')],
         //优先级
@@ -836,11 +837,11 @@ export default {
             size: 'large',
             type: 'primary',
             icon: 'el-icon-circle-check',
-            color: '#409EFF'
+                color: '#409EFF'
             }, {
             content: this.$t('withinthetimelimit'),
             timestamp: this.$t('hoursago8'),
-            color: '#F87872'
+                color: '#F87872'
             }],
         ProgressList: [],
         checkboxGrounp: [], // 选中人的数据
@@ -934,7 +935,6 @@ export default {
     this.getSapServiceList()
 
     this.timess();
-    
   },
   methods: {
     // 容器的滚动事件
@@ -2250,6 +2250,10 @@ export default {
 </script>
 
 <style lang="scss" scoped>
+@import "../assets/scss/handle";
+.themeFontColor {
+    @include font_color("color");
+}
 .editingTask {
     display: flex;
     flex-wrap: wrap;

+ 140 - 0
fhKeeper/formulahousekeeper/timesheet/src/components/themeCom.vue

@@ -0,0 +1,140 @@
+<template>
+  <el-color-picker v-model="theme" />
+</template>
+<script>
+const version = require("element-ui/package.json").version;
+const ORIGINAL_THEME = "#409EFF";
+export default {
+  props: {
+    color: String,
+  },
+  data() {
+    return {
+      chalk: "",
+      theme: "",
+    };
+  },
+  computed: {
+    defaultTheme() {
+      return this.color;
+    },
+  },
+  watch: {
+    defaultTheme: {
+      handler: function (val, oldVal) {
+        this.theme = val;
+      },
+      immediate: true,
+    },
+    async theme(val) {
+      const oldVal = this.chalk ? this.theme : ORIGINAL_THEME;
+      if (typeof val !== "string") return;
+      const themeCluster = this.getThemeCluster(val.replace("#", ""));
+      const originalCluster = this.getThemeCluster(oldVal.replace("#", ""));
+      if (!this.chalk) {
+        await this.getCSSString();
+      }
+      this.getHandler(themeCluster);
+      const styles = [].slice
+        .call(document.querySelectorAll("style"))
+        .filter((style) => {
+          const text = style.innerText;
+          return (
+            new RegExp(oldVal, "i").test(text) && !/Chalk Variables/.test(text)
+          );
+        });
+      styles.forEach((style) => {
+        const { innerText } = style;
+        if (typeof innerText !== "string") return;
+        style.innerText = this.updateStyle(
+          innerText,
+          originalCluster,
+          themeCluster
+        );
+      });
+      this.$emit("color-update", val);
+    },
+  },
+  methods: {
+    // 修改element-ui主题样式表颜色
+    updateStyle(style, oldCluster, newCluster) {
+      let newStyle = style;
+      oldCluster.forEach((color, index) => {
+        newStyle = newStyle.replace(new RegExp(color, "ig"), newCluster[index]);
+      });
+      return newStyle;
+    },
+    // 生成新的样式表
+    getHandler(themeCluster) {
+      const originalCluster = this.getThemeCluster(
+        ORIGINAL_THEME.replace("#", "")
+      );
+      const newStyle = this.updateStyle(
+        this.chalk,
+        originalCluster,
+        themeCluster
+      );
+      let styleTag = document.getElementById("chalk-style");
+      if (!styleTag) {
+        styleTag = document.createElement("style");
+        styleTag.setAttribute("id", "chalk-style");
+        document.head.appendChild(styleTag);
+      }
+      styleTag.innerText = newStyle;
+    },
+    // 获取element-ui主题样式
+    getCSSString() {
+      const url = `https://unpkg.com/element-ui@${version}/lib/theme-chalk/index.css`;
+      return new Promise((resolve) => {
+        const xhr = new XMLHttpRequest();
+        xhr.onreadystatechange = () => {
+          if (xhr.readyState === 4 && xhr.status === 200) {
+            this.chalk = xhr.responseText.replace(/@font-face{[^}]+}/, "");
+            resolve();
+          }
+        };
+        xhr.open("GET", url);
+        xhr.send();
+      });
+    },
+    getThemeCluster(theme) {
+      const tintColor = (color, tint) => {
+        let red = parseInt(color.slice(0, 2), 16);
+        let green = parseInt(color.slice(2, 4), 16);
+        let blue = parseInt(color.slice(4, 6), 16);
+        if (tint === 0) {
+          return [red, green, blue].join(",");
+        } else {
+          red += Math.round(tint * (255 - red));
+          green += Math.round(tint * (255 - green));
+          blue += Math.round(tint * (255 - blue));
+          red = red.toString(16);
+          green = green.toString(16);
+          blue = blue.toString(16);
+          return `#${red}${green}${blue}`;
+        }
+      };
+      const shadeColor = (color, shade) => {
+        let red = parseInt(color.slice(0, 2), 16);
+        let green = parseInt(color.slice(2, 4), 16);
+        let blue = parseInt(color.slice(4, 6), 16);
+        red = Math.round((1 - shade) * red);
+        green = Math.round((1 - shade) * green);
+        blue = Math.round((1 - shade) * blue);
+        red = red.toString(16);
+        green = green.toString(16);
+        blue = blue.toString(16);
+        return `#${red}${green}${blue}`;
+      };
+      const clusters = [theme];
+      for (let i = 0; i <= 9; i++) {
+        clusters.push(tintColor(theme, Number((i / 10).toFixed(2))));
+      }
+      clusters.push(shadeColor(theme, 0.1));
+      return clusters;
+    },
+  },
+};
+</script>
+
+

+ 13 - 0
fhKeeper/formulahousekeeper/timesheet/src/utils/commonMethod.js

@@ -0,0 +1,13 @@
+/**
+ * 获取主题色
+ * @returns string 颜色
+ */
+export function getThemeColor() {
+  const type = localStorage.getItem('themes') || 'default'
+  console.log(type, '<=========== 看看')
+  const colorType = {
+    'default': '#409EFF',
+    'dark': '#075985',
+  }
+  return colorType[type]
+}

+ 2 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/Expire.vue

@@ -41,6 +41,7 @@ export default {
 </script>
 
 <style lang="scss" scoped>
+@import "../assets/scss/handle";
 .expire {
     height: 100%;
     .expire_par {
@@ -71,7 +72,7 @@ export default {
                 font-weight: bold;
             }
             .expire_tips {
-                color: #409eff;
+                @include font_color("color");
                 font-size: 18px;
             }
             .expire_text {

+ 8 - 3
fhKeeper/formulahousekeeper/timesheet/src/views/Home.vue

@@ -8,7 +8,8 @@
                 <img v-if="collapsed" class="headImg" src="../assets/image/head_logo.png" />
                 <div v-else class="logo-sys">
                     <img class="headImg" src="../assets/image/head_logo.png" />
-                    <span>{{$t('workingHoursHousekeeper')}}</span>
+                    <!-- <span>{{$t('workingHoursHousekeeper')}}</span> -->
+                    <span>{{ themesType == 'dark' ? '临床工时通' : '工时管家' }}</span>
                 </div>
             </el-col>
             <el-col :span="6">
@@ -285,6 +286,7 @@
         inject:['reloads'],
         data() {
             return {
+                themesType: 'default',
                 textLength: 16,
                 companyForm:{
                     name: '',
@@ -938,6 +940,7 @@
         },
         mounted() {
             var ua = navigator.userAgent.toLowerCase();
+            this.themesType = localStorage.getItem('themes') || 'default';
             if (ua.indexOf("wxwork") > 0) {
                 this.isCorpWX = true;
             } 
@@ -1012,6 +1015,7 @@
 </script>
 
 <style scoped lang="scss">
+@import "../assets/scss/handle";
 .contentMask {
     width: 100%;
     height: 100%;
@@ -1047,7 +1051,7 @@
         .header {
             height: 60px;
             line-height: 60px;
-            background: #20a0ff;
+            @include background_color("background_color");
             color: #fff;
             position: relative;
             .userinfo {
@@ -1204,7 +1208,8 @@
     }
 
     .popover-title {
-        color: #409eff;
+        // color: #409eff;
+        @include font_color("color");
         padding-bottom: 8px;
     }
 

+ 16 - 10
fhKeeper/formulahousekeeper/timesheet/src/views/Login.vue

@@ -39,16 +39,12 @@
                 </el-form>
             </div>
             <el-dialog :title="$t('shi-yong-shuo-ming')" :visible.sync="dialogVisible" width="500px">
-                <p><a style="color:#409EFF;text-decoration:none" href="upload/工时管家使用说明_基础版.docx" download="工时管家使用说明_基础版.docx" 
+                <p><a class="themeFontColor" style="text-decoration:none" href="upload/工时管家使用说明_基础版.docx" download="工时管家使用说明_基础版.docx" 
                             target="_blank">工时管家使用说明_基础版.docx</a></p>
-                <p><a style="color:#409EFF;text-decoration:none" href="upload/工时管家使用说明_项目管理专业版.docx" download="工时管家使用说明_项目管理专业版.docx" 
+                <p><a class="themeFontColor" style="text-decoration:none" href="upload/工时管家使用说明_项目管理专业版.docx" download="工时管家使用说明_项目管理专业版.docx" 
                             target="_blank">工时管家使用说明_项目管理专业版.docx</a></p>
-                <p><a style="color:#409EFF;text-decoration:none" href="upload/工时管家使用说明_建筑工程专业版.docx" download="工时管家使用说明_建筑工程专业版.docx" 
+                <p><a class="themeFontColor" style="text-decoration:none" href="upload/工时管家使用说明_建筑工程专业版.docx" download="工时管家使用说明_建筑工程专业版.docx" 
                             target="_blank">工时管家使用说明_建筑工程专业版.docx</a></p>
-                <!-- <p><a style="color:#409EFF;text-decoration:none" href="upload/工时管家使用说明_项目经理.docx" download="工时管家使用说明_项目经理.docx" 
-                            target="_blank">工时管家使用说明_项目经理.docx</a></p>
-                <p><a style="color:#409EFF;text-decoration:none" href="upload/工时管家使用说明_普通员工.docx" download="工时管家使用说明_普通员工.docx" 
-                            target="_blank">工时管家使用说明_普通员工.docx</a></p> -->
                 
             </el-dialog>
             <el-dialog :title="$t('qiYeWeiXinSaoMaDengLu')" :visible.sync="wxworkFlg" width="500px">
@@ -99,6 +95,10 @@
         },
         created() {
             // this.langChange()
+            const windowsUrl = location.href
+            if(windowsUrl.indexOf('style=new') > 0) {
+                localStorage.setItem('themes', 'dark')
+            }
             if (localStorage.userInfo != null) {
                 var user = JSON.parse(localStorage.userInfo);
                 if(user.moduleList.length > 0) {
@@ -609,6 +609,10 @@
 </script>
 
 <style lang="scss" scoped>
+    @import "../assets/scss/handle";
+    .themeFontColor {
+        @include font_color("color");
+    }
     .qiweix {
         width: 100%;
         display: flex;
@@ -630,7 +634,8 @@
         .externalLanding_img {
             width: 30px;
             height: 30px;
-            border: 1px solid #409EFF;
+            border: 1px solid;
+            @include border_color("border_color");
             border-radius: 50%;
             position: relative;
             overflow: hidden;
@@ -668,9 +673,10 @@
                 // height: 380px;
                 padding: 25px 35px 25px 35px;
                 background: #fff;
-                border: 1px solid #eaeaea;
+                border: 0px solid #eaeaea;
                 box-shadow: 0 0 5px #cac6c6;
-                border-top: 10px solid #20a0ff;
+                border-top: 10px solid;
+                @include border_color("border_color");
                 margin:auto;
                 .title {
                     font-size: 20px;

+ 4 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/Register.vue

@@ -176,6 +176,7 @@
 </script>
 
 <style lang="scss" scoped>
+@import "../assets/scss/handle";
     .login {
         height: 100%;
         .login-par {
@@ -199,9 +200,10 @@
                 height: 495px;
                 padding: 25px 35px 25px 35px;
                 background: #fff;
-                border: 1px solid #eaeaea;
+                border: 1px solid;
                 box-shadow: 0 0 5px #cac6c6;
-                border-top: 10px solid #20a0ff;
+                border-top: 10px solid;
+                @include border_color("border_color");
                 margin:auto;
                 .title {
                     font-size: 20px;

+ 11 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/awayOffice/awayOffice.vue

@@ -4,7 +4,7 @@
         <h3><i class="iconfont firerock-iconbaoxiao" style="padding-right: 10px"></i>{{ $t('navigation.evectionManagement') }}</h3>
         <el-divider ></el-divider>
         <el-col :span="12">
-            <el-menu default-active="1" class="el-menu-vertical-demo" @select="staffs" background-color="#ffffff" text-color="#666666" active-text-color="#20A0FF" style="width:100%">
+            <el-menu default-active="1" class="el-menu-vertical-demo" @select="staffs" background-color="#ffffff" text-color="#666666" :active-text-color="themeColor" style="width:100%">
                 <el-menu-item index="1" v-if="permissions.awayOfficeFil">
                     <i class="iconfont firerock-icontianbao"></i>
                     <span slot="title">{{ $t('businesstriisallowed') }}</span>
@@ -411,7 +411,7 @@
                 <el-col :span="18" >
                     <el-scrollbar style="height:100%;border:1px solid #dddddd;margin-right:20px;" >
                         <div class="tree" :style="'height:'+ (tableHeight-120) + 'px'">
-                            <div style="padding:5px;color:#333;" v-if="depData != null">{{ $t('setup') }} &lt;<span style="color:#20a0ff;">
+                            <div style="padding:5px;color:#333;" v-if="depData != null">{{ $t('setup') }} &lt;<span class="themeFontColor">
                                 <!-- {{depData.label}} -->
                                 <span v-if="user.userNameNeedTranslate != 1">{{depData.label}}</span>
                                 <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='departmentName' :openid='depData.label'></TranslationOpenDataText></span>
@@ -447,7 +447,7 @@
                                     <icon class="iconfont firerock-iconInsertLine addNode" @click="showNodeDialog(index+1)"></icon>
                                     <icon class="iconfont firerock-iconright"></icon>
                                 </span>
-                                <icon class="iconfont firerock-iconApp_New_Line" style="color:#20A0FF;"></icon>
+                                <icon class="iconfont firerock-iconApp_New_Line themeFontColor"></icon>
                                 {{ $t('approvaltocomplete') }} 
                             </div>
                             <div style="width:100%;margin:0 auto;margin-bottom:30px;position: absolute;bottom: 0px;text-align: center; ">
@@ -752,6 +752,7 @@ import citys from '../../assets/citys/shju.json'
  // 引入自定义级联组件
 import vueCascader from "@/components/cascader.vue"
 
+import { getThemeColor } from '@/utils/commonMethod.js'
 export default {
     components: {
         selectCat,
@@ -773,6 +774,7 @@ export default {
         //         }
         //     };
         return {
+            themeColor: getThemeColor(),
             denyDialogV: false,
             denyInfo: {},
             summaryLoading: false,
@@ -2120,6 +2122,11 @@ export default {
 </script>
 
 <style lang="scss" scoped>
+@import "../../assets/scss/handle";
+
+.themeFontColor {
+    @include font_color("color");
+}
 .sidebars {
     height: 100%;
     position: absolute;
@@ -2198,7 +2205,7 @@ export default {
   cursor:pointer;
 }
 .addNode:hover {
-  color:#20a0ff;
+    @include font_color("color");
 }
 .detailsScope{
     font-size: 12px;

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

@@ -379,12 +379,17 @@ export default {
 </script>
 
 <style lang="scss" scoped>
+@import "../../assets/scss/handle";
+
+.themeFontColor {
+    @include font_color("color");
+}
 .addNode {
     cursor: pointer;
 }
 
 .addNode:hover {
-    color: #20a0ff;
+    @include font_color("color");
 }
 
 .panel {

+ 17 - 8
fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue

@@ -12,7 +12,7 @@
               @select="staffs"
               background-color="#ffffff" 
               text-color="#666666"
-              active-text-color="#20A0FF"
+              :active-text-color="themeColor"
               style="width:200px">
               <el-submenu index="1">
                 <template slot="title">
@@ -822,7 +822,7 @@
                 </el-table-column>
                 <el-table-column prop="timelinessRate" :label="$t('timelyreportingrate')" min-width="200" align="center">
                   <template slot-scope="scope">
-                    <el-link v-if="scope.row.dataList != null" style="color:#409eff;" @click="timelyDetail(scope.row.dataList)">{{scope.row.timelinessRate}}</el-link>
+                    <el-link v-if="scope.row.dataList != null" class="themeFontColor"  @click="timelyDetail(scope.row.dataList)">{{scope.row.timelinessRate}}</el-link>
                     <span v-else>{{scope.row.timelinessRate}}</span>
                   </template>
                 </el-table-column>
@@ -834,7 +834,7 @@
                     </el-tooltip>
                   </template>
                   <template slot-scope="scope">
-                    <el-link v-if="scope.row.dataList != null" style="color:#409eff;" @click="timelyDetail(scope.row.dataList)">{{scope.row.timelinessRateWithLeave}}</el-link>
+                    <el-link v-if="scope.row.dataList != null" class="themeFontColor"  @click="timelyDetail(scope.row.dataList)">{{scope.row.timelinessRateWithLeave}}</el-link>
                     <span v-else>{{scope.row.timelinessRateWithLeave}}</span>
                   </template>
                 </el-table-column>
@@ -1827,6 +1827,8 @@ import EchartsEchar from "@/components/echartsEchar.vue"
 import { getGroupConsumption, fixedTaskGrouping, fixedGrouping } from "./echartsData"
 import PackTables from "./packetConsumption/tables.vue"
 
+import { getThemeColor } from '@/utils/commonMethod.js'
+
 export default {
   name: "expense",
   components: {
@@ -1838,6 +1840,7 @@ export default {
   props: {},
   data() {
     return {
+      themeColor: getThemeColor(),
       screeningCondition: { // 筛选条件的判断
         project: [4, 8, 9, 10, 11, 14, 15, 17, 19, 20, 21, 22,28], // 项目筛选条件 (不等于)
         months: [14, 15], // 月份筛选条件 (等于)
@@ -4673,7 +4676,11 @@ export default {
   },
 };
 </script>
-<style scoped>
+<style scoped lang="scss">
+@import "../../assets/scss/handle";
+.themeFontColor {
+  @include font_color("color");
+}
 .pagingTable {
   flex: 1 1 0%;
   overflow: hidden;
@@ -4692,7 +4699,7 @@ export default {
   align-items: center;
   justify-content: space-between;
   .text {
-    color: #409EFF;
+    @include font_color("color");
     margin-right: 20px;
   }
 }
@@ -4860,11 +4867,13 @@ export default {
   color: #C0BFBF
 }
 .side:hover {
-  border-right: 2px solid #20A0FF;
+  border-right: 2px solid;
+  @include border_color("border_color");
 }
 .side:hover .spans {
-  border: 1px solid #20A0FF;
-  background: #20A0FF;
+  border: 1px solid ;
+  @include border_color("border_color");
+  @include background_color("background_color");
 }
 .side:hover .spans i{
   color: #fff;

+ 3 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/desktop/detail.vue

@@ -249,6 +249,7 @@ export default {
 </script>
 
 <style lang="scss" scoped>
+@import "../../assets/scss/handle";
 .toolbar {
   .el-form-item {
     font-size: 14px;
@@ -268,7 +269,7 @@ export default {
     font-size: 18px;
   }
   .workHours {
-    color: #20a0ff;
+    @include font_color("color");
     font-size: 18px;
   }
 }
@@ -285,7 +286,7 @@ export default {
         margin-top: 13px;
         line-height: 12px;
         i {
-          color: #9ed0ff;
+          @include font_color("color1");
           margin-right: 5px;
         }
         .time {

+ 3 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/desktop/index.vue

@@ -190,11 +190,12 @@
 </script>
 
 <style lang="scss" scoped>
+@import "../../assets/scss/handle";
     .nowTime {
         height: 35px;
         line-height: 28px;
         font-size: 18px;
-        color: #20a0ff;
+        @include font_color("color");
         margin-left: 10px;
             i {
                 margin-right: 10px;
@@ -225,7 +226,7 @@
                 margin-top: 13px;
                 line-height: 12px;
                 i {
-                color: #9ed0ff;
+                @include font_color("color");
                 margin-right: 5px;
                 }
                 .time {

+ 9 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue

@@ -7,7 +7,7 @@
         <el-divider></el-divider>
         <el-col :span="12">
           <el-menu default-active="1-1" class="el-menu-vertical-demo" @select="staffs" background-color="#ffffff"
-            text-color="#666666" active-text-color="#20A0FF" style="width:100%">
+            text-color="#666666" :active-text-color="themeColor" style="width:100%">
             <el-submenu index="1">
               <template slot="title">
                 <i class="iconfont firerock-icontianbao"></i>
@@ -1093,6 +1093,7 @@ import selectCat from "@/components/select.vue"
 // 引入自定义级联组件
 import vueCascader from "@/components/cascader.vue"
 
+import { getThemeColor } from '@/utils/commonMethod.js'
 export default {
   name: "expense",
   components: {
@@ -1102,6 +1103,7 @@ export default {
   props: {},
   data() {
     return {
+      themeColor: getThemeColor(),
       pdfIcons: require('@/assets/image/pdfIcon.png'),
       showSingleAudit: false,
       auditTypeItem: { auditType: 0 },
@@ -2660,6 +2662,7 @@ export default {
 };
 </script>
 <style scoped lang="scss">
+@import "../../assets/scss/handle";
 .tups {
   width: 100%;
   height: 25px;
@@ -2848,12 +2851,14 @@ export default {
 }
 
 .side:hover {
-  border-right: 2px solid #20A0FF;
+  border-right: 2px solid;
+  @include border_color("border_color");
 }
 
 .side:hover .spans {
-  border: 1px solid #20A0FF;
-  background: #20A0FF;
+  border: 1px solid;
+  @include border_color("border_color");
+  @include background_color("background_color");
 }
 
 .side:hover .spans i {

+ 18 - 8
fhKeeper/formulahousekeeper/timesheet/src/views/leave/list.vue

@@ -4,7 +4,7 @@
       <h3><i class="iconfont firerock-iconbaoxiao" style="padding-right: 10px"></i>{{ $t('navigation.askForLeaveManagement') }}</h3>
       <el-divider ></el-divider>
       <el-col :span="12">
-        <el-menu :default-active="isSyncData ? '7' : '1'" class="el-menu-vertical-demo" @select="staffs" background-color="#ffffff" text-color="#666666" active-text-color="#20A0FF" style="width:100%">
+        <el-menu :default-active="isSyncData ? '7' : '1'" class="el-menu-vertical-demo" @select="staffs" background-color="#ffffff" text-color="#666666" :active-text-color="themeColor" style="width:100%">
           <!-- <el-submenu index="1">
             <template slot="title">
               <i class="iconfont firerock-icontianbao"></i>
@@ -468,7 +468,7 @@
         <el-col :span="18" >
             <el-scrollbar style="height:100%;border:1px solid #dddddd;margin-right:20px;" >
             <div class="tree" :style="'height:'+ (tableHeight-120) + 'px'">
-                <div style="padding:5px;color:#333;" v-if="depData != null">{{ $t('setup') }} &lt;<span style="color:#20a0ff;">
+                <div style="padding:5px;color:#333;" v-if="depData != null">{{ $t('setup') }} &lt;<span class="themeFontColor">
                   <!-- {{depData.label}} -->
                     <span v-if="user.userNameNeedTranslate != 1">{{depData.label}}</span>
                     <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='departmentName' :openid='depData.label'></TranslationOpenDataText></span>
@@ -508,7 +508,7 @@
                     </span>
 
                     <!--结束点 -->
-                    <icon class="iconfont firerock-iconApp_New_Line" style="color:#20A0FF;"></icon>
+                    <icon class="iconfont firerock-iconApp_New_Line themeFontColor"></icon>
                     {{ $t('approvaltocomplete') }} 
                   </div>
 
@@ -810,6 +810,7 @@ import selectPersonnel from '../../components/selectPersonnel.vue';
  // 引入自定义级联组件
 import vueCascader from "@/components/cascader.vue"
 
+import { getThemeColor } from '@/utils/commonMethod.js'
 export default {
   name: "expense",
   components: {
@@ -845,6 +846,7 @@ export default {
         }
     };
     return {
+      themeColor: getThemeColor(),
       denyDialogV: false,
       denyInfo: {},
       addFormRules: {
@@ -2358,12 +2360,18 @@ export default {
   }
 };
 </script>
-<style scoped>
+<style scoped lang="scss">
+@import "../../assets/scss/handle";
+
+.themeFontColor {
+    @include font_color("color");
+}
+
 .addNode {
   cursor:pointer;
 }
 .addNode:hover {
-  color:#20a0ff;
+  @include font_color("color");
 }
 .apls {
   width: 200px;
@@ -2530,11 +2538,13 @@ export default {
   color: #C0BFBF
 }
 .side:hover {
-  border-right: 2px solid #20A0FF;
+  border-right: 2px solid;
+  @include border_color("border_color");
 }
 .side:hover .spans {
-  border: 1px solid #20A0FF;
-  background: #20A0FF;
+  border: 1px solid;
+  @include border_color("border_color");
+  @include background_color("background_color");
 }
 .side:hover .spans i{
   color: #fff;

+ 2 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/message.vue

@@ -234,6 +234,7 @@ export default {
 </script>
 
 <style scoped>
+@import "../assets/scss/handle";
 .message-div {
   cursor: pointer;
   padding: 5px 0;
@@ -254,7 +255,7 @@ export default {
 }
 
 .message-title {
-  color: #409eff;
+  @include font_color("color");
 }
 
 .message-article {

+ 7 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/project/detail.vue

@@ -11,7 +11,7 @@
                     <span class="workName">{{detailName}}</span>
                 </el-form-item>
                 <el-form-item style="float:right;">
-                    <span style="font-size:18px;">{{ $t('xiang-mu-cheng-ben') }}:<span style="color:#20a0ff;">{{cost.toFixed(2)}}{{ $t('yuan') }}</span></span>
+                    <span style="font-size:18px;">{{ $t('xiang-mu-cheng-ben') }}:<span class="themeFontColor">{{cost.toFixed(2)}}{{ $t('yuan') }}</span></span>
                 </el-form-item>
             </el-form>
         </el-col>
@@ -275,6 +275,11 @@
 </script>
 
 <style lang="scss" scoped>
+    @import "../../assets/scss/handle";
+
+    .themeFontColor {
+        @include font_color("color");
+    }
     .toolbar {
         .el-form-item {
             font-size: 14px;
@@ -294,7 +299,7 @@
             font-size: 18px;
         }
         .workHours {
-            color: #20a0ff;
+            @include font_color("color");
             font-size: 18px;
         }
     }

+ 7 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/project/detailDep.vue

@@ -21,7 +21,7 @@
                     <span style="color:#666;">{{ $t('message.period') }} :{{startDate}}<span style="padding-left:5px;padding-right:5px;">{{ $t('other.to') }}</span>{{endDate}}</span>
                 </el-form-item>
                 <el-form-item style="float:right;">
-                    <span style="font-size:18px;">{{ $t('buMenChengBen') }}<span style="color:#20a0ff;">{{cost.toFixed(2)}} {{ $t('yuan') }}</span></span>
+                    <span style="font-size:18px;">{{ $t('buMenChengBen') }}<span class="themeFontColor">{{cost.toFixed(2)}} {{ $t('yuan') }}</span></span>
                 </el-form-item>
             </el-form>
         </el-col> 
@@ -382,6 +382,11 @@
 </script>
 
 <style lang="scss" scoped>
+    @import "../../assets/scss/handle";
+
+    .themeFontColor {
+        @include font_color("color");
+    }
     .toolbar {
         .el-form-item {
             font-size: 14px;
@@ -401,7 +406,7 @@
             font-size: 18px;
         }
         .workHours {
-            color: #20a0ff;
+            @include font_color("color");
             font-size: 18px;
         }
     }

+ 13 - 6
fhKeeper/formulahousekeeper/timesheet/src/views/project/fileCenter.vue

@@ -3,7 +3,7 @@
         <div :style="'background:#f7f7f7;padding:10px 50px;height:'+tableHeight+'px;'">
         <!--工具条-->
         <div style="padding: 20px;background:#fff;border-bottom:1px solid #ddd;font-weight:500;font-size:15px;">
-            <span @click="viewFolder(null)" style="color: #409EFF;cursor: pointer;">{{ $t('library') }}</span>
+            <span @click="viewFolder(null)" class="themeFontColor" style="cursor: pointer;">{{ $t('library') }}</span>
             <span v-for="path in pathList" :key="path.id" @click="viewFolder(path)" class="mianbaoxie"> <i class="el-icon-arrow-right jianto"></i> {{path.documentName}}</span>
             <span style="float:right;">
                 <!-- <el-link type="primary" :underline="false" v-if="list.length
@@ -238,15 +238,21 @@
         </div>
     </section>
 </template>
-<style scoped>
+<style scoped lang="scss">
+@import "../../assets/scss/handle";
+
+.themeFontColor {
+    @include font_color("color");
+}
 .fileTypeIcon {
-    color:#20a0ff;font-size:20px;
+    @include font_color("color");
+    font-size:20px;
 }
 .mianbaoxie {
     color: #909399;
 }
 .mianbaoxie:hover {
-    color: #409EFF;
+    @include font_color("color");
     cursor: pointer;
 }
 .mianbaoxie:hover .jianto {
@@ -299,13 +305,14 @@
   margin: 10px 0;
 }
 .cardOn {
-    border: 1px solid #409EFF;
+    border: 1px solid;
+    @include border_color("border_color");
 }
 .cardIcon {
     display: inline-block; 
     margin-left: 10px;
     width: 20px;
-    color: #409EFF;
+    @include font_color("color");
     font-size: 16px;
     font-weight: bold;
 }

+ 2 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/gantt.vue

@@ -232,7 +232,8 @@ export default {
     @import "~dhtmlx-gantt/codebase/dhtmlxgantt.css";
     .person_line {
       background:#8ecaf8;
-      border: #20a0ff 1px solid 
+      border: 1px solid;
+      @include border_color("border_color");
     }
     /* .gantt_tooltip{
       z-index: 10000;

+ 0 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/project/info.vue

@@ -712,10 +712,6 @@
     </div>
 </template>
 <style scoped>
-.fileTypeIcon {
-    color:#20a0ff;font-size:20px;
-
-}
 .box {
     background:#fff;border: 1px solid #eeeeee;border-radius:5px;padding:10px;
 }

+ 15 - 5
fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

@@ -1503,7 +1503,7 @@
                 </el-table-column>
                 <el-table-column prop="workContext" :label="$t('gongZuoNeiRong')" align="center">
                     <template slot-scope="scope">
-                        <a v-if="scope.row.id" @click="workContextDig=true,getWorkContextList(scope.row.id)" style="color:#409EFF">{{ $t('datamaintenance') }}</a>
+                        <a v-if="scope.row.id" @click="workContextDig=true,getWorkContextList(scope.row.id)" class="themeFontColor">{{ $t('datamaintenance') }}</a>
                         <a v-else>{{ $t('datamaintenance') }}</a>
                     </template>
                 </el-table-column>
@@ -1691,7 +1691,7 @@
                     </el-form>
                 </el-tab-pane>
                 <el-tab-pane :label="$t('creatintemplate')" name="template">
-                    <el-card class="template_box" :style="t.selected?'border: 1px solid #409eff;':''" v-for="(t,tIndex) in groupTemplateList" :key="t.id"  @click.native="choseTemplate(tIndex)">
+                    <el-card :class="`template_box ${t.selected ? 'themeBorderColor' : ''}`" :style="t.selected?'border: 1px solid;':''" v-for="(t,tIndex) in groupTemplateList" :key="t.id"  @click.native="choseTemplate(tIndex)">
                         <div>
                         <el-row >
                             <el-col :span="22">
@@ -1710,7 +1710,7 @@
                                 </div>
                             </el-col>
                             <el-col :span="2">
-                                <i class="el-icon-check" v-show="t.selected" style="font-size:20px;color:#409eff;margin-top:12px;"></i>
+                                <i class="el-icon-check themeFontColor" v-show="t.selected" style="font-size:20px;margin-top:12px;"></i>
                             </el-col>
                             
                         </el-row>
@@ -6245,6 +6245,15 @@ a {
 </script>
 
 <style lang="scss" scoped>
+@import "../../assets/scss/handle";
+
+.themeFontColor {
+    @include font_color("color");
+}
+
+.themeBorderColor {
+    @include border_color("border_color");
+}
 .synchronization {
     display: flex;
     justify-content: space-between;
@@ -6293,12 +6302,13 @@ a {
 // 111
 
 </style>
-<style>
+<style lang="scss" scoped>
+@import "../../assets/scss/handle";
 .managePopperClass{
     width: 190px;
 }
 .el-dropdown-link {
-    color: #409EFF;
+    @include font_color("color");
 }
 .customdropdown{
     margin-left: 10px;

+ 6 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/projectForm.vue

@@ -3,7 +3,7 @@
       <div class="til">
           <p>{{ $t('navigation.projectFormSettings') }}</p>
           <div style="display: flex;">
-             <p style="cursor:pointer;margin-left: 30px;color: #20A0FF;" @click="addJa($t('tianJiaBiaoDanZiDuan'), 'ruleForm')"><i class="el-icon-circle-plus-outline"></i>{{ $t('addTian') }}</p>
+             <p style="cursor:pointer;margin-left: 30px;" class="themeFontColor" @click="addJa($t('tianJiaBiaoDanZiDuan'), 'ruleForm')"><i class="el-icon-circle-plus-outline"></i>{{ $t('addTian') }}</p>
           </div>
       </div>
       <div class="tabl">
@@ -194,6 +194,11 @@ export default {
 </script>
 
 <style scoped lang="scss">
+@import "../../assets/scss/handle";
+
+.themeFontColor {
+    @include font_color("color");
+}
 .infrastructures {
     color: #666;
     .til {

+ 25 - 16
fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue

@@ -130,10 +130,6 @@
                     <span :style="'background:#f0f0f0;width:1px;height:'+tableHeight+'px;'" @click="toggleGroup">
                         
                     </span>
-                    <!-- <span :style="'width:10px;height:'+tableHeight+'px;float:left;text-align:center;vertical-align:middle;'" @click="toggleGroup">
-                        <span :style="'width:1px;background:#20A0FF;height:'+tableHeight+'px;float:left;'"></span>
-                        <i class="el-icon-d-arrow-left" ></i>
-                    </span> -->
 
                     <!-- 增加侧边栏的点击效果 -->
                     <div class="sidebar" @click="retract()">
@@ -499,7 +495,7 @@
                             <!-- 任务进展 -->
                             <template v-if="!timelabel || isRelationItem">
                             
-                            <p ><i class="iconfont firerock-icontree" style="color:#20A0ff;margin-left:10px;">{{ $t('taskprogress') }}</i>
+                            <p ><i class="iconfont firerock-icontree themeFontColor" style="margin-left:10px;">{{ $t('taskprogress') }}</i>
                                 <span ref="addPro" style="display: block; float:right;"><el-link @click="addprogress">{{ $t('addtaskprogress') }}</el-link></span>
                             </p>
                             <!-- 任务进展展示 -->
@@ -522,7 +518,7 @@
 
                                 <h4 style="font-weight: normal;">{{ $t('tixiang') }}{{checkLists.length}}</h4>
 
-                                <i class="el-icon-circle-plus pron_i" style="font-size: 28px;color: #409EFF;" @click="addI(0)"></i>
+                                <i class="el-icon-circle-plus pron_i themeFontColor" style="font-size: 28px;" @click="addI(0)"></i>
 
                                 <div class="remind" ref="addRem" style="display: none">
                                     <el-checkbox-group v-model="checkboxGrounp" v-for="item in users" :key="item.id">
@@ -629,7 +625,7 @@
                             </template>
 
                             <!-- 子任务/关联任务 -->
-                            <p ><i class="iconfont firerock-icontree" style="color:#20A0ff;margin-left:10px;">{{timelabel && !isRelationItem ? $t('guanlian') : $t('zirwu')}}</i>
+                            <p ><i class="iconfont firerock-icontree themeFontColor" style=";margin-left:10px;">{{timelabel && !isRelationItem ? $t('guanlian') : $t('zirwu')}}</i>
                                 <el-link style="float:right;" @click="addRelation" v-if="timelabel && !isRelationItem">{{ $t('associatedTask') }}</el-link>
                                 <el-link style="float:right;" @click="addSubTask" v-else>{{ $t('addingsubtask') }}</el-link>
                             </p>
@@ -647,7 +643,7 @@
                                 </el-table-column>
                                 <el-table-column prop="taskName" :label="$t('biao-ti')" >
                                     <template slot-scope="scope">
-                                        <el-tooltip class="item" effect="dark" :content="scope.row.taskName" placement="top" style="cursor:pointer;color:#409eff;">
+                                        <el-tooltip class="item themeFontColor" effect="dark" :content="scope.row.taskName" placement="top" style="cursor:pointer;">
                                             <span style="overflow: hidden;text-overflow:ellipsis;white-space: nowrap;" > {{scope.row.taskName}}</span>
                                         </el-tooltip>
                                     </template>
@@ -708,7 +704,7 @@
                     <!-- 关联文件列表 -->
                     <template v-if="isEditFile">
                         <div style="width:100%;margin:1em 0;">
-                            <i class="iconfont firerock-icontree" style="color:#20A0ff;margin-left:10px;">{{ $t('jiafuchengguo') }}</i>
+                            <i class="iconfont firerock-icontree themeFontColor" style="margin-left:10px;">{{ $t('jiafuchengguo') }}</i>
                             <el-link @click="relationFileClick()" style="float:right;margin-left:10px">{{ $t('associatedfiles') }}</el-link>
                             <el-upload style="float:right;" action="#" :http-request="uploadFileClick" :show-file-list="false" :multiple="false">
                                 <el-link>{{ $t('uoloadFiles') }}</el-link>
@@ -1078,7 +1074,7 @@
                     </el-form>
                 </el-tab-pane>
                 <el-tab-pane :label="$t('creatintemplate')" name="template">
-                    <el-card class="template_box" :style="t.selected?'border: 1px solid #409eff;':''" v-for="(t,tIndex) in groupTemplateList" :key="t.id"  @click.native="choseTemplate(tIndex)">
+                    <el-card :class="`template_box ${t.selected ? 'themeBorderColor' : ''}`" :style="t.selected?'border: 1px solid;':''" v-for="(t,tIndex) in groupTemplateList" :key="t.id"  @click.native="choseTemplate(tIndex)">
                         <div>
                         <el-row >
                             <el-col :span="22">
@@ -1097,7 +1093,7 @@
                                 </div>
                             </el-col>
                             <el-col :span="2">
-                                <i class="el-icon-check" v-show="t.selected" style="font-size:20px;color:#409eff;margin-top:12px;"></i>
+                                <i class="el-icon-check themeFontColor" v-show="t.selected" style="font-size:20px;margin-top:12px;"></i>
                             </el-col>
                             
                         </el-row>
@@ -1309,6 +1305,8 @@
     import { quillEditor } from 'vue-quill-editor'
     import { error } from 'dingtalk-jsapi';
     import delete$ from 'dingtalk-jsapi/api/biz/cspace/delete';
+
+    import { getThemeColor } from '@/utils/commonMethod.js'
     let id=1;
     export default {
         name: "two-list-headerslots",
@@ -1360,7 +1358,7 @@
                 {id:5,name:this.$t('createdthetask')},{id:6,name:this.$t('missionIwason')},{id:7,name:this.$t('todaytask')},{id:8,name:this.$t('taskthatisoverdue')}],
                 importanceList:[{id:0,name:this.$t('yi-ban')},{id:1,name:this.$t('zhong-yao')},{id:2,name:this.$t('jin-ji')},],
                 taskTypeList:[{id:0,name:this.$t('other.task'), icon:"iconfont firerock-iconrenwu"},{id:1,name:this.$t('other.milestone'),icon:"iconfont firerock-iconicon-"},{id:2,name:this.$t('risk'),icon:"iconfont firerock-iconfengxian"}],
-                taskTypeColor:['#20A0FF','#8613ad','#bf0404'],
+                taskTypeColor:[getThemeColor(),'#8613ad','#bf0404'],
                 taskTypeIcon:['iconfont firerock-iconrenwu','iconfont firerock-iconicon-','iconfont firerock-iconfengxian'],
                 taskStatusList:[this.$t('ongoing'),this.$t('state.completed'),this.$t('state.undone')],
                 //优先级
@@ -4019,6 +4017,16 @@
 </script>
 
 <style lang="scss" scoped>
+@import "../../assets/scss/handle";
+
+.themeFontColor {
+    @include font_color("color");
+}
+
+.themeBorderColor {
+    @include border_color("border_color");
+}
+
 .hideCompletedFelx {
     display: flex;
     align-items: center;
@@ -4048,7 +4056,8 @@
     }
 </style>
 
-<style >
+<style lang="scss">
+@import "../../assets/scss/handle";
 .taskCardCircleBox{
     padding-left: 5px;
     display: flex;
@@ -4226,11 +4235,11 @@ overflow: auto;
     position: relative;
 }
 .sidebar:hover {
-    background: #20a0ff;
+    @include background_color("background_color");
 }
 .sidebar:hover .etui {
-    background: #20a0ff;
-    border: #20a0ff;
+    @include background_color("background_color");
+    @include border_color("border_color");
     color: #fff;
 }
 .etui {

+ 9 - 3
fhKeeper/formulahousekeeper/timesheet/src/views/projectApproval/projectApproval.vue

@@ -239,7 +239,7 @@
                                 <el-divider></el-divider>
                                 <template>
                                     <div style="padding: 7px 0; ">
-                                        <span style="color: #409EFF; font-size: 17px;">{{'审核人'}}</span>
+                                        <span class="themeFontColor" style="font-size: 17px;">{{'审核人'}}</span>
                                     </div>
                                     <!-- <div >
                                         <div  v-for="(item, index) in pointList" :key="index" >
@@ -1619,7 +1619,13 @@ methods: {
 },
 }
 </script>
-<style scoped>
+<style scoped lang="scss">
+@import "../../assets/scss/handle";
+
+.themeFontColor {
+    @include font_color("color");
+}
+
 .toolbar_formitem_n1{
     margin-right: 0 !important;
 }
@@ -1644,7 +1650,7 @@ methods: {
     background: #dddddd;
 }
 .on {
-    color: #409EFF;
+    @include font_color("color");
 }
 .gray_label {
     color:#999 !important;

Різницю між файлами не показано, бо вона завелика
+ 23 - 17
fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue


+ 6 - 5
fhKeeper/formulahousekeeper/timesheet/src/views/task/list.vue

@@ -426,7 +426,8 @@
         </el-dialog>
     </section>
 </template>
-<style scoped>
+<style scoped lang="scss">
+@import "../../assets/scss/handle";
 .input-with-select .el-input-group__prepend {
     background-color: #fff;
   }
@@ -457,7 +458,7 @@
     background: #dddddd;
 }
 .on {
-    color: #409EFF;
+    @include font_color("color");
 }
 .acl{
     display: inline-block;
@@ -473,7 +474,7 @@
     line-height: 0;
 }
 .cal {
-    color: #409EFF;
+    @include font_color("color");
     width: 300px;
     overflow: hidden;
     white-space: nowrap;
@@ -608,7 +609,7 @@ import { error } from 'dingtalk-jsapi';
     import 'quill/dist/quill.bubble.css'
     // 导入富文本
     import { quillEditor } from 'vue-quill-editor'
-
+import { getThemeColor } from '@/utils/commonMethod.js'
     export default {
         name: "two-list-headerslots",
         display: "Two list header slot",
@@ -742,7 +743,7 @@ import { error } from 'dingtalk-jsapi';
                 {id:5,name:this.$t('createdthetask')},{id:6,name:this.$t('missionIwason')},{id:7,name:this.$t('todaytask')},{id:8,name:this.$t('taskthatisoverdue')}],
                 importanceList:[{id:0,name:this.$t('yi-ban')},{id:1,name:this.$t('zhong-yao')},{id:2,name:this.$t('jin-ji')},],
                 taskTypeList:[{id:0,name:this.$t('other.task'), icon:"iconfont firerock-iconrenwu"},{id:1,name:this.$t('other.milestone'),icon:"iconfont firerock-iconicon-"},{id:2,name:this.$t('risk'),icon:"iconfont firerock-iconfengxian"}],
-                taskTypeColor:['#20A0FF','#8613ad','#bf0404'],
+                taskTypeColor:[getThemeColor(),'#8613ad','#bf0404'],
                 taskTypeIcon:['iconfont firerock-iconrenwu','iconfont firerock-iconicon-','iconfont firerock-iconfengxian'],
                 taskStatusList:[this.$t('ongoing'),this.$t('state.completed'),this.$t('state.undone')],
                 //优先级

+ 9 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

@@ -22,6 +22,7 @@
                 :draggable="adjustPosition"
                 :allow-drop="allowDrop"
                 @node-drop="nodeDrop"
+                class="el-tree-resetStyles"
                 style="padding-bottom:70px;"
                 :expand-on-click-node="false" accordion @node-click="handleNodeClick" :default-expanded-keys="jDarr" @node-expand="jieDian" @node-collapse="shutDown" @current-change="chufa">
                     <span class="custom-tree-node" style="position: relative;box-sizing: border-box;width: 10%;" slot-scope="{ node }" @mouseleave= mouseleave(data,$event) @mouseover= mouseover(data,$event)>
@@ -32,8 +33,8 @@
                           <span v-else>
                             {{ node.label }} <i v-if="node.data.ddDeptid != null" class="iconfont firerock-icondingding"></i>
                           </span>
-                          <span v-if="node.label != $t('lable.allStaff') && node.label != $t('lable.unassigned') && adjustPosition" class="treeIons">
-                            <i class="el-icon-s-operation" style="color: #409eff"></i>
+                          <span v-if="node.label != $t('lable.allStaff') && node.label != $t('lable.unassigned') && adjustPosition" class="treeIons themeFontColor">
+                            <i class="el-icon-s-operation"></i>
                           </span>
                         </span>
 
@@ -4104,6 +4105,10 @@ export default {
 
 </style>
 <style lang="scss" scoped>
+@import "../../assets/scss/handle";
+.themeFontColor {
+  @include font_color("color");
+}
 .imgFlex {
     display: flex;
     align-items: center;
@@ -4144,7 +4149,7 @@ export default {
             font-size: 15px;
             div {
                 float: right;
-                color: #20a0ff;
+                @include font_color("color");
                 font-size: 14px;
                 cursor: pointer;
             }
@@ -4158,7 +4163,7 @@ export default {
         height: 40px;
         line-height: 40px;
         font-size: 16px;
-        color: #20a0ff;
+        @include font_color("color");
         margin-left: 10px;
         cursor: pointer;
         i {

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

@@ -53,7 +53,7 @@
                                 </el-select>
                             </div>
                             <div>
-                                <el-tree :data="data" @node-click="handleNodeClick" @node-collapse="nodeChangeCollapse" @node-expand="nodeChangeExpand" ref="treeDataRef" :default-expanded-keys="nodeModelData" node-key="id" v-loading="dataLoading">
+                                <el-tree class="el-tree-resetStyles" :data="data" @node-click="handleNodeClick" @node-collapse="nodeChangeCollapse" @node-expand="nodeChangeExpand" ref="treeDataRef" :default-expanded-keys="nodeModelData" node-key="id" v-loading="dataLoading">
                                     <span class="custom-tree-node"  style="position: relative;box-sizing: border-box;width: 10%;" slot-scope="{ node, data}">
                                         <span style="padding-right: 50px;box-sizing: border-box;overflow:hidden;text-overflow:ellipsis;line-height: 36px; display: inline-block;">
                                             <TranslationOpenData :configurationItems="{ openType: node.data.children ? 'departmentName' : 'userName', openId: node.label, renderIndex: 0 }"/>
@@ -82,7 +82,7 @@
                                         <!-- 未通过 -->
                                         {{$t('state.notThrough')}}({{data.workingTime.toFixed(1) + 'h'}})
                                         </span>
-                                        <span v-if="data.isUser == 1 && data.state == 3" style="color:#409eff;font-size:13px">
+                                        <span v-if="data.isUser == 1 && data.state == 3" style="font-size:13px" class="themeFontColor">
                                         <!-- 待提交 -->
                                         {{$t('state.waitingsubmit')}}({{data.workingTime.toFixed(1) + 'h'}})
                                         </span>
@@ -347,7 +347,7 @@
                                         </el-timeline>
                                     </div>
                                 </div>
-                                <div v-if="hasMore && !listLoading" style="width:100%;font-size:17px;text-align:center;padding-bottom:15px;"><el-link @click="reqMore" :underline=false style="color:#20a0ff;">{{ $t('jiaZaiGengDuoRiBao') }}</el-link></div>
+                                <div v-if="hasMore && !listLoading" style="width:100%;font-size:17px;text-align:center;padding-bottom:15px;"><el-link @click="reqMore" :underline=false class="themeFontColor">{{ $t('jiaZaiGengDuoRiBao') }}</el-link></div>
                                 <!-- 简陋的无报告提示 -->
                                 <div v-if="reportList.length==0" style="width:100%;font-size:17px;text-align:center;color:#aaa;">{{curDate}}{{$t('other.noReportYet')}}</div>
                             </div>
@@ -441,7 +441,7 @@
                         v-if="!isBatch && user.companyId === 5978" icon="el-icon-refresh" 
                                 @click="refreshBeiSengAttendance(workForm.createDate)"></el-button>
                         
-                        <span v-if="user.companyId==5978" style="margin-left:5px;color:#20a0ff;"><i class="el-icon-warning"></i>{{$t('other.kaoqingTimeTip')}}</span>
+                        <span v-if="user.companyId==5978" style="margin-left:5px;" class="themeFontColor"><i class="el-icon-warning"></i>{{$t('other.kaoqingTimeTip')}}</span>
                     </el-form-item>
                     <!-- 000000 -->
                     <div v-for="(domain, index) in workForm.domains" :key="domain.id" :style="index>0?'margin-top:10px;':''">
@@ -9170,6 +9170,10 @@
 </script>
 
 <style lang="scss" scoped>
+@import "../../assets/scss/handle";
+.themeFontColor {
+    @include font_color("color");
+}
 .fillWeekDialogVisiCustom {
     width: 100%;
     height: 70vh;
@@ -9210,20 +9214,20 @@
     color:red;
 }
 .waitSubmitStyle{
-    color: #409eff;
+    @include font_color("color");
 }
 .chooseDate {
     .waiting {
-        color: #20a0ff;
+        @include font_color("color");
     }
     .filledReportStyle {
-        color:#20a0ff;
+        @include font_color("color");
     }
     .RejectStyle {
-        color: #20a0ff;
+        @include font_color("color");
     }
     .waitSubmitStyle{
-        color: #20a0ff;
+        @include font_color("color");
     }
 }
     .allDaily {
@@ -9249,12 +9253,12 @@
             width: 37px;
             height: 2px;
             left: 14px;
-            background: #20a0ff;
+            @include background_color("background_color");
         }
     }
     .one_daily {
         i {
-            color: #9ed0ff;
+            @include font_color("color1");
             margin-right: 5px;
         }
         .one_daily_body {
@@ -9363,11 +9367,11 @@
         transform: scale(1.2);
         position: relative;
         top: 0.5px;
-        color: #409eff;
+        @include font_color("color");
     }
     .approvalProcessBox .approvalProcessClick{
         cursor: pointer;
-        color: #409eff;
+        @include font_color("color");
         font-size: 14px;
     }
     .approvalProcessBox:hover .approvalProcessClick{

+ 7 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue

@@ -128,8 +128,8 @@
                                         </span>]
                                     </span>
                                     </b></p>
-                                    <p v-if="user.timeType.reportAuditType == 6" >{{ $t('shenHeLiuCheng') }}<span v-if="item.auditorList && item.auditorList.length == 1">{{ $t('yiCengShenHe') }}(<span style="color:#20A0ff;">{{ item.auditorList[0].name }}</span>)</span>
-                                    <span v-if="item.auditorList && item.auditorList.length == 2">{{ $t('liangCengShenHe') }}(<span style="color:#20A0ff;">{{ item.auditorList[0].name }}->{{ item.auditorList[1].name }}</span>)</span>
+                                    <p v-if="user.timeType.reportAuditType == 6" >{{ $t('shenHeLiuCheng') }}<span v-if="item.auditorList && item.auditorList.length == 1">{{ $t('yiCengShenHe') }}(<span class="themeFontColor">{{ item.auditorList[0].name }}</span>)</span>
+                                    <span v-if="item.auditorList && item.auditorList.length == 2">{{ $t('liangCengShenHe') }}(<span class="themeFontColor">{{ item.auditorList[0].name }}->{{ item.auditorList[1].name }}</span>)</span>
                                     <el-button size="small" @click="viewOneReport(item)" v-if="!item.auditorList">{{ $t('cha-kan') }}</el-button>
                                     </p>
                                     <p v-if="user.timeType.customDegreeActive==1 && (item.degree_id != null || item.multiDegrId != '[]')">{{user.timeType.customDegreeName}}:{{item.degreeName}}</p>
@@ -1269,6 +1269,11 @@
 </script>
 
 <style lang="scss" scoped>
+@import "../../assets/scss/handle";
+
+.themeFontColor {
+    @include font_color("color");
+}
 .propsbtn {
     display: inline-block;
     padding-left: 20px;

+ 8 - 3
fhKeeper/formulahousekeeper/timesheet/src/views/workflow/report.vue

@@ -28,7 +28,7 @@
         <el-col :span="18" >
             <el-scrollbar style="height:100%;border:1px solid #dddddd;margin-right:20px;" >
             <div class="tree" :style="'height:'+ (tableHeight-120) + 'px'">
-                <div style="padding:5px;color:#333;" v-if="depData != null">{{ $t('setup') }} &lt;<span style="color:#20a0ff;">
+                <div style="padding:5px;color:#333;" v-if="depData != null">{{ $t('setup') }} &lt;<span class="themeFontColor">
                     <span v-if="user.userNameNeedTranslate != 1">{{depData.label}}</span>
                     <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='departmentName' :openid='depData.label'></TranslationOpenDataText></span>
                     &gt;</span> {{ $t('workinghoursapprovalprocessofdirectstaff') }}
@@ -57,7 +57,7 @@
                     </span>
 
                     <!--结束点 -->
-                    <icon class="iconfont firerock-iconApp_New_Line" style="color:#20A0FF;"></icon>
+                    <icon class="iconfont firerock-iconApp_New_Line themeFontColor"></icon>
                     {{ $t('approvaltocomplete') }}
                     </div>
 
@@ -428,11 +428,16 @@
 </script>
 
 <style lang="scss" scoped>
+@import "../../assets/scss/handle";
+
+.themeFontColor {
+    @include font_color("color");
+}
 .addNode {
   cursor:pointer;
 }
 .addNode:hover {
-  color:#20a0ff;
+    @include font_color("color");
 }
 
 .panel {