瀏覽代碼

秘薪处理,按周填报手机端去掉项目必填检查

seyason 3 年之前
父節點
當前提交
34133581e8

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

@@ -825,6 +825,45 @@ public class ReportController {
             }
         }
 
+        if (!createDate[0].contains("@")) {
+            //不是批量,可能是按周填报
+            //校验当前填报的日报是否已经存在同日期的
+            LocalDate startDate = reportList.stream().map(Report::getCreateDate).min(new Comparator<LocalDate>() {
+                @Override
+                public int compare(LocalDate o1, LocalDate o2) {
+                    return o1.compareTo(o2);
+                }
+            }).get();
+            LocalDate endDate = reportList.stream().map(Report::getCreateDate).max(new Comparator<LocalDate>() {
+                @Override
+                public int compare(LocalDate o1, LocalDate o2) {
+                    return o1.compareTo(o2);
+                }
+            }).get();
+
+            List<Report> oldReportList = reportService.list(new QueryWrapper<Report>().between("create_date", startDate, endDate).eq("creator_id", token));
+            DateTimeFormatter mdFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            if (oldReportList.size() > 0) {
+                StringBuilder sb = new StringBuilder();
+                List<LocalDate> collect = oldReportList.stream().map(Report::getCreateDate).collect(Collectors.toList());
+                for (Report report : reportList) {
+                    if (report.getId() == null) {
+                        if (collect.stream().anyMatch(oldDate->oldDate.isEqual(report.getCreateDate()))) {
+                            sb.append(mdFormatter.format(report.getCreateDate())).append(",");
+                        }
+                    }
+                }
+
+                String s = sb.toString();
+                if (s.length() > 0) {
+                    s = s.substring(0, s.length() -1);
+                    HttpRespMsg msg = new HttpRespMsg();
+                    msg.setError("已存在填写日报: " + s+", 请先删除后再填报。");
+                    return msg;
+                }
+            }
+        }
+
         return reportService.editReport(reportList, createDate.length > 0 ? createDate[0] : null, targetUserList, hourCost, user.getCompanyId());
     }
 

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

