Browse Source

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

QuYueTing 1 tuần trước cách đây
mục cha
commit
d91be17c23
21 tập tin đã thay đổi với 312 bổ sung112 xóa
  1. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/index.html
  2. 2 2
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/index copy.vue
  3. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/index.vue
  4. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/my/index copy 2.vue
  5. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/my/index copy.vue
  6. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/my/index.vue
  7. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/index.html
  8. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/header/header.vue
  9. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/login.vue
  10. 5 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  11. 34 3
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/AttendanceStaffServiceImpl.java
  12. 12 1
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/attendanceCalendar/employeeCalendar.vue
  13. 14 3
      fhKeeper/formulahousekeeper/timesheet/src/views/contract/components/customContract.vue
  14. 33 33
      fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue
  15. 5 3
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  16. 9 3
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue
  17. 11 11
      fhKeeper/formulahousekeeper/timesheet_h5/vue.config.js
  18. 5 8
      fhKeeper/formulahousekeeper/webttkuaiban/src/main/resources/static/css/dynamic.css
  19. 82 0
      fhKeeper/formulahousekeeper/webttkuaiban/src/main/resources/static/details/ai-customer-management-system.html
  20. 82 0
      fhKeeper/formulahousekeeper/webttkuaiban/src/main/resources/static/details/rd-compliance-management.html
  21. 10 32
      fhKeeper/formulahousekeeper/webttkuaiban/src/main/resources/static/dynamic.html

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/index.html

@@ -4,7 +4,7 @@
     <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>智能客户管家CRM</title>
+    <title>火石智能客户管家CRM</title>
     <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>
     <!-- <script src="https://s.url.cn/qqun/qun/qqweb/m/qun/confession/js/vconsole.min.js "></script> -->

+ 2 - 2
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/index copy.vue

@@ -3,7 +3,7 @@
     <template v-slot:headerLeft>
       <div class="homeheaderleft">
         <img src="/src/assets/image/home_logo.png">
-        <div class="text-white">智能客户管家CRM</div>
+        <div class="text-white">火石智能客户管家CRM</div>
       </div>
     </template>
     <template v-slot:headerRight>
@@ -35,7 +35,7 @@
       <!-- 显示对应的模块 -->
       <van-popup v-model:show="showModule" closeable position="bottom" round>
         <div class="newModuleAdded relative">
-          <div class="text-size-large text-[#474A56] absolute topTitle">智能客户管家CRM</div>
+          <div class="text-size-large text-[#474A56] absolute topTitle">火石智能客户管家CRM</div>
           <div class="flex flex-wrap">
             <template v-for="(item) in moduleList" :key="item.id">
               <div class="w-16 flex flex-col items-center mrSpacing" @click.stop="toAddEditor(item)">

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

@@ -4,7 +4,7 @@
       <div class="homeheaderleft">
         <img src="/src/assets/image/home_logo.png">
         <!-- <div class="text-white">客户管家<ww-open-data :openid="useInfo.userInfo.name" type="userName"></ww-open-data></div> -->
-        <div class="text-white">智能客户管家CRM</div>
+        <div class="text-white">火石火石智能客户管家CRM</div>
       </div>
     </template>
 

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/my/index copy 2.vue

@@ -105,7 +105,7 @@ function bindWeiXin() {
     return;
   }
 
-  var appId = "wx1c1d8fc81bc073a8"; //智能客户管家公众号
+  var appId = "wx1c1d8fc81bc073a8"; //火石智能客户管家公众号
   var url =
     "https://mobcrm.ttkuaiban.com/api/wechat/bindWeiXin2?userId=" +
     userInfo.userInfo.id; //工时管家公众号授权回调页面

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/my/index copy.vue

@@ -99,7 +99,7 @@ function bindWeiXin() {
     return;
   }
 
