yusm 4 mesiacov pred
rodič
commit
f2cfed0bb8

+ 201 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectApprovalController.java

@@ -279,6 +279,207 @@ public class ProjectApprovalController {
         return msg;
     }
 
+    @RequestMapping("/tempSave")
+    @Transactional(rollbackFor = Exception.class)
+    public HttpRespMsg tempSave(@RequestBody ProjectApproval projectApproval) throws Exception{
+        HttpRespMsg msg=new HttpRespMsg();
+        String[] arr=new String[]{"正常","紧急","重要","重要且紧急","低风险","中风险","高风险"};
+        User user = userMapper.selectById(request.getHeader("token"));
+        Integer companyId = user.getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
+        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, companyId));
+        List<ProjectCategory> categoryList = projectCategoryService.list(new LambdaQueryWrapper<ProjectCategory>().eq(ProjectCategory::getCompanyId, companyId));
+        //编辑重新提交修改状态为待提交
+        projectApproval.setStatus(-1);
+        if(projectApproval.getId()==null){
+            projectApproval.setCompanyId(companyId);
+            projectApproval.setCreateDate(LocalDate.now());
+            projectApproval.setCreatorId(user.getId());
+        }
+        //新增操作记录数据
+        ProjectApprovalLog projectApprovalLog=new ProjectApprovalLog();
+        projectApprovalLog.setCreateTime(LocalDateTime.now());
+        projectApprovalLog.setUserName(user.getName());
+        if(projectApproval.getId()==null){
+            //暂存
+            projectApprovalLog.setType(-1);
+        }else {
+            //提交
+            projectApprovalLog.setType(0);
+        }
+        Optional<ProjectCategory> category = categoryList.stream().filter(c -> c.getId().equals(projectApproval.getCategory())).findFirst();
+        if(category.isPresent()){
+            projectApproval.setCategoryName(category.get().getName());
+        }
+        if(projectApproval.getInchargerId()!=null){
+            User id = userMapper.selectById(projectApproval.getInchargerId());
+            projectApproval.setInchargerName(id.getName());
+        }
+        if (projectApproval.getId() != null) {
+            if (org.apache.commons.lang3.StringUtils.isNotEmpty(projectApproval.getProjectCode())){
+                //编辑
+                Integer count=projectMapper.selectCount(new LambdaQueryWrapper<Project>().eq(Project::getCompanyId, companyId)
+                        .eq( Project::getProjectCode, projectApproval.getProjectCode())
+                        .ne(Project::getApproveId,projectApproval.getId()));
+                Integer count1=projectApprovalService.count(new LambdaQueryWrapper<ProjectApproval>().eq(ProjectApproval::getCompanyId, companyId).eq(ProjectApproval::getProjectCode, projectApproval.getProjectCode()).ne(ProjectApproval::getId,projectApproval.getId()));
+                if(count>0||count1>0){
+                    msg.setError("已存在项目编号为["+projectApproval.getProjectCode()+"]的项目/立项");
+                    return msg;
+                }
+            }
+        } else {
+            //新增
+            if(!StringUtils.isEmpty(projectApproval.getProjectCode())){
+                Integer count=projectMapper.selectCount(new LambdaQueryWrapper<Project>().eq(Project::getCompanyId, companyId).eq(Project::getProjectCode, projectApproval.getProjectCode()));
+                Integer count1=projectApprovalService.count(new LambdaQueryWrapper<ProjectApproval>().eq(ProjectApproval::getCompanyId, companyId).eq(ProjectApproval::getProjectCode, projectApproval.getProjectCode()));
+                if(count>0||count1>0){
+                    msg.setError("已存在项目编号为["+projectApproval.getProjectCode()+"]的项目/立项");
+                    return msg;
+                }
+            }
+        }
+
+        if(!projectApprovalService.saveOrUpdate(projectApproval)){
+            msg.setError("验证失败");
+            return msg;
+        }
+        projectApprovalLog.setProjectApprovalId(projectApproval.getId());
+        projectApprovalLogService.save(projectApprovalLog);
+        participationApprovalService.remove(new LambdaQueryWrapper<ParticipationApproval>().eq(ParticipationApproval::getProjectApprovalId,projectApproval.getId()));
+        projectApprovalBasecostService.remove(new LambdaQueryWrapper<ProjectApprovalBasecost>().eq(ProjectApprovalBasecost::getProjectApprovalId,projectApproval.getId()));
+        projectApprovalAuditorService.remove(new LambdaQueryWrapper<ProjectApprovalAuditor>().eq(ProjectApprovalAuditor::getProjectApprovalId,projectApproval.getId()));
+        projectApprovalCheckService.remove(new LambdaQueryWrapper<ProjectApprovalCheck>().eq(ProjectApprovalCheck::getProjectApprovalId,projectApproval.getId()).eq(ProjectApprovalCheck::getStatus,0));
+        if(projectApproval.getParticipationApprovalList()!=null&&projectApproval.getParticipationApprovalList().size()>0){
+            List<ParticipationApproval> participationApprovalList = projectApproval.getParticipationApprovalList();
+            participationApprovalList.forEach(p->{
+                p.setProjectApprovalId(projectApproval.getId());
+                Optional<User> first = userList.stream().filter(u -> u.getId().equals(p.getUserId())).findFirst();
+                if(first.isPresent()){
+                    p.setUserName(first.get().getName());
+                }
+            });
+            if(participationApprovalList.size()>0){
+                participationApprovalService.saveBatch(participationApprovalList);
+            }
+        }
+        if(projectApproval.getProjectApprovalBasecostList()!=null&&projectApproval.getProjectApprovalBasecostList().size()>0){
+            List<ProjectApprovalBasecost> projectApprovalBasecostList = projectApproval.getProjectApprovalBasecostList();
+            projectApprovalBasecostList.forEach(p->{
+                p.setProjectApprovalId(projectApproval.getId());
+            });
+            projectApprovalBasecostService.saveBatch(projectApprovalBasecostList);
+        }
+        if(projectApproval.getProjectApprovalAuditorList()!=null&&projectApproval.getProjectApprovalAuditorList().size()>0){
+            List<ProjectApprovalAuditor> projectApprovalAuditorList = projectApproval.getProjectApprovalAuditorList();
+            projectApprovalAuditorList.forEach(p->{
+                p.setProjectApprovalId(projectApproval.getId());
+                Optional<User> first = userList.stream().filter(u -> u.getId().equals(p.getAuditorId())).findFirst();
+                if(first.isPresent()){
+                    p.setAuditorName(first.get().getName());
+                }
+            });
+            if(projectApprovalAuditorList.size()>0){
+                projectApprovalAuditorService.saveBatch(projectApprovalAuditorList);
+            }
+        }
+        if(projectApproval.getProjectApprovalCheckList()!=null&&projectApproval.getProjectApprovalCheckList().size()>0){
+            List<ProjectApprovalCheck> projectApprovalCheckList = projectApproval.getProjectApprovalCheckList();
+            projectApprovalCheckList.forEach(p->{
+                p.setProjectApprovalId(projectApproval.getId());
+            });
+            projectApprovalCheckList=projectApprovalCheckList.stream().filter(p-> !StringUtils.isEmpty(p.getUserId())).collect(Collectors.toList());
+            for (int i = 0; i < projectApprovalCheckList.size(); i++) {
+                projectApprovalCheckList.get(i).setSeq(i+1);
+            }
+            if(projectApprovalCheckList.size()>0){
+                projectApprovalCheckService.saveOrUpdateBatch(projectApprovalCheckList);
+            }
+        }
+
+        if(projectApproval.getStatus()==-1){
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                //更新审核人 发送到企业微信完成审核动作
+                String detail = wxCorpInfoService.getTemplateDetail(companyId);
+                if(detail!=null&&!StringUtils.isEmpty(detail)){
+                    DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
+                    JSONObject resultOb = JSONObject.parseObject(detail);
+                    JSONObject template_content = resultOb.getJSONObject("template_content");
+                    JSONArray controls = template_content.getJSONArray("controls");
+                    Map<String,Object> templateMap=new HashMap<>();
+                    WxCorpTemplate template = wxCorpTemplateService.getById(companyId);
+                    JSONObject requestData=new JSONObject();
+                    requestData.put("template_id",template.getTemplateId());
+                    requestData.put("creator_userid",user.getCorpwxUserid());
+                    //审核模式  0-通过接口指定审批人、抄送人(此时approver、notifyer等参数可用);1-使用此模板在管理后台设置的审批流程(需要保证审批流程中没有“申请人自选”节点),支持条件审批
+                    requestData.put("use_template_approver",1);
+                    JSONObject apply_data=new JSONObject();
+                    JSONArray contents=new JSONArray();
+                    for (int i = 0; i < controls.size(); i++) {
+                        JSONObject item = controls.getJSONObject(i);
+                        JSONObject property = item.getJSONObject("property");
+                        //控件id指定到指定控件
+                        String templateId = property.getString("id");
+                        //控件名称 这里为了统一工时管家格式 限制企业需要用到我们提供的名称(项目编号 项目名称 项目分类 项目类型 项目经理 级别 合同金额 计划开始日期 计划结束日期)
+                        JSONArray titleArray = property.getJSONArray("title");
+                        //控件类型 在这里统一用Text  Text-文本;Textarea-多行文本;Number-数字;Money-金额;Date-日期/日期+时间;Selector-单选/多选;Contact-成员/部门;Tips-说明文字;File-附件;Table-明细;Attendance-假勤控件;Vacation-请假控件;Location-位置;RelatedApproval-关联审批单;Formula-公式;DateRange-时长;BankAccount-收款账户
+                        String control = property.getString("control");
+                        //是否必填
+                        String require = property.getString("require");
+                        //是否打印
+                        String un_print = property.getString("un_print");
+                        JSONObject content=new JSONObject();
+                        content.put("control",control);
+                        content.put("id",templateId);
+                        JSONObject value=new JSONObject();
+                        JSONObject titleOb = titleArray.getJSONObject(0);
+                        switch (titleOb.getString("text")){
+                            case "项目编号":
+                                value.put("text",projectApproval.getProjectCode()==null?"":projectApproval.getProjectCode());
+                                break;
+                            case "项目名称":
+                                value.put("text",projectApproval.getProjectName());
+                                break;
+                            case "项目分类":
+                                value.put("text",projectApproval.getCategoryName()==null?"":projectApproval.getCategoryName());
+                                break;
+                            case "项目类型":
+                                value.put("text",projectApproval.getIsPublic()==0?"正式项目":"非项目");
+                                break;
+                            case "项目经理":
+                                value.put("text",projectApproval.getInchargerName()==null?"":("$userName="+projectApproval.getInchargerName()+"$"));
+                                break;
+                            case "级别":
+                                value.put("text",arr[projectApproval.getLevel()-1]);
+                                break;
+                            case "合同金额":
+                                value.put("text",projectApproval.getContractAmount()==null?String.valueOf(0):String.valueOf(projectApproval.getContractAmount()));
+                                break;
+                            case "计划开始日期":
+                                value.put("text",projectApproval.getPlanStartDate()==null?"":df.format(projectApproval.getPlanStartDate()));
+                                break;
+                            case "计划结束日期":
+                                value.put("text",projectApproval.getPlanEndDate()==null?"":df.format(projectApproval.getPlanEndDate()));
+                                break;
+                        }
+                        content.put("value",value);
+                        contents.add(content);
+                    }
+                    apply_data.put("contents",contents);
+                    requestData.put("apply_data",apply_data);
+                    requestData.put("approver",new JSONArray());
+                    requestData.put("summary_list",new JSONArray());
+                    System.out.println("===============>发送到企业微信的数据"+requestData);
+                    //发送到企业微信
+                    String sp_no = wxCorpInfoService.applyEvent(request, requestData);
+                    projectApproval.setWxCorpSpNo(sp_no);
+                    projectApprovalService.updateById(projectApproval);
+                }else {
+                    throw  new Exception("企业暂未同步服务商审批模板,推送企业微信审批失败,请联系服务商!");
+                }
+            }
+        }
+        return msg;
+    }
 
     @RequestMapping("/getDetail")
     public HttpRespMsg getDetail(Integer id){

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

@@ -88,7 +88,7 @@ public class ProjectApproval extends Model<ProjectApproval> {
     private Integer level;
 
     /**
-     * 立项状态 0-待审核 1-已通过 2-已驳回
+     * 立项状态 -1-待提交 0-待审核 1-已通过 2-已驳回
      */
     @TableField("status")
     private Integer status;

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

@@ -37,7 +37,7 @@ public class ProjectApprovalCheck extends Model<ProjectApprovalCheck> {
     private String userId;
 
     /**
-     * 审核状态 0-待审核 1-审核通过 2-已驳回
+     * 审核状态 -1待提交 0-待审核 1-审核通过 2-已驳回
      */
     @TableField("status")
     private Integer status;

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

@@ -43,7 +43,7 @@ public class ProjectApprovalLog extends Model<ProjectApprovalLog> {
     private LocalDateTime createTime;
 
     /**
-     * 操作类型 0-提交 1-编辑 2-通过 3-驳回 4-撤销
+     * 操作类型 -1 暂存 0-提交 1-编辑 2-通过 3-驳回 4-撤销
      */
     @TableField("type")
     private Integer type;

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

@@ -150,6 +150,7 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
                 }
             }
         }
+        queryWrapper.orderByDesc(ProjectApproval::getId);
         IPage<ProjectApproval> iPage = projectApprovalMapper.selectPage(new Page<>(pageIndex, pageSize), queryWrapper);
         Map<String,Object> result=new HashMap<>();
         List<ProjectApproval> records = iPage.getRecords();

+ 118 - 6
fhKeeper/formulahousekeeper/timesheet/src/views/projectApproval/projectApproval.vue

@@ -82,18 +82,18 @@
                                 <span v-else>{{importanceListLable[scope.row.level - 1]}}</span>
                             </template>
                         </el-table-column>
-                        <el-table-column prop="status" :label="$t('other.approvalStatus')" min-width="100" >
+                        <el-table-column prop="status" :label="$t('state.states')" min-width="100" >
                             <template slot-scope="scope">
-                                {{scope.row.status == null?"-":approvalStatusStr[scope.row.status]}}
+                                {{scope.row.status == null?"-":approvalStatusStr[scope.row.status+1]}}
                             </template>
                         </el-table-column>
                         <el-table-column prop="rejectInfo" :label="$t('dismissreason')" min-width="250" ></el-table-column>
                         <el-table-column :label="$t('operation')" :width="300" align="left" fixed="right">
                             <template slot-scope="scope">
-                                <el-button size="mini" type="primary" v-if="(permissions.projectApprovalEdit||permissions.projectApprovalCheck)&&scope.row.status!=1" @click="handleAdd(scope.$index, scope.row)">{{'编辑'}}</el-button>
+                                <el-button size="mini" type="primary" v-if="(permissions.projectApprovalEdit||permissions.projectApprovalCheck)&&scope.row.status!=1" :disabled="scope.row.status!==-1"  @click="handleAdd(scope.$index, scope.row)">{{'编辑'}}</el-button>
                                 <el-button size="mini" type="success" v-if="(permissions.projectApprovalEdit||permissions.projectApprovalCheck) && scope.row.status==0" :disabled="!scope.row.isFirstCheckUser"  @click="check(scope.row,1)" >{{'通过'}}</el-button>
                                 <el-button size="mini" v-if="(permissions.projectApprovalEdit||permissions.projectApprovalCheck) && scope.row.status==0" :disabled="!scope.row.isFirstCheckUser"  @click="showDenyDialog(scope.row,2)">{{'驳回'}}</el-button>
-                                <el-button size="mini" v-if="(permissions.projectApprovalEdit ||permissions.projectApprovalCheck) && scope.row.status==1" @click="check(scope.row,3)">{{'撤销'}}</el-button>
+                                <el-button size="mini" v-if="(permissions.projectApprovalEdit ||permissions.projectApprovalCheck) && scope.row.status==-1" @click="check(scope.row,3)">{{'撤销'}}</el-button>
                             </template>
                         </el-table-column>
                     </el-table>
@@ -274,6 +274,7 @@
                         <div slot="footer" class="dialog-footer;">
                             <el-button @click.native="deletePro(1, addForm)" v-if="(permissions.projectApprovalEdit) && addForm.id" style="float:left">{{ $t('btn.delete') }}</el-button>
                             <el-button @click.native="addFormVisible = false">{{ $t('btn.cancel') }}</el-button>
+                            <el-button type="primary" :disabled="addForm.status != -1" @click="tempSave" :loading="addLoading">{{ $t('btn.temporaryStorage') }}</el-button>
                             <el-button type="primary" @click="submitInsert" :loading="addLoading">{{ $t('btn.submit') }}</el-button>
                         </div>
                     </el-dialog>
@@ -465,7 +466,7 @@ return {
     page: 1,
     size: localStorage.getItem("projectPageSize")==null?20:parseInt(localStorage.getItem("projectPageSize")),
     listLoading:false,
-    approvalStatusStr:[this.$t('state.WaitingAudit'),this.$t('state.alreadyPassed'),this.$t('state.rejected'),this.$t('state.undone')],
+    approvalStatusStr:[this.$t('state.waitingsubmit'),this.$t('state.WaitingAudit'),this.$t('state.alreadyPassed'),this.$t('state.rejected'),this.$t('state.undone')],
     importanceList:[{id:1,label:this.$t('zheng-chang')},{id:2,label:this.$t('jin-ji')},{id:3,label:this.$t('zhong-yao')},{id:4,label:this.$t('zhong-yao-qie-jin-ji')}],
     importanceListLable:[this.$t('zheng-chang'), this.$t('jin-ji'), this.$t('zhong-yao'), this.$t('zhong-yao-qie-jin-ji'), this.$t('di-feng-xian'), this.$t('zhong-feng-xian'), this.$t('gao-feng-xian')],
     addFormVisible:false,
@@ -705,6 +706,117 @@ methods: {
             }
         });
     },
