Browse Source

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

seyason 1 năm trước cách đây
mục cha
commit
e2e7a7d10d

+ 4 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/GroupBudgetReviewController.java

@@ -41,7 +41,7 @@ public class GroupBudgetReviewController {
     private ProjectMapper projectMapper;
 
     @RequestMapping("/add")
-    public HttpRespMsg add(Integer groupId,Integer oldManDay,Integer changeManDay,Integer nowManDay){
+    public HttpRespMsg add(Integer groupId,Integer oldManDay,Integer changeManDay,Integer nowManDay,String remark){
         HttpRespMsg httpRespMsg=new HttpRespMsg();
         if(changeManDay==null||changeManDay==0){
             httpRespMsg.setError("预估工时未发生变更");
@@ -58,7 +58,8 @@ public class GroupBudgetReviewController {
                 .setCompanyId(user.getCompanyId())
                 .setProjectId(project.getId()).setProjectName(project.getProjectName())
                 .setCreatorId(user.getId())
-                .setCreator(user.getName());
+                .setCreator(user.getName())
+                .setRemark(remark);
         if(!groupBudgetReviewService.save(groupBudgetReview)){
             httpRespMsg.setError("验证失败");
         }
@@ -90,7 +91,7 @@ public class GroupBudgetReviewController {
     public HttpRespMsg list(){
         HttpRespMsg httpRespMsg=new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
-        List<GroupBudgetReview> list = groupBudgetReviewService.list(new LambdaQueryWrapper<GroupBudgetReview>().eq(GroupBudgetReview::getCompanyId, companyId));
+        List<GroupBudgetReview> list = groupBudgetReviewService.list(new LambdaQueryWrapper<GroupBudgetReview>().eq(GroupBudgetReview::getCompanyId, companyId).orderByDesc(GroupBudgetReview::getCreateTime));
         httpRespMsg.setData(list);
         return httpRespMsg;
     }

+ 2 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java

@@ -435,8 +435,8 @@ public class ProjectController {
 
     //分页查询项目任务报表
     @RequestMapping("/getProjectTask")
-    public HttpRespMsg getProjectTask(@RequestParam Integer pageIndex, @RequestParam Integer pageSize, Integer projectId,Integer taskType) {
-        return projectService.getProjectTask(pageIndex, pageSize, projectId, request,taskType);
+    public HttpRespMsg getProjectTask(@RequestParam Integer pageIndex, @RequestParam Integer pageSize, Integer projectId,Integer groupId,Integer taskType) {
+        return projectService.getProjectTask(pageIndex, pageSize, projectId,groupId, request,taskType);
     }
 
     //分页查询项目各个阶段的汇总工时成本

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

@@ -19,7 +19,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2023-12-28
+ * @since 2024-01-04
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -96,6 +96,12 @@ public class GroupBudgetReview extends Model<GroupBudgetReview> {
     @TableField("project_name")
     private String projectName;
 
+    /**
+     * 变更原因
+     */
+    @TableField("remark")
+    private String remark;
+
 
     @Override
     protected Serializable pkVal() {

+ 2 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TaskMapper.java

@@ -33,9 +33,9 @@ public interface TaskMapper extends BaseMapper<Task> {
 
     List<TimeTask> getTaskWithWorktime(Integer projectId, Integer taskType);
 
-    List getProjectTask(Integer companyId, Integer pageStart, Integer pageSize, Integer projectId,Integer taskType,List<Integer> inchagerIds);
+    List<Map<String,Object>> getProjectTask(Integer companyId, Integer pageStart, Integer pageSize, Integer projectId,Integer groupId,Integer taskType,List<Integer> inchagerIds);
 
-    Integer getProjectTaskCount(Integer companyId, Integer projectId,Integer taskType,List<Integer> inchagerIds);
+    Integer getProjectTaskCount(Integer companyId, Integer projectId,Integer groupId,Integer taskType,List<Integer> inchagerIds);
 
     List getTaskWithProjectName(@Param(Constants.WRAPPER) Wrapper wrapper, Integer pageStart, Integer pageSize,Integer companyId,List<Integer> deptIds);
 

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

@@ -92,7 +92,7 @@ public interface ProjectService extends IService<Project> {
 
     HttpRespMsg exportProject(HttpServletRequest request);
 
-    HttpRespMsg getProjectTask(Integer pageIndex, Integer pageSize, Integer projectId, HttpServletRequest request,Integer taskType);
+    HttpRespMsg getProjectTask(Integer pageIndex, Integer pageSize, Integer projectId,Integer groupId, HttpServletRequest request,Integer taskType);
 
     HttpRespMsg exportProjectTask(HttpServletRequest request,Integer taskType);
 

+ 46 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -2697,7 +2697,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     }
 
     @Override
-    public HttpRespMsg getProjectTask(Integer pageIndex, Integer pageSize, Integer projectId, HttpServletRequest request,Integer taskType) {
+    public HttpRespMsg getProjectTask(Integer pageIndex, Integer pageSize, Integer projectId,Integer groupId, HttpServletRequest request,Integer taskType) {
         User user = userMapper.selectById(request.getHeader("Token"));
         Integer companyId = user.getCompanyId();
         int pageStart = (pageIndex -1) * pageSize;
@@ -2718,8 +2718,25 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 inchagerIds.add(-1);
             }
         }
-        int total = taskMapper.getProjectTaskCount(companyId, projectId,taskType,inchagerIds);
-        List projectTask = taskMapper.getProjectTask(companyId, pageStart, pageSize, projectId,taskType,inchagerIds);
+        int total = taskMapper.getProjectTaskCount(companyId, projectId,groupId,taskType,inchagerIds);
+        List<Map<String,Object>> projectTask = taskMapper.getProjectTask(companyId, pageStart, pageSize, projectId,groupId,taskType,inchagerIds);
+        if(companyId==3092){
+            List<Integer> groupIds = projectTask.stream().map(p -> Integer.valueOf(String.valueOf(p.get("groupId")))).distinct().collect(Collectors.toList());
+            groupIds.add(-1);
+            List<Report> reportList = reportMapper.selectList(new LambdaQueryWrapper<Report>().select(Report::getGroupId, Report::getWorkingTime).in(Report::getGroupId, groupIds));
+            List<TaskGroup> taskGroupList = taskGroupMapper.selectList(new LambdaQueryWrapper<TaskGroup>().in(TaskGroup::getId, groupIds));
+            for (Map<String, Object> p : projectTask) {
+                Optional<TaskGroup> group = taskGroupList.stream().filter(t -> t.getId().equals(Integer.valueOf(String.valueOf(p.get("groupId"))))).findFirst();
+                p.put("group_plan_hours",0);
+                if(group.isPresent()){
+                    p.put("group_plan_hours",0);
+                }
+                List<Report> reports = reportList.stream().filter(r -> r.getGroupId().equals(Integer.valueOf(String.valueOf(p.get("groupId"))))).collect(Collectors.toList());
+                BigDecimal reduce = reports.stream().map(r -> new BigDecimal(r.getWorkingTime())).reduce(BigDecimal.ZERO, BigDecimal::add);
+                reduce = reduce.setScale(2, BigDecimal.ROUND_HALF_UP);
+                p.put("group_real_hours",reduce.doubleValue());
+            }
+        }
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         Map<String, Object> map = new HashMap<>();
         map.put("records", projectTask);
@@ -2755,7 +2772,24 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 inchagerIds.add(-1);
             }
         }
-        List<Map> projectList = taskMapper.getProjectTask(companyId, null, null, null,taskType,inchagerIds);
+        List<Map<String,Object>> projectList = taskMapper.getProjectTask(companyId, null, null, null,null,taskType,inchagerIds);
+        if(companyId==3092){
+            List<Integer> groupIds = projectList.stream().map(p -> Integer.valueOf(String.valueOf(p.get("groupId")))).distinct().collect(Collectors.toList());
+            groupIds.add(-1);
+            List<Report> reportList = reportMapper.selectList(new LambdaQueryWrapper<Report>().select(Report::getGroupId, Report::getWorkingTime).in(Report::getGroupId, groupIds));
+            List<TaskGroup> taskGroupList = taskGroupMapper.selectList(new LambdaQueryWrapper<TaskGroup>().in(TaskGroup::getId, groupIds));
+            for (Map<String, Object> p : projectList) {
+                Optional<TaskGroup> group = taskGroupList.stream().filter(t -> t.getId().equals(Integer.valueOf(String.valueOf(p.get("groupId"))))).findFirst();
+                p.put("group_plan_hours",0);
+                if(group.isPresent()){
+                    p.put("group_plan_hours",0);
+                }
+                List<Report> reports = reportList.stream().filter(r -> r.getGroupId().equals(Integer.valueOf(String.valueOf(p.get("groupId"))))).collect(Collectors.toList());
+                BigDecimal reduce = reports.stream().map(r -> new BigDecimal(r.getWorkingTime())).reduce(BigDecimal.ZERO, BigDecimal::add);
+                reduce = reduce.setScale(2, BigDecimal.ROUND_HALF_UP);
+                p.put("group_real_hours",reduce.doubleValue());
+            }
+        }
         List<ProjectVO> list = new ArrayList<>();
         //String[] statusNames = {"进行中","已完成","已撤销"};
         String[] statusNames = {MessageUtils.message("excel.onGoing"),MessageUtils.message("excel.complete"),MessageUtils.message("excel.revoke")};
@@ -2764,11 +2798,19 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         List<List<String>> exportList = new ArrayList<>();
         //String[] titles = {"项目编号", "项目名称", "任务名称", "执行人","计划工时(h)", "实际工时(h)","状态", "类型", "截止日期"};
         String[] titles = {MessageUtils.message("entry.projectId"), MessageUtils.message("entry.projectName"), MessageUtils.message("entry.taskName"), MessageUtils.message("excel.executor"),MessageUtils.message("excel.plannedWork"), MessageUtils.message("excel.actualWork"),MessageUtils.message("leave.status"), MessageUtils.message("excel.type"), MessageUtils.message("entry.endDate")};
+        if(companyId==3092){
+            titles = new String[]{"项目编号", "项目名称","任务分组","分组预估工时","分组实际工时", "任务名称", "执行人","计划工时(h)", "实际工时(h)","状态", "类型", "截止日期"};
+        }
         exportList.add(Lists.list(titles));
         for (Map task : projectList) {
             List<String> data = new ArrayList<>();
             data.add(task.get("project_code") == null?"":task.get("project_code").toString());
             data.add(task.get("project_name") == null?"":task.get("project_name").toString());
+            if(companyId==3092){
+                data.add(task.get("groupName") == null?"":task.get("groupName").toString());
+                data.add(task.get("group_plan_hours") == null?"":task.get("group_plan_hours").toString());
+                data.add(task.get("group_real_hours") == null?"":task.get("group_real_hours").toString());
+            }
             data.add(task.get("name") != null?task.get("name").toString():"");
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 String userName = "";

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

@@ -17,11 +17,12 @@
         <result column="creator" property="creator" />
         <result column="project_id" property="projectId" />
         <result column="project_name" property="projectName" />
+        <result column="remark" property="remark" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, group_id, old_man_day, change_man_day, now_man_day, status, create_time, company_id, creator_id, group_name, creator, project_id, project_name
+        id, group_id, old_man_day, change_man_day, now_man_day, status, create_time, company_id, creator_id, group_name, creator, project_id, project_name, remark
     </sql>
 
 </mapper>

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

@@ -168,7 +168,7 @@
     </select>
 
     <select id="getProjectTask" resultType="java.util.Map">
-        SELECT task.id, task.`name`,task.executor_name,task.executor_id,DATE_FORMAT(task.`end_date`, '%Y-%m-%d') as end_date, task.`plan_hours`,
+        SELECT task.id,tg.id as groupId, task.`name`,task.executor_name,task.executor_id,DATE_FORMAT(task.`end_date`, '%Y-%m-%d') as end_date, task.`plan_hours`,
         (SELECT IFNULL(SUM(working_time),0) FROM report WHERE report.`task_id` = task.id AND report.`state` = 1) AS real_hours,
         task.`task_status`, task.`task_type`,
         project.`project_code`, project.`project_name`,tg.name as groupName
@@ -179,6 +179,9 @@
         <if test="projectId != null">
             and task.project_id = #{projectId}
         </if>
+        <if test="groupId != null">
+            and task.group_id = #{groupId}
+        </if>
         <if test="taskType!=null">
             and task.task_type=#{taskType}
         </if>
@@ -199,6 +202,9 @@
         <if test="projectId != null">
             and task.project_id = #{projectId}
         </if>
+        <if test="groupId != null">
+            and task.group_id = #{groupId}
+        </if>
         <if test="taskType!=null">
             and task.task_type=#{taskType}
         </if>

+ 60 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue

@@ -103,12 +103,18 @@
           <el-option label="查看部门审核人" :value="0"></el-option>
         </el-select> -->
         <!-- 项目筛选 -->
-        <el-select v-if="ins != 4 && ins != 8 && ins != 9 && ins != 19 && ins != 10 && ins != 11 && ins != 14 && ins != 15 && ins != 17 && ins != 20 && ins != 21 && ins != 22" v-model="proJuctId" :placeholder="$t('defaultText.pleaseSelectSnItem')" clearable filterable size="small" @change="selcts()" style="margin-left:10px">
+        <el-select v-if="ins != 4 && ins != 8 && ins != 9 && ins != 19 && ins != 10 && ins != 11 && ins != 14 && ins != 15 && ins != 17 && ins != 20 && ins != 21 && ins != 22" v-model="proJuctId" :placeholder="$t('defaultText.pleaseSelectSnItem')" clearable filterable size="small" @change="projectChange()" style="margin-left:10px">
           <el-option v-for="(item) in proListOvertime" :key="item.id" :label="item.projectName + (item.projectCode ? item.projectCode : '')" :value="item.id">
             <span style="float: left;color: #8492a6;">{{ item.projectCode }}</span>
             <span style="float: right;font-size: 13px;margin-left: 20px">{{ item.projectName }}</span>
           </el-option>
         </el-select>
+
+        <!-- 任务分组 -->
+        <el-select v-if="ins == 1 && user.companyId == '3092'" v-model="projectGroupId" :placeholder="'请选择任务分组'" clearable filterable size="small" @change="getList(true)" style="margin-left:10px">
+          <el-option v-for="(item) in projectTaskgroupList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+        </el-select>
+
         <el-select v-if="ins==12 && user.companyId==936" v-model="projectCategorySubId" :placeholder="'请选择自主项目类别'" clearable filterable size="small" @change="selcts()" style="margin-left:10px">
           <el-option v-for="(item) in projectCategorySubList" :key="item.value" :label="item.label" :value="item.value"></el-option>
         </el-select>
@@ -278,6 +284,18 @@
                         {{scope.row.end_date}}
                     </template>
                 </el-table-column>
+                <span v-if="user.companyId == '3092'">
+                  <el-table-column prop="group_plan_hours" :label="'分组预估工时(h)'"  width="150">
+                      <template slot-scope="scope">
+                          {{scope.row.group_plan_hours}}
+                      </template>
+                  </el-table-column>
+                  <el-table-column prop="group_real_hours" :label="'分组实际工时(h)'"  width="150">
+                      <template slot-scope="scope">
+                          {{scope.row.group_real_hours}}
+                      </template>
+                  </el-table-column>
+                </span>
             </el-table>
 
             <!--项目成本报表 -->
@@ -1320,8 +1338,10 @@ export default {
       list1:[],
       listArr1:[],
       listArr2:[],
+      listArr3:[],
       listPosition1:0,
       listPosition2:0,
+      listPosition3:0,
       windowHeight: document.documentElement.clientHeight,
       windowWidth: document.documentElement.clientWidth,
 
@@ -1467,6 +1487,9 @@ export default {
       projectSortId: '', // 项目分类选中的id
       projectSortName: '', // 项目分类选中的Name
       projectSortList: [], // 项目分类
+
+      projectTaskgroupList: [], // 选择项目的任务分组
+      projectGroupId: '', // 选择项目的任务分组id
     };
   },
   computed: {},
@@ -1587,6 +1610,7 @@ export default {
       })
     },
     objectSpanMethod({ row, column, rowIndex, columnIndex }){
+      const { companyId } = this.user
       if(columnIndex == 0){
         const _row = this.listArr1[rowIndex]
         const _col = _row > 0 ? 1 : 0
@@ -1603,6 +1627,14 @@ export default {
           colspan: _col
         }
       }
+      if(columnIndex == 2 && companyId == '3092') {
+        const _row = this.listArr3[rowIndex]
+        const _col = _row > 0 ? 1 : 0
+        return {
+          rowspan: _row,
+          colspan: _col
+        }
+      }
     },
 
     getCustomName(){
@@ -2517,6 +2549,7 @@ export default {
     },
     getProjectTask() {
       this.listLoading = true;
+      const { companyId } = this.user
       let ginseng = {
         pageIndex: this.page,
         pageSize: this.size,
@@ -2525,9 +2558,13 @@ export default {
       if(this.taskTypeId != 'null' && this.taskTypeId != null && this.taskTypeId != '') {
         ginseng.taskType = this.taskTypeId
       }
+      if(companyId == '3092') {
+        ginseng.groupId = this.projectGroupId
+      }
       this.http.post('/project/getProjectTask', ginseng,
         res => {
             if (res.code == "ok") {
+              const { companyId } = this.user
               for(var i in res.data.records) {
                 if(i > 0 && (res.data.records[i].project_code == res.data.records[i - 1].project_code)) {
                   res.data.records[i].customCode = '——'
@@ -2548,10 +2585,15 @@ export default {
                 this.list1 = res.data.records;
                 this.listArr1 = []
                 this.listArr2 = []
+                this.listArr3 = []
                 this.listPosition1 = 0
                 this.listPosition2 = 0
+                this.listPosition3 = 0
                 this.rowspan(this.listArr1,this.listPosition1,'project_code')
                 this.rowspan(this.listArr2,this.listPosition2,'project_name')
+                if(companyId == 3092) {
+                  this.rowspan(this.listArr3,this.listPosition3,'groupId')
+                }
                 this.total = res.data.total;
                 this.listLoading = false; 
             } else {
@@ -3127,6 +3169,15 @@ export default {
         _this.gettime = [time1 , time2];
         return  _this.gettime
     },
+    projectChange() {
+      const { companyId } = this.user
+      if(this.ins == 1 && companyId == '3092') {
+        this.projectTaskgroupList == []
+        this.projectGroupId = ''
+        this.getProjectTaskgroupList()
+      }
+      this.selcts()
+    },
     selcts(e) {
       this.page = 1
       if(this.ins == 12){
@@ -3393,7 +3444,14 @@ export default {
       this.projectSortList = dataList
       this.projectSortId = dataList[0].id
       this.projectSortName = dataList[0].name
-    }
+    },
+    // 获取任务分组
+    async getProjectTaskgroupList() {
+      let { data } = await this.postData('/task-group/list', {
+        projectId: this.proJuctId
+      })
+      this.projectTaskgroupList = data
+    },
   },
 };
 </script>

+ 21 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/project/budgetReview.vue

@@ -83,6 +83,21 @@
                     </div>
                 </template>
             </el-table-column>
+
+            <el-table-column prop="remark" :label="'变更理由'" sortable width="200px">
+                <template slot-scope="scope">
+                    <div>
+                        <div v-if="scope.row.remark && scope.row.remark.length > 11">
+                            <el-tooltip class="remarkClassItem" effect="dark" :content="scope.row.remark" placement="top">
+                                <div class="remarkClass">{{scope.row.remark}}</div>
+                            </el-tooltip>
+                        </div>
+                        <div v-else>
+                            {{scope.row.remark}}
+                        </div>
+                    </div>
+                </template>
+            </el-table-column>
             
             <el-table-column prop="status" :label="$t('state.states')" sortable>
                 <template slot-scope="scope">
@@ -711,10 +726,14 @@
     };
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .propsbtn {
     display: inline-block;
     padding-left: 20px;
 }
-
+.remarkClass {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
 </style>

+ 40 - 12
fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

@@ -85,7 +85,7 @@
                                 <el-link type="primary" :underline="false" @click="projectLevelDialog = true">{{ $t('projectlevelmanagement') }}</el-link>
                             </el-dropdown-item>
                             <el-dropdown-item v-if="user.timeType.syncFanwei==1||user.timeType.syncSap==1">
-                                <el-link type="primary" :underline="false" @click="syncProjectDig=true">{{'同步项目信息'}}</el-link>
+                                <el-link type="primary" :underline="false" @click="syncProjectDig=true, synchronizationInputVal = ''">{{'同步项目信息'}}</el-link>
                             </el-dropdown-item>
                             <el-dropdown-item v-if="user.companyId==3385 && permissions.projectClassification">
                                 <el-link type="primary" :underline="false" @click="functionalDivisionDig=true,getFunctionalList()">{{'职能分工设置'}}</el-link>
@@ -1639,15 +1639,26 @@
         </el-dialog>
         <!-- 项目同步弹窗 -->
         <el-dialog title="项目服务同步" :visible.sync="syncProjectDig" width="600px" :before-close="handleClose">
-            <el-form label-width="100px">
-                <el-form-item :label="'项目编号:'">
-                     <el-select filterable collapse-tags clearable  v-model="hasChooseProjectCode" multiple placeholder="请选择" style="width:100%">
-                        <el-option v-for="item in allProjectList" :key="item.id" :label="item.projectName  + '\u3000' + item.projectCode" :value="item.projectCode">
-                            <span style="float: right; color: #8492a6; font-size: 13px;">{{ item.projectCode }}</span>
-                            <span style="float: left;">{{ item.projectName }}</span>
-                        </el-option>
-                    </el-select>
-                </el-form-item>
+            <el-form label-width="0">
+                <div class="synchronization">
+                    <div class="synchronizationLabel">
+                        <el-select v-model="synchronizationVal" placeholder="请选择" @change="synchronizationChange()">
+                            <el-option label="已同步项目" value="0"></el-option>
+                            <el-option label="未同步项目" value="1"></el-option>
+                        </el-select>
+                    </div>
+                    <el-form-item style="flex: 1" v-if="synchronizationVal == 0">
+                        <el-select filterable collapse-tags clearable  v-model="hasChooseProjectCode" multiple placeholder="请选择" style="width:100%">
+                            <el-option v-for="item in allProjectList" :key="item.id" :label="item.projectName  + '\u3000' + item.projectCode" :value="item.projectCode">
+                                <span style="float: right; color: #8492a6; font-size: 13px;">{{ item.projectCode }}</span>
+                                <span style="float: left;">{{ item.projectName }}</span>
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item style="flex: 1" v-if="synchronizationVal == 1">
+                        <el-input placeholder="请输入项目编号" v-model="synchronizationInputVal" clearable></el-input>
+                    </el-form-item>
+                </div>
             </el-form>
             <span slot="footer" class="dialog-footer">
                 <el-button @click="syncProjectDig = false">取 消</el-button>
@@ -1965,6 +1976,8 @@ a {
                 syncProjectDig:false,
                 allProjectList:[],
                 hasChooseProjectCode:[],
+                synchronizationVal: '0',
+                synchronizationInputVal: ''
             };
         },
         // 过滤器
@@ -4050,7 +4063,7 @@ a {
                     url='/project/syncProjectWithSap'
                     if(hasChooseProjectCode){
                         param={
-                            projectCodes:hasChooseProjectCode.toString()
+                            projectCodes: this.synchronizationVal == '0' ? hasChooseProjectCode.toString() : this.synchronizationInputVal
                         }
                     }
                 }
@@ -5743,8 +5756,15 @@ a {
                     });
                     }
                 );
+            },
+            
+            synchronizationChange() {
+                if(this.synchronizationVal == '1') {
+                    this.hasChooseProjectCode = []
+                } else {
+                    this.synchronizationInputVal = ''
+                }
             }
-
         },
         created() {
             let height = window.innerHeight;
@@ -5814,6 +5834,14 @@ a {
 </script>
 
 <style lang="scss" scoped>
+.synchronization {
+    display: flex;
+    justify-content: space-between;
+    // align-items: center;
+    .synchronizationLabel {
+        width: 140px;
+    }
+}
 .rg_span{
     display: inline-block;
 }

+ 16 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue

@@ -1170,6 +1170,14 @@
                    <el-input v-model="groupBudgetData.changeManDay" type="number" @change="changeNowManDay(groupBudgetData)" :placeholder="$t('peaseenterthe')" maxlength="10" :max="99999" style="width:120px;"></el-input>&nbsp;人天
                 </el-form-item>
                 <el-form-item :label="'变更后预估工时'"><span>{{nowManDay}}{{'人天'}}</span></el-form-item>
+                <el-form-item :label="'变更理由'">
+                    <el-input
+                        type="textarea"
+                        :rows="2"
+                        placeholder="请输入内容"
+                        v-model="groupBudgetData.remark">
+                    </el-input>
+                </el-form-item>
             </el-form>
             <div slot="footer" class="dialog-footer">
                 <el-button @click.native="changeBudgetDig = false">{{ $t('btn.cancel') }}</el-button>
@@ -2940,8 +2948,16 @@
                         oldManDay:groupBudgetData.manDay,
                         changeManDay:groupBudgetData.changeManDay,
                         nowManDay:this.nowManDay,
+                        remark:groupBudgetData.remark,
                     }
                 }
+                if(!groupBudgetData.remark) {
+                    this.$message({
+                        message: '请输入变更理由',
+                        type: "error"
+                    });
+                    return
+                }
                 this.http.post('/group-budget-review/add',param,
                 res => {
                     if (res.code == "ok") {