Explorar o código

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

cs %!s(int64=2) %!d(string=hai) anos
pai
achega
7f71ccb7d9

+ 7 - 7
fhKeeper/formulahousekeeper/inva_4_tivo/index.html

@@ -656,19 +656,19 @@
             <div class="QandACon">
                 <div class="QandAConUl">
                     <div class="QandAConli"><span>问题1:</span>专业版比基础版多了哪些功能?</div>
-                    <div class="QandAConli"><span>回复1:</span>专业版多了项目的任务管理,填报日报可以对应到任务。还有项目预算管理,文件管理和费用报销模块,并提供了更丰富的报表。</div>
+                    <div class="QandAConli"><span>回复1:</span>专业版多了项目的 <span style="color:#20a0ff">任务管理</span> ,填报日报可以对应到任务。还有项目 <span style="color:#20a0ff">预算管理</span>,文件管理和 <span style="color:#20a0ff">费用报销</span>模块,并提供了更丰富的报表。</div>
                 </div>
                 <div class="QandAConUl">
-                    <div class="QandAConli"><span>问题2:</span>我们有些流动人员,中间有人离职了又会有新人加入,这个怎么算?</div>
-                    <div class="QandAConli"><span>回复2:</span>我们系统是按在职人数算名额的,离职后可以空出名额直接加新人,无需额外收费。</div>
+                    <div class="QandAConli"><span>问题2:</span>我们有些流动人员,中间有人<span style="color:#20a0ff">离职</span>了又会有新人加入,这个怎么算?</div>
+                    <div class="QandAConli"><span>回复2:</span>我们系统是按在职人数算名额的,离职后可以空出名额直接加新人,<span style="color:#20a0ff">无需额外收费。</span></div>
                 </div>
                 <div class="QandAConUl">
-                    <div class="QandAConli"><span>问题3:</span>可以和考勤系统打通吗?</div>
-                    <div class="QandAConli"><span>回复3:</span>可以的,可以额外打通企业微信的考勤打卡功能。如果是自建或其他服务商的系统,我们可提供二次开发进行数据对接。</div>
+                    <div class="QandAConli"><span>问题3:</span>可以和<span style="color:#20a0ff">考勤系统</span>打通吗?</div>
+                    <div class="QandAConli"><span>回复3:</span>可以的,可以额外打通<span style="color:#20a0ff">企业微信</span>的考勤打卡功能。如果是自建或其他服务商的系统,我们可提供<span style="color:#20a0ff">二次开发</span>进行数据对接。</div>
                 </div>
                 <div class="QandAConUl">
-                    <div class="QandAConli"><span>问题4:</span>审批可以设置流程吗?</div>
-                    <div class="QandAConli"><span>回复4:</span>可以的,系统支持按部门设置审批流程、员工自行选择审核人进行多层审核或者按项目的分组负责人审核等多种方式,具体可咨询客服人员为您开通。</div>
+                    <div class="QandAConli"><span>问题4:</span>审批可以设置<span style="color:#20a0ff">流程</span>吗?</div>
+                    <div class="QandAConli"><span>回复4:</span>可以的,系统支持按部门设置审批流程、员工自行选择审核人进行<span style="color:#20a0ff">多层审核</span>或者按项目的分组负责人审核等多种方式,具体可咨询客服人员为您开通。</div>
                 </div>
             </div>
         </div>

BIN=BIN
fhKeeper/formulahousekeeper/inva_4_tivo/video/guanwang.mp4


+ 26 - 20
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -6634,20 +6634,21 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     public HttpRespMsg getWaitingReviewList(HttpServletRequest request, Integer stateKey, String userId,Integer pageIndex,Integer pageSize,String startDate,String endDate,Integer departmentId) {
         HttpRespMsg msg=new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("token"));