+    tempSave() {
+        this.$refs.form1.validate(valid => {
+            if (valid) {
+                this.addLoading = true;
+                let targetData = {};
+                targetData.projectName= this.addForm.name
+                if(this.addForm.projectDesc != null) {
+                    targetData.projectDesc=this.addForm.projectDesc
+                }
+                if(this.addForm.id != null) {
+                    targetData.id=this.addForm.id
+                }
+                if(this.addForm.isPublic != null) {
+                    targetData.isPublic=this.addForm.isPublic
+                }
+                if(this.addForm.userId.length != 0 && this.addForm.isPublic == 0) {
+                    let userArray=[]
+                    for(let i in this.addForm.userId){
+                        userArray.push({
+                            "userId":this.addForm.userId[i]
+                        })
+                    }
+                    targetData.participationApprovalList=userArray
+                }
+                if(this.addForm.inchargerId != null) {
+                    targetData.inchargerId=this.addForm.inchargerId
+                }
+                if(this.addForm.code != null) {
+                    targetData.projectCode=this.addForm.code
+                }
+                if(this.addForm.planStartDate != null) {
+                    targetData.planStartDate=this.addForm.planStartDate
+                }
+                if(this.addForm.planEndDate != null) {
+                    targetData.planEndDate=this.addForm.planEndDate
+                }
+                if(this.addForm.level != null) {
+                    targetData.level=this.addForm.level
+                }
+                if(this.addForm.contractAmount != null) {
+                    targetData.contractAmount=this.addForm.contractAmount
+                }
+                if (this.projectBaseCostData != null) {
+                    targetData.projectApprovalBasecostList=this.projectBaseCostData
+                    //计算总预算成本
+                    if (this.addForm.budget == null) {
+                        this.addForm.budget = 0;
+                    }
+                    targetData.budget=this.addForm.budget
+                }
+                if (this.addForm.contractAmount) {
+                    targetData.contractAmount=this.addForm.contractAmount
+                } else {
+                    targetData.contractAmount=0
+                }
+                if (this.user.timeType.outputValueStatus == 1){
+                    targetData.outputValue=this.addForm.outputValue ? this.addForm.outputValue : 0
+                }
+                //日报审核人
+                if (this.addForm.auditUserIds) {
+                    targetData.auditUserIds=this.addForm.auditUserIds
+                }
+                if(this.addForm.auditUserIds&&this.addForm.auditUserIds.length != 0) {
+                    let userArray=[]
+                    for(let i in this.addForm.auditUserIds){
+                        userArray.push({
+                            "auditorId":this.addForm.auditUserIds[i]
+                        })
+                    }
+                    targetData.projectApprovalAuditorList=userArray
+                }
+                if(this.addForm.category != null) {
+                    targetData.category=this.addForm.category
+                }
+                if(this.addForm.status != null) {
+                    targetData.status=this.addForm.status
+                }
+                //审核人
+                if (this.pointList) {
+                    targetData.projectApprovalCheckList=this.pointList
+                }
+                this.http.JSONPost("/project-approval/tempSave",targetData,
+                res => {
+                    this.addLoading = false;
+                    if (res.code == "ok") {
+                        this.$message({
+                            message: (this.addForm.id!=null?this.$t('xiu-gai'):this.$t('create'))+this.$t('other.successful'),
+                            type: "success"
+                        });
+                        this.addFormVisible = false;
+                        this.getList();
+                        if (this.user.company.packageEngineering == 1) {
+                            this.saveProjectProfessions(res.data);
+                        }
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.addLoading = false;
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                });
+            }
+        });
+    },
     // 获取分类条目
     getClfConfigList() {
         this.http.get('/project-category/list',
@@ -784,7 +896,7 @@ methods: {
                 bu: [],
                 manDay:0,
                 fromOutside: 0,
-                status:0,
+                status:-1,
             }
             this.projectBaseCostData = [];
             this.addFormUserNames = [];