@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2022-05-21
+ * @since 2022-05-23
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -216,6 +216,12 @@ public class TimeType extends Model<TimeType> {
     @TableField("show_fillaudit_time")
     private Integer showFillauditTime;
 
+    /**
+     * 是否秘薪处理,即任何人的薪资都显示*
+     */
+    @TableField("is_secret_salary")
+    private Integer isSecretSalary;
+
 
     @Override
     protected Serializable pkVal() {

+ 20 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java

@@ -91,10 +91,28 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
     public HttpRespMsg getByMonth(Integer companyId, String yearMonth) {
         HttpRespMsg msg = new HttpRespMsg();
         List<Finance> financeList = financeMapper.selectList(new QueryWrapper<Finance>().eq("company_id", companyId).eq("ymonth", yearMonth));
-
+        TimeType timeType = timeTypeMapper.selectById(companyId);
         //当前月是否有项目日报数据
         List<Map<String, Object>> userList = reportMapper.selectFillReportUserList(companyId, yearMonth+"-01", yearMonth+"-31");
-
+        if (timeType.getIsSecretSalary() == 1) {
+            //秘薪处理
+            financeList.forEach(finance->{
+                finance.setAllowance(new BigDecimal(0));
+                finance.setBonus(new BigDecimal(0));
+                finance.setCustomField1(new BigDecimal(0));
+                finance.setCustomField2(new BigDecimal(0));
+                finance.setCustomField3(new BigDecimal(0));
+                finance.setHourCost(new BigDecimal(0));
+                finance.setHouseFund(new BigDecimal(0));
+                finance.setInsuranceOld(new BigDecimal(0));
+                finance.setInsuranceMedical(new BigDecimal(0));
+                finance.setInsuranceLosejob(new BigDecimal(0));
+                finance.setInsuranceInjury(new BigDecimal(0));
+                finance.setMonthCost(new BigDecimal(0));
+                finance.setOthers(new BigDecimal(0));
+                finance.setTotalCost(new BigDecimal(0));
+            });
+        }
         financeList.forEach(f->{
             if (f.getHasReport() == null) {
                 boolean has = false;

+ 8 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -393,6 +393,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
+            TimeType timeType = timeTypeMapper.selectById(companyId);
             long total;
             List<Map<String, Object>> list;
             Page<User> page = new Page<>(pageIndex, pageSize);
@@ -410,6 +411,13 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 total = page.getTotal();
             }
             Map<String, Object> resultMap = new HashMap<>();
+            if (timeType.getIsSecretSalary() == 1) {
+                //秘薪处理
+                list.forEach(li->{
+                    li.put("monthCost", 0.0);
+                    li.put("cost", 0.0);
+                });
+            }
             resultMap.put("records", list);
             resultMap.put("total", total);
             httpRespMsg.data = resultMap;

File diff suppressed because it is too large
+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml


+ 11 - 32
fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue

@@ -160,43 +160,22 @@
         <!--列表-->
         <!-- 222 -->
         <el-table :data="list" highlight-current-row v-loading="listLoading" 
-        show-summary=true
+        :show-summary='user.timeType.isSecretSalary==0?true:false'
         ref="table"
         :height="300" style="width: 100%;">
             <el-table-column prop="name" label="姓名" sortable width="150"></el-table-column>
-            <el-table-column :prop="headerCols[index]" :label="item" sortable show-overflow-tooltip v-for="(item, index) in tblCols" :key="index" width="130px" align="center">
+            <el-table-column v-if="user.timeType.isSecretSalary==0" :prop="headerCols[index]" :label="item" sortable show-overflow-tooltip v-for="(item, index) in tblCols" :key="index" width="130px" align="center">
             </el-table-column>
-            <!-- <el-table-column prop="monthCost" label="customCols.monthCost"  width="150"></el-table-column>
-            <el-table-column prop="bonus" :label="customCols.bonus" ></el-table-column>
-            <el-table-column prop="allowance" :label="customCols.allowance" ></el-table-column>
-            <el-table-column prop="insuranceOld" :label="customCols.insuranceOld" ></el-table-column>
-            <el-table-column prop="insuranceMedical" :label="customCols.insuranceMedical" ></el-table-column>
-            <el-table-column prop="insuranceLosejob" :label="customCols.insuranceLosejob" ></el-table-column>
-            <el-table-column prop="insuranceInjury" :label="customCols.insuranceInjury" ></el-table-column>
-            <el-table-column prop="houseFund" :label="customCols.houseFund" ></el-table-column> -->
-            <!-- <el-table-column prop="field1" :label="customCols.field1" ></el-table-column>
-            <el-table-column prop="field2" :label="customCols.field2" ></el-table-column>
-            <el-table-column prop="field3" :label="customCols.field3" ></el-table-column> -->
-
-            <!-- <el-table-column prop="monthCost" :label="customCols.monthCost"  width="150"></el-table-column>
-            <el-table-column prop="bonus" :label="customCols.bonus" ></el-table-column>
-            <el-table-column prop="allowance" :label="customCols.allowance" ></el-table-column>
-            <el-table-column prop="insuranceOld" :label="customCols.insuranceOld" ></el-table-column>
-            <el-table-column prop="insuranceMedical" :label="customCols.insuranceMedical" ></el-table-column>
-            <el-table-column prop="insuranceLosejob" :label="customCols.insuranceLosejob" ></el-table-column>
-            <el-table-column prop="insuranceInjury" :label="customCols.insuranceInjury" ></el-table-column>
-            <el-table-column prop="houseFund" :label="customCols.houseFund" ></el-table-column>
-            <el-table-column prop="field1" :label="customCols.field1" ></el-table-column>
-            <el-table-column prop="field2" :label="customCols.field2" ></el-table-column>
-            <el-table-column prop="field3" :label="customCols.field3" ></el-table-column> -->
-
-            <!-- <el-table-column prop="others" label="其他" ></el-table-column> -->
-            <!-- <el-table-column :label="item.fieldName" v-for="(item, index) in customCols" :key="item.id" :prop="index==0?'customField1':(index==1?'customField2':(index==2?'customField3':''))">
-                <template slot-scope="scope">
-                    {{index==0?scope.row.customField1:(index==1?scope.row.customField2:(index==2?scope.row.customField3:''))}}
+            <el-table-column v-if="user.timeType.isSecretSalary==1" :label="item" sortable show-overflow-tooltip v-for="(item, index) in tblCols" :key="index" width="130px" align="center">
+            <template slot-scope="scope" >
+                *
+            </template>
+            </el-table-column>
+            <el-table-column prop="totalCost" label="总成本">
+                <template slot-scope="scope" >
+                    {{user.timeType.isSecretSalary==0?scope.row.totalCost:'*'}}
                 </template>
-            </el-table-column> -->
-            <el-table-column prop="totalCost" label="总成本"></el-table-column>
+            </el-table-column>
         </el-table>
          
         <el-form :inline="true" >

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

@@ -128,11 +128,11 @@
                     <template slot-scope="scope">{{scope.row.roleName}}</template>
                 </el-table-column>
                 <el-table-column prop="monthCost" label="月成本" sortable v-if="permissions.structurePersonnel">
-                    <template slot-scope="scope">{{scope.row.monthCost==null?0:scope.row.monthCost}} 元</template>
+                    <template slot-scope="scope">{{user.timeType.isSecretSalary==0?(scope.row.monthCost==null?0:scope.row.monthCost):'*'}} 元</template>
                 </el-table-column>
                 <el-table-column prop="cost" label="时薪" sortable v-if="permissions.structurePersonnel">
-                    <template slot-scope="scope">{{scope.row.cost==null?0:scope.row.cost}} 元
-                        <el-link @click.native="showSalaryList(scope.row)"><i class="iconfont firerock-iconrecord"></i></el-link>
+                    <template slot-scope="scope">{{user.timeType.isSecretSalary==0?(scope.row.cost==null?0:scope.row.cost):'*'}} 元
+                        <el-link v-if="user.timeType.isSecretSalary==0" @click.native="showSalaryList(scope.row)"><i class="iconfont firerock-iconrecord"></i></el-link>
                     </template>
                 </el-table-column>
                 <el-table-column label="操作" width="330">
@@ -238,18 +238,18 @@
                 <el-form-item label="电话" prop="phone">
                     <el-input v-model="insertForm.phone" placeholder="请输入电话号码" clearable></el-input>
                 </el-form-item>
-                <el-form-item label="薪酬方式" prop="salaryType" v-if="permissions.structurePersonnel">
+                <el-form-item label="薪酬方式" prop="salaryType" v-if="permissions.structurePersonnel&&user.timeType.isSecretSalary==0">
                     <el-radio-group v-model="insertForm.salaryType" @change="onSalaryTypeChange">
                     <el-radio  :label="0" >固定月成本</el-radio>
                     <el-radio  :label="1">计时工资</el-radio>
                     </el-radio-group>
                 </el-form-item>
-                <el-form-item label="月成本" prop="monthCost" v-if="insertForm.salaryType == 0 && permissions.structurePersonnel">
+                <el-form-item label="月成本" prop="monthCost" v-if="insertForm.salaryType == 0 && permissions.structurePersonnel&&user.timeType.isSecretSalary==0">
                     <el-input v-model="insertForm.monthCost" id="mc" @input="oninput" placeholder="请输入月成本,单位:元" clearable @keyup.native="restrictNumber('mc')"></el-input>
                     <span style="color:orange;font-size:12px;">按照每个月工作{{timeType.monthDays}}天,每天{{timeType.allday}}小时预估时薪</span>
                     <el-link :underline="false" style="color:blue;font-size:12px;margin-left:7px;" href="#/timetype">修改工作时长</el-link>
                 </el-form-item>
-                <el-form-item label="时薪" prop="cost" v-if="permissions.structurePersonnel">
+                <el-form-item label="时薪" prop="cost" v-if="permissions.structurePersonnel&&user.timeType.isSecretSalary==0">
                     <el-input v-model="insertForm.cost" :disabled="insertForm.salaryType == 0" id="cc" style="width:120px;" @keyup.native="restrictNumber('cc')"
                      placeholder="请输入成本 单位:元/小时" clearable></el-input>
                     <span style="margin-left:25px;">生效日期</span>

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

@@ -32,7 +32,7 @@
                     <span v-for="(item, index) in dataArray" :key="item.seq" >
                         
                         <el-button type="primary" v-if="item.isDeptAudit == 1" @click="editNodeDialog(index, item)">{{item.auditDeptName}}</el-button>
-                        <el-button type="primary" v-if="item.isDeptAudit == 0" >项目负责人</el-button>
+                        <el-button type="primary" v-if="item.isDeptAudit == 0" >项目审核人</el-button>
                         <icon class="iconfont firerock-iconright"></icon>
                         <icon class="iconfont firerock-iconInsertLine addNode" @click="showNodeDialog(index+1)"></icon>
                         <icon class="iconfont firerock-iconright"></icon>

+ 6 - 4
fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/weekEdit.vue

@@ -52,11 +52,9 @@
 
                 <van-cell-group :title="(user.companyId==781?'任务':'项目') + (index+1)">
                     <!-- <div>请选择投入项目</div> -->
+                    <!--按周填报的项目改成非必填-->
                     <van-field  readonly  name="projectId" clickable :value="item.projectName" :label="user.companyId==781?'工作任务':'投入项目'" :placeholder="user.companyId==781?'请选择工作任务':'请选择项目'" @click="clickPicker(index, item)"
-                    :rules="[{ required: true, message: user.companyId==781?'请选择任务':'请选择项目' }]" />
-
-                   
-
+                    />
                     <van-field  readonly  name="subProjectId" v-if="item.subProjectList != null && item.subProjectList.length > 0" clickable 
                         :value="item.subProjectName" label="子项目" placeholder="请选择子项目" 
                     @click="clickPickSubProject(index, item)" />
@@ -1355,6 +1353,10 @@
                     formData.append("draft", this.isDraft);
                     //填字段
                     for(var i in this.form[formIndex].domains) {
+                        //没有选择项目的,跳过
+                        if (!this.form[formIndex].domains[i].projectId) {
+                            continue;
+                        }
                         if (this.user.timeType.customDegreeActive == 1) {
                             if(this.form[formIndex].domains[i].degreeId) {
                                 formData.append("degreeId", this.form[formIndex].domains[i].degreeId);