quality.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. <template>
  2. <div style="width: 100%;;display: flex;">
  3. <div style="width: 98%;margin-left: 1%;padding-top: 0.5%;" class="tab-container">
  4. <div>
  5. <div style="position: absolute;left: 80%;z-index: 1000;">
  6. <div>
  7. <el-date-picker
  8. v-model="timeYear"
  9. type="year"
  10. v-if="activeName=='third'"
  11. value-format="YYYY-MM-DD"
  12. @change="getQualityList"
  13. placeholder="请选择年份"
  14. />
  15. <el-date-picker
  16. v-model="timeMon"
  17. type="month"
  18. v-if="activeName=='second'"
  19. value-format="YYYY-MM-DD"
  20. @change="getQualityList"
  21. placeholder="请选择月份"
  22. />
  23. </div>
  24. </div>
  25. <el-tabs
  26. v-model="activeName"
  27. type="card"
  28. class="demo-tabs"
  29. @tab-change="getQualityList"
  30. >
  31. <el-tab-pane label="年" name="third"></el-tab-pane>
  32. <el-tab-pane label="月" name="second"></el-tab-pane>
  33. <el-tab-pane label="周" name="first"></el-tab-pane>
  34. </el-tabs>
  35. <el-table
  36. :data="tableData"
  37. style="width: 100%;margin-left: 0%;margin-top: -0.8%;height: 80vh;"
  38. :cell-style="{ padding:'5px' }"
  39. :header-cell-style="{fontSize: '14px',height: heightAll*0.01+'px',}"
  40. :row-style="{ fontSize: '17px',textAlign:'center'}"
  41. border >
  42. <el-table-column type="index" label="序号" width="80">
  43. <template #default="{ $index }">
  44. <div style="text-align: center;">
  45. {{ $index + 1 }}
  46. </div>
  47. </template>
  48. </el-table-column>
  49. <el-table-column prop="mdName" label="模型名称" show-overflow-tooltip width="250">
  50. </el-table-column>
  51. <el-table-column prop="statisNum" label="调用次数" show-overflow-tooltip/>
  52. <el-table-column prop="statisNumTrue" label="调用成功次数"/>
  53. <el-table-column prop="rate" label="成功率(%)">
  54. <template #default="scope">
  55. <div v-if="scope.row.rate!=null">
  56. {{ scope.row.rate }}
  57. </div>
  58. </template>
  59. </el-table-column>
  60. <el-table-column prop="rateLv" label="质量">
  61. <template #default="scope">
  62. <div style="color:#67C23A" v-if="scope.row.rateLv==='优'">
  63. {{ scope.row.rateLv }}
  64. </div>
  65. <div style="color:#67C23A" v-if="scope.row.rateLv==='良'">
  66. {{ scope.row.E6A23C }}
  67. </div>
  68. <div style="color:#909399" v-if="scope.row.rateLv==='中'">
  69. {{ scope.row.rateLv }}
  70. </div>
  71. <div style="color:#F56C6C" v-if="scope.row.rateLv==='差'">
  72. {{ scope.row.rateLv }}
  73. </div>
  74. </template>
  75. </el-table-column>
  76. </el-table>
  77. </div>
  78. <el-dialog @close="clearAdd" v-model="dialogVisible" title="" width="60%" destroy-on-close :key="tableKey">
  79. <div style="display: flex;align-items: center;">
  80. <div v-if="detailJson.rqtype==='GET'">
  81. <el-tag class="ml-2" type="warning">GET</el-tag>
  82. </div>
  83. <div v-if="detailJson.rqtype==='POST'">
  84. <el-tag class="ml-2" type="warning">POST</el-tag>
  85. </div>
  86. <div style="margin-left: 1%;">
  87. {{ detailJson.name }}:
  88. </div>
  89. <div style="margin-left: 1%;">
  90. {{ detailJson.url }}
  91. </div>
  92. </div>
  93. <el-descriptions style="margin-top: 1%;" :column="3" border>
  94. <el-descriptions-item label="接口类型">{{ detailJson.type }}</el-descriptions-item>
  95. <el-descriptions-item label="请求方式">{{ detailJson.rqtype }}</el-descriptions-item>
  96. <el-descriptions-item label="响应类型">{{ detailJson.rptype }}</el-descriptions-item>
  97. <el-descriptions-item label="服务分类">{{ detailJson.cateCode }}</el-descriptions-item>
  98. </el-descriptions>
  99. <div style="margin-top:4%;font-size: 18px;">
  100. 请求参数
  101. </div>
  102. <el-table
  103. style="margin-top: 1%;width: 98%;"
  104. :data="tableDataCan"
  105. :cell-style="{ textAlign: 'center',padding:'2px 0' }"
  106. :header-cell-style="{fontSize: '14px', textAlign: 'center'}"
  107. :row-style="{ height: heightAll*0.01+'px',fontSize: '17px',textAlign:'center' }"
  108. border >
  109. <el-table-column prop="paramCode" label="参数字段">
  110. </el-table-column>
  111. <el-table-column prop="paramName" label="参数名称">
  112. </el-table-column>
  113. <el-table-column prop="paramType" label="参数类型" width="200">
  114. </el-table-column>
  115. <el-table-column prop="paramValue" label="参数示例">
  116. </el-table-column>
  117. <el-table-column prop="paramNote" label="参数说明" show-overflow-tooltip>
  118. </el-table-column>
  119. </el-table>
  120. <div style="margin-top:4%;font-size: 18px;">
  121. 返回参数
  122. </div>
  123. <el-input readonly placeholder="" :rows="8" type="textarea" v-model="dataJsonXiang" text style="margin-top: 1%;width: 98%;" ></el-input>
  124. <template #footer>
  125. <span class="dialog-footer">
  126. <el-button type="primary" @click="dialogVisible = false">
  127. 确定
  128. </el-button>
  129. </span>
  130. </template>
  131. </el-dialog>
  132. <el-dialog @close="clearFromLev" :title="titleTest" draggable v-model="dialogVisibleLevel" width="50%" destroy-on-close :key="tableKey">
  133. <el-table
  134. style="margin-top: 1%;width: 98%;min-height: 500px;"
  135. :data="tableDataLog"
  136. :cell-style="{ textAlign: 'center',padding:'2px 0' }"
  137. :header-cell-style="{fontSize: '14px', textAlign: 'center'}"
  138. :row-style="{ height: heightAll*0.01+'px',fontSize: '17px',textAlign:'center' }"
  139. border >
  140. <el-table-column prop="createBy" label="名称">
  141. </el-table-column>
  142. <el-table-column prop="runTm" label="评价结果">
  143. </el-table-column>
  144. <el-table-column prop="execTm" label="评价状态" show-overflow-tooltip>
  145. </el-table-column>
  146. <el-table-column prop="returnData" label="评价日期" show-overflow-tooltip>
  147. </el-table-column>
  148. </el-table>
  149. <template #footer>
  150. <span class="dialog-footer">
  151. <el-button type="primary" @click="dialogVisibleLevel = false">
  152. 确定
  153. </el-button>
  154. </span>
  155. </template>
  156. </el-dialog>
  157. <el-dialog v-model="dialogVisibleDe" title="风暴潮" width="50%" @close="" destroy-on-close class="custom-dialog-bg">
  158. <el-form :key="tableKey" style="margin-top:1%;width: 100%;" :model="formJi" label-position="right"
  159. ref="formRefJi" label-width="120px" :rules="rulesJi">
  160. <el-form-item label="名称:" prop="name" style="">
  161. <el-input v-model="formAdd.intro" style="width: 40%;" resize="none" />
  162. </el-form-item>
  163. <el-row :gutter="48">
  164. <el-col :span="10">
  165. <el-form-item label="评价日期:" prop="url" style="">
  166. <el-date-picker
  167. v-model="value1"
  168. type="date"
  169. style="width: 100%"
  170. placeholder="选择日期"
  171. />
  172. </el-form-item>
  173. </el-col>
  174. <el-col :span="10">
  175. <el-form-item label="评价生效日期:" prop="url" style="">
  176. <div style="width: 100%">
  177. <el-date-picker
  178. v-model="value1"
  179. type="daterange"
  180. style="width: 100%"
  181. range-separator="-"
  182. start-placeholder="开始时间"
  183. end-placeholder="结束时间"
  184. />
  185. </div>
  186. </el-form-item>
  187. </el-col>
  188. </el-row>
  189. <el-row :gutter="48">
  190. <el-col :span="10">
  191. <el-form-item label="质量:" prop="name" style="">
  192. <el-input v-model="formAdd.intro" style="width: 100%;" resize="none" />
  193. </el-form-item>
  194. </el-col>
  195. <el-col :span="10">
  196. <el-form-item label="评分:" prop="name" style="">
  197. <el-input v-model="formAdd.intro" style="width: 100%;" resize="none" />
  198. </el-form-item>
  199. </el-col>
  200. </el-row>
  201. <el-form-item label="说明:" prop="name" style="">
  202. <el-input v-model="formAdd.intro" style="width: 40%;" resize="none" type="textarea"/>
  203. </el-form-item>
  204. </el-form>
  205. </el-dialog>
  206. </div>
  207. </div>
  208. </template>
  209. <script setup>
  210. import { getQuality } from "@/api/service/info";
  211. const timeMon = ref('')
  212. const timeYear = ref('')
  213. const activeName = ref('first')
  214. const tableData = ref ([])
  215. function getWeekRange(date = new Date()) {
  216. // 获取传入日期是本周的第几天(0是周日,1是周一,...,6是周六)
  217. const dayOfWeek = date.getDay();
  218. // 计算与本周第一天的天数差。如果今天是周日(0),则上周一需要减6天;否则减(当前星期数-1)天。
  219. const diffToMonday = dayOfWeek === 0 ? -6 : 1 - dayOfWeek;
  220. // 计算本周一的日期
  221. const monday = new Date(date);
  222. monday.setDate(date.getDate() + diffToMonday);
  223. // 计算本周日的日期(周一加6天)
  224. const sunday = new Date(monday);
  225. sunday.setDate(monday.getDate() + 6);
  226. // 格式化日期为 "YYYY-MM-DD"
  227. function formatDate(dateObj) {
  228. const year = dateObj.getFullYear();
  229. const month = String(dateObj.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需+1
  230. const day = String(dateObj.getDate()).padStart(2, '0');
  231. return `${year}-${month}-${day}`;
  232. }
  233. return {
  234. startOfWeek: formatDate(monday), // 本周开始日期 (周一)
  235. endOfWeek: formatDate(sunday) // 本周结束日期 (周日)
  236. };
  237. }
  238. function getLastDayOfMonth(firstDay) {
  239. // 从第一天字符串解析年月
  240. const [year, month] = firstDay.split('-').map(Number);
  241. // 创建下个月第一天的日期对象
  242. const nextMonthFirstDay = new Date(year, month, 1); // month是1-12,JS会自动处理跨年
  243. // 获取当月最后一天(下个月第一天减1毫秒)
  244. const lastDay = new Date(nextMonthFirstDay - 1);
  245. // 格式化输出
  246. const lastDayYear = lastDay.getFullYear();
  247. const lastDayMonth = (lastDay.getMonth() + 1).toString().padStart(2, '0');
  248. const lastDayDate = lastDay.getDate().toString().padStart(2, '0');
  249. return `${lastDayYear}-${lastDayMonth}-${lastDayDate}`;
  250. }
  251. function getLastDayOfYear(firstDay) {
  252. // 从输入字符串中提取年份
  253. const year = parseInt(firstDay.split('-')[0]);
  254. // 计算下一年度的第一天
  255. const nextYearFirstDay = new Date(year + 1, 0, 1); // 月份0代表1月
  256. // 计算本年度的最后一天(下一年第一天减去1毫秒)
  257. const lastDay = new Date(nextYearFirstDay.getTime() - 1);
  258. // 格式化为 YYYY-MM-DD
  259. const lastDayYear = lastDay.getFullYear();
  260. const lastDayMonth = String(lastDay.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需+1
  261. const lastDayDate = String(lastDay.getDate()).padStart(2, '0');
  262. return `${lastDayYear}-${lastDayMonth}-${lastDayDate}`;
  263. }
  264. const getFirstDayOfMonthShort = () => {
  265. const now = new Date();
  266. return `${now.getFullYear()}-${(now.getMonth() + 1).toString().padStart(2, '0')}-01`;
  267. };
  268. function getFirstDayOfYear() {
  269. const currentYear = new Date().getFullYear();
  270. const firstDay = new Date(currentYear, 0, 1);
  271. // 格式化为 YYYY-MM-DD
  272. const year = firstDay.getFullYear();
  273. const month = String(firstDay.getMonth() + 1).padStart(2, '0');
  274. const day = String(firstDay.getDate()).padStart(2, '0');
  275. return `${year}-${month}-${day}`;
  276. }
  277. function setDate(){
  278. timeMon.value = getFirstDayOfMonthShort()
  279. timeYear.value = getFirstDayOfYear()
  280. }
  281. function getQualityList(val){
  282. console.log('val',val)
  283. var par = {
  284. devkind:'APP',
  285. params:{
  286. beginTime:'',
  287. endTime:''
  288. }
  289. }
  290. if(activeName.value=='first'){
  291. const weekRange = getWeekRange()
  292. par.params.beginTime=weekRange.startOfWeek
  293. par.params.endTime=weekRange.endOfWeek
  294. getQuality(par).then((res)=>{
  295. tableData.value=res.data
  296. })
  297. }else if(activeName.value=='second'){
  298. par.params.beginTime=timeMon.value
  299. par.params.endTime=getLastDayOfMonth(timeMon.value)
  300. getQuality(par).then((res)=>{
  301. tableData.value=res.data
  302. })
  303. }else if(activeName.value=='third'){
  304. par.params.beginTime=timeYear.value
  305. par.params.endTime=getLastDayOfYear(timeYear.value)
  306. getQuality(par).then((res)=>{
  307. tableData.value=res.data
  308. })
  309. }
  310. }
  311. onMounted(() => {
  312. setDate()
  313. getQualityList();
  314. });
  315. </script>
  316. <style scoped>
  317. </style>