-  var appId = "wx1c1d8fc81bc073a8";//智能客户管家公众号
+  var appId = "wx1c1d8fc81bc073a8";//火石智能客户管家公众号
   var url = "https://mobcrm.ttkuaiban.com/api/wechat/bindWeiXin2?userId=" + userInfo.userInfo.id;//工时管家公众号授权回调页面
   if (isCorpWX.value) {
     appId = "ww4e237fd6abb635af"; //企业微信第三方的SUIT ID

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/my/index.vue

@@ -105,7 +105,7 @@ function bindWeiXin() {
     return;
   }
 
-  var appId = "wx1c1d8fc81bc073a8"; //智能客户管家公众号
+  var appId = "wx1c1d8fc81bc073a8"; //火石智能客户管家公众号
   var url =
     "https://mobcrm.ttkuaiban.com/api/wechat/bindWeiXin2?userId=" +
     userInfo.userInfo.id; //工时管家公众号授权回调页面

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/index.html

@@ -4,7 +4,7 @@
   <meta charset="UTF-8" />
   <link rel="icon" type="image/svg+xml" href="./logo.svg" />
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-  <title>智能客户管家</title>
+  <title>火石智能客户管家</title>
 </head>
 
 <body>

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

@@ -1,7 +1,7 @@
 <template>
   <div class="trademark mr-8 flex items-center text-white">
     <img :src="loginLogin" class="w-10 h-10 mr-4" />
-    <div class="text-nowrap">智能客户管家</div>
+    <div class="text-nowrap">火石智能客户管家</div>
   </div>
   <div class=" flex flex-row justify-start items-center text-white flex-1 parentDiv" ref="parentDiv">
     <div v-for="(routerItem, routerItemIdex) in routerList" @click="setCurrentRouter(routerItem)"

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

@@ -4,7 +4,7 @@
       <div class="m-auto pt-4">
         <img class="w-1/5 m-auto" :src="loginLogo" alt="">
       </div>
-      <h2 class="text-xl text-center pt-4 font-bold">智能客户管家</h2>
+      <h2 class="text-xl text-center pt-4 font-bold">火石智能客户管家</h2>
       <el-form class="pt-4" ref="ruleFormRef" :model="ruleForm" :rules="rules">
         <el-form-item prop="username">
           <el-input clearable :prefix-icon="UserFilled" size="large" class="mt-2" v-model.trim="ruleForm.username"

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

@@ -12703,11 +12703,11 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 
             if (reportList.size() > 0) {
                 int shouldSkipPassData = 0;
-                if (timeType.getImportReportAuditNormal() == 1) {
-                    shouldSkipPassData = 1;
-                } else {
-                    shouldSkipPassData = timeType.getNeedDeptAudit();
-                }
+//                if (timeType.getImportReportAuditNormal() == 1) {
+//                    shouldSkipPassData = 1;
+//                } else {
+//                    shouldSkipPassData = timeType.getNeedDeptAudit();
+//                }
                 //依赖于对是否需要部门审核的判断,如果不需要则认为导入的就是审核通过的,重新导入就直接覆盖之前的。
                 reportMapper.deleteUserSameDayReport(companyId, reportList, shouldSkipPassData);
                 if (shouldSkipPassData == 1) {

+ 34 - 3
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/AttendanceStaffServiceImpl.java

@@ -151,7 +151,7 @@ public class AttendanceStaffServiceImpl extends ServiceImpl<AttendanceStaffMappe
                             if (applyForm.getSumTime().compareTo(BigDecimal.valueOf(8))>=0){
                                 staff.setClockStartTime(LocalDateTime.of(date, LocalTime.of(8, 0)));
                                 staff.setClockEndTime(LocalDateTime.of(date, LocalTime.of(17, 0)));
-                                staff.setWorkHour(BigDecimal.valueOf(8));
+                                staff.setWorkHour(applyForm.getSumTime());//以加班申请的时长为准
                                 staff.setAttendanceType(JIA_BAN);
                                 staff.setAttendanceTypeName("加班");
                             }
@@ -360,6 +360,19 @@ public class AttendanceStaffServiceImpl extends ServiceImpl<AttendanceStaffMappe
                                     && !a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue+1, dayeBanRule.getEndWorkEndTime().getHour(), dayeBanRule.getEndWorkEndTime().getMinute()))
                             ).max(Comparator.comparing(Attendance::getClockTime));
 
