Project.vue 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048
  1. <template>
  2. <div class="create-container" v-loading="loading">
  3. <div class="title h1" v-if="!isModifyMode">项目</div>
  4. <div class="create-body">
  5. <el-row type="flex" align="middle" justify="start">
  6. <el-col :span="15">
  7. <div class="title h2" v-if="!isModifyMode">基本信息</div>
  8. <div v-if="!isModifyMode" class="el-form-item">
  9. <label class="el-form-item__label" style="width: 30%;">编号</label>
  10. <div class="el-form-item__content" style="margin-left: 30%;">
  11. <div>{{projectId}}</div>
  12. </div>
  13. </div>
  14. <el-form :model="project" :rules="rules" ref="project" label-width="30%" class="demo-project">
  15. <el-form-item label="项目名称" prop="name">
  16. <el-input size="small" v-if="isModifyMode" v-model="project.name"></el-input>
  17. <span v-if="!isModifyMode" style="margin-right: 5px">{{project.name}}</span>
  18. <el-tag v-if="!isModifyMode" :type="project.statusVO&&project.statusVO.style">{{project.statusVO?project.statusVO.text:''}}</el-tag>
  19. </el-form-item>
  20. <el-form-item size="small" label="联系人" prop="contactName">
  21. <el-input v-if="isModifyMode" v-model="project.contactName" placeholder="请输入联系人姓名"></el-input>
  22. <span v-if="!isModifyMode">{{project.contactName}}</span>
  23. </el-form-item>
  24. <el-form-item size="small" label="联系人电话" prop="contactPhone">
  25. <el-input v-if="isModifyMode" v-model="project.contactPhone" placeholder="请输入联系人电话"></el-input>
  26. <span v-if="!isModifyMode">{{project.contactPhone}}</span>
  27. </el-form-item>
  28. <el-form-item size="small" label="预算" prop="budget">
  29. <el-input v-if="isModifyMode" type="number" v-model="project.budget">
  30. ¥
  31. <template slot="append"></template>
  32. </el-input>
  33. <span v-if="!isModifyMode">{{project.budget}}¥</span>
  34. </el-form-item>
  35. <el-form-item v-if="!isModifyMode" size="small" label="状态" prop="status">
  36. <span v-if="!isModifyMode">{{project.status==1?'等待接收':(project.status==2?'已被接收':(project.status==3?'项目已提交':'项目已结束'))}}</span>
  37. </el-form-item>
  38. <el-form-item size="small" label="区域管理员" prop="institution" v-if="project.institution">
  39. <span v-if="!isModifyMode">{{project.institution}}</span>
  40. </el-form-item>
  41. <el-form-item label="需求描述">
  42. <el-input style="width: 400px" autosize v-if="isModifyMode" type="textarea"
  43. v-model="project.desc"></el-input>
  44. <span v-if="!isModifyMode">{{project.desc}}</span>
  45. </el-form-item>
  46. <!--<el-form-item label="价格" prop="price">-->
  47. <!--<el-input v-if="isModifyMode" type="number" v-model="project.price">-->
  48. <!--<template slot="append">¥</template>-->
  49. <!--</el-input>-->
  50. <!--<span v-if="!isModifyMode">{{project.price}}¥</span>-->
  51. <!--</el-form-item>-->
  52. <el-form-item label="应用类型" prop="platform">
  53. <el-radio-group v-if="isModifyMode" v-model="project.platform">
  54. <span v-for="(item,index) in platforms" :key="index">
  55. <el-radio :label="item" style="margin: 3px">{{ item }}&nbsp;&nbsp;&nbsp;&nbsp;</el-radio>
  56. </span>
  57. </el-radio-group>
  58. <span
  59. v-if="!isModifyMode"
  60. class="badge"
  61. >
  62. <!-- v-for="item in project.platform"-->
  63. {{project.platform}}</span>
  64. </el-form-item>
  65. <el-form-item label="服务类型" prop="type">
  66. <el-checkbox-group v-if="isModifyMode" v-model="project.type">
  67. <span v-for="(item,index) in serviceType" :key="index">
  68. <el-checkbox :label="item" name="type">{{ item }}&nbsp;&nbsp;</el-checkbox>
  69. </span>
  70. </el-checkbox-group>
  71. <span v-if="!isModifyMode" class="badge" v-for="item in project.type">{{item}}</span>
  72. </el-form-item>
  73. <!--<el-form-item label="用途" prop="usage">-->
  74. <!--<el-input v-if="isModifyMode" v-model="project.usage"></el-input>-->
  75. <!--<span v-if="!isModifyMode">{{project.usage}}</span>-->
  76. <!--</el-form-item>-->
  77. <el-form-item label="项目可见性" prop="resource">
  78. <div v-if="!isModifyMode">
  79. <div v-if="project.resource=='1'">{{updateLocation(project.location)}}</div>
  80. <div v-if="project.resource=='0'">定向</div>
  81. <div v-if="project.resource=='2'">{{resourceType[project.resource]}}</div>
  82. </div>
  83. <el-tabs :tab-position="tabPosition" v-model="project.resource" style="max-height: 200px;"
  84. v-if="isModifyMode">
  85. <el-tab-pane :label="resourceType[0]" name="0">
  86. <el-radio-group v-model="project.institution">
  87. <el-radio :label="item" name="type" v-for="(item,index) in institutionArray" :key="index">
  88. {{item.name}}
  89. </el-radio>
  90. </el-radio-group>
  91. </el-tab-pane>
  92. <el-tab-pane :label="resourceType[1]" name="1">
  93. <provincecity
  94. ref="addFormProvince"
  95. @selectChange="locationChange"
  96. :provinceCode="project.location==null?'3200':project.location.provinceCode"
  97. :cityCode="project.location==null?'3201':project.location.cityCode"
  98. ></provincecity>
  99. </el-tab-pane>
  100. <el-tab-pane :label="resourceType[2]" name="2"></el-tab-pane>
  101. </el-tabs>
  102. </el-form-item>
  103. <el-form-item label="需求文档" prop="doc">
  104. <el-upload
  105. style="width: 400px"
  106. v-if="isModifyMode"
  107. drag
  108. class="upload-demo"
  109. action=""
  110. :on-remove="handleRemove"
  111. :before-remove="beforeRemove"
  112. :limit="1"
  113. :on-exceed="handleExceed"
  114. :before-upload="beforeFileUpload"
  115. :http-request="uploadRequireDoc"
  116. :file-list="project.doc"
  117. >
  118. <i class="el-icon-upload"></i>
  119. <div class="el-upload__text">
  120. 将文件拖到此处,或
  121. <em>点击上传</em>
  122. </div>
  123. </el-upload>
  124. <span v-if="!isModifyMode">
  125. <a :href="project.requireDocUrl" v-if="project.requireDocUrl!=null && project.requireDocUrl!=''"><el-link
  126. :underline="false" type="primary"><i
  127. class="el-icon-document"></i>下载文档</el-link></a>
  128. <i v-if="project.requireDocUrl==null || project.requireDocUrl==''" class="el-icon-document">暂无文档</i>
  129. </span>
  130. </el-form-item>
  131. <el-form-item label="安装包" prop="file">
  132. <el-upload
  133. style="width: 400px"
  134. v-if="isModifyMode"
  135. drag
  136. class="upload-demo"
  137. action=""
  138. :on-remove="handleRemove"
  139. :before-remove="beforeRemove"
  140. :limit="1"
  141. :on-exceed="handleExceed"
  142. :before-upload="beforeApkUpload"
  143. :http-request="uploadApkFile"
  144. :file-list="project.file"
  145. >
  146. <i class="el-icon-upload"></i>
  147. <div class="el-upload__text">
  148. 将文件拖到此处,或
  149. <em>点击上传</em>
  150. </div>
  151. </el-upload>
  152. <span v-if="!isModifyMode">
  153. <a v-if="project.fileUrl!=null && project.fileUrl!=''" :href="project.fileUrl"><el-link :underline="false"
  154. type="primary"><i
  155. class="el-icon-document"></i>下载文件</el-link></a>
  156. <i v-if="project.fileUrl==null || project.fileUrl==''" class="el-icon-document">暂无文件</i>
  157. </span>
  158. </el-form-item>
  159. <el-form-item label="项目截止时间" prop="datetime">
  160. <div class="block" v-if="isModifyMode">
  161. <el-date-picker
  162. size="small"
  163. v-model="project.datetime"
  164. type="datetime"
  165. placeholder="选择截止时间"
  166. align="right"
  167. :picker-options="pickerOptions"
  168. ></el-date-picker>
  169. </div>
  170. <span v-if="!isModifyMode">{{dateFormat(new Date(project.datetime),'yyyy-MM-dd HH:mm:ss')}}</span>
  171. </el-form-item>
  172. <el-form-item v-if="isModifyMode">
  173. <div class="btn btn-small btn-info" @click="submitForm('project')">确认修改</div>
  174. <!--<div class="btn btn-small" @click="resetForm('project')">重置</div>-->
  175. <div class="btn btn-small" @click="cancelMode('project')">取消</div>
  176. </el-form-item>
  177. <el-form-item v-if="!isModifyMode">
  178. <el-button v-if="projectOperationControl.confirmFinish" type="success" size="mini" @click="endProject()">
  179. 结束项目
  180. </el-button>
  181. <el-button v-if="projectOperationControl.finish" type="primary" size="mini"
  182. @click="submitProjectRequest()">
  183. 提交项目
  184. </el-button>
  185. <el-button v-if="projectOperationControl.receive" type="primary" size="mini" @click="receiveProject()">
  186. 接收项目
  187. </el-button>
  188. <el-button v-if="projectOperationControl.reject" type="danger" size="mini" @click="rejectProject()">
  189. 拒绝项目
  190. </el-button>
  191. <el-button v-if="projectOperationControl.update" type="primary" size="mini" @click="modifyForm()">
  192. 修改项目
  193. </el-button>
  194. <el-button v-if="projectOperationControl.createTask" type="primary" size="mini" @click="createNewTask()">
  195. 新建任务
  196. </el-button>
  197. <el-button v-if="projectOperationControl.uploadReport" type="primary" size="mini" @click="createReport()">
  198. 上传报告
  199. </el-button>
  200. </el-form-item>
  201. </el-form>
  202. </el-col>
  203. <el-col :span="5" id="pieImage" style="height: 500px;min-width: 500px">
  204. </el-col>
  205. </el-row>
  206. </div>
  207. <!-- 任务列表-->
  208. <div class="create-body" v-if="!isModifyMode && showTaskList">
  209. <div class="title h2">任务列表</div>
  210. <div class="task-list">
  211. <el-table :showHeader="true" :stripe="true" :data="task" style="width: 100%">
  212. <el-table-column prop="title" label="任务名称" title="任务名称">
  213. <template slot-scope="scope">
  214. <span>{{ scope.row.title }}</span>
  215. </template>
  216. </el-table-column>
  217. <el-table-column prop="datetime" sortable label="任务截止时间">
  218. <template slot-scope="scope">
  219. <span>{{reformDate(new Date(scope.row.datetime))}}</span>
  220. </template>
  221. </el-table-column>
  222. <el-table-column prop="resource" label="任务可见性">
  223. <template slot-scope="scope">
  224. <div v-if="scope.row.resource=='1'">{{scope.row.location.provinceCode}}/{{scope.row.location.cityCode}}
  225. </div>
  226. <div v-if="scope.row.resource=='0'">{{scope.row.institution}}</div>
  227. <div v-if="scope.row.resource=='2'">{{resourceType[scope.row.resource]}}</div>
  228. </template>
  229. </el-table-column>
  230. <el-table-column prop="type" label="业务类型">
  231. <template slot-scope="scope">
  232. <div class="badge">{{scope.row.serviceType}}</div>
  233. </template>
  234. </el-table-column>
  235. <el-table-column align="center" label="状态">
  236. <template slot-scope="scope">
  237. <el-tag :type="scope.row.statusVO.style">{{scope.row.statusVO.text}}</el-tag>
  238. </template>
  239. </el-table-column>
  240. <el-table-column align="right" label="操作">
  241. <template slot-scope="scope">
  242. <div
  243. class="btn btn-small btn-info"
  244. @click="goToTaskDetail(projectId, scope.row.id)"
  245. >查看详情
  246. </div>
  247. <!-- <div-->
  248. <!-- class="btn btn-small btn-danger"-->
  249. <!-- @click="handleDelete(scope.$index, scope.row.id)"-->
  250. <!-- >删除-->
  251. <!-- </div>-->
  252. </template>
  253. </el-table-column>
  254. </el-table>
  255. </div>
  256. </div>
  257. <div class="create-body" v-if="!isModifyMode">
  258. <div class="title h2">用户报告列表</div>
  259. <report-list v-bind:reports="reportList" v-bind:taskId=null v-bind:projectId="projectId"/>
  260. </div>
  261. </div>
  262. </template>
  263. <script>
  264. import ReportList from '@/components/report/ReportList'
  265. import Http from '@/js/http.js'
  266. import Apis from '@/js/api.js'
  267. import ResourceType from '@/constants/enum/resource-type'
  268. import provincecity from '@/components/commons/ProvinceCity'
  269. import {notify} from '@/constants/index'
  270. import echarts from 'echarts'
  271. import {
  272. checkFileType,
  273. ensureEndProject,
  274. getAllInstitutions,
  275. getAllPlatformTypes,
  276. getAllServiceTypes,
  277. getFormalTimeFromDate,
  278. getProvinceCodeByProvinceName,
  279. getProvinceNameByProvinceCode,
  280. receiveProjectRequest,
  281. rejectProject,
  282. storageGet,
  283. submitProjectRequest,
  284. deleteTask
  285. } from '@/js/index'
  286. export default {
  287. name: 'Project',
  288. components: {
  289. provincecity,
  290. ReportList
  291. },
  292. data () {
  293. var validatePass = (rule, value, callback) => {
  294. var reg = /^(0|86|17951)?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$/
  295. if (this.project.contactPhone) {
  296. if (!reg.test(this.project.contactPhone)) {
  297. callback(new Error('请检查手机号码'))
  298. } else {
  299. callback()
  300. }
  301. }
  302. }
  303. return {
  304. showTaskList: true,
  305. acceptedUserList:[],
  306. projectId: 0,
  307. user: {},
  308. loading: false,
  309. tabPosition: 'top',
  310. institutionArray: [],
  311. isModifyMode: false,
  312. platforms: [],
  313. resourceType: ResourceType,
  314. serviceType: [],
  315. projectOperationControl: {
  316. confirmFinish: false,
  317. createTask: false,
  318. finish: false,
  319. receive: false,
  320. reject: false,
  321. update: false,
  322. uploadReport: false,
  323. },
  324. project: {
  325. userId: 0,
  326. name: '',
  327. type: '',
  328. platform: '',
  329. desc: '',
  330. resource: '',
  331. location: '',
  332. institution: {},
  333. contactName: '',
  334. contactPhone: '',
  335. doc: [],
  336. requireDocUrl: '',
  337. file: [],
  338. fileUrl: '',
  339. budget: '',
  340. price: '',
  341. datetime: '',
  342. usage: '',
  343. status: ''
  344. },
  345. task: [],
  346. progress: [],
  347. reportList: [],
  348. pickerOptions: {
  349. disabledDate(time) {
  350. return time.getTime() <= Date.now();
  351. },
  352. shortcuts: [
  353. {
  354. text: '今天',
  355. onClick (picker) {
  356. picker.$emit('pick', new Date())
  357. }
  358. },
  359. {
  360. text: '明天',
  361. onClick (picker) {
  362. const date = new Date()
  363. date.setTime(date.getTime() + 3600 * 1000 * 24)
  364. picker.$emit('pick', date)
  365. }
  366. },
  367. {
  368. text: '一周后',
  369. onClick (picker) {
  370. const date = new Date()
  371. date.setTime(date.getTime() + 3600 * 1000 * 24 * 7)
  372. picker.$emit('pick', date)
  373. }
  374. }
  375. ]
  376. },
  377. rules: {
  378. name: [
  379. {required: true, message: '请输入项目名称', trigger: 'blur'},
  380. {min: 5, max: 50, message: '项目名称长度在 5 到 50 个字符', trigger: 'blur'}
  381. ],
  382. contactName: [
  383. {required: true, message: '请输入联系人姓名', trigger: 'blur'}
  384. // { min: 3, max: 5, message: "长度在 3 到 5 个字符", trigger: "blur" }
  385. ],
  386. contactPhone: [
  387. {required: true, message: '请输入手机号', trigger: 'blur'},
  388. {min: 11, max: 11, message: '请输入正确的手机号', trigger: 'blur'},
  389. {
  390. validator: (rule, value, callback) => {
  391. if (!this.checkPhoneNumber(value)) {
  392. callback(new Error('手机号输入有误'))
  393. } else {
  394. callback()
  395. }
  396. }, trigger: 'blur'
  397. },
  398. ],
  399. type: [
  400. {
  401. type: 'array',
  402. required: true,
  403. message: '请至少选择一种服务类型',
  404. trigger: 'change'
  405. }
  406. ],
  407. platform: [
  408. {
  409. required: true,
  410. message: '请至少选择一个平台',
  411. trigger: 'change'
  412. }
  413. ],
  414. desc: [{required: false, message: '请填写描述', trigger: 'blur'}],
  415. //price: [{required: true, message: '请填写价格', trigger: 'blur'}],
  416. budget: [
  417. {required: true, message: '预算不可为空', trigger: 'blur'},
  418. {
  419. validator: (rule, value, callback) => {
  420. if (value < 0) {
  421. callback(new Error('请输入不小于0的数'))
  422. } else {
  423. callback()
  424. }
  425. }, trigger: 'blur'
  426. },
  427. ],
  428. resource: [
  429. {required: true},
  430. {
  431. validator: (rule, value, callback) => {
  432. if (value == 0 && this.project.institution == null) {
  433. callback(new Error('定向发布至少要选择一个区域管理员'))
  434. } else {
  435. callback()
  436. }
  437. }, trigger: 'change'
  438. },
  439. ],
  440. datetime: [{required: true, message: '截止时间不可为空', trigger: 'blur'}],
  441. }
  442. }
  443. },
  444. mounted () {
  445. this.$nextTick(() => {
  446. this.init();
  447. })
  448. },
  449. watch: {
  450. serviceType (val) {
  451. this.serviceType = val
  452. },
  453. institutionArray (val) {
  454. this.institutionArray = val
  455. },
  456. // 'project.institution' () {
  457. // if (this.project.institution) {
  458. // //this.$refs.addFormProvince.resetProviceCity()
  459. // this.project.location = {provinceCode: '', cityCode: ''}
  460. // }
  461. // },
  462. // 'project.location' () {
  463. // if (this.project.location.provinceCode || this.project.location.cityCode) {
  464. // this.project.institution = ''
  465. // }
  466. // },
  467. // 'project.resource' () {
  468. // if (this.project.resource == '2') {
  469. // //this.$refs.addFormProvince.resetProviceCity()
  470. // this.project.institution = ''
  471. // this.project.location = {provinceCode: '', cityCode: ''}
  472. // }
  473. // },
  474. deep: true
  475. },
  476. methods: {
  477. updateLocation (location) {
  478. //console.log(location)
  479. const loactionName = getProvinceNameByProvinceCode(location.provinceCode, location.cityCode)
  480. // var provinceName = ''
  481. // var cityName = ''
  482. // for (var item of provinceCityJSON.provinces) {
  483. // if (item.code === location.provinceCode) {
  484. // provinceName = item.name
  485. // for (var city of item.cities) {
  486. // if (city.code === location.cityCode) {
  487. // cityName = city.name
  488. // break
  489. // }
  490. // }
  491. // }
  492. // }
  493. return loactionName.provinceCode + ' / ' + loactionName.cityCode
  494. },
  495. init () {
  496. this.projectId = this.$route.params.projectId
  497. this.setServiceType()
  498. this.setPlatformType()
  499. this.setInstitutions()
  500. this.setUserInfo()
  501. this.loadData()
  502. //this.reformDate(123)
  503. // this.project.platform.map(item => {
  504. // this.platformType.push(PlatformType[item])
  505. // })
  506. },
  507. //画个饼
  508. setEcharts () {
  509. // 基于准备好的dom,初始化echarts实例
  510. let myChart = echarts.init(document.getElementById('pieImage'))
  511. // 绘制图表
  512. var option = {
  513. tooltip: {
  514. trigger: 'item',
  515. formatter: '{a} <br/>{b}: {c} ({d}%)'
  516. },
  517. legend: {
  518. orient: 'vertical',
  519. x: 'left',
  520. data: ['已完成', '进行中']
  521. },
  522. series: [
  523. {
  524. name: '任务状态',
  525. type: 'pie',
  526. radius: ['50%', '70%'],
  527. avoidLabelOverlap: false,
  528. label: {
  529. normal: {
  530. show: false,
  531. position: 'center'
  532. },
  533. emphasis: {
  534. show: true,
  535. textStyle: {
  536. fontSize: '30',
  537. fontWeight: 'bold'
  538. }
  539. }
  540. },
  541. labelLine: {
  542. normal: {
  543. show: false
  544. }
  545. },
  546. data: this.progress,
  547. color:['#909399','#409EFF']
  548. }
  549. ]
  550. }
  551. myChart.setOption(option)
  552. },
  553. //提交修改
  554. submitForm (formName) {
  555. this.$refs['project'].validate(valid => {
  556. if (valid) {
  557. this.showLoading()
  558. const newProject = {
  559. userId: this.user.userVO.id,
  560. name: this.project.name,
  561. type: this.project.type,
  562. platform: this.project.platform.split('&#'),
  563. desc: this.project.desc,
  564. resource: this.project.resource,
  565. location: getProvinceNameByProvinceCode(this.project.location.provinceCode, this.project.location.cityCode),
  566. institution: this.project.institution == null ? null : this.project.institution.id,
  567. contactName: this.project.contactName,
  568. contactPhone: this.project.contactPhone,
  569. doc: this.project.requireDocUrl,
  570. file: this.project.fileUrl,
  571. budget: this.project.budget,
  572. price: this.project.price,
  573. datetime: this.project.datetime,
  574. usage: this.project.usage,
  575. }
  576. console.log(newProject);
  577. Http.put(Apis.PROJECT.UPDATE_PROJECT.replace('{projectId}', this.projectId), newProject).then((res) => {
  578. console.log(res)
  579. this.projectId = res.projectDetails.id
  580. this.project.name = res.projectDetails.name
  581. this.project.contactName = res.projectDetails.contactName
  582. this.project.contactPhone = res.projectDetails.contactPhone
  583. this.project.type = res.projectDetails.type
  584. this.project.platform = res.projectDetails.platform[0]
  585. this.project.desc = res.projectDetails.desc
  586. this.project.doc = []
  587. this.project.file = []
  588. this.project.resource = res.projectDetails.resource
  589. this.project.location = getProvinceCodeByProvinceName(res.projectDetails.location.provinceCode, res.projectDetails.location.cityCode)
  590. this.project.institution = res.projectDetails.institution
  591. this.project.datetime = new Date(res.projectDetails.datetime)
  592. this.project.price = res.projectDetails.price
  593. this.project.budget = res.projectDetails.budget
  594. this.project.usage = res.projectDetails.usage
  595. this.project.fileUrl = res.projectDetails.file
  596. this.project.requireDocUrl = res.projectDetails.doc
  597. this.task = res.taskList
  598. this.reportList = res.reportList
  599. this.isModifyMode = false
  600. this.hideLoading()
  601. notify('success', '项目修改成功')
  602. }).catch(error => {
  603. this.hideLoading()
  604. notify('error', error.data)
  605. console.log(error)
  606. })
  607. } else {
  608. notify('error', '表单填写错误!')
  609. return false
  610. }
  611. })
  612. },
  613. //重置表单
  614. resetForm (formName) {
  615. this.$refs[formName].resetFields()
  616. this.project.name = ''
  617. this.project.type = []
  618. this.project.platform = []
  619. this.project.desc = ''
  620. this.project.doc = ''
  621. this.project.file = ''
  622. this.project.contactName = ''
  623. this.project.contactPhone = ''
  624. this.project.resource = '2'
  625. this.project.institution = ''
  626. this.project.datetime = ''
  627. this.project.price = ''
  628. this.project.usage = ''
  629. this.project.budget = ''
  630. },
  631. //进入修改项目页面
  632. modifyForm () {
  633. this.isModifyMode = true
  634. console.log(this.project.doc)
  635. //this.setInstitutions()
  636. //获得update 信息
  637. //this.loadData()
  638. },
  639. //接收项目
  640. receiveProject () {
  641. this.$confirm('确认接收项目?', '提示', {
  642. confirmButtonText: '确认接收',
  643. cancelButtonText: '取消',
  644. type: 'success'
  645. }).then(() => {
  646. this.showLoading()
  647. console.log('接收项目')
  648. receiveProjectRequest(this.projectId, this.user.userVO.id, this.receiveProjectSuccess, this.receiveProjectFail)
  649. }).catch(() => {
  650. })
  651. },
  652. receiveProjectSuccess (res) {
  653. this.hideLoading()
  654. notify('success', '项目接收成功!')
  655. this.projectOperationControl = res.projectOperationControl
  656. this.project.status = res.projectDetails.status
  657. this.project.institution = res.projectDetails.institution
  658. },
  659. receiveProjectFail (error) {
  660. this.hideLoading()
  661. notify('error', '接收项目失败:' + error.data)
  662. },
  663. //拒绝项目
  664. rejectProject () {
  665. this.$confirm('确认拒绝项目?', '提示', {
  666. confirmButtonText: '确认拒绝',
  667. cancelButtonText: '取消',
  668. type: 'success'
  669. }).then(() => {
  670. this.showLoading()
  671. rejectProject(this.projectId, this.rejectProjectSuccess, this.rejectProjectFail)
  672. }).catch(() => {
  673. })
  674. },
  675. rejectProjectSuccess (res) {
  676. this.hideLoading()
  677. notify('success', '拒绝项目成功')
  678. },
  679. rejectProjectFail (error) {
  680. this.hideLoading()
  681. notify('error', '拒绝项目失败:' + error.data)
  682. },
  683. //提交项目
  684. submitProjectRequest () {
  685. this.$confirm('确认提交项目?', '提示', {
  686. confirmButtonText: '确认提交',
  687. cancelButtonText: '取消',
  688. type: 'success'
  689. }).then(() => {
  690. this.showLoading()
  691. submitProjectRequest(this.projectId, this.submitProjectRequestSuccess, this.submitProjectRequestFail)
  692. }).catch(() => {
  693. })
  694. },
  695. submitProjectRequestSuccess (res) {
  696. this.hideLoading()
  697. notify('success', '项目提交成功!')
  698. this.loadData()
  699. this.projectOperationControl = res.projectOperationControl
  700. this.project.status = res.projectDetails.status
  701. this.project.institution = res.projectDetails.institution
  702. },
  703. submitProjectRequestFail (error) {
  704. this.hideLoading()
  705. notify('error', '提交项目失败:' + error.data)
  706. },
  707. //结束项目
  708. endProject () {
  709. this.$confirm('确认结束项目?', '提示', {
  710. confirmButtonText: '确认结束',
  711. cancelButtonText: '取消',
  712. type: 'success'
  713. }).then(() => {
  714. this.showLoading()
  715. ensureEndProject(this.projectId, this.endProjectSuccess, this.endProjectFail)
  716. }).catch(() => {
  717. })
  718. },
  719. endProjectSuccess (res) {
  720. this.hideLoading()
  721. notify('success', '项目提交成功!')
  722. this.loadData()
  723. this.projectOperationControl = res.projectOperationControl
  724. this.project.status = res.projectDetails.status
  725. this.project.institution = res.projectDetails.institution
  726. },
  727. endProjectFail (error) {
  728. this.hideLoading()
  729. notify('error', '结束项目失败:' + error.data)
  730. },
  731. cancelMode (formName) {
  732. this.isModifyMode = false
  733. this.loadData()
  734. },
  735. goToTaskDetail (projectId, taskId) {
  736. this.$router.push({
  737. name: 'Task',
  738. params: {projectId: projectId, taskId: taskId}
  739. })
  740. },
  741. createNewTask () {
  742. const that = this
  743. this.$router.push({
  744. name: 'TaskCreate',
  745. params: {projectId: that.projectId}
  746. })
  747. },
  748. createReport () {
  749. this.$router.push({
  750. name: 'ProjectReportCreate',
  751. params: {
  752. scope: 0,
  753. dependencyCode: this.projectId,
  754. projectId: this.projectId,
  755. }
  756. })
  757. },
  758. handleDelete (index, id) {
  759. this.$confirm('确认删除该任务?')
  760. .then(_ => {
  761. //done()
  762. //id->taskid
  763. console.log(id)
  764. console.log(this.projectId)
  765. deleteTask(this.projectId,id,this.deleteTaskSuccess,this.deleteTaskFail)
  766. })
  767. .catch(_ => {
  768. notify('error', '删除失败')
  769. })
  770. //this.task.splice(index, 1)
  771. },
  772. deleteTaskSuccess(res){
  773. notify('success', '删除成功')
  774. },
  775. deleteTaskFail(error){
  776. console.log(error)
  777. notify('error', '删除失败:'+error)
  778. },
  779. beforeApkUpload (file) {
  780. return true;
  781. //const fileTypeList = ['dmg', 'exe', 'apk']
  782. //return checkFileType(file, fileTypeList, this.beforeFileUploadError)
  783. },
  784. beforeFileUpload (file) {
  785. return true;
  786. //const fileTypeList = ['pdf', 'xls', 'xlsx', 'doc', 'docx', 'txt']
  787. //return checkFileType(file, fileTypeList, this.beforeFileUploadError)
  788. },
  789. beforeFileUploadError () {
  790. this.$message.error('上传文件只能是 PDF 、 DOC 、DOCX 、XLS、TXT、XLSX 格式!')
  791. },
  792. analyseDemand () {
  793. this.$router.push({name: 'AnalyseDemand'})
  794. },
  795. handleAccept (index, id) {
  796. console.log('接收')
  797. },
  798. handleReject (index, id) {
  799. console.log('拒绝')
  800. },
  801. loadData () {//PROJ--2019073114009
  802. this.showLoading()
  803. Http.get(Apis.PROJECT.GET_PROJECT.replace('{projectId}', this.projectId)).then((res) => {
  804. console.log(res)
  805. this.projectId = res.projectDetails.id
  806. this.project.name = res.projectDetails.name
  807. this.project.contactName = res.projectDetails.contactName
  808. this.project.contactPhone = res.projectDetails.contactPhone
  809. this.project.type = res.projectDetails.type
  810. this.project.platform = res.projectDetails.platform[0]
  811. this.project.desc = res.projectDetails.desc
  812. this.project.doc = []
  813. this.project.file = []
  814. this.project.resource = res.projectDetails.resource
  815. this.project.location = getProvinceCodeByProvinceName(res.projectDetails.location.provinceCode, res.projectDetails.location.cityCode)
  816. this.project.institution = res.projectDetails.institution
  817. this.project.datetime = new Date(res.projectDetails.datetime)
  818. this.project.price = res.projectDetails.price
  819. this.project.budget = res.projectDetails.budget
  820. this.project.usage = res.projectDetails.usage
  821. this.project.fileUrl = res.projectDetails.file
  822. this.project.requireDocUrl = res.projectDetails.doc
  823. this.project.userId = res.projectDetails.userId
  824. this.project.status = res.projectDetails.status
  825. this.project.statusVO = res.projectDetails.statusVO
  826. this.task = res.taskList
  827. this.reportList = res.reportList
  828. this.projectOperationControl = res.projectOperationControl
  829. this.progress = res.progress
  830. this.hideLoading()
  831. this.handleShowTaskListOrNot()
  832. for(var i = 0; i < this.progress.length; i++){
  833. if(this.progress[i].value != 0){
  834. this.setEcharts()
  835. break
  836. }
  837. }
  838. }).catch((error) => {
  839. this.hideLoading()
  840. notify('error', error.data)
  841. })
  842. },
  843. handleShowTaskListOrNot () {
  844. // console.log(storageGet('user')['userVO']['id'])
  845. if(storageGet('user')['userVO']['id'] === this.project.userId){
  846. this.showTaskList = false
  847. }
  848. },
  849. locationChange (provinceId, cityId) {
  850. if (provinceId || cityId) {
  851. this.project.location = {provinceCode: provinceId, cityCode: cityId}
  852. }
  853. },
  854. handleRemove (file, fileList) {
  855. console.log(file, fileList)
  856. },
  857. handleExceed (files, fileList) {
  858. this.$message.warning(
  859. `当前限制选择 1 个文件,本次选择了 ${
  860. files.length
  861. } 个文件,共选择了 ${files.length + fileList.length} 个文件`
  862. )
  863. },
  864. beforeRemove (file, fileList) {
  865. //return this.$confirm(`确定移除 ${file.name}?`)
  866. },
  867. beforeUploadRequireDoc () {
  868. },
  869. beforeUploadApkFile () {
  870. },
  871. uploadRequireDoc (param) {
  872. this.showLoading()
  873. const formData = new FormData()
  874. let config = {
  875. //添加请求头
  876. headers: {'Content-Type': 'multipart/form-data'},
  877. }
  878. formData.append('file', param.file)
  879. Http.upload(Apis.FILE.REQUIREMENT_FILE.replace('{userId}', this.user.userVO.id), formData, config).then((res) => {
  880. this.project.requireDocUrl = res.data
  881. this.hideLoading()
  882. notify('success', '需求文档上传成功')
  883. }).catch((error) => {
  884. this.hideLoading()
  885. notify('error', '需求文档上传失败:' + error.data)
  886. })
  887. },
  888. uploadApkFile (param) {
  889. this.showLoading()
  890. const formData = new FormData()
  891. let config = {
  892. //添加请求头
  893. headers: {'Content-Type': 'multipart/form-data'},
  894. }
  895. formData.append('file', param.file)
  896. Http.upload(Apis.FILE.APK.replace('{userId}', this.user.userVO.id), formData, config).then((res) => {
  897. this.project.fileUrl = res.data
  898. this.hideLoading()
  899. notify('success', '文件上传成功')
  900. }).catch((error) => {
  901. this.hideLoading()
  902. this.project.file = []
  903. notify('error', '文件上传失败')
  904. })
  905. },
  906. setServiceType () {
  907. getAllServiceTypes().then((res) => {
  908. this.serviceType = res
  909. }).catch((error) => {
  910. notify('error', '获取项目类型列表失败')
  911. })
  912. },
  913. setPlatformType () {
  914. this.platforms = getAllPlatformTypes()
  915. },
  916. setInstitutions () {
  917. getAllInstitutions().then((res) => {
  918. this.institutionArray = res
  919. }).catch((error) => {
  920. notify('error', '获取institution失败' + error.data)
  921. })
  922. },
  923. setUserInfo () {
  924. this.user = storageGet('user')
  925. },
  926. checkPhoneNumber(phoneNumber){
  927. return /^1[3456789]\d{9}$/.test(phoneNumber)
  928. },
  929. showLoading () {
  930. this.loading = true
  931. },
  932. hideLoading () {
  933. this.loading = false
  934. },
  935. reformDate (date) {
  936. return getFormalTimeFromDate(date)
  937. },
  938. dateFormat (date, format) {
  939. date = new Date(date)
  940. let o = {
  941. 'M+' : date.getMonth() + 1, //month
  942. 'd+' : date.getDate(), //day
  943. 'H+' : date.getHours(), //hour+8小时
  944. 'm+' : date.getMinutes(), //minute
  945. 's+' : date.getSeconds(), //second
  946. 'q+' : Math.floor((date.getMonth() + 3) / 3), //quarter
  947. 'S' : date.getMilliseconds() //millisecond
  948. }
  949. if (/(y+)/.test(format)){
  950. format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
  951. }
  952. for (let k in o)
  953. if (new RegExp('(' + k + ')').test(format))
  954. format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length));
  955. return format;
  956. }
  957. }
  958. }
  959. </script>
  960. <style lang="less" scoped>
  961. .task-list {
  962. margin: 0 30px;
  963. }
  964. .el-col {
  965. padding: 0 !important;
  966. }
  967. .el-row {
  968. margin-bottom: 10px;
  969. }
  970. .el-input {
  971. width: 400px;
  972. }
  973. </style>
  974. <!--<div class="create-body" v-if="!isModifyMode">-->
  975. <!--<div class="title h2">分析需求</div>-->
  976. <!--<div class="task-list">-->
  977. <!--<el-table :data="analyseDemandList" style="width: 100%" max-height="400">-->
  978. <!--<el-table-column prop="institution" label="承接单位" title="承接单位"></el-table-column>-->
  979. <!--<el-table-column prop="feasibilityReport" sortable label="可行性分析报告">-->
  980. <!--<template slot-scope="scope">-->
  981. <!--<span v-if="!scope.row.feasibilityReport.url">暂无文件</span>-->
  982. <!--<a-->
  983. <!--:href="scope.row.feasibilityReport.url"-->
  984. <!--v-if="scope.row.feasibilityReport.url"-->
  985. <!--target="_blank"-->
  986. <!--&gt;-->
  987. <!--<i class="fa fa-file-text-o"></i>-->
  988. <!--{{scope.row.feasibilityReport.name}}-->
  989. <!--</a>-->
  990. <!--</template>-->
  991. <!--</el-table-column>-->
  992. <!--<el-table-column prop="priceAuditReport" sortable label="可行性分析报告">-->
  993. <!--<template slot-scope="scope">-->
  994. <!--<span v-if="!scope.row.priceAuditReport.url">暂无文件</span>-->
  995. <!--<a-->
  996. <!--:href="scope.row.priceAuditReport.url"-->
  997. <!--v-if="scope.row.priceAuditReport.url"-->
  998. <!--target="_blank"-->
  999. <!--&gt;-->
  1000. <!--<i class="fa fa-file-text-o"></i>-->
  1001. <!--{{scope.row.priceAuditReport.name}}-->
  1002. <!--</a>-->
  1003. <!--</template>-->
  1004. <!--</el-table-column>-->
  1005. <!--<el-table-column align="right" label="操作">-->
  1006. <!--<template slot-scope="scope">-->
  1007. <!--<div-->
  1008. <!--class="btn btn-small btn-info"-->
  1009. <!--@click="handleAccept(scope.$index, scope.row.id)"-->
  1010. <!--&gt;接受-->
  1011. <!--</div>-->
  1012. <!--<div-->
  1013. <!--class="btn btn-small btn-danger"-->
  1014. <!--@click="handleReject(scope.$index, scope.row.id)"-->
  1015. <!--&gt;拒绝-->
  1016. <!--</div>-->
  1017. <!--</template>-->
  1018. <!--</el-table-column>-->
  1019. <!--</el-table>-->
  1020. <!--</div>-->
  1021. <!--</div>-->