TestingPreview.vue 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. <template>
  2. <!-- 预览提测报告 -->
  3. <div class="parent-style">
  4. <div class="backStyle"> 邮件列表</div>
  5. <div class="Layout_space_between" style="margin-bottom: 10px;">
  6. <div class="div1">收件人</div>
  7. <searchTeam :value.sync="form.name" :clearable="true" :multiple="true" style="width:100%" />
  8. </div>
  9. <div class="Layout_space_between">
  10. <div class="div1">抄送</div>
  11. <searchTeam :value.sync="form.names" :clearable="true" :multiple="true" style="width:100%" />
  12. </div>
  13. <span class="backStyle"> 关联任务</span>
  14. <div v-for="(item, index) in fromCreateData.taskDetailList" :key="index" class="Layout_flex_start report-taskList">
  15. <span>{{ item.taskId }}</span>
  16. <span>{{ item.name }}</span>
  17. </div>
  18. <div class="backStyle"> 报告预览</div>
  19. <div id="repot-list">
  20. <div class="Layout_space_between" style="border-bottom: 0.5px solid #eee;margin-bottom: 15px;">
  21. <div class="report-tit">{{ fromCreateData.reportName }}</div>
  22. <div>报告人:{{ userNames }}</div>
  23. </div>
  24. <el-row>
  25. <el-col :span="12" class="Layout_space_between">
  26. <span class="parent-style">计划提测时间:<span class="spanColor">{{ fromCreateData.deliverTestPlanTime }}</span></span>
  27. </el-col>
  28. <el-col :span="12">
  29. <span class="parent-style">实际提测时间:<span class="spanColor">{{ fromCreateData.deliverTestActualTime }}</span></span>
  30. </el-col>
  31. </el-row>
  32. <el-row v-if="fromCreateData.deliverTestPlanTime < fromCreateData.deliverTestActualTime ">
  33. <el-col :span="24" class="Layout_space_between">
  34. <span class="parent-style">提测延期原因 : <span class="spanColor">{{ fromCreateData.delayReason }}</span></span>
  35. </el-col>
  36. </el-row>
  37. <el-row>
  38. <el-col :span="12" class="Layout_space_between">
  39. <span class="parent-style">计划开发时间:<span class="spanColor">{{ fromCreateData.devPlanTimeStart !== null ? fromCreateData.devPlanTimeStart + '至' + fromCreateData.devPlanTimeEnd : '' }}</span></span>
  40. </el-col>
  41. <el-col :span="12" class="Layout_space_between">
  42. <span class="parent-style">实际开发时间:<span class="spanColor">{{ fromCreateData.devActualTimeStart !== null ? fromCreateData.devActualTimeStart + '至' + fromCreateData.devActualTimeEnd : '' }}</span></span>
  43. </el-col>
  44. </el-row>
  45. <el-row>
  46. <el-col :span="12" class="Layout_space_between">
  47. <span class="parent-style">是否跟版:<span class="spanColor">{{ fromCreateData.followVersion === 2 ? '否' : '是' }} </span></span>
  48. </el-col>
  49. <el-col v-if="fromCreateData.followVersion === 1" :span="12" class="Layout_space_between">
  50. <span class="parent-style">跟版客户端:<span class="spanColor">{{ fromCreateData.involveAppString }}</span></span>
  51. </el-col>
  52. </el-row>
  53. <el-row>
  54. <el-col :span="12" class="Layout_space_between">
  55. <span class="parent-style">CodeReview:<span class="spanColor">{{ fromCreateData.isCodeReview === 0 ? '否' : '是' }}</span></span>
  56. </el-col>
  57. <el-col v-if="fromCreateData.isCodeReview === 1" :span="12" class="Layout_space_between">
  58. <div class="parent-style">执行人:
  59. <span v-for="(item, index) in fromCreateData.codeReviewExecutorObject" :key="index">
  60. <span class="spanColor">{{ item.name }}</span>
  61. <span v-if="index < fromCreateData.codeReviewExecutorObject.length - 1">,</span>
  62. </span>
  63. </div>
  64. </el-col>
  65. </el-row>
  66. <module-code :data="fromCreateData" />
  67. <div class="backStyle">需求列表</div>
  68. <el-table
  69. :data="tableData"
  70. border
  71. size="mini"
  72. :header-cell-style="{ backgroundColor: 'rgba(241,241,241,1)', color: 'rgba(51,59,74,1)', fontSize: '14px', fontWeight: '400'}"
  73. style="width: 100%; margin-bottom: 20px;"
  74. >
  75. <el-table-column prop="name" label="需求" min-width="250">
  76. <template slot-scope="scope">
  77. <span class="didi-hover" @click="goRequired(scope.row.id)">{{ scope.row.name }}</span>
  78. </template>
  79. </el-table-column>
  80. <el-table-column prop="priorityName" label="优先级" min-width="100" />
  81. <el-table-column label="PM" min-width="100">
  82. <template slot-scope="scope">
  83. <span class="didi-hover">{{ scope.row.pmMemberInfoResponse.name }}</span>
  84. </template>
  85. </el-table-column>
  86. <el-table-column prop="referredClientTypeName" label="跟版客户端" min-width="90" />
  87. </el-table>
  88. <div ref="rich" v-html="fromCreateData.content" />
  89. </div>
  90. </div>
  91. </template>
  92. <script>
  93. import { EncryptId } from '@/utils/crypto-js.js'
  94. import { mapGetters } from 'vuex'
  95. import html2canvas from 'html2canvas'
  96. import searchTeam from '@/components/select/searchTeam'
  97. import moduleCode from '@/views/reportManagement/components/template/nodule.vue'
  98. import { reportdelivertestGetReportById, reportdelivertestSendmail, reportdelivertestGetRequiresByTaskIds } from '@/api/reportTemplate' // 模版添删改查
  99. export default {
  100. name: 'DailyNewsAdded',
  101. components: {
  102. searchTeam,
  103. moduleCode
  104. },
  105. props: {
  106. dailyId: { type: [String, Number], default: null }
  107. },
  108. data() {
  109. return {
  110. form: {}, // 发送报告content
  111. userNames: localStorage.getItem('realname'),
  112. fromCreateData: {}, // listAll
  113. tasksOptions: [], // 任务下拉选项
  114. tasksDetailList: [], // 已有任务项目
  115. taskid_arr: [], // taskIds
  116. moduleId: '', // 模块id
  117. tableData: [],
  118. daily_Id: '' // daily_Id
  119. }
  120. },
  121. computed: {
  122. ...mapGetters(['bizId'])
  123. },
  124. watch: {
  125. dailyId: {
  126. handler(newV) {
  127. this.daily_Id = newV
  128. this.reportdelivertestGetReportById(newV)
  129. },
  130. immediate: true
  131. }
  132. },
  133. methods: {
  134. async reportdelivertestGetReportById(val) { // 获取提测报告数据
  135. const res = await reportdelivertestGetReportById(val)
  136. if (res.code === 200) {
  137. this.fromCreateData = res.data
  138. if (res.data.sendTo) {
  139. this.$set(this.form, 'name', [res.data.sendTo])
  140. }
  141. if (res.data.sendCc) {
  142. this.$set(this.form, 'names', [res.data.sendCc])
  143. }
  144. this.reportdelivertestGetRequiresByTaskIds(this.fromCreateData.taskIds)
  145. }
  146. },
  147. async reportdelivertestGetRequiresByTaskIds(val) {
  148. const res2 = await reportdelivertestGetRequiresByTaskIds({ taskIds: val })
  149. if (res2.code === 200) {
  150. this.tableData = res2.data
  151. }
  152. },
  153. goRequired(id) {
  154. const bizId_id = EncryptId(`${this.bizId}_${id}`)
  155. this.$router.push({ name: '需求详情', query: { bizId_id: bizId_id }})
  156. },
  157. sendReport() {
  158. if (this.form.name !== undefined) {
  159. setTimeout(() => {
  160. html2canvas(document.getElementById('repot-list'), { useCORS: true }).then(canvas => {
  161. const imgData = canvas.toDataURL('image/png', 1)
  162. const sendImgData = imgData.toString().substring(imgData.indexOf(',') + 1)
  163. const postData = { 'reportId': this.daily_Id, 'imgStr': sendImgData, 'url': window.location.href, 'emailUser': this.form.name ? this.form.name.join(',') : null, 'copyTo': this.form.names ? this.form.names.join(',') : null }
  164. reportdelivertestSendmail(postData).then(res => {
  165. res.code === 200 ? this.$message.success('报告发送中,请稍后进行邮件查收!') : this.$message.error('发送测试日报失败,请联系管理员!')
  166. this.$emit('handleClose')
  167. })
  168. })
  169. }, 500)
  170. } else {
  171. this.$emit('loading')
  172. this.$message({ message: '请填写邮箱', type: 'error', offset: 150 })
  173. }
  174. }
  175. }
  176. }
  177. </script>
  178. <style lang="less" scoped>
  179. .parent-style {
  180. width: 100%;
  181. display: inline-block;
  182. font-size:14px;
  183. font-family:Microsoft Sans Serif;
  184. font-weight:400;
  185. line-height:22px;
  186. color:#666666;
  187. opacity:1;
  188. margin-bottom: 10px;
  189. .spanColor {
  190. color: #333333;
  191. }
  192. .report-taskList{
  193. font-size:14px;
  194. font-family:MicrosoftYaHei;
  195. line-height:17px;
  196. color:rgba(102,102,102,1);
  197. margin-top: 10px;
  198. opacity:1;
  199. }
  200. }
  201. .div1 {
  202. width: 60px;
  203. font-size: 14px;
  204. font-family: MicrosoftYaHei;
  205. color: rgba(51, 51, 51, 1);
  206. line-height: 19px;
  207. }
  208. .backStyle {
  209. color: #333;
  210. font-size: 14px;
  211. font-weight: bold;
  212. border-radius: 4px;
  213. margin: 10px 0;
  214. }
  215. .report-tit {
  216. font-size: 20px;
  217. font-weight: bold;
  218. border-radius: 4px;
  219. margin: 15px 0;
  220. color:#409EFF;
  221. }
  222. .report-margin {
  223. margin-bottom: 20px;
  224. }
  225. </style>
  226. <style scoped>
  227. .parent-style div >>> table {width: 100% !important;}
  228. </style>