+                    //当天只有一次打卡的情况,为班次异常
+                    boolean onlyOnce = attendances.stream().filter(a->a.getClockTime().toLocalDate().isEqual(date)).count() == 1;
+                    if (onlyOnce) {
+                        //仅仅一次打卡,为异常班次
+                        attendances.stream().filter(a->a.getClockTime().toLocalDate().isEqual(date)).findFirst().ifPresent(a->{
+                           LocalDateTime time = a.getClockTime();
+                           staff.setClockStartTime(time);
+                           staff.setAttendanceType(YI_CHANG);
+                           staff.setAttendanceTypeName("班次异常");
+                           staff.setWorkHour(new BigDecimal(0));
+                        });
+                    }
+
                     //1先判断白班
                     if (zaoShangCount.isPresent()&&zaoXiaCount.isPresent()) {
                         LocalDateTime startClockTime = zaoShangCount.get().getClockTime();
@@ -461,7 +474,7 @@ public class AttendanceStaffServiceImpl extends ServiceImpl<AttendanceStaffMappe
                         staff.setAttendanceTypeName("大夜班");
                     }
                     //过滤掉空数据
-                    if (staff.getClockStartTime()!=null){
+                    if (!StringUtils.isEmpty(staff.getJobNumber()) && (staff.getClockStartTime()!=null || staff.getClockEndTime()!=null)) {
                         addList.add(staff);
                     }
                 }
@@ -668,7 +681,7 @@ public class AttendanceStaffServiceImpl extends ServiceImpl<AttendanceStaffMappe
 
             LocalDateTime clockStartTime = staff.getClockStartTime();
             LocalDateTime clockEndTime = staff.getClockEndTime();
-            if (clockStartTime!=null&&clockEndTime!=null) {
+            if (clockStartTime!=null && clockEndTime!=null) {
                 DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
                 LocalTime startTime = clockStartTime.toLocalTime();
                 LocalTime endTime = clockEndTime.toLocalTime();
@@ -1274,6 +1287,24 @@ public class AttendanceStaffServiceImpl extends ServiceImpl<AttendanceStaffMappe
                     map.put("res", stringBuilder.toString());
                     map.put("color","#F56C6C");
                     mapList.add(map);
+                } else if (clockStartTime != null) {
+                    DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
+                    LocalTime startTime = clockStartTime.toLocalTime();
+                    String startStr = startTime.format(timeFormatter);
+                    HashMap<String, Object> map = new HashMap<>();
+                    map.put("msg", startStr + "上班考勤打卡");
+                    map.put("res", "未知");
+                    mapList.add(map);
+                } else if (clockEndTime != null) {
+                    DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
+                    LocalTime endTime = clockEndTime.toLocalTime();
+                    String endStr = endTime.format(timeFormatter);
+                    HashMap<String, Object> map = new HashMap<>();
+                    map.put("res", "未知");
+                    String str = endStr + "下班考勤打卡:";
+                    map.put("msg",str );
+                    map.put("color","#F56C6C");
+                    mapList.add(map);
                 }
                 staff.setMaplist(mapList);
             }

+ 12 - 1
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/attendanceCalendar/employeeCalendar.vue

@@ -3,7 +3,8 @@
     <div class="calendar-left">
       <el-calendar v-model="calendarValue">
         <div slot="dateCell" slot-scope="data" class="calendar-cell" @click="setRightRow(data.data.day)">
-          <div>{{ dayjs(data.date).format("DD") }}</div>
+          <!-- <div>{{ dayjs(data.date).format("dddd") }}</div> -->
+          <div>{{ weekMap[dayjs(data.date).format("dddd")] }}</div>
           <div class="calendar-cell-text" :style="`color: ${getDateRow(data.data.day).color}`">{{ getDateRow(data.data.day).attendanceTypeName }}</div>
         </div>
       </el-calendar>
@@ -11,6 +12,7 @@
     <div class="calendar-right">
       <template v-if="personnelAttendanceRowList.attendanceTypeName">
         <div class="list">考勤时间:{{ personnelAttendanceRowList.clockDate }}</div>
+        <!-- <div class="list" v-if="personnelAttendanceRowList.clockStartTime && personnelAttendanceRowList.clockEndTime">打卡时间:{{ personnelAttendanceRowList.clockStartTime }} - {{ personnelAttendanceRowList.clockEndTime }} ({{ personnelAttendanceRowList.workHour }}h)</div> -->
         <div class="list">考勤状态:<span :style="`color: ${personnelAttendanceRowList.color || '#000'}`">{{ personnelAttendanceRowList.attendanceTypeName }}</span></div>
         <div class="list" v-for="(item, index) in personnelAttendanceRowList.maplist || []" :key="index">
           {{ item.msg }} <span :style="`color: ${item.color || '#000'}`">{{ item.res }}</span>
@@ -54,6 +56,15 @@ export default {
       },
       haveYouViewedAllOfThem: false,
       user: JSON.parse(sessionStorage.getItem('user')),
