projectDetails.vue 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990
  1. <template>
  2. <div>
  3. <el-row style="height: 800px">
  4. <el-col :span="10">
  5. <el-card
  6. style="height: 100%"
  7. >
  8. <template #header>
  9. <el-row align="middle">
  10. <el-col :span="6">
  11. <el-text size="large">项目基本信息</el-text>
  12. </el-col>
  13. <el-col
  14. :span="4"
  15. :offset="14"
  16. >
  17. <el-button
  18. type="primary"
  19. :icon="Edit"
  20. @click="basicEditShow"
  21. >信息编辑
  22. </el-button>
  23. </el-col>
  24. </el-row>
  25. </template>
  26. <el-tabs
  27. v-model="activeName"
  28. class="demo-tabs"
  29. type="border-card"
  30. @tab-click="handleClick"
  31. >
  32. <el-tab-pane
  33. label="甲方信息"
  34. name="first"
  35. >
  36. <el-row class="mt-2">
  37. <el-text
  38. size="large"
  39. :line-clamp="1"
  40. >
  41. <b>项目名称:</b>{{ information.name }}
  42. </el-text>
  43. </el-row>
  44. <el-row class="mt-10">
  45. <el-text
  46. size="large"
  47. :line-clamp="1"
  48. >
  49. <b>项目地址:</b>{{ information.address }}
  50. </el-text>
  51. </el-row>
  52. <el-row class="mt-10">
  53. <el-text
  54. size="large"
  55. :line-clamp="1"
  56. >
  57. <b>甲方负责人:</b>{{ information.firstPrincipal }}
  58. </el-text>
  59. </el-row>
  60. <el-row class="mt-10">
  61. <el-text
  62. size="large"
  63. :line-clamp="1"
  64. >
  65. <b>甲方负责人电话:</b>{{ information.firstPhone }}
  66. </el-text>
  67. </el-row>
  68. </el-tab-pane>
  69. <el-tab-pane
  70. label="乙方信息"
  71. name="second"
  72. >
  73. <el-row class="mt-2">
  74. <el-text
  75. size="large"
  76. :line-clamp="1"
  77. >
  78. <b>乙方负责人:</b>{{ information.secondPrincipal }}
  79. </el-text>
  80. </el-row>
  81. <el-row class="mt-10">
  82. <el-text
  83. size="large"
  84. :line-clamp="1"
  85. >
  86. <b>合同金额:</b>{{ information.projectPrice }}元
  87. </el-text>
  88. </el-row>
  89. <el-row class="mt-10">
  90. <el-text
  91. size="large"
  92. >
  93. <b>合同签订时间:</b>{{ information.signTime }}
  94. </el-text>
  95. </el-row>
  96. <el-row class="mt-10">
  97. <el-text
  98. size="large"
  99. >
  100. <b>进场施工时间:</b>{{ information.intoConstructionTime }}
  101. </el-text>
  102. </el-row>
  103. <el-row class="mt-10">
  104. <el-text
  105. size="large"
  106. >
  107. <b>竣工时间:</b>{{ information.completedTime }}
  108. </el-text>
  109. </el-row>
  110. <el-row class="mt-10">
  111. <el-text
  112. size="large"
  113. >
  114. <b>项目状态:</b>{{ currentState }}
  115. </el-text>
  116. </el-row>
  117. <el-row class="mt-10">
  118. <el-col :span="3">
  119. <el-text
  120. size="large"
  121. >
  122. <b>项目说明:</b>
  123. </el-text>
  124. </el-col>
  125. <el-col :span="20">
  126. <el-text
  127. size="large"
  128. :line-clamp="4"
  129. >
  130. {{ information.illustrate }}
  131. </el-text>
  132. </el-col>
  133. </el-row>
  134. </el-tab-pane>
  135. <el-tab-pane
  136. label="丙方信息"
  137. name="third"
  138. >
  139. <el-row class="mt-2">
  140. <el-text
  141. size="large"
  142. :line-clamp="1"
  143. >
  144. <b>监理人姓名:</b>{{ information.supervisorName }}
  145. </el-text>
  146. </el-row>
  147. <el-row class="mt-10">
  148. <el-text
  149. size="large"
  150. >
  151. <b>监理单位:</b>{{ information.supervisorUint }}
  152. </el-text>
  153. </el-row>
  154. <el-row class="mt-10">
  155. <el-text
  156. size="large"
  157. >
  158. <b>监理人电话:</b>{{ information.supervisorPhone }}
  159. </el-text>
  160. </el-row>
  161. </el-tab-pane>
  162. </el-tabs>
  163. </el-card>
  164. </el-col>
  165. <el-col
  166. :span="13"
  167. class="ml-5"
  168. >
  169. <el-card
  170. style="height: 100%"
  171. >
  172. <template #header>
  173. <el-row align="middle">
  174. <el-col :span="10">
  175. <el-text size="large">项目文件列表</el-text>
  176. <el-button
  177. style="margin-left: 40px"
  178. @click="changeFilePrompt"
  179. >所需文件提示</el-button>
  180. </el-col>
  181. <el-col
  182. :span="6"
  183. :offset="8"
  184. >
  185. <el-button
  186. type="primary"
  187. :icon="Edit"
  188. @click="openOptionEdit"
  189. >项目状态和文件类型编辑
  190. </el-button>
  191. </el-col>
  192. </el-row>
  193. </template>
  194. <el-row>
  195. <el-col :span="6">
  196. <el-input
  197. v-model="fileCondition.name"
  198. placeholder="请输入文件名称"
  199. clearable
  200. />
  201. </el-col>
  202. <el-col
  203. :span="4"
  204. :offset="1"
  205. >
  206. <el-select
  207. v-model="fileType"
  208. clearable
  209. placeholder="文件类型"
  210. @change="changeFileType"
  211. >
  212. <el-option
  213. v-for="item in editor.typeList"
  214. :key="item.ID"
  215. :label="item.name"
  216. :value="item.ID"
  217. />
  218. </el-select>
  219. </el-col>
  220. <el-col
  221. :span="3"
  222. :offset="1"
  223. >
  224. <el-button
  225. type="primary"
  226. :icon="Search"
  227. @click="queryFile"
  228. >查询
  229. </el-button>
  230. </el-col>
  231. <el-col
  232. :span="3"
  233. >
  234. <el-button
  235. type="primary"
  236. :icon="RefreshLeft"
  237. @click="resetData"
  238. >
  239. 重置
  240. </el-button>
  241. </el-col>
  242. <el-col
  243. :span="3"
  244. >
  245. <el-dropdown
  246. split-button
  247. type="primary"
  248. >
  249. 菜单
  250. <template #dropdown>
  251. <el-dropdown-menu>
  252. <el-dropdown-item>
  253. <el-button
  254. type="primary"
  255. :icon="Upload"
  256. @click="fileDialog = true"
  257. >
  258. 上传
  259. </el-button>
  260. </el-dropdown-item>
  261. <el-dropdown-item>
  262. <el-button
  263. type="primary"
  264. :icon="Download"
  265. @click="downloadTips"
  266. >
  267. 下载
  268. </el-button>
  269. </el-dropdown-item>
  270. <el-dropdown-item>
  271. <el-button
  272. type="primary"
  273. :icon="Delete"
  274. @click="projectDeletes"
  275. >
  276. 删除
  277. </el-button>
  278. </el-dropdown-item>
  279. </el-dropdown-menu>
  280. </template>
  281. </el-dropdown>
  282. </el-col>
  283. </el-row>
  284. <el-row style="margin-top: 20px">
  285. <el-col :span="24">
  286. <el-table
  287. :data="fileList"
  288. row-class-name="row-class"
  289. border
  290. height="562px"
  291. stripe
  292. >
  293. <el-table-column
  294. prop="ID"
  295. align="center"
  296. label="ID"
  297. width="180"
  298. />
  299. <el-table-column
  300. prop="name"
  301. label="文件名称"
  302. align="center"
  303. width="350"
  304. />
  305. <el-table-column
  306. label="项目操作"
  307. align="center"
  308. fixed="right"
  309. >
  310. <template #default="scope">
  311. <el-button
  312. text
  313. type="primary"
  314. :icon="Download"
  315. size="large"
  316. @click="oneDownload(scope.row)"
  317. >
  318. 下载
  319. </el-button>
  320. <el-button
  321. text
  322. type="primary"
  323. :icon="Delete"
  324. size="large"
  325. @click="projectDelete(scope.row)"
  326. >
  327. 删除
  328. </el-button>
  329. </template>
  330. </el-table-column>
  331. </el-table>
  332. </el-col>
  333. </el-row>
  334. <el-row justify="end">
  335. <el-pagination
  336. :page-size="9"
  337. background
  338. layout="prev, pager, next"
  339. :total="fileTotal"
  340. @change="changeFilePage"
  341. />
  342. </el-row>
  343. </el-card>
  344. </el-col>
  345. </el-row>
  346. <el-dialog
  347. v-model="fileDialog"
  348. title="上传文件"
  349. width="40%"
  350. :before-close="fileDialogClose"
  351. :align-center="true"
  352. >
  353. <el-form>
  354. <el-row style="margin-top: 20px">
  355. <el-col :span="8">
  356. <el-form-item label="文件类型:">
  357. <el-select
  358. v-model="uploadFileType"
  359. clearable
  360. placeholder="请选择上传文件的类型"
  361. @change="changeUploadFileType"
  362. >
  363. <el-option
  364. v-for="item in editor.typeList"
  365. :key="item.ID"
  366. :label="item.name"
  367. :value="item.ID"
  368. />
  369. </el-select>
  370. </el-form-item>
  371. </el-col>
  372. </el-row>
  373. </el-form>
  374. <el-row style="margin-top: 20px">
  375. <el-col :span="24">
  376. <el-upload
  377. class="upload-demo"
  378. drag
  379. multiple
  380. :auto-upload="false"
  381. :file-list="uploadFileData"
  382. :on-change="changeFileData"
  383. :on-remove="removeFileData"
  384. >
  385. <el-icon class="el-icon--upload">
  386. <upload-filled />
  387. </el-icon>
  388. <div class="el-upload__text">
  389. 请选择需要上传的文件
  390. </div>
  391. <template #tip>
  392. <div class="el-upload__tip">
  393. 选择的文件不要超过500MB
  394. </div>
  395. </template>
  396. </el-upload>
  397. </el-col>
  398. </el-row>
  399. <template #footer>
  400. <div class="dialog-footer">
  401. <el-button @click="fileDialog = false">取消</el-button>
  402. <el-button
  403. type="primary"
  404. @click="supplementFile"
  405. >
  406. 上传
  407. </el-button>
  408. </div>
  409. </template>
  410. </el-dialog>
  411. <el-dialog
  412. v-model="stateTypeShow"
  413. title="状态和类型编辑"
  414. width="40%"
  415. >
  416. <option-edit />
  417. </el-dialog>
  418. <el-drawer
  419. v-model="basicEditDisplay"
  420. title="项目基本信息编辑"
  421. >
  422. <el-form
  423. size="large"
  424. style="margin-top: 10px"
  425. label-position="left"
  426. label-width="110"
  427. >
  428. <el-tabs v-model="editItem">
  429. <el-tab-pane
  430. label="甲方信息"
  431. name="first"
  432. >
  433. <el-form-item
  434. label="项目名称:"
  435. >
  436. <el-input
  437. v-model="editData.name"
  438. placeholder="请输入项目名称"
  439. />
  440. </el-form-item>
  441. <el-form-item
  442. label="项目地址:"
  443. >
  444. <el-input
  445. v-model="editData.address"
  446. placeholder="请输入项目名称"
  447. />
  448. </el-form-item>
  449. <el-form-item
  450. label="甲方负责人:"
  451. >
  452. <el-input
  453. v-model="editData.firstPrincipal"
  454. placeholder="请输入甲方负责人"
  455. />
  456. </el-form-item>
  457. <el-form-item
  458. label="负责人电话:"
  459. >
  460. <el-input
  461. v-model="editData.firstPhone"
  462. placeholder="请输入甲方负责人电话"
  463. />
  464. </el-form-item>
  465. </el-tab-pane>
  466. <el-tab-pane
  467. label="乙方信息"
  468. name="second"
  469. >
  470. <el-form-item label="乙方负责人:">
  471. <el-input
  472. v-model="editData.secondPrincipal"
  473. placeholder="请输入乙方负责人姓名"
  474. />
  475. </el-form-item>
  476. <el-form-item label="合同金额:">
  477. <el-input-number v-model="editData.projectPrice" />
  478. </el-form-item>
  479. <el-form-item label="合同签订日期:">
  480. <el-date-picker
  481. v-model="editData.signTime"
  482. type="date"
  483. placeholder="请选择合同签订时间"
  484. format="YYYY-MM-DD"
  485. value-format="YYYY-MM-DD"
  486. clearable
  487. @clear="editData.signTime = ''"
  488. />
  489. </el-form-item>
  490. <el-form-item label="进场施工时间:">
  491. <el-date-picker
  492. v-model="editData.intoConstructionTime"
  493. type="date"
  494. placeholder="请选择进场施工时间"
  495. format="YYYY-MM-DD"
  496. value-format="YYYY-MM-DD"
  497. clearable
  498. @clear="editData.intoConstructionTime = ''"
  499. />
  500. </el-form-item>
  501. <el-form-item label="竣工时间:">
  502. <el-date-picker
  503. v-model="editData.completedTime"
  504. type="date"
  505. placeholder="请选择竣工时间"
  506. format="YYYY-MM-DD"
  507. value-format="YYYY-MM-DD"
  508. clearable
  509. @clear="editData.completedTime = ''"
  510. />
  511. </el-form-item>
  512. <el-form-item label="项目状态:">
  513. <el-select
  514. v-model="editData.state"
  515. >
  516. <el-option
  517. v-for="item in editor.stateList"
  518. :key="item.ID"
  519. :label="item.name"
  520. :value="item.ID"
  521. />
  522. </el-select>
  523. </el-form-item>
  524. <el-form-item label="项目说明:">
  525. <el-input
  526. v-model="editData.illustrate"
  527. :rows="5"
  528. type="textarea"
  529. placeholder="请输入项目说明"
  530. />
  531. </el-form-item>
  532. </el-tab-pane>
  533. <el-tab-pane
  534. label="丙方信息"
  535. name="third"
  536. >
  537. <el-form-item label="监理人姓名:">
  538. <el-input
  539. v-model="editData.supervisorName"
  540. placeholder="请输入监理人姓名"
  541. />
  542. </el-form-item>
  543. <el-form-item label="监理单位:">
  544. <el-input
  545. v-model="editData.supervisorUint"
  546. placeholder="请输入监理单位"
  547. />
  548. </el-form-item>
  549. <el-form-item label="监理电话:">
  550. <el-input
  551. v-model="editData.supervisorPhone"
  552. placeholder="请输入监理电话"
  553. />
  554. </el-form-item>
  555. </el-tab-pane>
  556. </el-tabs>
  557. </el-form>
  558. <template #footer>
  559. <div class="dialog-footer">
  560. <el-button
  561. size="large"
  562. @click="basicEditDisplay = false"
  563. >
  564. 取消
  565. </el-button>
  566. <el-button
  567. type="primary"
  568. size="large"
  569. @click="basicDataEdit"
  570. >
  571. 确定
  572. </el-button>
  573. </div>
  574. </template>
  575. </el-drawer>
  576. <el-dialog
  577. v-model="filePrompt"
  578. title="项目所需文件提示"
  579. >
  580. <el-row style="margin-top: 20px">
  581. <el-alert
  582. title="项目前期资料:"
  583. description="报价单、施工图、合同、项目立项书、工程清单、财评中心审计后清单表、图审报告"
  584. type="info"
  585. show-icon
  586. :closable="false"
  587. />
  588. </el-row>
  589. <el-row style="margin-top: 20px">
  590. <el-alert
  591. title="项目施工期资料:"
  592. description="施工图片、签证单、工程变更单、草签证明、工程进度款单证"
  593. type="warning"
  594. show-icon
  595. :closable="false"
  596. />
  597. </el-row>
  598. <el-row style="margin-top: 20px">
  599. <el-alert
  600. title="项目结算期资料:"
  601. description="竣工图、结算书、工程单证单、付款申请单、发票"
  602. type="success"
  603. show-icon
  604. :closable="false"
  605. />
  606. </el-row>
  607. </el-dialog>
  608. </div>
  609. </template>
  610. <script setup>
  611. import { getProjectMessage, editProject } from '@/api/project'
  612. import { onMounted, reactive, ref } from 'vue'
  613. import { getAllUsers } from '@/api/user'
  614. import { queryFileList, createProjectFile, downloadProjectFile, deleteProjectFile, deleteProjectFiles } from '@/api/file'
  615. import { Download, Upload, Delete, Search, RefreshLeft, Edit } from '@element-plus/icons-vue'
  616. import { ElMessage, ElMessageBox } from 'element-plus'
  617. import OptionEdit from './components/optionEdit.vue'
  618. import { editorData } from '@/pinia/project/project'
  619. import { fileDownload } from '@/api/dailyFile'
  620. import { useRoute, useRouter } from 'vue-router'
  621. // eslint-disable-next-line no-unused-vars
  622. const router = useRouter()
  623. const route = useRoute()
  624. defineOptions({
  625. name: 'ProjectDetails'
  626. })
  627. // 文件提示显示
  628. const filePrompt = ref(false)
  629. const changeFilePrompt = () => {
  630. filePrompt.value = true
  631. }
  632. // ......................................
  633. // 基本信息编辑
  634. const activeName = ref('first')
  635. const handleClick = () => {}
  636. const basicEditDisplay = ref(false)
  637. const basicEditShow = () => {
  638. basicEditDisplay.value = true
  639. Object.assign(editData, information)
  640. }
  641. const editItem = ref('first')
  642. const basicDataEdit = () => {
  643. const edit = {
  644. id: editData.ID,
  645. code: route.query.code, // 项目编号
  646. name: editData.name, // 项目名称
  647. address: editData.address, // 项目地址
  648. firstPrincipal: editData.firstPrincipal, // 甲方负责人
  649. firstPhone: editData.firstPhone, // 甲方电话
  650. projectPrice: editData.projectPrice, // 合同金额
  651. secondPrincipal: editData.secondPrincipal, // 乙方负责人
  652. signTime: editData.signTime, // 合同签订日期
  653. intoConstructionTime: editData.intoConstructionTime, // 进场施工时间
  654. completedTime: editData.completedTime, // 竣工时间
  655. supervisorUint: editData.supervisorUint, // 监理单位
  656. supervisorName: editData.supervisorName, // 监理姓名
  657. supervisorPhone: editData.supervisorPhone, // 监理电话
  658. illustrate: editData.illustrate, // 说明
  659. state: editData.state // 状态
  660. }
  661. for (const i in edit) {
  662. if (edit[i] === '' || edit[i] === 0 || edit[i] === null) {
  663. ElMessage.error('请将甲乙丙三方的信息填写完整')
  664. return
  665. }
  666. }
  667. editProject(edit).then(res => {
  668. if (res.code === 0) {
  669. ElMessage({
  670. message: '编辑成功',
  671. type: 'success',
  672. showClose: true,
  673. duration: 2000
  674. })
  675. basicEditDisplay.value = false
  676. projectMessage(route.query.code)
  677. }
  678. })
  679. }
  680. // 数据
  681. const editor = editorData()
  682. const fileCondition = reactive({
  683. code: route.query.code,
  684. name: '',
  685. genre: 0,
  686. pageInfo: {
  687. page: 1,
  688. pageSize: 9
  689. }
  690. })
  691. const information = reactive({})
  692. // 用于编辑的数据
  693. const editData = reactive({})
  694. // 项目用户列表
  695. const userList = reactive([])
  696. // 项目文件列表
  697. const fileList = reactive([])
  698. const fileTotal = ref(0)
  699. // 项目文件类型列表
  700. const fileTypeList = reactive([])
  701. // 项目文件类型
  702. const fileType = ref('')
  703. // 上传文件弹窗
  704. const fileDialog = ref(false)
  705. const uploadFileType = ref('')
  706. const uploadFileData = ref([])
  707. const stateTypeShow = ref(false)
  708. const currentState = ref('')
  709. // 方法
  710. onMounted(() => {
  711. projectMessage(route.query.code)
  712. queryFile()
  713. editor.getStateList()
  714. editor.getTypeList()
  715. getAllUsers().then(res => {
  716. if (res.code === 0) {
  717. userList.push(...res.data)
  718. }
  719. })
  720. })
  721. // 初始化项目数据
  722. const projectMessage = (code) => {
  723. getProjectMessage(code).then(res => {
  724. if (res.code === 0) {
  725. const data = res.data
  726. data.CreatedAt = formatDate(data.CreatedAt)
  727. data.UpdatedAt = formatDate(data.UpdatedAt)
  728. Object.keys(data).forEach(key => {
  729. information[key] = data[key]
  730. editData[key] = data[key]
  731. })
  732. currentState.value = information.projectState.name
  733. }
  734. })
  735. }
  736. // 重置
  737. const resetData = () => {
  738. fileCondition.code = route.query.code
  739. fileCondition.name = ''
  740. fileCondition.genre = 0
  741. fileCondition.pageInfo = {
  742. page: 1,
  743. pageSize: 9
  744. }
  745. queryFile()
  746. }
  747. const changeFileType = (value) => {
  748. if (typeof value === 'number') {
  749. fileTypeList.forEach(item => {
  750. if (item.ID === value) {
  751. fileType.value = item.name
  752. }
  753. })
  754. fileCondition.genre = value
  755. } else {
  756. fileCondition.genre = 0
  757. }
  758. }
  759. // 查询文件
  760. const queryFile = () => {
  761. queryFileList(fileCondition).then(res => {
  762. if (res.code === 0) {
  763. fileTotal.value = res.data.total
  764. fileList.length = 0
  765. fileList.push(...res.data.list)
  766. }
  767. })
  768. }
  769. // 上传文件
  770. const fileDialogClose = () => {
  771. fileDialog.value = false
  772. }
  773. const changeUploadFileType = (value) => {
  774. if (typeof value === 'number') {
  775. uploadFileType.value = value
  776. } else {
  777. uploadFileType.value = ''
  778. }
  779. }
  780. const changeFileData = (file, fileList) => {
  781. uploadFileData.value = fileList
  782. }
  783. const removeFileData = (file, fileList) => {
  784. uploadFileData.value = fileList
  785. }
  786. const supplementFile = () => {
  787. if (uploadFileType.value === '') {
  788. ElMessage.error('请选择文件类型')
  789. } else if (uploadFileData.value.length === 0) {
  790. ElMessage.error('暂未选择文件')
  791. } else {
  792. const formData = new FormData()
  793. uploadFileData.value.forEach(item => {
  794. formData.append('file', item.raw)
  795. })
  796. formData.append('genre', uploadFileType.value)
  797. formData.append('code', route.query.code)
  798. createProjectFile(formData).then(res => {
  799. if (res.code === 0) {
  800. fileDialog.value = false
  801. ElMessage.success(res.msg)
  802. uploadFileType.value = ''
  803. uploadFileData.value = []
  804. queryFile()
  805. } else {
  806. ElMessage.error(res.msg)
  807. }
  808. })
  809. }
  810. }
  811. // 下载文件
  812. const downloadTips = () => {
  813. ElMessageBox.confirm(
  814. '确定要下载列表中的所有文件吗?',
  815. '文件下载',
  816. {
  817. confirmButtonText: '下载',
  818. cancelButtonText: '取消',
  819. type: 'warning',
  820. }
  821. )
  822. .then(() => {
  823. const type = fileType.value === '' ? 0 : fileType.value
  824. const data = {
  825. code: route.query.code,
  826. genre: type,
  827. name: fileCondition.name
  828. }
  829. downloadProjectFile(data).then(res => {
  830. const link = document.createElement('a')
  831. const href = window.URL.createObjectURL(res) // 创建下载的链接
  832. link.href = href
  833. link.download = route.query.code + '.zip' // 下载后文件名
  834. document.body.appendChild(link)
  835. link.click() // 点击下载
  836. document.body.removeChild(link) // 下载完成移除元素
  837. window.URL.revokeObjectURL(href) // 释放掉blob对象
  838. })
  839. })
  840. .catch(() => {
  841. ElMessage({
  842. type: 'info',
  843. message: '取消下载',
  844. })
  845. })
  846. }
  847. // 单文件下载
  848. const oneDownload = async(val) => {
  849. await fileDownload(val).then(res => {
  850. const link = document.createElement('a')
  851. const href = window.URL.createObjectURL(res) // 创建下载的链接
  852. link.href = href
  853. link.download = val.name // 下载后文件名
  854. document.body.appendChild(link)
  855. link.click() // 点击下载
  856. document.body.removeChild(link) // 下载完成移除元素
  857. window.URL.revokeObjectURL(href) // 释放掉blob对象
  858. })
  859. }
  860. // 单文件删除
  861. const projectDelete = async(val) => {
  862. ElMessageBox.confirm(
  863. '你确定进行删除操作吗?',
  864. '删除',
  865. {
  866. confirmButtonText: '确定',
  867. cancelButtonText: '取消',
  868. type: 'warning',
  869. }
  870. )
  871. .then(async() => {
  872. await deleteProjectFile(val).then(res => {
  873. if (res.code === 0) {
  874. ElMessage.success('删除成功')
  875. }
  876. })
  877. queryFile()
  878. })
  879. .catch(() => {
  880. ElMessage({
  881. type: 'info',
  882. message: '取消删除',
  883. })
  884. })
  885. }
  886. // 多文件删除
  887. const projectDeletes = async() => {
  888. ElMessageBox.confirm(
  889. '你确定进行删除操作吗?',
  890. '删除',
  891. {
  892. confirmButtonText: '确定',
  893. cancelButtonText: '取消',
  894. type: 'warning',
  895. }
  896. )
  897. .then(async() => {
  898. const type = fileType.value === '' ? 0 : fileType.value
  899. const data = {
  900. code: route.query.code,
  901. genre: type,
  902. name: fileCondition.name
  903. }
  904. await deleteProjectFiles(data).then(res => {
  905. if (res.code === 0) {
  906. ElMessage.success('删除成功')
  907. }
  908. })
  909. queryFile()
  910. })
  911. .catch(() => {
  912. ElMessage({
  913. type: 'info',
  914. message: '取消删除',
  915. })
  916. })
  917. }
  918. // 日期格式化
  919. const formatDate = (dateString, locale = 'en-US', timezone = 'Asia/Shanghai') => {
  920. // 使用 Date 构造函数解析日期字符串
  921. const date = new Date(dateString)
  922. // 检查日期是否有效
  923. if (isNaN(date.getTime())) {
  924. throw new Error('Invalid date string')
  925. }
  926. // 使用 Date 对象的年份、月份和日期来构建新的日期字符串
  927. // 注意:JavaScript 中的月份是从 0 开始的,所以我们需要加 1
  928. return `${date.getFullYear()}-${('0' + (date.getMonth() + 1)).slice(-2)}-${('0' + date.getDate()).slice(-2)}`
  929. }
  930. const changeFilePage = (value) => {
  931. fileCondition.pageInfo.page = value
  932. queryFile()
  933. }
  934. const openOptionEdit = () => {
  935. stateTypeShow.value = true
  936. }
  937. </script>
  938. <style scoped lang="scss">
  939. @mixin basic {
  940. width: 50%;
  941. display: flex;
  942. align-items: center;
  943. }
  944. .basicInformation {
  945. height: 50px;
  946. background-color: #f8fafd;
  947. display: flex;
  948. .basicTitle {
  949. @include basic;
  950. padding-left: 40px;
  951. }
  952. .basicEdit {
  953. @include basic;
  954. justify-content: end;
  955. padding-right: 40px;
  956. }
  957. }
  958. </style>