Project.vue 49 KB

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