search-history.vue 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. <template>
  2. <div class="layout-pd">
  3. <el-card shadow="hover">
  4. <div class="page-header">
  5. <el-breadcrumb separator="/">
  6. <el-breadcrumb-item :to="{ path: '/software-management' }">软件包管理</el-breadcrumb-item>
  7. <el-breadcrumb-item>历史版本记录</el-breadcrumb-item>
  8. </el-breadcrumb>
  9. <el-button
  10. type="primary"
  11. icon="ele-ArrowLeft"
  12. @click="handleBack"
  13. class="back-button"
  14. >
  15. 返回列表
  16. </el-button>
  17. </div>
  18. <el-form :model="formData.editData" ref="formRef" v-loading="formData.loading" size="default" label-width="120px">
  19. <el-row :gutter="35">
  20. <!-- 项目基本信息 -->
  21. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
  22. <el-form-item label="项目名称:" prop="projectName">
  23. <span>{{formData.editData.projectName || '暂无数据'}}</span>
  24. </el-form-item>
  25. </el-col>
  26. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
  27. <el-form-item label="项目编码:" prop="projectCode">
  28. <span>{{formData.editData.projectCode || '暂无数据'}}</span>
  29. </el-form-item>
  30. </el-col>
  31. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
  32. <el-form-item label="项目介绍:" prop="projectDescription">
  33. <span>{{formData.editData.projectDescription || '暂无数据'}}</span>
  34. </el-form-item>
  35. </el-col>
  36. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
  37. <el-form-item label="项目版本:" prop="version">
  38. <span>{{formData.editData.version || '暂无数据'}}</span>
  39. </el-form-item>
  40. </el-col>
  41. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
  42. <el-form-item label="项目上线时间:" prop="projectLaunchDate">
  43. <span>{{formData.editData.createdTime || '暂无数据'}}</span>
  44. </el-form-item>
  45. </el-col>
  46. <!-- 软件相关信息 -->
  47. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
  48. <el-form-item label="设备类型:" prop="equipmentType">
  49. <span>{{formData.editData.equipmentType || '暂无数据'}}</span>
  50. </el-form-item>
  51. </el-col>
  52. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
  53. <el-form-item label="软件类型:" prop="softwareType">
  54. <span>{{formData.editData.softwareType || '暂无数据'}}</span>
  55. </el-form-item>
  56. </el-col>
  57. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
  58. <el-form-item label="软件包名称:" prop="softwareName">
  59. <span>{{formData.editData.softwareName || '暂无数据'}}</span>
  60. </el-form-item>
  61. </el-col>
  62. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
  63. <el-form-item label="软件说明:" prop="explain">
  64. <span>{{formData.editData.explain || '暂无数据'}}</span>
  65. </el-form-item>
  66. </el-col>
  67. <!-- 统计信息 -->
  68. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
  69. <el-form-item label="下载次数:" prop="downNum">
  70. <span>{{formData.editData.numberOfDownloads || 0}}</span>
  71. </el-form-item>
  72. </el-col>
  73. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
  74. <el-form-item label="状态:" prop="state">
  75. <span>{{getStateText(formData.editData.state) || '暂无数据'}}</span>
  76. </el-form-item>
  77. </el-col>
  78. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
  79. <el-form-item label="发布时间:" prop="pubDate">
  80. <span>{{formatDate(formData.editData.pubDate) || '暂无数据'}}</span>
  81. </el-form-item>
  82. </el-col>
  83. <!-- 历史版本时间线 -->
  84. <el-col :xs="24" class="mb20">
  85. <el-form-item label="历史版本记录:">
  86. <div v-if="formData.loading">
  87. <el-skeleton :rows="5" animated></el-skeleton>
  88. </div>
  89. <div v-else-if="formData.editData.softVersions.length === 0">
  90. <el-empty description="暂无历史版本记录" />
  91. </div>
  92. <el-timeline v-else style="max-width: 100%; margin-left: 0;">
  93. <el-timeline-item
  94. v-for="(version, index) in formData.editData.softVersions"
  95. :key="index"
  96. >
  97. <el-card>
  98. <h4> {{version.version}}</h4>
  99. <p>{{version.explain || '无更新说明'}}</p>
  100. </el-card>
  101. </el-timeline-item>
  102. </el-timeline>
  103. </el-form-item>
  104. </el-col>
  105. </el-row>
  106. </el-form>
  107. </el-card>
  108. </div>
  109. </template>
  110. <script setup lang="ts">
  111. import { onMounted, reactive, ref, watch } from "vue";
  112. import { useRouter, useRoute } from "vue-router";
  113. import { ElMessage, ElEmpty, ElSkeleton, ElTimeline, ElTimelineItem, ElCard } from "element-plus";
  114. import { FormRules } from "element-plus";
  115. import { HistoricalVersionRecordDto } from "/@/api/admin/productionManagement/slelistDto";
  116. import { Api } from "/@/api/admin/productionManagement/slelist";
  117. // 路由实例
  118. const router = useRouter()
  119. const route = useRoute()
  120. /**数据对象 */
  121. const formData = reactive({
  122. loading: false,
  123. editData: {
  124. guid: 0, // 接口返回的ID(数值类型)
  125. projectName: '',
  126. projectCode: '',
  127. projectDescription: '',
  128. projectLaunchDate: '',
  129. equipmentType: '',
  130. softwareType: '',
  131. softwareName: '',
  132. version: '',
  133. explain: '',
  134. remark: '',
  135. downNum: 0,
  136. downloadUrl: '',
  137. fileName: '',
  138. state: 0,
  139. operatorTime: '',
  140. pubDate: '',
  141. createdTime: '',
  142. numberOfDownloads: 0,
  143. softVersions: []
  144. } as HistoricalVersionRecordDto,
  145. fileValue: null
  146. });
  147. /**
  148. * 移除了不必要的表单校验规则
  149. * 历史版本页面主要用于查看,无需校验逻辑
  150. */
  151. const rules = reactive<FormRules>({});
  152. /** 表单引用 */
  153. const formRef = ref();
  154. /** 页面挂载时加载数据 */
  155. onMounted(() => {
  156. // 从路由参数获取guid
  157. const guid = route.query.guid
  158. if (guid) {
  159. formData.editData.guid = Number(guid)
  160. fetchHistoricalVersion()
  161. } else {
  162. ElMessage.warning('未获取到软件包信息')
  163. router.push('/software-management')
  164. }
  165. })
  166. /** 获取历史版本数据 */
  167. const fetchHistoricalVersion = async () => {
  168. if (!formData.editData.guid) {
  169. ElMessage.warning('未获取到软件包ID');
  170. return;
  171. }
  172. formData.loading = true;
  173. try {
  174. const api = new Api();
  175. const res = await api.getHistory(formData.editData.guid);
  176. if (res.success) {
  177. formData.editData = res.data;
  178. } else {
  179. ElMessage.error(res.msg || '获取历史版本失败');
  180. }
  181. } catch (error: any) {
  182. console.error('获取历史版本数据失败', error);
  183. ElMessage.error(error.message || '获取历史版本失败');
  184. } finally {
  185. formData.loading = false;
  186. }
  187. };
  188. /** 状态码转文本 */
  189. const getStateText = (state: number): string => {
  190. const stateMap = {
  191. 0: '待发布',
  192. 1: '已发布',
  193. 2: '已失效'
  194. };
  195. return stateMap[state] || '未知状态';
  196. };
  197. /** 日期格式化 */
  198. const formatDate = (dateStr: string): string => {
  199. if (!dateStr) return '-';
  200. try {
  201. const date = new Date(dateStr);
  202. return date.toLocaleString();
  203. } catch (error) {
  204. return dateStr;
  205. }
  206. };
  207. /** 返回列表页 */
  208. const handleBack = () => {
  209. router.push('/product/softwarePackageManagement')
  210. }
  211. </script>
  212. <style scoped lang="scss">
  213. .page-header {
  214. display: flex;
  215. justify-content: space-between;
  216. align-items: center;
  217. margin-bottom: 20px;
  218. padding-bottom: 10px;
  219. border-bottom: 1px solid #eee;
  220. }
  221. .back-button {
  222. margin-top: 10px;
  223. }
  224. :deep(.el-form-item__label) {
  225. width: 120px !important;
  226. text-align: right;
  227. justify-content: flex-end;
  228. padding-right: 12px;
  229. }
  230. .el-timeline {
  231. margin-left: 20px;
  232. }
  233. .el-timeline-item {
  234. margin-bottom: 20px;
  235. }
  236. .el-card {
  237. margin-bottom: 10px;
  238. padding: 10px;
  239. }
  240. </style>