You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

265 lines
9.8 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. <template>
  2. <section class="padding">
  3. <el-row :class="{'row-box':true,'cfg':isRptCfg}">
  4. <div class="rpt-title">{{ rawDatas.name }}</div>
  5. <el-input class="input" v-model="rawDatas.name" placeholder="计划名称"/>
  6. </el-row>
  7. <el-row :class="{'row-box':true,'cfg':isRptCfg}">
  8. <div class="title">{{ title?title:'报告概览' }}</div>
  9. <el-input class="input" v-model="title" placeholder="报告概览"/>
  10. </el-row>
  11. <el-row ref="table">
  12. <el-row class="box">
  13. <el-col :span="6" class="box-red">
  14. <div class="box-info">
  15. <div class="num">{{rawDatas.totalCases?rawDatas.totalCases:'0'}}</div>
  16. <div class="label">用例数</div>
  17. </div>
  18. </el-col>
  19. <el-col :span="6" class="box-blue">
  20. <div class="box-info">
  21. <div class="num">{{caseFuGaiLv}}%</div>
  22. <div class="label">用例覆盖率</div>
  23. </div>
  24. </el-col>
  25. <el-col :span="6" class="box-green">
  26. <div class="box-info">
  27. <div class="num">{{caseTongGuoLv}}%</div>
  28. <div class="label">用例通过率</div>
  29. </div>
  30. </el-col>
  31. <el-col :span="6" class="box-orange">
  32. <div class="box-info">
  33. <div class="num">{{rawDatas.bugCnt?rawDatas.bugCnt:0}}</div>
  34. <div class="label">缺陷数</div>
  35. </div>
  36. </el-col>
  37. </el-row>
  38. <!--编辑界面 XmTestPlan 测试计划-->
  39. <el-form :model="rawDatas" label-width="120px" :rules="rawDatasRules" ref="rawDatasRef" label-position="left">
  40. <el-row class="padding">
  41. <el-col :span="8">
  42. <mdp-select-user-xm label="负责人" userid-key="cuserid" username-key="cusername" v-model="rawDatas"></mdp-select-user-xm>
  43. </el-col>
  44. <el-col :span="8">
  45. <mdp-select-dict-x label="状态" :dict="dicts['testPlanStatus']" v-model="rawDatas.status"></mdp-select-dict-x>
  46. </el-col>
  47. <el-col :span="8">
  48. <mdp-select-dict-x label="测试结果" :dict="dicts['testPlanTcode']" v-model="rawDatas.tcode"></mdp-select-dict-x>
  49. </el-col>
  50. </el-row>
  51. <el-form-item label="归属测试库" prop="casedbName">
  52. {{rawDatas.casedbName}}
  53. </el-form-item>
  54. <el-form-item label="归属项目" prop="projectId">
  55. <span v-if="opType=='add'">
  56. <xm-project-select v-if="!selProject || !selProject.id" ref="xmProjectSelect" :link-product-id="xmTestCasedb? xmTestCasedb.productId:null" @row-click="onPorjectConfirm" :auto-select="false">
  57. <span slot="title">选择项目</span>
  58. </xm-project-select>
  59. <div v-else>{{rawDatas.projectName}}</div>
  60. </span>
  61. <div v-else>{{rawDatas.projectName}}</div>
  62. </el-form-item>
  63. <el-form-item label="归属产品" prop="productName">
  64. {{rawDatas.productName}}
  65. </el-form-item>
  66. <el-form-item label="起止时间" prop="stime">
  67. <mdp-date-range :auto-default="false" placeholder="选择日期" v-model="rawDatas" start-key="stime" end-key="etime" value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd" ></mdp-date-range>
  68. </el-form-item>
  69. </el-form>
  70. </el-row>
  71. <el-row class="padding-bottom">
  72. <span>报告总结</span>
  73. </el-row>
  74. <el-row>
  75. <el-input type="textarea" :rows="8" v-model="rawDatas.summaryRemark"></el-input>
  76. </el-row>
  77. <el-row v-if="rawDatas.summaryRemark!==rawDatasBak.summaryRemark" >
  78. <span style="float:right;">
  79. <el-button type="primary" @click.native="editSomeFields(rawDatas,'summaryRemark',rawDatas.summaryRemark)">提交</el-button>
  80. </span>
  81. </el-row>
  82. </section>
  83. </template>
  84. <script>
  85. import util from '@/common/js/util';//全局公共库
  86. import config from "@/common/config"; //全局公共库import
  87. import { initDicts, addXmTestPlan,editXmTestPlan,editSomeFieldsXmTestPlan } from '@/api/xm/core/xmTestPlan';
  88. import { mapGetters } from 'vuex'
  89. import XmProjectSelect from '@/views/xm/core/components/XmProjectSelect';
  90. import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修改界面
  91. export default {
  92. name:'xmTestPlanEdit',
  93. components: {
  94. XmProjectSelect,MdpSelectUserXm,
  95. },
  96. computed: {
  97. ...mapGetters([ 'userInfo' ]),
  98. caseFuGaiLv(){
  99. if(!this.rawDatas.totalCases){
  100. return 0
  101. }
  102. var okCases=parseInt(this.rawDatas.okCases>0?this.rawDatas.okCases:0)
  103. var errCases=parseInt(this.rawDatas.errCases>0?this.rawDatas.errCases:0)
  104. var igCases=parseInt(this.rawDatas.igCases>0?this.rawDatas.igCases:0)
  105. var blCases=parseInt(this.rawDatas.blCases>0?this.rawDatas.blCases:0)
  106. var totalExecs=okCases+errCases+igCases+blCases
  107. var rate=parseInt(totalExecs/this.rawDatas.totalCases*100)
  108. return rate;
  109. },
  110. caseTongGuoLv(){
  111. if(!this.rawDatas.totalCases){
  112. return 0
  113. }
  114. var okCases=parseInt(this.rawDatas.okCases>0?this.rawDatas.okCases:0)
  115. var errCases=parseInt(this.rawDatas.errCases>0?this.rawDatas.errCases:0)
  116. var igCases=parseInt(this.rawDatas.igCases>0?this.rawDatas.igCases:0)
  117. var blCases=parseInt(this.rawDatas.blCases>0?this.rawDatas.blCases:0)
  118. var totalExecs=okCases+igCases
  119. var rate=parseInt(totalExecs/this.rawDatas.totalCases*100)
  120. return rate;
  121. }
  122. },
  123. props:['xmTestPlan','visible','opType','selProject','xmTestCasedb','rptDatas','isRptCfg'],
  124. watch: {
  125. 'xmTestPlan':function( xmTestPlan ) {
  126. if(xmTestPlan){
  127. this.rawDatas = {...xmTestPlan};
  128. }
  129. },
  130. 'visible':function(visible) {
  131. if(visible==true){
  132. this.initData()
  133. }
  134. }
  135. },
  136. data() {
  137. return {
  138. title:'',
  139. remark:'',
  140. currOpType:'add',//add/edit
  141. load:{ list: false, edit: false, del: false, add: false },//查询中...
  142. dicts:{
  143. testPlanStatus:[],
  144. testPlanTcode:[],
  145. },//下拉选择框的所有静态数据 params={categoryId:'all',itemCodes:['sex']} 返回结果 {sex: [{id:'1',name:'男'},{id:'2',name:'女'}]}
  146. rawDatasRules: {
  147. },
  148. rawDatas: {
  149. id:'',name:'',casedbId:'',casedbName:'',projectId:'',projectName:'',cuserid:'',cusername:'',ctime:'',stime:'',etime:'',status:'',tcode:'',totalCases:'',okCases:'',errCases:'',igCases:'',blCases:'',productId:'',productName:'',flowState:'',summaryRemark:''
  150. },
  151. rawDatasBak: {
  152. id:'',name:'',casedbId:'',casedbName:'',projectId:'',projectName:'',cuserid:'',cusername:'',ctime:'',stime:'',etime:'',status:'',tcode:'',totalCases:'',okCases:'',errCases:'',igCases:'',blCases:'',productId:'',productName:'',flowState:'',summaryRemark:''
  153. },
  154. maxTableHeight:300,
  155. summaryRemarkEditVisible:false,
  156. }//end return
  157. },//end data
  158. methods: {
  159. ...util,
  160. // 取消按钮点击 父组件监听@cancel="rawDatasVisible=false" 监听
  161. handleCancel:function(){
  162. this.$refs['rawDatasRef'].resetFields();
  163. this.$emit('cancel');
  164. },
  165. //新增、编辑提交XmTestPlan 测试计划父组件监听@submit="afterEditSubmit"
  166. saveSubmit: function () {
  167. this.$refs.rawDatasRef.validate((valid) => {
  168. if (valid) {
  169. this.$confirm('确认提交吗?', '提示', {}).then(() => {
  170. this.load.edit=true
  171. let params = Object.assign({}, this.rawDatas);
  172. var func=addXmTestPlan
  173. if(this.currOpType=='edit'){
  174. func=editXmTestPlan
  175. }
  176. func(params).then((res) => {
  177. this.load.edit=false
  178. var tips=res.data.tips;
  179. if(tips.isOk){
  180. this.rawDatas=res.data.data
  181. this.initData()
  182. this.currOpType="edit";
  183. this.$emit('submit');// @submit="afterAddSubmit"
  184. }
  185. this.$notify({ position:'bottom-left',showClose:true, message: tips.msg, type: tips.isOk?'success':'error' });
  186. }).catch( err =>this.load.edit=false);
  187. });
  188. }else{
  189. this.$notify({ showClose:true, message: "表单验证不通过,请修改表单数据再提交", type: 'error' });
  190. }
  191. });
  192. },
  193. initData: function(){
  194. if(this.xmTestPlan){
  195. this.rawDatas = Object.assign({},this.xmTestPlan);
  196. }
  197. if(this.rptDatas){
  198. this.rawDatas=Object.assign({},this.rptDatas)
  199. }
  200. this.rawDatasBak={...this.rawDatas}
  201. },
  202. editSomeFields(row,fieldName,$event){
  203. if(this.opType=='add'){
  204. return;
  205. }
  206. let params={};
  207. params['ids']=[row].map(i=>i.id)
  208. if(fieldName=='stime'){
  209. params[fieldName]=$event.stime
  210. params.etime=$event.etime
  211. }else if(fieldName=='cuserid'){
  212. params[fieldName]=$event[0].userid
  213. params.cusername=$event[0].username
  214. }else{
  215. params[fieldName]=$event
  216. }
  217. var func = editSomeFieldsXmTestPlan
  218. func(params).then(res=>{
  219. let tips = res.data.tips;
  220. if(tips.isOk){
  221. this.rawDatasBak=[...this.rawDatas]
  222. this.$emit('edit-fields',params)
  223. }else{
  224. Object.assign(this.rawDatas,this.rawDatasBak)
  225. this.$notify({position:'bottom-left',showClose:true,message:tips.msg,type:tips.isOk?'success':'error'})
  226. }
  227. }).catch((e)=>Object.assign(this.rawDatas,this.rawDatasBak))
  228. },
  229. onPorjectConfirm(row){
  230. this.rawDatas.projectId=row.id
  231. this.rawDatas.projectName=row.name
  232. this.rawDatas.name=this.rawDatas.projectName+'-测试计划-V1.0'
  233. },
  234. sizeAutoChange(){
  235. }
  236. },//end method
  237. mounted() {
  238. this.$nextTick(() => {
  239. initDicts(this);
  240. this.initData()
  241. this.maxTableHeight = util.calcTableMaxHeight(this.$refs.table.$el)
  242. });
  243. }
  244. }
  245. </script>
  246. <style lang="scss" scoped>
  247. @import url('../index/overview.scss');
  248. </style>