ソースを参照

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

zhouyy 6 ヶ月 前
コミット
0276d40a5f
39 ファイル変更395 行追加274 行削除
  1. 18 11
      fhKeeper/formulahousekeeper/customerBuler-crm/index.html
  2. 48 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/translationComponent/personnelSearch/personnelSearch.vue
  3. 23 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/translationComponent/personnelSearch/type.d.ts
  4. 23 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/translationComponent/textTranslation/textTranslation.vue
  5. 4 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/main.ts
  6. 7 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/analysis/index.vue
  7. 3 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/header/header.vue
  8. 105 28
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/login.vue
  9. 1 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/team/index.vue
  10. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/store/index.ts
  11. 4 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/type.d.ts
  12. 18 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/utils/tools.ts
  13. 2 2
      fhKeeper/formulahousekeeper/customerBuler-crm/vite.config.ts
  14. 1 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/config/BeanConfig.java
  15. 3 3
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/AuthRedirectController.java
  16. 1 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ProjectController.java
  17. 2 2
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ReportController.java
  18. 1 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/UserController.java
  19. 2 2
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/WXController.java
  20. 15 164
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  21. 1 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/WxCorpInfoController.java
  22. 4 4
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  23. 4 4
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java
  24. 1 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/FeishuInfoServiceImpl.java
  25. 2 2
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/LeaveSheetServiceImpl.java
  26. 5 5
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  27. 8 8
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  28. 1 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/TaskProgressServiceImpl.java
  29. 4 4
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  30. 5 5
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  31. 1 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/util/MD5Util.java
  32. 5 5
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/util/SyncSapUtils.java
  33. 8 11
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/application.yml
  34. 10 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  35. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages.properties
  36. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages_en_US.properties
  37. 2 2
      fhKeeper/formulahousekeeper/timesheet/config/index.js
  38. 6 1
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  39. 44 0
      fhKeeper/formulahousekeeper/webttkuaiban/src/main/java/com/firerock/webttkuaiban/demos/controller/ArticleTemplateController.java

+ 18 - 11
fhKeeper/formulahousekeeper/customerBuler-crm/index.html

@@ -1,12 +1,19 @@
 <html lang="en">
-  <head>
-    <meta charset="UTF-8" />
-    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
-    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <title>客户管家</title>
-  </head>
-  <body>
-    <div id="app"></div>
-    <script type="module" src="/src/main.ts"></script>
-  </body>
-</html>
+
+<head>
+  <meta charset="UTF-8" />
+  <link rel="icon" type="image/svg+xml" href="/vite.svg" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+  <title>客户管家</title>
+</head>
+
+<body>
+  <div id="app"></div>
+  <script type="module" src="/src/main.ts"></script>
+  
+  <!-- 引入企业微信js -->
+  <script src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js" referrerpolicy="origin"></script>
+  <script src="https://open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js" referrerpolicy="origin"></script>
+</body>
+
+</html>

+ 48 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/components/translationComponent/personnelSearch/personnelSearch.vue

@@ -0,0 +1,48 @@
+<script lang="ts" setup>
+import { ref, reactive, onMounted, inject, watchEffect, computed } from 'vue';
+import { storeToRefs } from 'pinia';
+import { Props, Emits, optionsType } from './type';
+import { useStore } from '@/store/index'
+import { generateUniqueId } from '@/utils/tools'
+import { post, get, uploadFile } from "@/utils/request";
+
+const props = defineProps<Props>();
+const emit = defineEmits<Emits>();
+const { userInfo } = storeToRefs(useStore());
+const options = ref<optionsType>([]);
+
+const timeRef = generateUniqueId()
+const controlTranslation = reactive({
+  visibleFlag: false
+})
+
+const selectedValue = ref(props.modelValue); // 响应式绑定 v-model 的值
+
+// function getUserList(keyword: string = '', flag: boolean = true) {
+//   post(`/user/getEmployeeList`, {
+//     keyword,
+//     status: 3,
+//     matchingType: 0,
+//   })
+// }
+
+function visibleChange(visible: boolean) { // 下拉框出现/隐藏时触发
+  console.log(visible, '<==== visible')
+  controlTranslation.visibleFlag = visible
+}
+function updateValue(val: any) { // 值改变的时候触发
+  emit('update:modelValue', selectedValue.value)
+  emit('change', val)
+}
+
+console.log(props, userInfo, '<==== 看看数据')
+</script>
+
+<template>
+  <!-- <el-select v-model="selectedValue" :ref="`selectRef${timeRef}`" :multiple="multiple ? true : false" :size="size ? size : ''" :placeholder="placeholder ? placeholder : '请输入'"
+    :disabled="disabled ? true : false" clearable collapse-tags @change="updateValue" @visible-change="visibleChange">
+    <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option>
+  </el-select> -->
+</template>
+
+<style lang="scss" scoped></style>

+ 23 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/components/translationComponent/personnelSearch/type.d.ts

@@ -0,0 +1,23 @@
+export type optionsType = {
+  label: string,
+  value: string | number,
+  jobNumber?: string,
+}[]
+
+export interface Props {
+  modelValue: any,
+  size: assemblySize,
+  placeholder: string,
+  disabled?: Boolean,
+  multiple?: Boolean,
+  options?: optionsType, // 使用自定义数据
+}
+
+export interface Emits {
+  (event: "change", value: any): void;
+  /**
+   * 双向绑定事件
+   * @param value 对应数据
+   */
+  (event: "update:modelValue", value: any): void;
+}

+ 23 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/components/translationComponent/textTranslation/textTranslation.vue

@@ -0,0 +1,23 @@
+<template>
+  <template v-if="userInfo.userNameNeedTranslate == 1">
+    <ww-open-data :type='translationTypes' :openid='translationValue'></ww-open-data>
+  </template>
+  <template v-else>
+    {{ translationValue }}
+  </template>
+</template>
+<script lang="ts" setup>
+import { ref, reactive, onMounted, inject, watchEffect, computed } from 'vue';
+import { useStore } from '@/store/index'
+import { storeToRefs } from 'pinia';
+
+interface Props {
+  translationTypes: translationType;
+  translationValue: string;
+}
+
+const props = defineProps<Props>();
+const { userInfo } = storeToRefs(useStore());
+
+console.log(props, '<==== 看看数据')
+</script>

+ 4 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/main.ts

@@ -27,6 +27,10 @@ for (const [key, value] of Object.entries(customize)) {
   app.directive(value.key, value.directive)
 }
 
