detail2.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  1. <template>
  2. <el-dialog v-model="visible" :width="width" append-to-body show-close :close-on-click-modal="false" style="min-height: 600px;">
  3. <template #header>
  4. <div class="dialog-title-container">
  5. <span class="title-label" style="color: #fff; display: flex; flex-direction: row; justify-content: flex-start; align-items: center; line-height: 26px;"> <el-icon> <Document /> </el-icon>文件列表</span>
  6. </div>
  7. </template>
  8. <div class="page-container list-container">
  9. <!-- 功能按钮区 -->
  10. <div class="list-btns-container">
  11. <el-row style="font-size: 13px; padding: 2px 10px;">客户名称:{{ companyName }}</el-row>
  12. </div>
  13. <!-- 搜索区 -->
  14. <el-form class="list-search-container" :model="queryParams" ref="queryRef" :inline="true" label-width="68px" size="small">
  15. <el-form-item label="文件名称:">
  16. <el-input v-model.trim="queryParams.fileName" size="small" type="text" placeholder="文件名称" :clearable="true"
  17. style="width: 130px" />
  18. </el-form-item>
  19. <!-- <el-form-item label="客户名称:">
  20. <el-input v-model.trim="queryParams.companyName" size="small" type="text" placeholder="客户名称" :clearable="true"
  21. style="width: 130px" />
  22. </el-form-item> -->
  23. <el-form-item label="文件类型:">
  24. <el-select v-model="queryParams.type" clearable>
  25. <el-option v-for="item in fileTypes" :key="item.value" :label="item.label"
  26. :value="item.value" />
  27. </el-select>
  28. </el-form-item>
  29. <el-form-item label="文件状态:">
  30. <el-select v-model="queryParams.deleted" clearable>
  31. <el-option label="正常" :value="0" />
  32. <el-option label="作废" :value="1" />
  33. </el-select>
  34. </el-form-item>
  35. <!-- <el-form-item label="来源:" v-if="tenant.versionId === '4'">
  36. <el-select v-model="queryParams.fromTenantId" clearable>
  37. <el-option v-for="tenant in tenantList" :label="tenant.contactCompany" :value="tenant.fromTenantId" :key="tenant.id"/>
  38. </el-select>
  39. </el-form-item> -->
  40. <el-form-item label="上传人:" prop="userName">
  41. <el-input size="small" v-model="queryParams.userName" placeholder="请输入上传人" clearable style="width: 130px"
  42. @keyup.enter="handleQuery" />
  43. </el-form-item>
  44. <el-form-item prop="dateFilter" label="上传时间:">
  45. <el-date-picker size="small" v-model="queryParams.dateFilterFinish" type="daterange" clearable
  46. format="YYYY - MM - DD " value-format="YYYY-MM-DD" range-separator="至" start-placeholder="业务日期"
  47. end-placeholder="业务日期" style="width: 70%;"></el-date-picker>
  48. </el-form-item>
  49. <el-form-item>
  50. <el-button type="primary" icon="Search" @click="handleQuery" size="small">搜索</el-button>
  51. <el-button type="primary" icon="Upload" @click="uploadHandle" size="small" v-hasPermi="['business:upload:add']">上传</el-button>
  52. <el-button type="danger" :disabled="!ids.length" icon="Delete" @click="handleDelete" size="small" v-hasPermi="['business:upload:remove']">作废</el-button>
  53. </el-form-item>
  54. </el-form>
  55. <!-- <div v-if="flag && flag2 && tenant.versionId !== '4'">
  56. <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
  57. <el-tab-pane label="全部" name="first">
  58. </el-tab-pane>
  59. <el-tab-pane label="我的" name="second">
  60. </el-tab-pane>
  61. </el-tabs>
  62. </div> -->
  63. <!-- 列表区 -->
  64. <el-table v-loading="loading" :data="list" size="small" border height="100%"
  65. @selection-change="handleSelectionChange">
  66. <el-table-column type="selection" :selectable="selectable" width="55" align="center" />
  67. <el-table-column label="文件名称" prop="fileName" min-width="110" align="left" />
  68. <!-- <el-table-column label="客户名称" align="center" prop="companyName">
  69. <template #default="scope">
  70. <div style="display: flex; align-items: center; ">
  71. <template v-if="scope.row.customerLabelName ">
  72. <el-tooltip :content="scope.row.customerLabelName" placement="top">
  73. <el-icon :size="15">
  74. <CollectionTag />
  75. </el-icon>
  76. </el-tooltip>
  77. <span style="padding-left:5px;">{{ scope.row.companyName }}</span>
  78. </template>
  79. <template v-else>
  80. <div style="width: 20px; height: 15px;"></div>
  81. <span>{{ scope.row.companyName }}</span>
  82. </template>
  83. </div>
  84. </template>
  85. </el-table-column> -->
  86. <el-table-column label="受委托方" align="center" prop="accountName" min-width="100"
  87. v-if="tenant.versionId === '4'" />
  88. <el-table-column label="文件类型" align="center" prop="type" width="120">
  89. <template #default="scope">
  90. {{ fileTypes.find(f => f.value == scope.row.type).label }}
  91. </template>
  92. </el-table-column>
  93. <el-table-column label="上传人" align="center" prop="userName" width="120" />
  94. <el-table-column label="上传时间" align="center" prop="createTime" width="180" />
  95. <el-table-column label="文件状态" align="center" prop="deleted" width="80">
  96. <template #default="scope">
  97. <template v-if="scope.row.deleted">
  98. <el-tag type="danger">作废</el-tag>
  99. </template>
  100. <template v-else>
  101. <el-tag type="success">正常</el-tag>
  102. </template>
  103. </template>
  104. </el-table-column>
  105. <el-table-column label="操作" width="130" align="center" class-name="small-padding fixed-width">
  106. <template #default="scope">
  107. <el-button link size="small" type="primary" circle
  108. @click="viewHandle(scope.row)">查看</el-button>
  109. <el-button size="small" link type="primary" circle
  110. @click="downloadHandle(scope.row)">下载</el-button>
  111. </template>
  112. </el-table-column>
  113. </el-table>
  114. <!-- 分页 -->
  115. <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
  116. v-model:limit="queryParams.pageSize" @pagination="getList" />
  117. <el-image-viewer v-if="showViewer" :url-list="currentFileList" @close="closeImages" :initial-index="showIndex" />
  118. <form-dialog ref="formDialogRef" :getList="getList" :fileTypes="fileTypes" />
  119. <view-dialog ref="viewDialogRef" :getList="getList" />
  120. </div>
  121. </el-dialog>
  122. </template>
  123. <script setup name="ResouceUpload">
  124. import { listLableNoPage } from "@/api/business/lable"
  125. import { listFile, delFile } from "@/api/business/fileUpload";
  126. import { uploadFile, downloadFile } from "@/api/tool/file";
  127. import useUserStore from "@/store/modules/user";
  128. import { ref } from "vue";
  129. import formDialog from "./form.vue";
  130. import viewDialog from "./view.vue";
  131. import {
  132. listEntrustOrder,
  133. } from "@/api/business/entrust/entrustOrder";
  134. import {
  135. listProductionCompany,
  136. } from "@/api/business/production/productionCompany";
  137. const { proxy } = getCurrentInstance();
  138. /** 字典数组区 */
  139. /** 查询 对象 */
  140. const tenant = useUserStore().tenant
  141. const list = ref([]);
  142. const loading = ref(true);
  143. const ids = ref([]);
  144. const single = ref(true);
  145. const multiple = ref(true);
  146. const oneself = ref(false);
  147. const total = ref(0);
  148. const baseUrl = ref(import.meta.env.VITE_APP_BASE_API);
  149. const showViewer = ref(false);
  150. const currentFileList = ref([]);
  151. const showIndex = ref(0);
  152. const tenantList = ref([]);
  153. const visible = ref(false);
  154. const width = ref(1400)
  155. const permissions = useUserStore().permissions;
  156. const fileTypes = ref([
  157. {value: 1, label: '票据'},
  158. {value: 2, label: '银行'},
  159. {value: 3, label: '社保及公积金'},
  160. {value: 4, label: '库存表'},
  161. ])
  162. const formOpen = ref(false);
  163. const formDialogRef = ref(null);
  164. const viewDialogRef = ref(null);
  165. const flag = ref(checkPermission(['business:upload:person']))
  166. const flag2 = ref(checkPermission(['business:upload:myself']))
  167. const activeName = flag.value ? ref('first') : ref('second');
  168. const options = ref([]);
  169. const form = ref({
  170. id: null,
  171. companyName: "",
  172. companyId: null,
  173. remark: "",
  174. type: 1,
  175. files: [],
  176. });
  177. const emptyForm = {
  178. id: null,
  179. companyName: "",
  180. companyId: null,
  181. type: 1,
  182. remark: "",
  183. files: [],
  184. };
  185. /** 查询对象 */
  186. const queryParams = ref({
  187. pageNum: 1,
  188. pageSize: 20,
  189. orderByColumn: "create_time",
  190. // year: proxy.moment().subtract(1, "month").format("yyyy"),
  191. // month: proxy.moment().subtract(1, "month").format("MM"),
  192. principal: tenant.versionId !== '4' && !flag.value ? useUserStore().user.userId : null,
  193. tenantVersionId: tenant.versionId,
  194. // companyId: proxy.$route.query.companyId
  195. });
  196. const companyName = ref('')
  197. /*********************** 方法区 ****************************/
  198. /** 查询company列表 */
  199. // function getList() {
  200. // loading.value = true;
  201. // listProductionCompany(queryParams.value).then((response) => {
  202. // list.value = response.rows;
  203. // total.value = response.total;
  204. // loading.value = false;
  205. // });
  206. // }
  207. function open(arg) {
  208. visible.value = true;
  209. queryParams.value.companyId = arg.companyId
  210. companyName.value = arg.companyName
  211. getList()
  212. // form.value = arg;
  213. // loading.value = true
  214. // fileExtension.value = arg.fileName.match(/\.([^.]+)$/)[1];
  215. }
  216. /**
  217. * 对话框关闭 事件
  218. */
  219. function close() {
  220. visible.value = false;
  221. }
  222. function selectable(row) {
  223. return !row.deleted
  224. }
  225. function getEntrustOrderList() {
  226. if(tenant.versionId != '4') {
  227. return
  228. }
  229. listEntrustOrder({
  230. pageNum: 1,
  231. pageSize: 20,
  232. orderByColumn: "create_time", status: 1}).then(res => {
  233. tenantList.value = res.rows
  234. })
  235. }
  236. onActivated(() => {
  237. // 你的逻辑
  238. // getList();
  239. getEntrustOrderList()
  240. });
  241. /** 查询文件列表 */
  242. function getList() {
  243. loading.value = true;
  244. listFile(queryParams.value).then((response) => {
  245. list.value = response.rows.map((l) => ({ ...l }));
  246. // prev.value = proxy.deepClone(response.rows);
  247. total.value = response.total;
  248. loading.value = false;
  249. });
  250. }
  251. /** 是否为自己负责 */
  252. function handleOneself() {
  253. if (oneself.value) {
  254. queryParams.value.principal = useUserStore().user.userId;
  255. } else {
  256. queryParams.value.principal = null;
  257. }
  258. getList();
  259. }
  260. /** 搜索按钮操作 */
  261. function handleQuery() {
  262. queryParams.value.pageNum = 1;
  263. getList();
  264. }
  265. function checkPermission(templatePermission) {
  266. const all_permission = "*:*:*";
  267. const permissions = useUserStore().permissions;
  268. const hasPermissions = permissions.some((permission) => {
  269. return (
  270. all_permission === permission || templatePermission.includes(permission)
  271. );
  272. });
  273. return hasPermissions;
  274. }
  275. /** 重置按钮操作 */
  276. function resetQuery() {
  277. queryParams.value = {
  278. pageNum: 1,
  279. pageSize: 20,
  280. year: proxy.moment().format("YYYY"),
  281. month: proxy.moment().format("MM"),
  282. orderByColumn: "create_time",
  283. tenantVersionId: tenant.versionId
  284. };
  285. if (activeName.value != null && activeName.value === 'second') {
  286. queryParams.value.principal = useUserStore().user.userId;
  287. }
  288. handleQuery();
  289. }
  290. // 多选框选中数据
  291. function handleSelectionChange(selection) {
  292. ids.value = selection.map((item) => item.id);
  293. single.value = selection.length != 1;
  294. multiple.value = !selection.length;
  295. }
  296. function getOption() {
  297. listLableNoPage().then(res => {
  298. options.value = res.data
  299. })
  300. }
  301. function formCancel() {
  302. formOpen.value = false;
  303. reset();
  304. }
  305. function reset() {
  306. form.value = proxy.deepClone(emptyForm);
  307. }
  308. /** 删除按钮操作 */
  309. function handleDelete(row) {
  310. const _ids = row.id || ids.value;
  311. proxy.$modal
  312. .confirm("是否确认作废选中的数据项?")
  313. .then(function () {
  314. return delFile(_ids);
  315. })
  316. .then(() => {
  317. getList();
  318. proxy.$modal.msgSuccess("作废成功!");
  319. })
  320. .catch(() => { });
  321. }
  322. function upload(param) {
  323. const formData = new FormData();
  324. formData.append("file", param.file);
  325. uploadFile(formData).then((res) => {
  326. if (res.code === 200) {
  327. const file = {};
  328. file.fileName = res.originalFilename;
  329. file.url = res.url;
  330. file.originalFileName = res.originalFilename;
  331. file.fileUrl = res.fileName;
  332. file.masterId = form.value.id;
  333. file.masterTableName = "biz_deduction";
  334. form.value.files.push(file);
  335. }
  336. });
  337. }
  338. function showFileList(row) {
  339. currentFileList.value = row.files.map((l) => `${baseUrl.value}${l.fileUrl}`);
  340. showViewer.value = true;
  341. }
  342. function closeImages() {
  343. showViewer.value = false;
  344. }
  345. function uploadHandle(row) {
  346. formDialogRef.value.open({companyId: queryParams.value.companyId});
  347. }
  348. function viewHandle(row) {
  349. const fileExtension = row.fileName.match(/\.([^.]+)$/)[1];
  350. if(!['xlsx', 'xls', 'doc', 'docx', 'txt', 'pdf', 'jpg', 'png'].includes(fileExtension)) {
  351. proxy.$modal.msgError(`该文件格式不支持预览!`);
  352. return false
  353. }
  354. viewDialogRef.value.open(row);
  355. }
  356. function downloadHandle(row) {
  357. downloadFile({fileName: row.fileUrl, delete: false})
  358. .then((blob) => {
  359. const link = document.createElement('a');
  360. link.href = URL.createObjectURL(blob);
  361. // 下载文件的名称及文件类型后缀
  362. link.download = row.fileName;
  363. document.body.appendChild(link);
  364. link.click();
  365. //在资源下载完成后 清除 占用的缓存资源
  366. window.URL.revokeObjectURL(link.href);
  367. document.body.removeChild(link);
  368. });
  369. }
  370. defineExpose({
  371. open,
  372. });
  373. </script>