-        List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", user.getId()));
-        List<DepartmentOtherManager> otherManagers = departmentOtherManagerMapper.selectList(new QueryWrapper<DepartmentOtherManager>().eq("other_manager_id", user.getId()));
-        //获取全部子部门
-        List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()));
-        List<Integer> collect = departmentList.stream().map(Department::getDepartmentId).distinct().collect(Collectors.toList());
-        List<Integer> collect1 = otherManagers.stream().map(DepartmentOtherManager::getDepartmentId).distinct().collect(Collectors.toList());
-        List<Integer> deptIds=new ArrayList<>();
-        for (Integer dpId : collect) {
-            List<Integer> ids = departmentService.getDeptIncludeSubDeptIds(dpId, allDeptList);
-            deptIds.addAll(ids);
-        }
-        for (Integer dpId : collect1) {
-            List<Integer> ids = departmentService.getDeptIncludeSubDeptIds(dpId, allDeptList);
-            deptIds.addAll(ids);
+        List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全公司工时");
+        List<Department> allDepartmentList=departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id",user.getCompanyId()));
+        List<Department> userDepartmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", user.getId()).eq("company_id",user.getCompanyId()));
+        List<DepartmentOtherManager> departmentOtherManagerList = departmentOtherManagerMapper.selectList(new QueryWrapper<DepartmentOtherManager>().eq("other_manager_id", user.getId()));
+        List<Integer> deptIds=null;
+        if(functionAllList.size()==0){
+            deptIds=new ArrayList<>();
+            deptIds.add(-1);
+            List<Integer> collect = userDepartmentList.stream().map(dm -> dm.getDepartmentId()).distinct().collect(Collectors.toList());
+            List<Integer> otherCollect = departmentOtherManagerList.stream().map(dom -> dom.getDepartmentId()).distinct().collect(Collectors.toList());
+            collect.addAll(otherCollect);
+            for (Integer integer : collect) {
+                List<Integer> branchDepartment = getBranchDepartment(integer, allDepartmentList);
+                deptIds.addAll(branchDepartment);
+            }
         }
         Integer size;
         Integer start;
@@ -6663,17 +6664,21 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         for (Map<String, Object> map : list) {
             Department dept = null;
             Integer deptId = Integer.valueOf(map.get("deptId").toString());
-            for (Department department : allDeptList) {
+            for (Department department : allDepartmentList) {
                 if (deptId.equals(department.getDepartmentId())){
                     dept = department;
                 }
             }
-            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                String wxDeptName = departmentService.getWxDepartment(dept, allDeptList);
-                map.put("departmentName",wxDeptName);
+            if(dept==null){
+                map.put("departmentName","未分配");
             }else {
-                String deptName = departmentService.getSupDepartment(dept, allDeptList);
-                map.put("departmentName",deptName);
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    String wxDeptName = departmentService.getWxDepartment(dept, allDepartmentList);
+                    map.put("departmentName",wxDeptName);
+                }else {
+                    String deptName = departmentService.getSupDepartment(dept, allDepartmentList);
+                    map.put("departmentName",deptName);
+                }
             }
         }
         long total=projectMapper.findCount(stateKey,user.getCompanyId(),userId,null,null,startDate,endDate,departmentId,deptIds);
@@ -7814,6 +7819,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         project.setCurrentStageId(stage.get().getId());
                     }else project.setCurrentStageName(null);
                     project.setCompanyId(thirdPartyInterface.getCompanyId());
