overallPlan.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534
  1. <template>
  2. <div v-loading="loading" class="overallPlan">
  3. <el-form>
  4. <el-row>
  5. <el-col :span="10" class="col-txt"><span>客户名称:</span><span>{{ custName }}</span></el-col>
  6. <el-col :span="14" class="col-txt"><span>项目名称:</span><span>{{ proName }}</span></el-col>
  7. </el-row>
  8. <el-row>
  9. <el-col :span="10" class="col-txt">
  10. <span style="color: red">*</span>
  11. <span>整体计划启动日期:</span>
  12. <el-date-picker
  13. v-model="formData.startDate"
  14. size="small"
  15. type="date"
  16. value-format="yyyy-MM-dd"
  17. placeholder="请选择"
  18. />
  19. </el-col>
  20. <el-col :span="14" class="col-txt">
  21. <span style="color: red">*</span>
  22. <span>整体计划完工日期:</span>
  23. <el-date-picker
  24. v-model="formData.endDate"
  25. size="small"
  26. type="date"
  27. value-format="yyyy-MM-dd"
  28. placeholder="请选择"
  29. />
  30. </el-col>
  31. </el-row>
  32. <el-row>
  33. <el-col :span="10" class="col-txt"><span style="color: red">*</span>
  34. <span>计划内容:</span>
  35. </el-col>
  36. </el-row>
  37. </el-form>
  38. <template>
  39. <el-table
  40. :data="tableData"
  41. style="width: 100%"
  42. max-height="550"
  43. >
  44. <el-table-column
  45. prop="detailNo"
  46. label="序号"
  47. width="50"
  48. align="center"
  49. />
  50. <el-table-column
  51. prop="detailStage"
  52. label="阶段"
  53. align="center"
  54. width="130"
  55. >
  56. <template v-slot="scope">
  57. <input v-model="scope.row.detailStage" class="tableInput">
  58. </template>
  59. </el-table-column>
  60. <el-table-column
  61. prop="detailContent"
  62. label="工作内容"
  63. align="center"
  64. width="180"
  65. >
  66. <template v-slot="scope">
  67. <el-input
  68. v-model="scope.row.detailContent"
  69. type="textarea"
  70. maxlength="500"
  71. :autosize="{ minRows: 1, maxRows: 2}"
  72. placeholder="请输入内容"
  73. resize="none"
  74. />
  75. </template>
  76. </el-table-column>
  77. <el-table-column label="时间安排" align="center">
  78. <el-table-column label="启动日期" align="center">
  79. <template v-slot="scope">
  80. <div style="" class="tableDataPickBox">
  81. <el-date-picker
  82. v-model="scope.row.detailStartDate"
  83. type="date"
  84. value-format="yyyy-MM-dd"
  85. placeholder="启动日期"
  86. />
  87. </div>
  88. </template>
  89. </el-table-column>
  90. <el-table-column label="结束日期" align="center">
  91. <template v-slot="scope">
  92. <div style="" class="tableDataPickBox">
  93. <el-date-picker
  94. v-model="scope.row.detailEndDate"
  95. type="date"
  96. value-format="yyyy-MM-dd"
  97. placeholder="结束日期"
  98. />
  99. </div>
  100. </template>
  101. </el-table-column>
  102. </el-table-column>
  103. <el-table-column
  104. prop="detailDeliverable"
  105. label="交付物"
  106. align="center"
  107. width="220"
  108. >
  109. <template v-slot="scope">
  110. <input v-model="scope.row.detailDeliverable" class="tableInput">
  111. </template>
  112. </el-table-column>
  113. <el-table-column
  114. prop="detailPreNo"
  115. label="前置任务序号"
  116. align="center"
  117. width="60"
  118. >
  119. <template v-slot="scope">
  120. <input v-model="scope.row.detailPreNo" class="tableInput">
  121. </template>
  122. </el-table-column>
  123. <el-table-column
  124. prop="detailResponsible"
  125. label="负责方"
  126. align="center"
  127. width="90"
  128. >
  129. <template v-slot="scope">
  130. <input v-model="scope.row.detailResponsible" class="tableInput">
  131. </template>
  132. </el-table-column>
  133. <el-table-column
  134. prop="detailMemo"
  135. label="备注"
  136. align="center"
  137. width="180"
  138. >
  139. <template v-slot="scope">
  140. <el-input
  141. v-model="scope.row.detailMemo"
  142. type="textarea"
  143. maxlength="500"
  144. :autosize="{ minRows: 1, maxRows: 2}"
  145. placeholder="请输入内容"
  146. resize="none"
  147. />
  148. </template>
  149. </el-table-column>
  150. <el-table-column
  151. label="操作"
  152. width="100"
  153. align="center"
  154. >
  155. <template v-slot="scope">
  156. <div style="display: flex">
  157. <el-button type="primary" icon="el-icon-plus" circle @click.native.prevent="addRow(scope.$index, tableData)" />
  158. <el-button type="danger" icon="el-icon-delete" circle @click.native.prevent="deleteRow(scope.$index, tableData)" />
  159. </div>
  160. </template>
  161. </el-table-column>
  162. </el-table>
  163. </template>
  164. <div class="btnBox_xuan">
  165. <el-button type="info" @click="cancel">取消</el-button>
  166. <el-button type="primary" @click="submit">确认</el-button>
  167. </div>
  168. </div>
  169. </template>
  170. <script>
  171. export default {
  172. name: 'OverallPlan',
  173. data() {
  174. return {
  175. tableData: [],
  176. proId: '',
  177. proName: '',
  178. custId: '',
  179. custName: '',
  180. loading: false,
  181. masterPlanCheck: false,
  182. formData: {
  183. proId: '',
  184. customerId: '',
  185. startDate: '',
  186. endDate: '',
  187. detailJsonStr: ''
  188. }
  189. }
  190. },
  191. methods: {
  192. initData(obj, masterPlanCheck) {
  193. this.proId = obj.proId
  194. this.proName = obj.proName
  195. this.custId = obj.custId
  196. this.custName = obj.custName
  197. this.masterPlanCheck = masterPlanCheck
  198. if (this.masterPlanCheck) {
  199. this.getData()
  200. } else {
  201. this.formData.proId = obj.proId
  202. this.formData.customerId = obj.custId
  203. this.initTableData()
  204. }
  205. },
  206. getData() {
  207. this.loading = true
  208. this.baseRequest('getByProId', { proId: this.proId }).then(res => {
  209. if (res.data.data) {
  210. this.formData = res.data.data.formData
  211. this.tableData = res.data.data.detail || []
  212. }
  213. this.loading = false
  214. })
  215. },
  216. deleteRow(index, rows) {
  217. rows.splice(index, 1)
  218. this.handleNo()
  219. },
  220. addRow(index, rows) {
  221. this.tableData.push({
  222. detailNo: this.tableData.length + 1,
  223. detailStage: '',
  224. detailContent: '',
  225. detailStartDate: '',
  226. detailEndDate: '',
  227. detailDeliverable: '',
  228. detailPreNo: '',
  229. detailResponsible: '',
  230. detailMemo: ''
  231. })
  232. },
  233. handleNo() {
  234. for (let i = 0; i < this.tableData.length; i++) {
  235. this.tableData[i].detailNo = i + 1
  236. }
  237. },
  238. cancel() {
  239. this.$emit('sonMsg', false)
  240. },
  241. submit() {
  242. if (!this.formData.startDate) {
  243. this.$message.warning('请选择整体计划启动日期')
  244. return
  245. }
  246. if (!this.formData.startDate) {
  247. this.$message.warning('请选择整体计划完工日期')
  248. return
  249. }
  250. if (this.tableData.length < 3) {
  251. this.$message.warning('计划内容至少不少于三条')
  252. return
  253. }
  254. this.loading = true
  255. const api = this.masterPlanCheck ? 'edit' : 'add'
  256. this.formData.detailJsonStr = JSON.stringify(this.tableData)
  257. this.baseRequest(api, this.formData).then(res => {
  258. this.loading = false
  259. if (res.data.key === 200) {
  260. this.$message.success('保存成功')
  261. this.$emit('sonMsg', false)
  262. } else {
  263. this.$message.error(res.data.msg)
  264. }
  265. })
  266. },
  267. initTableData() {
  268. this.tableData = [
  269. {
  270. detailNo: 1,
  271. detailStage: '需求调研',
  272. detailContent: '依据初设边界,进一步调研需求部门工作人员、部门领导、分管领导、主要领导详细需求。',
  273. detailStartDate: '',
  274. detailEndDate: '',
  275. detailDeliverable: '《需求调研报告》、会议记录',
  276. detailPreNo: '',
  277. detailResponsible: '',
  278. detailMemo: ''
  279. },
  280. {
  281. detailNo: 2,
  282. detailStage: '需求分析与确认',
  283. detailContent: '针对需求调研内容进行整理、分析,形成需求文档,与业主方逐一确认。',
  284. detailStartDate: '',
  285. detailEndDate: '',
  286. detailDeliverable: '《需求确认书》、会议记录',
  287. detailPreNo: '',
  288. detailResponsible: '',
  289. detailMemo: ''
  290. },
  291. {
  292. detailNo: 3,
  293. detailStage: '详细设计',
  294. detailContent: '结合需求确认书,开展系统的细节设计及技术调研。',
  295. detailStartDate: '',
  296. detailEndDate: '',
  297. detailDeliverable: '原型设计稿、UI设计稿',
  298. detailPreNo: 2,
  299. detailResponsible: '',
  300. detailMemo: ''
  301. },
  302. {
  303. detailNo: 4,
  304. detailStage: '详细设计确认',
  305. detailContent: '原型设计稿及UI设计稿经业主相关方确认并修改。',
  306. detailStartDate: '',
  307. detailEndDate: '',
  308. detailDeliverable: '《需求规格书》、会议记录',
  309. detailPreNo: '',
  310. detailResponsible: '',
  311. detailMemo: ''
  312. },
  313. {
  314. detailNo: 5,
  315. detailStage: '系统开发',
  316. detailContent: '工作管理系统、公共服务系统、数据采集系统功能开发。',
  317. detailStartDate: '',
  318. detailEndDate: '',
  319. detailDeliverable: '系统工程、数据库设计',
  320. detailPreNo: 4,
  321. detailResponsible: '',
  322. detailMemo: ''
  323. },
  324. {
  325. detailNo: 6,
  326. detailStage: '系统开发',
  327. detailContent: '第三方资源购买开通。',
  328. detailStartDate: '',
  329. detailEndDate: '',
  330. detailDeliverable: '第三方资源清单及管理账号',
  331. detailPreNo: '',
  332. detailResponsible: '',
  333. detailMemo: ''
  334. },
  335. {
  336. detailNo: 7,
  337. detailStage: '系统测试',
  338. detailContent: '系统测试用例编写。',
  339. detailStartDate: '',
  340. detailEndDate: '',
  341. detailDeliverable: '测试方案',
  342. detailPreNo: 4,
  343. detailResponsible: '',
  344. detailMemo: ''
  345. },
  346. {
  347. detailNo: 8,
  348. detailStage: '系统测试',
  349. detailContent: '系统功能测试、性能测试、兼容性测试。',
  350. detailStartDate: '',
  351. detailEndDate: '',
  352. detailDeliverable: '测试报告',
  353. detailPreNo: 5,
  354. detailResponsible: '',
  355. detailMemo: ''
  356. },
  357. {
  358. detailNo: 9,
  359. detailStage: '系统初始化',
  360. detailContent: '系统初始化数据收集。',
  361. detailStartDate: '',
  362. detailEndDate: '',
  363. detailDeliverable: '系统初始化表格',
  364. detailPreNo: '',
  365. detailResponsible: '',
  366. detailMemo: ''
  367. },
  368. {
  369. detailNo: 10,
  370. detailStage: '系统初始化',
  371. detailContent: '数据初始化。',
  372. detailStartDate: '',
  373. detailEndDate: '',
  374. detailDeliverable: '系统工程',
  375. detailPreNo: '',
  376. detailResponsible: '',
  377. detailMemo: ''
  378. },
  379. {
  380. detailNo: 11,
  381. detailStage: '系统部署',
  382. detailContent: '云资源申请。',
  383. detailStartDate: '',
  384. detailEndDate: '',
  385. detailDeliverable: '',
  386. detailPreNo: '',
  387. detailResponsible: '',
  388. detailMemo: ''
  389. },
  390. {
  391. detailNo: 12,
  392. detailStage: '系统部署',
  393. detailContent: '小程序服务器IP备案。',
  394. detailStartDate: '',
  395. detailEndDate: '',
  396. detailDeliverable: '',
  397. detailPreNo: '',
  398. detailResponsible: '',
  399. detailMemo: ''
  400. },
  401. {
  402. detailNo: 13,
  403. detailStage: '系统部署',
  404. detailContent: '系统部署。',
  405. detailStartDate: '',
  406. detailEndDate: '',
  407. detailDeliverable: '',
  408. detailPreNo: 10,
  409. detailResponsible: '',
  410. detailMemo: ''
  411. },
  412. {
  413. detailNo: 14,
  414. detailStage: '系统部署',
  415. detailContent: '小程序、APP发布。',
  416. detailStartDate: '',
  417. detailEndDate: '',
  418. detailDeliverable: '',
  419. detailPreNo: '',
  420. detailResponsible: '',
  421. detailMemo: ''
  422. },
  423. {
  424. detailNo: 15,
  425. detailStage: '系统培训',
  426. detailContent: '培训物料编写、推广素材制作、用户手册制作。',
  427. detailStartDate: '',
  428. detailEndDate: '',
  429. detailDeliverable: '',
  430. detailPreNo: '',
  431. detailResponsible: '',
  432. detailMemo: ''
  433. },
  434. {
  435. detailNo: 16,
  436. detailStage: '系统培训',
  437. detailContent: '针对制定培训方案与业主达成一致。',
  438. detailStartDate: '',
  439. detailEndDate: '',
  440. detailDeliverable: '',
  441. detailPreNo: '',
  442. detailResponsible: '',
  443. detailMemo: ''
  444. },
  445. {
  446. detailNo: 17,
  447. detailStage: '系统培训',
  448. detailContent: '实施现场培训、线上培训。',
  449. detailStartDate: '',
  450. detailEndDate: '',
  451. detailDeliverable: '培训签到',
  452. detailPreNo: '',
  453. detailResponsible: '',
  454. detailMemo: ''
  455. },
  456. {
  457. detailNo: 18,
  458. detailStage: '系统试运行',
  459. detailContent: '试运行通知编写并协助业主方发布。',
  460. detailStartDate: '',
  461. detailEndDate: '',
  462. detailDeliverable: '试运行通知',
  463. detailPreNo: '',
  464. detailResponsible: '',
  465. detailMemo: ''
  466. },
  467. {
  468. detailNo: 19,
  469. detailStage: '系统试运行',
  470. detailContent: '平台试运行:协助残联内部推广、试用问题解答、问题处理及需求优化。',
  471. detailStartDate: '',
  472. detailEndDate: '',
  473. detailDeliverable: '试运行问题清单',
  474. detailPreNo: '',
  475. detailResponsible: '',
  476. detailMemo: ''
  477. }
  478. ]
  479. },
  480. baseRequest(opUrl, postData) {
  481. return this.$channel.globleRequest('ProMasterPlanController', opUrl, postData, 'team')
  482. }
  483. }
  484. }
  485. </script>
  486. <style lang="scss">
  487. .overallPlan{
  488. .col-txt{
  489. text-align: left;
  490. }
  491. .el-table tr th {
  492. background:#2F82FF;
  493. color: white;
  494. font-size: 13px;
  495. }
  496. .tableInput{
  497. width: 95%;
  498. padding: 0 10px;
  499. height: 42px;
  500. display: flex;
  501. align-items: center;
  502. border: 1px solid #CCCCCC;
  503. border-radius: 4px;
  504. font-size: 12px;
  505. color: #666666;
  506. }
  507. .el-textarea{
  508. font-size: 12px !important;
  509. }
  510. .el-textarea__inner{
  511. padding: 0 10px !important;
  512. height: 42px !important;
  513. overflow-y: hidden;
  514. }
  515. .tableDataPickBox{
  516. display: flex;
  517. align-items: center;
  518. .el-input__inner {
  519. padding-right: 10px !important;
  520. height: 42px !important;
  521. line-height: 42px !important;
  522. font-size: 12px;
  523. }
  524. }
  525. .btnBox_xuan{
  526. margin-top: 20px;
  527. display: flex;
  528. justify-content: end;
  529. }
  530. }
  531. </style>