Browse Source

Merge remote-tracking branch 'origin/master'

yurk 2 years ago
parent
commit
2df2673693

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java

@@ -81,7 +81,7 @@ public interface ReportMapper extends BaseMapper<Report> {
 
     List<Map<String, Object>> getReportFillStatus(String startDate, String endDate, String userId);
 
-    List<Map<String, Object>> getDepartmentDetailByState(@Param("departmentId") Integer departmentId,
+    List<Map<String, Object>> getDepartmentDetailByState(@Param("departmentIds") List<Integer> departmentIds,
                                                @Param("companyId") Integer companyId);
 
     List<Map<String, Object>> getUserDailyWorkTime(Integer companyId, String startDate, String endDate, List<Integer> deptIds, String leaderId);

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java

@@ -182,7 +182,7 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
         List<Project> Project = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", expenseSheet.getCompanyId()));
         for (ExpenseItem expenseItem : list) {
             for (Project project : Project) {
-                if (expenseItem.getProjectId().equals(project.getId())){
+                if ((project.getId().equals(expenseItem.getProjectId()))){
                     expenseItem.setProjectName(project.getProjectName());
                     break;
                 }

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

@@ -1264,6 +1264,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         final List<Integer> ids = ListUtil.convertIntegerIdsArrayToList(reportIds);
         if (company.getPackageEngineering() == 1) {
             //检查是否有专业进度待审核
+            Report oneReport = null;
             List<ReportProfessionProgress> list = reportProfessionProgressService.list(new QueryWrapper<ReportProfessionProgress>().in("report_id", ids).eq("audit_state", 0));
             if (isDepartment != null) {
                 //进行的是部门审核, 需要专业审核都通过才能进行部门审核
@@ -1273,6 +1274,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     return httpRespMsg;
                 } else {
                     Report report = reportMapper.selectById(ids.get(0));
+                    oneReport = report;
                     //部门待审核,部门审核通过
                     if (report.getDepartmentAuditState() == 0){
                         report = new Report();
@@ -1296,7 +1298,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         httpRespMsg.setError(MessageUtils.message("finance.masterProfessional"));
                     } else {
                         List<Integer> collect = myProfessionList.stream().map(ProjectProfession::getProfessionId).collect(Collectors.toList());
-
+                        oneReport = reportList.get(0);
                         ReportProfessionProgress item = new ReportProfessionProgress();
                         item.setAuditState(1);
                         reportProfessionProgressService.update(item, new QueryWrapper<ReportProfessionProgress>().in("report_id", ids).in("profession_id", collect));
@@ -1314,6 +1316,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     }
                 } else {
                     Report report = reportMapper.selectById(ids.get(0));
+                    oneReport = report;
                     if(timeType.getNeedEvaluate()==1){
                         report.setEvaluate(evaluate);
                     }
@@ -1343,6 +1346,82 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     }
                 }
             }
+
+            //保存审核记录
+            List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().in("id", ids));
+            List<Integer> collect = reportList.stream().map(rl -> rl.getProjectId()).distinct().collect(Collectors.toList());
+            List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", collect));
+            List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", user.getCompanyId()));
+            List<WxCorpInfo> wxCorpInfoList = wxCorpInfoMapper.selectList(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+            List<CompanyDingding> companyDingdingList = companyDingdingService.list(new QueryWrapper<CompanyDingding>().eq("company_id", company.getId()));
+            String pNames = projectList.stream().map(Project::getProjectName).collect(Collectors.joining(", ", "[", "]"));
+            //审核通过操作 向被审核人推送消息
+            if(timeType.getReportApproveMsgpush()==1){
+                for (Report report : reportList) {
+                    if(report.getState()==1){
+                        String uId = report.getCreatorId();
+                        Optional<User> first = userList.stream().filter(ul -> ul.getId().equals(uId)).findFirst();
+                        if(first.isPresent()){
+                            User u = first.get();
+                            if(u.getCorpwxUserid()!=null){
+                                if(wxCorpInfoList.size()>0){
+                                    JSONObject json=new JSONObject();
+                                    JSONArray dataJson=new JSONArray();
+                                    JSONObject item=new JSONObject();
+                                    item.put("key","审核人");
+                                    item.put("value",user.getName());
+                                    dataJson.add(item);
+                                    if(timeType.getNeedEvaluate()==1){
+                                        JSONObject item1=new JSONObject();
+                                        item1.put("key","评价");
+                                        item1.put("value",StringUtils.isEmpty(report.getEvaluate())?"":report.getEvaluate());
+                                        dataJson.add(item1);
+                                        json.put("template_id","tty9TkCAAAWoUyhGnXRCZuhkgCqw_Uow");
+                                    }else {
+                                        json.put("template_id","tty9TkCAAANpvEtLrkPUGeOEd1-U7W2w");
+                                    }
+                                    JSONObject item2=new JSONObject();
+                                    item2.put("key","日期");
+                                    item2.put("value",report.getCreateDate());
+                                    dataJson.add(item2);
+                                    json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
+                                    json.put("content_item",dataJson);
+                                    wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfoList.get(0),u.getCorpwxUserid(),json);
+                                }
+                            }
+                            if(u.getDingdingUserid()!=null){
+                                if(companyDingdingList.size()>0){
+                                    CompanyDingding companyDingding = companyDingdingList.get(0);
+                                    companyDingdingService.sendReportApproveMsg(company.getId(),companyDingding.getAgentId(),user.getName(),report.getEvaluate(),report.getCreateDate(),u.getDingdingUserid());
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            //对导入审核,添加记录
+            int channel = 1; //0-导入审核, 项目报告审核
+            ReportAuditLog log = new ReportAuditLog();
+            log.setAuditChannel(channel);
+            log.setCompanyId(company.getId());
+            //log.setResult("通过");
+            log.setResult(MessageUtils.message("profession.approved"));
+            log.setUserId(user.getId());
+            log.setUserName(user.getName());
+            log.setProjectName(pNames);
+            reportAuditLogMapper.insert(log);
+            //员工的日期
+            ReportAlogMembdate membdate = new ReportAlogMembdate();
+            membdate.setRlogId(log.getId());
+            membdate.setState(1);//通过
+            membdate.setCreateDate(oneReport.getCreateDate());
+            membdate.setUserId(oneReport.getCreatorId());
+            membdate.setUserName(userMapper.selectById(oneReport.getCreatorId()).getName());
+            reportAlogMembdateMapper.insert(membdate);
+
+            //日报的审核过程记录
+            saveApproveReportLog(reportList, user.getId(), user.getName());
         } else {
             //先按照大的审核模式进行分类
             Report oneReport = reportMapper.selectById(ids.get(0));
@@ -2956,11 +3035,13 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         try {
             SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
             User curUser = userMapper.selectById(request.getHeader("Token"));
-            Integer departmentId = curUser.getManageDeptId();
+            List<Department> manangedDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", curUser.getId()));
             Integer companyId = curUser.getCompanyId();
-
-            //根据权限,管理员查看全部人员的,各个项目负责人只看自己负责的项目参与人员的日报
-            List<Map<String, Object>> nameList = reportMapper.getDepartmentDetailByState(departmentId, companyId);
+            List<Integer> collect = manangedDeptList.stream().map(Department::getDepartmentId).collect(Collectors.toList());
+            List<Map<String, Object>> nameList = new ArrayList<>();
+            if (collect.size() > 0) {
+                nameList = reportMapper.getDepartmentDetailByState(collect, companyId);
+            }
 
             //按日期过滤
             if (!StringUtils.isEmpty(date)) {
@@ -3286,6 +3367,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 dataItem.add(userMonthWork.name+(worktimeList.size()==0?"("+MessageUtils.message("entry.noFill")+")":""));
                 dataItem.add(userMonthWork.departmentName);
             }
+            DecimalFormat decimalFormat = new DecimalFormat("0.0");
             //找到那一天的工作时间
             days.forEach(d->{
 //                String dateStr = startDate;
@@ -3296,7 +3378,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 Optional<Map<String, Object>> op = worktimeList.stream().filter(m -> ((String) m.get("createDate")).equals(fDateStr)).findFirst();
                 if (op.isPresent()) {
                     Map<String, Object> createDateHour = op.get();
-                    dataItem.add(""+createDateHour.get("workingTime"));
+                    double workingTime = (double)createDateHour.get("workingTime");
+                    dataItem.add(""+decimalFormat.format(workingTime));
                 } else {
                     dataItem.add("0");
                 }

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

@@ -470,8 +470,12 @@
         SELECT DISTINCT b.id, b.name, cast(b.department_id as SIGNED) as departmentId,a.create_date AS date
         FROM report AS a
         JOIN user AS b ON a.creator_id=b.id
-        WHERE a.department_audit_state = 0 AND b.company_id=#{companyId}
-        AND a.creator_id in (select id from user where department_id = #{departmentId})
+        WHERE a.department_audit_state = 0 and a.state = 0 AND b.company_id=#{companyId}
+        AND a.creator_id in (select id from user where department_id in
+        <foreach collection="departmentIds" item="deptId" open="(" close=")" index="index" separator=",">
+            #{deptId}
+        </foreach>
+        )
         ORDER BY a.create_date DESC
     </select>
 
@@ -569,7 +573,7 @@
         group by p.id,u.id,tg.id
     </select>
     <select id="getReportFillStatus" resultType="java.util.Map">
-        SELECT DATE_FORMAT(create_date,'%Y-%m-%d') as createDate, MAX(state) AS state FROM report
+        SELECT DATE_FORMAT(create_date,'%Y-%m-%d') as createDate, IF (MAX(state) = 1, MIN(state), MAX(state)) AS state FROM report
         WHERE create_date BETWEEN #{startDate} AND #{endDate} AND creator_id = #{userId} GROUP BY create_date
     </select>
     <select id="getUserDailyWorkTime" resultType="java.util.Map">

+ 6 - 6
fhKeeper/formulahousekeeper/timesheet/src/views/leave/list.vue

@@ -180,16 +180,16 @@
         <div class="ctons" style="width: 98%;">
           <div class="flex">
             <div>
-              <el-select v-if="user.userNameNeedTranslate != 1" v-model="ownerIds" :placeholder="$t('pleaseselectthepersonaskingforleave')" clearable @change="chufas()" style="width: 160px" size="small" v-show="permissions.leaveAll" filterable="true">
+              <el-select v-if="user.userNameNeedTranslate != 1" v-model="ownerIds" :placeholder="$t('pleaseselectthepersonaskingforleave')" clearable @change="chufas()" style="width: 120px" size="small" v-show="permissions.leaveAll" filterable="true">
                   <span v-for="(item, index) in users" :key="index">
                   <el-option :label="item.name" :value="item.id"></el-option>
                   </span> 
               </el-select>
-              <selectCat v-if="user.userNameNeedTranslate == 1" :size="'small'" :subject="users" :subjectId="ownerIds" :distinction="'3'" :disabled="false" :clearable="true" @selectCal="selectCal" v-show="permissions.leaveAll"></selectCat>
+              <selectCat v-if="user.userNameNeedTranslate == 1" :size="'small'" :subject="users" :subjectId="ownerIds" :distinction="'3'" :disabled="false" :clearable="true" @selectCal="selectCal" v-show="permissions.leaveAll" style="width: 120px"></selectCat>
             </div>
             <div>
               <span style="color: #606266">{{ $t('leavetype') }}</span>
-              <el-select v-model="type" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="chufas()" style="width: 160px;" size="small" filterable="true">
+              <el-select v-model="type" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="chufas()" style="width: 120px;" size="small" filterable="true">
                   <span v-for="(item, index) in typess" :key="index">
                   <el-option :label="item.name" :value="item.id"></el-option>
                   </span> 
@@ -197,12 +197,12 @@
             </div>
             <div>
               <span style="color: #606266">{{$t('offstate')}}</span>
-              <el-select v-if="falg == 0" v-model="code" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="chufas()" size="small" style="width: 160px" filterable="true">
+              <el-select v-if="falg == 0" v-model="code" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="chufas()" size="small" style="width: 120px" filterable="true">
                   <span v-for="(item, index) in statuss" :key="index">
                   <el-option :label="item.name" :value="item.id"></el-option>
                   </span> 
               </el-select>
-              <el-select v-if="falg == 1" disabled v-model="code" :placeholder="$t('pleaseselectthetypeofleave')" clearable @change="chufas()" size="small" style="width: 160px" filterable="true">
+              <el-select v-if="falg == 1" disabled v-model="code" :placeholder="$t('pleaseselectthetypeofleave')" clearable @change="chufas()" size="small" style="width: 120px" filterable="true">
                   <span v-for="(item, index) in statuss" :key="index">
                   <el-option :label="item.name" :value="item.id"></el-option>
                   </span> 
@@ -212,7 +212,7 @@
               <!-- <span style="color: #606266">请假时间</span>
               <el-date-picker v-model="createDate" type="date" @change="chufas()" value-format="yyyy-MM-dd" placeholder="选择日期" size="small" clearable="false"> </el-date-picker> -->
                 <span style="color: #606266">{{ $t('message.period') }}</span>
-                <el-date-picker v-model="createDate" type="daterange" :range-separator="$t('other.to')" :start-placeholder="$t('time.startDate')" :end-placeholder="$t('time.endDate')" @change="chufas()" value-format="yyyy-MM-dd" :placeholder="$t('optiondate')" size="small" clearable style="width:280px"></el-date-picker>
+                <el-date-picker v-model="createDate" type="daterange" :range-separator="$t('other.to')" :start-placeholder="$t('time.startDate')" :end-placeholder="$t('time.endDate')" @change="chufas()" value-format="yyyy-MM-dd" :placeholder="$t('optiondate')" size="small" clearable style="width:210px"></el-date-picker>
             </div>
             <div>
               <el-button type="primary" size="small" style="margin-left:20px" @click="exportLeave()">{{ $t('dao-chu-qing-jia-dan') }}</el-button>

+ 6 - 1
fhKeeper/formulahousekeeper/timesheet_h5/src/views/expense/details.vue

@@ -245,6 +245,7 @@
                     block
                     type="info"
                     @click="submitExpense"
+                    :loading="confirmLoading"
                     style="width: 100%; float: left"
                     >提交</van-button
                 >
@@ -272,6 +273,7 @@ export default {
                 remark: ''
             },
             invoiceList: [],
+            confirmLoading: false,
 
             formshowText: {
                 name: '',
@@ -449,15 +451,18 @@ export default {
             delete this.editForm.invoiceList
             this.editForm.items = JSON.stringify(this.invoiceList)
             this.editForm.totalAmount = this.totalCost
+            this.confirmLoading = true
             this.$axios.post("/expense-sheet/add", this.editForm)
             .then(res => {
                 if(res.code == "ok") {
                     this.$toast.success('提交成功')
+                    this.confirmLoading = false
                     this.back()
                 } else {
+                    this.confirmLoading = false
                     this.$toast.fail('获取失败');
                 }
-            }).catch(err=> {this.$toast.clear();console.log(err)});
+            }).catch(err=> {this.confirmLoading = false;this.$toast.clear();console.log(err)});
         },
 
 

+ 38 - 19
fhKeeper/formulahousekeeper/timesheet_h5/src/views/expense/index.vue

@@ -63,7 +63,7 @@
                 <van-field v-model="editForm.remark" label="备注" type="textarea"></van-field>
                 <!-- 发票 -->
                 <van-field label="发票" readonly>
-                    <template #input>总费用: ¥{{totalCost | numtosum}}</template>
+                    <template #input>总费用: ¥{{totalCost}}</template>
                 </van-field>
                 <div class="invoice" v-if="invoiceList.length != 0">
                     <div v-for="item,index in invoiceList" :key="item.id" style="position:relative" :class="index == 0 ? '' : 'invoice_item'">
@@ -77,7 +77,7 @@
                             <template #input>{{inTypeList[item.invoiceType]}}</template>
                         </van-field>
                         <van-field label="费用类型:" v-model="item.expenseType" @click="in_exTypeShow = true,invoiceIndex = index" readonly clickable required></van-field>
-                        <van-field label="费用金额(含税):" v-model="item.amount" type="number" @input="costCount" required></van-field>
+                        <van-field label="费用金额(含税):" v-model="item.amount" type="number" required></van-field>
                         <van-field label="发票号:" v-model="item.invoiceNo"></van-field>
                         <van-field label="税率%:" v-model="item.taxPercent"></van-field>
                         <van-field label="税额:" readonly>
@@ -136,7 +136,7 @@
             <!-- 提交 -->
             <div class="form_btn" style="position:fixed; bottom:0px;width:100%;">
                 <div style="padding-bottom:10px;">
-                    <van-button square block type="info" @click="submitExpense" style="width:100%;float:left;">提交</van-button>
+                    <van-button square block type="info" @click="submitExpense" :loading="confirmLoading" style="width:100%;float:left;">提交</van-button>
                 </div>
             </div>
             
@@ -193,7 +193,7 @@
                         <div class="collapse_label_l">金额: ¥{{item.totalAmount | numtosum}}</div>
                         <div class="collapse_label_r">状态:<span :class="statusClass[item.status]">{{statusList[item.status]}}</span></div>
                         <div class="operation">
-                            <van-button size="small" type="info" @click.stop="approve(item.id)">通过</van-button>
+                            <van-button size="small" type="info" :loading="item.approveLoading" @click.stop="approve(item)">通过</van-button>
                             <van-button style="margin-left:15px" size="small" type="danger" @click.stop="denyToReason(item.id)">驳回</van-button>
                         </div>
                     </template>
@@ -221,7 +221,7 @@
                 <van-field class="form_input"
                     v-model="denyParm.denyReason" name="reason" type="textarea" placeholder="请输入您决定驳回的原因"
                     rows="3" autosize  />
-                <van-button style="width:100%;" type="info" @click="deny()">提交</van-button>
+                <van-button style="width:100%;" type="info" :loading="denyLoading" @click="deny()">提交</van-button>
             </van-popup>
         </div>
     </div>
@@ -240,6 +240,8 @@ export default {
             currentDate2: new Date(),
             minDate: new Date(2020,0,1),
             maxDate: new Date(2025,11,31),
+            confirmLoading: false,
+            denyLoading: false,
 
             formshowText: {
                 name: '',
@@ -260,7 +262,6 @@ export default {
             typeList: ['一般','差旅','外包'],
 
             invoiceIndex: 0,
-            totalCost: 0,
             invoiceList: [
                 {
                     projectId: '',
@@ -306,6 +307,15 @@ export default {
 
         }
     },
+    computed: {
+        totalCost(){
+            let costnum = 0
+            for(let i in this.invoiceList){
+                costnum += (this.invoiceList[i].amount ? parseFloat(this.invoiceList[i].amount) : 0)
+            }
+            return costnum.toFixed(2)
+        }
+    },
     filters: {
         numtosum(value) {
             if (value == undefined || !value) return '0.00'
@@ -361,13 +371,6 @@ export default {
                 this.getExamineList()
             }
         },
-        costCount(){
-            let costnum = 0
-            for(let i in this.invoiceList){
-                costnum += this.invoiceList[i].amount*1
-            }
-            this.totalCost = costnum
-        },
 
     // #region 费用报销
         ownerIdChange(){
@@ -519,6 +522,7 @@ export default {
             this.editForm.items = JSON.stringify(this.invoiceList)
             this.editForm.totalAmount = this.totalCost
             // 获取新的票据编号
+            this.confirmLoading = true
             this.$axios.post("/expense-sheet/getNextCode", {})
             .then(res => {
                 if(res.code == "ok") {
@@ -526,6 +530,7 @@ export default {
                     // 提交
                     this.$axios.post("/expense-sheet/add", this.editForm)
                     .then(res => {
+                        this.confirmLoading = false
                         if(res.code == "ok") {
                             this.$toast.success('填报成功')
                             this.editForm = {
@@ -541,17 +546,20 @@ export default {
                             // }
                             this.formshowText.name = ''
                             this.formshowText.inProjectName = []
-                            this.totalCost = 0
                             this.invoiceList = []
                             this.uploader = []
                         } else {
                             this.$toast.fail('获取失败');
                         }
-                    }).catch(err=> {this.$toast.clear();console.log(err)});
+                    }).catch(err=> {this.confirmLoading = false;this.$toast.clear();console.log(err)});
                 } else {
+                    this.confirmLoading = false
                     this.$toast.fail('获取失败');
                 }
-            }).catch(err=> {this.$toast.clear();console.log(err)});
+            }).catch(err=> {
+                this.confirmLoading = false;
+            this.$toast.clear();
+            console.log(err)});
 
             
         },
@@ -581,11 +589,13 @@ export default {
         },
 
         // 单据审核
-        approve(pid){
-            this.$axios.post("/expense-sheet/approve", {id: pid})
+        approve(item){
+            item.approveLoading = true
+            this.$axios.post("/expense-sheet/approve", {id: item.id})
             .then(res => {
                 if(res.code == "ok") {
                     this.$toast.success('已通过')
+                    item.approveLoading = false
                     this.getExamineList()
                 } else {
                     this.$toast.fail('获取失败');
@@ -597,10 +607,13 @@ export default {
             this.denyReasonDialog = true
         },
         deny(){
+            this.denyLoading = true
             this.$axios.post("/expense-sheet/deny", this.denyParm)
             .then(res => {
                 if(res.code == "ok") {
                     this.$toast.success('已驳回')
+                    this.denyReasonDialog = false
+                    this.denyLoading = false
                     this.getExamineList()
                 } else {
                     this.$toast.fail('获取失败');
@@ -659,7 +672,7 @@ export default {
 
         getExamineList(){
             this.$axios.post("/expense-sheet/list", {
-                pageSize: 20,
+                pageSize: 999,
                 pageIndex: 1,
                 startDate: '',
                 endDate: '',
@@ -669,6 +682,9 @@ export default {
             }).then(res => {
                 if(res.code == "ok") {
                     this.examineList = res.data.records
+                    for(let i in this.examineList){
+                        this.$set(this.examineList[i],'approveLoading',false)
+                    }
                 } else {
                     this.$toast.fail('获取失败');
                 }
@@ -784,6 +800,9 @@ export default {
                 display: flex;
                 align-items: center;
                 justify-content: flex-end;
+                button{
+                    width: 1.2rem;
+                }
             }
             .wrapper{
                 div{

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet_h5/src/views/task/editask.vue

@@ -67,7 +67,7 @@
                             <van-stepper v-model="item.planHours" :disabled="!canEdit"/><span>{{'\u3000h'}}</span>
                         </template>
                     </van-field>
-                    <van-icon v-if="index != 0" class="delete_executor" name="delete-o" @click.stop="deleteExecutor(index)" />
+                    <van-icon v-if="index != 0 && canEdit" class="delete_executor" name="delete-o" @click.stop="deleteExecutor(index)" />
                 </div>
                 <van-popup v-model="executor.show" position="bottom" v-if="canEdit">
                     <van-search v-model="executor.searchText" placeholder="输入员工姓名搜索" @search="onSearch" v-if="user.userNameNeedTranslate != '1'"></van-search>