+      weekMap: {
+        '星期一': '周 一',
+        '星期二': '周 二',
+        '星期三': '周 三',
+        '星期四': '周 四',
+        '星期五': '周 五',
+        '星期六': '周 六',
+        '星期天': '周 日',
+      }
     };
   },
   methods: {

+ 14 - 3
fhKeeper/formulahousekeeper/timesheet/src/views/contract/components/customContract.vue

@@ -332,7 +332,7 @@
 
           <el-form-item label="付款计划">
             <el-table :data="contractPaymentList" size="small" :height="'300px'"
-              show-header="false" style="margin-top:10px;">
+              show-header="false" style="margin-top:10px;" ref="contractPaymentTableRef">
               <el-table-column prop="isPayed" width="120">
                 <template slot-scope="scope">
                   <el-checkbox v-model="scope.row.isPayed">已付款</el-checkbox>
@@ -957,8 +957,19 @@ export default {
         stampDutyTime: ''
       }
 
-      // this.contractPaymentList.push(val)
-      this.contractPaymentList.unshift(val)
+      this.contractPaymentList.push(val)
+
+      this.$nextTick(() => {
+        this.scrollToBottom('contractPaymentTableRef');
+      });
+    },
+    scrollToBottom(refName) {
+      const tableRef = this.$refs[refName];
+      if (tableRef) {
+        // el-table 内部的滚动容器
+        const bodyWrapper = tableRef.bodyWrapper;
+        bodyWrapper.scrollTop = bodyWrapper.scrollHeight;
+      }
     },
 
     getProjectList() {

+ 33 - 33
fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue

@@ -77,38 +77,38 @@
         <!--设置时长样式内容-->
         <p style="margin-left:10px;color:#666;">{{ $t('employeeworkinghours') }}</p>
         <el-row :gutter="20" style="padding-top:10px;width:100%;margin:0 auto;padding-left:10px;padding-right:10px;">
-        <el-col :span="6" >
+        <el-col :span="6" v-if="false">
         <!-- 上下午固定时长-->
-        <div class="panel panelFixation" >
-        <el-radio v-model="timeType.type" :label="0" style="width:100%">{{ $t('reportintheafternoon') }}
-        <el-form  ref="form1" :model="timeType" :rules="rules" label-width="5rem" style="color:#333;">
-        <el-form-item>
-        </el-form-item>  
-        <span style="color:#999;display:block;line-height:2rem;margin:1rem 0;">{{ $t('settheduration') }}</span>
-        <el-form-item :label="$t('daylong')" prop="allday">
-            <el-select v-model="timeType.allday" placeholder="$t('defaultText.pleaseChoose')" style="width:120px;" @change="timeChange">
-                <el-option v-for="item in times" :key="item" :label="item.toFixed(1)" :value="item"></el-option>
-            </el-select>
-            {{ $t('time.hour') }} 
+        <div class="panel panelFixation">
+            <el-radio v-model="timeType.type" :label="0" style="width:100%">{{ $t('reportintheafternoon') }}
+            <el-form  ref="form1" :model="timeType" :rules="rules" label-width="5rem" style="color:#333;">
+            <el-form-item>
+            </el-form-item>  
+            <span style="color:#999;display:block;line-height:2rem;margin:1rem 0;">{{ $t('settheduration') }}</span>
+            <el-form-item :label="$t('daylong')" prop="allday">
+                <el-select v-model="timeType.allday" placeholder="$t('defaultText.pleaseChoose')" style="width:120px;" @change="timeChange">
+                    <el-option v-for="item in times" :key="item" :label="item.toFixed(1)" :value="item"></el-option>
+                </el-select>
+                {{ $t('time.hour') }} 
+                </el-form-item>
+            <el-form-item :label="$t('morningtime')" prop="am" >
+                <el-select v-model="timeType.am" placeholder="$t('defaultText.pleaseChoose')" style="width:120px;" @change="timeChange">
+                    <el-option v-for="item in halfTime" :key="item" :label="item.toFixed(1)" :value="item"></el-option>
+                </el-select>
+                {{ $t('time.hour') }} 
             </el-form-item>
-        <el-form-item :label="$t('morningtime')" prop="am" >
-            <el-select v-model="timeType.am" placeholder="$t('defaultText.pleaseChoose')" style="width:120px;" @change="timeChange">
-                <el-option v-for="item in halfTime" :key="item" :label="item.toFixed(1)" :value="item"></el-option>
-            </el-select>
-            {{ $t('time.hour') }} 
-        </el-form-item>
-        <el-form-item :label="$t('afternoontime')" prop="pm" >
-            <el-select v-model="timeType.pm" disabled placeholder="$t('defaultText.pleaseChoose')" style="width:120px;" >
-                <el-option v-for="item in halfTime" :key="item" :label="item.toFixed(1)" :value="item"></el-option>
-            </el-select>
-            {{ $t('time.hour') }} 
-        </el-form-item>
-        </el-form>
-        </el-radio>
+            <el-form-item :label="$t('afternoontime')" prop="pm" >
+                <el-select v-model="timeType.pm" disabled placeholder="$t('defaultText.pleaseChoose')" style="width:120px;" >
+                    <el-option v-for="item in halfTime" :key="item" :label="item.toFixed(1)" :value="item"></el-option>
+                </el-select>
+                {{ $t('time.hour') }} 
+            </el-form-item>
+            </el-form>
+            </el-radio>
         </div>
         </el-col>
         <!-- 选择小时数样式 -->
-        <el-col :span="6">   
+        <el-col :span="8">   
         <div class="panel panelFixation">
         <el-radio v-model="timeType.type" :label="1">{{ $t('chooseyourownhours') }}
         <el-form  class="sample" style="color:#333;">
@@ -128,7 +128,7 @@
         
         </el-col>
         <!--选择时间段样式 -->
-        <el-col :span="6">  
+        <el-col :span="8">  
         <div  class="panel panelFixation" >
             <el-radio v-model="timeType.type" :label="2">{{ $t('owntimeframe') }}
             <el-form class="sample" style="color:#333;">
@@ -166,7 +166,7 @@
         </el-col>
 
         <!--选择按比例分配样式 -->
-        <el-col :span="6">  
+        <el-col :span="8">  
         <div  class="panel panelFixation" >
             <el-radio v-model="timeType.type" :label="3">{{ $t('timeproportionally') }}
             <el-form class="sample" style="color:#333;">
@@ -1877,8 +1877,8 @@
                 })
             },
             submitInsert() {
-                this.$refs.form1.validate(valid => {
-                    if (valid) {
+                // this.$refs.form1.validate(valid => {
+                    // if (valid) {
                         var param = JSON.parse(JSON.stringify(this.timeType));
                         if(param.needDeptAudit) {
                             param.needDeptAudit = 1
@@ -2005,8 +2005,8 @@
                                 });
                                 }
                             );
-                        }
-                });
+                        // }
+                // });
             },
 
             // 获取本公司的工作时间设置

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

