山水共长天一色 3 éve
szülő
commit
1ba3e502cf

+ 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;

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml


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

@@ -4,15 +4,15 @@ var path = require('path')
 // var ip = '192.168.2.4'
 // var ip = '192.168.2.12'// var ip = '47.100.37.243' 
 
-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 = {
   build: {

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/http.js

@@ -55,7 +55,7 @@ export default {
             (error) => {
                 if (exception) {
                     var str = error + ''
-                    if(str.indexOf('504') != '-1') {
+                    if(str.indexOf('504') != '-1' || str.indexOf('502') != '-1') {
                         exception('服务器维护中,请稍后重试')
                     } else {
                         exception(error)

+ 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>

+ 9 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -319,7 +319,11 @@
                         <el-select v-model="domain.projectId" :placeholder="user.companyId==781?'请选择工作任务':'请选择项目'" style="width:200px;" clearable="true"  filterable="true"
                         @change="selectProject(domain, index)"
                         :disabled="workForm.domains.length==0?true:(workForm.domains[index].state>=2?false:true)">
-                            <el-option v-for="item in projectList" :disabled="item.status>=2" :key="item.id" :label="item.projectName" :value="item.id"></el-option>
+                            <!-- <el-option v-for="item in projectList" :disabled="item.status>=2" :key="item.id" :label="item.projectName" :value="item.id"></el-option> -->
+                            <el-option v-for="item in projectList" :disabled="item.status>=2" :key="item.id" :label="item.projectName + item.projectCode" :value="item.id">
+                                <span style="float: left">{{ item.projectName }}</span>
+                                <span style="float: right; color: #8492a6; font-size: 13px;margin-left: 20px">{{ item.projectCode }}</span>
+                            </el-option>
                         </el-select>
                         <span v-if="domain.subProjectList != null && domain.subProjectList.length> 0 && domain.projectId != ''"
                             style="margin-left:45px;">子项目</span>
@@ -422,7 +426,10 @@
                             <el-select v-model="domain.projectId" placeholder="请选择项目" style="width:200px;" clearable="true"  filterable="true"
                             @change="selectProject(domain, index)"
                             :disabled="workForm.domains.length==0?true:(workForm.domains[index].state>=2?false:true)">
-                                <el-option v-for="item in projectList" :disabled="item.status>=2" :key="item.id" :label="item.projectName" :value="item.id"></el-option>
+                                <el-option v-for="item in projectList" :disabled="item.status>=2" :key="item.id" :label="item.projectName + item.projectCode" :value="item.id">
+                                    <span style="float: left">{{ item.projectName }}</span>
+                                    <span style="float: right; color: #8492a6; font-size: 13px;margin-left: 20px">{{ item.projectCode }}</span>
+                                </el-option>
                             </el-select>
                             <span  v-if="domain.subProjectList != null && domain.subProjectList.length> 0 && domain.projectId != ''"
                                 style="margin-left:45px;">子项目</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);