+// 注册全局转译组件
+import TextTranslation from "@/components/translationComponent/textTranslation/textTranslation.vue"
+app.component('TextTranslation', TextTranslation);
+
 app.config.globalProperties.$echarts = echarts;
 app
   .use(ElementPlus, {

+ 7 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/analysis/index.vue

@@ -6,6 +6,7 @@ import Divider from './components/Divider.vue';
 import Echarts from '@/components/ReEcharts/index.vue';
 import { EChartsOption, use } from 'echarts';
 import { dayjs } from 'element-plus';
+import personnelSearch from '@/components/translationComponent/personnelSearch/personnelSearch.vue';
 import {
   getSummaryData,
   getBulletinData,
@@ -16,6 +17,11 @@ import {
   SummaryData
 } from './api';
 
+const selectVal = ref<string | number>('')
+const selectChange = (val: any) => {
+  console.log(val, '<===== 当前的数据')
+  console.log(selectVal.value, '<===== 双向绑定的数据')
+}
 const permissionOptions = [
   {
     label: '仅本人',
@@ -181,6 +187,7 @@ watchEffect(() => {
           </el-select>
         </div>
         <div class="w-40">
+          <personnel-search v-model="selectVal" size="small" :disabled="false" multiple placeholder="你好世界" @change="selectChange"></personnel-search>
           <el-select
             ref="select1"
             size="small"

+ 3 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/header/header.vue

@@ -69,7 +69,9 @@
             <img class="w-full h-full" :src="defaultCover">
           </div>
         </div>
-        <div class="text-center text-[20px] leading-none text-white pb-3">{{ userInfo.name }}</div>
+        <div class="text-center text-[20px] leading-none text-white pb-3">
+          <TextTranslation translationTypes="userName" :translationValue="userInfo.name" />
+        </div>
         <div class="text-center leading-none text-slate-50 pb-3">角色:{{ userInfo.roleName }}</div>
         <div class="text-center leading-none text-slate-50 pb-3">公司:{{ userInfo.companyName }}</div>
         <div class="w-full drawerVisBtn">

+ 105 - 28
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/login.vue

@@ -11,8 +11,8 @@
             autocomplete="off" placeholder="账号/手机号" />
         </el-form-item>
         <el-form-item prop="password">
-          <el-input clearable :prefix-icon="Lock" show-password size="large" class="mt-4" v-model.trim="ruleForm.password"
-            autocomplete="off" placeholder="密码" />
+          <el-input clearable :prefix-icon="Lock" show-password size="large" class="mt-4"
+            v-model.trim="ruleForm.password" autocomplete="off" placeholder="密码" />
         </el-form-item>
         <div class="pt-4">
           <el-button type="primary" size="large" class="w-full" :loading="loginLoading"
@@ -26,21 +26,21 @@
       <div class="flex justify-between pb-5">
         <!-- <el-link type="primary" :underline="false">联系客服</el-link> -->
         <el-link type="primary" class="btn" style="float:left;" :underline="false">联系客服
-            <div class="service">
-                <p style="color: #333">联系客服</p>
-                <img src="../assets/code.jpg">
-                <p><span style="color: #333">QQ:</span><span id="QQ">3052894409</span></p>
-            </div>
+          <div class="service">
+            <p style="color: #333">联系客服</p>
+            <img src="../assets/code.jpg">
+            <p><span style="color: #333">QQ:</span><span id="QQ">3052894409</span></p>
+          </div>
         </el-link>
         <div class="flex justify-around">
-          <el-link class="mr-4" type="primary" :underline="false"  @click="useHelp()">使用说明</el-link>
+          <el-link class="mr-4" type="primary" :underline="false" @click="useHelp()">使用说明</el-link>
           <el-link type="primary" :underline="false" @click="toRegister()">企业注册</el-link>
         </div>
       </div>
       <el-dialog v-model="helpDialog" width="30%" title="使用说明">
         <div class="p-2 text-xl">
-          <a style="color:#075985;text-decoration:none" href="upload/客户管家使用说明书.docx" download="客户管家使用说明书.docx" 
-                            target="_blank">客户管家使用说明书.docx</a>
+          <a style="color:#075985;text-decoration:none" href="upload/客户管家使用说明书.docx" download="客户管家使用说明书.docx"
+            target="_blank">客户管家使用说明书.docx</a>
         </div>
       </el-dialog>
     </div>
@@ -48,7 +48,7 @@
 </template>
 
 <script lang="ts" setup>
-import { reactive, ref, inject } from "vue";
+import { reactive, ref, inject, onMounted } from "vue";
 import { useRouter } from "vue-router";
 import loginLogo from "@/assets/login/login_logo.png";
 import qiyeweixin from "@/assets/login/qiyeweixin.png";
@@ -71,6 +71,7 @@ const rules = reactive<FormRules<typeof ruleForm>>({
   password: [{ required: true, trigger: "blur", message: "请输入密码" }],
 })
 const helpDialog = ref(false);
+const isCorpWX = ref(false)
 
 const login = (formEl: FormInstance | undefined) => {
   if (!formEl) {
@@ -82,27 +83,28 @@ const login = (formEl: FormInstance | undefined) => {
     }
     loginLoading.value = true;
     post(LOGIN, { ...ruleForm.value }).then(res => {
-      if(res.code == 'error') {
+      if (res.code == 'error') {
         globalPopup?.showError(res.msg)
         loginLoading.value = false;
         return
       }
       globalPopup?.showSuccess('登录成功')
-      sessionStorage.setItem('token', res.data.id)
-      setValue(res.data, 'userInfo')
-      // 将数据分析放到第一位
-      const index = res.data?.moduleList.findIndex((obj: any) => obj.path === '/analysis');
-      if (index !== -1) {
-        const item = res.data?.moduleList.splice(index, 1)[0];
-        res.data?.moduleList.unshift(item);
-      }
-      console.log(res.data?.moduleList)
-      setValue(res.data?.moduleList, 'routers')
-      setTimeout(() => {
-        loginLoading.value = false;
-        // router.push(res.data?.moduleList[0].path);
-        router.push('/analysis');
-      }, 100)
+      loginLogic(res.data)
+      // sessionStorage.setItem('token', res.data.id)
+      // setValue(res.data, 'userInfo')
+      // // 将数据分析放到第一位
+      // const index = res.data?.moduleList.findIndex((obj: any) => obj.path === '/analysis');
+      // if (index !== -1) {
+      //   const item = res.data?.moduleList.splice(index, 1)[0];
+      //   res.data?.moduleList.unshift(item);
+      // }
+      // console.log(res.data?.moduleList)
+      // setValue(res.data?.moduleList, 'routers')
+      // setTimeout(() => {
+      //   loginLoading.value = false;
+      //   // router.push(res.data?.moduleList[0].path);
+      //   router.push('/analysis');
+      // }, 100)
     }).catch(_err => {
       loginLoading.value = false;
     })
@@ -121,18 +123,91 @@ const login = (formEl: FormInstance | undefined) => {
   })
 
 };
+
+const loginLogic = (data: any) => {
+  if(data.moduleList.length <= 0) {
+    alert('无权访问,请联系管理员为您分配权限')
+    return
+  }
+  sessionStorage.setItem('token', data.id)
+  setValue(data, 'userInfo')
+  // 将数据分析放到第一位
+  const index = data?.moduleList.findIndex((obj: any) => obj.path === '/analysis');
+  if (index !== -1) {
+    const item = data?.moduleList.splice(index, 1)[0];
+    data?.moduleList.unshift(item);
+  }
+  setValue(data?.moduleList, 'routers')
+  setTimeout(() => {
+    loginLoading.value = false;
+    // router.push(data?.moduleList[0].path);
+    router.push('/analysis');
+  }, 100)
+}
 const useHelp = () => {
   helpDialog.value = true;
 }
 const toRegister = () => {
   router.push("/register");
 }
+
+// 涉及第三方登录
+const checkLogin = () => { // 检查登录
+  const userAgent = navigator.userAgent.toLowerCase();
+  const href = window.location.href;
+  const isCorpWXs = userAgent.includes("wxwork");
+  if (isCorpWXs) {
+    isCorpWX.value = true;
+  }
+
+  if (isCorpWX.value) {
+    //企业微信环境下,尝试自动登录
+    //判断企业微信,是否存在授权
+    //尝试自动登录
+    if (href.indexOf('hasTriedAutoLogin') == -1) {
+      tryAutoLogin()
+    } else if (href.indexOf("userId") > 0) {
+      //后台经过验证后,重定向过来带上了userId
+      var loginUserId = href.substring(href.indexOf("userId=") + "userId=".length);
+      if (loginUserId.includes('#/')) {
+        loginUserId = loginUserId.substring(0, loginUserId.indexOf('#/'));
+      }
+      if (loginUserId.includes('&')) {
+        loginUserId = loginUserId.substring(0, loginUserId.indexOf('&'));
+      }
+      loginByUserId(loginUserId);
+    }
+  }
+}
+
+const loginByUserId = (userId: any) => {
+  post(`/user/loginByUserId`, { userId }).then(res => {
+    if (res.code == 'error') {
+      globalPopup?.showError(res.msg)
+      return
+    }
+    loginLogic(res.data)
+  }).catch(err => {
+    console.log(err)
+  })
+}
+const tryAutoLogin = () => {
+  var appId = "wwdd1137a65ce0fc87";//企业微信第三方的SUIT ID
+  var url = "https://crm.ttkuaiban.com/api/corpWXAuth";//授权回调页面
+  var weixinUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appId + "&redirect_uri=" + encodeURI(url) + "&response_type=code&scope=snsapi_base&state=1#wechat_redirect";
+  window.location.href = weixinUrl;
+}
+
+onMounted(() => {
+  checkLogin()
+})
 </script>
 
 <style lang="scss" scoped>
 .loginView {
   background: #f0f2f5 url("../assets/login/background.png") no-repeat;
 }
+
 .service {
   display: none;
   width: 120px;
@@ -144,10 +219,12 @@ const toRegister = () => {
   top: -210px;
   border-radius: 5px;
   box-shadow: 3px 3px 10px #dfdfdf;
+
   img {
-      width: 80px;
+    width: 80px;
   }
 }
+
 .btn:hover .service {
   display: block;
 }

+ 1 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/team/index.vue

@@ -23,7 +23,7 @@
             <el-button :icon="Search" @click="getTableData()" />
           </template>
         </el-input>
-
+        
         <div class="formItem mr-6 flex items-center">
           <div class="text-nowrap">状态:</div>
           <el-select v-model="teamForm.status" placeholder="请选择" size="default" style="width: 100px"
@@ -38,7 +38,6 @@
             <el-option v-for="item in roleList" :key="item.id" :label="item.rolename" :value="item.id" />
           </el-select>
         </div>
-
         <el-dropdown>
           <el-button type="primary">
             更多操作<el-icon class="el-icon--right"><arrow-down /></el-icon>

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/store/index.ts

@@ -31,7 +31,7 @@ export const useStore = defineStore<
       this[key] = val;
     },
     getRouterConfig(path) {
-      return this.routers.find((item) => item.path === path);
+      return this.routers.find((item: any) => item.path === path);
     },
     getFunctionList(path) {
       const config = this.getRouterConfig(path);

+ 4 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/type.d.ts

@@ -25,6 +25,10 @@ type templateKey = { // 自定义模板键值
   [key: string]: any;
 }
 
+type translationType = "userName" | "departmentName" | "deptName"; // 企业微信, 钉钉转译类型,
+
+type assemblySize = "mini" | "medium" | "large" | '' | 'large' | 'default' | 'small';
+
 type saveLoadingType = "1" | "2" | "3" | "4"; //1是没有保存, 2是正在保存, 3是保存成功, 4是保存失败
 
 type TASK_VALUE_TYPE = 0 | 1 | 2 | 3; //0是客户, 1是商机, 2是销售订单 ,3是线索

+ 18 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/utils/tools.ts

@@ -291,3 +291,21 @@ export function judgmentaAmounteEqual(mob: any, arr: any) {
 
   return (amounte > totalAmounte) ? false : flag;
 }
+
+/**
+ * 生成唯一id
+ * @param minLength 最小长度
+ * @param maxLength 最大长度
+ * @returns
+ */
+export function generateUniqueId(minLength = 3, maxLength = 8) {
+  const timestamp = Date.now().toString(36); // 转换成36进制表示时间戳
+  const randomPart = Math.random().toString(36).substring(2, 8); // 获取6位随机字符
+  let uniqueId = timestamp + randomPart;
+  if (uniqueId.length < minLength) {
+    uniqueId = uniqueId.padStart(minLength, '0');
+  } else if (uniqueId.length > maxLength) {
+    uniqueId = uniqueId.substring(0, maxLength);
+  }
+  return uniqueId;
+}

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

@@ -4,8 +4,8 @@ import vue from '@vitejs/plugin-vue';
 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://192.168.2.17: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';
 

+ 1 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/config/BeanConfig.java

@@ -24,7 +24,7 @@ public class BeanConfig {
         // 设置线程活跃时间(秒)
         executor.setKeepAliveSeconds(60);
         // 设置默认线程名称
-        executor.setThreadNamePrefix("worktime-");
+        executor.setThreadNamePrefix("crm-");
         // 设置拒绝策略
         executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
         // 等待所有任务结束后再关闭线程池

+ 3 - 3
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/AuthRedirectController.java

@@ -144,9 +144,9 @@ public class AuthRedirectController {
             }
         }
         if (isMobile) {
-            redirecUrl = "https://mobworktime.ttkuaiban.com/#/" + router;
+            redirecUrl = "https://mobcrm.ttkuaiban.com/#/" + router;
         } else {
-            redirecUrl = "https://worktime.ttkuaiban.com/#/" + router;
+            redirecUrl = "https://crm.ttkuaiban.com/#/" + router;
         }
         ModelAndView modelAndView = new ModelAndView(
                 new RedirectView(redirecUrl), reqParam);
@@ -254,7 +254,7 @@ public class AuthRedirectController {
                         reqParam.put("version", compExpireInfo.get("version"));
                     }
                 }
-                redirecUrl = "https://worktime.ttkuaiban.com/#/" + router;
+                redirecUrl = "https://crm.ttkuaiban.com/#/" + router;
             }
         }
         ModelAndView modelAndView = new ModelAndView(

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

@@ -1428,7 +1428,7 @@ public class ProjectController {
     }
 
 
-    //同步SAP项目数据到工时管家
+    //同步SAP项目数据到客户管家
     @RequestMapping("/syncProjectWithSap")
     @Transactional
     public HttpRespMsg syncProjectWithSap(String startDate,String endDate,String projectCodes){

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

@@ -2403,13 +2403,13 @@ public class ReportController {
     }
 
 
-    //todo:推送工时管家工时考勤数据到SAP
+    //todo:推送客户管家工时考勤数据到SAP
     @RequestMapping("/pushProjectReportToSap")
     public HttpRespMsg pushProjectReportToSap(String pushDate,Integer reportId){
         return reportService.pushProjectReportToSap(pushDate,reportId);
     }
 
-    //todo:查询已推送到SAP的工时管家工时考勤数据 并撤销推送
+    //todo:查询已推送到SAP的客户管家工时考勤数据 并撤销推送
     @RequestMapping("/getHasPushForSap")
     public HttpRespMsg getHasPushForSap(String startDate,String endDate,String employeeID){
         return reportService.getHasPushForSap(startDate,endDate,employeeID);

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

@@ -340,7 +340,7 @@ public class UserController {
         templateVariableDetail.put("审核人","Yurk");
         templateVariableDetail.put("评价","干的不错");
         templateVariableDetail.put("日期","2023-03-08");
-        feishuInfoService.batchSendCardMessage(feishuInfo,userIds,"日报审核通过提醒(带评价)",templateVariableDetail,"http://worktime.ttkuaiban.com");
+        feishuInfoService.batchSendCardMessage(feishuInfo,userIds,"日报审核通过提醒(带评价)",templateVariableDetail,"http://crm.ttkuaiban.com");
         return httpRespMsg;
     }
 

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

@@ -67,9 +67,9 @@ public class WXController {
         boolean isMobile = "MOBILE".equals(deviceType);
         String redirecUrl = null;
         if (isMobile) {
-            redirecUrl = "http://mobworktime.ttkuaiban.com";
+            redirecUrl = "http://mobcrm.ttkuaiban.com";
         } else {
-            redirecUrl = "http://worktime.ttkuaiban.com";
+            redirecUrl = "http://crm.ttkuaiban.com";
         }
 
         HttpRespMsg msg = userService.bindWeiXin2(code, userId, state);

+ 15 - 164
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -863,7 +863,7 @@ public class WeiXinCorpController {
                 }
             } else if ("change_contact".equals(jsonObject.get("InfoType")) && jsonObject.has("ChangeType")) {
                 //{"xml":{"ChangeType":"delete_user","UserID":"ShanShuiGongZhangTianYiSe",
-                // "SuiteId":"ww4e237fd6abb635af","InfoType":"change_contact","AuthCorpId":"wwf11426cf618e1703",
+                // "SuiteId":"wwdd1137a65ce0fc87","InfoType":"change_contact","AuthCorpId":"wwf11426cf618e1703",
                 // "TimeStamp":1655908762,"OpenUserID":"woy9TkCAAApdqSxsfJbmK4cBJhbzI5Ug"}}
                 String changeType = jsonObject.getString("ChangeType");
                 String corpId = jsonObject.getString("AuthCorpId");
@@ -1300,7 +1300,7 @@ public class WeiXinCorpController {
                     JSONArray jsonArray = obj.getJSONObject("auth_info").getJSONArray("agent");
                     for (int i=0;i<jsonArray.size(); i++) {
                         JSONObject jsonObject = jsonArray.getJSONObject(i);
-                        if (jsonObject.getString("name").equals("工时管家")) {
+                        if (jsonObject.getString("name").equals("客户管家")) {
                             int agentId = jsonObject.getInteger("agentid");
                             data.setAgentid(agentId);
                             //授权模式:0为管理员授权;1为成员授权
@@ -1330,94 +1330,10 @@ public class WeiXinCorpController {
                         //设置来源
                         company.setRegFrom("企业微信");
                         companyMapper.insert(company);
-                        //生成项目的成本基线默认条目
-                        String[] array = Constant.DEFAULT_BASE_COST_ITEMS;
-                        for (String baseItem : array) {
-                            ProjectBasecostSetting setting = new ProjectBasecostSetting();
-                            setting.setName(baseItem);
-                            setting.setCompanyId(company.getId());
-                            projectBasecostSettingMapper.insert(setting);
-                        }
-                        //生成费用报销默认条目
-                        String[] expenseTypes = Constant.EXPENSE_TYPES;
-                        List<String> commonly = new ArrayList<>();
-                        commonly.add("材料费");
-                        //commonly.add(MessageUtils.message("entry.materialCost"));
-                        commonly.add("办公用品");
-                        //commonly.add(MessageUtils.message("entry.workCost"));
-                        commonly.add("培训费");
-                        //commonly.add(MessageUtils.message("entry.trainCost"));
-                        commonly.add("打印费");
-                        //commonly.add(MessageUtils.message("entry.printCost"));
-                        commonly.add("快递费");
-                        //commonly.add(MessageUtils.message("entry.expressCost"));
-                        commonly.add("制作费");
-                        //commonly.add(MessageUtils.message("entry.makeCost"));
-                        commonly.add("律师费");
-                        //commonly.add(MessageUtils.message("entry.lawyerCost"));
-                        commonly.add("水费");
-                        //commonly.add(MessageUtils.message("entry.waterCost"));
-                        commonly.add("电费");
-                        //commonly.add(MessageUtils.message("entry.electricCost"));
-                        commonly.add("团建费");
-                        //commonly.add(MessageUtils.message("entry.leagueCost"));
-                        commonly.add("其他");
-                        //commonly.add(MessageUtils.message("entry.other"));
-                        List<String> travel  = new ArrayList<>();
-                        travel.add("城市间交通费");
-                        //travel.add(MessageUtils.message("entry.cityTrafficCost"));
-                        travel.add("住宿费");
-                        //travel.add(MessageUtils.message("entry.liveCost"));
-                        travel.add("伙食补助费");
-                        //travel.add(MessageUtils.message("entry.eatCost"));
-                        travel.add("市内交通费");
-                        //travel.add(MessageUtils.message("entry.insideCityCost"));
-                        travel.add("其他差旅费");
-                        //travel.add(MessageUtils.message("entry.otherLiveTraCost"));
-                        List<String> outsource = new ArrayList<>();
-                        outsource.add("项目外包费");
-                        //outsource.add(MessageUtils.message("entry.projectCost"));
-                        outsource.add("劳务外包费");
-                        //outsource.add(MessageUtils.message("entry.labourCost"));
-                        outsource.add("其他外包费");
-                        //outsource.add(MessageUtils.message("entry.OtherOutsourceCost"));
-                        List<ExpenseType> expenseTypeList=new ArrayList<>();
-                        List<ExpenseMainType> expenseMainTypes=new ArrayList<>();
-                        ExpenseMainType expenseMainType=new ExpenseMainType();
-                        expenseMainType.setName("一般费用");
-                        expenseMainType.setCompanyId(company.getId());
-                        ExpenseMainType expenseMainType1=new ExpenseMainType();
-                        expenseMainType1.setName("差旅费用");
-                        expenseMainType1.setCompanyId(company.getId());
-                        ExpenseMainType expenseMainType2=new ExpenseMainType();
-                        expenseMainType2.setName("外包费用");
-                        expenseMainType2.setCompanyId(company.getId());
-                        expenseMainTypes.add(expenseMainType);
-                        expenseMainTypes.add(expenseMainType1);
-                        expenseMainTypes.add(expenseMainType2);
-                        expenseMainTypeService.saveBatch(expenseMainTypes);
-                        for (String expenseType : expenseTypes) {
-                            ExpenseType item=new ExpenseType();
-                            item.setCompanyId(company.getId());
-                            item.setTypeName(expenseType);
-                            if(commonly.contains(expenseType)){
-                                item.setMainType(expenseMainType.getId());
-                            }
-                            if(travel.contains(expenseType)){
-                                item.setMainType(expenseMainType1.getId());
-                            }
-                            if(outsource.contains(expenseType)){
-                                item.setMainType(expenseMainType2.getId());
-                            }
-                            expenseTypeList.add(item);
-                        }
-                        expenseTypeService.saveBatch(expenseTypeList);
 
                         //生成工作时长
                         TimeType timeType = new TimeType();
                         timeType.setCompanyId(company.getId());
-                        timeType.setFinanceJobnumEnabled(1);//启用工号来导入财务匹配
-                        timeType.setProjectManDay(1);//默认开启预估项目人天
                         timeTypeMapper.insert(timeType);
 
                         managerRole = sysRoleService.generateDefaultRoles(company.getId());
@@ -1449,72 +1365,7 @@ public class WeiXinCorpController {
                                 .setCorpwxRealUserid(userId);
                         userMapper.insert(user);
                         System.out.println("生成超级管理员:"+userId);
-                        //todo: 生成初始测试项目及任务
-                        Project project=new Project();
-                        project.setCompanyId(company.getId());
-                        project.setInchargerId(user.getId());
-                        project.setInchargerName(user.getName());
-                        project.setCreatorId(user.getId());
-                        project.setCreatorName(user.getName());
-                        project.setCreateDate(LocalDate.now());
-                        project.setProjectCode("example");
-                        project.setProjectName("示例项目");
-                        //设置为公共项目,这样测试的用户都能填报
-                        project.setIsPublic(1);
-                        projectMapper.insert(project);
-                        //todo: 生成初始项目相关日报审核人
-                        ProjectAuditor projectAuditor=new ProjectAuditor();
-                        projectAuditor.setAuditorId(user.getId());
-                        projectAuditor.setAuditorName(user.getName());
-                        projectAuditor.setProjectId(project.getId());
-                        projectAuditorMapper.insert(projectAuditor);
-                        //todo: 生成项目报表服务默认条目
-                        Integer[] arrayInteger=new Integer[]{1,2,3,4,7};
-                        for (Integer integerItem : arrayInteger) {
-                            CompanyReport companyReport=new CompanyReport();
-                            companyReport.setCompanyId(company.getId());
-                            companyReport.setReportFormId(integerItem);
-                            companyReportMapper.insert(companyReport);
-                        }
-                        //todo: 生成初始项目相关示例任务分组/任务阶段以及示例任务
-                        TaskGroup taskGroup = new TaskGroup();
-                        taskGroup.setProjectId(project.getId())
-                                .setInchargerId(user.getId())
-                                .setName("项目阶段");
-                        taskGroupMapper.insert(taskGroup);
-                        Stages stage = new Stages();
-                        stage.setGroupId(taskGroup.getId());
-                        stage.setSequence(1);
-                        stage.setProjectId(project.getId());
-                        stage.setStagesName("工作开展");
-                        stagesMapper.insert(stage);
-                        Task task=new Task();
-                        TimeType timeType = timeTypeMapper.selectById(company.getId());
-                        Integer oneDayHours = 8;
-//                        task.setCreateDate(LocalDate.now());
-//                        task.setProjectId(project.getId());
-//                        task.setCompanyId(company.getId());
-//                        task.setCreaterId(user.getId());
-//                        task.setCreaterName(user.getName());
-//                        task.setCreatorColor(user.getColor());
-//                        task.setExecutorId(user.getId());
-//                        task.setExecutorColor(user.getColor());
-//                        task.setExecutorName(user.getName());
-//                        task.setPlanHours(oneDayHours);
-//                        task.setStagesId(stage.getId());
-//                        task.setGroupId(taskGroup.getId());
-//                        task.setSeq(0);
-//                        task.setName("示例任务");
-                        taskMapper.insert(task);
-                        //任务执行人表也要插入,不然会导致编辑任务的时候执行人为空
-                        TaskExecutor executor = new TaskExecutor();
-                        executor.setTaskId(task.getId());
-                        executor.setPlanHours(oneDayHours);
-                        executor.setProjectId(project.getId());
-                        executor.setExecutorId(user.getId());
-                        executor.setExecutorColor(user.getColor());
-                        executor.setExecutorName(user.getName());
-                        taskExecutorMapper.insert(executor);
+
                     }
 
                     int companyId = company.getId();
@@ -1601,7 +1452,7 @@ public class WeiXinCorpController {
                     JSONArray jsonArray = obj.getJSONObject("auth_info").getJSONArray("agent");
                     for (int i=0;i<jsonArray.size(); i++) {
                         JSONObject jsonObject = jsonArray.getJSONObject(i);
-                        if (jsonObject.getString("name").equals("工时管家")) {
+                        if (jsonObject.getString("name").equals("客户管家")) {
                             int agentId = jsonObject.getInteger("agentid");
                             data.setAgentid(agentId);
                         }
@@ -1801,9 +1652,9 @@ public class WeiXinCorpController {
         boolean isMobile = "MOBILE".equals(deviceType);
         String redirecUrl = null;
         if (isMobile) {
-            redirecUrl = "http://mobworktime.ttkuaiban.com";
+            redirecUrl = "http://mobcrm.ttkuaiban.com";
         } else {
-            redirecUrl = "http://worktime.ttkuaiban.com";
+            redirecUrl = "http://crm.ttkuaiban.com";
         }
         User curUser = userMapper.selectById(userId);
         //https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=ACCESS_TOKEN&code=CODE
@@ -2108,7 +1959,7 @@ public class WeiXinCorpController {
                     JSONArray jsonArray = json.getJSONObject("auth_info").getJSONArray("agent");
                     for (int i=0;i<jsonArray.size(); i++) {
                         JSONObject jsonObject = jsonArray.getJSONObject(i);
-//                        if (jsonObject.getString("name").equals("工时管家")) {
+//                        if (jsonObject.getString("name").equals("客户管家")) {
 //                            System.out.println(jsonObject);
                             JSONObject privilege = jsonObject.getJSONObject("privilege");
                             allowUserList = privilege.getJSONArray("allow_user");
@@ -2244,8 +2095,8 @@ public class WeiXinCorpController {
                     JSONArray jsonArray = json.getJSONObject("auth_info").getJSONArray("agent");
                     for (int i=0;i<jsonArray.size(); i++) {
                         JSONObject jsonObject = jsonArray.getJSONObject(i);
-                        //用户可能会自定义应用名称,不一定是工时管家。
-//                        if (jsonObject.getString("name").equals("工时管家")) {
+                        //用户可能会自定义应用名称,不一定是客户管家。
+//                        if (jsonObject.getString("name").equals("客户管家")) {
 //                            System.out.println(jsonObject);
                             JSONObject privilege = jsonObject.getJSONObject("privilege");
                             allowUserList = privilege.getJSONArray("allow_user");
@@ -3335,7 +3186,7 @@ public class WeiXinCorpController {
             JSONArray jsonArray = json.getJSONObject("auth_info").getJSONArray("agent");
             for (int i=0;i<jsonArray.size(); i++) {
                 JSONObject jsonObject = jsonArray.getJSONObject(i);
-//                if (jsonObject.getString("name").equals("工时管家")) {
+//                if (jsonObject.getString("name").equals("客户管家")) {
                     System.out.println(jsonObject);
                     Integer authMode = jsonObject.getInteger("auth_mode");
                     if (!wxCorpInfo.getAuthMode().equals(authMode)) {
@@ -3809,23 +3660,23 @@ public class WeiXinCorpController {
         JSONObject data = new JSONObject();
         data.put("card_type", "news_notice");
         JSONObject mainTitle = new JSONObject();
-        mainTitle.put("title", "工时管家使用指南");
-        mainTitle.put("desc", "欢迎使用工时管家,点击查看工时管家使用指南");
+        mainTitle.put("title", "客户管家使用指南");
+        mainTitle.put("desc", "欢迎使用客户管家,点击查看客户管家使用指南");
         data.put("main_title", mainTitle);
         JSONObject cardImg = new JSONObject();
-        cardImg.put("url", "http://www.ttkuaiban.com/card_img.png");
+        cardImg.put("url", "https://crm.ttkuaiban.com/card_img.png");
         cardImg.put("aspect_ratio", 2.35);
         data.put("card_image", cardImg);
         JSONArray array = new JSONArray();
         JSONObject docItem = new JSONObject();
         docItem.put("type", 1);
         docItem.put("title", "使用指南");
-        docItem.put("url", "https://www.ttkuaiban.com/download/%E5%B7%A5%E6%97%B6%E7%AE%A1%E5%AE%B6%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E%E4%B9%A6.pdf");
+        docItem.put("url", "https://crm.ttkuaiban.com/download/%E5%B7%A5%E6%97%B6%E7%AE%A1%E5%AE%B6%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E%E4%B9%A6.pdf");
         array.add(docItem);
         JSONObject enterItem = new JSONObject();
         enterItem.put("type", 1);
         enterItem.put("title", "进入应用");
-        enterItem.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
+        enterItem.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wwdd1137a65ce0fc87&redirect_uri=https://crm.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
         array.add(enterItem);
         data.put("jump_list", array);
         JSONObject cardAction = new JSONObject();

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

@@ -84,7 +84,7 @@ public class WxCorpInfoController {
             jsonObj.put("value", "测试提醒消息21:12");
             dataJson.add(jsonObj);
             json.put("template_id","tty9TkCAAAYoevY-40ciWD5lDncDfR5w");
-            json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
+            json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wwdd1137a65ce0fc87&redirect_uri=http://crm.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
             json.put("content_item",dataJson);
             wxCorpInfoService.sendWXCorpTemplateMsg(corpInfo, corpwxuserIds, json);
 

+ 4 - 4
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -1274,7 +1274,7 @@ public class DingDingServiceImpl implements DingDingService {
                                             JSONArray agents = authInfo.getJSONArray("agent");
                                             for (int j=0;j<agents.size(); j++) {
                                                 JSONObject item = agents.getJSONObject(j);
-                                                if (item.getString("agent_name").equals("工时管家")) {
+                                                if (item.getString("agent_name").equals("客户管家")) {
                                                     agentId = item.getLong("agentid");
                                                 }
                                             }
@@ -1311,7 +1311,7 @@ public class DingDingServiceImpl implements DingDingService {
                                     }
                                 } else if ("org_micro_app_restore".equals(syncAction)) {
                                     String corpid = bizItem.getString("corp_id");
-                                    System.out.println("==Push 推送事件 app 工时管家恢复启用, corpid==="+corpid);
+                                    System.out.println("==Push 推送事件 app 客户管家恢复启用, corpid==="+corpid);
                                 }
                             }
                         }
@@ -1387,7 +1387,7 @@ public class DingDingServiceImpl implements DingDingService {
 //
                 OapiServiceGetAuthInfoResponse.AuthCorpInfo authCorpInfo = rsp.getAuthCorpInfo();
                 List<OapiServiceGetAuthInfoResponse.Agent> agent = rsp.getAuthInfo().getAgent();
-                Long agentid = agent.stream().filter(a -> a.getAgentName().equals("工时管家")).findFirst().get().getAgentid();
+                Long agentid = agent.stream().filter(a -> a.getAgentName().equals("客户管家")).findFirst().get().getAgentid();
                 corpAuth(authCorpInfo.getCorpid(), authCorpInfo.getCorpName(), rsp.getAuthUserInfo().getUserId(), agentid);
             }
         } catch (ApiException e) {
@@ -1436,7 +1436,7 @@ public class DingDingServiceImpl implements DingDingService {
                 List<OapiServiceGetAuthInfoResponse.Agent> agent = rsp.getAuthInfo().getAgent();
                 String corpid1 = authCorpInfo.getCorpid();
 
-                Long agentid = agent.stream().filter(a -> a.getAgentName().equals("工时管家")).findFirst().get().getAgentid();
+                Long agentid = agent.stream().filter(a -> a.getAgentName().equals("客户管家")).findFirst().get().getAgentid();
                 CompanyDingding dingding = companyDingdingMapper.selectById(corpid1);
                 if (dingding.getAgentId() == null) {
                     dingding.setAgentId(agentid);

+ 4 - 4
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java

@@ -240,7 +240,7 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                     dataJson.add(jsonObj3);
                     dataJson.add(jsonObj4);
                     json.put("template_id","tty9TkCAAALUiWvjdoDg_PZf48gwucZA");
-                    json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=expense#wechat_redirect");
+                    json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=wwdd1137a65ce0fc87&redirect_uri=http://crm.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=expense#wechat_redirect");
                     json.put("content_item",dataJson);
                     wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfo,corpUserString, json);
                     List<Information> informationList=new ArrayList<>();
@@ -333,7 +333,7 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                         dataJson.add(jsonObj3);
                         dataJson.add(jsonObj4);
                         json.put("template_id","tty9TkCAAALUiWvjdoDg_PZf48gwucZA");
-                        json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=expense#wechat_redirect");
+                        json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=wwdd1137a65ce0fc87&redirect_uri=http://crm.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=expense#wechat_redirect");
                         json.put("content_item",dataJson);
                         wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfo,corpUserString, json);
                     }
@@ -385,7 +385,7 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                 dataJson.add(jsonObj3);
                 dataJson.add(jsonObj4);
                 json.put("template_id","tty9TkCAAALUiWvjdoDg_PZf48gwucZA");
-                json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=expense#wechat_redirect");
+                json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=wwdd1137a65ce0fc87&redirect_uri=http://crm.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=expense#wechat_redirect");
                 json.put("content_item",dataJson);
                 wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfo,corpUserString, json);
             }
@@ -667,7 +667,7 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                     dataJson.add(jsonObj3);
                     dataJson.add(jsonObj4);
                     json.put("template_id","tty9TkCAAALUiWvjdoDg_PZf48gwucZA");
-                    json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=expense#wechat_redirect");
+                    json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=wwdd1137a65ce0fc87&redirect_uri=http://crm.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=expense#wechat_redirect");
                     json.put("content_item",dataJson);
                     wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfo,corpUserString, json);
                 }

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

@@ -445,7 +445,7 @@ public class FeishuInfoServiceImpl extends ServiceImpl<FeishuInfoMapper, FeishuI
                 JSONObject header=new JSONObject();
                 header.put("template","blue");
                 JSONObject title=new JSONObject();
-                title.put("content","工时管家 \n"+sendTypeName);
+                title.put("content","客户管家 \n"+sendTypeName);
                 title.put("tag","plain_text");
                 header.put("title",title);
                 card.put("header",header);

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

@@ -187,7 +187,7 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
         dataJson.add(jsonObj2);
         dataJson.add(jsonObj4);
         json.put("template_id","tty9TkCAAARfwRKiqfj47qNE70KvGhqg");
-        json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=leave#wechat_redirect");
+        json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=wwdd1137a65ce0fc87&redirect_uri=http://crm.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=leave#wechat_redirect");
         json.put("content_item",dataJson);
         String ownerId = sheet.getOwnerId();
         User owner = userMapper.selectById(ownerId);
@@ -259,7 +259,7 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
         dataJson.add(jsonObj2);
         dataJson.add(jsonObj4);
         json.put("template_id","tty9TkCAAA4WvYmTnsAVoUmdYxHdSG9A");
-        json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=leave#wechat_redirect");
+        json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=wwdd1137a65ce0fc87&redirect_uri=http://crm.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=leave#wechat_redirect");
         json.put("content_item",dataJson);
         String auditorId = sheet.getAuditorId();
         User auditor = userMapper.selectById(auditorId);

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

@@ -11664,7 +11664,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     public HttpRespMsg syncProjectWithSap(String startDate,String endDate,String projectCodes) {
         HttpRespMsg msg=new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
-        //获取SAP项目服务数据 ----> 工时管家任务分组下阶段作为项目服务数据
+        //获取SAP项目服务数据 ----> 客户管家任务分组下阶段作为项目服务数据
         XmlResponseData projectServiceData= SyncSapUtils.syncServiceData("2020-01-01", endDate, companyId,isDev);
         //已有的项目分类
         List<ProjectCategory> allProjectCategoryList = projectCategoryMapper.selectList(new QueryWrapper<ProjectCategory>().eq("company_id", companyId));
@@ -11729,13 +11729,13 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 project.setProjectName(item.getProjectSummaryTask().getProjectName().getName());
                 project.setProjectCode(item.getProjectSummaryTask().getProjectElementID());
                 project.setCompanyId(companyId);
-                //处理项目数据 --->工时管家生成对应项目数据
+                //处理项目数据 --->客户管家生成对应项目数据
                 Optional<Project> any = projectList.stream().filter(pt -> pt.getProjectCode().equals(project.getProjectCode())).findAny();
                 if(any.isPresent()){
                     project.setId(any.get().getId());
                 }
                 saveOrUpdate(project);
-                //处理项目下任务 ----> 工时管家生成任务分组
+                //处理项目下任务 ----> 客户管家生成任务分组
                 List<ProjectTask> projectTasks = item.getProjectTasks();
                 if(projectTasks!=null&&projectTasks.size()>0){
                     //找到任务列表中 作为项目出现的第一级列表
@@ -11744,7 +11744,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     //todo:按照层级抽取数据
                     //项目下第一层 作为任务分组数据
                     List<ProjectTask> taskGroupList = projectTasks.stream().filter(p -> p.getParentTaskUUID() != null && p.getParentTaskUUID().equals(targetUUID)).collect(Collectors.toList());
-                    //抽调任务分组下级数据 作为阶段数据(是没有下级数据的情况下 作为最末级--->工时管家任务)
+                    //抽调任务分组下级数据 作为阶段数据(是没有下级数据的情况下 作为最末级--->客户管家任务)
                     List<String> taskGroupUUIDList = taskGroupList.stream().map(ProjectTask::getUUID).collect(Collectors.toList());
                     List<ProjectTask> stagesList = projectTasks.stream().filter(p -> p.getParentTaskUUID() != null && taskGroupUUIDList.contains(p.getParentTaskUUID())).collect(Collectors.toList());
                     List<String> stagesUUIDList = stagesList.stream().map(ProjectTask::getUUID).collect(Collectors.toList());
@@ -11892,7 +11892,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 }
             }
         }
-        //处理项目下服务数据 ------->工时管家相关项目下任务分组下创建任务数据
+        //处理项目下服务数据 ------->客户管家相关项目下任务分组下创建任务数据
         List<SapProjectService> serviceList = sapProjectServiceService.list(new LambdaQueryWrapper<SapProjectService>().eq(SapProjectService::getCompanyId, companyId));
         List<SapProjectService> sapProjectServiceList=new ArrayList<>();
         if(projectServiceData!=null){

+ 8 - 8
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -2012,7 +2012,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                     item2.put("key", "日期");
                                     item2.put("value", report.getCreateDate());
                                     dataJson.add(item2);
-                                    json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
+                                    json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wwdd1137a65ce0fc87&redirect_uri=http://crm.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
                                     json.put("content_item", dataJson);
                                     wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfoList.get(0), u.getCorpwxUserid(), json);
                                 }
@@ -2473,7 +2473,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                     item2.put("key", "日期");
                                     item2.put("value", report.getCreateDate());
                                     dataJson.add(item2);
-                                    json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
+                                    json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wwdd1137a65ce0fc87&redirect_uri=http://crm.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
                                     json.put("content_item", dataJson);
                                     wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfoList.get(0), u.getCorpwxUserid(), json);
                                 }
@@ -2518,7 +2518,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                     item3.put("value", report.getCreateDate());
                                     dataJson.add(item3);
                                     json.put("template_id", "tty9TkCAAAwOgmzwS2uFogWgOmPDdIRQ");
-                                    json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
+                                    json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wwdd1137a65ce0fc87&redirect_uri=http://crm.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
                                     json.put("content_item", dataJson);
                                     wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfoList.get(0), u.getCorpwxUserid(), json);
                                 }
@@ -2640,7 +2640,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
                 .toUser(user.getWxOpenid())//要推送的用户openid
                 .templateId(TEMPLATE_REPORT_REJECT)//模版id
-                .url("http://mobworktime.ttkuaiban.com/")//点击模版消息要访问的网址
+                .url("http://mobcrm.ttkuaiban.com/")//点击模版消息要访问的网址
                 .build();
         //3,如果是正式版发送模版消息,这里需要配置你的信息
         templateMessage.addData(new WxMpTemplateData("first", "你好,您的日报被驳回", "#FF00FF"));
@@ -2674,7 +2674,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
                 .toUser(user.getWxOpenid())//要推送的用户openid
                 .templateId(TEMPLATE_REPORT_PASS)//模版id
-                .url("http://mobworktime.ttkuaiban.com/")//点击模版消息要访问的网址
+                .url("http://mobcrm.ttkuaiban.com/")//点击模版消息要访问的网址
                 .build();
         //3,如果是正式版发送模版消息,这里需要配置你的信息
         templateMessage.addData(new WxMpTemplateData("first", projectName + "项目,日报审核通过", "#FF00FF"));
@@ -3694,7 +3694,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                     item2.put("key", "日期");
                                     item2.put("value", report.getCreateDate());
                                     dataJson.add(item2);
-                                    json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
+                                    json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wwdd1137a65ce0fc87&redirect_uri=http://crm.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
                                     json.put("content_item", dataJson);
                                     wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfoList.get(0), u.getCorpwxUserid(), json);
                                 }
@@ -3741,7 +3741,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                     item3.put("value", report.getCreateDate());
                                     dataJson.add(item3);
                                     json.put("template_id", "tty9TkCAAAwOgmzwS2uFogWgOmPDdIRQ");
-                                    json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
+                                    json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wwdd1137a65ce0fc87&redirect_uri=http://crm.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
                                     json.put("content_item", dataJson);
                                     wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfoList.get(0), u.getCorpwxUserid(), json);
                                 }
@@ -7819,7 +7819,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         resultList = resultList.stream().filter(r -> r.get("ProjectElementID") != null && !StringUtils.isEmpty(String.valueOf(r.get("ProjectElementID")))).collect(Collectors.toList());
         List<Integer> taskIds = resultList.stream().map(r -> Integer.valueOf(String.valueOf(r.get("TaskId")))).distinct().collect(Collectors.toList());
         taskIds.add(-1);
-        //提前推送项目工时(工时管家相关项目任务分组阶段下任务作为SAP服务 预算工时数据推送到SAP)
+        //提前推送项目工时(客户管家相关项目任务分组阶段下任务作为SAP服务 预算工时数据推送到SAP)
         //只推送需要推送日报参与的部分就可以了
         List<Map<String, Object>> pushProjectPlanHour = reportMapper.getProjectPlanData(companyId, taskIds, null, null);
         ExecutorService executor = Executors.newFixedThreadPool(1);

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

@@ -136,7 +136,7 @@ public class TaskProgressServiceImpl extends ServiceImpl<TaskProgressMapper, Tas
 //                    dataJson.add(jsonObj2);
 //                    dataJson.add(jsonObj3);
 //                    json.put("template_id","tty9TkCAAASja8aiHGlheqEHQ7OIpRyg");
-//                    json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=task#wechat_redirect");
+//                    json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=wwdd1137a65ce0fc87&redirect_uri=http://crm.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=task#wechat_redirect");
 //                    json.put("content_item",dataJson);
 //                    wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfo, corpwxUserid, json);
 //                }

+ 4 - 4
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -2641,7 +2641,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                             jsonObj.put("value", "您"+(StringUtils.isEmpty(date)?"":date)+"的工时报告还未填写");
                             dataJson.add(jsonObj);
                             json.put("template_id","tty9TkCAAAYoevY-40ciWD5lDncDfR5w");
-                            json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
+                            json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wwdd1137a65ce0fc87&redirect_uri=http://crm.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
                             json.put("content_item",dataJson);
                             if (cpList.size() > 0) {
                                 wxCorpInfoService.sendWXCorpTemplateMsg(cpList.get(0), corpUid, json);
@@ -3132,7 +3132,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
                 .toUser(user.getWxOpenid())//要推送的用户openid
                 .templateId(TEMPLATE_REPORT_FILL)//模版id
-                .url("http://mobworktime.ttkuaiban.com/#/edit")//点击模版消息要访问的网址
+                .url("http://mobcrm.ttkuaiban.com/#/edit")//点击模版消息要访问的网址
                 .build();
         //3,如果是正式版发送模版消息,这里需要配置你的信息
         templateMessage.addData(new WxMpTemplateData("first", "您"+date+"的工时报告还未填写", "#FF00FF"));
@@ -3315,9 +3315,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             }
         }
         if (isMobile) {
-            redirecUrl = "https://mobworktime.ttkuaiban.com/#/" + router;
+            redirecUrl = "https://mobcrm.ttkuaiban.com/#/" + router;
         } else {
-            redirecUrl = "https://worktime.ttkuaiban.com/#/" + router;
+            redirecUrl = "https://crm.ttkuaiban.com/#/" + router;
         }
         ModelAndView modelAndView = new ModelAndView(
                 new RedirectView(redirecUrl), reqParam);

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

@@ -272,9 +272,9 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
             String title = "";
             String jumpUrl ;
             if(isPrivateDeploy){
-                jumpUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri="+pcUrl+"&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";
+                jumpUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wwdd1137a65ce0fc87&redirect_uri="+pcUrl+"&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";
             }else {
-                jumpUrl="https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";
+                jumpUrl="https://open.weixin.qq.com/connect/oauth2/authorize?appid=wwdd1137a65ce0fc87&redirect_uri=http://crm.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";
             }
 
             if (StringUtils.isEmpty(pageRouter)) {
@@ -308,7 +308,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                 }
                 else if ("task".equals(pageRouter)) {
                     //费用报销
-                    title = "工时管家:任务到期通知";
+                    title = "客户管家:任务到期通知";
                 }
             }
             cardJson.put("title", title);
@@ -452,7 +452,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
     @Override
     public String testDownloadFile() {
         try {
-            String url = "http://worktime.ttkuaiban.com/upload/bc4df504fa724e6cab69872e2c1cfb35.png";
+            String url = "http://crm.ttkuaiban.com/upload/bc4df504fa724e6cab69872e2c1cfb35.png";
             HttpHeaders headers = new HttpHeaders();
             ResponseEntity<byte[]> entity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(headers), byte[].class);
             byte[] body = entity.getBody();
@@ -2145,7 +2145,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
             shares.add(user);
         }
         calendar.put("admins",split);
-        calendar.put("summary","工时管家任务");
+        calendar.put("summary","客户管家任务");
         calendar.put("color","#0000FF");
         calendar.put("description",description);
         calendar.put("is_public",0);

+ 1 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/util/MD5Util.java

@@ -22,7 +22,7 @@ public class MD5Util {
     }
 
     public static void main(String[] args) throws ParseException {
-        System.out.println(getPassword("工时管家"));
+        System.out.println(getPassword("客户管家"));
 
     }
 

+ 5 - 5
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/util/SyncSapUtils.java

@@ -24,7 +24,7 @@ import java.util.stream.Collectors;
 public class SyncSapUtils {
 
 
-    //工时管家推送项目任务计划工时数据到SAP
+    //客户管家推送项目任务计划工时数据到SAP
     public static List<SapSyncLog> pushProjectPlanToSap(List<Map<String, Object>> mapList, Integer companyId, String operator,boolean isDev) {
         //根据项目分组 按照项目推送
         //获取当前数据中的所有项目编号
@@ -119,7 +119,7 @@ public class SyncSapUtils {
         return sapSyncLogs;
     }
 
-    //推送工时管家填报考勤数据到SAP
+    //推送客户管家填报考勤数据到SAP
     public static String pushReportToSap(Map<String,Object> map,boolean isDev){
         //配置xml请求参数
         XmlRequestData xmlRequestData=new XmlRequestData();
@@ -198,7 +198,7 @@ public class SyncSapUtils {
     }
 
 
-    //同步SAP项目数据到工时管家
+    //同步SAP项目数据到客户管家
     public static XmlResponseData syncProjectFromSap(String startDate, String endDate,String projectCodes,boolean isDev) {
         //配置请求xml
         XmlRequestData xmlRequestData=new XmlRequestData();
@@ -268,7 +268,7 @@ public class SyncSapUtils {
     }
 
 
-    //同步SAP项目数据到工时管家
+    //同步SAP项目数据到客户管家
     public static XmlResponseData getHasPushForSap(String startDate, String endDate,String employeeID,boolean isDev) {
         //配置请求xml
         XmlRequestData xmlRequestData=new XmlRequestData();
@@ -329,7 +329,7 @@ public class SyncSapUtils {
     }
 
 
-    //同步SAP项目服务数据到工时管家
+    //同步SAP项目服务数据到客户管家
     public static XmlResponseData syncServiceData(String startDate, String endDate, Integer companyId,boolean isDev) {
         //配置请求xml
         XmlRequestData xmlRequestData=new XmlRequestData();

+ 8 - 11
fhKeeper/formulahousekeeper/management-crm/src/main/resources/application.yml

@@ -15,12 +15,9 @@ spring:
       location: C:/upload/
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-#    url: jdbc:mysql://47.101.180.183:17089/man_crm?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
-#    username: root
-#    password: P011430@Huoshi*
-    url: jdbc:mysql://127.0.0.1:3306/man_crm?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
+    url: jdbc:mysql://47.101.180.183:17089/man_crm?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
     username: root
-    password: p011430seya
+    password: P011430@Huoshi*
 
     hikari:
       maximum-pool-size: 60
@@ -109,7 +106,7 @@ picrecongnize:
   develop: C:/picrecongnize/develop/
   im: C:/picrecongnize/im/
   design: C:/picrecongnize/design/
-# 智能工时管家公众号参数
+# 智能客户管家公众号参数
 wx:
   template_report_fill: lhwkaW9BKwCvMtCuoAxLw4lZoGgMaucL0Ap0Vz-5KOY
   app_id: wx749c84daac654e1e
@@ -149,12 +146,12 @@ referer:
 excludeUrls: /wxcorp/*,/wxcorp/*/*,/dingding/*,/feishu-info/*,/error,/testClient,/corpWXAuth,/corpWXScanningAuth,/corpInsideWXAuth,/wx-corp-info/*,/clean/*,/innerRoles/*,/project/getProjectListByToken,/project/getTimeCostByToken,/report/getReportListByToken,/report/getProcessErrorData,/project/synchronizationProject,/user/updateUserDeptHierarchy,/report/getUserTimeCostByThird,/report/getProjectTimeCostByThird
 
 #企业微信相关参数
-suitId: ww4e237fd6abb635af
-suitSecret: 1ApL6LIB4Z0v7wBrKTUNmJrerRWV3gEQWBlYOm8Kijw
+suitId: wwdd1137a65ce0fc87
+suitSecret: whAD0XKOmaJW4SwrIpu6BBwKAJbqOriHfPIKrvJ02Ic
 #平台作为服务商的参数
 corpId: wwf11426cf618e1703
-token: Mhi7ehNX61UN4MB7PHnC
-encodingAesKey: PHVMkME1XMrImmGJZ4OZJxSysI7hFEhtDDUQrlHAfIS
+token: aXLyq2JL1nRFFLhblHL2RX23SN46z4Q5
+encodingAesKey: 6W8MswvI1HEgITZ7Wu9ffIWvEbMakgDnaQkGW48dQ17
 providerSecret: wlwGIUXskWKsNtCfKUsAfJ6ueba55rZnqZvcC-rUM6nQ-LnRDyYgISQ2BO-UlL_A
 
 configEnv:
@@ -171,7 +168,7 @@ sftp:
   isEnabled: false
   server: 101.132.166.205
   port: 22022
-  remoteDir: /bkup/timesheet
+  remoteDir: /bkup/crm
   user: root
   password: Huoshi@2022
 

+ 10 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -4347,6 +4347,16 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         int cnt = 0;
         List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "审核全员日报");
         List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().in("id", ids));
+        //检查是否有项目或者部门审核通过的
+        if (functionList.size() == 0) {
+            for (Report report : reportList) {
+                if (report.getProjectAuditState() == 1 || report.getGroupAuditState() == 1 || report.getDepartmentAuditState() == 1) {
+                    //msg.setError("已存在审核人审核通过,无法撤回");
+                    msg.setError(MessageUtils.message("finance.hasApprovedReport"));
+                    return msg;
+                }
+            }
+        }
         for (Integer reportId : ids) {
             Report report = new Report();
             report.setState(3);//待提交,即草稿状态

+ 1 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages.properties

@@ -158,6 +158,7 @@ finance.skipData=跳过以下已审核数据:{0}。
 finance.importErrorByAllAdopt=本次数据全部已审核通过,无法导入。
 finance.review=专业审核
 finance.dept=部门审核
+finance.hasApprovedReport=已存在审核人审核通过,无法撤回。请联系管理员操作。
 # pdf相关
 pdf.previewError=该格式不支持在线预览
 # 日报相关

+ 1 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages_en_US.properties

@@ -158,6 +158,7 @@ finance.skipData=Skipping the following audited data: '{0}'.
 finance.importErrorByAllAdopt=This data has been approved and cannot be imported.
 finance.review=Professional review
 finance.dept=Department review
+finance.hasApprovedReport=Some daily reports have been approved, unable to operate. Please contact your system manager.
 # pdf相关
 pdf.previewError=This format does not support online preview.
 # 日报相关

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

@@ -2,9 +2,9 @@ var path = require('path')
 
 //  var ip = '192.168.2.12'
 // var ip = '47.101.180.183'
-var ip = '47.100.37.243'
+// var ip = '47.100.37.243'
 // var ip = '192.168.10.2'
-// var ip = '192.168.2.8' 
+var ip = '192.168.2.3' 
 
 // var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
 // for (var i in ifaces) {

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

@@ -8095,7 +8095,7 @@
                                 });
                             } else if (this.user.companyId == 469) {
                                 //试点,针对赛元微电子校验考勤工时
-                                if (this.workForm.time.workHours) {
+                                if (this.workForm.time && this.workForm.time.workHours) {
                                     if (this.totalReportHours > this.workForm.time.workHours) {
                                         this.$message({
                                             message: '填报工时不得超过考勤时长',
@@ -8113,6 +8113,11 @@
                                     } else {
                                         this.submitReportSon();
                                     }
+                                } else {
+                                    this.$message({
+                                            message: '暂无考勤数据,无法填报。请尝试刷新考勤记录。',
+                                            type: "error"
+                                        });
                                 }
                             } else {
                                 if(this.totalReportHours < this.user.timeType.allday){

+ 44 - 0
fhKeeper/formulahousekeeper/webttkuaiban/src/main/java/com/firerock/webttkuaiban/demos/controller/ArticleTemplateController.java

@@ -104,4 +104,48 @@ public class ArticleTemplateController {
         model.addAttribute("categoryNameList", article.getCategoryNameList() == null ? new ArrayList<String>() : article.getCategoryNameList());
         return "knowledgeDetails";
     }
+
+    @GetMapping("/articleDetail")  // 这里的 PageBean 是事先定义好的实体类
+    public Object articleDetailById(Model model, @RequestParam Integer id) {
+        // 定义格式化器
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+        long l = System.currentTimeMillis();
+        List<Article> latestList = articleService.latestList();
+        if (!latestList.isEmpty()) {
+            for (Article article : latestList) {
+                byte[] imageData = article.getCoverImg();
+                if (imageData != null) {
+                    String base64Image = Base64.getEncoder().encodeToString(imageData);
+                    article.setBaseImage(base64Image);
+                } else {
+                    article.setBaseImage("");
+                }
+                article.setCreateTimeStr(article.getCreateTime().format(formatter));
+            }
+        }
+        List<Article> relatedList = articleService.relatedList(id);
+        if (!relatedList.isEmpty()) {
+            for (Article article : relatedList) {
+                byte[] imageData = article.getCoverImg();
+                if (imageData != null) {
+                    String base64Image = Base64.getEncoder().encodeToString(imageData);
+                    article.setBaseImage(base64Image);
+                } else {
+                    article.setBaseImage("");
+                }
+                article.setCreateTimeStr(article.getCreateTime().format(formatter));
+            }
+        }
+        Article article = articleService.getArticleById(id);
+        article.setCreateTimeStr(article.getCreateTime().format(formatter));
+
+        articleService.updateViewCountById(id);
+
+        model.addAttribute("latestList", latestList);
+        model.addAttribute("relatedList", relatedList);
+        model.addAttribute("article", article);
+        model.addAttribute("categoryNameList", article.getCategoryNameList() == null ? new ArrayList<String>() : article.getCategoryNameList());
+        return "knowledgeDetails";
+    }
 }