@@ -442,7 +442,6 @@
                         <!--批量填报不显示考勤记录-->
                         <span v-if="!isBatch && (user.timeType.syncDingding==1 || user.timeType.syncCorpwxTime==1 || user.timeType.syncFanwei==1)&&!workForm.time" >{{$t('other.noAttendanceRecord')}}</span>
                         <!--针对明夷,批量填报(不含代填)情况下显示考勤时长-->
-                        
                         <el-button type="default" style="margin-left:5px;" size="small" :loading="syncTimeLoading" 
                         v-if="!isBatch && user.timeType.syncCorpwxTime==1 && !isSubstitude" icon="el-icon-refresh" 
                                 @click="refreshWXCardTime(workForm.createDate)"></el-button>
@@ -450,6 +449,9 @@
                         v-if="!isBatch && user.timeType.syncDingding==1 && !isSubstitude" icon="el-icon-refresh" 
                                 @click="refreshDDCardTime(workForm.createDate)"></el-button>
                         <el-button type="default" style="margin-left:5px;" size="small" :loading="syncTimeLoading" 
+                        v-if="!isBatch && user.timeType.syncDingding==1 && isSubstitude && workForm.userNames" icon="el-icon-refresh" 
+                                @click="refreshDDCardTime(workForm.createDate,( workForm.userId && workForm.userId[0]))"></el-button>
+                        <el-button type="default" style="margin-left:5px;" size="small" :loading="syncTimeLoading" 
                         v-if="!isBatch && user.companyId === 5978" icon="el-icon-refresh" 
                                 @click="refreshBeiSengAttendance(workForm.createDate)"></el-button>
                         <el-button type="default" style="margin-left:5px;" size="small" :loading="syncTimeLoading" 