+                    project.setCreateDate(LocalDate.now());
                     inertProjectList.add(project);
                 }
                 if(inertProjectList.size()>0&&saveBatch(inertProjectList)){

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

@@ -924,7 +924,7 @@
     <select id="getWaitingReviewList" resultType="java.util.Map">
         <choose>
             <when test="stateKey==0">
-                SELECT 	dept_manager.name as userName,`user`.corpwx_userid as corpwxUserId,department.department_id as deptId,department.corpwx_deptid as wxDeptId,COUNT(1) as num
+                SELECT 	dept_manager.name as userName,`user`.corpwx_userid as corpwxUserId,IFNULL(department.department_id,0) as deptId,department.corpwx_deptid as wxDeptId,COUNT(1) as num
                 FROM report AS a
                 left join user on user.id = a.creator_id
                 JOIN project AS b ON a.project_id=b.id
@@ -959,7 +959,7 @@
                 ORDER BY a.create_date desc, a.creator_id asc
             </when>
             <otherwise>
-                SELECT 	u.name as userName,u.corpwx_userid as corpwxUserId,dp.department_id as deptId,dp.corpwx_deptid as wxDeptId,COUNT(1) as num
+                SELECT 	u.name as userName,u.corpwx_userid as corpwxUserId,IFNULL(dp.department_id,0) as deptId,dp.corpwx_deptid as wxDeptId,COUNT(1) as num
                 FROM report AS a
                 left join user on user.id = a.creator_id
                 JOIN project AS b ON a.project_id=b.id

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

@@ -91,7 +91,7 @@ public class CompanyController {
             LocalDateTime now=LocalDateTime.now();
             re.setCanDelete(0);
             if(re.getCreateDate()!=null){
-                LocalDateTime createDate = re.getCreateDate().atTime(LocalTime.now());
+                LocalDateTime createDate = re.getCreateDate();
                 Duration between = Duration.between(createDate, now);
                 Integer count = reportMapper.selectCount(new QueryWrapper<Report>().eq("company_id", re.getId()).ge("create_date", now.minusYears(1)));
                 if(between.toDays()>90&&count.equals(0)){

+ 4 - 3
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/entity/Company.java

@@ -2,7 +2,6 @@ package com.management.platform.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
-import java.time.LocalDate;
 import com.baomidou.mybatisplus.annotation.TableId;
 import java.time.LocalDateTime;
 import com.baomidou.mybatisplus.annotation.TableField;
@@ -20,7 +19,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2023-02-20
+ * @since 2023-02-21
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -144,7 +143,9 @@ public class Company extends Model<Company> {
      * 创建日期
      */
     @TableField("create_date")
-    private LocalDate createDate;
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime createDate;
 
     @TableField(exist = false)
     private Integer activeUserCount;

+ 0 - 10
fhKeeper/formulahousekeeper/ops-platform/src/main/resources/mapper/CompanyMapper.xml

@@ -29,14 +29,4 @@
         id, company_name, staff_count_max, expiration_date, set_meal, package_worktime, package_project, package_contract, package_oa, package_etimecard, package_expense, package_customer, package_engineering, package_simple, package_finance, package_provider, is_international, create_date
     </sql>
 
-    <delete id="deleteCompany" parameterType="com.management.platform.entity.Company">
-        DELETE t1,t2,t3,t4
-        FROM
-        company t1
-        LEFT JOIN alert_time t2 ON t2.company_id = t1.id
-        LEFT JOIN audit_workflow_setting t3 ON t3.company_id = t1.id
-        LEFT JOIN audit_workflow_time_setting t4 ON t4.company_id = t1.id
-        WHERE
-        t1.id = #{companyId}
-    </delete>
 </mapper>

+ 91 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/CostBaseline.vue

@@ -72,6 +72,53 @@
                     </div>
                 </el-col>
             </el-row>
+
+            <el-row :gutter="24">
+                <el-col :span="24">
+                    <div class="box">
+                        <div class="box_head">
+                            <el-date-picker
+                            v-model="dateSelect"
+                            type="daterange"
+                            size="small"
+                            range-separator="-"
+                            :start-placeholder="$t('interval')"
+                            :end-placeholder="$t('interval')"
+                            value-format="yyyy-MM-dd"
+                            clearable
+                            @change="hiddens()">
+                        </el-date-picker>
+                        </div>
+
+                        <div class="boxBoxMax">
+                            <div class="boxBoxMax_con">
+                                <el-card class="box-card">
+                                    <div slot="header" class="clearfix">
+                                        <span>工时成本</span>
+                                    </div>
+                                    <div class="text item boxBoxMax_con_one">
+                                        工时合计: {{ chengbenData.workingTime }}
+                                    </div>
+                                    <div class="text item">
+                                        成本: {{ chengbenData.cost }}
+                                    </div>
+                                </el-card>
+                            </div>
+                            <div class="boxBoxMax_con">
+                                <el-card class="box-card">
+                                    <div slot="header" class="clearfix">
+                                        <span>费用报销成本</span>
+                                    </div>
+                                    <div class="text item boxBoxMax_con_two">
+                                        报销合计: {{ chengbenData.expense }}
+                                    </div>
+                                </el-card>
+                            </div>
+                        </div>
+                        
+                    </div>
+                </el-col>
+            </el-row>
         </div>
 
 
@@ -126,7 +173,9 @@
                 nowBaseList: [],
                 correctBaseDialog: false,
                 projectContractAmount: null,
-                nowBaseHeight: ''
+                nowBaseHeight: '',
+                dateSelect: [],
+                chengbenData: {}
             };
         },
         filters: {
@@ -146,6 +195,30 @@
             }
         },
         methods: {
+            hiddens() {
+                this.getTimeCostAndExpenseByProject()
+            },
+            getTimeCostAndExpenseByProject() {
+                this.http.post('/project/timeCostAndExpenseByProject',{
+                    startDate: this.dateSelect[0],
+                    endDate: this.dateSelect[1],
+                    projectId: this.curProjectId
+                },res => {
+                    if(res.code == 'ok'){
+                        this.chengbenData = res.data
+                    }else {
+                        this.$message({
+                            message: res.msg,
+                            type: 'error'
+                        })
+                    }
+                },err => {
+                    this.$message({
+                        message: err,
+                        type: 'error'
+                    })
+                })
+            },
             restrictNumber(targetId) {
                 let inpu = document.getElementById(targetId);
                 inpu.value = inpu.value.replace(/[^\d.]/g, "");  //仅保留数字和"."
@@ -453,6 +526,7 @@
             this.getAddList()
             this.getNowBase()
             this.getProjectInfo()
+            this.getTimeCostAndExpenseByProject()
         }
     };
 </script>
@@ -507,4 +581,20 @@
 .gray_label {
     color: #999;
 }
+.box_head {
+    margin: 20px 20px 20px 20px;
+}
+.boxBoxMax {
+    display: flex;
+}
+.boxBoxMax_con {
+    width: 30%;
+    margin-right: 30px;
+}
+.boxBoxMax_con_one {
+    margin-bottom: 8px;
+}
+.boxBoxMax_con_two {
+    margin-bottom: 25px;
+}
 </style>

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

@@ -207,8 +207,8 @@
                     </el-form-item>
                     <el-form-item :label="$t('remindertext')" prop="alertMsg" style="width: 50%;margin-left:10px;">
                             <el-input :placeholder="$t('peaseenterthe')" v-model="timeType.alertMsg" clearable class="apu" maxlength="20"></el-input>
-                            <div style="display: inline-block;margin: 0 10px 0 20px" v-if="timeType.alertTime">周末节假日提醒</div>
-                            <el-switch v-if="timeType.alertTime" v-model="timeType.alertNonWorkday" active-color="#13ce66" inactive-color="#ff4949"></el-switch>
+                            <!-- <div style="display: inline-block;margin: 0 10px 0 20px" v-if="timeType.alertTime">周末节假日提醒</div> -->
+                            <!-- <el-switch v-if="timeType.alertTime" v-model="timeType.alertNonWorkday" active-color="#13ce66" inactive-color="#ff4949"></el-switch> -->
                     </el-form-item>
 
                     </el-form>
@@ -232,8 +232,20 @@
         <p style="margin-left:10px;color:#666;">{{ $t('timesetting') }}</p>
         <el-row :gutter="20" style="padding-top:10px;width:100%;margin:0 auto;padding-left:10px;padding-right:10px;">
         <el-col :span="24" >
-            <div class="panel" style="height:180px;">
+            <div class="panel" style="height:260px;">
                 <el-form :inline="true" :model="timeType"  style="margin-top:10px;">
+                <div class="panel_flx">
+                    <el-form-item>额外工作日设置:</el-form-item>
+                    <el-form-item>
+                        <el-checkbox v-model="settOne" label="周六" />
+                    </el-form-item>
+                    <el-form-item>
+                        <el-checkbox v-model="settTwo" label="周日" />
+                    </el-form-item>
+                    <el-form-item>
+                        <el-checkbox v-model="settThree" label="其他法定节日" />
+                    </el-form-item>
+                </div>
                 <el-form-item>
                     <el-checkbox v-model="timeType.includeWeekends" label="批量/代填含周末" />
                 </el-form-item><br/>
@@ -497,6 +509,9 @@
     export default {
         data() {
             return {
+                settThree: false,
+                settTwo: false,
+                settOne: false,
                 tourFlg: false,
                 steps: [{
                         target: '[data-v-step="timetypeBox"]',
@@ -556,7 +571,6 @@
                     fillAhead: false,
                     includeWeekends: false,
                     maxReportTime: 8,
-                    alertNonWorkday: false
                 },
                 customDegreeActive: false,
                 needDeptAudit: false,
@@ -1128,7 +1142,14 @@
 
                         param.workContentState = param.workContentState ? 1 : 0
 
-                        param.alertNonWorkday = param.alertNonWorkday ? 1: 0
+                        var oneseet = 0
+                        var twoset = 0
+                        var threeset = 0
+                        this.settOne ? oneseet = 1 : oneseet = 0;
+                        this.settTwo ? twoset = 1 : twoset = 0;
+                        this.settThree ? threeset = 1 : threeset = 0;
+
+                        param.alertNonWorkday = parseInt(`${oneseet}${twoset}${threeset}`)
 
                         delete param.excludeTimeList
                         // console.log(param, '将要提交的值')
@@ -1182,7 +1203,27 @@
                             this.timeType.customDataMaxStatus = this.timeType.customDataMaxStatus ? true : false 
                             this.timeType.customDataMaxValue = this.timeType.customDataMaxValue ? this.timeType.customDataMaxValue : 100
                             this.timeType.reportAutoApproveDays = this.timeType.reportAutoApproveDays ? this.timeType.reportAutoApproveDays : 1
-                            this.timeType.alertNonWorkday = this.timeType.alertNonWorkday ? true : false
+                            // this.timeType.alertNonWorkday = this.timeType.alertNonWorkday ? true : false
+
+                            if(this.timeType.alertNonWorkday) {
+                                let str = this.timeType.alertNonWorkday + ''
+                                let arr = str.split('')
+                                if(arr.length == 1) {
+                                    arr.unshift('0')
+                                    arr.unshift('0')
+                                } else if(arr.length == 2) {
+                                    arr.unshift('0')
+                                }
+                                console.log(arr)
+                                this.settThree = arr[2] == 1 ? true : false
+                                this.settTwo = arr[1] == 1 ? true : false
+                                this.settOne = arr[0] == 1 ? true : false
+                            } else {
+                                this.settThree = false
+                                this.settTwo = false
+                                this.settOne = false
+                            }
+
                             this.timeChange();
 
                             this.maxReportTimeRange = [] // 填报时长上限
@@ -1344,4 +1385,8 @@
     justify-content: center;
     align-items: center;
 }
+.panel_flx {
+    display: flex;
+    align-items: center;
+}
 </style>

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

@@ -1861,7 +1861,7 @@ export default {
     },
     // 转移日报
     transferDaily() {
-      this.http.post("/report/moveReport", {
+      this.http.post("/report/moveUserData", {
           targetId: this.moveReportUserId,
           sourceId: this.deleteUserFlgData.id
         },

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

@@ -744,6 +744,7 @@
             <span slot="footer" class="dialog-footer">
                 <el-button @click="cancel(workForm.domains,true)" v-if="canCancelInDialog" style="float:left;">{{$t('btn.withdraw')}}</el-button>
                 <span style="margin-right:20px">合计工时:{{totalReportHours}}小时</span>
+                <!-- <span style="margin-right:20px">合计工时:{{jsTime}}小时</span> -->
                 <el-button @click="deleteReport"  v-if="workForm.domains[0].id != null && canEdit && reportCanDelete">{{$t('btn.delete')}}</el-button>
                 <el-button @click="dialogVisible = false">{{$t('btn.cancel')}}</el-button>
                 <el-button v-if="!isSubstitude" @click="submitReport(1)" :loading="submitingReport" :disabled="workForm.domains.length==0?true:(canEdit?false:true)">{{$t('btn.temporaryStorage')}}</el-button>
@@ -1990,7 +1991,8 @@
                                         subtractedData += +this.timeOverlap(j, arr)
                                     }
                                     console.log(selectionTime, subtractedData)
-                                    hours = +selectionTime - +subtractedData
+                                    hours += (+selectionTime - +subtractedData) * this.jsDay
+                                    console.log(hours)
                                     // hours += this.getHour(domains[i].startTime, domains[i].endTime)
                                 }
                             }else{
@@ -1999,7 +2001,7 @@
                         }
                     }
                 }
-                return hours.toFixed(1)
+                return hours.toFixed(2)
             },
         },
         mounted() {
@@ -2600,17 +2602,27 @@
                 var zhi = ''
                 for(var i in sl) {
                     if(sl[i].startTime && sl[i].endTime) {
-                        var date2 = '2021/12/12 ' + sl[i].endTime +':00'
-                        var date1 = '2021/12/12 ' + sl[i].startTime +':00'
-                        var date3 = new Date(date2).getTime() - new Date(date1).getTime();
-                        var leave1=date3%(24*3600*1000)
-                        var hours=Math.floor(leave1/(3600*1000))
-                        var leave2=leave1%(3600*1000)
-                        var minutes=Math.floor(leave2/(60*1000))
-                        var shi = hours+'.'+ minutes
-                        var sll = +shi + 0
-                        zhi = this.jsDay * sll
-                        quanbu = +quanbu + zhi
+                        // var date2 = '2021/12/12 ' + sl[i].endTime +':00'
+                        // var date1 = '2021/12/12 ' + sl[i].startTime +':00'
+                        // var date3 = new Date(date2).getTime() - new Date(date1).getTime();
+                        // var leave1=date3%(24*3600*1000)
+                        // var hours=Math.floor(leave1/(3600*1000))
+                        // var leave2=leave1%(3600*1000)
+                        // var minutes=Math.floor(leave2/(60*1000))
+                        // var shi = hours+'.'+ minutes
+                        // var sll = +shi + 0
+                        // zhi = this.jsDay * sll
+                        // quanbu = +quanbu + zhi
+                        let selectionTime = this.getHour(sl[i].startTime, sl[i].endTime)
+                        let subtractedData = 0
+                        let arr = JSON.parse(JSON.stringify(this.vacationTime))
+                        arr.unshift({s: sl[i].startTime, e: sl[i].endTime})
+                        console.log(arr, '要看的数据')
+                        for(var j in arr) {
+                            subtractedData += +this.timeOverlap(j, arr)
+                        }
+                        zhi = (+selectionTime - +subtractedData) * this.jsDay
+                        quanbu += zhi
                     }
                 }
                 this.jsTime = quanbu

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

@@ -484,7 +484,8 @@ import timetoolVue from '../timetool/timetool.vue';
                     item: {},
                     list: [],
                     searchList: []
-                }
+                },
+                vacationTime: {}
             };
         },
 
