Min 1 rok pred
rodič
commit
ee1a2b13f0

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

@@ -2644,5 +2644,10 @@ public class ReportController {
     public HttpRespMsg changeReminder(String createDate,String userId,String startDate,String endDate) throws Exception {
         return reportService.changeReminder(request,createDate,userId,startDate,endDate);
     }
+
+    @RequestMapping("/cancelReminder")
+    public HttpRespMsg cancelReminder(String createDate,String userId) throws Exception {
+        return reportService.cancelReminder(request,createDate,userId);
+    }
 }
 

+ 7 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/UserFvTime.java

@@ -19,7 +19,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2022-09-13
+ * @since 2024-05-08
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -51,6 +51,12 @@ public class UserFvTime extends Model<UserFvTime> {
     @TableField("work_hours")
     private Float workHours;
 
+    /**
+     * 是否被标记排除异常范围
+     */
+    @TableField("cancel_normal")
+    private Integer cancelNormal;
+
 
     @Override
     protected Serializable pkVal() {

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java

@@ -157,4 +157,6 @@ public interface ReportService extends IService<Report> {
     HttpRespMsg getUserDailyWorkTimeReminder(HttpServletRequest request, String startDate, String endDate,Integer deptId,Integer viewValue) throws Exception;
 
     HttpRespMsg exportUserDailyWorkTimeReminder(HttpServletRequest request, String startDate, String endDate,Integer deptId,Integer viewValue) throws Exception;
+
+    HttpRespMsg cancelReminder(HttpServletRequest request, String createDate, String userId);
 }

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

@@ -48,6 +48,7 @@ import java.math.RoundingMode;
 import java.sql.Timestamp;
 import java.text.DateFormat;
 import java.text.DecimalFormat;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.*;
 import java.time.format.DateTimeFormatter;
@@ -6151,6 +6152,11 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     if (!workDay){
                         continue;
                     }
+                    //去掉非工作日
+                    boolean workDay1 = WorkDayCalculateUtils.isWorkDay(date);
+                    if(!workDay1){
+                        continue;
+                    }
                     //去掉设置了分摊比例的人员
                     if (setPercentUserIdList.contains(curUser.getId())) {
                         continue;
@@ -9104,6 +9110,11 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         List<LocalDate> days = getDays(LocalDate.parse(startDate, df), LocalDate.parse(endDate, df));
         for (User item : needRangeUserList) {
             for (LocalDate day : days) {
+                boolean workDay = WorkDayCalculateUtils.isWorkDay(day);
+                //去掉非工作日
+                if(!workDay){
+                    continue;
+                }
                 boolean match = list.stream().anyMatch(l -> l.get("createDate").equals(df.format(day)) && l.get("userId").equals(item.getId()));
                 if(!match){
                     Map<String,Object> map=new HashMap<>();
@@ -9115,6 +9126,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     Optional<UserFvTime> time = userFvTimeList.stream().filter(u -> u.getWorkDate().isEqual(day) && u.getUserId().equals(item.getId())).findFirst();
                     if(time.isPresent()){
                         map.put("cardTime",time.get().getWorkHours());
+                        map.put("cancelNormal",time.get().getCancelNormal());
                     }else {
                         map.put("cardTime",0);
                     }
@@ -9125,6 +9137,31 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 }
             }
         }
+        // 进行排序 list:就是要排序的集合
+        Collections.sort(list, new Comparator<Map<String, Object>>() {
+            @Override
+            public int compare(Map<String, Object> o1, Map<String, Object> o2) {
+                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+                String userId1 = (String) o1.get("userId");
+                String userId2 = (String) o2.get("userId");
+//                    return date2.compareTo(date1);   //倒序
+                return userId1.compareTo(userId2);   // 正序
+            }
+        }.thenComparing(new Comparator<Map<String, Object>>() {
+            @Override
+            public int compare(Map<String, Object> o1, Map<String, Object> o2) {
+                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+                try {
+                    Date date1 = format.parse((String) o1.get("createDate"));
+                    Date date2 = format.parse((String) o2.get("createDate"));
+//                    return date2.compareTo(date1);   //倒序
+                    return date1.compareTo(date2);   // 正序
+                } catch (ParseException e) {
+                    e.printStackTrace();
+                }
+                return 0;
+            }
+        }));
         for (Map<String, Object> map : list) {
             //针对景昱 5978 校验填报工时是否超过考勤
             if(user.getCompanyId().equals(5978)){
@@ -9140,17 +9177,22 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     Method method = aClass.getMethod(getter);
                     String invoke = (String) method.invoke(targetUser);
                     if(invoke==null||invoke.equals("有加班费")){
-                        if(!(Double.valueOf(String.valueOf(map.get("workingTime"))).equals(Double.valueOf(String.valueOf(map.get("cardTime")))))){
+                        if((!(Double.valueOf(String.valueOf(map.get("workingTime"))).equals(Double.valueOf(String.valueOf(map.get("cardTime"))))))&&(map.containsKey("cancelNormal")&&(Integer)map.get("cancelNormal")!=1)){
                             map.put("exceedCardTime",1);
                         }
+                        map.put("invokeValue","有加班费");
                     }else{
-                        if((Double.valueOf(String.valueOf(map.get("workingTime")))<Double.valueOf(String.valueOf(map.get("cardTime"))))){
+                        if(((Double.valueOf(String.valueOf(map.get("workingTime")))<Double.valueOf(String.valueOf(map.get("cardTime")))))&&(map.containsKey("cancelNormal")&&(Integer)map.get("cancelNormal")!=1)){
                             map.put("exceedCardTime",1);
                         }
+                        map.put("invokeValue","无加班费");
                     }
                 }
             }
         }
+        if(viewValue==1){
+            list=list.stream().filter(l->Integer.valueOf(String.valueOf(l.get("exceedCardTime")))==1).collect(Collectors.toList());
+        }
         Map<String,Object> map=new HashMap<>();
         map.put("list",list);
         msg.setData(map);
@@ -9195,4 +9237,18 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         String fileName="工时异常表"+System.currentTimeMillis();
         return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName,dataList,path);
     }
+
+    @Override
+    public HttpRespMsg cancelReminder(HttpServletRequest request, String createDate, String userId) {
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LambdaQueryWrapper<UserFvTime> wrapper = new LambdaQueryWrapper<UserFvTime>().eq(UserFvTime::getCompanyId, companyId).eq(UserFvTime::getWorkDate, LocalDate.parse(createDate, df)).eq(UserFvTime::getUserId, userId);
+        UserFvTime userFvTime=new UserFvTime();
+        userFvTime.setCancelNormal(1);
+        if(userFvTimeMapper.update(userFvTime,wrapper)<=0){
+            msg.setError("操作失败");
+        }
+        return msg;
+    }
 }

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml

@@ -1248,7 +1248,7 @@
 
     <select id="getUserDailyWorkTimeReminder" resultType="java.util.Map">
         SELECT date_format(r.create_date,'%Y-%m-%d') AS createDate,u.name AS name,u.id as userId,u.corpwx_userid as corpwxUserId,d.corpwx_deptid as corpwxDeptId,d.department_name AS departmentName,
-        IFNULL(SUM(r.working_time),0) AS  workingTime,IFNULL(ufv.work_hours,0) AS cardTime
+        IFNULL(SUM(r.working_time),0) AS  workingTime,IFNULL(ufv.work_hours,0) AS cardTime,ufv.cancel_normal as cancelNormal
         FROM report  r
         LEFT JOIN user u ON r.creator_id=u.id
         LEFT JOIN department d ON d.department_id=u.department_id

+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserFvTimeMapper.xml

@@ -11,11 +11,12 @@
         <result column="start_time" property="startTime" />
         <result column="end_time" property="endTime" />
         <result column="work_hours" property="workHours" />
+        <result column="cancel_normal" property="cancelNormal" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, work_date, user_id, company_id, start_time, end_time, work_hours
+        id, work_date, user_id, company_id, start_time, end_time, work_hours, cancel_normal
     </sql>
 
 </mapper>

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

@@ -1652,10 +1652,15 @@
               <el-button size="small" @click="getThisWeek(2)">{{$t('time.nextWeek')}}</el-button>
             </div>
             <div>
-                <el-input style="float:left;width:22%" v-if="user.userNameNeedTranslate != '1'" v-model="searchKeyword" class="input-with-select" :placeholder="$t('defaultText.pleaseEnterNametoSearch')" clearable="true" size="small">
-                    <el-button slot="append" @click="searchScreen(0)" icon="el-icon-search"></el-button>
-                </el-input>
-                <selectCat v-if="user.userNameNeedTranslate == '1'" :filterable="true"  :searchBoxTop="'1'" :size="'small'" :subject="usersList" :subjectId="usersListId" :distinction="'12'" :clearable="true" @selectCal="selectCal"></selectCat>
+                <div style="margin-top:10px;">
+                    <el-input style="float:left;width:18%" v-if="user.userNameNeedTranslate != '1'" v-model="searchKeyword" class="input-with-select" :placeholder="$t('defaultText.pleaseEnterNametoSearch')" clearable="true" size="small">
+                        <el-button slot="append" @click="searchScreen(0)" icon="el-icon-search"></el-button>
+                    </el-input>
+                    <selectCat v-if="user.userNameNeedTranslate == '1'" :filterable="true"  :searchBoxTop="'1'" :size="'small'" :subject="usersList" :subjectId="usersListId" :distinction="'12'" :clearable="true" @selectCal="selectCal"></selectCat>
+                    <el-cascader v-if="user.userNameNeedTranslate != 1" :size="'small'" v-model="deptIdForReminder" placeholder="请选择部门" :options="departmentList" :props="{ checkStrictly: true, value: 'id' }" clearable style="width: 200px;" @change="showMonthWorkTimeReminder()"></el-cascader>
+                    <vueCascader :size="'small'" :widthStr="'200'" :clearable="true" :subject="departmentList" :radios="true" :distinction="'1'" @vueCasader="vueCasader" v-if="user.userNameNeedTranslate == 1" :selectNameChuan="$t('other.allDepartments')" @change="showMonthWorkTimeReminder()"></vueCascader>
+                    <el-checkbox v-model="isReminder" @change="showMonthWorkTimeReminder()">是否异常</el-checkbox>
+                </div>
             </div>
             <div style="float: right; vertical-align: middle;height:32px">
               <el-link
@@ -1682,19 +1687,24 @@
             v-loading="tbload"
             :lazy="true"
           >
-            <el-table-column width="180" type="index" fixed="left" :label="'日期'">
+            <el-table-column width="120" type="index" fixed="left" :label="'日期'">
               <template slot-scope="scope">
                 {{ scope.row.createDate}}
               </template>
             </el-table-column>
 
-            <el-table-column width="160" prop="name" fixed="left" :label="$t('lable.name')">
+            <el-table-column width="120" prop="name" fixed="left" :label="$t('lable.name')">
                 <template slot-scope="scope">
                     <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='scope.row.name'></TranslationOpenDataText></span>
                     <span v-if="user.userNameNeedTranslate != 1">{{scope.row.name}}</span>
                         <!-- {{scope.row.name}} -->
                 </template>
             </el-table-column>
+            <el-table-column width="100" prop="invokeValue" fixed="left" :label="'费用类型'">
+                <template slot-scope="scope">
+                        {{scope.row.invokeValue}}
+                </template>
+            </el-table-column>
             <el-table-column prop="departmentName" width="170" fixed="left" :label="$t('lable.department')">
                 <template slot-scope="scope">
                     <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='departmentName' :openid='scope.row.departmentName'></TranslationOpenDataText></span>
@@ -1723,6 +1733,7 @@
             <el-table-column width="160" type="index" fixed="left" :label="'催办'">
               <template slot-scope="scope">
                 <el-link v-if="scope.row.exceedCardTime==1" type="primary" @click="changeReminder(scope.row)">{{'变更提醒'}}</el-link>
+                <el-link v-if="scope.row.exceedCardTime==1" type="primary" @click="cancelReminder(scope.row)">{{'取消异常'}}</el-link>
               </template>
             </el-table-column>
 
@@ -2403,6 +2414,7 @@
                 weekIndex: 1,
                 weekParentData: {},
                 deptIdForNoReport:[],
+                deptIdForReminder:[],
 
                 nameAearch: '', // 企业微信姓名搜索
                 deptMembDataBackups: [], // 企业微信备份代填日报的树形结构
@@ -2418,7 +2430,8 @@
                 pushWorkTimeLogDig:false,
                 pushWorkTimeLogData:[],
 
-                userReportDeptList: []
+                userReportDeptList: [],
+                isReminder:true
             };
         },
         watch: {
@@ -4004,6 +4017,8 @@
         parameter={
             startDate: this.WorktimeDatepickValue[0],
             endDate: this.WorktimeDatepickValue[1],
+            deptId:this.deptIdForReminder.length>0?this.deptIdForReminder[this.deptIdForReminder.length-1]:null,
+            viewValue:this.isReminder?1:0
         }
       this.http.post(
         "/report/getUserDailyWorkTimeReminder",
@@ -8396,6 +8411,33 @@
                     })
                 })
             },
+            //景昱取消异常
+            cancelReminder(item){
+                let parameter={}
+                if(item){
+                    parameter.createDate=item.createDate,
+                    parameter.userId=item.userId
+                }
+                this.http.post('/report/cancelReminder',parameter,res => {
+                    if(res.code == 'ok'){
+                        this.$message({
+                            message: res.msg,
+                            type: 'success'
+                        })
+                    }else{
+                        this.$message({
+                            message: res.msg,
+                            type: 'error'
+                        })
+                    }
+                },err => {
+                    this.$message({
+                        message: err,
+                        type: 'error'
+                    })
+                })
+                this.showMonthWorkTimeReminder()
+            },
             // 重庆物奇私人定制的按周填报弹窗关闭事件
             fillWeekCustomClne() {
                 this.fillWeekDialogVisiCustom = false