@@ -3337,12 +3339,12 @@
                 let ma = ms / 1000 / 60 / 60
                 return ma;  //小时
             },
-            refreshDDCardTime(workdate) {
+            refreshDDCardTime(workdate, userId) {
                 if (!workdate) return;
                 this.syncTimeLoading = true;
                 this.http.post('/dingding/refreshUserCardTime',{
                     companyId: this.user.companyId,
-                    userId: this.user.id,
+                    userId: userId ? userId : this.user.id,
                     date: workdate,
                 },res => {
                     this.syncTimeLoading = false;

+ 9 - 3
fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue

@@ -59,6 +59,11 @@
                             style="height:0.6rem;padding:0 0.16667rem;" :loading="cardRefLoading" loading-size="0.26667rem"
                             @click.stop.native="cardtimeRefresh(form.createDate)"
                             v-if="!substitute && (user.timeType.syncDingding == 1 || user.timeType.syncCorpwxTime == 1)"></van-button>
+
+                            <van-button icon="replay" native-type="button" type="default" size="mini"
+                            style="height:0.6rem;padding:0 0.16667rem;" :loading="cardRefLoading" loading-size="0.26667rem"
+                            @click.stop.native="cardtimeRefresh(form.createDate, (fillingAgent.id || ''))"
+                            v-if="substitute && fillingAgent.name && (user.timeType.syncDingding == 1 || user.timeType.syncCorpwxTime == 1)"></van-button>
                         </template>
                         <template v-if="user.companyId == 7536">
                             <van-button icon="replay" native-type="button" type="default" size="mini"
@@ -990,13 +995,14 @@ export default {
             return ma;  //小时
         },
 
-        cardtimeRefresh(workdate) {  // 考勤记录刷新
+        cardtimeRefresh(workdate, userId) {  // 考勤记录刷新
+            console.log(userId, '<==== userId')
             if (!workdate) return;
             this.cardRefLoading = true;
             this.$axios.post(this.user.timeType.syncDingding == 1?'/dingding/refreshUserCardTime':'/user-corpwx-time/getPunchRecordBySelf', {
                 date: workdate,
                 companyId: this.user.companyId,
-                userId: this.user.id
+                userId: userId ? userId : this.user.id
             })
                 .then(res => {
                     if (res.code == 'ok') {
@@ -2572,7 +2578,7 @@ export default {
                     this.$set(item, 'overtimeHours', 4)
                 }
             }
-            if (this.report.timeBasecostList.length != 0 && this.user.company.packageProject == 1) {
+            if (this.report.timeBasecostList && this.report.timeBasecostList.length != 0 && this.user.company.packageProject == 1) {
                 this.$set(item, 'basecostId', this.report.timeBasecostList[0].id)
                 this.$set(item, 'basecostName', this.report.timeBasecostList[0].name)
             }

+ 11 - 11
fhKeeper/formulahousekeeper/timesheet_h5/vue.config.js

@@ -5,19 +5,19 @@ const themePath = path.resolve(__dirname,'src/assets/style/theme.less');
 const Timestamp = new Date().getTime();
 
 // var ip = '47.101.180.183'
-// var ip = '47.100.37.243'
+var ip = '47.100.37.243'
 // var ip = '192.168.2.42'
-// var ip = '127.0.0.1'
+// var ip = '1.94.62.58'
 
-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
+//         }
+//     }
+// }
 
 module.exports = {
     runtimeCompiler: true,

+ 5 - 8
fhKeeper/formulahousekeeper/webttkuaiban/src/main/resources/static/css/dynamic.css

@@ -57,6 +57,8 @@
   transition: all 0.3s ease;
   position: relative;
   overflow: hidden;
+  text-decoration: none;
+  color: inherit;
 }
 
 .enterpriseDynamics .bifJournal .eachItem::before {
@@ -146,23 +148,18 @@
   align-items: center;
   font-size: 0.9rem;
   margin-top: auto;
+  pointer-events: none;
 }
 
 .enterpriseDynamics .bifJournal .eachItem .eachItemRight .eachItemRightBum .ons {
   color: #20a0ff;
-  cursor: pointer;
   font-weight: 500;
   padding: 0.3rem 0.8rem;
   background: rgba(32, 160, 255, 0.1);
   border-radius: 15px;
-  transition: all 0.3s ease;
   margin-right: 1rem;
-}
-
-.enterpriseDynamics .bifJournal .eachItem .eachItemRight .eachItemRightBum .ons:hover {
-  background: #20a0ff;
-  color: #fff;
-  transform: translateX(-2px);
+  display: inline-block;
+  pointer-events: none;
 }
 
 .enterpriseDynamics .bifJournal .eachItem .eachItemRight .eachItemRightBum span:last-child {

+ 82 - 0
fhKeeper/formulahousekeeper/webttkuaiban/src/main/resources/static/details/ai-customer-management-system.html

@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <meta name="keywords" content="AI智能客户管家管理系统,CRM系统,客户管理,销售管理,数字化转型" />
+    <meta name="description" content="发布AI智能客户管家管理系统,帮助企业的销售环节完成简单低成本的数字化转型。" />
+    <title>发布AI智能客户管家管理系统 - 工时管家</title>
+    <link rel="shortcut icon" type="image/x-icon" href="../favicon.ico" />
+    <link href="https://fonts.googleapis.com/css?family=Open+Sans:400,400i,700&display=swap&subset=latin-ext" rel="stylesheet">
+    <link href="../css/bootstrap.css" rel="stylesheet">
+    <link href="../css/font-awesome.css" rel="stylesheet">
+    <link href="../css/swiper.css" rel="stylesheet">
+    <link href="../css/magnific-popup.css" rel="stylesheet">
+    <link href="../css/styles.css" rel="stylesheet">
+    <link rel="stylesheet" href="../css/reset.css">
+    <link rel="stylesheet" href="../css/tongyong.css">
+    <link rel="stylesheet" href="../css/dynamic.css">
+    <link rel="stylesheet" href="../css/bottom.css">
+    <link rel="stylesheet" href="../css/element-uiCss.css">
+    <script src="../js/vue.min.js"></script>
+    <script src="../js/element-ui.js"></script>
+</head>
+
+<body data-spy="scroll" data-target=".fixed-top">
+    <div class="spinner-wrapper">
+        <div class="spinner">
+            <div class="bounce1"></div>
+            <div class="bounce2"></div>
+            <div class="bounce3"></div>
+        </div>
+    </div>
+
+    <!-- 头部 -->
+    <iframe id="headerIframe" src="../moduleView/header.html" class="iframeClass" onLoad="reinitIframe();"></iframe>
+
+    <!-- 主题内容 -->
+    <div class="enterpriseDynamics" id="app">
+        <div class="content">
+            <!-- 详情 -->
+            <div class="details">
+                <div class="detailsTil">
+                    <span>发布AI智能客户管家管理系统</span>
+                    <div class="detailsBack" onclick="history.back()">
+                        <i class="el-icon-arrow-left"></i> 返回
+                    </div>
+                </div>
+                <div class="detailsData">2024.08.01</div>
+                <div class="detailstext">
+                    帮助企业的销售环节完成简单低成本的数字化转型。系统通过灵活的自定义表单数据底座,实现从线索管理,商机管理到订单的转化。轻松创建和跟踪任务,提高团队协作效率。提供丰富可定制的数据报表,帮助您洞察业务趋势。价格透明,没有隐藏费用或功能限制。让您的企业拥有一个高效、可靠、易于使用的CRM系统。
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <!-- 底部 -->
+    <iframe id="bottomIframe" src="../moduleView/bottom.html" class="resetIframe resetIframebtn"></iframe>
+
+    <!-- Scripts -->
+    <script src="../js/js/jquery.min.js"></script>
+    <script src="../js/js/popper.min.js"></script>
+    <script src="../js/js/bootstrap.min.js"></script>
+    <script src="../js/js/jquery.easing.min.js"></script>
+    <script src="../js/js/swiper.min.js"></script>
+    <script src="../js/js/jquery.magnific-popup.js"></script>
+    <script src="../js/js/validator.min.js"></script>
+    <script src="../js/js/scripts.js"></script>
+
+    <script>
+        new Vue({
+            el: "#app",
+            data: {},
+            methods: {}
+        })
+    </script>
+
+    <script src="../js/iframe.js"></script>
+</body>
+
+</html>

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 82 - 0
fhKeeper/formulahousekeeper/webttkuaiban/src/main/resources/static/details/rd-compliance-management.html


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 10 - 32
fhKeeper/formulahousekeeper/webttkuaiban/src/main/resources/static/dynamic.html