@@ -505,15 +506,61 @@ import timetoolVue from '../timetool/timetool.vue';
                                 }
                             }
                         }else{
-                            hours += domains[i].workingTime ? parseFloat(domains[i].workingTime) : 0
+                            if(this.user.timeType.type == 2){
+                                if(domains[i].startTime && domains[i].endTime){
+                                    let selectionTime = this.getHour(domains[i].startTime, domains[i].endTime)
+                                    let subtractedData = 0
+                                    let arr = JSON.parse(JSON.stringify(this.vacationTime))
+                                    arr.unshift({s: domains[i].startTime, e: domains[i].endTime})
+                                    for(var j in arr) {
+                                        subtractedData += +this.timeOverlap(j, arr)
+                                    }
+                                    console.log(selectionTime, subtractedData)
+                                    hours += +selectionTime - +subtractedData
+                                    console.log(hours)
+                                }
+                            } else {
+                                hours += domains[i].workingTime ? parseFloat(domains[i].workingTime) : 0
+                            }
                         }
                     }
                 }
-                return hours.toFixed(1)
+                return hours.toFixed(2)
             },
         },
 
         methods: {
+            // 判断两个时间段是否重叠
+            timeOverlap(idx, dateAr) {
+                let zhi = 0
+                for (let k in dateAr) {
+                    if (idx !== k) {
+                        if (((dateAr[k].s <= dateAr[idx].s && dateAr[k].e >= dateAr[idx].s) || (dateAr[k].s <= dateAr[idx].s && dateAr[k].e <= dateAr[idx].e))) {
+                            // 选择的时间包含设置的休息时间段 (选择的开始时间和结束时间大于设置的休息时间段)
+                            if(dateAr[idx].s > dateAr[k].s && dateAr[idx].e < dateAr[k].e) {
+                                // zhi += 2
+                                zhi += +this.getHour(dateAr[idx].s, dateAr[idx].e)
+                            }
+                            // 选择的时间包含在设置的休息时间 (选择的开始时间和结束时间都处于在设置的休息时间段内)
+                            if(dateAr[idx].s > dateAr[k].s && dateAr[idx].e > dateAr[k].e) {
+                                zhi += +this.getHour(dateAr[idx].s, dateAr[k].e)
+                            } else if(dateAr[idx].s < dateAr[k].s && dateAr[idx].e > dateAr[k].e) {
+                                zhi += +this.getHour(dateAr[k].e, dateAr[idx].s)
+                            } else {
+                                // 选择的结束时间处于设置的休息时间段内 (选择的结束时间处于的休息时间段)
+                                if(dateAr[k].e < dateAr[idx].e && dateAr[k].e > dateAr[idx].s) {
+                                    zhi += +this.getHour(dateAr[k].e, dateAr[idx].e)
+                                }
+                                // 选择的开始时间处于设置的休息时间段内 (选择的开始时间处于的休息时间段)
+                                if(dateAr[idx].s > dateAr[k].s && dateAr[idx].s < dateAr[k].e) {
+                                    zhi += +this.getHour(dateAr[k].e, dateAr[idx].s)
+                                }
+                            }
+                        }
+                    }
+                }
+                return zhi
+            },
             getHour(s1, s2) {
                 var reDate = /\d{4}-\d{1,2}-\d{1,2} /;
                 s1 = new Date((reDate.test(s1) ? s1 : '2018-1-1 ' + s1).replace(/-/g, '/'));
@@ -1002,6 +1049,16 @@ import timetoolVue from '../timetool/timetool.vue';
                         if (t.pm != null) {
                             this.timeType.push({value:2, label:'下午 - '+t.pm+'小时', hours: t.pm});
                         }
+
+                        let arr = []
+                        for(var i in res.data.excludeTimeList) {
+                            let obj = {
+                                s: res.data.excludeTimeList[i].startTime,
+                                e: res.data.excludeTimeList[i].endTime,
+                            }
+                            arr.push(obj)
+                        }
+                        this.vacationTime = arr
                     } else {
                         this.$toast.clear();
                         this.$toast.fail(res.msg);