UploadTrainingVideo.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. <template>
  2. <div>
  3. <Navbar title="上传操作视频" :is-go-back="true" />
  4. <div class="flex-header">
  5. <div class="form-inline">
  6. <div class="form-group">
  7. <label for="maintenanceSheetName">保养表单名称</label>
  8. <input
  9. v-model="maintenanceSheetName" autocomplete="off" class="form-control" placeholder="保养表单名称" aria-describedby="basic-addon1"
  10. @keyup.enter="getDatas"
  11. />
  12. </div>
  13. <div class="form-group">
  14. <label for="maintenanceName">保养项目名称</label>
  15. <input
  16. v-model="maintenanceName" autocomplete="off" class="form-control" placeholder="保养项目名称" aria-describedby="basic-addon1"
  17. @keyup.enter="getDatas"
  18. />
  19. </div>
  20. <div class="form-group">
  21. <a-button type="primary" @click="getDatas">查询</a-button>
  22. </div>
  23. </div>
  24. </div>
  25. <a-table
  26. :columns="columns" :data-source="maintenanceDetails"
  27. :scroll="{ y: 400 }" :pagination="pagination"
  28. >
  29. <template #bodyCell="{ column,record }">
  30. <template v-if="column.dataIndex === 'uploadVideo'">
  31. <a-button type="primary" @click="showModel(record.key)">上传视频</a-button>
  32. </template>
  33. </template>
  34. </a-table>
  35. <Modal ref="modal" v-model:show="showModal" :full="true">
  36. <div>
  37. <label for="exampleInputFile" class="label-btn">
  38. 上传视频
  39. </label>
  40. <input id="exampleInputFile" autocomplete="off" type="file" class="inputfile" @change="uploadFile" />
  41. </div>
  42. <hr />
  43. <div class="row">
  44. <div v-for="item,index in videoSrcs" :key="index" style="display: table-cell" class="col-xs-3 col-sm-3 col-md-2 col-lg-2">
  45. <div v-if="item != undefined" class="file-div">
  46. <div class="file-image-div">
  47. <div class="fa fa-file-o my-icon" />
  48. <div class="clearfix" />
  49. </div>
  50. <div class="attachment-label">{{ item }}</div>
  51. <div class="clearfix" />
  52. </div>
  53. <div>
  54. <a role="button" style="display:inline;" class="btn btn-link btn-sm" @click="download(item)">
  55. <i class="fa fa-download" /> &nbsp;下载
  56. </a>
  57. <a role="button" style="display:inline;" class="btn btn-link btn-sm" @click="deleteVideo(index)">
  58. <i class="fa fa-trash-o" /> &nbsp;删除
  59. </a>
  60. </div>
  61. </div>
  62. </div>
  63. <template #header>上传&预览文件</template>
  64. </Modal>
  65. <Loading v-if="loading" />
  66. </div>
  67. </template>
  68. <script>
  69. import Common from '../common/Common.js';
  70. import { SqlApi } from 'pc-component-v3';
  71. import { Notify } from 'pc-component-v3';
  72. import DownloadService from '../common/DownloadService.js';
  73. import MaintenanceSheetLineResource from '../api/pad/MaintenanceSheetLineResource.js';
  74. export default {
  75. components: {
  76. DownloadService,
  77. MaintenanceSheetLineResource,
  78. },
  79. data: function() {
  80. return {
  81. pagination: {
  82. pageNo: 1,
  83. pageSize: 20, // 默认每页显示数量
  84. showSizeChanger: true, // 显示可改变每页数量
  85. pageSizeOptions: ['10', '20', '50', '100'], // 每页数量选项
  86. showTotal: total => `共 ${total} 条`, // 显示总数
  87. onShowSizeChange: (current, pageSize) => this.onSizeChange(current, pageSize), // 改变每页数量时更新显示
  88. onChange: (page, pageSize) => this.onPageChange(page, pageSize), //点击页码事件
  89. total: 0, //总条数
  90. },
  91. inventoryInstanceStwc: [],
  92. maintenanceDetails: [],
  93. className: 'com.leanwo.prodog.model.pad.MaintenanceSheetLine',
  94. videoSrcs: [],
  95. videoList: '',
  96. maintenanceSheetLineId: undefined,
  97. showModal: false,
  98. loading: false,
  99. columns: [{
  100. title: '上传视频',
  101. dataIndex: 'uploadVideo',
  102. width: 180,
  103. },
  104. {
  105. title: '保养表单名称',
  106. dataIndex: 'maintenanceSheetName',
  107. width: 200,
  108. }, {
  109. title: '保养项目名称',
  110. dataIndex: 'maintenanceName',
  111. width: 200,
  112. },
  113. ],
  114. };
  115. },
  116. mounted: function() {
  117. this.getDatas();
  118. },
  119. methods: {
  120. onPageChange: function(page, pageSize) {
  121. this.pagination.pageNo = page;
  122. this.getDatas();
  123. },
  124. onSizeChange: function(current, pageSize) {
  125. this.pagination.pageNo = 1;
  126. this.pagination.pageSize = pageSize;
  127. this.getDatas();
  128. },
  129. showModel: function(id) {
  130. var _self = this;
  131. _self.maintenanceSheetLineId = id;
  132. this.showModal = true;
  133. _self.viewFlie();
  134. },
  135. /**
  136. * 修改每页显示的数量
  137. * @param {Object} newPageSize
  138. */
  139. gridSizeSelect: function(newPageSize) {
  140. this.pagination.per_page = newPageSize;
  141. this.page = newPageSize;
  142. this.pagination.current_page = 1;
  143. // 刷新界面
  144. this.getDatas();
  145. },
  146. getDatas: function() {
  147. var _self = this;
  148. _self.maintenanceDetails = [];
  149. var param = {
  150. maintenanceName: _self.maintenanceName,
  151. maintenanceSheetName: _self.maintenanceSheetName,
  152. start: (_self.pagination.pageNo - 1) * _self.pagination.pageSize,
  153. length: _self.pagination.pageSize,
  154. };
  155. SqlApi.execute('20221104_135826', param).then(
  156. successData => {
  157. console.log(successData);
  158. if (successData.errorCode == 0) {
  159. successData.dataList.forEach(function(item) {
  160. var maintenanceSheetLine = {
  161. key: item.id,
  162. maintenanceName: item.maintenanceName,
  163. criteria: item.criteria,
  164. inspectionName: item.inspectionName,
  165. maintenanceSheetName: item.maintenanceSheetName,
  166. };
  167. _self.maintenanceDetails.push(maintenanceSheetLine);
  168. });
  169. _self.pagination.total = successData.total;
  170. console.log(_self.maintenanceDetails);
  171. } else {
  172. Notify.error(
  173. '查询保养表单明细信息异常',
  174. successData.errorMessage,
  175. true,
  176. );
  177. }
  178. },
  179. errorData => {
  180. Common.processException(errorData);
  181. },
  182. );
  183. },
  184. /**
  185. * 查看下载的文件
  186. * @param {Object} item
  187. * @author GuoZhiBo 20210107
  188. */
  189. viewFlie: function() {
  190. var _self = this;
  191. _self.queryVideoListById(_self.maintenanceSheetLineId);
  192. },
  193. queryVideoListById: function(maintenanceSheetLineId) {
  194. var _self = this;
  195. MaintenanceSheetLineResource.queryVideoListById(maintenanceSheetLineId).then(successData => {
  196. console.log(successData);
  197. if (successData.errorCode == 0) {
  198. _self.videoList = successData.data;
  199. _self.videoSrcs = [];
  200. if (_self.videoList != undefined && _self.videoList.length > 0) {
  201. if (_self.videoList.indexOf(',') == -1) {
  202. _self.videoSrcs.push(_self.videoList);
  203. } else {
  204. _self.videoSrcs = _self.videoList.split(',');
  205. }
  206. }
  207. console.log(_self.videoSrcs);
  208. }
  209. }, errorData => {
  210. Common.processException(errorData);
  211. });
  212. },
  213. /**
  214. * 上传文件
  215. */
  216. uploadFile: function(event) {
  217. var _self = this;
  218. let fileList = event.target.files;
  219. var selectedFile = null;
  220. if (fileList.length > 0) {
  221. selectedFile = fileList[0];
  222. }
  223. if (selectedFile == null) {
  224. return;
  225. }
  226. var formData = new FormData();
  227. formData.append('file', selectedFile);
  228. formData.append('className', _self.className);
  229. _self.loading = true;
  230. var attachments = [];
  231. $.ajax({
  232. url: Common.getApiURL('file/multipleAttachmentUpload'),
  233. type: 'post',
  234. beforeSend: function(request) {
  235. Common.addTokenToRequest(request);
  236. },
  237. data: formData,
  238. contentType: false,
  239. processData: false,
  240. success: function(data) {
  241. _self.loading = false;
  242. if (data.success) {
  243. var fileNames = data.fileNames;
  244. if (fileNames != undefined && fileNames.length > 0) {
  245. fileNames.forEach(function(item) {
  246. attachments.push(item.nameAfterSave);
  247. _self.saveFile(attachments);
  248. });
  249. console.log(fileNames);
  250. }
  251. }
  252. },
  253. error: function(XMLHttpRequest, textStatus, errorThrown) {
  254. _self.loading = false;
  255. Common.processException(XMLHttpRequest, textStatus, errorThrown);
  256. },
  257. });
  258. },
  259. /**
  260. * 保存视频地址
  261. */
  262. saveFile: function(fileNames) {
  263. var _self = this;
  264. var videoSrcs = [];
  265. if (_self.videoList != undefined && _self.videoList.length > 0) {
  266. if (_self.videoList.indexOf(',') == -1) {
  267. videoSrcs.push(_self.videoList);
  268. } else {
  269. videoSrcs = _self.videoList.split(',');
  270. }
  271. }
  272. videoSrcs.push(fileNames);
  273. var videoListStr = videoSrcs.join(',');
  274. var maintenanceSheetLineDto = {
  275. maintenanceSheetLineId: _self.maintenanceSheetLineId,
  276. videoListStr: videoListStr,
  277. };
  278. if (maintenanceSheetLineDto != null) {
  279. MaintenanceSheetLineResource.saveFile(maintenanceSheetLineDto).then(successData => {
  280. console.log(successData);
  281. if (successData.errorCode == 0 && successData.data != null) {
  282. _self.viewFlie();
  283. }
  284. }, errorData => {
  285. Common.processException(errorData);
  286. });
  287. } else {
  288. Common.showDialog('提示', '请选择要保存的单据', 'error');
  289. }
  290. },
  291. /**
  292. * 下载附件
  293. * @param {Object} item
  294. * @author LiangZhiCheng 20220920
  295. */
  296. download: function(item) {
  297. var _self = this;
  298. var url = Common.getApiURL('file/fileDownload') + '?className=' + _self.className
  299. + '&fileName=' + window.encodeURIComponent(item);
  300. var a = document.createElement('a');
  301. a.setAttribute('href',url);
  302. a.setAttribute('download',item);
  303. a.click();
  304. },
  305. /**
  306. * 删除视频
  307. *@author LiangZhiCheng 20220920
  308. */
  309. deleteVideo(index) {
  310. var _self = this;
  311. _self.videoSrcs.splice(index, 1);
  312. _self.saveFileVideo();
  313. Common.showDialog('提示', '删除成功', 'success');
  314. },
  315. saveFileVideo: function() {
  316. var _self = this;
  317. var videoListStr = _self.videoSrcs.join(',');
  318. var maintenanceSheetlineDto = {
  319. maintenanceSheetLineId: _self.maintenanceSheetLineId,
  320. videoListStr: videoListStr,
  321. };
  322. if (maintenanceSheetlineDto != null) {
  323. MaintenanceSheetLineResource.saveFile(maintenanceSheetlineDto).then(successData => {
  324. if (successData.errorCode == 0 && successData.data != null) {
  325. _self.viewFlie();
  326. }
  327. }, errorData => {
  328. Common.processException(errorData);
  329. });
  330. } else {
  331. Common.showDialog('提示', '请选择要删除的单据', 'error');
  332. }
  333. },
  334. },
  335. };
  336. </script>
  337. <style scoped>
  338. .flex-container {
  339. display: flex;
  340. /* 垂直*/
  341. flex-direction: column;
  342. width: 100%;
  343. /*视口被均分为100单位的vh 占据整个窗口,扣掉顶部topNav的距离后,计算得到container的高度*/
  344. height: calc(100vh - 150px);
  345. }
  346. .flex-content {
  347. flex: 1;
  348. overflow: scroll;
  349. width: 100%;
  350. height: 0;
  351. }
  352. .fixed-table {
  353. table-layout: fixed;
  354. width: 800px !important;
  355. min-width: 800px !important;
  356. }
  357. table.fixed-table tr {
  358. height: 40px;
  359. }
  360. table.fixed-table th,
  361. table.fixed-table td {
  362. overflow: hidden;
  363. white-space: nowrap;
  364. text-overflow: ellipsis;
  365. }
  366. .flex-header {
  367. height: 80px;
  368. /*放大缩小比例为0 */
  369. flex: 0 0 100px;
  370. }
  371. .flex-footer {
  372. margin-top: 0.8em;
  373. height: 35px;
  374. /*放大缩小比例为0 */
  375. flex: 0 0 35px;
  376. }
  377. .form-inline .form-group button {
  378. width: 250px;
  379. text-align: center;
  380. margin: 30px;
  381. }
  382. .form-inline .form-group label {
  383. width: 100px;
  384. text-align: right;
  385. padding-right: 5px;
  386. }
  387. .form-inline .form-group input,
  388. .form-inline .form-group select {
  389. width: 200px;
  390. }
  391. .file-image-div {
  392. width: 150px;
  393. height: 120px;
  394. text-align: center;
  395. }
  396. .my-icon {
  397. font-size: 100px !important;
  398. padding: 10px;
  399. }
  400. .attachment-label {
  401. overflow: hidden;
  402. white-space: nowrap;
  403. text-overflow: ellipsis;
  404. font-size: small;
  405. max-width: 150px;
  406. }
  407. .attachment-label:hover {
  408. text-overflow: inherit;
  409. overflow: visible;
  410. }
  411. </style>