guochao 6 лет назад
Родитель
Сommit
60fb80d3d8

+ 4 - 4
package-lock.json

@@ -550,7 +550,7 @@
     },
     "axios": {
       "version": "0.19.0",
-      "resolved": "https://registry.npm.taobao.org/axios/download/axios-0.19.0.tgz",
+      "resolved": "https://registry.npm.taobao.org/axios/download/axios-0.19.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faxios%2Fdownload%2Faxios-0.19.0.tgz",
       "integrity": "sha1-jgm/89kSLhM/e4EByPvdAO09Krg=",
       "requires": {
         "follow-redirects": "1.5.10",
@@ -559,7 +559,7 @@
       "dependencies": {
         "debug": {
           "version": "3.1.0",
-          "resolved": "http://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz",
+          "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-3.1.0.tgz",
           "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
           "requires": {
             "ms": "2.0.0"
@@ -567,7 +567,7 @@
         },
         "follow-redirects": {
           "version": "1.5.10",
-          "resolved": "http://registry.npm.taobao.org/follow-redirects/download/follow-redirects-1.5.10.tgz",
+          "resolved": "https://registry.npm.taobao.org/follow-redirects/download/follow-redirects-1.5.10.tgz",
           "integrity": "sha1-e3qfmuov3/NnhqlP9kPtB/T/Xio=",
           "requires": {
             "debug": "=3.1.0"
@@ -575,7 +575,7 @@
         },
         "is-buffer": {
           "version": "2.0.3",
-          "resolved": "http://registry.npm.taobao.org/is-buffer/download/is-buffer-2.0.3.tgz",
+          "resolved": "https://registry.npm.taobao.org/is-buffer/download/is-buffer-2.0.3.tgz",
           "integrity": "sha1-Ts8/z3ScvR5HJonhCaxmJhol5yU="
         }
       }

+ 1 - 1
src/components/Home.vue

@@ -7,7 +7,7 @@
           <router-link
             v-if="user != null && rolesPermissions != null &&( rolesPermissions.isAgency || rolesPermissions.isIndividualUser || rolesPermissions.isSystemAdministrator || rolesPermissions.isEnterpriseUser)"
             :to="{ name: 'ProjectCreate'}">
-            <div class="btn btn-medium btn-home-apply">申请项目</div>
+            <div class="btn btn-medium btn-home-apply">创建项目</div>
           </router-link>
         </el-carousel-item>
       </el-carousel>

+ 1 - 1
src/components/authen/EnterpriseAuthenticationCreate.vue

@@ -69,7 +69,7 @@ export default {
       authentication: {
         enterpriseName: '',
         enterpriseBossName: '',
-        bankAccount:'',
+        bankAccount: '',
         businessLicense: '',
         USCC: '',
         enterpriseAddress: ''

+ 1 - 1
src/components/authen/IndividualAuthentication.vue

@@ -142,7 +142,7 @@ export default {
       this.isModifyMode = true
     },
     //提交认证信息
-    updateAuthInfo() {
+    updateAuthInfo () {
       //this.isModifyMode = false
       this.showLoading()
       const newAuthentication = {

+ 25 - 10
src/components/cheat/ProjectAdd.vue

@@ -125,11 +125,8 @@
         <el-tab-pane label="批量创建项目">
           <el-form :model="project" :rules="rules" ref="project" label-width="12%" class="demo-report">
             <el-form-item prop="file" label="Excel模板文件">
-              <div>
-                <a :href="downloadFile"><i
-                  class="fa fa-file-text-o"></i>
-                  {{downloadFile}}</a>
-              </div>
+              <a :href="downloadFile"><el-link :underline="false" type="primary"><i
+                class="el-icon-document"></i>下载文档</el-link></a>
             </el-form-item>
             <el-form-item type="file" prop="file" label="Excel文件">
               <el-upload
@@ -234,7 +231,12 @@
 import Http from '@/js/http.js'
 import Apis from '@/js/api.js'
 import {notify} from '@/constants/index'
-import {getAllPlatformTypes, getAllServiceTypes, storageGet} from '@/js/index'
+import {
+  getAllPlatformTypes,
+  getAllServiceTypes,
+  getGreenChannelAddProjectExcelTemplateFile,
+  storageGet
+} from '@/js/index'
 
 export default {
   name: 'ProjectAdd',
@@ -242,13 +244,13 @@ export default {
     return {
       userId: 0,
       user: {},
-      loading:false,
+      loading: false,
       dialogVisible: false,
       isModifyMode: true,
       serviceType: [],
       platforms: [],
       isFormSubmit: true,
-      downloadFile: '123.xls',
+      downloadFile: '',
       project: {
         name: '',
         description: '',
@@ -438,6 +440,7 @@ export default {
       this.setServiceType()
       this.setPlatformType()
       this.setUserInfo()
+      this.setTemplateExcel()
     },
     //加载数据
     loadData: function () {
@@ -619,10 +622,22 @@ export default {
     setUserInfo () {
       this.user = storageGet('user')
     },
-    showLoading(){
+    setTemplateExcel () {
+      this.showLoading()
+      getGreenChannelAddProjectExcelTemplateFile(this.setTemplateExcelSuccess, this.setTemplateExcelFail)
+    },
+    setTemplateExcelSuccess (res) {
+      this.hideLoading()
+      this.downloadFile = res.fileUrl
+    },
+    setTemplateExcelFail (error) {
+      this.hideLoading()
+      notify('error', '加载模板文件失败:' + error.data)
+    },
+    showLoading () {
       this.loading = true
     },
-    hideLoading(){
+    hideLoading () {
       this.loading = false
     }
   },

+ 2 - 2
src/components/commons/ProjectItem.vue

@@ -1,9 +1,9 @@
 <template>
   <div class="project-item-container">
-    <span class="col-xl-2 col-lg-3 col-md-4 col-sm-1" style="width: 15%">
+    <span class="col-xl-2 col-lg-3 col-md-4 col-sm-1" style="width: 150px">
       <img class="project-cover" src="@/assets/img/home_ban1.jpg">
     </span>
-    <span class="project-title col-md-2 col-sm-10" style="width: 15%;font-size: 12px">{{project.name}}</span>
+    <span class="project-title col-md-2 col-sm-10" style="width: 150px;font-size: 12px">{{project.name}}</span>
     <span class="project-title col-md-2 col-sm-10" style="width: 10%;font-size: 12px">{{project.id}}</span>
     <span class="col-md-2 col-sm-10" style="width: 10%">
       <span

+ 105 - 35
src/components/project/Project.vue

@@ -11,15 +11,15 @@
       </div>
       <el-form :model="project" :rules="rules" ref="project" label-width="12%" class="demo-project">
         <el-form-item label="项目名称" prop="name">
-          <el-input v-if="isModifyMode" v-model="project.name"></el-input>
+          <el-input size="small" v-if="isModifyMode" v-model="project.name"></el-input>
           <span v-if="!isModifyMode">{{project.name}}</span>
         </el-form-item>
 
-        <el-form-item label="联系人" prop="name">
+        <el-form-item size="small" label="联系人" prop="name">
           <el-input v-if="isModifyMode" v-model="project.contactName" placeholder="请输入联系人姓名"></el-input>
           <span v-if="!isModifyMode">{{project.contactName}}</span>
         </el-form-item>
-        <el-form-item label="联系人电话" prop="name">
+        <el-form-item size="small" label="联系人电话" prop="name">
           <el-input v-if="isModifyMode" v-model="project.contactPhone" placeholder="请输入联系人电话"></el-input>
           <span v-if="!isModifyMode">{{project.contactPhone}}</span>
         </el-form-item>
@@ -50,7 +50,7 @@
         <!--</div>-->
         <!--</el-form-item>-->
 
-        <el-form-item label="预算" prop="budget">
+        <el-form-item size="small" label="预算" prop="budget">
           <el-input v-if="isModifyMode" type="number" v-model="project.budget">
             ¥
             <template slot="append"></template>
@@ -58,7 +58,7 @@
           <span v-if="!isModifyMode">{{project.budget}}¥</span>
         </el-form-item>
         <el-form-item label="需求描述">
-          <el-input v-if="isModifyMode" type="textarea" v-model="project.desc"></el-input>
+          <el-input style="width: 400px" autosize v-if="isModifyMode" type="textarea" v-model="project.desc"></el-input>
           <span v-if="!isModifyMode">{{project.desc}}</span>
         </el-form-item>
         <!--<el-form-item label="价格" prop="price">-->
@@ -140,7 +140,8 @@
               <em>点击上传</em>
             </div>
           </el-upload>
-          <span v-if="!isModifyMode"><a :href="project.requireDocUrl"><el-link :underline="false" type="primary"><i class="el-icon-document"></i>下载文档</el-link></a></span>
+          <span v-if="!isModifyMode"><a :href="project.requireDocUrl"><el-link :underline="false" type="primary"><i
+            class="el-icon-document"></i>下载文档</el-link></a></span>
         </el-form-item>
         <el-form-item label="安装包" prop="file">
           <el-upload
@@ -162,11 +163,13 @@
               <em>点击上传</em>
             </div>
           </el-upload>
-          <span v-if="!isModifyMode"><a :href="project.fileUrl"><el-link :underline="false" type="primary"><i class="el-icon-document"></i>下载文件</el-link></a></span>
+          <span v-if="!isModifyMode"><a :href="project.fileUrl"><el-link :underline="false" type="primary"><i
+            class="el-icon-document"></i>下载文件</el-link></a></span>
         </el-form-item>
         <el-form-item label="项目截止时间" prop="datetime">
           <div class="block" v-if="isModifyMode">
             <el-date-picker
+              size="small"
               v-model="project.datetime"
               type="datetime"
               placeholder="选择截止时间"
@@ -182,15 +185,23 @@
           <div class="btn btn-small" @click="cancelMode('project')">取消</div>
         </el-form-item>
         <el-form-item v-if="!isModifyMode">
-          <div class="btn btn-small btn-warning-soft" @click="submitProjectRequest()">结束项目</div>
+          <div v-if="projectOperationControl.confirmFinish" class="btn btn-small btn-warning-soft"
+               @click="endProject()">结束项目
+          </div>
           <!--<div class="btn btn-small btn-info" @click="submitProjectRequest()">发布项目</div>-->
-          <div class="btn btn-small btn-info" @click="submitProjectRequest()">提交项目</div>
-          <div class="btn btn-small btn-info" @click="applyProject()">接受项目</div>
-          <div class="btn btn-small btn-danger" @click="submitProjectRequest()">拒绝项目</div>
-          <div class="btn btn-small btn-info" @click="modifyForm()">修改项目</div>
+          <div v-if="projectOperationControl.finish" class="btn btn-small btn-info" @click="submitProjectRequest()">
+            提交项目
+          </div>
+          <div v-if="projectOperationControl.receive" class="btn btn-small btn-info" @click="receiveProject()">接受项目
+          </div>
+          <div v-if="projectOperationControl.reject" class="btn btn-small btn-danger" @click="rejectProject()">拒绝项目
+          </div>
+          <div v-if="projectOperationControl.update" class="btn btn-small btn-info" @click="modifyForm()">修改项目</div>
           <!--<div class="btn btn-medium btn-info" @click="analyseDemand()">分析需求</div>-->
-          <div class="btn btn-small btn-info" @click="createTask()">新建任务</div>
-          <div class="btn btn-small btn-info" @click="createReport()">上传报告</div>
+          <div v-if="projectOperationControl.createTask" class="btn btn-small btn-info" @click="createNewTask()">新建任务
+          </div>
+          <div v-if="projectOperationControl.uploadReport" class="btn btn-small btn-info" @click="createReport()">上传报告
+          </div>
         </el-form-item>
       </el-form>
     </div>
@@ -247,12 +258,16 @@ import ResourceType from '@/constants/enum/resource-type'
 import provincecity from '@/components/commons/ProvinceCity'
 import {notify} from '@/constants/index'
 import {
+  ensureEndProject,
   getAllInstitutions,
   getAllPlatformTypes,
   getAllServiceTypes,
   getProvinceCodeByProvinceName,
   getProvinceNameByProvinceCode,
+  receiveProjectRequest,
+  rejectProject,
   storageGet,
+  submitProjectRequest
 } from '@/js/index'
 
 export default {
@@ -282,6 +297,15 @@ export default {
       platforms: [],
       resourceType: ResourceType,
       serviceType: [],
+      projectOperationControl: {
+        confirmFinish: false,
+        createTask: false,
+        finish: false,
+        receive: false,
+        reject: false,
+        update: false,
+        uploadReport: false,
+      },
       project: {
         userId: 0,
         name: '',
@@ -516,24 +540,66 @@ export default {
       //this.loadData()
     },
     //接收项目
+    receiveProject () {
+      this.showLoading()
+      console.log('接收项目')
+      receiveProjectRequest(this.projectId, this.user.userVO.id, this.receiveProjectSuccess, this.receiveProjectFail)
+    },
+    receiveProjectSuccess (res) {
+      this.hideLoading()
+      notify('success', '项目接收成功!')
+      this.projectOperationControl = res.projectOperationControl
+      this.project.status = res.projectDetails.status
+      this.project.institution = res.projectDetails.institution
+    },
+    receiveProjectFail (error) {
+      this.hideLoading()
+      notify('error', '接收项目失败:' + error.data)
+    },
+    //拒绝项目
+    rejectProject () {
+      this.showLoading()
+      rejectProject(this.projectId, this.rejectProjectSuccess, this.rejectProjectFail)
+    },
+    rejectProjectSuccess (res) {
+      this.hideLoading()
+      notify('success', '拒绝项目成功')
+    },
+    rejectProjectFail (error) {
+      this.hideLoading()
+      notify('error', '拒绝项目失败:' + error.data)
+    },
+    //提交项目
     submitProjectRequest () {
-      const data = {
-        userId: this.user.userVO.id,
-        projectId: this.projectId
-      }
-      Http.post(Apis.USER.SUBMIT_PROJECT_REQUEST, data).then((res) => {
-        console.log(res)
-      })
+      this.showLoading()
+      submitProjectRequest(this.projectId, this.submitProjectRequestSuccess, this.submitProjectRequestFail)
     },
-    //申请项目
-    applyProject () {
-      const data = {
-        userId: this.user.userVO.id,
-        projectId: this.projectId
-      }
-      Http.post(Apis.USER.ACCEPT_PROJECT, data).then((res) => {
-        console.log(res)
-      })
+    submitProjectRequestSuccess (res) {
+      this.hideLoading()
+      notify('success', '项目提交成功!')
+      this.projectOperationControl = res.projectOperationControl
+      this.project.status = res.projectDetails.status
+      this.project.institution = res.projectDetails.institution
+    },
+    submitProjectRequestFail (error) {
+      this.hideLoading()
+      notify('error', '提交项目失败:' + error.data)
+    },
+    //结束项目
+    endProject () {
+      this.showLoading()
+      ensureEndProject(this.projectId, this.endProjectSuccess, this.endProjectFail)
+    },
+    endProjectSuccess (res) {
+      this.hideLoading()
+      notify('success', '项目提交成功!')
+      this.projectOperationControl = res.projectOperationControl
+      this.project.status = res.projectDetails.status
+      this.project.institution = res.projectDetails.institution
+    },
+    endProjectFail (error) {
+      this.hideLoading()
+      notify('error', '结束项目失败:' + error.data)
     },
     cancelMode (formName) {
       this.isModifyMode = false
@@ -546,17 +612,20 @@ export default {
         params: {projectId: projectId, taskId: taskId}
       })
     },
-    createTask () {
-      this.$router.push({name: 'TaskCreate'})
+    createNewTask () {
+      const that = this
+      this.$router.push({
+        name: 'TaskCreate',
+        params: {projectId: that.projectId}
+      })
     },
     createReport () {
       this.$router.push({
-        name: 'ReportCreate',
+        name: 'ProjectReportCreate',
         params: {
           scope: 0,
           dependencyCode: this.projectId,
           projectId: this.projectId,
-          taskId: null,
         }
       })
     },
@@ -621,6 +690,7 @@ export default {
         this.project.status = res.projectDetails.status
         this.task = res.taskList
         this.reportList = res.reportList
+        this.projectOperationControl = res.projectOperationControl
         this.hideLoading()
       }).catch((error) => {
         this.hideLoading()
@@ -704,7 +774,7 @@ export default {
     },
     hideLoading () {
       this.loading = false
-    }
+    },
   }
 }
 </script>

+ 7 - 6
src/components/project/ProjectCreate.vue

@@ -1,24 +1,24 @@
 <template>
   <div class="create-container" v-loading="loading">
-    <div class="title h1">申请项目</div>
+    <div class="title h1">创建项目</div>
     <div class="create-body">
       <el-form :model="project" :rules="rules" ref="project" label-width="12%" class="demo-project">
         <el-form-item label="项目名称" prop="name">
-          <el-input v-model="project.name"></el-input>
+          <el-input size="small" v-model="project.name" placeholder="请输入项目名称"></el-input>
         </el-form-item>
         <el-form-item label="联系人" prop="contactName">
-          <el-input v-model="project.contactName" placeholder="请输入联系人姓名"></el-input>
+          <el-input size="small" v-model="project.contactName" placeholder="请输入联系人姓名"></el-input>
         </el-form-item>
         <el-form-item label="手机号" prop="contactPhone">
-          <el-input v-model="project.contactPhone" placeholder="请输入联系人电话"></el-input>
+          <el-input size="small" v-model="project.contactPhone" placeholder="请输入联系人电话"></el-input>
         </el-form-item>
         <el-form-item label="预算" prop="budget">
-          <el-input type="number" v-model="project.budget">
+          <el-input size="small" type="number" v-model="project.budget" placeholder="请输入项目预算">
             <template slot="append">¥</template>
           </el-input>
         </el-form-item>
         <el-form-item label="需求描述" prop="desc">
-          <el-input type="textarea" style="width: 400px" v-model="project.desc"></el-input>
+          <el-input autosize type="textarea" style="width: 400px" v-model="project.desc" placeholder="请输入对项目的描述"></el-input>
         </el-form-item>
 
         <!--<el-form-item label="价格" prop="price">-->
@@ -106,6 +106,7 @@
         <el-form-item label="项目截止时间" prop="datetime">
           <div class="block">
             <el-date-picker
+              size="small"
               v-model="project.datetime"
               type="datetime"
               placeholder="选择截止时间"

+ 7 - 7
src/components/report/ProjectReport.vue

@@ -3,7 +3,7 @@
     <div class="create-body" v-loading="loading">
       <el-form :model="report" :rules="rules" ref="report" label-width="12%" class="demo-report">
         <el-form-item label="报告名称" prop="name">
-          <el-input v-if="isModifyMode" v-model="report.name"></el-input>
+          <el-input size="small" v-if="isModifyMode" v-model="report.name"></el-input>
           <span v-if="!isModifyMode">{{report.name}}</span>
         </el-form-item>
         <el-form-item label="报告类型" prop="type">
@@ -21,7 +21,7 @@
                 <span>测试对象</span>
               </el-col>
               <el-col :span="10">
-                <el-input v-if="isModifyMode" type="textarea" v-model="report.target"></el-input>
+                <el-input autosize v-if="isModifyMode" type="textarea" v-model="report.target"></el-input>
                 <span v-if="!isModifyMode">{{report.target}}</span>
               </el-col>
             </el-row>
@@ -30,7 +30,7 @@
                 <span>测试内容</span>
               </el-col>
               <el-col :span="10">
-                <el-input v-if="isModifyMode" type="textarea" v-model="report.content"></el-input>
+                <el-input autosize v-if="isModifyMode" type="textarea" v-model="report.content"></el-input>
                 <span v-if="!isModifyMode">{{report.content}}</span>
               </el-col>
             </el-row>
@@ -67,7 +67,7 @@
         </el-form-item>
 
         <el-form-item label="结论" prop="conclusion">
-          <el-input v-if="isModifyMode" type="textarea" v-model="report.conclusion"></el-input>
+          <el-input autosize v-if="isModifyMode" type="textarea" v-model="report.conclusion"></el-input>
           <span v-if="!isModifyMode">{{report.conclusion}}</span>
         </el-form-item>
         <el-form-item v-if="!isModifyMode">
@@ -75,9 +75,9 @@
           <div class="btn btn-medium" @click="back()">返回</div>
         </el-form-item>
         <el-form-item v-if="isModifyMode">
-          <div class="btn btn-primary btn-info" @click="submitForm('report')">确认修改</div>
-          <div class="btn btn-primary" @click="resetForm('report')">重置</div>
-          <div class="btn btn-primary" @click="cancelCreate('report')">取消</div>
+          <div class="btn btn-medium btn-info" @click="submitForm('report')">确认修改</div>
+          <div class="btn btn-medium" @click="resetForm('report')">重置</div>
+          <div class="btn btn-medium" @click="cancelCreate('report')">取消</div>
         </el-form-item>
       </el-form>
     </div>

+ 7 - 8
src/components/report/ProjectReportCreate.vue

@@ -4,7 +4,7 @@
     <div class="create-body">
       <el-form :model="report" :rules="rules" ref="report" label-width="12%" class="demo-report">
         <el-form-item label="报告名称" prop="name">
-          <el-input v-model="report.name"></el-input>
+          <el-input size="small" v-model="report.name"></el-input>
         </el-form-item>
         <el-form-item label="报告类型" prop="type">
           <el-radio-group v-model="report.type">
@@ -14,10 +14,10 @@
           </el-radio-group>
         </el-form-item>
         <el-form-item label="测试对象" prop="name">
-          <el-input style="width: 400px" type="textarea" v-model="report.target"></el-input>
+          <el-input autosize style="width: 400px" type="textarea" v-model="report.target"></el-input>
         </el-form-item>
         <el-form-item label="测试内容" prop="name">
-          <el-input style="width: 400px" type="textarea" v-model="report.content"></el-input>
+          <el-input autosize style="width: 400px" type="textarea" v-model="report.content"></el-input>
         </el-form-item>
         <!--<el-form-item label="摘要" prop="abstract">-->
         <!--<div>-->
@@ -58,17 +58,16 @@
               将文件拖到此处,或
               <em>点击上传</em>
             </div>
-            <div class="el-upload__tip" slot="tip">请上传报告文件</div>
           </el-upload>
         </el-form-item>
 
         <el-form-item label="结论" prop="conclusion">
-          <el-input style="width: 400px" type="textarea" v-model="report.conclusion"></el-input>
+          <el-input autosize style="width: 400px" type="textarea" v-model="report.conclusion"></el-input>
         </el-form-item>
         <el-form-item>
-          <div class="btn btn-primary btn-info" @click="submitForm('report')">提交</div>
-          <div class="btn btn-primary" @click="resetForm('report')">重置</div>
-          <div class="btn btn-primary" @click="cancelCreate('report')">取消</div>
+          <div class="btn btn-medium btn-info" @click="submitForm('report')">提交</div>
+          <div class="btn btn-medium" @click="resetForm('report')">重置</div>
+          <div class="btn btn-medium" @click="cancelCreate('report')">取消</div>
         </el-form-item>
       </el-form>
     </div>

+ 1 - 1
src/components/report/ReportList.vue

@@ -60,7 +60,7 @@ export default {
         })
       } else {
         this.$router.push({
-          name: 'Report',
+          name: 'TaskReport',
           params: {
             reportId: row.code,
             projectId: this.pid,

+ 14 - 13
src/components/report/TaskReport.vue

@@ -3,7 +3,7 @@
     <div class="create-body" v-loading="loading">
       <el-form :model="report" :rules="rules" ref="report" label-width="12%" class="demo-report">
         <el-form-item label="报告名称" prop="name">
-          <el-input v-if="isModifyMode" v-model="report.name"></el-input>
+          <el-input size="small" v-if="isModifyMode" v-model="report.name"></el-input>
           <span v-if="!isModifyMode">{{report.name}}</span>
         </el-form-item>
         <el-form-item label="报告类型" prop="type">
@@ -21,7 +21,7 @@
                 <span>测试对象</span>
               </el-col>
               <el-col :span="10">
-                <el-input v-if="isModifyMode" type="textarea" v-model="report.target"></el-input>
+                <el-input autosize v-if="isModifyMode" type="textarea" v-model="report.target"></el-input>
                 <span v-if="!isModifyMode">{{report.target}}</span>
               </el-col>
             </el-row>
@@ -30,7 +30,7 @@
                 <span>测试内容</span>
               </el-col>
               <el-col :span="10">
-                <el-input v-if="isModifyMode" type="textarea" v-model="report.content"></el-input>
+                <el-input autosize v-if="isModifyMode" type="textarea" v-model="report.content"></el-input>
                 <span v-if="!isModifyMode">{{report.content}}</span>
               </el-col>
             </el-row>
@@ -67,7 +67,7 @@
         </el-form-item>
 
         <el-form-item label="结论" prop="conclusion">
-          <el-input v-if="isModifyMode" type="textarea" v-model="report.conclusion"></el-input>
+          <el-input autosize v-if="isModifyMode" type="textarea" v-model="report.conclusion"></el-input>
           <span v-if="!isModifyMode">{{report.conclusion}}</span>
         </el-form-item>
         <el-form-item v-if="!isModifyMode">
@@ -75,9 +75,9 @@
           <div class="btn btn-medium" @click="back()">返回</div>
         </el-form-item>
         <el-form-item v-if="isModifyMode">
-          <div class="btn btn-primary btn-info" @click="submitForm('report')">确认修改</div>
-          <div class="btn btn-primary" @click="resetForm('report')">重置</div>
-          <div class="btn btn-primary" @click="cancelCreate('report')">取消</div>
+          <div class="btn btn-medium btn-info" @click="submitForm('report')">确认修改</div>
+          <div class="btn btn-medium" @click="resetForm('report')">重置</div>
+          <div class="btn btn-medium" @click="cancelCreate('report')">取消</div>
         </el-form-item>
       </el-form>
     </div>
@@ -223,12 +223,13 @@ export default {
       return isDOC || isEXCEL || isPDF || isTXT || isXLS || isXLSX
     },
     back () {
-      if (window.history.length <= 1) {
-        this.$router.push({path: '/'})
-        return false
-      } else {
-        this.$router.go(-1)
-      }
+      this.$router.push({
+        name: 'Task',
+        params: {
+          projectId: this.projectId,
+          taskId: this.taskId
+        }
+      })
     },
     loadData () {
       //pro1564487183259

+ 7 - 7
src/components/report/TaskReportCreate.vue

@@ -4,7 +4,7 @@
     <div class="create-body">
       <el-form :model="report" :rules="rules" ref="report" label-width="12%" class="demo-report">
         <el-form-item label="报告名称" prop="name">
-          <el-input v-model="report.name"></el-input>
+          <el-input size="small" v-model="report.name"></el-input>
         </el-form-item>
         <el-form-item label="报告类型" prop="type">
           <el-radio-group v-model="report.type">
@@ -14,10 +14,10 @@
           </el-radio-group>
         </el-form-item>
         <el-form-item label="测试对象" prop="name">
-          <el-input style="width: 400px" type="textarea" v-model="report.target"></el-input>
+          <el-input autosize style="width: 400px" type="textarea" v-model="report.target"></el-input>
         </el-form-item>
         <el-form-item label="测试内容" prop="name">
-          <el-input style="width: 400px" type="textarea" v-model="report.content"></el-input>
+          <el-input autosize style="width: 400px" type="textarea" v-model="report.content"></el-input>
         </el-form-item>
         <!--<el-form-item label="摘要" prop="abstract">-->
         <!--<div>-->
@@ -63,12 +63,12 @@
         </el-form-item>
 
         <el-form-item label="结论" prop="conclusion">
-          <el-input style="width: 400px" type="textarea" v-model="report.conclusion"></el-input>
+          <el-input autosize style="width: 400px" type="textarea" v-model="report.conclusion"></el-input>
         </el-form-item>
         <el-form-item>
-          <div class="btn btn-primary btn-info" @click="submitForm('report')">提交</div>
-          <div class="btn btn-primary" @click="resetForm('report')">重置</div>
-          <div class="btn btn-primary" @click="cancelCreate('report')">取消</div>
+          <div class="btn btn-medium btn-info" @click="submitForm('report')">提交</div>
+          <div class="btn btn-medium" @click="resetForm('report')">重置</div>
+          <div class="btn btn-medium" @click="cancelCreate('report')">取消</div>
         </el-form-item>
       </el-form>
     </div>

+ 282 - 209
src/components/task/Task.vue

@@ -5,15 +5,15 @@
       <div class="title h2" v-if="!isModifyMode">基本信息</div>
       <el-form :model="task" :rules="rules" ref="task" label-width="12%" class="demo-task">
         <el-form-item label="任务名称" prop="name">
-          <el-input v-if="isModifyMode" v-model="task.title"></el-input>
+          <el-input size="small" v-if="isModifyMode" v-model="task.title"></el-input>
           <span v-if="!isModifyMode">{{task.title}}</span>
         </el-form-item>
         <el-form-item label="任务描述" prop="desc">
-          <el-input v-if="isModifyMode" type="textarea" v-model="task.description"></el-input>
+          <el-input autosize v-if="isModifyMode" type="textarea" v-model="task.description"></el-input>
           <span v-if="!isModifyMode">{{task.description}}</span>
         </el-form-item>
         <el-form-item label="任务报价" prop="quotePrice">
-          <el-input type="number" v-if="isModifyMode" v-model="task.quotePrice">
+          <el-input size="small" type="number" v-if="isModifyMode" v-model="task.quotePrice">
             <template slot="append">¥</template>
           </el-input>
           <span v-if="!isModifyMode">{{task.quotePrice}}¥</span>
@@ -91,13 +91,15 @@
                 暂无文件
               </span>
               <span v-if="task.requireDocUrl != null">
-                <a :href="task.requireDocUrl"><el-link :underline="false" type="primary"><i class="el-icon-document"></i>下载文档</el-link></a>
+                <a :href="task.requireDocUrl"><el-link :underline="false" type="primary"><i
+                  class="el-icon-document"></i>下载文档</el-link></a>
               </span>
             </span>
         </el-form-item>
         <el-form-item label="任务截止时间" prop="datetime">
           <div class="block" v-if="isModifyMode">
             <el-date-picker
+              size="small"
               v-model="task.datetime"
               type="datetime"
               placeholder="选择截止时间"
@@ -108,21 +110,22 @@
           <span v-if="!isModifyMode">{{task.datetime}}</span>
         </el-form-item>
         <el-form-item v-if="isModifyMode">
-          <div class="btn btn-small btn-info" @click="submitForm('task')">确认修改</div>
-          <div class="btn btn-small" @click="resetForm('task')">重置</div>
-          <div class="btn btn-small" @click="cancelMode('task')">取消</div>
+          <div class="btn btn-small btn-info" @click="updateTask()">确认修改</div>
+          <div class="btn btn-small" @click="resetForm()">重置</div>
+          <div class="btn btn-small" @click="cancelMode()">取消</div>
         </el-form-item>
         <el-form-item v-if="!isModifyMode">
           <div class="btn btn-small btn-info"
                v-if="taskOperationControl.confirmFinish"
-               @click="submitTaskRequest()">确认结束
+               @click="endTask()">确认结束
           </div>
           <div class="btn btn-small btn-info" v-if="taskOperationControl.finish" @click="submitTaskRequest()">结束任务
           </div>
-          <div class="btn btn-small btn-info" v-if="taskOperationControl.receive" @click="applyTask()">接收任务</div>
-          <div class="btn btn-small btn-danger" v-if="taskOperationControl.receive" @click="applyTask()">拒绝任务</div>
+          <div class="btn btn-small btn-info" v-if="taskOperationControl.receive" @click="receiveTask()">接收任务</div>
+          <div class="btn btn-small btn-danger" v-if="taskOperationControl.receive" @click="rejectTask()">拒绝任务</div>
           <div class="btn btn-small btn-info" v-if="taskOperationControl.update" @click="modifyForm()">修改任务</div>
-          <div class="btn btn-small btn-info" v-if="taskOperationControl.uploadReport" @click="createReport()">上传报告</div>
+          <div class="btn btn-small btn-info" v-if="taskOperationControl.uploadReport" @click="toCreateReport()">上传报告
+          </div>
           <div class="btn btn-small" @click="toProject()">前往项目</div>
         </el-form-item>
       </el-form>
@@ -142,11 +145,17 @@ import Http from '@/js/http.js'
 import Apis from '@/js/api.js'
 import {notify} from '@/constants/index'
 import {
+  ensureEndTask,
   getAllAgencies,
   getAllServiceTypes,
   getProvinceCodeByProvinceName,
   getProvinceNameByProvinceCode,
-  storageGet
+  getTask,
+  receiveTaskRequest,
+  rejectTask,
+  storageGet,
+  submitTaskRequest,
+  updateTask
 } from '@/js/index'
 
 export default {
@@ -276,171 +285,182 @@ export default {
       this.projectId = this.$route.params.projectId
       this.setUserInfo()
       this.setServiceType()
-      console.log(this.serviceType)
-      this.loadData(this.projectId, this.taskId)
+      //this.loadData(this.projectId, this.taskId)
+      this.getTaskDetail()
       this.setInstitutions()
     },
-    updateLocation (location) {
-      console.log(location)
-      const loactionName = getProvinceNameByProvinceCode(location.provinceCode, location.cityCode)
-      // var provinceName = ''
-      // var cityName = ''
-      // for (var item of provinceCityJSON.provinces) {
-      //   if (item.code === location.provinceCode) {
-      //     provinceName = item.name
-      //     for (var city of item.cities) {
-      //       if (city.code === location.cityCode) {
-      //         cityName = city.name
-      //         break
-      //       }
-      //     }
-      //   }
-      // }
-      return loactionName.provinceCode + ' / ' + loactionName.cityCode
-    },
-    submitForm (formName) {
-      this.showLoading()
-      const newTask = {
-        name: this.task.title,
-        desc: this.task.description,
-        type: this.task.serviceType,
-        resource: this.task.resource,
-        location: this.task.location == null ? {} : getProvinceNameByProvinceCode(this.task.location.provinceCode, this.task.location.cityCode),
-        institution: this.task.institution.id,
-        datetime: this.task.datetime,
-        quotePrice: this.task.quotePrice,
-        fixedPrice: this.task.fixedPrice,
-        requirementFile: this.task.requireDocUrl
-      }
-      //修改TASK
-      console.log(newTask)
-      Http.put(Apis.TASK.UPDATE_TASK.replace('{projectId}', this.projectId).replace('{taskId}', this.taskId), newTask).then((res) => {
-        this.isModifyMode = false
-        console.log(res)
-        this.taskId = res.crowdTaskVO.id
-        this.projectId = res.crowdTaskVO.projectId
-        this.task.title = res.crowdTaskVO.title
-        this.task.description = res.crowdTaskVO.description
-        this.task.serviceType = res.crowdTaskVO.serviceType
-        this.task.resource = res.crowdTaskVO.resource
-        this.task.location = res.crowdTaskVO.location == null ? {
-          provinceCode: 3200,
-          cityCode: 3201
-        } : getProvinceCodeByProvinceName(res.crowdTaskVO.location.provinceCode, res.crowdTaskVO.location.cityCode)
-        this.task.institution = res.crowdTaskVO.institution
-        this.task.datetime = new Date(res.crowdTaskVO.datetime)
-        this.task.quotePrice = res.crowdTaskVO.quotePrice
-        this.task.fixedPrice = res.crowdTaskVO.fixedPrice
-        this.task.doc = []
-        this.task.requireDocUrl = res.crowdTaskVO.requirementFile
 
-        this.reportList = res.crowdReportVOList
-        this.hideLoading()
-        notify('success', '修改成功')
-      }).catch((error) => {
-        notify('error', '修改失败:' + error.data)
-        this.hideLoading()
+    //跳转至项目详情页面
+    toProject () {
+      this.$router.push({
+        name: 'Project',
+        params: {projectId: this.projectId}
       })
-      // this.$refs[formName].validate(valid => {
-      //   if (valid) {
-      //     this.isModifyMode = false
-      //
-      //   } else {
-      //     console.log('error submit!!')
-      //     return false
-      //   }
-      // })
-    },
-    cancelMode (formName) {
-      this.isModifyMode = false
     },
+    //切换至可编辑页面
     modifyForm () {
       this.isModifyMode = true
     },
-    resetForm (formName) {
-      this.$refs.addFormProvince.resetProviceCity()
-      this.$refs[formName].resetFields()
+    //切换至不可编辑页面
+    cancelMode () {
+      this.isModifyMode = false
+    },
+    //重置表单
+    resetForm () {
       this.task.name = ''
       this.task.desc = ''
       this.task.quotePrice = ''
       this.task.fixedPrice = ''
       this.task.type = ''
-      this.task.resource = '2'; //如果是广场不用管Location和institution ,定向看institution,区域看location
-      (this.task.location = {provinceCode: '', cityCode: ''}),
-        (this.task.institution = '')
+      this.task.resource = '2' //如果是广场不用管Location和institution ,定向看institution,区域看location
+      this.task.location = {provinceCode: '', cityCode: ''}
+      this.task.institution = ''
       this.task.datetime = ''
     },
-    locationChange (provinceId, cityId) {
-      if (provinceId || cityId) {
-        this.task.location = {provinceCode: provinceId, cityCode: cityId}
-      }
+    //显示页面加载画面
+    showLoading () {
+      this.loading = true
     },
-    toProject () {
-      this.$router.push({
-        name: 'Project',
-        params: {projectId: this.projectId}
+    //隐藏页面加载画面
+    hideLoading () {
+      this.loading = false
+    },
+    //加载用户信息
+    setUserInfo () {
+      this.user = storageGet('user')
+      this.rolesPermissions = storageGet('rolesPermissions')
+    },
+    //加载任务的服务类型
+    setServiceType () {
+      getAllServiceTypes().then((res) => {
+        this.serviceType = res
+      }).catch((error) => {
+        notify('error', '加载任务类型失败')
       })
     },
-    applyTask () {
-      const data = {
-        userId: this.user.userVO.id,
-        projectId: this.projectId,
-        taskId: this.taskId
-      }
-      Http.post(Apis.USER.ACCEPT_TASK, data).then((res) => {
-        console.log(res)
+    //加载所有的测评机构
+    setInstitutions () {
+      getAllAgencies().then((res) => {
+        this.institutionArray = res
+      }).catch((error) => {
+        notify('error', '获取机构列表失败')
       })
     },
-    submitTaskRequest () {
-      const data = {
-        userId: this.user.userVO.id,
-        projectId: this.projectId,
-        taskId: this.taskId
+    //获取任务详情
+    getTaskDetail () {
+      this.showLoading()
+      getTask(this.projectId, this.taskId, this.getTaskDetailSuccess, this.getTaskDetailFail)
+    },
+    //获取任务详情成功时回调函数
+    getTaskDetailSuccess (res) {
+      this.hideLoading()
+      //console.log(res.crowdTaskVO)
+      this.taskId = res.crowdTaskVO.id
+      this.projectId = res.crowdTaskVO.projectId
+      this.task.title = res.crowdTaskVO.title
+      this.task.description = res.crowdTaskVO.description
+      this.task.serviceType = res.crowdTaskVO.serviceType
+      this.task.resource = res.crowdTaskVO.resource
+      this.task.location = getProvinceCodeByProvinceName(res.crowdTaskVO.location.provinceCode, res.crowdTaskVO.location.cityCode)
+      this.task.institution = res.crowdTaskVO.institution
+      this.task.datetime = new Date(res.crowdTaskVO.datetime)
+      this.task.quotePrice = res.crowdTaskVO.quotePrice
+      this.task.fixedPrice = res.crowdTaskVO.fixedPrice
+      this.task.doc = []
+      this.task.requireDocUrl = res.crowdTaskVO.requirementFile
+      this.task.agencyId = res.crowdTaskVO.agencyId
+      this.task.status = res.crowdTaskVO.status
+      this.taskOperationControl = res.taskOperationControl
+      this.reportList = res.crowdReportVOList
+    },
+    //获取任务详情失败时回调函数
+    getTaskDetailFail (error) {
+      this.hideLoading()
+      notify('error', '获取任务详情失败:' + error.data)
+    },
+    //更新任务信息
+    updateTask () {
+      this.showLoading()
+      const newTask = {
+        name: this.task.title,
+        desc: this.task.description,
+        type: this.task.serviceType,
+        resource: this.task.resource,
+        location: this.task.location == null ? {} : getProvinceNameByProvinceCode(this.task.location.provinceCode, this.task.location.cityCode),
+        institution: this.task.institution.id,
+        datetime: this.task.datetime,
+        quotePrice: this.task.quotePrice,
+        fixedPrice: this.task.fixedPrice,
+        requirementFile: this.task.requireDocUrl
       }
-      Http.post(Apis.USER.SUBMIT_TASK_REQUEST, data).then((res) => {
-        console.log(res)
-      })
+      //console.log(newTask)
+      updateTask(this.projectId, this.taskId, newTask, this.updateTaskSuccess, this.updateTaskFail)
     },
-    createReport () {
-      this.$router.push({
-        name: 'ReportCreate',
-        params: {
-          scope: 1,
-          dependencyCode: this.taskId,
-          projectId: this.projectId,
-          taskId: this.taskId,
-        }
+    //更新任务信息成功时回调函数
+    updateTaskSuccess (res) {
+      this.cancelMode()
+      this.taskId = res.crowdTaskVO.id
+      this.projectId = res.crowdTaskVO.projectId
+      this.task.title = res.crowdTaskVO.title
+      this.task.description = res.crowdTaskVO.description
+      this.task.serviceType = res.crowdTaskVO.serviceType
+      this.task.resource = res.crowdTaskVO.resource
+      this.task.location = res.crowdTaskVO.location == null ? {
+        provinceCode: 3200,
+        cityCode: 3201
+      } : getProvinceCodeByProvinceName(res.crowdTaskVO.location.provinceCode, res.crowdTaskVO.location.cityCode)
+      this.task.institution = res.crowdTaskVO.institution
+      this.task.datetime = new Date(res.crowdTaskVO.datetime)
+      this.task.quotePrice = res.crowdTaskVO.quotePrice
+      this.task.fixedPrice = res.crowdTaskVO.fixedPrice
+      this.task.doc = []
+      this.task.requireDocUrl = res.crowdTaskVO.requirementFile
+      this.reportList = res.crowdReportVOList
+      this.hideLoading()
+      notify('success', '修改成功')
+    },
+    //更新任务信息失败时回调函数
+    updateTaskFail (error) {
+      notify('error', '修改失败:' + error.data)
+      this.hideLoading()
+    },
+    //上传任务需求文档
+    uploadRequireDoc (param) {
+      const formData = new FormData()
+      let config = {
+        //添加请求头
+        headers: {'Content-Type': 'multipart/form-data'},
+      }
+      formData.append('file', param.file)
+      Http.upload(Apis.FILE.REQUIREMENT_FILE.replace('{userId}', this.user.userVO.id), formData, config).then((res) => {
+        this.uploadRequireDocSuccess(res)
+      }).catch((error) => {
+        this.uploadRequireDocFail(error)
       })
     },
-    loadData (projectId, taskId) {
-      this.showLoading()
-      //replace('{taskId}', this.taskId)
-      Http.get(Apis.TASK.GET_TASK.replace('{projectId}', projectId).replace('{taskId}', taskId)).then((res) => {
-        console.log(res.crowdTaskVO)
-        this.taskId = res.crowdTaskVO.id
-        this.projectId = res.crowdTaskVO.projectId
-        this.task.title = res.crowdTaskVO.title
-        this.task.description = res.crowdTaskVO.description
-        this.task.serviceType = res.crowdTaskVO.serviceType
-        this.task.resource = res.crowdTaskVO.resource
-        this.task.location = getProvinceCodeByProvinceName(res.crowdTaskVO.location.provinceCode, res.crowdTaskVO.location.cityCode)
-        this.task.institution = res.crowdTaskVO.institution
-        this.task.datetime = new Date(res.crowdTaskVO.datetime)
-        this.task.quotePrice = res.crowdTaskVO.quotePrice
-        this.task.fixedPrice = res.crowdTaskVO.fixedPrice
-        this.task.doc = []
-        this.task.requireDocUrl = res.crowdTaskVO.requirementFile
-        this.task.agencyId = res.crowdTaskVO.agencyId
-        this.task.status = res.crowdTaskVO.status
-        this.taskOperationControl = res.taskOperationControl
+    //上传任务需求文档成功时回调函数
+    uploadRequireDocSuccess (res) {
+      this.hideLoading()
+      console.log('上传成功')
+      this.task.requireDocUrl = res.data
+      console.log(res.data)
+    },
+    //上传任务需求文档失败时回调函数
+    uploadRequireDocFail (error) {
+      this.hideLoading()
+      notify('error', '任务需求文档上传失败:' + error.data)
+    },
+    //文档上传前响应函数
 
-        this.reportList = res.crowdReportVOList
-        this.hideLoading()
-      })
+    //移除文档前的响应函数
+    beforeRemove (file, fileList) {
+      //return this.$confirm(`确定移除 ${file.name}?`)
     },
+    //移除文档时的响应函数
     handleRemove (file, fileList) {
       console.log(file, fileList)
     },
+    //需求文档添加进来时的响应函数
     handleExceed (files, fileList) {
       this.$message.warning(
         `当前限制选择 1 个文件,本次选择了 ${
@@ -448,78 +468,131 @@ export default {
           } 个文件,共选择了 ${files.length + fileList.length} 个文件`
       )
     },
-    beforeRemove (file, fileList) {
-      //return this.$confirm(`确定移除 ${file.name}?`)
+    //接收任务
+    receiveTask () {
+      this.showLoading()
+      receiveTaskRequest(this.projectId, this.taskId, this.user.userVO.id, this.receiveTaskSuccess, this.receiveTaskFail)
     },
-    beforeFileUpload (file) {
-      console.log(file)
-      const isPDF = file.type === 'application/pdf'
-      const isDOC = file.type === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
-      const isEXCEL = file.type === 'application/vnd.ms-excel'
-      const isXLS = file.type === 'application/x-xls'
-      const isTXT = file.type === 'text/plain'
-      const isXLSX = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
-      //console.log(file)
-      if (!(isDOC || isEXCEL || isPDF || isTXT || isXLS || isXLSX)) {
-        this.$message.error('上传文件只能是 PDF 、 DOC 、DOCX 、XLS、TXT、XLSX 格式!')
-      }
-      return isDOC || isEXCEL || isPDF || isTXT || isXLS || isXLSX
+    //接收任务成功时的回调函数
+    receiveTaskSuccess (res) {
+      this.hideLoading()
+      notify('success', '接收任务成功')
+      console.log(res)
+      this.taskOperationControl = res.taskOperationControl
+      this.task.status = res.crowdTaskVO.status
+      this.task.institution = res.crowdTaskVO.institution
     },
-    uploadProjectCreateExcelFile (param) {
-      const formData = new FormData()
-      let config = {
-        //添加请求头
-        headers: {'Content-Type': 'multipart/form-data'},
-      }
-      formData.append('file', param.file)
-      Http.upload(Apis.PROJECT.ADD_PROJECT_BY_EXCEL, formData, config).then((res) => {
-        console.log('上传成功')
-        this.project.excelFileUrl = res.data
-        console.log(res.data)
-      })
+    //接收任务失败时的回调函数
+    receiveTaskFail (error) {
+      this.hideLoading()
+      notify('error', '接收任务失败:' + error.data)
     },
-    uploadRequireDoc (param) {
-      const formData = new FormData()
-      let config = {
-        //添加请求头
-        headers: {'Content-Type': 'multipart/form-data'},
-      }
-      formData.append('file', param.file)
-      Http.upload(Apis.FILE.REQUIREMENT_FILE.replace('{userId}', this.user.userVO.id), formData, config).then((res) => {
-        console.log('上传成功')
-        this.task.requireDocUrl = res.data
-        console.log(res.data)
-      })
+    //拒绝任务
+    rejectTask () {
+      this.showLoading()
+      rejectTask(this.projectId, this.taskId, this.rejectTaskSuccess, this.rejectTaskFail)
     },
-    setServiceType () {
-      getAllServiceTypes().then((res) => {
-        this.serviceType = res
-      }).catch((error) => {
-        notify('error', '加载任务类型失败')
+    //拒绝任务成功时的回调函数
+    rejectTaskSuccess (res) {
+      this.hideLoading()
+      this.$router.push({
+        name: 'Mine'
       })
+      notify('success', '拒绝任务成功,已为您自动跳转到个人中心')
     },
-    setInstitutions () {
-      getAllAgencies().then((res) => {
-        this.institutionArray = res
-      }).catch((error) => {
-        notify('error', '获取机构列表失败')
-      })
+    //拒绝任务失败时的回调函数
+    rejectTaskFail (error) {
+      this.hideLoading()
+      notify('error', '拒绝任务失败:' + error.data)
     },
-    setUserInfo () {
-      this.user = storageGet('user')
-      this.rolesPermissions = storageGet('rolesPermissions')
+    //提交结束任务申请
+    submitTaskRequest () {
+      this.showLoading()
+      submitTaskRequest(this.projectId, this.taskId, this.submitTaskRequestSuccess, this.submitTaskRequestFail)
     },
-    showLoading () {
-      this.loading = true
+    //提交结束任务申请成功时的回调函数
+    submitTaskRequestSuccess (res) {
+      this.hideLoading()
+      console.log(res)
+      this.taskOperationControl = res.taskOperationControl
+      this.task.status = res.crowdTaskVO.status
+      this.task.institution = res.crowdTaskVO.institution
+      notify('success', '提交任务成功,等待区域管理员审核')
+    },
+    //提交结束任务申请失败时的回调函数
+    submitTaskRequestFail (error) {
+      this.hideLoading()
+      notify('error', '提交任务失败:' + error.data)
+    },
+    //结束任务
+    endTask () {
+      this.showLoading()
+      ensureEndTask(this.projectId, this.taskId, this.endTaskSuccess, this.endTaskFail)
+    },
+    //结束任务成功时的回调函数
+    endTaskSuccess (res) {
+      this.hideLoading()
+      this.taskOperationControl = res.taskOperationControl
+      this.task.status = res.crowdTaskVO.status
+      this.task.institution = res.crowdTaskVO.institution
+      notify('success', '结束结束成功!')
+    },
+    //结束任务失败时的回调函数
+    endTaskFail (error) {
+      this.hideLoading()
+      notify('error', '结束任务失败:' + error.data)
+    },
+    //跳转到创建项目报告页面
+    toCreateReport () {
+      this.$router.push({
+        name: 'TaskReportCreate',
+        params: {
+          scope: 1,
+          dependencyCode: this.taskId,
+          projectId: this.projectId,
+          taskId: this.taskId,
+        }
+      })
     },
-    hideLoading () {
-      this.loading = false
-    }
   },
-  // created () {
-  //   this.loadData()
-  // }
 }
+//回收站
+//
+// updateLocation (location) {
+//   console.log(location)
+//   const loactionName = getProvinceNameByProvinceCode(location.provinceCode, location.cityCode)
+//   // var provinceName = ''
+//   // var cityName = ''
+//   // for (var item of provinceCityJSON.provinces) {
+//   //   if (item.code === location.provinceCode) {
+//   //     provinceName = item.name
+//   //     for (var city of item.cities) {
+//   //       if (city.code === location.cityCode) {
+//   //         cityName = city.name
+//   //         break
+//   //       }
+//   //     }
+//   //   }
+//   // }
+//   return loactionName.provinceCode + ' / ' + loactionName.cityCode
+// },
+//
+// locationChange (provinceId, cityId) {
+//   if (provinceId || cityId) {
+//     this.task.location = {provinceCode: provinceId, cityCode: cityId}
+//   }
+// },
+// submitForm (formName) {
+// this.$refs[formName].validate(valid => {
+//   if (valid) {
+//     this.isModifyMode = false
+//
+//   } else {
+//     console.log('error submit!!')
+//     return false
+//   }
+// })
+// },
 </script>
 
 <style lang="less" scoped>

+ 18 - 9
src/components/task/TaskCreate.vue

@@ -1,16 +1,16 @@
 <template>
-  <div class="create-container">
+  <div class="create-container" v-loading="loading">
     <div class="title h1">创建任务</div>
     <div class="create-body">
       <el-form :model="task" :rules="rules" ref="task" label-width="12%" class="demo-task">
         <el-form-item label="任务名称" prop="name">
-          <el-input v-model="task.name"></el-input>
+          <el-input size="small" v-model="task.name"></el-input>
         </el-form-item>
         <el-form-item label="任务描述" prop="desc">
-          <el-input type="textarea" style="width: 400px" v-model="task.desc"></el-input>
+          <el-input autosize type="textarea" style="width: 400px" v-model="task.desc"></el-input>
         </el-form-item>
         <el-form-item label="任务报价" prop="quotePrice">
-          <el-input type="number" v-model="task.quotePrice">
+          <el-input size="small" type="number" v-model="task.quotePrice">
             <template slot="append">¥</template>
           </el-input>
         </el-form-item>
@@ -68,10 +68,9 @@
               将文件拖到此处,或
               <em>点击上传</em>
             </div>
-            <div class="el-upload__tip" slot="tip">请上传需求文档</div>
           </el-upload>
         </el-form-item>
-        <el-form-item label="任务截止时间" prop="datetime">
+        <el-form-item size="small" label="任务截止时间" prop="datetime">
           <div class="block">
             <el-date-picker
               v-model="task.datetime"
@@ -83,9 +82,9 @@
           </div>
         </el-form-item>
         <el-form-item>
-          <div class="btn btn-primary btn-info" @click="submitForm('task')">立即创建</div>
-          <div class="btn btn-primary" @click="resetForm('task')">重置</div>
-          <div class="btn btn-primary" @click="cancelCreate('task')">取消</div>
+          <div class="btn btn-medium btn-info" @click="submitForm('task')">立即创建</div>
+          <div class="btn btn-medium" @click="resetForm('task')">重置</div>
+          <div class="btn btn-medium" @click="cancelCreate('task')">取消</div>
         </el-form-item>
       </el-form>
     </div>
@@ -113,6 +112,7 @@ export default {
       institutionArray: [],
       tabPosition: 'top',
       resourceType: ResourceType,
+      loading: false,
       serviceType: [],
       task: {
         name: '',
@@ -230,6 +230,7 @@ export default {
       return provinceName + ' / ' + cityName
     },
     submitForm (formName) {
+      this.showLoading()
       const newTask = {
         name: this.task.name,
         desc: this.task.desc,
@@ -244,9 +245,11 @@ export default {
       }
       Http.post(Apis.TASK.CREATE_TASK.replace('{projectId}', this.projectId), newTask).then((res) => {
         console.log(res)
+        this.hideLoading()
         this.createTaskSuccess(res.crowdTaskVO.id)
       }).catch((error) => {
         console.log(error)
+        this.hideLoading()
         notify('error', error.data)
       })
       // this.$refs[formName].validate(valid => {
@@ -363,6 +366,12 @@ export default {
           })
         }
       })
+    },
+    showLoading () {
+      this.loading = true
+    },
+    hideLoading () {
+      this.loading = false
     }
   }
 }

+ 11 - 8
src/js/api.js

@@ -6,13 +6,21 @@ export default {
     DELETE_PROJECT: '/api/project/{projectId}/',
     ADD_PROJECT: '/api/greenChannel/project/',
     ADD_PROJECT_BY_EXCEL_PRE: '/api/greenChannel/excel/{userId}/projects',
-    ADD_PROJECT_BY_EXCEL: '/api/greenChannel/projects'
+    ADD_PROJECT_BY_EXCEL: '/api/greenChannel/projects',
+    ACCEPT_PROJECT: '/api/project/{projectId}/regionManager/{userId}',
+    REJECT_PROJECT: '/api/project/{projectId}/status/rejected',
+    SUBMIT_PROJECT: '/api/project/{projectId}/status/committed',
+    END_PROJECT: '/api/project/{projectId}/status/finished'
   },
   TASK: {
     GET_TASK: '/api/project/{projectId}/task/{taskId}/',
     CREATE_TASK: '/api/project/{projectId}/task/',
     UPDATE_TASK: '/api/project/{projectId}/task/{taskId}/',
-    DELETE_TASK: '/api/project/{projectId}/task/{taskId}/'
+    DELETE_TASK: '/api/project/{projectId}/task/{taskId}/',
+    ACCEPT_TASK: '/api/project/{projectId}/task/{taskId}/agency/{userId}', // PUT
+    REJECT_TASK: '/api/project/{projectId}/task/{taskId}/status/reject',
+    SUBMIT_TASK: '/api/project/{projectId}/task/{taskId}/status/commit',
+    END_TASK: '/api/project/{projectId}/task/{taskId}/status/finished',
   },
   REPORT: {
     GET_TASK_REPORT: '/api/project/{projectId}/task/{taskId}/report/{reportId}/',
@@ -30,14 +38,9 @@ export default {
     UPLOAD_REPORT_FILE: '/api/files/report/{userId}/',
     UPLOAD_EXCEL: '',
     UPLOAD_IMAGE: '/api/files/image/{userId}/',
+    GET_TEMPLATE_EXCEL_FILE: ''
   },
   USER: {
-    ACCEPT_TASK: '',
-    ACCEPT_PROJECT: '',
-    SUBMIT_TASK_REQUEST: '',
-    SUBMIT_PROJECT_REQUEST: '',
-    END_TASK: '',
-    END_PROJECT: '',
     ADD_AGENCY: '/api/greenChannel/agency/',
     GET_CURRENT_USER: '/api/common/currentUser/',
     GET_USER_IDENTITY: '',

+ 84 - 16
src/js/index.js

@@ -144,18 +144,43 @@ export const deleteProject = (projectId) => {
 }
 
 //区域管理员提出接收项目申请
-export const receiveProjectRequest = () => {
+export const receiveProjectRequest = (projectId, userId, receiveProjectSuccess, receiveProjectFail) => {
+  console.log('调用')
+  Http.put(Apis.PROJECT.ACCEPT_PROJECT.replace('{projectId}', projectId).replace('{userId}', userId), {}).then((res) => {
+    console.log(res)
+    receiveProjectSuccess(res)
+
+  }).catch((error) => {
+    console.log(error)
+    receiveProjectFail(error)
+  })
+}
 
+//区域管理员拒绝项目
+export const rejectProject = (projectId, rejectProjectSuccess, rejectProjectFail) => {
+  Http.put(Apis.PROJECT.REJECT_PROJECT.replace('{projectId}', projectId), {}).then((res) => {
+    rejectProjectSuccess(res)
+  }).catch((error) => {
+    rejectProjectFail(error)
+  })
 }
 
 //区域管理员提出结束项目申请
-export const endProjectRequest = () => {
-
+export const submitProjectRequest = (projectId, submitProjectReuqestSuccess, submitProjectRequestFail) => {
+  Http.put(Apis.PROJECT.SUBMIT_PROJECT.replace('{projectId}', projectId), {}).then((res) => {
+    submitProjectReuqestSuccess(res)
+  }).catch((error) => {
+    submitProjectRequestFail(error)
+  })
 }
 
 //用户确认结束项目
-export const ensureEndProject = () => {
-
+export const ensureEndProject = (projectId, endProjectSuccess, endProjectFail) => {
+  Http.put(Apis.PROJECT.END_PROJECT.replace('{projectId}', projectId), {}).then((res) => {
+    endProjectSuccess(res)
+  }).catch((error) => {
+    endProjectFail(error)
+  })
 }
 
 //创建任务
@@ -164,13 +189,21 @@ export const createTask = (projectId, task) => {
 }
 
 //修改任务
-export const updateTask = (projectId, taskId, task) => {
-  return Http.put(Apis.TASK.UPDATE_TASK.replace('{projectId}', projectId).replace('{taskId}', taskId), task)
+export const updateTask = (projectId, taskId, task, updateTaskSuccess, updateTaskFail) => {
+  Http.put(Apis.TASK.UPDATE_TASK.replace('{projectId}', projectId).replace('{taskId}', taskId), task).then((res) => {
+    updateTaskSuccess(res)
+  }).catch((error) => {
+    updateTaskFail(error)
+  })
 }
 
 //查看任务
-export const getTask = (projectId, taskId) => {
-  return Http.get(Apis.TASK.GET_TASK.replace('{projectId}', projectId).replace('{taskId}', taskId))
+export const getTask = (projectId, taskId, getTaskSuccess, getTaskFail) => {
+  Http.get(Apis.TASK.GET_TASK.replace('{projectId}', projectId).replace('{taskId}', taskId), {}).then((res) => {
+    getTaskSuccess(res)
+  }).catch((error) => {
+    getTaskFail(error)
+  })
 }
 
 //删除任务
@@ -178,19 +211,40 @@ export const udeleteTask = () => {
 
 }
 
-//测评机构申请任务
-export const receiveTaskRequest = () => {
+//测评机构接受任务
+export const receiveTaskRequest = (projectId, taskId, userId, receiveTaskRequestSuccess, receiveTaskRequestFail) => {
+  Http.put(Apis.TASK.ACCEPT_TASK.replace('{projectId}', projectId).replace('{taskId}', taskId).replace('{userId}', userId), {}).then((res) => {
+    receiveTaskRequestSuccess(res)
+  }).catch((error) => {
+    receiveTaskRequestFail(error)
+  })
 
 }
 
 //测评机构提出结束任务申请
-export const endTaskRequest = () => {
+export const submitTaskRequest = (projectId, taskId, submitTaskSuccess, submitTaskFail) => {
+  Http.put(Apis.TASK.SUBMIT_TASK.replace('{projectId}', projectId).replace('{taskId}', taskId), {}).then((res) => {
+    submitTaskSuccess(res)
+  }).catch((error) => {
+    submitTaskFail(error)
+  })
+}
 
+export const rejectTask = (projectId, taskId, rejectTaskSuccess, rejectTaskFail) => {
+  Http.put(Apis.TASK.REJECT_TASK.replace('{projectId}', projectId).replace('{taskId}', taskId), {}).then((res) => {
+    rejectTaskSuccess(res)
+  }).catch((error) => {
+    rejectTaskFail(error)
+  })
 }
 
 //区域管理员确认结束任务
-export const ensureEndTask = () => {
-
+export const ensureEndTask = (projectId, taskId, endTaskSuccess, endTaskFail) => {
+  Http.put(Apis.TASK.END_TASK.replace('{projectId}', projectId).replace('{taskId}', taskId), {}).then((res) => {
+    endTaskSuccess(res)
+  }).catch((error) => {
+    endTaskFail(error)
+  })
 }
 
 //创建项目报告
@@ -348,8 +402,22 @@ export const getProvinceCodeByProvinceName = (provinceName, cityName) => {
 }
 
 //获取批量上传项目模板文件
-export const getGreenChannelAddProjectExcelTemplateFile = () => {
-  return '123.excel'
+export const getGreenChannelAddProjectExcelTemplateFile = (getTemplateExcelSuccess, getTemplateExcelFail) => {
+  const data = {
+    fileUrl:'http://mooctest-crowd-service.oss-cn-hangzhou.aliyuncs.com/Others/%E9%A1%B9%E7%9B%AE%E5%AF%BC%E5%85%A5%E6%A8%A1%E6%9D%BF.xlsx'
+  }
+  new Promise((resolve) => {
+    resolve(data)
+  }).then((res)=>{
+    getTemplateExcelSuccess(res)
+  }).catch((error)=>{
+    getTemplateExcelFail(error)
+  })
+  // Http.get(Apis.FILE.GET_TEMPLATE_EXCEL_FILE).then((res) => {
+  //   getTemplateExcelSuccess(res)
+  // }).catch((error) => {
+  //   getTemplateExcelFail(error)
+  // })
 }
 
 //获取所有认证消息